#include <stdint.h>
#include "sys_hal.h"
#include "sys_api.h"
#include "common_config.h"
#include "common.h"
#include <stdio.h>


/**
  * @brief
  */
void SYS_ReadFromFlash(uint8_t *data, uint32_t size, uint32_t baseAddress)
{
    for (uint32_t i = 0; i < size; i++)
        *data++ = (*(uint32_t*)baseAddress++);
}

/** 
  * @brief
  */
void SYS_WriteToFlash(uint8_t *data, uint32_t size, uint32_t crc)
{
    uint32_t baseAddress = SYS_SECTOR;
    uint32_t checkCrc = 0;
    bool fAlarm = 0;
    flash_status_type status;
    uint8_t *pdata = data;

    for (uint8_t i = 0; i < 3; i++)
    {
        fAlarm = 0;
        flash_unlock();

        SYS_EraseFlashSector();

        for (uint32_t i = 0; i < size; i++) {
            if ((status = flash_byte_program(baseAddress++, *pdata++)) != FLASH_OPERATE_DONE) {  
                DBG printf("FLASH_ProgramByte error: %d\r\n", status);
                break;
            }
        }

        if ((status = flash_word_program((uint32_t)SYS_CRC_ADDRESS, crc)) != FLASH_OPERATE_DONE) {
            DBG printf("FLASH_ProgramWord error: %d\r\n", status);
        }

        flash_lock();


        checkCrc = SYS_GetCRC((sys_settings_t *)SYS_SECTOR);

        // Проверяем  CRC того, что было записано
        if (checkCrc == crc) {
            DBG printf("SYS write OK\r\n");
            break;
        }
        else
            fAlarm = 1; // Авария
    }

    // Произошел сбой при записи - перезагружаемся
    if (fAlarm) {
        DBG printf("Flash write error: 1%d", (uint8_t)status);;
        NVIC_SystemReset();
    }
}

/**
  * @brief  Очистка сектора настроек
  * @retval
  */
void SYS_EraseFlashSector(void)
{
    flash_status_type status;
   
    if ((status = flash_sector_erase(SYS_SECTOR)) != FLASH_OPERATE_DONE) {
        printf("SYS_EraseFlashSector error: %d\r\n", status);
    }
}
