##// END OF EJS Templates
class gresb fully functional, writeSPW function not tested yet
class gresb fully functional, writeSPW function not tested yet

File last commit:

r9:bf36b48e03cd default
r9:bf36b48e03cd default
Show More
rmapplugin.cpp
286 lines | 10.5 KiB | text/x-c | CppLexer
/*------------------------------------------------------------------------------
-- This file is a part of the LPPMON Software
-- Copyright (C) 2012, Laboratory of Plasma Physics - CNRS
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 3 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program; if not, write to the Free Software
-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-------------------------------------------------------------------------------*/
/*-- Author : Paul LEROY
-- Mail : paul.leroy@lpp.polytechnique.fr
----------------------------------------------------------------------------*/
#include "rmapplugin.h"
#include <QHostAddress>
#include <QIODevice>
#include <QApplication>
#include <rmappluginpythonwrapper.h>
rmapplugin::rmapplugin(QWidget *parent)
:lppmonplugin(parent,false)
{
this->UI = new rmapPluginUI();
this->setWindowTitle(tr("RMAP and SPW Communication"));
this->setWidget((QWidget*)this->UI);
timeCode = 0;
time_COARSE = 0;
time_FINE = 0;
currentBridge = selectedBridgeIsUnknown;
/*Python wrapper*/
this->pyObject = new rmappluginPythonWrapper();
connect(this->pyObject,SIGNAL(ReadSig(uint*,uint,uint)),this,SLOT(Read(uint*,uint,uint)));
connect(this->pyObject,SIGNAL(WriteSig(uint*,uint,uint)),this,SLOT(Write(uint*,uint,uint)));
/*==============*/
connect(UI->rmapOpenCommunicationButton, SIGNAL(clicked()), this, SLOT(openBridge()));
connect(UI->rmapCloseCommunicationButton, SIGNAL(clicked()), this, SLOT(closeBridge()));
// CCSDS
connect(this->UI->sendCCSDSCommandButton, SIGNAL(clicked()), this, SLOT(sendCCSDS()));
connect(this->UI->send_TC_LFR_UPDATE_TIME_Button, SIGNAL(clicked()), this, SLOT(send_TC_LFR_UPDATE_TIME()));
connect(this->UI->reset_TC_LFR_UPDATE_TIME_Button, SIGNAL(clicked()), this, SLOT(reset_TC_LFR_UPDATE_TIME()));
// spectralMAtricesDMASimulator
connect(this->UI->spectralMatricesDMASimulator, SIGNAL(rmapplugginRead(uint*,uint,uint)), this, SLOT(Read(uint*,uint,uint)));
connect(this->UI->spectralMatricesDMASimulator, SIGNAL(rmapplugginWrite(uint*,uint,uint)), this, SLOT(Write(uint*,uint,uint)));
connect(this->UI->spectralMatricesDMASimulator, SIGNAL(sendMessage(QString)), this, SLOT(displayOnConsole(QString)));
// GRESB
connect(this->UI->gresbBridge, SIGNAL(sendMessage(QString)), this, SLOT(displayOnConsole(QString)));
connect(this->UI->gresbBridge, SIGNAL(isOpen(bool)), this, SLOT(activatePlugin(bool)));
connect(this->UI->gresbBridge, SIGNAL(RMAP_write_reply_setText(QString)), this, SLOT(RMAP_write_reply_setText(QString)));
connect(this->UI->gresbBridge, SIGNAL(appendToLog(QString)), this, SLOT(appendToLog(QString)));
// Star Dundee
connect(this->UI->starDundee, SIGNAL(sendMessage(QString)), this, SLOT(displayOnConsole(QString)));
connect(this->UI->starDundee, SIGNAL(isOpen(bool)), this, SLOT(activatePlugin(bool)));
connect(this->UI->starDundee, SIGNAL(RMAP_write_reply_setText(QString)), this, SLOT(RMAP_write_reply_setText(QString)));
connect(this->UI->starDundee, SIGNAL(appendToLog(QString)), this, SLOT(appendToLog(QString)));
connect(this->UI, SIGNAL(bridgeHasChanged(selectedBridge)), this, SLOT(bridgeHasChanged(selectedBridge)));
}
rmapplugin::~rmapplugin()
{
if (!RMAPSend_SOCKET->isOpen()) RMAPSend_SOCKET->disconnectFromHost();
if (!RMAPReceive_SOCKET->isOpen()) RMAPReceive_SOCKET->disconnectFromHost();
if (!GRESBStatusQuery_SOCKET->isOpen()) GRESBStatusQuery_SOCKET->disconnectFromHost();
}
unsigned int rmapplugin::Write(unsigned int *Value, unsigned int count, unsigned int address)
{
unsigned int result;
switch(currentBridge)
{
case selectedBridgeIsGRESB :
result = UI->gresbBridge->Write(Value, count, address);
break;
case selectedBridgeIsStarDundee :
result = UI->starDundee->Write(Value, count, address);
break;
default:
result = 1;
break;
}
return result;
}
unsigned int rmapplugin::Read(unsigned int *Value, unsigned int count, unsigned int address)
{
unsigned int result;
switch(currentBridge)
{
case selectedBridgeIsGRESB :
result = UI->gresbBridge->Read(Value, count, address);
break;
case selectedBridgeIsStarDundee :
result = UI->starDundee->Read(Value, count, address);
break;
default:
result = 1;
break;
}
return result;
}
////////
// SLOTS
unsigned int rmapplugin::WriteSPW(char *Value, unsigned int count, char targetLogicalAddress, char userApplication) // SLOT
{
unsigned int result;
switch(currentBridge)
{
case selectedBridgeIsGRESB :
result = UI->gresbBridge->WriteSPW(Value, count, targetLogicalAddress, userApplication);
break;
case selectedBridgeIsStarDundee :
result = UI->starDundee->WriteSPW(Value, count, targetLogicalAddress, userApplication);
break;
default:
result = 1;
break;
}
return result;
}
void rmapplugin::sendCCSDS() // SLOT
{
unsigned int nbBYTES_application_data = 8;
unsigned int count;
char *tab;
unsigned char packetErrorControl1 = 0xaa;
unsigned char packetErrorControl0 = 0xbb;
ccsds_command = new ccsds(1, 0, 0, nbBYTES_application_data+12, 0, 0, 0, 0, 0); // +12 => packet header 6 bytes + data field header 4 bytes + packet error control 2 bytes
/* unsigned char data_field_header,
unsigned char processID,
unsigned int sequence_count,
unsigned int packet_length,
unsigned char acceptance,
unsigned int completion,
unsigned char service_type,
unsigned char service_subtype,
unsigned char sourceID*/
count = nbBYTES_application_data+12; // 12 is the size in bytes of the header
tab = (char*) malloc(count);
tab[0] = ccsds_command->ccsds_header->packetId1;
tab[1] = ccsds_command->ccsds_header->packetId0;
tab[2] = ccsds_command->ccsds_header->packetSequenceControl1;
tab[3] = ccsds_command->ccsds_header->packetSequenceControl0;
tab[4] = ccsds_command->ccsds_header->packetLength1;
tab[5] = ccsds_command->ccsds_header->packetLength0;
tab[6] = ccsds_command->ccsds_header->dataFieldHeader3;
tab[7] = ccsds_command->ccsds_header->dataFieldHeader2;
tab[8] = ccsds_command->ccsds_header->dataFieldHeader1;
tab[9] = ccsds_command->ccsds_header->dataFieldHeader0;
tab[10]=0x00;
tab[11]=0x00;
tab[12]=0x00;
tab[13]=0x00;
tab[14]=0x00;
tab[15]=0x00;
tab[nbBYTES_application_data+10] = packetErrorControl1;
tab[nbBYTES_application_data+11] = packetErrorControl0;
WriteSPW(tab, count, UI->CCSDSTargetLogicalAddressSpinBox->value(), 0x00);
free(tab);
}
void rmapplugin::openBridge()
{
switch(currentBridge)
{
case selectedBridgeIsGRESB :
this->UI->gresbBridge->Open();
break;
case selectedBridgeIsStarDundee :
this->UI->starDundee->Open();
break;
default:
break;
}
}
void rmapplugin::closeBridge()
{
switch(currentBridge)
{
case selectedBridgeIsGRESB :
this->UI->gresbBridge->Close();
break;
case selectedBridgeIsStarDundee :
this->UI->starDundee->Close();
break;
default:
break;
}
}
void rmapplugin::send_TC_LFR_UPDATE_TIME()
{
unsigned int nbBYTES_application_data = 6; // Time at CUC format is on 48 bits / 6 bytes
unsigned int count;
char *tab;
unsigned char packetErrorControl1 = 0xaa;
unsigned char packetErrorControl0 = 0xbb;
ccsds_command = new ccsds(1, 11, 0, nbBYTES_application_data, 1, 1, 9, 129, 0);
/* unsigned char data_field_header,
unsigned char processID,
unsigned int sequence_count,
unsigned int packet_length,
unsigned char acceptance,
unsigned int completion,
unsigned char service_type,
unsigned char service_subtype,
unsigned char sourceID*/
count = nbBYTES_application_data+12; // +12 => packet header 6 bytes + data field header 4 bytes + packet error control 2 bytes
tab = (char*) malloc(count);
tab[0] = ccsds_command->ccsds_header->packetId1;
tab[1] = ccsds_command->ccsds_header->packetId0;
tab[2] = ccsds_command->ccsds_header->packetSequenceControl1;
tab[3] = ccsds_command->ccsds_header->packetSequenceControl0;
tab[4] = ccsds_command->ccsds_header->packetLength1;
tab[5] = ccsds_command->ccsds_header->packetLength0;
tab[6] = ccsds_command->ccsds_header->dataFieldHeader3;
tab[7] = ccsds_command->ccsds_header->dataFieldHeader2;
tab[8] = ccsds_command->ccsds_header->dataFieldHeader1;
tab[9] = ccsds_command->ccsds_header->dataFieldHeader0;
tab[10] = (unsigned char) (time_COARSE>>24);
tab[11] = (unsigned char) (time_COARSE>>18);
tab[12] = (unsigned char) (time_COARSE>>8);
tab[13] = (unsigned char) (time_COARSE);
tab[14] = (unsigned char) (time_FINE>>8);
tab[15] = (unsigned char) (time_FINE);
tab[nbBYTES_application_data+10] = packetErrorControl1;
tab[nbBYTES_application_data+11] = packetErrorControl0;
WriteSPW(tab, count, UI->CCSDSTargetLogicalAddressSpinBox->value(), 0x00);
time_COARSE = time_COARSE+1;
free(tab);
}
void rmapplugin::reset_TC_LFR_UPDATE_TIME()
{
time_COARSE = 0;
time_FINE = 0;
}
void rmapplugin::RMAP_write_reply_setText(QString text)
{
this->UI->RMAP_write_reply->setText(text);
}
void rmapplugin::appendToLog(QString text)
{
APPENDTOLOG(text);
}
/////////////////////
// INTERNAL FUNCTIONS
void rmapplugin::gresbSelection(bool flag)
{
if (flag == true) UI->selection_GROUPBOX->setEnabled(false);
if (flag == false) UI->selection_GROUPBOX->setEnabled(true);
}