Commit fa956f36 authored by Franz's avatar Franz

added additional xbeefiles

parent 4c547561
......@@ -533,3 +533,20 @@ win32:exists(src/lib/opalrt/OpalApi.h):exists(C:/OPAL-RT/RT-LAB7.2.4/Common/bin)
}
TRANSLATIONS += es-MX.ts \
en-US.ts
# xbee support
# libxbee only supported by linux and windows systems
win32-msvc2008|win32-msvc2010|linux{
HEADERS += src/comm/XbeeLinkInterface.h \
src/comm/XbeeLink.h \
src/ui/XbeeConfigurationWindow.h \
src/comm/CallConv.h
SOURCES += src/comm/XbeeLink.cpp \
src/ui/XbeeConfigurationWindow.cpp
DEFINES += XBEELINK
INCLUDEPATH += thirdParty/libxbee
# TO DO: build library when it does not exists already
LIBS += -LthirdParty/libxbee/lib \
-llibxbee
}
#ifndef _CALLCONV_H_
#define _CALLCONV_H_
#ifdef Q_OS_WIN
#define CALLTYPEXBEE __stdcall
#else // Q_OS_WIN
#define CALLTYPEXBEE
#endif // Q_OS_WIN
#endif // _CALLCONV_H_
\ No newline at end of file
#include <qdebug.h>
#include <QThread>
#include <QMutex>
#include <MG.h>
#include <configuration.h>
#include<string>
#include "XbeeLink.h"
XbeeLink::XbeeLink(QString portName, int baudRate) :
m_xbeeCon(NULL), m_portName(NULL), m_portNameLength(0), m_baudRate(baudRate), m_connected(false), m_id(-1)
{
/* setup the xbee */
this->setPortName(portName);
//this->connect();
// Set unique ID and add link to the list of links
this->m_id = getNextLinkId();
// set the Name
this->m_name = tr("xbee link") + QString::number(this->m_id);
emit nameChanged(this->m_name);
}
XbeeLink::~XbeeLink()
{
if(m_portName)
{
delete m_portName;
m_portName = NULL;
}
this->disconnect();
}
QString XbeeLink::getPortName()
{
QString portName;
for(unsigned int i = 0;i<this->m_portNameLength;i++)
{
portName.append(this->m_portName[i]);
}
return portName;
}
int XbeeLink::getBaudRate()
{
return this->m_baudRate;
}
bool XbeeLink::setPortName(QString portName)
{
bool reconnect(false);
if(this->m_connected)
{
this->disconnect();
reconnect = true;
}
if(m_portName)
{
delete m_portName;
m_portName = NULL;
}
QStringList list = portName.split(QRegExp("\\s+"),QString::SkipEmptyParts);
if(list.size()>0)
{
this->m_portNameLength = list[0].size()+1;
m_portName = new char[this->m_portNameLength];
for(int i=0;i<list[0].size();i++)
{
this->m_portName[i]=list[0][i].toAscii();
}
this->m_portName[list[0].size()] = '\0';
}
else
{
this->m_portNameLength = 1;
m_portName = new char[this->m_portNameLength];
this->m_portName[0] = '\0';
}
bool retVal(true);
if(reconnect)
{
retVal = this->connect();
}
return retVal;
}
bool XbeeLink::setBaudRate(int rate)
{
bool reconnect(false);
if(this->m_connected)
{
this->disconnect();
reconnect = true;
}
bool retVal(true);
this->m_baudRate = rate;
if(reconnect)
{
retVal = this->connect();
}
return retVal;
}
int XbeeLink::getId()
{
return this->m_id;
}
QString XbeeLink::getName()
{
return this->m_name;
}
bool XbeeLink::isConnected()
{
return this->m_connected;
}
qint64 XbeeLink::getNominalDataRate()
{
return this->m_baudRate;
}
bool XbeeLink::isFullDuplex()
{
return false;
}
int XbeeLink::getLinkQuality()
{
return -1; // TO DO:
}
qint64 XbeeLink::getTotalUpstream()
{
return 0; // TO DO:
}
qint64 XbeeLink::getCurrentUpstream()
{
return 0; // TO DO:
}
qint64 XbeeLink::getMaxUpstream()
{
return 0; // TO DO:
}
qint64 XbeeLink::getBitsSent()
{
return 0; // TO DO:
}
qint64 XbeeLink::getBitsReceived()
{
return 0; // TO DO:
}
bool XbeeLink::hardwareConnect()
{
if(this->isConnected())
{
this->disconnect();
}
if (*this->m_portName == '\0')
{
return false;
}
if (xbee_setupAPI(this->m_portName,this->m_baudRate,0x2B,0x3E8) == -1)
{
/* oh no... it failed */
qDebug() <<"xbee_setup() failed...\n";
return false;
}
this->m_xbeeCon = xbee_newcon('A',xbee2_data,0x13A200,0x403D0935);
this->m_connected = true;
emit connected();
emit connected(true);
return true;
}
bool XbeeLink::connect()
{
if (this->isRunning()) this->disconnect();
this->start(LowPriority);
return true;
}
bool XbeeLink::disconnect()
{
if(this->isRunning()) this->terminate(); //stop running the thread, restart it upon connect
if(this->m_xbeeCon)
{
xbee_endcon(this->m_xbeeCon);
this->m_xbeeCon = NULL;
}
this->m_connected = false;
emit disconnected();
emit connected(false);
return true;
}
qint64 XbeeLink::bytesAvailable()
{
return 0;
}
void XbeeLink::writeBytes(const char *bytes, qint64 length) // TO DO: delete the data array
{
char *data;
data = new char[length];
for(long i=0;i<length;i++)
{
data[i] = bytes[i];
}
if(!xbee_nsenddata(this->m_xbeeCon,data,length)) // return value of 0 is successful written
{
}
else
{
this->disconnect();
emit communicationError(this->getName(), tr("Could not send data - link %1 is disconnected!").arg(this->getName()));
}
}
void XbeeLink::readBytes()
{
xbee_pkt *xbeePkt;
xbeePkt = xbee_getpacketwait(this->m_xbeeCon);
if(!(NULL==xbeePkt))
{
QByteArray data;
for(unsigned int i=0;i<=xbeePkt->datalen;i++)
{
data.push_back(xbeePkt->data[i]);
}
qDebug() << data;
emit bytesReceived(this,data);
}
}
void XbeeLink::run()
{
// Initialize the connection
if(this->hardwareConnect())
{
// Qt way to make clear what a while(1) loop does
forever
{
this->readBytes();
}
}
}
/*
void CALLTYPE XbeeLink::portCallback(xbee_con *xbeeCon, xbee_pkt *XbeePkt)
{
QByteArray buf;
for(quint8 i=0;i<XbeePkt->datalen;i++)
{
buf.push_back(XbeePkt->data[i]);
}
emit bytesReceived(this, buf);
}*/
\ No newline at end of file
#ifndef _XBEELINK_H_
#define _XBEELINK_H_
#include <QObject>
#include <QString>
#include <qdebug.h>
#include <qmutex.h>
#include <qbytearray.h>
#include <list>
#include "XbeeLinkInterface.h"
#include <xbee.h>
#include "CallConv.h"
class XbeeLink : public XbeeLinkInterface
{
Q_OBJECT
public:
XbeeLink(QString portName = "", int baudRate=57600);
~XbeeLink();
public: // virtual functions from XbeeLinkInterface
QString getPortName();
int getBaudRate();
public slots: // virtual functions from XbeeLinkInterface
bool setPortName(QString portName);
bool setBaudRate(int rate);
public: // virtual functions from LinkInterface
int getId();
QString getName();
bool isConnected();
qint64 getNominalDataRate();
bool isFullDuplex();
int getLinkQuality();
qint64 getTotalUpstream();
qint64 getCurrentUpstream();
qint64 getMaxUpstream();
qint64 getBitsSent();
qint64 getBitsReceived();
bool connect();
bool disconnect();
qint64 bytesAvailable();
public slots: // virtual functions from LinkInterface
void writeBytes(const char *bytes, qint64 length);
protected slots: // virtual functions from LinkInterface
void readBytes();
public:
void run(); // initiating the thread
protected:
xbee_con *m_xbeeCon;
int m_id;
char *m_portName;
unsigned int m_portNameLength;
int m_baudRate;
bool m_connected;
QString m_name;
private:
bool hardwareConnect();
//void CALLTYPE portCallback(xbee_con *XbeeCon, xbee_pkt *XbeePkt);
};
#endif // _XBEELINK_H_
\ No newline at end of file
#ifndef XBEELINKINTERFACE_H_
#define XBEELINKINTERFACE_H_
#include <QObject>
#include <QString>
#include <LinkInterface.h>
class XbeeLinkInterface : public LinkInterface
{
Q_OBJECT
public:
virtual QString getPortName() = 0;
virtual int getBaudRate() = 0;
public slots:
virtual bool setPortName(QString portName) = 0;
virtual bool setBaudRate(int rate) = 0;
};
#endif // XBEELINKINTERFACE_H_
This diff is collapsed.
#ifndef _XBEECONFIGURATIONWINDOW_H_
#define _XBEECONFIGURATIONWINDOW_H_
#include <QObject>
#include <QWidget>
#include <QAction>
#include <QTimer>
#include <QShowEvent>
#include <QHideEvent>
#include<QtGui\qcombobox.h>
#include<QtGui\qlabel.h>
#include<QtGui\qlayout.h>
#include <LinkInterface.h>
#include"XbeeLinkInterface.h"
class XbeeConfigurationWindow : public QWidget
{
Q_OBJECT
public:
XbeeConfigurationWindow(LinkInterface* link, QWidget *parent = 0, Qt::WindowFlags flags = Qt::Sheet);
~XbeeConfigurationWindow();
QAction* getAction();
public slots:
void configureCommunication();
void setPortName(QString port);
void setBaudRateString(QString baud);
void setupPortList();
protected:
void showEvent(QShowEvent* event);
void hideEvent(QHideEvent* event);
bool userConfigured; ///< Switch to detect if current values are user-selected and shouldn't be overriden
private:
QLabel *portLabel;
QLabel *baudLabel;
QComboBox *portBox;
QComboBox *baudBox;
QGridLayout *actionLayout;
QHBoxLayout *xbeeLayout;
QVBoxLayout *tmpLayout;
XbeeLinkInterface* link;
QAction* action;
QTimer* portCheckTimer;
};
#endif //_XBEECONFIGURATIONWINDOW_H_
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment