From 0f377dc9efe9cf2a3d14413188d6f61f0f22b8d0 Mon Sep 17 00:00:00 2001 From: trsaunders Date: Wed, 20 Jun 2012 23:32:27 +0100 Subject: [PATCH] starting work on virtual console --- console.c | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ console.h | 63 +++++++++++++++++++++++++++++++++ lcd.mk | 1 + 3 files changed, 167 insertions(+) create mode 100644 console.c create mode 100644 console.h diff --git a/console.c b/console.c new file mode 100644 index 00000000..c944b899 --- /dev/null +++ b/console.c @@ -0,0 +1,103 @@ +/* + * console.c + * + * Created on: 20 Jun 2012 + * Author: Thomas Saunders AKA "Badger" + */ + +#include "ch.h" + +#include "fonts.h" +#include "glcd.h" +#include "console.h" + + +msg_t lcdConsoleInit(GLCDConsole *console, uint16_t x0, uint16_t y0, uint16_t x1, + uint16_t y1, const uint8_t *font, uint8_t *buffer, uint16_t bkcolor, uint16_t color) { + const uint8_t* ptr; + uint16_t chi; + uint16_t x,y; + /* read font, get size */ + /* TODO: this is messy. improve font handling. + * this assumes that all characters are as wide as A */ + console->fy = font[FONT_TABLE_HEIGHT_IDX]; + chi = *(uint16_t*)(&font[FONT_TABLE_CHAR_LOOKUP_IDX + ('A'-0x20)*2]); + ptr = font + chi; + console->fx = *(ptr++); + + /* calculate the size of the console in characters */ + console->sx = (x1-x0)/console->fx; + console->sy = (y1-y0)/console->fy; + + console->cx = 0; + console->cy = 0; + + console->buf = buffer; + console->bidx = 0; +} + + +/* + * Interface implementation. The interface is write only + */ + +static size_t writes(void *ip, const uint8_t *bp, size_t n) { + (void)ip; + return lcdWriteString(bp, n); +} + +static size_t reads(void *ip, uint8_t *bp, size_t n) { + (void)ip; + (void)bp; + (void)n; + return 0; +} + +static msg_t put(void *ip, uint8_t b) { + (void)ip; + return lcdDrawChar((char)b); +} + +static msg_t get(void *ip) { + (void)ip; + return RDY_OK; +} + +static msg_t putt(void *ip, uint8_t b, systime_t timeout) { + (void)ip; + (void)timeout; + /* TODO: handle timeout */ + return lcdDrawChar((char)b); +} + +static msg_t gett(void *ip, systime_t timeout) { + (void)ip; + (void)timeout; + return RDY_OK; +} + +static size_t writet(void *ip, const uint8_t *bp, size_t n, systime_t time) { + (void)ip; + (void)time; + return lcdWriteString(bp, n); +} + +static size_t readt(void *ip, uint8_t *bp, size_t n, systime_t time) { + (void)ip; + (void)bp; + (void)n; + (void)time; + return 0; +} + +static chnflags_t getflags(void *ip) { + _chn_get_and_clear_flags_impl(ip); +} + +static const struct GLCDConsoleVMT vmt = { + writes, reads, put, get, + putt, gett, writet, readt, + getflags +}; + + diff --git a/console.h b/console.h new file mode 100644 index 00000000..6f017d88 --- /dev/null +++ b/console.h @@ -0,0 +1,63 @@ +#ifndef CONSOLE_H +#define CONSOLE_H + +/** + * @brief Structure representing a GLCD driver. + */ +typedef struct GLCDConsole GLCDConsole; + +/** + * @brief @p GLCDConsole specific methods. + */ +#define _glcd_driver_methods \ + _base_asynchronous_channel_methods + +/** + * @extends BaseAsynchronousChannelVMT + * + * @brief @p GLCDConsole virtual methods table. + */ +struct GLCDConsoleVMT { + _glcd_driver_methods +}; + +/** + * @extends BaseAsynchronousChannel + * + * @brief GLCD Console class. + * @details This class extends @p BaseAsynchronousChannel by adding physical + * I/O queues. + */ +struct GLCDConsole { + /** @brief Virtual Methods Table.*/ + const struct GLCDConsoleVMT *vmt; + _base_asynchronous_channel_data + /* WARNING: Do not add any data to this struct above this comment, only below */ + /* text buffer */ + uint8_t *buf; + /* lcd area to use */ + uint16_t x0,y0,x1,y1; + /* current cursor position, in character coordinates (not pixels) */ + uint16_t cx,cy; + /* console size in characters */ + uint16_t sx,sy; + /* foreground and background colour */ + uint16_t bkcolor, color; + /* font size in pixels */ + uint8_t fx,fy; + /* buffer index */ + uint16_t bidx; +}; + +#ifdef __cplusplus +extern "C" { +#endif + +msg_t lcdConsoleInit(GLCDConsole *console, uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, + const uint8_t *font, uint8_t *buffer, uint16_t bkcolor, uint16_t color); + +#ifdef __cplusplus +} +#endif + +#endif /* CONSOLE_H */ diff --git a/lcd.mk b/lcd.mk index 1c54d5e9..5ba7df1b 100644 --- a/lcd.mk +++ b/lcd.mk @@ -7,6 +7,7 @@ LCDSRC = $(LCDLIB)/glcd.c \ $(LCDLIB)/touchpad.c \ $(LCDLIB)/graph.c \ $(LCDLIB)/gui.c \ + $(LCDLIB)/console.c \ $(LCD_DRIVERS_SRC) LCDINC = $(LCDLIB) \