- чуть переделаны некоторые дефайны для универсализации - смена направления сделана через указател на функцию, а не глобальный дефайн - добавлен бета осцилограф модбас - некоторый рефакторинг
111 lines
4.4 KiB
C
111 lines
4.4 KiB
C
/**
|
||
*******************************************************************************
|
||
* @file modbus_oscil.h
|
||
* @brief Заголовочный файл модуля осциллографа через MODBUS.
|
||
*******************************************************************************
|
||
* @addtogroup MODBUS_OSCIL Modbus Oscilloscope
|
||
* @ingroup MODBUS
|
||
* @brief Модуль для сбора и хранения данных осциллографа
|
||
* @details
|
||
* Реализует кольцевой буфер для хранения данных с нескольких каналов
|
||
* с возможностью чтения через Modbus. Данные 8-битные, упаковываются
|
||
* по 2 сэмпла в 16-битный регистр Modbus.
|
||
*
|
||
* Карта Modbus регистров (адрес относительный):
|
||
* | Адрес | Биты | Назначение | Диапазон | Описание |
|
||
* |--------|------|------------|----------|----------|
|
||
* | 0x0000 | 0-3 | channels | 1-16 | Количество каналов |
|
||
* | | 4-7 | reserved | 0 | Зарезервировано |
|
||
* | | 8-15 | buffer_size| 1-125 | Размер буфера в регистрах |
|
||
* | 0x0001 | 0-7 | tail | 0-124 | Начало новых данных |
|
||
* | | 8-15 | head | 0-124 | Конец новых данных |
|
||
* | 0x0002...| 0-15| data | - | Буфер данных |
|
||
* @{
|
||
******************************************************************************/
|
||
#ifndef __MODBUS_OSCIL_H_
|
||
#define __MODBUS_OSCIL_H_
|
||
|
||
#include "modbus_core.h"
|
||
|
||
#ifdef MODBUS_ENABLE_OSCIL
|
||
|
||
|
||
/**
|
||
* @brief Структура конфигурации осциллографа
|
||
*/
|
||
typedef struct
|
||
{
|
||
/* Адрес 0 */
|
||
uint16_t Overrun:1; ///< Overrun
|
||
uint16_t NumbOfChannels:4; ///< Количество каналов (1-16)
|
||
uint16_t BufferSize:7; ///< Размер буфера в регистрах (1-125)
|
||
|
||
uint16_t SampleTime; ///< Адрес 1: Время между сэмплами в мкс/мс
|
||
uint16_t reserved[2]; ///< Резерв
|
||
uint32_t LastTick; ///< Адрес 4-5: Время последнего добавления (uint32_t)
|
||
} MB_ConfigTypeDef;
|
||
|
||
/**
|
||
* @brief Структура указателей буфера
|
||
*/
|
||
typedef struct
|
||
{
|
||
uint16_t Head:8; ///< Указатель на последний записанный байт
|
||
uint16_t Tail:8; ///< Указатель на начало непрочитанных данных (байты)
|
||
} MB_PreambleTypeDef;
|
||
|
||
/**
|
||
* @brief Основная структура осциллографа
|
||
*/
|
||
typedef struct
|
||
{
|
||
MB_ConfigTypeDef Config; /*!< @brief Отн. Адрес 0-6: Конфигурация */
|
||
uint16_t User[4]; /*!< @brief Отн. Адрес 6-9: Пользовательские регистры */
|
||
MB_PreambleTypeDef Preamble; /*!< @brief Отн. Адрес 10: Указатели head и tail буфера */
|
||
uint8_t Data[MbData_size*2-1]; ///< /*!< @brief Отн. Адрес 11-131: Буфер данных (в байтах) */
|
||
} MB_OscilTypeDef;
|
||
|
||
|
||
|
||
/**
|
||
* @addtogroup MODBUS_OSCIL_API API for Oscilloscope
|
||
* @ingroup MODBUS_OSCIL
|
||
* @brief API для работы с буфером осциллографа
|
||
* @details Примеры использования:
|
||
* @code
|
||
* MB_OscilTypeDef oscil;
|
||
*
|
||
* // Инициализация осциллографа
|
||
* MB_Oscil_Init(&oscil, 120, 4, 1000);
|
||
*
|
||
* // В цикле сбора данных
|
||
* uint8_t ch_data[4] = {adc1, adc2, adc3, adc4};
|
||
* MB_Oscil_Add(&oscil, ch_data);
|
||
*
|
||
* // После чтения данных через Modbus
|
||
* MB_Oscil_UpdateTail(&oscil);
|
||
* @endcode
|
||
* @{
|
||
*/
|
||
|
||
/* Инициализация структуры осциллографа */
|
||
HAL_StatusTypeDef MB_Oscil_Init(MB_OscilTypeDef *oscil, uint8_t BufferSize, uint8_t NumbOfChannels, uint16_t SampleTime);
|
||
|
||
/* Добавление данных всех каналов в буфер */
|
||
HAL_StatusTypeDef MB_Oscil_Add(MB_OscilTypeDef *oscil, uint8_t *Data);
|
||
|
||
/* Обновление указателя Tail */
|
||
HAL_StatusTypeDef MB_Oscil_UpdateTail(MB_OscilTypeDef *oscil);
|
||
|
||
/** MODBUS_OSCIL_API
|
||
* @}
|
||
*/
|
||
|
||
#endif //MODBUS_ENABLE_OSCIL
|
||
|
||
#endif //__MODBUS_OSCIL_H_
|
||
|
||
/** MODBUS_OSCIL
|
||
* @}
|
||
*/
|
||
|