#include <flash_utils.h>

uint32_t WriteToFlash (uint8_t page, uint32_t offsetInPage, uint8_t *buff, uint32_t bytesNum){
	if((page>127U)||(offsetInPage>1023U)){		//kontrola parametru
		return HAL_FLASH_ERROR_PROG;
	}
	static 		FLASH_EraseInitTypeDef EraseInitStruct;
	uint32_t 	pageError;
	uint32_t	temp=0U;
	uint32_t	pageAdr=0x08000000U+offsetInPage+1024U *page;
	int 		step=0;
	uint8_t		oddStep=bytesNum%4U;
	int 		wordsNum = bytesNum/4U;
	HAL_FLASH_Unlock();
	EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;
	EraseInitStruct.PageAddress = pageAdr;
	EraseInitStruct.NbPages     = ((bytesNum-1U)/1024U) +1;
	if (HAL_FLASHEx_Erase(&EraseInitStruct, &pageError) != HAL_OK)
	{
	 //Chyba behem mazani
	  return HAL_FLASH_GetError ();
	}
	for(step=0; step<wordsNum; step++){
	   temp=+(buff[step*4U+3U]<<24U)+(buff[step*4U+2U]<<16U)+(buff[step*4U+1U]<<8U)+buff[step*4U];
	   if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, pageAdr, temp) != HAL_OK){
		   	 //Chyba behem zapisu
			 return HAL_FLASH_GetError ();
	   }
	   pageAdr+=4U;
	}
	if(oddStep!=0){
		temp=0U;
		for(step=0; step<oddStep; step++){	//doplneni posledniho nesoudelneho uint32
			temp+=(buff[(wordsNum*4U)+step]<<(8U*step));
		}
	   if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, pageAdr, temp) != HAL_OK){
		   	 //Chyba behem zapisu
			 return HAL_FLASH_GetError ();
	   }
	}
	HAL_FLASH_Lock();
	return HAL_FLASH_ERROR_NONE;
}


int ReadFromFlash(uint8_t page, uint32_t offsetInPage, uint8_t *buff, uint32_t bytesNum){
	if((page>127U)||(offsetInPage>1023U)){		//kontrola parametru
		return -1;
	}
	uint32_t	temp=0U;
	uint32_t	adress=0x08000000U+offsetInPage+1024U *page;
	uint32_t	step;
	for(step=0; step<bytesNum; step++){
		temp=*(volatile uint32_t*)(adress+step);	//adresujeme po jedne a cteme jen byte
		buff[step]=(uint8_t)temp;
	}
	return 0;
}

