#ifndef SYSTEM_H #define SYSTEM_H #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/semphr.h" #define DISABLE_GUI 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; } 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) // …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_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); #endif