mirror of
https://github.com/portapack-mayhem/mayhem-firmware.git
synced 2025-08-25 20:07:38 +00:00
POCSAG RX saves ignored address
Made AFSK code more generic (not tied to LCR) Added modem presets and more options in AFSK setup String-ized and simplified LCR UI code Simplified AFSK baseband code, made to always work on 16bit words
This commit is contained in:
@@ -32,7 +32,7 @@ BufferExchange::BufferExchange(
|
||||
) // : config_capture { config }
|
||||
{
|
||||
obj = this;
|
||||
direction = CAPTURE;
|
||||
// In capture mode, baseband wants empty buffers, app waits for full buffers
|
||||
fifo_buffers_for_baseband = config->fifo_buffers_empty;
|
||||
fifo_buffers_for_application = config->fifo_buffers_full;
|
||||
}
|
||||
@@ -42,7 +42,7 @@ BufferExchange::BufferExchange(
|
||||
) // : config_replay { config }
|
||||
{
|
||||
obj = this;
|
||||
direction = REPLAY;
|
||||
// In replay mode, baseband wants full buffers, app waits for empty buffers
|
||||
fifo_buffers_for_baseband = config->fifo_buffers_full;
|
||||
fifo_buffers_for_application = config->fifo_buffers_empty;
|
||||
}
|
||||
@@ -56,14 +56,15 @@ BufferExchange::~BufferExchange() {
|
||||
StreamBuffer* BufferExchange::get(FIFO<StreamBuffer*>* fifo) {
|
||||
while(true) {
|
||||
StreamBuffer* p { nullptr };
|
||||
fifo->out(p);
|
||||
fifo->out(p); // This crashes replay
|
||||
|
||||
led_tx.on(); // DEBUG
|
||||
//led_tx.on(); // DEBUG
|
||||
|
||||
if( p ) {
|
||||
return p;
|
||||
}
|
||||
|
||||
// Put thread to sleep, woken up by M4 IRQ
|
||||
chSysLock();
|
||||
thread = chThdSelf();
|
||||
chSchGoSleepS(THD_STATE_SUSPENDED);
|
||||
|
@@ -86,12 +86,8 @@ private:
|
||||
} direction { };
|
||||
|
||||
void check_fifo_isr() {
|
||||
//if (!empty() && (direction == CAPTURE)) {
|
||||
if (!empty())
|
||||
wakeup_isr();
|
||||
//} else if (!empty() && (direction == REPLAY)) {
|
||||
// wakeup_isr();
|
||||
//}
|
||||
}
|
||||
|
||||
void wakeup_isr() {
|
||||
|
@@ -111,9 +111,9 @@ public:
|
||||
return false;
|
||||
}
|
||||
|
||||
val = _data[_out & mask()];
|
||||
smp_wmb();
|
||||
_out += 1;
|
||||
val = _data[_out & mask()]; // Crashes
|
||||
smp_wmb(); // Ok
|
||||
_out += 1; // Crashes
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@@ -683,15 +683,15 @@ public:
|
||||
const uint32_t phase_inc_mark,
|
||||
const uint32_t phase_inc_space,
|
||||
const uint8_t repeat,
|
||||
const uint32_t bw,
|
||||
const uint8_t format
|
||||
const uint32_t fm_delta,
|
||||
const uint8_t symbol_count
|
||||
) : Message { ID::AFSKConfigure },
|
||||
samples_per_bit(samples_per_bit),
|
||||
phase_inc_mark(phase_inc_mark),
|
||||
phase_inc_space(phase_inc_space),
|
||||
repeat(repeat),
|
||||
bw(bw),
|
||||
format(format)
|
||||
fm_delta(fm_delta),
|
||||
symbol_count(symbol_count)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -699,8 +699,8 @@ public:
|
||||
const uint32_t phase_inc_mark;
|
||||
const uint32_t phase_inc_space;
|
||||
const uint8_t repeat;
|
||||
const uint32_t bw;
|
||||
const uint8_t format;
|
||||
const uint32_t fm_delta;
|
||||
const uint8_t symbol_count;
|
||||
};
|
||||
|
||||
class OOKConfigureMessage : public Message {
|
||||
|
@@ -44,17 +44,21 @@ constexpr ppb_range_t ppb_range { -99000, 99000 };
|
||||
constexpr ppb_t ppb_reset_value { 0 };
|
||||
|
||||
using afsk_freq_range_t = range_t<int32_t>;
|
||||
constexpr afsk_freq_range_t afsk_freq_range { 1, 400 };
|
||||
constexpr int32_t afsk_mark_reset_value { 48 };
|
||||
constexpr int32_t afsk_space_reset_value { 88 };
|
||||
constexpr afsk_freq_range_t afsk_freq_range { 1, 4000 };
|
||||
constexpr int32_t afsk_mark_reset_value { 1200 };
|
||||
constexpr int32_t afsk_space_reset_value { 2200 };
|
||||
|
||||
using afsk_bitrate_range_t = range_t<int32_t>;
|
||||
constexpr afsk_bitrate_range_t afsk_bitrate_range { 600, 9600 };
|
||||
constexpr int32_t afsk_bitrate_reset_value { 1200 };
|
||||
using modem_baudrate_range_t = range_t<int32_t>;
|
||||
constexpr modem_baudrate_range_t modem_baudrate_range { 50, 9600 };
|
||||
constexpr int32_t modem_baudrate_reset_value { 1200 };
|
||||
|
||||
using afsk_bw_range_t = range_t<int32_t>;
|
||||
constexpr afsk_bw_range_t afsk_bw_range { 1, 50 };
|
||||
constexpr int32_t afsk_bw_reset_value { 15 };
|
||||
using modem_bw_range_t = range_t<int32_t>;
|
||||
constexpr modem_bw_range_t modem_bw_range { 1000, 50000 };
|
||||
constexpr int32_t modem_bw_reset_value { 15000 };
|
||||
|
||||
using modem_repeat_range_t = range_t<int32_t>;
|
||||
constexpr modem_repeat_range_t modem_repeat_range { 1, 99 };
|
||||
constexpr int32_t modem_repeat_reset_value { 5 };
|
||||
|
||||
/* struct must pack the same way on M4 and M0 cores. */
|
||||
struct data_t {
|
||||
@@ -63,13 +67,14 @@ struct data_t {
|
||||
uint32_t touch_calibration_magic;
|
||||
touch::Calibration touch_calibration;
|
||||
|
||||
|
||||
// AFSK modem
|
||||
// Modem
|
||||
uint32_t modem_def_index;
|
||||
serial_format_t serial_format;
|
||||
int32_t modem_bw;
|
||||
int32_t afsk_mark_freq;
|
||||
int32_t afsk_space_freq; // Todo: reduce size, only 256 bytes of NVRAM !
|
||||
int32_t afsk_bitrate;
|
||||
int32_t afsk_bw;
|
||||
uint32_t afsk_config;
|
||||
int32_t afsk_space_freq;
|
||||
int32_t modem_baudrate;
|
||||
int32_t modem_repeat;
|
||||
|
||||
// Play dead unlock
|
||||
uint32_t playdead_magic;
|
||||
@@ -78,7 +83,8 @@ struct data_t {
|
||||
|
||||
uint32_t ui_config;
|
||||
|
||||
uint32_t pocsag_address;
|
||||
uint32_t pocsag_last_address;
|
||||
uint32_t pocsag_ignore_address;
|
||||
};
|
||||
|
||||
static_assert(sizeof(data_t) <= backup_ram.size(), "Persistent memory structure too large for VBAT-maintained region");
|
||||
@@ -137,38 +143,39 @@ void set_afsk_space(const int32_t new_value) {
|
||||
data->afsk_space_freq = afsk_freq_range.clip(new_value);
|
||||
}
|
||||
|
||||
int32_t afsk_bitrate() {
|
||||
afsk_bitrate_range.reset_if_outside(data->afsk_bitrate, afsk_bitrate_reset_value);
|
||||
return data->afsk_bitrate;
|
||||
int32_t modem_baudrate() {
|
||||
modem_baudrate_range.reset_if_outside(data->modem_baudrate, modem_baudrate_reset_value);
|
||||
return data->modem_baudrate;
|
||||
}
|
||||
|
||||
void set_afsk_bitrate(const int32_t new_value) {
|
||||
data->afsk_bitrate = afsk_bitrate_range.clip(new_value);
|
||||
void set_modem_baudrate(const int32_t new_value) {
|
||||
data->modem_baudrate = modem_baudrate_range.clip(new_value);
|
||||
}
|
||||
|
||||
int32_t afsk_bw() {
|
||||
afsk_bw_range.reset_if_outside(data->afsk_bw, afsk_bw_reset_value);
|
||||
return data->afsk_bw;
|
||||
int32_t modem_bw() {
|
||||
modem_bw_range.reset_if_outside(data->modem_bw, modem_bw_reset_value);
|
||||
return data->modem_bw;
|
||||
}
|
||||
|
||||
void set_afsk_bw(const int32_t new_value) {
|
||||
data->afsk_bw = afsk_bw_range.clip(new_value);
|
||||
void set_modem_bw(const int32_t new_value) {
|
||||
data->modem_bw = modem_bw_range.clip(new_value);
|
||||
}
|
||||
|
||||
uint32_t afsk_config() {
|
||||
return data->afsk_config;
|
||||
uint8_t modem_repeat() {
|
||||
modem_repeat_range.reset_if_outside(data->modem_repeat, modem_repeat_reset_value);
|
||||
return data->modem_repeat;
|
||||
}
|
||||
|
||||
uint8_t afsk_format() {
|
||||
return ((data->afsk_config >> 16) & 3);
|
||||
void set_modem_repeat(const uint32_t new_value) {
|
||||
data->modem_repeat = modem_repeat_range.clip(new_value);
|
||||
}
|
||||
|
||||
uint8_t afsk_repeats() {
|
||||
return (data->afsk_config >> 24);
|
||||
serial_format_t serial_format() {
|
||||
return data->serial_format;
|
||||
}
|
||||
|
||||
void set_afsk_config(const uint32_t new_value) {
|
||||
data->afsk_config = new_value;
|
||||
void set_serial_format(const serial_format_t new_value) {
|
||||
data->serial_format = new_value;
|
||||
}
|
||||
|
||||
static constexpr uint32_t playdead_magic = 0x88d3bb57;
|
||||
@@ -241,12 +248,20 @@ void set_ui_config(const uint32_t new_value) {
|
||||
data->ui_config = new_value;
|
||||
}
|
||||
|
||||
uint32_t pocsag_address() {
|
||||
return data->pocsag_address;
|
||||
uint32_t pocsag_last_address() {
|
||||
return data->pocsag_last_address;
|
||||
}
|
||||
|
||||
void set_pocsag_address(uint32_t address) {
|
||||
data->pocsag_address = address;
|
||||
void set_pocsag_last_address(uint32_t address) {
|
||||
data->pocsag_last_address = address;
|
||||
}
|
||||
|
||||
uint32_t pocsag_ignore_address() {
|
||||
return data->pocsag_ignore_address;
|
||||
}
|
||||
|
||||
void set_pocsag_ignore_address(uint32_t address) {
|
||||
data->pocsag_ignore_address = address;
|
||||
}
|
||||
|
||||
} /* namespace persistent_memory */
|
||||
|
@@ -27,6 +27,9 @@
|
||||
|
||||
#include "rf_path.hpp"
|
||||
#include "touch.hpp"
|
||||
#include "modems.hpp"
|
||||
|
||||
using namespace modems;
|
||||
|
||||
namespace portapack {
|
||||
namespace persistent_memory {
|
||||
@@ -42,22 +45,22 @@ void set_correction_ppb(const ppb_t new_value);
|
||||
void set_touch_calibration(const touch::Calibration& new_value);
|
||||
const touch::Calibration& touch_calibration();
|
||||
|
||||
serial_format_t serial_format();
|
||||
void set_serial_format(const serial_format_t new_value);
|
||||
|
||||
int32_t afsk_mark_freq();
|
||||
void set_afsk_mark(const int32_t new_value);
|
||||
|
||||
int32_t afsk_space_freq();
|
||||
void set_afsk_space(const int32_t new_value);
|
||||
|
||||
int32_t afsk_bitrate();
|
||||
void set_afsk_bitrate(const int32_t new_value);
|
||||
int32_t modem_baudrate();
|
||||
void set_modem_baudrate(const int32_t new_value);
|
||||
|
||||
uint32_t afsk_config();
|
||||
uint8_t afsk_format();
|
||||
uint8_t afsk_repeats();
|
||||
void set_afsk_config(const uint32_t new_value);
|
||||
|
||||
int32_t afsk_bw();
|
||||
void set_afsk_bw(const int32_t new_value);
|
||||
uint8_t modem_repeat();
|
||||
void set_modem_repeat(const uint32_t new_value);
|
||||
int32_t modem_bw();
|
||||
void set_modem_bw(const int32_t new_value);
|
||||
|
||||
uint32_t playing_dead();
|
||||
void set_playing_dead(const uint32_t new_value);
|
||||
@@ -76,8 +79,11 @@ uint16_t ui_config_bloff();
|
||||
uint8_t ui_config_textentry();
|
||||
void set_config_textentry(uint8_t new_value);
|
||||
|
||||
uint32_t pocsag_address();
|
||||
void set_pocsag_address(uint32_t address);
|
||||
uint32_t pocsag_last_address();
|
||||
void set_pocsag_last_address(uint32_t address);
|
||||
|
||||
uint32_t pocsag_ignore_address();
|
||||
void set_pocsag_ignore_address(uint32_t address);
|
||||
|
||||
} /* namespace persistent_memory */
|
||||
} /* namespace portapack */
|
||||
|
Reference in New Issue
Block a user