#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; } SystemState_t; #define MAX_INDICATION_ANGLE 5.0f #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) // …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); #endif