diff --git a/firmware/application/apps/lge_app.cpp b/firmware/application/apps/lge_app.cpp index 265a20e5d4dfd16eaacd4b4b4cf4c5731a3b6dc7..c1f4ea0f809e55306874e0476109990e962d632d 100644 --- a/firmware/application/apps/lge_app.cpp +++ b/firmware/application/apps/lge_app.cpp @@ -240,7 +240,6 @@ void LGEView::start_tx() { tx_view.set_dirty(); } transmitter_model.set_sampling_rate(2280000); - transmitter_model.set_rf_amp(true); transmitter_model.set_baseband_bandwidth(1750000); transmitter_model.enable(); diff --git a/firmware/application/apps/ui_adsb_tx.cpp b/firmware/application/apps/ui_adsb_tx.cpp index 5054f258d265c8ef925c5ac9a6e33532bcf6611d..198d229590b31806dae3b7a1e873f48c328107f3 100644 --- a/firmware/application/apps/ui_adsb_tx.cpp +++ b/firmware/application/apps/ui_adsb_tx.cpp @@ -310,7 +310,6 @@ void ADSBTxView::start_tx() { generate_frames(); transmitter_model.set_sampling_rate(4000000U); - transmitter_model.set_rf_amp(true); transmitter_model.set_baseband_bandwidth(10000000); transmitter_model.enable(); diff --git a/firmware/application/apps/ui_aprs_tx.cpp b/firmware/application/apps/ui_aprs_tx.cpp index efdb916de20b37fa1d01c83451370b9db064da18..87ff69278565047e391dad2919455579e6dc63ea 100644 --- a/firmware/application/apps/ui_aprs_tx.cpp +++ b/firmware/application/apps/ui_aprs_tx.cpp @@ -58,7 +58,6 @@ void APRSTXView::start_tx() { transmitter_model.set_tuning_frequency(persistent_memory::tuned_frequency()); transmitter_model.set_sampling_rate(AFSK_TX_SAMPLERATE); - transmitter_model.set_rf_amp(true); transmitter_model.set_baseband_bandwidth(1750000); transmitter_model.enable(); @@ -108,7 +107,10 @@ APRSTXView::APRSTXView(NavigationView& nav) { }; tx_view.on_edit_frequency = [this, &nav]() { - return; + auto new_view = nav.push<FrequencyKeypadView>(receiver_model.tuning_frequency()); + new_view->on_changed = [this](rf::Frequency f) { + receiver_model.set_tuning_frequency(f); + }; }; tx_view.on_start = [this]() { diff --git a/firmware/application/apps/ui_bht_tx.cpp b/firmware/application/apps/ui_bht_tx.cpp index acc75f8fe8d2e2872294568002e30d75163cc754..6021a240e7c22674644682357d48a1326b7be9e3 100644 --- a/firmware/application/apps/ui_bht_tx.cpp +++ b/firmware/application/apps/ui_bht_tx.cpp @@ -37,7 +37,6 @@ void BHTView::focus() { void BHTView::start_tx() { baseband::shutdown(); - transmitter_model.set_rf_amp(true); transmitter_model.set_baseband_bandwidth(1750000); if (target_system == XYLOS) { diff --git a/firmware/application/apps/ui_coasterp.cpp b/firmware/application/apps/ui_coasterp.cpp index 0d5668e3eb44b02459da091d969c4f75b9885f41..cd918dda5a2b99498f5152a0ad349f5cdd835fcf 100644 --- a/firmware/application/apps/ui_coasterp.cpp +++ b/firmware/application/apps/ui_coasterp.cpp @@ -68,7 +68,6 @@ void CoasterPagerView::start_tx() { generate_frame(); transmitter_model.set_sampling_rate(2280000); - transmitter_model.set_rf_amp(true); transmitter_model.set_baseband_bandwidth(1750000); transmitter_model.enable(); diff --git a/firmware/application/apps/ui_keyfob.cpp b/firmware/application/apps/ui_keyfob.cpp index f6e6fdb29eadd490389ecf3f58b2cd2374486a4d..6492cd6be368aa91160d662244225c9fe2a4801b 100644 --- a/firmware/application/apps/ui_keyfob.cpp +++ b/firmware/application/apps/ui_keyfob.cpp @@ -186,7 +186,6 @@ void KeyfobView::start_tx() { size_t bitstream_length = generate_frame(); transmitter_model.set_sampling_rate(OOK_SAMPLERATE); - transmitter_model.set_rf_amp(true); transmitter_model.set_baseband_bandwidth(1750000); transmitter_model.enable(); diff --git a/firmware/application/apps/ui_lcr.cpp b/firmware/application/apps/ui_lcr.cpp index 0944fbe65caa58fa19b316e41fe6ffe135cddf79..e664f82ee9dbb316af207f9515282971fe265e29 100644 --- a/firmware/application/apps/ui_lcr.cpp +++ b/firmware/application/apps/ui_lcr.cpp @@ -130,7 +130,6 @@ void LCRView::start_tx(const bool scan) { transmitter_model.set_tuning_frequency(persistent_memory::tuned_frequency()); transmitter_model.set_sampling_rate(AFSK_TX_SAMPLERATE); - transmitter_model.set_rf_amp(true); transmitter_model.set_baseband_bandwidth(1750000); transmitter_model.enable(); diff --git a/firmware/application/apps/ui_mictx.cpp b/firmware/application/apps/ui_mictx.cpp index fba9d5e7ea1e21c9ea86038c5f18fb3ab293abdd..8145b28eca4b82c81cf0095b8017ecb5e872aa0d 100644 --- a/firmware/application/apps/ui_mictx.cpp +++ b/firmware/application/apps/ui_mictx.cpp @@ -63,7 +63,6 @@ void MicTXView::set_tx(bool enable) { if (enable) { transmitting = true; configure_baseband(); - transmitter_model.set_rf_amp(true); transmitter_model.enable(); portapack::pin_i2s0_rx_sda.mode(3); // This is already done in audio::init but gets changed by the CPLD overlay reprogramming //gpio_tx.write(1); @@ -75,7 +74,6 @@ void MicTXView::set_tx(bool enable) { } else { transmitting = false; configure_baseband(); - transmitter_model.set_rf_amp(false); transmitter_model.disable(); //gpio_tx.write(0); //led_tx.off(); @@ -207,7 +205,6 @@ MicTXView::MicTXView( field_va_decay.set_value(1000); transmitter_model.set_sampling_rate(sampling_rate); - transmitter_model.set_rf_amp(false); transmitter_model.set_baseband_bandwidth(1750000); set_tx(false); diff --git a/firmware/application/apps/ui_morse.cpp b/firmware/application/apps/ui_morse.cpp index 1ccb24bb4d4c6f651010e3683ee60f3abfbe1b8b..a9b997b375001adb378f0c04e7d90443ffb6a109 100644 --- a/firmware/application/apps/ui_morse.cpp +++ b/firmware/application/apps/ui_morse.cpp @@ -100,7 +100,6 @@ bool MorseView::start_tx() { progressbar.set_max(symbol_count); transmitter_model.set_sampling_rate(1536000U); - transmitter_model.set_rf_amp(true); transmitter_model.set_baseband_bandwidth(1750000); transmitter_model.enable(); diff --git a/firmware/application/apps/ui_pocsag_tx.cpp b/firmware/application/apps/ui_pocsag_tx.cpp index ae57acad4765e47ea6f2ad125872a17bb5dcb266..316cf17d360606bd17d6bcd9d4ad742010ab73d3 100644 --- a/firmware/application/apps/ui_pocsag_tx.cpp +++ b/firmware/application/apps/ui_pocsag_tx.cpp @@ -79,9 +79,6 @@ bool POCSAGTXView::start_tx() { progressbar.set_max(total_frames); transmitter_model.set_sampling_rate(2280000); - transmitter_model.set_rf_amp(true); - transmitter_model.set_lna(40); - transmitter_model.set_vga(40); transmitter_model.set_baseband_bandwidth(1750000); transmitter_model.enable(); diff --git a/firmware/application/apps/ui_rds.cpp b/firmware/application/apps/ui_rds.cpp index e62e15294251b93b9e474d9bfd72fdcc0563f8d5..db9e2d2a417857d279349433ba009c39d7be8646 100644 --- a/firmware/application/apps/ui_rds.cpp +++ b/firmware/application/apps/ui_rds.cpp @@ -204,7 +204,6 @@ void RDSView::start_tx() { frame_datetime.clear(); transmitter_model.set_sampling_rate(2280000U); - transmitter_model.set_rf_amp(true); transmitter_model.set_baseband_bandwidth(1750000); transmitter_model.enable(); diff --git a/firmware/application/apps/ui_sstvtx.cpp b/firmware/application/apps/ui_sstvtx.cpp index 01bdb3c7a80c9e06890022f35d519a59a726fe46..4943315d2388fae91c985ae35488ddbc0c0d27e7 100644 --- a/firmware/application/apps/ui_sstvtx.cpp +++ b/firmware/application/apps/ui_sstvtx.cpp @@ -166,7 +166,6 @@ void SSTVTXView::start_tx() { prepare_scanline(); // Preload one scanline transmitter_model.set_sampling_rate(3072000U); - transmitter_model.set_rf_amp(true); transmitter_model.set_baseband_bandwidth(1750000); transmitter_model.enable(); diff --git a/firmware/application/transmitter_model.hpp b/firmware/application/transmitter_model.hpp index ef343218f82990bfcd285b6584ef049260bead46..d6715068820bda2364404e0569fc6baf508e68ac 100644 --- a/firmware/application/transmitter_model.hpp +++ b/firmware/application/transmitter_model.hpp @@ -66,7 +66,7 @@ public: private: bool enabled_ { false }; - bool rf_amp_ { true }; + bool rf_amp_ { false }; int32_t lna_gain_db_ { 0 }; uint32_t channel_bandwidth_ { 1 }; uint32_t baseband_bandwidth_ { max2837::filter::bandwidth_minimum }; diff --git a/firmware/application/ui/ui_transmitter.cpp b/firmware/application/ui/ui_transmitter.cpp index bfc5c6e58008db4c7a61c3ee68eef81decab174a..acc305746942865f6df486a47968cff7ce1b12a8 100644 --- a/firmware/application/ui/ui_transmitter.cpp +++ b/firmware/application/ui/ui_transmitter.cpp @@ -33,24 +33,6 @@ using namespace portapack; namespace ui { -/* TXGainField **********************************************************/ - -TXGainField::TXGainField( - Point parent_pos -) : NumberField { - parent_pos, 2, - { max2837::tx::gain_db_range.minimum, max2837::tx::gain_db_range.maximum }, - max2837::tx::gain_db_step, - ' ', - } -{ - set_value(transmitter_model.tx_gain()); - - on_change = [](int32_t v) { - transmitter_model.set_tx_gain(v); - }; -} - /* TransmitterView *******************************************************/ void TransmitterView::paint(Painter& painter) { @@ -79,6 +61,34 @@ void TransmitterView::on_channel_bandwidth_changed(uint32_t channel_bandwidth) { transmitter_model.set_channel_bandwidth(channel_bandwidth); } +void TransmitterView::on_tx_gain_changed(int32_t tx_gain) { + transmitter_model.set_tx_gain(tx_gain); + update_gainlevel_styles(); +} + +void TransmitterView::on_tx_amp_changed(bool rf_amp) { + transmitter_model.set_rf_amp(rf_amp); + update_gainlevel_styles(); +} + +void TransmitterView::update_gainlevel_styles() { + const Style *new_style_ptr = NULL; + int8_t tot_gain = transmitter_model.tx_gain() + (transmitter_model.rf_amp() ? 14 : 0); + + if(tot_gain > POWER_THRESHOLD_HIGH) { + new_style_ptr = &style_power_high; + } else if(tot_gain > POWER_THRESHOLD_MED) { + new_style_ptr = &style_power_med; + } else if(tot_gain > POWER_THRESHOLD_LOW) { + new_style_ptr = &style_power_low; + } + + field_gain.set_style(new_style_ptr); + text_gain.set_style(new_style_ptr); + field_amp.set_style(new_style_ptr); + text_amp.set_style(new_style_ptr); +} + void TransmitterView::set_transmitting(const bool transmitting) { if (transmitting) { button_start.set_text("STOP"); @@ -93,6 +103,11 @@ void TransmitterView::set_transmitting(const bool transmitting) { void TransmitterView::on_show() { field_frequency.set_value(transmitter_model.tuning_frequency()); + + field_gain.set_value(transmitter_model.tx_gain()); + field_amp.set_value(transmitter_model.rf_amp() ? 14 : 0); + + update_gainlevel_styles(); } void TransmitterView::focus() { @@ -109,7 +124,9 @@ TransmitterView::TransmitterView( &field_frequency, &text_gain, &field_gain, - &button_start + &button_start, + &text_amp, + &field_amp, }); set_transmitting(false); @@ -140,10 +157,15 @@ TransmitterView::TransmitterView( if (on_edit_frequency) on_edit_frequency(); }; - field_frequency.on_change = [this](rf::Frequency f) { - transmitter_model.set_tuning_frequency(f); + + field_gain.on_change = [this](uint32_t tx_gain) { + on_tx_gain_changed(tx_gain); }; + field_amp.on_change = [this](uint32_t rf_amp) { + on_tx_amp_changed((bool) rf_amp); + }; + button_start.on_select = [this](Button&){ if (transmitting_) { if (on_stop) diff --git a/firmware/application/ui/ui_transmitter.hpp b/firmware/application/ui/ui_transmitter.hpp index de21f993128d21cc4fd24ae487b5b4947bf5f430..da5ce7998aa7d653d2e94b5ec79016c64afbc6de 100644 --- a/firmware/application/ui/ui_transmitter.hpp +++ b/firmware/application/ui/ui_transmitter.hpp @@ -37,6 +37,10 @@ #include <algorithm> #include <functional> +#define POWER_THRESHOLD_HIGH 47 +#define POWER_THRESHOLD_MED 38 +#define POWER_THRESHOLD_LOW 17 + namespace ui { class TXGainField : public NumberField { @@ -83,7 +87,22 @@ private: .background = Color::black(), .foreground = Color::dark_grey(), }; - + const Style style_power_low { + .font = font::fixed_8x16, + .background = Color::black(), + .foreground = Color::yellow(), + }; + const Style style_power_med { + .font = font::fixed_8x16, + .background = Color::black(), + .foreground = Color::orange(), + }; + const Style style_power_high { + .font = font::fixed_8x16, + .background = Color::black(), + .foreground = Color::red(), + }; + bool lock_ { false }; bool transmitting_ { false }; @@ -95,10 +114,15 @@ private: { 0, 3 * 8, 5 * 8, 1 * 16 }, "Gain:" }; - TXGainField field_gain { - { 5 * 8, 3 * 8 } - }; + NumberField field_gain { + { 5 * 8, 3 * 8 }, + 2, + { max2837::tx::gain_db_range.minimum, max2837::tx::gain_db_range.maximum }, + max2837::tx::gain_db_step, + ' ' + }; + Text text_bw { { 11 * 8, 1 * 8, 9 * 8, 1 * 16 }, "BW: kHz" @@ -111,6 +135,19 @@ private: ' ' }; + Text text_amp { + { 11 * 8, 3 * 8, 5 * 8, 1 * 16 }, + "Amp:" + }; + + NumberField field_amp { + { 16 * 8, 3 * 8 }, + 2, + { 0, 14 }, + 14, + ' ' + }; + Button button_start { { 21 * 8, 1 * 8, 9 * 8, 32 }, "START" @@ -118,6 +155,10 @@ private: void on_tuning_frequency_changed(rf::Frequency f); void on_channel_bandwidth_changed(uint32_t channel_bandwidth); + void on_tx_gain_changed(int32_t tx_gain); + void on_tx_amp_changed(bool rf_amp); + + void update_gainlevel_styles(void); }; } /* namespace ui */