/** @file * $Source: /home/cvsmanager/yoda/techmodel/TmtcReader.cpp,v $ * $Id: TmtcReader.cpp,v 1.1.1.1 2004/07/06 12:20:23 kusanagi Exp $ * $Author: kusanagi $ * * Implementation of the TmtcReader class. * ToBeDone: * Control the CRC for the entire data Packet not just for single records */ #include #include extern "C" { #include #include "CRC.h" } #include #include "stdio.h" #include "ReaderAlgorithms.h" #include "event/tmtc/TmtcRecord.h" using namespace pamela; using namespace pamela::techmodel; static log4cpp::Category& cat = log4cpp::Category::getInstance("pamela.techmodel.TmtcReader"); /** * Constructor. */ TmtcReader::TmtcReader(void): TechmodelAlgorithm(PacketType::Tmtc, "TechmodelTmtcReader") { cat << log4cpp::Priority::DEBUG << "Constructor " << "\n " << log4cpp::CategoryStream::ENDLINE; Tmtc = new TmtcEvent(); } /** * Get a string with the version info of the algorithm. */ std::string TmtcReader::GetVersionInfo(void) const { return "$Header: /home/cvsmanager/yoda/techmodel/TmtcReader.cpp,v 1.1.1.1 2004/07/06 12:20:23 kusanagi Exp $\n"; } /** * Initialize the algorithm with a special run. This will initialize the * event reader routines for all packet types. */ void TmtcReader::Init(PamelaRun *run) { SetInputStream(run); run->WriteSubPacket(this, &Tmtc, Tmtc->Class()); } /** * Unpack the Tmtc event from an input file. */ void TmtcReader::RunEvent(int EventNumber, long int length) { /* //Just to test crc char tempbuff[length]; InputFile->read(tempbuff, sizeof(tempbuff)); UINT16 subCRC = 0; for (int jj = 0; jj < length ; jj++){ subCRC = CM_Compute_CRC16(subCRC, (BYTE*)(tempbuff+jj), 1); } //Just to test crc */ int i, j; char subData[TMTC_SUB_LENGTH]; char CRCbuff[TMTC_SUBCRC_LENGTH]; char eventCRC[TMTC_CRC_LENGTH]; int numRecords = (length-TMTC_CRC_LENGTH)/(TMTC_SUB_LENGTH + TMTC_SUBCRC_LENGTH); //subtract the last two bytes because are the final CRC long int start; TmtcRecord* rec; Tmtc->Records->Clear(); TClonesArray &recs = *(Tmtc->Records); UINT16 partialCRC = 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) /* char tempData[length-TMTC_CRC_LENGTH]; InputFile->read(tempData, sizeof(tempData)); partialCRC = CM_Compute_CRC16(0, (UINT8*)tempData, (length-TMTC_CRC_LENGTH)); */ for(i = 0; i < numRecords; i++) { start = InputFile->tellg(); InputFile->read(subData, sizeof(subData)); InputFile->read(CRCbuff, sizeof(CRCbuff)); /* for (int jj = 0; jj < TMTC_SUB_LENGTH ; jj++){ partialCRC = CM_Compute_CRC16(0, (UINT8*)tempData, (length-TMTC_CRC_LENGTH)); } */ partialCRC = CM_Compute_CRC16(partialCRC, (UINT8*)&subData, TMTC_SUB_LENGTH); partialCRC = CM_Compute_CRC16(partialCRC, (UINT8*)&CRCbuff, TMTC_SUBCRC_LENGTH); //This == CRCBuff is not really parametric take care if have to change the static lengths if((UINT8)(CM_Compute_CRC16(0, (UINT8*)&subData, TMTC_SUB_LENGTH)) == (UINT8)CRCbuff[0]){ rec = new(recs[i]) TmtcRecord(); //add a new TmtcRecord rec->TM_RECORD_OBT = (((UINT32)subData[0]<<24)&0xFF000000) + (((UINT32)subData[1]<<16)&0x00FF0000) + (((UINT32)subData[2]<<8)&0x0000FF00) + ((UINT32)subData[3])&0x000000FF; for(j = 0; j < 16; j++) { rec->TM_DEA_ANA[j] = (((UINT16)subData[4+j]<<8)&0xFF00) + (((UINT16)subData[5+j])&0x00FF); rec->TM_DEA_ANA_P[j] = (float)(rec->TM_DEA_ANA[j]*0.02); rec->TM_TH_ANA[j] = subData[36+j]; //36 is the size of TM_DEA_ANA + OBT rec->TM_TH_ANA_P[j] = convert_th(rec->TM_TH_ANA[j]); } rec->TM_BIL_DIAG_ACQ = subData[53]; rec->TM_CC_DIAG_ACQ = (((UINT32)subData[54]<<24)&0xFF000000) + (((UINT32)subData[55]<<16)&0x00FF0000) + (((UINT32)subData[56]<<8)&0x0000FF00) + ((UINT32)subData[57])&0x000000FF; //free(subData); } else { cat << log4cpp::Priority::ERROR << "Wrong CRC on Subpacket int TMTC Packet starting at position " << start << "\n " << log4cpp::CategoryStream::ENDLINE; } } InputFile->read(eventCRC, sizeof(eventCRC)); readCRC = (((UINT16)(eventCRC[0]<<8))&0xFF00) + (((UINT16)eventCRC[1])&0x00FF); if(!(partialCRC == readCRC)) { cat << log4cpp::Priority::ERROR << "The test of calculated CRC with one wrote on file FAILED!!" << "\n " << log4cpp::CategoryStream::ENDLINE; } } float TmtcReader::convert_th(int TH) { float a,q,deltax,deltay; static int chiama_fun=0; float gradi[22],grado=-1; int adc[22]={4095, 4036,2976,2213,1662,1259,983,742,576,450, 354, 281,224,179,145, 117 ,95, 77, 64, 52, 43, 35}; int maxpos=-1,minpos=-1,i; chiama_fun++; for (i=0;i<22;i++) { gradi[i]=-35+(i*5); } if (TH==4095) { grado=-35.; } else { for (i=0;i<22;i++) { if (TH>=adc[i]) { minpos=i; maxpos=i-1; break; } } // grado=gradi[maxpos]-1./(adc[maxpos]-adc[minpos])*((float)TH-(float)adc[maxpos]) ; deltax=adc[maxpos]-adc[minpos]; deltay=gradi[maxpos]-gradi[minpos]; a=deltay/deltax; q=gradi[maxpos]-a*adc[maxpos]; grado=a*TH+q; } return (grado); }