391 lines
13 KiB
C++
391 lines
13 KiB
C++
#include "luamatrix.h"
|
|
#include "matrix.h"
|
|
#include "lua.hpp"
|
|
#include "log.h"
|
|
|
|
// CREATE ARRAY TYPE AND EXPOSE matrixpanel TO LUA.
|
|
// metatable method for handling "array[index]"
|
|
/* static int matrixpanel_index (lua_State* L) {
|
|
CRGB** parray = (CRGB **) luaL_checkudata(L, 1, "matrixpanel");
|
|
int index = luaL_checkint(L, 2);
|
|
lua_pushnumber(L, (*parray)[index-1]);
|
|
return 1;
|
|
}
|
|
|
|
// metatable method for handle "array[index] = value"
|
|
static int matrixpanel_newindex (lua_State* L) {
|
|
CRGB** parray = (CRGB **) luaL_checkudata(L, 1, "matrixpanel");
|
|
int index = luaL_checkint(L, 2);
|
|
int value = luaL_checkint(L, 3);
|
|
(*parray)[index-1] = value;
|
|
return 0;
|
|
} */
|
|
|
|
int8_t matrixpanel_userdata = 0; // used just to have some userdata
|
|
|
|
static int matrixpanel_swapbuffer(lua_State *L) {
|
|
matrixpanel.swapBuffers(true);
|
|
return 0;
|
|
}
|
|
|
|
void pushPanel (lua_State *L)
|
|
{
|
|
int8_t *pi = (int8_t *)lua_newuserdata(L, sizeof(int8_t));
|
|
*pi = matrixpanel_userdata;
|
|
luaL_getmetatable(L, "matrixpanel");
|
|
lua_setmetatable(L, -2);
|
|
}
|
|
|
|
static int matrixpanel_new (lua_State *L) {
|
|
pushPanel(L);
|
|
return 1;
|
|
}
|
|
|
|
static int matrixpanel_gc (lua_State *L) {
|
|
output_log("dropped matrixpanel\n");
|
|
return 0;
|
|
}
|
|
|
|
static int matrixpanel_tostring (lua_State *L) {
|
|
lua_pushfstring(L, "matrixpanel string");
|
|
return 1;
|
|
}
|
|
|
|
static int matrixpanel_fillscreen (lua_State *L) {
|
|
int c = luaL_checkint(L, 1);
|
|
matrixpanel.fillScreen(c);
|
|
return 0;
|
|
}
|
|
|
|
static int matrixpanel_drawpixel (lua_State *L) {
|
|
return 0;
|
|
}
|
|
|
|
static int matrixpanel_colorHSV (lua_State *L) {
|
|
float h = luaL_checkint(L, 1);
|
|
float s = luaL_checkint(L, 2);
|
|
float v = luaL_checkint(L, 3);
|
|
bool gflag = lua_isboolean(L, 4) ? lua_toboolean(L, 4) : false;
|
|
lua_pushnumber(L, matrixpanel.ColorHSV(h, s, v, gflag));
|
|
return 1;
|
|
}
|
|
|
|
static int matrixpanel_color888 (lua_State *L) {
|
|
int r = luaL_checkint(L, 1);
|
|
int g = luaL_checkint(L, 2);
|
|
int b = luaL_checkint(L, 3);
|
|
lua_pushnumber(L, matrixpanel.Color888(r, g, b));
|
|
return 1;
|
|
}
|
|
|
|
static int matrixpanel_color444 (lua_State *L) {
|
|
int r = luaL_checkint(L, 1);
|
|
int g = luaL_checkint(L, 2);
|
|
int b = luaL_checkint(L, 3);
|
|
lua_pushnumber(L, matrixpanel.Color444(r, g, b));
|
|
return 1;
|
|
}
|
|
|
|
static int matrixpanel_color333 (lua_State *L) {
|
|
int r = luaL_checkint(L, 1);
|
|
int g = luaL_checkint(L, 2);
|
|
int b = luaL_checkint(L, 3);
|
|
lua_pushnumber(L, matrixpanel.Color333(r, g, b));
|
|
return 1;
|
|
}
|
|
|
|
// drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color),
|
|
static int matrixpanel_drawline (lua_State *L) {
|
|
int x0 = luaL_checkint(L, 1);
|
|
int y0 = luaL_checkint(L, 2);
|
|
int x1 = luaL_checkint(L, 3);
|
|
int y1 = luaL_checkint(L, 4);
|
|
int c = luaL_checkint(L, 5);
|
|
matrixpanel.drawLine(x0, y0, x1, y1, c);
|
|
return 0;
|
|
}
|
|
// drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color),
|
|
static int matrixpanel_drawfastvline (lua_State *L) {
|
|
int x = luaL_checkint(L, 1);
|
|
int y = luaL_checkint(L, 2);
|
|
int h = luaL_checkint(L, 3);
|
|
int c = luaL_checkint(L, 4);
|
|
matrixpanel.drawFastVLine(x, y, h, c);
|
|
return 0;
|
|
}
|
|
// drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color),
|
|
static int matrixpanel_drawfasthline (lua_State *L) {
|
|
int x = luaL_checkint(L, 1);
|
|
int y = luaL_checkint(L, 2);
|
|
int w = luaL_checkint(L, 3);
|
|
int c = luaL_checkint(L, 4);
|
|
matrixpanel.drawFastHLine(x, y, w, c);
|
|
return 0;
|
|
}
|
|
|
|
// drawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color),
|
|
static int matrixpanel_drawrect (lua_State *L) {
|
|
int x = luaL_checkint(L, 1);
|
|
int y = luaL_checkint(L, 2);
|
|
int w = luaL_checkint(L, 3);
|
|
int h = luaL_checkint(L, 4);
|
|
int c = luaL_checkint(L, 5);
|
|
matrixpanel.drawRect(x, y, w, h, c);
|
|
return 0;
|
|
}
|
|
// fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color),
|
|
static int matrixpanel_fillrect (lua_State *L) {
|
|
int x = luaL_checkint(L, 1);
|
|
int y = luaL_checkint(L, 2);
|
|
int w = luaL_checkint(L, 3);
|
|
int h = luaL_checkint(L, 4);
|
|
int c = luaL_checkint(L, 5);
|
|
matrixpanel.fillRect(x, y, w, h, c);
|
|
return 0;
|
|
}
|
|
|
|
// invertDisplay(boolean i);
|
|
static int matrixpanel_invertdisplay (lua_State *L) {
|
|
bool flag = lua_isboolean(L, 1) ? lua_toboolean(L, 1) : false;
|
|
matrixpanel.invertDisplay(flag);
|
|
return 0;
|
|
}
|
|
|
|
// drawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color),
|
|
static int matrixpanel_drawcircle (lua_State *L) {
|
|
int x = luaL_checkint(L, 1);
|
|
int y = luaL_checkint(L, 2);
|
|
int r = luaL_checkint(L, 3);
|
|
int c = luaL_checkint(L, 4);
|
|
matrixpanel.drawCircle(x, y, r, c);
|
|
return 0;
|
|
}
|
|
// drawCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername, uint16_t color),
|
|
static int matrixpanel_drawcirclehelper (lua_State *L) {
|
|
int x = luaL_checkint(L, 1);
|
|
int y = luaL_checkint(L, 2);
|
|
int r = luaL_checkint(L, 3);
|
|
int corner= luaL_checkint(L, 4);
|
|
int c = luaL_checkint(L, 5);
|
|
matrixpanel.drawCircleHelper(x, y, r, corner, c);
|
|
return 0;
|
|
}
|
|
|
|
// fillCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color),
|
|
static int matrixpanel_fillcircle (lua_State *L) {
|
|
int x = luaL_checkint(L, 1);
|
|
int y = luaL_checkint(L, 2);
|
|
int r = luaL_checkint(L, 3);
|
|
int c = luaL_checkint(L, 4);
|
|
matrixpanel.fillCircle(x, y, r, c);
|
|
return 0;
|
|
}
|
|
|
|
// fillCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername, int16_t delta, uint16_t color),
|
|
static int matrixpanel_fillcirclehelper (lua_State *L) {
|
|
int x = luaL_checkint(L, 1);
|
|
int y = luaL_checkint(L, 2);
|
|
int r = luaL_checkint(L, 3);
|
|
int corner= luaL_checkint(L, 4);
|
|
int delta = luaL_checkint(L, 5);
|
|
int c = luaL_checkint(L, 6);
|
|
matrixpanel.fillCircleHelper(x, y, r, corner, delta, c);
|
|
return 0;
|
|
}
|
|
|
|
// drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color),
|
|
static int matrixpanel_drawtriangle (lua_State *L) {
|
|
int x0 = luaL_checkint(L, 1);
|
|
int y0 = luaL_checkint(L, 2);
|
|
int x1 = luaL_checkint(L, 3);
|
|
int y1 = luaL_checkint(L, 4);
|
|
int x2 = luaL_checkint(L, 5);
|
|
int y2 = luaL_checkint(L, 6);
|
|
int c = luaL_checkint(L, 7);
|
|
matrixpanel.drawTriangle(x0, y0, x1, y1, x2, y2, c);
|
|
return 0;
|
|
}
|
|
|
|
// fillTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color),
|
|
static int matrixpanel_filltriangle (lua_State *L) {
|
|
int x0 = luaL_checkint(L, 1);
|
|
int y0 = luaL_checkint(L, 2);
|
|
int x1 = luaL_checkint(L, 3);
|
|
int y1 = luaL_checkint(L, 4);
|
|
int x2 = luaL_checkint(L, 5);
|
|
int y2 = luaL_checkint(L, 6);
|
|
int c = luaL_checkint(L, 7);
|
|
matrixpanel.fillTriangle(x0, y0, x1, y1, x2, y2, c);
|
|
return 0;
|
|
}
|
|
|
|
// drawRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h, int16_t radius, uint16_t color),
|
|
static int matrixpanel_drawroundrect (lua_State *L) {
|
|
int x = luaL_checkint(L, 1);
|
|
int y = luaL_checkint(L, 2);
|
|
int w = luaL_checkint(L, 3);
|
|
int h = luaL_checkint(L, 4);
|
|
int r = luaL_checkint(L, 5);
|
|
int c = luaL_checkint(L, 6);
|
|
matrixpanel.drawRoundRect(x, y, w, h, r, c);
|
|
return 0;
|
|
}
|
|
|
|
// fillRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h, int16_t radius, uint16_t color),
|
|
static int matrixpanel_fillroundrect (lua_State *L) {
|
|
int x = luaL_checkint(L, 1);
|
|
int y = luaL_checkint(L, 2);
|
|
int w = luaL_checkint(L, 3);
|
|
int h = luaL_checkint(L, 4);
|
|
int r = luaL_checkint(L, 5);
|
|
int c = luaL_checkint(L, 6);
|
|
matrixpanel.fillRoundRect(x, y, w, h, r, c);
|
|
return 0;
|
|
}
|
|
|
|
// drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color),
|
|
// drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color, uint16_t bg),
|
|
// drawBitmap(int16_t x, int16_t y, uint8_t *bitmap, int16_t w, int16_t h, uint16_t color),
|
|
// drawBitmap(int16_t x, int16_t y, uint8_t *bitmap, int16_t w, int16_t h, uint16_t color, uint16_t bg),
|
|
// drawXBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color),
|
|
|
|
// drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color, uint16_t bg, uint8_t size),
|
|
static int matrixpanel_drawchar (lua_State *L) {
|
|
int x = luaL_checkint(L, 1);
|
|
int y = luaL_checkint(L, 2);
|
|
const char *str = luaL_checkstring(L, 3);
|
|
int bg = luaL_checkint(L, 4);
|
|
int color = luaL_checkint(L, 5);
|
|
int size = luaL_checkint(L, 6);
|
|
matrixpanel.drawChar(x, y, str[0], color, bg, size);
|
|
return 0;
|
|
}
|
|
|
|
// setCursor(int16_t x, int16_t y),
|
|
static int matrixpanel_setcursor (lua_State *L) {
|
|
int x = luaL_checkint(L, 1);
|
|
int y = luaL_checkint(L, 2);
|
|
matrixpanel.setCursor(x, y);
|
|
return 0;
|
|
}
|
|
|
|
// setTextColor(uint16_t c),
|
|
// setTextColor(uint16_t c, uint16_t bg),
|
|
static int matrixpanel_settextcolor (lua_State *L) {
|
|
int color = luaL_checkint(L, 1);
|
|
// int y = luaL_checkint(L, 2);
|
|
matrixpanel.setTextColor(color);
|
|
return 0;
|
|
}
|
|
|
|
// setTextSize(uint8_t s),
|
|
static int matrixpanel_settextsize (lua_State *L) {
|
|
int size = luaL_checkint(L, 1);
|
|
matrixpanel.setTextSize(size);
|
|
return 0;
|
|
}
|
|
|
|
// setTextWrap(boolean w),
|
|
static int matrixpanel_settextwrap (lua_State *L) {
|
|
bool flag = lua_isboolean(L, 1) ? lua_toboolean(L, 1) : false;
|
|
matrixpanel.setTextWrap(flag);
|
|
return 0;
|
|
}
|
|
|
|
// setRotation(uint8_t r),
|
|
static int matrixpanel_setrotation (lua_State *L) {
|
|
int rot = luaL_checkint(L, 1);
|
|
matrixpanel.setRotation(rot);
|
|
return 0;
|
|
}
|
|
|
|
// setFont(const GFXfont *f = NULL),
|
|
static int matrixpanel_setfont (lua_State *L) {
|
|
const char *font = luaL_checkstring(L, 1);
|
|
// Need to do some kind of lookup based on the string.
|
|
matrixpanel.setFont(&TomThumb);
|
|
return 0;
|
|
}
|
|
|
|
// getTextBounds(char *string, int16_t x, int16_t y, int16_t *x1, int16_t *y1, uint16_t *w, uint16_t *h),
|
|
static int matrixpanel_gettextbounds (lua_State *L) {
|
|
char *string = (char *) luaL_checkstring(L, 1); // cast off the const, pointer won't actually be changed
|
|
int x = luaL_checkint(L, 2);
|
|
int y = luaL_checkint(L, 2);
|
|
int16_t x1 = 0, y1 = 0;
|
|
uint16_t w = 0, h = 0;
|
|
|
|
matrixpanel.getTextBounds(string, x, y, &x1, &y1, &w, &h);
|
|
|
|
lua_pushnumber(L, x1);
|
|
lua_pushnumber(L, y1);
|
|
lua_pushnumber(L, w);
|
|
lua_pushnumber(L, h);
|
|
|
|
return 4;
|
|
}
|
|
|
|
static const struct luaL_Reg matrixpanel_methods[] = {
|
|
{ "new", matrixpanel_new },
|
|
{ "swapBuffer", matrixpanel_swapbuffer },
|
|
{ "fillScreen", matrixpanel_fillscreen },
|
|
{ "drawPixel", matrixpanel_drawpixel },
|
|
{ "colorHSV", matrixpanel_colorHSV },
|
|
{ "color888", matrixpanel_color888 },
|
|
{ "color444", matrixpanel_color444 },
|
|
{ "color333", matrixpanel_color333 },
|
|
{ "drawLine", matrixpanel_drawline },
|
|
{ "drawFastVLine", matrixpanel_drawfastvline },
|
|
{ "drawFastHLine", matrixpanel_drawfasthline },
|
|
{ "drawRect", matrixpanel_drawrect },
|
|
{ "fillRect", matrixpanel_fillrect },
|
|
{ "invertScreen", matrixpanel_invertdisplay },
|
|
{ "drawCircle", matrixpanel_drawcircle },
|
|
{ "drawCircleHelper", matrixpanel_drawcirclehelper },
|
|
{ "fillCircle", matrixpanel_fillcircle },
|
|
{ "fillCircleHelper", matrixpanel_fillcirclehelper },
|
|
{ "drawTriangle", matrixpanel_drawtriangle },
|
|
{ "fillTriangle", matrixpanel_filltriangle },
|
|
{ "drawRoundRect", matrixpanel_drawroundrect },
|
|
{ "fillRoundRect", matrixpanel_fillroundrect },
|
|
// drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color),
|
|
// drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color, uint16_t bg),
|
|
// drawBitmap(int16_t x, int16_t y, uint8_t *bitmap, int16_t w, int16_t h, uint16_t color),
|
|
// drawBitmap(int16_t x, int16_t y, uint8_t *bitmap, int16_t w, int16_t h, uint16_t color, uint16_t bg),
|
|
// drawXBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color),
|
|
{ "drawChar", matrixpanel_drawchar },
|
|
{ "setCursor", matrixpanel_setcursor },
|
|
{ "setTextColor", matrixpanel_settextcolor },
|
|
{ "setTextSize", matrixpanel_settextsize },
|
|
{ "setTextWrap", matrixpanel_settextwrap },
|
|
{ "setRotation", matrixpanel_setrotation },
|
|
// setFont(const GFXfont *f = NULL),
|
|
{ "getTextBounds", matrixpanel_gettextbounds },
|
|
{NULL, NULL}
|
|
};
|
|
|
|
static const struct luaL_Reg matrixpanel_metamethods[] = {
|
|
{ "__gc", matrixpanel_gc },
|
|
{ "__tostring", matrixpanel_tostring },
|
|
{NULL, NULL}
|
|
};
|
|
|
|
int luaopen_matrixpanel (lua_State* L) {
|
|
lua_newtable(L);
|
|
luaL_setfuncs(L, matrixpanel_methods, 0);
|
|
lua_setglobal(L, "matrixpanel");
|
|
|
|
luaL_newmetatable(L, "matrixpanel"); /* create metatable for matrixpanel,
|
|
add it to the Lua registry */
|
|
luaL_setfuncs(L, matrixpanel_methods, 0);
|
|
|
|
lua_pushliteral(L, "__index");
|
|
lua_pushvalue(L, -3); /* dup methods table*/
|
|
lua_rawset(L, -3); /* metatable.__index = methods */
|
|
lua_pushliteral(L, "__metatable");
|
|
lua_pushvalue(L, -3); /* dup methods table*/
|
|
lua_rawset(L, -3); /* hide metatable:
|
|
metatable.__metatable = methods */
|
|
lua_pop(L, 1); /* drop metatable */
|
|
return 1;
|
|
}
|