Dawn Framework 1.0
Universal data acquisition framework for embedded systems
test_toggle.cxx
1// dawn/tests/prog/test_toggle.cxx
2//
3// SPDX-License-Identifier: Apache-2.0
4//
5
6#include "dawn/prog/toggle.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 TOGGLE_SRC = CIOVirt::objectId(SObjectId::DTYPE_UINT32, false, 70);
15static constexpr auto TOGGLE_DST = CIOVirt::objectId(SObjectId::DTYPE_UINT32, false, 71);
16
17static uint32_t g_cfg_src[] = {TOGGLE_SRC, 0};
18static uint32_t g_cfg_dst[] = {TOGGLE_DST, 0};
19
20static uint32_t g_bin_toggle[] = {
21 CProgToggle::objectId(0),
22 2,
23 CProgToggle::cfgIdIOBind(2),
24 TOGGLE_SRC,
25 TOGGLE_DST,
26 CProgToggle::cfgIdValues(),
27 0, // off value
28 1, // on value
29};
30
31static void test_toggle_rising_edge()
32{
33 CDescObject srcDesc(g_cfg_src);
34 CIOVirt src(srcDesc);
35 CDescObject dstDesc(g_cfg_dst);
36 CIOVirt dst(dstDesc);
37 CDescObject progDesc(g_bin_toggle);
38 CProgToggle prog(progDesc);
39
42
43 TEST_ASSERT_EQUAL(OK, src.init());
44 TEST_ASSERT_EQUAL(OK, dst.init());
45 TEST_ASSERT_EQUAL(OK, src.initialize(1, 1, true));
46
47 TEST_ASSERT_EQUAL(OK, prog.configure());
48 prog.setObjectMapItem(TOGGLE_SRC, &src);
49 prog.setObjectMapItem(TOGGLE_DST, &dst);
50 TEST_ASSERT_EQUAL(OK, prog.init());
51 TEST_ASSERT_EQUAL(OK, prog.start());
52
53 // First rising edge: 0→1, output should go from off(0) to on(1)
54 in(0) = 1;
55 TEST_ASSERT_EQUAL(OK, src.setData(in));
56 TEST_ASSERT_EQUAL(OK, dst.getData(out, 1));
57 TEST_ASSERT_EQUAL(1, out(0));
58
59 // Falling edge: 1→0, no toggle
60 in(0) = 0;
61 TEST_ASSERT_EQUAL(OK, src.setData(in));
62 TEST_ASSERT_EQUAL(OK, dst.getData(out, 1));
63 TEST_ASSERT_EQUAL(1, out(0));
64
65 // Second rising edge: 0→1, toggle back to off(0)
66 in(0) = 1;
67 TEST_ASSERT_EQUAL(OK, src.setData(in));
68 TEST_ASSERT_EQUAL(OK, dst.getData(out, 1));
69 TEST_ASSERT_EQUAL(0, out(0));
70
71 // Third rising edge: back to on
72 in(0) = 1; // note: still 1 from previous, need 0→1 edge
73 TEST_ASSERT_EQUAL(OK, src.setData(in));
74 TEST_ASSERT_EQUAL(OK, dst.getData(out, 1));
75 TEST_ASSERT_EQUAL(0, out(0)); // no edge, stays at 0
76
77 in(0) = 0;
78 TEST_ASSERT_EQUAL(OK, src.setData(in));
79 in(0) = 1;
80 TEST_ASSERT_EQUAL(OK, src.setData(in));
81 TEST_ASSERT_EQUAL(OK, dst.getData(out, 1));
82 TEST_ASSERT_EQUAL(1, out(0));
83
84 TEST_ASSERT_EQUAL(OK, prog.stop());
85}
86
87static void test_toggle_reset()
88{
89 CDescObject srcDesc(g_cfg_src);
90 CIOVirt src(srcDesc);
91 CDescObject dstDesc(g_cfg_dst);
92 CIOVirt dst(dstDesc);
93 CDescObject progDesc(g_bin_toggle);
94 CProgToggle prog(progDesc);
95
98
99 TEST_ASSERT_EQUAL(OK, src.init());
100 TEST_ASSERT_EQUAL(OK, dst.init());
101 TEST_ASSERT_EQUAL(OK, src.initialize(1, 1, true));
102 TEST_ASSERT_EQUAL(OK, prog.configure());
103 prog.setObjectMapItem(TOGGLE_SRC, &src);
104 prog.setObjectMapItem(TOGGLE_DST, &dst);
105 TEST_ASSERT_EQUAL(OK, prog.init());
106 TEST_ASSERT_EQUAL(OK, prog.start());
107
108 // Toggle on
109 in(0) = 1;
110 TEST_ASSERT_EQUAL(OK, src.setData(in));
111 TEST_ASSERT_EQUAL(OK, dst.getData(out, 1));
112 TEST_ASSERT_EQUAL(1, out(0));
113
114 // Reset back to off
115 TEST_ASSERT_EQUAL(OK, prog.trigger(CObject::CMD_RESET));
116 TEST_ASSERT_EQUAL(OK, dst.getData(out, 1));
117 // After reset, toggle state is off. But getData returns whatever is
118 // in the CIOVirt (the last written value). Reset just resets the
119 // internal toggle state, it doesn't re-write the virtIO.
120 // Next rising edge should go to on.
121 in(0) = 0;
122 TEST_ASSERT_EQUAL(OK, src.setData(in));
123 in(0) = 1;
124 TEST_ASSERT_EQUAL(OK, src.setData(in));
125 TEST_ASSERT_EQUAL(OK, dst.getData(out, 1));
126 TEST_ASSERT_EQUAL(1, out(0));
127
128 TEST_ASSERT_EQUAL(OK, prog.stop());
129}
130
131extern "C"
132{
133 int test_prog_toggle()
134 {
135 UNITY_BEGIN();
136 DAWN_RUN_TEST(test_toggle_rising_edge);
137 DAWN_RUN_TEST(test_toggle_reset);
138 return UNITY_END();
139 }
140}
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
Toggle/latch: flips output between two configured values on each rising edge of the input.
Definition toggle.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