diff --git a/nanovna.h b/nanovna.h index 5a7da8a..493d773 100644 --- a/nanovna.h +++ b/nanovna.h @@ -274,32 +274,29 @@ extern void tlv320aic3204_select(int channel); #define OFFSETX 30 #define OFFSETY 0 +#define NGRIDY 10 +// GRIDX calculated depends from frequency span #ifdef __SCROLL__ -#define HEIGHT _height -extern int _height; -#define HEIGHT_SCROLL 180 -#define HEIGHT_NOSCROLL 230 +extern uint16_t _grid_y; +#define GRIDY _grid_y +#define HEIGHT_SCROLL 180 +#define HEIGHT_NOSCROLL 230 +#define SCROLL_GRIDY (HEIGHT_SCROLL / NGRIDY) +#define NOSCROLL_GRIDY (HEIGHT_NOSCROLL / NGRIDY) #else -// HEIGHT = 10*GRIDY -#define HEIGHT 230 -// WIDTH better be n*(POINTS_COUNT-1) +#define GRIDY (230 / NGRIDY) #endif + #define WIDTH (LCD_WIDTH - 1 - OFFSETX) +#define HEIGHT (GRIDY*NGRIDY) #define CELLWIDTH (32) #define CELLHEIGHT (32) -#define NGRIDY 10 -//#define NGRIDY 9 - #define FREQUENCIES_XPOS1 OFFSETX #define FREQUENCIES_XPOS2 200 #define FREQUENCIES_YPOS (LCD_HEIGHT-7) -// GRIDX calculated depends from frequency span -//#define GRIDY 29 -#define GRIDY (HEIGHT / NGRIDY) - // #define CELLOFFSETX 0 #define AREA_WIDTH_NORMAL (CELLOFFSETX + WIDTH + 1) @@ -498,7 +495,7 @@ extern volatile uint8_t redraw_request; // SPI bus revert byte order //gggBBBbb RRRrrGGG #define byteReverse16(x) (uint16_t)(((x) << 8) & 0xff00) | (((x) >> 8) & 0xff) -#define RGB565(r,g,b) byteReverse16( ((((uint16_t)r)<<8)&0b1111100000000000) | ((((uint16_t)g)<<3)&0b0000011111100000) | ((((uint16_t)b)>>3)&0b0000000000011111) ) +#define RGB565(r,g,b) byteReverse16( ((((uint16_t)(r))<<8)&0b1111100000000000) | ((((uint16_t)(g))<<3)&0b0000011111100000) | ((((uint16_t)(b))>>3)&0b0000000000011111) ) //#define RGB565(r,g,b) ( (((g)&0x1c)<<11) | (((b)&0xf8)<<5) | ((r)&0xf8) | (((g)&0xe0)>>5) ) #define RGBHEX(hex) ( (((hex)&0x001c00)<<3) | (((hex)&0x0000f8)<<5) | (((hex)&0xf80000)>>16) | (((hex)&0x00e000)>>13) ) diff --git a/plot.c b/plot.c index d7294d3..8b7c120 100644 --- a/plot.c +++ b/plot.c @@ -24,7 +24,7 @@ #include "nanovna.h" #ifdef __SCROLL__ -int _height = HEIGHT_NOSCROLL; +uint16_t _grid_y = NOSCROLL_GRIDY; int waterfall = false; int fullscreen = true; #endif @@ -1541,6 +1541,7 @@ draw_cell(int m, int n) cell_draw_test_info(x0, y0); #endif // PULSE; +#if 0 // Draw reference position (<10 system ticks for all screen calls) for (t = 0; t < TRACES_MAX; t++) { if (!trace[t].enabled) @@ -1555,6 +1556,7 @@ draw_cell(int m, int n) draw_refpos(x, y, config.trace_color[t]); } } +#endif // Need right clip cell render (25 system ticks for all screen calls) #if 1 if (w < CELLWIDTH) { @@ -2178,6 +2180,10 @@ redraw_frame(void) draw_cal_status(); } +#ifdef _USE_WATERFALL_PALETTE +#include "waterfall.c" +#endif + static void update_waterfall(void){ int i; int w_width = area_width < 290 ? area_width : 290; @@ -2187,25 +2193,47 @@ static void update_waterfall(void){ } index_t *index = trace_index[TRACE_ACTUAL]; for (i=0; i< w_width; i++) { // Add new topline - uint16_t y = CELL_Y(index[i]); -#if 0 - spi_buffer[i] = RGB565(255-y, y, (128-y)&0xFF); -#else + uint16_t color; + uint16_t y = CELL_Y(index[i]); // should be always in range 0 - HEIGHT_SCROLL +#ifdef _USE_WATERFALL_PALETTE +// y = (uint8_t)i; // for test + color = paltte[y]; +#elif 0 uint16_t ratio = (HEIGHT_SCROLL - y)*2; -// ratio = (i*2); // Uncomment for testing the waterfall colors - int16_t b = 255 - ratio; - if (b > 255) b = 255; - if (b < 0) b = 0; - int16_t r = ratio - 255; - if (r > 255) r = 255; - if (r < 0) r = 0; - int16_t g = 255 - b - r; +// ratio = (i*2); // Uncomment for testing the waterfall colors + int16_t b = 255 - ratio; + if (b > 255) b = 255; + if (b < 0) b = 0; + int16_t r = ratio - 255; + if (r > 255) r = 255; + if (r < 0) r = 0; + int16_t g = 255 - b - r; #define gamma_correct(X) X = (X < 64 ? X * 2 : X < 128 ? 128 + (X-64) : X < 192 ? 192 + (X - 128)/2 : 225 + (X - 192) / 4) - gamma_correct(r); - gamma_correct(g); - gamma_correct(b); - spi_buffer[i] = RGB565(r, g, b); + gamma_correct(r); + gamma_correct(g); + gamma_correct(b); + color = RGB565(r, g, b); +#else + // Calculate gradient palette for range 0 .. 192 + // idx r g b + // 0 - 192 0 0 + // 32 - 255 127 0 + // 64 - 255 255 127 + // 96 - 255 255 255 + // 128 - 127 255 255 + // 160 - 0 127 255 + // 192 - 0 0 127 + // 224 - 0 0 0 +// y = (uint8_t)i; // for test + if (y < 32) color = RGB565( 192+((y- 0)*2), 0+((y- 0)*4), 0); + else if (y < 64) color = RGB565( 255, 127+((y- 32)*4), 0+((y- 32)*4)); + else if (y < 96) color = RGB565( 255, 255, 127+((y- 64)*4)); + else if (y < 128) color = RGB565( 252-((y- 96)*4), 255, 255); + else if (y < 160) color = RGB565( 124-((y-128)*4), 252-((y-128)*4), 255); + else color = RGB565( 0, 124-((y-160)*4), 252-((y-160)*4)); + #endif + spi_buffer[i] = color; } ili9341_bulk(OFFSETX, HEIGHT_SCROLL+2, w_width, 1); } @@ -2219,8 +2247,8 @@ void toggle_waterfall(void) { if (!waterfall) { - _height = HEIGHT_SCROLL; -// ili9341_fill(OFFSETX, HEIGHT_SCROLL, LCD_WIDTH - OFFSETX, HEIGHT_NOSCROLL - HEIGHT_SCROLL, 0); + _grid_y = SCROLL_GRIDY; + ili9341_fill(OFFSETX, HEIGHT_SCROLL, LCD_WIDTH - OFFSETX, HEIGHT_NOSCROLL - HEIGHT_SCROLL, 0); waterfall = true; fullscreen = false; w_min = (int)min_level; @@ -2229,7 +2257,7 @@ toggle_waterfall(void) w_max = w_min + 20; } else { - _height = HEIGHT_NOSCROLL; + _grid_y = NOSCROLL_GRIDY; waterfall = false; fullscreen = true; } diff --git a/sa_core.c b/sa_core.c index e823dd4..bd1286e 100644 --- a/sa_core.c +++ b/sa_core.c @@ -1960,12 +1960,10 @@ void draw_cal_status(void) #define XSTEP 40 - + ili9341_fill(0, 0, OFFSETX, LCD_HEIGHT-1, 0x0000); if (MODE_OUTPUT(setting.mode)) { // No cal status during output - ili9341_fill(x, y, OFFSETX-5, HEIGHT, 0x0000); return; } - ili9341_fill(x, y, OFFSETX, HEIGHT, 0x0000); // if (current_menu_is_form() && !in_selftest) // return; @@ -2227,7 +2225,7 @@ void draw_cal_status(void) // ili9341_set_background(DEFAULT_BG_COLOR); // Bottom level - y = HEIGHT-7 + OFFSETY; + y = area_height - 7 + OFFSETY; if (rounding) plot_printf(buf, BLEN, "%4d", (int)(yMax - setting.scale * NGRIDY)); else diff --git a/ui.c b/ui.c index 4bb4915..f3c06a3 100644 --- a/ui.c +++ b/ui.c @@ -1154,7 +1154,7 @@ menu_move_back(void) redraw_frame(); area_width = 0; } else { - redraw_frame(); +// redraw_frame(); request_to_redraw_grid(); area_width = AREA_WIDTH_NORMAL - MENU_BUTTON_WIDTH; } @@ -1177,7 +1177,7 @@ menu_push_submenu(const menuitem_t *submenu) redraw_frame(); area_width = 0; } else { - redraw_frame(); +// redraw_frame(); request_to_redraw_grid(); area_width = AREA_WIDTH_NORMAL - MENU_BUTTON_WIDTH; } @@ -1725,7 +1725,7 @@ erase_menu_buttons(void) { // ili9341_fill(area_width, 0, LCD_WIDTH - area_width, area_height, DEFAULT_BG_COLOR); if (current_menu_is_form()) - ili9341_fill(5*5, 0,LCD_WIDTH-5*5, MENU_BUTTON_HEIGHT*MENU_BUTTON_MAX, DEFAULT_BG_COLOR); + ili9341_fill(OFFSETX, 0,LCD_WIDTH-OFFSETX, MENU_BUTTON_HEIGHT*MENU_BUTTON_MAX, DEFAULT_BG_COLOR); else ili9341_fill(LCD_WIDTH-MENU_BUTTON_WIDTH, 0, MENU_BUTTON_WIDTH, MENU_BUTTON_HEIGHT*MENU_BUTTON_MAX, DEFAULT_BG_COLOR); draw_frequencies(); diff --git a/waterfall.c b/waterfall.c new file mode 100644 index 0000000..d0da63d --- /dev/null +++ b/waterfall.c @@ -0,0 +1,281 @@ +/* Copyright (c) 2020, Dmitry (DiSlord) dislordlive@gmail.com + * All rights reserved. + * + * This is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * The software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +// Test palette for waterfall +// Possibly better use size = HEIGHT_SCROLL / 2 for more compact and allow use on different displays +// And build table for every display size +static const uint16_t palette[256] = { +RGB565(0xBA,0x01,0x00), +RGB565(0xBA,0x01,0x00), +RGB565(0xB9,0x01,0x00), +RGB565(0xBC,0x00,0x00), +RGB565(0xBE,0x00,0x00), +RGB565(0xBE,0x00,0x00), +RGB565(0xBD,0x00,0x00), +RGB565(0xC1,0x01,0x00), +RGB565(0xC1,0x00,0x00), +RGB565(0xC1,0x00,0x00), +RGB565(0xC1,0x00,0x00), +RGB565(0xC5,0x00,0x00), +RGB565(0xC6,0x00,0x01), +RGB565(0xC5,0x00,0x01), +RGB565(0xC8,0x00,0x00), +RGB565(0xCB,0x00,0x00), +RGB565(0xCC,0x00,0x01), +RGB565(0xCB,0x00,0x00), +RGB565(0xCD,0x00,0x00), +RGB565(0xCF,0x00,0x00), +RGB565(0xCF,0x00,0x00), +RGB565(0xD0,0x00,0x00), +RGB565(0xD5,0x00,0x00), +RGB565(0xD6,0x00,0x00), +RGB565(0xD6,0x00,0x00), +RGB565(0xD6,0x00,0x00), +RGB565(0xDC,0x00,0x00), +RGB565(0xDB,0x00,0x00), +RGB565(0xDC,0x00,0x00), +RGB565(0xDE,0x00,0x00), +RGB565(0xE0,0x00,0x00), +RGB565(0xDF,0x00,0x00), +RGB565(0xE0,0x00,0x00), +RGB565(0xE3,0x00,0x00), +RGB565(0xE6,0x00,0x00), +RGB565(0xE5,0x00,0x00), +RGB565(0xE6,0x00,0x00), +RGB565(0xEA,0x00,0x00), +RGB565(0xEB,0x00,0x00), +RGB565(0xEB,0x00,0x00), +RGB565(0xED,0x00,0x00), +RGB565(0xF0,0x00,0x00), +RGB565(0xEF,0x00,0x00), +RGB565(0xF0,0x00,0x00), +RGB565(0xF4,0x00,0x00), +RGB565(0xF6,0x01,0x00), +RGB565(0xF5,0x01,0x00), +RGB565(0xF6,0x00,0x00), +RGB565(0xF9,0x00,0x00), +RGB565(0xFC,0x00,0x00), +RGB565(0xFB,0x00,0x00), +RGB565(0xFC,0x00,0x00), +RGB565(0xFE,0x00,0x00), +RGB565(0xFE,0x00,0x00), +RGB565(0xFF,0x01,0x00), +RGB565(0xFF,0x09,0x01), +RGB565(0xFE,0x0D,0x02), +RGB565(0xFE,0x0C,0x02), +RGB565(0xFF,0x0C,0x01), +RGB565(0xFE,0x16,0x04), +RGB565(0xFE,0x17,0x02), +RGB565(0xFF,0x15,0x02), +RGB565(0xFF,0x19,0x03), +RGB565(0xFF,0x21,0x07), +RGB565(0xFF,0x22,0x07), +RGB565(0xFE,0x21,0x06), +RGB565(0xFD,0x27,0x05), +RGB565(0xFE,0x2C,0x07), +RGB565(0xFD,0x2B,0x08), +RGB565(0xFE,0x2B,0x07), +RGB565(0xFF,0x34,0x0B), +RGB565(0xFF,0x36,0x0C), +RGB565(0xFF,0x35,0x0C), +RGB565(0xFE,0x37,0x0C), +RGB565(0xFF,0x40,0x0B), +RGB565(0xFF,0x40,0x0C), +RGB565(0xFE,0x3E,0x0D), +RGB565(0xFE,0x44,0x0D), +RGB565(0xFF,0x4B,0x0E), +RGB565(0xFF,0x4A,0x10), +RGB565(0xFE,0x4A,0x0F), +RGB565(0xFE,0x52,0x0F), +RGB565(0xFF,0x55,0x10), +RGB565(0xFF,0x53,0x10), +RGB565(0xFE,0x57,0x0F), +RGB565(0xFF,0x5E,0x12), +RGB565(0xFF,0x5E,0x13), +RGB565(0xFF,0x5D,0x12), +RGB565(0xFF,0x64,0x14), +RGB565(0xFF,0x67,0x16), +RGB565(0xFF,0x68,0x14), +RGB565(0xFF,0x67,0x14), +RGB565(0xFE,0x6B,0x15), +RGB565(0xFE,0x71,0x13), +RGB565(0xFE,0x77,0x14), +RGB565(0xFC,0x77,0x12), +RGB565(0xFF,0x82,0x12), +RGB565(0xFE,0x85,0x11), +RGB565(0xFF,0x82,0x11), +RGB565(0xFD,0x89,0x0E), +RGB565(0xFC,0x91,0x10), +RGB565(0xFF,0x90,0x0F), +RGB565(0xFC,0x90,0x0F), +RGB565(0xFF,0x9A,0x0F), +RGB565(0xFF,0x9F,0x0D), +RGB565(0xFF,0x9E,0x0B), +RGB565(0xFF,0x9E,0x0D), +RGB565(0xFF,0xAD,0x0B), +RGB565(0xFF,0xAD,0x0C), +RGB565(0xFE,0xAC,0x0B), +RGB565(0xFE,0xB0,0x0A), +RGB565(0xFE,0xBA,0x0B), +RGB565(0xFE,0xBA,0x0B), +RGB565(0xFD,0xBA,0x09), +RGB565(0xFC,0xC2,0x08), +RGB565(0xFF,0xC8,0x09), +RGB565(0xFF,0xC7,0x09), +RGB565(0xFF,0xC8,0x08), +RGB565(0xFF,0xD4,0x05), +RGB565(0xFF,0xD7,0x06), +RGB565(0xFF,0xD6,0x06), +RGB565(0xFF,0xD9,0x05), +RGB565(0xFF,0xE4,0x02), +RGB565(0xFF,0xE4,0x03), +RGB565(0xFE,0xE3,0x03), +RGB565(0xFE,0xEA,0x02), +RGB565(0xFE,0xF2,0x01), +RGB565(0xFE,0xF2,0x02), +RGB565(0xFE,0xF0,0x04), +RGB565(0xFE,0xFB,0x01), +RGB565(0xFF,0xFF,0x00), +RGB565(0xFF,0xFF,0x00), +RGB565(0xFF,0xFE,0x03), +RGB565(0xFF,0xFE,0x16), +RGB565(0xFF,0xFF,0x16), +RGB565(0xFE,0xFF,0x18), +RGB565(0xFE,0xFF,0x21), +RGB565(0xFF,0xFE,0x30), +RGB565(0xFF,0xFE,0x2E), +RGB565(0xFF,0xFE,0x2D), +RGB565(0xFF,0xFE,0x41), +RGB565(0xFF,0xFF,0x48), +RGB565(0xFF,0xFF,0x47), +RGB565(0xFE,0xFE,0x47), +RGB565(0xFE,0xFE,0x5F), +RGB565(0xFF,0xFF,0x5F), +RGB565(0xFF,0xFF,0x5D), +RGB565(0xFE,0xFF,0x68), +RGB565(0xFD,0xFF,0x78), +RGB565(0xFE,0xFF,0x76), +RGB565(0xFD,0xFF,0x75), +RGB565(0xFF,0xFE,0x8A), +RGB565(0xFF,0xFE,0x8E), +RGB565(0xFF,0xFE,0x8E), +RGB565(0xFD,0xFE,0x8E), +RGB565(0xFF,0xFF,0xAA), +RGB565(0xFF,0xFF,0xA6), +RGB565(0xFF,0xFE,0xA5), +RGB565(0xFF,0xFE,0xB0), +RGB565(0xFF,0xFF,0xBF), +RGB565(0xFF,0xFF,0xBF), +RGB565(0xFE,0xFF,0xBD), +RGB565(0xFD,0xFF,0xCD), +RGB565(0xFD,0xFE,0xD8), +RGB565(0xFE,0xFE,0xD6), +RGB565(0xFE,0xFE,0xD8), +RGB565(0xFE,0xFF,0xEB), +RGB565(0xFD,0xFF,0xF1), +RGB565(0xFD,0xFF,0xED), +RGB565(0xFE,0xFF,0xF2), +RGB565(0xFF,0xFF,0xFF), +RGB565(0xFE,0xFF,0xFF), +RGB565(0xFC,0xFD,0xFE), +RGB565(0xEA,0xF5,0xFF), +RGB565(0xE0,0xF1,0xFF), +RGB565(0xE2,0xF3,0xFD), +RGB565(0xE1,0xF1,0xFE), +RGB565(0xD3,0xE7,0xFC), +RGB565(0xCB,0xE6,0xFF), +RGB565(0xD0,0xE6,0xFD), +RGB565(0xC9,0xE3,0xFD), +RGB565(0xB7,0xDC,0xFE), +RGB565(0xB9,0xDC,0xFE), +RGB565(0xB9,0xDD,0xFE), +RGB565(0xAD,0xD7,0xFD), +RGB565(0xA3,0xD2,0xFD), +RGB565(0xA2,0xD1,0xFD), +RGB565(0xA7,0xD2,0xFE), +RGB565(0x8F,0xC7,0xFF), +RGB565(0x8E,0xC7,0xFD), +RGB565(0x8F,0xC8,0xFD), +RGB565(0x89,0xC6,0xFE), +RGB565(0x7A,0xBB,0xFB), +RGB565(0x77,0xBD,0xFE), +RGB565(0x7B,0xBC,0xFC), +RGB565(0x70,0xB7,0xFE), +RGB565(0x61,0xB2,0xFE), +RGB565(0x64,0xB2,0xFD), +RGB565(0x63,0xB4,0xFE), +RGB565(0x53,0xAB,0xFF), +RGB565(0x4E,0xA8,0xFD), +RGB565(0x4E,0xA9,0xFF), +RGB565(0x52,0xA9,0xFF), +RGB565(0x35,0x9B,0xFD), +RGB565(0x39,0x9E,0xFE), +RGB565(0x3A,0x9E,0xFE), +RGB565(0x32,0x9A,0xFE), +RGB565(0x22,0x92,0xFC), +RGB565(0x24,0x94,0xFF), +RGB565(0x26,0x93,0xFD), +RGB565(0x20,0x91,0xFE), +RGB565(0x1C,0x8B,0xFC), +RGB565(0x1C,0x85,0xF8), +RGB565(0x19,0x86,0xF8), +RGB565(0x18,0x7A,0xEE), +RGB565(0x19,0x79,0xEC), +RGB565(0x19,0x7A,0xED), +RGB565(0x18,0x75,0xEC), +RGB565(0x14,0x6B,0xE4), +RGB565(0x16,0x6B,0xE5), +RGB565(0x16,0x6D,0xE5), +RGB565(0x15,0x62,0xDE), +RGB565(0x11,0x5D,0xDA), +RGB565(0x13,0x5E,0xDB), +RGB565(0x11,0x5E,0xD8), +RGB565(0x0F,0x52,0xD0), +RGB565(0x0F,0x50,0xCE), +RGB565(0x10,0x51,0xCF), +RGB565(0x0F,0x4D,0xCC), +RGB565(0x0E,0x43,0xC5), +RGB565(0x0E,0x41,0xC4), +RGB565(0x0D,0x44,0xC5), +RGB565(0x0D,0x3B,0xBF), +RGB565(0x0C,0x34,0xBA), +RGB565(0x0A,0x35,0xBB), +RGB565(0x0D,0x35,0xBC), +RGB565(0x06,0x28,0xB0), +RGB565(0x07,0x28,0xAE), +RGB565(0x07,0x29,0xAF), +RGB565(0x07,0x25,0xAD), +RGB565(0x04,0x1A,0xA4), +RGB565(0x05,0x1A,0xA4), +RGB565(0x04,0x1B,0xA5), +RGB565(0x04,0x13,0x9F), +RGB565(0x02,0x0C,0x9B), +RGB565(0x02,0x0D,0x9B), +RGB565(0x01,0x0D,0x9B), +RGB565(0x00,0x02,0x93), +RGB565(0x00,0x00,0x90), +RGB565(0x00,0x01,0x91), +RGB565(0x00,0x01,0x8F), +RGB565(0x01,0x00,0x8A), +RGB565(0x01,0x00,0x89), +RGB565(0x01,0x00,0x8A), +RGB565(0x00,0x00,0x87), +RGB565(0x00,0x00,0x83), +RGB565(0x00,0x00,0x84), +}; \ No newline at end of file