diff --git a/mkapp/app/setting.ini b/mkapp/app/setting.ini index 60b6e0ccb..a6335325a 100644 --- a/mkapp/app/setting.ini +++ b/mkapp/app/setting.ini @@ -18,7 +18,7 @@ warning_type=2 cell_count_mode=0 cell_count = 2 osd_display_mode = 0 -power_ana_rx = 1 +external_analog_power_auto = 1 [source] analog_channel=32 diff --git a/src/core/app_state.c b/src/core/app_state.c index 063a1acba..b91e50a7e 100644 --- a/src/core/app_state.c +++ b/src/core/app_state.c @@ -89,6 +89,8 @@ void app_switch_to_analog(bool is_av_in) { if (is_av_in) { rtc6715.init(0, 0); + } else if (g_setting.source.analog_module == SETTING_SOURCES_ANALOG_MODULE_EXTERNAL) { + rtc6715.init(0, 0); } else { rtc6715.init(1, g_setting.record.audio_source == SETTING_RECORD_AUDIO_SOURCE_AV_IN); rtc6715.set_ch(g_setting.source.analog_channel - 1); diff --git a/src/core/ht.c b/src/core/ht.c index 94f7fb5c8..7e43f8675 100644 --- a/src/core/ht.c +++ b/src/core/ht.c @@ -25,6 +25,8 @@ #include "ui/page_common.h" #include "util/math.h" +uint8_t oled_is_sleep = 0; + // #define FAST_SIM typedef enum { OLED_MD_DETECTING, // regular operation, oled on @@ -108,6 +110,7 @@ static void detect_motion(bool is_moving) { cnt++; if (cnt == MOTION_DUR_1MINUTE) { // 1-min + oled_is_sleep = 1; LOGI("OLED OFF for protection."); beep(); hw_screen_on(0); // Turn of display @@ -143,9 +146,14 @@ static void detect_motion(bool is_moving) { DM6302_SetChannel(g_setting.source.hdzero_band, ch & 0x7F); } if (g_hw_stat.source_mode == SOURCE_MODE_AV) { - rtc6715.init(1, g_setting.record.audio_source == SETTING_RECORD_AUDIO_SOURCE_AV_IN); + if (g_setting.source.analog_module == SETTING_SOURCES_ANALOG_MODULE_INTERNAL) { + rtc6715.init(1, g_setting.record.audio_source == SETTING_RECORD_AUDIO_SOURCE_AV_IN); + rtc6715.set_ch(g_setting.source.analog_channel - 1); + } else { + } } + oled_is_sleep = 0; LOGI("OLED ON from protection."); screen.brightness(g_setting.image.oled); diff --git a/src/core/ht.h b/src/core/ht.h index d757a83b3..e5523c18c 100644 --- a/src/core/ht.h +++ b/src/core/ht.h @@ -60,6 +60,8 @@ void ht_set_center_position(); int16_t *ht_get_channels(); void head_alarm_init(); +extern uint8_t oled_is_sleep; + #ifdef __cplusplus } #endif diff --git a/src/core/main.c b/src/core/main.c index 01b4ae304..c832774a4 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -214,9 +214,6 @@ int main(int argc, char *argv[]) { // 8. Synthetic counter for gif refresh gif_cnt = 0; - // 8.1 set initial analog module power state - Analog_Module_Power(0); - // Head alarm head_alarm_init(); diff --git a/src/core/settings.c b/src/core/settings.c index b2245972c..90ca2278d 100644 --- a/src/core/settings.c +++ b/src/core/settings.c @@ -42,7 +42,7 @@ const setting_t g_setting_defaults = { .cell_count_mode = SETTING_POWER_CELL_COUNT_MODE_AUTO, .cell_count = 2, .osd_display_mode = SETTING_POWER_OSD_DISPLAY_MODE_TOTAL, - .power_ana = false, + .external_analog_power_auto = true, .calibration_offset = 0, }, .record = { @@ -226,6 +226,12 @@ const setting_t g_setting_defaults = { }, .source = { .analog_channel = 33, // R1 +#ifdef HDZGOGGLE + // Note Goggle V1 doesn't support internal analog module + .analog_module = SETTING_SOURCES_ANALOG_MODULE_EXTERNAL, +#else + .analog_module = SETTING_SOURCES_ANALOG_MODULE_INTERNAL, +#endif .analog_format = SETTING_SOURCES_ANALOG_FORMAT_NTSC, .analog_ratio = SETTING_SOURCES_ANALOG_RATIO_4_3, .hdzero_band = SETTING_SOURCES_HDZERO_BAND_RACEBAND, @@ -353,6 +359,7 @@ void settings_load(void) { // source g_setting.source.analog_format = ini_getl("source", "analog_format", g_setting_defaults.source.analog_format, SETTING_INI); + g_setting.source.analog_module = ini_getl("source", "analog_module", g_setting_defaults.source.analog_module, SETTING_INI); g_setting.source.analog_ratio = ini_getl("source", "analog_ratio", g_setting_defaults.source.analog_ratio, SETTING_INI); g_setting.source.hdzero_band = ini_getl("source", "hdzero_band", g_setting_defaults.source.hdzero_band, SETTING_INI); g_setting.source.hdzero_bw = ini_getl("source", "hdzero_bw", g_setting_defaults.source.hdzero_bw, SETTING_INI); @@ -414,7 +421,7 @@ void settings_load(void) { g_setting.power.cell_count_mode = ini_getl("power", "cell_count_mode", g_setting_defaults.power.cell_count_mode, SETTING_INI); g_setting.power.cell_count = ini_getl("power", "cell_count", g_setting_defaults.power.cell_count, SETTING_INI); g_setting.power.osd_display_mode = ini_getl("power", "osd_display_mode", g_setting_defaults.power.osd_display_mode, SETTING_INI); - g_setting.power.power_ana = ini_getl("power", "power_ana_rx", g_setting_defaults.power.power_ana, SETTING_INI); + g_setting.power.external_analog_power_auto = ini_getl("power", "external_analog_power_auto", g_setting_defaults.power.external_analog_power_auto, SETTING_INI); g_setting.power.calibration_offset = ini_getl("power", "calibration_offset_mv", g_setting_defaults.power.calibration_offset, SETTING_INI); // record diff --git a/src/core/settings.h b/src/core/settings.h index 3965a2bf8..f323b50fb 100644 --- a/src/core/settings.h +++ b/src/core/settings.h @@ -74,7 +74,7 @@ typedef struct { setting_power_cell_count_mode_t cell_count_mode; int cell_count; setting_power_osd_display_mode_t osd_display_mode; - bool power_ana; + bool external_analog_power_auto; int calibration_offset; } setting_power_t; diff --git a/src/core/sleep_mode.c b/src/core/sleep_mode.c index 4b3f6b000..710fb876b 100644 --- a/src/core/sleep_mode.c +++ b/src/core/sleep_mode.c @@ -39,9 +39,6 @@ void go_sleep() { HDZero_Close(); // Turn off Analog Receiver - if (getHwRevision() == HW_REV_2) { - DM5680_ExternalAnalog_Power(1); - } rtc6715.init(0, 0); // Minimum fan @@ -65,7 +62,6 @@ void wake_up() { isSleeping = false; hw_screen_on(1); // Turn on display - Analog_Module_Power(1); g_setting.fans.right_speed = fan_speed_save.right; g_setting.fans.left_speed = fan_speed_save.left; fans_right_setspeed(fan_speed_save.right); diff --git a/src/core/thread.c b/src/core/thread.c index d9f528973..b0755763a 100644 --- a/src/core/thread.c +++ b/src/core/thread.c @@ -244,6 +244,13 @@ static void *thread_peripheral(void *ptr) { return NULL; } +static void *thread_external_analog_module_power(void *ptr) { + while (1) { + external_analog_module_power(); + usleep(10 * 1000); + } +} + ////////////////////////////////////////////////////////////////////// // local static threads_obj_t threads_obj; @@ -253,6 +260,7 @@ static void threads_instance(threads_obj_t *obj) { obj->instance[1] = thread_version; obj->instance[2] = thread_osd; obj->instance[3] = thread_rtc6715_rssi; + obj->instance[4] = thread_external_analog_module_power; } int create_threads() { diff --git a/src/core/thread.h b/src/core/thread.h index 2f456173f..54658cce4 100644 --- a/src/core/thread.h +++ b/src/core/thread.h @@ -8,7 +8,7 @@ extern "C" { #include #define THREAD_COUNT_MAX (10) -#define THREAD_COUNT (4) +#define THREAD_COUNT (5) typedef void *(*fun_thread_instance_t)(void *params); diff --git a/src/driver/dm5680.c b/src/driver/dm5680.c index 75088d578..36b815168 100644 --- a/src/driver/dm5680.c +++ b/src/driver/dm5680.c @@ -325,9 +325,9 @@ void DM5680_ResetHDMI_RX(uint8_t on) // Reset HDMI_RX,0=reset void DM5680_ExternalAnalog_Power(uint8_t on) { uint8_t Cmd[5] = {0xAA, 0x55, 0x02, 0x6, 0x00}; - // Note Cmd[4] = 0 means power on for external analog module - Cmd[4] = !on; - // LOGI("DM5680_ExternalAnalog_Power %d", on); + // Note Cmd[4] = 1 means power on for external analog module + Cmd[4] = on; + // LOGI("DM5680_ExternalAnalog_Power %d", on); Cmd_to_DM5680(1, Cmd, 5); } void DM5680_InternalAnalog_Power(uint8_t on) { diff --git a/src/driver/hardware-boxpro.c b/src/driver/hardware-boxpro.c index 3409a9f3b..d4b5514c0 100644 --- a/src/driver/hardware-boxpro.c +++ b/src/driver/hardware-boxpro.c @@ -1022,7 +1022,7 @@ void Set_HT_dat(uint16_t ch0, uint16_t ch1, uint16_t ch2) { I2C_Write(ADDR_FPGA, 0x77, (ch2 >> 8) & 0xff); } -void Analog_Module_Power(bool ForceSet) { +void external_analog_module_power() { } int Get_VideoLatancy_status() // ret: 0=unlocked, 1=locked diff --git a/src/driver/hardware-goggle.c b/src/driver/hardware-goggle.c index 585092fcd..d2cc56240 100644 --- a/src/driver/hardware-goggle.c +++ b/src/driver/hardware-goggle.c @@ -12,6 +12,7 @@ #include "../core/app_state.h" #include "../core/common.hh" +#include "../core/ht.h" #include "../core/osd.h" #include "../core/settings.h" #include "../ui/page_common.h" @@ -1185,23 +1186,26 @@ void Set_HT_dat(uint16_t ch0, uint16_t ch1, uint16_t ch2) { I2C_Write(ADDR_FPGA, 0x77, (ch2 >> 8) & 0xff); } -void Analog_Module_Power(bool ForceSet) { +void external_analog_module_power() { // Batch 2 goggles only if (getHwRevision() >= HW_REV_2) { - static bool Analog_Module_Power_State = 0; - static bool Analog_Module_Power_State_Last = 0; - if (g_setting.power.power_ana == 0) { - Analog_Module_Power_State = 0; + static bool pwr = 0; + static bool pwr_last = -1; + + if (g_app_state == APP_STATE_SLEEP) { // go sleep + pwr = 0; + } else if (oled_is_sleep == 1) { // oled off + pwr = 0; + } else if (g_setting.power.external_analog_power_auto == 0) { // always on + pwr = 1; } else { - if (g_source_info.source != SOURCE_AV_MODULE) { - Analog_Module_Power_State = 1; - } else { - Analog_Module_Power_State = 0; - } + pwr = (g_source_info.source == SOURCE_AV_MODULE) && + (g_setting.source.analog_module == SETTING_SOURCES_ANALOG_MODULE_EXTERNAL); } - if ((Analog_Module_Power_State_Last != Analog_Module_Power_State) || (ForceSet == 1)) { - Analog_Module_Power_State_Last = Analog_Module_Power_State; - DM5680_ExternalAnalog_Power(Analog_Module_Power_State); + + if (pwr_last != pwr) { + pwr_last = pwr; + DM5680_ExternalAnalog_Power(pwr); } } } diff --git a/src/driver/hardware-goggle2.c b/src/driver/hardware-goggle2.c index 1dda8993c..3cef6771e 100755 --- a/src/driver/hardware-goggle2.c +++ b/src/driver/hardware-goggle2.c @@ -12,6 +12,7 @@ #include "../core/app_state.h" #include "../core/common.hh" +#include "../core/ht.h" #include "../core/osd.h" #include "../core/settings.h" #include "../ui/page_common.h" @@ -1161,23 +1162,26 @@ void Set_HT_dat(uint16_t ch0, uint16_t ch1, uint16_t ch2) { I2C_Write(ADDR_FPGA, 0x77, (ch2 >> 8) & 0xff); } -void Analog_Module_Power(bool ForceSet) { +void external_analog_module_power() { // Batch 2 goggles only if (getHwRevision() >= HW_REV_2) { - static bool Analog_Module_Power_State = 0; - static bool Analog_Module_Power_State_Last = 0; - if (g_setting.power.power_ana == 0) { - Analog_Module_Power_State = 0; + static int pwr = 0; + static int pwr_last = -1; + + if (g_app_state == APP_STATE_SLEEP) { // go sleep + pwr = 0; + } else if (oled_is_sleep == 1) { // oled off + pwr = 0; + } else if (g_setting.power.external_analog_power_auto == 0) { // always on + pwr = 1; } else { - if (g_source_info.source != SOURCE_AV_MODULE) { - Analog_Module_Power_State = 1; - } else { - Analog_Module_Power_State = 0; - } + pwr = (g_source_info.source == SOURCE_AV_MODULE) && + (g_setting.source.analog_module == SETTING_SOURCES_ANALOG_MODULE_EXTERNAL); } - if ((Analog_Module_Power_State_Last != Analog_Module_Power_State) || (ForceSet == 1)) { - Analog_Module_Power_State_Last = Analog_Module_Power_State; - DM5680_ExternalAnalog_Power(Analog_Module_Power_State); + + if (pwr_last != pwr) { + pwr_last = pwr; + DM5680_ExternalAnalog_Power(pwr); } } } diff --git a/src/driver/hardware.h b/src/driver/hardware.h index 40c9e234b..5ff30b93a 100644 --- a/src/driver/hardware.h +++ b/src/driver/hardware.h @@ -105,7 +105,7 @@ void Set_Saturation(uint8_t sat); void Set_HT_status(uint8_t is_open, uint8_t frame_period, uint8_t sync_len); void Set_HT_dat(uint16_t ch0, uint16_t ch1, uint16_t ch2); -void Analog_Module_Power(bool Force); +void external_analog_module_power(); int HDZERO_detect(); int AV_in_detect(); diff --git a/src/ui/page_analog_rssi.c b/src/ui/page_analog_rssi.c index 94f0f523d..0c370dd6e 100644 --- a/src/ui/page_analog_rssi.c +++ b/src/ui/page_analog_rssi.c @@ -92,7 +92,7 @@ static lv_obj_t *page_analog_rssi_create(lv_obj_t *parent, panel_arr_t *arr) { static void on_enter() { rtc6715.init(1, 0); - rtc6715.set_ch(33); // R1 + rtc6715.set_ch(32); // R1 } static void on_exit() { diff --git a/src/ui/page_power.c b/src/ui/page_power.c index baeb974bf..cd0e4900b 100644 --- a/src/ui/page_power.c +++ b/src/ui/page_power.c @@ -30,7 +30,7 @@ enum { ROW_CALIBRATION_OFFSET, ROW_OSD_DISPLAY_MODE, ROW_WARN_TYPE, - ROW_POWER_ANA, + ROW_EXTERNAL_ANALOG_POWER, ROW_BACK, ROW_COUNT @@ -126,7 +126,7 @@ static lv_obj_t *page_power_create(lv_obj_t *parent, panel_arr_t *arr) { #if defined(HDZGOGGLE) || defined(HDZGOGGLE2) if (getHwRevision() >= HW_REV_2) { - create_btn_group_item(&btn_group_power_ana, cont, 2, _lang("AnalogRX Power"), _lang("On"), _lang("Auto"), "", "", ROW_POWER_ANA); + create_btn_group_item(&btn_group_power_ana, cont, 2, _lang("AnalogRX Power"), _lang("On"), _lang("Auto"), "", "", ROW_EXTERNAL_ANALOG_POWER); pp_power.p_arr.max = ROW_COUNT; } else { pp_power.p_arr.max = ROW_COUNT - 1; @@ -160,7 +160,7 @@ static lv_obj_t *page_power_create(lv_obj_t *parent, panel_arr_t *arr) { lv_slider_set_value(slider_group_calibration_offset.slider, g_setting.power.calibration_offset, LV_ANIM_OFF); btn_group_set_sel(&btn_group_osd_display_mode, g_setting.power.osd_display_mode); btn_group_set_sel(&btn_group_warn_type, g_setting.power.warning_type); - btn_group_set_sel(&btn_group_power_ana, g_setting.power.power_ana); + btn_group_set_sel(&btn_group_power_ana, g_setting.power.external_analog_power_auto); page_power_update_cell_count(); page_power_update_calibration_offset(); @@ -335,14 +335,13 @@ static void page_power_on_click(uint8_t key, int sel) { ini_putl("power", "warning_type", g_setting.power.warning_type, SETTING_INI); break; - case ROW_POWER_ANA: + case ROW_EXTERNAL_ANALOG_POWER: // Batch 2 goggles only if (getHwRevision() >= HW_REV_2) { #if defined(HDZGOGGLE) || defined(HDZGOGGLE2) btn_group_toggle_sel(&btn_group_power_ana); - g_setting.power.power_ana = btn_group_get_sel(&btn_group_power_ana); - ini_putl("power", "power_ana_rx", g_setting.power.power_ana, SETTING_INI); - Analog_Module_Power(1); + g_setting.power.external_analog_power_auto = btn_group_get_sel(&btn_group_power_ana); + ini_putl("power", "external_analog_power_auto", g_setting.power.external_analog_power_auto, SETTING_INI); #endif } break; diff --git a/src/ui/page_source.c b/src/ui/page_source.c index 9f22323c6..b34151650 100644 --- a/src/ui/page_source.c +++ b/src/ui/page_source.c @@ -290,7 +290,6 @@ void source_toggle() { page_source_select_hdzero(); break; } - Analog_Module_Power(0); } void source_cycle() { @@ -313,7 +312,6 @@ void source_cycle() { page_source_select_av_in(); break; } - Analog_Module_Power(0); } static void page_source_on_click(uint8_t key, int sel) { @@ -371,7 +369,6 @@ static void page_source_on_click(uint8_t key, int sel) { } break; } - Analog_Module_Power(0); } static void page_source_enter() {