##// END OF EJS Templates
changes on the gresb class, object ready for usage in the rmapplugin
changes on the gresb class, object ready for usage in the rmapplugin

File last commit:

r7:7c1589fec151 default
r7:7c1589fec151 default
Show More
spwpacketreceiver.cpp
113 lines | 4.5 KiB | text/x-c | CppLexer
#include "spwpacketreceiver.h"
#include <QTime>
#include "rmapoperations.h"
spwpacketreceiver::spwpacketreceiver(QObject *parent) :
QObject(parent)
{
rmapPacketSEMAPHORE = new QSemaphore;
ccsdsPacketSEMAPHORE = new QSemaphore;
rmapPacket = (char*) malloc(RMAP_MAX_PACKET_LENGTH);
ccsdsPacket = (unsigned char*) malloc(CCSDS_MAX_PACKET_LENGTH);
spwPacket = (char*) malloc( qMax(RMAP_MAX_PACKET_LENGTH, CCSDS_MAX_PACKET_LENGTH) );
connect(this, SIGNAL(ccsdsPacketAvailable(unsigned char*,uint)), this, SLOT(processCCSDSPacket(unsigned char*,uint)));
}
spwpacketreceiver::~spwpacketreceiver()
{
free(rmapPacket);
free(ccsdsPacket);
free(spwPacket);
}
int spwpacketreceiver::receiveSPWPacket(unsigned char requestID) // SLOT
{
QTime spwPacketReceiverTimeout;
// GRESB HEADER
char RES_TR_EP; // 6 bits REserved + 1 bit TRuncated + 1 bit EP error end of packet
unsigned char packetLength2;
unsigned char packetLength1;
unsigned char packetLength0;
unsigned int packetLength;
if (requestID==1)
{
if (rmapPacketSEMAPHORE->available()) return rmapPacketSize;
}
gresbReceptionSocket->blockSignals(1); // block the signals of the socket during packet reception
// READ THE GRESB HEADER OF THE INCOMING PACKET
spwPacketReceiverTimeout.start();
while(gresbReceptionSocket->bytesAvailable() < 4)
{
gresbReceptionSocket->waitForReadyRead(100);
if(spwPacketReceiverTimeout.elapsed()>1000) return -1; // ERROR === read GRSEB header TIMEOUT
}
gresbReceptionSocket->read(&RES_TR_EP, 1);
gresbReceptionSocket->read( (char*) &packetLength2, 1);
gresbReceptionSocket->read( (char*) &packetLength1, 1);
gresbReceptionSocket->read( (char*) &packetLength0, 1);
packetLength = (packetLength2<<16) + (packetLength1<<8) + (packetLength0);
spwPacket = (char*) malloc(packetLength);
// READ THE SPW PACKET
while(gresbReceptionSocket->bytesAvailable() < packetLength)
{
gresbReceptionSocket->waitForReadyRead(100);
if(spwPacketReceiverTimeout.elapsed()>1000) return -2; // ERROR === read SPW packet TIMEOUT
}
gresbReceptionSocket->read( spwPacket, packetLength );
gresbReceptionSocket->blockSignals(0);
switch(spwPacket[1]) // byte 1 is the protocole identifier in the SPW packet
{
case 1: // 0x01 is the protocole identifier for RMAP packets
if (rmapPacketSEMAPHORE->available()!=0) return -3; // ERROR === previous RMAP packet not processed yet
for(unsigned int i=0; i<packetLength; i++) rmapPacket[i] = spwPacket[i];
rmapPacketSize = packetLength;
rmapPacketSEMAPHORE->release();
//emit sendMessage("RMAP packet of size " + QString::number(packetLength) + " received");
return packetLength;
case 2: // 0x02 is the protocole identifier for CCSDS packets
if (ccsdsPacketSEMAPHORE->available()!=0) return -4; // ERROR === previous CCSDS packet not processed yet
for(unsigned int i=0; i<packetLength; i++) ccsdsPacket[i] = spwPacket[i];
ccsdsPacketSize = packetLength;
ccsdsPacketSEMAPHORE->release();
emit(ccsdsPacketAvailable(ccsdsPacket, packetLength));
return packetLength;
}
return 0;
}
void spwpacketreceiver::processCCSDSPacket(unsigned char *ccsdsPacket, unsigned int size) // SLOT
{
QString message;
unsigned int fine_time_value = 0;
fine_time_value = ((unsigned int) ccsdsPacket[7]<<24)
+ ((unsigned int) ccsdsPacket[6]<<16)
+ ((unsigned int) ccsdsPacket[5]<<8)
+ ((unsigned int) ccsdsPacket[4]);
message.append(QTime::currentTime().toString() +":" + QString::number(QTime::currentTime().msec()) + ": ");
message.append("size "
+ QString::number(size)
+" *** header "
+ QString::number(ccsdsPacket[0], 16)
+ " "
+ QString::number(ccsdsPacket[1], 16)
+ " "
+ QString::number(ccsdsPacket[2], 16)
+ " "
+ QString::number(ccsdsPacket[3], 16)
+ " *** coarse time "
+ QString::number(fine_time_value));
//+ QString::number(ccsdsPacket[4], 16)
//+" "
//+ QString::number(ccsdsPacket[5], 16)
//+" "
//+ QString::number(ccsdsPacket[6], 16)
//+" "
//+ QString::number(ccsdsPacket[7], 16));
ccsdsPacketSEMAPHORE->acquire();
emit sendMessage(message);
}