📄 standard.c
字号:
//pragma ot(0)
#define QZJ_GLOBALS
#include "Macro.h"
#include "Main.h"
void SendYxYcToEXT(unsigned char Port);
void make_crctable(void)
{
unsigned int data i, j;
unsigned int data r;
#define CHAR_BIT 8
#define UCHAR_MAX 255
#define CRCPOLY 0x8005
for (i = 0; i <= UCHAR_MAX; i++)
{
r = i;
for (j = CHAR_BIT; j > 0; j--)
{
if (r & 1)
r = (r >> 1) ^ CRCPOLY;
else
r >>= 1;
}
crctable[i] = r;
}
}
static unsigned char Std_Receive(unsigned char Port)
{
struct Serial_rcv xdata *Com;
unsigned char cTmp;
Com = Rcv + Port;
while ( Com->Tail != Com->Head ) {
cTmp=Com->Data[Com->Head++];
Com->Head=Com->Head % sizeof(Com->Data);
if ( (!Com->lastSOH && (cTmp == DLE) ) || (Com->lastSOH && (cTmp != DLE)) ) {
if ( !Com->lastSOH ) { Com->lastSOH = 1 ; continue; }
Com->lastSOH = 0;
switch (cTmp) {
case SOH:
Com->pos = 0;
Com->Start = 1;
break;
case EOT:
if (Com->Start) {
Com->Start = 0;
return 1;
}
break;
default:
Com->Start = 0;
break;
}
continue;
}
if (!Com->Start ) continue;
Com->lastSOH = 0;
Com->Buff[Com->pos++]= cTmp;
Com->pos= Com->pos % sizeof(Com->Buff);
} //end of while
return 0;
}
void Std_Process(unsigned char Port)
{ // data is in Rcv.Buff[0]...[len-1]
// type, address, ......, CRCL, CRCH
struct Serial_rcv xdata *Com;
unsigned int data CRC;
unsigned int xdata iTmp;
unsigned char xdata tmpBuff[256];
if (!Std_Receive(Port)) return;
Com = Rcv + Port;
if (Com->pos < 4) return;
CRC = 0;
iTmp = 0;
while (iTmp < Com->pos) { UPDATA_CRC(CRC, Com->Buff[iTmp++]); }
if (CRC != 0) return;
if ( Com->Buff[1] != Address ) return;
switch (Com->Buff[0]) {
case SET_PARA:
SetPara(Com->pos-4,&Com->Buff[2]);
break;
case SET_CAIJI:
/* len =Com->Buff[2]; // new state of Relay
if (YkStyle == 0) {
}
else {
RELAY2 =0;
iDelay = 200; // output pulse
}
*/ break;
case GET_PARA:
ReadPara( tmpBuff);
iTmp = 13 + tmpBuff[5] * LENCMD + tmpBuff[10] * LENCMD;
if ( Send_To_EXT_Buffer(Port, D_PARA, tmpBuff, iTmp) ) SendStart(Port);
break;
case GET_CAIJI: // (center station)want getting the data of caiji-ban
SendYxYcToEXT(Port);
break;
}
}
unsigned char Send_To_EXT_Buffer(unsigned char Port,unsigned char Type,unsigned char xdata *buff,unsigned int len)
{
unsigned char xdata tmp_data[1024];
unsigned char xdata TempBuf[1024];
struct Serial_snd xdata *Com;
unsigned char data temp;
unsigned int data i, j;
unsigned int data CRC;
Com = Snd + Port;
TempBuf[0]=Type;
TempBuf[1]=Address;
if (len > 0) memcpy(&TempBuf[2],buff,len);
tmp_data[0] = DLE;
tmp_data[1] = SOH;
for(i = 0, j = 2, CRC = 0; i < (len + 2); i++) {
temp=TempBuf[i];
if(temp == DLE) tmp_data[j++] = DLE;
tmp_data[j++] =temp;
UPDATA_CRC(CRC,temp);
}
temp = CRC & 0x0ff;
if(temp == DLE) tmp_data[j++] = DLE;
tmp_data[j++] = temp;
temp = (CRC>>8)&0xff;
if(temp == DLE) tmp_data[j++] = DLE;
tmp_data[j++] = temp;
tmp_data[j++] = DLE;
tmp_data[j++] = EOT;
if(Com->Tail < Com->Head) {
if(((unsigned int)Com->Tail + j) >= Com->Head)
return 0;
else {
for(i = 0; i < j; i++)
Com->Data[Com->Tail++]=tmp_data[i];
return 1;
}
}
else if ((sizeof(Snd[0].Data) - Com->Tail + Com->Head) > j) {
for(i = 0; i < j; i++) {
Com->Data[Com->Tail++] = tmp_data[i];
Com->Tail = Com->Tail % sizeof(Snd[0].Data);
}
return 1;
}
else
return 0;
}
void SendYxYcToEXT(unsigned char Port)
{
unsigned char xdata SndBuff[1000];
unsigned char data i;
unsigned int data len;
unsigned int data iLen;
len = 0;
SndBuff[len++] = DATA_YX;
SndBuff[len++] = Len_Yx;
SndBuff[len++] = LastYx1 ^ 0xff;
SndBuff[len++] = LastYx2 ^ 0xff;
SndBuff[len++] = DATA_YC;
SndBuff[len++] = Len_Yc;
for (i=0; i<8; i++) {
SndBuff[len++] = AD_Data[i] & 0xff;
SndBuff[len++] = AD_Data[i] / 256;
}
SndBuff[len++] = DATA_COM1;
if (Port1Style) {
iLen = Port1Data[0] + Port1Data[1] * 256;
memcpy(&SndBuff[len], &Port1Data[0], iLen + 2);
Port1Data[0] = 0;
Port1Data[1] = 0;
len += iLen + 2;
}
else {
SndBuff[len++] = 0;
SndBuff[len++] = 0;
}
SndBuff[len++] = DATA_COM2;
if (Port2Style) {
iLen = Port2Data[0] + Port2Data[1] * 256;
memcpy(&SndBuff[len], &Port2Data[0], iLen + 2);
Port2Data[0] = 0;
Port2Data[1] = 0;
len += iLen + 2;
}
else {
SndBuff[len++] = 0;
SndBuff[len++] = 0;
}
if ( Send_To_EXT_Buffer(Port, D_CAIJI, SndBuff, len) ) SendStart(Port);
}
unsigned char Send_To_Port_Buffer(unsigned char Port, unsigned char xdata *buff, unsigned int len)
{
struct Serial_snd xdata *Com;
unsigned int data i;
Com = Snd + Port;
if(Com->Tail < Com->Head) {
if(((unsigned int)Com->Tail + len) >= Com->Head)
return 0;
else {
for(i = 0; i < len; i++)
Com->Data[Com->Tail++]=buff[i];
return 1;
}
}
else if ((unsigned int)(Com->Head + sizeof(Com->Data) - Com->Tail ) > len) {
for(i = 0; i < len; i++) {
Com->Data[Com->Tail++] = buff[i];
Com->Tail = Com->Tail % sizeof(Com->Data);
}
return 1;
}
else
return 0;
}
unsigned char CommModeStoD(unsigned char str)
{
str &= 0xdf; // 将小写转换成大写
switch (str) {
case 'N': // None
return 0x03;
break;
case 'M': // 标记
return 0x03 | 0x28;
break;
case 'S':
return 0x03 | 0x38;
break;
case 'E': // 偶数
return 0x03 | 0x18;
break;
case 'O': // 奇数
return 0x03 | 0x08;
break;
default:
return 0x03;
break;
}
}
void SetPara(unsigned int len, unsigned char xdata* Source)
{
unsigned char xdata tmpBuff[1024];
unsigned int data iTmp, crc;
unsigned int data i;
unsigned long data lTmp;
for (crc=0,i=0; i<len; i++) UPDATA_CRC(crc,Source[i]);
if (crc != 0) return;
iTmp = 11 + Source[5] * LENCMD + Source[10] * LENCMD;
if (iTmp != (len-2)) return;
if (Source[0] != 0x08) return;
tmpBuff[0] = 0x08;
if (Source[1] == 0) {
tmpBuff[1] = 0;
tmpBuff[4] = 0;
}
else {
tmpBuff[1] = 1;
iTmp = Source[3] * 256 + Source[2];
lTmp = 172800 / iTmp;
tmpBuff[2] = lTmp & 0xff;
tmpBuff[3] = CommModeStoD(Source[4]);
tmpBuff[4] = Source[5];
if ( Source[5]>0 ) memcpy(&tmpBuff[9], &Source[11], Source[5] * LENCMD);
}
if (Source[6] == 0) {
tmpBuff[5] = 0;
tmpBuff[8] = 0;
}
else {
tmpBuff[5] = 1;
iTmp = Source[8] * 256 + Source[7];
lTmp = 172800 / iTmp;
tmpBuff[6] = lTmp & 0xff;
tmpBuff[7] = CommModeStoD(Source[9]);
tmpBuff[8] = Source[10];
if ( Source[10]>0 ) memcpy(&tmpBuff[9+tmpBuff[4] * LENCMD], &Source[11 + Source[5] * LENCMD], Source[10] * LENCMD);
}
iTmp = 9 + tmpBuff[4] * LENCMD + tmpBuff[8] * LENCMD;
crc = 0;
for (i=0; i<iTmp; i++) UPDATA_CRC(crc,tmpBuff[i]);
tmpBuff[iTmp] = crc & 0xff;
tmpBuff[iTmp+1] = (crc>>8)&0xff;
if ( WriteEE(tmpBuff, iTmp+2) ) SetCommPort();
}
unsigned char CommModeDtoS(unsigned char mode)
{
switch (mode) {
case 0x03: // None
return 'n';
break;
case 0x2b: // 标记1
return 'm';
break;
case 0x3b: // 空格,0
return 's';
break;
case 0x1b: // 偶数
return 'e';
break;
case 0x0b: // 奇数
return 'o';
break;
default:
return 'N';
}
}
void ReadPara(unsigned char xdata* Dest)
{
unsigned int data i;
unsigned int data CRC;
unsigned long xdata lTmp;
unsigned int xdata iTmp;
unsigned char xdata tmpBuff[sizeof(Port1Cmd) + sizeof(Port2Cmd) + 20];
unsigned char code initData[] = { 0x08, 0x00, 0xc0, 0x12, 'n', 0x00,
0x00, 0xc0, 0x12, 'n', 0x00};
ReadEE(tmpBuff, sizeof(Port1Cmd) + sizeof(Port2Cmd) + 11);
memcpy( Dest, initData, sizeof(initData) );
if (tmpBuff[0] != 0x08) return; // port * 2 { style, 9600, N/M/P/E, len}
CRC = 0;
iTmp = tmpBuff[4] * LENCMD + tmpBuff[8] * LENCMD + 11; // 11 = 1 + 4 + 4 + 2(crc)
for (i=0; i<iTmp; i++) UPDATA_CRC(CRC,tmpBuff[i]);
if (CRC != 0) return;
if (tmpBuff[1] == 1) {
Dest[1] = 1;
lTmp = 172800 / Port1Baud;
Dest[2] = lTmp & 0xff;
Dest[3] = (lTmp>>8) & 0xff;
Dest[4] = CommModeDtoS(tmpBuff[3]);
Dest[5] = tmpBuff[4];
if ( tmpBuff[4]>0 ) memcpy(&Dest[11],&tmpBuff[9],tmpBuff[4] * LENCMD);
}
if (tmpBuff[5] == 1) {
Dest[6] = 1;
lTmp = 172800 / Port2Baud;
Dest[7] = lTmp & 0xff;
Dest[8] = (lTmp>>8) & 0xff;
Dest[9] = CommModeDtoS(tmpBuff[7]);
Dest[10] = tmpBuff[8];
if ( tmpBuff[8]>0 ) memcpy(&Dest[11 + Dest[5] * LENCMD],&tmpBuff[9 + tmpBuff[4] * LENCMD],tmpBuff[8] * LENCMD);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -