You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							95 lines
						
					
					
						
							2.0 KiB
						
					
					
				
			
		
		
	
	
							95 lines
						
					
					
						
							2.0 KiB
						
					
					
				| #include <stdio.h>
 | |
| #include <inttypes.h>
 | |
| #include <freertos/FreeRTOS.h>
 | |
| #include <freertos/task.h>
 | |
| #include <string.h>
 | |
| #include <stdbool.h>
 | |
| #include <lua/lua.h>
 | |
| #include <lua/lauxlib.h>
 | |
| #include <lua/lualib.h>
 | |
| #include <esp_spiffs.h>
 | |
| #include <esp_err.h>
 | |
| #include <esp_log.h>
 | |
| 
 | |
| 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);
 | |
| }
 | |
| 
 |