/*------------------------------------------------------------------------------ -- 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 ----------------------------------------------------------------------------*/ #include "gr_esb_bridge.h" #include "gr_esb_ui.h" #include #include "spw.h" #include GR_ESB_bridge::GR_ESB_bridge(socexplorerplugin *parent) : abstractSpwBridge(parent) { this->p_GUI = new GR_ESB_ui(); this->manager = new GR_ESB_Manager(parent,this); connect((GR_ESB_ui*)(this->p_GUI),SIGNAL(ipchanged(QString)),this,SLOT(setIP(QString))); 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(); } GR_ESB_bridge::~GR_ESB_bridge() { this->manager->requestInterruption(); while(this->manager->isRunning()); } void GR_ESB_bridge::toggleBridgeConnection() { if(this->plugin->isConnected()) { this->disconnectBridge(); } else { this->connectBridge(); } } bool GR_ESB_bridge::connectBridge() { 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) { vlink = vlink.section("Virtual link",0,0); 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) { // TODO write ME! Q_UNUSED(count) Q_UNUSED(Value) Q_UNUSED(address) return 0; } unsigned int GR_ESB_bridge::Read(unsigned int *Value, unsigned int count, unsigned int address) { // TODO write ME! Q_UNUSED(Value) Q_UNUSED(count) Q_UNUSED(address) return 0; } 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) :QThread((QObject*)parent) { this->Read_soc = new QTcpSocket(this); this->Write_soc = new QTcpSocket(this); this->RMAPtimeout = 2000; this->handleMutex = new QMutex(QMutex::NonRecursive); this->RMAP_AnswersSem = new QSemaphore(0); this->RMAP_AnswersMtx=new QMutex(QMutex::Recursive); this->RMAP_pending_transaction_IDsMtx=new QMutex(QMutex::Recursive); this->plugin = plugin; connected = false; this->moveToThread(this); } GR_ESB_Manager::~GR_ESB_Manager() { } void GR_ESB_Manager::run() { SocExplorerEngine::message(this->plugin,"Starting GRESB pooling thread",1); while (!this->isInterruptionRequested()) { if(this->connected) { handleMutex->lock(); SocExplorerEngine::message(this->plugin,"Looking for new RMAP packets",4); } 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() { int timeout=60; if(this->Read_soc->state()==QTcpSocket::UnconnectedState) { this->Read_soc->connectToHost(IP,gresb_Conf[virtualLinkIndex].Read_port); this->Read_soc->waitForConnected(30000); } if(this->Write_soc->state()==QTcpSocket::UnconnectedState) { this->Write_soc->connectToHost(IP,gresb_Conf[virtualLinkIndex].Write_port); this->Write_soc->waitForConnected(30000); } while((this->Read_soc->state()!=QTcpSocket::ConnectedState) && (this->Write_soc->state()!=QTcpSocket::ConnectedState)) { usleep(100000); if(timeout--==0)return false; } return true; } bool GR_ESB_Manager::disconnectBridge() { int timeout=60; if(this->Read_soc->state()!=QTcpSocket::UnconnectedState) { this->Read_soc->disconnectFromHost(); this->Read_soc->waitForDisconnected(30000); } if(this->Write_soc->state()!=QTcpSocket::UnconnectedState) { this->Write_soc->disconnectFromHost(); this->Write_soc->waitForDisconnected(30000); } while((this->Read_soc->state()!=QTcpSocket::UnconnectedState) && (this->Write_soc->state()!=QTcpSocket::UnconnectedState)) { usleep(100000); if(timeout--==0)return false; } return true; } int GR_ESB_Manager::getRMAPtransactionID() { // TODO write ME! return -1; } int GR_ESB_Manager::getRMAPanswer(int transactionID, char **buffer) { // TODO write ME! Q_UNUSED(transactionID) Q_UNUSED(buffer) return -1; } bool GR_ESB_Manager::sendPacket(char *packet, int size) { // TODO write ME! Q_UNUSED(packet) Q_UNUSED(size) return false; } void GR_ESB_Manager::pushRmapPacket(char *packet, int len) { // TODO write ME! Q_UNUSED(packet) Q_UNUSED(len) }