#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "package.h"
#include "RS485.h"
#include "crc16.h"
#include "cntrl_adr.h"
#include "bios_dsp.h"      
#include "message.h"
#include "filter_bat2.h"
#include "measure.h"

#include "ADC.h"
#include "peripher.h"

#include "ecan.h"
#include "pulto.h"
#include "spise2p.h"
#include "i2c.h"

int modbus[ANSWER_LEN+1];
unsigned int param[ANSWER_LEN+1];

int archiv[ANSWER_LEN+1];
int county[ANSWER_LEN+1];
int espero[ANSWER_LEN+1];

unsigned int Maska[2][8];

void Default_params()
{
  unsigned int i;
  int bright[][7] = {8,8,10,8,8,8,6,	10,8,8,8,0,0,0};

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

	LastMode = Mode;
	Protokol = PROTOKOL;

	if(Desk == dsk_PULT)
	{
		for(i=0;i<7;i++) 
		Bright[i] = bright[Mode-adr_PLT1][i];

		Cancount[m_FAST] = 2;	//	* 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 = 5;	//	кол-во повторений посылки «keys»
		CanRptLen = 1;	//	длина повтораемой посылки «keys»
	}
	else
	{
		Cancount[m_FAST] = 20;	//	* 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 = 1;	//	кол-во повторений посылки «keys»
		CanRptLen = 1;	//	длина повтораемой посылки «keys»
	}

	if(Mode == adr_PLT1)
	{
		RSleng	= 9;	//	длина посылки RS485
		RScount = 25;	//	* 10msec, пауза между посылками RS485
	}

	if(Desk == dsk_COMM)
	{
		Bright[0] = 10; 
		Bright[1] = 6;
		
		K300_1 = 1900;
		K300_2 = 1900;
		K400_1 = 2500;
		K400_2 = 2500;

		for(i=0;i<start_data;i++)
		if(sens_type[i] == TERMO_AD)
		{
			sens_hi_edge[i] = 80;	
			sens_lo_edge[i] = 70;
	}	}

	if(Desk==dsk_BKSD)
	{
		Bright[0] = 8; 
		Bright[1] = 8;

		K100_D = 700;
		K150_D = 2500;

		for(i=0;i<6;i++)
		{
			sens_hi_edge[i] = 170;	
			sens_lo_edge[i] = 150;
		}
		for(i=6;i<8;i++)
		{
			sens_hi_edge[i] = 115;	
			sens_lo_edge[i] = 105;
}	}	}

void Load_params()
{
  unsigned int i,crc;

	for(i=0;i<ANSWER_LEN;i++)
	{
		archiv[i] = espero[i] = 0;
		county[i] = 1;
	}

	Seeprom_read(0x3FFF-(ANSWER_LEN+1), param, (ANSWER_LEN+1)*2);
	crc = get_crc16(param,ANSWER_LEN);
	if(	(crc==param[ANSWER_LEN]) && 
		(crc !=0xFFFF) && 
		(Mode == param[126])	)
	{
		for(i=0;i<ANSWER_LEN;i++) modbus[i] = param[i];
		calc_sensor_koef();
		Protokol = PROTOKOL;
		Commands=0;
	}
	else
	{
		Default_params();
		calc_sensor_koef();
		LastMode = Mode;
		Save_params();
		if(TermoSW)
		{
			cTermoCal = 1;
			Caliber_time = 25L * ADC_FREQ;
}	}	}
 

void Save_params()
{
  unsigned int i,dif=0;
	
	for(i=0;i<ANSWER_LEN;i++)
	if(param[i] != (unsigned int)modbus[i])
	{
		param[i] = modbus[i];
		dif=1;
	}	
	if(dif)
	{
		param[ANSWER_LEN] = get_crc16(param,ANSWER_LEN);
		Seeprom_write(0x3FFF-(ANSWER_LEN+1),param,(ANSWER_LEN+1)*2);
	}
}

/***************************************************************/
/***************************************************************/
/*  Передача данных по протоколу ModBus - команда 3
    Чтение ачеек данных    		*/
/***************************************************************/
/***************************************************************/

void ReceiveCommandModbus3(RS_DATA *rs_arr)
{
  unsigned int crc, Address_MB, Length_MB, cal, i;

//	получили начальный адрес чтениа
	Address_MB =/*(rs_arr->RS_Header[2] << 8) |*/ rs_arr->RS_Header[3];

//	получили количество слов данных
	Length_MB = (rs_arr->RS_Header[4] << 8) | rs_arr->RS_Header[5];

	/////////////////////////////////////////////////
	// Отсылка
	/* Посчитали контрольную сумму перед самой посылкой */	

	rs_arr->buffer[0] =  CNTRL_ADDR;
	rs_arr->buffer[1] =  CMD_MODBUS_3;
	rs_arr->buffer[2] =  Length_MB*2;

	cal = rs_arr->RS_Header[2];

	for (i=0;i<Length_MB;i++)
	{
		if(cal)
		{
			if(Address_MB+i-start_data < 16)
			{
		   		rs_arr->buffer[3+i*2  ]=HIBYTE(ADC_table[Address_MB+i-start_data]);
		   		rs_arr->buffer[3+i*2+1]=LOBYTE(ADC_table[Address_MB+i-start_data]);
			}
			else
			{
	   			rs_arr->buffer[3+i*2  ]=(Modbus[Address_MB+i-16].byt.byte_hi);
		   		rs_arr->buffer[3+i*2+1]=(Modbus[Address_MB+i-16].byt.byte_lo);
		}	}
		else
		{
	   		rs_arr->buffer[3+i*2  ]=(Modbus[Address_MB+i].byt.byte_hi);
	   		rs_arr->buffer[3+i*2+1]=(Modbus[Address_MB+i].byt.byte_lo);
	}	}

    crc = 0xffff;
	crc = get_crc_16(crc, rs_arr->buffer, Length_MB*2+3);

	rs_arr->buffer[Length_MB*2+3] = LOBYTE(crc);
	rs_arr->buffer[Length_MB*2+4] = HIBYTE(crc);
	
	rs_arr->buffer[Length_MB*2+5] = 0;
	rs_arr->buffer[Length_MB*2+6] = 0;     
	rs_arr->buffer[Length_MB*2+7] = 0;
	rs_arr->buffer[Length_MB*2+8] = 0;     

	rs_arr->flag_TIMEOUT_to_Send=true;
	RS_Send(rs_arr, rs_arr->buffer, Length_MB*2+8);

	return;
}

void ReceiveCommandModbus6(RS_DATA *rs_arr)
{
  unsigned int Address_MB, Data_MB, i;

	/////////////////////////////////////////////////
	// Отсылка
	/* Отправлаем назад то же самое */	

	for (i=0;i<8;i++)
	rs_arr->buffer[i] = rs_arr->RS_Header[i];


//	получили начальный адрес записи
	Address_MB = (/*(rs_arr->RS_Header[2] << 8) | */rs_arr->RS_Header[3]);

//	получили слово данных
	Data_MB = (rs_arr->RS_Header[4] << 8) | rs_arr->RS_Header[5];

	modbus[Address_MB] = Data_MB;

	rs_arr->flag_TIMEOUT_to_Send=true;
	RS_Send(rs_arr, rs_arr->buffer, 10);
}

void SendCorreoRS(RS_DATA *rs_arr)
{
  unsigned int Data, CRC, i;

	if(!RSleng) return;

	rs_arr->buffer[0] =  0xAA;
	rs_arr->buffer[1] =  0x55;

	CRC = 0xAA + 0x55;

	for (i=0;i<RSleng*2-1;i++)
	{
		Data = (RSpack[i/2]>>8*(i&1)) & 0xFF;
		rs_arr->buffer[i+2] = Data;
		CRC+=Data;
	}

	rs_arr->buffer[RSleng*2+1] = ~CRC & 0xFF;

	rs_arr->flag_TIMEOUT_to_Send=true;
	RS_Send(rs_arr, rs_arr->buffer, RSleng*2+2);
}

//===========================================================================
// No more.
//===========================================================================
