Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(lua): port of NodeMCU Lua53 read-only tables #2986

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion radio/src/lua/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,6 @@ set(LUA_SRC
lstate.c
lstring.c
ltable.c
lrotable.c
ltm.c
lundump.c
lvm.c
Expand Down
125 changes: 67 additions & 58 deletions radio/src/lua/api_colorlcd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,24 @@
* GNU General Public License for more details.
*/

#define LUA_LIB

#include <cctype>
#include <cstdio>

#include "opentx.h"
#include "libopenui.h"
#include "widget.h"

#include "lua_api.h"
#include "api_colorlcd.h"

#define BITMAP_METATABLE "BITMAP*"

constexpr coord_t INVERT_BOX_MARGIN = 2;
constexpr int8_t text_horizontal_offset[7] {-2,-1,-2,-2,-2,-2,-2};
constexpr int8_t text_vertical_offset[7] {0,0,0,0,0,-1,7};

BitmapBuffer* luaLcdBuffer = nullptr;
Widget* runningFS = nullptr;

Expand Down Expand Up @@ -499,8 +510,6 @@ static int luaLcdDrawSource(lua_State *L)
return 0;
}

#define LUA_BITMAPHANDLE "BITMAP*"

/*luadoc
@function Bitmap.open(name)

Expand Down Expand Up @@ -547,15 +556,15 @@ static int luaOpenBitmap(lua_State *L)
TRACE("luaOpenBitmap: %p (%u)", *b, size);
}

luaL_getmetatable(L, LUA_BITMAPHANDLE);
luaL_getmetatable(L, BITMAP_METATABLE);
lua_setmetatable(L, -2);

return 1;
}

static BitmapBuffer * checkBitmap(lua_State * L, int index)
{
BitmapBuffer ** b = (BitmapBuffer **)luaL_checkudata(L, index, LUA_BITMAPHANDLE);
BitmapBuffer ** b = (BitmapBuffer **)luaL_checkudata(L, index, BITMAP_METATABLE);
return *b;
}

Expand Down Expand Up @@ -633,7 +642,7 @@ static int luaBitmapResize(lua_State * L)
TRACE("luaResizeBitmap: %p (%u)", *n, size);
}

luaL_getmetatable(L, LUA_BITMAPHANDLE);
luaL_getmetatable(L, BITMAP_METATABLE);
lua_setmetatable(L, -2);

return 1;
Expand Down Expand Up @@ -683,23 +692,6 @@ static int luaDestroyBitmap(lua_State * L)
return 0;
}

const luaL_Reg bitmapFuncs[] = {
{ "open", luaOpenBitmap },
{ "getSize", luaGetBitmapSize },
{ "resize", luaBitmapResize },
{ "toMask", luaBitmapTo8bitMask },
{ "__gc", luaDestroyBitmap },
{ NULL, NULL }
};

void registerBitmapClass(lua_State * L)
{
luaL_newmetatable(L, LUA_BITMAPHANDLE);
luaL_setfuncs(L, bitmapFuncs, 0);
lua_pushvalue(L, -1);
lua_setfield(L, -2, "__index");
lua_setglobal(L, "Bitmap");
}

/*luadoc
@function lcd.drawBitmap(bitmap, x, y [, scale])
Expand Down Expand Up @@ -1427,39 +1419,56 @@ static int luaLcdExitFullScreen(lua_State *L)
return 0;
}

const luaL_Reg lcdLib[] = {
{ "refresh", luaLcdRefresh },
{ "clear", luaLcdClear },
{ "resetBacklightTimeout", luaLcdResetBacklightTimeout },
{ "drawPoint", luaLcdDrawPoint },
{ "drawLine", luaLcdDrawLine },
{ "drawRectangle", luaLcdDrawRectangle },
{ "drawFilledRectangle", luaLcdDrawFilledRectangle },
{ "invertRect", luaLcdInvertRect },
{ "drawText", luaLcdDrawText },
{ "drawTextLines", luaLcdDrawTextLines },
{ "sizeText", luaLcdSizeText },
{ "drawTimer", luaLcdDrawTimer },
{ "drawNumber", luaLcdDrawNumber },
{ "drawChannel", luaLcdDrawChannel },
{ "drawSwitch", luaLcdDrawSwitch },
{ "drawSource", luaLcdDrawSource },
{ "drawGauge", luaLcdDrawGauge },
{ "drawBitmap", luaLcdDrawBitmap },
{ "drawBitmapPattern", luaLcdDrawBitmapPattern },
{ "drawBitmapPatternPie", luaLcdDrawBitmapPatternPie },
{ "setColor", luaLcdSetColor },
{ "getColor", luaLcdGetColor },
{ "RGB", luaRGB },
{ "drawCircle", luaLcdDrawCircle },
{ "drawFilledCircle", luaLcdDrawFilledCircle },
{ "drawTriangle", luaLcdDrawTriangle },
{ "drawFilledTriangle", luaLcdDrawFilledTriangle },
{ "drawArc", luaLcdDrawArc },
{ "drawPie", luaLcdDrawPie },
{ "drawAnnulus", luaLcdDrawAnnulus },
{ "drawLineWithClipping", luaLcdDrawLineWithClipping },
{ "drawHudRectangle", luaLcdDrawHudRectangle },
{ "exitFullScreen", luaLcdExitFullScreen },
{ NULL, NULL } /* sentinel */
};
LROT_BEGIN(lcdlib, NULL, 0)
LROT_FUNCENTRY( refresh, luaLcdRefresh )
LROT_FUNCENTRY( clear, luaLcdClear )
LROT_FUNCENTRY( resetBacklightTimeout, luaLcdResetBacklightTimeout )
LROT_FUNCENTRY( drawPoint, luaLcdDrawPoint )
LROT_FUNCENTRY( drawLine, luaLcdDrawLine )
LROT_FUNCENTRY( drawRectangle, luaLcdDrawRectangle )
LROT_FUNCENTRY( drawFilledRectangle, luaLcdDrawFilledRectangle )
LROT_FUNCENTRY( invertRect, luaLcdInvertRect )
LROT_FUNCENTRY( drawText, luaLcdDrawText )
LROT_FUNCENTRY( drawTextLines, luaLcdDrawTextLines )
LROT_FUNCENTRY( sizeText, luaLcdSizeText )
LROT_FUNCENTRY( drawTimer, luaLcdDrawTimer )
LROT_FUNCENTRY( drawNumber, luaLcdDrawNumber )
LROT_FUNCENTRY( drawChannel, luaLcdDrawChannel )
LROT_FUNCENTRY( drawSwitch, luaLcdDrawSwitch )
LROT_FUNCENTRY( drawSource, luaLcdDrawSource )
LROT_FUNCENTRY( drawGauge, luaLcdDrawGauge )
LROT_FUNCENTRY( drawBitmap, luaLcdDrawBitmap )
LROT_FUNCENTRY( drawBitmapPattern, luaLcdDrawBitmapPattern )
LROT_FUNCENTRY( drawBitmapPatternPie, luaLcdDrawBitmapPatternPie )
LROT_FUNCENTRY( setColor, luaLcdSetColor )
LROT_FUNCENTRY( getColor, luaLcdGetColor )
LROT_FUNCENTRY( RGB, luaRGB )
LROT_FUNCENTRY( drawCircle, luaLcdDrawCircle )
LROT_FUNCENTRY( drawFilledCircle, luaLcdDrawFilledCircle )
LROT_FUNCENTRY( drawTriangle, luaLcdDrawTriangle )
LROT_FUNCENTRY( drawFilledTriangle, luaLcdDrawFilledTriangle )
LROT_FUNCENTRY( drawArc, luaLcdDrawArc )
LROT_FUNCENTRY( drawPie, luaLcdDrawPie )
LROT_FUNCENTRY( drawAnnulus, luaLcdDrawAnnulus )
LROT_FUNCENTRY( drawLineWithClipping, luaLcdDrawLineWithClipping )
LROT_FUNCENTRY( drawHudRectangle, luaLcdDrawHudRectangle )
LROT_FUNCENTRY( exitFullScreen, luaLcdExitFullScreen )
LROT_END(lcdlib, NULL, 0)

LROT_BEGIN(bitmap_mt, NULL, LROT_MASK_GC)
LROT_FUNCENTRY( __gc, luaDestroyBitmap )
LROT_FUNCENTRY( getSize, luaGetBitmapSize )
LROT_FUNCENTRY( resize, luaBitmapResize )
LROT_FUNCENTRY( toMask, luaBitmapTo8bitMask )
LROT_END(bitmap_mt, NULL, LROT_MASK_GC)

LROT_BEGIN(bitmaplib, NULL, 0)
LROT_FUNCENTRY( open, luaOpenBitmap )
LROT_END(bitmaplib, NULL, 0)

extern "C" {
LUALIB_API int luaopen_bitmap(lua_State * L) {
luaL_rometatable( L, BITMAP_METATABLE, LROT_TABLEREF(bitmap_mt));
return 0;
}
}
25 changes: 2 additions & 23 deletions radio/src/lua/api_colorlcd.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,27 +19,6 @@
* GNU General Public License for more details.
*/

//
// Obsoleted definitions:
// -> please check against libopenui_defines.h for conflicts
// -> here we use the 4 most significant bits for our flags (32 bit unsigned)
//
// INVERS & BLINK are used in most scripts, let's offer a compatibility mode.
//
#undef INVERS
#undef BLINK
#include "definitions.h"

#define INVERS 0x01u
#define BLINK 0x1000u
#define RGB_FLAG 0x8000u

constexpr coord_t INVERT_BOX_MARGIN = 2;

constexpr int8_t text_horizontal_offset[7] {-2,-1,-2,-2,-2,-2,-2};
constexpr int8_t text_vertical_offset[7] {0,0,0,0,0,-1,7};

extern bool luaLcdAllowed;
extern BitmapBuffer * luaLcdBuffer;
extern Widget * runningFS;

LcdFlags flagsRGB(LcdFlags flags);
EXTERN_C(LUALIB_API int luaopen_bitmap(lua_State * L));
34 changes: 20 additions & 14 deletions radio/src/lua/api_filesystem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,11 @@
* GNU General Public License for more details.
*/

#define LUA_LIB

#include <cstdio>
#include "lua_api.h"

#include "lua_api.h"
#include "api_filesystem.h"

// garbage collector for luaDir
Expand All @@ -33,18 +34,6 @@ static int dir_gc(lua_State* L)
return 0;
}

void registerDirIter(lua_State* L)
{
luaL_newmetatable(L, DIR_METATABLE);

/* set the garbage colector field */
lua_pushstring(L, "__gc");
lua_pushcfunction(L, dir_gc);
lua_settable(L, -3);

lua_pop(L, 1);
}

static int dir_iter(lua_State* L)
{
DIR* dir = (DIR*)lua_touserdata(L, lua_upvalueindex(1));
Expand Down Expand Up @@ -160,4 +149,21 @@ int luaFstat(lua_State* L)
lua_settable(L, -3);

return 1;
}
}


LROT_BEGIN(dir_handle, NULL, LROT_MASK_GC)
LROT_FUNCENTRY( __gc, dir_gc )
LROT_END(dir_handle, NULL, LROT_MASK_GC)

LROT_BEGIN(etxdir, NULL, 0)
LROT_FUNCENTRY( dir, luaDir )
LROT_FUNCENTRY( fstat, luaFstat )
LROT_END(etxdir, NULL, 0)

extern "C" {
LUAMOD_API int luaopen_etxdir(lua_State* L) {
luaL_rometatable( L, DIR_METATABLE, LROT_TABLEREF(dir_handle));
return 0;
}
}
8 changes: 4 additions & 4 deletions radio/src/lua/api_filesystem.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@
* GNU General Public License for more details.
*/

#define DIR_METATABLE "directory metatable"
#include "definitions.h"

void registerDirIter(lua_State* L);
int luaDir(lua_State* L);
int luaFstat(lua_State* L);
#define DIR_METATABLE "DIR*"

EXTERN_C(LUALIB_API int luaopen_etxdir(lua_State* L));
Loading