1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-11-25 01:18:38 -05:00

Radio Clock: Add JJY.

This commit is contained in:
srcejon 2024-04-07 16:51:55 +01:00
parent a76262f0b7
commit 304f0ea89a
10 changed files with 339 additions and 45 deletions

View File

@ -1,4 +1,4 @@
<h1>Channel Power Plugin</h1>
<h1>Channel Power Plugin</h1>
<h2>Introduction</h2>
@ -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)
<h3>1: Frequency shift from center frequency of reception</h3>
<h3>1: Channel frequency entry mode</h3>
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:
<h3>2: BW - Channel Bandwidth</h3>
* Δf - Specify an offset in Hz from device center frequency.
* f - Specific a frequency in Hz.
<h3>2: Channel Frequency</h3>
Specifies channel center frequency according to frequency entry mode (1):
* Δf - Offset in Hz from device center frequency.
* f - Absolute frequency in Hz.
<h3>3: BW - Channel Bandwidth</h3>
Bandwidth in Hz of the channel for which power is to be measured.
<h3>3: Tavg - Average Time</h3>
<h3>4: Tavg - Average Time</h3>
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.
<h3>4: THp - Pulse Threshold</h3>
<h3>5: THp - Pulse Threshold</h3>
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.
<h3>5: Avg - Average Power</h3>
<h3>6: Avg - Average Power</h3>
Displays the most recent average power measurement in dB.
<h3>6: Max - Max Peak Power</h3>
<h3>7: Max - Max Peak Power</h3>
Displays the maximum instantaneous peak power measurement in dB.
<h3>7: Min - Min Peak Power</h3>
<h3>8: Min - Min Peak Power</h3>
Displays the minimum instantaneous peak power measurement in dB.
<h3>8: Pulse - Pulse Average Power</h3>
<h3>9: Pulse - Pulse Average Power</h3>
Displays the most recent pulse average power measurement in dB.
<h3>9: Clear Data</h3>
<h3>10: Clear Data</h3>
Clears current measurements (min and max values are reset).

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2020-2023 Jon Beniston, M7RCE <jon@beniston.com> //
// Copyright (C) 2020-2024 Jon Beniston, M7RCE <jon@beniston.com> //
// Copyright (C) 2020-2022 Edouard Griffiths, F4EXB <f4exb06@gmail.com> //
// //
// 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<int>::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("");
}
}

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2020-2022 Jon Beniston, M7RCE <jon@beniston.com> //
// Copyright (C) 2020-2024 Jon Beniston, M7RCE <jon@beniston.com> //
// Copyright (C) 2020, 2022 Edouard Griffiths, F4EXB <f4exb06@gmail.com> //
// //
// 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);

View File

@ -74,16 +74,32 @@
<number>2</number>
</property>
<item>
<widget class="QLabel" name="deltaFrequencyLabel">
<widget class="QComboBox" name="frequencyMode">
<property name="minimumSize">
<size>
<width>16</width>
<width>40</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>Df</string>
<property name="maximumSize">
<size>
<width>40</width>
<height>16777215</height>
</size>
</property>
<property name="toolTip">
<string>Select frequency entry mode.</string>
</property>
<item>
<property name="text">
<string>Δf</string>
</property>
</item>
<item>
<property name="text">
<string>f</string>
</property>
</item>
</widget>
</item>
<item>
@ -370,6 +386,11 @@
<string>WWVB</string>
</property>
</item>
<item>
<property name="text">
<string>JJY</string>
</property>
</item>
</widget>
</item>
<item>

View File

@ -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 <f4exb06@gmail.com> //
// Copyright (C) 2021 Jon Beniston, M7RCE <jon@beniston.com> //
// Copyright (C) 2021-2024 Jon Beniston, M7RCE <jon@beniston.com> //
// //
// This program is free software; you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
@ -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");

View File

@ -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 <f4exb06@gmail.com> //
// Copyright (C) 2021 Jon Beniston, M7RCE <jon@beniston.com> //
// Copyright (C) 2021-2024 Jon Beniston, M7RCE <jon@beniston.com> //
// //
// This program is free software; you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
@ -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,

View File

@ -1,6 +1,6 @@
///////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2021-2022 Edouard Griffiths, F4EXB <f4exb06@gmail.com> //
// Copyright (C) 2021 Jon Beniston, M7RCE <jon@beniston.com> //
// Copyright (C) 2021-2024 Jon Beniston, M7RCE <jon@beniston.com> //
// //
// This program is free software; you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
@ -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<int> 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<int> 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();
}

View File

@ -1,6 +1,6 @@
///////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2019-2021 Edouard Griffiths, F4EXB <f4exb06@gmail.com> //
// Copyright (C) 2020-2021 Jon Beniston, M7RCE <jon@beniston.com> //
// Copyright (C) 2020-2024 Jon Beniston, M7RCE <jon@beniston.com> //
// Copyright (C) 2020 Kacper Michajłow <kasper93@gmail.com> //
// //
// 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

View File

@ -1,4 +1,4 @@
<h1>Radio clock plugin</h1>
<h1>Radio Clock Plugin</h1>
<h2>Introduction</h2>
@ -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)
<h3>1: Frequency shift from center frequency of reception</h3>
<h3>1: Channel frequency entry mode</h3>
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:
<h3>2: Channel power</h3>
* Δf - Specify an offset in Hz from device center frequency.
* f - Specific a frequency in Hz.
<h3>2: Channel Frequency</h3>
Specifies channel center frequency according to frequency entry mode (1):
* Δf - Offset in Hz from device center frequency.
* f - Absolute frequency in Hz.
<h3>3: Channel power</h3>
Average total power in dB relative to a +/- 1.0 amplitude signal received in the pass band.
<h3>3: Level meter in dB</h3>
<h3>4: Level meter in dB</h3>
- top bar (green): average value
- bottom bar (blue green): instantaneous peak value
- tip vertical bar (bright green): peak hold value
<h3>4: BW - RF Bandwidth</h3>
<h3>5: BW - RF Bandwidth</h3>
This specifies the bandwidth of a LPF that is applied to the input signal to limit the RF bandwidth.
<h3>5: TH - Threshold</h3>
<h3>6: TH - Threshold</h3>
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.
<h3>6: Modulation</h3>
<h3>7: Modulation</h3>
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)
<h3>7: Display Time Zone</h3>
<h3>8: Display Time Zone</h3>
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.
<h3>8: Date</h3>
<h3>9: Date</h3>
Displays the decoded date.
<h3>9: Time</h3>
<h3>10: Time</h3>
Displays the decoded time, adjusted for the time zone set by (7).
Displays the decoded time, adjusted for the time zone set by (8).
<h3>10: Status</h3>
<h3>11: Status</h3>
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.
<h3>11: Daylight Savings</h3>
<h3>12: Daylight Savings</h3>
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.
<h3>Waveforms</h3>

View File

@ -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