Dawn Framework 1.0
Universal data acquisition framework for embedded systems
dummy.cxx
1// dawn/src/io/dummy.cxx
2//
3// SPDX-License-Identifier: Apache-2.0
4//
5
6#include <cstring>
7#include <errno.h>
8#include <inttypes.h>
9#include <new>
10
11#include "dawn/io/dummy.hxx"
12
13using namespace dawn;
14
15static size_t dummyInitvalWordsPerValue(size_t tlen)
16{
17 if (tlen == sizeof(uint64_t))
18 {
19 return 2;
20 }
21
22 return 1;
23}
24
25int CIODummy::configureDesc(const CDescObject &desc)
26{
27 const SObjectCfg::SObjectCfgItem *item = nullptr;
28 size_t parsed_dim = 1;
29 bool parsed_dim_set = false;
30 size_t parsed_init_len = 1;
31 size_t offset = 0;
32 size_t i = 0;
33
34 for (i = 0; i < desc.getSize(); i++)
35 {
36 item = desc.objectCfgItemAtOffset(offset);
37
39 {
40 offset += cfgCmnOffset(item);
41 continue;
42 }
43
45 {
46 DAWNERR("unsupported dummy cfg 0x08%" PRIx32 "\n", item->cfgid.v);
47 return -EINVAL;
48 }
49
50 switch (item->cfgid.s.id)
51 {
52 case IO_DUMMY_CFG_INITVAL:
53 {
54 size_t word_count = item->cfgid.s.size;
55 size_t word_step = dummyInitvalWordsPerValue(getDtypeSize());
56 size_t init_len;
57
58 if (word_count == 0)
59 {
60 DAWNERR("Dummy IO init value dimension must be > 0\n");
61 return -EINVAL;
62 }
63
64 if (word_count % word_step != 0)
65 {
66 DAWNERR("Dummy IO init value word count %zu is invalid "
67 "for element size %zu\n",
68 word_count,
69 getDtypeSize());
70 return -EINVAL;
71 }
72
73 init_len = word_count / word_step;
74 cfgval = &item->data[0];
75 parsed_init_len = init_len;
76
77 offset += 1 + word_count;
78 break;
79 }
80
81 case IO_DUMMY_CFG_DIM:
82 {
83 uint32_t dim = item->data[0];
84
85 if (dim == 0)
86 {
87 DAWNERR("Dummy IO dimension must be > 0\n");
88 return -EINVAL;
89 }
90
91 parsed_dim = dim;
92 parsed_dim_set = true;
93 offset += 1 + item->cfgid.s.size;
94 break;
95 }
96
97 default:
98 {
99 DAWNERR("unsupported dummy objectCfg 0x%" PRIx32 "\n", item->cfgid.v);
100 return -EINVAL;
101 }
102 }
103 }
104
105 if (!parsed_dim_set && cfgval != nullptr)
106 {
107 parsed_dim = parsed_init_len;
108 }
109
110 if (cfgval != nullptr && parsed_init_len < parsed_dim)
111 {
112 DAWNERR("Dummy IO init value dimension %zu is smaller than data "
113 "dimension %zu\n",
114 parsed_init_len,
115 parsed_dim);
116 return -EINVAL;
117 }
118
119 dlen = parsed_dim;
120 cfglen = parsed_init_len;
121
122 return OK;
123}
124
125int CIODummy::setVal(const void *v, size_t d)
126{
127 DAWNASSERT(dlen * tlen == d, "invalid input");
128 DAWNASSERT(val != nullptr, "buffer not initialized");
129
130 mutex.lock();
131
132 std::memcpy(val, v, d);
133
134#ifdef CONFIG_DAWN_IO_TIMESTAMP
135 if (isTimestamp())
136 {
137 ts = getTimestamp();
138 }
139#endif
140
141 mutex.unlock();
142
143 return OK;
144}
145
146int CIODummy::applyInitval()
147{
148 size_t i = 0;
149 size_t word_step;
150
151 if (cfgval == nullptr)
152 {
153 return OK;
154 }
155
156 DAWNASSERT(val != nullptr, "buffer not initialized");
157
158 word_step = dummyInitvalWordsPerValue(tlen);
159
160 for (i = 0; i < dlen; i++)
161 {
162 std::memcpy(static_cast<uint8_t *>(val) + (i * tlen), &cfgval[i * word_step], tlen);
163 }
164
165 return OK;
166}
167
168CIODummy::~CIODummy()
169{
170 deinit();
171}
172
174{
175 dlen = 1;
176 cfglen = 1;
177 cfgval = nullptr;
178
179 return configureDesc(getDesc());
180}
181
183{
184 int ret;
185
186 val = new (std::nothrow) uint8_t[dlen * tlen]();
187 if (!val)
188 {
189 DAWNERR("new failed\n");
190 return -ENOMEM;
191 }
192
193 ret = applyInitval();
194 if (ret != OK)
195 {
196 delete[] static_cast<uint8_t *>(val);
197 val = nullptr;
198 return ret;
199 }
200
201 return OK;
202}
203
205{
206 if (val)
207 {
208 delete[] static_cast<uint8_t *>(val);
209 val = nullptr;
210 }
211
212 return OK;
213}
214
215int CIODummy::getDataImpl(IODataCmn &data, size_t len)
216{
217 size_t i = 0;
218
219 for (i = 0; i < len; i++)
220 {
221 mutex.lock();
222
223#ifdef CONFIG_DAWN_IO_TIMESTAMP
224 data.getTs(i) = ts;
225#endif
226 std::memcpy(data.getDataPtr(i), val, dlen * tlen);
227
228 mutex.unlock();
229 }
230
231 return OK;
232}
233
235{
236 return setVal(data.getDataPtr(), dlen * tlen);
237}
238
239#ifdef CONFIG_DAWN_IO_NOTIFY
240int CIODummy::getFd() const
241{
242 return -1;
243};
244#endif
245
247{
248 return dlen * tlen;
249}
250
252{
253 return dlen;
254}
Descriptor wrapper for individual object configuration.
size_t getSize() const
Get number of configuration items for this object.
SObjectCfg::SObjectCfgItem * objectCfgItemAtOffset(size_t offset) const
Get configuration item at specified offset.
virtual int getFd() const
Get file descriptor for notifications.
Definition common.hxx:425
uint64_t getTimestamp()
Get current timestamp.
Definition common.cxx:194
bool isTimestamp() const
Check if I/O supports timestamp.
Definition common.cxx:189
size_t cfgCmnOffset(const SObjectCfg::SObjectCfgItem *cfg)
Get offset of configuration item in descriptor.
Definition common.cxx:144
@ IO_CLASS_ANY
Any I/O class.
Definition common.hxx:86
@ IO_CLASS_DUMMY
Dummy I/O (for testing)
Definition common.hxx:99
int deinit()
De-initialize object.
Definition dummy.cxx:204
int setDataImpl(IODataCmn &data)
Set data implementation (override in derived classes).
Definition dummy.cxx:234
int init()
One-time initialize object after bindings are resolved.
Definition dummy.cxx:182
int getDataImpl(IODataCmn &data, size_t len)
Get data implementation (override in derived classes).
Definition dummy.cxx:215
size_t getDataSize() const
Get data size in bytes.
Definition dummy.cxx:246
int configure()
Configure object from descriptor data.
Definition dummy.cxx:173
size_t getDataDim() const
Get data vector dimension.
Definition dummy.cxx:251
CDescObject & getDesc()
Get descriptor object for this object.
Definition object.cxx:190
size_t getDtypeSize() const
Get size of this object's data type.
Definition object.cxx:195
Out-of-tree user-extension hooks for Dawn.
Definition bindable.hxx:13
Base interface for I/O data buffers (static and dynamic).
Definition idata.hxx:21
virtual void * getDataPtr(size_t batch=0)=0
Get pointer to data only (skips timestamp if present).
virtual uint64_t & getTs(size_t batch=0)=0
Get timestamp reference for batch.
Single configuration item within object.
ObjectCfgData_t data[]
Configuration data array (flexible, size from cfgid.s.size).
UObjectCfgId cfgid
Configuration ID header (type, class, id, size, rw, dtype).
ObjectCfgId v
Raw 32-bit ConfigID value (for storage, comparison).
Definition objectcfg.hxx:82
uint32_t cls
Object class (bits 21-29, max 511).
uint32_t id
Configuration identifier (bits 0-4, max 31).
Definition objectcfg.hxx:94
uint32_t size
Configuration data size in 32-bit words (bits 5-14, max 1023).
struct dawn::SObjectCfg::UObjectCfgId::@10 s
Bit-field structure for named member access.