get pixel return value implemented in struct

ugfx_release_2.6
trsaunders 2012-07-24 17:22:50 +01:00
commit e4094ad468
15 changed files with 131 additions and 119 deletions

View File

@ -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

View File

@ -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;
}

View File

@ -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);

View File

@ -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;
}

View File

@ -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

View File

@ -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;
}

View File

@ -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

View File

@ -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<b) ? b : a;
}
unsigned char min (unsigned char a, unsigned char b)
{
unsigned char min (unsigned char a, unsigned char b) {
return (a<b) ? a : b;
}

View File

@ -19,12 +19,13 @@
* Copyright: 2011 Roland Domke
*/
#ifndef FASTMATH_H_
#define FASTMATH_H_
#ifndef FASTMATH_H
#define FASTMATH_H
char sgn(char x);
double getCos(unsigned int degree);
double getSin(unsigned int degree);
unsigned char max(unsigned char a, unsigned char b);
unsigned char min(unsigned char a, unsigned char b);
#endif /* FASTMATH_H_ */

View File

@ -1,6 +1,4 @@
#include "glcd.h"
#include <stdlib.h>
#include <math.h>
#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; i<x1; i++)
for(j=y0; j<y1; j++)
lcdDrawPixel(i , j , color);
lcdFillArea(x0, y0, x1, y1, color);
} else {
lcdDrawLine(x0, y0, x1, y0, color);
lcdDrawLine(x0, y1, x1, y1, color);

View File

@ -4,7 +4,8 @@
#include "ch.h"
#include "hal.h"
#include "fonts.h"
#include "worker.h"
#include "fastMath.h"
#include "glcdWorker.h"
#if !defined(LCD_USE_FSMC) && !defined(LCD_USE_GPIO) && !defined(LCD_USE_SPI)
#include "glcdconf.h"

View File

@ -1,5 +1,5 @@
#ifndef WORKER_H
#define WORKER_H
#ifndef GLCD_WORKER_H
#define GLCD_WORKER_H
#define GLCD_WORKER_SIZE 512

View File

@ -89,7 +89,7 @@ static inline void buttonUpdate(struct guiNode_t *node) {
}
static inline void sliderUpdate(struct guiNode_t *node) {
uint16_t length;
uint16_t length = 1;
if(node->orientation == 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);

2
readme
View File

@ -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

View File

@ -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<CONVERSIONS; i++) {
readX();
results += readX();
lld_tpReadX();
results += lld_tpReadX();
}
x = (((SCREEN_WIDTH-1) * (results/CONVERSIONS)) / 2048);
@ -47,8 +39,8 @@ static uint16_t tpReadRealY(void) {
uint16_t i, y;
for(i=0; i<CONVERSIONS; i++) {
readY();
results += readY();
lld_tpReadY();
results += lld_tpReadY();
}
y = (((SCREEN_HEIGHT-1) * (results/CONVERSIONS)) / 2048);
@ -97,7 +89,7 @@ uint16_t tpReadY(void) {
}
uint16_t tpReadZ(void) {
return lld_readZ();
return lld_tpReadZ();
}
static void tpDrawCross(uint16_t x, uint16_t y) {