gr_esb_bridge.cpp
514 lines
| 18.0 KiB
| text/x-c
|
CppLexer
Jeandet Alexis
|
r27 | /*------------------------------------------------------------------------------ | ||
-- This file is a part of the SocExplorer Software | ||||
-- Copyright (C) 2014, Plasma Physics Laboratory - 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 : Alexis Jeandet | ||||
-- Mail : alexis.jeandet@member.fsf.org | ||||
----------------------------------------------------------------------------*/ | ||||
Jeandet Alexis
|
r22 | #include "gr_esb_bridge.h" | ||
#include "gr_esb_ui.h" | ||||
Jeandet Alexis
|
r24 | #include <unistd.h> | ||
Jeandet Alexis
|
r25 | #include "spw.h" | ||
#include <socexplorerengine.h> | ||||
Jeandet Alexis
|
r22 | |||
GR_ESB_bridge::GR_ESB_bridge(socexplorerplugin *parent) : | ||||
abstractSpwBridge(parent) | ||||
{ | ||||
this->p_GUI = new GR_ESB_ui(); | ||||
Jeandet Alexis
|
r25 | this->manager = new GR_ESB_Manager(parent,this); | ||
Jeandet Alexis
|
r24 | connect((GR_ESB_ui*)(this->p_GUI),SIGNAL(ipchanged(QString)),this,SLOT(setIP(QString))); | ||
Jeandet Alexis
|
r25 | connect((GR_ESB_ui*)(this->p_GUI),SIGNAL(vlinkchanged(QString)),this,SLOT(setVirtualLink(QString))); | ||
connect((GR_ESB_ui*)(this->p_GUI),SIGNAL(connectClicked()),this,SLOT(toggleBridgeConnection())); | ||||
this->manager->virtualLinkIndex = 0; | ||||
this->manager->start(); | ||||
Jeandet Alexis
|
r23 | } | ||
GR_ESB_bridge::~GR_ESB_bridge() | ||||
{ | ||||
Jeandet Alexis
|
r29 | this->manager->requestInterruption(); | ||
while(this->manager->isRunning()); | ||||
Jeandet Alexis
|
r22 | } | ||
Jeandet Alexis
|
r25 | void GR_ESB_bridge::toggleBridgeConnection() | ||
{ | ||||
if(this->plugin->isConnected()) | ||||
{ | ||||
this->disconnectBridge(); | ||||
} | ||||
else | ||||
{ | ||||
this->connectBridge(); | ||||
} | ||||
} | ||||
Jeandet Alexis
|
r22 | bool GR_ESB_bridge::connectBridge() | ||
{ | ||||
Jeandet Alexis
|
r25 | if(this->manager->connectBridge()) | ||
{ | ||||
((GR_ESB_ui*)this->p_GUI)->lock(true); | ||||
emit setConnected(true); | ||||
return true; | ||||
} | ||||
return false; | ||||
} | ||||
bool GR_ESB_bridge::disconnectBridge() | ||||
{ | ||||
if(this->manager->disconnectBridge()) | ||||
{ | ||||
((GR_ESB_ui*)this->p_GUI)->lock(false); | ||||
emit setConnected(false); | ||||
return true; | ||||
} | ||||
return false; | ||||
} | ||||
void GR_ESB_bridge::setIP(QString ip) | ||||
{ | ||||
this->manager->IP = ip; | ||||
} | ||||
void GR_ESB_bridge::setVirtualLink(QString vlink) | ||||
{ | ||||
Alexis Jeandet
|
r78 | //vlink = vlink.section(,0,0); | ||
vlink.remove("Virtual link"); | ||||
Jeandet Alexis
|
r25 | bool success; | ||
int vlinkTmp = vlink.toInt(&success); | ||||
if(success) | ||||
{ | ||||
setVirtualLink(vlinkTmp); | ||||
} | ||||
} | ||||
void GR_ESB_bridge::setVirtualLink(qint32 vlink) | ||||
{ | ||||
if(vlink<6 && vlink>=0) | ||||
{ | ||||
this->manager->virtualLinkIndex = vlink; | ||||
} | ||||
} | ||||
unsigned int GR_ESB_bridge::Write(unsigned int *Value, unsigned int count, unsigned int address) | ||||
{ | ||||
Alexis Jeandet
|
r78 | char writeBuffer[RMAP_WRITE_PACKET_MIN_SZ((RMAP_MAX_XFER_SIZE*4))]; | ||
char *RMAPAckBuff; | ||||
int transactionID = 0; | ||||
int written=0; | ||||
SocExplorerEngine::message(this->plugin,"Enter Write function",2); | ||||
QProgressBar* progress=NULL; | ||||
SocExplorerAutoProgressBar autopb; | ||||
if(count>RMAP_MAX_XFER_SIZE) | ||||
{ | ||||
progress= SocExplorerEngine::getProgressBar("Writing on SPW @0x"+QString::number(address,16)+" %v of "+QString::number(count)+" words ",count); | ||||
autopb.setProgressBar(progress); | ||||
} | ||||
//Quite stupide loop, I guess that I always get the number of byte I asked for! | ||||
while(count>=RMAP_MAX_XFER_SIZE) | ||||
{ | ||||
for(int i=0;i<(RMAP_MAX_XFER_SIZE);i++) | ||||
{ | ||||
writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+0] = (char)(((unsigned int)Value[i+written]>>24)&0xFF); | ||||
writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+1] = (char)(((unsigned int)Value[i+written]>>16)&0xFF); | ||||
writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+2] = (char)(((unsigned int)Value[i+written]>>8)&0xFF); | ||||
writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+3] = (char)(((unsigned int)Value[i+written])&0xFF); | ||||
} | ||||
transactionID=manager->getRMAPtransactionID(); | ||||
SocExplorerEngine::message(this->plugin,QString("Sending Write request with ID=%1").arg(transactionID),2); | ||||
RMAP_build_tx_request_header( | ||||
this->manager->destinationLogicalAddress, | ||||
this->manager->destinationKey, | ||||
this->manager->sourceLogicalAddress, | ||||
transactionID, | ||||
address+(written*4), | ||||
RMAP_MAX_XFER_SIZE*4, | ||||
writeBuffer); | ||||
manager->sendPacket(writeBuffer,RMAP_WRITE_PACKET_MIN_SZ(RMAP_MAX_XFER_SIZE*4)); | ||||
manager->getRMAPanswer(transactionID,&RMAPAckBuff); | ||||
free(RMAPAckBuff); | ||||
written+=RMAP_MAX_XFER_SIZE; | ||||
count-=RMAP_MAX_XFER_SIZE; | ||||
progress->setValue(written); | ||||
qApp->processEvents(); | ||||
} | ||||
if(count>0) | ||||
{ | ||||
for(int i=0;i<((int)count);i++) | ||||
{ | ||||
writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+0] = (char)(((unsigned int)Value[i+written]>>24)&0xFF); | ||||
writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+1] = (char)(((unsigned int)Value[i+written]>>16)&0xFF); | ||||
writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+2] = (char)(((unsigned int)Value[i+written]>>8)&0xFF); | ||||
writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+3] = (char)(((unsigned int)Value[i+written])&0xFF); | ||||
} | ||||
transactionID=manager->getRMAPtransactionID(); | ||||
SocExplorerEngine::message(this->plugin,QString("Sending Write request with ID=%1").arg(transactionID),2); | ||||
RMAP_build_tx_request_header( | ||||
this->manager->destinationLogicalAddress, | ||||
this->manager->destinationKey, | ||||
this->manager->sourceLogicalAddress, | ||||
transactionID, | ||||
address+(written*4), | ||||
count*4, | ||||
writeBuffer); | ||||
manager->sendPacket(writeBuffer,RMAP_WRITE_PACKET_MIN_SZ(count*4)); | ||||
manager->getRMAPanswer(transactionID,&RMAPAckBuff); | ||||
free(RMAPAckBuff); | ||||
written+=count; | ||||
if(progress!=NULL) | ||||
{ | ||||
progress->setValue(written); | ||||
qApp->processEvents(); | ||||
} | ||||
} | ||||
return written; | ||||
Jeandet Alexis
|
r25 | } | ||
unsigned int GR_ESB_bridge::Read(unsigned int *Value, unsigned int count, unsigned int address) | ||||
{ | ||||
Alexis Jeandet
|
r78 | char requestBuffer[RMAP_READ_HEADER_MIN_SZ]; | ||
char* RMAP_AnswerBuffer; | ||||
requestBuffer[0]=this->manager->linkNumber;//Link number | ||||
int transactionID = 0; | ||||
int read=0; | ||||
QProgressBar* progress=NULL; | ||||
SocExplorerAutoProgressBar autopb; | ||||
if(count>RMAP_MAX_XFER_SIZE) | ||||
{ | ||||
progress= SocExplorerEngine::getProgressBar("Reading on SPW @0x"+QString::number(address,16)+" %v of "+QString::number(count)+" words ",count); | ||||
autopb.setProgressBar(progress); | ||||
} | ||||
SocExplorerEngine::message(this->plugin,QString("Enter read function, count=%1, RMAP_MAX_XFER_SIZE=%2").arg(count).arg(RMAP_MAX_XFER_SIZE),2); | ||||
//Quite stupide loop, I guess that I always get the number of byte I asked for! | ||||
while((int)count>=(int)RMAP_MAX_XFER_SIZE) | ||||
{ | ||||
transactionID = manager->getRMAPtransactionID(); | ||||
SocExplorerEngine::message(this->plugin,QString("New transactionID:%1").arg(transactionID),2); | ||||
RMAP_build_rx_request_header( | ||||
this->manager->destinationLogicalAddress, | ||||
this->manager->destinationKey, | ||||
this->manager->sourceLogicalAddress, | ||||
transactionID, | ||||
address+(read*4), | ||||
RMAP_MAX_XFER_SIZE*4, | ||||
requestBuffer); | ||||
manager->sendPacket(requestBuffer,RMAP_READ_HEADER_MIN_SZ); | ||||
int len=manager->getRMAPanswer(transactionID,&RMAP_AnswerBuffer); | ||||
if(len==-1) | ||||
{ | ||||
this->toggleBridgeConnection(); | ||||
return 0; | ||||
} | ||||
for(int i=0;i<((len-13)/4);i++) | ||||
{ | ||||
Value[read+i] = 0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+12]); | ||||
Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+13])); | ||||
Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+14])); | ||||
Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+15])); | ||||
} | ||||
free(RMAP_AnswerBuffer); | ||||
read+=RMAP_MAX_XFER_SIZE; | ||||
count-=RMAP_MAX_XFER_SIZE; | ||||
if(progress!=NULL) | ||||
{ | ||||
progress->setValue(read); | ||||
qApp->processEvents(); | ||||
} | ||||
} | ||||
if((int)count>0) | ||||
{ | ||||
transactionID = manager->getRMAPtransactionID(); | ||||
SocExplorerEngine::message(this->plugin,QString("New transactionID: %1").arg(transactionID),2); | ||||
SocExplorerEngine::message(this->plugin,QString("Building request with:"),2); | ||||
SocExplorerEngine::message(this->plugin,QString("Address = %1").arg(address+(read*4),8,16),2); | ||||
SocExplorerEngine::message(this->plugin,QString("Size = %1").arg(count*4),2); | ||||
SocExplorerEngine::message(this->plugin,QString("Size + 13 = %1").arg((count*4)+13),2); | ||||
RMAP_build_rx_request_header( | ||||
this->manager->destinationLogicalAddress, | ||||
this->manager->destinationKey, | ||||
this->manager->sourceLogicalAddress, | ||||
transactionID, | ||||
address+(read*4), | ||||
count*4, | ||||
requestBuffer); | ||||
manager->sendPacket(requestBuffer,RMAP_READ_HEADER_MIN_SZ); | ||||
int len=manager->getRMAPanswer(transactionID,&RMAP_AnswerBuffer); | ||||
if(len==-1) | ||||
{ | ||||
this->toggleBridgeConnection(); | ||||
return 0; | ||||
} | ||||
for(int i=0;i<((len-13)/4);i++) | ||||
{ | ||||
Value[read+i] = 0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+12]); | ||||
Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+13])); | ||||
Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+14])); | ||||
Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+15])); | ||||
} | ||||
free(RMAP_AnswerBuffer); | ||||
read+=count; | ||||
if(progress!=NULL) | ||||
{ | ||||
progress->setValue(read); | ||||
qApp->processEvents(); | ||||
} | ||||
} | ||||
return read; | ||||
Jeandet Alexis
|
r25 | } | ||
int GR_ESB_bridge::pushRMAPPacket(char *packet, int size) | ||||
{ | ||||
return this->manager->sendPacket(packet,size); | ||||
} | ||||
GR_ESB_Manager::GR_ESB_Manager(socexplorerplugin *plugin, QObject *parent) | ||||
Alexis Jeandet
|
r78 | :abstractSpwManager(plugin, parent) | ||
Jeandet Alexis
|
r25 | { | ||
Alexis Jeandet
|
r78 | this->sourceLogicalAddress=32; | ||
this->destinationLogicalAddress=254; | ||||
this->destinationKey=2; | ||||
connect(&(this->Read_soc),SIGNAL(readyRead()),this,SLOT(readyRead())); | ||||
Jeandet Alexis
|
r25 | } | ||
GR_ESB_Manager::~GR_ESB_Manager() | ||||
{ | ||||
Alexis Jeandet
|
r78 | } | ||
Jeandet Alexis
|
r25 | |||
Alexis Jeandet
|
r78 | void GR_ESB_Manager::__processPacket(packetBuffer_t *packet) | ||
{ | ||||
if(packet->complete) | ||||
{ | ||||
if(packet->buffer[1]==(char)SPW_PROTO_ID_RMAP) //RMAP packet | ||||
{ | ||||
RMAP_Answer* RMapPacket; | ||||
SocExplorerEngine::message(this->plugin,"Got RMAP packet",2); | ||||
SocExplorerEngine::message(this->plugin,QString("Rmap packet size %1").arg(packet->PacketLen),2); | ||||
char* packetbuffer = (char*)malloc(packet->PacketLen); | ||||
if(packetbuffer) | ||||
{ | ||||
memcpy(packetbuffer,packet->buffer,packet->PacketLen); | ||||
this->handleMutex->unlock(); | ||||
if(packet->PacketLen==8) | ||||
{ | ||||
RMapPacket=new RMAP_Answer(RMAP_get_transactionID(packetbuffer),packetbuffer,packet->PacketLen); | ||||
} | ||||
else | ||||
{ | ||||
RMapPacket=new RMAP_Answer(RMAP_get_transactionID(packetbuffer),packetbuffer,packet->PacketLen); | ||||
} | ||||
RMAP_AnswersMtx->lock(); | ||||
RMAP_Answers.append(RMapPacket); | ||||
RMAP_AnswersMtx->unlock(); | ||||
RMAP_AnswersSem->release(); | ||||
} | ||||
} | ||||
else //any non-rmap packet will be pushed to the network | ||||
{ | ||||
char* packetbuffer = (char*)malloc(packet->PacketLen); | ||||
if(packetbuffer) | ||||
{ | ||||
memcpy(packetbuffer,packet->buffer,packet->PacketLen); | ||||
emit emitPacket(packetbuffer,packet->PacketLen); | ||||
SocExplorerEngine::message(this->plugin,"Got SPW packet",2); | ||||
} | ||||
} | ||||
} | ||||
} | ||||
QByteArray GR_ESB_Manager::__processData(const QByteArray &data, packetBuffer_t *buffer) | ||||
{ | ||||
if(buffer->complete) | ||||
{ | ||||
if(Q_UNLIKELY(data.size()<=4)) | ||||
return data; | ||||
buffer->PacketLen= ((int)data.at(3)& 0x0FF) + (((int)data.at(2)& 0x0FF)<<8) + (((int)data.at(1)& 0x0FF)<<16); | ||||
if(buffer->PacketLen>(data.size()-4)) | ||||
{ | ||||
memcpy(buffer->buffer,data.data()+4,data.size()-4); | ||||
buffer->complete=false; | ||||
buffer->index=data.size()-4; | ||||
} | ||||
else | ||||
{ | ||||
memcpy(buffer->buffer,data.data()+4,data.size()-4); | ||||
buffer->PacketLen = data.size()-4; | ||||
buffer->index=data.size()-4; | ||||
buffer->complete=true; | ||||
__processPacket(buffer); | ||||
int len = buffer->PacketLen; | ||||
buffer->PacketLen = 0; | ||||
buffer->index=0; | ||||
if((data.size()-4-len)) | ||||
{ | ||||
return __processData(data.right((data.size()-4-len)),buffer); | ||||
} | ||||
} | ||||
} | ||||
else | ||||
{ | ||||
if(buffer->PacketLen>(data.size()+buffer->index)) | ||||
{ | ||||
memcpy(buffer->buffer+buffer->index,data.data(),data.size()); | ||||
buffer->complete=false; | ||||
buffer->index+=data.size(); | ||||
} | ||||
else | ||||
{ | ||||
memcpy(buffer->buffer+buffer->index,data.data(),buffer->PacketLen-buffer->index); | ||||
buffer->complete=true; | ||||
buffer->index+=data.size(); | ||||
__processPacket(buffer); | ||||
int len = buffer->PacketLen; | ||||
buffer->PacketLen = 0; | ||||
buffer->index=0; | ||||
if((data.size()-len)) | ||||
{ | ||||
return __processData(data.right((data.size()-len)),buffer); | ||||
} | ||||
} | ||||
} | ||||
return QByteArray(); | ||||
Jeandet Alexis
|
r25 | } | ||
void GR_ESB_Manager::run() | ||||
{ | ||||
Alexis Jeandet
|
r78 | char bufferData[(RMAP_MAX_XFER_SIZE*4)+50]; | ||
packetBuffer_t buffer={bufferData,0,0,true}; | ||||
Jeandet Alexis
|
r25 | SocExplorerEngine::message(this->plugin,"Starting GRESB pooling thread",1); | ||
Alexis Jeandet
|
r78 | QByteArray data; | ||
Jeandet Alexis
|
r25 | while (!this->isInterruptionRequested()) | ||
{ | ||||
if(this->connected) | ||||
{ | ||||
Alexis Jeandet
|
r78 | SocExplorerEngine::message(this->plugin,"Looking for new RMAP packets",8); | ||
if(!incomingPackets.isEmpty()) | ||||
{ | ||||
incomingPacketsMutex.lock(); | ||||
data.append(incomingPackets.dequeue()); | ||||
this->incomingPacketsMutex.unlock(); | ||||
data = __processData(data,&buffer); | ||||
} | ||||
Jeandet Alexis
|
r25 | |||
} | ||||
else | ||||
{ | ||||
//do some sanity checks! | ||||
usleep(RMAPtimeout/2); | ||||
} | ||||
usleep(1000); | ||||
} | ||||
SocExplorerEngine::message(this->plugin,"Exiting Startdundee USB pooling thread",1); | ||||
} | ||||
bool GR_ESB_Manager::connectBridge() | ||||
{ | ||||
Jeandet Alexis
|
r24 | int timeout=60; | ||
Alexis Jeandet
|
r78 | this->connected = false; | ||
if(this->Read_soc.state()==QTcpSocket::UnconnectedState) | ||||
Jeandet Alexis
|
r24 | { | ||
Alexis Jeandet
|
r78 | this->Read_soc.connectToHost(IP,gresb_Conf[virtualLinkIndex].Receive_port); | ||
this->Read_soc.waitForConnected(30000); | ||||
Jeandet Alexis
|
r24 | } | ||
Alexis Jeandet
|
r78 | if(this->Write_soc.state()==QTcpSocket::UnconnectedState) | ||
Jeandet Alexis
|
r24 | { | ||
Alexis Jeandet
|
r78 | this->Write_soc.connectToHost(IP,gresb_Conf[virtualLinkIndex].Transmit_port); | ||
this->Write_soc.waitForConnected(30000); | ||||
Jeandet Alexis
|
r24 | } | ||
Alexis Jeandet
|
r78 | while((this->Read_soc.state()!=QTcpSocket::ConnectedState) && (this->Write_soc.state()!=QTcpSocket::ConnectedState)) | ||
Jeandet Alexis
|
r24 | { | ||
usleep(100000); | ||||
if(timeout--==0)return false; | ||||
} | ||||
Alexis Jeandet
|
r78 | this->connected = true; | ||
Jeandet Alexis
|
r24 | return true; | ||
Jeandet Alexis
|
r25 | |||
Jeandet Alexis
|
r22 | } | ||
Jeandet Alexis
|
r25 | bool GR_ESB_Manager::disconnectBridge() | ||
Jeandet Alexis
|
r22 | { | ||
Jeandet Alexis
|
r24 | int timeout=60; | ||
Alexis Jeandet
|
r78 | if(this->Read_soc.state()!=QTcpSocket::UnconnectedState) | ||
Jeandet Alexis
|
r24 | { | ||
Alexis Jeandet
|
r78 | this->Read_soc.disconnectFromHost(); | ||
this->Read_soc.waitForDisconnected(30000); | ||||
Jeandet Alexis
|
r25 | } | ||
Alexis Jeandet
|
r78 | if(this->Write_soc.state()!=QTcpSocket::UnconnectedState) | ||
Jeandet Alexis
|
r25 | { | ||
Alexis Jeandet
|
r78 | this->Write_soc.disconnectFromHost(); | ||
this->Write_soc.waitForDisconnected(30000); | ||||
Jeandet Alexis
|
r25 | } | ||
Alexis Jeandet
|
r78 | while((this->Read_soc.state()!=QTcpSocket::UnconnectedState) && (this->Write_soc.state()!=QTcpSocket::UnconnectedState)) | ||
Jeandet Alexis
|
r25 | { | ||
usleep(100000); | ||||
if(timeout--==0)return false; | ||||
Jeandet Alexis
|
r24 | } | ||
return true; | ||||
} | ||||
Jeandet Alexis
|
r22 | |||
Jeandet Alexis
|
r25 | bool GR_ESB_Manager::sendPacket(char *packet, int size) | ||
Jeandet Alexis
|
r22 | { | ||
Alexis Jeandet
|
r78 | bool result = false; | ||
char protocoleIdentifier; | ||||
SocExplorerEngine::message(this->plugin,"Sending SPW packet",2); | ||||
if(Q_UNLIKELY(this->Write_soc.state()!=QAbstractSocket::ConnectedState)) | ||||
{ | ||||
SocExplorerEngine::message(this->plugin,"Socket closed",2); | ||||
//TODO handle disconnection | ||||
} | ||||
char* SPWpacket = (char*)malloc(size+4); | ||||
if(SPWpacket!=NULL) | ||||
{ | ||||
SPWpacket[0]=0; //Protocol = spw | ||||
memcpy(SPWpacket+4,packet,size); | ||||
SPWpacket[1]=(size>>16) & 0x0FF; | ||||
SPWpacket[2]=(size>>8) & 0x0FF; | ||||
SPWpacket[3]=size & 0x0FF; | ||||
this->handleMutex->lock(); | ||||
result = ((size+4) == this->Write_soc.write(SPWpacket,size+4)); | ||||
this->Write_soc.flush(); | ||||
this->handleMutex->unlock(); | ||||
free(SPWpacket); | ||||
} | ||||
if (Q_UNLIKELY(!result)) | ||||
{ | ||||
SocExplorerEngine::message(this->plugin,"ERR sending the READ command ",2); | ||||
return false; | ||||
} | ||||
else | ||||
{ | ||||
emit bytesTransmittedToSpw( size-1 ); // -1 is for removing the first bytes added to the packet to route to the right link | ||||
// read the protocole identifier | ||||
protocoleIdentifier = packet[2]; | ||||
if (protocoleIdentifier == SPW_PROTO_ID_CCSDS) | ||||
emit ccsdsPacketTransmittedToSpw(); | ||||
SocExplorerEngine::message(this->plugin,"Packet sent",2); | ||||
} | ||||
return true; | ||||
Jeandet Alexis
|
r22 | } | ||
Alexis Jeandet
|
r78 | void GR_ESB_Manager::readyRead() | ||
Jeandet Alexis
|
r22 | { | ||
Alexis Jeandet
|
r78 | incomingPacketsMutex.lock(); | ||
incomingPackets.append(Read_soc.readAll()); | ||||
incomingPacketsMutex.unlock(); | ||||
Jeandet Alexis
|
r22 | } | ||
Alexis Jeandet
|
r78 | |||