#include "main.h"

#include "usart.h"
#include "dma.h"
#include "tim.h"
#include "custom_flash.h"
#include "gpio.h"
#include "can.h"
#include "sdio.h"
#include "fatfs.h"


// KEY defines
#define BOOTLOADER_KEY_ADR (uint32_t)0x08009800
#define BOOTLOADER_KEY_PAGE 20
#define BL_KEY_APP_WRITTEN 0xAAAA5555

// MAIN APP defines
#define MAIN_APP_START_ADR (uint32_t)0x0800C000
#define MAIN_APP_PAGE 21
#define MAIN_APP_NUM_OF_PAGE 250-MAIN_APP_PAGE

// ERROR DEFINES



struct flag
{
	unsigned reInitMCU:1;	 		// флаг перепрошивки (очишает память перед прошивкой новой)
	unsigned InitOrWait:1;		// флаг активной прошивки (1) или ожидания комманды UART/CAN (0)
	unsigned StartInit:1;			// флаг что необходимо начать прием прошивки/прошивку
	unsigned InitBootPeriph:1;// флаг старта инициализации перифирии для прошивки
	unsigned BootloaderCMD:3; // комманда: интерфейс для прошивки
	unsigned InitMCUReady:1; 	// окончание прошивки
	unsigned HalfOfWrite:1; 	// какая половина из dma буфера не записана
	
	
	unsigned SDCardIn:1;
};



struct Bootloader_Errors
{
	unsigned FLASH_ERASE:1;
	unsigned FLASH_WRITE:1;
	
	unsigned CMD_INVALID:1;
	unsigned USART_RECEIVE:1;

	
	#ifdef __CAN_H__
	unsigned CAN:1;
	#endif
	
	#ifdef __SDIO_H__
	unsigned SD_CARD_NOT_INSERTED:1;
	unsigned SD_CARD_READ:1;
	#endif
};



struct Bootloader_Errors_Counters
{
	unsigned FLASH_ERASE;
	unsigned FLASH_WRITE;
	
	unsigned CMD_INVALID;	
	unsigned USART_RECEIVE;
	
	#ifdef __CAN_H__
	unsigned CAN_RECEIVE;
	#endif
	#ifdef __SDIO_H__
	unsigned SD_CARD_NOT_INSERTED;
	unsigned SD_CARD_READ;
	#endif
	
};

void Bootloader_main(void);

void SD_Programming(FRESULT *res_fresult, HAL_StatusTypeDef *res_hal);
void Bootloader_TIM_Handler(void); // handler for "WD" Timer
void Check_CMD_USART(uint8_t *DataUART);
void SetKey(void);
uint32_t ReadKey(void);
void ResetKey(void);
void Boot_SystemClock_Config(void);
