/*==============================================================================
 * Инициализация таймеров с использованием бибилотеки PLIB035
 *------------------------------------------------------------------------------
 * ЦНИИ СЭТ, Разваляев Алексей <wot890089@mail.ru>
 *==============================================================================
 *                                  ЦНИИ СЭТ
 *==============================================================================
 */
#ifndef __ADC_H
#define __ADC_H
//-- Includes ------------------------------------------------------------------
#include "plib035.h"
#include "retarget_conf.h"

//-- Defines -------------------------------------------------------------------
// Дефайны для режима АЦП

typedef enum
{
  ADC_Callback_Seq,
  ADC_Callback_BuffHalf,
  ADC_Callback_BuffFull,
  ADC_Callback_DC,
  ADC_Callback_Error,
}ADC_CallbackTypeDef;

typedef struct
{
  ADC_SEQ_Init_TypeDef SEQ_Init; /* Стандартная конфигурация из PLIB */
  FunctionalState IT;         /*!< Включить прерывания */
  uint8_t ITCount;            /*!< Количество запросов для генерации прерывания */
  uint32_t buffer_circular;   /*!< Циклический буфер */
  
  void (*SEQCpltCallback)(void);   /*!< Вызывается при завершении секвенсора */
  void (*BuffHalfCallback)(void);  /*!< Вызывается при заполнении половины буфера */
  void (*BuffFullCallback)(void);  /*!< Вызывается при заполнении буфера */
  void (*ErrorCallback)();          /*!< Вызывается при ошибке */
}ADC_SEQ_ExtInit_TypeDef;

typedef struct
{
  ADC_DC_Init_TypeDef DC_Init;
  FunctionalState IT;   /*!< Включить прерывания */  
  
  void (*DC_TrigCallback); /*!< Вызывается при срабатывании компаратора */
  void (*ErrorCallback)();    /*!< Вызывается при ошибке */
  
    
}ADC_DC_ExtInit_TypeDef;

typedef struct
{
  ADC_SEQ_ExtInit_TypeDef *Config;  /*!< Конфигурации секвенсоров */
  uint8_t running;
  
  
  uint16_t *data_buffer;               /*!< Указатель на буфер данных [ch][buffer_size]*/
  uint32_t buffer_size;                /*!< Размер буфера (16-bit слова) */
  uint32_t buffer_count;               /*!< Счетчик текущего индекса буфера */
}ADC_SEQ_HandleTypeDef;

typedef struct
{
  ADC_DC_ExtInit_TypeDef  *Config;  /*!< Конфигурации компараторов */
  uint8_t running;
}ADC_DC_HandleTypeDef;

typedef struct
{
   
  ADC_TypeDef *Instance;        /*!< Регистры ADC */
  
  
  ADC_SEQ_HandleTypeDef   SEQ[ADC_SEQ_Total]; /*!< Хендл секвенсоров */  
  ADC_DC_ExtInit_TypeDef  DC[ADC_DC_Total];   /*!< Хендл компараторов */
  
  // Буферы данных для каждого канала (актуальные значения)
  uint16_t ChannelData[ADC_CH_Total];   /*!< Текущие значения каналов */
  uint8_t  ChannelValid[ADC_CH_Total];  /*!< Флаги валидности данных */
}ADC_HandleTypeDef;
extern ADC_HandleTypeDef hadc;

//-- Exported functions prototypes ---------------------------------------------
void adc_init_first(void);

OperationStatus adc_seq_init(ADC_HandleTypeDef *hadc, ADC_SEQ_Num_TypeDef SEQ_Num, ADC_SEQ_ExtInit_TypeDef *NewConfig);
OperationStatus adc_seq_set_callback(ADC_HandleTypeDef* hadc, ADC_SEQ_Num_TypeDef SEQ_Num, ADC_CallbackTypeDef cb_type, void (*Callback)(void));

OperationStatus adc_seq_start(ADC_HandleTypeDef *hadc, ADC_SEQ_Num_TypeDef SEQ_Num, uint16_t (*data_buffer)[], uint32_t buffer_size);
OperationStatus adc_seq_stop(ADC_HandleTypeDef *hadc, ADC_SEQ_Num_TypeDef SEQ_Num);

uint16_t adc_get_channel_value(ADC_HandleTypeDef *hadc, ADC_CH_Num_TypeDef channel);
void adc_sw_start(void);


// Обработчики прерываний
void adc_seq_handler(ADC_HandleTypeDef *hadc, ADC_SEQ_Num_TypeDef SEQ_Num);
void adc_dc_handler(ADC_HandleTypeDef *hadc, ADC_DC_Num_TypeDef DC_Num);
#endif /*__ADC_H*/
