From ed1dfed942868e9b4e21081886731bf8cdeffe89 Mon Sep 17 00:00:00 2001 From: erikkaashoek Date: Thu, 30 May 2024 13:25:50 +0200 Subject: [PATCH] external_gain in backup --- main.c | 60 ++++++++++++++++++++++++++++--------------------------- nanovna.h | 35 ++++++++++++++++++++------------ 2 files changed, 53 insertions(+), 42 deletions(-) diff --git a/main.c b/main.c index 45f67e2..8337659 100644 --- a/main.c +++ b/main.c @@ -156,36 +156,37 @@ static THD_FUNCTION(Thread1, arg) // START_PROFILE if (sweep_mode&(SWEEP_ENABLE|SWEEP_ONCE)) { backup_t b; - b.frequency0 = setting.frequency0; - b.frequency1 = setting.frequency1; + b.data.frequency0 = setting.frequency0; + b.data.frequency1 = setting.frequency1; if (setting.auto_attenuation) - b.attenuation = 0; + b.data.attenuation = 0; else - b.attenuation = setting.attenuate_x2+1; + b.data.attenuation = setting.attenuate_x2+1; + b.data.external_gain = setting.external_gain*2; if (setting.auto_reflevel || setting.unit != U_DBM) - b.reflevel = 0; + b.data.reflevel = 0; else - b.reflevel = setting.reflevel + 140; + b.data.reflevel = setting.reflevel + 140; if (setting.rbw_x10 == 0) - b.RBW = 0; + b.data.RBW = 0; else #ifdef TINYSA4 - b.RBW = SI4463_rbw_selected+1; + b.data.RBW = SI4463_rbw_selected+1; #else - b.RBW = SI4432_rbw_selected+1; + b.data.RBW = SI4432_rbw_selected+1; #endif - b.mode = setting.mode; - b.checksum = 0; + b.data.mode = setting.mode; + b.data.checksum = 0; uint8_t *c = (uint8_t *)&b; int ci = sizeof(backup_t)-1; // Exclude checksum uint8_t checksum = 0x55; while (ci--) { checksum ^= *c++; } - b.checksum = checksum; + b.data.checksum = checksum; uint32_t *f = (uint32_t *)&b; uint32_t *t = &backup; - int i = USED_BACKUP_SIZE+1; + int i = USED_BACKUP_SIZE; while (i--) *t++ = *f++; @@ -3132,7 +3133,7 @@ int main(void) backup_t b; uint32_t *f = &backup; uint32_t *t = (uint32_t *)&b; - int i = USED_BACKUP_SIZE+1; + int i = USED_BACKUP_SIZE; while (i--) *t++ = *f++; uint8_t *c = (uint8_t *)&b; @@ -3141,10 +3142,10 @@ int main(void) while (ci--) { checksum ^= *c++; } - if (b.checksum == checksum) { + if (b.data.checksum == checksum) { #ifdef TINYSA4 // Set mode not working reliably - set_mode(b.mode); - switch (b.mode) { + set_mode(b.data.mode); + switch (b.data.mode) { case M_LOW: case M_HIGH: break; @@ -3158,30 +3159,31 @@ int main(void) break; } #endif - if (b.frequency0 != 0 || b.frequency1 != 0) { - if (b.mode <= M_HIGH){ - set_sweep_frequency(ST_START, b.frequency0); - set_sweep_frequency(ST_STOP, b.frequency1); + set_external_gain(b.data.external_gain/2); + if (b.data.frequency0 != 0 || b.data.frequency1 != 0) { + if (b.data.mode <= M_HIGH){ + set_sweep_frequency(ST_START, b.data.frequency0); + set_sweep_frequency(ST_STOP, b.data.frequency1); } else { - set_sweep_frequency(ST_CW, (b.frequency0 + b.frequency1)/2); - set_sweep_frequency(ST_SPAN, (b.frequency1 - b.frequency0)); + set_sweep_frequency(ST_CW, (b.data.frequency0 + b.data.frequency1)/2); + set_sweep_frequency(ST_SPAN, (b.data.frequency1 - b.data.frequency0)); ui_mode_menu(); } - if (b.attenuation == 0) { + if (b.data.attenuation == 0) { set_auto_attenuation(); } else { - set_attenuation((b.attenuation - 1)/2.0); + set_attenuation((b.data.attenuation - 1)/2.0); } - if (b.reflevel == 0) { + if (b.data.reflevel == 0) { set_auto_reflevel(true); } else { set_auto_reflevel(false); - user_set_reflevel((float)(b.reflevel-140)); + user_set_reflevel((float)(b.data.reflevel-140)); } - if (b.RBW == 0) { + if (b.data.RBW == 0) { setting.rbw_x10 = 0; } else { - set_RBW(force_rbw(b.RBW-1)); + set_RBW(force_rbw(b.data.RBW-1)); } } } diff --git a/nanovna.h b/nanovna.h index 4b362b5..b70a61e 100644 --- a/nanovna.h +++ b/nanovna.h @@ -1750,25 +1750,34 @@ extern const menuitem_t menu_highoutputmode[]; extern const menuitem_t menu_mode[]; extern void menu_push_submenu(const menuitem_t *submenu); +#ifdef TINYSA4 +#define MAX_BACKUP_SIZE 16 +#define USED_BACKUP_SIZE 6 +#else +#define MAX_BACKUP_SIZE 5 +#define USED_BACKUP_SIZE 4 // must be equal to sizeof(backup_t) +#endif + + typedef struct { - freq_t frequency0, frequency1; - uint8_t attenuation; - uint8_t reflevel; - uint8_t RBW; - uint8_t mode; - uint8_t checksum; + union { + uint32_t raw[USED_BACKUP_SIZE]; // checksum must be last byte + struct { + freq_t frequency0, frequency1; + uint8_t attenuation; + uint8_t reflevel; + uint8_t RBW; + uint8_t mode; + int8_t external_gain; + uint8_t dummy1,dummy2; + uint8_t checksum; + } data; + }; } backup_t; #pragma pack(pop) #define backup (*(uint32_t *)0x40002850) // backup registers 5 * 32 bits -#ifdef TINYSA4 -#define MAX_BACKUP_SIZE 16 -#define USED_BACKUP_SIZE 5 -#else -#define MAX_BACKUP_SIZE 5 -#define USED_BACKUP_SIZE 3 -#endif #if USED_BACKUP_SIZE > MAX_BACKUP_SIZE #error "backup_t too large"