#ifndef CANEMU_H
#define CANEMU_H

#include "canform.h"
#include "tim.h"

// Настройки GPIO и таймера
#define CANEMU_TX_GPIO_PORT     GPIOB
#define CANEMU_TX_GPIO_PIN      0
#define CANEMU_TIM              TIM2
#define CANEMU_TIM_US_TICKS     72   // Для 1 мкс при 72 МГц
#define CANEMU_TIM_CLOCK_HZ     72000000UL  // частота таймера
#define CAN_MIN_PERIOD          20
// === Макросы управления GPIO ===

#define can_tx_set_1()        (CANEMU_TX_GPIO_PORT->BSRR = (1U << CANEMU_TX_GPIO_PIN))
#define can_tx_set_0()        (CANEMU_TX_GPIO_PORT->BRR  = (1U << CANEMU_TX_GPIO_PIN))

// === Макросы управления таймером ===

#define tim_reset(TIM)        ((TIM)->CNT = 0)
#define tim_get(TIM)          ((uint16_t)(TIM)->CNT)
#define tim_start(TIM)        ((TIM)->CR1 |= TIM_CR1_CEN)
#define tim_stop(TIM)         ((TIM)->CR1 &= ~TIM_CR1_CEN)

typedef struct
{
  CAN_TxHeaderTypeDef header;
  uint8_t             data[8];
  uint32_t            bitrate_bps;
  uint32_t            start_poll;
  uint32_t            transmit;
  uint32_t            period_ms;
  CAN_ErrorFlags_t    errors;
}CANEmu_HandleTypeDef;
extern CANEmu_HandleTypeDef hcanemu;


void CANEmu_Init(CANEmu_HandleTypeDef *hcanemu, uint32_t bitrate);
void CANEmu_Working(CANEmu_HandleTypeDef *hcanemu);
void CANEmu_SendFrame(CANEmu_HandleTypeDef *hcanemu);


#endif // CANEMU_H
