mirror of
https://github.com/eried/portapack-mayhem.git
synced 2024-10-01 01:26:06 -04:00
Enable Sample Rate to be spec'd in .ini file for Weather & SubGhzDecoder apps (#1659)
This commit is contained in:
parent
36e1b9a36e
commit
19a66fac20
@ -88,8 +88,7 @@ SubGhzDView::SubGhzDView(NavigationView& nav)
|
|||||||
recent_entries_view.on_select = [this](const SubGhzDRecentEntry& entry) {
|
recent_entries_view.on_select = [this](const SubGhzDRecentEntry& entry) {
|
||||||
nav_.push<SubGhzDRecentEntryDetailView>(entry);
|
nav_.push<SubGhzDRecentEntryDetailView>(entry);
|
||||||
};
|
};
|
||||||
baseband::set_subghzd(0); // am
|
baseband::set_subghzd_config(0, receiver_model.sampling_rate()); // 0=am
|
||||||
receiver_model.set_sampling_rate(4'000'000);
|
|
||||||
receiver_model.enable();
|
receiver_model.enable();
|
||||||
signal_token_tick_second = rtc_time::signal_tick_second += [this]() {
|
signal_token_tick_second = rtc_time::signal_tick_second += [this]() {
|
||||||
on_tick_second();
|
on_tick_second();
|
||||||
|
@ -115,8 +115,7 @@ WeatherView::WeatherView(NavigationView& nav)
|
|||||||
recent_entries_view.on_select = [this](const WeatherRecentEntry& entry) {
|
recent_entries_view.on_select = [this](const WeatherRecentEntry& entry) {
|
||||||
nav_.push<WeatherRecentEntryDetailView>(entry);
|
nav_.push<WeatherRecentEntryDetailView>(entry);
|
||||||
};
|
};
|
||||||
baseband::set_weather();
|
baseband::set_subghzd_config(0, receiver_model.sampling_rate()); // 0=am
|
||||||
receiver_model.set_sampling_rate(4'000'000); // needed too
|
|
||||||
receiver_model.enable();
|
receiver_model.enable();
|
||||||
signal_token_tick_second = rtc_time::signal_tick_second += [this]() {
|
signal_token_tick_second = rtc_time::signal_tick_second += [this]() {
|
||||||
on_tick_second();
|
on_tick_second();
|
||||||
@ -233,4 +232,4 @@ void RecentEntriesTable<ui::WeatherRecentEntries>::draw(
|
|||||||
painter.draw_string(target_rect.location(), style, line);
|
painter.draw_string(target_rect.location(), style, line);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace ui
|
} // namespace ui
|
||||||
|
@ -100,8 +100,8 @@ class WeatherView : public View {
|
|||||||
NavigationView& nav_;
|
NavigationView& nav_;
|
||||||
RxRadioState radio_state_{
|
RxRadioState radio_state_{
|
||||||
433'920'000 /* frequency */,
|
433'920'000 /* frequency */,
|
||||||
2'500'000 /* bandwidth max283x*/,
|
1'750'000 /* bandwidth */,
|
||||||
4'000'000 /* sampling rate */,
|
2'000'000 /* sampling rate */,
|
||||||
ReceiverModel::Mode::AMAudio};
|
ReceiverModel::Mode::AMAudio};
|
||||||
app_settings::SettingsManager settings_{
|
app_settings::SettingsManager settings_{
|
||||||
"rx_weather",
|
"rx_weather",
|
||||||
|
@ -319,13 +319,8 @@ void set_spectrum_painter_config(const uint16_t width, const uint16_t height, bo
|
|||||||
send_message(&message);
|
send_message(&message);
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_weather() {
|
void set_subghzd_config(uint8_t modulation = 0, uint32_t sampling_rate = 0) {
|
||||||
const SubGhzFPRxConfigureMessage message{0};
|
const SubGhzFPRxConfigureMessage message{modulation, sampling_rate};
|
||||||
send_message(&message);
|
|
||||||
}
|
|
||||||
|
|
||||||
void set_subghzd(uint8_t modulation = 0) {
|
|
||||||
const SubGhzFPRxConfigureMessage message{modulation};
|
|
||||||
send_message(&message);
|
send_message(&message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -88,8 +88,7 @@ void set_spectrum(const size_t sampling_rate, const size_t trigger);
|
|||||||
void set_siggen_tone(const uint32_t tone);
|
void set_siggen_tone(const uint32_t tone);
|
||||||
void set_siggen_config(const uint32_t bw, const uint32_t shape, const uint32_t duration);
|
void set_siggen_config(const uint32_t bw, const uint32_t shape, const uint32_t duration);
|
||||||
void set_spectrum_painter_config(const uint16_t width, const uint16_t height, bool update, int32_t bw);
|
void set_spectrum_painter_config(const uint16_t width, const uint16_t height, bool update, int32_t bw);
|
||||||
void set_weather();
|
void set_subghzd_config(uint8_t modulation, uint32_t sampling_rate);
|
||||||
void set_subghzd(uint8_t modulation);
|
|
||||||
void request_beep();
|
void request_beep();
|
||||||
|
|
||||||
void run_image(const portapack::spi_flash::image_tag_t image_tag);
|
void run_image(const portapack::spi_flash::image_tag_t image_tag);
|
||||||
|
@ -47,7 +47,7 @@ void SubGhzDProcessor::execute(const buffer_c8_t& buffer) {
|
|||||||
tm += mag;
|
tm += mag;
|
||||||
if (meashl == currentHiLow && currentDuration < 30'000'000) // allow pass 'end' signal
|
if (meashl == currentHiLow && currentDuration < 30'000'000) // allow pass 'end' signal
|
||||||
{
|
{
|
||||||
if (currentDuration < UINT32_MAX) currentDuration += nsPerDecSamp;
|
currentDuration += nsPerDecSamp;
|
||||||
} else { // called on change, so send the last duration and dir.
|
} else { // called on change, so send the last duration and dir.
|
||||||
if (protoList) protoList->feed(currentHiLow, currentDuration / 1000);
|
if (protoList) protoList->feed(currentHiLow, currentDuration / 1000);
|
||||||
currentDuration = nsPerDecSamp;
|
currentDuration = nsPerDecSamp;
|
||||||
@ -73,7 +73,12 @@ void SubGhzDProcessor::on_message(const Message* const message) {
|
|||||||
void SubGhzDProcessor::configure(const SubGhzFPRxConfigureMessage& message) {
|
void SubGhzDProcessor::configure(const SubGhzFPRxConfigureMessage& message) {
|
||||||
// constexpr size_t decim_0_output_fs = baseband_fs / decim_0.decimation_factor; //unused
|
// constexpr size_t decim_0_output_fs = baseband_fs / decim_0.decimation_factor; //unused
|
||||||
// constexpr size_t decim_1_output_fs = decim_0_output_fs / decim_1.decimation_factor; //unused
|
// constexpr size_t decim_1_output_fs = decim_0_output_fs / decim_1.decimation_factor; //unused
|
||||||
(void)message; // unused
|
|
||||||
|
modulation = message.modulation; // TODO: add support for FM (currently AM only)
|
||||||
|
|
||||||
|
baseband_fs = message.sampling_rate;
|
||||||
|
baseband_thread.set_sampling_rate(baseband_fs);
|
||||||
|
nsPerDecSamp = 1'000'000'000 / baseband_fs * 8; // Scaled it due to less array buffer sampes due to /8 decimation. 250 nseg (4Mhz) * 8
|
||||||
|
|
||||||
decim_0.configure(taps_200k_wfm_decim_0.taps);
|
decim_0.configure(taps_200k_wfm_decim_0.taps);
|
||||||
decim_1.configure(taps_200k_wfm_decim_1.taps);
|
decim_1.configure(taps_200k_wfm_decim_1.taps);
|
||||||
|
@ -40,8 +40,9 @@ class SubGhzDProcessor : public BasebandProcessor {
|
|||||||
void on_message(const Message* const message) override;
|
void on_message(const Message* const message) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static constexpr size_t baseband_fs = 4'000'000; // it works, I think we need to write that master clock in the baseband_threat , even later we decimate it.
|
size_t baseband_fs = 0; // will be set later by configure message
|
||||||
static constexpr uint32_t nsPerDecSamp = 1'000'000'000 / baseband_fs * 8; // 10 exp9/baseband_fs * 8
|
uint32_t nsPerDecSamp = 0;
|
||||||
|
uint8_t modulation = 0;
|
||||||
|
|
||||||
/* Array Buffer aux. used in decim0 and decim1 IQ c16 signed data ; (decim0 defines the max length of the array) */
|
/* Array Buffer aux. used in decim0 and decim1 IQ c16 signed data ; (decim0 defines the max length of the array) */
|
||||||
std::array<complex16_t, 512> dst{}; // decim0 /4 , 2048/4 = 512 complex I,Q
|
std::array<complex16_t, 512> dst{}; // decim0 /4 , 2048/4 = 512 complex I,Q
|
||||||
|
@ -47,7 +47,7 @@ void WeatherProcessor::execute(const buffer_c8_t& buffer) {
|
|||||||
tm += mag;
|
tm += mag;
|
||||||
if (meashl == currentHiLow && currentDuration < 30'000'000) // allow pass 'end' signal
|
if (meashl == currentHiLow && currentDuration < 30'000'000) // allow pass 'end' signal
|
||||||
{
|
{
|
||||||
if (currentDuration < UINT32_MAX) currentDuration += nsPerDecSamp;
|
currentDuration += nsPerDecSamp;
|
||||||
} else { // called on change, so send the last duration and dir.
|
} else { // called on change, so send the last duration and dir.
|
||||||
if (protoList) protoList->feed(currentHiLow, currentDuration / 1000);
|
if (protoList) protoList->feed(currentHiLow, currentDuration / 1000);
|
||||||
currentDuration = nsPerDecSamp;
|
currentDuration = nsPerDecSamp;
|
||||||
@ -71,9 +71,12 @@ void WeatherProcessor::on_message(const Message* const message) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void WeatherProcessor::configure(const SubGhzFPRxConfigureMessage& message) {
|
void WeatherProcessor::configure(const SubGhzFPRxConfigureMessage& message) {
|
||||||
|
baseband_fs = message.sampling_rate;
|
||||||
|
baseband_thread.set_sampling_rate(baseband_fs);
|
||||||
|
nsPerDecSamp = 1'000'000'000 / baseband_fs * 8; // Scaled it due to less array buffer sampes due to /8 decimation. 250 nseg (4Mhz) * 8
|
||||||
|
|
||||||
// constexpr size_t decim_0_output_fs = baseband_fs / decim_0.decimation_factor; //unused
|
// constexpr size_t decim_0_output_fs = baseband_fs / decim_0.decimation_factor; //unused
|
||||||
// constexpr size_t decim_1_output_fs = decim_0_output_fs / decim_1.decimation_factor; //unused
|
// constexpr size_t decim_1_output_fs = decim_0_output_fs / decim_1.decimation_factor; //unused
|
||||||
(void)message; // unused
|
|
||||||
|
|
||||||
decim_0.configure(taps_200k_wfm_decim_0.taps);
|
decim_0.configure(taps_200k_wfm_decim_0.taps);
|
||||||
decim_1.configure(taps_200k_wfm_decim_1.taps);
|
decim_1.configure(taps_200k_wfm_decim_1.taps);
|
||||||
|
@ -40,8 +40,8 @@ class WeatherProcessor : public BasebandProcessor {
|
|||||||
void on_message(const Message* const message) override;
|
void on_message(const Message* const message) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static constexpr size_t baseband_fs = 4'000'000; // it works, I think we need to write that master clock in the baseband_threat , even later we decimate it.
|
size_t baseband_fs = 0; // will be set later by configure message.
|
||||||
static constexpr uint32_t nsPerDecSamp = 1'000'000'000 / baseband_fs * 8; // Scaled it due to less array buffer sampes due to /8 decimation. 250 nseg (4Mhz) * 8
|
uint32_t nsPerDecSamp = 0;
|
||||||
|
|
||||||
/* Array Buffer aux. used in decim0 and decim1 IQ c16 signed data ; (decim0 defines the max length of the array) */
|
/* Array Buffer aux. used in decim0 and decim1 IQ c16 signed data ; (decim0 defines the max length of the array) */
|
||||||
std::array<complex16_t, 512> dst{}; // decim0 /4 , 2048/4 = 512 complex I,Q
|
std::array<complex16_t, 512> dst{}; // decim0 /4 , 2048/4 = 512 complex I,Q
|
||||||
|
@ -1241,10 +1241,11 @@ class SpectrumPainterBufferConfigureResponseMessage : public Message {
|
|||||||
|
|
||||||
class SubGhzFPRxConfigureMessage : public Message {
|
class SubGhzFPRxConfigureMessage : public Message {
|
||||||
public:
|
public:
|
||||||
constexpr SubGhzFPRxConfigureMessage(uint8_t modulation = 0)
|
constexpr SubGhzFPRxConfigureMessage(uint8_t modulation = 0, uint32_t sampling_rate = 0)
|
||||||
: Message{ID::SubGhzFPRxConfigure}, modulation{modulation} {
|
: Message{ID::SubGhzFPRxConfigure}, modulation{modulation}, sampling_rate{sampling_rate} {
|
||||||
}
|
}
|
||||||
uint8_t modulation = 0; // 0 am, 1 fm
|
uint8_t modulation = 0; // 0 am, 1 fm
|
||||||
|
uint32_t sampling_rate = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class WeatherDataMessage : public Message {
|
class WeatherDataMessage : public Message {
|
||||||
|
Loading…
Reference in New Issue
Block a user