Dawn Framework 1.0
Universal data acquisition framework for embedded systems
capabilities.cxx
1// dawn/src/io/capabilities.cxx
2//
3// SPDX-License-Identifier: Apache-2.0
4//
5
6#include "dawn/io/capabilities.hxx"
7
8#include <errno.h>
9
10#include <cstring>
11
12#include "dawn/prog/common.hxx"
13#include "dawn/proto/common.hxx"
14
15using namespace dawn;
16
17int CIOCapabilities::configureDesc(const CDescObject &desc)
18{
19 const SObjectCfg::SObjectCfgItem *item = nullptr;
20 size_t offset = 0;
21 size_t i = 0;
22
23 for (i = 0; i < desc.getSize(); i++)
24 {
25 item = desc.objectCfgItemAtOffset(offset);
26
27 switch (item->cfgid.s.cls)
28 {
30 {
31 offset += cfgCmnOffset(item);
32 break;
33 }
34
35 default:
36 {
37 DAWNERR("unsupported capabilities cfg 0x08%" PRIx32 "\n", item->cfgid.v);
38 return -EINVAL;
39 }
40 }
41 }
42
43 return OK;
44}
45
46void CIOCapabilities::setBitmapBit(uint8_t *bitmap, uint16_t bit)
47{
48 uint16_t by;
49 uint16_t bi;
50
51 by = static_cast<uint16_t>(bit / 8u);
52 bi = static_cast<uint16_t>(bit % 8u);
53
54 if (by < CAPS_BITMAP_BYTES)
55 {
56 bitmap[by] |= static_cast<uint8_t>(1u << bi);
57 }
58}
59
60void CIOCapabilities::buildIoBitmap()
61{
62 uint8_t *ioBitmap;
63
64 ioBitmap = payloadBuf + CAPS_IO_BITMAP_OFFSET;
65 std::memset(ioBitmap, 0, CAPS_BITMAP_BYTES);
66
67#ifdef CONFIG_DAWN_IO_CONFIG
68 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_CONFIG);
69#endif
70#ifdef CONFIG_DAWN_IO_TRIGGER
71 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_TRIGGER);
72#endif
73#ifdef CONFIG_DAWN_IO_DESCRIPTOR
74 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_DESCRIPTOR);
75#endif
76#ifdef CONFIG_DAWN_IO_CONTROL
77 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_CONTROL);
78#endif
79#ifdef CONFIG_DAWN_IO_CAPABILITIES
80 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_CAPABILITIES);
81#endif
82#ifdef CONFIG_DAWN_IO_DESC_SELECTOR
83 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_DESC_SELECTOR);
84#endif
85#ifdef CONFIG_DAWN_IO_DUMMY
86 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_DUMMY);
87#endif
88#ifdef CONFIG_DAWN_IO_TIMESTAMPIO
89 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_TIMESTAMP);
90#endif
91#ifdef CONFIG_DAWN_IO_RANDIO
92 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_RAND);
93#endif
94#ifdef CONFIG_DAWN_IO_DUMMY_NOTIFY
95 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_DUMMY_NOTIFY);
96#endif
97#ifdef CONFIG_DAWN_IO_FILE
98 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_FILE);
99#endif
100#ifdef CONFIG_DAWN_IO_SENSOR
101 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_ACCELEROMETER);
102 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_MAGNETICFIELD);
103 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_GYROSCOPE);
104 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_LIGHT);
105 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_BAROMETER);
106 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_PROXIMITY);
107 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_HUMIDITY);
108 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_TEMPERATURE);
109 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_ATEMPERATURE);
110 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_RGB);
111 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_IR);
112 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_UV);
113 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_GAS);
114 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_GNSS);
115 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_GNSS_TIME);
116 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_GNSS_INFO);
117 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_GNSS_SATELLITES);
118#endif
119#ifdef CONFIG_DAWN_IO_SENSOR_PRODUCER
122 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_PRODUCER_GYROSCOPE);
123 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_PRODUCER_LIGHT);
124 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_PRODUCER_BAROMETER);
125 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_PRODUCER_PROXIMITY);
126 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_PRODUCER_HUMIDITY);
129 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_PRODUCER_RGB);
130 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_PRODUCER_IR);
131 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_PRODUCER_UV);
132 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_PRODUCER_GAS);
133#endif
134#ifdef CONFIG_DAWN_IO_SYSINFO
135 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SYSTEM_UPTIME);
136 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SYSTEM_CPULOAD);
137#endif
138#ifdef CONFIG_DAWN_IO_BOARDCTL
139 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SYSTEM_RESET);
140 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SYSTEM_RESETCAUSE);
141 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SYSTEM_POWEROFF);
142#endif
143#ifdef CONFIG_DAWN_IO_UNAME
144 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SYSTEM_HOSTNAME);
145#endif
146#ifdef CONFIG_DAWN_IO_UUID
147 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SYSTEM_UUID);
148#endif
149#ifdef CONFIG_DAWN_IO_SYSTIME
150 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SYSTEM_SYSTEMTIME);
151#endif
152#ifdef CONFIG_DAWN_IO_GPI
153 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_GPI_SINGLE);
154#endif
155#ifdef CONFIG_DAWN_IO_GPO
156 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_GPO_SINGLE);
157#endif
158#ifdef CONFIG_DAWN_IO_BUTTONS
159 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_BUTTONS);
160#endif
161#ifdef CONFIG_DAWN_IO_LEDS
162 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_LEDS);
163#endif
164#ifdef CONFIG_DAWN_IO_RGB_LED
165 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_RGBLED);
166#endif
167#ifdef CONFIG_DAWN_IO_PWM
168 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_PWM);
169#endif
170#ifdef CONFIG_DAWN_IO_PULSECOUNT
171 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_PULSECOUNT);
172#endif
173#ifdef CONFIG_DAWN_IO_ADC_FETCH
174 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_ADC_FETCH);
175#endif
176#ifdef CONFIG_DAWN_IO_ADC_SYNC
177 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_ADC_SYNC);
178#endif
179#ifdef CONFIG_DAWN_IO_ADC_STREAM
180 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_ADC_STREAM);
181#endif
182#ifdef CONFIG_DAWN_IO_DAC
183 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_DAC);
184#endif
185#ifdef CONFIG_DAWN_IO_ENCODER
186 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_ENCODER);
187#endif
188#ifdef CONFIG_DAWN_IO_ENCODER_INDEX
189 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_ENCODER_INDEX);
190#endif
191#ifdef CONFIG_DAWN_IO_VIRT
192 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_VIRT);
193#endif
194}
195
196void CIOCapabilities::buildProgBitmap()
197{
198 uint8_t *progBitmap;
199
200 progBitmap = payloadBuf + CAPS_PROG_BITMAP_OFFSET;
201 std::memset(progBitmap, 0, CAPS_BITMAP_BYTES);
202
203#ifdef CONFIG_DAWN_PROG_STATS_MIN
204 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_STATS_MIN);
205#endif
206#ifdef CONFIG_DAWN_PROG_STATS_MAX
207 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_STATS_MAX);
208#endif
209#ifdef CONFIG_DAWN_PROG_STATS_AVG
210 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_STATS_AVG);
211#endif
212#ifdef CONFIG_DAWN_PROG_STATS_SUM
213 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_STATS_SUM);
214#endif
215#ifdef CONFIG_DAWN_PROG_STATS_COUNT
216 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_STATS_COUNT);
217#endif
218#ifdef CONFIG_DAWN_PROG_STATS_RMS
219 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_STATS_RMS);
220#endif
221#ifdef CONFIG_DAWN_PROG_SAMPLING
222 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_SAMPLING);
223#endif
224#ifdef CONFIG_DAWN_PROG_DUMMY
225 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_DUMMY);
226#endif
227#ifdef CONFIG_DAWN_PROG_ADJUST
228 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_ADJUST);
229#endif
230#ifdef CONFIG_DAWN_PROG_GATEWAY
231 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_GATEWAY);
232#endif
233#ifdef CONFIG_DAWN_PROG_LATEST
234 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_LATEST);
235#endif
236#ifdef CONFIG_DAWN_PROG_REDIRECT
237 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_REDIRECT);
238#endif
239#ifdef CONFIG_DAWN_PROG_MOVING_AVG
240 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_MOVING_AVG);
241#endif
242#ifdef CONFIG_DAWN_PROG_IIR_FILTER
243 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_IIR_FILTER);
244#endif
245#ifdef CONFIG_DAWN_PROG_THRESHOLD
246 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_THRESHOLD);
247#endif
248#ifdef CONFIG_DAWN_PROG_THRESHOLD_VALUE
249 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_THRESHOLD_VALUE);
250#endif
251#ifdef CONFIG_DAWN_PROG_BUFFER
252 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_BUFFER);
253#endif
254#ifdef CONFIG_DAWN_PROG_SEQUENCER
255 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_SEQUENCER);
256#endif
257#ifdef CONFIG_DAWN_PROG_BITSPLIT
258 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_BITSPLIT);
259#endif
260#ifdef CONFIG_DAWN_PROG_TOGGLE
261 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_TOGGLE);
262#endif
263#ifdef CONFIG_DAWN_PROG_COUNTER
264 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_COUNTER);
265#endif
266#ifdef CONFIG_DAWN_PROG_SWITCH
267 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_SWITCH);
268#endif
269#ifdef CONFIG_DAWN_PROG_EXPRESSION
270 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_EXPRESSION);
271#endif
272#ifdef CONFIG_DAWN_PROG_SELECTOR
273 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_SELECTOR);
274#endif
275#ifdef CONFIG_DAWN_PROG_BITPACK
276 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_BITPACK);
277#endif
278#ifdef CONFIG_DAWN_PROG_VECPACK
279 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_VECPACK);
280#endif
281#ifdef CONFIG_DAWN_PROG_VECSPLIT
282 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_VECSPLIT);
283#endif
284#ifdef CONFIG_DAWN_PROG_CONFIGWRITER
285 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_CONFIGWRITER);
286#endif
287}
288
289void CIOCapabilities::buildProtoBitmap()
290{
291 uint8_t *protoBitmap;
292
293 protoBitmap = payloadBuf + CAPS_PROTO_BITMAP_OFFSET;
294 std::memset(protoBitmap, 0, CAPS_BITMAP_BYTES);
295
296#ifdef CONFIG_DAWN_PROTO_DUMMY
297 setBitmapBit(protoBitmap, CProtoCommon::PROTO_CLASS_DUMMY);
298#endif
299#ifdef CONFIG_DAWN_PROTO_NIMBLE_PERIPHERAL
300 setBitmapBit(protoBitmap, CProtoCommon::PROTO_CLASS_NIMBLE_PRPH);
301#endif
302#ifdef CONFIG_DAWN_PROTO_NXSCOPE_DUMMY
303 setBitmapBit(protoBitmap, CProtoCommon::PROTO_CLASS_NXSCOPE_DUMMY);
304#endif
305#ifdef CONFIG_DAWN_PROTO_NXSCOPE_SERIAL
306 setBitmapBit(protoBitmap, CProtoCommon::PROTO_CLASS_NXSCOPE_SERIAL);
307#endif
308#ifdef CONFIG_DAWN_PROTO_NXSCOPE_UDP
309 setBitmapBit(protoBitmap, CProtoCommon::PROTO_CLASS_NXSCOPE_UDP);
310#endif
311#ifdef CONFIG_DAWN_PROTO_SHELL_PRETTY
312 setBitmapBit(protoBitmap, CProtoCommon::PROTO_CLASS_SHELL_STD);
313#endif
314#ifdef CONFIG_DAWN_PROTO_SERIAL
315 setBitmapBit(protoBitmap, CProtoCommon::PROTO_CLASS_SERIAL);
316#endif
317#ifdef CONFIG_DAWN_PROTO_MODBUS_RTU
318 setBitmapBit(protoBitmap, CProtoCommon::PROTO_CLASS_MODBUS_RTU);
319#endif
320#ifdef CONFIG_DAWN_PROTO_MODBUS_TCP
321 setBitmapBit(protoBitmap, CProtoCommon::PROTO_CLASS_MODBUS_TCP);
322#endif
323#ifdef CONFIG_DAWN_PROTO_CAN
324 setBitmapBit(protoBitmap, CProtoCommon::PROTO_CLASS_CAN);
325#endif
326#ifdef CONFIG_DAWN_PROTO_UDP
327 setBitmapBit(protoBitmap, CProtoCommon::PROTO_CLASS_UDP);
328#endif
329#ifdef CONFIG_DAWN_PROTO_IPC
330 setBitmapBit(protoBitmap, CProtoCommon::PROTO_CLASS_IPC);
331#endif
332#ifdef CONFIG_DAWN_PROTO_WAKAAMA
333 setBitmapBit(protoBitmap, CProtoCommon::PROTO_CLASS_WAKAAMA);
334#endif
335}
336
337void CIOCapabilities::setMetaWord(uint16_t index, uint32_t value)
338{
339 size_t off;
340
341 if (index >= CAPS_META_WORDS)
342 {
343 return;
344 }
345
346 off = CAPS_META_OFFSET + static_cast<size_t>(index) * 4u;
347 payloadBuf[off + 0] = static_cast<uint8_t>(value & 0xffu);
348 payloadBuf[off + 1] = static_cast<uint8_t>((value >> 8) & 0xffu);
349 payloadBuf[off + 2] = static_cast<uint8_t>((value >> 16) & 0xffu);
350 payloadBuf[off + 3] = static_cast<uint8_t>((value >> 24) & 0xffu);
351}
352
353void CIOCapabilities::buildMetaPayload()
354{
355 uint32_t dtypeBitmap;
356 uint32_t ioFlagsBitmap;
357 uint32_t buildFlags;
358
359 std::memset(payloadBuf + CAPS_META_OFFSET, 0, CAPS_PAYLOAD_SIZE - CAPS_META_OFFSET);
360
361 dtypeBitmap = 0;
362 ioFlagsBitmap = 0;
363 buildFlags = 0;
364
365 // DTYPE_ANY
366 dtypeBitmap |= (1u << SObjectId::DTYPE_ANY);
367#ifdef CONFIG_DAWN_DTYPE_BOOL
368 dtypeBitmap |= (1u << SObjectId::DTYPE_BOOL);
369#endif
370#ifdef CONFIG_DAWN_DTYPE_INT8
371 dtypeBitmap |= (1u << SObjectId::DTYPE_INT8);
372#endif
373#ifdef CONFIG_DAWN_DTYPE_UINT8
374 dtypeBitmap |= (1u << SObjectId::DTYPE_UINT8);
375#endif
376#ifdef CONFIG_DAWN_DTYPE_INT16
377 dtypeBitmap |= (1u << SObjectId::DTYPE_INT16);
378#endif
379#ifdef CONFIG_DAWN_DTYPE_UINT16
380 dtypeBitmap |= (1u << SObjectId::DTYPE_UINT16);
381#endif
382#ifdef CONFIG_DAWN_DTYPE_INT32
383 dtypeBitmap |= (1u << SObjectId::DTYPE_INT32);
384#endif
385#ifdef CONFIG_DAWN_DTYPE_UINT32
386 dtypeBitmap |= (1u << SObjectId::DTYPE_UINT32);
387#endif
388#ifdef CONFIG_DAWN_DTYPE_INT64
389 dtypeBitmap |= (1u << SObjectId::DTYPE_INT64);
390#endif
391#ifdef CONFIG_DAWN_DTYPE_UINT64
392 dtypeBitmap |= (1u << SObjectId::DTYPE_UINT64);
393#endif
394#ifdef CONFIG_DAWN_DTYPE_FLOAT
395 dtypeBitmap |= (1u << SObjectId::DTYPE_FLOAT);
396#endif
397#ifdef CONFIG_DAWN_DTYPE_DOUBLE
398 dtypeBitmap |= (1u << SObjectId::DTYPE_DOUBLE);
399#endif
400#ifdef CONFIG_DAWN_DTYPE_B16
401 dtypeBitmap |= (1u << SObjectId::DTYPE_B16);
402#endif
403#ifdef CONFIG_DAWN_DTYPE_UB16
404 dtypeBitmap |= (1u << SObjectId::DTYPE_UB16);
405#endif
406#ifdef CONFIG_DAWN_DTYPE_CHAR
407 dtypeBitmap |= (1u << SObjectId::DTYPE_CHAR);
408#endif
409#ifdef CONFIG_DAWN_DTYPE_BLOCK
410 dtypeBitmap |= (1u << SObjectId::DTYPE_BLOCK);
411#endif
412
413#ifdef CONFIG_DAWN_IO_TIMESTAMP
414 ioFlagsBitmap |= (1u << 0);
415#endif
416
417 buildFlags |= CAPS_BUILD_OS_NUTTX;
418#ifdef CONFIG_FS_PROCFS
419 buildFlags |= CAPS_BUILD_FILESYSTEM;
420#endif
421#ifdef CONFIG_DAWN_IO_NOTIFY
422 buildFlags |= CAPS_BUILD_IO_NOTIFY;
423#endif
424#ifdef CONFIG_DAWN_IO_HAS_STATS
425 buildFlags |= CAPS_BUILD_IO_HAS_STATS;
426#endif
427#ifdef CONFIG_DAWN_OBJECT_HAS_NAME
428 buildFlags |= CAPS_BUILD_OBJECT_HASNAME;
429#endif
430#if CONFIG_DAWN_DESC_SLOTS > 1
431 buildFlags |= CAPS_BUILD_DESC_DYNAMIC;
432#endif
433
434 // v2 metadata layout:
435 // [0] dtype bits lo, [1] dtype bits hi,
436 // [2] io flags lo, [3] io flags hi,
437 // [4] build flags lo, [5] build flags hi,
438 // [6] descriptor slots, [7] descriptor slot size,
439 // [8] max io class id, [9] max prog class id, [10] max proto class id,
440 // [11..] reserved.
441 setMetaWord(0, dtypeBitmap);
442 setMetaWord(1, 0);
443 setMetaWord(2, ioFlagsBitmap);
444 setMetaWord(3, 0);
445 setMetaWord(4, buildFlags);
446 setMetaWord(5, 0);
447 setMetaWord(6, CONFIG_DAWN_DESC_SLOTS);
448 setMetaWord(7, CONFIG_DAWN_DESC_SLOT_SIZE);
449 setMetaWord(8, 0x1ffu);
450 setMetaWord(9, 0x1ffu);
451 setMetaWord(10, 0x1ffu);
452 setMetaWord(11, 0);
453}
454
455int CIOCapabilities::configurePayload()
456{
457 std::memset(payloadBuf, 0, sizeof(payloadBuf));
458 buildIoBitmap();
459 buildProgBitmap();
460 buildProtoBitmap();
461 buildMetaPayload();
462 return OK;
463}
464
465size_t CIOCapabilities::copyFromBlob(uint8_t *dst, size_t offset, size_t len) const
466{
467 uint8_t hdr[CAPS_HDR_SIZE];
468 size_t copied;
469 size_t hstart;
470 size_t hcopy;
471 size_t pstart;
472 size_t pcopy;
473
474 hdr[0] = CAPS_VERSION;
475 hdr[1] = 0;
476 hdr[2] = static_cast<uint8_t>(CAPS_PAYLOAD_SIZE & 0xff);
477 hdr[3] = static_cast<uint8_t>((CAPS_PAYLOAD_SIZE >> 8) & 0xff);
478 hdr[4] = 0;
479 hdr[5] = 0;
480 hdr[6] = 0;
481 hdr[7] = 0;
482
483 copied = 0;
484
485 if (offset < CAPS_HDR_SIZE)
486 {
487 hstart = offset;
488 hcopy = CAPS_HDR_SIZE - hstart;
489 if (hcopy > len)
490 {
491 hcopy = len;
492 }
493
494 std::memcpy(dst, &hdr[hstart], hcopy);
495 copied += hcopy;
496 }
497
498 if (copied < len)
499 {
500 if (offset + copied < CAPS_HDR_SIZE)
501 {
502 pstart = 0;
503 }
504 else
505 {
506 pstart = offset + copied - CAPS_HDR_SIZE;
507 }
508
509 pcopy = CAPS_PAYLOAD_SIZE - pstart;
510 if (pcopy > (len - copied))
511 {
512 pcopy = len - copied;
513 }
514
515 if (pcopy > 0)
516 {
517 std::memcpy(dst + copied, payloadBuf + pstart, pcopy);
518 copied += pcopy;
519 }
520 }
521
522 return copied;
523}
524
525CIOCapabilities::~CIOCapabilities()
526{
527 deinit();
528}
529
531{
532 int ret;
533
534 ret = configureDesc(getDesc());
535 if (ret != OK)
536 {
537 return ret;
538 }
539
540 return configurePayload();
541}
542
544{
545 return OK;
546}
547
549{
550 (void)data;
551 (void)len;
552 return -ENOTSUP;
553}
554
556{
557 (void)data;
558 return -ENOTSUP;
559}
560
561int CIOCapabilities::getDataAtImpl(IODataCmn &data, size_t len, size_t offset)
562{
563 size_t total;
564 size_t avail;
565 size_t toCopy;
566
567 if (len != 1)
568 {
569 return -EINVAL;
570 }
571
572 total = getDataSize();
573 if (offset >= total)
574 {
575 return -EINVAL;
576 }
577
578 avail = total - offset;
579 toCopy = data.getDataSize() < avail ? data.getDataSize() : avail;
580 copyFromBlob(static_cast<uint8_t *>(data.getDataPtr()), offset, toCopy);
581
582 return OK;
583}
584
586{
587 return CAPS_TOTAL_SIZE;
588}
589
591{
592 return getDataSize();
593}
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.
int getDataAtImpl(IODataCmn &data, size_t len, size_t offset)
Get data at byte offset (override in seekable IOs).
int deinit()
De-initialize object.
size_t getDataDim() const
Get data vector dimension.
int configure()
Configure object from descriptor data.
size_t getDataSize() const
Get data size in bytes.
int setDataImpl(IODataCmn &data)
Set data implementation (override in derived classes).
int getDataImpl(IODataCmn &data, size_t len)
Get data implementation (override in derived classes).
size_t cfgCmnOffset(const SObjectCfg::SObjectCfgItem *cfg)
Get offset of configuration item in descriptor.
Definition common.cxx:144
@ IO_CLASS_SENSOR_PRODUCER_MAGNETICFIELD
Magnetic field publisher.
Definition common.hxx:130
@ IO_CLASS_SENSOR_MAGNETICFIELD
Magnetic field sensor.
Definition common.hxx:114
@ IO_CLASS_SENSOR_PRODUCER_ACCELEROMETER
Accelerometer publisher.
Definition common.hxx:129
@ IO_CLASS_DAC
Digital-to-analog converter.
Definition common.hxx:185
@ IO_CLASS_TRIGGER
Trigger I/O.
Definition common.hxx:91
@ IO_CLASS_PWM
PWM output.
Definition common.hxx:180
@ IO_CLASS_SYSTEM_RESETCAUSE
Reset cause.
Definition common.hxx:161
@ IO_CLASS_ADC_STREAM
ADC stream (batch/high-throughput)
Definition common.hxx:188
@ IO_CLASS_VIRT
Virtual I/O.
Definition common.hxx:207
@ IO_CLASS_SYSTEM_UPTIME
System uptime.
Definition common.hxx:158
@ IO_CLASS_SYSTEM_POWEROFF
Power off control.
Definition common.hxx:162
@ IO_CLASS_GPI_SINGLE
Single GPIO input.
Definition common.hxx:172
@ IO_CLASS_SENSOR_PRODUCER_LIGHT
Light publisher.
Definition common.hxx:132
@ IO_CLASS_SENSOR_PRODUCER_ATEMPERATURE
Ambient temperature publisher.
Definition common.hxx:137
@ IO_CLASS_ANY
Any I/O class.
Definition common.hxx:86
@ IO_CLASS_SYSTEM_SYSTEMTIME
System time.
Definition common.hxx:165
@ IO_CLASS_SENSOR_PRODUCER_HUMIDITY
Humidity publisher.
Definition common.hxx:135
@ IO_CLASS_ENCODER_INDEX
Quadrature encoder (position+index)
Definition common.hxx:193
@ IO_CLASS_SENSOR_PRODUCER_IR
Infrared publisher.
Definition common.hxx:139
@ IO_CLASS_ADC_FETCH
ADC fetch (on-demand)
Definition common.hxx:186
@ IO_CLASS_CAPABILITIES
Capabilities bitmask I/O.
Definition common.hxx:94
@ IO_CLASS_PULSECOUNT
Finite pulse-train output.
Definition common.hxx:181
@ IO_CLASS_SENSOR_LIGHT
Light sensor.
Definition common.hxx:116
@ IO_CLASS_SENSOR_BAROMETER
Barometer sensor.
Definition common.hxx:117
@ IO_CLASS_SENSOR_PRODUCER_UV
Ultraviolet publisher.
Definition common.hxx:140
@ IO_CLASS_SENSOR_HUMIDITY
Humidity sensor.
Definition common.hxx:119
@ IO_CLASS_SENSOR_PROXIMITY
Proximity sensor.
Definition common.hxx:118
@ IO_CLASS_SENSOR_GNSS_TIME
GNSS UTC time (seconds since epoch)
Definition common.hxx:148
@ IO_CLASS_SENSOR_PRODUCER_GAS
Gas publisher.
Definition common.hxx:141
@ IO_CLASS_SENSOR_TEMPERATURE
Temperature sensor.
Definition common.hxx:120
@ IO_CLASS_FILE
File system I/O.
Definition common.hxx:109
@ IO_CLASS_SENSOR_PRODUCER_GYROSCOPE
Gyroscope publisher.
Definition common.hxx:131
@ IO_CLASS_CONTROL
Control I/O.
Definition common.hxx:93
@ IO_CLASS_BUTTONS
Button input.
Definition common.hxx:174
@ IO_CLASS_SYSTEM_HOSTNAME
System hostname.
Definition common.hxx:163
@ IO_CLASS_SENSOR_GNSS_INFO
GNSS accuracy + DOP (eph/epv/hdop/pdop/vdop)
Definition common.hxx:149
@ IO_CLASS_SENSOR_PRODUCER_RGB
RGB color publisher.
Definition common.hxx:138
@ IO_CLASS_SENSOR_PRODUCER_TEMPERATURE
Temperature publisher.
Definition common.hxx:136
@ IO_CLASS_SENSOR_UV
Ultraviolet sensor.
Definition common.hxx:124
@ IO_CLASS_CONFIG
Configuration I/O.
Definition common.hxx:90
@ IO_CLASS_DESC_SELECTOR
Descriptor slot selector I/O.
Definition common.hxx:95
@ IO_CLASS_SENSOR_GNSS
GNSS position+velocity (lat/lon/alt/speed/course)
Definition common.hxx:147
@ IO_CLASS_DUMMY
Dummy I/O (for testing)
Definition common.hxx:99
@ IO_CLASS_SENSOR_ACCELEROMETER
Accelerometer sensor.
Definition common.hxx:113
@ IO_CLASS_SENSOR_RGB
RGB color sensor.
Definition common.hxx:122
@ IO_CLASS_TIMESTAMP
Timestamp generator.
Definition common.hxx:103
@ IO_CLASS_SENSOR_GYROSCOPE
Gyroscope sensor.
Definition common.hxx:115
@ IO_CLASS_SYSTEM_UUID
UUID.
Definition common.hxx:164
@ IO_CLASS_SENSOR_GNSS_SATELLITES
GNSS satellites used in fix.
Definition common.hxx:150
@ IO_CLASS_ADC_SYNC
ADC sync (HW-triggered control loop)
Definition common.hxx:187
@ IO_CLASS_ENCODER
Quadrature encoder (position)
Definition common.hxx:192
@ IO_CLASS_GPO_SINGLE
Single GPIO output.
Definition common.hxx:173
@ IO_CLASS_SENSOR_IR
Infrared sensor.
Definition common.hxx:123
@ IO_CLASS_SYSTEM_CPULOAD
CPU load.
Definition common.hxx:159
@ IO_CLASS_SENSOR_PRODUCER_PROXIMITY
Proximity publisher.
Definition common.hxx:134
@ IO_CLASS_SENSOR_ATEMPERATURE
Ambient temperature sensor.
Definition common.hxx:121
@ IO_CLASS_DUMMY_NOTIFY
Timer-driven dummy IO.
Definition common.hxx:105
@ IO_CLASS_LEDS
LED output.
Definition common.hxx:175
@ IO_CLASS_RGBLED
RGB LED output.
Definition common.hxx:176
@ IO_CLASS_RAND
Random number generator.
Definition common.hxx:104
@ IO_CLASS_SENSOR_GAS
Gas sensor.
Definition common.hxx:125
@ IO_CLASS_SENSOR_PRODUCER_BAROMETER
Barometer publisher.
Definition common.hxx:133
@ IO_CLASS_DESCRIPTOR
Descriptor I/O.
Definition common.hxx:92
@ IO_CLASS_SYSTEM_RESET
System reset control.
Definition common.hxx:160
CDescObject & getDesc()
Get descriptor object for this object.
Definition object.cxx:190
@ PROG_CLASS_LATEST
Cache latest notified sample for fetch-based readers.
Definition common.hxx:79
@ PROG_CLASS_MOVING_AVG
Moving average filter.
Definition common.hxx:87
@ PROG_CLASS_IIR_FILTER
First-order IIR filter.
Definition common.hxx:91
@ PROG_CLASS_DUMMY
Dummy program (test/helper).
Definition common.hxx:67
@ PROG_CLASS_THRESHOLD_VALUE
Threshold comparator returning gated source value.
Definition common.hxx:99
@ PROG_CLASS_STATS_MAX
Maximum value tracker.
Definition common.hxx:43
@ PROG_CLASS_STATS_MIN
Minimum value tracker.
Definition common.hxx:39
@ PROG_CLASS_GATEWAY
Protocol-to-protocol IO gateway.
Definition common.hxx:75
@ PROG_CLASS_SEQUENCER
Periodic state sequencer.
Definition common.hxx:107
@ PROG_CLASS_STATS_SUM
Sum accumulator.
Definition common.hxx:51
@ PROG_CLASS_BUFFER
Notify-driven history capture buffer.
Definition common.hxx:103
@ PROG_CLASS_SAMPLING
Periodic data sampler.
Definition common.hxx:63
@ PROG_CLASS_THRESHOLD
Threshold and hysteresis comparator.
Definition common.hxx:95
@ PROG_CLASS_REDIRECT
Generic input-to-output routing bridge.
Definition common.hxx:83
@ PROG_CLASS_STATS_RMS
Running RMS (root mean square) calculator.
Definition common.hxx:59
@ PROG_CLASS_ADJUST
Scale/offset adjustment.
Definition common.hxx:71
@ PROG_CLASS_STATS_COUNT
Sample counter.
Definition common.hxx:55
@ PROG_CLASS_STATS_AVG
Running average calculator.
Definition common.hxx:47
@ PROTO_CLASS_NXSCOPE_UDP
NxScope real-time visualization (UDP interface).
Definition common.hxx:51
@ PROTO_CLASS_MODBUS_TCP
Modbus TCP (network implementation).
Definition common.hxx:71
@ PROTO_CLASS_MODBUS_RTU
Modbus RTU (serial implementation).
Definition common.hxx:67
@ PROTO_CLASS_WAKAAMA
LwM2M protocol using Eclipse Wakaama.
Definition common.hxx:87
@ PROTO_CLASS_NXSCOPE_SERIAL
NxScope real-time visualization (serial interface).
Definition common.hxx:47
@ PROTO_CLASS_DUMMY
Dummy protocol (test/helper).
Definition common.hxx:43
@ PROTO_CLASS_UDP
UDP-based protocol.
Definition common.hxx:79
@ PROTO_CLASS_SERIAL
Compact binary protocol over serial port.
Definition common.hxx:63
@ PROTO_CLASS_NIMBLE_PRPH
BLE Peripheral using Apache NimBLE stack.
Definition common.hxx:35
@ PROTO_CLASS_IPC
FIFO-based local IPC protocol.
Definition common.hxx:83
@ PROTO_CLASS_NXSCOPE_DUMMY
NxScope real-time visualization (dummy interface).
Definition common.hxx:39
@ PROTO_CLASS_SHELL_STD
Interactive shell on stdin/stdout.
Definition common.hxx:55
@ PROTO_CLASS_CAN
CAN bus protocol.
Definition common.hxx:75
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 size_t getDataSize()=0
Get data size in bytes.
Single configuration item within object.
UObjectCfgId cfgid
Configuration ID header (type, class, id, size, rw, dtype).
@ DTYPE_FLOAT
IEEE 754 single-precision floating point (32-bit).
Definition objectid.hxx:112
@ DTYPE_INT32
Signed 32-bit integer (-2147483648 to 2147483647).
Definition objectid.hxx:92
@ DTYPE_UINT8
Unsigned 8-bit integer (0 to 255).
Definition objectid.hxx:80
@ DTYPE_INT16
Signed 16-bit integer (-32768 to 32767).
Definition objectid.hxx:84
@ DTYPE_INT8
Signed 8-bit integer (-128 to 127).
Definition objectid.hxx:76
@ DTYPE_ANY
Wildcard data type (matches any actual type).
Definition objectid.hxx:68
@ DTYPE_BLOCK
Opaque block/byte-stream data type.
Definition objectid.hxx:153
@ DTYPE_UINT64
Unsigned 64-bit integer.
Definition objectid.hxx:104
@ DTYPE_UINT16
Unsigned 16-bit integer (0 to 65535).
Definition objectid.hxx:88
@ DTYPE_UB16
Unsigned 16.16 fixed-point (32-bit).
Definition objectid.hxx:132
@ DTYPE_DOUBLE
IEEE 754 double-precision floating point (64-bit).
Definition objectid.hxx:120
@ DTYPE_CHAR
Character/string type (null-terminated, 4-byte aligned).
Definition objectid.hxx:144
@ DTYPE_INT64
Signed 64-bit integer.
Definition objectid.hxx:100
@ DTYPE_UINT32
Unsigned 32-bit integer (0 to 4294967295).
Definition objectid.hxx:96
@ DTYPE_BOOL
Boolean data type (stored in 32-bit container).
Definition objectid.hxx:72
@ DTYPE_B16
Signed 16.16 fixed-point (32-bit).
Definition objectid.hxx:128
ObjectCfgId v
Raw 32-bit ConfigID value (for storage, comparison).
Definition objectcfg.hxx:82
uint32_t cls
Object class (bits 21-29, max 511).
struct dawn::SObjectCfg::UObjectCfgId::@10 s
Bit-field structure for named member access.