fork

Dependencies:   mbed

Fork of LG by igor Apu

Command.c

Committer:
Kovalev_D
Date:
2016-12-20
Revision:
206:00341a03e05c
Parent:
205:775d54fdf646
Child:
207:d1ce992f5d17

File content as of revision 206:00341a03e05c:

#include "stdlib.h"
//#include "math.h"
#include "LPC17xx.h"
#include "Global.h"
int tempNH,tempNL;
unsigned int Rate_Flag;
unsigned int CountBuFFIn;
unsigned int N=0,CRC_N;
unsigned int Param1=0;
unsigned int Param2=0;
unsigned int Param3=0;
unsigned int Param4=0;
unsigned int Consol=123;
unsigned int TempParam=1;
unsigned int CountParam=0;

int ttemp;
int OLDDAC=0;
int rr = 123;
unsigned int pDestT ; 
GyroParam *Flash;
 ///////////////flah and boot///////////
void GoBoot(void)
  {
 	/*	Prepare Sectors to be flashed */
    NVIC_DisableIRQ(TIMER1_IRQn);
    NVIC_DisableIRQ(TIMER2_IRQn);
 	NVIC_DisableIRQ(TIMER3_IRQn);
 	NVIC_DisableIRQ(EINT3_IRQn);
    SystemInitDef();
    vIAP_ReinvokeISP();
  } 

void DropDelay(void)
{   
    Gyro.DropDelayGLD = DropDelayGLD_0;
    switch(Gyro.My_Addres) {
    case 1: Gyro.DropDelayGLD = DropDelayGLD_1;	 	  break;  
    case 2: Gyro.DropDelayGLD = DropDelayGLD_2; 	  break;    
    case 3: Gyro.DropDelayGLD = DropDelayGLD_3;       break;   
  }
  
}
/*
void WriteFlash(void)
  {
 	  
   SystemInitDef();
   WriteCon("\r\n Start Prepare Sectors");
   if(u32IAP_PrepareSectors(5, 5) == IAP_STA_CMD_SUCCESS)
     {
      WriteCon("\r\nPrepare Sectors OK");
      WriteCon("\r\n Start Erase");
      u32IAP_EraseSectors(IMG_START_SECTOR, IMG_END_SECTOR);
      WriteCon("\r\n AND Erase");
     }
     else WriteCon("\r\nPrepare Sectors ERROR ");  
          SystemInit1(); 
          Gyro.FlashMod = 0;
     }
  */
 void EraseFlash(void)
 {
 	Gyro.FlashMod = 0;
 	rr = u32IAP_PrepareSectors(8, 10);
	sprintf((Time)," dffddfd <%07d> ",rr);
	WriteCon(Time);
	
    rr = u32IAP_EraseSectors(8, 10);
    sprintf((Time)," dffddfd <%07d> ",rr);
    WriteCon(Time);
    }
 
 void WriteFlash(void)
 
 	{   	Gyro.FlashMod = 0;
 	
 	//SystemInitDef();
 	NVIC_DisableIRQ(TIMER1_IRQn);
    NVIC_DisableIRQ(TIMER2_IRQn);
 	NVIC_DisableIRQ(TIMER3_IRQn);
 	NVIC_DisableIRQ(EINT3_IRQn);
 
 	 unsigned int start_address = (unsigned int) & GyroP;
 	 sprintf((Time)," dffddfd <%07d> ",&rr);
     WriteCon(Time);
	 ////unsigned int address=0x0003000;
	rr = u32IAP_PrepareSectors(8, 10);
	sprintf((Time)," dffddfd <%07d> ",rr);
	WriteCon(Time);
	
    rr = u32IAP_EraseSectors(8, 10);
    sprintf((Time)," dffddfd <%07d> ",rr);
    WriteCon(Time);
    
    rr = u32IAP_PrepareSectors(8, 10);
	sprintf((Time)," dffddfd <%07d> ",rr);
	WriteCon(Time);
	
     	/// SystemInitDef();
   rr =	 u32IAP_CopyRAMToFlash(0x0009000,  &GyroP , 1024);
   sprintf((Time)," dffddfd <%07d> ",rr);
   WriteCon(Time);
   //	 SystemInit1();  // Инициализация контроллера: установка тактовых частот
    //SystemCoreClockUpdate1(); // расчет тактовой частоты процессора перед инициализацией UART - 103MHz
   	 
  	NVIC_EnableIRQ(TIMER1_IRQn);
    NVIC_EnableIRQ(TIMER2_IRQn);
 	NVIC_EnableIRQ(TIMER3_IRQn);
 	NVIC_EnableIRQ(EINT3_IRQn);

	}
 void ReadFlash ( void)
 {
  	NVIC_DisableIRQ(TIMER1_IRQn);
    NVIC_DisableIRQ(TIMER2_IRQn);
 	NVIC_DisableIRQ(TIMER3_IRQn);
 	NVIC_DisableIRQ(EINT3_IRQn);
  Gyro.FlashMod = 0;
  WriteCon("\r\n Pirivet Flash");

  pDestT= (unsigned int) (0x9000);
  Flash = (GyroParam*) pDestT;
  GyroP = *(Flash);
  
  	NVIC_EnableIRQ(TIMER1_IRQn);
    NVIC_EnableIRQ(TIMER2_IRQn);
 	NVIC_EnableIRQ(TIMER3_IRQn);
 	NVIC_EnableIRQ(EINT3_IRQn);
  //char table = (char*)your_address;
 /* sprintf((Time)," dffddfd <%07d> ",GyroP.Array[10]);
  WriteCon(Time);*/
 

  /*int address = flash_size() - SECTOR_SIZE;           //Write in last sector
    
    int *data = (int*)address;
    printf("Starting\r\n"); 
   // erase_sector(address);  do not erase the previous content
   // int numbers[10] = {0, 1, 10, 100, 1000, 10000, 1000000, 10000000, 100000000, 1000000000};
   // program_flash(address, (char*)&numbers, 40);        //dont overwrite the previous data
    printf("Resulting flash: \r\n");
    for (int i = 0; i<10; i++)
        printf("%d\r\n", data[i]);     //display the non volatile data
    
    printf("Done\r\n\n");*/
 }
 ///////////////end flah and boot///////////
 void M_RateA(void)
 {  
    switch(Gyro.ModeOut) {
    case 1: if(Gyro.Rate1_Event ) 				CMD_Rate();  		 	  break;  
    case 2: if(Gyro.Reper_Event )				CMD_Rate2(); 			  break;    //Gyro.Reper_Event выставляется при переходе синуса из - в + 
    case 3: if(Gyro.Event_500Hz ) 				CMD_Delta_PS();           break;   
    case 4: if(Gyro.EXT_Latch   ) 				CMD_Delta_PS();           break;   
    case 5: if(Gyro.Event_500Hz ) 				CMD_Delta_Bins();         break;   
    case 6: if(Gyro.EXT_Latch   ) 			    CMD_B_Delta();            break;      	
    case 7: if(Gyro.Event_500Hz ) 				CMD_B_Delta();            break;      	
    }
 }
 
void CMD_M_Param_R(void)
{
   unsigned int NP;
   unsigned int Param;
   BuffTemp[0] =  Gyro.SOC_Out;
   BuffTemp[1] =  Gyro.My_Addres;
   
   NP    = BuffTemp[3]; 
   
   Param = GyroP.Array[NP];
   
   BuffTemp[2] =(Param >> 8) & 0xff;//старший байт требуемого параметра
   BuffTemp[3] =(Param >> 0) & 0xff;//младший байт требуемого параметра
   
   Check(BuffTemp, 6);
   WriteConN (BuffTemp,6);
   /*sprintf((Time),"READ  Param = <%07d>   GyroP.Array[NP] = <%07d>  NP= <%07d>   Gyro.CaunPlus+Gyro.CaunMin-5000 <%07d>  \r\n",Param,  GyroP.Array[NP],  NP, GyroP.Str.PLC_Lern);
   WriteCon(Time);*/
}
void CMD_M_Param_W(void)
{
   unsigned int NP;
   unsigned int Param;
   
   NP     =  BuffTemp[3];
   Param  = (BuffTemp[4]<<8);
   Param |=  BuffTemp[5];
 
  GyroP.Array[NP] = Param;
     
   
   BuffTemp[0] =  Gyro.SOC_Out;
   BuffTemp[1] =  Gyro.My_Addres;
   BuffTemp[2] =  Gyro.CMD_In;
   BuffTemp[3] =  (GyroP.Array[NP]>> 8) & 0xff;//старший байт требуемого параметра
   
   Check(BuffTemp, 6);
   WriteConN (BuffTemp,6);
  /* sprintf((Time),"READ  Param = <%07d>   GyroP.Array[NP] = <%07d>  NP= <%07d>   GyroP.Str.PLC_Lern = <%07d>  \r\n",Param,  GyroP.Array[NP],  NP, GyroP.Str.PLC_Lern);
   WriteCon(Time);*/
}
void CMD_Maintenance(void)
{
   
    Gyro.DropDelayGLD = DropDelayGLD_0;//задержка на выдачу 45 микросекунд для любого адреса ГЛД
    BuffTemp[0] =  Gyro.SOC_Out;
    BuffTemp[1] =  Gyro.My_Addres;
    BuffTemp[2] =  Gyro.Firmware_Version;
    BuffTemp[3] =  Gyro.GLD_Serial;
    BuffTemp[4]=0x00;
    BuffTemp[5]=0x00;
    Check(BuffTemp, 8);
    WriteConN (BuffTemp,8);
   
}
void CMD_B_Delta(void)
{ 	
	Gyro.Event_500Hz=0;
 	Gyro.EXT_Latch=0;	
 	unsigned int Temp;
	BuffTemp[ 0] = Gyro.SOC_Out;
    BuffTemp[ 1] = Gyro.My_Addres;
    
    Temp = Gyro.CuruAngle;
    Gyro.CuruAngle = 0;
    BuffTemp[ 2] =(Temp >> 16) & 0xff;//младший байт разности счетчиков
    BuffTemp[ 3] =(Temp >>  8) & 0xff;//младший байт разности счетчиков
    BuffTemp[ 4] =(Temp >>  0) & 0xff;//младший байт разности счетчиков
    BuffTemp[ 5] = 0x00000000;
    Check(BuffTemp, 8);
    WriteConN (BuffTemp,8);
}

void CMD_Delta_Bins(void)
{   Gyro.Event_500Hz=0;
	unsigned int Temp;
	BuffTemp[ 0] = Gyro.SOC_Out;
    BuffTemp[ 1] = Gyro.My_Addres;
    
    Temp = Gyro.CuruAngle;
    Gyro.CuruAngle = 0;

    BuffTemp[ 2] =(Temp >> 24) & 0xff;//старший байт разности счетчиков
    BuffTemp[ 3] =(Temp >> 16) & 0xff;//младший байт разности счетчиков
    BuffTemp[ 4] =(Temp >>  8) & 0xff;//младший байт разности счетчиков
    BuffTemp[ 5] =(Temp >>  0) & 0xff;//младший байт разности счетчиков
    BuffTemp[ 6] = 0x0000;
    Check(BuffTemp, 9);
    WriteConN (BuffTemp,9);
}  
void CMD_Delta_PS(void)
{   
    Gyro.EXT_Latch=0;
    Gyro.Event_500Hz=0;
    unsigned int Temp;
	BuffTemp[ 0] = Gyro.SOC_Out;
    BuffTemp[ 1] = Gyro.My_Addres;
    
    Temp = Gyro.CuruAngle;
    Gyro.CuruAngle = 0;

    BuffTemp[ 2] =(Temp >> 8) & 0xff;//старший байт разности счетчиков
    BuffTemp[ 3] =(Temp >> 0) & 0xff;//младший байт разности счетчиков
    
    BuffTemp[ 4] = CountParam;
     switch(CountParam) {
  
    //F_ras  
     case 0:
           Temp = Gyro.F_ras;
           BuffTemp[5] = (Temp >> 8) & 0xff;
     break;  
     
     case 1:
           BuffTemp[5] = (Temp >> 0) & 0xff;
     break; 
    
    
     
     //HFO
     case 2:
           Temp = 0;//HFO
           BuffTemp[5] = (Temp >> 8) & 0xff;
     break;     
     
     case 3:
           Temp = 0;//HFO
           BuffTemp[5] = (Temp >> 0) & 0xff;
     break;  
   
   
     
     //T_Vibro
     case 4:
           Temp = (unsigned int)((7680000*16/(Gyro.Frq>>12))); 
           BuffTemp[5] = (Temp >> 8) & 0xff;
     break;  
    
     case 5:
           BuffTemp[5] = (Temp >> 0) & 0xff;
     break; 
    
    
     
     //L_Vibro  
     case 6:
          Temp = (unsigned int)(((7680000*16/200) *Gyro.AmpPer /(Gyro.Frq>>12))); 
          BuffTemp[5]  =  (Temp >> 8) & 0xff;
 
     break;  
   
     case 7:
          BuffTemp[5]  =  (Temp >> 0) & 0xff;
     break;  
     
     
     
     //Напряжение на регуляторе периметра
     case 8:
          Temp = Spi.DAC_B /*- 0x7fff*/;
          BuffTemp[5] =  (Temp >> 8) & 0xff;
  
     break;  
   
     case 9:
          BuffTemp[5] =  (Temp >> 0) & 0xff;
     break;  
     
     
     
     //темпкратурный канал 0
     case 10:
          Temp = 100;
          BuffTemp[5] =  (Temp >> 8) & 0xff;

     break;  
    
     case 11:
         BuffTemp[5] =  (Temp >> 0) & 0xff;
     break;
     
       
       
     //f 
     case 12:
        Temp = Gyro.AD_Slow >> 16;
        BuffTemp[5] = (Temp >> 8) & 0xff;
   
     break;  
   
     case 13:
        BuffTemp[5] = (Temp >> 0) & 0xff;
     break; 
     
          
      
     //ток 1
     case 14:
        Temp = Gyro.In1;
        BuffTemp[5] = (Temp >> 8) & 0xff;//in1//2
        
     break;  
    
     case 15:
        BuffTemp[5] = (Temp >> 0) & 0xff;
     break; 
     
      
      
     //ток 2
     case 16:
        Temp = Gyro.In2;
        BuffTemp[5] = (Temp >> 8) & 0xff;
     break;  
     
     case 17:
        BuffTemp[5] = (Temp >> 0) & 0xff;//in2//3      
     break;  
     
     
     
     //разностный температурный канал Delta Temp
     case 18:
        Temp = Gyro.DeltaT;
        BuffTemp[5] = (Temp >> 8) & 0xff;//дельта
     break;  
    
     case 19:
        BuffTemp[5] = (Temp >> 0) & 0xff;
     break; 
     
     
     
     //температурный канал 5
     case 20:
        Temp = Gyro.Termo;//0xa4=164
        BuffTemp[5] =(Temp >> 8) & 0xff;//температура
    
     break;       
     
     case 21:
        BuffTemp[5] =(Temp >> 0) & 0xff;//ADC6   sesnsor 5
     break; 
     } 
    Check(BuffTemp, CRC_N);
    WriteConN (BuffTemp,CRC_N);  
   
    
    if(CountParam>20)CountParam=0;//зацикливания буфера от 0 до 21
    else CountParam++;
    
}

void CMD_Rate2(void)
{
	Gyro.Reper_Event=0;
    BuffTemp[ 0] = Gyro.SOC_Out;
    BuffTemp[ 1] = Gyro.My_Addres;


    BuffTemp[ 2] =(Gyro.CaunPlus >> 8) & 0xff;//старший байт счетчика +.
    BuffTemp[ 3] =(Gyro.CaunPlus >> 0) & 0xff;//младший байт счетчика +.
 
    BuffTemp[ 4] =(Gyro.CaunMin >> 8) & 0xff;//старший байт счетчика -.
    BuffTemp[ 5] =(Gyro.CaunMin >> 0) & 0xff;//младший байт счетчика -.
  
    Check(BuffTemp, 8);
    WriteConN (BuffTemp,8);
}

void CMD_Rate(void)
{ 
    Gyro.Rate1_Event=0;
   	unsigned int Temp;
	unsigned int OldCuruAngle;
    Gyro.Firmware_Version=0xff; /// промежуточная затычка
 

    BuffTemp[ 0] = Gyro.SOC_Out;
    BuffTemp[ 1] = Gyro.My_Addres;


    BuffTemp[ 2] =(Gyro.CaunPlus >> 8) & 0xff;//старший байт счетчика +.
    BuffTemp[ 3] =(Gyro.CaunPlus >> 0) & 0xff;//младший байт счетчика +.
 
    BuffTemp[ 4] =(Gyro.CaunMin >> 8) & 0xff;//старший байт счетчика -.
    BuffTemp[ 5] =(Gyro.CaunMin >> 0) & 0xff;//младший байт счетчика -.
 
 
    Temp=Gyro.CuruAngle;												//(0,28/с)
 
 
 //8 байт       + 4 байта от прошлых измерений
//Gyro.CuruAngle = Gyro.CuruAngle + OldCuruAngle; 								//(72 град/с)
/*  OldCuruAngle=Gyro.CuruAngle & 0xff;											//сохраняем 4 байта для след измирений
  Temp=Gyro.CuruAngle>>8; 		*/											//приводим к форме вывода 
 														
 	/*																			//(9 град/с)
OldCuruAngle=Gyro.CuruAngle & 0x1f;											//сохраняем 5 бит для след измирений 
Temp=Gyro.CuruAngle>>5;   */                                               //приводим к форме вывода
Gyro.CuruAngle = 0;
    BuffTemp[ 6] =(Temp >> 8) & 0xff;//старший байт разности счетчиков
    BuffTemp[ 7] =(Temp >> 0) & 0xff;//младший байт разности счетчиков

  
    Temp = Gyro.F_ras;
    BuffTemp[ 8] = (Temp >> 8) & 0xff;//расщипление частота
    BuffTemp[ 9] = (Temp >> 0) & 0xff;//

    BuffTemp[10] = (Temp >> 8) & 0xff;//выход регулятора гвч;
    BuffTemp[11] = (Temp >> 0) & 0xff;

    Temp = (Gyro.AD_Slow >> 16)- 0x7fff;
    BuffTemp[12]=(Temp >> 8) & 0xff;////
    BuffTemp[13]=(Temp >> 0) & 0xff;////

 
 	Temp = (unsigned int)((7680000*16/(Gyro.Frq>>12))); 
    BuffTemp[14]  =  (Temp >> 8) & 0xff;
    BuffTemp[15]  =  (Temp >> 0) & 0xff;

    BuffTemp[16] = 0xf;
    BuffTemp[17] = 0x02;
 

 	Temp = (unsigned int)(((7680000*16/200) *Gyro.AmpPer /(Gyro.Frq>>12))); 
    BuffTemp[18]  =  (Temp >> 8) & 0xff;
    BuffTemp[19]  =  (Temp >> 0) & 0xff;

    BuffTemp[20] = 0x00;
    BuffTemp[21] = 0x00;

    Temp = Spi.DAC_B - 0x7fff;
    BuffTemp[22] =  (Temp >> 8) & 0xff;
    BuffTemp[23] =  (Temp >> 0) & 0xff;

    Temp =0x0;// Gyro.PLC_Delta >> 16;
    BuffTemp[24] = (Temp >> 8) & 0xff;
    BuffTemp[25] = (Temp >> 0) & 0xff;//
    
    Temp = Gyro.AD_Slow >> 16;
    BuffTemp[26] =  (Temp >> 8) & 0xff;
    BuffTemp[27] =  (Temp >> 0) & 0xff;
    
    Temp = Gyro.AD_Slow >> 16;
    BuffTemp[28] = (Temp >> 8) & 0xff;
    BuffTemp[29] = (Temp >> 0) & 0xff;
	
	Temp = Gyro.In1;
    BuffTemp[30] = (Temp >> 8) & 0xff;//in1//2
    BuffTemp[31] = (Temp >> 0) & 0xff;
    
 	Temp = Gyro.In2;
    BuffTemp[32] = (Temp >> 8) & 0xff;
    BuffTemp[33] = (Temp >> 0) & 0xff;//in2//3
	
	Temp = Gyro.DeltaT;
    BuffTemp[34] = (Temp >> 8) & 0xff;//дельта
    BuffTemp[35] = (Temp >> 0) & 0xff;
	//  Temp = 000;  
	Temp = Gyro.Termo;
    Temp = (0x7fff + Temp);///164

    BuffTemp[36] =(Temp >> 8) & 0xff;//температура
    BuffTemp[37] =(Temp >> 0) & 0xff;//ADC6   sesnsor 5

    BuffTemp[38] =0x00;
    BuffTemp[39] =0x00;
    BuffTemp[40] =0x00;
    BuffTemp[41] =0x00;


    Check(BuffTemp, 44);
    WriteConN (BuffTemp,44);
    
}
void CMD_M_vib()
{   
    unsigned int temp1,temp2;

    temp1 =((BuffTemp[4]<<8) | BuffTemp[5]);
    temp1=temp1&0xFFFF;
    (unsigned int)((7680000*16/(Gyro.Frq>>12))); 
    Gyro.Frq=(122880000/temp1)<<12;
    
    temp2 =((BuffTemp[6]<<8) | BuffTemp[7]);
    temp2=temp2&0xFFFF;
    
    Gyro.AmpPer=(((((Gyro.Frq>>12)*200)/16)*temp2)/7680000);
}
void CMD_M_Control_D8()///установка\сброс регистров управления
{
    unsigned int bit,NReg,Pa;
    unsigned int SR,V,A,Bit_num;
    SR=0;
    V=0;
    A=0;
    Bit_num=0;
    
    BuffTemp[0] = Gyro.SOC_Out;      //DD
    BuffTemp[1] = Gyro.My_Addres;    //00
    BuffTemp[2] = Gyro.CMD_In;       //D8
    
    Pa = BuffTemp[3];
    SR = Pa >> 0x7;
    V  = Pa >> 0x5;
    V  = V  &  0x3;
    A  = Pa >> 0x4;
    A  = A  &  0x1;
    Bit_num = Pa & 0xf;
    
    if(SR) 
    {
    	 switch (Bit_num){
    	 case 0x06: FrqON  	 break;
    	 case 0x05: AVibON 	 break;
    	 case 0x01: HFOON  	 break;
    	 case 0x03: PlcON 	 break;
    	 }
    } 
   else{
   switch (Bit_num){
   	     case 0x06: FrqOFF 	 break;
    	 case 0x05: AVibOFF	 break;
    	 case 0x01: HFOOFF 	 break;
    	 case 0x03: PlcOFF 	 break;
    	}
   } 
    BuffTemp[0] = Gyro.SOC_Out;      //DD
    BuffTemp[1] = Gyro.My_Addres;    //00
    BuffTemp[2] = Gyro.CMD_In;       //D8
    BuffTemp[3] = A<<4;       
    BuffTemp[4] = 0x0;
    BuffTemp[5] = 0x0;
    Check(BuffTemp, CRC_N);
    WriteConN (BuffTemp,CRC_N);
}

void CMD_M_Control_D9()///чтение регистров управления
{
    int bit,NReg;
    BuffTemp[0] = Gyro.SOC_Out;      //DD
    BuffTemp[1] = Gyro.My_Addres;    //00
    BuffTemp[2] = Gyro.CMD_In;       //D9
    if ((Param1 & 0x10) == 0) {
        BuffTemp[3]=0<<4;
        BuffTemp[4] = (Gyro.RgConA>>8 )& 0xff;
        BuffTemp[5] =  Gyro.RgConA     & 0xff;
    } else {
        BuffTemp[3]=1<<4;
        BuffTemp[4] = (Gyro.RgConB>>8 ) & 0xff;
        BuffTemp[5] =  Gyro.RgConB      & 0xff;
    }
    Check(BuffTemp, CRC_N);
    WriteConN (BuffTemp,CRC_N);
}
// (номер (код) ЦАПа 0...3, старший байт требуемого ЦАПа, младший байт треб ЦАПа)
void CMD_M_Stymul()
{
    int temp;
    int HFO;
    temp=BuffTemp[3];
    Consol = temp&0x3;
    HFO    = temp&0x3;// // (номер (код) ЦАПа 0...3, HFO - 3dac, PLC - 0DAC
    temp =((BuffTemp[4]<<8) | BuffTemp[5]);
    // temp=0;
    temp=temp&0xFFFF;
    
    if(HFO)
    {
     Spi.DAC_A=(unsigned int)temp;
    }
    else{
    DACF =(temp*K_DAC)+deltaDAC;
    Spi.DAC_B =(unsigned int)(DACF) /*(unsigned int)(temp*K_DAC+deltaDAC)*/; // K_DAC);
    }
}

void GLDStartDischarg(void)
{
	   				switch(Gyro.My_Addres)
   						 {//смещение поджига и подсветки в зависимости от адреса ГЛД
  						  case 0:
  						  Gyro.Discharg =  StartDischarg  << ShiftStart0;
					 	  Gyro.BackLight = StartBackLight << ShiftStart0;
  						  break;
	    				  case 1:
                          Gyro.Discharg =  StartDischarg  << ShiftStart1;
                          Gyro.BackLight = StartBackLight << ShiftStart1;
                          break;
                          case 2:
                          Gyro.Discharg =  StartDischarg  << ShiftStart2;
                          Gyro.BackLight = StartBackLight << ShiftStart2;
                          break;
                          case 3:
                          Gyro.Discharg =  StartDischarg  << ShiftStart3;
                          Gyro.BackLight = StartBackLight << ShiftStart3;
                          break;
                          }
}

void Gph_W()
{
 //Gyro.flagGph_W=3;
 	Out_G_photo(BuffTemp[4],BuffTemp[5]); 
 	   
}


unsigned int Check(char *c, unsigned int Count)
{
    int i=1;
    unsigned int temp,CRC;


    temp=1;
    CRC=0;


    for(; i<Count-2; i++) {
        CRC+=c[i];
    }

    if(c[Count-2]!=((CRC>>8)&0xFF)) {
        temp=0;
        Gyro.RsErrLine = (Gyro.RsErrLine)&=0x2;
    }

    if(c[Count-1]!=((CRC>>0)&0xFF)) {
        temp=0;
//		Gyro.RsErrLine= (Gyro.RsErrLine)=0x2;
    }

    c[Count-2]=(CRC>>8)&0xFF;
    c[Count-1]=(CRC>>0)&0xFF;



    return temp;
}

int Getlengf(void)
{
    unsigned int lengf;
    lengf = 1;
    switch(Gyro.CMD_In) 
    {
       case 0x99:  lengf=6; CRC_N=8;     break;  //Mintainance
       case 0xB0:  lengf=6; CRC_N=9;     break;  //Delta_Bins
       case 0x0F:  lengf=6; CRC_N=8;     break;  //Delta_Bins
       case 0xA0:  lengf=6; CRC_N=8;     break;  //Delta_PS
       case 0xDD:  lengf=6; CRC_N=44;    break;  //m_rate    
       case 0x0A:  lengf=8;           	 break;	 //m_stymul
       case 0xE9:  lengf=6; CRC_N=8;	 break;	 //DeviceMode
       case 0xE8:  lengf=6; CRC_N=8; 	 break;  //DeviceMode
       case 0xA5:  lengf=6; CRC_N=8;     break;  //DeviceMode
       case 0xD8:  lengf=6; CRC_N=6;     break;  //m_control   
       case 0xD9:  lengf=6; CRC_N=8;     break;  //m_control
       case 0xE4:  lengf=8;              break;  //M_VIB_W
       case 0xE6:  lengf=8;              break;  //M_Gph_W
    }  return lengf;
}

void Read_CMD(void)
{
  
 Gyro.RsErrLine = (Gyro.RsErrLine)& 0xffff;//для сброса ошибки
 CountBuFFIn=ReadChekCon1(BuffTemp);	
 // чтение данных из консоли
 if(CountBuFFIn==1) {
  	// если есть первый байт 
    if (BuffTemp[0] != SOC_In) {
       ReadCon1(BuffTemp);
       Gyro.RsErrLine += 0x100;
       BuffTemp[99]=Gyro.RsErrLine; 
       }
    } 
    else if(CountBuFFIn==2) //если второй байт
    {		//                                 широковещаительный
         if (BuffTemp[1] != Gyro.My_Addres /*|| BuffTemp[1] !=0x1f*/) {
            ReadCon1(BuffTemp); 
            Gyro.RsErrLine += 0x1;
          } 
    } 
    else if(CountBuFFIn==3) // если третий байт
    {				
        Gyro.CMD_In=BuffTemp[2];
        N=Getlengf(); 
    } 
    else if(CountBuFFIn==4 && (N==6)) 
    {	// N -  длина посылки аскглд(для записи параметров). определяется по коду команды в Getlengf();
        Param1=BuffTemp[3];
    } 
    else if((CountBuFFIn==5)&&(N==7)) 
    {
        Param1=BuffTemp[3];
        Param2=BuffTemp[4];

    } 
    else if((CountBuFFIn==6)&&(N==8))
    {
        Param1=BuffTemp[3];
        Param2=BuffTemp[4];
        Param3=BuffTemp[5];
    } 
    else if((CountBuFFIn==8)&&(N==10))
    {
        Param1=BuffTemp[4];
        Param2=BuffTemp[5];
        Param3=BuffTemp[6];
        Param4=BuffTemp[7];
    } 
  
    else if(CountBuFFIn > (N-1))
     {
      ReadCon1(BuffTemp); 
      switch(Gyro.CMD_In) {
      case 0x99: Gyro.ModeOut=0;  	CMD_Maintenance(); 							 break;
      case 0xD8: 					CMD_M_Control_D8();		   					 break;
      case 0xE9:	 				CMD_M_Param_R();							 break;		//чтение параметров
      case 0xE8: 					CMD_M_Param_W(); 							 break;     //запись параметра
      case 0xDA:                    GLDStartDischarg();  						 break; 
      case 0xD9: 		            CMD_M_Control_D9();				             break;
      case 0x0A:	                CMD_M_Stymul();					             break;
      case 0xDD: 	TempParam=(BuffTemp[3]) & 0x9f; 							//Rate
                  switch(TempParam) {
  				  case  Rate1  :  CMD_Rate(); 			 	    				break;  
				  case  Rate2  :  CMD_Rate2();             						break;
				  case  PRate1 :  Gyro.ModeOut=1;	    						break;  
				  case  PRate2 :  Gyro.ModeOut=2;								break;  
				 }
      break;      //DropDelay(); выставка задержки для мультидропа сбрасывается в команде CMD_Maintenance() на () микросекунд; 
      case 0xA0:  DropDelay();    TempParam=(BuffTemp[3]) & 0x90; 				//Delta_PS
                  switch(TempParam) {
  				  case  Delta_500  :  CMD_Delta_PS();		 	    			break;  
				  case  Delta_EXT  :  CMD_Delta_PS();              				break;
				  case  PDelta_500 :  Gyro.ModeOut=3;   Gyro.Event_500Hz=0;		break;  
				  case  PDelta_EXT :  Gyro.ModeOut=4;              				break;
				 }
	  break;
	  case 0xB0:  DropDelay();	TempParam =	TempParam=(BuffTemp[3]>>7);	        //Delta_Bins
                  switch(TempParam) {
  				  case  PDelta_Bins:  Gyro.ModeOut=5;   Gyro.Event_500Hz=0;		break;  
				  case  Delta_Bins :  CMD_Delta_Bins();             			break;
				 }
	  break;
  	  case 0x0F:   DropDelay(); TempParam = (((BuffTemp[3])>>4) & 0x9); 						//B_Delta
                  switch(TempParam) {
  				  case  PB_Delta_EXT: Gyro.ModeOut=6; 		 	  				break;  
				  case  PB_Delta_INT: Gyro.ModeOut=7;   Gyro.Event_500Hz=0; 	break;
				  case  B_Delta_EXT:  CMD_B_Delta();		      				break;   
    			  case  B_Delta_INT:  CMD_B_Delta();              				break;   		
    			}
      break;
      case 0xE4:                	 CMD_M_vib(); 								break; 
      case 0xE6:					 Gph_W();									break; 
      Gyro.RsErrLine = 0;                       
      }
   }
}


void TechLog(void)
{
 if (ReadCon (Time)) {
/////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
//////////////////////Выбор FlashMod///////////////////////////
////////////////////////////////////////////////////////////////

            if (Time[0] == 'B') Gyro.FlashMod=1;  
            if (Time[0] == 'W') {Gyro.FlashMod=2;}
            if (Time[0] == 'R') {Gyro.FlashMod=3;}
            if (Time[0] == 'E') {Gyro.FlashMod=4;}
///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
             if (Time[0] == 'V') {		// выдача технологическая
                Spi.DAC_B += 200;
               /* sprintf(Time,"%d\r\n", Spi.DAC_B);
                WriteCon(Time);*/
             }
             if (Time[0] == 'v') {		// выдача технологическая
                Spi.DAC_B -= 200;
               /* sprintf(Time,"%d\r\n", Spi.DAC_B);
                WriteCon(Time);*/
             }        
                if (Time[0] == 'l') {		// выдача технологическая
                Gyro.My_Addres			= GyroP.Str.My_Addres; 								 //  Gyro.My_Addres			= 0; 
   				Gyro.GLD_Serial 		= GyroP.Str.GLD_Serial;	
    			Gyro.Firmware_Version	= GyroP.Str.Firmware_Version;

    			Gyro.FrqHZ				= GyroP.Str.FrqHZ;
    			Gyro.Frq 				= GyroP.Str.FrqHZ<<16;
    			Gyro.FrqHZmin 			= GyroP.Str.FrqHZmin<<16;
    			Gyro.FrqHZmax			= GyroP.Str.FrqHZmax<<16;
    			Gyro.FrqChengSpeed		= GyroP.Str.FrqChengSpeed;
    
    			Gyro.ModAmp				= GyroP.Str.ModAmp;
    
    			Gyro.AmpPer				= GyroP.Str.AmpPer;
    			Gyro.Amp    			= GyroP.Str.AmpPer<<16;
    			Gyro.AmpSpeed 			= GyroP.Str.AmpSpeed;
    			Gyro.AmpPerDel			= GyroP.Str.AmpPerDel;
    			Gyro.AmpTarget  		= GyroP.Str.AmpTarget;
    			Gyro.AmpPerMin 			= GyroP.Str.AmpPerMin;
    			Gyro.AmpPerMax 			= GyroP.Str.AmpPerMax;
    			Gyro.AmpMin 			= GyroP.Str.AmpMin;
    			Gyro.AmpTD  			= GyroP.Str.AmpTD;
    
    			Gyro.TermoNKU			= GyroP.Str.TermoNKU<<2;
    
    			Spi.DAC_A				= GyroP.Str.DAC_A<<2;
    			Spi.DAC_B 				= GyroP.Str.DAC_B<<2;

    			Gyro.Gain_Sin 			= GyroP.Str.Gain_Sin;
    			Gyro.Gain_Cos 			= GyroP.Str.Gain_Cos;
                for(int i=0;i<26;i++)
                {
                sprintf(Time," %d=%d\r\n",i, GyroP.Array[i]);
                WriteCon(Time);
                }
             }    
            if (Time[0] == 'w')   TypeMod=2; 
            if (Time[0] == 'a')   TypeMod=1;          
            if (Time[0] == 's')   TypeMod=0; 
       ////////////////////////////////////////////////////////////////////////////////   
                      /*Запись лога регулировки периметра*/
            if (Time[0] == 'g')   Gyro.LogPLC=1;  if(OLDDAC)   Spi.DAC_B=OLDDAC;                                //включит передачу
            if (Time[0] == 'h')  {Gyro.LogPLC=2; Spi.DAC_B=19000; Gyro.PLC_Error2Mode = 1400; OLDDAC=Spi.DAC_B; Spi.DAC_B=19000;}                             //десперсионка
            if (Time[0] == 'j')   Gyro.LogPLC=0;  if(OLDDAC)   Spi.DAC_B=OLDDAC;                              //регулировка без выдачиж

            if (Time[0] == 'k')   Gyro.LogPLC = 0;         //Отключить передачу 

      //////////////////////////////////////////////////////////////////////////////////////  
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   ////////////////////////////////////////////////////выдача частоты в терминал длля записи лога///////////////////////////////////////////////////////////////////////////////////////////////////////
   /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


             if (Gyro.PLC_Error2Mode) {		// выдача технологическая
               // sprintf(Time,"\r\nPLC_Error2Mode");
                WriteCon(Time);
              }
        }
}