Dawn Framework 1.0
Universal data acquisition framework for embedded systems
test_counter.cxx
1// dawn/tests/prog/test_counter.cxx
2//
3// SPDX-License-Identifier: Apache-2.0
4//
5
6#include "dawn/prog/counter.hxx"
7#include "test_common.hxx"
8
9#include "dawn/io/sdata.hxx"
10#include "dawn/io/virt.hxx"
11
12using namespace dawn;
13
14static constexpr auto CTR_SRC = CIOVirt::objectId(SObjectId::DTYPE_UINT32, false, 80);
15static constexpr auto CTR_DST = CIOVirt::objectId(SObjectId::DTYPE_UINT32, false, 81);
16
17static uint32_t g_cfg_src[] = {CTR_SRC, 0};
18static uint32_t g_cfg_dst[] = {CTR_DST, 0};
19
20// Counter with min=0, max=3, step=1
21static uint32_t g_bin_counter[] = {
22 CProgCounter::objectId(0),
23 2,
24 CProgCounter::cfgIdIOBind(2),
25 CTR_SRC,
26 CTR_DST,
27 CProgCounter::cfgIdParams(),
28 0, // min
29 3, // max
30 1, // step
31 0, // initial (not used, taken from min)
32};
33
34static void test_counter_increment()
35{
36 CDescObject srcDesc(g_cfg_src);
37 CIOVirt src(srcDesc);
38 CDescObject dstDesc(g_cfg_dst);
39 CIOVirt dst(dstDesc);
40 CDescObject progDesc(g_bin_counter);
41 CProgCounter prog(progDesc);
42
45
46 TEST_ASSERT_EQUAL(OK, src.init());
47 TEST_ASSERT_EQUAL(OK, dst.init());
48 TEST_ASSERT_EQUAL(OK, src.initialize(1, 1, true));
49 TEST_ASSERT_EQUAL(OK, prog.configure());
50 prog.setObjectMapItem(CTR_SRC, &src);
51 prog.setObjectMapItem(CTR_DST, &dst);
52 TEST_ASSERT_EQUAL(OK, prog.init());
53 TEST_ASSERT_EQUAL(OK, prog.start());
54
55 // first edge: 0→1
56 in(0) = 1;
57 TEST_ASSERT_EQUAL(OK, src.setData(in));
58 TEST_ASSERT_EQUAL(OK, dst.getData(out, 1));
59 TEST_ASSERT_EQUAL(1, out(0));
60
61 // second edge
62 in(0) = 0;
63 TEST_ASSERT_EQUAL(OK, src.setData(in));
64 in(0) = 1;
65 TEST_ASSERT_EQUAL(OK, src.setData(in));
66 TEST_ASSERT_EQUAL(OK, dst.getData(out, 1));
67 TEST_ASSERT_EQUAL(2, out(0));
68
69 // third → 3
70 in(0) = 0;
71 TEST_ASSERT_EQUAL(OK, src.setData(in));
72 in(0) = 1;
73 TEST_ASSERT_EQUAL(OK, src.setData(in));
74 TEST_ASSERT_EQUAL(OK, dst.getData(out, 1));
75 TEST_ASSERT_EQUAL(3, out(0));
76
77 // fourth → wrap to 0
78 in(0) = 0;
79 TEST_ASSERT_EQUAL(OK, src.setData(in));
80 in(0) = 1;
81 TEST_ASSERT_EQUAL(OK, src.setData(in));
82 TEST_ASSERT_EQUAL(OK, dst.getData(out, 1));
83 TEST_ASSERT_EQUAL(0, out(0));
84
85 TEST_ASSERT_EQUAL(OK, prog.stop());
86}
87
88static void test_counter_no_edge_on_high()
89{
90 CDescObject srcDesc(g_cfg_src);
91 CIOVirt src(srcDesc);
92 CDescObject dstDesc(g_cfg_dst);
93 CIOVirt dst(dstDesc);
94 CDescObject progDesc(g_bin_counter);
95 CProgCounter prog(progDesc);
96
99
100 TEST_ASSERT_EQUAL(OK, src.init());
101 TEST_ASSERT_EQUAL(OK, dst.init());
102 TEST_ASSERT_EQUAL(OK, src.initialize(1, 1, true));
103 TEST_ASSERT_EQUAL(OK, prog.configure());
104 prog.setObjectMapItem(CTR_SRC, &src);
105 prog.setObjectMapItem(CTR_DST, &dst);
106 TEST_ASSERT_EQUAL(OK, prog.init());
107 TEST_ASSERT_EQUAL(OK, prog.start());
108
109 // Sending 1 twice without falling edge doesn't increment
110 in(0) = 1;
111 TEST_ASSERT_EQUAL(OK, src.setData(in));
112 in(0) = 1;
113 TEST_ASSERT_EQUAL(OK, src.setData(in));
114 TEST_ASSERT_EQUAL(OK, dst.getData(out, 1));
115 TEST_ASSERT_EQUAL(1, out(0)); // only one increment
116
117 TEST_ASSERT_EQUAL(OK, prog.stop());
118}
119
120static void test_counter_reset()
121{
122 CDescObject srcDesc(g_cfg_src);
123 CIOVirt src(srcDesc);
124 CDescObject dstDesc(g_cfg_dst);
125 CIOVirt dst(dstDesc);
126 CDescObject progDesc(g_bin_counter);
127 CProgCounter prog(progDesc);
128
131
132 TEST_ASSERT_EQUAL(OK, src.init());
133 TEST_ASSERT_EQUAL(OK, dst.init());
134 TEST_ASSERT_EQUAL(OK, src.initialize(1, 1, true));
135 TEST_ASSERT_EQUAL(OK, prog.configure());
136 prog.setObjectMapItem(CTR_SRC, &src);
137 prog.setObjectMapItem(CTR_DST, &dst);
138 TEST_ASSERT_EQUAL(OK, prog.init());
139 TEST_ASSERT_EQUAL(OK, prog.start());
140
141 // count to 2
142 in(0) = 1;
143 TEST_ASSERT_EQUAL(OK, src.setData(in));
144 in(0) = 0;
145 TEST_ASSERT_EQUAL(OK, src.setData(in));
146 in(0) = 1;
147 TEST_ASSERT_EQUAL(OK, src.setData(in));
148
149 // reset
150 TEST_ASSERT_EQUAL(OK, prog.trigger(CObject::CMD_RESET));
151
152 // Verify count was reset by checking the next edge.
153 // After reset, count=min, prevInput=0. Next 0→1 edge
154 // increments to min+step = 1.
155 in(0) = 0;
156 TEST_ASSERT_EQUAL(OK, src.setData(in));
157 in(0) = 1;
158 TEST_ASSERT_EQUAL(OK, src.setData(in));
159 TEST_ASSERT_EQUAL(OK, dst.getData(out, 1));
160 TEST_ASSERT_EQUAL(1, out(0));
161
162 TEST_ASSERT_EQUAL(OK, prog.stop());
163}
164
165extern "C"
166{
167 int test_prog_counter()
168 {
169 UNITY_BEGIN();
170 DAWN_RUN_TEST(test_counter_increment);
171 DAWN_RUN_TEST(test_counter_no_edge_on_high);
172 DAWN_RUN_TEST(test_counter_reset);
173 return UNITY_END();
174 }
175}
Descriptor wrapper for individual object configuration.
Virtual I/O type for user-provided data and callbacks.
Definition virt.hxx:26
@ CMD_RESET
Reset object internal state.
Definition object.hxx:42
Event counter with configurable wrap-around.
Definition counter.hxx:31
Out-of-tree user-extension hooks for Dawn.
Definition bindable.hxx:13
@ DTYPE_UINT32
Unsigned 32-bit integer (0 to 4294967295).
Definition objectid.hxx:96
Static (compile-time) I/O data buffer (no timestamp).
Definition sdata.hxx:39