diff --git a/firmware/apps/vest/VERSION b/firmware/apps/vest/VERSION new file mode 100644 index 0000000..91b6ef0 --- /dev/null +++ b/firmware/apps/vest/VERSION @@ -0,0 +1,5 @@ +VERSION_MAJOR = 0 +VERSION_MINOR = 0 +PATCHLEVEL = 0 +VERSION_TWEAK = 0 +EXTRAVERSION = \ No newline at end of file diff --git a/firmware/apps/vest/boards/nrf52840dk_nrf52840.overlay b/firmware/apps/vest/boards/nrf52840dk_nrf52840.overlay new file mode 100644 index 0000000..7cb254f --- /dev/null +++ b/firmware/apps/vest/boards/nrf52840dk_nrf52840.overlay @@ -0,0 +1,5 @@ +/ { + chosen { + nordic,pm-ext-flash = &mx25r64; + }; +}; \ No newline at end of file diff --git a/firmware/apps/vest/pm_static.yml b/firmware/apps/vest/pm_static.yml new file mode 100644 index 0000000..1f22f30 --- /dev/null +++ b/firmware/apps/vest/pm_static.yml @@ -0,0 +1,4 @@ +littlefs_storage: + address: 0x0 + size: 0x800000 + region: external_flash diff --git a/firmware/apps/vest/prj.conf b/firmware/apps/vest/prj.conf index 851e119..7c4202d 100644 --- a/firmware/apps/vest/prj.conf +++ b/firmware/apps/vest/prj.conf @@ -20,32 +20,21 @@ CONFIG_NVS=y CONFIG_SETTINGS=y # Network and OpenThread -CONFIG_NETWORKING=y -CONFIG_NET_L2_OPENTHREAD=y -CONFIG_OPENTHREAD=y -CONFIG_OPENTHREAD_SHELL=y -CONFIG_OPENTHREAD_DEFAULT_TX_POWER=8 +# CONFIG_NETWORKING=y +# CONFIG_NET_L2_OPENTHREAD=y +# CONFIG_OPENTHREAD=y +# CONFIG_OPENTHREAD_SHELL=y +# CONFIG_OPENTHREAD_DEFAULT_TX_POWER=8 -# --- CoAP & UDP Features --- -CONFIG_OPENTHREAD_COAP=y -CONFIG_OPENTHREAD_MANUAL_START=y +# CONFIG_OPENTHREAD_COAP=y +# CONFIG_OPENTHREAD_MANUAL_START=y -# Bluetooth -CONFIG_BT=y -CONFIG_BT_PERIPHERAL=y -CONFIG_BT_DEVICE_NAME="Lasertag-Device" -CONFIG_BT_DEVICE_NAME_DYNAMIC=y -CONFIG_BT_L2CAP_TX_MTU=252 -CONFIG_BT_BUF_ACL_TX_SIZE=251 -CONFIG_BT_BUF_ACL_RX_SIZE=251 -CONFIG_BT_ATT_PREPARE_COUNT=5 -CONFIG_BT_LOG_LEVEL_WRN=y # Enable Lasertag Shared Modules -CONFIG_LASERTAG_UTILS=y -CONFIG_THREAD_MGMT=y +CONFIG_LASERTAG_UTILS=n +CONFIG_THREAD_MGMT=n CONFIG_OPENTHREAD_FTD=y -CONFIG_THREAD_MGMT_LOG_LEVEL_DBG=n -CONFIG_BLE_MGMT=y -CONFIG_BLE_MGMT_LOG_LEVEL_DBG=n -CONFIG_GAME_MGMT=y \ No newline at end of file +CONFIG_BLE_MGMT=n +CONFIG_GAME_MGMT=y +CONFIG_FS_MGMT=y +CONFIG_FS_MGMT_LOG_LEVEL_DBG=y diff --git a/firmware/apps/vest/src/main.c b/firmware/apps/vest/src/main.c index b0d75ce..afc56ba 100644 --- a/firmware/apps/vest/src/main.c +++ b/firmware/apps/vest/src/main.c @@ -1,18 +1,41 @@ #include #include +#ifdef CONFIG_LASERTAG_UTILS #include +#endif +#ifdef CONFIG_THREAD_MGMT #include +#endif +#ifdef CONFIG_BLE_MGMT #include +#endif +#ifdef CONFIG_FS_MGMT +#include +#endif LOG_MODULE_REGISTER(vest_app, CONFIG_LOG_DEFAULT_LEVEL); int main(void) { + int rc; + + #ifdef CONFIG_LASERTAG_UTILS /* Initialize shared project logic and NVS */ lasertag_utils_init(); + #endif + #ifdef CONFIG_FS_MGMT + /* Initialize filesystem management */ + rc = fs_mgmt_init(); + if (rc) { + LOG_ERR("Filesystem management initialization failed (err %d)", rc); + return rc; + } + #endif + + #ifdef CONFIG_BLE_MGMT /* Initialize and start BLE management for provisioning */ - int rc = ble_mgmt_init(LT_TYPE_VEST); + rc = ble_mgmt_init(LT_TYPE_VEST); if (rc) { LOG_ERR("BLE initialization failed (err %d)", rc); return rc; @@ -27,7 +50,9 @@ int main(void) } else { LOG_INF("BLE advertising started."); } + #endif + #ifdef CONFIG_THREAD_MGMT /* Initialize and start OpenThread stack */ rc = thread_mgmt_init(); if (rc) { @@ -36,6 +61,7 @@ int main(void) LOG_INF("Vest Application successfully started with Thread Mesh."); return rc; } + #endif while (1) { /* Main loop - handle high-level game logic here */ diff --git a/firmware/libs/CMakeLists.txt b/firmware/libs/CMakeLists.txt index bb08544..b4d37af 100644 --- a/firmware/libs/CMakeLists.txt +++ b/firmware/libs/CMakeLists.txt @@ -4,4 +4,5 @@ add_subdirectory(ble_mgmt) add_subdirectory(thread_mgmt) add_subdirectory(lasertag_utils) add_subdirectory(ir) -add_subdirectory(game_mgmt) \ No newline at end of file +add_subdirectory(game_mgmt) +add_subdirectory(fs_mgmt) \ No newline at end of file diff --git a/firmware/libs/Kconfig b/firmware/libs/Kconfig index f6b3baf..eef41ea 100644 --- a/firmware/libs/Kconfig +++ b/firmware/libs/Kconfig @@ -3,4 +3,5 @@ rsource "lasertag_utils/Kconfig" rsource "thread_mgmt/Kconfig" rsource "ble_mgmt/Kconfig" rsource "ir/Kconfig" -rsource "game_mgmt/Kconfig" \ No newline at end of file +rsource "game_mgmt/Kconfig" +rsource "fs_mgmt/Kconfig" \ No newline at end of file diff --git a/firmware/libs/ble_mgmt/Kconfig b/firmware/libs/ble_mgmt/Kconfig index 903a28e..4f0f4bb 100644 --- a/firmware/libs/ble_mgmt/Kconfig +++ b/firmware/libs/ble_mgmt/Kconfig @@ -1,6 +1,8 @@ menuconfig BLE_MGMT bool "BLE Management" - depends on BT + select BT + select BT_PERIPHERAL + select BT_DEVICE_NAME_DYNAMIC help Library for BLE provisioning of the lasertag device. @@ -9,9 +11,20 @@ if BLE_MGMT module-str = ble_mgmt source "subsys/logging/Kconfig.template.log_config" -config BLE_MGMT_CAN_BE_GAME_LEADER + config BLE_MGMT_CAN_BE_GAME_LEADER bool "Can be game leader" default n help Allow this device to take the game leader role in the lasertag game. + + config BT_DEVICE_NAME + default "Lasertag Device" + config BT_L2CAP_TX_MTU + default 252 + config BT_BUF_ACL_RX_SIZE + default 251 + config BT_BUF_ACL_TX_SIZE + default 251 + config BT_ATT_PREPARE_COUNT + default 5 endif \ No newline at end of file diff --git a/firmware/libs/fs_mgmt/CMakeLists.txt b/firmware/libs/fs_mgmt/CMakeLists.txt index eed5de2..5c85514 100644 --- a/firmware/libs/fs_mgmt/CMakeLists.txt +++ b/firmware/libs/fs_mgmt/CMakeLists.txt @@ -2,4 +2,16 @@ if(CONFIG_FS_MGMT) zephyr_library() zephyr_sources(src/fs_mgmt.c) zephyr_include_directories(include) + + if(CONFIG_FILE_SYSTEM_LITTLEFS) + if(DEFINED ZEPHYR_LITTLEFS_MODULE_DIR) + zephyr_include_directories(${ZEPHYR_LITTLEFS_MODULE_DIR}) + elseif(DEFINED WEST_TOPDIR) + zephyr_include_directories(${WEST_TOPDIR}/modules/fs/littlefs) + endif() + + if(DEFINED ZEPHYR_BASE) + zephyr_include_directories(${ZEPHYR_BASE}/modules/littlefs) + endif() + endif() endif() \ No newline at end of file diff --git a/firmware/libs/fs_mgmt/Kconfig b/firmware/libs/fs_mgmt/Kconfig index 7ea14c8..169bb59 100644 --- a/firmware/libs/fs_mgmt/Kconfig +++ b/firmware/libs/fs_mgmt/Kconfig @@ -1,6 +1,7 @@ menuconfig FS_MGMT bool "File System Management" select FLASH + select FLASH_MAP select FILE_SYSTEM select FILE_SYSTEM_LITTLEFS select FILE_SYSTEM_MKFS diff --git a/firmware/libs/fs_mgmt/include/fs_mgmt.h b/firmware/libs/fs_mgmt/include/fs_mgmt.h new file mode 100644 index 0000000..bdee53f --- /dev/null +++ b/firmware/libs/fs_mgmt/include/fs_mgmt.h @@ -0,0 +1,7 @@ +#ifndef FS_MGMT_H +#define FS_MGMT_H + +int fs_mgmt_init(void); + +#endif + diff --git a/firmware/libs/fs_mgmt/src/fs_mgmt.c b/firmware/libs/fs_mgmt/src/fs_mgmt.c new file mode 100644 index 0000000..383b3ed --- /dev/null +++ b/firmware/libs/fs_mgmt/src/fs_mgmt.c @@ -0,0 +1,78 @@ +#include +#include +#include +#include +#include + +LOG_MODULE_REGISTER(fs_mgmt, CONFIG_FS_MGMT_LOG_LEVEL); +#define STORAGE_PARTITION_ID FIXED_PARTITION_ID(littlefs_storage) +FS_LITTLEFS_DECLARE_DEFAULT_CONFIG(fs_storage_data); + +static struct fs_mount_t fs_storage_mnt = { + .type = FS_LITTLEFS, + .fs_data = &fs_storage_data, + .storage_dev = (void *)STORAGE_PARTITION_ID, + .mnt_point = "/lfs", +}; + +int fs_mgmt_init(void) +{ + int rc; + LOG_DBG("Initializing filesystem management module"); + rc = fs_mount(&fs_storage_mnt); + if (rc) + { + LOG_ERR("Filesystem mount failed (err %d)", rc); + return rc; + } + else + { + struct fs_statvfs stat; + uint64_t total; + uint64_t free; + + LOG_DBG("Filesystem mounted successfully at %s", fs_storage_mnt.mnt_point); + + rc = fs_statvfs(fs_storage_mnt.mnt_point, &stat); + if (rc == 0) + { + total = (uint64_t)stat.f_blocks * (uint64_t)stat.f_frsize; + free = (uint64_t)stat.f_bfree * (uint64_t)stat.f_frsize; + uint64_t total_kb = total / 1024; + uint64_t free_kb = free / 1024; + uint64_t used_kb = total_kb - free_kb; + uint64_t used_pct_x10 = 0; + LOG_DBG("Filesystem total size/used/free size: %4llu/%4llu/%4llu KB", + (unsigned long long)total_kb, + (unsigned long long)used_kb, + (unsigned long long)free_kb); + if (total_kb > 0) + { + used_pct_x10 = (used_kb * 1000) / total_kb; + } + if (used_pct_x10 >= 900) + { + LOG_ERR("Filesystem used: %llu.%llu%%", + (unsigned long long)(used_pct_x10 / 10), + (unsigned long long)(used_pct_x10 % 10)); + } + else if (used_pct_x10 >= 750) + { + LOG_WRN("Filesystem used: %llu.%llu%%", + (unsigned long long)(used_pct_x10 / 10), + (unsigned long long)(used_pct_x10 % 10)); + } + else + { + LOG_DBG("Filesystem used: %llu.%llu%%", + (unsigned long long)(used_pct_x10 / 10), + (unsigned long long)(used_pct_x10 % 10)); + } + } + else + { + LOG_WRN("Filesystem statvfs failed (err %d)", rc); + } + } + return 0; +} \ No newline at end of file