Pocsag manual baud option (#2870)

* baseband part of manual baud control of pocsag

* added manual pocsag baud to ui, to fix #2546

* fix adult toys settings filename
This commit is contained in:
Totoo
2025-11-18 14:05:27 +01:00
committed by GitHub
parent 43a5163b77
commit c01597baf2
8 changed files with 45 additions and 15 deletions
+5 -2
View File
@@ -56,6 +56,7 @@ POCSAGSettingsView::POCSAGSettingsView(
: settings_{settings} { : settings_{settings} {
add_children( add_children(
{&labels, {&labels,
&opt_baud_rate,
&check_log, &check_log,
&check_log_raw, &check_log_raw,
&check_small_font, &check_small_font,
@@ -65,6 +66,7 @@ POCSAGSettingsView::POCSAGSettingsView(
&field_filter_address, &field_filter_address,
&button_save}); &button_save});
opt_baud_rate.set_by_value(settings_.baud_rate);
check_log.set_value(settings_.enable_logging); check_log.set_value(settings_.enable_logging);
check_log_raw.set_value(settings_.enable_raw_log); check_log_raw.set_value(settings_.enable_raw_log);
check_small_font.set_value(settings_.enable_small_font); check_small_font.set_value(settings_.enable_small_font);
@@ -81,7 +83,7 @@ POCSAGSettingsView::POCSAGSettingsView(
settings_.hide_addr_only = check_hide_addr_only.value(); settings_.hide_addr_only = check_hide_addr_only.value();
settings_.filter_mode = opt_filter_mode.selected_index_value(); settings_.filter_mode = opt_filter_mode.selected_index_value();
settings_.filter_address = field_filter_address.to_integer(); settings_.filter_address = field_filter_address.to_integer();
settings_.baud_rate = opt_baud_rate.selected_index_value();
nav.pop(); nav.pop();
}; };
} }
@@ -142,7 +144,7 @@ POCSAGAppView::POCSAGAppView(NavigationView& nav)
audio::output::start(); audio::output::start();
receiver_model.enable(); receiver_model.enable();
baseband::set_pocsag(); baseband::set_pocsag((int8_t)settings_.baud_rate);
} }
void POCSAGAppView::focus() { void POCSAGAppView::focus() {
@@ -182,6 +184,7 @@ void POCSAGAppView::refresh_ui() {
btn_text = "Filter Last"; btn_text = "Filter Last";
break; break;
} }
baseband::set_pocsag((int8_t)settings_.baud_rate);
button_filter_last.set_text(btn_text); button_filter_last.set_text(btn_text);
} }
+11
View File
@@ -126,6 +126,7 @@ struct POCSAGSettings {
bool hide_bad_data = false; bool hide_bad_data = false;
bool hide_addr_only = false; bool hide_addr_only = false;
uint8_t filter_mode = false; uint8_t filter_mode = false;
int32_t baud_rate = -1;
uint32_t filter_address = 0; uint32_t filter_address = 0;
}; };
@@ -139,7 +140,16 @@ class POCSAGSettingsView : public View {
private: private:
POCSAGSettings& settings_; POCSAGSettings& settings_;
OptionsField opt_baud_rate{
{8 * 8, 0 * 16},
4,
{{"Auto", -1},
{" 512", 0},
{"1200", 1},
{"2400", 2}}};
Labels labels{ Labels labels{
{{2 * 8, 0 * 16}, "Baud:", Theme::getInstance()->fg_light->foreground},
{{2 * 8, 12 * 16}, "Filter Mode:", Theme::getInstance()->fg_light->foreground}, {{2 * 8, 12 * 16}, "Filter Mode:", Theme::getInstance()->fg_light->foreground},
{{2 * 8, 13 * 16}, "Filter Addr:", Theme::getInstance()->fg_light->foreground}, {{2 * 8, 13 * 16}, "Filter Addr:", Theme::getInstance()->fg_light->foreground},
}; };
@@ -221,6 +231,7 @@ class POCSAGAppView : public View {
{"filter_address"sv, &settings_.filter_address}, {"filter_address"sv, &settings_.filter_address},
{"hide_bad_data"sv, &settings_.hide_bad_data}, {"hide_bad_data"sv, &settings_.hide_bad_data},
{"hide_addr_only"sv, &settings_.hide_addr_only}, {"hide_addr_only"sv, &settings_.hide_addr_only},
{"baud_rate"sv, &settings_.baud_rate},
}}; }};
void refresh_ui(); void refresh_ui();
+2 -2
View File
@@ -288,8 +288,8 @@ void set_fsk_data(const uint32_t stream_length, const uint32_t samples_per_bit,
send_message(&message); send_message(&message);
} }
void set_pocsag() { void set_pocsag(int8_t baud_config) {
const POCSAGConfigureMessage message{}; const POCSAGConfigureMessage message{baud_config};
send_message(&message); send_message(&message);
} }
+1 -1
View File
@@ -91,7 +91,7 @@ void set_nrf(const uint32_t baudrate, const uint32_t word_length, const uint32_t
void set_ook_data(const uint32_t stream_length, const uint32_t samples_per_bit, const uint8_t repeat, const uint32_t pause_symbols, const uint8_t de_bruijn_length = 0); void set_ook_data(const uint32_t stream_length, const uint32_t samples_per_bit, const uint8_t repeat, const uint32_t pause_symbols, const uint8_t de_bruijn_length = 0);
void kill_ook(); void kill_ook();
void set_fsk_data(const uint32_t stream_length, const uint32_t samples_per_bit, const uint32_t shift, const uint32_t progress_notice); void set_fsk_data(const uint32_t stream_length, const uint32_t samples_per_bit, const uint32_t shift, const uint32_t progress_notice);
void set_pocsag(); void set_pocsag(int8_t baud_config = -1);
void set_adsb(); void set_adsb();
void set_jammer(const bool run, const jammer::JammerType type, const uint32_t speed); void set_jammer(const bool run, const jammer::JammerType type, const uint32_t speed);
void set_rds_data(const uint16_t message_length); void set_rds_data(const uint16_t message_length);
@@ -104,7 +104,7 @@ class AdultToysView : public ui::View {
/*short_ui*/ true}; /*short_ui*/ true};
app_settings::SettingsManager settings_{ app_settings::SettingsManager settings_{
"Adult Toys", app_settings::Mode::TX}; "tx_adult_toys", app_settings::Mode::TX};
OptionsField options_target{ OptionsField options_target{
{UI_POS_X(6), UI_POS_Y(1)}, {UI_POS_X(6), UI_POS_Y(1)},
+19 -5
View File
@@ -159,13 +159,27 @@ void BitExtractor::configure(uint32_t sample_rate) {
// without needing to know exact transition boundaries. // without needing to know exact transition boundaries.
for (auto& rate : known_rates_) for (auto& rate : known_rates_)
rate.sample_interval = sample_rate / (2.0 * rate.baud_rate); rate.sample_interval = sample_rate / (2.0 * rate.baud_rate);
if (baud_config_ >= 0 && baud_config_ < static_cast<int8_t>(known_rates_.size())) {
current_rate_ = &known_rates_[baud_config_];
} else {
current_rate_ = nullptr;
}
} }
void BitExtractor::reset() { void BitExtractor::reset() {
current_rate_ = nullptr;
for (auto& rate : known_rates_) for (auto& rate : known_rates_)
rate.reset(); rate.reset();
if (baud_config_ >= 0 && baud_config_ < static_cast<int8_t>(known_rates_.size())) {
current_rate_ = &known_rates_[baud_config_];
} else {
current_rate_ = nullptr;
}
}
void BitExtractor::set_baud_config(int8_t baud_config) {
baud_config_ = baud_config;
} }
uint16_t BitExtractor::baud_rate() const { uint16_t BitExtractor::baud_rate() const {
@@ -352,7 +366,7 @@ void POCSAGProcessor::execute(const buffer_c8_t& buffer) {
void POCSAGProcessor::on_message(const Message* const message) { void POCSAGProcessor::on_message(const Message* const message) {
switch (message->id) { switch (message->id) {
case Message::ID::POCSAGConfigure: case Message::ID::POCSAGConfigure:
configure(); configure(reinterpret_cast<const POCSAGConfigureMessage*>(message)->baud_config);
break; break;
case Message::ID::NBFMConfigure: { case Message::ID::NBFMConfigure: {
@@ -370,7 +384,7 @@ void POCSAGProcessor::on_message(const Message* const message) {
} }
} }
void POCSAGProcessor::configure() { void POCSAGProcessor::configure(int8_t baud_config) {
constexpr size_t decim_0_output_fs = baseband_fs / decim_0.decimation_factor; constexpr size_t decim_0_output_fs = baseband_fs / decim_0.decimation_factor;
constexpr size_t decim_1_output_fs = decim_0_output_fs / decim_1.decimation_factor; constexpr size_t decim_1_output_fs = decim_0_output_fs / decim_1.decimation_factor;
constexpr size_t channel_filter_output_fs = decim_1_output_fs / 2; constexpr size_t channel_filter_output_fs = decim_1_output_fs / 2;
@@ -383,7 +397,7 @@ void POCSAGProcessor::configure() {
// Don't process the audio stream. // Don't process the audio stream.
audio_output.configure(false); audio_output.configure(false);
bit_extractor.set_baud_config(baud_config);
bit_extractor.configure(demod_input_fs); bit_extractor.configure(demod_input_fs);
// Set ready to process data. // Set ready to process data.
+3 -2
View File
@@ -84,6 +84,7 @@ class BitExtractor {
void extract_bits(const buffer_f32_t& audio); void extract_bits(const buffer_f32_t& audio);
void configure(uint32_t sample_rate); void configure(uint32_t sample_rate);
void reset(); void reset();
void set_baud_config(int8_t baud_config);
uint16_t baud_rate() const; uint16_t baud_rate() const;
private: private:
@@ -117,7 +118,7 @@ class BitExtractor {
RateInfo{2400}}; RateInfo{2400}};
BitQueue& bits_; BitQueue& bits_;
int8_t baud_config_ = -1;
uint32_t sample_rate_ = 0; uint32_t sample_rate_ = 0;
RateInfo* current_rate_ = nullptr; RateInfo* current_rate_ = nullptr;
}; };
@@ -207,7 +208,7 @@ class POCSAGProcessor : public BasebandProcessor {
static constexpr uint32_t stat_update_threshold = static constexpr uint32_t stat_update_threshold =
baseband_fs / stat_update_interval; baseband_fs / stat_update_interval;
void configure(); void configure(int8_t baud_config = -1);
void flush(); void flush();
void reset(); void reset();
void send_stats() const; void send_stats() const;
+3 -2
View File
@@ -1187,9 +1187,10 @@ class FSKRxConfigureMessage : public Message {
class POCSAGConfigureMessage : public Message { class POCSAGConfigureMessage : public Message {
public: public:
constexpr POCSAGConfigureMessage() constexpr POCSAGConfigureMessage(int8_t baud_config = -1)
: Message{ID::POCSAGConfigure} { : Message{ID::POCSAGConfigure}, baud_config(baud_config) {
} }
int8_t baud_config; //-1 auto, 0=512,1=1200,2=2400
}; };
class APRSPacketMessage : public Message { class APRSPacketMessage : public Message {