The theme system stores one flat background colour per element, so a rainbow background can't be expressed as a preset alone. Add a small display hook: when Pride is selected, displayClearBuf()/displayClearRows() paint the six pride-flag stripes across the framebuffer instead of a flat fill (gated on a flag only the Pride preset sets, and behind HAS_COLOURS so mono builds are untouched). Non-selected menu rows draw text straight over the canvas, while the title/header/notifications paint solid white boxes, so chrome stays readable over the stripes; blue/violet are lightened slightly for black-text contrast. Docs and changelog updated. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
303 lines
16 KiB
C
303 lines
16 KiB
C
/*
|
|
* Copyright (C) 2019-2025 Roger Clark, VK3KYY / G4KYF
|
|
* Daniel Caujolle-Bert, F1RMB
|
|
*
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions
|
|
* are met:
|
|
*
|
|
* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
|
*
|
|
* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer
|
|
* in the documentation and/or other materials provided with the distribution.
|
|
*
|
|
* 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived
|
|
* from this software without specific prior written permission.
|
|
*
|
|
* 4. Use of this source code or binary releases for commercial purposes is strictly forbidden. This includes, without limitation,
|
|
* incorporation in a commercial product or incorporation into a product or project which allows commercial use.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
* HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
|
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
|
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*
|
|
*/
|
|
|
|
#ifndef _OPENGD77_HX8353E_H_
|
|
#define _OPENGD77_HX8353E_H_
|
|
|
|
#include "main.h"
|
|
#include <stdbool.h>
|
|
#include <math.h>
|
|
#include <FreeRTOS.h>
|
|
#include <task.h>
|
|
|
|
|
|
typedef enum
|
|
{
|
|
FONT_SIZE_1 = 0,
|
|
FONT_SIZE_1_BOLD,
|
|
FONT_SIZE_2,
|
|
FONT_SIZE_3,
|
|
FONT_SIZE_4
|
|
} ucFont_t;
|
|
|
|
typedef enum
|
|
{
|
|
TEXT_ALIGN_LEFT = 0,
|
|
TEXT_ALIGN_CENTER,
|
|
TEXT_ALIGN_RIGHT
|
|
} ucTextAlign_t;
|
|
|
|
typedef enum
|
|
{
|
|
CHOICE_OK = 0,
|
|
#if defined(PLATFORM_MD9600)
|
|
CHOICE_ENT,
|
|
#endif
|
|
CHOICE_YESNO,
|
|
CHOICE_DISMISS,
|
|
CHOICES_OKARROWS,// QuickKeys
|
|
CHOICES_NUM
|
|
} ucChoice_t;
|
|
|
|
typedef enum
|
|
{
|
|
THEME_ITEM_FG_DEFAULT, // default text foreground colour.
|
|
THEME_ITEM_BG, // global background colour.
|
|
THEME_ITEM_FG_DECORATION, // like borders/drop-shadow/menu line separator/etc.
|
|
THEME_ITEM_FG_TEXT_INPUT, // foreground colour of text input.
|
|
THEME_ITEM_FG_SPLASHSCREEN, // foreground colour of SplashScreen.
|
|
THEME_ITEM_BG_SPLASHSCREEN, // background colour of SplashScreen.
|
|
THEME_ITEM_FG_NOTIFICATION, // foreground colour of notification text (+ squelch bargraph).
|
|
THEME_ITEM_FG_WARNING_NOTIFICATION, // foreground colour of warning notification/messages.
|
|
THEME_ITEM_FG_ERROR_NOTIFICATION, // foreground colour of error notification/messages.
|
|
THEME_ITEM_BG_NOTIFICATION, // foreground colour of notification background.
|
|
THEME_ITEM_FG_MENU_NAME, // foreground colour of menu name (header).
|
|
THEME_ITEM_BG_MENU_NAME, // background colour of menu name (header).
|
|
THEME_ITEM_FG_MENU_ITEM, // foreground colour of menu entries.
|
|
THEME_ITEM_BG_MENU_ITEM_SELECTED, // foreground colour of selected menu entry.
|
|
THEME_ITEM_FG_OPTIONS_VALUE, // foreground colour for settings values (options/quickmenus/channel details/etc).
|
|
THEME_ITEM_FG_HEADER_TEXT, // foreground colour of Channel/VFO header (radio mode/PWR/battery/etc).
|
|
THEME_ITEM_BG_HEADER_TEXT, // background colour of Channel/VFO header (radio mode/PWR/battery/etc).
|
|
THEME_ITEM_FG_RSSI_BAR, // foreground colour of RSSI bars <= S9 (Channel/VFO/RSSI screen/Satellite).
|
|
THEME_ITEM_FG_RSSI_BAR_S9P, // foreground colour of RSSI bars at > S9 (Channel/VFO/RSSI screen).
|
|
THEME_ITEM_FG_CHANNEL_NAME, // foreground colour of the channel name.
|
|
THEME_ITEM_FG_CHANNEL_CONTACT, // foreground colour of the contact name (aka TG/PC).
|
|
THEME_ITEM_FG_CHANNEL_CONTACT_INFO, // foreground colour of contact info (DB/Ct/TA).
|
|
THEME_ITEM_FG_ZONE_NAME, // foreground colour of zone name.
|
|
THEME_ITEM_FG_RX_FREQ, // foreground colour of RX frequency.
|
|
THEME_ITEM_FG_TX_FREQ, // foreground colour of TX frequency.
|
|
THEME_ITEM_FG_CSS_SQL_VALUES, // foreground colour of CSS & Squelch values in Channel/VFO screens.
|
|
THEME_ITEM_FG_TX_COUNTER, // foreground colour of timer value in TX screen.
|
|
THEME_ITEM_FG_POLAR_DRAWING, // foreground colour of the polar drawing in the satellite/GPS screens.
|
|
THEME_ITEM_FG_SATELLITE_COLOUR, // foreground colour of the satellites spots in the satellite screen.
|
|
THEME_ITEM_FG_GPS_NUMBER, // foreground colour of the GPS number in the GPS screen.
|
|
THEME_ITEM_FG_GPS_COLOUR, // foreground colour of the GPS bar and spots in the GPS screens.
|
|
THEME_ITEM_FG_BD_COLOUR, // foreground colour of the BEIDOU bar and spots in the GPS screens.
|
|
THEME_ITEM_MAX,
|
|
THEME_ITEM_COLOUR_NONE // special none colour, used when colour has not to be changed.
|
|
} themeItem_t;
|
|
|
|
#if defined(HAS_COLOURS)
|
|
extern DayTime_t themeDaytime;
|
|
extern uint16_t themeItems[NIGHT + 1][THEME_ITEM_MAX]; // Theme storage
|
|
#endif
|
|
|
|
|
|
#define HX8583_CMD_NOP 0x00 // No Operation
|
|
#define HX8583_CMD_SWRESET 0x01 // Software reset
|
|
#define HX8583_CMD_RDDIDIF 0x04 // Read Display ID Info
|
|
#define HX8583_CMD_RDDST 0x09 // Read Display Status
|
|
#define HX8583_CMD_RDDPM 0x0a // Read Display Power
|
|
#define HX8583_CMD_RDD_MADCTL 0x0b // Read Display
|
|
#define HX8583_CMD_RDD_COLMOD 0x0c // Read Display Pixel
|
|
#define HX8583_CMD_RDDDIM 0x0d // Read Display Image
|
|
#define HX8583_CMD_RDDSM 0x0e // Read Display Signal
|
|
#define HX8583_CMD_RDDSDR 0x0f // Read display self-diagnostic resut
|
|
#define HX8583_CMD_SLPIN 0x10 // Sleep in & booster off
|
|
#define HX8583_CMD_SLPOUT 0x11 // Sleep out & booster on
|
|
#define HX8583_CMD_PTLON 0x12 // Partial mode on
|
|
#define HX8583_CMD_NORON 0x13 // Partial off (Normal)
|
|
#define HX8583_CMD_INVOFF 0x20 // Display inversion off
|
|
#define HX8583_CMD_INVON 0x21 // Display inversion on
|
|
#define HX8583_CMD_GAMSET 0x26 // Gamma curve select
|
|
#define HX8583_CMD_DISPOFF 0x28 // Display off
|
|
#define HX8583_CMD_DISPON 0x29 // Display on
|
|
#define HX8583_CMD_CASET 0x2a // Column address set
|
|
#define HX8583_CMD_RASET 0x2b // Row address set
|
|
#define HX8583_CMD_RAMWR 0x2c // Memory write
|
|
#define HX8583_CMD_RGBSET 0x2d // LUT parameter (16-to-18 color mapping)
|
|
#define HX8583_CMD_RAMRD 0x2e // Memory read
|
|
#define HX8583_CMD_PTLAR 0x30 // Partial start/end address set
|
|
#define HX8583_CMD_VSCRDEF 0x31 // Vertical Scrolling Direction
|
|
#define HX8583_CMD_TEOFF 0x34 // Tearing effect line off
|
|
#define HX8583_CMD_TEON 0x35 // Tearing effect mode set & on
|
|
#define HX8583_CMD_MADCTL 0x36 // Memory data access control
|
|
#define HX8583_CMD_VSCRSADD 0x37 // Vertical scrolling start address
|
|
#define HX8583_CMD_IDMOFF 0x38 // Idle mode off
|
|
#define HX8583_CMD_IDMON 0x39 // Idle mode on
|
|
#define HX8583_CMD_COLMOD 0x3a // Interface pixel format
|
|
#define HX8583_CMD_RDID1 0xda // Read ID1
|
|
#define HX8583_CMD_RDID2 0xdb // Read ID2
|
|
#define HX8583_CMD_RDID3 0xdc // Read ID3
|
|
|
|
#define HX8583_CMD_SETOSC 0xb0 // Set internal oscillator
|
|
#define HX8583_CMD_SETPWCTR 0xb1 // Set power control
|
|
#define HX8583_CMD_SETDISPLAY 0xb2 // Set display control
|
|
#define HX8583_CMD_SETCYC 0xb4 // Set display cycle
|
|
#define HX8583_CMD_SETBGP 0xb5 // Set BGP voltage
|
|
#define HX8583_CMD_SETVCOM 0xb6 // Set VCOM voltage
|
|
#define HX8583_CMD_SETEXTC 0xb9 // Enter extension command
|
|
#define HX8583_CMD_SETOTP 0xbb // Set OTP
|
|
#define HX8583_CMD_SETSTBA 0xc0 // Set Source option
|
|
#define HX8583_CMD_SETID 0xc3 // Set ID
|
|
#define HX8583_CMD_SETPANEL 0xcc // Set Panel characteristics
|
|
#define HX8583_CMD_GETHID 0xd0 // Read Himax internal ID
|
|
#define HX8583_CMD_SETGAMMA 0xe0 // Set Gamma
|
|
#define HX8583_CMD_SET_SPI_RDEN 0xfe // Set SPI Read address (and enable)
|
|
#define HX8583_CMD_GET_SPI_RDEN 0xff // Get FE A[7:0] parameter
|
|
|
|
#define LCD_FSMC_ADDR_COMMAND 0x60000000
|
|
#define LCD_FSMC_ADDR_DATA 0x60040000
|
|
|
|
#define FONT_SIZE_1_HEIGHT 8
|
|
#define FONT_SIZE_2_HEIGHT 8
|
|
#define FONT_SIZE_3_HEIGHT 16
|
|
#define FONT_SIZE_4_HEIGHT 32
|
|
#if defined(PLATFORM_VARIANT_DM1701)
|
|
#define DISPLAY_Y_OFFSET 8
|
|
#define DISPLAY_SIZE_Y (128 - DISPLAY_Y_OFFSET)
|
|
#else
|
|
#define DISPLAY_Y_OFFSET 0
|
|
#define DISPLAY_SIZE_Y 128
|
|
#endif
|
|
#define DISPLAY_SIZE_X 160
|
|
#define DISPLAY_NUMBER_OF_ROWS (DISPLAY_SIZE_Y / 8)
|
|
|
|
#if defined(HAS_COLOURS)
|
|
// Platform format could be RGB565 or BGR565
|
|
#define RGB888_TO_PLATFORM_COLOUR_FORMAT(x) ((displayLCD_Type & DIPLAYLCD_TYPE_RGB) \
|
|
? ((uint16_t) (((x & 0xf80000) >> 8) + ((x & 0xfc00) >> 5) + ((x & 0xf8) >> 3))) \
|
|
: ((uint16_t) (((x & 0xf80000) >> 19) + ((x & 0xfc00) >> 5) + ((x & 0xf8) << 8))))
|
|
#define PLATFORM_COLOUR_FORMAT_TO_RGB888(x) ((displayLCD_Type & DIPLAYLCD_TYPE_RGB) \
|
|
? ((uint32_t) (((x & 0xf800) << 8) + ((x & 0x7e0) << 5) + ((x & 0x1f) << 3))) \
|
|
: ((uint32_t) (((x & 0x1f) << 19) + ((x & 0x7e0) << 5) + ((x & 0xf800) >> 8))))
|
|
#define PLATFORM_COLOUR_FORMAT_SWAP_BYTES(n) (((n & 0xFF) << 8) | ((n & 0xFF00) >> 8))
|
|
#endif // HAS_COLOURS
|
|
|
|
#ifndef DEG_TO_RAD
|
|
#define DEG_TO_RAD 0.017453292519943295769236907684886f
|
|
#endif
|
|
#ifndef RAD_TO_DEG
|
|
#define RAD_TO_DEG 57.295779513082320876798154814105f
|
|
#endif
|
|
|
|
void displayBegin(bool isInverted, bool SPIFlashAvailable);
|
|
void displayClearBuf(void);
|
|
void displayClearRows(int16_t startRow, int16_t endRow, bool isInverted);
|
|
void displayRenderWithoutNotification(void);
|
|
void displayRender(void);
|
|
void displayRenderRows(int16_t startRow, int16_t endRow);
|
|
void displayPrintCentered(uint16_t y, const char *text, ucFont_t fontSize);
|
|
void displayPrintCenteredDoubleHeight(uint16_t y, const char *text, ucFont_t fontSize, bool doubleHeight);
|
|
void displayPrintAt(uint16_t x, uint16_t y, const char *text, ucFont_t fontSize);
|
|
void displayPrintAtDoubleHeight(uint16_t x, uint16_t y, const char *text, ucFont_t fontSize, bool doubleHeight);
|
|
int displayPrintCore(int16_t x, int16_t y, const char *szMsg, ucFont_t fontSize, ucTextAlign_t alignment, bool isInverted);
|
|
int displayPrintCoreDoubleHeight(int16_t xPos, int16_t yPos, const char *szMsg, ucFont_t fontSize, ucTextAlign_t alignment, bool isInverted, bool doubleHeight);
|
|
|
|
int16_t displaySetPixel(int16_t x, int16_t y, bool isInverted);
|
|
|
|
void displayDrawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, bool isInverted);
|
|
void displayDrawFastVLine(int16_t x, int16_t y, int16_t h, bool isInverted);
|
|
void displayDrawFastHLine(int16_t x, int16_t y, int16_t w, bool isInverted);
|
|
|
|
void displayDrawCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername, bool isInverted);
|
|
void displayDrawCircle(int16_t x0, int16_t y0, int16_t r, bool isInverted);
|
|
void displayFillCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername, int16_t delta, bool isInverted);
|
|
void displayFillCircle(int16_t x0, int16_t y0, int16_t r, bool isInverted);
|
|
|
|
void displayDrawEllipse(int16_t x0, int16_t y0, int16_t x1, int16_t y1, bool isInverted);
|
|
|
|
void displayDrawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, bool isInverted);
|
|
void displayFillTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, bool isInverted);
|
|
|
|
void displayFillArcOffsetted(uint16_t cx, uint16_t cy, uint16_t radius, uint16_t thickness, float start, float end, bool isInverted);
|
|
void displayFillArc(uint16_t x, uint16_t y, uint16_t radius, uint16_t thickness, float start, float end, bool isInverted);
|
|
|
|
void displayDrawRoundRect(int16_t x, int16_t y, int16_t w, int16_t h, int16_t r, bool isInverted);
|
|
void displayFillRoundRect(int16_t x, int16_t y, int16_t w, int16_t h, int16_t r, bool isInverted);
|
|
void displayDrawRoundRectWithDropShadow(int16_t x, int16_t y, int16_t w, int16_t h, int16_t r, bool isInverted);
|
|
|
|
void displayDrawRect(int16_t x, int16_t y, int16_t w, int16_t h, bool isInverted);
|
|
void displayFillRect(int16_t x, int16_t y, int16_t width, int16_t height, bool isInverted);
|
|
void displayDrawRectWithDropShadow(int16_t x, int16_t y, int16_t w, int16_t h, bool isInverted);
|
|
|
|
void displayDrawBitmap(int16_t x, int16_t y, uint8_t *bitmap, int16_t w, int16_t h, bool isInverted);
|
|
void displayDrawXBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, bool isInverted);
|
|
|
|
void displaySetContrast(uint8_t contrast);
|
|
void displaySetInverseVideo(bool isInverted);
|
|
|
|
void displaySetDisplayPowerMode(bool wake);
|
|
|
|
void displayDrawChoice(ucChoice_t choice, bool clearRegion);
|
|
|
|
uint16_t *displayGetScreenBuffer(void);
|
|
void displayRestorePrimaryScreenBuffer(void);
|
|
uint16_t *displayGetPrimaryScreenBuffer(void);
|
|
void displayOverrideScreenBuffer(uint16_t *buffer);
|
|
|
|
void displayConvertGD77ImageData(uint8_t *dataBuf);
|
|
|
|
#if defined(HAS_COLOURS)
|
|
uint16_t displayConvertRGB888ToNative(uint32_t RGB888);
|
|
#endif
|
|
|
|
//
|
|
// Native color format (swapped RGB565/BGR565, swapped bytes) functions
|
|
//
|
|
void displaySetForegroundAndBackgroundColours(uint16_t fgColour, uint16_t bgColour);
|
|
void displayGetForegroundAndBackgroundColours(uint16_t *fgColour, uint16_t *bgColour);
|
|
|
|
#if defined(HAS_COLOURS)
|
|
// Render a numeric string as 7-segment "LED" digits with dimmed inactive segments.
|
|
void displayDrawFrequencySevenSeg(int16_t x, int16_t y, int16_t cellW, int16_t cellH, const char *str, themeItem_t fgItem);
|
|
#endif
|
|
|
|
#if defined(HAS_COLOURS)
|
|
// FreeTRX selectable theme presets. CUSTOM is the CPS-editable theme (default);
|
|
// the others are fixed palettes baked into the firmware.
|
|
typedef enum
|
|
{
|
|
THEME_PRESET_CUSTOM = 0, // editable via CPS / on-device colour editor
|
|
THEME_PRESET_BASIC80S, // Commodore 64 BASIC (light blue on blue)
|
|
THEME_PRESET_TERMINAL, // green terminal (green-on-black night / black-on-green day)
|
|
THEME_PRESET_VERTEXIC, // amber/orange (black-on-amber day / amber-on-black night)
|
|
THEME_PRESET_RED, // red (black-on-red day / red-on-black night)
|
|
THEME_PRESET_NEON80S, // 80s synthwave: cyan/magenta/violet/green neon on dark
|
|
THEME_PRESET_PRIDE, // pride flag: black text + white chrome over a rainbow background
|
|
NUM_THEME_PRESETS
|
|
} themePreset_t;
|
|
|
|
void themeInitToDefaultValues(DayTime_t daytime, bool invert);
|
|
void themeInit(bool SPIFlashAvailable);
|
|
void themeApplyPreset(uint8_t preset); // rebuild themeItems[] for the given preset
|
|
uint8_t themeGetPreset(void); // read the stored preset (default CUSTOM)
|
|
void themeSetPreset(uint8_t preset, bool save); // apply, and optionally persist to the codeplug
|
|
void displayThemeApply(themeItem_t fgItem, themeItem_t bgItem);
|
|
void displayThemeResetToDefault(void);
|
|
bool displayThemeIsForegroundColourEqualTo(themeItem_t fgItem);
|
|
void displayThemeGetForegroundAndBackgroundItems(themeItem_t *fgItem, themeItem_t *bgItem);
|
|
bool displayThemeSaveToFlash(DayTime_t daytime);
|
|
#else
|
|
#define themeInit(x) do {} while(0)
|
|
#define displayThemeApply(x, y) do {} while(0)
|
|
#define displayThemeResetToDefault() do {} while(0)
|
|
#define displayThemeGetForegroundAndBackgroundItems(x, y) do { UNUSED_PARAMETER(x); UNUSED_PARAMETER(y); } while(0)
|
|
#endif
|
|
|
|
#endif /* _OPENGD77_HX8353E_H_ */
|