71 lines
2.2 KiB
C
71 lines
2.2 KiB
C
#include "module.h"
|
|
#include "lauxlib.h"
|
|
#include "common.h"
|
|
#include "lmem.h"
|
|
|
|
#include "qrcodegen.h"
|
|
|
|
// qrcodegen.encodeText(text, [{minver=int, maxver=int, ecl=int, mask=int, boostecl=bool}])
|
|
// all params except text are optional
|
|
static int encodeText(lua_State *L)
|
|
{
|
|
lua_settop(L, 2);
|
|
const char *text = luaL_checkstring(L, 1);
|
|
|
|
int min_ver = opt_checkint_range(L, "minver", qrcodegen_VERSION_MIN,
|
|
qrcodegen_VERSION_MIN, qrcodegen_VERSION_MAX);
|
|
|
|
int max_ver = opt_checkint_range(L, "maxver", qrcodegen_VERSION_MAX,
|
|
min_ver, qrcodegen_VERSION_MAX);
|
|
|
|
int ecl = opt_checkint_range(L, "ecl", qrcodegen_Ecc_LOW,
|
|
qrcodegen_Ecc_LOW, qrcodegen_Ecc_HIGH);
|
|
|
|
int mask = opt_checkint_range(L, "mask", qrcodegen_Mask_AUTO,
|
|
qrcodegen_Mask_AUTO, qrcodegen_Mask_7);
|
|
|
|
bool boost = opt_checkbool(L, "boostecl", false);
|
|
|
|
const size_t buf_len = qrcodegen_BUFFER_LEN_FOR_VERSION(max_ver);
|
|
uint8_t *result = (uint8_t *)luaM_malloc(L, buf_len * 2);
|
|
uint8_t *tempbuf = result + buf_len;
|
|
|
|
bool ok = qrcodegen_encodeText(text, tempbuf, result, ecl, min_ver, max_ver, mask, boost);
|
|
if (ok) {
|
|
lua_pushlstring(L, (const char *)result, buf_len);
|
|
} else {
|
|
lua_pushnil(L);
|
|
}
|
|
luaM_freemem(L, result, buf_len * 2);
|
|
return 1;
|
|
}
|
|
|
|
static int getSize(lua_State *L)
|
|
{
|
|
const uint8_t* data = (const uint8_t *)luaL_checkstring(L, 1);
|
|
lua_pushinteger(L, qrcodegen_getSize(data));
|
|
return 1;
|
|
}
|
|
|
|
static int getPixel(lua_State *L)
|
|
{
|
|
const uint8_t* data = (const uint8_t *)luaL_checkstring(L, 1);
|
|
int x = luaL_checkint(L, 2);
|
|
int y = luaL_checkint(L, 3);
|
|
lua_pushboolean(L, qrcodegen_getModule(data, x, y));
|
|
return 1;
|
|
}
|
|
|
|
LROT_BEGIN(qrcodegen, NULL, 0)
|
|
LROT_FUNCENTRY(encodeText, encodeText)
|
|
LROT_FUNCENTRY(getSize, getSize)
|
|
LROT_FUNCENTRY(getPixel, getPixel)
|
|
LROT_NUMENTRY(LOW, qrcodegen_Ecc_LOW)
|
|
LROT_NUMENTRY(MEDIUM, qrcodegen_Ecc_MEDIUM)
|
|
LROT_NUMENTRY(QUARTILE, qrcodegen_Ecc_QUARTILE)
|
|
LROT_NUMENTRY(HIGH, qrcodegen_Ecc_HIGH)
|
|
LROT_NUMENTRY(AUTO, qrcodegen_Mask_AUTO)
|
|
LROT_END(qrcodegen, NULL, 0)
|
|
|
|
NODEMCU_MODULE(QRCODEGEN, "qrcodegen", qrcodegen, NULL);
|