| 1 | /** @file | /** @file | 
| 2 | * $Source: /home/cvsmanager/yoda/techmodel/VarDumpReader.cpp,v $ | * $Source: /home/cvsmanager/yoda/techmodel/VarDumpReader.cpp,v $ | 
| 3 | * $Id: VarDumpReader.cpp,v 1.1.1.1 2004/07/06 12:20:23 kusanagi Exp $ | * $Id: VarDumpReader.cpp,v 2.2.2.1 2005/03/04 10:26:21 kusanagi Exp $ | 
| 4 | * $Author: kusanagi $ | * $Author: kusanagi $ | 
| 5 | * | * | 
| 6 | * Implementation of the VarDumpReader class. | * Implementation of the VarDumpReader class. | 
| 7 | */ | */ | 
| 8 |  |  | 
| 9 | #include <string> | #include <string> | 
| 10 | #include <log4cpp/Category.hh> | #include <log4cxx/logger.h> | 
| 11 | #include <fstream> | #include <fstream> | 
| 12 | #include "stdio.h" | #include "stdio.h" | 
| 13 | extern "C" { | extern "C" { | 
| 19 | using namespace pamela; | using namespace pamela; | 
| 20 | using namespace pamela::techmodel; | using namespace pamela::techmodel; | 
| 21 |  |  | 
| 22 | static log4cpp::Category& cat = log4cpp::Category::getInstance("pamela.techmodel.VarDumpReader"); | static log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(_T("pamela.techmodel.VarDumpReader")); | 
| 23 |  |  | 
| 24 | /** | /** | 
| 25 | * Constructor. | * Constructor. | 
| 33 | * Get a string with the version info of the algorithm. | * Get a string with the version info of the algorithm. | 
| 34 | */ | */ | 
| 35 | std::string VarDumpReader::GetVersionInfo(void) const { | std::string VarDumpReader::GetVersionInfo(void) const { | 
| 36 | return     "$Header: /home/cvsmanager/yoda/techmodel/VarDumpReader.cpp,v 1.1.1.1 2004/07/06 12:20:23 kusanagi Exp $\n"; | return     "$Header: /home/cvsmanager/yoda/techmodel/VarDumpReader.cpp,v 2.2.2.1 2005/03/04 10:26:21 kusanagi Exp $\n"; | 
| 37 | } | } | 
| 38 |  |  | 
| 39 | /** | /** | 
| 48 | /** | /** | 
| 49 | * Unpack the VarDump event from an input file. | * Unpack the VarDump event from an input file. | 
| 50 | */ | */ | 
| 51 | void VarDumpReader::RunEvent(int EventNumber, long int length) { | void VarDumpReader::RunEvent(int EventNumber, long int length) throw (WrongCRCException){ | 
| 52 |  |  | 
| 53 | char     *subData; | char     *subData; | 
| 54 | char      eventCRC[2]; | char      eventCRC[2]; | 
| 55 | UINT16    subCRC;      //CRC of the data | UINT16    subCRC;      //CRC of the data | 
| 56 | UINT16    readCRC;     //CRC read from the end of the subpacket | UINT16    readCRC;     //CRC read from the end of the subpacket | 
| 57 | long int  dataLength; | long int  dataLength; | 
| 58 |  | int vars; | 
| 59 |  |  | 
| 60 | //the 2 bytes subtracted belong to the final event CRC bytes | //the 2 bytes subtracted belong to the final event CRC bytes | 
| 61 | dataLength = length - (long int)2; | dataLength = length - (long int)2; | 
| 68 | InputFile->read(eventCRC, sizeof(eventCRC)); | InputFile->read(eventCRC, sizeof(eventCRC)); | 
| 69 | readCRC = (((UINT16)(eventCRC[0]<<8))&0xFF00) + (((UINT16)eventCRC[1])&0x00FF); | readCRC = (((UINT16)(eventCRC[0]<<8))&0xFF00) + (((UINT16)eventCRC[1])&0x00FF); | 
| 70 |  |  | 
| 71 | //finally check if the RecordCRC is correct and finally update the partialCRC | //if (subCRC != readCRC) throw WrongCRCException(" Wrong CRC for VarDump Packet "); | 
| 72 | if (subCRC == readCRC){ | /*Pamela CPU group request to disable for a while CRC control to check values because | 
| 73 | VarDumpRecord* rec; | the data seems to be well formatted but perhaps there is just a mistake on CRC calulus | 
| 74 | VarDump->Records->Clear(); | into the PAMELA CPU program | 
| 75 | TClonesArray &recs = *(VarDump->Records); | */ | 
| 76 | rec = new(recs[0]) VarDumpRecord(); //add a new TabDump | if (subCRC != readCRC) { | 
| 77 | memcpy(rec->Data, subData, dataLength); | logger->error(" Wrong CRC for VarDump Packet but I process it anyway because of CPU DEBUG"); | 
|  | free(subData); |  | 
|  | } else { |  | 
|  | cat <<  log4cpp::Priority::ERROR |  | 
|  | <<  "Wrong CRC in VarDump Packet " |  | 
|  | <<  "\n " << log4cpp::CategoryStream::ENDLINE; |  | 
| 78 | } | } | 
| 79 |  |  | 
| 80 |  | VarDumpRecord* rec; | 
| 81 |  | VarDump->PARAMETER_STAMP = (((UINT32)subData[0]<<24)&0xFF000000) + (((UINT32)subData[1]<<16)&0x00FF0000) +  (((UINT32)subData[2]<<8)&0x0000FF00) + (((UINT32)subData[3])&0x000000FF); | 
| 82 |  | VarDump->Records->Clear(); | 
| 83 |  | TClonesArray &recs = *(VarDump->Records); | 
| 84 |  |  | 
| 85 |  | int offset = 4; | 
| 86 |  | int j = 0; | 
| 87 |  | while (offset < dataLength){ | 
| 88 |  | rec             = new(recs[j++]) VarDumpRecord(); //add a new VarDump | 
| 89 |  | rec->VAR_ID     = subData[offset]; | 
| 90 |  | rec->VAR_VALUE  = (((UINT32)subData[1+offset]<<24)&0xFF000000) + (((UINT32)subData[2+offset]<<16)&0x00FF0000) +  (((UINT32)subData[3+offset]<<8)&0x0000FF00) + (((UINT32)subData[4+offset])&0x000000FF); | 
| 91 |  | offset = offset + 5; | 
| 92 |  | } | 
| 93 |  |  | 
| 94 |  | delete [] subData; | 
| 95 | } | } | 
| 96 |  |  |