mirror of
https://github.com/portapack-mayhem/mayhem-firmware.git
synced 2024-12-15 04:28:10 +00:00
Merge dqs105/mic_tx_rx_dev_ui
UI tweak & new PTT button
This commit is contained in:
commit
a09db01821
@ -45,7 +45,7 @@ void MicTXView::focus() {
|
|||||||
field_rxfrequency.focus();
|
field_rxfrequency.focus();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
field_frequency.focus();
|
field_va.focus();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -126,7 +126,7 @@ void MicTXView::do_timing() {
|
|||||||
} else {
|
} else {
|
||||||
// Check for PTT release
|
// Check for PTT release
|
||||||
const auto switches_state = get_switches_state();
|
const auto switches_state = get_switches_state();
|
||||||
if (!switches_state[0] && transmitting) // Right button
|
if (!switches_state[4] && transmitting && !button_touch) // Select button
|
||||||
set_tx(false);
|
set_tx(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -175,9 +175,7 @@ void MicTXView::on_headphone_volume_changed(int32_t v) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void MicTXView::set_ptt_visibility(bool v) {
|
void MicTXView::set_ptt_visibility(bool v) {
|
||||||
text_ptt_1.hidden(!v);
|
tx_button.hidden(!v);
|
||||||
text_ptt_2.hidden(!v);
|
|
||||||
text_ptt_3.hidden(!v);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MicTXView::MicTXView(
|
MicTXView::MicTXView(
|
||||||
@ -210,9 +208,7 @@ MicTXView::MicTXView(
|
|||||||
&field_rxlna,
|
&field_rxlna,
|
||||||
&field_rxvga,
|
&field_rxvga,
|
||||||
&field_rxamp,
|
&field_rxamp,
|
||||||
&text_ptt_1,
|
&tx_button
|
||||||
&text_ptt_2,
|
|
||||||
&text_ptt_3
|
|
||||||
});
|
});
|
||||||
|
|
||||||
tone_keys_populate(options_tone_key);
|
tone_keys_populate(options_tone_key);
|
||||||
@ -236,10 +232,10 @@ MicTXView::MicTXView(
|
|||||||
transmitter_model.set_tuning_frequency(f);
|
transmitter_model.set_tuning_frequency(f);
|
||||||
};
|
};
|
||||||
field_frequency.on_edit = [this, &nav]() {
|
field_frequency.on_edit = [this, &nav]() {
|
||||||
|
focused_ui = 0;
|
||||||
// TODO: Provide separate modal method/scheme?
|
// TODO: Provide separate modal method/scheme?
|
||||||
auto new_view = nav.push<FrequencyKeypadView>(tx_frequency);
|
auto new_view = nav.push<FrequencyKeypadView>(tx_frequency);
|
||||||
new_view->on_changed = [this](rf::Frequency f) {
|
new_view->on_changed = [this](rf::Frequency f) {
|
||||||
focused_ui = 0;
|
|
||||||
tx_frequency = f;
|
tx_frequency = f;
|
||||||
if(!rx_enabled)
|
if(!rx_enabled)
|
||||||
transmitter_model.set_tuning_frequency(f);
|
transmitter_model.set_tuning_frequency(f);
|
||||||
@ -350,10 +346,10 @@ MicTXView::MicTXView(
|
|||||||
receiver_model.set_tuning_frequency(f);
|
receiver_model.set_tuning_frequency(f);
|
||||||
};
|
};
|
||||||
field_rxfrequency.on_edit = [this, &nav]() {
|
field_rxfrequency.on_edit = [this, &nav]() {
|
||||||
|
focused_ui = 1;
|
||||||
// TODO: Provide separate modal method/scheme?
|
// TODO: Provide separate modal method/scheme?
|
||||||
auto new_view = nav.push<FrequencyKeypadView>(rx_frequency);
|
auto new_view = nav.push<FrequencyKeypadView>(rx_frequency);
|
||||||
new_view->on_changed = [this](rf::Frequency f) {
|
new_view->on_changed = [this](rf::Frequency f) {
|
||||||
focused_ui = 1;
|
|
||||||
rx_frequency = f;
|
rx_frequency = f;
|
||||||
if(rx_enabled)
|
if(rx_enabled)
|
||||||
receiver_model.set_tuning_frequency(f);
|
receiver_model.set_tuning_frequency(f);
|
||||||
@ -384,6 +380,26 @@ MicTXView::MicTXView(
|
|||||||
};
|
};
|
||||||
field_rxamp.set_value(rx_amp);
|
field_rxamp.set_value(rx_amp);
|
||||||
|
|
||||||
|
tx_button.on_select = [this](TxButton&) {
|
||||||
|
if(ptt_enabled && !transmitting) {
|
||||||
|
button_touch = true;
|
||||||
|
set_tx(true);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
tx_button.on_release = [this](TxButton&) {
|
||||||
|
if(button_touch) {
|
||||||
|
button_touch = false;
|
||||||
|
set_tx(false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
tx_button.on_buttonpress = [this](TxButton&) {
|
||||||
|
if(ptt_enabled && !transmitting) {
|
||||||
|
set_tx(true);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
transmitter_model.set_sampling_rate(sampling_rate);
|
transmitter_model.set_sampling_rate(sampling_rate);
|
||||||
transmitter_model.set_baseband_bandwidth(1750000);
|
transmitter_model.set_baseband_bandwidth(1750000);
|
||||||
|
|
||||||
|
@ -47,6 +47,8 @@ public:
|
|||||||
void focus() override;
|
void focus() override;
|
||||||
|
|
||||||
// PTT: Enable through KeyEvent (only works with presses), disable by polling :(
|
// PTT: Enable through KeyEvent (only works with presses), disable by polling :(
|
||||||
|
// This is the old "RIGHT BUTTON" method.
|
||||||
|
/*
|
||||||
bool on_key(const KeyEvent key) {
|
bool on_key(const KeyEvent key) {
|
||||||
if ((key == KeyEvent::Right) && (!va_enabled) && ptt_enabled) {
|
if ((key == KeyEvent::Right) && (!va_enabled) && ptt_enabled) {
|
||||||
set_tx(true);
|
set_tx(true);
|
||||||
@ -54,6 +56,7 @@ public:
|
|||||||
} else
|
} else
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
*/
|
||||||
|
|
||||||
std::string title() const override { return "Mic TX RX"; };
|
std::string title() const override { return "Mic TX RX"; };
|
||||||
|
|
||||||
@ -93,26 +96,27 @@ private:
|
|||||||
bool rx_amp { false };
|
bool rx_amp { false };
|
||||||
rf::Frequency tx_frequency { 0 };
|
rf::Frequency tx_frequency { 0 };
|
||||||
rf::Frequency rx_frequency { 0 };
|
rf::Frequency rx_frequency { 0 };
|
||||||
int32_t focused_ui { 0 };
|
int32_t focused_ui { 2 };
|
||||||
|
bool button_touch { true };
|
||||||
|
|
||||||
|
|
||||||
Labels labels {
|
Labels labels {
|
||||||
{ { 3 * 8, 1 * 8 }, "MIC. GAIN:", Color::light_grey() },
|
{ { 3 * 8, 1 * 8 }, "MIC. GAIN:", Color::light_grey() },
|
||||||
{ { 3 * 8, 3 * 8 }, "FREQUENCY:", Color::light_grey() },
|
{ { 3 * 8, 3 * 8 }, "F:", Color::light_grey() },
|
||||||
{ { 3 * 8, 5 * 8 }, "BANDWIDTH: kHz", Color::light_grey() },
|
{ { 15 * 8, 3 * 8 }, "BW: kHz", Color::light_grey() },
|
||||||
{ { 3 * 8, 7 * 8 }, "RFGAIN:", Color::light_grey() },
|
{ { 3 * 8, 5 * 8 }, "GAIN:", Color::light_grey() },
|
||||||
{ {13 * 8, 7 * 8 }, "Amp:", Color::light_grey() },
|
{ {11 * 8, 5 * 8 }, "Amp:", Color::light_grey() },
|
||||||
{ { 3 * 8, 10 * 8 }, "TX Activation:", Color::light_grey() },
|
{ { 3 * 8, 8 * 8 }, "TX Activation:", Color::light_grey() },
|
||||||
{ { 7 * 8, 12 * 8 }, "LEVEL: /255", Color::light_grey() },
|
{ { 4 * 8, 10 * 8 }, "LVL:", Color::light_grey() },
|
||||||
{ { 6 * 8, 14 * 8 }, "ATTACK: ms", Color::light_grey() },
|
{ {12 * 8, 10 * 8 }, "ATT:", Color::light_grey() },
|
||||||
{ { 7 * 8, 16 * 8 }, "DECAY: ms", Color::light_grey() },
|
{ {20 * 8, 10 * 8 }, "DEC:", Color::light_grey() },
|
||||||
{ { 4 * 8, ( 19 * 8 ) - 2 }, "TONE KEY:", Color::light_grey() },
|
{ { 4 * 8, ( 13 * 8 ) - 2 }, "TONE KEY:", Color::light_grey() },
|
||||||
{ { 9 * 8, 30 * 8 }, "VOL:", Color::light_grey() },
|
{ { 9 * 8, 23 * 8 }, "VOL:", Color::light_grey() },
|
||||||
{ { 5 * 8, 32 * 8 }, "SQUELCH:", Color::light_grey() },
|
{ {17 * 8, 25 * 8 }, "SQ:", Color::light_grey() },
|
||||||
{ { 5 * 8, 34 * 8 }, "FREQUENCY:", Color::light_grey() },
|
{ { 5 * 8, 25 * 8 }, "F:", Color::light_grey() },
|
||||||
{ { 5 * 8, 36 * 8 }, "LNA:", Color::light_grey()},
|
{ { 5 * 8, 27 * 8 }, "LNA:", Color::light_grey()},
|
||||||
{ {12 * 8, 36 * 8 }, "VGA:", Color::light_grey()},
|
{ {12 * 8, 27 * 8 }, "VGA:", Color::light_grey()},
|
||||||
{ {19 * 8, 36 * 8 }, "AMP:", Color::light_grey()}
|
{ {19 * 8, 27 * 8 }, "AMP:", Color::light_grey()}
|
||||||
};
|
};
|
||||||
|
|
||||||
VuMeter vumeter {
|
VuMeter vumeter {
|
||||||
@ -121,6 +125,7 @@ private:
|
|||||||
true
|
true
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
OptionsField options_gain {
|
OptionsField options_gain {
|
||||||
{ 13 * 8, 1 * 8 },
|
{ 13 * 8, 1 * 8 },
|
||||||
4,
|
4,
|
||||||
@ -133,10 +138,10 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
FrequencyField field_frequency {
|
FrequencyField field_frequency {
|
||||||
{ 13 * 8, 3 * 8 },
|
{ 5 * 8, 3 * 8 },
|
||||||
};
|
};
|
||||||
NumberField field_bw {
|
NumberField field_bw {
|
||||||
{ 13 * 8, 5 * 8 },
|
{ 18 * 8, 3 * 8 },
|
||||||
3,
|
3,
|
||||||
{ 0, 150 },
|
{ 0, 150 },
|
||||||
1,
|
1,
|
||||||
@ -144,14 +149,14 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
NumberField field_rfgain {
|
NumberField field_rfgain {
|
||||||
{ 10 * 8, 7 * 8 },
|
{ 8 * 8, 5 * 8 },
|
||||||
2,
|
2,
|
||||||
{ 0, 47 },
|
{ 0, 47 },
|
||||||
1,
|
1,
|
||||||
' '
|
' '
|
||||||
};
|
};
|
||||||
NumberField field_rfamp {
|
NumberField field_rfamp {
|
||||||
{ 17 * 8, 7 * 8 },
|
{ 15 * 8, 5 * 8 },
|
||||||
2,
|
2,
|
||||||
{ 0, 14 },
|
{ 0, 14 },
|
||||||
14,
|
14,
|
||||||
@ -167,7 +172,7 @@ private:
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
OptionsField field_va {
|
OptionsField field_va {
|
||||||
{ 17 * 8, 10 * 8 },
|
{ 17 * 8, 8 * 8 },
|
||||||
3,
|
3,
|
||||||
{
|
{
|
||||||
{" OFF", 0},
|
{" OFF", 0},
|
||||||
@ -177,21 +182,21 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
NumberField field_va_level {
|
NumberField field_va_level {
|
||||||
{ 13 * 8, 12 * 8 },
|
{ 8 * 8, 10 * 8 },
|
||||||
3,
|
3,
|
||||||
{ 0, 255 },
|
{ 0, 255 },
|
||||||
2,
|
2,
|
||||||
' '
|
' '
|
||||||
};
|
};
|
||||||
NumberField field_va_attack {
|
NumberField field_va_attack {
|
||||||
{ 13 * 8, 14 * 8 },
|
{ 16 * 8, 10 * 8 },
|
||||||
3,
|
3,
|
||||||
{ 0, 999 },
|
{ 0, 999 },
|
||||||
20,
|
20,
|
||||||
' '
|
' '
|
||||||
};
|
};
|
||||||
NumberField field_va_decay {
|
NumberField field_va_decay {
|
||||||
{ 13 * 8, 16 * 8 },
|
{ 24 * 8, 10 * 8 },
|
||||||
4,
|
4,
|
||||||
{ 0, 9999 },
|
{ 0, 9999 },
|
||||||
100,
|
100,
|
||||||
@ -199,27 +204,27 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
OptionsField options_tone_key {
|
OptionsField options_tone_key {
|
||||||
{ 10 * 8, ( 21 * 8 ) - 2 },
|
{ 10 * 8, ( 15 * 8 ) - 2 },
|
||||||
23,
|
23,
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
Checkbox check_rogerbeep {
|
Checkbox check_rogerbeep {
|
||||||
{ 3 * 8, 23 * 8 },
|
{ 3 * 8, ( 16 * 8 ) + 4 },
|
||||||
10,
|
10,
|
||||||
"Roger beep",
|
"Roger beep",
|
||||||
false
|
false
|
||||||
};
|
};
|
||||||
|
|
||||||
Checkbox check_rxactive {
|
Checkbox check_rxactive {
|
||||||
{ 3 * 8, (27 * 8) + 4 },
|
{ 3 * 8, ( 21 * 8 ) - 4 },
|
||||||
8,
|
8,
|
||||||
"RX audio listening",
|
"RX audio listening",
|
||||||
false
|
false
|
||||||
};
|
};
|
||||||
|
|
||||||
NumberField field_volume {
|
NumberField field_volume {
|
||||||
{ 13 * 8, 30 * 8 },
|
{ 13 * 8, 23 * 8 },
|
||||||
2,
|
2,
|
||||||
{ 0, 99 },
|
{ 0, 99 },
|
||||||
1,
|
1,
|
||||||
@ -227,7 +232,7 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
NumberField field_squelch {
|
NumberField field_squelch {
|
||||||
{ 13 * 8, 32 * 8 },
|
{ 20 * 8, 25 * 8 },
|
||||||
2,
|
2,
|
||||||
{ 0, 99 },
|
{ 0, 99 },
|
||||||
1,
|
1,
|
||||||
@ -235,11 +240,11 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
FrequencyField field_rxfrequency {
|
FrequencyField field_rxfrequency {
|
||||||
{ 15 * 8, 34 * 8 },
|
{ 7 * 8, 25 * 8 },
|
||||||
};
|
};
|
||||||
|
|
||||||
NumberField field_rxlna {
|
NumberField field_rxlna {
|
||||||
{ 9 * 8, 36 * 8 },
|
{ 9 * 8, 27 * 8 },
|
||||||
2,
|
2,
|
||||||
{ 0, 40 },
|
{ 0, 40 },
|
||||||
8,
|
8,
|
||||||
@ -247,7 +252,7 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
NumberField field_rxvga {
|
NumberField field_rxvga {
|
||||||
{ 16 * 8, 36 * 8 },
|
{ 16 * 8, 27 * 8 },
|
||||||
2,
|
2,
|
||||||
{ 0, 62 },
|
{ 0, 62 },
|
||||||
2,
|
2,
|
||||||
@ -255,24 +260,16 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
NumberField field_rxamp {
|
NumberField field_rxamp {
|
||||||
{ 23 * 8, 36 * 8 },
|
{ 23 * 8, 27 * 8 },
|
||||||
1,
|
1,
|
||||||
{ 0, 1 },
|
{ 0, 1 },
|
||||||
1,
|
1,
|
||||||
' ',
|
' ',
|
||||||
};
|
};
|
||||||
|
|
||||||
Text text_ptt_1 {
|
TxButton tx_button {
|
||||||
{ 22 * 8, 13 * 8, 7 * 8, 8 },
|
{ 10 * 8, 30 * 8, 10 * 8, 5 * 8 },
|
||||||
"PTT: "
|
"TX"
|
||||||
};
|
|
||||||
Text text_ptt_2 {
|
|
||||||
{ 22 * 8, 15 * 8, 7 * 8, 8 },
|
|
||||||
"RIGHT "
|
|
||||||
};
|
|
||||||
Text text_ptt_3 {
|
|
||||||
{ 22 * 8, 17 * 8, 7 * 8, 8 },
|
|
||||||
"BUTTON"
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -946,6 +946,101 @@ bool Button::on_touch(const TouchEvent event) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* TxButton ****************************************************************/
|
||||||
|
|
||||||
|
TxButton::TxButton(
|
||||||
|
Rect parent_rect,
|
||||||
|
std::string text
|
||||||
|
) : Widget { parent_rect },
|
||||||
|
text_ { text }
|
||||||
|
{
|
||||||
|
set_focusable(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TxButton::set_text(const std::string value) {
|
||||||
|
text_ = value;
|
||||||
|
set_dirty();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string TxButton::text() const {
|
||||||
|
return text_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TxButton::paint(Painter& painter) {
|
||||||
|
Color bg, fg;
|
||||||
|
const auto r = screen_rect();
|
||||||
|
|
||||||
|
if (has_focus() || highlighted()) {
|
||||||
|
bg = style().foreground;
|
||||||
|
fg = Color::black();
|
||||||
|
} else {
|
||||||
|
bg = Color::grey();
|
||||||
|
fg = style().foreground;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Style paint_style = { style().font, bg, fg };
|
||||||
|
|
||||||
|
painter.draw_rectangle({r.location(), {r.size().width(), 1}}, Color::light_grey());
|
||||||
|
painter.draw_rectangle({r.location().x(), r.location().y() + r.size().height() - 1, r.size().width(), 1}, Color::dark_grey());
|
||||||
|
painter.draw_rectangle({r.location().x() + r.size().width() - 1, r.location().y(), 1, r.size().height()}, Color::dark_grey());
|
||||||
|
|
||||||
|
painter.fill_rectangle(
|
||||||
|
{ r.location().x(), r.location().y() + 1, r.size().width() - 1, r.size().height() - 2 },
|
||||||
|
paint_style.background
|
||||||
|
);
|
||||||
|
|
||||||
|
const auto label_r = paint_style.font.size_of(text_);
|
||||||
|
painter.draw_string(
|
||||||
|
{ r.location().x() + (r.size().width() - label_r.width()) / 2, r.location().y() + (r.size().height() - label_r.height()) / 2 },
|
||||||
|
paint_style,
|
||||||
|
text_
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TxButton::on_focus() {
|
||||||
|
if( on_highlight )
|
||||||
|
on_highlight(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TxButton::on_key(const KeyEvent key) {
|
||||||
|
if( key == KeyEvent::Select ) {
|
||||||
|
if( on_buttonpress ) {
|
||||||
|
on_buttonpress(*this);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if( on_dir ) {
|
||||||
|
return on_dir(*this, key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TxButton::on_touch(const TouchEvent event) {
|
||||||
|
switch(event.type) {
|
||||||
|
case TouchEvent::Type::Start:
|
||||||
|
set_highlighted(true);
|
||||||
|
set_dirty();
|
||||||
|
if( on_select ) {
|
||||||
|
on_select(*this);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
|
||||||
|
|
||||||
|
case TouchEvent::Type::End:
|
||||||
|
set_highlighted(false);
|
||||||
|
set_dirty();
|
||||||
|
if( on_release ) {
|
||||||
|
on_release(*this);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* NewButton ****************************************************************/
|
/* NewButton ****************************************************************/
|
||||||
|
|
||||||
NewButton::NewButton(
|
NewButton::NewButton(
|
||||||
|
@ -401,6 +401,34 @@ private:
|
|||||||
std::string text_;
|
std::string text_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class TxButton : public Widget {
|
||||||
|
public:
|
||||||
|
std::function<void(TxButton&)> on_select { }; // Touch only.
|
||||||
|
std::function<void(TxButton&)> on_release { }; // Touch only. There's no way (or complicated) for detecting a button's release :(
|
||||||
|
std::function<void(TxButton&)> on_buttonpress { };
|
||||||
|
std::function<bool(TxButton&, KeyEvent)> on_dir { };
|
||||||
|
std::function<void(TxButton&)> on_highlight { };
|
||||||
|
|
||||||
|
TxButton(Rect parent_rect, std::string text);
|
||||||
|
|
||||||
|
TxButton(
|
||||||
|
) : TxButton { { }, { } }
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_text(const std::string value);
|
||||||
|
std::string text() const;
|
||||||
|
|
||||||
|
void paint(Painter& painter) override;
|
||||||
|
|
||||||
|
void on_focus() override;
|
||||||
|
bool on_key(const KeyEvent key) override;
|
||||||
|
bool on_touch(const TouchEvent event) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string text_;
|
||||||
|
};
|
||||||
|
|
||||||
class NewButton : public Widget {
|
class NewButton : public Widget {
|
||||||
public:
|
public:
|
||||||
std::function<void(void)> on_select { };
|
std::function<void(void)> on_select { };
|
||||||
|
Loading…
Reference in New Issue
Block a user