2015-07-08 15:39:24 +00:00
/*
* Copyright ( C ) 2015 Jared Boone , ShareBrained Technology , Inc .
2016-12-09 17:21:47 +00:00
* Copyright ( C ) 2016 Furrtek
2023-05-22 20:17:28 +00:00
* Copyright ( C ) 2023 gullradriel , Nilorea Studio Inc .
2023-09-11 00:04:20 +00:00
* Copyright ( C ) 2023 Kyle Reed
2015-07-08 15:39:24 +00:00
*
* This file is part of PortaPack .
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 , or ( at your option )
* any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; see the file COPYING . If not , write to
* the Free Software Foundation , Inc . , 51 Franklin Street ,
* Boston , MA 02110 - 1301 , USA .
*/
2018-05-16 08:45:13 +00:00
# include "ui_settings.hpp"
2016-02-04 09:27:53 +00:00
2016-12-26 12:49:23 +00:00
# include "ui_navigation.hpp"
2023-06-23 23:13:39 +00:00
# include "ui_receiver.hpp"
2016-07-27 21:15:21 +00:00
# include "ui_touch_calibration.hpp"
2015-08-04 17:03:18 +00:00
# include "portapack_persistent_memory.hpp"
2015-07-08 15:39:24 +00:00
# include "lpc43xx_cpp.hpp"
using namespace lpc43xx ;
2016-01-31 08:34:24 +00:00
2020-06-07 23:23:23 +00:00
# include "audio.hpp"
2016-01-31 08:34:24 +00:00
# include "portapack.hpp"
2016-07-27 01:03:40 +00:00
using namespace portapack ;
2016-01-23 19:32:10 +00:00
2023-07-02 16:35:34 +00:00
# include "file.hpp"
namespace fs = std : : filesystem ;
2016-07-27 01:03:40 +00:00
# include "string_format.hpp"
2023-06-07 15:33:32 +00:00
# include "ui_styles.hpp"
2016-07-17 22:56:24 +00:00
# include "cpld_update.hpp"
2015-07-08 15:39:24 +00:00
2023-06-23 23:13:39 +00:00
namespace pmem = portapack : : persistent_memory ;
2023-03-22 07:46:58 +00:00
2015-07-08 15:39:24 +00:00
namespace ui {
2023-06-23 23:13:39 +00:00
/* Sends a UI refresh message to cause the status bar to redraw. */
static void send_system_refresh ( ) {
StatusRefreshMessage message { } ;
EventDispatcher : : send_message ( message ) ;
}
/* SetDateTimeView ***************************************/
2023-05-18 20:16:05 +00:00
SetDateTimeView : : SetDateTimeView (
NavigationView & nav ) {
button_save . on_select = [ & nav , this ] ( Button & ) {
const auto model = this - > form_collect ( ) ;
const rtc : : RTC new_datetime {
model . year , model . month , model . day ,
model . hour , model . minute , model . second } ;
rtcSetTime ( & RTCD1 , & new_datetime ) ;
nav . pop ( ) ;
} ,
button_cancel . on_select = [ & nav ] ( Button & ) {
nav . pop ( ) ;
} ,
add_children ( {
& labels ,
& field_year ,
& field_month ,
& field_day ,
& field_hour ,
& field_minute ,
& field_second ,
& button_save ,
& button_cancel ,
} ) ;
rtc : : RTC datetime ;
rtcGetTime ( & RTCD1 , & datetime ) ;
SetDateTimeModel model {
datetime . year ( ) ,
datetime . month ( ) ,
datetime . day ( ) ,
datetime . hour ( ) ,
datetime . minute ( ) ,
datetime . second ( ) } ;
form_init ( model ) ;
}
void SetDateTimeView : : focus ( ) {
button_cancel . focus ( ) ;
}
void SetDateTimeView : : form_init ( const SetDateTimeModel & model ) {
field_year . set_value ( model . year ) ;
field_month . set_value ( model . month ) ;
field_day . set_value ( model . day ) ;
field_hour . set_value ( model . hour ) ;
field_minute . set_value ( model . minute ) ;
field_second . set_value ( model . second ) ;
}
SetDateTimeModel SetDateTimeView : : form_collect ( ) {
return {
. year = static_cast < uint16_t > ( field_year . value ( ) ) ,
. month = static_cast < uint8_t > ( field_month . value ( ) ) ,
. day = static_cast < uint8_t > ( field_day . value ( ) ) ,
. hour = static_cast < uint8_t > ( field_hour . value ( ) ) ,
. minute = static_cast < uint8_t > ( field_minute . value ( ) ) ,
. second = static_cast < uint8_t > ( field_second . value ( ) ) } ;
}
2023-06-23 23:13:39 +00:00
/* SetRadioView ******************************************/
2023-05-18 20:16:05 +00:00
SetRadioView : : SetRadioView (
NavigationView & nav ) {
button_cancel . on_select = [ & nav ] ( Button & ) {
nav . pop ( ) ;
} ;
2023-09-11 00:04:20 +00:00
add_children ( {
& label_source ,
& value_source ,
& value_source_frequency ,
& check_clkout ,
& field_clkout_freq ,
& labels_clkout_khz ,
& labels_bias ,
& check_bias ,
& disable_external_tcxo , // TODO: always show?
& button_save ,
& button_cancel ,
} ) ;
2023-06-23 23:13:39 +00:00
const auto reference = clock_manager . get_reference ( ) ;
2023-05-18 20:16:05 +00:00
2023-09-11 00:04:20 +00:00
if ( reference . source = = ClockManager : : ReferenceSource : : Xtal ) {
add_children ( {
& labels_correction ,
& field_ppm ,
} ) ;
}
2023-05-18 20:16:05 +00:00
std : : string source_name ( " --- " ) ;
switch ( reference . source ) {
case ClockManager : : ReferenceSource : : Xtal :
source_name = " HackRF " ;
break ;
case ClockManager : : ReferenceSource : : PortaPack :
source_name = " PortaPack " ;
break ;
case ClockManager : : ReferenceSource : : External :
source_name = " External " ;
break ;
}
value_source . set ( source_name ) ;
2023-09-11 00:04:20 +00:00
value_source_frequency . set (
to_string_dec_uint ( reference . frequency / 1000000 , 2 ) + " . " +
to_string_dec_uint ( ( reference . frequency % 1000000 ) / 100 , 4 , ' 0 ' ) + " MHz " ) ;
2023-05-18 20:16:05 +00:00
2023-09-11 00:04:20 +00:00
// Make these Text controls look like Labels.
2023-06-07 15:33:32 +00:00
label_source . set_style ( & Styles : : light_grey ) ;
value_source . set_style ( & Styles : : light_grey ) ;
value_source_frequency . set_style ( & Styles : : light_grey ) ;
2023-05-18 20:16:05 +00:00
SetFrequencyCorrectionModel model {
2023-06-23 23:13:39 +00:00
static_cast < int8_t > ( pmem : : correction_ppb ( ) / 1000 ) , 0 } ;
2023-05-18 20:16:05 +00:00
form_init ( model ) ;
2023-06-23 23:13:39 +00:00
check_clkout . set_value ( pmem : : clkout_enabled ( ) ) ;
2023-05-18 20:16:05 +00:00
check_clkout . on_select = [ this ] ( Checkbox & , bool v ) {
clock_manager . enable_clock_output ( v ) ;
2023-06-23 23:13:39 +00:00
pmem : : set_clkout_enabled ( v ) ;
send_system_refresh ( ) ;
2023-05-18 20:16:05 +00:00
} ;
2023-12-24 16:28:22 +00:00
// Disallow CLKOUT freq change on hackrf_r9 due to dependencies on GP_CLKIN (same Si5351A clock);
// see comments in ClockManager::enable_clock_output()
if ( hackrf_r9 ) {
if ( pmem : : clkout_freq ( ) ! = 10000 )
pmem : : set_clkout_freq ( 10000 ) ;
field_clkout_freq . set_focusable ( false ) ;
}
2023-06-23 23:13:39 +00:00
field_clkout_freq . set_value ( pmem : : clkout_freq ( ) ) ;
2023-12-24 07:55:15 +00:00
field_clkout_freq . on_change = [ this ] ( SymField & ) {
2023-12-26 06:11:14 +00:00
if ( field_clkout_freq . to_integer ( ) < 4 ) // Min. CLK out of Si5351A/B/C-B is 2.5khz , but in our application -intermediate freq 800Mhz-,Min working CLK=4khz.
field_clkout_freq . set_value ( 4 ) ;
2023-12-24 07:55:15 +00:00
if ( field_clkout_freq . to_integer ( ) > 60000 )
field_clkout_freq . set_value ( 60000 ) ;
2023-05-18 20:16:05 +00:00
} ;
2023-06-23 23:13:39 +00:00
check_bias . set_value ( get_antenna_bias ( ) ) ;
2023-05-18 20:16:05 +00:00
check_bias . on_select = [ this ] ( Checkbox & , bool v ) {
2023-06-23 23:13:39 +00:00
set_antenna_bias ( v ) ;
2023-05-24 04:22:30 +00:00
// Update the radio.
receiver_model . set_antenna_bias ( ) ;
transmitter_model . set_antenna_bias ( ) ;
// The models won't actually disable this if they are not 'enabled_'.
// Be extra sure this is turned off.
if ( ! v )
radio : : set_antenna_bias ( false ) ;
2023-06-23 23:13:39 +00:00
send_system_refresh ( ) ;
2023-05-18 20:16:05 +00:00
} ;
2023-09-04 15:46:07 +00:00
disable_external_tcxo . set_value ( pmem : : config_disable_external_tcxo ( ) ) ;
2023-05-18 20:16:05 +00:00
button_save . on_select = [ this , & nav ] ( Button & ) {
const auto model = this - > form_collect ( ) ;
2023-06-23 23:13:39 +00:00
pmem : : set_correction_ppb ( model . ppm * 1000 ) ;
pmem : : set_clkout_freq ( model . freq ) ;
2023-09-04 15:46:07 +00:00
pmem : : set_config_disable_external_tcxo ( disable_external_tcxo . value ( ) ) ;
2023-06-23 23:13:39 +00:00
clock_manager . enable_clock_output ( pmem : : clkout_enabled ( ) ) ;
2023-05-18 20:16:05 +00:00
nav . pop ( ) ;
} ;
}
void SetRadioView : : focus ( ) {
button_save . focus ( ) ;
}
void SetRadioView : : form_init ( const SetFrequencyCorrectionModel & model ) {
field_ppm . set_value ( model . ppm ) ;
}
SetFrequencyCorrectionModel SetRadioView : : form_collect ( ) {
return {
. ppm = static_cast < int8_t > ( field_ppm . value ( ) ) ,
2023-12-24 07:55:15 +00:00
. freq = static_cast < uint32_t > ( field_clkout_freq . to_integer ( ) ) ,
2023-05-18 20:16:05 +00:00
} ;
}
2023-06-23 23:13:39 +00:00
/* SetUIView *********************************************/
2023-05-18 20:16:05 +00:00
SetUIView : : SetUIView ( NavigationView & nav ) {
add_children ( { & checkbox_disable_touchscreen ,
& checkbox_bloff ,
& options_bloff ,
& checkbox_showsplash ,
& checkbox_showclock ,
& options_clockformat ,
& checkbox_guireturnflag ,
2023-06-23 23:13:39 +00:00
& labels ,
& toggle_camera ,
& toggle_sleep ,
& toggle_stealth ,
& toggle_converter ,
& toggle_bias_tee ,
& toggle_clock ,
2023-06-26 06:08:09 +00:00
& toggle_mute ,
2023-06-23 23:13:39 +00:00
& toggle_sd_card ,
2023-05-18 20:16:05 +00:00
& button_save ,
& button_cancel } ) ;
2023-06-26 06:08:09 +00:00
// Display "Disable speaker" option only if AK4951 Codec which has separate speaker/headphone control
if ( audio : : speaker_disable_supported ( ) ) {
add_child ( & toggle_speaker ) ;
}
2023-06-23 23:13:39 +00:00
checkbox_disable_touchscreen . set_value ( pmem : : disable_touchscreen ( ) ) ;
checkbox_showsplash . set_value ( pmem : : config_splash ( ) ) ;
checkbox_showclock . set_value ( ! pmem : : hide_clock ( ) ) ;
checkbox_guireturnflag . set_value ( pmem : : show_gui_return_icon ( ) ) ;
2023-05-18 20:16:05 +00:00
2023-06-23 23:13:39 +00:00
const auto backlight_config = pmem : : config_backlight_timer ( ) ;
2023-05-18 20:16:05 +00:00
checkbox_bloff . set_value ( backlight_config . timeout_enabled ( ) ) ;
options_bloff . set_by_value ( backlight_config . timeout_enum ( ) ) ;
2023-06-23 23:13:39 +00:00
if ( pmem : : clock_with_date ( ) ) {
2023-05-18 20:16:05 +00:00
options_clockformat . set_selected_index ( 1 ) ;
} else {
options_clockformat . set_selected_index ( 0 ) ;
}
2023-06-23 23:13:39 +00:00
// NB: Invert so "active" == "not hidden"
toggle_camera . set_value ( ! pmem : : ui_hide_camera ( ) ) ;
toggle_sleep . set_value ( ! pmem : : ui_hide_sleep ( ) ) ;
toggle_stealth . set_value ( ! pmem : : ui_hide_stealth ( ) ) ;
toggle_converter . set_value ( ! pmem : : ui_hide_converter ( ) ) ;
toggle_bias_tee . set_value ( ! pmem : : ui_hide_bias_tee ( ) ) ;
toggle_clock . set_value ( ! pmem : : ui_hide_clock ( ) ) ;
toggle_speaker . set_value ( ! pmem : : ui_hide_speaker ( ) ) ;
2023-06-26 06:08:09 +00:00
toggle_mute . set_value ( ! pmem : : ui_hide_mute ( ) ) ;
2023-06-23 23:13:39 +00:00
toggle_sd_card . set_value ( ! pmem : : ui_hide_sd_card ( ) ) ;
2023-05-18 20:16:05 +00:00
button_save . on_select = [ & nav , this ] ( Button & ) {
2023-06-23 23:13:39 +00:00
pmem : : set_config_backlight_timer ( { ( pmem : : backlight_timeout_t ) options_bloff . selected_index_value ( ) ,
checkbox_bloff . value ( ) } ) ;
2023-05-18 20:16:05 +00:00
if ( checkbox_showclock . value ( ) ) {
if ( options_clockformat . selected_index ( ) = = 1 )
2023-06-23 23:13:39 +00:00
pmem : : set_clock_with_date ( true ) ;
2023-05-18 20:16:05 +00:00
else
2023-06-23 23:13:39 +00:00
pmem : : set_clock_with_date ( false ) ;
2023-05-18 20:16:05 +00:00
}
2023-06-23 23:13:39 +00:00
pmem : : set_config_splash ( checkbox_showsplash . value ( ) ) ;
pmem : : set_clock_hidden ( ! checkbox_showclock . value ( ) ) ;
pmem : : set_gui_return_icon ( checkbox_guireturnflag . value ( ) ) ;
pmem : : set_disable_touchscreen ( checkbox_disable_touchscreen . value ( ) ) ;
pmem : : set_ui_hide_camera ( ! toggle_camera . value ( ) ) ;
pmem : : set_ui_hide_sleep ( ! toggle_sleep . value ( ) ) ;
pmem : : set_ui_hide_stealth ( ! toggle_stealth . value ( ) ) ;
pmem : : set_ui_hide_converter ( ! toggle_converter . value ( ) ) ;
pmem : : set_ui_hide_bias_tee ( ! toggle_bias_tee . value ( ) ) ;
pmem : : set_ui_hide_clock ( ! toggle_clock . value ( ) ) ;
pmem : : set_ui_hide_speaker ( ! toggle_speaker . value ( ) ) ;
2023-06-26 06:08:09 +00:00
pmem : : set_ui_hide_mute ( ! toggle_mute . value ( ) ) ;
2023-06-23 23:13:39 +00:00
pmem : : set_ui_hide_sd_card ( ! toggle_sd_card . value ( ) ) ;
send_system_refresh ( ) ;
2023-05-18 20:16:05 +00:00
nav . pop ( ) ;
} ;
button_cancel . on_select = [ & nav , this ] ( Button & ) {
nav . pop ( ) ;
} ;
}
void SetUIView : : focus ( ) {
button_save . focus ( ) ;
}
2023-11-19 14:08:29 +00:00
/* SetSDCardView *********************************************/
SetSDCardView : : SetSDCardView ( NavigationView & nav ) {
add_children ( { & labels ,
& checkbox_sdcard_speed ,
& button_test_sdcard_high_speed ,
& text_sdcard_test_status ,
& button_save ,
& button_cancel } ) ;
checkbox_sdcard_speed . set_value ( pmem : : config_sdcard_high_speed_io ( ) ) ;
button_test_sdcard_high_speed . on_select = [ & nav , this ] ( Button & ) {
pmem : : set_config_sdcard_high_speed_io ( true , false ) ;
text_sdcard_test_status . set ( " !! HIGH SPEED MODE ON !! " ) ;
} ;
button_save . on_select = [ & nav , this ] ( Button & ) {
pmem : : set_config_sdcard_high_speed_io ( checkbox_sdcard_speed . value ( ) , true ) ;
send_system_refresh ( ) ;
nav . pop ( ) ;
} ;
button_cancel . on_select = [ & nav , this ] ( Button & ) {
nav . pop ( ) ;
} ;
}
void SetSDCardView : : focus ( ) {
button_save . focus ( ) ;
}
2023-06-23 23:13:39 +00:00
/* SetConverterSettingsView ******************************/
2023-05-18 20:16:05 +00:00
SetConverterSettingsView : : SetConverterSettingsView ( NavigationView & nav ) {
2023-09-11 00:04:20 +00:00
add_children ( {
& labels ,
& check_show_converter ,
& check_converter ,
& opt_converter_mode ,
& field_converter_freq ,
& button_return ,
} ) ;
2023-05-18 20:16:05 +00:00
2023-06-23 23:13:39 +00:00
check_show_converter . set_value ( ! pmem : : ui_hide_converter ( ) ) ;
2023-05-18 20:16:05 +00:00
check_show_converter . on_select = [ this ] ( Checkbox & , bool v ) {
2023-06-23 23:13:39 +00:00
pmem : : set_ui_hide_converter ( ! v ) ;
2023-05-18 20:16:05 +00:00
if ( ! v ) {
check_converter . set_value ( false ) ;
}
2023-06-11 18:47:13 +00:00
// Retune to take converter change in account.
receiver_model . set_target_frequency ( receiver_model . target_frequency ( ) ) ;
2023-09-11 00:04:20 +00:00
// Refresh status bar converter icon.
2023-06-23 23:13:39 +00:00
send_system_refresh ( ) ;
2023-05-18 20:16:05 +00:00
} ;
2023-06-23 23:13:39 +00:00
check_converter . set_value ( pmem : : config_converter ( ) ) ;
2023-05-18 20:16:05 +00:00
check_converter . on_select = [ this ] ( Checkbox & , bool v ) {
if ( v ) {
check_show_converter . set_value ( true ) ;
2023-06-23 23:13:39 +00:00
pmem : : set_ui_hide_converter ( false ) ;
2023-05-18 20:16:05 +00:00
}
2023-06-23 23:13:39 +00:00
pmem : : set_config_converter ( v ) ;
2023-09-11 00:04:20 +00:00
// Retune to take converter change in account.
2023-06-11 18:47:13 +00:00
receiver_model . set_target_frequency ( receiver_model . target_frequency ( ) ) ;
2023-09-11 00:04:20 +00:00
// Refresh status bar converter icon.
2023-06-23 23:13:39 +00:00
send_system_refresh ( ) ;
2023-05-18 20:16:05 +00:00
} ;
2023-09-11 00:04:20 +00:00
opt_converter_mode . set_by_value ( pmem : : config_updown_converter ( ) ) ;
opt_converter_mode . on_change = [ this ] ( size_t , OptionsField : : value_t v ) {
2023-06-23 23:13:39 +00:00
pmem : : set_config_updown_converter ( v ) ;
2023-09-11 00:04:20 +00:00
// Refresh status bar with up or down icon.
2023-06-23 23:13:39 +00:00
send_system_refresh ( ) ;
2023-05-18 20:16:05 +00:00
} ;
2023-09-11 00:04:20 +00:00
field_converter_freq . set_step ( 1'000'000 ) ;
field_converter_freq . set_value ( pmem : : config_converter_freq ( ) ) ;
field_converter_freq . on_change = [ this ] ( rf : : Frequency f ) {
pmem : : set_config_converter_freq ( f ) ;
// Retune to take converter change in account.
receiver_model . set_target_frequency ( receiver_model . target_frequency ( ) ) ;
} ;
field_converter_freq . on_edit = [ this , & nav ] ( ) {
auto new_view = nav . push < FrequencyKeypadView > ( field_converter_freq . value ( ) ) ;
new_view - > on_changed = [ this ] ( rf : : Frequency f ) {
field_converter_freq . set_value ( f ) ;
2023-05-18 20:16:05 +00:00
} ;
} ;
2023-05-20 07:30:08 +00:00
button_return . on_select = [ & nav , this ] ( Button & ) {
2023-05-18 20:16:05 +00:00
nav . pop ( ) ;
} ;
2023-05-20 07:30:08 +00:00
}
void SetConverterSettingsView : : focus ( ) {
button_return . focus ( ) ;
}
2023-06-23 23:13:39 +00:00
/* SetFrequencyCorrectionView ****************************/
2023-05-20 07:30:08 +00:00
SetFrequencyCorrectionView : : SetFrequencyCorrectionView ( NavigationView & nav ) {
2023-09-11 00:04:20 +00:00
add_children ( {
& labels ,
& opt_rx_correction_mode ,
& field_rx_correction ,
& opt_tx_correction_mode ,
& field_tx_correction ,
& button_return ,
} ) ;
opt_rx_correction_mode . set_by_value ( pmem : : config_freq_rx_correction_updown ( ) ) ;
opt_rx_correction_mode . on_change = [ this ] ( size_t , OptionsField : : value_t v ) {
2023-06-23 23:13:39 +00:00
pmem : : set_freq_rx_correction_updown ( v ) ;
2023-05-20 07:30:08 +00:00
} ;
2023-12-18 00:47:20 +00:00
opt_tx_correction_mode . set_by_value ( pmem : : config_freq_tx_correction_updown ( ) ) ;
2023-09-11 00:04:20 +00:00
opt_tx_correction_mode . on_change = [ this ] ( size_t , OptionsField : : value_t v ) {
2023-06-23 23:13:39 +00:00
pmem : : set_freq_tx_correction_updown ( v ) ;
2023-05-20 07:30:08 +00:00
} ;
2023-09-11 00:04:20 +00:00
field_rx_correction . set_step ( 100'000 ) ;
field_rx_correction . set_value ( pmem : : config_freq_rx_correction ( ) ) ;
field_rx_correction . on_change = [ this ] ( rf : : Frequency f ) {
pmem : : set_config_freq_rx_correction ( f ) ;
// Retune to take converter change in account.
receiver_model . set_target_frequency ( receiver_model . target_frequency ( ) ) ;
} ;
field_rx_correction . on_edit = [ this , & nav ] ( ) {
auto new_view = nav . push < FrequencyKeypadView > ( field_rx_correction . value ( ) ) ;
new_view - > on_changed = [ this ] ( rf : : Frequency f ) {
field_rx_correction . set_value ( f ) ;
2023-05-20 07:30:08 +00:00
} ;
} ;
2023-09-11 00:04:20 +00:00
field_tx_correction . set_step ( 100'000 ) ;
field_tx_correction . set_value ( pmem : : config_freq_tx_correction ( ) ) ;
field_tx_correction . on_change = [ this ] ( rf : : Frequency f ) {
pmem : : set_config_freq_tx_correction ( f ) ;
// Retune to take converter change in account. NB: receiver_model.
receiver_model . set_target_frequency ( receiver_model . target_frequency ( ) ) ;
} ;
field_tx_correction . on_edit = [ this , & nav ] ( ) {
auto new_view = nav . push < FrequencyKeypadView > ( field_tx_correction . value ( ) ) ;
new_view - > on_changed = [ this ] ( rf : : Frequency f ) {
field_tx_correction . set_value ( f ) ;
2023-05-20 07:30:08 +00:00
} ;
} ;
button_return . on_select = [ & nav , this ] ( Button & ) {
2023-05-18 20:16:05 +00:00
nav . pop ( ) ;
} ;
}
2023-05-20 07:30:08 +00:00
void SetFrequencyCorrectionView : : focus ( ) {
button_return . focus ( ) ;
2023-05-18 20:16:05 +00:00
}
2023-06-23 23:13:39 +00:00
/* SetPersistentMemoryView *******************************/
2023-05-18 20:16:05 +00:00
SetPersistentMemoryView : : SetPersistentMemoryView ( NavigationView & nav ) {
2023-09-11 00:04:20 +00:00
add_children ( {
& labels ,
& text_pmem_status ,
& check_use_sdcard_for_pmem ,
& button_save_mem_to_file ,
& button_load_mem_from_file ,
& button_load_mem_defaults ,
& button_return ,
} ) ;
text_pmem_status . set_style ( & Styles : : yellow ) ;
2023-05-18 20:16:05 +00:00
2023-06-23 23:13:39 +00:00
check_use_sdcard_for_pmem . set_value ( pmem : : should_use_sdcard_for_pmem ( ) ) ;
2023-06-04 19:25:25 +00:00
check_use_sdcard_for_pmem . on_select = [ this ] ( Checkbox & , bool v ) {
2023-05-18 20:16:05 +00:00
File pmem_flag_file_handle ;
if ( v ) {
2023-07-02 16:35:34 +00:00
if ( fs : : file_exists ( PMEM_FILEFLAG ) ) {
2023-09-11 00:04:20 +00:00
text_pmem_status . set ( " P.Mem flag file present. " ) ;
2023-07-02 16:35:34 +00:00
} else {
auto error = pmem_flag_file_handle . create ( PMEM_FILEFLAG ) ;
if ( error )
2023-09-11 00:04:20 +00:00
text_pmem_status . set ( " Error creating P.Mem File! " ) ;
2023-07-02 16:35:34 +00:00
else
2023-09-11 00:04:20 +00:00
text_pmem_status . set ( " P.Mem flag file created. " ) ;
2023-05-18 20:16:05 +00:00
}
} else {
2023-07-02 16:35:34 +00:00
auto result = delete_file ( PMEM_FILEFLAG ) ;
if ( result . code ( ) ! = FR_OK )
2023-09-11 00:04:20 +00:00
text_pmem_status . set ( " Error deleting P.Mem flag! " ) ;
2023-07-02 16:35:34 +00:00
else
2023-09-11 00:04:20 +00:00
text_pmem_status . set ( " P.Mem flag file deleted. " ) ;
2023-05-18 20:16:05 +00:00
}
} ;
button_save_mem_to_file . on_select = [ & nav , this ] ( Button & ) {
2023-07-02 16:35:34 +00:00
if ( ! pmem : : save_persistent_settings_to_file ( ) )
2023-09-11 00:04:20 +00:00
text_pmem_status . set ( " Error saving settings! " ) ;
2023-07-02 16:35:34 +00:00
else
2023-09-11 00:04:20 +00:00
text_pmem_status . set ( " Settings saved. " ) ;
2023-05-18 20:16:05 +00:00
} ;
button_load_mem_from_file . on_select = [ & nav , this ] ( Button & ) {
2023-06-23 23:13:39 +00:00
if ( ! pmem : : load_persistent_settings_from_file ( ) ) {
2023-09-11 00:04:20 +00:00
text_pmem_status . set ( " Error loading settings! " ) ;
2023-05-18 20:16:05 +00:00
} else {
2023-09-11 00:04:20 +00:00
text_pmem_status . set ( " Settings loaded. " ) ;
2023-05-18 20:16:05 +00:00
// Refresh status bar with icon up or down
2023-06-23 23:13:39 +00:00
send_system_refresh ( ) ;
2023-05-18 20:16:05 +00:00
}
} ;
button_load_mem_defaults . on_select = [ & nav , this ] ( Button & ) {
nav . push < ModalMessageView > (
" Warning! " ,
2023-09-11 00:04:20 +00:00
" This will reset the P.Mem \n to default settings. " ,
2023-05-18 20:16:05 +00:00
YESNO ,
[ this ] ( bool choice ) {
if ( choice ) {
2023-06-23 23:13:39 +00:00
pmem : : cache : : defaults ( ) ;
2023-05-18 20:16:05 +00:00
}
} ) ;
} ;
button_return . on_select = [ & nav , this ] ( Button & ) {
nav . pop ( ) ;
} ;
}
void SetPersistentMemoryView : : focus ( ) {
button_return . focus ( ) ;
}
2023-06-23 23:13:39 +00:00
/* SetAudioView ******************************************/
2023-05-18 20:16:05 +00:00
SetAudioView : : SetAudioView ( NavigationView & nav ) {
add_children ( { & labels ,
& field_tone_mix ,
& button_save ,
& button_cancel } ) ;
2023-06-23 23:13:39 +00:00
field_tone_mix . set_value ( pmem : : tone_mix ( ) ) ;
2023-05-18 20:16:05 +00:00
button_save . on_select = [ & nav , this ] ( Button & ) {
2023-06-23 23:13:39 +00:00
pmem : : set_tone_mix ( field_tone_mix . value ( ) ) ;
2023-06-19 19:06:07 +00:00
audio : : output : : update_audio_mute ( ) ;
2023-05-18 20:16:05 +00:00
nav . pop ( ) ;
} ;
button_cancel . on_select = [ & nav , this ] ( Button & ) {
nav . pop ( ) ;
} ;
}
void SetAudioView : : focus ( ) {
button_save . focus ( ) ;
}
2023-06-23 23:13:39 +00:00
/* SetQRCodeView *****************************************/
2023-05-18 20:16:05 +00:00
SetQRCodeView : : SetQRCodeView ( NavigationView & nav ) {
2023-09-11 00:04:20 +00:00
add_children ( {
& labels ,
& checkbox_bigger_qr ,
& button_save ,
& button_cancel ,
} ) ;
2023-05-18 20:16:05 +00:00
2023-06-23 23:13:39 +00:00
checkbox_bigger_qr . set_value ( pmem : : show_bigger_qr_code ( ) ) ;
2023-05-18 20:16:05 +00:00
button_save . on_select = [ & nav , this ] ( Button & ) {
2023-06-23 23:13:39 +00:00
pmem : : set_show_bigger_qr_code ( checkbox_bigger_qr . value ( ) ) ;
2023-05-18 20:16:05 +00:00
nav . pop ( ) ;
} ;
button_cancel . on_select = [ & nav , this ] ( Button & ) {
nav . pop ( ) ;
} ;
}
void SetQRCodeView : : focus ( ) {
button_save . focus ( ) ;
}
2023-06-23 23:13:39 +00:00
/* SetEncoderDialView ************************************/
Support for Rotary Encoder Dial sensitivity levels, issue #965 (#1057)
* Support for 3 levels of rotary encoder sensitivity #965
Backend support; UI will still need to call set function to configure.
* Support for 3 levels of rotary encoder sensitivity #965
Backend support only. UI will still need to be changed to call the set_sensitivity() function to configure.
* Removed trailing space
* Deleted blank lines to see if format checker will be happier
* Simpler support for multiple levels of encoder sensitivity, for issue #965
Removed the convoluted code :-) and instead just using a 2-dimensional array to choose which transition map to use. For now I only have 2 (vs 3) levels enabled as well, to save code space and because high-sensitivity is very touchy.
* Simpler version of configurable encoder sensitivity, issue #965
* Formatting
* Formatting test for Clang
* Formatting test
* Formatting (removed helpful comment)
* Formatting test (remove commented-out code)
* Formatting & swapping medium/low so default mode=0
* Swapped medium/low so default mode=0
* Adding UI & PMEM support to make encoder dial sensitivity configurable, issue #965
* Adding UI & PMEM support to make encoder dial sensitivity configurable, issue #965
* Adding UI & PMEM support to make encoder dial sensitivity configurable, issue #965
* Adding UI & PMEM support to make encoder dial sensitivity configurable, issue #965
* Adding UI & PMEM support to make encoder dial sensitivity configurable, issue #965
* Adding UI & PMEM support to make encoder dial sensitivity configurable, issue #965
* Removed unneeded range check (trusting in pmem checksum)
2023-05-25 02:32:12 +00:00
SetEncoderDialView : : SetEncoderDialView ( NavigationView & nav ) {
add_children ( { & labels ,
& field_encoder_dial_sensitivity ,
& button_save ,
& button_cancel } ) ;
2023-06-23 23:13:39 +00:00
field_encoder_dial_sensitivity . set_by_value ( pmem : : config_encoder_dial_sensitivity ( ) ) ;
Support for Rotary Encoder Dial sensitivity levels, issue #965 (#1057)
* Support for 3 levels of rotary encoder sensitivity #965
Backend support; UI will still need to call set function to configure.
* Support for 3 levels of rotary encoder sensitivity #965
Backend support only. UI will still need to be changed to call the set_sensitivity() function to configure.
* Removed trailing space
* Deleted blank lines to see if format checker will be happier
* Simpler support for multiple levels of encoder sensitivity, for issue #965
Removed the convoluted code :-) and instead just using a 2-dimensional array to choose which transition map to use. For now I only have 2 (vs 3) levels enabled as well, to save code space and because high-sensitivity is very touchy.
* Simpler version of configurable encoder sensitivity, issue #965
* Formatting
* Formatting test for Clang
* Formatting test
* Formatting (removed helpful comment)
* Formatting test (remove commented-out code)
* Formatting & swapping medium/low so default mode=0
* Swapped medium/low so default mode=0
* Adding UI & PMEM support to make encoder dial sensitivity configurable, issue #965
* Adding UI & PMEM support to make encoder dial sensitivity configurable, issue #965
* Adding UI & PMEM support to make encoder dial sensitivity configurable, issue #965
* Adding UI & PMEM support to make encoder dial sensitivity configurable, issue #965
* Adding UI & PMEM support to make encoder dial sensitivity configurable, issue #965
* Adding UI & PMEM support to make encoder dial sensitivity configurable, issue #965
* Removed unneeded range check (trusting in pmem checksum)
2023-05-25 02:32:12 +00:00
button_save . on_select = [ & nav , this ] ( Button & ) {
2023-06-23 23:13:39 +00:00
pmem : : set_encoder_dial_sensitivity ( field_encoder_dial_sensitivity . selected_index_value ( ) ) ;
Support for Rotary Encoder Dial sensitivity levels, issue #965 (#1057)
* Support for 3 levels of rotary encoder sensitivity #965
Backend support; UI will still need to call set function to configure.
* Support for 3 levels of rotary encoder sensitivity #965
Backend support only. UI will still need to be changed to call the set_sensitivity() function to configure.
* Removed trailing space
* Deleted blank lines to see if format checker will be happier
* Simpler support for multiple levels of encoder sensitivity, for issue #965
Removed the convoluted code :-) and instead just using a 2-dimensional array to choose which transition map to use. For now I only have 2 (vs 3) levels enabled as well, to save code space and because high-sensitivity is very touchy.
* Simpler version of configurable encoder sensitivity, issue #965
* Formatting
* Formatting test for Clang
* Formatting test
* Formatting (removed helpful comment)
* Formatting test (remove commented-out code)
* Formatting & swapping medium/low so default mode=0
* Swapped medium/low so default mode=0
* Adding UI & PMEM support to make encoder dial sensitivity configurable, issue #965
* Adding UI & PMEM support to make encoder dial sensitivity configurable, issue #965
* Adding UI & PMEM support to make encoder dial sensitivity configurable, issue #965
* Adding UI & PMEM support to make encoder dial sensitivity configurable, issue #965
* Adding UI & PMEM support to make encoder dial sensitivity configurable, issue #965
* Adding UI & PMEM support to make encoder dial sensitivity configurable, issue #965
* Removed unneeded range check (trusting in pmem checksum)
2023-05-25 02:32:12 +00:00
nav . pop ( ) ;
} ;
button_cancel . on_select = [ & nav , this ] ( Button & ) {
nav . pop ( ) ;
} ;
}
void SetEncoderDialView : : focus ( ) {
button_save . focus ( ) ;
}
2023-06-23 23:13:39 +00:00
/* SettingsMenuView **************************************/
2023-05-18 20:16:05 +00:00
SettingsMenuView : : SettingsMenuView ( NavigationView & nav ) {
2023-06-23 23:13:39 +00:00
if ( pmem : : show_gui_return_icon ( ) ) {
2023-05-18 20:16:05 +00:00
add_items ( { { " .. " , ui : : Color : : light_grey ( ) , & bitmap_icon_previous , [ & nav ] ( ) { nav . pop ( ) ; } } } ) ;
}
add_items ( {
{ " Audio " , ui : : Color : : dark_cyan ( ) , & bitmap_icon_speaker , [ & nav ] ( ) { nav . push < SetAudioView > ( ) ; } } ,
{ " Calibration " , ui : : Color : : dark_cyan ( ) , & bitmap_icon_options_touch , [ & nav ] ( ) { nav . push < TouchCalibrationView > ( ) ; } } ,
{ " Converter " , ui : : Color : : dark_cyan ( ) , & bitmap_icon_options_radio , [ & nav ] ( ) { nav . push < SetConverterSettingsView > ( ) ; } } ,
2023-09-18 21:22:46 +00:00
{ " Date/Time " , ui : : Color : : dark_cyan ( ) , & bitmap_icon_options_datetime , [ & nav ] ( ) { nav . push < SetDateTimeView > ( ) ; } } ,
{ " Encoder Dial " , ui : : Color : : dark_cyan ( ) , & bitmap_icon_setup , [ & nav ] ( ) { nav . push < SetEncoderDialView > ( ) ; } } ,
2023-09-11 00:04:20 +00:00
{ " Freq. Correct " , ui : : Color : : dark_cyan ( ) , & bitmap_icon_options_radio , [ & nav ] ( ) { nav . push < SetFrequencyCorrectionView > ( ) ; } } ,
2023-05-18 20:16:05 +00:00
{ " P.Memory Mgmt " , ui : : Color : : dark_cyan ( ) , & bitmap_icon_memory , [ & nav ] ( ) { nav . push < SetPersistentMemoryView > ( ) ; } } ,
2023-09-18 21:22:46 +00:00
{ " QR Code " , ui : : Color : : dark_cyan ( ) , & bitmap_icon_qr_code , [ & nav ] ( ) { nav . push < SetQRCodeView > ( ) ; } } ,
{ " Radio " , ui : : Color : : dark_cyan ( ) , & bitmap_icon_options_radio , [ & nav ] ( ) { nav . push < SetRadioView > ( ) ; } } ,
{ " User Interface " , ui : : Color : : dark_cyan ( ) , & bitmap_icon_options_ui , [ & nav ] ( ) { nav . push < SetUIView > ( ) ; } } ,
2023-11-19 14:08:29 +00:00
{ " SD Card " , ui : : Color : : dark_cyan ( ) , & bitmap_icon_sdcard , [ & nav ] ( ) { nav . push < SetSDCardView > ( ) ; } } ,
2023-05-18 20:16:05 +00:00
} ) ;
set_max_rows ( 2 ) ; // allow wider buttons
}
2015-07-08 15:39:24 +00:00
} /* namespace ui */