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

//-- Defines -------------------------------------------------------------------
// Дефайны для режима таймера      Период в мкс,  Частота,  ПсевдоПрескалер,  Период в тиках 
#define PERIOD_MKS(_per_)         _per_,          0,        0,                0
#define FREQ_HZ(_freq_)           0,              _freq_,   0,                0
#define LOAD(_load_, _presc_)     0,              0,        _presc_,          _load_

typedef struct
{
  float ClkFreq;       /*!< Частота тактирования таймера в МГц */
  
  uint32_t PeriodUs;   /*!< Период таймера в мкс */
  uint32_t FreqHz;     /*!< Частота таймера в Гц */
  uint32_t Prescaler;  /*!< Псевдопрескалер частоты */
  uint32_t Load;       /*!< Период таймера в тиках */
  
  FunctionalState       IT;       /*!< Разрешение работы прерывания */
  FunctionalState       ADCSOC;   /*!< Разрешение генерации сигналов запуска АЦП */
  FunctionalState       DMAReq;   /*!< Разрешение генерации запросов к DMA */
  TMR_ExtInput_TypeDef  ExtInput; /*!< Настройка внешнего тактирования таймера */
  void (*Callback)(void);   /* Коллбек который вызовется по прерыванию таймера */
}TMR_ExtInit_TypeDef;

typedef struct
{
  TMR_TypeDef         *Instance;
  TMR_ExtInit_TypeDef *Config;
}TMR_HandleTypeDef;

extern TMR_HandleTypeDef htmr0;
extern TMR_HandleTypeDef htmr1;
extern TMR_HandleTypeDef htmr2;
extern TMR_HandleTypeDef htmr3;

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

OperationStatus tmr_init(TMR_HandleTypeDef *htmr, TMR_ExtInit_TypeDef *NewConfig);
OperationStatus tmr_set_callback(TMR_HandleTypeDef* htmr, int cb_type, void (*Callback)(void));

OperationStatus tmr_start(TMR_HandleTypeDef *htmr);
OperationStatus tmr_stop(TMR_HandleTypeDef *htmr);
OperationStatus tmr_delay(TMR_HandleTypeDef *htmr, uint32_t delay);
OperationStatus tmr_delay_start(TMR_HandleTypeDef *htmr, uint32_t *var);
int tmr_delay_done(TMR_HandleTypeDef *htmr, uint32_t delay, uint32_t *var);


void tmr_handler(TMR_HandleTypeDef* htmr);
void TMR_Init(TMR_TypeDef* TMRx, TMR_ExtInit_TypeDef* InitStruct);
#endif /*__TMR_H*/
