#ifndef SYSTEM_H #define SYSTEM_H #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/semphr.h" 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; } SystemState_t; #define MAX_INDICATION_ANGLE 10.0f #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); // 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