mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-11-03 21:20:31 -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);
 | 
						|
}
 | 
						|
 |