123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696 |
- // Module for binding the u8g2 library
- #include "module.h"
- #include "lauxlib.h"
- #define U8X8_USE_PINS
- #include "u8g2.h"
- #include "u8x8_nodemcu_hal.h"
- #include "u8g2_displays.h"
- #include "u8g2_fonts.h"
- #include "spi_common.h"
- typedef struct {
- int font_ref;
- int host_ref;
- u8g2_nodemcu_t u8g2;
- } u8g2_ud_t;
- #define GET_U8G2() \
- u8g2_ud_t *ud = (u8g2_ud_t *)luaL_checkudata( L, 1, "u8g2.display" ); \
- u8g2_t *u8g2 = (u8g2_t *)(&(ud->u8g2));
- static int lu8g2_clearBuffer( lua_State *L )
- {
- GET_U8G2();
- u8g2_ClearBuffer( u8g2 );
- return 0;
- }
- static int lu8g2_drawBox( lua_State *L )
- {
- GET_U8G2();
- int stack = 1;
- int x = luaL_checkint( L, ++stack );
- int y = luaL_checkint( L, ++stack );
- int w = luaL_checkint( L, ++stack );
- int h = luaL_checkint( L, ++stack );
- u8g2_DrawBox( u8g2, x, y, w, h );
- return 0;
- }
- static int lu8g2_drawCircle( lua_State *L )
- {
- GET_U8G2();
- int stack = 1;
- int x0 = luaL_checkint( L, ++stack );
- int y0 = luaL_checkint( L, ++stack );
- int rad = luaL_checkint( L, ++stack );
- int opt = luaL_optint( L, ++stack, U8G2_DRAW_ALL );
- u8g2_DrawCircle( u8g2, x0, y0, rad, opt );
- return 0;
- }
- static int lu8g2_drawDisc( lua_State *L )
- {
- GET_U8G2();
- int stack = 1;
- int x0 = luaL_checkint( L, ++stack );
- int y0 = luaL_checkint( L, ++stack );
- int rad = luaL_checkint( L, ++stack );
- int opt = luaL_optint( L, ++stack, U8G2_DRAW_ALL );
- u8g2_DrawDisc( u8g2, x0, y0, rad, opt );
- return 0;
- }
- static int lu8g2_drawEllipse( lua_State *L )
- {
- GET_U8G2();
- int stack = 1;
- int x0 = luaL_checkint( L, ++stack );
- int y0 = luaL_checkint( L, ++stack );
- int rx = luaL_checkint( L, ++stack );
- int ry = luaL_checkint( L, ++stack );
- int opt = luaL_optint( L, ++stack, U8G2_DRAW_ALL );
- u8g2_DrawEllipse( u8g2, x0, y0, rx, ry, opt );
- return 0;
- }
- static int lu8g2_drawFilledEllipse( lua_State *L )
- {
- GET_U8G2();
- int stack = 1;
- int x0 = luaL_checkint( L, ++stack );
- int y0 = luaL_checkint( L, ++stack );
- int rx = luaL_checkint( L, ++stack );
- int ry = luaL_checkint( L, ++stack );
- int opt = luaL_optint( L, ++stack, U8G2_DRAW_ALL );
- u8g2_DrawFilledEllipse( u8g2, x0, y0, rx, ry, opt );
- return 0;
- }
- static int lu8g2_drawFrame( lua_State *L )
- {
- GET_U8G2();
- int stack = 1;
- int x = luaL_checkint( L, ++stack );
- int y = luaL_checkint( L, ++stack );
- int w = luaL_checkint( L, ++stack );
- int h = luaL_checkint( L, ++stack );
- u8g2_DrawFrame( u8g2, x, y, w, h );
- return 0;
- }
- static int lu8g2_drawGlyph( lua_State *L )
- {
- GET_U8G2();
- int stack = 1;
- int x = luaL_checkint( L, ++stack );
- int y = luaL_checkint( L, ++stack );
- int enc = luaL_checkint( L, ++stack );
- u8g2_DrawGlyph( u8g2, x, y, enc );
- return 0;
- }
- static int lu8g2_drawHLine( lua_State *L )
- {
- GET_U8G2();
- int stack = 1;
- int x = luaL_checkint( L, ++stack );
- int y = luaL_checkint( L, ++stack );
- int w = luaL_checkint( L, ++stack );
- u8g2_DrawHLine( u8g2, x, y, w );
- return 0;
- }
- static int lu8g2_drawLine( lua_State *L )
- {
- GET_U8G2();
- int stack = 1;
- int x0 = luaL_checkint( L, ++stack );
- int y0 = luaL_checkint( L, ++stack );
- int x1 = luaL_checkint( L, ++stack );
- int y1 = luaL_checkint( L, ++stack );
- u8g2_DrawLine( u8g2, x0, y0, x1, y1 );
- return 0;
- }
- static int lu8g2_drawPixel( lua_State *L )
- {
- GET_U8G2();
- int stack = 1;
- int x = luaL_checkint( L, ++stack );
- int y = luaL_checkint( L, ++stack );
- u8g2_DrawPixel( u8g2, x, y );
- return 0;
- }
- static int lu8g2_drawRBox( lua_State *L )
- {
- GET_U8G2();
- int stack = 1;
- int x = luaL_checkint( L, ++stack );
- int y = luaL_checkint( L, ++stack );
- int w = luaL_checkint( L, ++stack );
- int h = luaL_checkint( L, ++stack );
- int r = luaL_checkint( L, ++stack );
- u8g2_DrawRBox( u8g2, x, y, w, h, r );
- return 0;
- }
- static int lu8g2_drawRFrame( lua_State *L )
- {
- GET_U8G2();
- int stack = 1;
- int x = luaL_checkint( L, ++stack );
- int y = luaL_checkint( L, ++stack );
- int w = luaL_checkint( L, ++stack );
- int h = luaL_checkint( L, ++stack );
- int r = luaL_checkint( L, ++stack );
- u8g2_DrawRFrame( u8g2, x, y, w, h, r );
- return 0;
- }
- static int lu8g2_drawStr( lua_State *L )
- {
- GET_U8G2();
- int stack = 1;
- int x = luaL_checkint( L, ++stack );
- int y = luaL_checkint( L, ++stack );
- const char *str = luaL_checkstring( L, ++stack );
- u8g2_DrawStr( u8g2, x, y, str );
- return 0;
- }
- static int lu8g2_drawTriangle( lua_State *L )
- {
- GET_U8G2();
- int stack = 1;
- int x0 = luaL_checkint( L, ++stack );
- int y0 = luaL_checkint( L, ++stack );
- int x1 = luaL_checkint( L, ++stack );
- int y1 = luaL_checkint( L, ++stack );
- int x2 = luaL_checkint( L, ++stack );
- int y2 = luaL_checkint( L, ++stack );
- u8g2_DrawTriangle( u8g2, x0, y0, x1, y1, x2, y2 );
- return 0;
- }
- static int lu8g2_drawUTF8( lua_State *L )
- {
- GET_U8G2();
- int stack = 1;
- int x = luaL_checkint( L, ++stack );
- int y = luaL_checkint( L, ++stack );
- const char *str = luaL_checkstring( L, ++stack );
- u8g2_DrawUTF8( u8g2, x, y, str );
- return 0;
- }
- static int lu8g2_drawVLine( lua_State *L )
- {
- GET_U8G2();
- int stack = 1;
- int x = luaL_checkint( L, ++stack );
- int y = luaL_checkint( L, ++stack );
- int h = luaL_checkint( L, ++stack );
- u8g2_DrawVLine( u8g2, x, y, h );
- return 0;
- }
- static int lu8g2_drawXBM( lua_State *L )
- {
- GET_U8G2();
- int stack = 1;
- int x = luaL_checkint( L, ++stack );
- int y = luaL_checkint( L, ++stack );
- int w = luaL_checkint( L, ++stack );
- int h = luaL_checkint( L, ++stack );
- size_t len;
- const char *bitmap = luaL_checklstring( L, ++stack, &len );
- u8g2_DrawXBM( u8g2, x, y, w, h, (uint8_t *)bitmap );
- return 0;
- }
- static int lu8g2_getAscent( lua_State *L )
- {
- GET_U8G2();
- lua_pushinteger( L, u8g2_GetAscent( u8g2 ) );
- return 1;
- }
- static int lu8g2_getDescent( lua_State *L )
- {
- GET_U8G2();
- lua_pushinteger( L, u8g2_GetDescent( u8g2 ) );
- return 1;
- }
- static int lu8g2_getStrWidth( lua_State *L )
- {
- GET_U8G2();
- int stack = 1;
- const char *s = luaL_checkstring( L, ++stack );
- lua_pushinteger( L, u8g2_GetStrWidth( u8g2, s ) );
- return 1;
- }
- static int lu8g2_getUTF8Width( lua_State *L )
- {
- GET_U8G2();
- int stack = 1;
- const char *s = luaL_checkstring( L, ++stack );
- lua_pushinteger( L, u8g2_GetUTF8Width( u8g2, s ) );
- return 1;
- }
- static int lu8g2_sendBuffer( lua_State *L )
- {
- GET_U8G2();
- u8g2_SendBuffer( u8g2 );
- return 0;
- }
- static int lu8g2_setBitmapMode( lua_State *L )
- {
- GET_U8G2();
- int stack = 1;
- int is_transparent = luaL_checkint( L, ++stack );
- u8g2_SetBitmapMode( u8g2, is_transparent );
- return 0;
- }
- static int lu8g2_setContrast( lua_State *L )
- {
- GET_U8G2();
- int stack = 1;
- int value = luaL_checkint( L, ++stack );
- u8g2_SetContrast( u8g2, value );
- return 0;
- }
- static int lu8g2_setDisplayRotation( lua_State *L )
- {
- GET_U8G2();
- int stack = 1;
- const u8g2_cb_t *u8g2_cb = (u8g2_cb_t *)lua_touserdata( L, ++stack );
- u8g2_SetDisplayRotation( u8g2, u8g2_cb );
- return 0;
- }
- static int lu8g2_setDrawColor( lua_State *L )
- {
- GET_U8G2();
- int stack = 1;
- int col = luaL_checkint( L, ++stack );
- u8g2_SetDrawColor( u8g2, col );
- return 0;
- }
- static int lu8g2_setFlipMode( lua_State *L )
- {
- GET_U8G2();
- int stack = 1;
- int is_enable = luaL_checkint( L, ++stack );
- u8g2_SetFlipMode( u8g2, is_enable );
- return 0;
- }
- static int lu8g2_setFont( lua_State *L )
- {
- GET_U8G2();
- int stack = 1;
- const uint8_t *font = NULL;
- luaL_unref( L, LUA_REGISTRYINDEX, ud->font_ref );
- ud->font_ref = LUA_NOREF;
- if (lua_islightuserdata( L, ++stack )) {
- font = (const uint8_t *)lua_touserdata( L, stack );
- } else if (lua_isstring( L, stack )) {
- // ref the font string to safe it in case the string variable gets gc'ed
- lua_pushvalue( L, stack );
- ud->font_ref = luaL_ref( L, LUA_REGISTRYINDEX );
- size_t len;
- font = (const uint8_t *)luaL_checklstring( L, stack, &len );
- }
- luaL_argcheck( L, font != NULL, stack, "invalid font" );
- u8g2_SetFont( u8g2, font );
- return 0;
- }
- static int lu8g2_setFontDirection( lua_State *L )
- {
- GET_U8G2();
- int stack = 1;
- int dir = luaL_checkint( L, ++stack );
- u8g2_SetFontDirection( u8g2, dir );
- return 0;
- }
- static int lu8g2_setFontMode( lua_State *L )
- {
- GET_U8G2();
- int stack = 1;
- int is_transparent = luaL_checkint( L, ++stack );
- u8g2_SetFontMode( u8g2, is_transparent );
- return 0;
- }
- static int lu8g2_setFontPosBaseline( lua_State *L )
- {
- GET_U8G2();
- u8g2_SetFontPosBaseline( u8g2 );
- return 0;
- }
- static int lu8g2_setFontPosBottom( lua_State *L )
- {
- GET_U8G2();
- u8g2_SetFontPosBottom( u8g2 );
- return 0;
- }
- static int lu8g2_setFontPosTop( lua_State *L )
- {
- GET_U8G2();
- u8g2_SetFontPosTop( u8g2 );
- return 0;
- }
- static int lu8g2_setFontPosCenter( lua_State *L )
- {
- GET_U8G2();
- u8g2_SetFontPosCenter( u8g2 );
- return 0;
- }
- static int lu8g2_setFontRefHeightAll( lua_State *L )
- {
- GET_U8G2();
- u8g2_SetFontRefHeightAll( u8g2 );
- return 0;
- }
- static int lu8g2_setFontRefHeightExtendedText( lua_State *L )
- {
- GET_U8G2();
- u8g2_SetFontRefHeightExtendedText( u8g2 );
- return 0;
- }
- static int lu8g2_setFontRefHeightText( lua_State *L )
- {
- GET_U8G2();
- u8g2_SetFontRefHeightText( u8g2 );
- return 0;
- }
- static int lu8g2_setPowerSave( lua_State *L )
- {
- GET_U8G2();
- int stack = 1;
- int is_enable = luaL_checkint( L, ++stack );
- u8g2_SetPowerSave( u8g2, is_enable );
- return 0;
- }
- static const LUA_REG_TYPE lu8g2_display_map[] = {
- { LSTRKEY( "clearBuffer" ), LFUNCVAL( lu8g2_clearBuffer ) },
- { LSTRKEY( "drawBox" ), LFUNCVAL( lu8g2_drawBox ) },
- { LSTRKEY( "drawCircle" ), LFUNCVAL( lu8g2_drawCircle ) },
- { LSTRKEY( "drawDisc" ), LFUNCVAL( lu8g2_drawDisc ) },
- { LSTRKEY( "drawEllipse" ), LFUNCVAL( lu8g2_drawEllipse ) },
- { LSTRKEY( "drawFilledEllipse" ), LFUNCVAL( lu8g2_drawFilledEllipse ) },
- { LSTRKEY( "drawFrame" ), LFUNCVAL( lu8g2_drawFrame ) },
- { LSTRKEY( "drawGlyph" ), LFUNCVAL( lu8g2_drawGlyph ) },
- { LSTRKEY( "drawHLine" ), LFUNCVAL( lu8g2_drawHLine ) },
- { LSTRKEY( "drawLine" ), LFUNCVAL( lu8g2_drawLine ) },
- { LSTRKEY( "drawPixel" ), LFUNCVAL( lu8g2_drawPixel ) },
- { LSTRKEY( "drawRBox" ), LFUNCVAL( lu8g2_drawRBox ) },
- { LSTRKEY( "drawRFrame" ), LFUNCVAL( lu8g2_drawRFrame ) },
- { LSTRKEY( "drawStr" ), LFUNCVAL( lu8g2_drawStr ) },
- { LSTRKEY( "drawTriangle" ), LFUNCVAL( lu8g2_drawTriangle ) },
- { LSTRKEY( "drawUTF8" ), LFUNCVAL( lu8g2_drawUTF8 ) },
- { LSTRKEY( "drawVLine" ), LFUNCVAL( lu8g2_drawVLine ) },
- { LSTRKEY( "drawXBM" ), LFUNCVAL( lu8g2_drawXBM ) },
- { LSTRKEY( "getAscent" ), LFUNCVAL( lu8g2_getAscent ) },
- { LSTRKEY( "getDescent" ), LFUNCVAL( lu8g2_getDescent ) },
- { LSTRKEY( "getStrWidth" ), LFUNCVAL( lu8g2_getStrWidth ) },
- { LSTRKEY( "getUTF8Width" ), LFUNCVAL( lu8g2_getUTF8Width ) },
- { LSTRKEY( "sendBuffer" ), LFUNCVAL( lu8g2_sendBuffer ) },
- { LSTRKEY( "setBitmapMode" ), LFUNCVAL( lu8g2_setBitmapMode ) },
- { LSTRKEY( "setContrast" ), LFUNCVAL( lu8g2_setContrast ) },
- { LSTRKEY( "setDisplayRotation" ), LFUNCVAL( lu8g2_setDisplayRotation ) },
- { LSTRKEY( "setDrawColor" ), LFUNCVAL( lu8g2_setDrawColor ) },
- { LSTRKEY( "setFlipMode" ), LFUNCVAL( lu8g2_setFlipMode ) },
- { LSTRKEY( "setFont" ), LFUNCVAL( lu8g2_setFont ) },
- { LSTRKEY( "setFontDirection" ), LFUNCVAL( lu8g2_setFontDirection ) },
- { LSTRKEY( "setFontMode" ), LFUNCVAL( lu8g2_setFontMode ) },
- { LSTRKEY( "setFontPosBaseline" ), LFUNCVAL( lu8g2_setFontPosBaseline ) },
- { LSTRKEY( "setFontPosBottom" ), LFUNCVAL( lu8g2_setFontPosBottom ) },
- { LSTRKEY( "setFontPosTop" ), LFUNCVAL( lu8g2_setFontPosTop ) },
- { LSTRKEY( "setFontPosCenter" ), LFUNCVAL( lu8g2_setFontPosCenter ) },
- { LSTRKEY( "setFontRefHeightAll" ), LFUNCVAL( lu8g2_setFontRefHeightAll ) },
- { LSTRKEY( "setFontRefHeightExtendedText" ), LFUNCVAL( lu8g2_setFontRefHeightExtendedText ) },
- { LSTRKEY( "setFontRefHeightText" ), LFUNCVAL( lu8g2_setFontRefHeightText ) },
- { LSTRKEY( "setPowerSave" ), LFUNCVAL( lu8g2_setPowerSave ) },
- //{ LSTRKEY( "__gc" ), LFUNCVAL( lu8g2_display_free ) },
- { LSTRKEY( "__index" ), LROVAL( lu8g2_display_map ) },
- {LNILKEY, LNILVAL}
- };
- // ***************************************************************************
- // Device constructors
- //
- //
- // I2C based devices will use this function template to implement the Lua binding.
- #undef U8G2_DISPLAY_TABLE_ENTRY
- #define U8G2_DISPLAY_TABLE_ENTRY(function, binding) \
- static int l ## binding( lua_State *L ) \
- { \
- int stack = 0; \
- \
- int id = luaL_checkint( L, ++stack ); \
- \
- int i2c_addr = luaL_checkint( L, ++stack ); \
- luaL_argcheck( L, i2c_addr >= 0 && i2c_addr <= 0x7f, stack, "invalid i2c address" ); \
- \
- u8g2_ud_t *ud = (u8g2_ud_t *)lua_newuserdata( L, sizeof( u8g2_ud_t ) ); \
- u8g2_nodemcu_t *u8g2 = &(ud->u8g2); \
- ud->font_ref = LUA_NOREF; \
- ud->host_ref = LUA_NOREF; \
- /* the i2c driver id is forwarded in the hal member */ \
- u8g2->hal = (void *)id; \
- \
- function( (u8g2_t *)u8g2, U8G2_R0, u8x8_byte_nodemcu_i2c, u8x8_gpio_and_delay_nodemcu ); \
- u8x8_SetI2CAddress( (u8x8_t *)u8g2, i2c_addr ); \
- \
- u8g2_InitDisplay( (u8g2_t *)u8g2 ); \
- u8g2_ClearDisplay( (u8g2_t *)u8g2 ); \
- u8g2_SetPowerSave( (u8g2_t *)u8g2, 0 ); \
- \
- /* set its metatable */ \
- luaL_getmetatable(L, "u8g2.display"); \
- lua_setmetatable(L, -2); \
- \
- return 1; \
- }
- //
- // Unroll the display table and insert binding functions for I2C based displays.
- U8G2_DISPLAY_TABLE_I2C
- //
- //
- //
- // SPI based devices will use this function template to implement the Lua binding.
- #undef U8G2_DISPLAY_TABLE_ENTRY
- #define U8G2_DISPLAY_TABLE_ENTRY(function, binding) \
- static int l ## binding( lua_State *L ) \
- { \
- int stack = 0; \
- \
- lspi_host_t *host = (lspi_host_t *)luaL_checkudata( L, ++stack, "spi.master" ); \
- /* reference host object to avoid automatic gc */ \
- lua_pushvalue( L, stack ); \
- int host_ref = luaL_ref( L, LUA_REGISTRYINDEX ); \
- \
- int cs = luaL_checkint( L, ++stack ); \
- int dc = luaL_checkint( L, ++stack ); \
- int res = luaL_optint( L, ++stack, -1 ); \
- \
- u8g2_ud_t *ud = (u8g2_ud_t *)lua_newuserdata( L, sizeof( u8g2_ud_t ) ); \
- u8g2_nodemcu_t *u8g2 = &(ud->u8g2); \
- ud->font_ref = LUA_NOREF; \
- ud->host_ref = host_ref; \
- /* the spi host id is forwarded in the hal member */ \
- u8g2->hal = (void *)(host->host); \
- \
- function( (u8g2_t *)u8g2, U8G2_R0, u8x8_byte_nodemcu_spi, u8x8_gpio_and_delay_nodemcu ); \
- u8x8_SetPin( (u8x8_t *)u8g2, U8X8_PIN_CS, cs ); \
- u8x8_SetPin( (u8x8_t *)u8g2, U8X8_PIN_DC, dc ); \
- if (res >= 0) \
- u8x8_SetPin( (u8x8_t *)u8g2, U8X8_PIN_RESET, res ); \
- \
- u8g2_InitDisplay( (u8g2_t *)u8g2 ); \
- u8g2_ClearDisplay( (u8g2_t *)u8g2 ); \
- u8g2_SetPowerSave( (u8g2_t *)u8g2, 0 ); \
- \
- /* set its metatable */ \
- luaL_getmetatable(L, "u8g2.display"); \
- lua_setmetatable(L, -2); \
- \
- return 1; \
- }
- //
- // Unroll the display table and insert binding functions for SPI based displays.
- U8G2_DISPLAY_TABLE_SPI
- //
- //
- //
- #undef U8G2_FONT_TABLE_ENTRY
- #undef U8G2_DISPLAY_TABLE_ENTRY
- #define U8G2_DISPLAY_TABLE_ENTRY(function, binding) \
- { LSTRKEY( #binding ), LFUNCVAL( l ## binding ) },
- static const LUA_REG_TYPE lu8g2_map[] = {
- U8G2_DISPLAY_TABLE_I2C
- U8G2_DISPLAY_TABLE_SPI
- //
- // Register fonts
- #define U8G2_FONT_TABLE_ENTRY(font) \
- { LSTRKEY( #font ), LUDATA( (void *)(u8g2_ ## font) ) },
- U8G2_FONT_TABLE
- //
- { LSTRKEY( "DRAW_UPPER_RIGHT" ), LNUMVAL( U8G2_DRAW_UPPER_RIGHT ) },
- { LSTRKEY( "DRAW_UPPER_LEFT" ), LNUMVAL( U8G2_DRAW_UPPER_LEFT ) },
- { LSTRKEY( "DRAW_LOWER_RIGHT" ), LNUMVAL( U8G2_DRAW_LOWER_RIGHT ) },
- { LSTRKEY( "DRAW_LOWER_LEFT" ), LNUMVAL( U8G2_DRAW_LOWER_LEFT ) },
- { LSTRKEY( "DRAW_ALL" ), LNUMVAL( U8G2_DRAW_ALL ) },
- { LSTRKEY( "R0" ), LUDATA( (void *)U8G2_R0 ) },
- { LSTRKEY( "R1" ), LUDATA( (void *)U8G2_R1 ) },
- { LSTRKEY( "R2" ), LUDATA( (void *)U8G2_R2 ) },
- { LSTRKEY( "R3" ), LUDATA( (void *)U8G2_R3 ) },
- { LSTRKEY( "MIRROR" ), LUDATA( (void *)U8G2_MIRROR ) },
- {LNILKEY, LNILVAL}
- };
- int luaopen_u8g2( lua_State *L ) {
- luaL_rometatable(L, "u8g2.display", (void *)lu8g2_display_map);
- return 0;
- }
- NODEMCU_MODULE(U8G2, "u8g2", lu8g2_map, luaopen_u8g2);
|