From 0f1a1685258490ac48d8e4c18b9c9dd7a6378581 Mon Sep 17 00:00:00 2001 From: devsaurus Date: Wed, 5 Aug 2015 21:46:24 +0200 Subject: [PATCH] add ucg module --- app/modules/modules.h | 1 + app/modules/ucg.c | 196 ++++++++++++++++++++++++++++++++++++++++++ app/ucglib/ucg.h | 17 +++- 3 files changed, 212 insertions(+), 2 deletions(-) create mode 100644 app/modules/ucg.c diff --git a/app/modules/modules.h b/app/modules/modules.h index 1223b21b..85d123f1 100644 --- a/app/modules/modules.h +++ b/app/modules/modules.h @@ -244,6 +244,7 @@ ROM_MODULES_COAP \ ROM_MODULES_MQTT \ ROM_MODULES_U8G \ + ROM_MODULES_UCG \ ROM_MODULES_I2C \ ROM_MODULES_SPI \ ROM_MODULES_TMR \ diff --git a/app/modules/ucg.c b/app/modules/ucg.c new file mode 100644 index 00000000..3cd09c96 --- /dev/null +++ b/app/modules/ucg.c @@ -0,0 +1,196 @@ +// Module for Ucglib + +#include "lualib.h" +#include "lauxlib.h" +#include "platform.h" +#include "auxmods.h" +#include "lrotable.h" + +#include "c_stdlib.h" + +#include "ucg.h" + +//#include "u8g_config.h" + +typedef struct ucg_t lucg_userdata_t; + + +// helper function: retrieve and check userdata argument +static lucg_userdata_t *get_lud( lua_State *L ) +{ + lucg_userdata_t *lud = (lucg_userdata_t *)luaL_checkudata(L, 1, "ucg.display"); + luaL_argcheck(L, lud, 1, "ucg.display expected"); + return lud; +} + +// helper function: retrieve given number of integer arguments +static void lucg_get_int_args( lua_State *L, uint8_t stack, uint8_t num, ucg_int_t *args) +{ + while (num-- > 0) + { + *args++ = luaL_checkinteger( L, stack++ ); + } +} + + + +// device destructor +static int lucg_close_display( lua_State *L ) +{ + lucg_userdata_t *lud; + + if ((lud = get_lud( L )) == NULL) + return 0; + + return 0; +} + + + +// Module function map +#define MIN_OPT_LEVEL 2 +#include "lrodefs.h" + +static const LUA_REG_TYPE lucg_display_map[] = +{ +#if 0 + { LSTRKEY( "begin" ), LFUNCVAL( lu8g_begin ) }, + { LSTRKEY( "drawBitmap" ), LFUNCVAL( lu8g_drawBitmap ) }, + { LSTRKEY( "drawBox" ), LFUNCVAL( lu8g_drawBox ) }, + { LSTRKEY( "drawCircle" ), LFUNCVAL( lu8g_drawCircle ) }, + { LSTRKEY( "drawDisc" ), LFUNCVAL( lu8g_drawDisc ) }, + { LSTRKEY( "drawEllipse" ), LFUNCVAL( lu8g_drawEllipse ) }, + { LSTRKEY( "drawFilledEllipse" ), LFUNCVAL( lu8g_drawFilledEllipse ) }, + { LSTRKEY( "drawFrame" ), LFUNCVAL( lu8g_drawFrame ) }, + { LSTRKEY( "drawHLine" ), LFUNCVAL( lu8g_drawHLine ) }, + { LSTRKEY( "drawLine" ), LFUNCVAL( lu8g_drawLine ) }, + { LSTRKEY( "drawPixel" ), LFUNCVAL( lu8g_drawPixel ) }, + { LSTRKEY( "drawRBox" ), LFUNCVAL( lu8g_drawRBox ) }, + { LSTRKEY( "drawRFrame" ), LFUNCVAL( lu8g_drawRFrame ) }, + { LSTRKEY( "drawStr" ), LFUNCVAL( lu8g_drawStr ) }, + { LSTRKEY( "drawStr90" ), LFUNCVAL( lu8g_drawStr90 ) }, + { LSTRKEY( "drawStr180" ), LFUNCVAL( lu8g_drawStr180 ) }, + { LSTRKEY( "drawStr270" ), LFUNCVAL( lu8g_drawStr270 ) }, + { LSTRKEY( "drawTriangle" ), LFUNCVAL( lu8g_drawTriangle ) }, + { LSTRKEY( "drawVLine" ), LFUNCVAL( lu8g_drawVLine ) }, + { LSTRKEY( "drawXBM" ), LFUNCVAL( lu8g_drawXBM ) }, + { LSTRKEY( "firstPage" ), LFUNCVAL( lu8g_firstPage ) }, + { LSTRKEY( "getColorIndex" ), LFUNCVAL( lu8g_getColorIndex ) }, + { LSTRKEY( "getFontAscent" ), LFUNCVAL( lu8g_getFontAscent ) }, + { LSTRKEY( "getFontDescent" ), LFUNCVAL( lu8g_getFontDescent ) }, + { LSTRKEY( "getFontLineSpacing" ), LFUNCVAL( lu8g_getFontLineSpacing ) }, + { LSTRKEY( "getHeight" ), LFUNCVAL( lu8g_getHeight ) }, + { LSTRKEY( "getMode" ), LFUNCVAL( lu8g_getMode ) }, + { LSTRKEY( "getStrWidth" ), LFUNCVAL( lu8g_getStrWidth ) }, + { LSTRKEY( "getWidth" ), LFUNCVAL( lu8g_getWidth ) }, + { LSTRKEY( "nextPage" ), LFUNCVAL( lu8g_nextPage ) }, + { LSTRKEY( "setColorIndex" ), LFUNCVAL( lu8g_setColorIndex ) }, + { LSTRKEY( "setDefaultBackgroundColor" ), LFUNCVAL( lu8g_setDefaultBackgroundColor ) }, + { LSTRKEY( "setDefaultForegroundColor" ), LFUNCVAL( lu8g_setDefaultForegroundColor ) }, + { LSTRKEY( "setFont" ), LFUNCVAL( lu8g_setFont ) }, + { LSTRKEY( "setFontLineSpacingFactor" ), LFUNCVAL( lu8g_setFontLineSpacingFactor ) }, + { LSTRKEY( "setFontPosBaseline" ), LFUNCVAL( lu8g_setFontPosBaseline ) }, + { LSTRKEY( "setFontPosBottom" ), LFUNCVAL( lu8g_setFontPosBottom ) }, + { LSTRKEY( "setFontPosCenter" ), LFUNCVAL( lu8g_setFontPosCenter ) }, + { LSTRKEY( "setFontPosTop" ), LFUNCVAL( lu8g_setFontPosTop ) }, + { LSTRKEY( "setFontRefHeightAll" ), LFUNCVAL( lu8g_setFontRefHeightAll ) }, + { LSTRKEY( "setFontRefHeightExtendedText" ), LFUNCVAL( lu8g_setFontRefHeightExtendedText ) }, + { LSTRKEY( "setFontRefHeightText" ), LFUNCVAL( lu8g_setFontRefHeightText ) }, + { LSTRKEY( "setRot90" ), LFUNCVAL( lu8g_setRot90 ) }, + { LSTRKEY( "setRot180" ), LFUNCVAL( lu8g_setRot180 ) }, + { LSTRKEY( "setRot270" ), LFUNCVAL( lu8g_setRot270 ) }, + { LSTRKEY( "setScale2x2" ), LFUNCVAL( lu8g_setScale2x2 ) }, + { LSTRKEY( "sleepOff" ), LFUNCVAL( lu8g_sleepOff ) }, + { LSTRKEY( "sleepOn" ), LFUNCVAL( lu8g_sleepOn ) }, + { LSTRKEY( "undoRotation" ), LFUNCVAL( lu8g_undoRotation ) }, + { LSTRKEY( "undoScale" ), LFUNCVAL( lu8g_undoScale ) }, +#endif + { LSTRKEY( "__gc" ), LFUNCVAL( lucg_close_display ) }, +#if LUA_OPTIMIZE_MEMORY > 0 + { LSTRKEY( "__index" ), LROVAL ( lucg_display_map ) }, +#endif + { LNILKEY, LNILVAL } +}; + +const LUA_REG_TYPE lucg_map[] = +{ +#if 0 +#undef U8G_DISPLAY_TABLE_ENTRY +#define U8G_DISPLAY_TABLE_ENTRY(device) { LSTRKEY( #device ), LFUNCVAL ( lu8g_ ##device ) }, + U8G_DISPLAY_TABLE_I2C + U8G_DISPLAY_TABLE_SPI +#endif + +#if LUA_OPTIMIZE_MEMORY > 0 + + // Register fonts +#if 0 +#undef U8G_FONT_TABLE_ENTRY +#define U8G_FONT_TABLE_ENTRY(font) { LSTRKEY( #font ), LUDATA( (void *)(u8g_ ## font) ) }, + U8G_FONT_TABLE +#endif + +#if 0 + // Options for circle/ ellipse drawing + { LSTRKEY( "DRAW_UPPER_RIGHT" ), LNUMVAL( U8G_DRAW_UPPER_RIGHT ) }, + { LSTRKEY( "DRAW_UPPER_LEFT" ), LNUMVAL( U8G_DRAW_UPPER_LEFT ) }, + { LSTRKEY( "DRAW_LOWER_RIGHT" ), LNUMVAL( U8G_DRAW_LOWER_RIGHT ) }, + { LSTRKEY( "DRAW_LOWER_LEFT" ), LNUMVAL( U8G_DRAW_LOWER_LEFT ) }, + { LSTRKEY( "DRAW_ALL" ), LNUMVAL( U8G_DRAW_ALL ) }, + + // Display modes + { LSTRKEY( "MODE_BW" ), LNUMVAL( U8G_MODE_BW ) }, + { LSTRKEY( "MODE_GRAY2BIT" ), LNUMVAL( U8G_MODE_GRAY2BIT ) }, +#endif + + { LSTRKEY( "__metatable" ), LROVAL( lucg_map ) }, +#endif + { LNILKEY, LNILVAL } +}; + +LUALIB_API int luaopen_ucg( lua_State *L ) +{ +#if LUA_OPTIMIZE_MEMORY > 0 + luaL_rometatable(L, "ucg.display", (void *)lucg_display_map); // create metatable + return 0; +#else // #if LUA_OPTIMIZE_MEMORY > 0 + int n; + luaL_register( L, AUXLIB_UCG, lucg_map ); + + // Set it as its own metatable + lua_pushvalue( L, -1 ); + lua_setmetatable( L, -2 ); + + // Module constants + + // Register fonts +#if 0 +#undef U8G_FONT_TABLE_ENTRY +#define U8G_FONT_TABLE_ENTRY(font) MOD_REG_LUDATA( L, #font, (void *)(u8g_ ## font) ); + U8G_FONT_TABLE +#endif + +#if 0 + // Options for circle/ ellipse drawing + MOD_REG_NUMBER( L, "DRAW_UPPER_RIGHT", U8G_DRAW_UPPER_RIGHT ); + MOD_REG_NUMBER( L, "DRAW_UPPER_LEFT", U8G_DRAW_UPPER_RIGHT ); + MOD_REG_NUMBER( L, "DRAW_LOWER_RIGHT", U8G_DRAW_UPPER_RIGHT ); + MOD_REG_NUMBER( L, "DRAW_LOWER_LEFT", U8G_DRAW_UPPER_RIGHT ); + + // Display modes + MOD_REG_NUMBER( L, "MODE_BW", U8G_MODE_BW ); + MOD_REG_NUMBER( L, "MODE_GRAY2BIT", U8G_MODE_BW ); +#endif + + // create metatable + luaL_newmetatable(L, "ucg.display"); + // metatable.__index = metatable + lua_pushliteral(L, "__index"); + lua_pushvalue(L,-2); + lua_rawset(L,-3); + // Setup the methods inside metatable + luaL_register( L, NULL, ucg_display_map ); + + return 1; +#endif // #if LUA_OPTIMIZE_MEMORY > 0 +} diff --git a/app/ucglib/ucg.h b/app/ucglib/ucg.h index 1d32d4c5..21ebb3d6 100644 --- a/app/ucglib/ucg.h +++ b/app/ucglib/ucg.h @@ -81,7 +81,11 @@ #ifndef _UCG_H #define _UCG_H -#include +#if defined(__XTENSA__) +# include +#else +# include +#endif #include @@ -90,7 +94,7 @@ extern "C" { #endif -#if defined(ARDUINO) +#if defined(ARDUINO) || defined(__XTENSA__) #ifndef USE_PIN_LIST #define USE_PIN_LIST #endif @@ -104,6 +108,8 @@ extern "C" # define UCG_FONT_SECTION(name) # elif defined(__AVR__) # define UCG_FONT_SECTION(name) UCG_SECTION(".progmem." name) +# elif defined(__XTENSA__) +# define UCG_FONT_SECTION(name) # else # define UCG_FONT_SECTION(name) # endif @@ -121,6 +127,13 @@ typedef uint8_t PROGMEM ucg_pgm_uint8_t; typedef uint8_t ucg_fntpgm_uint8_t; #define ucg_pgm_read(adr) pgm_read_byte_near(adr) #define UCG_PSTR(s) ((ucg_pgm_uint8_t *)PSTR(s)) +#elif defined(__XTENSA__) +#define UCG_PROGMEM +#define PROGMEM +typedef uint8_t ucg_pgm_uint8_t; +typedef uint8_t ucg_fntpgm_uint8_t; +#define ucg_pgm_read(adr) (*(const ucg_pgm_uint8_t *)(adr)) +#define UCG_PSTR(s) ((ucg_pgm_uint8_t *)(s)) #else #define UCG_PROGMEM #define PROGMEM