/** 
*******************************************************************************
* @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
{
  uint16_t Overrun:1;           ///< Overrun
  uint16_t NumbOfChannels:4;    ///< Количество каналов (1-16)
  uint16_t BufferSize:7;        ///< Размер буфера в регистрах (1-125)
  uint16_t SampleTime;          ///< Время между сэмплами в мкс/мс
  uint32_t LastTick;            ///< Время последнего добавления
} MB_ConfigTypeDef;

/** 
 * @brief Структура указателей буфера
 */
typedef struct
{
  uint16_t Head:8;              ///< Указатель на последний записанный байт
  uint16_t Tail:8;              ///< Указатель на начало непрочитанных данных (байты)
} MB_PreambleTypeDef;

/** 
 * @brief Основная структура осциллографа
 */
typedef struct
{
  MB_ConfigTypeDef    Config;     ///< Конфигурация
  uint16_t            User[6];    
  MB_PreambleTypeDef  Preamble;   ///< Указатели буфера 
  uint8_t             Data[MbData_size*2-1];  ///< Буфер данных (в байтах)
} 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
  * @} 
  */
 