#ifndef SYSTEM_H #define SYSTEM_H #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/semphr.h" #include "freertos/queue.h" #include "esp_bt_defs.h" #define DISABLE_GUI #define MAX_PAIRED_DEVICES 10 #define DEVICE_NAME_MAX_LEN 32 // Forward declaration of paired_device_t typedef struct { char name[DEVICE_NAME_MAX_LEN]; esp_bd_addr_t bda; uint32_t last_connected; bool is_connected; } paired_device_t; enum { ANGLE_XY = 0, ANGLE_XZ, ANGLE_YZ, }; typedef struct { float raw[3]; float filtered[3]; float angle; } ImuData_t; typedef struct SystemState_s { ImuData_t imu; EventGroupHandle_t event; float zeroAngle; int primaryAxis; // BT event data int btDeviceIndex; // NVS cached data paired_device_t pairedDevices[MAX_PAIRED_DEVICES]; size_t pairedDeviceCount; // Charge status bool isCharging; // Swap L/R audio channels bool swapLR; // Volume setting (0-100) int volume; // Battery monitoring int batteryVoltage_mv; int batteryPercentage; } SystemState_t; #define MAX_INDICATION_ANGLE 7.5f #define FILTER_COEFF 0.4f // 0 to 1 Smaller number is heavier filter #define PRIMARY_AXIS ANGLE_YZ #define RIFLE_AXIS Y #define EM_MAX_SUBSCRIBERS 8 // tweak as needed #define EM_EVENT_NEW_DATA (1UL<<0) #define EM_EVENT_ERROR (1UL<<1) #define EM_EVENT_BT_REFRESH (1UL<<2) #define EM_EVENT_BT_CONNECT (1UL<<3) #define EM_EVENT_VOLUME_UP (1UL<<4) #define EM_EVENT_VOLUME_DOWN (1UL<<5) #define EM_EVENT_BT_DISCOVERY_COMPLETE (1UL<<6) // …add more event bit-masks here… typedef struct { TaskHandle_t subscribers[EM_MAX_SUBSCRIBERS]; size_t count; SemaphoreHandle_t mutex; } EventManager_t; void system_init(void); void system_setImuData(ImuData_t imu); ImuData_t system_getImuData(void); int system_getPrimaryAxis(void); float system_getAngle(void); void system_setChargeStatus(bool charging); bool system_getChargeStatus(void); void system_setBatteryVoltage(int voltage_mv); int system_getBatteryVoltage(void); void system_setBatteryPercentage(int percentage); int system_getBatteryPercentage(void); void system_setSwapLR(bool swap); bool system_getSwapLR(void); void system_toggleSwapLR(void); esp_err_t system_saveSwapLR(void); esp_err_t system_loadSwapLR(void); void system_setZeroAngle(void); void system_clearZeroAngle(void); float system_getZeroAngle(void); // Subscribe (register) current task to receive events BaseType_t system_subscribe(TaskHandle_t task); // Unsubscribe if you ever need BaseType_t system_unsubscribe(TaskHandle_t task); // Notify all subscribers of one or more event bits void system_notifyAll(uint32_t eventBits); // BT-specific event functions void system_requestBtRefresh(void); void system_requestBtConnect(int device_index); int system_getBtDeviceIndex(void); // Volume control functions void system_requestVolumeUp(void); void system_requestVolumeDown(void); void system_setVolume(int volume); int system_getVolume(void); esp_err_t system_saveVolume(void); esp_err_t system_loadVolume(void); // NVS Service typedef enum { NVS_OP_SAVE_DEVICE, NVS_OP_LOAD_DEVICES, NVS_OP_REMOVE_DEVICE, NVS_OP_IS_DEVICE_KNOWN, NVS_OP_GET_DEVICE_COUNT, NVS_OP_UPDATE_TIMESTAMP } nvs_operation_type_t; typedef struct { nvs_operation_type_t operation; paired_device_t device; esp_bd_addr_t bda; TaskHandle_t requestor; esp_err_t result; bool response_ready; } nvs_request_t; void system_initNvsService(void); void system_processNvsRequests(void); esp_err_t system_savePairedDevice(const paired_device_t *device); esp_err_t system_loadPairedDevices(paired_device_t *devices, size_t *count); esp_err_t system_removePairedDevice(esp_bd_addr_t bda); bool system_isDeviceKnown(esp_bd_addr_t bda); esp_err_t system_getKnownDeviceCount(size_t *count); esp_err_t system_updateConnectionTimestamp(esp_bd_addr_t bda); const paired_device_t* system_getPairedDevices(size_t *count); esp_err_t system_clearAllPairedDevices(void); #define NVS_TIMEOUT_MS 5000 #endif