61 lines
2.0 KiB
C
61 lines
2.0 KiB
C
|
// Helloworld sample module
|
||
|
|
||
|
#include "esp_log.h"
|
||
|
#include "lauxlib.h"
|
||
|
#include "lnodeaux.h"
|
||
|
#include "module.h"
|
||
|
|
||
|
static const char* HELLOWORLD_METATABLE = NODEMCU_MODULE_METATABLE();
|
||
|
|
||
|
// hello_context_t struct contains information to wrap a "hello world object"
|
||
|
typedef struct {
|
||
|
char* my_name; // pointer to the greeter's name
|
||
|
} hello_context_t;
|
||
|
|
||
|
// Lua: helloworldobj:hello(text)
|
||
|
static int helloworld_hello(lua_State* L) {
|
||
|
hello_context_t* context = (hello_context_t*)luaL_checkudata(L, 1, HELLOWORLD_METATABLE);
|
||
|
printf("Hello, %s: %s\n", context->my_name, luaL_optstring(L, 2, "How are you?"));
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
// helloworld_delete is called on garbage collection
|
||
|
static int helloworld_delete(lua_State* L) {
|
||
|
hello_context_t* context = (hello_context_t*)luaL_checkudata(L, 1, HELLOWORLD_METATABLE);
|
||
|
printf("Helloworld object with name '%s' garbage collected\n", context->my_name);
|
||
|
luaX_free_string(L, context->my_name);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
// Lua: modulename.new(string)
|
||
|
static int helloworld_new(lua_State* L) {
|
||
|
//create a new lua userdata object and initialize to 0.
|
||
|
hello_context_t* context = (hello_context_t*)lua_newuserdata(L, sizeof(hello_context_t));
|
||
|
|
||
|
context->my_name = luaX_alloc_string(L, 1, 100);
|
||
|
|
||
|
luaL_getmetatable(L, HELLOWORLD_METATABLE);
|
||
|
lua_setmetatable(L, -2);
|
||
|
|
||
|
return 1; //one object returned, the helloworld context wrapped in a lua userdata object
|
||
|
}
|
||
|
|
||
|
// object function map:
|
||
|
LROT_BEGIN(helloworld_metatable)
|
||
|
LROT_FUNCENTRY(hello, helloworld_hello)
|
||
|
LROT_FUNCENTRY(__gc, helloworld_delete)
|
||
|
LROT_TABENTRY(__index, helloworld_metatable)
|
||
|
LROT_END(helloworld_metatable, NULL, 0)
|
||
|
|
||
|
// Module function map
|
||
|
LROT_BEGIN(module)
|
||
|
LROT_FUNCENTRY(new, helloworld_new)
|
||
|
LROT_END(module, NULL, 0)
|
||
|
|
||
|
// module_init is invoked on device startup
|
||
|
static int module_init(lua_State* L) {
|
||
|
luaL_rometatable(L, HELLOWORLD_METATABLE, (void*)helloworld_metatable_map); // create metatable for helloworld
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
NODEMCU_MODULE_STD(); // define Lua entries
|