| 1 | /** @file | /** @file | 
| 2 | * $Author: kusanagi $ | * $Author: Maurizio Nagni $ | 
| 3 | * $Date: 2004/07/17 20:03:38 $ | * $Date: 2005/09/16 12:05:49 $ | 
| 4 | * $Revision: 1.4 $ | * $Revision: 5.1 $ | 
| 5 | * | * | 
| 6 | * Implementation of the functions of a sample Algorithm class. | * Implementation of the functions of a sample Algorithm class. | 
| 7 | * This file can be used as a templace to develop your own algorithm. | * This file can be used as a templace to develop your own algorithm. | 
| 8 | */ | */ | 
| 9 |  |  | 
| 10 | #include <log4cpp/Category.hh> | #include <log4cxx/logger.h> | 
|  | #include <fstream> |  | 
|  | #include "TechmodelAlgorithm.h" |  | 
| 11 | #include "EventReader.h" | #include "EventReader.h" | 
| 12 | #include "ReaderAlgorithms.h" | #include "ReaderAlgorithms.h" | 
| 13 | #include "Exception.h" |  | 
|  | #include "stdio.h" |  | 
| 14 | extern "C" { | extern "C" { | 
| 15 | #include "CRC.h" | #include "CRC.h" | 
| 16 | } | } | 
| 17 |  |  | 
|  | #define BYTE unsigned char |  | 
|  |  |  | 
| 18 | using namespace pamela; | using namespace pamela; | 
| 19 | using namespace pamela::techmodel; | using namespace pamela::techmodel; | 
| 20 |  |  | 
| 21 | static log4cpp::Category& cat = log4cpp::Category::getInstance("pamela.techmodel.EventReader"); | static log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(_T("pamela.techmodel.EventReader")); | 
| 22 | static unsigned int prevPckCounter = 0; |  | 
| 23 | static unsigned int prevPckOBT     = 0; | unsigned int EventReader::maxPackets     = 0; | 
| 24 |  | unsigned int EventReader::prevPckCounter = 0; | 
| 25 |  | unsigned int EventReader::prevPckOBT     = 0; | 
| 26 |  |  | 
| 27 |  |  | 
| 28 | /** | /** | 
| 29 | * Constructor. | * Constructor. | 
| 30 | */ | */ | 
| 31 | EventReader::EventReader(void): | EventReader::EventReader(int packetsLimit = -1): | 
| 32 | TechmodelAlgorithm(0, "TechmodelEventReader") { | TechmodelAlgorithm(0, "TechmodelEventReader"){ | 
| 33 | cat <<  log4cpp::Priority::DEBUG | EventReader::maxPackets = packetsLimit; | 
| 34 | <<  "Constructor " | logger->debug(_T("Constructor")); | 
|  | <<  "\n " << log4cpp::CategoryStream::ENDLINE; |  | 
| 35 | Header = new EventHeader(); | Header = new EventHeader(); | 
| 36 |  |  | 
| 37 | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Physics,    new PhysicsReader())); | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::PhysEndRun,      new PhysEndRunReader)); | 
| 38 | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::RunHeader,  new RunHeaderReader())); | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibCalPulse1,  new CalibCalPulse1Reader)); | 
| 39 | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::RunTrailer, new RunTrailerReader())); | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibCalPulse2,  new CalibCalPulse2Reader)); | 
| 40 | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Log,        new LogReader())); | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Physics,         new PhysicsReader)); | 
| 41 | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::VarDump,    new VarDumpReader())); | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibTrk1,       new CalibTrk1Reader)); | 
| 42 | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::ArrDump,    new ArrDumpReader())); | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibTrk2,       new CalibTrk2Reader)); | 
| 43 | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TabDump,    new TabDumpReader())); | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibTof,        new CalibTofReader)); | 
| 44 | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Tmtc,       new TmtcReader())); | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibS4,         new CalibS4Reader)); | 
| 45 | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Mcmd,       new McmdReader())); | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibCalPed,     new CalibCalPedReader)); | 
| 46 | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibCal,   new CalibCalReader())); | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Calib1_Ac1,      new Calib1_Ac1Reader)); | 
| 47 | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibCalPed,new CalibCalPedReader())); | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Calib2_Ac1,      new Calib2_Ac1Reader)); | 
| 48 | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibCal,   new CalibAcReader())); | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Calib1_Ac2,      new Calib1_Ac2Reader)); | 
| 49 | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibTrk1,  new CalibTrk1Reader())); | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Calib2_Ac2,      new Calib2_Ac2Reader)); | 
| 50 | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibTrk2,  new CalibTrk2Reader())); | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::RunHeader,       new RunHeaderReader)); | 
| 51 | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibTrd,   new CalibTrdReader())); | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::RunTrailer,      new RunTrailerReader)); | 
| 52 | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibTof,   new CalibTofReader())); | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibHeader,     new CalibHeaderReader)); | 
| 53 | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibS4,    new CalibS4Reader())); | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalibTrailer,    new CalibTrailerReader)); | 
| 54 | /* | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::InitHeader,      new InitHeaderReader)); | 
| 55 | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::HA_Header_E5, | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::InitTrailer,     new InitTrailerReader)); | 
| 56 | new E5Reader())); | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Log,             new LogReader)); | 
| 57 | */ | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::VarDump,         new VarDumpReader)); | 
| 58 |  | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::ArrDump,         new ArrDumpReader)); | 
| 59 |  | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TabDump,         new TabDumpReader)); | 
| 60 |  | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Tmtc,            new TmtcReader)); | 
| 61 |  | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Mcmd,            new McmdReader)); | 
| 62 |  | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::ForcedFECmd,     new ForcedFECmdReader)); | 
| 63 |  | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Ac1Init,         new Ac1InitReader)); | 
| 64 |  | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalInit,         new CalInitReader)); | 
| 65 |  | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TrkInit,         new TrkInitReader)); | 
| 66 |  | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TofInit,         new TofInitReader)); | 
| 67 |  | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TrgInit,         new TrgInitReader)); | 
| 68 |  | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::NdInit,          new NdInitReader)); | 
| 69 |  | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::S4Init,          new S4InitReader)); | 
| 70 |  | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::Ac2Init,         new Ac2InitReader)); | 
| 71 |  | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::CalAlarm,        new CalAlarmReader)); | 
| 72 |  | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::AcAlarm,         new AcAlarmReader)); | 
| 73 |  | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TrkAlarm,        new TrkAlarmReader)); | 
| 74 |  | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TrgAlarm,        new TrgAlarmReader)); | 
| 75 |  | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TofAlarm,        new TofAlarmReader)); | 
| 76 |  | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::S4Alarm,         new S4AlarmReader)); | 
| 77 |  | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TsbT,            new TsbTReader)); | 
| 78 |  | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TsbB,            new TsbBReader)); | 
| 79 | } | } | 
| 80 |  |  | 
| 81 | /** | /** | 
| 83 | */ | */ | 
| 84 | std::string EventReader::GetVersionInfo(void) const { | std::string EventReader::GetVersionInfo(void) const { | 
| 85 | return | return | 
| 86 | "$Header: /home/cvsmanager/yoda/techmodel/EventReader.cpp,v 1.4 2004/07/17 20:03:38 kusanagi Exp $\n"; | "$Header: /home/cvsmanager/yoda/techmodel/EventReader.cpp,v 5.1 2005/09/16 12:05:49 Maurizio Nagni Exp $\n"; | 
| 87 | } | } | 
| 88 |  |  | 
| 89 | /** | /** | 
| 99 | //Create the xxx.root in it's specific directory | //Create the xxx.root in it's specific directory | 
| 100 | for (AlgorithmMap::iterator i = TechmodelAlgorithmMap.begin(); | for (AlgorithmMap::iterator i = TechmodelAlgorithmMap.begin(); | 
| 101 | i != TechmodelAlgorithmMap.end(); i++) { | i != TechmodelAlgorithmMap.end(); i++) { | 
| 102 | cat  <<  log4cpp::Priority::DEBUG | oss.str(""); | 
| 103 | <<  " Initializing algo " << i->second->GetAlgorithmName() | oss << "Initializing algo " << i->second->GetAlgorithmName(); | 
| 104 | <<  "\n " << log4cpp::CategoryStream::ENDLINE; | logger->debug(oss.str().c_str()); | 
| 105 | i->second->Init(run); | i->second->Init(run); | 
| 106 | } | } | 
| 107 | Run = dynamic_cast<TechmodelPamelaRun*>(run); | Run = dynamic_cast<TechmodelPamelaRun*>(run); | 
| 113 | * Read the next event header, call the reader algorithms that | * Read the next event header, call the reader algorithms that | 
| 114 | * correspond to its packet type, and read the event trailer. | * correspond to its packet type, and read the event trailer. | 
| 115 | */ | */ | 
|  |  |  | 
|  | // 15 June 2004 ---note------------------ |  | 
|  | // A nice refacoring would require to not read again the packet data (which is |  | 
|  | // read in the UnpackPscuHeader() and put directly in the |  | 
|  | // EventAlgorithm->RunEvent(....) directly the data inside the packet.... will see later.... |  | 
|  | // 15 June 2004 ---note------------------ |  | 
| 116 | void EventReader::RunEvent(int EventNumber) { | void EventReader::RunEvent(int EventNumber) { | 
| 117 |  | stringstream oss; | 
| 118 | cat <<  log4cpp::Priority::ERROR <<  "Start Unpacking........" | int step = 0; | 
| 119 | <<  "\n " << log4cpp::CategoryStream::ENDLINE; | const PacketType* type; | 
| 120 | //for now i'll suppose that the raw file starts immediately with the right bytes | while (!InputFile->eof() && ((step++ < maxPackets) || (maxPackets == 0))){ | 
|  | //to insert a GetPacketStart() |  | 
|  | while (!InputFile->eof()){ |  | 
| 121 | try { | try { | 
| 122 | if (FindStart()) { | if (FindStart()) { | 
| 123 | if(UnpackPscuHeader()){ | UnpackPscuHeader(); | 
| 124 | const PacketType* type = Header->GetPscuHeader()->GetPacketType(); | type = Header->GetPscuHeader()->GetPacketType(); | 
| 125 | AlgorithmMap::iterator i = TechmodelAlgorithmMap.find(type); | AlgorithmMap::iterator i = TechmodelAlgorithmMap.find(type); | 
| 126 | if (i != TechmodelAlgorithmMap.end()) { | if (i != TechmodelAlgorithmMap.end()) { | 
| 127 | TechmodelAlgorithm *EventAlgorithm = i->second; | TechmodelAlgorithm *EventAlgorithm(i->second); | 
| 128 | EventAlgorithm->RunEvent(EventNumber, Header->GetPscuHeader()->GetPacketLenght()); | EventAlgorithm->RunEvent(EventNumber, Header->GetPscuHeader()->GetPacketLenght()); | 
| 129 | Run->FillTrees(type); | Run->FillTrees(type); | 
| 130 | Header->GetCounter()->Increment(type); | Header->GetCounter()->Increment(type); | 
| 131 |  | logger->info(Header->GetPscuHeader()->Print()); | 
| 132 | } else { | } else { | 
| 133 | cat <<  log4cpp::Priority::ERROR | oss.str(""); | 
| 134 | <<  "No way to read events of type" << type->GetName() | oss << "\n No way to read events of type  " << type->GetName().c_str() << Header->GetPscuHeader()->Print(); | 
| 135 | <<  "\n " << log4cpp::CategoryStream::ENDLINE; | throw NotExistingAlgorithmException(oss.str().c_str()); //to exctract to an higher level and delete the logger! | 
| 136 | throw Exception("No way to read events of type " + type->GetName()); | } | 
| 137 | } | } | 
| 138 | } //else { | // In case of exception have to save the packet in a specific root file?? | 
| 139 | //**TO BE DONE**   <<WRONG CRC l --- LOST PACKET>>// | } catch (NotExistingAlgorithmException exc) { | 
| 140 | //Have to be defined a "WrongCRC" packet::Type? | oss.str(""); | 
| 141 | //} | oss << exc.print() << " " << Header->GetPscuHeader()->Print(); | 
| 142 | } | logger->error(oss.str().c_str()); | 
| 143 |  | } catch (WrongCRCHeaderException exc) { | 
| 144 |  | oss.str(""); | 
| 145 |  | oss << exc.print(); | 
| 146 |  | logger->error(oss.str().c_str()); | 
| 147 |  | } catch (WrongCRCException exc) { | 
| 148 |  | oss.str(""); | 
| 149 |  | oss << exc.print() << " " << Header->GetPscuHeader()->Print(); | 
| 150 |  | logger->error(oss.str().c_str()); | 
| 151 |  | InputFile->seekg( (-1)*(Header->GetPscuHeader()->GetPacketLenght() + 15) , std::ios::cur); | 
| 152 |  | } catch (UnidentifiedPacketException exc) { | 
| 153 |  | oss.str(""); | 
| 154 |  | oss << exc.print() << " " << Header->GetPscuHeader()->Print(); | 
| 155 |  | logger->error(oss.str().c_str()); | 
| 156 |  | } catch (NotExistingCounterException exc) { | 
| 157 |  | oss.str(""); | 
| 158 |  | oss << exc.print() << " " << Header->GetPscuHeader()->Print(); | 
| 159 |  | logger->error(oss.str().c_str()); | 
| 160 |  | } catch (LengthException exc) { | 
| 161 |  | oss.str(""); | 
| 162 |  | oss << exc.print() << " " << Header->GetPscuHeader()->Print(); | 
| 163 |  | logger->error(oss.str().c_str()); | 
| 164 |  | } catch (BackwardCounterException exc) { | 
| 165 |  | oss.str(""); | 
| 166 |  | oss << exc.print() << " " << Header->GetPscuHeader()->Print(); | 
| 167 |  | logger->error(oss.str().c_str()); | 
| 168 | } catch (...) { | } catch (...) { | 
| 169 | //This have to be more detailed. More exceptions type are needed. | logger->error("Couldn't read the event. Skipping to the next header. \n"); | 
|  | cat <<  log4cpp::Priority::ERROR <<  "Couldn't read the event. Skipping to the next header." |  | 
|  | <<  "\n " << log4cpp::CategoryStream::ENDLINE; |  | 
| 170 | } | } | 
| 171 |  | if ((step%1000) == 0) std::cout << step/1000 << "K \n"; | 
| 172 |  | oss.str(""); | 
| 173 |  | oss << "----endPck " << Header->GetPscuHeader()->GetCounter() << "\n"; | 
| 174 |  | logger->info(oss.str().c_str()); | 
| 175 | } | } | 
| 176 | Header->GetCounter()->PrintCounters(); | Header->GetCounter()->PrintCounters(); | 
| 177 | } | } | 
| 178 |  |  | 
|  | static void SkipToNextHeader(ifstream* TechmodelFile) { |  | 
|  | //  yeah. |  | 
|  | } |  | 
|  |  |  | 
|  |  |  | 
|  |  |  | 
| 179 | /** | /** | 
| 180 | * Unpack the PSCU header from a file into the structure. | * Unpack the PSCU header from a file into the structure. | 
| 181 | */ | */ | 
| 182 | int EventReader::UnpackPscuHeader(void) throw (std::exception) { | void EventReader::UnpackPscuHeader(void) throw (WrongCRCHeaderException, LengthException, BackwardCounterException) { | 
| 183 | int response; | stringstream oss; | 
| 184 |  | int response = 0; | 
| 185 | char buff[16]; | char buff[16]; | 
| 186 | InputFile->read(buff, sizeof(buff)); | InputFile->read(buff, sizeof(buff)); | 
| 187 |  |  | 
|  | prevPckCounter = 0; |  | 
|  | prevPckOBT     = 0; |  | 
| 188 |  |  | 
| 189 | unsigned char PacketId1    = buff[3]; | unsigned char PacketId1    = buff[3]; | 
| 190 | unsigned char PacketId2    = buff[4]; | unsigned char PacketId2    = buff[4]; | 
| 192 | unsigned int  OrbitalTime  = (((UINT32)buff[8]<<24)&0xFF000000) + (((UINT32)buff[9]<<16)&0x00FF0000) +  (((UINT32)buff[10]<<8)&0x0000FF00) + (((UINT32)buff[11])&0x000000FF); | unsigned int  OrbitalTime  = (((UINT32)buff[8]<<24)&0xFF000000) + (((UINT32)buff[9]<<16)&0x00FF0000) +  (((UINT32)buff[10]<<8)&0x0000FF00) + (((UINT32)buff[11])&0x000000FF); | 
| 193 | unsigned int  PacketLenght = (((UINT32)buff[12]<<16)&0x00FF0000) +  (((UINT32)buff[13]<<8)&0x0000FF00) + (((UINT32)buff[14])&0x000000FF); | unsigned int  PacketLenght = (((UINT32)buff[12]<<16)&0x00FF0000) +  (((UINT32)buff[13]<<8)&0x0000FF00) + (((UINT32)buff[14])&0x000000FF); | 
| 194 | unsigned char CRC          = buff[15]; | unsigned char CRC          = buff[15]; | 
| 195 |  | unsigned char FileOffset   = buff[15]; | 
| 196 |  |  | 
| 197 |  |  | 
| 198 | if (Counter < prevPckCounter){ | if (Counter < prevPckCounter){ | 
| 199 | cat <<  log4cpp::Priority::ERROR | response = prevPckCounter - Counter; | 
| 200 | <<  " Packet counter is less than before of " << (prevPckCounter - Counter) | //oss.str(""); | 
| 201 | <<  "\n " << log4cpp::CategoryStream::ENDLINE; | //oss << "Packet counter is less than before of " << (prevPckCounter - Counter); | 
| 202 |  | //throw BackwardCounterException(oss.str().c_str()); | 
| 203 |  | //logger->error(oss.str().c_str()); | 
| 204 |  | } | 
| 205 |  |  | 
| 206 |  | if (Counter > prevPckCounter + 1){ | 
| 207 |  | oss.str(""); | 
| 208 |  | oss << "Packet counter is greater than before of " << (Counter - prevPckCounter); | 
| 209 |  | logger->error(oss.str().c_str()); | 
| 210 |  | } | 
| 211 |  |  | 
| 212 |  | if ((OrbitalTime == prevPckOBT) & (PacketId1 == 0x10)){ | 
| 213 |  | oss.str(""); | 
| 214 |  | oss << "Onboard Time of this packet is equal to the previous packet OBT"; | 
| 215 |  | logger->error(oss.str().c_str()); | 
| 216 |  | logger->error(Header->GetPscuHeader()->Print()); | 
| 217 | } | } | 
| 218 |  |  | 
| 219 | if (OrbitalTime < prevPckOBT){ | if (OrbitalTime < prevPckOBT){ | 
| 220 | cat <<  log4cpp::Priority::WARN | oss.str(""); | 
| 221 | <<  " Orbital Time is less than before of " << (prevPckOBT - OrbitalTime) | oss << " Onboard Time is less than before of " << (prevPckOBT - OrbitalTime); | 
| 222 | <<  "\n " << log4cpp::CategoryStream::ENDLINE; | logger->error(oss.str().c_str()); | 
| 223 | } | } | 
| 224 |  |  | 
| 225 |  | if (((BYTE)CM_Compute_CRC16(0, (BYTE*)&buff, 15) == (BYTE)buff[15]) && (PacketId1 == PacketId2)){ | 
| 226 | if ((BYTE)CM_Compute_CRC16(0, (BYTE*)&buff, 15) == (BYTE)buff[15]){ | prevPckCounter = Counter; | 
| 227 |  | prevPckOBT     = OrbitalTime; | 
| 228 | long int initPos = InputFile->tellg(); | long int initPos = InputFile->tellg(); | 
| 229 | long int finalPos; | long int finalPos; | 
| 230 | Header->GetPscuHeader()->SetPacketId(PacketId1, PacketId2); | Header->GetPscuHeader()->SetPacketId(PacketId1, PacketId2); | 
| 234 | //plus the CRC legth (which varies for each type of packet) | //plus the CRC legth (which varies for each type of packet) | 
| 235 | Header->GetPscuHeader()->SetPacketLenght(PacketLenght); | Header->GetPscuHeader()->SetPacketLenght(PacketLenght); | 
| 236 | Header->GetPscuHeader()->SetCRC(CRC); | Header->GetPscuHeader()->SetCRC(CRC); | 
| 237 |  | Header->GetPscuHeader()->SetFileOffset(((long int)(InputFile->tellg()) - 16)); | 
|  | //commented out because of the above test code |  | 
|  | InputFile->seekg(Header->GetPscuHeader()->GetPacketLenght(), std::ios::cur); |  | 
|  | FindStart(); |  | 
|  | finalPos =  (long int)InputFile->tellg() - (1 + initPos + (long int)(Header->GetPscuHeader()->GetPacketLenght())); |  | 
|  | if(finalPos == 0){ |  | 
|  | cat <<  log4cpp::Priority::INFO <<  " Correct packet length \n" |  | 
|  | <<  "\n " << log4cpp::CategoryStream::ENDLINE; |  | 
|  | } |  | 
|  | if (finalPos > 0 && finalPos < 64) { |  | 
|  | cat <<  log4cpp::Priority::WARN |  | 
|  | <<  " Correct packet length: Padded of " << finalPos << " bytes \n" |  | 
|  | <<  "\n " << log4cpp::CategoryStream::ENDLINE; |  | 
|  | } |  | 
|  | if (finalPos > 64){ |  | 
|  | cat <<  log4cpp::Priority::ERROR <<  " Wrong packet length? (because of wrong padding?) \n" |  | 
|  | <<  "\n " << log4cpp::CategoryStream::ENDLINE; |  | 
|  | } |  | 
|  | InputFile->seekg(initPos, std::ios::beg); |  | 
|  | response =  true; |  | 
| 238 | } else { | } else { | 
| 239 | cat <<  log4cpp::Priority::ERROR <<  " WRONG CRC FOR HEADER " | /*Here i should extract the block of Data for later analysis */ | 
| 240 | <<  "\n " << log4cpp::CategoryStream::ENDLINE; | InputFile->seekg(-(13), std::ios::cur); | 
| 241 | response =  false; | oss.str(""); | 
| 242 |  | oss << "CRC Header Error on packet:" << PscuHeader::Print(buff); | 
| 243 |  | throw WrongCRCHeaderException(oss.str().c_str()); | 
| 244 | } | } | 
| 245 |  |  | 
| 246 | char tmpId1[4]; | if (response > 0){ | 
| 247 | char tmpId2[4]; | oss.str(""); | 
| 248 | char tmpLength[12]; | oss << "Packet counter is less than before of " << response; | 
| 249 | char tmpStart[100]; | throw BackwardCounterException(oss.str().c_str()); | 
| 250 | char tmpCRC[4]; | } | 
|  | sprintf(tmpId1, "%02X", PacketId1); |  | 
|  | sprintf(tmpId2, "%02X", PacketId2); |  | 
|  | sprintf(tmpLength, "%06X", Header->GetPscuHeader()->GetPacketLenght()); |  | 
|  | sprintf(tmpStart, "%X", ((long int)(InputFile->tellg()) - 16)); |  | 
|  | sprintf(tmpCRC, "%02X", CRC); |  | 
|  | cat <<  log4cpp::Priority::INFO |  | 
|  | <<  "\n Packet Counter (decimal) : "  <<  Counter |  | 
|  | <<  "\n Id1 - Id2                : "  <<  tmpId1 <<  " - " <<  tmpId2 |  | 
|  | <<  "\n Orbital Time (decimal)   : "  <<  OrbitalTime |  | 
|  | <<  "\n Lenght                   : "  <<  tmpLength |  | 
|  | <<  "\n CRC                      : "  <<  tmpCRC |  | 
|  | <<  "\n Header Start Position    : "  <<  tmpStart |  | 
|  | <<  "\n " << log4cpp::CategoryStream::ENDLINE; |  | 
|  | return response; |  | 
| 251 | } | } | 
| 252 |  |  | 
| 253 | /** | /** | 
| 260 | /** | /** | 
| 261 | * Find the next starting poin for the PSCU event looking for a {0xFA, 0xFE, 0xDE} sequence | * Find the next starting poin for the PSCU event looking for a {0xFA, 0xFE, 0xDE} sequence | 
| 262 | */ | */ | 
| 263 | int EventReader::FindStart(void) throw (std::exception) { | bool EventReader::FindStart(void) throw (std::exception) { | 
| 264 | //search an hexadecimal sequence in a file | //search an hexadecimal sequence in a file | 
| 265 | //subSign    ------> pointer to the sequence buffer | //subSign    ------> pointer to the sequence buffer | 
| 266 | //subSignDim ------> dimension of the buffer | //subSignDim ------> dimension of the buffer | 
| 268 | // return true if founds a match (else false) | // return true if founds a match (else false) | 
| 269 | // subF point rigth after the match, if found. Else EOF. | // subF point rigth after the match, if found. Else EOF. | 
| 270 | //Maurizio 15/11/2002----------------------- | //Maurizio 15/11/2002----------------------- | 
| 271 | const unsigned char subSign[3]={0xFA, 0xFE, 0xDE}; | const int subSignDim = 3; | 
| 272 | int subSignDim = 3; | const unsigned char subSign[subSignDim]={0xFA, 0xFE, 0xDE}; | 
| 273 | //------------------------------------------ | //------------------------------------------ | 
| 274 | int subIndex = 0; | int subIndex = 0; | 
| 275 | char dataByte; | char dataByte; | 
| 276 | /*InputFile->read(fileByte, 1); |  | 
| 277 | if ( *fileByte ==  *(subSign+subIndex)){ | int  buffSize = 64; | 
| 278 | if (subIndex++ == (subSignDim-1)) { | int  index = 0; | 
| 279 | InputFile->seekg(-(subIndex), std::ios::cur); | int  loop = -1; | 
| 280 | return 1; | char buffer[buffSize]; | 
| 281 | } | bool flagOverPad = false; | 
| 282 | }*/ |  | 
| 283 | while (!InputFile->eof()) { | while (!InputFile->eof()) { | 
| 284 | InputFile->get(dataByte); | InputFile->read(buffer, sizeof(buffer)); | 
| 285 | if (dataByte == (char)(*(subSign+subIndex))){ | index = 0; | 
| 286 | if (subIndex++ == (subSignDim-1)) { | loop++; | 
| 287 | InputFile->seekg(-(subIndex), std::ios::cur); | while (index < buffSize){ | 
| 288 | return 1; | dataByte = buffer[index++]; | 
| 289 | } | if (dataByte == (char)(*(subSign+subIndex))){ | 
| 290 | } else { | if (subIndex++ == (subSignDim-1)) { | 
| 291 | if (InputFile->eof()) { | InputFile->seekg( (index - (subIndex + buffSize)), std::ios::cur); | 
| 292 | throw Exception("Extra bytes over the last packets"); | if (flagOverPad){ | 
| 293 | } else { | oss.str(""); | 
| 294 | return 0; | oss << "\n This packet beginning is farther than 64 byte from the end of the previous." | 
| 295 | } | << "\n Below the is the last already unpacked packet"; | 
| 296 | //InputFile->seekg(-(subIndex+1), std::ios::cur); | logger->error(oss.str().c_str()); | 
| 297 | //subIndex = 0; | logger->error(Header->GetPscuHeader()->Print()); | 
| 298 | } | } | 
| 299 |  | return true; | 
| 300 |  | } | 
| 301 |  | } else { | 
| 302 |  | index = index - (subIndex); | 
| 303 |  | subIndex = 0; | 
| 304 |  | } | 
| 305 |  | } | 
| 306 |  | //Needs to guarantee the overap of the buffer(s) in several loop | 
| 307 |  | flagOverPad = true; | 
| 308 |  | InputFile->seekg( (-1)*(subSignDim + 1) , std::ios::cur); | 
| 309 | } | } | 
| 310 | return 0; | return false; | 
| 311 | } | } | 
| 312 |  |  | 
| 313 | ClassImp(EventReader) | ClassImp(EventReader) |