mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-11-04 05:30:32 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			158 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			158 lines
		
	
	
		
			5.5 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 <QRegularExpression>
 | 
						|
 | 
						|
#include "maincore.h"
 | 
						|
#include "channel/channelwebapiutils.h"
 | 
						|
 | 
						|
#include "gs232controllerreport.h"
 | 
						|
#include "controllerprotocol.h"
 | 
						|
#include "gs232protocol.h"
 | 
						|
#include "spidprotocol.h"
 | 
						|
#include "rotctrldprotocol.h"
 | 
						|
#include "dfmprotocol.h"
 | 
						|
 | 
						|
ControllerProtocol::ControllerProtocol() :
 | 
						|
    m_device(nullptr),
 | 
						|
    m_lastAzimuth(-1.0f),
 | 
						|
    m_lastElevation(-1.0f),
 | 
						|
    m_msgQueueToFeature(nullptr)
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
ControllerProtocol::~ControllerProtocol()
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
void ControllerProtocol::setAzimuth(float azimuth)
 | 
						|
{
 | 
						|
    setAzimuthElevation(azimuth, m_lastElevation);
 | 
						|
    m_lastAzimuth = azimuth;
 | 
						|
}
 | 
						|
 | 
						|
void ControllerProtocol::setAzimuthElevation(float azimuth, float elevation)
 | 
						|
{
 | 
						|
    m_lastAzimuth = azimuth;
 | 
						|
    m_lastElevation = elevation;
 | 
						|
}
 | 
						|
 | 
						|
void ControllerProtocol::applySettings(const GS232ControllerSettings& settings, const QList<QString>& settingsKeys, bool force)
 | 
						|
{
 | 
						|
    if (force) {
 | 
						|
        m_settings = settings;
 | 
						|
    } else {
 | 
						|
        m_settings.applySettings(settingsKeys, settings);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void ControllerProtocol::sendMessage(Message *message)
 | 
						|
{
 | 
						|
    m_msgQueueToFeature->push(message);
 | 
						|
}
 | 
						|
 | 
						|
void ControllerProtocol::reportAzEl(float az, float el)
 | 
						|
{
 | 
						|
    m_msgQueueToFeature->push(GS232ControllerReport::MsgReportAzAl::create(az, el));
 | 
						|
}
 | 
						|
 | 
						|
void ControllerProtocol::reportError(const QString &message)
 | 
						|
{
 | 
						|
    m_msgQueueToFeature->push(GS232Controller::MsgReportWorker::create(message));
 | 
						|
}
 | 
						|
 | 
						|
void ControllerProtocol::getPosition(float& latitude, float& longitude)
 | 
						|
{
 | 
						|
    if (!m_settings.m_track)
 | 
						|
    {
 | 
						|
        // When not tracking, use My Position from preferences
 | 
						|
        // although this precludes having different antennas at different positions
 | 
						|
        latitude = MainCore::instance()->getSettings().getLatitude();
 | 
						|
        longitude = MainCore::instance()->getSettings().getLongitude();
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
        // When tracking, get position from Star Tracker / Sat Tracker
 | 
						|
        QRegularExpression re("([FTR])(\\d+):(\\d+)");
 | 
						|
        QRegularExpressionMatch match = re.match(m_settings.m_source);
 | 
						|
        if (match.hasMatch())
 | 
						|
        {
 | 
						|
            QString kind = match.captured(1);
 | 
						|
            int setIndex = match.captured(2).toInt();
 | 
						|
            int index = match.captured(3).toInt();
 | 
						|
            if (kind == 'F')
 | 
						|
            {
 | 
						|
                double lat, lon;
 | 
						|
                bool latOk = ChannelWebAPIUtils::getFeatureSetting(setIndex, index, "latitude", lat);
 | 
						|
                bool lonOk = ChannelWebAPIUtils::getFeatureSetting(setIndex, index, "longitude", lon);
 | 
						|
                if (latOk && lonOk)
 | 
						|
                {
 | 
						|
                    latitude = (float)lat;
 | 
						|
                    longitude = (float)lon;
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    qDebug() << "ControllerProtocol::getPosition - Failed to get position from source: " << m_settings.m_source;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                double lat, lon;
 | 
						|
                bool latOk = ChannelWebAPIUtils::getChannelSetting(setIndex, index, "latitude", lat);
 | 
						|
                bool lonOk = ChannelWebAPIUtils::getChannelSetting(setIndex, index, "longitude", lon);
 | 
						|
                if (latOk && lonOk)
 | 
						|
                {
 | 
						|
                    latitude = (float)lat;
 | 
						|
                    longitude = (float)lon;
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    qDebug() << "ControllerProtocol::getPosition - Failed to get position from source: " << m_settings.m_source;
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        else
 | 
						|
        {
 | 
						|
            qDebug() << "ControllerProtocol::getPosition - Couldn't parse source: " << m_settings.m_source;
 | 
						|
        }
 | 
						|
    }
 | 
						|
    //qDebug() << "ControllerProtocol::getPosition: " << latitude << longitude;
 | 
						|
}
 | 
						|
 | 
						|
ControllerProtocol *ControllerProtocol::create(GS232ControllerSettings::Protocol protocol)
 | 
						|
{
 | 
						|
    switch (protocol)
 | 
						|
    {
 | 
						|
    case GS232ControllerSettings::GS232:
 | 
						|
        return new GS232Protocol();
 | 
						|
        break;
 | 
						|
    case GS232ControllerSettings::SPID:
 | 
						|
        return new SPIDProtocol();
 | 
						|
        break;
 | 
						|
    case GS232ControllerSettings::ROTCTLD:
 | 
						|
        return new RotCtrlDProtocol();
 | 
						|
        break;
 | 
						|
    case GS232ControllerSettings::DFM:
 | 
						|
        return new DFMProtocol();
 | 
						|
        break;
 | 
						|
    default:
 | 
						|
        return nullptr;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
 |