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:
furrtek
2017-04-21 06:22:31 +01:00
parent eff96276c3
commit 90feadd9f5
28 changed files with 423 additions and 423 deletions

View File

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

View File

@@ -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() {

View File

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

View File

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

View File

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

View File

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