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

Contents of /yoda/techmodel/TmtcReader.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.4 - (show annotations) (download)
Tue Sep 21 20:24:33 2004 UTC (20 years, 2 months ago) by kusanagi
Branch: MAIN
Changes since 1.3: +11 -13 lines
Commit toward log4cxx plus new packets types Reader

1 /** @file
2 * $Source: /home/cvsmanager/yoda/techmodel/TmtcReader.cpp,v $
3 * $Id: TmtcReader.cpp,v 1.3 2004/08/24 16:01:57 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
12
13
14 #include <string>
15 #include <log4cxx/logger.h>
16 extern "C" {
17 #include <sys/time.h>
18 #include "CRC.h"
19 }
20
21 #include <fstream>
22 #include "stdio.h"
23 #include "ReaderAlgorithms.h"
24
25 #include "event/tmtc/TmtcRecord.h"
26
27 using namespace pamela;
28 using namespace pamela::techmodel;
29
30 static log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(_T("pamela.techmodel.TmtcReader"));
31
32 /**
33 * Constructor.
34 */
35 TmtcReader::TmtcReader(void):
36 TechmodelAlgorithm(PacketType::Tmtc, "TechmodelTmtcReader") {
37 logger->debug(_T("Constructor"));
38 Tmtc = new TmtcEvent();
39 }
40
41 /**
42 * Get a string with the version info of the algorithm.
43 */
44 std::string TmtcReader::GetVersionInfo(void) const {
45 return
46 "$Header: /home/cvsmanager/yoda/techmodel/TmtcReader.cpp,v 1.3 2004/08/24 16:01:57 kusanagi Exp $\n";
47 }
48
49 /**
50 * Initialize the algorithm with a special run. This will initialize the
51 * event reader routines for all packet types.
52 */
53 void TmtcReader::Init(PamelaRun *run) {
54 SetInputStream(run);
55 run->WriteSubPacket(this, &Tmtc, Tmtc->Class());
56 }
57
58 /**
59 * Unpack the Tmtc event from an input file.
60 */
61 void TmtcReader::RunEvent(int EventNumber, long int length) {
62
63 /*
64 //Just to test crc
65 char tempbuff[length];
66 InputFile->read(tempbuff, sizeof(tempbuff));
67 UINT16 subCRC = 0;
68 for (int jj = 0; jj < length ; jj++){
69 subCRC = CM_Compute_CRC16(subCRC, (BYTE*)(tempbuff+jj), 1);
70 }
71 //Just to test crc
72 */
73
74 int i, j;
75 char subData[TMTC_SUB_LENGTH];
76 char CRCbuff[TMTC_SUBCRC_LENGTH];
77 char eventCRC[TMTC_CRC_LENGTH];
78 int numRecords = (length-TMTC_CRC_LENGTH)/(TMTC_SUB_LENGTH + TMTC_SUBCRC_LENGTH); //subtract the last two bytes because are the final CRC
79 long int start;
80
81 TmtcRecord* rec;
82 Tmtc->Records->Clear();
83 TClonesArray &recs = *(Tmtc->Records);
84
85 UINT16 partialCRC = 0; //partial CRC updated as mcmd packet is read (to compare with the last two bytes of this event)
86 UINT16 readCRC = 0; //partial CRC updated as mcmd packet is read (to compare with the last two bytes of this event)
87
88 /* char tempData[length-TMTC_CRC_LENGTH];
89 InputFile->read(tempData, sizeof(tempData));
90 partialCRC = CM_Compute_CRC16(0, (UINT8*)tempData, (length-TMTC_CRC_LENGTH));
91 */
92
93 for(i = 0; i < numRecords; i++) {
94 start = InputFile->tellg();
95 InputFile->read(subData, sizeof(subData));
96 InputFile->read(CRCbuff, sizeof(CRCbuff));
97
98 /* for (int jj = 0; jj < TMTC_SUB_LENGTH ; jj++){
99 partialCRC = CM_Compute_CRC16(0, (UINT8*)tempData, (length-TMTC_CRC_LENGTH));
100 }
101 */
102
103 partialCRC = CM_Compute_CRC16(partialCRC, (UINT8*)&subData, TMTC_SUB_LENGTH);
104 partialCRC = CM_Compute_CRC16(partialCRC, (UINT8*)&CRCbuff, TMTC_SUBCRC_LENGTH);
105
106 //This == CRCBuff is not really parametric take care if have to change the static lengths
107 if((UINT8)(CM_Compute_CRC16(0, (UINT8*)&subData, TMTC_SUB_LENGTH)) == (UINT8)CRCbuff[0]){
108 rec = new(recs[i]) TmtcRecord(); //add a new TmtcRecord
109 rec->TM_RECORD_OBT = (((UINT32)subData[0]<<24)&0xFF000000) + (((UINT32)subData[1]<<16)&0x00FF0000) + (((UINT32)subData[2]<<8)&0x0000FF00) + ((UINT32)subData[3])&0x000000FF;
110
111 for(j = 0; j < 16; j++) {
112 rec->TM_DEA_ANA[j] = (((UINT16)subData[4+j]<<8)&0xFF00) + (((UINT16)subData[5+j])&0x00FF);
113 rec->TM_DEA_ANA_P[j] = (float)(rec->TM_DEA_ANA[j]*0.02);
114
115 rec->TM_TH_ANA[j] = subData[36+j]; //36 is the size of TM_DEA_ANA + OBT
116 rec->TM_TH_ANA_P[j] = convert_th(rec->TM_TH_ANA[j]);
117 }
118
119 rec->TM_BIL_DIAG_ACQ = subData[53];
120 rec->TM_CC_DIAG_ACQ = (((UINT32)subData[54]<<24)&0xFF000000) + (((UINT32)subData[55]<<16)&0x00FF0000) + (((UINT32)subData[56]<<8)&0x0000FF00) + ((UINT32)subData[57])&0x000000FF;
121 } else {
122 stringstream oss;
123 oss.flush();
124 oss << "Wrong CRC on Subpacket int TMTC Packet starting at position"
125 << start;
126 logger->warn(oss.str().c_str());
127 }
128 }
129 InputFile->read(eventCRC, sizeof(eventCRC));
130 readCRC = (((UINT16)(eventCRC[0]<<8))&0xFF00) + (((UINT16)eventCRC[1])&0x00FF);
131 if(!(partialCRC == readCRC)) {
132 logger->warn(_T("The test of calculated CRC with one wrote on file FAILED!!"));
133 }
134 }
135
136
137 float TmtcReader::convert_th(int TH) {
138 float a,q,deltax,deltay;
139 static int chiama_fun=0;
140 float gradi[22],grado=-1;
141 int adc[22]={4095, 4036,2976,2213,1662,1259,983,742,576,450,
142 354, 281,224,179,145, 117 ,95, 77, 64, 52,
143 43, 35};
144 int maxpos=-1,minpos=-1,i;
145
146 chiama_fun++;
147 for (i=0;i<22;i++)
148 {
149 gradi[i]=-35+(i*5);
150 }
151 if (TH==4095)
152 {
153 grado=-35.;
154 }
155 else
156 {
157
158 for (i=0;i<22;i++)
159 {
160 if (TH>=adc[i])
161 {
162 minpos=i;
163 maxpos=i-1;
164 break;
165 }
166 }
167 // grado=gradi[maxpos]-1./(adc[maxpos]-adc[minpos])*((float)TH-(float)adc[maxpos]) ;
168
169 deltax=adc[maxpos]-adc[minpos];
170 deltay=gradi[maxpos]-gradi[minpos];
171 a=deltay/deltax;
172 q=gradi[maxpos]-a*adc[maxpos];
173 grado=a*TH+q;
174 }
175 return (grado);
176 }

  ViewVC Help
Powered by ViewVC 1.1.23