--- yoda/techmodel/forroutines/anticounter/AC.c 2005/01/03 14:20:11 2.6 +++ yoda/techmodel/forroutines/anticounter/AC.c 2005/03/04 15:54:11 3.0 @@ -1,4 +1,4 @@ -/*******************************v1.1******************************** +/*******************************v1.3******************************** Functions to read AC physics data (ACphysics) and AC calibration data (ACcalib). @@ -6,6 +6,8 @@ 0410 v1.0 alive 0412 v1.1 fixed problem with found, and changed headers +0502 v1.2 added a crc check +0502 v1.3 increased buffer size Errors: (returned to the main program as the variable "err") err= @@ -14,14 +16,17 @@ 0x0F - only data from extra card found 0x00 - no data found +CRCcheck: 1 - OK, 0 - error ******************************************************************/ #include #include "AC.h" +#define TRUE 1 +#define FALSE 0 int i,j,found; -unsigned short buffer[1000]; -unsigned short tmp1,tmp2; +unsigned short buffer[8300]; +unsigned short tmp1,tmp2,check; unsigned char err; struct physicsstruct physicsdata[2]; @@ -30,6 +35,98 @@ struct calibstruct calibdata; struct calibstruct *calibpointer; + +//CRC check function +short crc(short old,short new) +{ + union crc_data { + short word; + struct bit_field { + unsigned b0:1; + unsigned b1:1; + unsigned b2:1; + unsigned b3:1; + unsigned b4:1; + unsigned b5:1; + unsigned b6:1; + unsigned b7:1; + unsigned b8:1; + unsigned b9:1; + unsigned b10:1; + unsigned b11:1; + unsigned b12:1; + unsigned b13:1; + unsigned b14:1; + unsigned b15:1; + } bit; + } c,d,r; + + c.word = old; + d.word = new; + r.word = 0; + + r.bit.b0 = c.bit.b0 ^ c.bit.b4 ^ c.bit.b8 ^ c.bit.b11 ^ c.bit.b12 ^ + d.bit.b0 ^ d.bit.b4 ^ d.bit.b8 ^ d.bit.b11 ^ d.bit.b12; + + r.bit.b1 = c.bit.b1 ^ c.bit.b5 ^ c.bit.b9 ^ c.bit.b12 ^ c.bit.b13 ^ + d.bit.b1 ^ d.bit.b5 ^ d.bit.b9 ^ d.bit.b12 ^ d.bit.b13; + + r.bit.b2 = c.bit.b2 ^ c.bit.b6 ^ c.bit.b10 ^ c.bit.b13 ^ c.bit.b14 ^ + d.bit.b2 ^ d.bit.b6 ^ d.bit.b10 ^ d.bit.b13 ^ d.bit.b14; + + r.bit.b3 = c.bit.b3 ^ c.bit.b7 ^ c.bit.b11 ^ c.bit.b14 ^ c.bit.b15 ^ + d.bit.b3 ^ d.bit.b7 ^ d.bit.b11 ^ d.bit.b14 ^ d.bit.b15; + + r.bit.b4 = c.bit.b4 ^ c.bit.b8 ^ c.bit.b12 ^ c.bit.b15 ^ + d.bit.b4 ^ d.bit.b8 ^ d.bit.b12 ^ d.bit.b15; + + r.bit.b5 = c.bit.b0 ^ c.bit.b4 ^ c.bit.b5 ^ c.bit.b8 ^ c.bit.b9 ^ + c.bit.b11 ^ c.bit.b12 ^ c.bit.b13 ^ + d.bit.b0 ^ d.bit.b4 ^ d.bit.b5 ^ d.bit.b8 ^ d.bit.b9 ^ + d.bit.b11 ^ d.bit.b12 ^ d.bit.b13; + + r.bit.b6 = c.bit.b1 ^ c.bit.b5 ^ c.bit.b6 ^ c.bit.b9 ^ c.bit.b10 ^ + c.bit.b12 ^ c.bit.b13 ^ c.bit.b14 ^ + d.bit.b1 ^ d.bit.b5 ^ d.bit.b6 ^ d.bit.b9 ^ d.bit.b10 ^ + d.bit.b12 ^ d.bit.b13 ^ d.bit.b14; + + r.bit.b7 = c.bit.b2 ^ c.bit.b6 ^ c.bit.b7 ^ c.bit.b10 ^ c.bit.b11 ^ + c.bit.b13 ^ c.bit.b14 ^ c.bit.b15 ^ + d.bit.b2 ^ d.bit.b6 ^ d.bit.b7 ^ d.bit.b10 ^ d.bit.b11 ^ + d.bit.b13 ^ d.bit.b14 ^ d.bit.b15; + + r.bit.b8 = c.bit.b3 ^ c.bit.b7 ^ c.bit.b8 ^ c.bit.b11 ^ c.bit.b12 ^ + c.bit.b14 ^ c.bit.b15 ^ + d.bit.b3 ^ d.bit.b7 ^ d.bit.b8 ^ d.bit.b11 ^ d.bit.b12 ^ + d.bit.b14 ^ d.bit.b15; + + r.bit.b9 = c.bit.b4 ^ c.bit.b8 ^ c.bit.b9 ^ c.bit.b12 ^ c.bit.b13 ^ + c.bit.b15 ^ + d.bit.b4 ^ d.bit.b8 ^ d.bit.b9 ^ d.bit.b12 ^ d.bit.b13 ^ + d.bit.b15; + + r.bit.b10 = c.bit.b5 ^ c.bit.b9 ^ c.bit.b10 ^ c.bit.b13 ^ c.bit.b14 ^ + d.bit.b5 ^ d.bit.b9 ^ d.bit.b10 ^ d.bit.b13 ^ d.bit.b14; + + r.bit.b11 = c.bit.b6 ^ c.bit.b10 ^ c.bit.b11 ^ c.bit.b14 ^ c.bit.b15 ^ + d.bit.b6 ^ d.bit.b10 ^ d.bit.b11 ^ d.bit.b14 ^ d.bit.b15; + + r.bit.b12 = c.bit.b0 ^ c.bit.b4 ^ c.bit.b7 ^ c.bit.b8 ^ c.bit.b15 ^ + d.bit.b0 ^ d.bit.b4 ^ d.bit.b7 ^ d.bit.b8 ^ d.bit.b15; + + r.bit.b13 = c.bit.b1 ^ c.bit.b5 ^ c.bit.b8 ^ c.bit.b9 ^ + d.bit.b1 ^ d.bit.b5 ^ d.bit.b8 ^ d.bit.b9; + + r.bit.b14 = c.bit.b2 ^ c.bit.b6 ^ c.bit.b9 ^ c.bit.b10 ^ + d.bit.b2 ^ d.bit.b6 ^ d.bit.b9 ^ d.bit.b10; + + r.bit.b15 = c.bit.b3 ^ c.bit.b7 ^ c.bit.b10 ^ c.bit.b11 ^ + d.bit.b3 ^ d.bit.b7 ^ d.bit.b10 ^ d.bit.b11; + + return r.word; +} + + //Fill physicsdata from buffer void fillphys(int k,unsigned short *buff) { @@ -45,7 +142,10 @@ for(i=0;i<2;i++) physicsdata[k].temp[i]=buff[53+i]; for(i=0;i<8;i++) physicsdata[k].DAC[i]=buff[55+i]; physicsdata[k].CRC=buff[63]; - + if(check==physicsdata[k].CRC) + physicsdata[k].CRCcheck=TRUE; + else + physicsdata[k].CRCcheck=FALSE; } //Fill calibdata from buffer @@ -65,7 +165,10 @@ calibdata.iCRC=buff[8254]; calibdata.tail=buff[8255]; calibdata.CRC=buff[8256]; - //printf("tail:CRC > %hx:%hx\n",buff[8255],buff[8256]); + if(check==calibdata.CRC) + calibdata.CRCcheck=TRUE; + else + calibdata.CRCcheck=FALSE; } unsigned char ACphysics(int length,unsigned char* datapointer,struct physicsstruct* physicspointer) @@ -73,17 +176,13 @@ err=0; found=0; + check=0; int iter=2; - for(i=0;i<1000;i++) + for(i=0;i<8300;i++) buffer[i]=0; fillphys(0,&buffer[0]); fillphys(1,&buffer[0]); - //point struct-pointer to physicsdata - //physicspointer[0]=physicsdata[0]; //card1 - //physicspointer[1]=physicsdata[1]; //card2 - //physicspointer=&physicsdata[0]; - //look for top header ACAC, then unpack data to main card buffer or extra card buffer depending on the subheader //AC11 for main, AC22 for extra while(found<2 && iter