#include "stm32f1xx_hal.h"

#include "struc.h"
#include "crc16.h"
#include "package.h"
#include "message.h"
#include "eeprom.h"

uint16_t	params[Modbus_LEN+1],
			modbus[Modbus_LEN],
			archiv[Modbus_LEN],
			county[Modbus_LEN],
			espero[Modbus_LEN];

uint16_t Mode;

LONGE* outputs;

void Init_packMask(void);

uint16_t Maska[2][8]; 


void Default_params()
{
  unsigned int i;

	for(i=0;i<Modbus_LEN;i++)
	{
		modbus[i] = 0;	
	}

	Alarm_mask.all = 0x3FFF;
	Alarm_mask.bit.bit7 = 0;	//	Заряд накопителя
	Alarm_mask.bit.bitC = 0;	//	резерв 
	
	Error_mask.all = 0;
	Error_mask.bit.bit9 = 1;	//	Авария в сети 24 В
	
	for(i=0;i<4;i++)
	Squazh_L[i] = 90;

	LastMode = Mode;

	Sleep_time = 60;		//	минута чтобы отключиться
	
	Cancount[m_FAST] = 5;	//	* 10msec, пауза между посылками CAN
	Cancount[m_SLOW] = 100;	//	* 10msec, пауза между посылками CAN

	CanWait[m_FAST] = 1;	//	* 10msec, пауза после цикла
	CanWait[m_SLOW] = 1;	//	* 10msec, пауза после цикла

	CanRestart[m_FAST] = 500;	//	* 10msec, перезапуск посылки
	CanRestart[m_SLOW] = 1000;	//	* 10msec, перезапуск посылки

	CanRptVez = 3;	//	кол-во повторений посылки «keys»
	CanRptLen = 3;	//	длина повтораемой посылки «keys»
		
	Brightness = 10;	
	
	Protokol = PROTOKOL;
}

void Load_params()
{
  unsigned int i,crc;
  unsigned int adr = FLASH_EEPROM_BASE;

	for(int j=0; j<Modbus_LEN+1; j+=1)
	{
		params[j] = watInTheFlash(adr) & 0xFFFF;		
		adr += 0x2;
	}
	crc = get_crc16(params,Modbus_LEN);
	if(	(crc==params[Modbus_LEN]) && 
		(crc !=0xFFFF) && 
		(Mode == params[126]))
	{
		for(i=0;i<Modbus_LEN;i++) modbus[i] = params[i];
		Commands=0;
	}
	else
	{
		Default_params();
		Save_params();
	}

	Init_packMask();
}

void Save_params()
{
  unsigned int i,dif=0;
	
	for(i=0;i<Modbus_LEN;i++)
	if(params[i] != modbus[i])
	{
		params[i] = modbus[i];	
		dif=1;
	}	
	if(dif)
	{
		params[Modbus_LEN] = get_crc16(params,Modbus_LEN);
		putIntoEeprom(Modbus_LEN+1, params);	
}	}

void Init_packMask()
{
	int i;
	
	for(i=0;i<8;i++)
	{
		Maska[m_FAST][i] = 0;
		Maska[m_SLOW][i] = 0;
	}
	
	Maska[m_FAST][0]|= 0x0007;	//	Дискретные входы, неисправности и аварии
	Maska[m_SLOW][0]|= 0x0300;	//  Маски на неисправности и аварии
	Maska[m_SLOW][1]|= 0x0003;	//  Состояние джамперов
	Maska[m_SLOW][1]|= 0x0F00;	//	Скважность датчика напряжения
	Maska[m_SLOW][3]|= 0x000F;	//  Аварийная уставка скважности
	Maska[m_SLOW][4]|= 0x0100;	//	Время автоматического отключения
	Maska[m_SLOW][6]|= 0x05FF;	//	Яркость лампы и периоды посылок
	Maska[m_FAST][7]|= 0x0100;	//	Счетчик посылок
	Maska[m_SLOW][7]|= 0x0E00;	//	Счетчик посылок
	Maska[m_SLOW][7]|= 0x6000;	//	Протокол, адрес
	Maska[m_FAST][7]|= 0x9000;	//	Команды
	
}


