/[PAMELA software]/yoda/techmodel/forroutines/anticounter/AC.c
ViewVC logotype

Diff of /yoda/techmodel/forroutines/anticounter/AC.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2.3 by kusanagi, Thu Dec 16 17:32:59 2004 UTC revision 2.6 by kusanagi, Mon Jan 3 14:20:11 2005 UTC
# Line 1  Line 1 
1  /*******************************v1.0********************************  /*******************************v1.1********************************
2    
3  Functions to read AC physics data (ACphysics) and AC calibration  Functions to read AC physics data (ACphysics) and AC calibration
4  data (ACcalib).  data (ACcalib).
5  Author: Petter Hofverberg, petter@particle.kth.se  Author: Petter Hofverberg, petter@particle.kth.se
6    
7  0410 v1.0 alive  0410 v1.0 alive
8    0412 v1.1 fixed problem with found, and changed headers
9    
10  Errors: (returned to the main program as the variable "err")  Errors: (returned to the main program as the variable "err")
11  err=  err=
# Line 18  err= Line 19  err=
19  #include <stdio.h>  #include <stdio.h>
20  #include "AC.h"  #include "AC.h"
21    
22  int i,found,j;  int i,j,found;
23  unsigned short buffer[1000];  unsigned short buffer[1000];
24  unsigned short tmp1,tmp2;  unsigned short tmp1,tmp2;
25  unsigned char err;  unsigned char err;
# Line 26  unsigned char err; Line 27  unsigned char err;
27  struct physicsstruct physicsdata[2];  struct physicsstruct physicsdata[2];
28  struct physicsstruct *physicspointer;  struct physicsstruct *physicspointer;
29    
30  struct calibstruct calibdata[2];  struct calibstruct calibdata;
31  struct calibstruct *calibpointer;  struct calibstruct *calibpointer;
32    
33  //Fill physicsdata from buffer  //Fill physicsdata from buffer
# Line 48  void fillphys(int k,unsigned short *buff Line 49  void fillphys(int k,unsigned short *buff
49  }  }
50    
51  //Fill calibdata from buffer  //Fill calibdata from buffer
52  void fillcalib(int k,unsigned short *buff)  void fillcalib(unsigned short *buff)
53  {  {
54    for(i=0;i<2;i++) calibdata[k].header[i]=buff[i];    for(i=0;i<2;i++) calibdata.header[i]=buff[i];
55    for(i=0;i<5;i++) calibdata[k].status[i]=buff[2+i];    for(i=0;i<5;i++) calibdata.status[i]=buff[2+i];
56    for(i=0;i<8;i++) calibdata[k].temp[i]=buff[7+i];    for(i=0;i<8;i++) calibdata.temp[i]=buff[7+i];
57    for(i=0;i<8;i++) calibdata[k].DAC1[i]=buff[15+i];    for(i=0;i<8;i++) calibdata.DAC1[i]=buff[15+i];
58    for(i=0;i<8;i++) calibdata[k].DAC2[i]=buff[23+i];    for(i=0;i<8;i++) calibdata.DAC2[i]=buff[23+i];
59    for(i=0;i<6;i++) calibdata[k].regist[i]=buff[31+i];    for(i=0;i<6;i++) calibdata.regist[i]=buff[31+i];
60    for(i=0;i<8;i++) calibdata[k].time[i]=buff[37+i];    for(i=0;i<8;i++) calibdata.time[i]=buff[37+i];
61    calibdata[k].n_tr=buff[45];    calibdata.n_tr=buff[45];
62    for(i=0;i<16;i++) calibdata[k].hitmap_tr[i]=buff[46+i];    for(i=0;i<16;i++) calibdata.hitmap_tr[i]=buff[46+i];
63    for(i=0;i<4096;i++) calibdata[k].curve1[i]=buff[62+i];    for(i=0;i<4096;i++) calibdata.curve1[i]=buff[62+i];
64    for(i=0;i<4096;i++) calibdata[k].curve2[i]=buff[4158+i];    for(i=0;i<4096;i++) calibdata.curve2[i]=buff[4158+i];
65    calibdata[k].iCRC=buff[8254];    calibdata.iCRC=buff[8254];
66    calibdata[k].tail=buff[8255];    calibdata.tail=buff[8255];
67    calibdata[k].CRC=buff[8256];    calibdata.CRC=buff[8256];
68    printf("tail:CRC > %hx:%hx\n",buff[8255],buff[8256]);    //printf("tail:CRC > %hx:%hx\n",buff[8255],buff[8256]);
69  }  }
70    
   
71  unsigned char ACphysics(int length,unsigned char* datapointer,struct physicsstruct* physicspointer)  unsigned char ACphysics(int length,unsigned char* datapointer,struct physicsstruct* physicspointer)
72  {  {
73    
74   int iter=2;    err=0;
75    physicspointer[0]=physicsdata[0];    found=0;
76    physicspointer[1]=physicsdata[1];    int iter=2;
77      for(i=0;i<1000;i++)
78        buffer[i]=0;
79      fillphys(0,&buffer[0]);
80      fillphys(1,&buffer[0]);
81    
82      //point struct-pointer to physicsdata
83      //physicspointer[0]=physicsdata[0];  //card1
84      //physicspointer[1]=physicsdata[1];  //card2
85      //physicspointer=&physicsdata[0];
86    
87    //look for top header ACAC, then unpack data to main card buffer or extra card buffer depending on the subheader    //look for top header ACAC, then unpack data to main card buffer or extra card buffer depending on the subheader
88    //AC11 for main, AC22 for extra    //AC11 for main, AC22 for extra
# Line 81  unsigned char ACphysics(int length,unsig Line 90  unsigned char ACphysics(int length,unsig
90      {      {
91        tmp1 = ((*datapointer) << 8) | *(datapointer+1);        tmp1 = ((*datapointer) << 8) | *(datapointer+1);
92        tmp2 = ((*(datapointer+2)) << 8) | *(datapointer+3);        tmp2 = ((*(datapointer+2)) << 8) | *(datapointer+3);
93          if(tmp1 == 0xACAC && ((tmp2 == 0xAC11 && (err&0xF0)==0x0) || (tmp2 == 0xAC22 && (err&0x0F)==0x0)))
       if(tmp1 == 0xAC11 && ((tmp2 == 0xAC11 && (err&0xF0)==0x0) || (tmp2 == 0xAC22 && (err&0x0F)==0x0)))  
94          {          {
           
95            for(i=0;i<64;i++)            for(i=0;i<64;i++)
96              {              {
97                buffer[i]=((*datapointer) << 8) | *(datapointer+1);                buffer[i]=((*datapointer) << 8) | *(datapointer+1);
# Line 106  unsigned char ACphysics(int length,unsig Line 113  unsigned char ACphysics(int length,unsig
113          datapointer++;          datapointer++;
114          iter=iter+1;}          iter=iter+1;}
115      }      }
116      //point struct-pointer to physicsdata
117      physicspointer[0]=physicsdata[0];  //card1
118      physicspointer[1]=physicsdata[1];  //card2
119    
120    return err;    return err;
121    
# Line 115  unsigned char ACphysics(int length,unsig Line 125  unsigned char ACphysics(int length,unsig
125  unsigned char ACcalib(int length, unsigned char* datapointer, struct calibstruct* calibpointer)  unsigned char ACcalib(int length, unsigned char* datapointer, struct calibstruct* calibpointer)
126  {  {
127    
128      err=0;
129      found=0;
130    int iter=2;    int iter=2;
131                  for(i=0;i<1000;i++)
132        buffer[i]=0;
133      fillcalib(&buffer[0]);
134    
135    //point struct-pointer to calibdata    //point struct-pointer to calibdata
136    calibpointer[0]=calibdata[0];  //card1    //calibpointer[0]=calibdata[0];  //card1
137    calibpointer[1]=calibdata[1];  //card2    //calibpointer[1]=calibdata[1];  //card2
138    
139    //look for the top header 0xACCA, then the subheaders 0xAC11 and 0xAC22, and unpack the data    //look for the top header 0xACCA, then the subheaders 0xAC11 and 0xAC22, and unpack the data
140    //to each card depending on these.    //to each card depending on these.
141    while(found<2 && iter<length)    while(found<1 && iter<length)
142      {      {
143        tmp1 = ((*datapointer) << 8) | *(datapointer+1);        tmp1 = ((*datapointer) << 8) | *(datapointer+1);
144        tmp2 = ((*(datapointer+2)) << 8) | *(datapointer+3);        tmp2 = ((*(datapointer+2)) << 8) | *(datapointer+3);
145    
146        if(tmp1 == 0xACCA && ((tmp2 == 0xAC11 && (err&0xF0)==0x0) || (tmp2 == 0xAC22 && (err&0x0F)==0x0)))        if(tmp1 == 0xACCA && ((tmp2 == 0xAC11 && (err&0xF0)==0x0) || (tmp2 == 0xACA2 && (err&0x0F)==0x0)))
147          {          {
148            for(i=0;i<8258;i++)            for(i=0;i<8258;i++)
149              {              {
# Line 137  unsigned char ACcalib(int length, unsign Line 152  unsigned char ACcalib(int length, unsign
152              }              }
153                    
154            if(tmp2==0xAC11){          //main            if(tmp2==0xAC11){          //main
155              fillcalib(0,&buffer[0]);              fillcalib(&buffer[0]);
156              err |= 0xF0;              err |= 0xF0;
157            }            }
158            else{                      //extra            else{                      //extra
159              fillcalib(1,&buffer[0]);              fillcalib(&buffer[0]);
160              err |= 0x0F;              err |= 0x0F;
161            }            }
162             tmp1=tmp2=0x0000;             tmp1=tmp2=0x0000;
# Line 151  unsigned char ACcalib(int length, unsign Line 166  unsigned char ACcalib(int length, unsign
166          datapointer++;          datapointer++;
167          iter=iter+1;}          iter=iter+1;}
168      }      }
169      *calibpointer=calibdata;  //card1
170    
171    return err;    return err;
172  }  }
   

Legend:
Removed from v.2.3  
changed lines
  Added in v.2.6

  ViewVC Help
Powered by ViewVC 1.1.23