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

Contents of /yoda/techmodel/TmtcReader.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5.0 - (show annotations) (download)
Mon Aug 29 09:46:13 2005 UTC (19 years, 3 months ago) by kusanagi
Branch: MAIN
CVS Tags: YODA5_0/00, YODA5_0/01, YODA5_0/02
Changes since 4.4: +2 -2 lines
Starting form this version:
1) includes are defined with relative (not absolute) path respect to the YODA aplication
2) RegistryEvent class is foreseen to contain post-unpack data.

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

  ViewVC Help
Powered by ViewVC 1.1.23