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

Contents of /yoda/techmodel/TmtcReader.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 6.4 - (show 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 /** @file
2 * $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 * $Author: kusanagi $
5 *
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 #include "CRC.h"
13 }
14 #include "ReaderAlgorithms.h"
15 using namespace pamela::techmodel;
16
17 static log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(_T("pamela.techmodel.TmtcReader"));
18
19 /**
20 * Constructor.
21 */
22 TmtcReader::TmtcReader(void):
23 TechmodelAlgorithm(PacketType::Tmtc, "TechmodelTmtcReader") {
24 logger->debug(_T("Constructor"));
25 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 "$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 }
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 void TmtcReader::RunEvent(int EventNumber, long int length) throw (WrongCRCException){
49
50 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 char subData[TMTC_SUB_LENGTH];
56 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
61 TmtcRecord* rec;
62 Tmtc->Records->Clear();
63 TClonesArray &recs = *(Tmtc->Records);
64
65 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 for(int i = 0; i < numRecords; i++) {
68 start = InputFile->tellg();
69 memset(subData, 0, sizeof(subData));
70 InputFile->read(subData, sizeof(subData));
71 memset(CRCbuff, 0, sizeof(CRCbuff));
72 InputFile->read(CRCbuff, sizeof(CRCbuff));
73
74 partialCRC = CM_Compute_CRC16(partialCRC, (UINT8*)&subData, TMTC_SUB_LENGTH);
75 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 if((UINT8)(CM_Compute_CRC16(0, (UINT8*)&subData, TMTC_SUB_LENGTH)) == (UINT8)CRCbuff[0]){
79 rec = new(recs[k++]) TmtcRecord(); //add a new TmtcRecord
80 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
83 for(int j = 0; j < 16; j++) {
84 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 }
86
87 for(int j = 0; j < 6; j++) {
88 rec->TM_DEA_ANA[j] = subData[38+j];
89 }
90
91 } else {
92 stringstream oss;
93 oss.str("");
94 oss << "Wrong CRC on Subpacket int TMTC Packet starting at position"
95 << start;
96 logger->warn(oss.str().c_str());
97 }
98 }
99 memset(eventCRC, 0, sizeof(eventCRC));
100 InputFile->read(eventCRC, sizeof(eventCRC));
101 readCRC = (((UINT16)(eventCRC[0]<<8))&0xFF00) + (((UINT16)eventCRC[1])&0x00FF);
102 if(partialCRC != readCRC) throw WrongCRCException(" Wrong Global CRC for TMTC Packet ");
103 }
104
105 /*
106 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 */

  ViewVC Help
Powered by ViewVC 1.1.23