| 1 | /** @file | /** @file | 
| 2 | * $Source: /home/cvspamela/yoda/techmodel/TmtcReader.cpp,v $ | * $Source: /home/cvsmanager/yoda/techmodel/TmtcReader.cpp,v $ | 
| 3 | * $Id: TmtcReader.cpp,v 1.8 2004/04/28 09:01:27 nagni Exp $ | * $Id: TmtcReader.cpp,v 2.0 2004/09/21 20:50:54 kusanagi Exp $ | 
| 4 | * $Author: nagni $ | * $Author: kusanagi $ | 
| 5 | * | * | 
| 6 | * Implementation of the TmtcReader class. | * Implementation of the TmtcReader class. | 
| 7 | * ToBeDone: | * ToBeDone: | 
| 8 | * Control the CRC for the entire data Packet not just for single records | * Control the CRC for the entire data Packet not just for single records | 
| 9 | */ | */ | 
| 10 |  |  | 
|  |  |  | 
|  |  |  | 
|  |  |  | 
| 11 | #include <string> | #include <string> | 
| 12 | #include <log4cpp/Category.hh> | #include <log4cxx/logger.h> | 
| 13 | extern "C" { | extern "C" { | 
| 14 | #include <sys/time.h> | #include <sys/time.h> | 
| 15 | #include "CRC.h" | #include "CRC.h" | 
| 24 | using namespace pamela; | using namespace pamela; | 
| 25 | using namespace pamela::techmodel; | using namespace pamela::techmodel; | 
| 26 |  |  | 
| 27 | static log4cpp::Category& cat = log4cpp::Category::getInstance("pamela.techmodel.TmtcReader"); | static log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(_T("pamela.techmodel.TmtcReader")); | 
| 28 |  |  | 
| 29 | /** | /** | 
| 30 | * Constructor. | * Constructor. | 
| 31 | */ | */ | 
| 32 | TmtcReader::TmtcReader(void): | TmtcReader::TmtcReader(void): | 
| 33 | TechmodelAlgorithm(PacketType::Tmtc, "TechmodelTmtcReader") { | TechmodelAlgorithm(PacketType::Tmtc, "TechmodelTmtcReader") { | 
| 34 | cat <<  log4cpp::Priority::DEBUG | logger->debug(_T("Constructor")); | 
|  | <<  "Constructor " |  | 
|  | <<  "\n " << log4cpp::CategoryStream::ENDLINE; |  | 
| 35 | Tmtc = new TmtcEvent(); | Tmtc = new TmtcEvent(); | 
| 36 | } | } | 
| 37 |  |  | 
| 40 | */ | */ | 
| 41 | std::string TmtcReader::GetVersionInfo(void) const { | std::string TmtcReader::GetVersionInfo(void) const { | 
| 42 | return | return | 
| 43 | "$Header: /home/cvspamela/yoda/techmodel/TmtcReader.cpp,v 1.8 2004/04/28 09:01:27 nagni Exp $\n"; | "$Header: /home/cvsmanager/yoda/techmodel/TmtcReader.cpp,v 2.0 2004/09/21 20:50:54 kusanagi Exp $\n"; | 
| 44 | } | } | 
| 45 |  |  | 
| 46 | /** | /** | 
| 55 | /** | /** | 
| 56 | * Unpack the Tmtc event from an input file. | * Unpack the Tmtc event from an input file. | 
| 57 | */ | */ | 
| 58 | void TmtcReader::RunEvent(int EventNumber, long int length) { | void TmtcReader::RunEvent(int EventNumber, long int length) throw (WrongCRCException){ | 
| 59 |  |  | 
| 60 | /* | /* | 
| 61 | //Just to test crc | //Just to test crc | 
| 69 | */ | */ | 
| 70 |  |  | 
| 71 | int i, j; | int i, j; | 
| 72 | char buff[TMTC_SUB_LENGTH]; | char subData[TMTC_SUB_LENGTH]; | 
| 73 | char CRCbuff[TMTC_SUBCRC_LENGTH]; | char CRCbuff[TMTC_SUBCRC_LENGTH]; | 
| 74 | char eventCRC[TMTC_CRC_LENGTH]; | char eventCRC[TMTC_CRC_LENGTH]; | 
| 75 | int numRecords = (length-TMTC_CRC_LENGTH)/(TMTC_SUB_LENGTH + TMTC_SUBCRC_LENGTH); //subtract the last two bytes because are the final CRC | int numRecords = (length-TMTC_CRC_LENGTH)/(TMTC_SUB_LENGTH + TMTC_SUBCRC_LENGTH); //subtract the last two bytes because are the final CRC | 
| 76 | long int start; | long int start; | 
| 77 |  |  | 
| 78 |  | TmtcRecord* rec; | 
| 79 | Tmtc->Records->Clear(); | Tmtc->Records->Clear(); | 
| 80 | TClonesArray &recs = *(Tmtc->Records); | TClonesArray &recs = *(Tmtc->Records); | 
| 81 | TmtcRecord* rec; |  | 
| 82 | UINT16    partialCRC = 0; //partial CRC updated as mcmd packet is read (to compare with the last two bytes of this event) | UINT16    partialCRC = 0; //partial CRC updated as mcmd packet is read (to compare with the last two bytes of this event) | 
| 83 | UINT16    readCRC = 0;    //partial CRC updated as mcmd packet is read (to compare with the last two bytes of this event) | UINT16    readCRC = 0;    //partial CRC updated as mcmd packet is read (to compare with the last two bytes of this event) | 
|  | int oldSize = recs.GetSize(); |  | 
|  | recs.ExpandCreate(oldSize+numRecords-1); |  | 
| 84 |  |  | 
| 85 |  | /*    char tempData[length-TMTC_CRC_LENGTH]; | 
| 86 |  | InputFile->read(tempData, sizeof(tempData)); | 
| 87 |  | partialCRC = CM_Compute_CRC16(0, (UINT8*)tempData, (length-TMTC_CRC_LENGTH)); | 
| 88 |  | */ | 
| 89 |  |  | 
| 90 | for(i = 0; i < numRecords; i++) { | for(i = 0; i < numRecords; i++) { | 
| 91 | start = InputFile->tellg(); | start = InputFile->tellg(); | 
| 92 | InputFile->read(buff, sizeof(buff)); | InputFile->read(subData, sizeof(subData)); | 
| 93 | InputFile->read(CRCbuff, sizeof(CRCbuff)); | InputFile->read(CRCbuff, sizeof(CRCbuff)); | 
|  |  |  | 
|  | /*for (int jj = 0; jj < TMTC_SUB_LENGTH ; jj++){ |  | 
|  | partialCRC = CM_Compute_CRC8_8((char)partialCRC, (unsigned char*)buff[jj], 1); |  | 
|  | }*/ |  | 
| 94 |  |  | 
| 95 | partialCRC = CM_Compute_CRC16(partialCRC, (UINT8*)&buff, TMTC_SUB_LENGTH); | /*    for (int jj = 0; jj < TMTC_SUB_LENGTH ; jj++){ | 
| 96 |  | partialCRC = CM_Compute_CRC16(0, (UINT8*)tempData, (length-TMTC_CRC_LENGTH)); | 
| 97 |  | } | 
| 98 |  | */ | 
| 99 |  |  | 
| 100 |  | partialCRC = CM_Compute_CRC16(partialCRC, (UINT8*)&subData, TMTC_SUB_LENGTH); | 
| 101 | partialCRC = CM_Compute_CRC16(partialCRC, (UINT8*)&CRCbuff, TMTC_SUBCRC_LENGTH); | partialCRC = CM_Compute_CRC16(partialCRC, (UINT8*)&CRCbuff, TMTC_SUBCRC_LENGTH); | 
| 102 |  |  | 
| 103 | //This == CRCBuff is not really parametric take care if have to change the static lengths | //This == CRCBuff is not really parametric take care if have to change the static lengths | 
| 104 | if((UINT8)(CM_Compute_CRC16(0, (UINT8*)&buff, TMTC_SUB_LENGTH)) == (UINT8)CRCbuff[0]){ | if((UINT8)(CM_Compute_CRC16(0, (UINT8*)&subData, TMTC_SUB_LENGTH)) == (UINT8)CRCbuff[0]){ | 
| 105 | rec = new TmtcRecord(); //add a new TmtcRecord | rec = new(recs[i]) TmtcRecord(); //add a new TmtcRecord | 
| 106 | rec->TM_RECORD_OBT = (((UINT32)buff[0]<<24)&0xFF000000) + (((UINT32)buff[1]<<16)&0x00FF0000) +  (((UINT32)buff[2]<<8)&0x0000FF00) + ((UINT32)buff[3])&0x000000FF; | rec->TM_RECORD_OBT = (((UINT32)subData[0]<<24)&0xFF000000) + (((UINT32)subData[1]<<16)&0x00FF0000) +  (((UINT32)subData[2]<<8)&0x0000FF00) + ((UINT32)subData[3])&0x000000FF; | 
| 107 |  |  | 
| 108 | for(j = 0; j < 16; j++) { | for(j = 0; j < 16; j++) { | 
| 109 | rec->TM_DEA_ANA[j]   = (((UINT16)buff[4+j]<<8)&0xFF00) + (((UINT16)buff[5+j])&0x00FF); | rec->TM_DEA_ANA[j]   = (((UINT16)subData[4+j]<<8)&0xFF00) + (((UINT16)subData[5+j])&0x00FF); | 
| 110 | rec->TM_DEA_ANA_P[j] = (float)(rec->TM_DEA_ANA[j]*0.02); | rec->TM_DEA_ANA_P[j] = (float)(rec->TM_DEA_ANA[j]*0.02); | 
| 111 |  |  | 
| 112 | rec->TM_TH_ANA[j]    = buff[36+j]; //36 is the size of TM_DEA_ANA + OBT | rec->TM_TH_ANA[j]    = subData[36+j]; //36 is the size of TM_DEA_ANA + OBT | 
| 113 | rec->TM_TH_ANA_P[j]  = convert_th(rec->TM_TH_ANA[j]); | rec->TM_TH_ANA_P[j]  = convert_th(rec->TM_TH_ANA[j]); | 
| 114 | } | } | 
| 115 |  |  | 
| 116 | rec->TM_BIL_DIAG_ACQ =  buff[53]; | rec->TM_BIL_DIAG_ACQ =  subData[53]; | 
| 117 | rec->TM_CC_DIAG_ACQ  =  (((UINT32)buff[54]<<24)&0xFF000000) + (((UINT32)buff[55]<<16)&0x00FF0000) +  (((UINT32)buff[56]<<8)&0x0000FF00) + ((UINT32)buff[57])&0x000000FF; | rec->TM_CC_DIAG_ACQ  =  (((UINT32)subData[54]<<24)&0xFF000000) + (((UINT32)subData[55]<<16)&0x00FF0000) +  (((UINT32)subData[56]<<8)&0x0000FF00) + ((UINT32)subData[57])&0x000000FF; | 
|  | recs.AddAt(&(*rec), oldSize+i); |  | 
| 118 | } else { | } else { | 
| 119 | cat <<  log4cpp::Priority::ERROR | stringstream oss; | 
| 120 | <<  "Wrong CRC on Subpacket int TMTC Packet starting at position " << start | oss.str(""); | 
| 121 | <<  "\n " << log4cpp::CategoryStream::ENDLINE; | oss << "Wrong CRC on Subpacket int TMTC Packet starting at position" | 
| 122 |  | << start; | 
| 123 |  | logger->warn(oss.str().c_str()); | 
| 124 | } | } | 
| 125 | } | } | 
| 126 | InputFile->read(eventCRC, sizeof(eventCRC)); | InputFile->read(eventCRC, sizeof(eventCRC)); | 
| 127 | readCRC = (((UINT16)(eventCRC[0]<<8))&0xFF00) + (((UINT16)eventCRC[1])&0x00FF); | readCRC = (((UINT16)(eventCRC[0]<<8))&0xFF00) + (((UINT16)eventCRC[1])&0x00FF); | 
| 128 | if(!(partialCRC == readCRC)) { | if(partialCRC != readCRC) throw WrongCRCException(" Wrong Global CRC for TMTC Packet "); | 
|  | cat <<  log4cpp::Priority::ERROR |  | 
|  | <<  "The test of calculated CRC with one wrote on file FAILED!!" |  | 
|  | <<  "\n " << log4cpp::CategoryStream::ENDLINE; |  | 
|  | } |  | 
| 129 | } | } | 
| 130 |  |  | 
| 131 |  |  |