mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-11-11 02:46:12 -05:00
commit
5b05b13c5d
@ -148,7 +148,7 @@ static int runQtApplication(int argc, char* argv[], qtwebapp::LoggerWithFile *lo
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef ANDROID
|
#ifdef ANDROID
|
||||||
// Default sized sliders can be hard to move using touch GUIs, so increase szie
|
// Default sized sliders can be hard to move using touch GUIs, so increase size
|
||||||
// FIXME: How can we do a double border around the handle, as Fusion style seems to use?
|
// FIXME: How can we do a double border around the handle, as Fusion style seems to use?
|
||||||
// Dialog borders are hard to see as is (perhaps as Android doesn't have a title bar), so use same color as for MDI
|
// Dialog borders are hard to see as is (perhaps as Android doesn't have a title bar), so use same color as for MDI
|
||||||
qApp->setStyleSheet("QSlider {min-height: 20px; } "
|
qApp->setStyleSheet("QSlider {min-height: 20px; } "
|
||||||
@ -189,7 +189,7 @@ static int runQtApplication(int argc, char* argv[], qtwebapp::LoggerWithFile *lo
|
|||||||
{
|
{
|
||||||
// Disable log on console, so we can more easily see device list
|
// Disable log on console, so we can more easily see device list
|
||||||
logger->setConsoleMinMessageLevel(QtFatalMsg);
|
logger->setConsoleMinMessageLevel(QtFatalMsg);
|
||||||
// Don't pass logger to MainWindow, otherwise it can reenable log output
|
// Don't pass logger to MainWindow, otherwise it can re-enable log output
|
||||||
logger = nullptr;
|
logger = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -217,7 +217,7 @@ int main(int argc, char* argv[])
|
|||||||
// Request OpenGL 3.3 context, needed for glspectrum and 3D Map feature
|
// Request OpenGL 3.3 context, needed for glspectrum and 3D Map feature
|
||||||
// Note that Mac only supports CoreProfile, so any deprecated OpenGL 2 features
|
// Note that Mac only supports CoreProfile, so any deprecated OpenGL 2 features
|
||||||
// will not work. Because of this, we have two versions of the shaders:
|
// will not work. Because of this, we have two versions of the shaders:
|
||||||
// OpenGL 2 versions for compatiblity with older drivers and OpenGL 3.3
|
// OpenGL 2 versions for compatibility with older drivers and OpenGL 3.3
|
||||||
// versions for newer drivers
|
// versions for newer drivers
|
||||||
#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
|
#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
|
||||||
QGLFormat fmt;
|
QGLFormat fmt;
|
||||||
|
@ -100,7 +100,7 @@ static int runQtApplication(int argc, char* argv[], qtwebapp::LoggerWithFile *lo
|
|||||||
{
|
{
|
||||||
// Disable log on console, so we can more easily see device list
|
// Disable log on console, so we can more easily see device list
|
||||||
logger->setConsoleMinMessageLevel(QtFatalMsg);
|
logger->setConsoleMinMessageLevel(QtFatalMsg);
|
||||||
// Don't pass logger to MainServer, otherwise it can reenable log output
|
// Don't pass logger to MainServer, otherwise it can re-enable log output
|
||||||
logger = nullptr;
|
logger = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@ bool DeviceUSRPParams::open(const QString &deviceStr, bool channelNumOnly)
|
|||||||
qDebug() << "DeviceUSRPParams::open: m_nbRxChannels: " << m_nbRxChannels << " m_nbTxChannels: " << m_nbTxChannels;
|
qDebug() << "DeviceUSRPParams::open: m_nbRxChannels: " << m_nbRxChannels << " m_nbTxChannels: " << m_nbTxChannels;
|
||||||
|
|
||||||
// Speed up program initialisation, by not getting all properties
|
// Speed up program initialisation, by not getting all properties
|
||||||
// If we could find out number of channles without ::make ing the device
|
// If we could find out number of channels without ::make ing the device
|
||||||
// that would be even better
|
// that would be even better
|
||||||
if (!channelNumOnly)
|
if (!channelNumOnly)
|
||||||
{
|
{
|
||||||
|
@ -81,7 +81,7 @@ void fcdClose(hid_device *phd);
|
|||||||
FCD_MODE_ENUM fcdGetMode(hid_device *phd);
|
FCD_MODE_ENUM fcdGetMode(hid_device *phd);
|
||||||
|
|
||||||
/** \brief Get FCD firmware version as string.
|
/** \brief Get FCD firmware version as string.
|
||||||
* \param str The returned vesion number as a 0 terminated string (must be pre-allocated)
|
* \param str The returned version number as a 0 terminated string (must be pre-allocated)
|
||||||
* \return The current FCD mode.
|
* \return The current FCD mode.
|
||||||
* \sa FCD_MODE_ENUM
|
* \sa FCD_MODE_ENUM
|
||||||
*/
|
*/
|
||||||
@ -183,7 +183,7 @@ FCD_MODE_ENUM fcdBlWriteFirmware(hid_device *phd, char *pc, int64_t n64Size);
|
|||||||
/** \brief Verify firmware in FCd flash.
|
/** \brief Verify firmware in FCd flash.
|
||||||
* \param pc Pointer to firmware data to verify against.
|
* \param pc Pointer to firmware data to verify against.
|
||||||
* \param n64Size Size of the data in pc.
|
* \param n64Size Size of the data in pc.
|
||||||
* \return The FCD_MODE_BL if verification was succesful.
|
* \return The FCD_MODE_BL if verification was successful.
|
||||||
*
|
*
|
||||||
* This function verifies the firmware currently in the FCd flash against the firmware
|
* This function verifies the firmware currently in the FCd flash against the firmware
|
||||||
* image pointed to by pc. The function return FCD_MODE_BL if the verification is OK and
|
* image pointed to by pc. The function return FCD_MODE_BL if the verification is OK and
|
||||||
|
@ -652,7 +652,7 @@ void FT8::go(int npasses)
|
|||||||
// in fractions of bins in off and hz.
|
// in fractions of bins in off and hz.
|
||||||
//
|
//
|
||||||
|
|
||||||
// just do this once, re-use for every fractional fft_shift
|
// just do this once, reuse for every fractional fft_shift
|
||||||
// and down_v7_f() to 200 sps.
|
// and down_v7_f() to 200 sps.
|
||||||
std::vector<std::complex<float>> bins = fftEngine_->one_fft(
|
std::vector<std::complex<float>> bins = fftEngine_->one_fft(
|
||||||
samples_, 0, samples_.size());
|
samples_, 0, samples_.size());
|
||||||
@ -2273,7 +2273,7 @@ std::vector<float> FT8::extract_bits(const std::vector<int> &syms, const std::ve
|
|||||||
return bits;
|
return bits;
|
||||||
}
|
}
|
||||||
|
|
||||||
// decode successive pairs of symbols. exploits the likelyhood
|
// decode successive pairs of symbols. exploits the likelihood
|
||||||
// that they have the same phase, by summing the complex
|
// that they have the same phase, by summing the complex
|
||||||
// correlations for each possible pair and using the max.
|
// correlations for each possible pair and using the max.
|
||||||
void FT8::soft_decode_pairs(
|
void FT8::soft_decode_pairs(
|
||||||
@ -2573,7 +2573,7 @@ void FT8::soft_decode_triples(
|
|||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// given log likelyhood for each bit, try LDPC and OSD decoders.
|
// given log likelihood for each bit, try LDPC and OSD decoders.
|
||||||
// on success, puts corrected 174 bits into a174[].
|
// on success, puts corrected 174 bits into a174[].
|
||||||
//
|
//
|
||||||
int FT8::decode(const float ll174[], int a174[], FT8Params& _params, int use_osd, std::string &comment)
|
int FT8::decode(const float ll174[], int a174[], FT8Params& _params, int use_osd, std::string &comment)
|
||||||
|
@ -264,14 +264,14 @@ public:
|
|||||||
|
|
||||||
FT8Params& getParams() { return params; }
|
FT8Params& getParams() { return params; }
|
||||||
//
|
//
|
||||||
// given log likelyhood for each bit, try LDPC and OSD decoders.
|
// given log likelihood for each bit, try LDPC and OSD decoders.
|
||||||
// on success, puts corrected 174 bits into a174[].
|
// on success, puts corrected 174 bits into a174[].
|
||||||
//
|
//
|
||||||
static int decode(const float ll174[], int a174[], FT8Params& params, int use_osd, std::string &comment);
|
static int decode(const float ll174[], int a174[], FT8Params& params, int use_osd, std::string &comment);
|
||||||
// encode a 77 bit message into a 174 bit payload
|
// encode a 77 bit message into a 174 bit payload
|
||||||
// adds the 14 bit CRC to obtain 91 bits
|
// adds the 14 bit CRC to obtain 91 bits
|
||||||
// apply (174, 91) generator mastrix to obtain the 83 parity bits
|
// apply (174, 91) generator mastrix to obtain the 83 parity bits
|
||||||
// append the 83 bits to the 91 bits messag e+ crc to obbain the 174 bit payload
|
// append the 83 bits to the 91 bits message e+ crc to obtain the 174 bit payload
|
||||||
static void encode(int a174[], int s77[]);
|
static void encode(int a174[], int s77[]);
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -490,7 +490,7 @@ private:
|
|||||||
// scaled by str.
|
// scaled by str.
|
||||||
//
|
//
|
||||||
std::vector<float> extract_bits(const std::vector<int> &syms, const std::vector<float> str);
|
std::vector<float> extract_bits(const std::vector<int> &syms, const std::vector<float> str);
|
||||||
// decode successive pairs of symbols. exploits the likelyhood
|
// decode successive pairs of symbols. exploits the likelihood
|
||||||
// that they have the same phase, by summing the complex
|
// that they have the same phase, by summing the complex
|
||||||
// correlations for each possible pair and using the max.
|
// correlations for each possible pair and using the max.
|
||||||
void soft_decode_pairs(
|
void soft_decode_pairs(
|
||||||
|
@ -36,7 +36,7 @@ public:
|
|||||||
static int osd_decode(float codeword[174], int depth, int out[91], int *out_depth);
|
static int osd_decode(float codeword[174], int depth, int out[91], int *out_depth);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namepsace FT8
|
} // namespace FT8
|
||||||
|
|
||||||
#endif // osd_h
|
#endif // osd_h
|
||||||
|
|
||||||
|
@ -388,7 +388,7 @@ std::string Packing::unpack_5(int a77[], std::string& call1str, std::string& cal
|
|||||||
hashes_mu.unlock();
|
hashes_mu.unlock();
|
||||||
call2str = std::string(ocall);
|
call2str = std::string(ocall);
|
||||||
|
|
||||||
// mext bit is alway for R
|
// mext bit is always for R
|
||||||
int i = 12+ 22 +1;
|
int i = 12+ 22 +1;
|
||||||
// r3
|
// r3
|
||||||
int rst = un64(a77, i, 3);
|
int rst = un64(a77, i, 3);
|
||||||
|
@ -249,7 +249,7 @@ void HttpConnectionHandler::read()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// In case of HTTP 1.0 protocol add the Connection:close header.
|
// In case of HTTP 1.0 protocol add the Connection:close header.
|
||||||
// This ensures that the HttpResponse does not activate chunked mode, which is not spported by HTTP 1.0.
|
// This ensures that the HttpResponse does not activate chunked mode, which is not supported by HTTP 1.0.
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
bool http1_0=QString::compare(currentRequest->getVersion(),"HTTP/1.0",Qt::CaseInsensitive)==0;
|
bool http1_0=QString::compare(currentRequest->getVersion(),"HTTP/1.0",Qt::CaseInsensitive)==0;
|
||||||
|
@ -19,7 +19,7 @@ HttpListener::HttpListener(QSettings* settings, HttpRequestHandler* requestHandl
|
|||||||
pool = 0;
|
pool = 0;
|
||||||
this->settings = settings;
|
this->settings = settings;
|
||||||
this->requestHandler = requestHandler;
|
this->requestHandler = requestHandler;
|
||||||
// Reqister type of socketDescriptor for signal/slot handling
|
// Register type of socketDescriptor for signal/slot handling
|
||||||
qRegisterMetaType<tSocketDescriptor>("tSocketDescriptor");
|
qRegisterMetaType<tSocketDescriptor>("tSocketDescriptor");
|
||||||
// Start listening
|
// Start listening
|
||||||
listen();
|
listen();
|
||||||
@ -33,7 +33,7 @@ HttpListener::HttpListener(const HttpListenerSettings& settings, HttpRequestHand
|
|||||||
this->settings = 0;
|
this->settings = 0;
|
||||||
listenerSettings = settings;
|
listenerSettings = settings;
|
||||||
this->requestHandler = requestHandler;
|
this->requestHandler = requestHandler;
|
||||||
// Reqister type of socketDescriptor for signal/slot handling
|
// Register type of socketDescriptor for signal/slot handling
|
||||||
qRegisterMetaType<tSocketDescriptor>("tSocketDescriptor");
|
qRegisterMetaType<tSocketDescriptor>("tSocketDescriptor");
|
||||||
// Start listening
|
// Start listening
|
||||||
listen();
|
listen();
|
||||||
|
@ -73,7 +73,7 @@ public:
|
|||||||
virtual ~HttpListener();
|
virtual ~HttpListener();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Restart listeing after close().
|
Restart listening after close().
|
||||||
*/
|
*/
|
||||||
void listen();
|
void listen();
|
||||||
|
|
||||||
@ -108,7 +108,7 @@ private:
|
|||||||
/** Configuration settings for the HTTP server as a structure */
|
/** Configuration settings for the HTTP server as a structure */
|
||||||
HttpListenerSettings listenerSettings;
|
HttpListenerSettings listenerSettings;
|
||||||
|
|
||||||
/** Point to the reuqest handler which processes all HTTP requests */
|
/** Point to the request handler which processes all HTTP requests */
|
||||||
HttpRequestHandler* requestHandler;
|
HttpRequestHandler* requestHandler;
|
||||||
|
|
||||||
/** Pool of connection handlers */
|
/** Pool of connection handlers */
|
||||||
|
@ -425,7 +425,7 @@ void HttpRequest::parseMultiPartFile()
|
|||||||
while (!tempFile->atEnd() && !finished && !tempFile->error())
|
while (!tempFile->atEnd() && !finished && !tempFile->error())
|
||||||
{
|
{
|
||||||
#ifdef SUPERVERBOSE
|
#ifdef SUPERVERBOSE
|
||||||
qDebug("HttpRequest::parseMultiPartFile: reading multpart headers");
|
qDebug("HttpRequest::parseMultiPartFile: reading multipart headers");
|
||||||
#endif
|
#endif
|
||||||
QByteArray fieldName;
|
QByteArray fieldName;
|
||||||
QByteArray fileName;
|
QByteArray fileName;
|
||||||
@ -464,7 +464,7 @@ void HttpRequest::parseMultiPartFile()
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef SUPERVERBOSE
|
#ifdef SUPERVERBOSE
|
||||||
qDebug("HttpRequest::parseMultiPartFile: reading multpart data");
|
qDebug("HttpRequest::parseMultiPartFile: reading multipart data");
|
||||||
#endif
|
#endif
|
||||||
QTemporaryFile* uploadedFile=0;
|
QTemporaryFile* uploadedFile=0;
|
||||||
QByteArray fieldValue;
|
QByteArray fieldValue;
|
||||||
|
@ -26,7 +26,7 @@ namespace qtwebapp {
|
|||||||
from a TCP socket and provides getters for the individual parts
|
from a TCP socket and provides getters for the individual parts
|
||||||
of the request.
|
of the request.
|
||||||
<p>
|
<p>
|
||||||
The follwing config settings are required:
|
The following config settings are required:
|
||||||
<code><pre>
|
<code><pre>
|
||||||
maxRequestSize=16000
|
maxRequestSize=16000
|
||||||
maxMultiPartSize=1000000
|
maxMultiPartSize=1000000
|
||||||
@ -73,7 +73,7 @@ public:
|
|||||||
void readFromSocket(QTcpSocket* socket);
|
void readFromSocket(QTcpSocket* socket);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Get the status of this reqeust.
|
Get the status of this request.
|
||||||
@see RequestStatus
|
@see RequestStatus
|
||||||
*/
|
*/
|
||||||
RequestStatus getStatus() const;
|
RequestStatus getStatus() const;
|
||||||
|
@ -48,7 +48,7 @@ namespace qtwebapp {
|
|||||||
|
|
||||||
@see set() describes how to set logger variables
|
@see set() describes how to set logger variables
|
||||||
@see LogMessage for a description of the message decoration.
|
@see LogMessage for a description of the message decoration.
|
||||||
@see Logger for a descrition of the buffer.
|
@see Logger for a description of the buffer.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class LOGGING_API FileLogger : public Logger {
|
class LOGGING_API FileLogger : public Logger {
|
||||||
|
@ -66,7 +66,7 @@ public:
|
|||||||
Constructor.
|
Constructor.
|
||||||
@param msgFormat Format of the decoration, e.g. "{timestamp} {type} thread={thread}: {msg}"
|
@param msgFormat Format of the decoration, e.g. "{timestamp} {type} thread={thread}: {msg}"
|
||||||
@param timestampFormat Format of timestamp, e.g. "yyyy-MM-dd HH:mm:ss.zzz"
|
@param timestampFormat Format of timestamp, e.g. "yyyy-MM-dd HH:mm:ss.zzz"
|
||||||
@param minLevel Minimum severity that genertes an output (0=debug, 1=warning, 2=critical, 3=fatal).
|
@param minLevel Minimum severity that generates an output (0=debug, 1=warning, 2=critical, 3=fatal).
|
||||||
@param bufferSize Size of the backtrace buffer, number of messages per thread. 0=disabled.
|
@param bufferSize Size of the backtrace buffer, number of messages per thread. 0=disabled.
|
||||||
@param parent Parent object
|
@param parent Parent object
|
||||||
@see LogMessage for a description of the message decoration.
|
@see LogMessage for a description of the message decoration.
|
||||||
|
@ -38,7 +38,7 @@ namespace modemm17 {
|
|||||||
// 0.001661182944400927, 0.002699564567597445, 0.0031468394550958484, 0.0029364388513841593, 0.0
|
// 0.001661182944400927, 0.002699564567597445, 0.0031468394550958484, 0.0029364388513841593, 0.0
|
||||||
// };
|
// };
|
||||||
|
|
||||||
// Generated using scikit-commpy N = 150, aplha = 0.5, Ts = 1/4800 s, Fs = 48000 Hz
|
// Generated using scikit-commpy N = 150, alpha = 0.5, Ts = 1/4800 s, Fs = 48000 Hz
|
||||||
const std::array<float, 150> M17Demodulator::rrc_taps = std::array<float, 150>{
|
const std::array<float, 150> M17Demodulator::rrc_taps = std::array<float, 150>{
|
||||||
-8.434122e-04, +3.898184e-04, +1.628891e-03, +2.576674e-03, +2.987740e-03,
|
-8.434122e-04, +3.898184e-04, +1.628891e-03, +2.576674e-03, +2.987740e-03,
|
||||||
+2.729505e-03, +1.820181e-03, +4.333001e-04, -1.134215e-03, -2.525029e-03,
|
+2.729505e-03, +1.820181e-03, +4.333001e-04, -1.134215e-03, -2.525029e-03,
|
||||||
|
@ -50,7 +50,7 @@ const std::array<uint8_t, 2> M17Modulator::EOT_SYNC = {0x55, 0x5D}; // ?
|
|||||||
// 0.001661182944400927, 0.002699564567597445, 0.0031468394550958484, 0.0029364388513841593, 0.0 // 150
|
// 0.001661182944400927, 0.002699564567597445, 0.0031468394550958484, 0.0029364388513841593, 0.0 // 150
|
||||||
// };
|
// };
|
||||||
|
|
||||||
// Generated using scikit-commpy N = 150, aplha = 0.5, Ts = 1/4800 s, Fs = 48000 Hz
|
// Generated using scikit-commpy N = 150, alpha = 0.5, Ts = 1/4800 s, Fs = 48000 Hz
|
||||||
/*
|
/*
|
||||||
import sys
|
import sys
|
||||||
import commpy.filters
|
import commpy.filters
|
||||||
|
@ -71,7 +71,7 @@ public:
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct the DFT with an array of frequencies. These frequencies
|
* Construct the DFT with an array of frequencies. These frequencies
|
||||||
* should be less than @tparam SampleRate / 2 and a mulitple of
|
* should be less than @tparam SampleRate / 2 and a multiple of
|
||||||
* @tparam SampleRate / @tparam N. No validation is performed on
|
* @tparam SampleRate / @tparam N. No validation is performed on
|
||||||
* these frequencies passed to the constructor.
|
* these frequencies passed to the constructor.
|
||||||
*/
|
*/
|
||||||
|
@ -32,7 +32,7 @@ public:
|
|||||||
/// \brief Set all data (yaw, alt, height)
|
/// \brief Set all data (yaw, alt, height)
|
||||||
///
|
///
|
||||||
/// \param azPos - forward (positive angles side relative to antennas direction) azimuth (in degrees)
|
/// \param azPos - forward (positive angles side relative to antennas direction) azimuth (in degrees)
|
||||||
/// \param azNeg - reverse (negatve angles side relative to antennas direction) azimuth (in degrees)
|
/// \param azNeg - reverse (negative angles side relative to antennas direction) azimuth (in degrees)
|
||||||
/// \param azAnt - antennas azimuth from 1 (connected to stream 0) to 2 (connected to stream 1)
|
/// \param azAnt - antennas azimuth from 1 (connected to stream 0) to 2 (connected to stream 1)
|
||||||
///
|
///
|
||||||
void setData(double azPos, double azNeg, double azAnt) {
|
void setData(double azPos, double azNeg, double azAnt) {
|
||||||
|
@ -126,7 +126,7 @@ bool ADSBDemodBaseband::handleMessage(const Message& cmd)
|
|||||||
QMutexLocker mutexLocker(&m_mutex);
|
QMutexLocker mutexLocker(&m_mutex);
|
||||||
DSPSignalNotification& notif = (DSPSignalNotification&) cmd;
|
DSPSignalNotification& notif = (DSPSignalNotification&) cmd;
|
||||||
qDebug() << "ADSBDemodBaseband::handleMessage: DSPSignalNotification: basebandSampleRate: " << notif.getSampleRate();
|
qDebug() << "ADSBDemodBaseband::handleMessage: DSPSignalNotification: basebandSampleRate: " << notif.getSampleRate();
|
||||||
m_sampleFifo.setSize(SampleSinkFifo::getSizePolicy(8*notif.getSampleRate())); // Need a large FIFO otherwise we get overflows - revist after better upsampling
|
m_sampleFifo.setSize(SampleSinkFifo::getSizePolicy(8*notif.getSampleRate())); // Need a large FIFO otherwise we get overflows - revisit after better upsampling
|
||||||
m_channelizer->setBasebandSampleRate(notif.getSampleRate());
|
m_channelizer->setBasebandSampleRate(notif.getSampleRate());
|
||||||
m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset());
|
m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset());
|
||||||
|
|
||||||
|
@ -1231,7 +1231,7 @@ void ADSBDemodGUI::callsignToFlight(Aircraft *aircraft)
|
|||||||
if (!aircraft->m_callsign.isEmpty())
|
if (!aircraft->m_callsign.isEmpty())
|
||||||
{
|
{
|
||||||
QRegularExpression flightNoExp("^[A-Z]{2,3}[0-9]{1,4}$");
|
QRegularExpression flightNoExp("^[A-Z]{2,3}[0-9]{1,4}$");
|
||||||
// Airlines line BA add a single charater suffix that can be stripped
|
// Airlines line BA add a single character suffix that can be stripped
|
||||||
// If the suffix is two characters, then it typically means a digit
|
// If the suffix is two characters, then it typically means a digit
|
||||||
// has been replaced which I don't know how to guess
|
// has been replaced which I don't know how to guess
|
||||||
// E.g Easyjet might use callsign EZY67JQ for flight EZY6267
|
// E.g Easyjet might use callsign EZY67JQ for flight EZY6267
|
||||||
@ -1424,7 +1424,7 @@ void ADSBDemodGUI::handleADSB(
|
|||||||
|
|
||||||
if (wasOnSurface != aircraft->m_onSurface)
|
if (wasOnSurface != aircraft->m_onSurface)
|
||||||
{
|
{
|
||||||
// Can't mix CPR values used on surface and those that are airbourne
|
// Can't mix CPR values used on surface and those that are airborne
|
||||||
aircraft->m_cprValid[0] = false;
|
aircraft->m_cprValid[0] = false;
|
||||||
aircraft->m_cprValid[1] = false;
|
aircraft->m_cprValid[1] = false;
|
||||||
}
|
}
|
||||||
@ -1516,7 +1516,7 @@ void ADSBDemodGUI::handleADSB(
|
|||||||
}
|
}
|
||||||
else if (((tc >= 9) && (tc <= 18)) || ((tc >= 20) && (tc <= 22)))
|
else if (((tc >= 9) && (tc <= 18)) || ((tc >= 20) && (tc <= 22)))
|
||||||
{
|
{
|
||||||
// Airbourne position (9-18 baro, 20-22 GNSS)
|
// Airborne position (9-18 baro, 20-22 GNSS)
|
||||||
int alt = ((data[5] & 0xff) << 4) | ((data[6] >> 4) & 0xf); // Altitude
|
int alt = ((data[5] & 0xff) << 4) | ((data[6] >> 4) & 0xf); // Altitude
|
||||||
int q = (alt & 0x10) != 0;
|
int q = (alt & 0x10) != 0;
|
||||||
int n = ((alt >> 1) & 0x7f0) | (alt & 0xf); // Remove Q-bit
|
int n = ((alt >> 1) & 0x7f0) | (alt & 0xf); // Remove Q-bit
|
||||||
@ -1631,9 +1631,9 @@ void ADSBDemodGUI::handleADSB(
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Local decode using a single aircraft position + location of receiver
|
// Local decode using a single aircraft position + location of receiver
|
||||||
// Only valid if airbourne within 180nm/333km (C.2.6.4) or 45nm for surface
|
// Only valid if airborne within 180nm/333km (C.2.6.4) or 45nm for surface
|
||||||
|
|
||||||
// Caclulate latitude
|
// Calculate latitude
|
||||||
const double maxDeg = aircraft->m_onSurface ? 90.0 : 360.0;
|
const double maxDeg = aircraft->m_onSurface ? 90.0 : 360.0;
|
||||||
const double dLatEven = maxDeg/60.0;
|
const double dLatEven = maxDeg/60.0;
|
||||||
const double dLatOdd = maxDeg/59.0;
|
const double dLatOdd = maxDeg/59.0;
|
||||||
@ -1643,7 +1643,7 @@ void ADSBDemodGUI::handleADSB(
|
|||||||
int j = std::floor(m_azEl.getLocationSpherical().m_latitude/dLat) + std::floor(modulus(m_azEl.getLocationSpherical().m_latitude, dLat)/dLat - aircraft->m_cprLat[f] + 0.5);
|
int j = std::floor(m_azEl.getLocationSpherical().m_latitude/dLat) + std::floor(modulus(m_azEl.getLocationSpherical().m_latitude, dLat)/dLat - aircraft->m_cprLat[f] + 0.5);
|
||||||
latitude = dLat * (j + aircraft->m_cprLat[f]);
|
latitude = dLat * (j + aircraft->m_cprLat[f]);
|
||||||
|
|
||||||
// Caclulate longitude
|
// Calculate longitude
|
||||||
double dLong;
|
double dLong;
|
||||||
int latNL = cprNL(latitude);
|
int latNL = cprNL(latitude);
|
||||||
if (f == 0)
|
if (f == 0)
|
||||||
@ -1678,7 +1678,7 @@ void ADSBDemodGUI::handleADSB(
|
|||||||
}
|
}
|
||||||
else if (tc == 19)
|
else if (tc == 19)
|
||||||
{
|
{
|
||||||
// Airbourne velocity - BDS 0,9
|
// Airborne velocity - BDS 0,9
|
||||||
int st = data[4] & 0x7; // Subtype
|
int st = data[4] & 0x7; // Subtype
|
||||||
if ((st == 1) || (st == 2))
|
if ((st == 1) || (st == 2))
|
||||||
{
|
{
|
||||||
@ -1874,7 +1874,7 @@ void ADSBDemodGUI::handleADSB(
|
|||||||
|
|
||||||
if (resetAnimation)
|
if (resetAnimation)
|
||||||
{
|
{
|
||||||
// Wait until after model has changed before reseting
|
// Wait until after model has changed before resetting
|
||||||
// otherwise animation might play on old model
|
// otherwise animation might play on old model
|
||||||
aircraft->m_gearDown = false;
|
aircraft->m_gearDown = false;
|
||||||
aircraft->m_flaps = 0.0;
|
aircraft->m_flaps = 0.0;
|
||||||
@ -1924,7 +1924,7 @@ void ADSBDemodGUI::decodeModeS(const QByteArray data, int df, Aircraft *aircraft
|
|||||||
}
|
}
|
||||||
if (wasOnSurface != aircraft->m_onSurface)
|
if (wasOnSurface != aircraft->m_onSurface)
|
||||||
{
|
{
|
||||||
// Can't mix CPR values used on surface and those that are airbourne
|
// Can't mix CPR values used on surface and those that are airborne
|
||||||
aircraft->m_cprValid[0] = false;
|
aircraft->m_cprValid[0] = false;
|
||||||
aircraft->m_cprValid[1] = false;
|
aircraft->m_cprValid[1] = false;
|
||||||
}
|
}
|
||||||
@ -1985,7 +1985,7 @@ void ADSBDemodGUI::decodeModeS(const QByteArray data, int df, Aircraft *aircraft
|
|||||||
|
|
||||||
void ADSBDemodGUI::decodeCommB(const QByteArray data, const QDateTime dateTime, int df, Aircraft *aircraft, bool &updatedCallsign)
|
void ADSBDemodGUI::decodeCommB(const QByteArray data, const QDateTime dateTime, int df, Aircraft *aircraft, bool &updatedCallsign)
|
||||||
{
|
{
|
||||||
// We only see downlink messages, so do not know the data format, so have to decode all posibilities
|
// We only see downlink messages, so do not know the data format, so have to decode all possibilities
|
||||||
// and then see which have legal values and values that are consistent with ADS-B data
|
// and then see which have legal values and values that are consistent with ADS-B data
|
||||||
|
|
||||||
// All IFR aircraft should support ELS (Elementary Surveillance) which includes BDS 1,0 1,7 2,0 3,0
|
// All IFR aircraft should support ELS (Elementary Surveillance) which includes BDS 1,0 1,7 2,0 3,0
|
||||||
@ -2247,7 +2247,7 @@ void ADSBDemodGUI::decodeCommB(const QByteArray data, const QDateTime dateTime,
|
|||||||
int windSpeedFix = ((data[4] & 0x7) << 6) | ((data[5] >> 2) & 0x3f);
|
int windSpeedFix = ((data[4] & 0x7) << 6) | ((data[5] >> 2) & 0x3f);
|
||||||
int windSpeed = windSpeedFix; // knots
|
int windSpeed = windSpeedFix; // knots
|
||||||
int windDirectionFix = ((data[5] & 0x3) << 6) | ((data[6] >> 2) & 0x3f);
|
int windDirectionFix = ((data[5] & 0x3) << 6) | ((data[6] >> 2) & 0x3f);
|
||||||
int windDirection = windDirectionFix * 180.0f / 256.0f; // Degreees
|
int windDirection = windDirectionFix * 180.0f / 256.0f; // Degrees
|
||||||
bool windSpeedInconsistent = (windSpeed > 250.0f) || (!windSpeedStatus && ((windSpeedFix != 0) || (windDirectionFix != 0)));
|
bool windSpeedInconsistent = (windSpeed > 250.0f) || (!windSpeedStatus && ((windSpeedFix != 0) || (windDirectionFix != 0)));
|
||||||
|
|
||||||
int staticAirTemperatureFix = ((data[6] & 0x1) << 10) | ((data[7] & 0xff) << 2) | ((data[8] >> 6) & 0x3);
|
int staticAirTemperatureFix = ((data[6] & 0x1) << 10) | ((data[7] & 0xff) << 2) | ((data[8] >> 6) & 0x3);
|
||||||
@ -2884,7 +2884,7 @@ QList<SWGSDRangel::SWGMapAnimation *> * ADSBDemodGUI::animate(QDateTime dateTime
|
|||||||
bool debug = false;
|
bool debug = false;
|
||||||
|
|
||||||
// Landing gear should be down when on surface
|
// Landing gear should be down when on surface
|
||||||
// Check speed in case we get a mixture of surface and airbourne positions
|
// Check speed in case we get a mixture of surface and airborne positions
|
||||||
// during take-off
|
// during take-off
|
||||||
if ( aircraft->m_onSurface
|
if ( aircraft->m_onSurface
|
||||||
&& !aircraft->m_gearDown
|
&& !aircraft->m_gearDown
|
||||||
@ -3591,7 +3591,7 @@ void ADSBDemodGUI::on_flightInfo_clicked()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find highlighed aircraft on Map Feature
|
// Find highlighted aircraft on Map Feature
|
||||||
void ADSBDemodGUI::on_findOnMapFeature_clicked()
|
void ADSBDemodGUI::on_findOnMapFeature_clicked()
|
||||||
{
|
{
|
||||||
QModelIndexList indexList = ui->adsbData->selectionModel()->selectedRows();
|
QModelIndexList indexList = ui->adsbData->selectionModel()->selectedRows();
|
||||||
@ -3972,7 +3972,7 @@ void ADSBDemodGUI::updateChannelList()
|
|||||||
|
|
||||||
ui->amDemod->blockSignals(false);
|
ui->amDemod->blockSignals(false);
|
||||||
|
|
||||||
// If no current settting, select first channel
|
// If no current setting, select first channel
|
||||||
if (m_settings.m_amDemod.isEmpty())
|
if (m_settings.m_amDemod.isEmpty())
|
||||||
{
|
{
|
||||||
ui->amDemod->setCurrentIndex(0);
|
ui->amDemod->setCurrentIndex(0);
|
||||||
@ -5564,7 +5564,7 @@ void ADSBDemodGUI::on_logOpen_clicked()
|
|||||||
crc.calculate((const uint8_t *)bytes.data(), bytes.size()-3);
|
crc.calculate((const uint8_t *)bytes.data(), bytes.size()-3);
|
||||||
crcCalc = crc.get();
|
crcCalc = crc.get();
|
||||||
}
|
}
|
||||||
//qDebug() << "bytes.szie " << bytes.size() << " crc " << Qt::hex << crcCalc;
|
//qDebug() << "bytes.size " << bytes.size() << " crc " << Qt::hex << crcCalc;
|
||||||
handleADSB(bytes, dateTime, correlation, correlation, crcCalc, false);
|
handleADSB(bytes, dateTime, correlation, correlation, crcCalc, false);
|
||||||
if ((count > 0) && (count % 100000 == 0))
|
if ((count > 0) && (count % 100000 == 0))
|
||||||
{
|
{
|
||||||
|
@ -92,7 +92,7 @@ struct Aircraft {
|
|||||||
Real m_latitude; // Latitude in decimal degrees
|
Real m_latitude; // Latitude in decimal degrees
|
||||||
Real m_longitude; // Longitude in decimal degrees
|
Real m_longitude; // Longitude in decimal degrees
|
||||||
int m_altitude; // Altitude in feet
|
int m_altitude; // Altitude in feet
|
||||||
bool m_onSurface; // Indicates if on surface or airbourne
|
bool m_onSurface; // Indicates if on surface or airborne
|
||||||
bool m_altitudeGNSS; // Altitude is GNSS HAE (Height above WGS-84 ellipsoid) rather than barometric alitute (relative to 29.92 Hg)
|
bool m_altitudeGNSS; // Altitude is GNSS HAE (Height above WGS-84 ellipsoid) rather than barometric alitute (relative to 29.92 Hg)
|
||||||
float m_heading; // Heading or track in degrees
|
float m_heading; // Heading or track in degrees
|
||||||
int m_verticalRate; // Vertical climb rate in ft/min
|
int m_verticalRate; // Vertical climb rate in ft/min
|
||||||
@ -101,7 +101,7 @@ struct Aircraft {
|
|||||||
int m_squawk; // Mode-A code
|
int m_squawk; // Mode-A code
|
||||||
Real m_range; // Distance from station to aircraft
|
Real m_range; // Distance from station to aircraft
|
||||||
Real m_azimuth; // Azimuth from station to aircraft
|
Real m_azimuth; // Azimuth from station to aircraft
|
||||||
Real m_elevation; // Elevation from station to aicraft
|
Real m_elevation; // Elevation from station to aircraft
|
||||||
QDateTime m_time; // When last updated
|
QDateTime m_time; // When last updated
|
||||||
|
|
||||||
int m_selAltitude; // Selected altitude in MCP/FCU or FMS in feet
|
int m_selAltitude; // Selected altitude in MCP/FCU or FMS in feet
|
||||||
@ -144,7 +144,7 @@ struct Aircraft {
|
|||||||
float m_correlation;
|
float m_correlation;
|
||||||
MovingAverageUtil<float, double, 100> m_correlationAvg;
|
MovingAverageUtil<float, double, 100> m_correlationAvg;
|
||||||
|
|
||||||
bool m_isTarget; // Are we targetting this aircraft (sending az/el to rotator)
|
bool m_isTarget; // Are we targeting this aircraft (sending az/el to rotator)
|
||||||
bool m_isHighlighted; // Are we highlighting this aircraft in the table and map
|
bool m_isHighlighted; // Are we highlighting this aircraft in the table and map
|
||||||
bool m_showAll;
|
bool m_showAll;
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
#include "adsbdemodnotificationdialog.h"
|
#include "adsbdemodnotificationdialog.h"
|
||||||
|
|
||||||
// Map main ADS-B table column numbers to combo box indicies
|
// Map main ADS-B table column numbers to combo box indices
|
||||||
std::vector<int> ADSBDemodNotificationDialog::m_columnMap = {
|
std::vector<int> ADSBDemodNotificationDialog::m_columnMap = {
|
||||||
ADSB_COL_ICAO, ADSB_COL_CALLSIGN, ADSB_COL_MODEL,
|
ADSB_COL_ICAO, ADSB_COL_CALLSIGN, ADSB_COL_MODEL,
|
||||||
ADSB_COL_ALTITUDE, ADSB_COL_GROUND_SPEED, ADSB_COL_RANGE,
|
ADSB_COL_ALTITUDE, ADSB_COL_GROUND_SPEED, ADSB_COL_RANGE,
|
||||||
|
@ -175,7 +175,7 @@ void ADSBDemodSink::stopWorker()
|
|||||||
}
|
}
|
||||||
m_worker.wait();
|
m_worker.wait();
|
||||||
// If this is called from ADSBDemod, we need to also
|
// If this is called from ADSBDemod, we need to also
|
||||||
// make sure baseband sink thread isnt blocked in processOneSample
|
// make sure baseband sink thread isn't blocked in processOneSample
|
||||||
for (int i = 0; i < m_buffers; i++)
|
for (int i = 0; i < m_buffers; i++)
|
||||||
{
|
{
|
||||||
if (m_bufferWrite[i].available() == 0)
|
if (m_bufferWrite[i].available() == 0)
|
||||||
|
@ -93,8 +93,8 @@ private:
|
|||||||
const int m_buffers = 3;
|
const int m_buffers = 3;
|
||||||
const int m_bufferSize = 200000;
|
const int m_bufferSize = 200000;
|
||||||
Real *m_sampleBuffer[3]; //!< Each buffer is m_bufferSize samples
|
Real *m_sampleBuffer[3]; //!< Each buffer is m_bufferSize samples
|
||||||
QSemaphore m_bufferWrite[3]; //!< Sempahore to control write access to the buffers
|
QSemaphore m_bufferWrite[3]; //!< Semaphore to control write access to the buffers
|
||||||
QSemaphore m_bufferRead[3]; //!< Sempahore to control read access from the buffers
|
QSemaphore m_bufferRead[3]; //!< Semaphore to control read access from the buffers
|
||||||
QDateTime m_bufferFirstSampleDateTime[3]; //!< Time for first sample in the buffer
|
QDateTime m_bufferFirstSampleDateTime[3]; //!< Time for first sample in the buffer
|
||||||
bool m_bufferDateTimeValid[3];
|
bool m_bufferDateTimeValid[3];
|
||||||
ADSBDemodSinkWorker m_worker; //!< Worker thread that does the actual demodulation
|
ADSBDemodSinkWorker m_worker; //!< Worker thread that does the actual demodulation
|
||||||
|
@ -127,7 +127,7 @@ void ADSBDemodSinkWorker::run()
|
|||||||
// (E.g: it's quite possible to receive multiple frames simultaneously, so we don't
|
// (E.g: it's quite possible to receive multiple frames simultaneously, so we don't
|
||||||
// want a maximum threshold for the zeros, as a weaker signal may transmit 1s in
|
// want a maximum threshold for the zeros, as a weaker signal may transmit 1s in
|
||||||
// a stronger signals 0 chip position. Similarly a strong signal in an adjacent
|
// a stronger signals 0 chip position. Similarly a strong signal in an adjacent
|
||||||
// channel may casue AGC to reduce gain, reducing the ampltiude of an otherwise
|
// channel may cause AGC to reduce gain, reducing the ampltiude of an otherwise
|
||||||
// strong signal, as well as the noise floor)
|
// strong signal, as well as the noise floor)
|
||||||
// The threshold accounts for the different number of zeros and ones in the preamble
|
// The threshold accounts for the different number of zeros and ones in the preamble
|
||||||
// If the sum of ones is exactly 0, it's probably no signal
|
// If the sum of ones is exactly 0, it's probably no signal
|
||||||
@ -253,7 +253,7 @@ void ADSBDemodSinkWorker::run()
|
|||||||
crc ^= icao;
|
crc ^= icao;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// For DF11, the last 7 bits may have an address/interogration indentifier (II)
|
// For DF11, the last 7 bits may have an address/interogration identifier (II)
|
||||||
// XORed in, so we ignore those bits
|
// XORed in, so we ignore those bits
|
||||||
if ((parity == crc) || ((df == 11) && ((parity & 0xffff80) == (crc & 0xffff80))))
|
if ((parity == crc) || ((df == 11) && ((parity & 0xffff80) == (crc & 0xffff80))))
|
||||||
{
|
{
|
||||||
|
@ -70,7 +70,7 @@ struct AISDemodSettings
|
|||||||
int m_messageColumnIndexes[AISDEMOD_MESSAGE_COLUMNS];//!< How the columns are ordered in the table
|
int m_messageColumnIndexes[AISDEMOD_MESSAGE_COLUMNS];//!< How the columns are ordered in the table
|
||||||
int m_messageColumnSizes[AISDEMOD_MESSAGE_COLUMNS]; //!< Size of the columns in the table
|
int m_messageColumnSizes[AISDEMOD_MESSAGE_COLUMNS]; //!< Size of the columns in the table
|
||||||
|
|
||||||
static const int AISDEMOD_CHANNEL_SAMPLE_RATE = 57600; //!< 6x 9600 baud rate (use even multiple so Gausian filter has odd number of taps)
|
static const int AISDEMOD_CHANNEL_SAMPLE_RATE = 57600; //!< 6x 9600 baud rate (use even multiple so Gaussian filter has odd number of taps)
|
||||||
static const int m_scopeStreams = 9;
|
static const int m_scopeStreams = 9;
|
||||||
|
|
||||||
AISDemodSettings();
|
AISDemodSettings();
|
||||||
|
@ -349,7 +349,7 @@ void AISDemodSink::processOneSample(Complex &ci)
|
|||||||
// Select signals to feed to scope
|
// Select signals to feed to scope
|
||||||
sampleToScope(ci / SDR_RX_SCALEF, magsq, fmDemod, filt, m_rxBuf[m_rxBufIdx], corr / 100.0, thresholdMet, dcOffset, scopeCRCValid ? 1.0 : (scopeCRCInvalid ? -1.0 : 0));
|
sampleToScope(ci / SDR_RX_SCALEF, magsq, fmDemod, filt, m_rxBuf[m_rxBufIdx], corr / 100.0, thresholdMet, dcOffset, scopeCRCValid ? 1.0 : (scopeCRCInvalid ? -1.0 : 0));
|
||||||
|
|
||||||
// Send demod signal to Demod Analzyer feature
|
// Send demod signal to Demod Analyzer feature
|
||||||
m_demodBuffer[m_demodBufferFill++] = fmDemod * std::numeric_limits<int16_t>::max();
|
m_demodBuffer[m_demodBufferFill++] = fmDemod * std::numeric_limits<int16_t>::max();
|
||||||
|
|
||||||
if (m_demodBufferFill >= m_demodBuffer.size())
|
if (m_demodBufferFill >= m_demodBuffer.size())
|
||||||
@ -422,7 +422,7 @@ void AISDemodSink::applySettings(const AISDemodSettings& settings, bool force)
|
|||||||
qDebug() << "AISDemodSink::applySettings: m_samplesPerSymbol: " << m_samplesPerSymbol << " baud " << settings.m_baud;
|
qDebug() << "AISDemodSink::applySettings: m_samplesPerSymbol: " << m_samplesPerSymbol << " baud " << settings.m_baud;
|
||||||
m_pulseShape.create(0.5, 3, m_samplesPerSymbol);
|
m_pulseShape.create(0.5, 3, m_samplesPerSymbol);
|
||||||
|
|
||||||
// Recieve buffer, long enough for one max length message
|
// Receive buffer, long enough for one max length message
|
||||||
delete[] m_rxBuf;
|
delete[] m_rxBuf;
|
||||||
m_rxBufLength = AISDEMOD_MAX_BYTES*8*m_samplesPerSymbol;
|
m_rxBufLength = AISDEMOD_MAX_BYTES*8*m_samplesPerSymbol;
|
||||||
m_rxBuf = new Real[m_rxBufLength];
|
m_rxBuf = new Real[m_rxBufLength];
|
||||||
|
@ -113,7 +113,7 @@ private:
|
|||||||
|
|
||||||
PhaseDiscriminators m_phaseDiscri; // FM demodulator
|
PhaseDiscriminators m_phaseDiscri; // FM demodulator
|
||||||
Gaussian<Real> m_pulseShape; // Pulse shaping filter
|
Gaussian<Real> m_pulseShape; // Pulse shaping filter
|
||||||
Real *m_rxBuf; // Receive sample buffer, large enough for one max length messsage
|
Real *m_rxBuf; // Receive sample buffer, large enough for one max length message
|
||||||
int m_rxBufLength; // Size in elements in m_rxBuf
|
int m_rxBufLength; // Size in elements in m_rxBuf
|
||||||
int m_rxBufIdx; // Index in to circular buffer
|
int m_rxBufIdx; // Index in to circular buffer
|
||||||
int m_rxBufCnt; // Number of valid samples in buffer
|
int m_rxBufCnt; // Number of valid samples in buffer
|
||||||
|
@ -202,7 +202,7 @@ bool APTDemodGUI::handleMessage(const Message& message)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_image = m_image.copy(0, 0, m_image.width(), m_image.height()+1); // Add a line at tne bottom
|
m_image = m_image.copy(0, 0, m_image.width(), m_image.height()+1); // Add a line at the bottom
|
||||||
|
|
||||||
if (m_settings.m_flip)
|
if (m_settings.m_flip)
|
||||||
{
|
{
|
||||||
|
@ -314,7 +314,7 @@ void APTDemodImageWorker::calcPixelCoords(CoordGeodetic centreCoord, double head
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Recalculate all pixel coordiantes as satTimeOffset or satYaw has changed
|
// Recalculate all pixel coordinates as satTimeOffset or satYaw has changed
|
||||||
void APTDemodImageWorker::recalcCoords()
|
void APTDemodImageWorker::recalcCoords()
|
||||||
{
|
{
|
||||||
if (m_sgp4)
|
if (m_sgp4)
|
||||||
@ -381,7 +381,7 @@ void APTDemodImageWorker::calcCoord(int row)
|
|||||||
QStringList elements = m_settings.m_tle.trimmed().split("\n");
|
QStringList elements = m_settings.m_tle.trimmed().split("\n");
|
||||||
if (elements.size() == 3)
|
if (elements.size() == 3)
|
||||||
{
|
{
|
||||||
// Initalise SGP4
|
// Initialise SGP4
|
||||||
Tle tle(elements[0].toStdString(), elements[1].toStdString(), elements[2].toStdString());
|
Tle tle(elements[0].toStdString(), elements[1].toStdString(), elements[2].toStdString());
|
||||||
m_sgp4 = new SGP4(tle);
|
m_sgp4 = new SGP4(tle);
|
||||||
|
|
||||||
@ -559,7 +559,7 @@ void APTDemodImageWorker::calcBoundingBox(double &east, double &south, double &w
|
|||||||
//fclose(f);
|
//fclose(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Project satellite image to equidistant cyclindrical projection (Plate Carree) for use on 3D Map
|
// Project satellite image to equidistant cylindrical projection (Plate Carree) for use on 3D Map
|
||||||
// We've previously computed lat and lon for each pixel in satellite image
|
// We've previously computed lat and lon for each pixel in satellite image
|
||||||
// so we just work through coords in projected image, trying to find closest pixel in satellite image
|
// so we just work through coords in projected image, trying to find closest pixel in satellite image
|
||||||
// FIXME: How do we handle sat going over the poles?
|
// FIXME: How do we handle sat going over the poles?
|
||||||
|
@ -71,7 +71,7 @@ struct APTDemodSettings
|
|||||||
bool m_hidden;
|
bool m_hidden;
|
||||||
|
|
||||||
// The following are really working state, rather than settings
|
// The following are really working state, rather than settings
|
||||||
QString m_tle; // Satelite two-line elements, from satellite tracker
|
QString m_tle; // Satellite two-line elements, from satellite tracker
|
||||||
QDateTime m_aosDateTime; // When decoder was started (may not be current time, if replaying old file)
|
QDateTime m_aosDateTime; // When decoder was started (may not be current time, if replaying old file)
|
||||||
bool m_northToSouth; // Separate from flip, in case user changes it
|
bool m_northToSouth; // Separate from flip, in case user changes it
|
||||||
|
|
||||||
|
@ -121,7 +121,7 @@ void ATVDemodSink::demod(Complex& c)
|
|||||||
int n_out;
|
int n_out;
|
||||||
Complex *filtered;
|
Complex *filtered;
|
||||||
|
|
||||||
n_out = m_DSBFilter->runAsym(c, &filtered, m_settings.m_atvModulation != ATVDemodSettings::ATV_LSB); // all usb except explicitely lsb
|
n_out = m_DSBFilter->runAsym(c, &filtered, m_settings.m_atvModulation != ATVDemodSettings::ATV_LSB); // all usb except explicitly lsb
|
||||||
|
|
||||||
if (n_out > 0)
|
if (n_out > 0)
|
||||||
{
|
{
|
||||||
|
@ -100,7 +100,7 @@ private:
|
|||||||
|
|
||||||
int m_channelSampleRate;
|
int m_channelSampleRate;
|
||||||
int m_channelFrequencyOffset;
|
int m_channelFrequencyOffset;
|
||||||
int m_samplesPerLine; //!< number of samples per complete line (includes sync signals) - adusted value
|
int m_samplesPerLine; //!< number of samples per complete line (includes sync signals) - adjusted value
|
||||||
float m_samplesPerLineFrac; //!< number of samples per complete line (includes sync signals), fractional part
|
float m_samplesPerLineFrac; //!< number of samples per complete line (includes sync signals), fractional part
|
||||||
ATVDemodSettings m_settings;
|
ATVDemodSettings m_settings;
|
||||||
int m_videoTabIndex;
|
int m_videoTabIndex;
|
||||||
|
@ -215,7 +215,7 @@ bool RDSDecoder::frameSync(bool bit)
|
|||||||
return group_ready;
|
return group_ready;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////// HELPER FUNTIONS /////////////////////////
|
////////////////////////// HELPER FUNCTIONS /////////////////////////
|
||||||
|
|
||||||
void RDSDecoder::enter_sync(unsigned int sync_block_number)
|
void RDSDecoder::enter_sync(unsigned int sync_block_number)
|
||||||
{
|
{
|
||||||
|
@ -52,13 +52,13 @@ struct ChirpChatDemodSettings
|
|||||||
int m_inputFrequencyOffset;
|
int m_inputFrequencyOffset;
|
||||||
int m_bandwidthIndex;
|
int m_bandwidthIndex;
|
||||||
int m_spreadFactor;
|
int m_spreadFactor;
|
||||||
int m_deBits; //!< Low data rate optmize (DE) bits
|
int m_deBits; //!< Low data rate optimize (DE) bits
|
||||||
FFTWindow::Function m_fftWindow;
|
FFTWindow::Function m_fftWindow;
|
||||||
CodingScheme m_codingScheme;
|
CodingScheme m_codingScheme;
|
||||||
bool m_decodeActive;
|
bool m_decodeActive;
|
||||||
int m_eomSquelchTenths; //!< Squelch factor to trigger end of message (/10)
|
int m_eomSquelchTenths; //!< Squelch factor to trigger end of message (/10)
|
||||||
unsigned int m_nbSymbolsMax; //!< Maximum number of symbols in a payload
|
unsigned int m_nbSymbolsMax; //!< Maximum number of symbols in a payload
|
||||||
bool m_autoNbSymbolsMax; //!< Set maximum number of symbols in a payload automatically using last messag value
|
bool m_autoNbSymbolsMax; //!< Set maximum number of symbols in a payload automatically using last message value
|
||||||
unsigned int m_preambleChirps; //!< Number of expected preamble chirps
|
unsigned int m_preambleChirps; //!< Number of expected preamble chirps
|
||||||
int m_nbParityBits; //!< Hamming parity bits (LoRa)
|
int m_nbParityBits; //!< Hamming parity bits (LoRa)
|
||||||
int m_packetLength; //!< Payload packet length in bytes or characters (LoRa)
|
int m_packetLength; //!< Payload packet length in bytes or characters (LoRa)
|
||||||
|
@ -54,4 +54,4 @@ const int SIMD_WIDTH = SIZEOF_SIMD / sizeof(code_type);
|
|||||||
typedef SIMD<code_type, SIMD_WIDTH> simd_type;
|
typedef SIMD<code_type, SIMD_WIDTH> simd_type;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
} // namepsace ldpctool
|
} // namespace ldpctool
|
||||||
|
@ -94,7 +94,7 @@ struct deconvol_poly2
|
|||||||
{
|
{
|
||||||
typedef u8 hardsymbol;
|
typedef u8 hardsymbol;
|
||||||
|
|
||||||
// Support instanciation of template with soft of float input
|
// Support instantiation of template with soft of float input
|
||||||
inline u8 SYMVAL(const hardsymbol *s) { return *s; }
|
inline u8 SYMVAL(const hardsymbol *s) { return *s; }
|
||||||
inline u8 SYMVAL(const softsymbol *s) { return s->symbol; }
|
inline u8 SYMVAL(const softsymbol *s) { return s->symbol; }
|
||||||
|
|
||||||
|
@ -979,7 +979,7 @@ struct mpeg_sync : runnable
|
|||||||
{
|
{
|
||||||
if (resync_phase == 0)
|
if (resync_phase == 0)
|
||||||
{
|
{
|
||||||
// Try all bit alighments
|
// Try all bit alignments
|
||||||
for (bitphase = 0; bitphase <= 7; ++bitphase)
|
for (bitphase = 0; bitphase <= 7; ++bitphase)
|
||||||
{
|
{
|
||||||
if (search_sync())
|
if (search_sync())
|
||||||
@ -1770,7 +1770,7 @@ struct viterbi_sync : runnable
|
|||||||
|
|
||||||
inline TUS update_sync(int s, eucl_ss *pin, TPM *discr)
|
inline TUS update_sync(int s, eucl_ss *pin, TPM *discr)
|
||||||
{
|
{
|
||||||
// Read one FEC ouput block
|
// Read one FEC output block
|
||||||
pin += syncs[s].shift;
|
pin += syncs[s].shift;
|
||||||
TCS cs = 0;
|
TCS cs = 0;
|
||||||
TBM cost = 0;
|
TBM cost = 0;
|
||||||
|
@ -581,7 +581,7 @@ struct s2_frame_receiver : runnable
|
|||||||
bool strongpls; // PL symbols at max amplitude (default: RMS)
|
bool strongpls; // PL symbols at max amplitude (default: RMS)
|
||||||
uint32_t modcods; // Bitmask of desired modcods
|
uint32_t modcods; // Bitmask of desired modcods
|
||||||
uint8_t framesizes; // Bitmask of desired frame sizes
|
uint8_t framesizes; // Bitmask of desired frame sizes
|
||||||
bool fastlock; // Synchronize more agressively
|
bool fastlock; // Synchronize more aggressively
|
||||||
bool fastdrift; // Carrier drift faster than pilots
|
bool fastdrift; // Carrier drift faster than pilots
|
||||||
float freq_tol; // Tolerance on carrier frequency
|
float freq_tol; // Tolerance on carrier frequency
|
||||||
float sr_tol; // Tolerance on symbol rate
|
float sr_tol; // Tolerance on symbol rate
|
||||||
@ -755,7 +755,7 @@ struct s2_frame_receiver : runnable
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// State transtion
|
// State transition
|
||||||
void enter_frame_detect()
|
void enter_frame_detect()
|
||||||
{
|
{
|
||||||
state = FRAME_DETECT;
|
state = FRAME_DETECT;
|
||||||
|
@ -494,7 +494,7 @@ T max(const T &x, const T &y) {
|
|||||||
return (x < y) ? y : x;
|
return (x < y) ? y : x;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Abreviations for integer types
|
// Abbreviations for integer types
|
||||||
|
|
||||||
typedef unsigned char u8;
|
typedef unsigned char u8;
|
||||||
typedef unsigned short u16;
|
typedef unsigned short u16;
|
||||||
|
@ -357,7 +357,7 @@ struct rs_engine
|
|||||||
u8 e = gf.div(num, den);
|
u8 e = gf.div(num, den);
|
||||||
|
|
||||||
// Subtract e from coefficient of degree loc.
|
// Subtract e from coefficient of degree loc.
|
||||||
// Note: Coeffients listed by decreasing degree in pin[] and pout[].
|
// Note: Coefficients listed by decreasing degree in pin[] and pout[].
|
||||||
if (bits_corrected) {
|
if (bits_corrected) {
|
||||||
*bits_corrected += hamming_weight(e);
|
*bits_corrected += hamming_weight(e);
|
||||||
}
|
}
|
||||||
|
@ -473,7 +473,7 @@ void to_softsymb(const full_ss *fss, hard_ss *ss);
|
|||||||
void softsymb_harden(hard_ss *ss);
|
void softsymb_harden(hard_ss *ss);
|
||||||
uint8_t softsymb_to_dump(const hard_ss &ss, int bit);
|
uint8_t softsymb_to_dump(const hard_ss &ss, int bit);
|
||||||
|
|
||||||
// Euclidian QPSK soft-symbols.
|
// Euclidean QPSK soft-symbols.
|
||||||
// Additive metric suitable for Viterbi.
|
// Additive metric suitable for Viterbi.
|
||||||
// Backward-compatible with simplified Viterbi (TBD remove)
|
// Backward-compatible with simplified Viterbi (TBD remove)
|
||||||
struct eucl_ss
|
struct eucl_ss
|
||||||
@ -1381,7 +1381,7 @@ struct cstln_receiver : runnable
|
|||||||
est_ep = ev_power * kest + est_ep * (1 - kest);
|
est_ep = ev_power * kest + est_ep * (1 - kest);
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is best done periodically ouside the inner loop,
|
// This is best done periodically outside the inner loop,
|
||||||
// but will cause non-deterministic output.
|
// but will cause non-deterministic output.
|
||||||
|
|
||||||
if (!allow_drift)
|
if (!allow_drift)
|
||||||
@ -1655,7 +1655,7 @@ struct fast_qpsk_receiver : runnable
|
|||||||
cstln_out->write(s);
|
cstln_out->write(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is best done periodically ouside the inner loop,
|
// This is best done periodically outside the inner loop,
|
||||||
// but will cause non-deterministic output.
|
// but will cause non-deterministic output.
|
||||||
|
|
||||||
if (!allow_drift)
|
if (!allow_drift)
|
||||||
|
@ -163,7 +163,7 @@ void DSCDemodSink::processOneSample(Complex &ci)
|
|||||||
|
|
||||||
// Save current data for edge detection
|
// Save current data for edge detection
|
||||||
m_dataPrev = m_data;
|
m_dataPrev = m_data;
|
||||||
// Set data according to stongest correlation
|
// Set data according to strongest correlation
|
||||||
m_data = biasedData > 0;
|
m_data = biasedData > 0;
|
||||||
|
|
||||||
// Calculate timing error (we expect clockCount to be 0 when data changes), and add a proportion of it
|
// Calculate timing error (we expect clockCount to be 0 when data changes), and add a proportion of it
|
||||||
|
@ -259,7 +259,7 @@ void EndOfTrainDemodSink::processOneSample(Complex &ci)
|
|||||||
// Select signals to feed to scope
|
// Select signals to feed to scope
|
||||||
sampleToScope(ci / SDR_RX_SCALEF, magsq, fmDemod, f0Filt, f1Filt, diff, sample, bit, m_gotSOP);
|
sampleToScope(ci / SDR_RX_SCALEF, magsq, fmDemod, f0Filt, f1Filt, diff, sample, bit, m_gotSOP);
|
||||||
|
|
||||||
// Send demod signal to Demod Analzyer feature
|
// Send demod signal to Demod Analyzer feature
|
||||||
m_demodBuffer[m_demodBufferFill++] = fmDemod * std::numeric_limits<int16_t>::max();
|
m_demodBuffer[m_demodBufferFill++] = fmDemod * std::numeric_limits<int16_t>::max();
|
||||||
|
|
||||||
if (m_demodBufferFill >= m_demodBuffer.size())
|
if (m_demodBufferFill >= m_demodBuffer.size())
|
||||||
|
@ -161,7 +161,7 @@ void NavtexDemodSink::processOneSample(Complex &ci)
|
|||||||
|
|
||||||
// Save current data for edge detection
|
// Save current data for edge detection
|
||||||
m_dataPrev = m_data;
|
m_dataPrev = m_data;
|
||||||
// Set data according to stongest correlation
|
// Set data according to strongest correlation
|
||||||
m_data = biasedData < 0;
|
m_data = biasedData < 0;
|
||||||
|
|
||||||
// Generate sampling clock by aligning to correlator zero-crossing
|
// Generate sampling clock by aligning to correlator zero-crossing
|
||||||
|
@ -156,7 +156,7 @@ quint32 PagerDemodSink::bchEncode(const quint32 cw)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Use BCH decoding to try to fix any bit errors
|
// Use BCH decoding to try to fix any bit errors
|
||||||
// Returns true if able to be decode/repair successfull
|
// Returns true if able to be decode/repair successful
|
||||||
// See: https://www.eevblog.com/forum/microcontrollers/practical-guides-to-bch-fec/
|
// See: https://www.eevblog.com/forum/microcontrollers/practical-guides-to-bch-fec/
|
||||||
bool PagerDemodSink::bchDecode(const quint32 cw, quint32& correctedCW)
|
bool PagerDemodSink::bchDecode(const quint32 cw, quint32& correctedCW)
|
||||||
{
|
{
|
||||||
@ -585,7 +585,7 @@ void PagerDemodSink::processOneSample(Complex &ci)
|
|||||||
|
|
||||||
sampleToScope(scopeSample);
|
sampleToScope(scopeSample);
|
||||||
|
|
||||||
// Send demod signal to Demod Analzyer feature
|
// Send demod signal to Demod Analyzer feature
|
||||||
m_demodBuffer[m_demodBufferFill++] = fmDemod * std::numeric_limits<int16_t>::max();
|
m_demodBuffer[m_demodBufferFill++] = fmDemod * std::numeric_limits<int16_t>::max();
|
||||||
|
|
||||||
if (m_demodBufferFill >= m_demodBuffer.size())
|
if (m_demodBufferFill >= m_demodBuffer.size())
|
||||||
|
@ -67,7 +67,7 @@ struct RadiosondeDemodSettings
|
|||||||
int m_frameColumnIndexes[RADIOSONDEDEMOD_FRAME_COLUMNS];//!< How the columns are ordered in the table
|
int m_frameColumnIndexes[RADIOSONDEDEMOD_FRAME_COLUMNS];//!< How the columns are ordered in the table
|
||||||
int m_frameColumnSizes[RADIOSONDEDEMOD_FRAME_COLUMNS]; //!< Size of the columns in the table
|
int m_frameColumnSizes[RADIOSONDEDEMOD_FRAME_COLUMNS]; //!< Size of the columns in the table
|
||||||
|
|
||||||
static const int RADIOSONDEDEMOD_CHANNEL_SAMPLE_RATE = 57600; //!< 12x 4800 baud rate (use even multiple so Gausian filter has odd number of taps)
|
static const int RADIOSONDEDEMOD_CHANNEL_SAMPLE_RATE = 57600; //!< 12x 4800 baud rate (use even multiple so Gaussian filter has odd number of taps)
|
||||||
|
|
||||||
RadiosondeDemodSettings();
|
RadiosondeDemodSettings();
|
||||||
void resetToDefaults();
|
void resetToDefaults();
|
||||||
|
@ -274,7 +274,7 @@ void RadiosondeDemodSink::processOneSample(Complex &ci)
|
|||||||
}
|
}
|
||||||
if (sampleIdx >= 16 * 8 * m_samplesPerSymbol)
|
if (sampleIdx >= 16 * 8 * m_samplesPerSymbol)
|
||||||
{
|
{
|
||||||
// Too many bits without receving header
|
// Too many bits without receiving header
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -359,7 +359,7 @@ void RadiosondeDemodSink::processOneSample(Complex &ci)
|
|||||||
}
|
}
|
||||||
sampleToScope(scopeSample);
|
sampleToScope(scopeSample);
|
||||||
|
|
||||||
// Send demod signal to Demod Analzyer feature
|
// Send demod signal to Demod Analyzer feature
|
||||||
m_demodBuffer[m_demodBufferFill++] = fmDemod * std::numeric_limits<int16_t>::max();
|
m_demodBuffer[m_demodBufferFill++] = fmDemod * std::numeric_limits<int16_t>::max();
|
||||||
|
|
||||||
if (m_demodBufferFill >= m_demodBuffer.size())
|
if (m_demodBufferFill >= m_demodBuffer.size())
|
||||||
@ -550,7 +550,7 @@ void RadiosondeDemodSink::applySettings(const RadiosondeDemodSettings& settings,
|
|||||||
// What value to use for BT? RFIC is Si4032 - its datasheet only appears to support 0.5
|
// What value to use for BT? RFIC is Si4032 - its datasheet only appears to support 0.5
|
||||||
m_pulseShape.create(0.5, 3, m_samplesPerSymbol);
|
m_pulseShape.create(0.5, 3, m_samplesPerSymbol);
|
||||||
|
|
||||||
// Recieve buffer, long enough for one max length message
|
// Receive buffer, long enough for one max length message
|
||||||
delete[] m_rxBuf;
|
delete[] m_rxBuf;
|
||||||
m_rxBufLength = RADIOSONDEDEMOD_MAX_BYTES*8*m_samplesPerSymbol;
|
m_rxBufLength = RADIOSONDEDEMOD_MAX_BYTES*8*m_samplesPerSymbol;
|
||||||
m_rxBuf = new Real[m_rxBufLength];
|
m_rxBuf = new Real[m_rxBufLength];
|
||||||
|
@ -112,7 +112,7 @@ private:
|
|||||||
Lowpass<Complex> m_lowpass; // RF input filter
|
Lowpass<Complex> m_lowpass; // RF input filter
|
||||||
PhaseDiscriminators m_phaseDiscri; // FM demodulator
|
PhaseDiscriminators m_phaseDiscri; // FM demodulator
|
||||||
Gaussian<Real> m_pulseShape; // Pulse shaping filter
|
Gaussian<Real> m_pulseShape; // Pulse shaping filter
|
||||||
Real *m_rxBuf; // Receive sample buffer, large enough for one max length messsage
|
Real *m_rxBuf; // Receive sample buffer, large enough for one max length message
|
||||||
int m_rxBufLength; // Size in elements in m_rxBuf
|
int m_rxBufLength; // Size in elements in m_rxBuf
|
||||||
int m_rxBufIdx; // Index in to circular buffer
|
int m_rxBufIdx; // Index in to circular buffer
|
||||||
int m_rxBufCnt; // Number of valid samples in buffer
|
int m_rxBufCnt; // Number of valid samples in buffer
|
||||||
|
@ -219,7 +219,7 @@ void RttyDemodSink::processOneSample(Complex &ci)
|
|||||||
|
|
||||||
// Save current data for edge detection
|
// Save current data for edge detection
|
||||||
m_dataPrev = m_data;
|
m_dataPrev = m_data;
|
||||||
// Set data according to stongest correlation
|
// Set data according to strongest correlation
|
||||||
if (m_settings.m_spaceHigh) {
|
if (m_settings.m_spaceHigh) {
|
||||||
m_data = m_settings.m_atc ? biasedData < 0 : unbiasedData < 0;
|
m_data = m_settings.m_atc ? biasedData < 0 : unbiasedData < 0;
|
||||||
} else {
|
} else {
|
||||||
|
@ -108,7 +108,7 @@ private:
|
|||||||
bool m_agcClamping;
|
bool m_agcClamping;
|
||||||
int m_agcNbSamples; //!< number of audio (48 kHz) samples for AGC averaging
|
int m_agcNbSamples; //!< number of audio (48 kHz) samples for AGC averaging
|
||||||
double m_agcPowerThreshold; //!< AGC power threshold (linear)
|
double m_agcPowerThreshold; //!< AGC power threshold (linear)
|
||||||
int m_agcThresholdGate; //!< Gate length in number of samples befor threshold triggers
|
int m_agcThresholdGate; //!< Gate length in number of samples before threshold triggers
|
||||||
DoubleBufferFIFO<fftfilt::cmplx> m_squelchDelayLine;
|
DoubleBufferFIFO<fftfilt::cmplx> m_squelchDelayLine;
|
||||||
bool m_audioActive; //!< True if an audio signal is produced (no AGC or AGC and above threshold)
|
bool m_audioActive; //!< True if an audio signal is produced (no AGC or AGC and above threshold)
|
||||||
Lowpass<Real> m_lowpassI;
|
Lowpass<Real> m_lowpassI;
|
||||||
|
@ -143,7 +143,7 @@ bool VORDemodGUI::handleMessage(const Message& message)
|
|||||||
ui->morseText->setText(Morse::toSpacedUnicode(ident));
|
ui->morseText->setText(Morse::toSpacedUnicode(ident));
|
||||||
|
|
||||||
// Idents should only be two or three characters, so filter anything else
|
// Idents should only be two or three characters, so filter anything else
|
||||||
// other than TEST which indicates a VOR is under maintainance (may also be TST)
|
// other than TEST which indicates a VOR is under maintenance (may also be TST)
|
||||||
if (((identString.size() >= 2) && (identString.size() <= 3)) || (identString == "TEST"))
|
if (((identString.size() >= 2) && (identString.size() <= 3)) || (identString == "TEST"))
|
||||||
{
|
{
|
||||||
ui->identText->setStyleSheet("QLabel { color: white }");
|
ui->identText->setStyleSheet("QLabel { color: white }");
|
||||||
|
@ -835,7 +835,7 @@ bool VORDemodMCGUI::handleMessage(const Message& message)
|
|||||||
// Convert Morse to a string
|
// Convert Morse to a string
|
||||||
QString identString = Morse::toString(ident);
|
QString identString = Morse::toString(ident);
|
||||||
// Idents should only be two or three characters, so filter anything else
|
// Idents should only be two or three characters, so filter anything else
|
||||||
// other than TEST which indicates a VOR is under maintainance (may also be TST)
|
// other than TEST which indicates a VOR is under maintenance (may also be TST)
|
||||||
if (((identString.size() >= 2) && (identString.size() <= 3)) || (identString == "TEST"))
|
if (((identString.size() >= 2) && (identString.size() <= 3)) || (identString == "TEST"))
|
||||||
{
|
{
|
||||||
vorGUI->m_rxIdentItem->setText(identString);
|
vorGUI->m_rxIdentItem->setText(identString);
|
||||||
|
@ -269,7 +269,7 @@ void VORDemodMCSink::processOneSample(Complex &ci)
|
|||||||
m_movingAverageIdent(c2.real());
|
m_movingAverageIdent(c2.real());
|
||||||
Real mav = m_movingAverageIdent.asFloat();
|
Real mav = m_movingAverageIdent.asFloat();
|
||||||
|
|
||||||
// Caclulate noise floor
|
// Calculate noise floor
|
||||||
if (mav > m_identMaxs[m_binCnt])
|
if (mav > m_identMaxs[m_binCnt])
|
||||||
m_identMaxs[m_binCnt] = mav;
|
m_identMaxs[m_binCnt] = mav;
|
||||||
m_binSampleCnt++;
|
m_binSampleCnt++;
|
||||||
|
@ -44,9 +44,9 @@ struct FreqScannerSettings
|
|||||||
bool deserialize(const QByteArray& data);
|
bool deserialize(const QByteArray& data);
|
||||||
};
|
};
|
||||||
|
|
||||||
qint32 m_inputFrequencyOffset; //!< Not modifable in GUI
|
qint32 m_inputFrequencyOffset; //!< Not modifiable in GUI
|
||||||
qint32 m_channelBandwidth; //!< Channel bandwidth
|
qint32 m_channelBandwidth; //!< Channel bandwidth
|
||||||
qint32 m_channelFrequencyOffset;//!< Minium DC offset of tuned channel
|
qint32 m_channelFrequencyOffset;//!< Minimum DC offset of tuned channel
|
||||||
Real m_threshold; //!< Power threshold in dB
|
Real m_threshold; //!< Power threshold in dB
|
||||||
QString m_channel; //!< Channel (E.g: R1:4) to tune to active frequency
|
QString m_channel; //!< Channel (E.g: R1:4) to tune to active frequency
|
||||||
QList<FrequencySettings> m_frequencySettings; //!< Frequencies to scan and corresponding settings
|
QList<FrequencySettings> m_frequencySettings; //!< Frequencies to scan and corresponding settings
|
||||||
|
@ -1426,7 +1426,7 @@ void HeatMapGUI::resizeMap(int x, int y)
|
|||||||
}
|
}
|
||||||
catch (std::bad_alloc&)
|
catch (std::bad_alloc&)
|
||||||
{
|
{
|
||||||
// Detete partially allocated memory
|
// Delete partially allocated memory
|
||||||
delete[] powerAverage;
|
delete[] powerAverage;
|
||||||
delete[] powerPulseAverage;
|
delete[] powerPulseAverage;
|
||||||
delete[] powerMaxPeak;
|
delete[] powerMaxPeak;
|
||||||
|
@ -920,7 +920,7 @@ bool RadioAstronomyGUI::deserialize(const QByteArray& data)
|
|||||||
|
|
||||||
void RadioAstronomyGUI::updateAvailableFeatures(const AvailableChannelOrFeatureList& availableFeatures, const QStringList& renameFrom, const QStringList& renameTo)
|
void RadioAstronomyGUI::updateAvailableFeatures(const AvailableChannelOrFeatureList& availableFeatures, const QStringList& renameFrom, const QStringList& renameTo)
|
||||||
{
|
{
|
||||||
// Update starTracker settting if it has been renamed
|
// Update starTracker setting if it has been renamed
|
||||||
if (renameFrom.contains(m_settings.m_starTracker))
|
if (renameFrom.contains(m_settings.m_starTracker))
|
||||||
{
|
{
|
||||||
m_settings.m_starTracker = renameTo[renameFrom.indexOf(m_settings.m_starTracker)];
|
m_settings.m_starTracker = renameTo[renameFrom.indexOf(m_settings.m_starTracker)];
|
||||||
@ -1446,7 +1446,7 @@ void RadioAstronomyGUI::calcCalTrx()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Estimate spillover temperature (This is typically very Az/El depenedent as ground noise will vary)
|
// Estimate spillover temperature (This is typically very Az/El dependent as ground noise will vary)
|
||||||
void RadioAstronomyGUI::calcCalTsp()
|
void RadioAstronomyGUI::calcCalTsp()
|
||||||
{
|
{
|
||||||
if (!ui->calTrx->text().isEmpty() && !ui->calTsky->text().isEmpty() && !ui->calYFactor->text().isEmpty())
|
if (!ui->calTrx->text().isEmpty() && !ui->calTsky->text().isEmpty() && !ui->calYFactor->text().isEmpty())
|
||||||
@ -2610,7 +2610,7 @@ void RadioAstronomyGUI::tick()
|
|||||||
|
|
||||||
void RadioAstronomyGUI::updateRotatorList(const AvailableChannelOrFeatureList& rotators, const QStringList& renameFrom, const QStringList& renameTo)
|
void RadioAstronomyGUI::updateRotatorList(const AvailableChannelOrFeatureList& rotators, const QStringList& renameFrom, const QStringList& renameTo)
|
||||||
{
|
{
|
||||||
// Update rotator settting if it has been renamed
|
// Update rotator setting if it has been renamed
|
||||||
if (renameFrom.contains(m_settings.m_rotator))
|
if (renameFrom.contains(m_settings.m_rotator))
|
||||||
{
|
{
|
||||||
m_settings.m_rotator = renameTo[renameFrom.indexOf(m_settings.m_rotator)];
|
m_settings.m_rotator = renameTo[renameFrom.indexOf(m_settings.m_rotator)];
|
||||||
@ -2983,7 +2983,7 @@ void RadioAstronomyGUI::updateSpectrumChartWidgetsVisibility()
|
|||||||
getRollupContents()->arrangeRollups();
|
getRollupContents()->arrangeRollups();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calulate mean, RMS and standard deviation
|
// Calculate mean, RMS and standard deviation
|
||||||
// Currently this is for all data - but could make it only for visible data
|
// Currently this is for all data - but could make it only for visible data
|
||||||
void RadioAstronomyGUI::calcAverages()
|
void RadioAstronomyGUI::calcAverages()
|
||||||
{
|
{
|
||||||
@ -4091,7 +4091,7 @@ static double lineDopplerVelocity(double centre, double f)
|
|||||||
return Astronomy::dopplerToVelocity(f, centre) / 1000.0f;
|
return Astronomy::dopplerToVelocity(f, centre) / 1000.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert frequency shift to velocity (+ve receeding - which seems to be the astronomical convention)
|
// Convert frequency shift to velocity (+ve receding - which seems to be the astronomical convention)
|
||||||
double RadioAstronomyGUI::dopplerToVelocity(double centre, double f, FFTMeasurement *fft)
|
double RadioAstronomyGUI::dopplerToVelocity(double centre, double f, FFTMeasurement *fft)
|
||||||
{
|
{
|
||||||
double v = lineDopplerVelocity(centre, f);
|
double v = lineDopplerVelocity(centre, f);
|
||||||
@ -4107,7 +4107,7 @@ double RadioAstronomyGUI::dopplerToVelocity(double centre, double f, FFTMeasurem
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// Make +ve receeding
|
// Make +ve receding
|
||||||
return -v;
|
return -v;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4645,7 +4645,7 @@ void RadioAstronomyGUI::calcFFTTotalTemperature(FFTMeasurement* fft)
|
|||||||
fft->m_totalPowerdBm = Astronomy::noisePowerdBm(tempSum, bw);
|
fft->m_totalPowerdBm = Astronomy::noisePowerdBm(tempSum, bw);
|
||||||
fft->m_tSys = tempSum/fft->m_fftSize;
|
fft->m_tSys = tempSum/fft->m_fftSize;
|
||||||
|
|
||||||
// Esimate source temperature
|
// Estimate source temperature
|
||||||
fft->m_tSource = calcTSource(fft);
|
fft->m_tSource = calcTSource(fft);
|
||||||
|
|
||||||
// Calculate error due to thermal noise and gain variation
|
// Calculate error due to thermal noise and gain variation
|
||||||
@ -5473,7 +5473,7 @@ void RadioAstronomyGUI::on_spectrumShowLAB_toggled(bool checked)
|
|||||||
applySettings();
|
applySettings();
|
||||||
m_fftLABSeries->setVisible(m_settings.m_spectrumLAB);
|
m_fftLABSeries->setVisible(m_settings.m_spectrumLAB);
|
||||||
if (m_settings.m_spectrumLAB) {
|
if (m_settings.m_spectrumLAB) {
|
||||||
plotLAB(); // Replot incase data needs to be downloaded
|
plotLAB(); // Replot in case data needs to be downloaded
|
||||||
}
|
}
|
||||||
spectrumAutoscale();
|
spectrumAutoscale();
|
||||||
}
|
}
|
||||||
@ -6094,7 +6094,7 @@ void RadioAstronomyGUI::downloadFinished(const QString& filename, bool success)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Try ploting for current FFT (as we only allow one download at a time, so may have been skipped)
|
// Try plotting for current FFT (as we only allow one download at a time, so may have been skipped)
|
||||||
m_downloadingLAB = false;
|
m_downloadingLAB = false;
|
||||||
plotLAB(fft->m_l, fft->m_b, m_beamWidth);
|
plotLAB(fft->m_l, fft->m_b, m_beamWidth);
|
||||||
// Don't clear m_downloadingLAB after this point
|
// Don't clear m_downloadingLAB after this point
|
||||||
|
@ -636,7 +636,7 @@ void RadioClockSink::wwvb()
|
|||||||
m_threshold = m_thresholdMovingAverage.asDouble() * m_linearThreshold; // xdB below average
|
m_threshold = m_thresholdMovingAverage.asDouble() * m_linearThreshold; // xdB below average
|
||||||
m_data = m_magsq > m_threshold;
|
m_data = m_magsq > m_threshold;
|
||||||
|
|
||||||
// Look for minute marker - two consequtive markers
|
// Look for minute marker - two consecutive markers
|
||||||
if ((m_data == 0) && (m_prevData == 1))
|
if ((m_data == 0) && (m_prevData == 1))
|
||||||
{
|
{
|
||||||
if ( (m_highCount <= RadioClockSettings::RADIOCLOCK_CHANNEL_SAMPLE_RATE * 0.3)
|
if ( (m_highCount <= RadioClockSettings::RADIOCLOCK_CHANNEL_SAMPLE_RATE * 0.3)
|
||||||
@ -803,7 +803,7 @@ void RadioClockSink::jjy()
|
|||||||
m_threshold = m_thresholdMovingAverage.asDouble() * m_linearThreshold; // xdB below average
|
m_threshold = m_thresholdMovingAverage.asDouble() * m_linearThreshold; // xdB below average
|
||||||
m_data = m_magsq > m_threshold;
|
m_data = m_magsq > m_threshold;
|
||||||
|
|
||||||
// Look for minute marker - two consequtive markers
|
// Look for minute marker - two consecutive markers
|
||||||
if ((m_data == 1) && (m_prevData == 0))
|
if ((m_data == 1) && (m_prevData == 0))
|
||||||
{
|
{
|
||||||
if ( (m_highCount <= RadioClockSettings::RADIOCLOCK_CHANNEL_SAMPLE_RATE * 0.3)
|
if ( (m_highCount <= RadioClockSettings::RADIOCLOCK_CHANNEL_SAMPLE_RATE * 0.3)
|
||||||
|
@ -66,7 +66,7 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
enum Command {
|
enum Command {
|
||||||
// These are compatbile with osmocom rtl_tcp: https://github.com/osmocom/rtl-sdr/blob/master/src/rtl_tcp.c
|
// These are compatible 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
|
// 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
|
setCenterFrequency = 0x1, // rtlsdr_set_center_freq
|
||||||
setSampleRate = 0x2, // rtlsdr_set_sample_rate
|
setSampleRate = 0x2, // rtlsdr_set_sample_rate
|
||||||
|
@ -93,7 +93,7 @@ struct AISModSettings
|
|||||||
QByteArray m_geometryBytes;
|
QByteArray m_geometryBytes;
|
||||||
bool m_hidden;
|
bool m_hidden;
|
||||||
|
|
||||||
// Sample rate is multiple of 9600 baud rate (use even multiple so Gausian filter has odd number of taps)
|
// Sample rate is multiple of 9600 baud rate (use even multiple so Gaussian filter has odd number of taps)
|
||||||
// Is there any benefit to having this higher?
|
// Is there any benefit to having this higher?
|
||||||
static const int AISMOD_SAMPLE_RATE = (9600*6);
|
static const int AISMOD_SAMPLE_RATE = (9600*6);
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ struct ATVModSettings
|
|||||||
ATVStdPAL625, //!< standard 625 lines B, D, G, H, I, K, K1 and N
|
ATVStdPAL625, //!< standard 625 lines B, D, G, H, I, K, K1 and N
|
||||||
ATVStdPAL525, //!< standard 525 lines M
|
ATVStdPAL525, //!< standard 525 lines M
|
||||||
ATVStd819, //!< standard 819 lines F (Belgium)
|
ATVStd819, //!< standard 819 lines F (Belgium)
|
||||||
ATVStdShortInterlaced, //!< non-standard with mimimal vertical sync sequences permitted by SDR technology
|
ATVStdShortInterlaced, //!< non-standard with minimal vertical sync sequences permitted by SDR technology
|
||||||
ATVStdShort, //!< same as above
|
ATVStdShort, //!< same as above
|
||||||
ATVStdHSkip //!< first introduced vertical sync by skipping horizontal sync to indicate start of image
|
ATVStdHSkip //!< first introduced vertical sync by skipping horizontal sync to indicate start of image
|
||||||
} ATVStd;
|
} ATVStd;
|
||||||
|
@ -90,8 +90,8 @@ private:
|
|||||||
int m_videoHeight; //!< camera frame height
|
int m_videoHeight; //!< camera frame height
|
||||||
float m_videoFx; //!< camera horizontal scaling factor
|
float m_videoFx; //!< camera horizontal scaling factor
|
||||||
float m_videoFy; //!< camera vertictal scaling factor
|
float m_videoFy; //!< camera vertictal scaling factor
|
||||||
float m_videoFPSq; //!< camera FPS sacaling factor
|
float m_videoFPSq; //!< camera FPS scaling factor
|
||||||
float m_videoFPSqManual; //!< camera FPS sacaling factor manually set
|
float m_videoFPSqManual; //!< camera FPS scaling factor manually set
|
||||||
float m_videoFPSCount; //!< camera FPS fractional counter
|
float m_videoFPSCount; //!< camera FPS fractional counter
|
||||||
int m_videoPrevFPSCount; //!< camera FPS previous integer counter
|
int m_videoPrevFPSCount; //!< camera FPS previous integer counter
|
||||||
|
|
||||||
@ -201,7 +201,7 @@ private:
|
|||||||
int m_videoHeight; //!< current video frame height
|
int m_videoHeight; //!< current video frame height
|
||||||
float m_videoFx; //!< current video horizontal scaling factor
|
float m_videoFx; //!< current video horizontal scaling factor
|
||||||
float m_videoFy; //!< current video vertictal scaling factor
|
float m_videoFy; //!< current video vertictal scaling factor
|
||||||
float m_videoFPSq; //!< current video FPS sacaling factor
|
float m_videoFPSq; //!< current video FPS scaling factor
|
||||||
float m_videoFPSCount; //!< current video FPS fractional counter
|
float m_videoFPSCount; //!< current video FPS fractional counter
|
||||||
int m_videoPrevFPSCount; //!< current video FPS previous integer counter
|
int m_videoPrevFPSCount; //!< current video FPS previous integer counter
|
||||||
int m_videoLength; //!< current video length in frames
|
int m_videoLength; //!< current video length in frames
|
||||||
|
@ -56,7 +56,7 @@ struct ChirpChatModSettings
|
|||||||
int m_inputFrequencyOffset;
|
int m_inputFrequencyOffset;
|
||||||
int m_bandwidthIndex;
|
int m_bandwidthIndex;
|
||||||
int m_spreadFactor;
|
int m_spreadFactor;
|
||||||
int m_deBits; //!< Low data rate optmize (DE) bits
|
int m_deBits; //!< Low data rate optimize (DE) bits
|
||||||
unsigned int m_preambleChirps; //!< Number of preamble chirps
|
unsigned int m_preambleChirps; //!< Number of preamble chirps
|
||||||
int m_quietMillis; //!< Number of milliseconds to pause between transmissions
|
int m_quietMillis; //!< Number of milliseconds to pause between transmissions
|
||||||
int m_nbParityBits; //!< Hamming parity bits (LoRa)
|
int m_nbParityBits; //!< Hamming parity bits (LoRa)
|
||||||
|
@ -55,7 +55,7 @@ private:
|
|||||||
{
|
{
|
||||||
ChirpChatStateIdle, //!< Quiet time
|
ChirpChatStateIdle, //!< Quiet time
|
||||||
ChirpChatStatePreamble, //!< Transmit preamble
|
ChirpChatStatePreamble, //!< Transmit preamble
|
||||||
ChirpChatStateSyncWord, //!< Tramsmit sync word
|
ChirpChatStateSyncWord, //!< Transmit sync word
|
||||||
ChirpChatStateSFD, //!< Transmit SFD
|
ChirpChatStateSFD, //!< Transmit SFD
|
||||||
ChirpChatStatePayload //!< Tramsmoit payload
|
ChirpChatStatePayload //!< Tramsmoit payload
|
||||||
};
|
};
|
||||||
@ -77,7 +77,7 @@ private:
|
|||||||
unsigned int m_quietSamples; //!< number of samples during quiet period
|
unsigned int m_quietSamples; //!< number of samples during quiet period
|
||||||
unsigned int m_quarterSamples; //!< number of samples in a quarter chirp
|
unsigned int m_quarterSamples; //!< number of samples in a quarter chirp
|
||||||
unsigned int m_repeatCount; //!< message repetition counter
|
unsigned int m_repeatCount; //!< message repetition counter
|
||||||
bool m_active; //!< modulator is in a sending sequence (icluding periodic quiet times)
|
bool m_active; //!< modulator is in a sending sequence (including periodic quiet times)
|
||||||
|
|
||||||
NCO m_carrierNco;
|
NCO m_carrierNco;
|
||||||
double m_modPhasor; //!< baseband modulator phasor
|
double m_modPhasor; //!< baseband modulator phasor
|
||||||
|
@ -625,7 +625,7 @@ void DATVModGUI::tick()
|
|||||||
m_channelPowerDbAvg(powDb);
|
m_channelPowerDbAvg(powDb);
|
||||||
ui->channelPower->setText(tr("%1 dB").arg(m_channelPowerDbAvg.asDouble(), 0, 'f', 1));
|
ui->channelPower->setText(tr("%1 dB").arg(m_channelPowerDbAvg.asDouble(), 0, 'f', 1));
|
||||||
|
|
||||||
// Use m_tickMsgOutstanding to prevent queuing lots of messsages while stopped/paused
|
// Use m_tickMsgOutstanding to prevent queuing lots of messages while stopped/paused
|
||||||
if (((++m_tickCount & 0xf) == 0) && !m_tickMsgOutstanding)
|
if (((++m_tickCount & 0xf) == 0) && !m_tickMsgOutstanding)
|
||||||
{
|
{
|
||||||
if (ui->inputSelect->currentIndex() == (int) DATVModSettings::SourceFile)
|
if (ui->inputSelect->currentIndex() == (int) DATVModSettings::SourceFile)
|
||||||
|
@ -100,7 +100,7 @@ private:
|
|||||||
|
|
||||||
QUdpSocket *m_udpSocket; //!< UDP socket to receive MPEG transport stream via
|
QUdpSocket *m_udpSocket; //!< UDP socket to receive MPEG transport stream via
|
||||||
int m_udpByteCount; //!< Count of bytes received via UDP for bitrate calculation
|
int m_udpByteCount; //!< Count of bytes received via UDP for bitrate calculation
|
||||||
int64_t m_udpAbsByteCount; //!< Count of bytes received via UDP since the begining
|
int64_t m_udpAbsByteCount; //!< Count of bytes received via UDP since the beginning
|
||||||
boost::chrono::steady_clock::time_point m_udpTimingStart; //!< When we last started counting UDP bytes
|
boost::chrono::steady_clock::time_point m_udpTimingStart; //!< When we last started counting UDP bytes
|
||||||
uint8_t m_udpBuffer[188*10];
|
uint8_t m_udpBuffer[188*10];
|
||||||
int m_udpBufferIdx; //!< TS frame index into buffer
|
int m_udpBufferIdx; //!< TS frame index into buffer
|
||||||
|
@ -56,8 +56,8 @@ DVBS::~DVBS()
|
|||||||
delete[] m_packet;
|
delete[] m_packet;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Scramble input packet (except for sync bytes) with psuedo random binary sequence
|
// Scramble input packet (except for sync bytes) with pseudo random binary sequence
|
||||||
// Initiliase PRBS sequence every 8 packets and invert sync byte
|
// Initialise PRBS sequence every 8 packets and invert sync byte
|
||||||
void DVBS::scramble(const uint8_t *packetIn, uint8_t *packetOut)
|
void DVBS::scramble(const uint8_t *packetIn, uint8_t *packetOut)
|
||||||
{
|
{
|
||||||
if (m_prbsPacketCount == 0)
|
if (m_prbsPacketCount == 0)
|
||||||
|
@ -44,7 +44,7 @@ int DVB2::set_configure( DVB2FrameFormat *f )
|
|||||||
|
|
||||||
if( f->broadcasting )
|
if( f->broadcasting )
|
||||||
{
|
{
|
||||||
// Set standard parametrs for broadcasting
|
// Set standard parameters for broadcasting
|
||||||
f->frame_type = FRAME_NORMAL;
|
f->frame_type = FRAME_NORMAL;
|
||||||
f->bb_header.ts_gs = TS_GS_TRANSPORT;
|
f->bb_header.ts_gs = TS_GS_TRANSPORT;
|
||||||
f->bb_header.sis_mis = SIS_MIS_SINGLE;
|
f->bb_header.sis_mis = SIS_MIS_SINGLE;
|
||||||
@ -200,7 +200,7 @@ int DVB2::set_configure( DVB2FrameFormat *f )
|
|||||||
f->kldpc = f->kbch + bch_bits;
|
f->kldpc = f->kbch + bch_bits;
|
||||||
// Number of padding bits required (not used)
|
// Number of padding bits required (not used)
|
||||||
f->padding_bits = 0;
|
f->padding_bits = 0;
|
||||||
// Number of useable data bits (not used)
|
// Number of usable data bits (not used)
|
||||||
f->useable_data_bits = f->kbch - 80;
|
f->useable_data_bits = f->kbch - 80;
|
||||||
// Save the configuration, will be updated on next frame
|
// Save the configuration, will be updated on next frame
|
||||||
m_format[1] = *f;
|
m_format[1] = *f;
|
||||||
@ -278,7 +278,7 @@ DVB2::DVB2(void)
|
|||||||
init_bb_randomiser();
|
init_bb_randomiser();
|
||||||
bch_poly_build_tables();
|
bch_poly_build_tables();
|
||||||
build_crc8_table();
|
build_crc8_table();
|
||||||
m_dnp = 0;// No delted null packets
|
m_dnp = 0;// No deleted null packets
|
||||||
m_frame_offset_bits = 0;
|
m_frame_offset_bits = 0;
|
||||||
m_params_changed = 1;
|
m_params_changed = 1;
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
typedef unsigned int u32;
|
typedef unsigned int u32;
|
||||||
typedef unsigned char u8;
|
typedef unsigned char u8;
|
||||||
|
|
||||||
// BB HEADER fileds
|
// BB HEADER fields
|
||||||
#define TS_GS_TRANSPORT 3
|
#define TS_GS_TRANSPORT 3
|
||||||
#define TS_GS_GENERIC_PACKETIZED 0
|
#define TS_GS_GENERIC_PACKETIZED 0
|
||||||
#define TS_GS_GENERIC_CONTINUOUS 1
|
#define TS_GS_GENERIC_CONTINUOUS 1
|
||||||
@ -67,7 +67,7 @@ typedef struct{
|
|||||||
|
|
||||||
typedef int Bit;
|
typedef int Bit;
|
||||||
|
|
||||||
// The number of useable and stuff bits in a frame
|
// The number of usable and stuff bits in a frame
|
||||||
typedef struct{
|
typedef struct{
|
||||||
int data_bits;
|
int data_bits;
|
||||||
int stuff_bits;
|
int stuff_bits;
|
||||||
|
@ -105,15 +105,15 @@ void DVBS2::calc_efficiency( void )
|
|||||||
a = a*m;
|
a = a*m;
|
||||||
// Take into account pilot symbols
|
// Take into account pilot symbols
|
||||||
// TBD
|
// TBD
|
||||||
// Now calculate the useable data as percentage of the frame
|
// Now calculate the usable data as percentage of the frame
|
||||||
b = ((double)m_format[1].useable_data_bits)/p;
|
b = ((double)m_format[1].useable_data_bits)/p;
|
||||||
// Now calculate the efficiency by multiplying the
|
// Now calculate the efficiency by multiplying the
|
||||||
// useable bits efficiency by the modulation efficiency
|
// usable bits efficiency by the modulation efficiency
|
||||||
m_efficiency = b*a;
|
m_efficiency = b*a;
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
// Multiply the efficiency value by the symbol rate
|
// Multiply the efficiency value by the symbol rate
|
||||||
// to get the useable bitrate
|
// to get the usable bitrate
|
||||||
//
|
//
|
||||||
double DVBS2::s2_get_efficiency( void )
|
double DVBS2::s2_get_efficiency( void )
|
||||||
{
|
{
|
||||||
|
@ -419,6 +419,6 @@ void DVB2::bch_poly_build_tables( void )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// display_poly( polyout[0], len );//12
|
// display_poly( polyout[0], len );//12
|
||||||
// display_poly_pack( m_poly_s_12, 168 );// Wont work because of shift register length
|
// display_poly_pack( m_poly_s_12, 168 );// Won't work because of shift register length
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
@ -125,7 +125,7 @@ This slider can be used to randomly set the current position in the file when fi
|
|||||||
|
|
||||||
<h2>Creating an MPEG transport stream</h2>
|
<h2>Creating an MPEG transport stream</h2>
|
||||||
|
|
||||||
An MPEG transport stream file can be created from a video file using ffpmeg:
|
An MPEG transport stream file can be created from a video file using ffmpeg:
|
||||||
|
|
||||||
ffmpeg -i input.avi -pix_fmt yuv420p -r 25 -s 720x576 -aspect 4:3 -c:v hevc -c:a libopus -b:v 500k -b:a 64k -maxrate 600k -bufsize 50k -f mpegts -mpegts_original_network_id 1 -mpegts_transport_stream_id 1 -mpegts_service_id 1 -mpegts_pmt_start_pid 4096 -streamid 0:289 -streamid 1:337 -metadata service_provider="SDRangel" -metadata service_name="SDRangel TV" -y mpeg.ts
|
ffmpeg -i input.avi -pix_fmt yuv420p -r 25 -s 720x576 -aspect 4:3 -c:v hevc -c:a libopus -b:v 500k -b:a 64k -maxrate 600k -bufsize 50k -f mpegts -mpegts_original_network_id 1 -mpegts_transport_stream_id 1 -mpegts_service_id 1 -mpegts_pmt_start_pid 4096 -streamid 0:289 -streamid 1:337 -metadata service_provider="SDRangel" -metadata service_name="SDRangel TV" -y mpeg.ts
|
||||||
|
|
||||||
|
@ -333,7 +333,7 @@ QString M17ModProcessor::formatAPRSPosition()
|
|||||||
int latDeg, latMin, latFrac, latNorth;
|
int latDeg, latMin, latFrac, latNorth;
|
||||||
int longDeg, longMin, longFrac, longEast;
|
int longDeg, longMin, longFrac, longEast;
|
||||||
|
|
||||||
// Convert decimal latitude to degrees, min and hundreths of a minute
|
// Convert decimal latitude to degrees, min and hundredths of a minute
|
||||||
latNorth = latitude >= 0.0f;
|
latNorth = latitude >= 0.0f;
|
||||||
latitude = abs(latitude);
|
latitude = abs(latitude);
|
||||||
latDeg = (int) latitude;
|
latDeg = (int) latitude;
|
||||||
|
@ -235,7 +235,7 @@ void PacketModGUI::on_insertPosition_clicked()
|
|||||||
char latBuf[40];
|
char latBuf[40];
|
||||||
char longBuf[40];
|
char longBuf[40];
|
||||||
|
|
||||||
// Convert decimal latitude to degrees, min and hundreths of a minute
|
// Convert decimal latitude to degrees, min and hundredths of a minute
|
||||||
latNorth = latitude >= 0.0f;
|
latNorth = latitude >= 0.0f;
|
||||||
latitude = abs(latitude);
|
latitude = abs(latitude);
|
||||||
latDeg = (int)latitude;
|
latDeg = (int)latitude;
|
||||||
|
@ -152,7 +152,7 @@ void AMBEEngine::register_comport(
|
|||||||
//std::cerr << "register_comport: dir: "<< dir << " driver: " << driver << std::endl;
|
//std::cerr << "register_comport: dir: "<< dir << " driver: " << driver << std::endl;
|
||||||
std::string devfile = std::string("/dev/") + basename((char *) dir.c_str());
|
std::string devfile = std::string("/dev/") + basename((char *) dir.c_str());
|
||||||
|
|
||||||
// Put serial8250-devices in a seperate list
|
// Put serial8250-devices in a separate list
|
||||||
if (driver == "serial8250") {
|
if (driver == "serial8250") {
|
||||||
comList8250.push_back(devfile);
|
comList8250.push_back(devfile);
|
||||||
} else {
|
} else {
|
||||||
|
@ -131,7 +131,7 @@ private:
|
|||||||
QTimer m_statusTimer;
|
QTimer m_statusTimer;
|
||||||
int m_lastFeatureState;
|
int m_lastFeatureState;
|
||||||
|
|
||||||
QHash<QString,APRSStation *> m_stations; // All stations we've recieved packets for. Hashed on callsign
|
QHash<QString,APRSStation *> m_stations; // All stations we've received packets for. Hashed on callsign
|
||||||
|
|
||||||
QMenu *packetsTableMenu; // Column select context menus
|
QMenu *packetsTableMenu; // Column select context menus
|
||||||
QMenu *weatherTableMenu;
|
QMenu *weatherTableMenu;
|
||||||
|
@ -172,7 +172,7 @@ void DFMProtocol::parseLCUResponse(const QString& packet)
|
|||||||
float el = aa.alt;
|
float el = aa.alt;
|
||||||
reportAzEl(az, el);
|
reportAzEl(az, el);
|
||||||
|
|
||||||
// If this is the second LCU packet, we send a commmand
|
// If this is the second LCU packet, we send a command
|
||||||
m_packetCnt++;
|
m_packetCnt++;
|
||||||
if (m_packetCnt == 2)
|
if (m_packetCnt == 2)
|
||||||
{
|
{
|
||||||
|
@ -540,7 +540,7 @@ void GS232ControllerGUI::updateSerialPortList(const QStringList& serialPorts)
|
|||||||
|
|
||||||
void GS232ControllerGUI::updatePipeList(const AvailableChannelOrFeatureList& sources, const QStringList& renameFrom, const QStringList& renameTo)
|
void GS232ControllerGUI::updatePipeList(const AvailableChannelOrFeatureList& sources, const QStringList& renameFrom, const QStringList& renameTo)
|
||||||
{
|
{
|
||||||
// Update source settting if it has been renamed
|
// Update source setting if it has been renamed
|
||||||
if (renameFrom.contains(m_settings.m_source))
|
if (renameFrom.contains(m_settings.m_source))
|
||||||
{
|
{
|
||||||
m_settings.m_source = renameTo[renameFrom.indexOf(m_settings.m_source)];
|
m_settings.m_source = renameTo[renameFrom.indexOf(m_settings.m_source)];
|
||||||
@ -576,7 +576,7 @@ void GS232ControllerGUI::updatePipeList(const AvailableChannelOrFeatureList& sou
|
|||||||
|
|
||||||
ui->sources->blockSignals(false);
|
ui->sources->blockSignals(false);
|
||||||
|
|
||||||
// If no current settting, select first available
|
// If no current setting, select first available
|
||||||
if (m_settings.m_source.isEmpty() && (ui->sources->count() > 0))
|
if (m_settings.m_source.isEmpty() && (ui->sources->count() > 0))
|
||||||
{
|
{
|
||||||
ui->sources->setCurrentIndex(0);
|
ui->sources->setCurrentIndex(0);
|
||||||
|
@ -44,8 +44,8 @@ const std::map<int, std::string> LimeRFE::m_errorCodesMap = {
|
|||||||
{-3, "Non-configurable GPIO pin specified. Only pins 4 and 5 are configurable."},
|
{-3, "Non-configurable GPIO pin specified. Only pins 4 and 5 are configurable."},
|
||||||
{-2, "Problem with .ini configuration file"},
|
{-2, "Problem with .ini configuration file"},
|
||||||
{-1, "Communication error"},
|
{-1, "Communication error"},
|
||||||
{ 1, "Wrong TX connector - not possible to route TX of the selecrted channel to the specified port"},
|
{ 1, "Wrong TX connector - not possible to route TX of the selected channel to the specified port"},
|
||||||
{ 2, "Wrong RX connector - not possible to route RX of the selecrted channel to the specified port"},
|
{ 2, "Wrong RX connector - not possible to route RX of the selected channel to the specified port"},
|
||||||
{ 3, "Mode TXRX not allowed - when the same port is selected for RX and TX, it is not allowed to use mode RX & TX"},
|
{ 3, "Mode TXRX not allowed - when the same port is selected for RX and TX, it is not allowed to use mode RX & TX"},
|
||||||
{ 4, "Wrong mode for cellular channel - Cellular FDD bands (1, 2, 3, and 7) are only allowed mode RX & TX, while TDD band 38 is allowed only RX or TX mode"},
|
{ 4, "Wrong mode for cellular channel - Cellular FDD bands (1, 2, 3, and 7) are only allowed mode RX & TX, while TDD band 38 is allowed only RX or TX mode"},
|
||||||
{ 5, "Cellular channels must be the same both for RX and TX"},
|
{ 5, "Cellular channels must be the same both for RX and TX"},
|
||||||
|
@ -70,7 +70,7 @@ void MapIBPBeaconDialog::updateTable(QTime time)
|
|||||||
{
|
{
|
||||||
AzEl azEl = *m_gui->getAzEl();
|
AzEl azEl = *m_gui->getAzEl();
|
||||||
|
|
||||||
// Repeat from begining every 3 minutes
|
// Repeat from beginning every 3 minutes
|
||||||
int index = ((time.minute() * 60 + time.second()) % 180) / IBPBeacon::m_period;
|
int index = ((time.minute() * 60 + time.second()) % 180) / IBPBeacon::m_period;
|
||||||
|
|
||||||
for (int row = 0; row < IBPBeacon::m_frequencies.size(); row++)
|
for (int row = 0; row < IBPBeacon::m_frequencies.size(); row++)
|
||||||
|
@ -346,7 +346,7 @@ private slots:
|
|||||||
{
|
{
|
||||||
QMutexLocker locker(&m_mutex);
|
QMutexLocker locker(&m_mutex);
|
||||||
//QString url = reply->url().toEncoded().constData();
|
//QString url = reply->url().toEncoded().constData();
|
||||||
QString url = reply->request().url().toEncoded().constData(); // reply->url() may differ if redirection occured, so use requested
|
QString url = reply->request().url().toEncoded().constData(); // reply->url() may differ if redirection occurred, so use requested
|
||||||
|
|
||||||
if (!isHttpRedirect(reply))
|
if (!isHttpRedirect(reply))
|
||||||
{
|
{
|
||||||
|
@ -96,7 +96,7 @@ This scope display shows waveforms related to the decoding with GGMorse.
|
|||||||
* When the show decoder threshold is set (11a) it shows the threshold level being used in GGMorse for decoding. It is not necessary on the same scale as the Goertzel output.
|
* When the show decoder threshold is set (11a) it shows the threshold level being used in GGMorse for decoding. It is not necessary on the same scale as the Goertzel output.
|
||||||
* When the show decoder threshold is not set (11a) a constant 0.0316227766017 is applied which corresponds to a power of -30 dB.
|
* When the show decoder threshold is not set (11a) a constant 0.0316227766017 is applied which corresponds to a power of -30 dB.
|
||||||
|
|
||||||
The elemetary trace length is 3 seconds. This is the time window used by GGMorse thus a new trace appears every 3 seconds. The actual traces are interpolated to fit in the 4800 samples of the elementary trace. Thus the sample rate is a fixed 1.6 kS/s.
|
The elementary trace length is 3 seconds. This is the time window used by GGMorse thus a new trace appears every 3 seconds. The actual traces are interpolated to fit in the 4800 samples of the elementary trace. Thus the sample rate is a fixed 1.6 kS/s.
|
||||||
|
|
||||||
The best settings to visualize the Goertzel waveform is the following:
|
The best settings to visualize the Goertzel waveform is the following:
|
||||||
|
|
||||||
|
@ -158,7 +158,7 @@ RadiosondeGUI::RadiosondeGUI(PluginAPI* pluginAPI, FeatureUISet *featureUISet, F
|
|||||||
|
|
||||||
m_sondeHub = SondeHub::create();
|
m_sondeHub = SondeHub::create();
|
||||||
|
|
||||||
// Intialise chart
|
// Initialise chart
|
||||||
ui->chart->setRenderHint(QPainter::Antialiasing);
|
ui->chart->setRenderHint(QPainter::Antialiasing);
|
||||||
|
|
||||||
// Resize the table using dummy data
|
// Resize the table using dummy data
|
||||||
|
@ -483,7 +483,7 @@ bool RigCtlServerWorker::getFrequency(double& frequency, rig_errcode_e& rigCtlRC
|
|||||||
if (WebAPIUtils::getSubObjectDouble(*jsonObj, "centerFrequency", deviceFreq))
|
if (WebAPIUtils::getSubObjectDouble(*jsonObj, "centerFrequency", deviceFreq))
|
||||||
{
|
{
|
||||||
SWGSDRangel::SWGChannelSettings channelSettingsResponse;
|
SWGSDRangel::SWGChannelSettings channelSettingsResponse;
|
||||||
// Get channel settings containg inputFrequencyOffset, so we can patch them
|
// Get channel settings containing inputFrequencyOffset, so we can patch them
|
||||||
httpRC = m_webAPIAdapterInterface->devicesetChannelSettingsGet(
|
httpRC = m_webAPIAdapterInterface->devicesetChannelSettingsGet(
|
||||||
m_settings.m_deviceIndex,
|
m_settings.m_deviceIndex,
|
||||||
m_settings.m_channelIndex,
|
m_settings.m_channelIndex,
|
||||||
@ -683,7 +683,7 @@ bool RigCtlServerWorker::getMode(const char **mode, double& passband, rig_errcod
|
|||||||
SWGSDRangel::SWGErrorResponse errorResponse;
|
SWGSDRangel::SWGErrorResponse errorResponse;
|
||||||
int httpRC;
|
int httpRC;
|
||||||
|
|
||||||
// Get channel settings containg inputFrequencyOffset, so we can patch them
|
// Get channel settings containing inputFrequencyOffset, so we can patch them
|
||||||
httpRC = m_webAPIAdapterInterface->devicesetChannelSettingsGet(
|
httpRC = m_webAPIAdapterInterface->devicesetChannelSettingsGet(
|
||||||
m_settings.m_deviceIndex,
|
m_settings.m_deviceIndex,
|
||||||
m_settings.m_channelIndex,
|
m_settings.m_channelIndex,
|
||||||
|
@ -305,7 +305,7 @@ SatelliteTrackerGUI::SatelliteTrackerGUI(PluginAPI* pluginAPI, FeatureUISet *fea
|
|||||||
|
|
||||||
connect(&m_redrawTimer, &QTimer::timeout, this, &SatelliteTrackerGUI::plotChart);
|
connect(&m_redrawTimer, &QTimer::timeout, this, &SatelliteTrackerGUI::plotChart);
|
||||||
|
|
||||||
// Intialise charts
|
// Initialise charts
|
||||||
m_emptyChart.layout()->setContentsMargins(0, 0, 0, 0);
|
m_emptyChart.layout()->setContentsMargins(0, 0, 0, 0);
|
||||||
m_emptyChart.setMargins(QMargins(1, 1, 1, 1));
|
m_emptyChart.setMargins(QMargins(1, 1, 1, 1));
|
||||||
ui->passChart->setChart(&m_emptyChart);
|
ui->passChart->setChart(&m_emptyChart);
|
||||||
|
@ -75,7 +75,7 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Sent from worker to GUI to indicaite LOS
|
// Sent from worker to GUI to indicate LOS
|
||||||
class MsgReportLOS : public Message {
|
class MsgReportLOS : public Message {
|
||||||
MESSAGE_CLASS_DECLARATION
|
MESSAGE_CLASS_DECLARATION
|
||||||
|
|
||||||
|
@ -88,7 +88,7 @@ void SatelliteTrackerSettingsDialog::on_removeTle_clicked()
|
|||||||
void SatelliteTrackerSettingsDialog::on_defaultTles_clicked()
|
void SatelliteTrackerSettingsDialog::on_defaultTles_clicked()
|
||||||
{
|
{
|
||||||
QMessageBox::StandardButton reply;
|
QMessageBox::StandardButton reply;
|
||||||
reply = QMessageBox::question(this, "Confirm ovewrite", "Replace the current TLE list with the default?", QMessageBox::Yes|QMessageBox::No, QMessageBox::No);
|
reply = QMessageBox::question(this, "Confirm overwrite", "Replace the current TLE list with the default?", QMessageBox::Yes|QMessageBox::No, QMessageBox::No);
|
||||||
if (reply == QMessageBox::Yes) {
|
if (reply == QMessageBox::Yes) {
|
||||||
ui->tles->clear();
|
ui->tles->clear();
|
||||||
updateTleWidget(DEFAULT_TLES);
|
updateTleWidget(DEFAULT_TLES);
|
||||||
|
@ -176,7 +176,7 @@ void getPassAzEl(QLineSeries* azimuth, QLineSeries* elevation, QLineSeries* pola
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get whether a pass passes through 0 degreees
|
// Get whether a pass passes through 0 degrees
|
||||||
bool getPassesThrough0Deg(const QString& tle0, const QString& tle1, const QString& tle2,
|
bool getPassesThrough0Deg(const QString& tle0, const QString& tle1, const QString& tle2,
|
||||||
double latitude, double longitude, double altitude,
|
double latitude, double longitude, double altitude,
|
||||||
QDateTime& aos, QDateTime& los)
|
QDateTime& aos, QDateTime& los)
|
||||||
@ -321,7 +321,7 @@ static DateTime findCrossingPoint(Observer& obs, SGP4& sgp4, const DateTime& ini
|
|||||||
return middleTime;
|
return middleTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find when AOS occured, by stepping backwards
|
// Find when AOS occurred, by stepping backwards
|
||||||
static DateTime findAOSBackwards(Observer& obs, SGP4& sgp4, DateTime& startTime,
|
static DateTime findAOSBackwards(Observer& obs, SGP4& sgp4, DateTime& startTime,
|
||||||
int predictionPeriod, double minElevation, bool& aosUnknown)
|
int predictionPeriod, double minElevation, bool& aosUnknown)
|
||||||
{
|
{
|
||||||
@ -366,7 +366,7 @@ bool inPassWindow(DateTime dateTime, QTime passStartTime, QTime passEndTime, boo
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create a list of satellite passes, between the given start and end times, that exceed the specified minimum elevation
|
// Create a list of satellite passes, between the given start and end times, that exceed the specified minimum elevation
|
||||||
// We return an uninitalised QDateTime if AOS or LOS is outside of predictionPeriod
|
// We return an uninitialised QDateTime if AOS or LOS is outside of predictionPeriod
|
||||||
static QList<SatellitePass> createPassList(Observer& obs, SGP4& sgp4, DateTime& startTime,
|
static QList<SatellitePass> createPassList(Observer& obs, SGP4& sgp4, DateTime& startTime,
|
||||||
int predictionPeriod, double minAOSElevation, double minPassElevationDeg,
|
int predictionPeriod, double minAOSElevation, double minPassElevationDeg,
|
||||||
QTime passStartTime, QTime passEndTime, bool utc,
|
QTime passStartTime, QTime passEndTime, bool utc,
|
||||||
|
@ -398,7 +398,7 @@ void SatelliteTrackerWorker::update()
|
|||||||
if (satWorkerState->m_losTimer.isActive()) {
|
if (satWorkerState->m_losTimer.isActive()) {
|
||||||
qDebug() << "SatelliteTrackerWorker::update m_losTimer.remainingTime: " << satWorkerState->m_losTimer.remainingTime();
|
qDebug() << "SatelliteTrackerWorker::update m_losTimer.remainingTime: " << satWorkerState->m_losTimer.remainingTime();
|
||||||
}
|
}
|
||||||
// We can detect a new AOS for a satellite, a little bit before the LOS has occured
|
// We can detect a new AOS for a satellite, a little bit before the LOS has occurred
|
||||||
// Allow for 5s here (1s doesn't appear to be enough in some cases)
|
// Allow for 5s here (1s doesn't appear to be enough in some cases)
|
||||||
if (satWorkerState->m_losTimer.isActive() && (satWorkerState->m_losTimer.remainingTime() <= 5000))
|
if (satWorkerState->m_losTimer.isActive() && (satWorkerState->m_losTimer.remainingTime() <= 5000))
|
||||||
{
|
{
|
||||||
|
@ -149,7 +149,7 @@ void SIDAddChannelsDialog::channelAdded(int deviceSetIndex, ChannelAPI *channel)
|
|||||||
ChannelWebAPIUtils::patchChannelSetting(channel, "rfBandwidth", 300);
|
ChannelWebAPIUtils::patchChannelSetting(channel, "rfBandwidth", 300);
|
||||||
ChannelWebAPIUtils::patchChannelSetting(channel, "averagePeriodUS", 10000000);
|
ChannelWebAPIUtils::patchChannelSetting(channel, "averagePeriodUS", 10000000);
|
||||||
|
|
||||||
// Update setings if they are created by SIDGUI before this slot is called
|
// Update settings if they are created by SIDGUI before this slot is called
|
||||||
if (m_count < m_settings->m_channelSettings.size()) {
|
if (m_count < m_settings->m_channelSettings.size()) {
|
||||||
m_settings->m_channelSettings[m_count].m_label = transmitter->m_callsign;
|
m_settings->m_channelSettings[m_count].m_label = transmitter->m_callsign;
|
||||||
}
|
}
|
||||||
|
@ -184,7 +184,7 @@ SIDGUI::SIDGUI(PluginAPI* pluginAPI, FeatureUISet *featureUISet, Feature *featur
|
|||||||
ui->startDateTime->blockSignals(false);
|
ui->startDateTime->blockSignals(false);
|
||||||
ui->endDateTime->blockSignals(false);
|
ui->endDateTime->blockSignals(false);
|
||||||
|
|
||||||
// Intialise chart
|
// Initialise chart
|
||||||
ui->chart->setRenderHint(QPainter::Antialiasing);
|
ui->chart->setRenderHint(QPainter::Antialiasing);
|
||||||
ui->xRayChart->setRenderHint(QPainter::Antialiasing);
|
ui->xRayChart->setRenderHint(QPainter::Antialiasing);
|
||||||
|
|
||||||
@ -207,7 +207,7 @@ SIDGUI::SIDGUI(PluginAPI* pluginAPI, FeatureUISet *featureUISet, Feature *featur
|
|||||||
applyAllSettings();
|
applyAllSettings();
|
||||||
m_resizer.enableChildMouseTracking();
|
m_resizer.enableChildMouseTracking();
|
||||||
|
|
||||||
// Intialisation for Solar Dynamics Observatory image/video display
|
// Initialisation for Solar Dynamics Observatory image/video display
|
||||||
ui->sdoEnabled->setChecked(true);
|
ui->sdoEnabled->setChecked(true);
|
||||||
ui->sdoProgressBar->setVisible(false);
|
ui->sdoProgressBar->setVisible(false);
|
||||||
ui->sdoImage->setStyleSheet("background-color: black;");
|
ui->sdoImage->setStyleSheet("background-color: black;");
|
||||||
@ -236,7 +236,7 @@ SIDGUI::SIDGUI(PluginAPI* pluginAPI, FeatureUISet *featureUISet, Feature *featur
|
|||||||
m_settings.m_sdoData = ui->sdoData->currentText();
|
m_settings.m_sdoData = ui->sdoData->currentText();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Intialisation for GOES X-Ray data
|
// Initialisation for GOES X-Ray data
|
||||||
m_goesXRay = GOESXRay::create();
|
m_goesXRay = GOESXRay::create();
|
||||||
if (m_goesXRay)
|
if (m_goesXRay)
|
||||||
{
|
{
|
||||||
|
@ -1054,7 +1054,7 @@ void SkyMapGUI::updateSourceList(const QStringList& renameFrom, const QStringLis
|
|||||||
{
|
{
|
||||||
m_availableChannelOrFeatures = m_availableChannelOrFeatureHandler.getAvailableChannelOrFeatureList();
|
m_availableChannelOrFeatures = m_availableChannelOrFeatureHandler.getAvailableChannelOrFeatureList();
|
||||||
|
|
||||||
// Update source settting if it has been renamed
|
// Update source setting if it has been renamed
|
||||||
if (renameFrom.contains(m_settings.m_source))
|
if (renameFrom.contains(m_settings.m_source))
|
||||||
{
|
{
|
||||||
m_settings.m_source = renameTo[renameFrom.indexOf(m_settings.m_source)];
|
m_settings.m_source = renameTo[renameFrom.indexOf(m_settings.m_source)];
|
||||||
@ -1092,7 +1092,7 @@ void SkyMapGUI::updateSourceList(const QStringList& renameFrom, const QStringLis
|
|||||||
|
|
||||||
ui->source->blockSignals(false);
|
ui->source->blockSignals(false);
|
||||||
|
|
||||||
// If no current settting, select first available
|
// If no current setting, select first available
|
||||||
if (m_settings.m_source.isEmpty() && (ui->source->count() > 0))
|
if (m_settings.m_source.isEmpty() && (ui->source->count() > 0))
|
||||||
{
|
{
|
||||||
ui->source->setCurrentIndex(0);
|
ui->source->setCurrentIndex(0);
|
||||||
|
@ -680,7 +680,7 @@ double StarTracker::applyBeam(const FITS *fits, double beamwidth, double ra, dou
|
|||||||
// (Essentially the same as Gaussian of exp(-4*ln(theta^2/beamwidth^2))
|
// (Essentially the same as Gaussian of exp(-4*ln(theta^2/beamwidth^2))
|
||||||
// (See a2 in https://arxiv.org/pdf/1812.10084.pdf for Elliptical equivalent))
|
// (See a2 in https://arxiv.org/pdf/1812.10084.pdf for Elliptical equivalent))
|
||||||
// We have gain of 0dB (1) at 0 degrees, and -3dB (~0.5) at half-beamwidth degrees
|
// We have gain of 0dB (1) at 0 degrees, and -3dB (~0.5) at half-beamwidth degrees
|
||||||
// Find exponent that correponds to -3dB at that angle
|
// Find exponent that corresponds to -3dB at that angle
|
||||||
double minus3dBLinear = pow(10.0, -3.0/10.0);
|
double minus3dBLinear = pow(10.0, -3.0/10.0);
|
||||||
double p = log(minus3dBLinear)/log(cos(Units::degreesToRadians(halfBeamwidth)));
|
double p = log(minus3dBLinear)/log(cos(Units::degreesToRadians(halfBeamwidth)));
|
||||||
// Create an matrix with gain as a function of angle
|
// Create an matrix with gain as a function of angle
|
||||||
@ -791,7 +791,7 @@ bool StarTracker::calcSkyTemperature(double frequency, double beamwidth, double
|
|||||||
// LFmap: https://www.faculty.ece.vt.edu/swe/lwa/memo/lwa0111.pdf
|
// LFmap: https://www.faculty.ece.vt.edu/swe/lwa/memo/lwa0111.pdf
|
||||||
double iso408 = 50 * pow(150e6/408e6, 2.75); // Extra-galactic isotropic in reference map at 408MHz
|
double iso408 = 50 * pow(150e6/408e6, 2.75); // Extra-galactic isotropic in reference map at 408MHz
|
||||||
double isoT = 50 * pow(150e6/frequency, 2.75); // Extra-galactic isotropic at target frequency
|
double isoT = 50 * pow(150e6/frequency, 2.75); // Extra-galactic isotropic at target frequency
|
||||||
double cmbT = 2.725; // Cosmic microwave backgroud;
|
double cmbT = 2.725; // Cosmic microwave background;
|
||||||
double spectralIndex;
|
double spectralIndex;
|
||||||
const FITS *spectralIndexFITS = getSpectralIndexFITS();
|
const FITS *spectralIndexFITS = getSpectralIndexFITS();
|
||||||
if (spectralIndexFITS && spectralIndexFITS->valid())
|
if (spectralIndexFITS && spectralIndexFITS->valid())
|
||||||
|
@ -361,7 +361,7 @@ StarTrackerGUI::StarTrackerGUI(PluginAPI* pluginAPI, FeatureUISet *featureUISet,
|
|||||||
ui->galacticLatitude->setText("");
|
ui->galacticLatitude->setText("");
|
||||||
ui->galacticLongitude->setText("");
|
ui->galacticLongitude->setText("");
|
||||||
|
|
||||||
// Intialise chart
|
// Initialise chart
|
||||||
m_chart.legend()->hide();
|
m_chart.legend()->hide();
|
||||||
ui->chart->setChart(&m_chart);
|
ui->chart->setChart(&m_chart);
|
||||||
ui->chart->setRenderHint(QPainter::Antialiasing);
|
ui->chart->setRenderHint(QPainter::Antialiasing);
|
||||||
|
@ -784,7 +784,7 @@ bool VORLocalizerGUI::handleMessage(const Message& message)
|
|||||||
// Convert Morse to a string
|
// Convert Morse to a string
|
||||||
QString identString = Morse::toString(ident);
|
QString identString = Morse::toString(ident);
|
||||||
// Idents should only be two or three characters, so filter anything else
|
// Idents should only be two or three characters, so filter anything else
|
||||||
// other than TEST which indicates a VOR is under maintainance (may also be TST)
|
// other than TEST which indicates a VOR is under maintenance (may also be TST)
|
||||||
|
|
||||||
if (((identString.size() >= 2) && (identString.size() <= 3)) || (identString == "TEST"))
|
if (((identString.size() >= 2) && (identString.size() <= 3)) || (identString == "TEST"))
|
||||||
{
|
{
|
||||||
|
@ -469,7 +469,7 @@ void VorLocalizerWorker::setChannelShift(int deviceIndex, int channelIndex, doub
|
|||||||
SWGSDRangel::SWGErrorResponse errorResponse;
|
SWGSDRangel::SWGErrorResponse errorResponse;
|
||||||
int httpRC;
|
int httpRC;
|
||||||
|
|
||||||
// Get channel settings containg inputFrequencyOffset, so we can patch them
|
// Get channel settings containing inputFrequencyOffset, so we can patch them
|
||||||
httpRC = m_webAPIAdapterInterface->devicesetChannelSettingsGet(
|
httpRC = m_webAPIAdapterInterface->devicesetChannelSettingsGet(
|
||||||
deviceIndex,
|
deviceIndex,
|
||||||
channelIndex,
|
channelIndex,
|
||||||
@ -547,7 +547,7 @@ void VorLocalizerWorker::setAudioMute(int vorNavId, bool audioMute)
|
|||||||
int deviceIndex = m_channelAllocations[vorNavId].m_deviceIndex;
|
int deviceIndex = m_channelAllocations[vorNavId].m_deviceIndex;
|
||||||
int channelIndex = m_channelAllocations[vorNavId].m_channelIndex;
|
int channelIndex = m_channelAllocations[vorNavId].m_channelIndex;
|
||||||
|
|
||||||
// Get channel settings containg inputFrequencyOffset, so we can patch them
|
// Get channel settings containing inputFrequencyOffset, so we can patch them
|
||||||
httpRC = m_webAPIAdapterInterface->devicesetChannelSettingsGet(
|
httpRC = m_webAPIAdapterInterface->devicesetChannelSettingsGet(
|
||||||
deviceIndex,
|
deviceIndex,
|
||||||
channelIndex,
|
channelIndex,
|
||||||
|
@ -51,7 +51,7 @@ private:
|
|||||||
bool m_running;
|
bool m_running;
|
||||||
|
|
||||||
DevicePlutoSDRBox *m_plutoBox;
|
DevicePlutoSDRBox *m_plutoBox;
|
||||||
int16_t *m_buf; //!< holds I+Q values of each sample from devce
|
int16_t *m_buf; //!< holds I+Q values of each sample from device
|
||||||
// int16_t *m_bufConv; //!< holds I+Q values of each sample converted to host format via iio_channel_convert
|
// int16_t *m_bufConv; //!< holds I+Q values of each sample converted to host format via iio_channel_convert
|
||||||
uint32_t m_blockSizeSamples; //!< buffer sizes in number of (I,Q) samples
|
uint32_t m_blockSizeSamples; //!< buffer sizes in number of (I,Q) samples
|
||||||
SampleSourceFifo* m_sampleFifo; //!< DSP sample FIFO (I,Q)
|
SampleSourceFifo* m_sampleFifo; //!< DSP sample FIFO (I,Q)
|
||||||
|
@ -223,7 +223,7 @@ void AaroniaRTSAInputWorker::onReadyRead()
|
|||||||
qint64 done = mReply->read(mBuffer.data() + bs, n);
|
qint64 done = mReply->read(mBuffer.data() + bs, n);
|
||||||
mBuffer.resize(bs + done);
|
mBuffer.resize(bs + done);
|
||||||
|
|
||||||
// intialize parsing
|
// initialize parsing
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
int avail = mBuffer.size();
|
int avail = mBuffer.size();
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
// BladerRF2 is a SISO/MIMO device with a single stream supporting one or two Rx
|
// BladerRF2 is a SISO/MIMO device with a single stream supporting one or two Rx
|
||||||
// Therefore only one thread can be allocated for the Rx side
|
// Therefore only one thread can be allocated for the Rx side
|
||||||
// All FIFOs must be registered before calling startWork() else SISO/MIMO switch will not work properly
|
// All FIFOs must be registered before calling startWork() else SISO/MIMO switch will not work properly
|
||||||
// with unpredicatable results
|
// with unpredictable results
|
||||||
|
|
||||||
#include <QThread>
|
#include <QThread>
|
||||||
#include <QMutex>
|
#include <QMutex>
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user