ether2ser 0.1.0
Ethernet <-> synchronous V.24 bridge firmware for RP2040 + W5500
Loading...
Searching...
No Matches
event_queue.c
Go to the documentation of this file.
1/*
2 * ether2ser — Ethernet <-> synchronous V.24 (RS-232/V.28) bridge
3 *
4 * File: src/system/event_queue.c
5 * Purpose: Opaque event queue storage and operations.
6 *
7 * SPDX-License-Identifier: Apache-2.0
8 *
9 * Copyright (c) 2026 Florian <f.leuze@outlook.de>
10 */
11
12// Related headers
13#include "event_queue.h"
14
15// Standard library headers
16#include <stdbool.h>
17#include <stdint.h>
18#include <string.h>
19
20// Project Headers
21
22// Generated headers
23
24// Event queue storage (opaque payload pointers)
26static uint8_t event_queue_write = 0;
27static uint8_t event_queue_read = 0;
28static uint8_t event_queue_high_water_mark = 0;
29static uint32_t event_queue_push_drops = 0;
30
31static uint8_t event_queue_count_internal(void)
32{
34 {
35 return (uint8_t)(event_queue_write - event_queue_read);
36 }
38}
39
41{
42 memset(event_queue, 0, sizeof(event_queue));
47}
48
49bool event_queue_push(const event_t* event_entry)
50{
51 uint8_t next_write = (uint8_t)((event_queue_write + 1) % EVENT_QUEUE_CAPACITY);
52 if (next_write == event_queue_read)
53 {
55 return false; // full
56 }
57 event_queue[event_queue_write] = *event_entry;
58 event_queue_write = next_write;
59 uint8_t current_count = event_queue_count_internal();
60 if (current_count > event_queue_high_water_mark)
61 {
62 event_queue_high_water_mark = current_count;
63 }
64 return true;
65}
66
67bool event_queue_pop(event_t* event_out)
68{
70 {
71 return false; // empty
72 }
73 *event_out = event_queue[event_queue_read];
75 return true;
76}
77
82
84{
85 uint8_t next_write = (uint8_t)((event_queue_write + 1) % EVENT_QUEUE_CAPACITY);
86 return next_write == event_queue_read;
87}
88
90{
91 return (size_t)event_queue_count_internal();
92}
93
95{
96 return (size_t)event_queue_high_water_mark;
97}
98
100{
102}
103
104bool event_get_payload_ptr(const event_t* event, size_t required_size, const void** out)
105{
106 if (!event || !out || required_size == 0)
107 {
108 return false;
109 }
110
111 if (event->is_inline)
112 {
113 if (event->data_len < required_size)
114 {
115 return false;
116 }
117 *out = (const void*)event->data.bytes;
118 return true;
119 }
120
121 if (!event->data.ptr || event->data_len < required_size)
122 {
123 return false;
124 }
125
126 *out = event->data.ptr;
127 return true;
128}
static event_t event_queue[EVENT_QUEUE_CAPACITY]
Definition event_queue.c:25
bool event_queue_is_empty(void)
Check whether the queue is empty.
Definition event_queue.c:78
bool event_queue_push(const event_t *event_entry)
Enqueue an event.
Definition event_queue.c:49
static uint8_t event_queue_write
Definition event_queue.c:26
bool event_queue_is_full(void)
Check whether the queue is full.
Definition event_queue.c:83
bool event_get_payload_ptr(const event_t *event, size_t required_size, const void **out)
Resolve payload pointer and validate minimum payload size.
static uint8_t event_queue_high_water_mark
Definition event_queue.c:28
uint32_t event_queue_get_push_drop_count(void)
Get cumulative number of dropped push attempts.
Definition event_queue.c:99
void event_queue_init(void)
Initialize the event queue storage.
Definition event_queue.c:40
static uint8_t event_queue_count_internal(void)
Definition event_queue.c:31
bool event_queue_pop(event_t *event_out)
Dequeue an event.
Definition event_queue.c:67
static uint32_t event_queue_push_drops
Definition event_queue.c:29
size_t event_queue_get_count(void)
Get current number of queued events.
Definition event_queue.c:89
static uint8_t event_queue_read
Definition event_queue.c:27
size_t event_queue_get_high_water_mark(void)
Get peak queue fill count observed since init.
Definition event_queue.c:94
#define EVENT_QUEUE_CAPACITY
Maximum number of event slots in queue storage.
Definition event_queue.h:29
Event queue entry.
Definition event_queue.h:91
size_t data_len
Definition event_queue.h:95
union event_t::@1 data
const void * ptr
Definition event_queue.h:99
uint8_t bytes[16]
bool is_inline