UHSDR/UHSDR-active-devel/mchf-eclipse/drivers/ui/lcd/ui_lcd_hy28.h
2022-11-08 16:13:55 +01:00

302 lines
12 KiB
C

/* -*- 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