mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-12-23 01:55:48 -05:00
119 lines
4.9 KiB
C++
119 lines
4.9 KiB
C++
///////////////////////////////////////////////////////////////////////////////////
|
|
// Copyright (C) 2023 Jon Beniston, M7RCE <jon@beniston.com> //
|
|
// //
|
|
// 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 as 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 V3 for more details. //
|
|
// //
|
|
// You should have received a copy of the GNU General Public License //
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
|
///////////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include <QDebug>
|
|
#include <QRegularExpression>
|
|
|
|
#include "rotctrldprotocol.h"
|
|
|
|
RotCtrlDProtocol::RotCtrlDProtocol() :
|
|
m_rotCtlDReadAz(false)
|
|
{
|
|
}
|
|
|
|
void RotCtrlDProtocol::setAzimuthElevation(float azimuth, float elevation)
|
|
{
|
|
QString cmd = QString("P %1 %2\n").arg(azimuth).arg(elevation);
|
|
QByteArray data = cmd.toLatin1();
|
|
m_device->write(data);
|
|
ControllerProtocol::setAzimuthElevation(azimuth, elevation);
|
|
}
|
|
|
|
// Handle data received from rotctrld
|
|
void RotCtrlDProtocol::readData()
|
|
{
|
|
char buf[1024];
|
|
qint64 len;
|
|
|
|
while (m_device->canReadLine())
|
|
{
|
|
len = m_device->readLine(buf, sizeof(buf));
|
|
if (len != -1)
|
|
{
|
|
QString response = QString::fromUtf8(buf, len).trimmed();
|
|
QRegularExpression rprt("RPRT (-?\\d+)");
|
|
QRegularExpressionMatch matchRprt = rprt.match(response);
|
|
QRegularExpression decimal("(-?\\d+.\\d+)");
|
|
QRegularExpressionMatch matchDecimal = decimal.match(response);
|
|
if (matchRprt.hasMatch())
|
|
{
|
|
// See rig_errcode_e in hamlib rig.h
|
|
const QStringList errors = {
|
|
"OK",
|
|
"Invalid parameter",
|
|
"Invalid configuration",
|
|
"No memory",
|
|
"Not implemented",
|
|
"Timeout",
|
|
"IO error",
|
|
"Internal error",
|
|
"Protocol error",
|
|
"Command rejected",
|
|
"Arg truncated",
|
|
"Not available",
|
|
"VFO not targetable",
|
|
"Bus error",
|
|
"Collision on bus",
|
|
"NULL rig handled or invalid pointer parameter",
|
|
"Invalid VFO",
|
|
"Argument out of domain of function"
|
|
};
|
|
int rprt = matchRprt.captured(1).toInt();
|
|
if (rprt != 0)
|
|
{
|
|
qWarning() << "RotCtrlDProtocol::readData - rotctld error: " << errors[-rprt];
|
|
// Seem to get a lot of EPROTO errors from rotctld due to extra 00 char in response to GS232 C2 command
|
|
// E.g: ./rotctld.exe -m 603 -r com7 -vvvvv
|
|
// read_string(): RX 16 characters
|
|
// 0000 00 41 5a 3d 31 37 35 20 20 45 4c 3d 30 33 38 0d .AZ=175 EL=038.
|
|
// So don't pass these to GUI for now
|
|
if (rprt != -8) {
|
|
reportError(QString("rotctld error: %1").arg(errors[-rprt]));
|
|
}
|
|
}
|
|
m_rotCtlDReadAz = false;
|
|
}
|
|
else if (matchDecimal.hasMatch() && !m_rotCtlDReadAz)
|
|
{
|
|
m_rotCtlDAz = response;
|
|
m_rotCtlDReadAz = true;
|
|
}
|
|
else if (matchDecimal.hasMatch() && m_rotCtlDReadAz)
|
|
{
|
|
QString az = m_rotCtlDAz;
|
|
QString el = response;
|
|
m_rotCtlDReadAz = false;
|
|
//qDebug() << "RotCtrlDProtocol::readData read Az " << az << " El " << el;
|
|
reportAzEl(az.toFloat(), el.toFloat());
|
|
}
|
|
else
|
|
{
|
|
qWarning() << "RotCtrlDProtocol::readData - Unexpected rotctld response \"" << response << "\"";
|
|
reportError(QString("Unexpected rotctld response: %1").arg(response));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Request current Az/El from rotctrld
|
|
void RotCtrlDProtocol::update()
|
|
{
|
|
QByteArray cmd("p\n");
|
|
m_device->write(cmd);
|
|
}
|
|
|