diff --git a/sa_core.c b/sa_core.c index 1e23944..2404017 100644 --- a/sa_core.c +++ b/sa_core.c @@ -3563,7 +3563,7 @@ again: // Spur redu } else #endif if (get_sweep_frequency(ST_SPAN)<500000) - ADF4351_R_counter(3); + ADF4351_R_counter(3); // To avoid PLL Loop shoulders else ADF4351_R_counter(1); } @@ -4639,6 +4639,9 @@ static volatile int dummy; int delta = 0; int target_level = AUTO_TARGET_LEVEL; #ifdef TINYSA4 + freq_t min_target_freq = get_sweep_frequency(ST_START); + if (min_target_freq > 30000000) // 30M and lower has zero correction + target_level += PURE_TO_float(get_frequency_correction(min_target_freq)); if (setting.extra_lna) target_level = LNA_AUTO_TARGET_LEVEL; #endif diff --git a/ui.c b/ui.c index b98ff00..4263a59 100644 --- a/ui.c +++ b/ui.c @@ -1045,7 +1045,13 @@ draw_numeric_input(const char *buf) { uint16_t i; uint16_t x = 10 + 10 * FONT_WIDTH + 4; - uint16_t xsim = (0b00100100100100100 >>(2-(period_pos()%3)))&(~1); + uint16_t xsim; +#ifdef __USE_RTC__ + if (keypad_mode == KM_RTC_DATE || keypad_mode == KM_RTC_TIME) + xsim = 0b01010100; + else +#endif + xsim = (0b00100100100100100 >>(2-(period_pos()%3)))&(~1); ili9341_set_foreground(LCD_INPUT_TEXT_COLOR); ili9341_set_background(LCD_INPUT_BG_COLOR); for (i = 0; buf[i]; i++) { @@ -2103,7 +2109,7 @@ void close_file(FRESULT res) res = f_close(fs_file); // time = chVTGetSystemTimeX() - time; // shell_printf("Total time: %dms (write %d byte/sec)\r\n", time/10, (LCD_WIDTH*LCD_HEIGHT*sizeof(uint16_t)+sizeof(bmp_header_v4))*10000/time); - drawMessageBox("Save", res == FR_OK ? fs_filename : " Write failed ", 2000); + drawMessageBox("Save:", res == FR_OK ? fs_filename : " Write failed ", 2000); redraw_request|= REDRAW_AREA; } static bool diff --git a/ui_sa.c b/ui_sa.c index a606412..5178ce2 100644 --- a/ui_sa.c +++ b/ui_sa.c @@ -441,6 +441,10 @@ enum { #ifdef TINYSA4 KM_DIRECT_START, KM_DIRECT_STOP, +#ifdef __USE_RTC__ + KM_RTC_DATE, + KM_RTC_TIME, +#endif #endif KM_NONE // always at enum end }; @@ -509,6 +513,10 @@ static const struct { #ifdef TINYSA4 [KM_DIRECT_START] = {keypads_freq , "DIRECT\nSTART"}, // KM_DIRECT_START [KM_DIRECT_STOP] = {keypads_freq , "DIRECT\nSTOP"}, // KM_DIRECT_STOP +#ifdef __USE_RTC__ +[KM_RTC_DATE] = {keypads_positive , "SET DATE\n YYMMDD"}, // Date +[KM_RTC_TIME] = {keypads_positive , "SET TIME\n HHMMSS"}, // Time +#endif #endif }; @@ -2881,6 +2889,15 @@ const menuitem_t menu_touch[] = { { MT_NONE, 0, NULL, menu_back} // next-> menu_back }; +#ifdef __USE_RTC__ +const menuitem_t menu_date_time[] = { + { MT_KEYPAD, KM_RTC_TIME, "SET TIME\n\b%s", 0 }, // MUST BE BEFORE DATE + { MT_KEYPAD, KM_RTC_DATE, "SET DATE\n\b%s", 0 }, + { MT_NONE, 0, NULL, menu_back} // next-> menu_back +}; +#endif + + static const menuitem_t menu_config[] = { { MT_SUBMENU, 0, "TOUCH", menu_touch}, { MT_CALLBACK, CONFIG_MENUITEM_SELFTEST, "SELF TEST", menu_config_cb}, @@ -2896,6 +2913,9 @@ static const menuitem_t menu_config[] = { #endif #ifdef __LCD_BRIGHTNESS__ { MT_CALLBACK, 0, "BRIGHTNESS", menu_brightness_cb}, +#endif +#ifdef __USE_RTC__ + { MT_SUBMENU, 0, "DATE\nTIME", menu_date_time}, #endif { MT_SUBMENU, 0, "EXPERT\nCONFIG", menu_settings}, #ifndef TINYSA4 @@ -3282,6 +3302,26 @@ static void fetch_numeric_target(uint8_t mode) uistat.value = config.noise_figure; plot_printf(uistat.text, sizeof uistat.text, "%.1fdB", uistat.value); break; +#endif +#ifdef __USE_RTC__ + case KM_RTC_TIME: + { + uint32_t tr = rtc_get_tr_bin(); // TR read first + plot_printf(uistat.text, sizeof uistat.text, "%02d:%02d:%02d", + RTC_TR_HOUR(dr), + RTC_TR_MIN(dr), + RTC_TR_SEC(dr)); + } + break; + case KM_RTC_DATE: + { + uint32_t dr = rtc_get_dr_bin(); // DR read second + plot_printf(uistat.text, sizeof uistat.text, "20%02d/%02d/%02d", + RTC_DR_YEAR(dr), + RTC_DR_MONTH(dr), + RTC_DR_DAY(dr)); + } + break; #endif } } @@ -3471,6 +3511,47 @@ set_numeric_value(void) dirty = true; break; #endif +#ifdef __USE_RTC__ + case KM_RTC_DATE: + case KM_RTC_TIME: + { + int i = 0; + uint32_t dt_buf[2]; + dt_buf[0] = rtc_get_tr_bcd(); // TR should be read first for sync + dt_buf[1] = rtc_get_dr_bcd(); // DR should be read second + // 0 1 2 4 5 6 + // time[] ={sec, min, hr, 0, day, month, year, 0} + uint8_t *time = (uint8_t*)dt_buf; + for (; i < 6 && kp_buf[i]!=0; i++) kp_buf[i]-= '0'; + for (; i < 6 ; i++) kp_buf[i] = 0; + for (i = 0; i < 3; i++) kp_buf[i] = (kp_buf[2*i]<<4) | kp_buf[2*i+1]; // BCD format + if (keypad_mode == KM_RTC_DATE) { + // Month limit 1 - 12 (in BCD) + if (kp_buf[1] < 1) kp_buf[1] = 1; + else if (kp_buf[1] > 0x12) kp_buf[1] = 0x12; + // Day limit (depend from month): + uint8_t day_max = 28 + ((0b11101100000000000010111110111011001100>>(kp_buf[1]<<1))&3); + day_max = ((day_max/10)<<4)|(day_max%10); // to BCD + if (kp_buf[2] < 1) kp_buf[2] = 1; + else if (kp_buf[2] > day_max) kp_buf[2] = day_max; + time[6] = kp_buf[0]; // year + time[5] = kp_buf[1]; // month + time[4] = kp_buf[2]; // day + } + else { + // Hour limit 0 - 23, min limit 0 - 59, sec limit 0 - 59 (in BCD) + if (kp_buf[0] > 0x23) kp_buf[0] = 0x23; + if (kp_buf[1] > 0x59) kp_buf[1] = 0x59; + if (kp_buf[2] > 0x59) kp_buf[2] = 0x59; + time[2] = kp_buf[0]; // hour + time[1] = kp_buf[1]; // min + time[0] = kp_buf[2]; // sec + } + rtc_set_time(dt_buf[1], dt_buf[0]); + } + break; +#endif + } }