-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathring_buffer_example.c
More file actions
111 lines (90 loc) · 3.72 KB
/
Copy pathring_buffer_example.c
File metadata and controls
111 lines (90 loc) · 3.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/**
* @file ring_buffer_example.c
* @brief Real-world example: Ring buffer for sensor data streaming
*
* Demonstrates v1.0.0 features:
* - Fixed-size circular buffer (zero heap allocation)
* - Producer-consumer pattern
* - Embedded systems use case
*/
#define NANODS_IMPLEMENTATION
#include "../nanods.h"
#include <stdio.h>
typedef struct {
int sensor_id;
float temperature;
float humidity;
int timestamp;
} SensorReading;
NANODS_DEFINE_RING(SensorReading, 16)
void producer(NanoRing_SensorReading_16* ring, int count) {
printf("Producer: Writing %d sensor readings...\n", count);
for (int i = 0; i < count; i++) {
SensorReading reading = {
.sensor_id = i % 3,
.temperature = 20.0f + (i % 10),
.humidity = 50.0f + (i % 20),
.timestamp = 1000 + i
};
if (nr_is_full_SensorReading_16(ring)) {
printf(" [WARNING] Buffer full, overwriting oldest data!\n");
SensorReading old;
nr_read_SensorReading_16(ring, &old);
}
nr_write_SensorReading_16(ring, reading);
printf(" Written: Sensor %d @ T=%d\n", reading.sensor_id, reading.timestamp);
}
printf("\n");
}
void consumer(NanoRing_SensorReading_16* ring) {
printf("Consumer: Reading sensor data...\n");
printf("─────────────────────────────────────────────\n");
int count = 0;
while (! nr_is_empty_SensorReading_16(ring)) {
SensorReading reading;
nr_read_SensorReading_16(ring, &reading);
printf("Sensor %d: %.1f°C, %.1f%% @ T=%d\n",
reading.sensor_id,
reading.temperature,
reading.humidity,
reading.timestamp);
count++;
}
printf("─────���───────────────────────────────────────\n");
printf("Total readings processed: %d\n\n", count);
}
int main(void) {
printf("==============================================\n");
printf(" Ring Buffer Example (NanoDS v%s)\n", NANODS_VERSION);
printf("==============================================\n\n");
nanods_seed_init(0);
/* Create ring buffer (16 elements, stack-allocated) */
NanoRing_SensorReading_16 ring;
nr_init_SensorReading_16(&ring);
printf("Ring Buffer Info:\n");
printf(" Capacity: %zu readings\n", nr_capacity_SensorReading_16(&ring));
printf(" Size: %zu readings\n", nr_size_SensorReading_16(&ring));
printf(" Memory: Stack-allocated (zero heap)\n");
printf(" Use case: Real-time sensor data streaming\n\n");
/* Simulate producer-consumer */
producer(&ring, 10);
printf("Buffer state after production:\n");
printf(" Size: %zu / %zu\n",
nr_size_SensorReading_16(&ring),
nr_capacity_SensorReading_16(&ring));
printf(" Full: %s\n", nr_is_full_SensorReading_16(&ring) ? "Yes" : "No");
printf(" Empty: %s\n\n", nr_is_empty_SensorReading_16(&ring) ? "Yes" : "No");
consumer(&ring);
/* Test wraparound */
printf("Testing wraparound (writing 20 items to 16-slot buffer)...\n");
producer(&ring, 20);
consumer(&ring);
printf("==============================================\n");
printf("Ring buffers are perfect for:\n");
printf(" ✓ Real-time audio/video streaming\n");
printf(" ✓ Embedded systems (no malloc)\n");
printf(" ✓ Producer-consumer queues\n");
printf(" ✓ Fixed-size history buffers\n");
printf("==============================================\n");
return 0;
}