#include <GLOBAL.h>
#include <stdlib.h>
#include <stdbool.h>
#include <msp430x41x.h>
#define SysRxd BIT5
#define SysRxdSt P1IN & BIT5
#define SysRxdIns P1DIR &=~ BIT5
#define RecLedOut P5DIR |= BIT6
#define RecLedHig P5OUT |= BIT6
#define RecLedLow P5OUT &=~ BIT6
extern void SysDataSend(unsigned char SendNo,unsigned char Table);
extern void SysSendFull(unsigned char Table,unsigned char CmdData,unsigned char DI0,unsigned char DI1,unsigned char Length);
extern void SlvSendFull(unsigned char Table,unsigned char CmdData,unsigned char DI0,unsigned char DI1,unsigned char Length);
//------------------------------ *** - 判断指令数据是否是单独指令 - *** ------------------------------//
bool SysCheckAdd(void)
{
bool AddFg;
unsigned char i;
AddFg=0;
for(i=0;i<4;i++)
{
if(SysBuf[3+i]==0xaa)
{
AddFg=1;
}
else
{
AddFg=0;
LongToHex(GloBuf,(unsigned char*)&ChipMac);
if(SysBuf[3+i] == GloBuf)
{
AddFg=1;
}
else
{
break;
}
}
}
return AddFg;
}
void SysAddParse(void)
{
switch(SysBuf[9])
{
case 0x01 ://---读数据
switch(SysBuf[11])//---
{
case 0x90 ://---(点抄数据)
switch(SysBuf[12])//---
{
case 0x10 ://---当前数据---FE FE FE 68 10 01 AA AA AA AA AA 68 01 03 90 10 D7 16
SysSendRes=0x0001;
SlvSendFull(SysBuf[2],0x01,0x90,0x10,0);
break;
case 0x11 ://---冻结数据
SysSendRes=0x0002;
break;
case 0x1f ://---综合数据
SysSendRes=0x0004;
break;
}
break;
}
break;
case 0x03 ://---读地址
switch(SysBuf[11])
{
case 0x81 :
switch(SysBuf[12])
{
case 0x0a :
SysSendRes=0x0008;
break;
}
break;
}
break;
case 0x04 ://---写数据
switch(SysBuf[11])
{
case 0x90 :
switch(SysBuf[12])
{
case 0x10 :
SysSendRes=0x0010;
break;
}
break;
}
break;
case 0x15 ://---写地址
switch(SysBuf[11])
{
case 0xa0 :
switch(SysBuf[12])
{
case 0x18 :
SysSendRes=0x0020;
break;
}
break;
}
break;
default:
SysSendRes=0x0000;
break;
}
}
void SysClerRec(void)
{
SysRecDptr=0;
SysInFg=0;
SysSendEndFg=1;
RamCler(SysBuf,48);
}
void SysCmdPar(void)
{
if(SysCheckAdd())
{
SysAddParse();
}
else
{
SysClerRec();
}
SysDataSend(SysSendRes,SysBuf[2]);
}
void SysCommConn(void)
{
if(SysCmdParFg)
{
if(SysBuf[1]==0x10)
{
if(SysCheckSum())
{
SysCmdPar();
}
else
{
SysClerRec();
}
}
else
{
SysClerRec();
}
SysCmdParFg=0;
}
else
{
if(SecConSt&0x01)
{
SecConSt&=0xfe;
if(SysInFg)
{
if(SysInTime>0)
{
SysInTime--;
}
else
{
SysClerRec();
}
}
}
}
}
void SysRecConn(void)
{
unsigned char i;
i=0;
if(P1IFG&BIT5)
{
ChkFg=0;
ChkBit=0;
SysRecData=0;
SysInFg=1;
SysInTime=3;//--------------------------------------------如果两秒内没有接收结束自
SysDelay(90);
while(i<10){if(i<9){if(i>0){SysRecData>>=1;if(SysRxdSt){SysRecData|=0x80;if(ChkBit){ChkBit=0;}else{ChkBit=1;}}}SysDelay(165);}else{if(i==9){ChkFg=SysRxdSt;SysDelay(75);}}i++;}
if(ChkBit==ChkFg)//-------------------------------------------------------上次数据是否发送完毕?
{
if(SysSendEndFg)
{
if(SysRecDptr<48)
{
if(SysRecDptr==0)//----------------------------------数据缓冲区地址指针是否为零
{
if(SysRecData==0x68)//------------------------------------数据保存到缓冲区---缓冲区的第一个数据是否等于0x68
{
SysBuf[0]=0x68;
SysRecDptr++;
}
else
{
SysRecDptr=0;//------------------------------缓冲区地址归零
}
}
else
{
if(SysRecDptr==8)//------------------------------缓冲区指针是否等于7
{
if(SysRecData==0x68)//--------------------------------缓冲区已接收的第8位是否等于0x68
{
SysBuf[8]=0x68;//--------------------------数据保存到缓冲区
SysRecDptr++;
}
else
{
SysRecDptr=0;//--------------------------缓冲区地址归零
}
}
else
{
SysBuf[SysRecDptr]=SysRecData;//--------------数据保存到缓冲区
SysRecDptr++;//------------------------------缓冲区地址累加
}
if(SysRecDptr>12)
{
if(SysBuf[SysBuf[10]+11]==0x16)//----------------------------是否完成一帧数据的接收?结束符是否等于0x16
{
SysCmdParFg=1;//-----------------------------------------------启动命令解析使能位
SysRecDptr=0;//------------------------------------------缓冲区地址归零
SysSendEndFg=0;//------------------------------------------------已发送完毕位归零
P1IE &= ~SysRxd;
}
}
}
}
else
{
SysRecDptr=0;//--------------------------------------缓冲区地址归零
}
}
else
{
SysRecDptr=0;
}
}
else
{
SysRecDptr=0;
SysRecData=0;
}
}
}