#ifndef __BOOTLOADER_H
#define __BOOTLOADER_H

#include "boot_project_setup.h"
#include "string.h"


#define BL_KEY_APP_WRITTEN 0xAAAA5555

// ERROR DEFINES

/**
 * @brief Состояние бутлоадера
 */
typedef enum {
  BL_STATE_INIT = 0,      ///< Состояние: инициализация
  BL_STATE_JUMP_TO_APP,   ///< Состояние: запуск приложения
  BL_STATE_IDLE,          ///< Состояние: ожидание команд
  BL_STATE_ERASE,         ///< Состояние: стирание флеша
  BL_STATE_RECEIVE_UART,  ///< Состояние: прием прошивки по UART
  BL_STATE_RECEIVE_CAN,   ///< Состояние: прием прошивки по CAN
  BL_STATE_WRITE,         ///< Состояние: запись данных
  BL_STATE_VERIFY,        ///< Состояние: проверка прошивки
  BL_STATE_ERROR          ///< Состояние: ошибка
} BootloaderState_t;


typedef struct {
  BootloaderState_t   state;                ///< текущее состояние бутлоадера
  uint32_t            addr;                 ///< текущий адрес прошивки

  uint8_t             fw_size;              ///< размер прошивки
  uint8_t             fw_buffer[PAGE_SIZE];       ///< буфер для приема прошивки (UART/CAN)
  uint32_t            fw_len;               ///< длина принятого пакета
  uint32_t            fw_crc;               ///< контрольная сумма прошивки

  UART_HandleTypeDef  *huart;               ///< хендлер UART
  CAN_HandleTypeDef   *hcan;                ///< хендер CAN
  CAN_TxHeaderTypeDef TxHeader;             ///< Заголовок CAN сообщения для отправки
  BootloaderState_t   prev_state;           ///< предыдущее состояние бутлоадера
} Bootloader_t;


void Bootloader_Task(Bootloader_t *bl);
uint8_t Receive_FW_Command(Bootloader_t *bl);

void Error_Handler(void);

#endif //__BOOTLOADER_H