From aa6c0623410b4fa07bc0a78bbe461c0f19bb3406 Mon Sep 17 00:00:00 2001 From: erikkaashoek Date: Sat, 18 Apr 2020 18:15:50 +0200 Subject: [PATCH] Modify marker menu created adn ADF4351 core added --- NANOVNA_STM32_F072/board.h | 22 ++- main.c | 2 + nanovna.h | 3 +- sa_core.c | 32 +++- si4432.c | 362 ++++++++++++++++++++++++++++++++++++- si4432.h | 22 +++ ui.c | 17 +- ui_sa.c | 88 ++++++--- 8 files changed, 500 insertions(+), 48 deletions(-) diff --git a/NANOVNA_STM32_F072/board.h b/NANOVNA_STM32_F072/board.h index 5724a6c..7d5a539 100644 --- a/NANOVNA_STM32_F072/board.h +++ b/NANOVNA_STM32_F072/board.h @@ -56,6 +56,7 @@ #define GPIOA_XP 6 #define GPIOA_YP 7 #define GPIOA_MCO 8 +#define GPIOA_TX 9 #define GPIOA_USB_DISC 10 #define GPIOA_USB_DM 11 #define GPIOA_USB_DP 12 @@ -116,16 +117,23 @@ * PA13 - SWDIO (alternate 0). * PA14 - SWCLK (alternate 0). */ +#define __ULTRA_SA__ +#ifdef __ULTRA_SA__ +#define PIN_MOD_ULTRA(X) PIN_MODE_OUTPUT(X) +#else +#define PIN_MOD_ULTRA(X) PIN_MODE_INPUT(X) +#endif + #define VAL_GPIOA_MODER (PIN_MODE_OUTPUT(GPIOA_PE_SEL) | \ - PIN_MODE_INPUT(1U) | \ - PIN_MODE_INPUT(2U) | \ - PIN_MODE_INPUT(3U) | \ + PIN_MOD_ULTRA(1U) | \ + PIN_MOD_ULTRA(2U) | \ + PIN_MOD_ULTRA(3U) | \ PIN_MODE_OUTPUT(GPIOA_RX_SEL) | \ PIN_MODE_OUTPUT(GPIOA_LO_SEL) | \ PIN_MODE_ANALOG(GPIOA_XP) | \ PIN_MODE_ANALOG(GPIOA_YP) | \ PIN_MODE_ALTERNATE(GPIOA_MCO) | \ - PIN_MODE_INPUT(9U) | \ + PIN_MOD_ULTRA(9U) | \ PIN_MODE_OUTPUT(GPIOA_USB_DISC) | \ PIN_MODE_INPUT(GPIOA_USB_DM) | \ PIN_MODE_INPUT(GPIOA_USB_DP) | \ @@ -149,9 +157,9 @@ PIN_OTYPE_PUSHPULL(GPIOA_JTCK) | \ PIN_OTYPE_PUSHPULL(GPIOA_LCD_RESET)) #define VAL_GPIOA_OSPEEDR (PIN_OSPEED_100M(GPIOA_PE_SEL) | \ - PIN_OSPEED_2M(1) | \ - PIN_OSPEED_2M(2) | \ - PIN_OSPEED_2M(3) | \ + PIN_OSPEED_100M(1) | \ + PIN_OSPEED_100M(2) | \ + PIN_OSPEED_100M(3) | \ PIN_OSPEED_100M(4) | \ PIN_OSPEED_100M(5) | \ PIN_OSPEED_2M(6) | \ diff --git a/main.c b/main.c index 157e039..acfac0c 100644 --- a/main.c +++ b/main.c @@ -2716,6 +2716,8 @@ int main(void) #endif + ADF4351_Setup(); + /* * SPI LCD Initialize */ diff --git a/nanovna.h b/nanovna.h index 75b20f5..2d2a230 100644 --- a/nanovna.h +++ b/nanovna.h @@ -31,6 +31,7 @@ #define __SELFTEST__ #define __CALIBRATE__ //#define __ULTRA__ +#define __ULTRA_SA__ /* * main.c @@ -329,7 +330,7 @@ float groupdelay_from_array(int i, float array[POINTS_COUNT][2]); #endif // marker enum { - M_NORMAL=0,M_REFERENCE=1, M_DELTA=2, M_NOISE=4, M_TRACKING=8 // Tracking must be last. + M_NORMAL=0,M_REFERENCE=1, M_DELTA=2, M_NOISE=4, M_TRACKING=8, M_DELETE=16 // Tracking must be last. }; enum { diff --git a/sa_core.c b/sa_core.c index 631c45e..446a4a0 100644 --- a/sa_core.c +++ b/sa_core.c @@ -32,8 +32,9 @@ int setting_tracking_output; int setting_measurement; int vbwSteps = 1; - +#ifdef __ULTRA__ int setting_spur = 0; +#endif float minFreq = 0; float maxFreq = 520000000; @@ -69,7 +70,9 @@ void reset_settings(int m) trace[TRACE_TEMP].enabled = false; setting_measurement = M_OFF; +#ifdef __ULTRA__ setting_spur = 0; +#endif switch(m) { case M_LOW: minFreq = 0; @@ -352,12 +355,13 @@ int GetActualRBW(void) return((int) actual_rbw); } - +#ifdef __ULTRA void SetSpur(int v) { setting_spur = v; dirty = true; } +#endif void SetStepDelay(int d) { @@ -847,8 +851,11 @@ float perform(bool break_on_operation, int i, uint32_t f, int tracking) if (MODE_HIGH(setting_mode)) local_IF = 0; else - local_IF = frequency_IF + (int)(actual_rbw < 300.0?setting_spur * 1000 * actual_rbw:0); -// local_IF = frequency_IF; + local_IF = frequency_IF +#ifdef __ULTRA__ + + (int)(actual_rbw < 300.0?setting_spur * 1000 * actual_rbw:0) +#endif + ; if (i == 0 && dirty) { apply_settings(); @@ -961,7 +968,9 @@ static bool sweep(bool break_on_operation) temppeakLevel = -150; float temp_min_level = 100; // spur_old_stepdelay = 0; +#ifdef __ULTRA__ again: +#endif for (int i = 0; i < sweep_points; i++) { RSSI = perform(break_on_operation, i, frequencies[i], setting_tracking); @@ -973,12 +982,14 @@ again: } if (MODE_INPUT(setting_mode)) { - if (setting_spur == 1) { // First pass +#ifdef __ULTRA__ + if (setting_spur == 1) { // First pass temp_t[i] = RSSI; continue; // Skip all other processing } if (setting_spur == -1) // Second pass RSSI = ( RSSI < temp_t[i] ? RSSI : temp_t[i]); // Minimum of two passes +#endif temp_t[i] = RSSI; if (setting_subtract_stored) { RSSI = RSSI - stored_t[i] ; @@ -1066,12 +1077,13 @@ again: temp_min_level = actual_t[i]; } +#ifdef __ULTRA__ if (setting_spur == 1) { setting_spur = -1; goto again; } else if (setting_spur == -1) setting_spur = 1; - +#endif if (scandirty) { scandirty = false; draw_cal_status(); @@ -1378,7 +1390,7 @@ void draw_cal_status(void) buf[5]=0; ili9341_drawstring(buf, x, y); } -#if 1 +#ifdef __ULTRA__ if (setting_spur) { ili9341_set_foreground(BRIGHT_COLOR_BLUE); y += YSTEP*2; @@ -1426,7 +1438,11 @@ void draw_cal_status(void) ili9341_drawstring("Scan:", x, y); y += YSTEP; - int32_t t = (int)((2* vbwSteps * sweep_points * ( actualStepDelay / 100) )) /10 * (setting_spur ? 2 : 1); // in mS + int32_t t = (int)((2* vbwSteps * sweep_points * ( actualStepDelay / 100) )) /10 +#ifdef __ULTRA__ + * (setting_spur ? 2 : 1) +#endif + ; // in mS if (t>1000) plot_printf(buf, BLEN, "%dS",(t+500)/1000); else diff --git a/si4432.c b/si4432.c index b79572c..b0492bf 100644 --- a/si4432.c +++ b/si4432.c @@ -19,7 +19,7 @@ #include "ch.h" #include "hal.h" #include "nanovna.h" - +#include #include "si4432.h" #define CS_SI0_HIGH palSetPad(GPIOA, GPIOA_RX_SEL) @@ -502,4 +502,364 @@ float Simulated_SI4432_RSSI(uint32_t i, int s) return(v); } +#endif +//------------------------------- ADF4351 ------------------------------------- + + +#ifdef __ULTRA_SA__ + + +#define bitClear(X,n) (X) ^= ((uint32_t)0xfffffffe) << (n) +#define bitSet(X,n) (X) |= ((uint32_t)1) << (n) +#define bitWrite(X,n,v) if (v) bitSet(X,n); else bitClear(X,n) + + + +#define CS_ADF0_HIGH palSetPad(GPIOA, 9) +#define CS_ADF1_HIGH palSetPad(GPIOA, 10) + +#define CS_ADF0_LOW palClearPad(GPIOA, 9) +#define CS_ADF1_LOW palClearPad(GPIOA, 10) + +#define SPI3_CLK_HIGH palSetPad(GPIOA, 1) +#define SPI3_CLK_LOW palClearPad(GPIOA, 1) + +#define SPI3_SDI_HIGH palSetPad(GPIOA, 2) +#define SPI3_SDI_LOW palClearPad(GPIOA, 2) + + +void ADF_shiftOut(uint8_t val) +{ + uint8_t i; + for (i = 0; i < 8; i++) { + if (val & (1 << (7 - i))) + SPI3_SDI_HIGH; + else + SPI3_SDI_LOW; + chThdSleepMicroseconds(1); + SPI3_CLK_HIGH; + SPI3_CLK_LOW; + } +} + +//unsigned long registers[6] = {0x4580A8, 0x80080C9, 0x4E42, 0x4B3, 0xBC803C, 0x580005} ; +//unsigned long registers[6] = {0x4C82C8, 0x80083E9, 0x6E42, 0x8004B3, 0x8C81FC, 0x580005} ; +unsigned long registers[6] = {0x320000, 0x8008011, 0x18004E42, 0x4B3,0x8C803C , 0x00580005} ; +int debug = 0; +int ADF4351_LE[2] = { 9, 10}; +int ADF4351_Mux = 7; + + +//#define DEBUG(X) // Serial.print( X ) +//#define DEBUGLN(X) Serial.println( X ) +//#define DEBUGFLN(X,Y) Serial.println( X,Y ) +//#define DEBUGF(X,Y) Serial.print( X,Y ) +#define DEBUG(X) +#define DEBUGLN(X) + + +double RFout, //Output freq in MHz +#if 1 //Black modules + PFDRFout[6] = {25.0,25.0,25.0,10.0,10.0,10.0}, //Reference freq in MHz + Chrystal[6] = {25.0,25.0,25.0,10.0,10.0,10.0}, +#else // Green modules + PFDRFout[6] = {10.0,10.0,10.0,10.0,10.0,10.0}, //Reference freq in MHz + Chrystal[6] = {10.0,10.0,10.0,10.0,10.0,10.0}, +#endif + + OutputChannelSpacing = 0.010, // = 0.01 + FRACF; // Temp + +unsigned int long RFint, // Output freq/10Hz + INTA, // Temp + RFcalc, //UI + MOD, //Temp + FRAC; //Temp + +byte OutputDivider; // Temp +byte lock=2; //Not used + +// Lock = A4 + +void ADF4351_Setup() +{ +// palSetPadMode(GPIOA, 1, PAL_MODE_OUTPUT_PUSHPULL ); +// palSetPadMode(GPIOA, 2, PAL_MODE_OUTPUT_PUSHPULL ); + + SPI3_CLK_HIGH; + SPI3_SDI_HIGH; + CS_ADF0_HIGH; + CS_ADF1_HIGH; +// bitSet (registers[2], 17); // R set to 8 +// bitClear (registers[2], 14); // R set to 8 + + ADF4351_R_counter(1); + ADF4351_level(3); + ADF4351_channel_spacing(10); + + while(1) { +// + ADF4351_set_frequency(1,100000000,0); +// ADF4351_set_frequency(1,150000000,0); +// ADF4351_Set(0); +// ADF4351_Set(1); + chThdSleepMilliseconds(1000); + } +// bitSet (registers[2], 17); // R set to 8 +// bitClear (registers[2], 14); // R set to 8 +// for (int i=0; i<6; i++) pinMode(ADF4351_LE[i], OUTPUT); // Setup pins +// for (int i=0; i<6; i++) digitalWrite(ADF4351_LE[i], HIGH); +// pinMode(ADF4351_Mux, INPUT); +// SPI.begin(); // Init SPI bus +// SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0)); + //SPI.setDataMode(SPI_MODE0); // CPHA = 0 Clock positive + //SPI.setBitOrder(MSBFIRST); +} + +void ADF4351_WriteRegister32(int channel, const uint32_t value) +{ + palClearPad(GPIOA, ADF4351_LE[channel]); +// chThdSleepMicroseconds(SELECT_DELAY); + for (int i = 3; i >= 0; i--) ADF_shiftOut((value >> 8 * i) & 0xFF); + palSetPad(GPIOA, ADF4351_LE[channel]); +// chThdSleepMicroseconds(SELECT_DELAY); + palClearPad(GPIOA, ADF4351_LE[channel]); +// chThdSleepMicroseconds(SELECT_DELAY); +} + +void ADF4351_disable_output() +{ + bitClear (registers[4], 5); // digital lock + ADF4351_Set(0); +} + +void ADF4351_enable_output() +{ + bitSet (registers[4], 5); // digital lock + ADF4351_Set(0); +} +void ADF4351_Set(int channel) +{ for (int i = 5; i >= 0; i--) { + ADF4351_WriteRegister32(channel, registers[i]); +// if (debug) Serial.println(registers[i],HEX); +} +} + +void ADF4351_set_frequency(int channel, unsigned long freq, int drive) // freq / 10Hz +{ + ADF4351_prep_frequency(channel,freq, drive); + ADF4351_Set(channel); +} + +void ADF4351_spur_mode(int S) +{ + if (S & 1) + bitSet (registers[2], 29); // R set to 8 + else + bitClear (registers[2], 29); // R set to 8 + if (S & 2) + bitSet (registers[2], 30); // R set to 8 + else + bitClear (registers[2], 30); // R set to 8 +} + +void ADF4351_R_counter(int R) +{ + int dbl = false; + if (R < 0) { + dbl = true; + R = -R; + } + if (R<1) + return; + if (dbl) { + bitSet (registers[2], 25); // Reference doubler + } else { + bitClear (registers[2], 25); // Reference doubler + } + for (int channel=0; channel < 6; channel++) { + PFDRFout[channel] = Chrystal[channel] * (dbl?2:1) / R; + } + registers[2] &= ~ (((unsigned long)0x3FF) << 14); + registers[2] |= (((unsigned long)R) << 14); +} + +void ADF4351_CP(int p) +{ + registers[2] &= ~ (((unsigned long)0xF) << 9); + registers[2] |= (((unsigned long)p) << 9); +} + +void ADF4351_level(int p) +{ + registers[4] &= ~ (((unsigned long)0x3) << 3); + registers[4] |= (((unsigned long)p) << 3); +} + +void ADF4351_channel_spacing(int spacing) +{ + OutputChannelSpacing = 0.001 * spacing; +} + +static uint32_t gcd(uint32_t x, uint32_t y) +{ + uint32_t z; + while (y != 0) { + z = x % y; + x = y; + y = z; + } + return x; +} + +void ADF4351_prep_frequency(int channel, unsigned long freq, int drive) // freq / 10Hz +{ + (void)drive; +// if (channel == 0) + RFout=freq/1000000.0; // To MHz +// else + // RFout=freq/1000002.764; // To MHz + + if (RFout >= 2200) { + OutputDivider = 1; + bitWrite (registers[4], 22, 0); + bitWrite (registers[4], 21, 0); + bitWrite (registers[4], 20, 0); + } else if (RFout >= 1100) { + OutputDivider = 2; + bitWrite (registers[4], 22, 0); + bitWrite (registers[4], 21, 0); + bitWrite (registers[4], 20, 1); + } else if (RFout >= 550) { + OutputDivider = 4; + bitWrite (registers[4], 22, 0); + bitWrite (registers[4], 21, 1); + bitWrite (registers[4], 20, 0); + } else if (RFout >= 275) { + OutputDivider = 8; + bitWrite (registers[4], 22, 0); + bitWrite (registers[4], 21, 1); + bitWrite (registers[4], 20, 1); + } else if (RFout >= 137.5) { + OutputDivider = 16; + bitWrite (registers[4], 22, 1); + bitWrite (registers[4], 21, 0); + bitWrite (registers[4], 20, 0); + } else if (RFout >= 68.75) { + OutputDivider = 32; + bitWrite (registers[4], 22, 1); + bitWrite (registers[4], 21, 0); + bitWrite (registers[4], 20, 1); + } else { + OutputDivider = 64; + bitWrite (registers[4], 22, 1); + bitWrite (registers[4], 21, 1); + bitWrite (registers[4], 20, 0); + } + + INTA = (RFout * OutputDivider) / PFDRFout[channel]; + MOD = (PFDRFout[channel] / OutputChannelSpacing) + 0.01; +// MOD = 3125; + FRACF = (((RFout * OutputDivider) / PFDRFout[channel]) - INTA) * MOD; + FRAC = round(FRACF); + + while (FRAC > 4095 || MOD > 4095) { + FRAC = FRAC >> 1; + MOD = MOD >> 1; + // Serial.println( "MOD/FRAC reduced"); + } + + int32_t k = gcd(FRAC, MOD); + if (k > 1) { + FRAC /= k; + MOD /= k; +// Serial.print( "MOD/FRAC gcd reduced"); + } +// while (denom >= (1<<20)) { +// num >>= 1; +// denom >>= 1; +// } + + +// if (INTA <= 75) Serial.println( "INTA <= 75"); +// if (FRAC > 4095) Serial.println( "FRAC > 4095"); +// if (MOD > 4095) Serial.println( "MOD > 4095"); + + +// if (FRAC > 4095) Serial.println( "FRAC > 4095"); +// if (MOD > 4095) Serial.println( "MOD > 4095"); +// if (INTA > 4095) Serial.println( "INT > 4095"); + + if (debug) { + DEBUG(" ODIV="); + DEBUG(OutputDivider); + DEBUG(" INT="); + DEBUG(INTA); + DEBUG(" FRAC="); + DEBUG(FRAC); + DEBUG(" MOD="); + DEBUG(MOD); + DEBUG( " CalF="); +// DEBUGFLN(PFDRFout[channel] *(INTA + ((double)FRAC)/MOD)/OutputDivider,6); + +// DEBUG(" FRACF="); +// DEBUGF(FRACF,6); + } + registers[0] = 0; + registers[0] = INTA << 15; // OK + FRAC = FRAC << 3; + registers[0] = registers[0] + FRAC; + //if (MOD == 1) MOD = 2; + registers[1] = 0; + registers[1] = MOD << 3; + registers[1] = registers[1] + 1 ; // restore address "001" + bitSet (registers[1], 27); // Prescaler at 8/9 +/* + drive = 1; + if (drive == 0) { + bitClear (registers[4], 3); // +5dBm + out + bitClear (registers[4], 4); // +5dBm + bitClear (registers[4], 6); // +5dBm - out + bitClear (registers[4], 7); // +5dBm + } else if (drive == 1) { + bitSet (registers[4], 6); // +5dBm + bitClear (registers[4], 7); // +5dBm - out + bitSet (registers[4], 3); // +5dBm + bitClear (registers[4], 4); // +5dBm + out + } else if (drive == 2) { + bitClear (registers[4], 6); // +5dBm - out + bitSet (registers[4], 7); // +5dBm + bitClear (registers[4], 3); // +5dBm + out + bitSet (registers[4], 4); // +5dBm + } + else { + bitSet (registers[4], 6); // +5dBm - out + bitSet (registers[4], 7); // +5dBm + bitSet (registers[4], 3); // +5dBm + out + bitSet (registers[4], 4); // +5dBm + } +*/ + bitSet (registers[4], 5); // enable + output + bitClear (registers[4], 8); // enable B output + +#if 0 + if (FRAC == 0) + bitSet (registers[2], 8); // INT mode + else + bitClear (registers[2], 8); // INT mode + bitSet (registers[2], 13); // Double buffered + + bitSet (registers[2], 28); // Digital lock == "110" sur b28 b27 b26 + bitSet (registers[2], 27); // digital lock + bitClear (registers[2], 26); // digital lock + + //bitSet (registers[4], 10); // Mute till lock + bitSet (registers[3], 23); // Fast lock + #endif + bitSet (registers[4], 10); // Mute till lock +// ADF4351_Set(channel); +} + + + #endif diff --git a/si4432.h b/si4432.h index 8b2774e..8473302 100644 --- a/si4432.h +++ b/si4432.h @@ -19,4 +19,26 @@ float SI4432_SET_RBW(float WISH); void PE4302_Write_Byte(unsigned char DATA ); void PE4302_init(void); +#ifdef __ULTRA_SA__ +extern int ADF4351_LE[]; +extern int debug; +void ADF4351_Setup(void); + + +void ADF4351_WriteRegister32(int channel, const uint32_t value); +void ADF4351_set_frequency(int channel, uint32_t freq, int drive_strength); +void ADF4351_prep_frequency(int channel, uint32_t freq, int drive_strength); +//int ADF4351_set_frequency_with_offset(uint32_t freq, int offset, uint8_t drive_strength); +void ADF4351_Set(int channel); +void ADF4351_enable_output(void); +void ADF4351_disable_output(void); +void ADF4351_spur_mode(int S); +void ADF4351_R_counter(int R); +void ADF4351_channel_spacing(int spacing); +void ADF4351_CP(int p); +void ADF4351_level(int p); +int ADF4351_locked(void); +#endif + + #endif //__SI4432_H__ diff --git a/ui.c b/ui.c index a665681..899d0d0 100644 --- a/ui.c +++ b/ui.c @@ -53,7 +53,11 @@ uistat_t uistat = { #define BIT_DOWN1 1 #define READ_PORT() palReadPort(GPIOA) +#ifdef __ULTRA_SA__ +#define BUTTON_MASK 0 +#else #define BUTTON_MASK 0b1110 +#endif static uint16_t last_button = 0b0000; static uint32_t last_button_down_ticks; @@ -128,7 +132,7 @@ static void choose_active_marker(void); static void menu_move_back(void); static void menu_push_submenu(const menuitem_t *submenu); -static const menuitem_t menu_marker_type[]; +//static const menuitem_t menu_marker_type[]; static int btn_check(void) { @@ -1109,7 +1113,7 @@ const menuitem_t menu_top[] = { #include "ui_sa.c" -#define MENU_STACK_DEPTH_MAX 4 +#define MENU_STACK_DEPTH_MAX 5 const menuitem_t *menu_stack[MENU_STACK_DEPTH_MAX] = { menu_mode, NULL, NULL, NULL }; @@ -1784,7 +1788,7 @@ static void draw_numeric_area(void) { char buf[10]; - plot_printf(buf, sizeof buf, "%9d", uistat.value); + plot_printf(buf, sizeof buf, "%9d", ((int32_t)uistat.value)); draw_numeric_input(buf); } @@ -2497,8 +2501,13 @@ static void extcb1(EXTDriver *extp, expchannel_t channel) static const EXTConfig extcfg = { { {EXT_CH_MODE_DISABLED, NULL}, +#ifdef __ULTRA_SA__ + {EXT_CH_MODE_DISABLED, NULL}, + {EXT_CH_MODE_DISABLED, NULL}, +#else {EXT_CH_MODE_RISING_EDGE | EXT_CH_MODE_AUTOSTART | EXT_MODE_GPIOA, extcb1}, {EXT_CH_MODE_RISING_EDGE | EXT_CH_MODE_AUTOSTART | EXT_MODE_GPIOA, extcb1}, +#endif {EXT_CH_MODE_RISING_EDGE | EXT_CH_MODE_AUTOSTART | EXT_MODE_GPIOA, extcb1}, {EXT_CH_MODE_DISABLED, NULL}, {EXT_CH_MODE_DISABLED, NULL}, @@ -2556,8 +2565,8 @@ ui_init() /* * Activates the EXT driver 1. */ - extStart(&EXTD1, &extcfg); + extStart(&EXTD1, &extcfg); #if 1 gptStart(&GPTD3, &gpt3cfg); gptPolledDelay(&GPTD3, 10); /* Small delay.*/ diff --git a/ui_sa.c b/ui_sa.c index 502947f..745bf81 100644 --- a/ui_sa.c +++ b/ui_sa.c @@ -1,6 +1,6 @@ void markmap_all_markers(void); -static void menu_marker_type_cb(int item, uint8_t data); - +static void menu_marker_modify_cb(int item, uint8_t data); +extern const menuitem_t menu_marker_modify[]; void set_sweep_frequency(int type, uint32_t frequency); uint32_t get_sweep_frequency(int type); void clearDisplay(void); @@ -23,8 +23,10 @@ void SetDrive(int d); void SetIF(int f); void SetStepDelay(int t); extern int setting_rbw; +#ifdef __ULTRA__ extern int setting_spur; void SetSpur(int v); +#endif void SetAverage(int); int GetAverage(void); extern int setting_average; @@ -620,8 +622,7 @@ static void menu_drive_cb(int item, uint8_t data) -#if 1 - +#ifdef __ULTRA__ static void menu_spur_cb(int item, uint8_t data) { (void)data; @@ -791,12 +792,31 @@ static void menu_average_cb(int item, uint8_t data) draw_cal_status(); } -static void menu_marker_type_cb(int item, uint8_t data) +static void +menu_marker_select_cb(int item, uint8_t data) +{ + (void)data; +// int t; + if (item >= 0 && item < MARKERS_MAX) { + markers[item].enabled = true; + active_marker_select(item); + menu_push_submenu(menu_marker_modify); + redraw_marker(active_marker); + draw_menu(); + } +} + +static void menu_marker_modify_cb(int item, uint8_t data) { (void)item; if (markers[active_marker].enabled == M_ENABLED) { - if (data == M_NORMAL) { + if (data == M_DELETE) { + markers[active_marker].enabled = false; + menu_move_back(); +// ui_mode_normal(); +// return; + } else if (data == M_NORMAL) { markers[active_marker].mtype = M_NORMAL; } else if (data == M_REFERENCE) { for (int i = 0; i= 0 && markers[active_marker].enabled == M_ENABLED) { + } else if (menu == menu_marker_modify && active_marker >= 0 && markers[active_marker].enabled == M_ENABLED) { if (data & markers[active_marker].mtype) mark = true; else if (item < 5 && data==markers[active_marker].mtype) // This catches the M_NORMAL case @@ -1460,8 +1494,8 @@ static void menu_item_modify_attribute( mark = true; if (item == 4 && markers[active_marker].mtype & M_TRACKING) mark = true; - } else if (menu == menu_marker_sel) { - if (item < MARKERS_MAX && markers[item].enabled) + } else if (menu == menu_marker_sel || menu == menu_marker_select) { + if (item < 4 && markers[item].enabled) mark = true; else if (item == 4 && uistat.marker_delta) mark = true; @@ -1516,19 +1550,19 @@ static void fetch_numeric_target(void) break; case KM_SCALE: uistat.value = setting_scale; - plot_printf(uistat.text, sizeof uistat.text, "%ddB/", uistat.value); + plot_printf(uistat.text, sizeof uistat.text, "%ddB/", ((int32_t)uistat.value)); break; case KM_REFPOS: uistat.value = setting_reflevel; - plot_printf(uistat.text, sizeof uistat.text, "%ddB", uistat.value); + plot_printf(uistat.text, sizeof uistat.text, "%ddB", ((int32_t)uistat.value)); break; case KM_ATTENUATION: uistat.value = GetAttenuation(); - plot_printf(uistat.text, sizeof uistat.text, "%ddB", uistat.value); + plot_printf(uistat.text, sizeof uistat.text, "%ddB", ((int32_t)uistat.value)); break; case KM_ACTUALPOWER: uistat.value = settingLevelOffset(); - plot_printf(uistat.text, sizeof uistat.text, "%ddB", uistat.value); + plot_printf(uistat.text, sizeof uistat.text, "%ddB", ((int32_t)uistat.value)); break; case KM_IF: uistat.value = frequency_IF; @@ -1536,23 +1570,23 @@ static void fetch_numeric_target(void) break; case KM_SAMPLETIME: uistat.value = setting_step_delay; - plot_printf(uistat.text, sizeof uistat.text, "%3duS", uistat.value); + plot_printf(uistat.text, sizeof uistat.text, "%3duS", ((int32_t)uistat.value)); break; case KM_DRIVE: uistat.value = setting_drive; - plot_printf(uistat.text, sizeof uistat.text, "%3ddB", uistat.value); + plot_printf(uistat.text, sizeof uistat.text, "%3ddB", ((int32_t)uistat.value)); break; case KM_LOWOUTLEVEL: uistat.value = GetAttenuation(); // compensation for dB offset during low output mode - plot_printf(uistat.text, sizeof uistat.text, "%ddB", uistat.value); + plot_printf(uistat.text, sizeof uistat.text, "%ddB", ((int32_t)uistat.value)); break; case KM_DECAY: uistat.value = setting_decay; - plot_printf(uistat.text, sizeof uistat.text, "%3d", uistat.value); + plot_printf(uistat.text, sizeof uistat.text, "%3d", ((int32_t)uistat.value)); break; case KM_NOISE: uistat.value = setting_noise; - plot_printf(uistat.text, sizeof uistat.text, "%3d", uistat.value); + plot_printf(uistat.text, sizeof uistat.text, "%3d", ((int32_t)uistat.value)); break; case KM_10MHZ: uistat.value = setting_10mhz;