Add waterfall palette (not used by default) for enable need #define _USE_WATERFALL_PALETTE in nanovna.h (more info see in waterfall.c)

Add gradient calculation for waterfall (enabled by default)
Now HEIGHT = (GRIDY*NGRIDY), GRIDY variable integer value and depend from render area height
It allow save size and more better align render area
More constants fixes for 4`display
Fix full screen redraw on menu back or select next
pull/4/head
DiSlord 6 years ago
parent a1f4799e33
commit d4044808e8

@ -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) )

@ -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;
}

@ -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

@ -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();

@ -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),
};
Loading…
Cancel
Save

Powered by TurnKey Linux.