Skip to content

Commit

Permalink
WiFi: add minimal functional for wifi for lua scripts (#9)
Browse files Browse the repository at this point in the history
keira: add WiFi API for Lua

Co-authored-by: Yevhen Boichuk <[email protected]>
  • Loading branch information
black-ghost-off and yevhenboichuk authored Mar 21, 2024
1 parent 8b582f9 commit 2ba477e
Show file tree
Hide file tree
Showing 4 changed files with 162 additions and 0 deletions.
18 changes: 18 additions & 0 deletions firmware/keira/sdcard/wifi_test.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
status = wifi.get_status()
print(status)

wifi.disconnect()

status = wifi.get_status()
print(status)

scan = wifi.scan()

print(#scan)
for i = 1, #scan do -- This will cycle through and print each element of the array
print(scan[i])
rssi = wifi.get_rssi(i)
print(rssi)
rssi = wifi.get_encryption_type(i)
print(rssi)
end
136 changes: 136 additions & 0 deletions firmware/keira/src/apps/lua/lualilka_wifi.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@


#include <csetjmp>

#include "WiFi.h"
#include "lualilka_wifi.h"
#include <lilka.h>

int lualilka_wifi_connect(lua_State* L) {
int n = lua_gettop(L);

if (n != 2) {
return luaL_error(L, "Очікується 2 аргументи, отримано %d", n);
}

const char* ssid = lua_tostring(L, 1);
const char* password = lua_tostring(L, 2);
WiFi.begin(ssid, password);

return 0;
}

int lualilka_wifi_get_status(lua_State* L) {
lua_pushinteger(L, WiFi.status());
return 1;
}

int lualilka_wifi_disconnect(lua_State* L) {
WiFi.disconnect();
return 0;
}

int lualilka_wifi_scan_networks(lua_State* L) {
int n = WiFi.scanNetworks();

lua_createtable(L, n, 0);
for (int i = 0; i < n; ++i) {
lua_pushstring(L, WiFi.SSID(i).c_str());
lua_rawseti(L, -2, i + 1); /* In lua indices start at 1 */
}

return 1;
}

int lualilka_wifi_get_rssi(lua_State* L) {
int n = lua_gettop(L);
if (n != 1) {
return luaL_error(L, "Очікується 1 аргументи, отримано %d", n);
}

int wifiAccessPoint = lua_tointeger(L, 1) - 1; /* In lua indices start at 1 */

lua_pushinteger(L, WiFi.RSSI(wifiAccessPoint));

return 1;
}

int lualilka_wifi_get_encryption_type(lua_State* L) {
int n = lua_gettop(L);
if (n != 1) {
return luaL_error(L, "Очікується 1 аргументи, отримано %d", n);
}

int wifiAccessPoint = lua_tointeger(L, 1) - 1; /* In lua indices start at 1 */

lua_pushinteger(L, WiFi.encryptionType(wifiAccessPoint));

return 1;
}

int lualilka_wifi_get_mac(lua_State* L) {
byte mac[6];

WiFi.macAddress(mac);

String s;
for (byte i = 0; i < sizeof(mac); i++) {
char buf[3];
sprintf(buf, "%02X", mac[i]);
s += buf;
if (i < 5) s += ':';
}

lua_pushstring(L, s.c_str());

return 1;
}

int lualilka_wifi_get_ip(lua_State* L) {
byte mac[4];

IPAddress ip = WiFi.localIP();

lua_pushstring(L, ip.toString().c_str());

return 1;
}

int lualilka_wifi_set_config(lua_State* L) {
int n = lua_gettop(L);
if (n != 5) {
return luaL_error(L, "Очікується 5 аргументів, отримано %d", n);
}
IPAddress ip, gateway, subnet, dns1, dns2;

ip.fromString(lua_tostring(L, 1));
gateway.fromString(lua_tostring(L, 2));
subnet.fromString(lua_tostring(L, 3));
dns1.fromString(lua_tostring(L, 4));
dns2.fromString(lua_tostring(L, 5));

WiFi.config(ip, gateway, subnet, dns1, dns2);

return 0;
}

static const luaL_Reg lualilka_wifi[] = {
{"connect", lualilka_wifi_connect},
{"get_status", lualilka_wifi_get_status},
{"disconnect", lualilka_wifi_disconnect},
{"scan", lualilka_wifi_scan_networks},
{"get_rssi", lualilka_wifi_get_rssi},
{"get_encryption_type", lualilka_wifi_get_encryption_type
}, // TKIP (WPA) = 2 WEP = 5 CCMP (WPA) = 4 NONE = 7 AUTO = 8
{"get_mac", lualilka_wifi_get_mac},
{"get_local_ip", lualilka_wifi_get_ip},
{"set_config", lualilka_wifi_set_config},
{NULL, NULL},
};

int lualilka_wifi_register(lua_State* L) {
// Create global "wifi" table that contains all wifi functions
luaL_newlib(L, lualilka_wifi);
lua_setglobal(L, "wifi");
return 0;
}
6 changes: 6 additions & 0 deletions firmware/keira/src/apps/lua/lualilka_wifi.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#pragma once

#include <lua.hpp>
#include <Arduino.h>

int lualilka_wifi_register(lua_State* L);
2 changes: 2 additions & 0 deletions firmware/keira/src/apps/lua/luarunner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include "lualilka_util.h"
#include "lualilka_buzzer.h"
#include "lualilka_state.h"
#include "lualilka_wifi.h"

jmp_buf stopjmp;

Expand Down Expand Up @@ -155,6 +156,7 @@ void AbstractLuaRunnerApp::luaSetup(const char* dir) {
lualilka_gpio_register(L);
lualilka_util_register(L);
lualilka_buzzer_register(L);
lualilka_wifi_register(L);

// lilka::serial_log("lua: init canvas");
// lilka::Canvas* canvas = new lilka::Canvas();
Expand Down

0 comments on commit 2ba477e

Please sign in to comment.