# Event System Component Specification
**Component ID:** C-EVENT-001
**Version:** 1.0
**Date:** 2025-02-01
**Location:** `application_layer/business_stack/event_system/`
## 1. Component Overview and Scope
The Event System provides a publish/subscribe event bus for cross-component communication in the ASF Sensor Hub. It decouples components, enables asynchronous event delivery, and ensures non-blocking operation throughout the system.
**Primary Purpose:** Provide event-driven communication infrastructure for loose coupling between system components.
**Scope:** System-wide event publishing, subscription management, event queuing, and asynchronous event delivery.
## 2. Responsibilities and Functions
### 2.1 Primary Responsibilities
- **Event Publishing:** Accept and queue events from any system component
- **Subscription Management:** Maintain subscriber lists for each event type
- **Event Delivery:** Deliver events to all registered subscribers
- **Queue Management:** Manage event queues with overflow handling
- **Non-Blocking Operation:** Ensure all operations are non-blocking
- **Event Filtering:** Support event filtering based on criteria
### 2.2 Non-Responsibilities
- **Event Payload Validation:** Components are responsible for payload validation
- **Event Ordering:** No guaranteed ordering between different event types
- **Event Persistence:** Events are not persisted (in-memory only)
- **Business Logic:** Does not implement application-specific logic
## 3. Provided Interfaces
### 3.1 Event Publishing Interface
```c
/**
* @brief Publish an event
* @param type Event type identifier
* @param payload Event payload (may be NULL)
* @param payload_size Payload size in bytes (0 if payload is NULL)
* @return true if published successfully, false on error
*/
bool event_publish(event_type_t type, const void* payload, size_t payload_size);
/**
* @brief Publish an event with timestamp
* @param type Event type identifier
* @param payload Event payload
* @param payload_size Payload size
* @param timestamp Event timestamp
* @return true if published successfully, false on error
*/
bool event_publishWithTimestamp(event_type_t type, const void* payload, size_t payload_size, uint64_t timestamp);
/**
* @brief Publish an event from ISR context
* @param type Event type identifier
* @param payload Event payload
* @param payload_size Payload size
* @return true if published successfully, false on error
*/
bool event_publishFromISR(event_type_t type, const void* payload, size_t payload_size);
```
### 3.2 Event Subscription Interface
```c
/**
* @brief Subscribe to an event type
* @param type Event type to subscribe to
* @param handler Callback function for event handling
* @param priority Subscriber priority (higher values processed first)
* @return true if subscribed successfully, false on error
*/
bool event_subscribe(event_type_t type, event_handler_t handler, uint8_t priority);
/**
* @brief Subscribe with filter criteria
* @param type Event type to subscribe to
* @param handler Callback function
* @param filter Filter function (NULL for no filtering)
* @param priority Subscriber priority
* @return true if subscribed successfully, false on error
*/
bool event_subscribeWithFilter(event_type_t type, event_handler_t handler, event_filter_t filter, uint8_t priority);
/**
* @brief Unsubscribe from an event type
* @param type Event type to unsubscribe from
* @param handler Callback function to remove
* @return true if unsubscribed successfully, false if not found
*/
bool event_unsubscribe(event_type_t type, event_handler_t handler);
/**
* @brief Unsubscribe from all event types
* @param handler Callback function to remove from all subscriptions
* @return Number of subscriptions removed
*/
size_t event_unsubscribeAll(event_handler_t handler);
```
### 3.3 Event Queue Management Interface
```c
/**
* @brief Get number of pending events
* @param type Event type (EVENT_TYPE_ALL for all types)
* @return Number of pending events
*/
size_t event_getPendingCount(event_type_t type);
/**
* @brief Clear pending events
* @param type Event type (EVENT_TYPE_ALL for all types)
* @return Number of events cleared
*/
size_t event_clearPending(event_type_t type);
/**
* @brief Get event queue statistics
* @param stats Output buffer for statistics
* @return true if statistics retrieved successfully
*/
bool event_getQueueStatistics(event_queue_stats_t* stats);
/**
* @brief Reset event queue statistics
* @return true if statistics reset successfully
*/
bool event_resetStatistics(void);
```
### 3.4 System Control Interface
```c
/**
* @brief Initialize Event System
* @return true if initialization successful, false otherwise
*/
bool event_initialize(void);
/**
* @brief Shutdown Event System
* @return true if shutdown successful, false otherwise
*/
bool event_shutdown(void);
/**
* @brief Process pending events (call from event task)
* @param max_events Maximum number of events to process
* @return Number of events processed
*/
size_t event_processPending(size_t max_events);
/**
* @brief Enable/disable event processing
* @param enabled true to enable, false to disable
* @return Previous enabled state
*/
bool event_setProcessingEnabled(bool enabled);
```
## 4. Required Interfaces
### 4.1 Time Utils Interface
- **Interface:** Timestamp generation interface
- **Provider:** Time Utils component
- **Usage:** Generate timestamps for events when not provided
- **Data Types:** `uint64_t` timestamp in milliseconds
### 4.2 Logger Interface
- **Interface:** Logging interface
- **Provider:** Logger component
- **Usage:** Log event system diagnostics and errors
- **Data Types:** Log level, message strings
### 4.3 RTOS Interface
- **Interface:** Task synchronization interface
- **Provider:** OSAL layer
- **Usage:** Mutex for subscription management, queues for event delivery
- **Data Types:** Mutex handles, queue handles
## 5. External Interfaces
### 5.1 All System Components Interface
- **Interface:** Event publishing and subscription
- **Consumers:** All system components
- **Usage:** Cross-component communication
- **Protocol:** Function calls with event data structures
## 6. Internal Interfaces
### 6.1 Event Queue Manager Interface
- **Interface:** Internal queue management
- **Usage:** Queue operations, overflow handling
- **Implementation:** Private to Event System
### 6.2 Subscriber Manager Interface
- **Interface:** Internal subscription management
- **Usage:** Maintain subscriber lists, priority ordering
- **Implementation:** Private to Event System
## 7. Static View
### 7.1 Component Structure
```mermaid
graph TB
subgraph EventSystem["Event System"]
Publisher[Event Publisher]
SubscriberMgr[Subscriber Manager]
QueueMgr[Event Queue Manager]
EventProcessor[Event Processor]
FilterEngine[Filter Engine]
end
subgraph Storage["Internal Storage"]
EventQueue[Event Queue
Lock-Free Ring Buffer]
SubscriberLists[Subscriber Lists
Per Event Type]
Statistics[Queue Statistics]
end
subgraph External["External Components"]
Components[System Components]
TimeUtils[Time Utils]
Logger[Logger]
RTOS[RTOS/OSAL]
end
Publisher --> QueueMgr
QueueMgr --> EventQueue
SubscriberMgr --> SubscriberLists
EventProcessor --> QueueMgr
EventProcessor --> SubscriberMgr
EventProcessor --> FilterEngine
Components --> Publisher
Components --> SubscriberMgr
Publisher --> TimeUtils
EventProcessor --> Logger
QueueMgr --> RTOS
```
### 7.2 Event Flow Architecture
```mermaid
graph LR
subgraph Publishers["Event Publishers"]
SensorMgr[Sensor Manager]
STM[State Manager]
CommMgr[Communication Manager]
OTAMgr[OTA Manager]
end
subgraph EventSystem["Event System"]
EventBus[Event Bus
Publish/Subscribe]
end
subgraph Subscribers["Event Subscribers"]
DataPool[Data Pool]
Persistence[Persistence]
Diagnostics[Diagnostics]
HMI[HMI]
MainHubAPI[Main Hub APIs]
end
SensorMgr --> EventBus
STM --> EventBus
CommMgr --> EventBus
OTAMgr --> EventBus
EventBus --> DataPool
EventBus --> Persistence
EventBus --> Diagnostics
EventBus --> HMI
EventBus --> MainHubAPI
```
## 8. Dynamic View
### 8.1 Event Publishing and Delivery Sequence
```mermaid
sequenceDiagram
participant Publisher as Publishing Component
participant EventSys as Event System
participant QueueMgr as Queue Manager
participant EventProc as Event Processor
participant Subscriber1 as Subscriber 1
participant Subscriber2 as Subscriber 2
Publisher->>EventSys: event_publish(type, payload, size)
EventSys->>QueueMgr: enqueue(event)
QueueMgr->>QueueMgr: add_to_ring_buffer()
EventSys-->>Publisher: true (success)
Note over EventProc: Event Processing Task
EventProc->>QueueMgr: dequeue_next_event()
QueueMgr-->>EventProc: event
EventProc->>EventProc: get_subscribers(event.type)
par Parallel Delivery
EventProc->>Subscriber1: handler(type, payload, size, timestamp)
Subscriber1-->>EventProc: (callback complete)
and
EventProc->>Subscriber2: handler(type, payload, size, timestamp)
Subscriber2-->>EventProc: (callback complete)
end
EventProc->>EventProc: update_statistics()
```
### 8.2 Subscription Management Sequence
```mermaid
sequenceDiagram
participant Component as Component
participant EventSys as Event System
participant SubMgr as Subscriber Manager
participant SubList as Subscriber List
Component->>EventSys: event_subscribe(type, handler, priority)
EventSys->>SubMgr: add_subscriber(type, handler, priority)
SubMgr->>SubList: insert_by_priority(handler, priority)
SubList-->>SubMgr: success
SubMgr-->>EventSys: success
EventSys-->>Component: true
Note over Component,SubList: Later: Unsubscribe
Component->>EventSys: event_unsubscribe(type, handler)
EventSys->>SubMgr: remove_subscriber(type, handler)
SubMgr->>SubList: find_and_remove(handler)
SubList-->>SubMgr: success
SubMgr-->>EventSys: success
EventSys-->>Component: true
```
### 8.3 Queue Overflow Handling
```mermaid
sequenceDiagram
participant Publisher as Publisher
participant EventSys as Event System
participant QueueMgr as Queue Manager
participant Logger as Logger
Publisher->>EventSys: event_publish(type, payload, size)
EventSys->>QueueMgr: enqueue(event)
QueueMgr->>QueueMgr: check_queue_full()
alt Queue Full
QueueMgr->>QueueMgr: drop_oldest_event()
QueueMgr->>Logger: log_warning("Event queue full, dropping oldest")
QueueMgr->>QueueMgr: add_new_event()
QueueMgr-->>EventSys: true (with warning)
else Queue Available
QueueMgr->>QueueMgr: add_new_event()
QueueMgr-->>EventSys: true
end
EventSys-->>Publisher: result
```
## 9. Interface Definitions
### 9.1 Data Types
```c
// Event Types
typedef enum {
EVENT_SENSOR_DATA_UPDATE = 0,
EVENT_DIAGNOSTIC_EVENT,
EVENT_STATE_CHANGED,
EVENT_OTA_REQUEST,
EVENT_OTA_STATUS,
EVENT_MC_UPDATE_REQUEST,
EVENT_COMMUNICATION_LINK_STATUS,
EVENT_STORAGE_STATUS,
EVENT_SYSTEM_HEALTH_UPDATE,
EVENT_TEARDOWN_INITIATED,
EVENT_TEARDOWN_COMPLETE,
EVENT_SENSOR_FAULT_DETECTED,
EVENT_SENSOR_STATE_CHANGED,
EVENT_TYPE_ALL = 0xFF,
EVENT_TYPE_COUNT
} event_type_t;
// Event Structure
typedef struct {
event_type_t type;
uint64_t timestamp;
size_t payload_size;
uint8_t payload[]; // Variable-length payload
} event_t;
// Event Handler Callback
typedef void (*event_handler_t)(event_type_t type, const void* payload, size_t payload_size, uint64_t timestamp);
// Event Filter Callback
typedef bool (*event_filter_t)(event_type_t type, const void* payload, size_t payload_size);
// Subscriber Information
typedef struct {
event_handler_t handler;
event_filter_t filter;
uint8_t priority;
uint32_t call_count;
uint32_t last_call_time;
} subscriber_info_t;
// Queue Statistics
typedef struct {
size_t total_events_published;
size_t total_events_processed;
size_t total_events_dropped;
size_t current_queue_size;
size_t max_queue_size;
size_t queue_overflows;
uint32_t avg_processing_time_us;
uint32_t max_processing_time_us;
uint32_t total_subscribers;
} event_queue_stats_t;
// Event Priorities
typedef enum {
EVENT_PRIORITY_LOW = 0,
EVENT_PRIORITY_NORMAL = 50,
EVENT_PRIORITY_HIGH = 100,
EVENT_PRIORITY_CRITICAL = 200
} event_priority_t;
```
### 9.2 Configuration Constants
```c
// Queue Configuration
#define EVENT_QUEUE_SIZE 100 // Maximum events in queue
#define EVENT_MAX_PAYLOAD_SIZE 256 // Maximum payload size in bytes
#define EVENT_MAX_SUBSCRIBERS 10 // Maximum subscribers per event type
#define EVENT_PROCESSING_BATCH_SIZE 5 // Events processed per batch
// Timing Configuration
#define EVENT_PROCESSING_TIMEOUT_MS 10 // Maximum time for event processing
#define EVENT_HANDLER_TIMEOUT_MS 5 // Maximum time for single handler
// Memory Configuration
#define EVENT_BUFFER_POOL_SIZE (EVENT_QUEUE_SIZE * (sizeof(event_t) + EVENT_MAX_PAYLOAD_SIZE))
```
### 9.3 Error Codes
```c
typedef enum {
EVENT_SUCCESS = 0,
EVENT_ERR_INVALID_PARAMETER,
EVENT_ERR_QUEUE_FULL,
EVENT_ERR_PAYLOAD_TOO_LARGE,
EVENT_ERR_SUBSCRIBER_FULL,
EVENT_ERR_SUBSCRIBER_NOT_FOUND,
EVENT_ERR_MEMORY_ALLOCATION,
EVENT_ERR_SYSTEM_NOT_INITIALIZED,
EVENT_ERR_PROCESSING_TIMEOUT
} event_error_t;
```
## 10. Assumptions and Constraints
### 10.1 Assumptions
- **Event Handlers are Fast:** Event handlers complete within 5ms
- **Memory Availability:** Sufficient memory for event queue and subscriber lists
- **RTOS Availability:** RTOS primitives (mutex, queues) are available
- **Component Cooperation:** Components properly unsubscribe during shutdown
### 10.2 Constraints
- **Non-Blocking Publishing:** Event publishing must never block
- **Memory Limits:** Total memory usage limited to 16KB
- **Queue Size:** Maximum 100 events in queue at any time
- **Payload Size:** Maximum 256 bytes per event payload
- **Subscriber Limit:** Maximum 10 subscribers per event type
### 10.3 Design Constraints
- **No Dynamic Memory:** Use pre-allocated memory pools
- **Thread Safety:** All operations must be thread-safe
- **ISR Safety:** Publishing from ISR context must be supported
- **State Independence:** Event System operates in all system states
## 11. Traceability
### 11.1 Software Requirements
- **SWR-DESIGN-006:** Event System for cross-component communication
- **SWR-DAQ-014:** Publish sensor data updates via Event System
- **SWR-SYS-004:** Notify components of state transitions via Event System
### 11.2 Features
- **F-SYS-01:** System State Management (state change notifications)
- **F-DAQ-01:** Multi-Sensor Data Acquisition (sensor data events)
- **F-DIAG-01:** Diagnostic Code Management (diagnostic events)
### 11.3 Cross-Feature Constraints
- **CFC-TIME-01:** Non-blocking operation
- **CFC-ARCH-02:** State-aware execution (operates in all states)
### 11.4 Architecture Requirements
- **Event-Driven Architecture:** Primary mechanism for component decoupling
- **Asynchronous Communication:** Enables non-blocking inter-component communication
---
**Document Status:** Final for Implementation
**Dependencies:** Time Utils, Logger, OSAL
**Next Review:** After component implementation and performance testing