| 1 |
mocchiut |
1.1 |
//============================================================================ |
| 2 |
|
|
// $Id: PacketSemanticAnalyzer.cpp,v 1.43 2008-04-01 13:24:06 messineo Exp $ |
| 3 |
|
|
// Description : |
| 4 |
|
|
//============================================================================ |
| 5 |
|
|
#include "PacketSemanticAnalyzer.h" |
| 6 |
|
|
|
| 7 |
|
|
namespace PamOffLineSW |
| 8 |
|
|
{ |
| 9 |
|
|
|
| 10 |
|
|
extern unsigned long int step_pkt_number; |
| 11 |
|
|
extern unsigned long int step_pkt_obt; |
| 12 |
|
|
extern long max_pkt_number; |
| 13 |
|
|
extern long max_pkt_obt; |
| 14 |
|
|
extern bool is_new_route; |
| 15 |
|
|
extern bool do_cont_check; |
| 16 |
|
|
|
| 17 |
|
|
extern LogUtil* mainLogUtil; |
| 18 |
|
|
extern long int iNumCadres; //cadre's number |
| 19 |
|
|
extern unsigned long long int iByte_tot;// how many bytes I have read till now |
| 20 |
|
|
|
| 21 |
|
|
PacketSemanticAnalyzer PacketSemanticAnalyzer::instance; |
| 22 |
|
|
|
| 23 |
|
|
PacketSemanticAnalyzer::PacketSemanticAnalyzer() |
| 24 |
|
|
{ |
| 25 |
|
|
//set current values and last values to zero |
| 26 |
|
|
setCurrentValues(0,0); |
| 27 |
|
|
setLastValue(); |
| 28 |
|
|
pkt_type=0; |
| 29 |
|
|
pktType=NULL; |
| 30 |
|
|
} |
| 31 |
|
|
|
| 32 |
|
|
PacketSemanticAnalyzer::~PacketSemanticAnalyzer() |
| 33 |
|
|
{ |
| 34 |
|
|
} |
| 35 |
|
|
|
| 36 |
|
|
//unused, the values are set in PamOffLineSW_Main.cpp |
| 37 |
|
|
void PacketSemanticAnalyzer::setStepValue(unsigned long int dpn, unsigned long int dpo ) |
| 38 |
|
|
{ |
| 39 |
|
|
step_pkt_number=dpn; |
| 40 |
|
|
step_pkt_obt=dpo; |
| 41 |
|
|
} |
| 42 |
|
|
|
| 43 |
|
|
void PacketSemanticAnalyzer::setLastValue() |
| 44 |
|
|
{ |
| 45 |
|
|
last_pkt_number=pkt_number; |
| 46 |
|
|
last_pkt_obt=pkt_obt; |
| 47 |
|
|
} |
| 48 |
|
|
|
| 49 |
|
|
void PacketSemanticAnalyzer::setCurrentValues(unsigned long int ex_pkt_number, unsigned long int ex_pkt_obt) |
| 50 |
|
|
{ |
| 51 |
|
|
pkt_number=ex_pkt_number; |
| 52 |
|
|
pkt_obt=ex_pkt_obt; |
| 53 |
|
|
} |
| 54 |
|
|
|
| 55 |
|
|
|
| 56 |
|
|
void PacketSemanticAnalyzer::extractValuesfromPKT(char * hpamPkt) |
| 57 |
|
|
{ |
| 58 |
|
|
|
| 59 |
|
|
/**/ |
| 60 |
|
|
//all the check can also be done using pamela::techmodel::EventReader* reader; |
| 61 |
|
|
//PacketUser::getInstance().reader->PKT_UnpackPscuHeader(hpamPkt); |
| 62 |
|
|
//std::cout<<PacketUser::getInstance().reader->Header->GetPscuHeader()->Print()<<std::endl; |
| 63 |
|
|
//reader->Header->GetCounter()->PrintCounters(); |
| 64 |
|
|
//const PacketType* type = reader->Header->GetPscuHeader()->GetPacketType(); |
| 65 |
|
|
//int len= reader->Header->GetPscuHeader()->GetPacketLenght(); |
| 66 |
|
|
//if(reader){delete reader; reader = NULL;} |
| 67 |
|
|
|
| 68 |
|
|
/**/ |
| 69 |
|
|
unsigned long int ex_pkt_number=(unsigned long int)(unsigned char)(hpamPkt[7])+ |
| 70 |
|
|
256*(unsigned long int)(unsigned char)(hpamPkt[6])+ |
| 71 |
|
|
256*256*(unsigned long int)(unsigned char)(hpamPkt[5]); |
| 72 |
|
|
//unsigned int Counter = (((UINT32)buff[5]<<16)&0x00FF0000) + (((UINT32)buff[6]<<8)&0x0000FF00) + (((UINT32)buff[7])&0x000000FF); |
| 73 |
|
|
|
| 74 |
|
|
unsigned long int ex_pkt_obt=(unsigned long int)(unsigned char)(hpamPkt[11])+ |
| 75 |
|
|
256*(unsigned long int)(unsigned char)(hpamPkt[10])+ |
| 76 |
|
|
256*256*(unsigned long int)(unsigned char)(hpamPkt[9])+ |
| 77 |
|
|
256*256*256*(unsigned long int)(unsigned char)(hpamPkt[8]); |
| 78 |
|
|
|
| 79 |
|
|
//unsigned int OrbitalTime = (((UINT32)buff[8]<<24)&0xFF000000) + (((UINT32)buff[9]<<16)&0x00FF0000) + (((UINT32)buff[10]<<8)&0x0000FF00) + (((UINT32)buff[11])&0x000000FF); |
| 80 |
|
|
|
| 81 |
|
|
setCurrentValues(ex_pkt_number,ex_pkt_obt); |
| 82 |
|
|
|
| 83 |
|
|
//if hpamPkt[3] != hpamPkt[4] the pkt is not good, it was discarded in R3 |
| 84 |
|
|
pkt_type=(unsigned char)(hpamPkt[3]); |
| 85 |
|
|
pktType = GetPacketType(pkt_type); |
| 86 |
|
|
} |
| 87 |
|
|
|
| 88 |
|
|
// PacketSemanticAnalyzer: |
| 89 |
|
|
// return false if there is a DISCONTINUITY |
| 90 |
|
|
// packet counter has priority on obt. |
| 91 |
|
|
bool PacketSemanticAnalyzer::analysePKT() |
| 92 |
|
|
{ |
| 93 |
|
|
|
| 94 |
|
|
if(!pktType){ |
| 95 |
|
|
stringstream oss; |
| 96 |
|
|
oss.str()=""; |
| 97 |
|
|
oss<<"PacketType "<<(int)pkt_type <<" not recognised. Packed skipped. The end of this packet is at byte: "<<iByte_tot<<" in cadre "<<iNumCadres; |
| 98 |
|
|
string msg = oss.str(); |
| 99 |
|
|
mainLogUtil->logError(msg); |
| 100 |
|
|
// the packet will not be used in the next module. |
| 101 |
|
|
//I don't call setLastValue(), I can't trust on this packet |
| 102 |
|
|
return true; |
| 103 |
|
|
} |
| 104 |
|
|
|
| 105 |
|
|
//IF I FOUND A NEW DOWNLOAD IN THE INPUT FILE, discontinuity |
| 106 |
|
|
if(is_new_route){ |
| 107 |
|
|
setLastValue(); |
| 108 |
|
|
return false; |
| 109 |
|
|
} |
| 110 |
|
|
|
| 111 |
|
|
if(!do_cont_check){ |
| 112 |
|
|
setLastValue();//maybe I don't need it |
| 113 |
|
|
return true; |
| 114 |
|
|
} |
| 115 |
|
|
|
| 116 |
|
|
long int delta_pc; |
| 117 |
|
|
long int delta_pt; |
| 118 |
|
|
bool cons=true; |
| 119 |
|
|
|
| 120 |
|
|
//TODO check here ... MARCO |
| 121 |
|
|
//USE ONLY PKT_NUMBER and not the OBT ... |
| 122 |
|
|
//correct value is step_pkt_number = 5 and step_pkt_obt =0 |
| 123 |
|
|
delta_pc = pkt_number-last_pkt_number; |
| 124 |
|
|
|
| 125 |
|
|
if((step_pkt_number==0)|| |
| 126 |
|
|
((delta_pc>0)&&(delta_pc<=step_pkt_number)) || |
| 127 |
|
|
((delta_pc<0)&&(-delta_pc>=(max_pkt_number-step_pkt_number)))//delta_pc < 0 et pkt_number small and last_pkt_number big |
| 128 |
|
|
) |
| 129 |
|
|
{ |
| 130 |
|
|
//cons=true; |
| 131 |
|
|
delta_pt=pkt_obt-last_pkt_obt; |
| 132 |
|
|
|
| 133 |
|
|
//delta_pt=0 is OK |
| 134 |
|
|
if((step_pkt_obt==0)|| |
| 135 |
|
|
((delta_pt>=0)&&(delta_pt<=step_pkt_obt)) || |
| 136 |
|
|
((delta_pt<0)&&(-delta_pt>=(max_pkt_obt-step_pkt_obt)))//delta_pt < 0 et pkt_obt small and last_pkt_obt big |
| 137 |
|
|
) |
| 138 |
|
|
{ |
| 139 |
|
|
cons=true; |
| 140 |
|
|
} |
| 141 |
|
|
else |
| 142 |
|
|
{ |
| 143 |
|
|
cons=false; |
| 144 |
|
|
} |
| 145 |
|
|
} |
| 146 |
|
|
else |
| 147 |
|
|
{ |
| 148 |
|
|
cons=false; |
| 149 |
|
|
} |
| 150 |
|
|
|
| 151 |
|
|
setLastValue(); |
| 152 |
|
|
return cons; |
| 153 |
|
|
} |
| 154 |
|
|
|
| 155 |
|
|
//here headerPkt is the header (16 bytes) pamPKT is the rest of the packet of lenght = length |
| 156 |
|
|
void PacketSemanticAnalyzer::managePKT(char*& headerPkt, char*& pamPkt, long int length, bool isPKTGood) |
| 157 |
|
|
{ |
| 158 |
|
|
bool isCons = true; |
| 159 |
|
|
//here we retrieve the informations mostly from the header |
| 160 |
|
|
extractValuesfromPKT(headerPkt); |
| 161 |
|
|
//here I use the information retrieved to decide if the current packet is continuos |
| 162 |
|
|
isCons=analysePKT(); |
| 163 |
|
|
|
| 164 |
|
|
//The quality of the packet isPKTGood and the information about "CONTINUITY" |
| 165 |
|
|
//are sent to the "user module" where I will save/use it. |
| 166 |
|
|
PacketUser::getInstance().usePKT(headerPkt, pamPkt, length, isCons, isPKTGood, |
| 167 |
|
|
pktType, pkt_number, pkt_obt); |
| 168 |
|
|
|
| 169 |
|
|
//just to be sure ... |
| 170 |
|
|
if(pamPkt){ delete[] pamPkt; pamPkt = NULL;} |
| 171 |
|
|
if(headerPkt){ delete[] headerPkt; headerPkt = NULL;} |
| 172 |
|
|
} |
| 173 |
|
|
|
| 174 |
|
|
/** |
| 175 |
|
|
* Get the packet type, this function is analogous to the one in ../event/PacketType.h |
| 176 |
|
|
*/ |
| 177 |
|
|
const PacketType* PacketSemanticAnalyzer::GetPacketType(unsigned char pkt_type) { |
| 178 |
|
|
switch (pkt_type) { |
| 179 |
|
|
case 0x07: return PacketType::PhysEndRun;//warning nel computo CRC |
| 180 |
|
|
case 0x08: return PacketType::CalibCalPulse1; |
| 181 |
|
|
case 0x09: return PacketType::CalibCalPulse2; |
| 182 |
|
|
case 0x10: return PacketType::Physics; |
| 183 |
|
|
case 0x11: return PacketType::CalibTrkBoth; |
| 184 |
|
|
case 0x12: return PacketType::CalibTrk1; |
| 185 |
|
|
case 0x13: return PacketType::CalibTrk2; |
| 186 |
|
|
case 0x16: return PacketType::CalibTof; |
| 187 |
|
|
case 0x17: return PacketType::CalibS4; |
| 188 |
|
|
case 0x18: return PacketType::CalibCalPed; |
| 189 |
|
|
case 0x19: return PacketType::Calib1_Ac1; |
| 190 |
|
|
case 0x1A: return PacketType::Calib2_Ac1; |
| 191 |
|
|
case 0x1B: return PacketType::Calib1_Ac2; |
| 192 |
|
|
case 0x1C: return PacketType::Calib2_Ac2; |
| 193 |
|
|
case 0x1D: return PacketType::CalibCal; |
| 194 |
|
|
case 0x20: return PacketType::RunHeader; |
| 195 |
|
|
case 0x21: return PacketType::RunTrailer; |
| 196 |
|
|
case 0x22: return PacketType::CalibHeader; |
| 197 |
|
|
case 0x23: return PacketType::CalibTrailer; |
| 198 |
|
|
case 0x24: return PacketType::InitHeader; |
| 199 |
|
|
case 0x25: return PacketType::InitTrailer; |
| 200 |
|
|
case 0x30: return PacketType::EventTrk; |
| 201 |
|
|
case 0x50: return PacketType::Log; |
| 202 |
|
|
case 0x51: return PacketType::VarDump; |
| 203 |
|
|
case 0x52: return PacketType::ArrDump; |
| 204 |
|
|
case 0x53: return PacketType::TabDump; |
| 205 |
|
|
case 0x54: return PacketType::Tmtc; |
| 206 |
|
|
case 0x55: return PacketType::Mcmd; |
| 207 |
|
|
case 0x60: return PacketType::ForcedFECmd; |
| 208 |
|
|
case 0x70: return PacketType::Ac1Init; |
| 209 |
|
|
case 0x71: return PacketType::CalInit; |
| 210 |
|
|
case 0x72: return PacketType::TrkInit; |
| 211 |
|
|
case 0x73: return PacketType::TofInit; |
| 212 |
|
|
case 0x74: return PacketType::TrgInit; |
| 213 |
|
|
case 0x75: return PacketType::NdInit; |
| 214 |
|
|
case 0x76: return PacketType::S4Init; |
| 215 |
|
|
case 0x77: return PacketType::Ac2Init; |
| 216 |
|
|
case 0x81: return PacketType::CalAlarm; |
| 217 |
|
|
case 0x82: return PacketType::Ac1Alarm; |
| 218 |
|
|
case 0x83: return PacketType::TrkAlarm; |
| 219 |
|
|
case 0x84: return PacketType::TrgAlarm; |
| 220 |
|
|
case 0x85: return PacketType::TofAlarm; |
| 221 |
|
|
case 0x86: return PacketType::S4Alarm; |
| 222 |
|
|
case 0x89: return PacketType::Ac2Alarm; |
| 223 |
|
|
case 0xA1: return PacketType::TsbT; |
| 224 |
|
|
case 0xAB: return PacketType::TsbB; |
| 225 |
|
|
default: { |
| 226 |
|
|
return NULL; |
| 227 |
|
|
} |
| 228 |
|
|
} |
| 229 |
|
|
|
| 230 |
|
|
} |
| 231 |
|
|
|
| 232 |
|
|
|
| 233 |
|
|
PacketSemanticAnalyzer& PacketSemanticAnalyzer::getInstance() |
| 234 |
|
|
{ |
| 235 |
|
|
return instance; |
| 236 |
|
|
} |
| 237 |
|
|
|
| 238 |
|
|
|
| 239 |
|
|
} |
| 240 |
|
|
|