/*
	Utilita pro snadne ukladani promennych, poli nebo struktur do FLASH pameti
	!!! pouze pro MCU s rozdelenim FLASH do 1k stranek
*/
#ifndef _FLASH_UTILS_H
#define _FLASH_UTILS_H

#include "stm32f1xx_hal.h"
/*
 * Ulozeni do FLASH, provede se smazani stranek, kam se  bude provadet zapis
 * promenna, strukrura nebo pole muze mit libovolnou velikost, nemusi byt soudelna ctyrma
 * param: page - cislo stranky 0-63 pro 64kB Flash,  0-127 pro 128kB Flash
 * param: offsetInPage - adresa uvnitr stranky 0-1023
 * param: buff - odkaz na libovolnou promennou, pole, strukturu, je nutne pretypovat na (uint8_t*) pokud je jineho typu
 * param: velikost buff v byte, nejlepe je pouzit funkci sizeof(promenna)
 * vraci:
 * HAL_FLASH_ERROR_NONE      0x00U   No error
 * HAL_FLASH_ERROR_PROG      0x01U   Programming error or params out of range
 * HAL_FLASH_ERROR_WRP       0x02U   Write protection error
 * HAL_FLASH_ERROR_OPTV      0x04U   Option validity error
 */
uint32_t WriteToFlash (uint8_t page, uint32_t offsetInPage, uint8_t *buff, uint32_t bytesNum);

/*
 * Cteni z obsahu promenne, pole nebo struktury z Flash, pokud byla ulozena funkci WriteToFlash()
 * pokud je obsah kriticky, doporucuji vypocitat CRC, ulozit spolu s promennou a po nacteni zkontrolovat
 * param: page - cislo stranky 0-63 pro 64kB Flash,  0-127 pro 128kB Flash
 * param: offsetInPage - adresa uvnitr stranky 0-1023
 * param: buff - odkaz na libovolnou promennou, pole, strukturu, je nutne pretypovat na (uint8_t*) pokud je jineho typu
 * param: velikost buff v byte, nejlepe je pouzit funkci sizeof(promenna)
 * vraci: 0=OK, -1=chybny rozsah parametru
 */
int ReadFromFlash(uint8_t page, uint32_t offsetInPage, uint8_t *buff, uint32_t bytesNum);

#endif
