/** ******************************************************************************* * @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 * @} */