/[PAMELA software]/yoda/techmodel/TmtcReader.cpp
ViewVC logotype

Annotation of /yoda/techmodel/TmtcReader.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 6.4 - (hide annotations) (download)
Fri Sep 29 10:19:27 2006 UTC (18 years, 2 months ago) by mocchiut
Branch: MAIN
CVS Tags: YODA6_3/19, YODA6_3/18, YODA6_3/13, YODA6_3/12, YODA6_3/11, YODA6_3/17, YODA6_3/16, YODA6_3/15, YODA6_3/14, YODA6_3/20, HEAD
Changes since 6.3: +6 -3 lines
Last event bug fixed, compilation warnings/errors fixed

1 kusanagi 1.1 /** @file
2 mocchiut 6.4 * $Source: /afs/ba.infn.it/user/pamela/src/CVS/yoda/techmodel/TmtcReader.cpp,v $
3     * $Id: TmtcReader.cpp,v 6.3 2006/05/30 19:10:03 kusanagi Exp $
4 kusanagi 6.0 * $Author: kusanagi $
5 kusanagi 1.1 *
6     * Implementation of the TmtcReader class.
7     * ToBeDone:
8     * Control the CRC for the entire data Packet not just for single records
9     */
10    
11     extern "C" {
12 kusanagi 6.2 #include "CRC.h"
13 kusanagi 1.1 }
14     #include "ReaderAlgorithms.h"
15     using namespace pamela::techmodel;
16    
17 kusanagi 1.4 static log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(_T("pamela.techmodel.TmtcReader"));
18 kusanagi 1.1
19     /**
20     * Constructor.
21     */
22     TmtcReader::TmtcReader(void):
23     TechmodelAlgorithm(PacketType::Tmtc, "TechmodelTmtcReader") {
24 kusanagi 1.4 logger->debug(_T("Constructor"));
25 kusanagi 1.1 Tmtc = new TmtcEvent();
26     }
27    
28     /**
29     * Get a string with the version info of the algorithm.
30     */
31     std::string TmtcReader::GetVersionInfo(void) const {
32     return
33 mocchiut 6.4 "$Header: /afs/ba.infn.it/user/pamela/src/CVS/yoda/techmodel/TmtcReader.cpp,v 6.3 2006/05/30 19:10:03 kusanagi Exp $\n";
34 kusanagi 1.1 }
35    
36     /**
37     * Initialize the algorithm with a special run. This will initialize the
38     * event reader routines for all packet types.
39     */
40     void TmtcReader::Init(PamelaRun *run) {
41     SetInputStream(run);
42     run->WriteSubPacket(this, &Tmtc, Tmtc->Class());
43     }
44    
45     /**
46     * Unpack the Tmtc event from an input file.
47     */
48 kusanagi 2.1 void TmtcReader::RunEvent(int EventNumber, long int length) throw (WrongCRCException){
49 kusanagi 1.1
50 kusanagi 6.1 int i, j, k;
51     /* The ' k ' indexs the number of recs.
52     * It is needed to be indipendent from ' i ' because in case of CRC error the single record is skipped and ' i ' increase by one, but correct records to be stored are still ' i '.
53     */
54     k = 0;
55 kusanagi 1.2 char subData[TMTC_SUB_LENGTH];
56 kusanagi 1.1 char CRCbuff[TMTC_SUBCRC_LENGTH];
57     char eventCRC[TMTC_CRC_LENGTH];
58     int numRecords = (length-TMTC_CRC_LENGTH)/(TMTC_SUB_LENGTH + TMTC_SUBCRC_LENGTH); //subtract the last two bytes because are the final CRC
59     long int start;
60 kusanagi 1.2
61     TmtcRecord* rec;
62 kusanagi 1.1 Tmtc->Records->Clear();
63     TClonesArray &recs = *(Tmtc->Records);
64 kusanagi 1.2
65 kusanagi 1.1 UINT16 partialCRC = 0; //partial CRC updated as mcmd packet is read (to compare with the last two bytes of this event)
66     UINT16 readCRC = 0; //partial CRC updated as mcmd packet is read (to compare with the last two bytes of this event)
67 kusanagi 2.6 for(int i = 0; i < numRecords; i++) {
68 kusanagi 1.1 start = InputFile->tellg();
69 mocchiut 6.4 memset(subData, 0, sizeof(subData));
70 kusanagi 1.2 InputFile->read(subData, sizeof(subData));
71 mocchiut 6.4 memset(CRCbuff, 0, sizeof(CRCbuff));
72 kusanagi 1.1 InputFile->read(CRCbuff, sizeof(CRCbuff));
73    
74 kusanagi 1.2 partialCRC = CM_Compute_CRC16(partialCRC, (UINT8*)&subData, TMTC_SUB_LENGTH);
75 kusanagi 1.1 partialCRC = CM_Compute_CRC16(partialCRC, (UINT8*)&CRCbuff, TMTC_SUBCRC_LENGTH);
76    
77     //This == CRCBuff is not really parametric take care if have to change the static lengths
78 kusanagi 1.2 if((UINT8)(CM_Compute_CRC16(0, (UINT8*)&subData, TMTC_SUB_LENGTH)) == (UINT8)CRCbuff[0]){
79 kusanagi 6.1 rec = new(recs[k++]) TmtcRecord(); //add a new TmtcRecord
80 kusanagi 2.4 rec->TM_RECORD_OBT = (((UINT32)subData[0]<<24)&0xFF000000) + (((UINT32)subData[1]<<16)&0x00FF0000) + (((UINT32)subData[2]<<8)&0x0000FF00) + (((UINT32)subData[3])&0x000000FF);
81     rec->TM_DIAG_AND_BILEVEL_ACQ = (((UINT16)subData[4]<<8)&0x0000FF00) + (((UINT16)subData[5])&0x000000FF);
82 kusanagi 4.1
83 kusanagi 4.2 for(int j = 0; j < 16; j++) {
84 kusanagi 4.1 rec->TM_TH_ANA[j] = ((((UINT16)subData[6 + 2*j]<<8)&0xFF00) + (((UINT16)subData[7 + 2*j])&0x00FF)); //20 is the size of TM_DEA_ANA(16) + OBT(4)
85 kusanagi 1.1 }
86    
87 kusanagi 2.6 for(int j = 0; j < 6; j++) {
88 kusanagi 4.4 rec->TM_DEA_ANA[j] = subData[38+j];
89 kusanagi 2.3 }
90    
91 kusanagi 1.1 } else {
92 kusanagi 1.4 stringstream oss;
93 kusanagi 2.1 oss.str("");
94 kusanagi 1.4 oss << "Wrong CRC on Subpacket int TMTC Packet starting at position"
95     << start;
96     logger->warn(oss.str().c_str());
97 kusanagi 1.1 }
98     }
99 mocchiut 6.4 memset(eventCRC, 0, sizeof(eventCRC));
100 kusanagi 1.1 InputFile->read(eventCRC, sizeof(eventCRC));
101     readCRC = (((UINT16)(eventCRC[0]<<8))&0xFF00) + (((UINT16)eventCRC[1])&0x00FF);
102 kusanagi 2.1 if(partialCRC != readCRC) throw WrongCRCException(" Wrong Global CRC for TMTC Packet ");
103 kusanagi 1.1 }
104    
105 kusanagi 2.3 /*
106 kusanagi 1.1 float TmtcReader::convert_th(int TH) {
107     float a,q,deltax,deltay;
108     static int chiama_fun=0;
109     float gradi[22],grado=-1;
110     int adc[22]={4095, 4036,2976,2213,1662,1259,983,742,576,450,
111     354, 281,224,179,145, 117 ,95, 77, 64, 52,
112     43, 35};
113     int maxpos=-1,minpos=-1,i;
114    
115     chiama_fun++;
116     for (i=0;i<22;i++)
117     {
118     gradi[i]=-35+(i*5);
119     }
120     if (TH==4095)
121     {
122     grado=-35.;
123     }
124     else
125     {
126    
127     for (i=0;i<22;i++)
128     {
129     if (TH>=adc[i])
130     {
131     minpos=i;
132     maxpos=i-1;
133     break;
134     }
135     }
136     // grado=gradi[maxpos]-1./(adc[maxpos]-adc[minpos])*((float)TH-(float)adc[maxpos]) ;
137    
138     deltax=adc[maxpos]-adc[minpos];
139     deltay=gradi[maxpos]-gradi[minpos];
140     a=deltay/deltax;
141     q=gradi[maxpos]-a*adc[maxpos];
142     grado=a*TH+q;
143     }
144     return (grado);
145     }
146 kusanagi 2.7 */

  ViewVC Help
Powered by ViewVC 1.1.23