📄 test.c
字号:
#include "wea_dos.h"
void SendEnableLevel(int level)
{
int p;
int d=0;
if(level==0)
p=PC_ENABLE_L_O;
else
p=PC_ENABLE_H_O;
outb(p,d);
}
void SendSclks(int nSclk,int data)
{ int p=MAP_O;
MAPO mapo;
int i;
mapo._bit.sclk=1;
mapo._bit.sdata=data;
outb(p,mapo._byte); //sclk=1
if(nSclk==0)
return;
for(i=0;i<nSclk;i++)
{
mapo._bit.sclk=0;
outb(p,mapo._byte); //sclk=0
DelayUs(1);
mapo._bit.sclk=1;
outb(p,mapo._byte); //sclk=1
DelayUs(2); // delay 2.5uS
}
}
BYTE GetByte(BOOL bInvert)
{
int p=MAP_I;
int i;
MAPI mapi;
BYTE data=0;
for(i=0;i<8;i++)
{
data=data*2;
SendSclks(1,1);
mapi._byte=inb(p);
if(bInvert!=0)
mapi._bit.sdata_i=1-mapi._bit.sdata_i;
data=data+mapi._bit.sdata_i;
}
return data;
}
void SendEnable(int TimeWidth)
{
int t=TimeWidth*2;
int p=PC_ENABLE_L_O;
int d=0;
outb(p,d);
p=PC_ENABLE_H_O;
outb(p,d);
DelayMs(t);
p=PC_ENABLE_L_O;
outb(p,d);
}
BOOL InitialMap(int nMap)
{
int i;
int p=MAP_I;
MAPI mapi;
for(i=0;i<nMap*4;i++)
{
SendByte(0x00);
DelayUs(5);
}
DelayMs(20);
SendLatch();
DelayUs(10);
SendEnable(10);
DelayMs(20);
for(i=0;i<32;i++) // for check
{
SendBit(1); // shift-register=1
mapi._byte=inb(p); // invert to 0 at outport
if(mapi._bit.sdata_i==1)
return FALSE;
}
return TRUE;
}
BYTE DataGen(DATA_TYPE type,int index)
{
BYTE k,buff,j;
switch(type)
{
case all_one:
return 0xff;
case all_zero:
return 0;
case d1010:
return 0xaa;
case d0101:
return 0x55;
case d123:
return (index+1)%256;
case width_var:
k=(index)%7;
buff=1;
for(j=1;j<=k;j++)
buff=buff | (1<<j);
return buff;
default:
return 0;
}
}
BOOL DataTrans(int nMap,DATA_TYPE type,char* info,int* m_errn)
{
BOOL OK1=TRUE;
char info1[50];
BYTE data_i,data_o;
BYTE m_do[1024];
BYTE m_di1[1024];
BYTE m_di2[1024];
int i,j;
BOOL OK=TRUE;
for(i=0;i<nMap;i++)
for(j=0;j<4;j++)
{
data_o=DataGen(type,4*i+j);
SendByte(data_o);
m_do[4*i+j]=data_o;
DelayUs(30);
}
DelayMs(20);
SendLatch();
for(i=0;i<nMap;i++)
for(j=0;j<4;j++)
{
data_i=GetByte(1);//1
m_di1[4*i+j]=data_i;
if(data_i!=m_do[4*i+j])
{
OK=FALSE;
}
DelayUs(30);
}
if(OK==FALSE)
strcpy(info,"shift-register error\r\n");
for(i=0;i<nMap;i++)
for(j=0;j<4;j++)
{
SendByte(m_do[4*i+j]);
DelayUs(30);
}
DelayMs(20);
SendLatch();
SendLatch();
SendEnable(50);
DelayMs(20);
for(i=0;i<nMap;i++)
for(j=0;j<4;j++)
{
data_i=GetByte(0); //0
m_di2[4*i+j]=data_i;
if(data_i!=m_do[4*i+j])
{
BYTE error=data_i^m_do[4*i+j];
// if(OK1==TRUE)
{
sprintf(info1,"Flip-latch error: MAP %d ?\r\n",nMap-i);
}
OK1=FALSE;
m_errn[0]=nMap-i;
}
DelayUs(30);
}
if(OK1==FALSE)
strcat(info,info1);
else
strcpy(info," OK\n");
return OK&OK1;
}
BOOL TestDataTrans(char* info,int nMap,int* m_errn)
{
char info1[50];
BOOL b=1;
info1[0]='\0';
InitialMap(nMap);
DelayMs(10);
if(CheckDataConnect(info)==FALSE)
return 0;
strcpy(info,"\rTest:12345678...: ");
if(DataTrans(nMap,d123,info1,m_errn)==FALSE)
{
b=0;
strcat(info,info1);
}
else
strcat(info,"OK\r\n");
/*
strcpy(info1,"");
strcat(info,"Test:1111111...: ");
if(DataTrans(nMap,all_one,info1)==FALSE)
strcat(info,info1);
else
strcat(info,"OK\r\n");
*/
strcpy(info1,"");
strcat(info,"\rTest:00000000...: ");
if(DataTrans(nMap,all_zero,info1,m_errn)==FALSE)
{ b=0;
strcat(info,info1);
}
else
strcat(info,"OK\r\n");
strcpy(info1,"");
strcat(info,"Test:10101010...: ");
if(DataTrans(nMap,d1010,info1,m_errn)==FALSE)
{
b=0;
strcat(info,info1);
}
else
strcat(info,"OK\r\n");
strcpy(info1,"");
strcat(info,"Test:01010101...: ");
if(DataTrans(nMap,d0101,info1,m_errn)==FALSE)
{
b=0;
strcat(info,info1);
}
else
strcat(info,"OK\r\n");
strcpy(info1,"");
strcat(info,"Test:width change...: ");
if(DataTrans(nMap,width_var,info1,m_errn)==FALSE)
{
b=0;
strcat(info,info1);
}
else
strcat(info,"OK\r\n");
SendZero(nMap);
return b;
}
BOOL TestPower(int nMapTotal,int* nMap,char* info)
{
MAPI mapi;
int i,j;
mapi._byte=inb(MAP_I);
if(mapi._bit.ps==0)
{
strcpy(info,"\rPower Error !");
return FALSE;
}
for(i=0;i<nMapTotal;i++)
SendByte(0);
for(i=0;i<32;i++)
SendBit(1);
for(i=0;i<nMapTotal;i++)
{
DelayMs(5);
SendLatch();
DelayMs(5);
SendEnableLevel(1);
DelayMs(15);
mapi._byte=inb(MAP_I);
SendEnableLevel(0);
DelayMs(5);
if(mapi._bit.ps==0)
break;
for(j=0;j<32;j++)
SendByte(0);
}
*nMap=i;
if(i==nMapTotal)
{
strcpy(info,"\rPower OK");
return TRUE;
}
else
{
sprintf(info,"\rPower ERROR, Check Map %d (overload)",i+1);
return FALSE;
}
}
void SetOnesOnMap(int nMap,int nMapTotal)
{
int i;
for(i=0;i<nMapTotal*4;i++)
SendByte(0);
for(i=0;i<32;i++)
SendBit(1);
for(i=0;i<nMap*32;i++)
SendBit(0);
}
void SetOneAt(int nMap,int nBit,int nMapTotal)
{
int i;
for(i=0;i<nMapTotal*4;i++)
SendByte(0);
SendBit(1);
for(i=0;i<nMap*32+nBit;i++)
SendBit(0);
}
int GetAt(int nMap,int nBit,int nMapTotal)
{
int i;
MAPI mapi;
int p=MAP_I;
for(i=nMap*32+nBit;i<nMapTotal*32;i++)
{
SendBit(0);
}
// DelayMs(10);
mapi._byte=inb(p);
return mapi._bit.sdata_i;
}
int TestOC_SC(int nMap,int Bit,int nMapTotal)
{
MAPI mapi;
int ret;
SetOneAt(nMap,Bit,nMapTotal);
DelayMs(5);
SendLatch();
DelayMs(5);
SendEnableLevel(1);
DelayMs(15);
mapi._byte=inb(MAP_I);
SendEnableLevel(0);
DelayMs(5);
if(mapi._bit.ps==0)
return 1; // SC
DelayMs(5);
ret=GetAt(nMap,Bit,nMapTotal);
if(ret==0)
return 2; // OC
return 0; // OK
}
BOOL TestMapOC_SC(char* info,int nMap,int nMapTotal)
{
MAPI mapi;
BOOL ok,OCOK,SCOK;
int i,j,nsc,err;
char octemp[50],sctemp[50],ocinfo[50],scinfo[50];
char mapsc[50],mapoc[50];
if(CheckDataConnect(info)==FALSE)
return FALSE;
for(i=0;i<nMapTotal*32;i++)
{
SendBit(0);
}
DelayMs(5);
SendLatch();
DelayMs(5);
SendEnableLevel(1);
DelayMs(15);
mapi._byte=inb(MAP_I);
SendEnableLevel(0);
DelayMs(5);
if(mapi._bit.ps==0)
{
strcpy(info,"Power Error");
return FALSE;
}
ok=TRUE;
sprintf(info,"Map %d: ",nMap+1);
sprintf(ocinfo,"Magnet open-circuit: \n");
sprintf(scinfo,"Magnet short-circuit: \n");
OCOK=1;
SCOK=1;
sprintf(mapsc,"Map %d: ",nMap+1);
sprintf(mapoc,"Map %d: ",nMap+1);
nsc=0;
for(j=0;j<32;j++)
{
err=TestOC_SC(nMap,j,nMapTotal);
if(err==1)
{
ok=0;
SCOK=0;
sprintf(sctemp,"%d ",j+1);
strcat(mapsc,sctemp);
nsc++;
}
if(err==2)
{
ok=0;
OCOK=0;
sprintf(octemp,"%d ",j+1);
strcat(mapoc,octemp);
}
}
if(SCOK==0)
{
if(nsc>=30)
sprintf(mapsc," MAP %d: Leak and 1a-32a short-circuit,\n\r or power not connected",nMap+1);
strcat(scinfo,mapsc);
strcat(scinfo,"\n\r");
}
else
strcat(scinfo," OK\n\n\r");
if(OCOK==0)
{
sprintf(octemp,"Map: %d",i+1);
strcat(ocinfo,mapoc);
strcat(ocinfo,"\n\r");
}
else
strcat(ocinfo,"OK\n\r");
if(ok==FALSE)
{
strcat(info,scinfo);
strcat(info,ocinfo);
}
else
{
sprintf(scinfo,"Magnet test OK.\n\rNo open-circuit and short-circuit found");
strcat(info,scinfo);
}
return ok;
}
void SetLedForTest(int MapTest,int nMapTotal,BOOL bOn)
{
// TEST_8TO1 data_o;
// BYTE data7f;
InitialMap(nMapTotal); //all LEDs off
if(bOn)
SetOneAt(MapTest,31,nMapTotal);
return;
}
BOOL LedTestSingle(char*info,int MapTest,int nMapTotal)
{
MAPI mapi;
int p;
p=MAP_I;
SetLedForTest(MapTest,nMapTotal,0);
DelayMs(10);
mapi._byte=inb(p);
if(mapi._bit.test!=1)
{
sprintf(info,"LED error on MAP %d when set 0",MapTest+1);
return FALSE;
}
SetLedForTest(MapTest,nMapTotal,1);
DelayMs(10);
mapi._byte=inb(p);
if(mapi._bit.test!=0)
{
sprintf(info,"LED error on MAP %d when set 1",MapTest+1);
return FALSE;
}
sprintf(info,"MAP %d : LED OK\r\n",MapTest+1);
return TRUE;
}
void LedTestAll(char*info,int nMapTotal)
{
int i,n;
char tmp[50];
strcpy(info,"LED Error on MAP: ");
n=strlen(info);
for(i=0;i<nMapTotal;i++)
{
if(LedTestSingle(tmp,i,nMapTotal)==FALSE)
{
sprintf(tmp,"%d ",i+1);
strcat(info,tmp);
}
}
if(strlen(info)==n)
sprintf(info,"LED 1-%d OK\r\n",nMapTotal);
}
void LedTest(char* info,int MapTest,int nMapTotal)
{
/* if(MapTest>0)
{
LedTestSingle(info,MapTest-1,nMapTotal);
// sprintf(info,"Test single LED...");
DisplayTest(info);
}
else
{
LedTestAll(info,nMapTotal);
// sprintf(info,"Test All LED...");
DisplayTest(info);
}
*/
char info1[100];
if(MapTest>0)
sprintf(info1,"LED on MAP %d flashing...",MapTest);
else
sprintf(info1,"LED on all MAP flashing...");
DisplayInfo(info1);
LedFlash(MapTest,nMapTotal);
// sprintf(info,"Exit LED test");
// DisplayTest(info);
// DisplayTest(info);
}
void LedFlash(int MapFlash,int nMapTotal)
{
char info[50];
BOOL bFlash;
int i;
BYTE data;
BYTE key;
bFlash=1;
do
{
if(MapFlash>0)
{
SetLed(MapFlash-1,nMapTotal,1); //LED on
DelayMs(200);
SetLed(MapFlash-1,nMapTotal,0); //LED off
DelayMs(500);
}
else
{
for(i=0;i<nMapTotal;i++) // all LED on
{
data=0x80;
SendByte(data);
data=0;
SendByte(data);
SendByte(data);
SendByte(data);
}
SendLatch();
DelayMs(200);
data=0;
for(i=0;i<nMapTotal*4;i++) // all LED off
{
SendByte(data);
}
SendLatch();
DelayMs(200);
}
key=inb(0x60)&0x7f;
// window(1,10,80,11);
// clrscr();
// gotoxy(1,1);
// sprintf(info,"key=%0x ",key);
// cprintf(info);
DelayMs(50);
switch(key)
{
// case 0x20: //'D' data trans.
// case 0x19: //'P' Power
// case 0x12: //'E' exit
// case 0x1e: //'A' All
// case 0x1f: //'S' single
// case 0x18: //'O'
// case 0x32: //'M' Magnet
// default:
case 0x2e: // 'C'
bFlash=0;
getch();
}
}while(bFlash);
}
void SetLed(int nMap,int nMapTotal,BOOL bOn)
{
BYTE data;
int i;
SendZero(nMapTotal);// all LED off
if(bOn==1)
data=0x80;
else
data=0;
SendByte(data);
data=0;
SendByte(data);
SendByte(data);
SendByte(data);
for(i=0;i<nMap;i++)
{
SendByte(data);
SendByte(data);
SendByte(data);
SendByte(data);
}
SendLatch(); // the LED on or off
}
/*
BOOL CTest::TestLed(int BoardNumber,CString& info)
{
int p=MAP_I;
MAPI mapi;
int test;
g_bFlashLED=0;
while(m_bFlashing)
{}
SetLedForTest(BoardNumber,0);
g_running.DelayMs(10);
mapi._byte=_inp(p);
test=mapi._bit.test;
if(test!=1)
{
info.Format(IDS_LED_ERROR+g_language,BoardNumber+1,0);
return FALSE;
}
SetLedForTest(BoardNumber,1);
g_running.DelayMs(10);
mapi._byte=_inp(p);
test=mapi._bit.test;
if(test!=0)
{
info.Format(IDS_LED_ERROR+g_language,BoardNumber+1,1);
return FALSE;
}
CString s;
info.Format(IDS_MAP+g_language,BoardNumber+1);
s.Format("LED OK\n");
info=info+s;
// SendLatch();
return TRUE;
}
BOOL CTest::TestLed(CString& info)
{
g_bFlashLED=0;
while(m_bFlashing)
{}
CUIntArray Error;
Error.RemoveAll();
info.Empty();
if(m_nMap<=0)
{
info.Format(IDS_ERROR_MAP_NUMBER+g_language);
return FALSE;
}
CString temp;
for(int i=0;i<m_nMap;i++)
{
if(TestLed(i,temp)==FALSE)
{
Error.Add(i);
info=info+temp;
}
}
g_bFlashLED=0;
while(m_bFlashing)
{}
if(info.IsEmpty()==TRUE)
{
info.Format("LED 1-%d OK\n",m_nMap);
return TRUE;
}
SetLed(Error);
return FALSE;
}
union TEST_8TO1
{
struct
{
unsigned ItemSelect:3;
unsigned d3:1;
unsigned BoardSelect:1; // effective low '0'
unsigned d5:1;
unsigned d6:1;
unsigned d7:1;
} bit;
BYTE byte;
TEST_8TO1()
{ byte=0xff;
bit.BoardSelect=0;
}
} ;
void CTest::SetLedForTest(int BoardNumber,BOOL bOn)
{
TEST_8TO1 data_o;
InitialMap(); //all LEDs off
if(bOn)
SetOneAt(BoardNumber,31);
return;
SendLatch(); //all LEDs on
g_running.DelayMs(1);
SendEnable(30); //all LEDs off
g_running.DelayMs(1);
SendSclks(1,bOn); // D31=bOn,
SendSclks(23);
data_o.bit.ItemSelect=D31;
SendByte(data_o.byte);
g_running.DelayMs(1);
BYTE data7f=0x7f;
if(BoardNumber>0)
{
for(int i=0;i<BoardNumber;i++)
{
SendByte(data7f);
SendByte(data7f);
SendByte(data7f);
SendByte(data7f);
}
}
SendLatch(); // the LED on or off
}
UINT FlashLED(LPVOID pParam)
{
g_test.m_bFlashing=1;
int errn=g_test.m_errn;
g_bFlashLED=1;
while(g_bFlashLED)
{
if(errn!=0)
{
g_test.SetLed(errn-1,1);
if(g_bFlashLED==0)
break;
g_running.DelayMs(200);
if(g_bFlashLED==0)
break;
g_test.SetLed(errn-1,0);
if(g_bFlashLED==0)
break;
g_running.DelayMs(500);
}
else
{
for(int i=0;i<g_test.m_nMap;i++) // all LED on
{
BYTE data=0x80;
g_test.SendByte(data);
data=0;
g_test.SendByte(data);
g_test.SendByte(data);
g_test.SendByte(data);
}
g_test.SendLatch();
if(g_bFlashLED==0)
break;
g_running.DelayMs(200);
BYTE data=0;
for(i=0;i<g_test.m_nMap*4;i++) // all LED off
{
g_test.SendByte(data);
}
g_test.SendLatch();
if(g_bFlashLED==0)
break;
g_running.DelayMs(200);
}
}
g_test.m_bFlashing=0;
return 0;
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -