pull/8/head
erikkaashoek 5 years ago
commit a54df8dad9

@ -35,7 +35,7 @@
#define __SELFTEST__ #define __SELFTEST__
#define __CALIBRATE__ #define __CALIBRATE__
#define __FAST_SWEEP__ // Pre-fill SI4432 RSSI buffer to get fastest sweep in zero span mode #define __FAST_SWEEP__ // Pre-fill SI4432 RSSI buffer to get fastest sweep in zero span mode
//#define __HAM_BAND__ #define __HAM_BAND__
//#define __ULTRA__ // Add harmonics mode on low input. //#define __ULTRA__ // Add harmonics mode on low input.
//#define __ULTRA_SA__ // Adds ADF4351 control for extra high 1st IF stage //#define __ULTRA_SA__ // Adds ADF4351 control for extra high 1st IF stage
#define __SPUR__ // Does spur reduction by shifting IF #define __SPUR__ // Does spur reduction by shifting IF
@ -285,10 +285,13 @@ extern void tlv320aic3204_select(int channel);
#ifdef __SCROLL__ #ifdef __SCROLL__
extern uint16_t _grid_y; extern uint16_t _grid_y;
#define GRIDY _grid_y #define GRIDY _grid_y
#define HEIGHT_SCROLL 180 extern uint16_t graph_bottom;
#define HEIGHT_NOSCROLL 230 #define BIG_WATERFALL 90
#define SMALL_WATERFALL 180
#define NO_WATERFALL CHART_BOTTOM
#define CHART_BOTTOM 230
#define SCROLL_GRIDY (HEIGHT_SCROLL / NGRIDY) #define SCROLL_GRIDY (HEIGHT_SCROLL / NGRIDY)
#define NOSCROLL_GRIDY (HEIGHT_NOSCROLL / NGRIDY) #define NOSCROLL_GRIDY (CHART_BOTTOM / NGRIDY)
#else #else
#define GRIDY (230 / NGRIDY) #define GRIDY (230 / NGRIDY)
#endif #endif
@ -452,6 +455,8 @@ typedef struct config {
float correction_value[CORRECTION_POINTS]; float correction_value[CORRECTION_POINTS];
uint32_t deviceid; uint32_t deviceid;
uint16_t ham_color; uint16_t ham_color;
uint16_t gridlines;
uint16_t hambands;
// uint8_t _reserved[22]; // uint8_t _reserved[22];
uint32_t checksum; uint32_t checksum;
} config_t; } config_t;
@ -945,11 +950,13 @@ extern uint16_t actual_rbw_x10;
int get_waterfall(void); int get_waterfall(void);
void toggle_tracking(void); void toggle_tracking(void);
void toggle_hambands(void);
void reset_calibration(void); void reset_calibration(void);
void set_reflevel(float); void set_reflevel(float);
void set_offset(float); void set_offset(float);
void set_unit(int); void set_unit(int);
void set_switches(int); void set_switches(int);
void set_gridlines(int);
void set_trigger_level(float); void set_trigger_level(float);
void set_trigger(int); void set_trigger(int);
void update_rbw(void); void update_rbw(void);

@ -29,7 +29,8 @@
#ifdef __SCROLL__ #ifdef __SCROLL__
uint16_t _grid_y = NOSCROLL_GRIDY; uint16_t _grid_y = (CHART_BOTTOM / NGRIDY);
uint16_t graph_bottom = CHART_BOTTOM;
static int waterfall = false; static int waterfall = false;
#endif #endif
static void cell_draw_marker_info(int x0, int y0); static void cell_draw_marker_info(int x0, int y0);
@ -127,18 +128,18 @@ void update_grid(void)
fspan = setting.actual_sweep_time_us; // Time in uS fspan = setting.actual_sweep_time_us; // Time in uS
fstart = 0; fstart = 0;
} }
if (config.gridlines < 3)
#define GRIDLINE_MINIMUM 7 config.gridlines = 6;
while (gdigit > 100) { while (gdigit > 100) {
grid = 5 * gdigit; grid = 5 * gdigit;
if (fspan / grid >= GRIDLINE_MINIMUM) if (fspan / grid >= config.gridlines)
break; break;
grid = 2 * gdigit; grid = 2 * gdigit;
if (fspan / grid >= GRIDLINE_MINIMUM) if (fspan / grid >= config.gridlines)
break; break;
grid = gdigit; grid = gdigit;
if (fspan / grid >= GRIDLINE_MINIMUM) if (fspan / grid >= config.gridlines)
break; break;
gdigit /= 10; gdigit /= 10;
} }
@ -432,6 +433,8 @@ const ham_bands_t ham_bands[] =
int ham_band(int x) // Search which index in the frequency tabled matches with frequency f using actual_rbw int ham_band(int x) // Search which index in the frequency tabled matches with frequency f using actual_rbw
{ {
if (!config.hambands)
return false;
uint32_t f = frequencies[x]; uint32_t f = frequencies[x];
int L = 0; int L = 0;
int R = (sizeof ham_bands)/sizeof(uint32_t) - 1; int R = (sizeof ham_bands)/sizeof(uint32_t) - 1;
@ -2314,7 +2317,7 @@ static void update_waterfall(void){
// Waterfall only in 290 or 145 points // Waterfall only in 290 or 145 points
if (!(sweep_points == 290 || sweep_points == 145)) if (!(sweep_points == 290 || sweep_points == 145))
return; return;
for (i = HEIGHT_NOSCROLL-1; i >=HEIGHT_SCROLL+2; i--) { // Scroll down for (i = CHART_BOTTOM-1; i >=graph_bottom+1; i--) { // Scroll down
ili9341_read_memory(OFFSETX, i , w_width, 1, w_width*1, spi_buffer); ili9341_read_memory(OFFSETX, i , w_width, 1, w_width*1, spi_buffer);
ili9341_bulk(OFFSETX, i+1, w_width, 1); ili9341_bulk(OFFSETX, i+1, w_width, 1);
} }
@ -2322,12 +2325,12 @@ static void update_waterfall(void){
for (i=0; i< w_width; i++) { // Add new topline for (i=0; i< w_width; i++) { // Add new topline
uint16_t color; uint16_t color;
#ifdef _USE_WATERFALL_PALETTE #ifdef _USE_WATERFALL_PALETTE
uint16_t y = _PALETTE_ALIGN(CELL_Y(index[i])); // should be always in range 0 - HEIGHT_SCROLL uint16_t y = _PALETTE_ALIGN(CELL_Y(index[i])); // should be always in range 0 - graph_bottom
// y = (uint8_t)i; // for test // y = (uint8_t)i; // for test
color = waterfall_palette[y]; color = waterfall_palette[y];
#elif 0 #elif 0
uint16_t y = CELL_Y(index[i]); // should be always in range 0 - HEIGHT_SCROLL uint16_t y = CELL_Y(index[i]); // should be always in range 0 - graph_bottom
uint16_t ratio = (HEIGHT_SCROLL - y)*2; uint16_t ratio = (graph_bottom - y)*2;
// ratio = (i*2); // Uncomment for testing the waterfall colors // ratio = (i*2); // Uncomment for testing the waterfall colors
int16_t b = 255 - ratio; int16_t b = 255 - ratio;
if (b > 255) b = 255; if (b > 255) b = 255;
@ -2342,7 +2345,7 @@ static void update_waterfall(void){
gamma_correct(b); gamma_correct(b);
color = RGB565(r, g, b); color = RGB565(r, g, b);
#else #else
uint16_t y = CELL_Y(index[i]); // should be always in range 0 - HEIGHT_SCROLL uint16_t y = CELL_Y(index[i])* (graph_bottom == BIG_WATERFALL ? 2 : 1); // should be always in range 0 - graph_bottom *2 depends on height of scroll
// Calculate gradient palette for range 0 .. 192 // Calculate gradient palette for range 0 .. 192
// idx r g b // idx r g b
// 0 - 127 0 0 // 0 - 127 0 0
@ -2369,30 +2372,34 @@ static void update_waterfall(void){
spi_buffer[2*i+1] = color; spi_buffer[2*i+1] = color;
} }
} }
ili9341_bulk(OFFSETX, HEIGHT_SCROLL+2, w_width, 1); ili9341_bulk(OFFSETX, graph_bottom+1, w_width, 1);
} }
int get_waterfall(void) int get_waterfall(void)
{ {
return(waterfall); return(waterfall);
} }
enum {W_OFF, W_SMALL, W_BIG};
void void
toggle_waterfall(void) toggle_waterfall(void)
{ {
if (!waterfall) { if (waterfall == W_OFF) {
_grid_y = SCROLL_GRIDY;
ili9341_fill(OFFSETX, HEIGHT_SCROLL, LCD_WIDTH - OFFSETX, HEIGHT_NOSCROLL - HEIGHT_SCROLL, 0);
waterfall = true;
w_min = (int)min_level; w_min = (int)min_level;
w_max = (int)peakLevel; w_max = (int)peakLevel;
if (w_max < w_min + 20) if (w_max < w_min + 20)
w_max = w_min + 20; w_max = w_min + 20;
graph_bottom = SMALL_WATERFALL;
waterfall = W_SMALL;
} else if (waterfall == W_SMALL) {
graph_bottom = BIG_WATERFALL;
waterfall = W_BIG;
} else { } else {
_grid_y = NOSCROLL_GRIDY; graph_bottom = NO_WATERFALL;
waterfall = false; waterfall = W_OFF;
} }
_grid_y = graph_bottom / NGRIDY;
ili9341_fill(OFFSETX, graph_bottom, LCD_WIDTH - OFFSETX, CHART_BOTTOM - graph_bottom, 0);
request_to_redraw_grid(); request_to_redraw_grid();
} }
void void

@ -245,6 +245,16 @@ void set_noise(int d)
dirty = true; dirty = true;
} }
void set_gridlines(int d)
{
if (d < 3 || d > 20)
return;
config.gridlines = d;
config_save();
dirty = true;
update_grid();
}
void set_measurement(int m) void set_measurement(int m)
{ {
setting.measurement = m; setting.measurement = m;
@ -315,6 +325,12 @@ void toggle_mute(void)
dirty = true; dirty = true;
} }
void toggle_hambands(void)
{
config.hambands = !config.hambands;
dirty = true;
}
void toggle_below_IF(void) void toggle_below_IF(void)
{ {
if (S_IS_AUTO(setting.below_IF )) if (S_IS_AUTO(setting.below_IF ))
@ -1900,7 +1916,7 @@ sweep_again: // stay in sweep loop when output mo
scandirty = false; scandirty = false;
if (break_on_operation && operation_requested) { // break loop if needed if (break_on_operation && operation_requested) { // break loop if needed
if (setting.actual_sweep_time_us > ONE_SECOND_TIME && MODE_INPUT(setting.mode)) { if (setting.actual_sweep_time_us > ONE_SECOND_TIME && MODE_INPUT(setting.mode)) {
ili9341_fill(OFFSETX, HEIGHT_NOSCROLL+1, WIDTH, 1, 0); // Erase progress bar ili9341_fill(OFFSETX, CHART_BOTTOM+1, WIDTH, 1, 0); // Erase progress bar
} }
return false; return false;
} }
@ -1940,8 +1956,8 @@ sweep_again: // stay in sweep loop when output mo
if (setting.actual_sweep_time_us > ONE_SECOND_TIME && (i & 0x07) == 0) { // if required if (setting.actual_sweep_time_us > ONE_SECOND_TIME && (i & 0x07) == 0) { // if required
int pos = i * (WIDTH+1) / sweep_points; int pos = i * (WIDTH+1) / sweep_points;
ili9341_fill(OFFSETX, HEIGHT_NOSCROLL+1, pos, 1, BRIGHT_COLOR_GREEN); // update sweep progress bar ili9341_fill(OFFSETX, CHART_BOTTOM+1, pos, 1, BRIGHT_COLOR_GREEN); // update sweep progress bar
ili9341_fill(OFFSETX+pos, HEIGHT_NOSCROLL+1, WIDTH-pos, 1, 0); ili9341_fill(OFFSETX+pos, CHART_BOTTOM+1, WIDTH-pos, 1, 0);
} }
// ------------------------ do all RSSI calculations from CALC menu ------------------- // ------------------------ do all RSSI calculations from CALC menu -------------------
@ -2396,7 +2412,7 @@ sweep_again: // stay in sweep loop when output mo
// redraw_marker(peak_marker, FALSE); // redraw_marker(peak_marker, FALSE);
// STOP_PROFILE; // STOP_PROFILE;
ili9341_fill(OFFSETX, HEIGHT_NOSCROLL+1, WIDTH, 1, 0); ili9341_fill(OFFSETX, CHART_BOTTOM+1, WIDTH, 1, 0);
palSetPad(GPIOB, GPIOB_LED); palSetPad(GPIOB, GPIOB_LED);
return true; return true;
@ -2591,7 +2607,7 @@ void draw_cal_status(void)
rounding = true; rounding = true;
const char * const unit = unit_string[setting.unit]; const char * const unit = unit_string[setting.unit];
ili9341_fill(0, 0, OFFSETX, HEIGHT_NOSCROLL, 0x0000); ili9341_fill(0, 0, OFFSETX, CHART_BOTTOM, 0x0000);
if (MODE_OUTPUT(setting.mode)) { // No cal status during output if (MODE_OUTPUT(setting.mode)) { // No cal status during output
return; return;
} }

@ -2081,6 +2081,7 @@ lever_move_marker(int status)
} }
markers[active_marker].frequency = frequencies[markers[active_marker].index]; markers[active_marker].frequency = frequencies[markers[active_marker].index];
redraw_marker(active_marker); redraw_marker(active_marker);
markers[active_marker].mtype &= ~M_TRACKING; // Disable tracking when dragging marker
step++; step++;
} }
status = btn_wait_release(); status = btn_wait_release();
@ -2492,7 +2493,7 @@ touch_pickup_marker(void)
// select trace // select trace
uistat.current_trace = t; uistat.current_trace = t;
select_lever_mode(LM_MARKER); select_lever_mode(LM_MARKER);
markers[m].mtype &= ~M_TRACKING; // Disable tracking when dragging marker
// drag marker until release // drag marker until release
drag_marker(t, m); drag_marker(t, m);
return TRUE; return TRUE;

@ -406,7 +406,7 @@ static const keypads_t keypads_time[] = {
enum { enum {
KM_START, KM_STOP, KM_CENTER, KM_SPAN, KM_CW, KM_REFLEVEL, KM_SCALE, KM_ATTENUATION, KM_START, KM_STOP, KM_CENTER, KM_SPAN, KM_CW, KM_REFLEVEL, KM_SCALE, KM_ATTENUATION,
KM_ACTUALPOWER, KM_IF, KM_SAMPLETIME, KM_DRIVE, KM_LOWOUTLEVEL, KM_DECAY, KM_NOISE, KM_ACTUALPOWER, KM_IF, KM_SAMPLETIME, KM_DRIVE, KM_LOWOUTLEVEL, KM_DECAY, KM_NOISE,
KM_10MHZ, KM_REPEAT, KM_OFFSET, KM_TRIGGER, KM_LEVELSWEEP, KM_SWEEP_TIME, KM_OFFSET_DELAY, KM_FAST_SPEEDUP, KM_10MHZ, KM_REPEAT, KM_OFFSET, KM_TRIGGER, KM_LEVELSWEEP, KM_SWEEP_TIME, KM_OFFSET_DELAY, KM_FAST_SPEEDUP, KM_GRIDLINES,
KM_NONE // always at enum end KM_NONE // always at enum end
}; };
@ -428,7 +428,7 @@ static const struct {
{keypads_positive , "DRIVE"}, // drive {keypads_positive , "DRIVE"}, // drive
{keypads_plusmin , "LEVEL"}, // KM_LOWOUTLEVEL {keypads_plusmin , "LEVEL"}, // KM_LOWOUTLEVEL
{keypads_positive , "SCANS"}, // KM_DECAY {keypads_positive , "SCANS"}, // KM_DECAY
{keypads_positive , "LEVEL"}, // KM_NOISE {keypads_positive , "NOISE\nLEVEL"}, // KM_NOISE
{keypads_freq , "FREQ"}, // KM_10MHz {keypads_freq , "FREQ"}, // KM_10MHz
{keypads_positive , "SAMPLE\nREPEAT"}, // KM_REPEA {keypads_positive , "SAMPLE\nREPEAT"}, // KM_REPEA
{keypads_plusmin , "OFFSET"}, // KM_OFFSET {keypads_plusmin , "OFFSET"}, // KM_OFFSET
@ -437,6 +437,7 @@ static const struct {
{keypads_time , "SWEEP\nSECONDS"}, // KM_SWEEP_TIME {keypads_time , "SWEEP\nSECONDS"}, // KM_SWEEP_TIME
{keypads_positive , "OFFSET\nDELAY"}, // KM_OFFSET_DELAY {keypads_positive , "OFFSET\nDELAY"}, // KM_OFFSET_DELAY
{keypads_positive , "FAST\nSPEEDUP"}, // KM_FAST_SPEEDUP {keypads_positive , "FAST\nSPEEDUP"}, // KM_FAST_SPEEDUP
{keypads_positive , "MINIMUM\nGRIDLINES"}, // KM_GRIDLINES
}; };
// ===[MENU CALLBACKS]========================================================= // ===[MENU CALLBACKS]=========================================================
@ -1174,6 +1175,19 @@ static UI_FUNCTION_ADV_CALLBACK(menu_settings_bpf_acb){
draw_menu(); draw_menu();
} }
#ifdef __HAM_BAND__
static UI_FUNCTION_ADV_CALLBACK(menu_settings_ham_bands){
(void)item;
(void)data;
if(b){
b->icon = config.hambands ? BUTTON_ICON_CHECK : BUTTON_ICON_NOCHECK;
return;
}
toggle_hambands();
draw_menu();
}
#endif
static UI_FUNCTION_ADV_CALLBACK(menu_settings_below_if_acb){ static UI_FUNCTION_ADV_CALLBACK(menu_settings_below_if_acb){
(void)item; (void)item;
(void)data; (void)data;
@ -1574,6 +1588,21 @@ static const menuitem_t menu_sweep_speed[] =
{ MT_NONE, 0, NULL, NULL } // sentinel { MT_NONE, 0, NULL, NULL } // sentinel
}; };
static const menuitem_t menu_settings3[] =
{
{ MT_KEYPAD, KM_10MHZ, "CORRECT\nFREQUENCY", "Enter actual l0MHz frequency"},
{ MT_KEYPAD, KM_GRIDLINES, "MINIMUM\nGRIDLINES", "Enter minimum horizontal grid divisions"},
#ifdef __HAM_BAND__
{ MT_ADV_CALLBACK, 0, "HAM\nBANDS", menu_settings_ham_bands},
#endif
#ifdef __ULTRA__
{ MT_SUBMENU,0, "HARMONIC", menu_harmonic},
#endif
{ MT_CANCEL, 0, S_LARROW" BACK", NULL },
{ MT_NONE, 0, NULL, NULL } // sentinel
};
static const menuitem_t menu_settings2[] = static const menuitem_t menu_settings2[] =
{ {
{ MT_ADV_CALLBACK, 0, "AGC", menu_settings_agc_acb}, { MT_ADV_CALLBACK, 0, "AGC", menu_settings_agc_acb},
@ -1582,10 +1611,10 @@ static const menuitem_t menu_settings2[] =
{ MT_ADV_CALLBACK | MT_LOW, 0, "BELOW IF", menu_settings_below_if_acb}, { MT_ADV_CALLBACK | MT_LOW, 0, "BELOW IF", menu_settings_below_if_acb},
{ MT_KEYPAD, KM_DECAY, "HOLD\nSWEEPS", "1..1000 sweeps"}, { MT_KEYPAD, KM_DECAY, "HOLD\nSWEEPS", "1..1000 sweeps"},
{ MT_KEYPAD, KM_NOISE, "NOISE\nLEVEL", "2..20 dB"}, { MT_KEYPAD, KM_NOISE, "NOISE\nLEVEL", "2..20 dB"},
{ MT_KEYPAD, KM_10MHZ, "CORRECT\nFREQUENCY", "Enter actual l0MHz frequency"},
#ifdef __ULTRA__ #ifdef __ULTRA__
{ MT_SUBMENU,0, "HARMONIC", menu_harmonic}, { MT_SUBMENU,0, "HARMONIC", menu_harmonic},
#endif #endif
{ MT_SUBMENU, 0, S_RARROW" MORE", menu_settings3},
{ MT_CANCEL, 0, S_LARROW" BACK", NULL }, { MT_CANCEL, 0, S_LARROW" BACK", NULL },
{ MT_NONE, 0, NULL, NULL } // sentinel { MT_NONE, 0, NULL, NULL } // sentinel
}; };
@ -1997,6 +2026,10 @@ set_numeric_value(void)
completed = true; completed = true;
break; break;
case KM_GRIDLINES:
set_gridlines(uistat.value);
break;
} }
} }

Loading…
Cancel
Save

Powered by TurnKey Linux.