first commit

This commit is contained in:
2022-11-08 16:13:55 +01:00
commit f838fa66c4
2500 changed files with 2237507 additions and 0 deletions
@@ -0,0 +1,72 @@
# Tool to extract 8x8 font data, save to bitmap file, and apply modifications
# to source code after editing the bitmap.
from __future__ import print_function
from matplotlib.pyplot import imread, imsave, imshow, show
import numpy as np
import sys
# Where to find the font data - may need updated if code has changed.
source_file = 'ui_lcd_hy28_fonts.c'
start_marker = 'const uint8_t GL_ASCII8x8_Table [] ='
start_offset = 2 # Data starts this number of lines after start marker.
end_marker = '};' # Indicates end of font data.
# Image filename used in extract and insert modes.
image_file = 'font-8x8.png'
#mode = None
#mode = show
mode = extract
#mode = insert
if len(sys.argv) > 1:
mode = sys.argv[1]
if mode not in ('show', 'extract', 'insert'):
print("Usage: %s { show | extract | insert }" % sys.argv[0])
sys.exit(1)
# Get the literals used to populate the font array in the source file
lines = [line.rstrip() for line in open(source_file).readlines()]
start = lines.index(start_marker) + start_offset
end = start + lines[start:].index(end_marker)
data = str.join("", lines[start:end])
# Eval the literals to get the values into a numpy array
packed = eval("np.array([%s], np.uint8)" % data)
# Reorganise into a monochrome image, with the 96 8 x 8 characters
# laid out in 8 rows by 12 columns for easier viewing/editing
unpacked = np.unpackbits(packed)
bitmaps = unpacked.reshape(96, 8, 8)
indices = np.arange(96).reshape(8, 12)
image = np.block([[bitmaps[idx] for idx in row] for row in indices])
if mode == 'show':
# Display font image
imshow(image, cmap='binary')
show()
elif mode == 'extract':
# Save font image
imsave(image_file, image, format='png', cmap='binary')
elif mode == 'insert':
# Read in modified font image
image = imread(image_file)[:,:,0].astype(bool)
# Reorganise back to original order
bitmaps = np.vstack([np.vstack(np.split(row, 12, 1))
for row in np.split(image, 8)])
unpacked = bitmaps.reshape(-1)
packed = ~np.packbits(unpacked)
# Replace lines of file in same format as used before
grouped = packed.reshape(-1, 8)
for i, group in enumerate(grouped):
line = (" " + " 0x%02x," * 8) % tuple(group)
lines[start + i] = line
# Write out modified source file
open(source_file, 'w').writelines([line + "\n" for line in lines])
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,301 @@
/* -*- mode: c; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4; coding: utf-8 -*- */
/************************************************************************************
** **
** mcHF QRP Transceiver **
** K Atanassov - M0NKA 2014 **
** **
**---------------------------------------------------------------------------------**
** **
** File name: **
** Description: **
** Last Modified: **
** Licence: GNU GPLv3 **
************************************************************************************/
#ifndef __UI_LCD_HY28_H
#define __UI_LCD_HY28_H
#include "uhsdr_types.h"
#define RGB(red,green,blue)(uint16_t)(((red>>3)<<11)|((green>>2)<<5)|(blue>> 3))
// Colors definitions, go to http://www.color-hex.com/
// choose a new one and declare here
//
#define White 0xFFFF
#define Black 0x0000
#ifdef GREY_STYLE
#define Grey 0xBDF5 //RGB(0xb8,0xbc,0xa8)
#define Blue 0x632C //RGB(0x66,0x66,0x66)
#define Blue2 0x4A69 //RGB(0x4C,0x4C,0x4C)
#define Blue3 0x1082 //RGB(0x10,0x10,0x10)
#define Red 0x8C51 //RGB(0x89,0x89,0x89)
#define Red2 0xA534 //RGB(0xA7,0xA7,0xA7)
#define Red3 0xD69A //RGB(0xD0,0xD0,0xD0)
#define Red4 0x18E3 //RGB(0x1C,0x1C,0x1C)
#define Magenta 0x94B2 //RGB(0x95,0x95,0x95)
#define Green 0xDEFB //RGB(0xDC,0xDC,0xDC)
#define Green2 0x31A6 //RGB(0x36,0x36,0x36)
#define Cyan 0xE73C //RGB(0xE5,0xE5,0xE5)
#define Yellow 0xF7BE //RGB(0xF7,0xF7,0xF7)
#define Orange 0xBDF7 //RGB(0xBC,0xBC,0xBC)
#define Cream 0xE73C //RGB(0xE7,0xE7,0xE7)
#define Grey1 0x8410 //RGB(0x80,0x80,0x80)
#define Grey2 0xC618 //RGB(0xC0,0xC0,0xC0)
#define Grey3 0xA555 //RGB(0xA6,0xA8,0xAD)
#define Grey4 0x4208 //RGB(0x40,0x40,0x40)
#define Grey5 0x630C //RGB(0x60,0x60,0x60)
#define Grey6 0x7BCF //RGB(0x78,0x78,0x78)
#define Grey7 0x2104 //RGB(0x20,0x20,0x20)
#define RX_Grey 0xBED5 //RGB(0xb8,0xdb,0xa8)
#define TX_Grey 0xED74 //RGB(0xe8,0xad,0xa0)
#define Brown 0x4A49 //RGB(0x4A,0x4A,0x4A)
#elif defined(SEPIA_STYLE)
#define Grey 0xD5AE //RGB(0xD6,0xB6,0x77)
#define Blue 0x7B28 //RGB(0x7A,0x64,0x45)
#define Blue2 0x5A46 //RGB(0x5C,0x4B,0x33)
#define Blue3 0x1061 //RGB(0x11,0x0E,0x0B)
#define Red 0xA42B //RGB(0xA2,0x86,0x5D)
#define Red2 0xC50E //RGB(0xC4,0xA2,0x73)
#define Red3 0xF651 //RGB(0xF3,0xCA,0x8F)
#define Red4 0x20C2 //RGB(0x21,0x1A,0x14)
#define Magenta 0xB48C //RGB(0xB1,0x92,0x67)
#define Green 0xFEB3 //RGB(0xFF,0xD7,0x9E)
#define Green2 0x41A4 //RGB(0x41,0x34,0x24)
#define Cyan 0xFFF6 //RGB(0xFF,0xFF,0xB5)
#define Yellow 0xFFDD //RGB(0xFF,0xF8,0xEC)
#define Orange 0xDDB0 //RGB(0xDC,0xB6,0x81)
#define Cream 0xFF37 //RGB(0xFF,0xE4,0xBC)
#define Grey1 0x93EA //RGB(0x96,0x7C,0x56)
#define Grey2 0xE5F0 //RGB(0xE0,0xBC,0x85)
#define Grey3 0xFEB2 //RGB(0xFF,0xD4,0x97)
#define Grey4 0x49E5 //RGB(0x4D,0x3E,0x2A)
#define Grey5 0x72E8 //RGB(0x72,0x5D,0x40)
#define Grey6 0x8BAA //RGB(0x8D,0x74,0x50)
#define Grey7 0x20E2 //RGB(0x27,0x1F,0x17)
#define RX_Grey 0xDDB0 //RGB(0xDB,0xB5,0x80)
#define TX_Grey 0xDDB0 //RGB(0xDB,0xB5,0x80)
#define Brown 0x5A46 //RGB(0x59,0x49,0x31)
#else
#define Grey 0xBDF5 //RGB(0xb8,0xbc,0xa8) //=0xBDF5
#define Blue 0x529F //RGB(0x50,0x50,0xFF) // Brighter Blue //Original - 0x001F =#0000FF
#define Blue2 0x051F // =#00A0FF
#define Blue3 0x000A //RGB(0x00,0x00,0x50)
#define Red 0xF9C7 //RGB(0xFF,0x38,0x38) // Brighter (easier to see) Red //Original 0xF800 =#FF0000
#define Red2 0xFC10 //RGB(0xFF,0x80,0x80) // Even "brighter" red (almost pink)
#define Red3 0xFE18 //RGB(0xFF,0xC0,0xC0) // A sort of pink-ish, pale red
#define Red4 0x4000 //RGB(0x40,0x00,0x00)
#define Magenta 0xF99F //RGB(0xFF,0x30,0xFF) // Brighter Magenta //Original 0xF81F =#FF00FF
#define Green 0x07E0 // =#00FF00
#define Green2 0x0200 //RGB(0x00,0x40,0x00)
#define Cyan 0x7FFF
#define Yellow 0xFFE4 //RGB(0xFF,0xFF,0x20) // "Yellower" and brighter //Original - 0xFFE0 =#FFFF00
#define Orange 0xFD44 //RGB(0xFF,0xA8,0x20) //"Orange-er" and brighter //Original - RGB(0xF6,0xA0,0x1A)
#define Cream 0xEF3A //RGB(0xED,0xE7,0xD7)
#define Grey1 0x8410 //RGB(0x80,0x80,0x80)
#define Grey2 0xC618 //RGB(0xC0,0xC0,0xC0)
#define Grey3 0xA555 //RGB(0xA6,0xA8,0xAD)
#define Grey4 0x4208 //RGB(0x40,0x40,0x40)
#define Grey5 0x630C //RGB(0x60,0x60,0x60)
#define Grey6 0x7BCF //RGB(0x78,0x78,0x78)
#define Grey7 0x2104 //RGB(0x20,0x20,0x20)
#define RX_Grey 0xBED5 //RGB(0xb8,0xdb,0xa8) // slightly green grey
#define TX_Grey 0xED74 //RGB(0xe8,0xad,0xa0) // slightly red(ish) grey (more magenta, actually...)
#define Brown 0x6204 //RGB(0x65,0x43,0x21)
#endif
#define SMALL_FONT_WIDTH 8
#define LARGE_FONT_WIDTH 16
#define LCD_DIR_HORIZONTAL 0x0000
#define LCD_DIR_VERTICAL 0x0001
#define GRADIENT_STEP 8
#define TOUCHSCREEN_NO_MIRROR_NOFLIP 0
#define TOUCHSCREEN_X_MIRROR_NOFLIP 1
#define TOUCHSCREEN_Y_MIRROR_NOFLIP 2
#define TOUCHSCREEN_XY_MIRROR_NOFLIP 3
#define TOUCHSCREEN_NO_MIRROR_FLIPXY 4
#define TOUCHSCREEN_X_MIRROR_FLIPXY 5
#define TOUCHSCREEN_Y_MIRROR_FLIPXY 6
#define TOUCHSCREEN_XY_MIRROR_FLIPXY 7
// ----------------------------------------------------------
typedef enum
{
DISPLAY_NONE = 0,
DISPLAY_HY28A_SPI,
DISPLAY_HY28B_SPI,
DISPLAY_HY28B_PARALLEL,
DISPLAY_RA8875_SPI,
DISPLAY_RA8875_PARALLEL,
DISPLAY_ILI9486_PARALLEL,
DISPLAY_ST7796_PARALLEL,
DISPLAY_RPI_SPI,
DISPLAY_HY32D_PARALLEL_SSD1289,
// keep this always at the end of the enum
DISPLAY_NUM
} mchf_display_types_t;
typedef struct {
uint16_t reg;
uint16_t val;
} RegisterValue_t;
typedef struct RegisterValueSetInfo_s {
const RegisterValue_t* addr;
size_t size;
} RegisterValueSetInfo_t;
#define REGVAL_DATA (0xffff) // we indicate that the value is to be written using WriteData instead of WriteReg
#define REGVAL_DELAY (0x0000) // we indicate that the value is to be used as delay in ms instead of WriteReg
typedef struct
{
mchf_display_types_t display_type;
const char* name;
uint16_t (*ReadDisplayId)();
void (*SetActiveWindow) (uint16_t XLeft, uint16_t XRight, uint16_t YTop, uint16_t YBottom);
void (*SetCursorA)( unsigned short Xpos, unsigned short Ypos );
void (*WriteRAM_Prepare) ();
void (*WriteDataSpiStart_Prepare)();
void (*WriteIndexSpi_Prepare)();
void (*WriteReg)(unsigned short LCD_Reg, unsigned short LCD_RegValue);
uint16_t (*ReadReg)( uint16_t LCD_Reg);
void (*DrawStraightLine)(uint16_t x, uint16_t y, uint16_t Length, uint8_t Direction,uint16_t color);
void (*DrawFullRect)(uint16_t Xpos, uint16_t Ypos, uint16_t Height, uint16_t Width ,uint16_t color);
void (*DrawColorPoint)(uint16_t Xpos, uint16_t Ypos, uint16_t point);
GPIO_TypeDef* spi_cs_port;
uint16_t spi_cs_pin;
uint16_t is_spi:1;
uint16_t spi_speed:1;
} uhsdr_display_info_t;
typedef struct
{
uint8_t display_type; // existence/identification of display type
uint16_t DeviceCode; // LCD ident code
bool use_spi;
int16_t lcd_cs;
uint16_t MAX_X;
uint16_t MAX_Y;
GPIO_TypeDef* lcd_cs_pio;
const RegisterValueSetInfo_t* reg_info;
void (*SetActiveWindow) (uint16_t XLeft, uint16_t XRight, uint16_t YTop, uint16_t YBottom);
void (*SetCursorA)( unsigned short Xpos, unsigned short Ypos );
void (*WriteRAM_Prepare) ();
void (*WriteDataSpiStart_Prepare)();
void (*WriteIndexSpi_Prepare)();
void (*WriteReg)(unsigned short LCD_Reg, unsigned short LCD_RegValue);
uint16_t (*ReadReg)( uint16_t LCD_Reg);
void (*DrawStraightLine)(uint16_t x, uint16_t y, uint16_t Length, uint8_t Direction,uint16_t color);
void (*DrawFullRect)(uint16_t Xpos, uint16_t Ypos, uint16_t Height, uint16_t Width ,uint16_t color);
void (*DrawColorPoint)(uint16_t Xpos, uint16_t Ypos, uint16_t point);
} mchf_display_t;
extern mchf_display_t mchf_display;
const uhsdr_display_info_t* UiLcdHy28_DisplayInfoGet(mchf_display_types_t display_type);
void UiLcdHy28_LcdClear(ushort Color);
//uint16_t UiLcdHy28_PrintText(uint16_t Xpos, uint16_t Ypos, const char *str,const uint32_t Color, const uint32_t bkColor, uchar font);
uint16_t UiLcdHy28_PrintText(uint16_t Xpos, uint16_t Ypos, const char *str, uint32_t Color, uint32_t bkColor, uchar font);
//uint16_t UiLcdHy28_PrintTextRight(uint16_t Xpos, uint16_t Ypos, const char *str,const uint32_t Color, const uint32_t bkColor, uchar font);
uint16_t UiLcdHy28_PrintTextRight(uint16_t Xpos, uint16_t Ypos, const char *str, uint32_t Color, uint32_t bkColor, uchar font);
uint16_t UiLcdHy28_PrintTextCentered(const uint16_t bbX,const uint16_t bbY,const uint16_t bbW,const char* txt,uint32_t clr_fg,uint32_t clr_bg,uint8_t font);
//void UiLcdHy28_PrintTextVertLen(uint16_t XposStart, uint16_t YposStart, const char *str, const uint16_t len, const uint32_t clr_fg, const uint32_t clr_bg);
void UiLcdHy28_PrintTextVertLen(uint16_t XposStart, uint16_t YposStart, const char *str, const uint16_t len, uint32_t clr_fg, uint32_t clr_bg);
uint16_t UiLcdHy28_TextWidth(const char *str, uchar font);
uint16_t UiLcdHy28_TextHeight(uint8_t font);
void UiLcdHy28_DrawStraightLine(ushort Xpos, ushort Ypos, ushort Length, uchar Direction,ushort color);
void UiLcdHy28_DrawStraightLineDouble(ushort Xpos, ushort Ypos, ushort Length, uchar Direction,ushort color);
void UiLcdHy28_DrawStraightLineTriple(ushort Xpos, ushort Ypos, ushort Length, uchar Direction,ushort color);
void UiLcdHy28_DrawHorizLineWithGrad(ushort Xpos, ushort Ypos, ushort Length,ushort gradient_start);
void UiLcdHy28_DrawEmptyRect(ushort Xpos, ushort Ypos, ushort Height, ushort Width, ushort color);
void UiLcdHy28_DrawBottomButton(ushort Xpos, ushort Ypos, ushort Height, ushort Width,ushort color);
void UiLcdHy28_DrawFullRect (ushort Xpos, ushort Ypos, ushort Height, ushort Width, ushort color);
void UiLcdHy28_DrawColorPoint(ushort x, ushort y, ushort color);
void UiLcdHy28_BulkPixel_OpenWrite(ushort x, ushort width, ushort y, ushort height);
void UiLcdHy28_BulkPixel_CloseWrite(void);
void UiLcdHy28_BulkPixel_Put(uint16_t pixel);
void UiLcdHy28_BulkPixel_PutBuffer(uint16_t* pixel_buffer, uint32_t len);
void UiLcdHy28_BulkPixel_BufferFlush(void);
uint8_t UiLcdHy28_Init(void);
void UiLcdHy28_BacklightEnable(bool on);
typedef struct
{
uint8_t state;
uint16_t xraw;
uint16_t yraw;
int16_t xraw_m1;
int16_t xraw_m2;
int16_t yraw_m1;
int16_t yraw_m2;
int16_t focus_xprev;
int16_t focus_yprev;
//int32_t xraw_avgBuff;
//int32_t yraw_avgBuff;
int16_t hr_x;
int16_t hr_y;
uint16_t xraw_prev;
uint16_t yraw_prev;
int32_t cal[6];
bool present;
} mchf_touchscreen_t;
#define TP_DATASETS_VALID 0x04 // number of sets that must be identical for marked as VALID
#define TP_DATASETS_WAIT 0x01 // first dataset received
#define TP_DATASETS_PROCESSED 0xff
#define TP_DATASETS_NONE 0x00
extern mchf_touchscreen_t mchf_touchscreen;
void UiLcdHy28_TouchscreenDetectPress(void);
void UiLcdHy28_TouchscreenReadCoordinates(void);
bool UiLcdHy28_TouchscreenHasProcessableCoordinates(void);
void UiLcdHy28_TouchscreenInit(uint8_t mirror);
/*
// FIXME: THIS MUST BE HANDLED DIFFERENTLY, IT DOES NOT ALWAYS SEES
// THE CONFIGURATION FROM uhsdr_board.h but due to dependency issues, we cannot include
// uhsdr_board.h at the top
#ifdef USE_DISP_480_320
#define MAX_X 480
#define MAX_Y 320
#elif defined(USE_DISP_800_480)
#define MAX_X 800
#define MAX_Y 480
#else
#ifdef Simulate320_240_on_480_320
#define MAX_X 480
#define MAX_Y 320
#else
#define MAX_X 320
#define MAX_Y 240
#endif
#endif
*/
#endif
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,41 @@
/* -*- mode: c; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4; coding: utf-8 -*- */
/************************************************************************************
** **
** mcHF QRP Transceiver **
** K Atanassov - M0NKA 2014 **
** **
**---------------------------------------------------------------------------------**
** **
** File name: **
** Description: **
** Last Modified: **
** Licence: GNU GPLv3 **
************************************************************************************/
#ifndef __UI_LCD_HY28_FONTS_H
#define __UI_LCD_HY28_FONTS_H
typedef struct
{
const uint8_t width;
const void* data;
} symbolData_t;
typedef struct
{
const void *table;
uint8_t Width;
uint8_t Height;
uint16_t maxCode;
uint8_t BitCount;
uint8_t firstCode;
uint8_t Spacing;
#ifdef USE_8bit_FONT
const uint16_t *offsetTable;
const uint8_t *heightTable;
const uint8_t *widthTable;
#endif
} sFONT;
#endif //__UI_LCD_HY28_FONTS_H
@@ -0,0 +1,758 @@
/* -*- mode: c; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4; coding: utf-8 -*- */
/************************************************************************************
** **
** UHSDR **
** a powerful firmware for STM32 based SDR transceivers **
** **
**--------------------------------------------------------------------------------**
** **
** File name: ui_lcd_layouts.c **
** Description: Layout definitions file **
** Licence: GNU GPLv3 **
** Author: Slawomir Balon/SP9BSL **
************************************************************************************/
#ifndef BOOTLOADER_BUILD
#include "uhsdr_board.h"
#include "ui_lcd_layouts.h"
#include "ui_driver.h"
//------------------------------------------------------------------------------------------------------------------------------------------
//some local 480x320 calculations to make life easier in case of change something
#define R480320_TUNE_FREQ_X 280
#define R480320_TUNE_FREQ_Y 36
#define R480320_TUNE_SPLIT_FREQ_X (R480320_TUNE_FREQ_X+80)//Shift with a small split to the right to close the frequency digits.
#define R480320_TUNE_SPLIT_MARKER_X (R480320_TUNE_FREQ_X+40)
#define R480320_TUNE_SPLIT_FREQ_Y_TX (R480320_TUNE_FREQ_Y+12)
#define R480320_TUNE_SFREQ_X (R480320_TUNE_FREQ_X + 120)// Second frequency display control
#define R480320_TUNE_SFREQ_Y (R480320_TUNE_FREQ_Y - 20)
#define R480320_DisplayDbm_X (R480320_TUNE_FREQ_X+45)
#define R480320_DisplayDbm_Y (R480320_TUNE_FREQ_Y-36)
#define R480320_MEMORYLABEL_X (R480320_TUNE_FREQ_X+45+(SMALL_FONT_WIDTH * 11)+4)
#define R480320_MEMORYLABEL_Y (R480320_TUNE_FREQ_Y-36)
#define R480320_BAND_MODE_X (R480320_TUNE_FREQ_X + 160)
#define R480320_BAND_MODE_Y (R480320_TUNE_FREQ_Y + 7)
#define R480320_BAND_MODE_MASK_X (R480320_BAND_MODE_X - 1)
#define R480320_BAND_MODE_MASK_Y (R480320_BAND_MODE_Y - 1)
#define R480320_BAND_MODE_MASK_H 13
#define R480320_BAND_MODE_MASK_W 33
// Demodulator mode control
#define R480320_DEMOD_MODE_X (R480320_TUNE_FREQ_X -61)
#define R480320_DEMOD_MODE_Y (R480320_TUNE_FREQ_Y - 20)
#define R480320_DEMOD_MODE_MASK_X R480320_DEMOD_MODE_X
#define R480320_DEMOD_MODE_MASK_Y (R480320_DEMOD_MODE_Y - 1)
#define R480320_DEMOD_MODE_MASK_H 13
#define R480320_DEMOD_MODE_MASK_W 58 //same as R480320_DIGMODE_IND_W
// AGC display box
//#define R480320_AGC_MASK_X (R480320_DEMOD_MODE_MASK_X-41)
#define R480320_AGC_MASK_X (R480320_TUNE_FREQ_X)
#define R480320_AGC_MASK_Y R480320_DEMOD_MODE_MASK_Y
#define R480320_AGC_MASK_W 41
#define R480320_AGC_MASK_H R480320_DEMOD_MODE_MASK_H
// Tunning step control
#define R480320_TUNE_STEP_X (R480320_TUNE_FREQ_X + 45)
#define R480320_TUNE_STEP_Y (R480320_TUNE_FREQ_Y - 21)
#define R480320_TUNE_STEP_MASK_H 15
#define R480320_TUNE_STEP_MASK_W (SMALL_FONT_WIDTH*7)
#define R480320_PW_IND_X (R480320_TUNE_FREQ_X)
#define R480320_PW_IND_Y (R480320_DEMOD_MODE_Y - 16)
#define R480320_PW_IND_W 41
#define R480320_SM_IND_X 0
#define R480320_SM_IND_Y 0
#define R480320_SM_IND_W (200)
#define R480320_SM_IND_H (72 - 14)
#define R480320_LEFTBOXES_IND_X 0
#define R480320_LEFTBOXES_IND_Y 64
#define R480320_LEFTBOX_WIDTH 58 // used for the lower left side controls
#define R480320_LEFTBOX_ROW_H 31
#define R480320_LEFTBOX_ROW_2ND_OFF 15
#define R480320_ENCODER_IND_X 128
#define R480320_ENCODER_IND_Y 64
#define R480320_DIGMODE_IND_X R480320_DEMOD_MODE_MASK_X // 218
#define R480320_DIGMODE_IND_Y 0
#define R480320_DIGMODE_IND_W R480320_DEMOD_MODE_MASK_W
//------------------------------------------------------------------------------------------------------------------------------------------
//some local 320x240 calculations to make life easier in case of change something
#define R320240_TUNE_FREQ_X 116
#define R320240_TUNE_FREQ_Y 100
#define R320240_TUNE_SPLIT_FREQ_X (R320240_TUNE_FREQ_X+80)//Shift with a small split to the right to close the frequency digits.
#define R320240_TUNE_SPLIT_MARKER_X (R320240_TUNE_FREQ_X+40)
#define R320240_TUNE_SPLIT_FREQ_Y_TX (R320240_TUNE_FREQ_Y+12)
#define R320240_TUNE_SFREQ_X (R320240_TUNE_FREQ_X + 120)// Second frequency display control
#define R320240_TUNE_SFREQ_Y (R320240_TUNE_FREQ_Y - 20)
#define R320240_DisplayDbm_X (R320240_TUNE_FREQ_X+45)
#define R320240_DisplayDbm_Y (R320240_TUNE_FREQ_Y-36)
#define R320240_MEMORYLABEL_X (R320240_TUNE_FREQ_X+45+(SMALL_FONT_WIDTH * 11)+4)
#define R320240_MEMORYLABEL_Y (R320240_TUNE_FREQ_Y-36)
#define R320240_BAND_MODE_X (R320240_TUNE_FREQ_X + 160)
#define R320240_BAND_MODE_Y (R320240_TUNE_FREQ_Y + 7)
#define R320240_BAND_MODE_MASK_X (R320240_BAND_MODE_X - 1)
#define R320240_BAND_MODE_MASK_Y (R320240_BAND_MODE_Y - 1)
#define R320240_BAND_MODE_MASK_H 13
#define R320240_BAND_MODE_MASK_W 33
// Demodulator mode control
#define R320240_DEMOD_MODE_X (R320240_TUNE_FREQ_X + 1)
#define R320240_DEMOD_MODE_Y (R320240_TUNE_FREQ_Y - 20)
#define R320240_DEMOD_MODE_MASK_X (R320240_DEMOD_MODE_X - 1)
#define R320240_DEMOD_MODE_MASK_Y (R320240_DEMOD_MODE_Y - 1)
#define R320240_DEMOD_MODE_MASK_H 13
#define R320240_DEMOD_MODE_MASK_W 41
// AGC display box
#define R320240_AGC_MASK_X (R320240_DEMOD_MODE_MASK_X-41)
#define R320240_AGC_MASK_Y R320240_DEMOD_MODE_MASK_Y
#define R320240_AGC_MASK_W (R320240_DEMOD_MODE_MASK_W-6)
#define R320240_AGC_MASK_H R320240_DEMOD_MODE_MASK_H
// Tunning step control
#define R320240_TUNE_STEP_X (R320240_TUNE_FREQ_X + 45)
#define R320240_TUNE_STEP_Y (R320240_TUNE_FREQ_Y - 21)
#define R320240_TUNE_STEP_MASK_H 15
#define R320240_TUNE_STEP_MASK_W (SMALL_FONT_WIDTH*7)
#define R320240_PW_IND_X (R320240_DEMOD_MODE_X -1)
#define R320240_PW_IND_Y (R320240_DEMOD_MODE_Y - 16)
#define R320240_PW_IND_W 41
#define R320240_SM_IND_X 116
#define R320240_SM_IND_Y 0
#define R320240_SM_IND_W (200)
#define R320240_SM_IND_H (72 - 14)
#define R320240_LEFTBOXES_IND_X 0
#define R320240_LEFTBOXES_IND_Y 130
#define R320240_LEFTBOX_WIDTH 58 // used for the lower left side controls
#define R320240_LEFTBOX_ROW_H 28
#define R320240_LEFTBOX_ROW_2ND_OFF 13
#define R320240_ENCODER_IND_X 0
#define R320240_ENCODER_IND_Y 16
#define R320240_DIGMODE_IND_X 0
#define R320240_DIGMODE_IND_Y 191
#define R320240_DIGMODE_IND_W 58
//------------------------------------------------------------------------------------------------------------------------------------------
//Touchscreen definitions for 480x320
static const touchaction_descr_t R480320_touchactions_normal[] =
{
#ifndef SDR_AMBER_480_320
#ifndef OVI40_MOD_480_320
{ {R480320_SM_IND_X,R480320_SM_IND_Y,R480320_SM_IND_W,R480320_SM_IND_H}, UiAction_ChangeLowerMeterUp, NULL }, // Lower Meter: Meter Toggle
{ {0,110,160,16}, UiAction_ToggleWaterfallScopeDisplay, UiAction_ChangeSpectrumSize }, // Spectrum Bar Left Part: WaterfallScope Toggle
{ {(480/2)-16,110,48,16}, UiAction_ChangeSpectrumZoomLevelDown, UiAction_CheckSpectrumTouchActions }, // Spectrum Bar Middle Part: Decrease Zoom Level
{ {(480/2)+100,110,48,16}, UiAction_ChangeSpectrumZoomLevelUp, UiAction_CheckSpectrumTouchActions }, // Spectrum Bar Right Part: Increase Zoom Level
{ {R480320_TUNE_FREQ_X+16*7,R480320_TUNE_FREQ_Y,16*3,24}, UiAction_ChangeFrequencyToNextKhz, NULL }, // Frequency display, last three digits :Set last 3 digits to zero
{ {R480320_TUNE_FREQ_X,R480320_TUNE_FREQ_Y,16*7,24}, UiVk_BndSelVirtualKeys, UiVk_BndFreqSetVirtualKeys }, // Frequency display, first digits :Select the band
{ {R480320_DEMOD_MODE_X,R480320_DEMOD_MODE_Y,R480320_DEMOD_MODE_MASK_W,R480320_DEMOD_MODE_MASK_H}, UiVk_ModSelVirtualKeys, NULL }, // Demod Mode Box: mode switch
{ {R480320_PW_IND_X,R480320_PW_IND_Y,64,30}, UiAction_ChangePowerLevel, NULL }, // Power Box: TX Power Increase
{ {R480320_ENCODER_IND_X+ENC_COL_W*5+Xspacing*2,R480320_ENCODER_IND_Y,ENC_COL_W,ENC_ROW_H}, UiAction_ChangeAudioSource, NULL }, // Audio In Box: Switch Source
{ {R480320_BAND_MODE_X,R480320_BAND_MODE_Y,R480320_BAND_MODE_MASK_W/2,R480320_BAND_MODE_MASK_H}, UiAction_ChangeBandDownOrUp, NULL }, // Left Part Band Display: Band down
{ {R480320_BAND_MODE_X+R480320_BAND_MODE_MASK_W*3/4,R480320_BAND_MODE_Y,R480320_BAND_MODE_MASK_W/2,R480320_BAND_MODE_MASK_H}, UiAction_ChangeBandUpOrDown, NULL }, // Right Part Band Display: Band up
{ {R480320_LEFTBOXES_IND_X,R480320_LEFTBOXES_IND_Y,R480320_LEFTBOX_WIDTH,R480320_LEFTBOX_ROW_H}, UiVk_DSPVirtualKeys, Codec_RestartI2S }, // DSP Box: Restart I2S
{ {0,110,480,176}, UiAction_ChangeFrequencyByTouch, UiAction_CheckSpectrumTouchActions}, // Scope Draw Area: Tune to Touch
{ {R480320_DIGMODE_IND_X,R480320_DIGMODE_IND_Y,R480320_DIGMODE_IND_W,16}, UiVk_ModSelVirtualKeys, NULL }, // Digital Mode Box: Switch Digi Mode
{ {R480320_TUNE_STEP_X,R480320_TUNE_STEP_Y,R480320_TUNE_STEP_MASK_W,R480320_TUNE_STEP_MASK_H}, UiAction_ChangeDynamicTuning, NULL }, // Step Box: Dynamic Tuning Toggle
{ {R480320_TUNE_STEP_X,R480320_TUNE_STEP_Y,R480320_TUNE_STEP_MASK_W,R480320_TUNE_STEP_MASK_H}, UiAction_ChangeDynamicTuning, NULL }, // Step Box: Dynamic Tuning Toggle
#else
{ {273,0,203,56}, UiAction_ChangeLowerMeterUp, NULL }, // Lower Meter: Meter Toggle
{ {0,124,120,16}, UiAction_ToggleWaterfallScopeDisplay, UiAction_ChangeSpectrumSize }, // Spectrum Bar Left Part: WaterfallScope Toggle
{ {180,124,120,16}, UiAction_ChangeSpectrumZoomLevelDown, UiAction_ZoomResetToOne }, // Spectrum Bar Middle Part: Decrease Zoom Level
{ {360,124,120,16}, UiAction_ChangeSpectrumZoomLevelUp, UiAction_CheckSpectrumTouchActions }, // Spectrum Bar Right Part: Increase Zoom Level
{ {384,90,37,23}, UiAction_ChangeFrequencyToNextKhz, NULL }, // Frequency display, last three digits :Set last 3 digits to zero
{ {276,90,104,23}, UiVk_BndSelVirtualKeys, UiVk_BndFreqSetVirtualKeys }, // Frequency display, first digits :Select the band
{ {122,0,63,12}, UiVk_ModSelVirtualKeys, UiAction_ChangeDigitalMode }, // Digi Mode Box: mode switch
{ {122,30,69,28}, UiVk_ModSelVirtualKeys, UiAction_ChangeDemodModeToAlternativeMode }, // Digi Mode Box: mode switch - double
{ {188,0,14,12}, UiAction_ChangeDemodModeToAlternativeMode, NULL }, // Demod Mode Box: sideband switch
{ {205,0,56,12}, UiAction_ChangePowerLevel, NULL }, // Power Box: TX Power Increase
{ {70,14,42,28}, UiDriver_RIT_Reset,NULL }, // RIT Box: RIT Reset
{ {70,45,42,30}, UiAction_ChangeAudioSource, NULL }, // Audio In Box: Switch Source
{ {446,88,14,15}, UiAction_ChangeBandDownOrUp, NULL }, // Left Part Band Display: Band down
{ {465,88,14,15}, UiAction_ChangeBandUpOrDown, NULL }, // Right Part Band Display: Band up
{ {193,30,69,28}, UiVk_DSPVirtualKeys, Codec_RestartI2S }, // DSP Box
{ {0,141,480,158}, UiAction_ChangeFrequencyByTouch, UiAction_CheckSpectrumTouchActions }, // Scope Draw Area: Tune to Touch
{ {205,15,56,13}, UiAction_ChangeDynamicTuning, NULL }, // Step Box: Dynamic Tuning Toggle
#endif
#else //SDR_AMBER_480_320
//X,Y,W,H
{ {273,0,203,56}, UiAction_ChangeLowerMeterUp, NULL }, // Lower Meter: Meter Toggle
{ {0,124,120,16}, UiAction_ToggleWaterfallScopeDisplay, UiAction_ChangeSpectrumSize }, // Spectrum Bar Left Part: WaterfallScope Toggle
{ {180,124,120,16}, UiAction_ChangeSpectrumZoomLevelDown, UiAction_ZoomResetToOne }, // Spectrum Bar Middle Part: Decrease Zoom Level
{ {360,124,120,16}, UiAction_ChangeSpectrumZoomLevelUp, UiAction_CheckSpectrumTouchActions }, // Spectrum Bar Right Part: Increase Zoom Level
{ {384,90,37,23}, UiAction_ChangeFrequencyToNextKhz, NULL }, // Frequency display, last three digits :Set last 3 digits to zero
{ {276,90,104,23}, UiVk_BndSelVirtualKeys, UiVk_BndFreqSetVirtualKeys }, // Frequency display, first digits :Select the band
{ {122,0,63,12}, UiVk_ModSelVirtualKeys, UiAction_ChangeDigitalMode }, // Digi Mode Box: mode switch
{ {122,30,69,28}, UiVk_ModSelVirtualKeys, UiAction_ChangeDemodModeToAlternativeMode }, // Digi Mode Box: mode switch - double
{ {188,0,14,12}, UiAction_ChangeDemodModeToAlternativeMode, NULL }, // Demod Mode Box: sideband switch
{ {205,0,56,12}, UiAction_ChangePowerLevel, NULL }, // Power Box: TX Power Increase
{ {70,14,42,28}, UiDriver_RIT_Reset,NULL }, // RIT Box: RIT Reset
{ {70,45,42,30}, UiAction_ChangeAudioSource, NULL }, // Audio In Box: Switch Source
{ {446,88,14,15}, UiAction_ChangeBandDownOrUp, NULL }, // Left Part Band Display: Band down
{ {465,88,14,15}, UiAction_ChangeBandUpOrDown, NULL }, // Right Part Band Display: Band up
{ {193,30,69,28}, UiVk_DSPVirtualKeys, Codec_RestartI2S }, // DSP Box
{ {0,141,480,158}, UiAction_ChangeFrequencyByTouch, UiAction_CheckSpectrumTouchActions }, // Scope Draw Area: Tune to Touch
{ {205,15,56,13}, UiAction_ChangeDynamicTuning, NULL }, // Step Box: Dynamic Tuning Toggle
{ {122,15,40,13}, UiAction_ChangeRXInputStateDown, NULL }, // Amber - Change RX Input State Down
{ {162,15,40,13}, UiAction_ChangeRXInputStateUp, NULL }, // Amber - Change RX Input State Up
#endif
};
// this is the map for menu mode, right now only used for debugging/experimental purposes
static const touchaction_descr_t R480320_touchactions_menu[] =
{
{ { R480320_SM_IND_X+R480320_SM_IND_W-16,R480320_SM_IND_Y,16,16 }, UiAction_ChangeDebugInfoDisplay, NULL}, // S-Meter db: toggle show tp coordinates
};
static const touchaction_list_descr_t R480320_touch_regions[] =
{
// ATTENTION: the size calculation only works for true arrays, not for pointers!
{ R480320_touchactions_normal, sizeof(R480320_touchactions_normal)/sizeof(*R480320_touchactions_normal) },
{ R480320_touchactions_menu, sizeof(R480320_touchactions_menu)/sizeof(*R480320_touchactions_menu) },
};
//------------------------------------------------------------------------------------------------------------------------------------------
//Touchscreen definitions for 320x240
static const touchaction_descr_t R320240_touchactions_normal[] =
{
{ {R320240_SM_IND_X,R320240_SM_IND_Y,R320240_SM_IND_W,R320240_SM_IND_H},UiAction_ChangeLowerMeterUp,NULL }, // Lower Meter: Meter Toggle
// { {64,128,60,16}, UiAction_ToggleWaterfallScopeDisplay,UiAction_ChangeSpectrumSize }, // Spectrum Bar Left Part: WaterfallScope Toggle
{ {60,128,64,16}, UiAction_ToggleWaterfallScopeDisplay,UiAction_ChangeSpectrumSize }, // Spectrum Bar Left Part: WaterfallScope Toggle
// { {180,128,40,16}, UiAction_ChangeSpectrumZoomLevelDown,UiAction_CheckSpectrumTouchActions }, // Spectrum Bar Middle Part: Decrease Zoom Level
{ {156,128,64,16}, UiAction_ChangeSpectrumZoomLevelDown,UiAction_CheckSpectrumTouchActions }, // Spectrum Bar Middle Part: Decrease Zoom Level
// { {280,128,40,16}, UiAction_ChangeSpectrumZoomLevelUp,UiAction_CheckSpectrumTouchActions }, // Spectrum Bar Right Part: Increase Zoom Level
{ {252,128,64,16}, UiAction_ChangeSpectrumZoomLevelUp,UiAction_CheckSpectrumTouchActions }, // Spectrum Bar Right Part: Increase Zoom Level
{ {R320240_TUNE_FREQ_X+16*7,R320240_TUNE_FREQ_Y,16*3,24},UiAction_ChangeFrequencyToNextKhz,NULL }, // Tune button:Set last 3 digits to zero
// { {R320240_TUNE_FREQ_X,R320240_TUNE_FREQ_Y,16*7,24}, UiVk_BndSelVirtualKeys, NULL }, // Frequency display, first digits :Select the band
{ {R320240_TUNE_FREQ_X,R320240_TUNE_FREQ_Y,16*7,24}, UiVk_BndSelVirtualKeys, UiVk_BndFreqSetVirtualKeys }, // Frequency display, first digits :Select the band/freq
// { {R320240_DEMOD_MODE_X,R320240_DEMOD_MODE_Y,R320240_DEMOD_MODE_MASK_W,R320240_DEMOD_MODE_MASK_H}, UiAction_ChangeDemodMode,NULL }, // Demod Mode Box: mode switch
{ {R320240_DEMOD_MODE_X,R320240_DEMOD_MODE_Y,R320240_DEMOD_MODE_MASK_W,R320240_DEMOD_MODE_MASK_H}, UiAction_ChangeDemodModeToAlternativeMode,NULL }, // Demod Mode Box: mode switch
{ {R320240_PW_IND_X,R320240_PW_IND_Y,64,16},UiAction_ChangePowerLevel,NULL }, // Power Box: TX Power Increase
{ {74,14,37,29}, UiDriver_RIT_Reset,NULL }, // RIT Box: RIT Reset
{ {R320240_ENCODER_IND_X+ENC_COL_W*2,R320240_ENCODER_IND_Y+ENC_ROW_H,ENC_COL_W,ENC_ROW_H}, UiAction_ChangeAudioSource,NULL }, // Audio In Box: Switch Source
{ {R320240_BAND_MODE_X,R320240_BAND_MODE_Y,R320240_BAND_MODE_MASK_W/2,R320240_BAND_MODE_MASK_H}, UiAction_ChangeBandDownOrUp,NULL }, // Left Part Band Display: Band down
{ {R320240_BAND_MODE_X+R320240_BAND_MODE_MASK_W*3/4,R320240_BAND_MODE_Y,R320240_BAND_MODE_MASK_W/2,R320240_BAND_MODE_MASK_H}, UiAction_ChangeBandUpOrDown,NULL }, // Right Part Band Display: Band up
{ {R320240_LEFTBOXES_IND_X,R320240_LEFTBOXES_IND_Y,R320240_LEFTBOX_WIDTH,R320240_LEFTBOX_ROW_H}, UiVk_DSPVirtualKeys, Codec_RestartI2S }, // DSP Box: Restart I2S
// { {60,128,256,90}, UiAction_ChangeFrequencyByTouch, UiAction_CheckSpectrumTouchActions }, // Scope Draw Area: Tune to Touch
{ {60,146,256,72}, UiAction_ChangeFrequencyByTouch, UiAction_CheckSpectrumTouchActions }, // Scope Draw Area: Tune to Touch
{ {R320240_DIGMODE_IND_X,R320240_DIGMODE_IND_Y,R320240_DIGMODE_IND_W,16}, UiVk_ModeVirtualKeys,UiAction_ChangeDigitalMode }, // Digital Mode Box: Switch Digi Mode
{ {R320240_TUNE_STEP_X,R320240_TUNE_STEP_Y,R320240_TUNE_STEP_MASK_W,R320240_TUNE_STEP_MASK_H}, UiAction_ChangeDynamicTuning,NULL }, // Step Box: Dynamic Tuning Toggle
};
//------------------------------------------------------------------------------------------------------------------------------------------
////Touchscreen definitions for 320x240 Alternative wide spectrum mode
static const touchaction_descr_t R320240_touchactions_widespectrum[] =
{
#ifndef SDR_AMBER // not Amber
//{X, Y, W, H}
{ {113,0,203,52},UiAction_ChangeLowerMeterUp,NULL }, // Lower Meter: Meter Toggle
{ {0,136,80,13}, UiAction_ToggleWaterfallScopeDisplay,UiAction_ChangeSpectrumSize }, // Spectrum Bar Left Part: WaterfallScope Toggle
{ {120,136,80,13}, UiAction_ChangeSpectrumZoomLevelDown,UiAction_ZoomResetToOne }, // Spectrum Bar Middle Part: Decrease Zoom Level
{ {240,136,80,13}, UiAction_ChangeSpectrumZoomLevelUp,UiAction_CheckSpectrumTouchActions }, // Spectrum Bar Right Part: Increase Zoom Level
{ {226,109,48,24},UiAction_ChangeFrequencyToNextKhz,NULL }, // Tune button:Set last 3 digits to zero
// { {118,109,105,24}, UiVk_BndSelVirtualKeys, NULL }, // Frequency display, first digits :Select the band
{ {118,109,105,24}, UiVk_BndSelVirtualKeys, UiVk_BndFreqSetVirtualKeys }, // Frequency display, first digits :Select the band/freq
// { {113,87,41,13}, UiAction_ChangeDemodMode,NULL }, // Demod Mode Box: mode switch
// { {113,87,41,13}, UiAction_ChangeDemodModeToAlternativeMode,NULL }, // Demod Mode Box: sideband switch
{ {138,71,16,12}, UiAction_ChangeDemodModeToAlternativeMode,NULL }, // Demod Mode Box: sideband switch
{ {113,56,41,13},UiAction_ChangePowerLevel,NULL }, // Power Box: TX Power Increase
{ {74,14,37,26}, UiDriver_RIT_Reset,NULL }, // RIT Box: RIT Reset
// { {70,36,41,31}, UiAction_ChangeAudioSource,NULL }, // Audio In Box: Switch Source
{ {74,41,37,26}, UiAction_ChangeAudioSource,NULL }, // Audio In Box: Switch Source
{ {287,108,15,16}, UiAction_ChangeBandDownOrUp,NULL }, // Left Part Band Display: Band down
{ {305,108,15,16}, UiAction_ChangeBandUpOrDown,NULL }, // Right Part Band Display: Band up
{ {217,56,58,29}, UiVk_DSPVirtualKeys, Codec_RestartI2S }, // DSP Box: Restart I2S
{ {1,152,318,73}, UiAction_ChangeFrequencyByTouch, UiAction_CheckSpectrumTouchActions }, // Scope Draw Area: Tune to Touch
// { {74,71,80,13}, UiAction_ChangeDigitalMode,UiVk_ModeVirtualKeys }, // Digital Mode Box: Switch Digi Mode
{ {74,71,61,13}, UiVk_ModeVirtualKeys,UiAction_ChangeDigitalMode }, // Digital Mode Box: Switch Digi Mode
// { {157,87,57,13}, UiAction_ChangeDynamicTuning,NULL }, // Step Box: Dynamic Tuning Toggle
{ {113,87,41,13}, UiAction_ChangeDynamicTuning,NULL }, // Step Box: Dynamic Tuning Toggle
#else //Amber 320x240
//{X, Y, W, H}
{ {113,0,203,52}, UiAction_ChangeLowerMeterUp, NULL }, // Lower Meter: Meter Toggle
{ {0,136,80,13}, UiAction_ToggleWaterfallScopeDisplay,UiAction_ChangeSpectrumSize }, // Spectrum Bar Left Part: WaterfallScope Toggle
{ {120,136,80,13}, UiAction_ChangeSpectrumZoomLevelDown,UiAction_ZoomResetToOne }, // Spectrum Bar Middle Part: Decrease Zoom Level
{ {240,136,80,13}, UiAction_ChangeSpectrumZoomLevelUp,UiAction_CheckSpectrumTouchActions }, // Spectrum Bar Right Part: Increase Zoom Level
{ {226,109,48,24}, UiAction_ChangeFrequencyToNextKhz, NULL }, // Tune button:Set last 3 digits to zero
{ {118,109,105,24}, UiVk_BndSelVirtualKeys, UiVk_BndFreqSetVirtualKeys }, // Frequency display, first digits :Select the band/freq
{ {138,71,16,12}, UiAction_ChangeDemodModeToAlternativeMode, NULL }, // Demod Mode Box: sideband switch
{ {113,56,41,13}, UiAction_ChangePowerLevel, NULL }, // Power Box: TX Power Increase
{ {74,14,37,26}, UiDriver_RIT_Reset,NULL }, // RIT Box: RIT Reset
// { {70,36,41,31}, UiAction_ChangeAudioSource, NULL }, // Audio In Box: Switch Source
{ {74,41,37,26}, UiAction_ChangeAudioSource,NULL }, // Audio In Box: Switch Source
{ {287,108,15,16}, UiAction_ChangeBandDownOrUp, NULL }, // Left Part Band Display: Band down
{ {305,108,15,16}, UiAction_ChangeBandUpOrDown, NULL }, // Right Part Band Display: Band up
{ {217,56,58,28}, UiVk_DSPVirtualKeys, Codec_RestartI2S }, // DSP Box: Restart I2S
{ {1,152,318,73}, UiAction_ChangeFrequencyByTouch, UiAction_CheckSpectrumTouchActions }, // Scope Draw Area: Tune to Touch
// { {74,71,61,13}, UiAction_ChangeDigitalMode, UiVk_ModeVirtualKeys }, // Digital Mode Box: Switch Digi Mode
{ {74,71,61,13}, UiVk_ModeVirtualKeys, UiAction_ChangeDigitalMode }, // Digital Mode Box: Switch Digi Mode
{ {157,56,58,28}, UiVk_ModeVirtualKeys, UiAction_ChangeDigitalMode }, // Digital Mode Box - double touch zone
{ {157,86,57,13}, UiAction_ChangeDynamicTuning, NULL }, // Step Box: Dynamic Tuning Toggle
{ {74,86,40,13}, UiAction_ChangeRXInputStateDown, NULL }, // Amber - Change RX Input State Down
{ {114,86,40,13}, UiAction_ChangeRXInputStateUp, NULL }, // Amber - Change RX Input State Up
#endif
};
// this is the map for menu mode, right now only used for debugging/experimental purposes
static const touchaction_descr_t R320240_touchactions_menu[] =
{
{ { R320240_SM_IND_X+R320240_SM_IND_W-16,R320240_SM_IND_Y,16,16 }, UiAction_ChangeDebugInfoDisplay, NULL}, // S-Meter db: toggle show tp coordinates
};
static const touchaction_list_descr_t R320240__touch_regions[] =
{
// ATTENTION: the size calculation only works for true arrays, not for pointers!
{ R320240_touchactions_normal, sizeof(R320240_touchactions_normal)/sizeof(*R320240_touchactions_normal) },
{ R320240_touchactions_menu, sizeof(R320240_touchactions_menu)/sizeof(*R320240_touchactions_menu) },
};
static const touchaction_list_descr_t R320240__touch_regions_widespectrum[] =
{
// ATTENTION: the size calculation only works for true arrays, not for pointers!
{ R320240_touchactions_widespectrum, sizeof(R320240_touchactions_widespectrum)/sizeof(*R320240_touchactions_widespectrum) },
{ R320240_touchactions_menu, sizeof(R320240_touchactions_menu)/sizeof(*R320240_touchactions_menu) },
};
//------------------------------------------------------------------------------------------------------------------------------------------
const LcdLayout LcdLayouts[LcdLayoutsCount]=
{
//-----------------------------------------------------------------
{ //320x240
.Size = { 320, 240 },
.StartUpScreen_START = { 0, 10 },
.SpectrumWindow = { .x = 58, .y = 128, .w = 260, .h = 94 },
.SpectrumWindowPadding=2,
.TUNE_FREQ= { R320240_TUNE_FREQ_X, R320240_TUNE_FREQ_Y },
.TUNE_SPLIT_FREQ_X=R320240_TUNE_SPLIT_FREQ_X,
.TUNE_SPLIT_MARKER_X=R320240_TUNE_SPLIT_MARKER_X,
.TUNE_SPLIT_FREQ_Y_TX=R320240_TUNE_SPLIT_FREQ_Y_TX,
.TUNE_SFREQ = { R320240_TUNE_SFREQ_X, R320240_TUNE_SFREQ_Y },
.DisplayDbm = { R320240_DisplayDbm_X, R320240_DisplayDbm_Y },
.MEMORYLABEL= { R320240_MEMORYLABEL_X, R320240_MEMORYLABEL_Y} ,
.BAND_MODE = { R320240_BAND_MODE_X, R320240_BAND_MODE_Y},
.BAND_MODE_MASK = { .x = R320240_BAND_MODE_MASK_X, .y = R320240_BAND_MODE_MASK_Y, .h = R320240_BAND_MODE_MASK_H, .w = R320240_BAND_MODE_MASK_W },
.DEMOD_MODE_MASK = { .x = R320240_DEMOD_MODE_MASK_X, .y = R320240_DEMOD_MODE_MASK_Y, .h = R320240_DEMOD_MODE_MASK_H, .w = R320240_DEMOD_MODE_MASK_W},
.AGC_MASK = {.x = R320240_AGC_MASK_X, .y = R320240_AGC_MASK_Y, .h = R320240_AGC_MASK_H,
.w = R320240_AGC_MASK_W},
.TUNE_STEP={.x=R320240_TUNE_STEP_X, .y=R320240_TUNE_STEP_Y, .h=R320240_TUNE_STEP_MASK_H, .w=R320240_TUNE_STEP_MASK_W},
.ENCODER_IND = { R320240_ENCODER_IND_X, R320240_ENCODER_IND_Y},
.ENCODER_MODE=MODE_VERTICAL,
.DIGMODE={.x=R320240_DIGMODE_IND_X,.y=R320240_DIGMODE_IND_Y,.w=R320240_DIGMODE_IND_W},
.LEFTBOXES_IND = { .x=R320240_LEFTBOXES_IND_X, .y=R320240_LEFTBOXES_IND_Y, .w=R320240_LEFTBOX_WIDTH, .h=R320240_LEFTBOX_ROW_H},
.LEFTBOXES_MODE=MODE_VERTICAL,
.LEFTBOXES_ROW_2ND_OFF=R320240_LEFTBOX_ROW_2ND_OFF,
.PW_IND = { .x=R320240_PW_IND_X, .y=R320240_PW_IND_Y, .w=R320240_PW_IND_W},
.TEMP_IND={.x = 0, .y = 0},
.RTC_IND={.x= 0, .y = 79},
.LOADANDDEBUG_Y=95,
.DEBUG_X=0,
.LOAD_X=280,
.PWR_NUM_IND = { 1, 80},
.CW_DECODER_WPM = { 0, 108},
.SNAP_CARRIER = { 27, 122},
.TextMsgLine = { 5, 92},
.TextMsg_buffer_max=44,
.TextMsg_font=4,
.FREEDV_SNR = { 5, 116},
.FREEDV_BER = { 5, 104},
.FREEDV_FONT=4,
.SM_IND={.x=R320240_SM_IND_X,.y=R320240_SM_IND_Y,.h=R320240_SM_IND_H,.w=R320240_SM_IND_W},
.PWR_IND={.x = 4, .y = 193+15},
.BOTTOM_BAR={.x=0,.y=228, .h=16, .w=62},
.MENUSIZE=7,
.MENU_IND = { 60, 128},
.MENU_CHANGE_X=244,
.MENU_CURSOR_X=311,
.MENU_TEXT_SIZE_MAX=34,
.touchaction_list=R320240__touch_regions
},
//-----------------------------------------------------------------
{ //480x320
#ifndef SDR_AMBER //OVI40, Sparrow
#ifndef OVI40_MOD_480_320
.Size = { 480, 320},
.StartUpScreen_START ={ 80, 60},
.SpectrumWindow={ .x = 0, .y = 110, .w = 480, .h = 176 },
.SpectrumWindowPadding=0,
.TUNE_FREQ= { R480320_TUNE_FREQ_X, R480320_TUNE_FREQ_Y},
.TUNE_SPLIT_FREQ_X=R480320_TUNE_SPLIT_FREQ_X,
.TUNE_SPLIT_MARKER_X=R480320_TUNE_SPLIT_MARKER_X,
.TUNE_SPLIT_FREQ_Y_TX=R480320_TUNE_SPLIT_FREQ_Y_TX,
.TUNE_SFREQ = { R480320_TUNE_SFREQ_X, R480320_TUNE_SFREQ_Y},
.DisplayDbm = { R480320_DisplayDbm_X, R480320_DisplayDbm_Y},
.MEMORYLABEL = { R480320_MEMORYLABEL_X, R480320_MEMORYLABEL_Y},
.BAND_MODE = { R480320_BAND_MODE_X, R480320_BAND_MODE_Y},
.BAND_MODE_MASK = { .x = R480320_BAND_MODE_MASK_X, .y = R480320_BAND_MODE_MASK_Y, .h = R480320_BAND_MODE_MASK_H, .w= R480320_BAND_MODE_MASK_W},
.DEMOD_MODE_MASK = { .x = R480320_DEMOD_MODE_MASK_X, .y = R480320_DEMOD_MODE_MASK_Y, .h = R480320_DEMOD_MODE_MASK_H,
.w = R480320_DEMOD_MODE_MASK_W},
.AGC_MASK = {.x = R480320_AGC_MASK_X, .y = R480320_AGC_MASK_Y, .h = R480320_AGC_MASK_H,
.w = R480320_AGC_MASK_W},
.TUNE_STEP={.x=R480320_TUNE_STEP_X, .y=R480320_TUNE_STEP_Y, .h=R480320_TUNE_STEP_MASK_H, .w=R480320_TUNE_STEP_MASK_W},
.ENCODER_IND = { R480320_ENCODER_IND_X, R480320_ENCODER_IND_Y},
.ENCODER_MODE=MODE_HORIZONTAL,
.DIGMODE={.x=R480320_DIGMODE_IND_X,.y=R480320_DIGMODE_IND_Y,.w=R480320_DIGMODE_IND_W},
.LEFTBOXES_IND = { .x=R480320_LEFTBOXES_IND_X, .y=R480320_LEFTBOXES_IND_Y, .w=R480320_LEFTBOX_WIDTH, .h=R480320_LEFTBOX_ROW_H},
.LEFTBOXES_MODE=MODE_HORIZONTAL,
.LEFTBOXES_ROW_2ND_OFF=R480320_LEFTBOX_ROW_2ND_OFF,
.PW_IND = { .x=R480320_PW_IND_X, .y=R480320_PW_IND_Y, .w=R480320_PW_IND_W},
.TEMP_IND={.x = 370,.y = 64},
.RTC_IND={.x = 415,.y = 80},
.LOADANDDEBUG_Y=96,
.DEBUG_X=0,
.LOAD_X=280,
.PWR_NUM_IND ={ 320, 96},
.CW_DECODER_WPM = { 420, 290},
.SNAP_CARRIER= { 242, 29},
.TextMsgLine = { 0, 290 },
.TextMsg_buffer_max=50,
.TextMsg_font=0,
//.FREEDV_SNR = { 280, 28},
//.FREEDV_BER = {380, 28},
.FREEDV_SNR = {410,288},
.FREEDV_BER = {410,297},
.FREEDV_FONT=4,
.SM_IND={.x = R480320_SM_IND_X, .y = R480320_SM_IND_Y, .h = R480320_SM_IND_H, .w = R480320_SM_IND_W},
.PWR_IND={ .x = 420, .y = 307},
#ifdef UI_BRD_OVI40
.BOTTOM_BAR={.x=0,.y=308, .h=16, .w=74},
#else
.BOTTOM_BAR={.x=32,.y=308, .h=16, .w=74},
#endif
.MENUSIZE=14,
.MENU_IND = { 80, 110 },
.MENU_CHANGE_X=280,
.MENU_CURSOR_X=360,
.MENU_TEXT_SIZE_MAX=40,
.touchaction_list=R480320_touch_regions
#else
.Size = { 480, 320 },
.StartUpScreen_START = { 80, 60 },
.SpectrumWindow = { .x = 0, .y = 123, .w = 480, .h = 174 },
.SpectrumWindowPadding = 0,
.TUNE_FREQ = { 276, 90 },
.TUNE_SPLIT_FREQ_X = 290,
.TUNE_SPLIT_MARKER_X = 276,
.TUNE_SPLIT_FREQ_Y_TX = 276,
.TUNE_SFREQ = { 396, 60 },
.DisplayDbm = { 273, 60 },
.MEMORYLABEL = { 355, 60 },
.BAND_MODE = { 436, 90 },
.BAND_MODE_MASK = { .x = 435, .y = 89, .h = 13, .w = 33 },
.DEMOD_MODE_MASK = { .x = 186, .y = 0, .h = 13, .w = 16 },
.AGC_MASK = {.x = 122, .y = 15, .h = 13, .w = 80 },
.TUNE_STEP={.x = 205, .y = 15, .h = 13, .w = 56 },
.ENCODER_IND = { 0, 15 },
.ENCODER_MODE = MODE_VERTICAL,
.DIGMODE={.x = 122, .y = 0, .w = 63},
.LEFTBOXES_IND = { .x = 122, .y=30, .w = 69, .h = 28 },
.LEFTBOXES_MODE = MODE_HORIZONTAL,
.LEFTBOXES_ROW_2ND_OFF = 13,
.PW_IND = { .x = 205, .y = 0, .w = 56 },
.TEMP_IND = { .x = 0, .y = 0 },
.RTC_IND = { .x = 127, .y = 60 },
.LOADANDDEBUG_Y = 75,
.DEBUG_X = 0,
.LOAD_X = 440,
.PWR_NUM_IND = { 320, 99 },
.CW_DECODER_WPM = { 0, 92 },
.SNAP_CARRIER = { 27, 107 },
.TextMsgLine = { 0, 75 },
.TextMsg_buffer_max = 50,
.TextMsg_font = 0,
//.FREEDV_SNR = { 280, 28},
//.FREEDV_BER = {380, 28},
.FREEDV_SNR = { 0, 90 },
.FREEDV_BER = { 0, 102 },
.FREEDV_FONT = 4,
.SM_IND = { .x = 273, .y = 0, .h = 56, .w = 203 },
.PWR_IND = { .x = 207, .y = 60 },
.BOTTOM_BAR = {.x=0,.y=308, .h=16, .w=79},//.w=74},
.MENUSIZE = 14,
.MENU_IND = { 140, 129 },
.MENU_CHANGE_X = 280,
.MENU_CURSOR_X = 360,
.MENU_TEXT_SIZE_MAX = 40,
.touchaction_list = R480320_touch_regions
#endif
#else //Amber_480x320
.Size = { 480, 320 },
.StartUpScreen_START = { 80, 60 },
.SpectrumWindow = { .x = 0, .y = 123, .w = 480, .h = 174 },
.SpectrumWindowPadding = 0,
.TUNE_FREQ = { 276, 90 },
.TUNE_SPLIT_FREQ_X = 356,
.TUNE_SPLIT_MARKER_X = 316,
.TUNE_SPLIT_FREQ_Y_TX = 102,
.TUNE_SFREQ = { 396, 60 },
.DisplayDbm = { 273, 60 },
.MEMORYLABEL = { 355, 60 },
.BAND_MODE = { 436, 90 },
.BAND_MODE_MASK = { .x = 435, .y = 89, .h = 13, .w = 33 },
.DEMOD_MODE_MASK = { .x = 186, .y = 0, .h = 13, .w = 16 },
.AGC_MASK = {.x = 122, .y = 15, .h = 13, .w = 80 },
.TUNE_STEP={.x = 205, .y = 15, .h = 13, .w = 56 },
.ENCODER_IND = { 0, 15 },
.ENCODER_MODE = MODE_VERTICAL,
.DIGMODE={.x = 122, .y = 0, .w = 63},
.LEFTBOXES_IND = { .x = 122, .y=30, .w = 69, .h = 28 },
.LEFTBOXES_MODE = MODE_HORIZONTAL,
.LEFTBOXES_ROW_2ND_OFF = 13,
.PW_IND = { .x = 205, .y = 0, .w = 56 },
.TEMP_IND = { .x = 0, .y = 0 },
.RTC_IND = { .x = 127, .y = 60 },
.LOADANDDEBUG_Y = 75,
.DEBUG_X = 0,
.LOAD_X = 440,
.PWR_NUM_IND = { 320, 99 },
.CW_DECODER_WPM = { 0, 92 },
.SNAP_CARRIER = { 27, 107 },
.TextMsgLine = { 0, 75 },
.TextMsg_buffer_max = 50,
.TextMsg_font = 0,
//.FREEDV_SNR = { 280, 28},
//.FREEDV_BER = {380, 28},
.FREEDV_SNR = { 0, 90 },
.FREEDV_BER = { 0, 102 },
.FREEDV_FONT = 4,
.SM_IND = { .x = 273, .y = 0, .h = 56, .w = 203 },
.PWR_IND = { .x = 207, .y = 60 },
#ifndef SDR_AMBER_4INCH
.BOTTOM_BAR = {.x=0,.y=308, .h=16, .w=79},//.w=74},
#else
.BOTTOM_BAR = {.x=2,.y=308, .h=16, .w=67},
#endif
.MENUSIZE = 14,
.MENU_IND = { 140, 129 },//{ 80, 130 },
.MENU_CHANGE_X = 280,
.MENU_CURSOR_X = 430,//360,
.MENU_TEXT_SIZE_MAX = 40,
.touchaction_list = R480320_touch_regions
#endif
},
//-----------------------------------------------------------------
{ //800x480
.Size = { 800, 480},
.StartUpScreen_START ={ 80, 60},
.SpectrumWindow={ .x = 0, .y = 110, .w = 480, .h = 176 },
.SpectrumWindowPadding=0,
.TUNE_FREQ= { R480320_TUNE_FREQ_X, R480320_TUNE_FREQ_Y},
.TUNE_SPLIT_FREQ_X=R480320_TUNE_SPLIT_FREQ_X,
.TUNE_SPLIT_MARKER_X=R480320_TUNE_SPLIT_MARKER_X,
.TUNE_SPLIT_FREQ_Y_TX=R480320_TUNE_SPLIT_FREQ_Y_TX,
.TUNE_SFREQ = { R480320_TUNE_SFREQ_X, R480320_TUNE_SFREQ_Y},
.DisplayDbm = { R480320_DisplayDbm_X, R480320_DisplayDbm_Y},
.MEMORYLABEL = { R480320_MEMORYLABEL_X, R480320_MEMORYLABEL_Y},
.BAND_MODE = { R480320_BAND_MODE_X, R480320_BAND_MODE_Y},
.BAND_MODE_MASK = { .x = R480320_BAND_MODE_MASK_X, .y = R480320_BAND_MODE_MASK_Y, .h = R480320_BAND_MODE_MASK_H, .w= R480320_BAND_MODE_MASK_W},
.DEMOD_MODE_MASK = { .x = R480320_DEMOD_MODE_MASK_X, .y = R480320_DEMOD_MODE_MASK_Y, .h = R480320_DEMOD_MODE_MASK_H,
.w = R480320_DEMOD_MODE_MASK_W},
.AGC_MASK = {.x = R480320_AGC_MASK_X, .y = R480320_AGC_MASK_Y, .h = R480320_AGC_MASK_H,
.w = R480320_AGC_MASK_W},
.TUNE_STEP={.x=R480320_TUNE_STEP_X, .y=R480320_TUNE_STEP_Y, .h=R480320_TUNE_STEP_MASK_H, .w=R480320_TUNE_STEP_MASK_W},
.ENCODER_IND = { R480320_ENCODER_IND_X, R480320_ENCODER_IND_Y},
.ENCODER_MODE=MODE_HORIZONTAL,
.DIGMODE={.x=R480320_DIGMODE_IND_X,.y=R480320_DIGMODE_IND_Y,.w=R480320_DIGMODE_IND_W},
.LEFTBOXES_IND = { .x=R480320_LEFTBOXES_IND_X, .y=R480320_LEFTBOXES_IND_Y, .w=R480320_LEFTBOX_WIDTH, .h=R480320_LEFTBOX_ROW_H},
.LEFTBOXES_MODE=MODE_HORIZONTAL,
.LEFTBOXES_ROW_2ND_OFF=R480320_LEFTBOX_ROW_2ND_OFF,
.PW_IND = { .x=R480320_PW_IND_X, .y=R480320_PW_IND_Y, .w=R480320_PW_IND_W},
.TEMP_IND={.x = 370,.y = 64},
.RTC_IND={.x = 415,.y = 80},
.LOADANDDEBUG_Y=96,
.DEBUG_X=0,
.LOAD_X=280,
.PWR_NUM_IND ={ 320, 96},
.CW_DECODER_WPM = { 420, 290},
.SNAP_CARRIER= { 242, 29},
.TextMsgLine = { 0, 290 },
.TextMsg_buffer_max=50,
.TextMsg_font=0,
//.FREEDV_SNR = { 280, 28},
//.FREEDV_BER = {380, 28},
.FREEDV_SNR = {410,288},
.FREEDV_BER = {410,297},
.FREEDV_FONT=4,
.SM_IND={.x = R480320_SM_IND_X, .y = R480320_SM_IND_Y, .h = R480320_SM_IND_H, .w = R480320_SM_IND_W},
.PWR_IND={ .x = 420, .y = 307},
#ifdef UI_BRD_OVI40
.BOTTOM_BAR={.x=0,.y=308, .h=16, .w=74},
#else
.BOTTOM_BAR={.x=32,.y=308, .h=16, .w=74},
#endif
.MENUSIZE=14,
.MENU_IND = { 80, 110 },
.MENU_CHANGE_X=280,
.MENU_CURSOR_X=360,
.MENU_TEXT_SIZE_MAX=40,
.touchaction_list=R480320_touch_regions
// }
},
//-----------------------------------------------------------------
{ //320x240_wide_spectrum
.Size = { 320, 240 },
.StartUpScreen_START = { 0, 10 },
.SpectrumWindow = { .x = 4, .y = 136, .w = 312, .h = 89 },//x0_w320
.SpectrumWindowPadding = 0,
.TUNE_FREQ = { 116, 109 },
.TUNE_SPLIT_FREQ_X = 196,
.TUNE_SPLIT_MARKER_X = 167,
.TUNE_SPLIT_FREQ_Y_TX = 121,
.TUNE_SFREQ = { 236, 87 },
.DisplayDbm = { 277, 56 },
#ifdef SDR_AMBER
.MEMORYLABEL= { 64, 123 } ,
#else
.MEMORYLABEL= { 157, 87 } ,
#endif
.BAND_MODE = { 276, 112 },
.BAND_MODE_MASK = { .x = 275, .y = 111, .h = 13, .w = 33 },
.DEMOD_MODE_MASK = { .x = 138, .y = 71, .h = 12, .w = 16 },
#ifndef SDR_AMBER
// .DEMOD_MODE_MASK = { .x = 113, .y = 86, .h = 13, .w = 41 },
.AGC_MASK = { .x = 74, .y = 86, .h = 13, .w = 36 },
.TUNE_STEP={ .x = 113, .y = 86, .h = 13, .w = 41 },
#else
// .DEMOD_MODE_MASK = { .x = 138, .y = 71, .h = 12, .w = 16 },
.AGC_MASK = { .x = 74, .y = 86, .h = 13, .w = 80 },
.TUNE_STEP={ .x = 157, .y = 86, .h = 13, .w = 57 },
#endif
// .TUNE_STEP={ .x = 157, .y = 86, .h = 13, .w = 57 },
.ENCODER_IND = { 0, 15 },
.ENCODER_MODE = MODE_VERTICAL,
//#ifndef SDR_AMBER
// .DIGMODE= { .x = 74, .y = 71, .w = 80 },
//#else
.DIGMODE= { .x = 74, .y = 71, .w = 63 },
//#endif
.LEFTBOXES_IND = { .x = 157, .y = 56, .w = 58, .h = 28 },
.LEFTBOXES_MODE = MODE_HORIZONTAL,
.LEFTBOXES_ROW_2ND_OFF = 13,
.PW_IND = { .x = 113, .y = 56, .w = 41 },
.TEMP_IND={ .x = 0, .y = 0 },
// .RTC_IND={ .x= 5, .y = 72 },
.RTC_IND={ .x= 5, .y = 86 },
.LOADANDDEBUG_Y = 100,
.DEBUG_X = 0,
.LOAD_X = 280,
.PWR_NUM_IND = { 1, 100 },
.CW_DECODER_WPM = { 0, 113 },
.SNAP_CARRIER = { 27, 128 },
.TextMsgLine = { 5, 99 },
.TextMsg_buffer_max = 44,
.TextMsg_font = 4,
.FREEDV_SNR = { 5, 123 },
.FREEDV_BER = { 5, 113 },
.FREEDV_FONT = 4,
.SM_IND = { .x = 113, .y = 0, .h = 52, .w = 203 },
// .PWR_IND = { .x = 16, .y = 86 },
.PWR_IND = { .x = 16, .y = 72 },
.BOTTOM_BAR = { .x = 2, .y = 231, .h = 13, .w=62 },
.MENUSIZE = 7,
.MENU_IND = { 60, 140 },
.MENU_CHANGE_X = 244,
// .MENU_CURSOR_X = 311,
.MENU_CURSOR_X = 310,
.MENU_TEXT_SIZE_MAX = 34,
.touchaction_list = R320240__touch_regions_widespectrum
}
};
disp_resolution_t disp_resolution;
#endif
@@ -0,0 +1,160 @@
/* -*- mode: c; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4; coding: utf-8 -*- */
/************************************************************************************
** **
** UHSDR **
** a powerful firmware for STM32 based SDR transceivers **
** **
**--------------------------------------------------------------------------------**
** **
** File name: ui_lcd_layouts.h **
** Description: Layout definitions header file **
** Licence: GNU GPLv3 **
** Author: Slawomir Balon/SP9BSL **
************************************************************************************/
#ifndef UI_LCD_LAYOUTS_H_
#define UI_LCD_LAYOUTS_H_
#define COL_SPECTRUM_GRAD 0x40
#define Grid RGB(COL_SPECTRUM_GRAD,COL_SPECTRUM_GRAD,COL_SPECTRUM_GRAD) // COL_SPECTRUM_GRAD = 0x40
#define WATERFALL_HEIGHT 70
#define SPECTRUM_MAX_MARKER 3
#define SPECTRUM_SCOPE_GRID_VERT_COUNT 8
#define SPECTRUM_SCOPE_GRID_HORIZ 16
//#define LEFTBOX_WIDTH 58 // used for the lower left side controls
//#define LEFTBOX_ROW_H (28)
//#define LEFTBOX_ROW_2ND_OFF (13)
#define ENC_COL_W (37)
#define ENC_ROW_H (30)
#define ENC_ROW_2ND_OFF (14)
#define Xspacing 5
#define ui_txt_msg_buffer_size 51 //this defines the buffer size for text line in maximum possible configuration.
//Please adjust it to maximum value+1 of ts.Layout->TextMsg_buffer_max
typedef enum
{
RESOLUTION_320_240,
RESOLUTION_480_320,
RESOLUTION_800_480
} disp_resolution_t;
typedef struct {
uint16_t x;
uint16_t y;
uint16_t w;
uint16_t h;
} UiArea_t;
typedef struct
{
UiArea_t region;
void (*function_short_press)();
void (*function_long_press)();
} touchaction_descr_t;
typedef struct
{
const touchaction_descr_t* actions;
int32_t size;
} touchaction_list_descr_t;
typedef struct
{
uint16_t x;
uint16_t y;
} UiCoord_t ;
typedef struct {
UiCoord_t Size; // Lcd dimension
UiCoord_t StartUpScreen_START;
UiArea_t SpectrumWindow; // Definition of spectrum window parameters
UiCoord_t TUNE_FREQ; // Frequency display control
uint16_t TUNE_SPLIT_FREQ_X; //Shift with a small split to the right to close the frequency digits
uint16_t TUNE_SPLIT_MARKER_X;
uint16_t TUNE_SPLIT_FREQ_Y_TX;
UiCoord_t TUNE_SFREQ; // Second frequency display control
UiCoord_t BAND_MODE; // Band selection control
UiArea_t BAND_MODE_MASK;
UiArea_t DEMOD_MODE_MASK; // Demodulator mode control
UiArea_t AGC_MASK; //AGC display mask
UiArea_t TUNE_STEP; // Tunning step control
UiArea_t BOTTOM_BAR; // Bottom bar
UiCoord_t ENCODER_IND; // Encoder controls indicator
uint8_t ENCODER_MODE; //horizontal/vertical draw order
UiArea_t LEFTBOXES_IND; // Lower DSP box
uint16_t LEFTBOXES_ROW_2ND_OFF;
uint8_t LEFTBOXES_MODE;
UiArea_t PW_IND; // Power level
UiArea_t DIGMODE; // Digimode item
UiArea_t SM_IND; // S meter position
UiCoord_t PWR_IND; // Supply Voltage indicator
UiCoord_t TEMP_IND; // Temperature Indicator
UiCoord_t RTC_IND; // RTC
UiCoord_t CW_DECODER_WPM;
UiCoord_t TextMsgLine; // coordinates for text line (CW decoder or freedv output)
uint16_t TextMsg_buffer_max; // Text message buffer size
uint8_t TextMsg_font;
UiCoord_t SNAP_CARRIER; // central position of variable freq marker
UiCoord_t PWR_NUM_IND; // Location of numerical FWD/REV power indicator
UiCoord_t FREEDV_SNR; //freeDV coordinates for status display
UiCoord_t FREEDV_BER;
uint16_t FREEDV_FONT;
UiCoord_t DisplayDbm;
UiCoord_t MEMORYLABEL;
uint16_t LOADANDDEBUG_Y;
uint16_t DEBUG_X;
uint16_t LOAD_X;
uint16_t SpectrumWindowPadding;
uint16_t MENUSIZE; // number of menu items per page/screen
UiCoord_t MENU_IND; // X position of description of menu item being changed
uint16_t MENU_CHANGE_X; // Position of variable being changed
uint16_t MENU_CURSOR_X; // Position of cursor used to indicate selected item
uint8_t MENU_TEXT_SIZE_MAX; // One line maximum length
const touchaction_list_descr_t* touchaction_list;
} LcdLayout;
enum MODE_{
MODE_VERTICAL=0,
MODE_HORIZONTAL
};
enum LcdLayout_{
LcdLayout_320x240=0,
LcdLayout_480x320,
LcdLayout_800x480,
LcdLayout_320x240_ws, // full wide panoram
LcdLayoutsCount //this is last position enumerated used for layout array definition. Insert new layout name before this one
};
extern const LcdLayout LcdLayouts[LcdLayoutsCount];
extern disp_resolution_t disp_resolution;
#endif /* UI_LCD_LAYOUTS_H_ */
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,287 @@
/* -*- mode: c; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4; coding: utf-8 -*- */
#ifndef __UI_SPECTRUM_H
#define __UI_SPECTRUM_H
/************************************************************************************
** **
** mcHF QRP Transceiver **
** K Atanassov - M0NKA 2014 **
** **
**---------------------------------------------------------------------------------**
** **
** File name: **
** Description: **
** Last Modified: **
** Licence: GNU GPLv3 **
************************************************************************************/
#include "uhsdr_board.h"
#include "uhsdr_types.h"
#include "audio_driver.h"
#include "arm_const_structs.h"
#include "ui_lcd_layouts.h"
typedef struct
{
UiArea_t full;
UiArea_t draw;
UiArea_t title;
UiArea_t scope;
UiArea_t graticule;
UiArea_t wfall;
} SpectrumAreas_t;
void UiSpectrum_Init(void);
void UiSpectrum_Clear(void);
void UiSpectrum_Redraw(void);
void UiSpectrum_WaterfallClearData(void);
void UiSpectrum_CalculateDisplayFilterBW(float32_t* width_pixel_, float32_t* left_filter_border_pos_);
void UiSpectrum_DisplayFilterBW(void);
void UiSpectrum_InitCwSnapDisplay (bool visible);
void UiSpectrum_ResetSpectrum(void);
uint16_t UiSprectrum_CheckNewGraticulePos(uint16_t new_y);
// Settings for dB/division for spectrum display
enum
{
DB_DIV_UNUSED = 0,
DB_DIV_5,
DB_DIV_7,
DB_DIV_10,
DB_DIV_15,
DB_DIV_20,
S_1_DIV,
S_2_DIV,
S_3_DIV,
SCOPE_SCALE_NUM
};
#define DB_DIV_ADJUST_MIN DB_DIV_5
#define DB_DIV_ADJUST_MAX S_3_DIV
#define DB_DIV_ADJUST_DEFAULT DB_DIV_10
// Enumeration to select which waterfall palette to use
enum
{
WFALL_GRAY = 0,
WFALL_HOT_COLD,
WFALL_RAINBOW,
WFALL_BLUE,
WFALL_GRAY_INVERSE,
WFALL_FLAME,
WFALL_SUNSET,
WFALL_MATRIX,
WFALL_COLOR_NUM
};
//
#define WATERFALL_COLOR_MIN 0
#define WATERFALL_COLOR_MAX (WFALL_COLOR_NUM-1)
#define WATERFALL_COLOR_DEFAULT WFALL_GRAY
//
#define WATERFALL_STEP_SIZE_MIN 1
#define WATERFALL_STEP_SIZE_MAX 5
#define WATERFALL_STEP_SIZE_DEFAULT 2
//
#define WATERFALL_OFFSET_MIN 60
#define WATERFALL_OFFSET_MAX 140
#define WATERFALL_OFFSET_DEFAULT 100
//
#define WATERFALL_CONTRAST_MIN 10
#define WATERFALL_CONTRAST_MAX 225
#define WATERFALL_CONTRAST_DEFAULT 120
//
#define WATERFALL_SPEED_MIN 0
#define WATERFALL_SPEED_MAX 30
#define WATERFALL_SPEED_DEFAULT 10
//
#define WATERFALL_NOSIG_ADJUST_MIN 10
#define WATERFALL_NOSIG_ADJUST_MAX 30
#define WATERFALL_NOSIG_ADJUST_DEFAULT 20
//
#define WATERFALL_SPEED_WARN 1//5
#define WATERFALL_SPEED_WARN1 3//9
//
// Constants for waterfall size settings
//
enum
{
SPECTRUM_NORMAL=0,
SPECTRUM_BIG
};
enum
{
FFT_WINDOW_RECTANGULAR=0,
FFT_WINDOW_COSINE,
FFT_WINDOW_BARTLETT,
FFT_WINDOW_WELCH,
FFT_WINDOW_HANN,
FFT_WINDOW_HAMMING,
FFT_WINDOW_BLACKMAN,
FFT_WINDOW_NUTTALL,
FFT_WINDOW_MAX
};
enum
{
Redraw_SCOPE=1,
Redraw_WATERFALL=2
};
//#define FFT_WINDOW_DEFAULT FFT_WINDOW_BLACKMAN
#define SPECTRUM_SIZE_DEFAULT SPECTRUM_NORMAL
// Spectrum scope operational constants
#define SPECTRUM_SCOPE_SPEED_MIN 0 // minimum spectrum scope speed
#define SPECTRUM_SCOPE_SPEED_MAX 30 // maximum spectrum scope speed
#define SPECTRUM_SCOPE_SPEED_DEFAULT 5
//
#define SPECTRUM_FILTER_MIN 1 // minimum filter setting
#define SPECTRUM_FILTER_MAX 20 // maximum filter setting
#define SPECTRUM_FILTER_DEFAULT 4 // default filter setting
//
#define SPECTRUM_SCOPE_AGC_MIN 1 // minimum spectrum scope AGC rate setting
#define SPECTRUM_SCOPE_AGC_MAX 50 // maximum spectrum scope AGC rate setting
#define SPECTRUM_SCOPE_AGC_DEFAULT 25 // default spectrum scope AGC rate setting
//
#define SPECTRUM_SCOPE_NOSIG_ADJUST_MIN 10
#define SPECTRUM_SCOPE_NOSIG_ADJUST_MAX 30
#define SPECTRUM_SCOPE_NOSIG_ADJUST_DEFAULT 20
#define SPECTRUM_AGC_SCALING 25 // scaling factor by which the on-screen Spec. AGC Adj. is divided for adjustment.
#define SCOPE_PREAMP_GAIN 1000//200 // amount of "amplification" in front of the FFT used for the Spectrum Scope and Waterfall used to overcome mathematical "noise floor"
#define INIT_SPEC_AGC_LEVEL -80 // Initial offset for AGC level for spectrum/waterfall display
#define NUMBER_WATERFALL_COLOURS 64 // number of colors in the waterfall table
#ifdef USE_DISP_320_240
#define WATERFALL_MAX_LINES WATERFALL_MAX_SIZE
#endif
#ifdef USE_DISP_480_320
#ifdef STM32F7
#define WATERFALL_MAX_LINES WATERFALL_HEIGHT
#endif
#ifdef STM32F4
#define WATERFALL_MAX_LINES (WATERFALL_HEIGHT/2)
#endif
#endif
// FIXME: This is a temporary hack
// this needs to be as long at the longest scope width (in case of multiple resolutions)
// list highest resolution first
#ifdef USE_DISP_480_320
#define SPECTRUM_WIDTH_MAX 480
#elif defined(USE_DISP_320_240)
#define SPECTRUM_WIDTH_MAX 480
#endif
// Spectrum display
typedef struct SpectrumDisplay
{
// Samples buffer
float32_t FFT_RingBuffer[FFT_IQ_BUFF_LEN];
float32_t FFT_Samples[FFT_IQ_BUFF_LEN];
float32_t FFT_MagData[SPEC_BUFF_LEN];
float32_t FFT_AVGData[SPEC_BUFF_LEN]; // IIR low-pass filtered FFT buffer data
uint32_t FFT_frequency; // center frequency of stored FFT
// scope pixel data
uint16_t Old_PosData[SPECTRUM_WIDTH_MAX];
// Current data ptr
uint32_t samp_ptr;
volatile bool reading_ringbuffer;
// if the user level code wants to read the ring buffer
// simply set this, and the audio driver will stop writing
// to the buffer. This means we loose some samples here but this is not a problem I would think.
// if we don't want or should do this,
// we have to add a little extra space to the ringbuffer (one audio driver sample block), which gives sufficient
// space to add data to while we are reading.
// Addresses of vertical grid lines on x axis
ushort vert_grid_id[SPECTRUM_SCOPE_GRID_VERT_COUNT-1];
uint16_t vert_grid; // distance between vert grid lines
// Addresses of horizontal grid lines on x axis
ushort horz_grid_id[16];
uint8_t upper_horiz_gridline; // how many grid lines to use
// State machine current state
uchar state;
// Init done flag
uchar enabled;
// Variables used in spectrum display AGC
uint8_t magnify; // 2^magnify == zoom factor, max is 5
uint16_t spec_len;
uint16_t fft_iq_len;
const arm_cfft_instance_f32 * cfft_instance;
float display_offset; // "vertical" offset for spectral scope, gain adjust for waterfall
float agc_rate; // this holds AGC rate for the Spectrum Display
float db_scale; // scaling factor for dB/division
ushort wfall_line_update; // used to set the number of lines per update on the waterfall
float wfall_contrast; // used to adjust the contrast of the waterfall display
uint16_t waterfall_colours[NUMBER_WATERFALL_COLOURS+1]; // palette of colors for waterfall data
// uint8_t (*waterfall)[SPECTRUM_WIDTH]; //pointer to waterfall memory
uint8_t repeatWaterfallLine; //line repeating count for waterfall size grater than number of data lines in waterfall array
// uint8_t waterfall[WATERFALL_MAX_LINES*SPECTRUM_WIDTH]; // circular buffer used for storing waterfall data - remember to increase this if the waterfall is made larger!
uint8_t waterfall[(WATERFALL_HEIGHT+10)*256]; // circular buffer used for storing waterfall data - remember to increase this if the waterfall is made larger!
uint32_t waterfall_frequencies[(WATERFALL_HEIGHT+10)]; // we reserve hopefully enough frequency stores here. We store for each line in waterfall the center frequency of it.
//uint8_t wfall_DrawDirection; //0=upward (water fountain), 1=downward (real waterfall)
uint32_t wfall_line; // pointer to current line of waterfall data
uint32_t wfall_size; // vertical size of the waterfall data (number of stored fft results)
//uint16_t wfall_disp_lines; // vertical size of the waterfall on display
uint32_t wfall_ystart;
uint32_t scope_size;
uint32_t scope_ystart;
float32_t hz_per_pixel; // how many Hertz is one pixel in the spectrum
float32_t rx_carrier_pos; // where is the current receiving frequency carrier (in pixels)
float32_t marker_offset[SPECTRUM_MAX_MARKER]; // how is the current transmitting frequency carrier offset from rx carrier (in pixels)
float32_t marker_pos[SPECTRUM_MAX_MARKER]; // where is the current transmitting frequency carrier (in pixels)
uint16_t marker_line_pos_prev[SPECTRUM_MAX_MARKER]; // previous x-axis location of carrier line in screen coordinates, 0xffff indicates off screen
uint16_t marker_num; // how many marker lines we have right now
uint16_t marker_num_prev; // how many marker lines we had last time
uint32_t scope_centre_grid_colour_active; // active colour of the spectrum scope center grid line
uint32_t scope_grid_colour_active; // active color of spectrum scope grid;
uint32_t boxes_colour; // screen boxes colour
uint32_t txtline_colour; // ticker colour
uint16_t old_left_filter_border_pos; //previous BW highlight left border
uint16_t old_right_filter_border_pos; //previous BW highlight right border
uint8_t RedrawType;
SpectrumAreas_t* Slayout;
} SpectrumDisplay;
// Spectrum display
extern SpectrumDisplay sd;
//#define MinimumScopeSize 24
#define MinimumScopeSize 46
#define MinimumWaterfallSize 16
#endif
@@ -0,0 +1,586 @@
/* -*- mode: c; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4; coding: utf-8 -*- */
#ifndef __WATERFALL_COLOURS_H
#define __WATERFALL_COLOURS_H
// Color palattes for waterfall displays
//
// Derived with the help of: http://www.perbang.dk/rgbgradient/ (Using the "gradient maker")
//
// NOTES:
//
// - The waterfall palettes range from [0] = weakest signal to [63] for the strongest signal
//
// - The last entry [64] (the 65th) is always reserved for the vertical line color. It is included in the table as a placeholder, but its value will always be overwritten.
//
// - The LCD uses a 16 bit (5,6,5) RGB palette where there are 5 Blue, 6 Green and 5 Red bits of color resolution, produced by the macro "RGB", below
//
//
#define RGB(red,green,blue)(uint16_t)(((red>>3)<<11)|((green>>2)<<5)|(blue>> 3))
//
//
// Waterfall Gray Colors: Weak = dark, strongest = white
//
const uint16_t waterfall_grey[] =
{
RGB(0x00,0x00,0x00),
RGB(0x04,0x04,0x04),
RGB(0x08,0x08,0x08),
RGB(0x0c,0x0c,0x0c),
RGB(0x10,0x10,0x10),
RGB(0x14,0x14,0x14),
RGB(0x18,0x18,0x18),
RGB(0x1c,0x1c,0x1c),
RGB(0x20,0x20,0x20),
RGB(0x24,0x24,0x24),
RGB(0x28,0x28,0x28),
RGB(0x2c,0x2c,0x2c),
RGB(0x30,0x30,0x30),
RGB(0x34,0x34,0x34),
RGB(0x38,0x38,0x38),
RGB(0x3c,0x3c,0x3c),
RGB(0x40,0x40,0x40),
RGB(0x44,0x44,0x44),
RGB(0x48,0x48,0x48),
RGB(0x4c,0x4c,0x4c),
RGB(0x50,0x50,0x50),
RGB(0x54,0x54,0x54),
RGB(0x59,0x59,0x59),
RGB(0x5d,0x5d,0x5d),
RGB(0x61,0x61,0x61),
RGB(0x65,0x65,0x65),
RGB(0x69,0x69,0x69),
RGB(0x6d,0x6d,0x6d),
RGB(0x71,0x71,0x71),
RGB(0x75,0x75,0x75),
RGB(0x79,0x79,0x79),
RGB(0x7d,0x7d,0x7d),
RGB(0x81,0x81,0x81),
RGB(0x85,0x85,0x85),
RGB(0x89,0x89,0x89),
RGB(0x8d,0x8d,0x8d),
RGB(0x91,0x91,0x91),
RGB(0x95,0x95,0x95),
RGB(0x99,0x99,0x99),
RGB(0x9d,0x9d,0x9d),
RGB(0xa1,0xa1,0xa1),
RGB(0xa5,0xa5,0xa5),
RGB(0xa9,0xa9,0xa9),
RGB(0xae,0xae,0xae),
RGB(0xb2,0xb2,0xb2),
RGB(0xb6,0xb6,0xb6),
RGB(0xba,0xba,0xba),
RGB(0xbe,0xbe,0xbe),
RGB(0xc2,0xc2,0xc2),
RGB(0xc6,0xc6,0xc6),
RGB(0xca,0xca,0xca),
RGB(0xce,0xce,0xce),
RGB(0xd2,0xd2,0xd2),
RGB(0xd6,0xd6,0xd6),
RGB(0xda,0xda,0xda),
RGB(0xde,0xde,0xde),
RGB(0xe2,0xe2,0xe2),
RGB(0xe6,0xe6,0xe6),
RGB(0xea,0xea,0xea),
RGB(0xee,0xee,0xee),
RGB(0xf2,0xf2,0xf2),
RGB(0xf6,0xf6,0xf6),
RGB(0xfa,0xfa,0xfa),
RGB(0xff,0xff,0xff),
RGB(0xff,0xff,0xff)
};
// Waterfall Gray Colors - inverse (weak = light, strong = dark)
//
const uint16_t waterfall_grey_inverse[] =
{
RGB(0xff,0xff,0xff),
RGB(0xfa,0xfa,0xfa),
RGB(0xf6,0xf6,0xf6),
RGB(0xf2,0xf2,0xf2),
RGB(0xee,0xee,0xee),
RGB(0xea,0xea,0xea),
RGB(0xe6,0xe6,0xe6),
RGB(0xe2,0xe2,0xe2),
RGB(0xde,0xde,0xde),
RGB(0xda,0xda,0xda),
RGB(0xd6,0xd6,0xd6),
RGB(0xd2,0xd2,0xd2),
RGB(0xce,0xce,0xce),
RGB(0xca,0xca,0xca),
RGB(0xc6,0xc6,0xc6),
RGB(0xc2,0xc2,0xc2),
RGB(0xbe,0xbe,0xbe),
RGB(0xba,0xba,0xba),
RGB(0xb6,0xb6,0xb6),
RGB(0xb2,0xb2,0xb2),
RGB(0xae,0xae,0xae),
RGB(0xa9,0xa9,0xa9),
RGB(0xa5,0xa5,0xa5),
RGB(0xa1,0xa1,0xa1),
RGB(0x9d,0x9d,0x9d),
RGB(0x99,0x99,0x99),
RGB(0x95,0x95,0x95),
RGB(0x91,0x91,0x91),
RGB(0x8d,0x8d,0x8d),
RGB(0x89,0x89,0x89),
RGB(0x85,0x85,0x85),
RGB(0x81,0x81,0x81),
RGB(0x7d,0x7d,0x7d),
RGB(0x79,0x79,0x79),
RGB(0x75,0x75,0x75),
RGB(0x71,0x71,0x71),
RGB(0x6d,0x6d,0x6d),
RGB(0x69,0x69,0x69),
RGB(0x65,0x65,0x65),
RGB(0x61,0x61,0x61),
RGB(0x5d,0x5d,0x5d),
RGB(0x59,0x59,0x59),
RGB(0x54,0x54,0x54),
RGB(0x50,0x50,0x50),
RGB(0x4c,0x4c,0x4c),
RGB(0x48,0x48,0x48),
RGB(0x44,0x44,0x44),
RGB(0x40,0x40,0x40),
RGB(0x3c,0x3c,0x3c),
RGB(0x38,0x38,0x38),
RGB(0x34,0x34,0x34),
RGB(0x30,0x30,0x30),
RGB(0x2c,0x2c,0x2c),
RGB(0x28,0x28,0x28),
RGB(0x24,0x24,0x24),
RGB(0x20,0x20,0x20),
RGB(0x1c,0x1c,0x1c),
RGB(0x18,0x18,0x18),
RGB(0x14,0x14,0x14),
RGB(0x10,0x10,0x10),
RGB(0x0c,0x0c,0x0c),
RGB(0x08,0x08,0x08),
RGB(0x04,0x04,0x04),
RGB(0x00,0x00,0x00),
RGB(0xff,0xff,0xff)
};
// This palette has weak signals as "cold" (blue) and strong signals as hot (red)
//
const uint16_t waterfall_cold_hot[] =
{
RGB(0x00,0x00,0x22), //div 4 RGB(0x00,0x02,0x8a), - make the first few colors darker/"redder"
RGB(0x01,0x00,0x23), //div 3.8 RGB(0x04,0x02,0x87),
RGB(0x02,0x00,0x25), //div 3.6 RGB(0x08,0x02,0x85),
RGB(0x04,0x00,0x27), //div 3.4 RGB(0x0c,0x02,0x83),
RGB(0x05,0x00,0x28), //div 3.2 RGB(0x10,0x02,0x81),
RGB(0x07,0x00,0x2a), //div 3.0 RGB(0x14,0x02,0x7f),
RGB(0x09,0x01,0x2d), //div 2.8 RGB(0x18,0x03,0x7d),
RGB(0x0a,0x01,0x2f), //div 2.6 RGB(0x1c,0x03,0x7b),
RGB(0x0d,0x01,0x32), //div 2.4 RGB(0x20,0x03,0x79),
RGB(0x10,0x02,0x36), //div 2.2 RGB(0x24,0x03,0x77),
RGB(0x14,0x02,0x3b), //div 2.0 RGB(0x28,0x03,0x75),
RGB(0x18,0x02,0x40), //div 1.8 RGB(0x2c,0x04,0x73),
RGB(0x1e,0x02,0x47), //div 1.6 RGB(0x30,0x04,0x71),
RGB(0x25,0x02,0x4f), //div 1.4 RGB(0x34,0x04,0x6f),
RGB(0x2f,0x03,0x5b), //div 1.2 RGB(0x38,0x04,0x6d),
RGB(0x3c,0x04,0x6b),
RGB(0x40,0x05,0x69),
RGB(0x44,0x05,0x67),
RGB(0x48,0x05,0x65),
RGB(0x4c,0x05,0x63),
RGB(0x50,0x05,0x61),
RGB(0x55,0x06,0x5f),
RGB(0x59,0x06,0x5d),
RGB(0x5d,0x06,0x5b),
RGB(0x61,0x06,0x59),
RGB(0x65,0x06,0x57),
RGB(0x69,0x06,0x55),
RGB(0x6d,0x07,0x53),
RGB(0x71,0x07,0x51),
RGB(0x75,0x07,0x4f),
RGB(0x79,0x07,0x4d),
RGB(0x7d,0x07,0x4b),
RGB(0x81,0x08,0x48),
RGB(0x85,0x08,0x46),
RGB(0x89,0x08,0x44),
RGB(0x8d,0x08,0x42),
RGB(0x91,0x08,0x40),
RGB(0x95,0x09,0x3d),
RGB(0x99,0x09,0x3c),
RGB(0x9d,0x09,0x3a),
RGB(0xa1,0x09,0x38),
RGB(0xa5,0x09,0x36),
RGB(0xaa,0x0a,0x34),
RGB(0xae,0x0a,0x32),
RGB(0xb2,0x0a,0x30),
RGB(0xb6,0x0a,0x2e),
RGB(0xba,0x0a,0x2c),
RGB(0xbe,0x0a,0x2a),
RGB(0xc2,0x0b,0x28),
RGB(0xc6,0x0b,0x26),
RGB(0xca,0x0b,0x24),
RGB(0xce,0x0b,0x22),
RGB(0xd2,0x0b,0x20),
RGB(0xd6,0x0c,0x1e),
RGB(0xda,0x0c,0x1c),
RGB(0xde,0x0c,0x1a),
RGB(0xe2,0x0c,0x18),
RGB(0xe6,0x0c,0x16),
RGB(0xea,0x0d,0x14),
RGB(0xee,0x0d,0x12),
RGB(0xf2,0x0d,0x10),
RGB(0xf6,0x0d,0x0e),
RGB(0xfa,0x0d,0x0c),
RGB(0xff,0x0d,0x0a),
RGB(0xff,0xff,0xff),
};
//
// Waterfall Blue Colors: Weak = dark, strongest = white
//
const uint16_t waterfall_blue[] =
{
RGB(0x00,0x00,0x2e),
RGB(0x02,0x02,0x31),
RGB(0x05,0x05,0x34),
RGB(0x07,0x08,0x37),
RGB(0x0a,0x0b,0x3b),
RGB(0x0c,0x0d,0x3e),
RGB(0x0f,0x10,0x41),
RGB(0x12,0x13,0x45),
RGB(0x14,0x16,0x48),
RGB(0x17,0x19,0x4b),
RGB(0x19,0x1b,0x4f),
RGB(0x1c,0x1e,0x52),
RGB(0x1f,0x21,0x55),
RGB(0x21,0x24,0x59),
RGB(0x24,0x27,0x5c),
RGB(0x26,0x29,0x5f),
RGB(0x29,0x2c,0x63),
RGB(0x2b,0x2f,0x66),
RGB(0x2e,0x32,0x69),
RGB(0x31,0x35,0x6d),
RGB(0x33,0x37,0x70),
RGB(0x36,0x3a,0x73),
RGB(0x38,0x3d,0x76),
RGB(0x3b,0x40,0x7a),
RGB(0x3e,0x43,0x7d),
RGB(0x40,0x45,0x80),
RGB(0x43,0x48,0x84),
RGB(0x45,0x4b,0x87),
RGB(0x48,0x4e,0x8a),
RGB(0x4b,0x51,0x8e),
RGB(0x4d,0x53,0x91),
RGB(0x50,0x56,0x94),
RGB(0x52,0x59,0x98),
RGB(0x55,0x5c,0x9b),
RGB(0x57,0x5e,0x9e),
RGB(0x5a,0x61,0xa2),
RGB(0x5d,0x64,0xa5),
RGB(0x5f,0x67,0xa8),
RGB(0x62,0x6a,0xac),
RGB(0x64,0x6c,0xaf),
RGB(0x67,0x6f,0xb2),
RGB(0x6a,0x72,0xb6),
RGB(0x6c,0x75,0xb9),
RGB(0x6f,0x78,0xbc),
RGB(0x71,0x7a,0xbf),
RGB(0x74,0x7d,0xc3),
RGB(0x77,0x80,0xc6),
RGB(0x79,0x83,0xc9),
RGB(0x7c,0x86,0xcd),
RGB(0x7e,0x88,0xd0),
RGB(0x81,0x8d,0xd3),
RGB(0x83,0x8e,0xd7),
RGB(0x86,0x91,0xda),
RGB(0x89,0x94,0xdd),
RGB(0x8b,0x96,0xe1),
RGB(0x8e,0x99,0xe4),
RGB(0x90,0x9c,0xe7),
RGB(0x93,0x9f,0xeb),
RGB(0x96,0xa2,0xee),
RGB(0x98,0xa4,0xf1),
RGB(0x9b,0xa7,0xf5),
RGB(0x9d,0xda,0xf8),
RGB(0xa0,0xdf,0xfb),
RGB(0xa3,0xe5,0xff),
RGB(0xff,0xff,0xff)
};
const uint16_t waterfall_rainbow[] =
{
RGB(0x00,0x00,0x0b), //div 4.0 RGB(0x00,0x01,0x2d), // Make the first few colors "bluer"
RGB(0x00,0x01,0x0d), //div 3.8 RGB(0x00,0x04,0x30),
RGB(0x00,0x02,0x0e), //div 3.6 RGB(0x00,0x07,0x33),
RGB(0x00,0x03,0x10), //div 3.4 RGB(0x00,0x0b,0x37),
RGB(0x00,0x05,0x12), //div 3.2 RGB(0x00,0x10,0x3a),
RGB(0x00,0x07,0x14), //div 3.0 RGB(0x00,0x14,0x3d),
RGB(0x00,0x09,0x1b), //div 2.8 RGB(0x00,0x1a,0x4a),
RGB(0x00,0x0c,0x1a), //div 2.6 RGB(0x00,0x1f,0x44),
RGB(0x00,0x0f,0x1e), //div 2.4 RGB(0x00,0x25,0x47),
RGB(0x00,0x14,0x22), //div 2.2 RGB(0x00,0x2c,0x4b),
RGB(0x00,0x1a,0x27), //div 2.0 RGB(0x00,0x33,0x4e),
RGB(0x00,0x20,0x2d), //div 1.8 RGB(0x00,0x3a,0x51),
RGB(0x00,0x29,0x35), //div 1.6 RGB(0x00,0x42,0x54),
RGB(0x00,0x35,0x3f), //div 1.4 RGB(0x00,0x4a,0x58),
RGB(0x00,0x44,0x4c), //div 1.2 RGB(0x00,0x52,0x5b),
RGB(0x00,0x5b,0x5e),
RGB(0x00,0x62,0x5f),
RGB(0x01,0x65,0x5c),
RGB(0x01,0x68,0x59),
RGB(0x01,0x6c,0x55),
RGB(0x01,0x6f,0x50),
RGB(0x01,0x72,0x4c),
RGB(0x01,0x76,0x46),
RGB(0x01,0x79,0x41),
RGB(0x01,0x7c,0x3b),
RGB(0x01,0x80,0x35),
RGB(0x02,0x83,0x2e),
RGB(0x02,0x87,0x27),
RGB(0x02,0x8a,0x1f),
RGB(0x02,0x8d,0x18),
RGB(0x02,0x91,0x0f),
RGB(0x02,0x94,0x07),
RGB(0x08,0x97,0x03),
RGB(0x11,0x9b,0x03),
RGB(0x1c,0x9e,0x03),
RGB(0x26,0xa1,0x03),
RGB(0x31,0xa4,0x03),
RGB(0x3d,0xa8,0x03),
RGB(0x49,0xab,0x04),
RGB(0x55,0xaf,0x04),
RGB(0x61,0xb2,0x04),
RGB(0x6e,0xb5,0x04),
RGB(0x7c,0xb8,0x04),
RGB(0x8a,0xbc,0x05),
RGB(0x98,0xbf,0x05),
RGB(0xa6,0xc3,0x05),
RGB(0xb5,0xc6,0x05),
RGB(0xc5,0xc9,0x05),
RGB(0xcc,0xc4,0x06),
RGB(0xd0,0xbb,0x06),
RGB(0xd3,0xb1,0x06),
RGB(0xd7,0xa7,0x06),
RGB(0xda,0x9c,0x07),
RGB(0xdd,0x91,0x07),
RGB(0xe0,0x86,0x07),
RGB(0xe4,0x7a,0x07),
RGB(0xe7,0x6e,0x08),
RGB(0xeb,0x61,0x08),
RGB(0xee,0x54,0x08),
RGB(0xf1,0x47,0x08),
RGB(0xf4,0x39,0x09),
RGB(0xf8,0x2b,0x09),
RGB(0xfb,0x1c,0x09),
RGB(0xff,0x0e,0x09),
RGB(0xff,0xff,0xff),
};
//
// Waterfall Flame: Weak = dark blue -> light blue -> red -> yellow, strongest = white
//
const uint16_t waterfall_flame[] =
{
RGB(0x00,0x00,0x22),
RGB(0x01,0x00,0x23),
RGB(0x02,0x00,0x25),
RGB(0x04,0x00,0x27),
RGB(0x05,0x00,0x28),
RGB(0x07,0x00,0x2a),
RGB(0x09,0x01,0x2d),
RGB(0x0a,0x01,0x2f),
RGB(0x0d,0x01,0x32),
RGB(0x10,0x02,0x36),
RGB(0x14,0x02,0x3b),
RGB(0x18,0x02,0x40),
RGB(0x3f,0x00,0x00),
RGB(0x4d,0x00,0x00),
RGB(0x3f,0x00,0x00),
RGB(0x5a,0x00,0x00),
RGB(0x64,0x00,0x00),
RGB(0x6e,0x00,0x00),
RGB(0x78,0x00,0x00),
RGB(0x82,0x00,0x00),
RGB(0x97,0x00,0x00),
RGB(0xa1,0x00,0x00),
RGB(0xab,0x00,0x00),
RGB(0xb7,0x00,0x00),
RGB(0xc2,0x00,0x00),
RGB(0xcd,0x00,0x00),
RGB(0xd9,0x00,0x00),
RGB(0xe4,0x00,0x00),
RGB(0xef,0x00,0x00),
RGB(0xfa,0x00,0x00),
RGB(0xfa,0x18,0x00),
RGB(0xfa,0x2b,0x00),
RGB(0xfa,0x3c,0x00),
RGB(0xfa,0x4b,0x00),
RGB(0xfa,0x57,0x00),
RGB(0xfa,0x62,0x00),
RGB(0xfa,0x6d,0x00),
RGB(0xfa,0x76,0x00),
RGB(0xfa,0x7e,0x00),
RGB(0xfa,0x86,0x00),
RGB(0xfa,0x8d,0x00),
RGB(0xfa,0x94,0x00),
RGB(0xfa,0x9b,0x00),
RGB(0xfa,0xa1,0x00),
RGB(0xfa,0xa7,0x00),
RGB(0xfa,0xac,0x00),
RGB(0xfa,0xb2,0x00),
RGB(0xfa,0xb7,0x00),
RGB(0xfa,0xbe,0x00),
RGB(0xfa,0xc5,0x00),
RGB(0xfa,0xcb,0x00),
RGB(0xfa,0xd2,0x00),
RGB(0xfa,0xd8,0x00),
RGB(0xfa,0xdf,0x00),
RGB(0xfa,0xe6,0x00),
RGB(0xfa,0xee,0x00),
RGB(0xfa,0xf7,0x00),
RGB(0xfa,0xfa,0x2d),
RGB(0xfa,0xf8,0x51),
RGB(0xfa,0xf8,0x76),
RGB(0xfa,0xf8,0x9a),
RGB(0xfa,0xfa,0xbf),
RGB(0xfa,0xfa,0xe1),
RGB(0xff,0xff,0xff),
RGB(0xff,0xff,0xff)
};
//
// Waterfall Sunset: sunset colours
//
const uint16_t waterfall_sunset[] =
{
RGB(0x00,0x00,0x00),
RGB(0x00,0x02,0x0f),
RGB(0x00,0x03,0x1f),
RGB(0x00,0x05,0x2f),
RGB(0x00,0x06,0x3e),
RGB(0x00,0x09,0x4e),
RGB(0x00,0x0a,0x5e),
RGB(0x00,0x0c,0x6d),
RGB(0x00,0x0d,0x7d),
RGB(0x00,0x0f,0x8c),
RGB(0x00,0x11,0x9d),
RGB(0x00,0x13,0xae),
RGB(0x00,0x15,0xbf),
RGB(0x00,0x16,0xd0),
RGB(0x00,0x18,0xe0),
RGB(0x00,0x1a,0xf1),
RGB(0x03,0x1c,0xfc),
RGB(0x14,0x1a,0xec),
RGB(0x24,0x18,0xdb),
RGB(0x34,0x16,0xca),
RGB(0x45,0x15,0xba),
RGB(0x56,0x12,0xa9),
RGB(0x66,0x11,0x99),
RGB(0x77,0x0e,0x87),
RGB(0x88,0x0d,0x77),
RGB(0x98,0x0c,0x67),
RGB(0xa8,0x0a,0x57),
RGB(0xb9,0x08,0x47),
RGB(0xc8,0x06,0x36),
RGB(0xd9,0x04,0x26),
RGB(0xe9,0x03,0x15),
RGB(0xfa,0x01,0x06),
RGB(0xff,0x06,0x00),
RGB(0xff,0x16,0x00),
RGB(0xff,0x26,0x00),
RGB(0xff,0x35,0x00),
RGB(0xff,0x45,0x00),
RGB(0xff,0x53,0x00),
RGB(0xff,0x63,0x00),
RGB(0xff,0x72,0x00),
RGB(0xff,0x81,0x00),
RGB(0xff,0x90,0x00),
RGB(0xff,0x9f,0x00),
RGB(0xff,0xad,0x00),
RGB(0xff,0xbc,0x00),
RGB(0xff,0xca,0x00),
RGB(0xff,0xd9,0x00),
RGB(0xff,0xe7,0x00),
RGB(0xff,0xf3,0x05),
RGB(0xff,0xf3,0x14),
RGB(0xff,0xf4,0x24),
RGB(0xff,0xf5,0x34),
RGB(0xff,0xf5,0x43),
RGB(0xff,0xf6,0x53),
RGB(0xff,0xf7,0x63),
RGB(0xff,0xf7,0x73),
RGB(0xff,0xf9,0x83),
RGB(0xff,0xf9,0x95),
RGB(0xff,0xfa,0xa6),
RGB(0xff,0xfb,0xb8),
RGB(0xff,0xfc,0xca),
RGB(0xff,0xfd,0xdc),
RGB(0xff,0xfe,0xed),
RGB(0xff,0xff,0xff),
RGB(0xff,0xff,0xff)
};
//
// Waterfall Matrix: black-green-white
//
const uint16_t waterfall_matrix[] =
{
RGB(0x00,0x00,0x00),
RGB(0x00,0x00,0x00),
RGB(0x00,0x00,0x00),
RGB(0x00,0x00,0x00),
RGB(0x00,0x00,0x00),
RGB(0x00,0x00,0x00),
RGB(0x00,0x00,0x00),
RGB(0x00,0x00,0x00),
RGB(0x00,0x00,0x00),
RGB(0x00,0x00,0x00),
RGB(0x00,0x00,0x00),
RGB(0x00,0x00,0x00),
RGB(0x0f,0x66,0x01),
RGB(0x0f,0x66,0x01),
RGB(0x0f,0x66,0x01),
RGB(0x0f,0x66,0x01),
RGB(0x14,0x86,0x01),
RGB(0x14,0x86,0x01),
RGB(0x14,0x86,0x01),
RGB(0x14,0x86,0x01),
RGB(0x19,0xa7,0x01),
RGB(0x19,0xa7,0x01),
RGB(0x19,0xa7,0x01),
RGB(0x19,0xa7,0x01),
RGB(0x21,0xc3,0x07),
RGB(0x21,0xc3,0x07),
RGB(0x21,0xc3,0x07),
RGB(0x21,0xc3,0x07),
RGB(0x30,0xdd,0x13),
RGB(0x30,0xdd,0x13),
RGB(0x30,0xdd,0x13),
RGB(0x30,0xdd,0x13),
RGB(0x45,0xf0,0x29),
RGB(0x45,0xf0,0x29),
RGB(0x45,0xf0,0x29),
RGB(0x45,0xf0,0x29),
RGB(0xa0,0xfd,0x91),
RGB(0xa0,0xfd,0x91),
RGB(0xa0,0xfd,0x91),
RGB(0xa0,0xfd,0x91),
RGB(0xb3,0xfe,0xa6),
RGB(0xb3,0xfe,0xa6),
RGB(0xb3,0xfe,0xa6),
RGB(0xb3,0xfe,0xa6),
RGB(0xc3,0xfe,0xb9),
RGB(0xc3,0xfe,0xb9),
RGB(0xc3,0xfe,0xb9),
RGB(0xc3,0xfe,0xb9),
RGB(0xd3,0xfe,0xcc),
RGB(0xd3,0xfe,0xcc),
RGB(0xd3,0xfe,0xcc),
RGB(0xd3,0xfe,0xcc),
RGB(0xdf,0xfe,0xda),
RGB(0xdf,0xfe,0xda),
RGB(0xdf,0xfe,0xda),
RGB(0xdf,0xfe,0xda),
RGB(0xef,0xfd,0xec),
RGB(0xef,0xfd,0xec),
RGB(0xef,0xfd,0xec),
RGB(0xef,0xfd,0xec),
RGB(0xef,0xfd,0xec),
RGB(0xff,0xff,0xff),
RGB(0xff,0xff,0xff),
RGB(0xff,0xff,0xff),
RGB(0xff,0xff,0xff)
};
#endif