/**
  ******************************************************************************
  * @file    tmr.h
  * @author  Разваляев Алексей
  * @brief   Драйвер UART на основе PLIB035.
  *          Данный файл содержит определения типов, структур и прототипы функций
  *          для работы с TMR, включая:
  *           + Структуры и typedef для таймеров
  *           + Макросы для конфигурации периодов и частот
  *           + Прототипы функций для инициализации и API драйвера
  *
  ******************************************************************************
  */
#ifndef __TMR_H
#define __TMR_H
//-- Includes ------------------------------------------------------------------
#include "plib035.h"
#include "retarget_conf.h"

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

//-- Types ---------------------------------------------------------------------

/**
  * @brief Типы callback-функций TMR
  */
typedef enum
{
  TMR_Callback_Update,  /*!< Переполнение (опустошение) таймера */
} TMR_CallbackTypeDef;

/**
  * @brief Расширенная конфигурация таймера
  */
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 (*UpdCallback)(void);       /*!< Callback-функция по прерыванию таймера */
} TMR_ExtInit_TypeDef;

/**
  * @brief Хендл таймера
  */
typedef struct
{
  TMR_TypeDef         *Instance;  /*!< Указатель на регистры таймера */
  TMR_ExtInit_TypeDef *Config;    /*!< Конфигурация таймера */
} TMR_HandleTypeDef;

//-- External handles ----------------------------------------------------------
extern TMR_HandleTypeDef htmr0;
extern TMR_HandleTypeDef htmr1;
extern TMR_HandleTypeDef htmr2;
extern TMR_HandleTypeDef htmr3;

//-- Exported functions prototypes ---------------------------------------------

/* Init functions */

/* Первичная инициализация таймеров */
void tmr_init_first(void);
/* Общий обработчик прерывания таймера */
void tmr_irq_handler(TMR_HandleTypeDef* htmr);
/* Инициализация TMRx */
OperationStatus tmr_init(TMR_HandleTypeDef *htmr, TMR_ExtInit_TypeDef *NewConfig);
/* Инициализация таймера (её нет в PLIB, поэтому она здесь) */
void TMR_Init(TMR_TypeDef* TMRx, TMR_ExtInit_TypeDef* InitStruct);

/* Установка callback-функции таймера */
OperationStatus TMR_Set_Callback(TMR_HandleTypeDef* htmr, TMR_CallbackTypeDef CallbackType, void (*Callback)(void));



/* API functions*/

/* Запуск таймера */
OperationStatus TMR_Start(TMR_HandleTypeDef *htmr, FunctionalState IT);
/* Остановка таймера */
OperationStatus TMR_Stop(TMR_HandleTypeDef *htmr, FunctionalState IT);
/*Получить счетчик таймера (с псевдопрескалером) */
uint32_t TMR_Get_Cnt(TMR_HandleTypeDef *htmr);
/* Получить период таймера (с псевдопрескалером) */
uint32_t TMR_Get_Period(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);


#endif /*__TMR_H*/
