/* * Authors (alphabetical order) * - Andre Bernet * - Andreas Weitl * - Bertrand Songis * - Bryan J. Rentoul (Gruvin) * - Cameron Weeks * - Erez Raviv * - Gabriel Birkus * - Jean-Pierre Parisy * - Karl Szmutny * - Michael Blandford * - Michal Hlavinka * - Pat Mackenzie * - Philip Moss * - Rob Thomson * - Romolo Manfredini * - Thomas Husterer * * opentx is based on code named * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, * er9x by Erez Raviv: http://code.google.com/p/er9x/, * and the original (and ongoing) project by * Thomas Husterer, th9x: http://code.google.com/p/th9x/ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #ifndef lcd_h #define lcd_h #if defined(PCBTARANIS) #define LCD_W 212 #define LCD_H 64 #define xcoord_t uint16_t #define CENTER "\015" #define CENTER_OFS (7*FW-FW/2) #define CONTRAST_MIN 0 #define CONTRAST_MAX 45 #else #define LCD_W 128 #define LCD_H 64 #define xcoord_t uint8_t #define CENTER #define CENTER_OFS 0 #define CONTRAST_MIN 10 #define CONTRAST_MAX 45 #endif #if defined(CPUARM) #define lcdint_t int32_t #define lcduint_t uint32_t #else #define lcdint_t int16_t #define lcduint_t uint16_t #endif #define FW 6 #define FWNUM 5 #define FH 8 #define LCD_LINES (LCD_H/FH) #define LCD_COLS (LCD_W/FW) /* lcd common flags */ #define BLINK 0x01 /* lcd text flags */ #define INVERS 0x02 #define DBLSIZE 0x04 #ifdef BOLD_FONT #define BOLD 0x40 #else #define BOLD 0x00 #endif /* lcd putc flags */ #define CONDENSED 0x08 #define FIXEDWIDTH 0x10 /* lcd puts flags */ /* no 0x80 here because of "GV"1 which is aligned LEFT */ /* no 0x10 here because of "MODEL"01 which uses LEADING0 */ #define BSS 0x20 #define ZCHAR 0x80 /* lcd outdez flags */ #define UNSIGN 0x08 #define LEADING0 0x10 #define PREC1 0x20 #define PREC2 0x30 #define MODE(flags) ((((int8_t)(flags) & 0x30) - 0x10) >> 4) #define LEFT 0x80 /* align left */ /* line, rect, square flags */ #define FORCE 0x02 #define ERASE 0x04 #define ROUND 0x08 #if defined(PCBTARANIS) #define FILL_WHITE 0x10 #endif /* telemetry flags */ #define NO_UNIT 0x40 #if defined(CPUARM) #define MIDSIZE 0x0100 #define SMLSIZE 0x0200 #define TINSIZE 0x0400 #define XXLSIZE 0x0800 #else #define MIDSIZE DBLSIZE #define SMLSIZE 0x00 #define TINSIZE 0x00 #define XXLSIZE 0x00 #endif #if defined(PCBTARANIS) #define GREY(x) ((x) * 0x1000) #define GREY_DEFAULT GREY(11) #define GREY_MASK(x) ((x) & 0xF000) #endif #if defined(CPUARM) #define TIMEBLINK 0x010000 #define TIMEHOUR 0x020000 #define STREXPANDED 0x040000 #else #define STREXPANDED 0x00 #endif #if defined(CPUARM) #define LcdFlags uint32_t #else #define LcdFlags uint8_t #endif #define DISPLAY_PLAN_SIZE (LCD_W*((LCD_H+7)/8)) #if defined(PCBTARANIS) #define DISPLAY_BUF_SIZE (4*DISPLAY_PLAN_SIZE) #else #define DISPLAY_BUF_SIZE DISPLAY_PLAN_SIZE #endif extern uint8_t displayBuf[DISPLAY_BUF_SIZE]; extern uint8_t lcdLastPos; extern uint8_t lcdNextPos; #define DISPLAY_END (displayBuf + DISPLAY_BUF_SIZE) #define ASSERT_IN_DISPLAY(p) assert((p) >= displayBuf && (p) < DISPLAY_END) #if defined(PCBSTD) && defined(VOICE) extern volatile uint8_t LcdLock ; #endif #if defined(PCBSKY9X) extern volatile uint8_t lcdLock ; extern volatile uint32_t lcdInputs ; #endif #if defined(BOOT) // TODO quick & dirty :( typedef const unsigned char pm_uchar; typedef const char pm_char; #endif void lcd_putc(xcoord_t x, uint8_t y, const unsigned char c); void lcd_putcAtt(xcoord_t x, uint8_t y, const unsigned char c, LcdFlags mode); void lcd_putsAtt(xcoord_t x, uint8_t y, const pm_char * s, LcdFlags mode); void lcd_putsiAtt(xcoord_t x, uint8_t y, const pm_char * s,uint8_t idx, LcdFlags mode); void lcd_putsnAtt(xcoord_t x, uint8_t y, const pm_char * s,unsigned char len, LcdFlags mode); void lcd_puts(xcoord_t x, uint8_t y, const pm_char * s); void lcd_putsn(xcoord_t x, uint8_t y, const pm_char * s, unsigned char len); void lcd_putsLeft(uint8_t y, const pm_char * s); #define lcd_putsCenter(y, s) lcd_puts((LCD_W-sizeof(TR_##s)*FW+FW-2)/2, y, STR_##s) void lcd_outhex4(xcoord_t x, uint8_t y, uint16_t val); void lcd_outdezAtt(xcoord_t x, uint8_t y, lcdint_t val, LcdFlags mode=0); void lcd_outdezNAtt(xcoord_t x, uint8_t y, lcdint_t val, LcdFlags mode=0, uint8_t len=0); void lcd_outdez8(xcoord_t x, uint8_t y, int8_t val); void putsStrIdx(xcoord_t x, uint8_t y, const pm_char *str, uint8_t idx, LcdFlags att=0); void putsModelName(xcoord_t x, uint8_t y, char *name, uint8_t id, LcdFlags att); void putsSwitches(xcoord_t x, uint8_t y, int8_t swtch, LcdFlags att=0); void putsMixerSource(xcoord_t x, uint8_t y, uint8_t idx, LcdFlags att=0); void putsFlightMode(xcoord_t x, uint8_t y, int8_t idx, LcdFlags att=0); #if defined(PCBTARANIS) && !defined(BOOT) void putsCurveRef(xcoord_t x, uint8_t y, CurveRef &curve, LcdFlags att); #endif void putsCurve(xcoord_t x, uint8_t y, int8_t idx, LcdFlags att=0); void putsTimerMode(xcoord_t x, uint8_t y, int8_t mode, LcdFlags att=0); void putsTrimMode(xcoord_t x, uint8_t y, uint8_t phase, uint8_t idx, LcdFlags att); #if defined(ROTARY_ENCODERS) void putsRotaryEncoderMode(xcoord_t x, uint8_t y, uint8_t phase, uint8_t idx, LcdFlags att); #endif #define putsChn(x, y, idx, att) putsMixerSource(x, y, MIXSRC_CH1+idx-1, att) void putsChnLetter(xcoord_t x, uint8_t y, uint8_t idx, LcdFlags attr); void putsVolts(xcoord_t x, uint8_t y, uint16_t volts, LcdFlags att); void putsVBat(xcoord_t x, uint8_t y, LcdFlags att); void putsTelemetryChannel(xcoord_t x, uint8_t y, uint8_t channel, lcdint_t val, LcdFlags att=0); #if defined(CPUARM) #define putstime_t int32_t #else #define putstime_t int16_t #endif void putsTime(xcoord_t x, uint8_t y, struct gtm t, LcdFlags att); void putsTimer(xcoord_t x, uint8_t y, putstime_t tme, LcdFlags att, LcdFlags att2); #define SOLID 0xff #define DOTTED 0x55 void lcd_plot(xcoord_t x, uint8_t y, LcdFlags att=0); void lcd_mask(uint8_t *p, uint8_t mask, LcdFlags att=0); void lcd_hline(xcoord_t x, uint8_t y, xcoord_t w, LcdFlags att=0); void lcd_hlineStip(xcoord_t x, uint8_t y, xcoord_t w, uint8_t pat, LcdFlags att=0); void lcd_vline(xcoord_t x, int8_t y, int8_t h); #if defined(CPUM64) void lcd_vlineStip(xcoord_t x, int8_t y, int8_t h, uint8_t pat); #else void lcd_vlineStip(xcoord_t x, int8_t y, int8_t h, uint8_t pat, LcdFlags att=0); #endif #if defined(CPUARM) void lcd_line(xcoord_t x1, int8_t y1, xcoord_t x2, int8_t y2, uint8_t pat=SOLID, LcdFlags att=0); #endif void lcd_rect(xcoord_t x, uint8_t y, xcoord_t w, uint8_t h, uint8_t pat=SOLID, LcdFlags att=0); void lcd_filled_rect(xcoord_t x, int8_t y, xcoord_t w, uint8_t h, uint8_t pat=SOLID, LcdFlags att=0); void lcd_invert_line(int8_t y); #define lcd_status_line() lcd_invert_line(LCD_LINES-1) inline void lcd_square(xcoord_t x, uint8_t y, xcoord_t w, LcdFlags att=0) { lcd_rect(x, y, w, w, SOLID, att); } void lcdDrawTelemetryTopBar(); #define DO_CROSS(xx,yy,ww) \ lcd_vline(xx,yy-ww/2,ww); \ lcd_hline(xx-ww/2,yy,ww); #define V_BAR(xx,yy,ll) \ lcd_vline(xx-1,yy-ll,ll); \ lcd_vline(xx ,yy-ll,ll); \ lcd_vline(xx+1,yy-ll,ll); /* #define LCD_2DOTS(x, y, att) \ lcd_putcAtt(x, y, ' ', att); \ lcd_vline(x+4, y+3, 2); \ lcd_vline(x+5, y+3, 2); \ lcd_vline(x+4, y+8, 2); \ lcd_vline(x+5, y+8, 2); */ void lcd_img(xcoord_t x, uint8_t y, const pm_uchar * img, uint8_t idx, LcdFlags att=0); void lcd_bmp(xcoord_t x, uint8_t y, const pm_uchar * img, uint8_t offset=0, uint8_t width=0); #define LCD_ICON(x, y, icon) lcd_bmp(x, y, icons, icon) void lcdSetRefVolt(unsigned char val); void lcdInit(); void lcd_clear(); void lcdSetContrast(); #if defined(PCBTARANIS) && defined(REVPLUS) && !defined(SIMU) void lcdRefresh(bool wait=true); #define LCD_REFRESH_DONT_WAIT false #else void lcdRefresh(); #define LCD_REFRESH_DONT_WAIT #endif #if defined(PCBTARANIS) const pm_char * bmpLoad(uint8_t *dest, const char *filename, const xcoord_t width, const uint8_t height); #endif #if defined(BOOT) #define BLINK_ON_PHASE (0) #else #define BLINK_ON_PHASE (g_blinkTmr10ms & (1<<6)) #endif #ifdef SIMU extern bool lcd_refresh; extern uint8_t lcd_buf[DISPLAY_BUF_SIZE]; #endif #if defined(LUA) extern bool lcd_locked; #define LCD_LOCKED() lcd_locked #else #define LCD_LOCKED() 0 #endif char * strAppend(char * dest, const char * source); char * strAppendDate(char * str, bool time=false); #endif