| 1 | /** @file | /** @file | 
| 2 | * $Author: kusanagi $ | * $Author: kusanagi $ | 
| 3 | * $Date: 2004/12/09 08:48:41 $ | * $Date: 2005/02/09 22:21:24 $ | 
| 4 | * $Revision: 2.5 $ | * $Revision: 2.10 $ | 
| 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. | 
| 81 | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TrgAlarm,        new TrgAlarmReader)); | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TrgAlarm,        new TrgAlarmReader)); | 
| 82 | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TofAlarm,        new TofAlarmReader)); | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TofAlarm,        new TofAlarmReader)); | 
| 83 | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::S4Alarm,         new S4AlarmReader)); | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::S4Alarm,         new S4AlarmReader)); | 
| 84 |  | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TsbT,            new TsbTReader)); | 
| 85 |  | TechmodelAlgorithmMap.insert(AlgorithmMap::value_type(PacketType::TsbB,            new TsbBReader)); | 
| 86 | } | } | 
| 87 |  |  | 
| 88 | /** | /** | 
| 90 | */ | */ | 
| 91 | std::string EventReader::GetVersionInfo(void) const { | std::string EventReader::GetVersionInfo(void) const { | 
| 92 | return | return | 
| 93 | "$Header: /home/cvsmanager/yoda/techmodel/EventReader.cpp,v 2.5 2004/12/09 08:48:41 kusanagi Exp $\n"; | "$Header: /home/cvsmanager/yoda/techmodel/EventReader.cpp,v 2.10 2005/02/09 22:21:24 kusanagi Exp $\n"; | 
| 94 | } | } | 
| 95 |  |  | 
| 96 | /** | /** | 
| 145 | Header->GetCounter()->Increment(type); | Header->GetCounter()->Increment(type); | 
| 146 | logger->info(Header->GetPscuHeader()->Print()); | logger->info(Header->GetPscuHeader()->Print()); | 
| 147 | } else { | } else { | 
| 148 | throw NotExistingAlgorithmException(type->GetName().c_str()); //to exctract to an higher level and delete the logger! | oss.str(""); | 
| 149 |  | oss << "\n No way to read events of type  " << type->GetName().c_str() << Header->GetPscuHeader()->Print(); | 
| 150 |  | throw NotExistingAlgorithmException(oss.str().c_str()); //to exctract to an higher level and delete the logger! | 
| 151 | } | } | 
| 152 | } | } | 
| 153 | // In case of exception have to save the packet in a specific root file?? | // In case of exception have to save the packet in a specific root file?? | 
| 157 | logger->error(oss.str().c_str()); | logger->error(oss.str().c_str()); | 
| 158 | } catch (WrongCRCHeaderException exc) { | } catch (WrongCRCHeaderException exc) { | 
| 159 | oss.str(""); | oss.str(""); | 
| 160 | oss << exc.print() << " " << Header->GetPscuHeader()->Print(); | oss << exc.print(); | 
| 161 | logger->error(oss.str().c_str()); | logger->error(oss.str().c_str()); | 
| 162 | } catch (WrongCRCException exc) { | } catch (WrongCRCException exc) { | 
| 163 | oss.str(""); | oss.str(""); | 
| 179 | logger->error("Couldn't read the event. Skipping to the next header. \n"); | logger->error("Couldn't read the event. Skipping to the next header. \n"); | 
| 180 | } | } | 
| 181 | if ((step%1000) == 0) std::cout << step/1000 << "K \n"; | if ((step%1000) == 0) std::cout << step/1000 << "K \n"; | 
| 182 |  | oss.str(""); | 
| 183 |  | oss << "----endPck " << Header->GetPscuHeader()->GetCounter() << "\n"; | 
| 184 |  | logger->info(oss.str().c_str()); | 
| 185 | } | } | 
| 186 | Header->GetCounter()->PrintCounters(); | Header->GetCounter()->PrintCounters(); | 
| 187 | } | } | 
| 195 | /** | /** | 
| 196 | * Unpack the PSCU header from a file into the structure. | * Unpack the PSCU header from a file into the structure. | 
| 197 | */ | */ | 
| 198 | void EventReader::UnpackPscuHeader(void) throw (WrongCRCException, LengthException) { | void EventReader::UnpackPscuHeader(void) throw (WrongCRCHeaderException, LengthException) { | 
| 199 | stringstream oss; | stringstream oss; | 
| 200 | int response = false; | int response = false; | 
| 201 | char buff[16]; | char buff[16]; | 
| 213 | if (Counter < prevPckCounter){ | if (Counter < prevPckCounter){ | 
| 214 | oss.str(""); | oss.str(""); | 
| 215 | oss << "Packet counter is less than before of " << (prevPckCounter - Counter); | oss << "Packet counter is less than before of " << (prevPckCounter - Counter); | 
| 216 | logger->warn(oss.str().c_str()); | logger->error(oss.str().c_str()); | 
| 217 |  | } | 
| 218 |  |  | 
| 219 |  | if (Counter > prevPckCounter + 1){ | 
| 220 |  | oss.str(""); | 
| 221 |  | oss << "Packet counter is greater than before of " << (Counter - prevPckCounter); | 
| 222 |  | logger->error(oss.str().c_str()); | 
| 223 | } | } | 
| 224 |  |  | 
| 225 | if (OrbitalTime < prevPckOBT){ | if (OrbitalTime < prevPckOBT){ | 
| 226 | oss.str(""); | oss.str(""); | 
| 227 | oss << " Onboard Time is less than before of " << (prevPckOBT - OrbitalTime); | oss << " Onboard Time is less than before of " << (prevPckOBT - OrbitalTime); | 
| 228 | logger->warn(oss.str().c_str()); | logger->error(oss.str().c_str()); | 
| 229 | } | } | 
| 230 |  |  | 
| 231 | if (((BYTE)CM_Compute_CRC16(0, (BYTE*)&buff, 15) == (BYTE)buff[15]) && (PacketId1 == PacketId2)){ | if (((BYTE)CM_Compute_CRC16(0, (BYTE*)&buff, 15) == (BYTE)buff[15]) && (PacketId1 == PacketId2)){ | 
| 244 |  |  | 
| 245 | //commented out because of the above test code | //commented out because of the above test code | 
| 246 | InputFile->seekg(Header->GetPscuHeader()->GetPacketLenght(), std::ios::cur); | InputFile->seekg(Header->GetPscuHeader()->GetPacketLenght(), std::ios::cur); | 
| 247 | FindStart(); | if (FindStart()) { | 
| 248 | finalPos =  (long int)InputFile->tellg() - (1 + initPos + (long int)(Header->GetPscuHeader()->GetPacketLenght())); | finalPos =  (long int)InputFile->tellg() - (initPos + (long int)(Header->GetPscuHeader()->GetPacketLenght())); | 
| 249 | if(finalPos == 0){ | if(finalPos == 0){ | 
| 250 | logger->debug(_T("Correct packet length")); | logger->debug(_T(" Correct packet length")); | 
| 251 | } | } | 
| 252 | if (finalPos > 0 && finalPos < 64) { | if (finalPos > 0 && finalPos < 64) { | 
| 253 | oss.str(""); | oss.str(""); | 
| 254 | oss << " Correct packet length: Padded of " << finalPos << " bytes"; | oss << "Correct packet length: Padded of " << finalPos << " bytes"; | 
| 255 | logger->debug(oss.str().c_str()); | logger->debug(oss.str().c_str()); | 
| 256 | } | } | 
| 257 | if (finalPos > 64){ | if (finalPos > 64){ | 
| 258 | oss.str(""); | oss.str(""); | 
| 259 | oss << "The begin of the next packet is far more than 64 byte from the end of the previous." | oss << "\n The begin of the next packet is far more than 64 byte from the end of the previous." | 
| 260 | << Header->GetPscuHeader()->Print(); | << "\n Below the is the now unpacking packet"; | 
| 261 | logger->error(oss.str().c_str()); | logger->error(oss.str().c_str()); | 
| 262 |  | logger->error(Header->GetPscuHeader()->Print()); | 
| 263 | //throw LengthException("The begin of the next packet is far more than 64 byte from the end of the previous."); | //throw LengthException("The begin of the next packet is far more than 64 byte from the end of the previous."); | 
| 264 | } | } | 
| 265 |  | } | 
| 266 |  | else { | 
| 267 |  | logger->debug(_T(" END OF FILE")); | 
| 268 |  | } | 
| 269 |  |  | 
| 270 | InputFile->seekg(initPos, std::ios::beg); | InputFile->seekg(initPos, std::ios::beg); | 
| 271 | } else { | } else { | 
| 272 |  | /*Here i should extract the block of Data for later analysis */ | 
| 273 | InputFile->seekg(-(13), std::ios::cur); | InputFile->seekg(-(13), std::ios::cur); | 
| 274 | throw WrongCRCHeaderException(); | oss.str(""); | 
| 275 |  | oss << "CRC Header Error on packet:" << PscuHeader::Print(buff); | 
| 276 |  | throw WrongCRCHeaderException(oss.str().c_str()); | 
| 277 | } | } | 
| 278 |  |  | 
| 279 | /*    char tmpId1[4]; | /*    char tmpId1[4]; | 
| 307 | /** | /** | 
| 308 | * 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 | 
| 309 | */ | */ | 
| 310 | int EventReader::FindStart(void) throw (std::exception) { | bool EventReader::FindStart(void) throw (std::exception) { | 
| 311 | //search an hexadecimal sequence in a file | //search an hexadecimal sequence in a file | 
| 312 | //subSign    ------> pointer to the sequence buffer | //subSign    ------> pointer to the sequence buffer | 
| 313 | //subSignDim ------> dimension of the buffer | //subSignDim ------> dimension of the buffer | 
| 335 | if (dataByte == (char)(*(subSign+subIndex))){ | if (dataByte == (char)(*(subSign+subIndex))){ | 
| 336 | if (subIndex++ == (subSignDim-1)) { | if (subIndex++ == (subSignDim-1)) { | 
| 337 | InputFile->seekg( (index - (subIndex + buffSize)), std::ios::cur); | InputFile->seekg( (index - (subIndex + buffSize)), std::ios::cur); | 
| 338 | return 1; | return true; | 
| 339 | } | } | 
| 340 | } else { | } else { | 
| 341 | index = index - (subIndex); | index = index - (subIndex); | 
| 344 | } | } | 
| 345 | //Needs to guarantee the overap of the buffer(s) in several loop | //Needs to guarantee the overap of the buffer(s) in several loop | 
| 346 | InputFile->seekg( (-1)*(subSignDim + 1) , std::ios::cur); | InputFile->seekg( (-1)*(subSignDim + 1) , std::ios::cur); | 
| 347 | } | } | 
| 348 | return 0; | return false; | 
| 349 | } | } | 
| 350 |  |  | 
| 351 | ClassImp(EventReader) | ClassImp(EventReader) |