void displayGpsCoord(uint8_t y, char direction, int16_t bp, int16_t ap) { if (frskyData.hub.gpsFix >= 0) { if (!direction) direction = '-'; lcd_outdezAtt(TELEM_2ND_COLUMN, y, bp / 100, LEFT); // ddd before '.' lcd_putc(lcdLastPos, y, '@'); uint8_t mn = bp % 100; // TODO div_t if (g_eeGeneral.gpsFormat == 0) { lcd_putc(lcdLastPos+FWNUM, y, direction); lcd_outdezNAtt(lcdLastPos+FW+FW+1, y, mn, LEFT|LEADING0, 2); // mm before '.' lcd_vline(lcdLastPos, y, 2); uint16_t ss = ap * 6; lcd_outdezAtt(lcdLastPos+3, y, ss / 1000, LEFT); // '' lcd_plot(lcdLastPos, y+FH-2, 0); // small decimal point lcd_outdezAtt(lcdLastPos+2, y, ss % 1000, LEFT); // '' lcd_vline(lcdLastPos, y, 2); lcd_vline(lcdLastPos+2, y, 2); } else { lcd_outdezNAtt(lcdLastPos+FW, y, mn, LEFT|LEADING0, 2); // mm before '.' lcd_plot(lcdLastPos, y+FH-2, 0); // small decimal point lcd_outdezNAtt(lcdLastPos+2, y, ap, LEFT|UNSIGN|LEADING0, 4); // after '.' lcd_putc(lcdLastPos+1, y, direction); } } else { // no fix lcd_puts(TELEM_2ND_COLUMN, y, STR_VCSWFUNC+1/*----*/); } }
int main(void) { // don't know why this is incorrect SystemCoreClock = 100000000; SysTick_Config(SystemCoreClock / 1000); timeout_ms=0; UART0_Init(115200); sspInit(); lcdInit(); // sets SystemCoreClock to 44583722, but why ? SystemCoreClockUpdate(); lcd_plot (1, 1, 1); lcd_putc (1,1,'c',1); while(1) { } }
/*luadoc @function lcd.drawPoint(x, y) Draws a single pixel at (x,y) position @param x (positive number) x position @param y (positive number) y position @notice Taranis has an LCD display width of 212 pixels and height of 64 pixels. Position (0,0) is at top left. Y axis is negative, top line is 0, bottom line is 63. Drawing on an existing black pixel produces white pixel (TODO check this!) @status current Introduced in 2.0.0 */ static int luaLcdDrawPoint(lua_State *L) { if (!luaLcdAllowed) return 0; int x = luaL_checkinteger(L, 1); int y = luaL_checkinteger(L, 2); lcd_plot(x, y); return 0; }
void drawOffsetBar(uint8_t x, uint8_t y, MixData * md) { int offset = GET_GVAR(MD_OFFSET(md), GV_RANGELARGE_NEG, GV_RANGELARGE, mixerCurrentFlightMode); int weight = GET_GVAR(MD_WEIGHT(md), GV_RANGELARGE_NEG, GV_RANGELARGE, mixerCurrentFlightMode); int barMin = offset - weight; int barMax = offset + weight; if (y > 15) { lcd_outdezAtt(x-((barMin >= 0) ? 2 : 3), y-6, barMin, TINSIZE|LEFT); lcd_outdezAtt(x+GAUGE_WIDTH+1, y-6, barMax, TINSIZE); } if (weight < 0) { barMin = -barMin; barMax = -barMax; } if (barMin < -101) barMin = -101; if (barMax > 101) barMax = 101; lcd_hlineStip(x-2, y, GAUGE_WIDTH+2, DOTTED); lcd_hlineStip(x-2, y+GAUGE_HEIGHT, GAUGE_WIDTH+2, DOTTED); lcd_vline(x-2, y+1, GAUGE_HEIGHT-1); lcd_vline(x+GAUGE_WIDTH-1, y+1, GAUGE_HEIGHT-1); if (barMin <= barMax) { int8_t right = (barMax * GAUGE_WIDTH) / 200; int8_t left = ((barMin * GAUGE_WIDTH) / 200)-1; drawFilledRect(x+GAUGE_WIDTH/2+left, y+2, right-left, GAUGE_HEIGHT-3); } lcd_vline(x+GAUGE_WIDTH/2-1, y, GAUGE_HEIGHT+1); if (barMin == -101) { for (uint8_t i=0; i<3; ++i) { lcd_plot(x+i, y+4-i); lcd_plot(x+3+i, y+4-i); } } if (barMax == 101) { for (uint8_t i=0; i<3; ++i) { lcd_plot(x+GAUGE_WIDTH-8+i, y+4-i); lcd_plot(x+GAUGE_WIDTH-5+i, y+4-i); } } }
void DrawFunction(FnFuncP fn, uint8_t offset) { lcd_vlineStip(X0-offset, 0/*TODO Y0-WCHART*/, WCHART*2, 0xee); lcd_hlineStip(X0-WCHART-offset, Y0, WCHART*2, 0xee); coord_t prev_yv = (coord_t)-1; for (int xv=-WCHART; xv<=WCHART; xv++) { coord_t yv = (LCD_H-1) - (((uint16_t)RESX + fn(xv * (RESX/WCHART))) / 2 * (LCD_H-1) / RESX); if (prev_yv != (coord_t)-1) { if (abs((int8_t)yv-prev_yv) <= 1) { lcd_plot(X0+xv-offset-1, prev_yv, FORCE); } else { uint8_t tmp = (prev_yv < yv ? 0 : 1); lcd_vline(X0+xv-offset-1, yv+tmp, prev_yv-yv); } } prev_yv = yv; } }
uint8_t lcd_outdezNAtt( uint8_t x, uint8_t y, int32_t val, uint8_t mode, int8_t len ) { uint8_t fw = FWNUM; uint8_t prec = PREC(mode); uint8_t negative = 0 ; uint8_t xn = 0; uint8_t ln = 2; char c; uint8_t xinc ; uint8_t fullwidth = 0 ; mode &= ~NO_UNIT ; if ( len < 0 ) { fullwidth = 1 ; len = -len ; } if ( val < 0 ) { val = -val ; negative = 1 ; } if (mode & DBLSIZE) { fw += FWNUM ; xinc = 2*FWNUM; lcd_lastPos = 2*FW; } else { xinc = FWNUM ; lcd_lastPos = FW; } if (mode & LEFT) { // if (val >= 10000) // x += fw; if(negative) { x += fw; } if (val >= 1000) x += fw; if (val >= 100) x += fw; if (val >= 10) x += fw; if ( prec ) { if ( prec == 2 ) { if ( val < 100 ) { x += fw; } } if ( val < 10 ) { x+= fw; } } } else { x -= xinc; } lcd_lastPos += x ; if ( prec == 2 ) { mode -= LEADING0; // Can't have PREC2 and LEADING0 } for (uint8_t i=1; i<=len; i++) { div_t qr ; qr = div( val, 10 ) ; c = (qr.rem) + '0'; lcd_putcAtt(x, y, c, mode); if (prec==i) { if (mode & DBLSIZE) { xn = x; if( c<='3' && c>='1') ln++; uint8_t tn = (qr.quot) % 10; if(tn==2 || tn==4) { if (c=='4') { xn++; } else { xn--; ln++; } } } else { x -= 2; if (mode & INVERS) lcd_vline(x+1, y, 7); else lcd_plot(x+1, y+6); } if (qr.quot) prec = 0; } val = qr.quot ; if (!val) { if (prec) { if ( prec == 2 ) { if ( i > 1 ) { prec = 0 ; } } else { prec = 0 ; } } else if (mode & LEADING0) { if ( fullwidth == 0 ) { mode -= LEADING0; } } else break; } x-=fw; } if (xn) { lcd_hline(xn, y+2*FH-4, ln); lcd_hline(xn, y+2*FH-3, ln); } if(negative) lcd_putcAtt(x-fw,y,'-',mode); asm("") ; return 0 ; // Stops compiler creating two sets of POPS, saves flash }