diff --git a/demos/README b/demos/README index e95314f7..a15ebd51 100644 --- a/demos/README +++ b/demos/README @@ -2,17 +2,3 @@ This are a few demos, showing how to use the library. Please note that this are not compilable projects. - -Your boarfile do need to contain the following informations: - - #define TP_PORT GPIOC - #define TP_IRQ 4 - #define TP_CS 6 - - #define LCD_DATA_PORT GPIOE - #define LCD_CMD_PORT GPIOD - #define LCD_CS 12 - #define LCD_RS 13 - #define LCD_WR 14 - #define LCD_RD 15 - diff --git a/demos/console/main.c b/demos/console/main.c new file mode 100755 index 00000000..c629e2cd --- /dev/null +++ b/demos/console/main.c @@ -0,0 +1,30 @@ +#include "ch.h" +#include "hal.h" +#include "glcd.h" +#include "test.h" +#include "console.h" + +static GLCDDriver GLCDD1; +static GLCDConsole CON1; + +int main(void) { + halInit(); + chSysInit(); + + // init LCD and clear it + lcdInit(&GLCDD1); + lcdClear(Black); + + // init console + lcdConsoleInit(&CON1, 0, 0, lcdGetWidth(), lcdGetHeight(), font_Small, Black, White); + + // use test thread for console output + TestThread((BaseSequentialStream*)&CON1); + + while (TRUE) { + + chThdSleepMilliseconds(200); + } + + return 0; +} diff --git a/drivers/lcd/ssd1289_lld.c b/drivers/lcd/ssd1289_lld.c index a7c5ab73..09769a4b 100644 --- a/drivers/lcd/ssd1289_lld.c +++ b/drivers/lcd/ssd1289_lld.c @@ -100,16 +100,16 @@ __inline void lld_lcdReadStream(uint16_t *buffer, size_t size) { uint16_t i; volatile uint16_t dummy; - dummy = lld_lcdReadGPIO(); + dummy = lld_lcdReadData(); for(i = 0; i < size; i++) buffer[i] = lld_lcdReadData(); } -#endif +#endif // LCD_USE_GPIO #ifdef LCD_USE_SPI /* TODO */ -#endif +#endif // LCD_USE_SPI #ifdef LCD_USE_FSMC @@ -170,7 +170,7 @@ __inline void lld_lcdReadStream(uint16_t *buffer, size_t size) { buffer[i] = LCD_RAM; } } -#endif +#endif // LCD_USE_FSMC static __inline void lld_lcdDelay(uint16_t us) { chThdSleepMicroseconds(us); diff --git a/drivers/touchpad/ads7843_lld.c b/drivers/touchpad/ads7843_lld.c index 507a2104..b097e0a5 100644 --- a/drivers/touchpad/ads7843_lld.c +++ b/drivers/touchpad/ads7843_lld.c @@ -2,7 +2,7 @@ #ifdef TOUCHPAD_USE_ADS7843 -__inline uint16_t lld_readX(void) { +__inline uint16_t lld_tpReadX(void) { uint8_t txbuf[1]; uint8_t rxbuf[2]; uint16_t x; @@ -19,7 +19,7 @@ __inline uint16_t lld_readX(void) { return x; } -__inline uint16_t lld_readY(void) { +__inline uint16_t lld_tpReadY(void) { uint8_t txbuf[1]; uint8_t rxbuf[2]; uint16_t y; @@ -36,7 +36,7 @@ __inline uint16_t lld_readY(void) { return y; } -__inline uint16_t lld_readZ(void) { +__inline uint16_t lld_tpReadZ(void) { return 0; } diff --git a/drivers/touchpad/ads7843_lld.h b/drivers/touchpad/ads7843_lld.h index 121e6288..d288c3ea 100644 --- a/drivers/touchpad/ads7843_lld.h +++ b/drivers/touchpad/ads7843_lld.h @@ -6,9 +6,9 @@ #ifdef TOUCHPAD_USE_ADS7843 -uint16_t lld_readX(void); -uint16_t lld_readY(void); -uint16_t lld_readZ(void); +uint16_t lld_tpReadX(void); +uint16_t lld_tpReadY(void); +uint16_t lld_tpReadZ(void); #endif #endif diff --git a/drivers/touchpad/xpt2046_lld.c b/drivers/touchpad/xpt2046_lld.c index 02ded390..eac9d19a 100644 --- a/drivers/touchpad/xpt2046_lld.c +++ b/drivers/touchpad/xpt2046_lld.c @@ -2,7 +2,7 @@ #ifdef TOUCHPAD_USE_XPT2046 -__inline uint16_t lld_readX(void) { +__inline uint16_t lld_tpReadX(void) { uint8_t txbuf[1]; uint8_t rxbuf[2]; uint16_t x; @@ -19,7 +19,7 @@ __inline uint16_t lld_readX(void) { return x; } -__inline uint16_t lld_readY(void) { +__inline uint16_t lld_tpReadY(void) { uint8_t txbuf[1]; uint8_t rxbuf[2]; uint16_t y; @@ -36,7 +36,7 @@ __inline uint16_t lld_readY(void) { return y; } -__inline uint16_t lld_readZ(void) { +__inline uint16_t lld_tpReadZ(void) { return 0; } diff --git a/drivers/touchpad/xpt2046_lld.h b/drivers/touchpad/xpt2046_lld.h index c3a12077..249c66ca 100644 --- a/drivers/touchpad/xpt2046_lld.h +++ b/drivers/touchpad/xpt2046_lld.h @@ -6,9 +6,9 @@ #ifdef TOUCHPAD_USE_XPT2046 -uint16_t lld_readX(void); -uint16_t lld_readY(void); -uint16_t lld_readZ(void); +uint16_t lld_tpReadX(void); +uint16_t lld_tpReadY(void); +uint16_t lld_tpReadZ(void); #endif #endif diff --git a/glcd/fastMath.c b/glcd/fastMath.c index 26ae0d3f..1957b304 100644 --- a/glcd/fastMath.c +++ b/glcd/fastMath.c @@ -116,44 +116,39 @@ float sintable[91] = { }; -float getSin(unsigned int degree) -{ +float getSin(unsigned int degree) { degree = degree % 360; - if(degree <= 90) - { + + if(degree <= 90) { return sintable[degree]; } - else if(degree <= 180) - { + else if(degree <= 180) { return sintable[180-degree]; } - else if(degree <= 270) - { + else if(degree <= 270) { return sintable[degree-180]*(-1.0); } - else - { + else { return sintable[360-degree]*(-1.0); } } -double getCos(unsigned int degree) -{ +double getCos(unsigned int degree) { degree = degree % 360; + return getSin(degree+90); } /* signum function */ -char sgn(char x){ +char sgn(char x) { return (x > 0) ? 1 : (x < 0) ? -1 : 0; } -unsigned char max(unsigned char a, unsigned char b) -{ +unsigned char max(unsigned char a, unsigned char b) { return (a -#include #define EMSG(a) const struct a *emsg = (const struct a*)msg @@ -68,8 +66,9 @@ static msg_t ThreadGLCDWorker(void *arg) { } case GLCD_GET_PIXEL_COLOR: { - /* ToDo */ - + EMSG(glcd_msg_get_pixel_color); + ((struct glcd_msg_get_pixel_color *)emsg)->color = + lld_lcdGetPixelColor(emsg->x, emsg->y); result = GLCD_DONE; break; } @@ -110,6 +109,7 @@ static msg_t ThreadGLCDWorker(void *arg) { /* Done, release msg again. */ chMsgRelease(p, (msg_t)result); + } return 0; @@ -206,16 +206,14 @@ glcd_result_t lcdClear(uint16_t color) { uint16_t lcdGetPixelColor(uint16_t x, uint16_t y) { struct glcd_msg_get_pixel_color msg; - uint16_t result; msg.action = GLCD_GET_PIXEL_COLOR; msg.x = x; msg.y = y; - msg.color = &result; chMsgSend(workerThread, (msg_t)&msg); - return result; + return msg.color; } glcd_result_t lcdDrawPixel(uint16_t x, uint16_t y, uint16_t color) { @@ -269,49 +267,57 @@ glcd_result_t lcdVerticalScroll(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t } void lcdDrawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color) { - int16_t dy, dx; - int16_t addx = 1, addy = 1; - int16_t P, diff; + // speed improvement if vertical or horizontal + if(x0 == x1) { + lcdFillArea(x0, y0, x0+1, y1, color); + } else if (y0 == y1) { + lcdFillArea(x0, y0, x1, y0+1, color); - int16_t i = 0; - dx = abs((int16_t)(x1 - x0)); - dy = abs((int16_t)(y1 - y0)); - - if(x0 > x1) - addx = -1; - if(y0 > y1) - addy = -1; - - if(dx >= dy) { - dy *= 2; - P = dy - dx; - diff = P - dx; - - for(; i<=dx; ++i) { - lcdDrawPixel(x0, y0, color); - if(P < 0) { - P += dy; - x0 += addx; - } else { - P += diff; - x0 += addx; - y0 += addy; - } - } } else { - dx *= 2; - P = dx - dy; - diff = P - dy; + int16_t dy, dx; + int16_t addx = 1, addy = 1; + int16_t P, diff; - for(; i<=dy; ++i) { - lcdDrawPixel(x0, y0, color); - if(P < 0) { - P += dx; - y0 += addy; - } else { - P += diff; - x0 += addx; - y0 += addy; + int16_t i = 0; + dx = abs((int16_t)(x1 - x0)); + dy = abs((int16_t)(y1 - y0)); + + if(x0 > x1) + addx = -1; + if(y0 > y1) + addy = -1; + + if(dx >= dy) { + dy *= 2; + P = dy - dx; + diff = P - dx; + + for(; i<=dx; ++i) { + lcdDrawPixel(x0, y0, color); + if(P < 0) { + P += dy; + x0 += addx; + } else { + P += diff; + x0 += addx; + y0 += addy; + } + } + } else { + dx *= 2; + P = dx - dy; + diff = P - dy; + + for(; i<=dy; ++i) { + lcdDrawPixel(x0, y0, color); + if(P < 0) { + P += dx; + y0 += addy; + } else { + P += diff; + x0 += addx; + y0 += addy; + } } } } @@ -456,9 +462,7 @@ void lcdDrawRect(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint8_t fil y0 = TempY; } if(filled) { - for(i=x0; iorientation == horizontal) length = node->x1 - node->x0; @@ -113,8 +113,6 @@ static inline void sliderUpdate(struct guiNode_t *node) { // a bit of safety here if(node->percentage > 100) node->percentage = 100; - if(node->percentage < 0) - node->percentage = 0; if(node->orientation == horizontal) { node->value = ((((node->x1)-(node->x0)) * node->percentage) / 100); @@ -303,6 +301,11 @@ uint8_t guiDrawKeymatrix(uint16_t x0, uint16_t y0, uint16_t size, uint16_t space return 0; // lcdDraw functions + (void)size; + (void)space; + (void)buttonColor; + (void)fontColor; + (void)font; chHeapFree(newNode); diff --git a/readme b/readme index 71e91085..36f99119 100644 --- a/readme +++ b/readme @@ -5,7 +5,7 @@ http://chibios.org/dokuwiki/doku.php?id=chibios:community ### Maintainer & Contributors -Contributors: - Badger -> console implementation and FSMC for F1 and SSD1289 +Contributors: - Badger -> console implementation and FSMC - Abhishek -> font rendering - Ben William -> fastMath and lcdDrawEllipse() - dxli (Dongxu Li) -> lcdDrawEllipse() filled option diff --git a/touchpad/touchpad.c b/touchpad/touchpad.c index d44e03a1..97df206b 100644 --- a/touchpad/touchpad.c +++ b/touchpad/touchpad.c @@ -16,14 +16,6 @@ void tpInit(SPIDriver *spip) { spiStart(spip, &spicfg); } -static __inline uint16_t readX(void) { - return lld_readX(); -} - -static __inline uint16_t readY(void) { - return lld_readY(); -} - uint8_t tpIRQ(void) { return (!palReadPad(TP_IRQ_PORT, TP_IRQ)); } @@ -33,8 +25,8 @@ static uint16_t tpReadRealX(void) { uint16_t i, x; for(i=0; i