2 ******************************************************************************
4 * @file AntennaTracgadget.cpp
5 * @author Sami Korhonen & the OpenPilot team Copyright (C) 2010.
6 * @addtogroup GCSPlugins GCS Plugins
8 * @addtogroup AntennaTrackGadgetPlugin Antenna Track Gadget Plugin
10 * @brief A gadget that communicates with antenna tracker and enables basic configuration
11 *****************************************************************************/
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 3 of the License, or
16 * (at your option) any later version.
18 * This program is distributed in the hope that it will be useful, but
19 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
20 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
23 * You should have received a copy of the GNU General Public License along
24 * with this program; if not, write to the Free Software Foundation, Inc.,
25 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
28 #include "antennatrackgadget.h"
29 #include "antennatrackwidget.h"
30 #include "antennatrackgadgetconfiguration.h"
31 #include <QtSerialPort/QSerialPortInfo>
33 AntennaTrackGadget::AntennaTrackGadget(QString classId
, AntennaTrackWidget
*widget
, QWidget
*parent
) :
34 IUAVGadget(classId
, parent
),
38 connect(m_widget
->connectButton
, SIGNAL(clicked(bool)), this, SLOT(onConnect()));
39 connect(m_widget
->disconnectButton
, SIGNAL(clicked(bool)), this, SLOT(onDisconnect()));
42 AntennaTrackGadget::~AntennaTrackGadget()
46 This is called when a configuration is loaded, and updates the plugin's settings.
47 Careful: the plugin is already drawn before the loadConfiguration method is called the
48 first time, so you have to be careful not to assume all the plugin values are initialized
49 the first time you use them
51 void AntennaTrackGadget::loadConfiguration(IUAVGadgetConfiguration
*config
)
53 // Delete the (old)port, this also closes it.
58 // Delete the (old)parser, this also disconnects all signals.
63 AntennaTrackGadgetConfiguration
*AntennaTrackConfig
= qobject_cast
< AntennaTrackGadgetConfiguration
*>(config
);
65 m_portsettings
.BaudRate
= AntennaTrackConfig
->speed();
66 m_portsettings
.DataBits
= AntennaTrackConfig
->dataBits();
67 m_portsettings
.FlowControl
= AntennaTrackConfig
->flow();
68 m_portsettings
.Parity
= AntennaTrackConfig
->parity();
69 m_portsettings
.StopBits
= AntennaTrackConfig
->stopBits();
70 m_portsettings
.Timeout_Millisec
= AntennaTrackConfig
->timeOut();
72 // In case we find no port, buttons disabled
73 m_widget
->connectButton
->setEnabled(false);
74 m_widget
->disconnectButton
->setEnabled(false);
76 QList
<QSerialPortInfo
> ports
= QSerialPortInfo::availablePorts();
77 foreach(QSerialPortInfo nport
, ports
) {
78 if (nport
.portName() == AntennaTrackConfig
->port()) {
79 qDebug() << "Using Serial port";
80 // parser = new NMEAParser();
81 port
= new QSerialPort(nport
);
82 m_widget
->setPort(port
);
83 m_widget
->connectButton
->setEnabled(true);
84 m_widget
->disconnectButton
->setEnabled(false);
85 m_widget
->connectButton
->setHidden(false);
86 m_widget
->disconnectButton
->setHidden(false);
88 connect(port
, SIGNAL(readyRead()), this, SLOT(onDataAvailable()));
91 m_widget
->dataStreamGroupBox
->setHidden(false);
93 parser
= new TelemetryParser();
95 connect(parser
, SIGNAL(position(double, double, double)), m_widget
, SLOT(setPosition(double, double, double)));
96 connect(parser
, SIGNAL(home(double, double, double)), m_widget
, SLOT(setHomePosition(double, double, double)));
97 connect(parser
, SIGNAL(packet(QString
)), m_widget
, SLOT(dumpPacket(QString
)));
100 void AntennaTrackGadget::onConnect()
102 m_widget
->textBrowser
->append(QString("Connecting to Tracker ...\n"));
103 // TODO: Somehow mark that we're running, and disable connect button while so?
106 qDebug() << "Opening: " << port
->portName() << ".";
107 bool isOpen
= port
->open(QIODevice::ReadWrite
);
108 qDebug() << "Open: " << isOpen
;
110 if (port
->setBaudRate(m_portsettings
.BaudRate
)
111 && port
->setDataBits(m_portsettings
.DataBits
)
112 && port
->setParity(m_portsettings
.Parity
)
113 && port
->setStopBits(m_portsettings
.StopBits
)
114 && port
->setFlowControl(m_portsettings
.FlowControl
)) {
115 m_widget
->connectButton
->setEnabled(false);
116 m_widget
->disconnectButton
->setEnabled(true);
120 qDebug() << "Port undefined or invalid.";
124 void AntennaTrackGadget::onDisconnect()
127 qDebug() << "Closing: " << port
->portName() << ".";
129 m_widget
->connectButton
->setEnabled(true);
130 m_widget
->disconnectButton
->setEnabled(false);
132 qDebug() << "Port undefined or invalid.";
136 void AntennaTrackGadget::onDataAvailable()
138 int avail
= port
->bytesAvailable();
141 QByteArray serialData
;
142 serialData
.resize(avail
);
143 int bytesRead
= port
->read(serialData
.data(), serialData
.size());
145 processNewSerialData(serialData
);
150 void AntennaTrackGadget::processNewSerialData(QByteArray serialData
)
152 int dataLength
= serialData
.size();
153 const char *data
= serialData
.constData();
155 m_widget
->textBrowser
->append(QString(serialData
));
156 for (int pos
= 0; pos
< dataLength
; pos
++) {
157 // parser->processInputStream(data[pos]);