#include #include #include #include #include #include #include #include #include #include #include #include static const char *TAG = "LUA-VFS"; static void report(lua_State *L, int status) { if (status == LUA_OK) return; const char *msg = lua_tostring(L, -1); printf("%s\n", msg); lua_pop(L, 1); } static void halt() { ESP_LOGE(TAG, "System halted"); while (1) vTaskDelay(1000); } static void mount_fs() { esp_vfs_spiffs_conf_t conf = { .base_path = "/lua", .partition_label = NULL, .max_files = 5, .format_if_mount_failed = false }; esp_err_t ret = esp_vfs_spiffs_register(&conf); switch (ret) { case ESP_OK: break; case ESP_FAIL: ESP_LOGE(TAG, "Failed to mount or format filesystem"); halt(); break; case ESP_ERR_NOT_FOUND: ESP_LOGE(TAG, "Failed to find SPIFFS partition"); halt(); break; default: ESP_LOGE(TAG, "Failed to initialize SPIFFS (%s)", esp_err_to_name(ret)); halt(); } size_t total = 0, used = 0; ESP_ERROR_CHECK(esp_spiffs_info(NULL, &total, &used)); ESP_LOGI(TAG, "Partition size: total: %d, used: %d", total, used); } void test(void *arg) { mount_fs(); lua_State *L = luaL_newstate(); ESP_ERROR_CHECK(L ? ESP_OK : ESP_FAIL); luaL_openlibs(L); int r = luaL_loadfilex(L, "/lua/main.lua", NULL); if (r != LUA_OK) printf("Failed to execute /lua/main.lua\n"); else r = lua_pcall(L, 0, LUA_MULTRET, 0); report(L, r); lua_close(L); printf("State closed, heap: %" PRIu32 "\n", xPortGetFreeHeapSize()); while (1) { printf("."); fflush(stdout); vTaskDelay(100); } } void app_main() { xTaskCreate(test, "test", 0x10000, NULL, 5, NULL); }