mirror of
https://github.com/portapack-mayhem/mayhem-firmware.git
synced 2026-09-11 17:19:29 +00:00
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:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
+1
-1
@@ -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)},
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user