📄 appmain.c
字号:
#include "general.h"
#include "appmain.h"
#define BYTE INT8U
#define WORD INT16U
#define UINT INT16U
#include "crc.h"
#ifdef ARM_XSCALE_CPU
#include "timer.h"
#endif
/* demo buffers */
BYTE testinbuf[1500];
BYTE testoutbuf[1500];
BYTE OutBuf[1500];
BYTE InBuf[1500];
BYTE CommBuf[1500];
#ifdef ARM_XSCALE_CPU
TIMER syntimer;
#endif
void WriteOCM(BYTE *pbegin, BYTE bval);
void FillTM480(BYTE *ptmp);
void FillTM490(BYTE *ptmp);
void TestTM422(void);
void TestTM480(void);
void TestTM490(void);
void TestTM490V2(void);
void TestNet(void);
#ifdef INTEL_X86_CPU
BYTE bwait = 0;
BYTE bwaitack = 0;
#endif
BYTE bsyn = 0;
static BYTE nloop = 0;
BYTE RunSynBuf[1500];
void SendSyn(BYTE );
#ifdef INTEL_X86_CPU
BYTE ReceiveSyn(BYTE , BYTE*);
#endif
#ifdef ARM_XSCALE_CPU
BYTE ReceiveSyn(BYTE bframetype, TIMER* ptimer);
#endif
void ICURunSync(void);
/* 计算给定长度数据的16位CRC */
UINT GetCrc16(BYTE* pData, UINT nLength){
UINT fcs = 0xFFFF;
for( ; nLength > 0; --nLength, ++pData){
fcs = (fcs >> 8) ^ upCRCTab16[(fcs ^ *pData) & 0xFF];
}
return ~fcs;
}
/* 检查给定长度数据的16位CRC是否正确 */
unsigned int IsCrc16Good(BYTE* pData, UINT nLength){
UINT fcs = 0xFFFF;
for( ; nLength > 0; --nLength, ++pData){
fcs = (fcs >> 8) ^ upCRCTab16[(fcs ^ *pData) & 0xFF];
}
return (fcs == 0xF0B8); /* 0xf0b8是CRC-ITU的"Magic Value" */
}
#define SYNC_REQUEST 0x66
#define SYNC_RESPONSE 0x77
/*
功能 : 发送同步数据
参数 : bframetype 帧类型
0x66表示请求帧(ICU1->ICU2)
0x77表示应当帧(ICU2->ICU1)
返回值 : 无
*/
void SendSyn(BYTE bframetype)
{
RunSynBuf[0] = bframetype;
RunSynBuf[1] = bframetype;
RunSynBuf[2] = bframetype;
RunSynBuf[3] = bframetype;
RunSynBuf[4] = nloop;
RunSynBuf[5] = *(BYTE*)(getIOOutp(7) + 0);
RunSynBuf[6] = *(BYTE*)(getIOOutp(7) + 1);
RunSynBuf[7] = *(BYTE*)(getIOOutp(7) + 2);
RunSynBuf[8] = *(BYTE*)(getIOOutp(7) + 3);
RunSynBuf[9] = *(BYTE*)(getIOOutp(7) + 4);
RunSynBuf[10] = *(BYTE*)(getIOOutp(7) + 5);
RunSynBuf[11] = *(BYTE*)(getIOOutp(7) + 6);
RunSynBuf[12] = *(BYTE*)(getIOOutp(7) + 7);
NetSend(CurNet.ICUIn, RunSynBuf, (long int)50);
}
#ifdef ARM_XSCALE_CPU
BYTE ReceiveSyn(BYTE bframetype, TIMER* ptimer)
{
WORD dfrmlen = 0;
RunSynBuf[0] = 0x00;
RunSynBuf[1] = 0x00;
RunSynBuf[2] = 0x00;
RunSynBuf[3] = 0x00;
starttimer(ptimer);
do
{
dfrmlen = ReceiveFrom(RunSynBuf, CurNet.ICUIn);
if (dfrmlen > 0)
{
if ((bframetype == RunSynBuf[0])&&
(bframetype == RunSynBuf[1])&&
(bframetype == RunSynBuf[2])&&
(bframetype == RunSynBuf[3]))
{
if (2 == getICU_ID()) nloop = RunSynBuf[4];
stoptimer(ptimer);
bsyn = 1;
setSYNLED(INSYN);
if (TRUE == IsEmpty(CurNet.ICUIn))
{
return(0);
}
}
}
if (isTimeout(ptimer)) /* 超时判断 */
{
stoptimer(ptimer);
setSYNLED(NOSYN);
return(1);
}
} while (1);
}
#else
/*
功能 : 接收同步数据
参数 : bframetype 帧类型
0x66表示请求帧(ICU1->ICU2)
0x77表示应当帧(ICU2->ICU1)
pCounter 超时计数器指针
返回值 : 0 正常
1 超时
*/
BYTE ReceiveSyn(BYTE bframetype, BYTE* pCounter)
{
WORD dfrmlen = 0;
RunSynBuf[0] = 0x00;
RunSynBuf[1] = 0x00;
RunSynBuf[2] = 0x00;
RunSynBuf[3] = 0x00;
do
{
dfrmlen = ReceiveFrom(RunSynBuf, CurNet.ICUIn);
if (dfrmlen > 0)
{
if ((bframetype == RunSynBuf[0])&&
(bframetype == RunSynBuf[1])&&
(bframetype == RunSynBuf[2])&&
(bframetype == RunSynBuf[3]))
{
if (2 == getICU_ID()) nloop = RunSynBuf[4];
*pCounter = 0;
bsyn = 1;
setSYNLED(INSYN);
if (TRUE == IsEmpty(CurNet.ICUIn))
{
return(0);
}
}
}
if (*pCounter > 10) /* 超时判断 */
{
*pCounter = 0;
setSYNLED(NOSYN);
return(1);
}
} while (1);
}
#endif
/* 系统同步 */
void ICURunSync(void)
{
bsyn = 0;
settimer(&syntimer, 100);
if (1 == getICU_ID())
{
SendSyn(SYNC_REQUEST);
#ifdef INTEL_X86_CPU
bwaitack = 0;
ReceiveSyn(SYNC_RESPONSE, &bwaitack);
#endif
#ifdef ARM_XSCALE_CPU
ReceiveSyn(SYNC_RESPONSE, &syntimer);
#endif
}
else
{
#ifdef INTEL_X86_CPU
if (0 == ReceiveSyn(SYNC_REQUEST, &bwait))
{
SendSyn(SYNC_RESPONSE);
}
#endif
#ifdef ARM_XSCALE_CPU
if (0 == ReceiveSyn(SYNC_REQUEST, &syntimer))
{
SendSyn(SYNC_RESPONSE);
}
#endif
}
#ifdef DEBUG
if (1 == bsyn)
{
flashLed(RNETA_LED);
}
else
{
darkenLed(RNETA_LED);
}
#endif
}
void Appmain(void)
{
TIMER delay;
settimer(&delay, 200);
ICURunSync();
ExchangeData();
PollIO(IO_ALL);
TestTM422();
TestTM480();
TestTM490();
TestTM490V2();
TestNet();
if ((1 == bsyn)&&(1 == getICU_ID()))
{
nloop++;
}
starttimer(&delay);
while (isTimeout(&delay) != 1);
}
/* 处理TM422 */
void TestTM422(void)
{
BYTE *pinput;
// BYTE *ptm470out;
// BYTE i = 0;
if ((getIOStructp(7) != (RunDEVSTRUCT *)NO_DEVICE_CONFIG) &&
(getIOStructp(7) != NULL))
{
pinput = (BYTE*)getIOInp(7);
switch (nloop % 5)
{
case 0: SetTM422LED(0xAA, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA);
break;
case 1: SetTM422LED(0x55, 0xAA, 0x55, 0x55, 0x55, 0xAA, 0xAA);
break;
case 2: SetTM422LED(0x55, 0x55, 0xAA, 0x55, 0x55, 0xAA, 0xAA);
break;
case 3: SetTM422LED(0x55, 0x55, 0x55, 0xAA, 0x55, 0xAA, 0xAA);
break;
case 4: SetTM422LED(0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA);
break;
default:
break;
}
/* 将输入数据发送到TM470的前30个通道 */
// if ((getIOStructp(20) != (RunDEVSTRUCT *)NO_DEVICE_CONFIG) &&
// (getIOStructp(20) != NULL))
// {
// if (getIOType(20) == OCM)
// {
// ptm470out = getIOOutp(20);
// *ptm470out = getSysID();
// for (i = 0; i < 30; i++)
// {
// *(BYTE*)(ptm470out + i + 1) = *(BYTE*)(pinput + i);
// }
// }
// }
}
}
/* 测试TM480 */
void TestTM480(void)
{
BYTE *pinput, *poutput;
if ((getIOStructp(8) != (RunDEVSTRUCT *)NO_DEVICE_CONFIG) &&
(getIOStructp(8) != NULL))
{
pinput = (BYTE*)getIOInp(8);
poutput = (BYTE*)getIOOutp(8);
FillTM480(poutput);
}
if ((getIOStructp(9) != (RunDEVSTRUCT *)NO_DEVICE_CONFIG) &&
(getIOStructp(9) != NULL))
{
pinput = (BYTE*)getIOInp(9);
poutput = (BYTE*)getIOOutp(9);
FillTM480(poutput);
}
}
/* 测试TM490 */
void TestTM490(void)
{
BYTE *pinput, *poutput;
if ((getIOStructp(14) != (RunDEVSTRUCT *)NO_DEVICE_CONFIG) &&
(getIOStructp(14) != NULL))
{
pinput = (BYTE*)getIOInp(14);
poutput = (BYTE*)getIOOutp(14);
FillTM490(poutput);
}
if ((getIOStructp(15) != (RunDEVSTRUCT *)NO_DEVICE_CONFIG) &&
(getIOStructp(15) != NULL))
{
pinput = (BYTE*)getIOInp(15);
poutput = (BYTE*)getIOOutp(15);
FillTM490(poutput);
}
}
/* 测试TM490V2 */
void TestTM490V2(void)
{
BYTE *pinput, *poutput;
if ((getIOStructp(12) != (RunDEVSTRUCT *)NO_DEVICE_CONFIG) &&
(getIOStructp(12) != NULL))
{
pinput = (BYTE*)getIOInp(12);
poutput = (BYTE*)getIOOutp(12);
FillTM490(poutput);
}
if ((getIOStructp(13) != (RunDEVSTRUCT *)NO_DEVICE_CONFIG) &&
(getIOStructp(13) != NULL))
{
pinput = (BYTE*)getIOInp(13);
poutput = (BYTE*)getIOOutp(13);
FillTM490(poutput);
}
}
void TestNet(void)
{
WORD ncycrecfrm = 0; /* 每周期收到的数据包 */
WORD ncycsndfrm = 0; /* 每周期发送的数据包 */
{ /* 系间ICU通信 */
WORD dfrmlen = 0;
NetSend(CurNet.ICUOut, OutBuf, (long int)100);
do {
dfrmlen = ReceiveFrom(InBuf, CurNet.ICUOut);
if (dfrmlen > 0) {
flashLed(RNETB_LED);
} else {
}
} while (IsEmpty(CurNet.ICUOut) != TRUE);
}
{ /* ICU与COMM通信 */
static WORD ntestsnd = 0;
static WORD ntestrcv = 0;
WORD dfrmlen = 0;
switch(getSysID()) {
case TSYSA: {
do {
dfrmlen = ReceiveFrom(CommBuf, CurNet.COMM1);
if (dfrmlen > 0) {
ncycrecfrm++;
ntestrcv++;
flashLed(SNETA_LED);
if (NET_OP_ORDER == CommBuf[0]) {
CommBuf[0] = NET_INPUT;
NetSend(CurNet.COMM1, CommBuf, (long int)dfrmlen);
ncycsndfrm++;
ntestsnd++;
}
}
} while (IsEmpty(CurNet.COMM1) != TRUE);
}
break;
case TSYSB: {
do {
dfrmlen = ReceiveFrom(CommBuf, CurNet.COMM2);
if (dfrmlen > 0) {
ncycrecfrm++;
ntestrcv++;
flashLed(SNETB_LED);
if (NET_OP_ORDER == CommBuf[0]) {
CommBuf[0] = NET_INPUT;
NetSend(CurNet.COMM2, CommBuf, (long int)dfrmlen);
ncycsndfrm++;
ntestsnd++;
}
}
} while (IsEmpty(CurNet.COMM2) != TRUE);
}
break;
default: break;
}
}
}
void WriteOCM(BYTE *pbegin, BYTE bval)
{
BYTE i = 0;
*pbegin = getSysID();
for (i = 0; i < 32; i++)
{
*(BYTE*)(pbegin + 1 + i) = bval;
}
}
void FillTM480(BYTE *ptmp)
{
BYTE i = 0;
UINT crcresult = 0;
*(BYTE*)ptmp = (BYTE)(nloop/2); /* time stamp */
*(BYTE*)(ptmp + 1) = 0x00;
*(BYTE*)(ptmp + 2) = 0x00;
/* data1 25 bytes */
*(BYTE*)(ptmp + 3) = 0xC0;
for (i = 0; i < 24; i++)
{
*(BYTE*)(ptmp + 4 + i) = 0x11;
}
/* data2 25 bytes */
*(BYTE*)(ptmp + 28) = 0xC0;
for (i = 0; i < 24; i++)
{
*(BYTE*)(ptmp + 29 + i) = 0x22;
}
/* data3 25 bytes */
*(BYTE*)(ptmp + 53) = 0xF0;
for (i = 0; i < 24; i++)
{
*(BYTE*)(ptmp + 54 + i) = 0x33;
}
/* data4 25 bytes */
*(BYTE*)(ptmp + 78) = 0xF0;
for (i = 0; i < 24; i++)
{
*(BYTE*)(ptmp + 79 + i) = 0x44;
}
/* data5 25 bytes */
*(BYTE*)(ptmp + 103) = 0x00;
for (i = 0; i < 24; i++)
{
*(BYTE*)(ptmp + 104 + i) = 0x55;
}
crcresult = GetCrc16(ptmp, 128);
*(BYTE*)(ptmp + 128) = LOBYTE(crcresult);
*(BYTE*)(ptmp + 129) = HIBYTE(crcresult);
}
void FillTM490(BYTE *ptmp)
{
BYTE i = 0;
UINT crcresult = 0;
for (i = 0; i < 140; i++)
{
*(BYTE*)(ptmp + i) = (BYTE)(nloop/2);
}
*(BYTE*)ptmp = (BYTE)(nloop/2);
*(BYTE*)(ptmp + 1) = 0xF3;
*(BYTE*)(ptmp + 2) = 0xAA;
*(BYTE*)(ptmp + 3) = 0xF0;
*(BYTE*)(ptmp + 4) = 0xF0;
*(BYTE*)(ptmp + 5) = (BYTE)(((nloop/2) % 6) + 1);
*(BYTE*)(ptmp + 136) = 0x0F;
*(BYTE*)(ptmp + 137) = 0x0F;
crcresult = GetCrc16(ptmp, 138);
*(BYTE*)(ptmp + 138) = LOBYTE(crcresult);
*(BYTE*)(ptmp + 139) = HIBYTE(crcresult);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -