diff --git a/plugins/channelrx/channelpower/readme.md b/plugins/channelrx/channelpower/readme.md index a176b3d43..cc8375ab8 100644 --- a/plugins/channelrx/channelpower/readme.md +++ b/plugins/channelrx/channelpower/readme.md @@ -1,4 +1,4 @@ -

Channel Power Plugin

+

Channel Power Plugin

Introduction

@@ -10,38 +10,48 @@ The top and bottom bars of the channel window are described [here](../../../sdrg ![Channel power plugin GUI](../../../doc/img/ChannelPower_plugin_settings.png) -

1: Frequency shift from center frequency of reception

+

1: Channel frequency entry mode

-Use the wheels to adjust the channel center frequency as a shift in Hz from the center frequency of reception. Left click on a digit sets the cursor position at this digit. Right click on a digit sets all digits on the right to zero. This effectively floors value at the digit position. Wheels are moved with the mousewheel while pointing at the wheel or by selecting the wheel with the left mouse click and using the keyboard arrows. Pressing shift simultaneously moves digit by 5 and pressing control moves it by 2. +Select from one of the following modes to determine how the channel center frequency is calculated: -

2: BW - Channel Bandwidth

+* Δf - Specify an offset in Hz from device center frequency. +* f - Specific a frequency in Hz. + +

2: Channel Frequency

+ +Specifies channel center frequency according to frequency entry mode (1): + +* Δf - Offset in Hz from device center frequency. +* f - Absolute frequency in Hz. + +

3: BW - Channel Bandwidth

Bandwidth in Hz of the channel for which power is to be measured. -

3: Tavg - Average Time

+

4: Tavg - Average Time

Time period overwhich the channel power is averaged. Values range from 10us to 10s in powers of 10. The available values depend upon the sample rate. -

4: THp - Pulse Threshold

+

5: THp - Pulse Threshold

The pulse threshold sets the power in dB for which the channel power needs to exceed, in order to be included in the pulse average power measurement. -

5: Avg - Average Power

+

6: Avg - Average Power

Displays the most recent average power measurement in dB. -

6: Max - Max Peak Power

+

7: Max - Max Peak Power

Displays the maximum instantaneous peak power measurement in dB. -

7: Min - Min Peak Power

+

8: Min - Min Peak Power

Displays the minimum instantaneous peak power measurement in dB. -

8: Pulse - Pulse Average Power

+

9: Pulse - Pulse Average Power

Displays the most recent pulse average power measurement in dB. -

9: Clear Data

+

10: Clear Data

Clears current measurements (min and max values are reset). diff --git a/plugins/channelrx/radioclock/radioclockgui.cpp b/plugins/channelrx/radioclock/radioclockgui.cpp index 1b07ec698..8860c2233 100644 --- a/plugins/channelrx/radioclock/radioclockgui.cpp +++ b/plugins/channelrx/radioclock/radioclockgui.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////////// -// Copyright (C) 2020-2023 Jon Beniston, M7RCE // +// Copyright (C) 2020-2024 Jon Beniston, M7RCE // // Copyright (C) 2020-2022 Edouard Griffiths, F4EXB // // // // This program is free software; you can redistribute it and/or modify // @@ -139,8 +139,7 @@ bool RadioClockGUI::handleMessage(const Message& message) const DSPSignalNotification& notif = (const DSPSignalNotification&) message; m_deviceCenterFrequency = notif.getCenterFrequency(); m_basebandSampleRate = notif.getSampleRate(); - ui->deltaFrequency->setValueRange(false, 7, -m_basebandSampleRate/2, m_basebandSampleRate/2); - ui->deltaFrequencyLabel->setToolTip(tr("Range %1 %L2 Hz").arg(QChar(0xB1)).arg(m_basebandSampleRate/2)); + calcOffset(); updateAbsoluteCenterFrequency(); return true; } @@ -148,6 +147,23 @@ bool RadioClockGUI::handleMessage(const Message& message) return false; } +// Calculate input frequency offset, when device center frequency changes +void RadioClockGUI::calcOffset() +{ + if (m_settings.m_frequencyMode == RadioClockSettings::Offset) + { + ui->deltaFrequency->setValueRange(false, 7, -m_basebandSampleRate/2, m_basebandSampleRate/2); + } + else + { + qint64 offset = m_settings.m_frequency - m_deviceCenterFrequency; + m_channelMarker.setCenterFrequency(offset); + m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); + updateAbsoluteCenterFrequency(); + applySettings(); + } +} + void RadioClockGUI::handleInputMessages() { Message* message; @@ -163,8 +179,22 @@ void RadioClockGUI::handleInputMessages() void RadioClockGUI::channelMarkerChangedByCursor() { - ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); + m_settings.m_frequency = m_deviceCenterFrequency + m_settings.m_inputFrequencyOffset; + + qint64 value = 0; + + if (m_settings.m_frequencyMode == RadioClockSettings::Offset) { + value = m_settings.m_inputFrequencyOffset; + } else if (m_settings.m_frequencyMode == RadioClockSettings::Absolute) { + value = m_settings.m_frequency; + } + + ui->deltaFrequency->blockSignals(true); + ui->deltaFrequency->setValue(value); + ui->deltaFrequency->blockSignals(false); + + updateAbsoluteCenterFrequency(); applySettings(); } @@ -173,9 +203,46 @@ void RadioClockGUI::channelMarkerHighlightedByCursor() setHighlighted(m_channelMarker.getHighlighted()); } +void RadioClockGUI::on_frequencyMode_currentIndexChanged(int index) +{ + m_settings.m_frequencyMode = (RadioClockSettings::FrequencyMode) index; + ui->deltaFrequency->blockSignals(true); + + if (m_settings.m_frequencyMode == RadioClockSettings::Offset) + { + ui->deltaFrequency->setValueRange(false, 7, -9999999, 9999999); + ui->deltaFrequency->setValue(m_settings.m_inputFrequencyOffset); + ui->deltaUnits->setText("Hz"); + } + else if (m_settings.m_frequencyMode == RadioClockSettings::Absolute) + { + ui->deltaFrequency->setValueRange(true, 11, 0, 99999999999, 0); + ui->deltaFrequency->setValue(m_settings.m_frequency); + ui->deltaUnits->setText("Hz"); + } + + ui->deltaFrequency->blockSignals(false); + + updateAbsoluteCenterFrequency(); + applySettings(); +} + void RadioClockGUI::on_deltaFrequency_changed(qint64 value) { - m_channelMarker.setCenterFrequency(value); + qint64 offset = 0; + + if (m_settings.m_frequencyMode == RadioClockSettings::Offset) + { + offset = value; + m_settings.m_frequency = m_deviceCenterFrequency + offset; + } + else if (m_settings.m_frequencyMode == RadioClockSettings::Absolute) + { + m_settings.m_frequency = value; + offset = m_settings.m_frequency - m_deviceCenterFrequency; + } + + m_channelMarker.setCenterFrequency(offset); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); applySettings(); @@ -300,7 +367,6 @@ RadioClockGUI::RadioClockGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Bas ui->status->setText("Looking for minute marker"); - ui->deltaFrequencyLabel->setText(QString("%1f").arg(QChar(0x94, 0x03))); ui->deltaFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); ui->deltaFrequency->setValueRange(false, 7, -9999999, 9999999); ui->channelPowerMeter->setColorTheme(LevelMeterSignalDB::ColorGreenAndBlue); @@ -368,7 +434,8 @@ void RadioClockGUI::displaySettings() blockApplySettings(true); - ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); + ui->frequencyMode->setCurrentIndex((int) m_settings.m_frequencyMode); + on_frequencyMode_currentIndexChanged((int) m_settings.m_frequencyMode); ui->rfBWText->setText(QString("%1 Hz").arg((int)m_settings.m_rfBandwidth)); ui->rfBW->setValue(m_settings.m_rfBandwidth); @@ -420,6 +487,7 @@ void RadioClockGUI::tick() void RadioClockGUI::makeUIConnections() { + QObject::connect(ui->frequencyMode, QOverload::of(&QComboBox::currentIndexChanged), this, &RadioClockGUI::on_frequencyMode_currentIndexChanged); QObject::connect(ui->deltaFrequency, &ValueDialZ::changed, this, &RadioClockGUI::on_deltaFrequency_changed); QObject::connect(ui->rfBW, &QSlider::valueChanged, this, &RadioClockGUI::on_rfBW_valueChanged); QObject::connect(ui->threshold, &QDial::valueChanged, this, &RadioClockGUI::on_threshold_valueChanged); @@ -430,4 +498,11 @@ void RadioClockGUI::makeUIConnections() void RadioClockGUI::updateAbsoluteCenterFrequency() { setStatusFrequency(m_deviceCenterFrequency + m_settings.m_inputFrequencyOffset); + if ( (m_basebandSampleRate > 1) + && ( (m_settings.m_inputFrequencyOffset >= m_basebandSampleRate / 2) + || (m_settings.m_inputFrequencyOffset < -m_basebandSampleRate / 2))) { + setStatusText("Frequency out of band"); + } else { + setStatusText(""); + } } diff --git a/plugins/channelrx/radioclock/radioclockgui.h b/plugins/channelrx/radioclock/radioclockgui.h index ec4ed36c3..a17d01ff7 100644 --- a/plugins/channelrx/radioclock/radioclockgui.h +++ b/plugins/channelrx/radioclock/radioclockgui.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////////// -// Copyright (C) 2020-2022 Jon Beniston, M7RCE // +// Copyright (C) 2020-2024 Jon Beniston, M7RCE // // Copyright (C) 2020, 2022 Edouard Griffiths, F4EXB // // // // This program is free software; you can redistribute it and/or modify // @@ -93,6 +93,7 @@ private: bool handleMessage(const Message& message); void makeUIConnections(); void updateAbsoluteCenterFrequency(); + void calcOffset(); void displayDateTime(); @@ -100,6 +101,7 @@ private: void enterEvent(EnterEventType*); private slots: + void on_frequencyMode_currentIndexChanged(int index); void on_deltaFrequency_changed(qint64 value); void on_rfBW_valueChanged(int index); void on_threshold_valueChanged(int value); diff --git a/plugins/channelrx/radioclock/radioclockgui.ui b/plugins/channelrx/radioclock/radioclockgui.ui index ab7bf35ba..c9129783f 100644 --- a/plugins/channelrx/radioclock/radioclockgui.ui +++ b/plugins/channelrx/radioclock/radioclockgui.ui @@ -74,16 +74,32 @@ 2 - + - 16 + 40 0 - - Df + + + 40 + 16777215 + + + Select frequency entry mode. + + + + Δf + + + + + f + + @@ -370,6 +386,11 @@ WWVB + + + JJY + + diff --git a/plugins/channelrx/radioclock/radioclocksettings.cpp b/plugins/channelrx/radioclock/radioclocksettings.cpp index 6b7efe2d2..2a0825c48 100644 --- a/plugins/channelrx/radioclock/radioclocksettings.cpp +++ b/plugins/channelrx/radioclock/radioclocksettings.cpp @@ -2,7 +2,7 @@ // Copyright (C) 2012 maintech GmbH, Otto-Hahn-Str. 15, 97204 Hoechberg, Germany // // written by Christian Daniel // // Copyright (C) 2015-2020, 2022 Edouard Griffiths, F4EXB // -// Copyright (C) 2021 Jon Beniston, M7RCE // +// Copyright (C) 2021-2024 Jon Beniston, M7RCE // // // // This program is free software; you can redistribute it and/or modify // // it under the terms of the GNU General Public License as published by // @@ -35,7 +35,9 @@ RadioClockSettings::RadioClockSettings() : void RadioClockSettings::resetToDefaults() { + m_frequencyMode = Offset; m_inputFrequencyOffset = 0; + m_frequency = 0; m_rfBandwidth = 50.0f; m_threshold = 5; m_modulation = MSF; @@ -58,9 +60,11 @@ QByteArray RadioClockSettings::serialize() const s.writeS32(1, m_inputFrequencyOffset); s.writeFloat(2, m_rfBandwidth); + s.writeS64(3, m_frequency); s.writeFloat(4, m_threshold); s.writeS32(5, (int)m_modulation); s.writeS32(6, (int)m_timezone); + s.writeS32(7, (int)m_frequencyMode); s.writeU32(12, m_rgbColor); s.writeString(13, m_title); @@ -108,9 +112,11 @@ bool RadioClockSettings::deserialize(const QByteArray& data) d.readS32(1, &m_inputFrequencyOffset, 0); d.readFloat(2, &m_rfBandwidth, 50.0f); + d.readS64(3, &m_frequency, 0); d.readFloat(4, &m_threshold, 30); d.readS32(5, (int *)&m_modulation, DCF77); d.readS32(6, (int *)&m_timezone, BROADCAST); + d.readS32(7, (int *)&m_frequencyMode, Offset); d.readU32(12, &m_rgbColor, QColor(102, 0, 0).rgb()); d.readString(13, &m_title, "Radio Clock"); diff --git a/plugins/channelrx/radioclock/radioclocksettings.h b/plugins/channelrx/radioclock/radioclocksettings.h index 5a518fc9a..aa944aa53 100644 --- a/plugins/channelrx/radioclock/radioclocksettings.h +++ b/plugins/channelrx/radioclock/radioclocksettings.h @@ -2,7 +2,7 @@ // Copyright (C) 2012 maintech GmbH, Otto-Hahn-Str. 15, 97204 Hoechberg, Germany // // written by Christian Daniel // // Copyright (C) 2015-2019, 2021-2022 Edouard Griffiths, F4EXB // -// Copyright (C) 2021 Jon Beniston, M7RCE // +// Copyright (C) 2021-2024 Jon Beniston, M7RCE // // // // This program is free software; you can redistribute it and/or modify // // it under the terms of the GNU General Public License as published by // @@ -30,14 +30,20 @@ class Serializable; struct RadioClockSettings { + enum FrequencyMode { + Offset, + Absolute + } m_frequencyMode; qint32 m_inputFrequencyOffset; + qint64 m_frequency; Real m_rfBandwidth; Real m_threshold; //!< For MSF and DCF in dB enum Modulation { MSF, DCF77, TDF, - WWVB + WWVB, + JJY } m_modulation; enum DisplayTZ { BROADCAST, diff --git a/plugins/channelrx/radioclock/radioclocksink.cpp b/plugins/channelrx/radioclock/radioclocksink.cpp index 4f3853c3e..21e00b6a4 100644 --- a/plugins/channelrx/radioclock/radioclocksink.cpp +++ b/plugins/channelrx/radioclock/radioclocksink.cpp @@ -1,6 +1,6 @@ /////////////////////////////////////////////////////////////////////////////////// // Copyright (C) 2021-2022 Edouard Griffiths, F4EXB // -// Copyright (C) 2021 Jon Beniston, M7RCE // +// Copyright (C) 2021-2024 Jon Beniston, M7RCE // // // // This program is free software; you can redistribute it and/or modify // // it under the terms of the GNU General Public License as published by // @@ -794,6 +794,158 @@ void RadioClockSink::wwvb() m_prevData = m_data; } +// Japan JJY 40kHz +// https://en.wikipedia.org/wiki/JJY +void RadioClockSink::jjy() +{ + // JJY reduces carrier by -10dB + // Full power, then reduced power, which is the opposite of WWVB + // 0.8s full power is is zero bit, 0.5s full power is one bit + // 0.2s full power is a marker. Seven markers per minute (0, 9, 19, 29, 39, 49, and 59s) and for leap second + m_threshold = m_thresholdMovingAverage.asDouble() * m_linearThreshold; // xdB below average + m_data = m_magsq > m_threshold; + + // Look for minute marker - two consequtive markers + if ((m_data == 1) && (m_prevData == 0)) + { + if ( (m_highCount <= RadioClockSettings::RADIOCLOCK_CHANNEL_SAMPLE_RATE * 0.3) + && (m_lowCount >= RadioClockSettings::RADIOCLOCK_CHANNEL_SAMPLE_RATE * 0.7) + ) + { + if (m_gotMarker && !m_gotMinuteMarker) + { + qDebug() << "RadioClockSink::jjy - Minute marker: (low " << m_lowCount << " high " << m_highCount << ") prev period " << m_periodCount; + m_gotMinuteMarker = true; + m_second = 1; + m_secondMarkers = 1; + if (getMessageQueueToChannel()) { + getMessageQueueToChannel()->push(RadioClock::MsgStatus::create("Got minute marker")); + } + } + else + { + qDebug() << "RadioClockSink::jjy - Marker: (low " << m_lowCount << " high " << m_highCount << ") prev period " << m_periodCount << " second " << m_second; + } + m_gotMarker = true; + m_periodCount = 0; + } + else + { + m_gotMarker = false; + } + m_highCount = 0; + } + else if ((m_data == 0) && (m_prevData == 1)) + { + m_lowCount = 0; + } + else if (m_data == 1) + { + m_highCount++; + } + else if (m_data == 0) + { + m_lowCount++; + } + + m_sample = false; + if (m_gotMinuteMarker) + { + m_periodCount++; + if (m_periodCount == 100) + { + // Check we get second marker + m_secondMarkers += m_data == 1; + // If we see too many 0s instead of 1s, assume we've lost the signal + if ((m_second > 10) && (m_secondMarkers / m_second < 0.7)) + { + qDebug() << "RadioClockSink::jjy - Lost lock: " << m_secondMarkers << m_second; + m_gotMinuteMarker = false; + if (getMessageQueueToChannel()) { + getMessageQueueToChannel()->push(RadioClock::MsgStatus::create("Looking for minute marker")); + } + } + m_sample = true; + } + else if (m_periodCount == 650) + { + // Get data bit A for timecode + m_timeCode[m_second] = !m_data; // No carrier = 1, carrier = 0 + m_sample = true; + } + else if (m_periodCount == 950) + { + if (m_second == 59) + { + // Check markers are decoded as 1s + const QList markerBits = {9, 19, 29, 39, 49, 59}; + int missingMarkers = 0; + for (int i = 0; i < markerBits.size(); i++) + { + if (m_timeCode[markerBits[i]] != 1) + { + missingMarkers++; + qDebug() << "RadioClockSink::jjy - Missing marker at bit " << markerBits[i]; + } + } + if (missingMarkers >= 3) + { + m_gotMinuteMarker = false; + qDebug() << "RadioClockSink::jjy - Lost lock: Missing markers: " << missingMarkers; + if (getMessageQueueToChannel()) { + getMessageQueueToChannel()->push(RadioClock::MsgStatus::create("Looking for minute marker")); + } + } + + // Check 0s where expected + const QList zeroBits = {4, 10, 11, 14, 20, 21, 24, 34, 35, 44, 55, 56, 57, 58}; + for (int i = 0; i < zeroBits.size(); i++) + { + if (m_timeCode[zeroBits[i]] != 0) { + qDebug() << "RadioClockSink::jjy - Unexpected 1 at bit " << zeroBits[i]; + } + } + + // Decode timecode to time and date + int minute = bcdMSB(1, 8, 4); + int hour = bcdMSB(12, 18, 14); + int dayOfYear = bcdMSB(22, 33, 24, 29); + int year = 2000 + bcdMSB(41, 48); + + // Japan doesn't have daylight savings + m_dst = RadioClockSettings::NOT_IN_EFFECT; + + // Time is UTC + QDate date(year, 1, 1); + date = date.addDays(dayOfYear - 1); + m_dateTime = QDateTime(date, QTime(hour, minute), Qt::OffsetFromUTC, 0); + if (getMessageQueueToChannel()) { + getMessageQueueToChannel()->push(RadioClock::MsgStatus::create("OK")); + } + + m_second = 0; + } + else + { + m_second++; + m_dateTime = m_dateTime.addSecs(1); + } + + if (getMessageQueueToChannel()) + { + RadioClock::MsgDateTime *msg = RadioClock::MsgDateTime::create(m_dateTime, m_dst); + getMessageQueueToChannel()->push(msg); + } + } + else if (m_periodCount == 1000) + { + m_periodCount = 0; + } + } + + m_prevData = m_data; +} + void RadioClockSink::processOneSample(Complex &ci) { // Calculate average and peak levels for level meter @@ -817,6 +969,8 @@ void RadioClockSink::processOneSample(Complex &ci) tdf(ci); } else if (m_settings.m_modulation == RadioClockSettings::WWVB) { wwvb(); + } else if (m_settings.m_modulation == RadioClockSettings::JJY) { + jjy(); } else { msf60(); } diff --git a/plugins/channelrx/radioclock/radioclocksink.h b/plugins/channelrx/radioclock/radioclocksink.h index e8a9a3ebc..b79a6956a 100644 --- a/plugins/channelrx/radioclock/radioclocksink.h +++ b/plugins/channelrx/radioclock/radioclocksink.h @@ -1,6 +1,6 @@ /////////////////////////////////////////////////////////////////////////////////// // Copyright (C) 2019-2021 Edouard Griffiths, F4EXB // -// Copyright (C) 2020-2021 Jon Beniston, M7RCE // +// Copyright (C) 2020-2024 Jon Beniston, M7RCE // // Copyright (C) 2020 Kacper Michajłow // // // // This program is free software; you can redistribute it and/or modify // @@ -160,6 +160,7 @@ private: void tdf(Complex &ci); void msf60(); void wwvb(); + void jjy(); }; #endif // INCLUDE_RADIOCLOCKSINK_H diff --git a/plugins/channelrx/radioclock/readme.md b/plugins/channelrx/radioclock/readme.md index ca1ab245e..716a560c2 100644 --- a/plugins/channelrx/radioclock/readme.md +++ b/plugins/channelrx/radioclock/readme.md @@ -1,4 +1,4 @@ -

Radio clock plugin

+

Radio Clock Plugin

Introduction

@@ -8,6 +8,7 @@ This plugin can be used to receive the time and date as broadcast on Low Frequen * [DCF77](https://en.wikipedia.org/wiki/DCF77) - Germany - 77.5kHz * [TDF](https://en.wikipedia.org/wiki/TDF_time_signal) - France - 162kHz * [WWVB](https://en.wikipedia.org/wiki/WWVB) - USA - 60kHz +* [JJY](https://en.wikipedia.org/wiki/JJY) - Japan - 40kHz If you'd like other transmitters to be supported, please upload a .sdriq file to SDRangel's [github issue tracker](https://github.com/f4exb/sdrangel/issues). @@ -21,29 +22,39 @@ The top and bottom bars of the channel window are described [here](../../../sdrg ![Radio clock plugin GUI](../../../doc/img/RadioClock_plugin.png) -

1: Frequency shift from center frequency of reception

+

1: Channel frequency entry mode

-Use the wheels to adjust the frequency shift in Hz from the center frequency of reception. Left click on a digit sets the cursor position at this digit. Right click on a digit sets all digits on the right to zero. This effectively floors value at the digit position. Wheels are moved with the mousewheel while pointing at the wheel or by selecting the wheel with the left mouse click and using the keyboard arrows. Pressing shift simultaneously moves digit by 5 and pressing control moves it by 2. +Select from one of the following modes to determine how the channel center frequency is calculated: -

2: Channel power

+* Δf - Specify an offset in Hz from device center frequency. +* f - Specific a frequency in Hz. + +

2: Channel Frequency

+ +Specifies channel center frequency according to frequency entry mode (1): + +* Δf - Offset in Hz from device center frequency. +* f - Absolute frequency in Hz. + +

3: Channel power

Average total power in dB relative to a +/- 1.0 amplitude signal received in the pass band. -

3: Level meter in dB

+

4: Level meter in dB

- top bar (green): average value - bottom bar (blue green): instantaneous peak value - tip vertical bar (bright green): peak hold value -

4: BW - RF Bandwidth

+

5: BW - RF Bandwidth

This specifies the bandwidth of a LPF that is applied to the input signal to limit the RF bandwidth. -

5: TH - Threshold

+

6: TH - Threshold

-For MSF, DCF77 and WWVB, specifies the threshold in dB below the average carrier power level that determines a binary 0 or 1. +For MSF, DCF77, WWVB and JJY, specifies the threshold in dB below the average carrier power level that determines a binary 0 or 1. -

6: Modulation

+

7: Modulation

Specifies the modulation and timecode encoding used: @@ -51,8 +62,9 @@ Specifies the modulation and timecode encoding used: * DCF77 - OOK (On-off keying) * TDF - PM (Phase modulation) * WWVB - OOK (On-off keying) +* JJY - OOK (On-off keying) -

7: Display Time Zone

+

8: Display Time Zone

Specifies the time zone used to display the received time. This can be: @@ -60,15 +72,15 @@ Specifies the time zone used to display the received time. This can be: * Local - the time is converted to the local time (as determined by your operating system's time zone). * UTC - the time is converted to Coordinated Universal Time. -

8: Date

+

9: Date

Displays the decoded date. -

9: Time

+

10: Time

-Displays the decoded time, adjusted for the time zone set by (7). +Displays the decoded time, adjusted for the time zone set by (8). -

10: Status

+

11: Status

Displays the demodulator status. This can be: @@ -81,7 +93,7 @@ The date and time fields are only valid when the status indicates OK. If while in the OK state several second markers are not detected, the status will return to Looking for minute marker. -

11: Daylight Savings

+

12: Daylight Savings

Displays the daylight savings state: @@ -90,7 +102,7 @@ Displays the daylight savings state: * Starting * Ending -For MSF, DCF77 and TDF, starting/ending is indicated one hour before the change. For WWVB it is set for the whole day. +For MSF, DCF77 and TDF, starting/ending is indicated one hour before the change. For WWVB it is set for the whole day. Japan does not use daylight savings.

Waveforms

diff --git a/swagger/sdrangel/api/swagger/include/RadioClock.yaml b/swagger/sdrangel/api/swagger/include/RadioClock.yaml index f7502ae5c..50b771452 100644 --- a/swagger/sdrangel/api/swagger/include/RadioClock.yaml +++ b/swagger/sdrangel/api/swagger/include/RadioClock.yaml @@ -5,6 +5,13 @@ RadioClockSettings: description: channel center frequency shift from baseband center in Hz type: integer format: int64 + frequencyMode: + description: (0 for Offset, 1 for Absolute) + type: integer + frequency: + description: Channel center frequency + type: integer + format: int64 rfBandwidth: description: channel RF bandwidth in Hz type: number @@ -13,7 +20,7 @@ RadioClockSettings: type: number format: float modulation: - description: 0 - MSF, 1 - DCF77, 2 - TDF, 3 - WWVB + description: 0 - MSF, 1 - DCF77, 2 - TDF, 3 - WWVB, 4 - JJY type: integer timezone: description: 0 - Broadcast, 1 - Local, 2 - UTC