1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-11-13 20:01:46 -05:00
sdrangel/plugins/channelrx/remotetcpsink/remotetcpprotocol.h
2022-12-20 11:13:25 +00:00

187 lines
6.9 KiB
C++

///////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2018 Edouard Griffiths, F4EXB //
// Copyright (C) 2022 Jon Beniston, M7RCE //
// //
// 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/>. //
///////////////////////////////////////////////////////////////////////////////////
#ifndef PLUGINS_CHANNELRX_REMOTETCPSINK_REMOTETCPPROTOCOL_H_
#define PLUGINS_CHANNELRX_REMOTETCPSINK_REMOTETCPPROTOCOL_H_
#include <QString>
// Remote TCP protocol based on rtl_tcp (for compatibility) with a few extensions (as SDRangel supports more SDRs)
class RemoteTCPProtocol
{
public:
enum Device {
// These are compatible with rtl_tcp
UNKNOWN = 0,
RTLSDR_E4000,
RTLSDR_FC0012,
RTLSDR_FC0013,
RTLSDR_FC2580,
RTLSDR_R820T, // Used by rsp_tcp
RTLSDR_R828D,
// SDRangel extensions that correspond to sample source devices
AIRSPY = 0x80,
AIRSPY_HF,
AUDIO_INPUT,
BLADE_RF1,
BLADE_RF2,
FCD_PRO,
FCD_PRO_PLUS,
FILE_INPUT,
HACK_RF,
KIWI_SDR,
LIME_SDR,
LOCAL_INPUT,
PERSEUS,
PLUTO_SDR,
REMOTE_INPUT,
REMOTE_TCP_INPUT,
SDRPLAY_1,
SDRPLAY_V3_RSP1,
SDRPLAY_V3_RSP1A,
SDRPLAY_V3_RSP2,
SDRPLAY_V3_RSPDUO,
SDRPLAY_V3_RSPDX,
SIGMF_FILE_INPUT,
SOAPY_SDR,
TEST_SOURCE,
USRP,
XTRX
};
enum Command {
// These are compatbile with osmocom rtl_tcp: https://github.com/osmocom/rtl-sdr/blob/master/src/rtl_tcp.c
// and Android https://github.com/signalwareltd/rtl_tcp_andro-/blob/master/rtlsdr/src/main/cpp/src/tcp_commands.h
setCenterFrequency = 0x1, // rtlsdr_set_center_freq
setSampleRate = 0x2, // rtlsdr_set_sample_rate
setTunerGainMode = 0x3, // rtlsdr_set_tuner_gain_mode
setTunerGain = 0x4, // rtlsdr_set_tuner_gain
setFrequencyCorrection = 0x5, // rtlsdr_set_freq_correction
setTunerIFGain = 0x6, // rtlsdr_set_tuner_if_gain - Used by SDRangel to set LNA/VGA/IF gain individually
setTestMode = 0x7, // Not supported by SDRangel
setAGCMode = 0x8, // rtlsdr_set_agc_mode
setDirectSampling = 0x9, // rtlsdr_set_direct_sampling
setOffsetTuning = 0xa,
setXtalFrequency = 0xb, // Not supported by SDRangel
setXtalFrequency2 = 0xc, // Not supported by SDRangel
setGainByIndex = 0xd, // Not supported by SDRangel
setBiasTee = 0xe, // rtlsdr_set_bias_tee (Not supported on Android)
// These extensions are from rsp_tcp: https://github.com/SDRplay/RSPTCPServer/blob/master/rsp_tcp_api.h
rspSetAntenna = 0x1f,
rspSetLNAState = 0x20,
rspSetIfGainR = 0x21,
rspSetAGC = 0x22,
rspSetAGCSetPoint = 0x23,
rspSetNotch = 0x24,
rspSetBiasT = 0x25,
rspSetRefOut = 0x26,
// These extensions are from librtlsdr rtl_tcp: https://github.com/librtlsdr/librtlsdr/blob/development/include/rtl_tcp.h
setTunerBandwidth = 0x40,
// Android extensions https://github.com/signalwareltd/rtl_tcp_andro-/blob/master/rtlsdr/src/main/cpp/src/tcp_commands.h
androidExit = 0x7e,
androidGainByPercentage = 0x7f,
androidEnable16BitSigned = 0x80, // SDRplay, not RTL SDR
// These are SDRangel extensions
setDCOffsetRemoval = 0xc0,
setIQCorrection = 0xc1,
setDecimation = 0xc2, // Device to baseband decimation
setChannelSampleRate = 0xc3,
setChannelFreqOffset = 0xc4,
setChannelGain = 0xc5,
setSampleBitDepth = 0xc6, // Bit depth for samples sent over network
//setAntenna?
//setLOOffset?
};
static const int m_rtl0MetaDataSize = 12;
static const int m_rsp0MetaDataSize = 45;
static const int m_sdraMetaDataSize = 64;
static void encodeInt16(quint8 *p, qint16 data)
{
p[0] = (data >> 8) & 0xff;
p[1] = data & 0xff;
}
static void encodeUInt32(quint8 *p, quint32 data)
{
p[0] = (data >> 24) & 0xff;
p[1] = (data >> 16) & 0xff;
p[2] = (data >> 8) & 0xff;
p[3] = data & 0xff;
}
static void encodeInt32(quint8 *p, qint32 data)
{
encodeUInt32(p, (quint32)data);
}
static qint16 extractInt16(quint8 *p)
{
qint16 data;
data = (p[1] & 0xff)
| ((p[0] & 0xff) << 8);
return data;
}
static quint32 extractUInt32(quint8 *p)
{
quint32 data;
data = (p[3] & 0xff)
| ((p[2] & 0xff) << 8)
| ((p[1] & 0xff) << 16)
| ((p[0] & 0xff) << 24);
return data;
}
static qint32 extractInt32(quint8 *p)
{
return (qint32)extractUInt32(p);
}
static void encodeUInt64(quint8 *p, quint64 data)
{
p[0] = (data >> 56) & 0xff;
p[1] = (data >> 48) & 0xff;
p[2] = (data >> 40) & 0xff;
p[3] = (data >> 32) & 0xff;
p[4] = (data >> 24) & 0xff;
p[5] = (data >> 16) & 0xff;
p[6] = (data >> 8) & 0xff;
p[7] = data & 0xff;
}
static quint64 extractUInt64(quint8 *p)
{
quint64 data;
data = (p[7] & 0xff)
| ((p[6] & 0xff) << 8)
| ((p[5] & 0xff) << 16)
| ((p[4] & 0xff) << 24)
| (((quint64)(p[3] & 0xff)) << 32)
| (((quint64)(p[2] & 0xff)) << 40)
| (((quint64)(p[1] & 0xff)) << 48)
| (((quint64)(p[0] & 0xff)) << 56);
return data;
}
};
#endif /* PLUGINS_CHANNELRX_REMOTETCPSINK_REMOTETCPPROTOCOL_H_ */