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_CO2);
115 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_TVOC);
116 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_GNSS);
117 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_GNSS_TIME);
118 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_GNSS_INFO);
119 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_GNSS_SATELLITES);
120#endif
121#ifdef CONFIG_DAWN_IO_SENSOR_PRODUCER
124 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_PRODUCER_GYROSCOPE);
125 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_PRODUCER_LIGHT);
126 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_PRODUCER_BAROMETER);
127 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_PRODUCER_PROXIMITY);
128 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_PRODUCER_HUMIDITY);
131 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_PRODUCER_RGB);
132 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_PRODUCER_IR);
133 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_PRODUCER_UV);
134 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_PRODUCER_GAS);
135 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_PRODUCER_CO2);
136 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SENSOR_PRODUCER_TVOC);
137#endif
138#ifdef CONFIG_DAWN_IO_SYSINFO
139 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SYSTEM_UPTIME);
140 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SYSTEM_CPULOAD);
141#endif
142#ifdef CONFIG_DAWN_IO_BOARDCTL
143 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SYSTEM_RESET);
144 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SYSTEM_RESETCAUSE);
145 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SYSTEM_POWEROFF);
146#endif
147#ifdef CONFIG_DAWN_IO_UNAME
148 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SYSTEM_HOSTNAME);
149#endif
150#ifdef CONFIG_DAWN_IO_UUID
151 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SYSTEM_UUID);
152#endif
153#ifdef CONFIG_DAWN_IO_SYSTIME
154 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_SYSTEM_SYSTEMTIME);
155#endif
156#ifdef CONFIG_DAWN_IO_GPI
157 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_GPI_SINGLE);
158#endif
159#ifdef CONFIG_DAWN_IO_GPO
160 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_GPO_SINGLE);
161#endif
162#ifdef CONFIG_DAWN_IO_BUTTONS
163 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_BUTTONS);
164#endif
165#ifdef CONFIG_DAWN_IO_LEDS
166 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_LEDS);
167#endif
168#ifdef CONFIG_DAWN_IO_RGB_LED
169 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_RGBLED);
170#endif
171#ifdef CONFIG_DAWN_IO_PWM
172 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_PWM);
173#endif
174#ifdef CONFIG_DAWN_IO_PULSECOUNT
175 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_PULSECOUNT);
176#endif
177#ifdef CONFIG_DAWN_IO_ADC_FETCH
178 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_ADC_FETCH);
179#endif
180#ifdef CONFIG_DAWN_IO_ADC_SYNC
181 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_ADC_SYNC);
182#endif
183#ifdef CONFIG_DAWN_IO_ADC_STREAM
184 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_ADC_STREAM);
185#endif
186#ifdef CONFIG_DAWN_IO_DAC
187 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_DAC);
188#endif
189#ifdef CONFIG_DAWN_IO_ENCODER
190 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_ENCODER);
191#endif
192#ifdef CONFIG_DAWN_IO_ENCODER_INDEX
193 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_ENCODER_INDEX);
194#endif
195#ifdef CONFIG_DAWN_IO_VIRT
196 setBitmapBit(ioBitmap, CIOCommon::IO_CLASS_VIRT);
197#endif
198}
199
200void CIOCapabilities::buildProgBitmap()
201{
202 uint8_t *progBitmap;
203
204 progBitmap = payloadBuf + CAPS_PROG_BITMAP_OFFSET;
205 std::memset(progBitmap, 0, CAPS_BITMAP_BYTES);
206
207#ifdef CONFIG_DAWN_PROG_STATS_MIN
208 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_STATS_MIN);
209#endif
210#ifdef CONFIG_DAWN_PROG_STATS_MAX
211 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_STATS_MAX);
212#endif
213#ifdef CONFIG_DAWN_PROG_STATS_AVG
214 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_STATS_AVG);
215#endif
216#ifdef CONFIG_DAWN_PROG_STATS_SUM
217 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_STATS_SUM);
218#endif
219#ifdef CONFIG_DAWN_PROG_STATS_COUNT
220 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_STATS_COUNT);
221#endif
222#ifdef CONFIG_DAWN_PROG_STATS_RMS
223 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_STATS_RMS);
224#endif
225#ifdef CONFIG_DAWN_PROG_SAMPLING
226 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_SAMPLING);
227#endif
228#ifdef CONFIG_DAWN_PROG_DUMMY
229 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_DUMMY);
230#endif
231#ifdef CONFIG_DAWN_PROG_ADJUST
232 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_ADJUST);
233#endif
234#ifdef CONFIG_DAWN_PROG_GATEWAY
235 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_GATEWAY);
236#endif
237#ifdef CONFIG_DAWN_PROG_LATEST
238 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_LATEST);
239#endif
240#ifdef CONFIG_DAWN_PROG_REDIRECT
241 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_REDIRECT);
242#endif
243#ifdef CONFIG_DAWN_PROG_MOVING_AVG
244 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_MOVING_AVG);
245#endif
246#ifdef CONFIG_DAWN_PROG_IIR_FILTER
247 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_IIR_FILTER);
248#endif
249#ifdef CONFIG_DAWN_PROG_THRESHOLD
250 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_THRESHOLD);
251#endif
252#ifdef CONFIG_DAWN_PROG_THRESHOLD_VALUE
253 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_THRESHOLD_VALUE);
254#endif
255#ifdef CONFIG_DAWN_PROG_BUFFER
256 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_BUFFER);
257#endif
258#ifdef CONFIG_DAWN_PROG_SEQUENCER
259 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_SEQUENCER);
260#endif
261#ifdef CONFIG_DAWN_PROG_BITSPLIT
262 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_BITSPLIT);
263#endif
264#ifdef CONFIG_DAWN_PROG_TOGGLE
265 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_TOGGLE);
266#endif
267#ifdef CONFIG_DAWN_PROG_COUNTER
268 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_COUNTER);
269#endif
270#ifdef CONFIG_DAWN_PROG_SWITCH
271 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_SWITCH);
272#endif
273#ifdef CONFIG_DAWN_PROG_EXPRESSION
274 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_EXPRESSION);
275#endif
276#ifdef CONFIG_DAWN_PROG_SELECTOR
277 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_SELECTOR);
278#endif
279#ifdef CONFIG_DAWN_PROG_BITPACK
280 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_BITPACK);
281#endif
282#ifdef CONFIG_DAWN_PROG_VECPACK
283 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_VECPACK);
284#endif
285#ifdef CONFIG_DAWN_PROG_VECSPLIT
286 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_VECSPLIT);
287#endif
288#ifdef CONFIG_DAWN_PROG_CONFIGWRITER
289 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_CONFIGWRITER);
290#endif
291}
292
293void CIOCapabilities::buildProtoBitmap()
294{
295 uint8_t *protoBitmap;
296
297 protoBitmap = payloadBuf + CAPS_PROTO_BITMAP_OFFSET;
298 std::memset(protoBitmap, 0, CAPS_BITMAP_BYTES);
299
300#ifdef CONFIG_DAWN_PROTO_DUMMY
301 setBitmapBit(protoBitmap, CProtoCommon::PROTO_CLASS_DUMMY);
302#endif
303#ifdef CONFIG_DAWN_PROTO_NIMBLE_PERIPHERAL
304 setBitmapBit(protoBitmap, CProtoCommon::PROTO_CLASS_NIMBLE_PRPH);
305#endif
306#ifdef CONFIG_DAWN_PROTO_NXSCOPE_DUMMY
307 setBitmapBit(protoBitmap, CProtoCommon::PROTO_CLASS_NXSCOPE_DUMMY);
308#endif
309#ifdef CONFIG_DAWN_PROTO_NXSCOPE_SERIAL
310 setBitmapBit(protoBitmap, CProtoCommon::PROTO_CLASS_NXSCOPE_SERIAL);
311#endif
312#ifdef CONFIG_DAWN_PROTO_NXSCOPE_UDP
313 setBitmapBit(protoBitmap, CProtoCommon::PROTO_CLASS_NXSCOPE_UDP);
314#endif
315#ifdef CONFIG_DAWN_PROTO_SHELL_PRETTY
316 setBitmapBit(protoBitmap, CProtoCommon::PROTO_CLASS_SHELL_STD);
317#endif
318#ifdef CONFIG_DAWN_PROTO_SERIAL
319 setBitmapBit(protoBitmap, CProtoCommon::PROTO_CLASS_SERIAL);
320#endif
321#ifdef CONFIG_DAWN_PROTO_MODBUS_RTU
322 setBitmapBit(protoBitmap, CProtoCommon::PROTO_CLASS_MODBUS_RTU);
323#endif
324#ifdef CONFIG_DAWN_PROTO_MODBUS_TCP
325 setBitmapBit(protoBitmap, CProtoCommon::PROTO_CLASS_MODBUS_TCP);
326#endif
327#ifdef CONFIG_DAWN_PROTO_CAN
328 setBitmapBit(protoBitmap, CProtoCommon::PROTO_CLASS_CAN);
329#endif
330#ifdef CONFIG_DAWN_PROTO_UDP
331 setBitmapBit(protoBitmap, CProtoCommon::PROTO_CLASS_UDP);
332#endif
333#ifdef CONFIG_DAWN_PROTO_IPC
334 setBitmapBit(protoBitmap, CProtoCommon::PROTO_CLASS_IPC);
335#endif
336#ifdef CONFIG_DAWN_PROTO_WAKAAMA
337 setBitmapBit(protoBitmap, CProtoCommon::PROTO_CLASS_WAKAAMA);
338#endif
339}
340
341void CIOCapabilities::setMetaWord(uint16_t index, uint32_t value)
342{
343 size_t off;
344
345 if (index >= CAPS_META_WORDS)
346 {
347 return;
348 }
349
350 off = CAPS_META_OFFSET + static_cast<size_t>(index) * 4u;
351 payloadBuf[off + 0] = static_cast<uint8_t>(value & 0xffu);
352 payloadBuf[off + 1] = static_cast<uint8_t>((value >> 8) & 0xffu);
353 payloadBuf[off + 2] = static_cast<uint8_t>((value >> 16) & 0xffu);
354 payloadBuf[off + 3] = static_cast<uint8_t>((value >> 24) & 0xffu);
355}
356
357void CIOCapabilities::buildMetaPayload()
358{
359 uint32_t dtypeBitmap;
360 uint32_t ioFlagsBitmap;
361 uint32_t buildFlags;
362
363 std::memset(payloadBuf + CAPS_META_OFFSET, 0, CAPS_PAYLOAD_SIZE - CAPS_META_OFFSET);
364
365 dtypeBitmap = 0;
366 ioFlagsBitmap = 0;
367 buildFlags = 0;
368
369 // DTYPE_ANY
370 dtypeBitmap |= (1u << SObjectId::DTYPE_ANY);
371#ifdef CONFIG_DAWN_DTYPE_BOOL
372 dtypeBitmap |= (1u << SObjectId::DTYPE_BOOL);
373#endif
374#ifdef CONFIG_DAWN_DTYPE_INT8
375 dtypeBitmap |= (1u << SObjectId::DTYPE_INT8);
376#endif
377#ifdef CONFIG_DAWN_DTYPE_UINT8
378 dtypeBitmap |= (1u << SObjectId::DTYPE_UINT8);
379#endif
380#ifdef CONFIG_DAWN_DTYPE_INT16
381 dtypeBitmap |= (1u << SObjectId::DTYPE_INT16);
382#endif
383#ifdef CONFIG_DAWN_DTYPE_UINT16
384 dtypeBitmap |= (1u << SObjectId::DTYPE_UINT16);
385#endif
386#ifdef CONFIG_DAWN_DTYPE_INT32
387 dtypeBitmap |= (1u << SObjectId::DTYPE_INT32);
388#endif
389#ifdef CONFIG_DAWN_DTYPE_UINT32
390 dtypeBitmap |= (1u << SObjectId::DTYPE_UINT32);
391#endif
392#ifdef CONFIG_DAWN_DTYPE_INT64
393 dtypeBitmap |= (1u << SObjectId::DTYPE_INT64);
394#endif
395#ifdef CONFIG_DAWN_DTYPE_UINT64
396 dtypeBitmap |= (1u << SObjectId::DTYPE_UINT64);
397#endif
398#ifdef CONFIG_DAWN_DTYPE_FLOAT
399 dtypeBitmap |= (1u << SObjectId::DTYPE_FLOAT);
400#endif
401#ifdef CONFIG_DAWN_DTYPE_DOUBLE
402 dtypeBitmap |= (1u << SObjectId::DTYPE_DOUBLE);
403#endif
404#ifdef CONFIG_DAWN_DTYPE_B16
405 dtypeBitmap |= (1u << SObjectId::DTYPE_B16);
406#endif
407#ifdef CONFIG_DAWN_DTYPE_UB16
408 dtypeBitmap |= (1u << SObjectId::DTYPE_UB16);
409#endif
410#ifdef CONFIG_DAWN_DTYPE_CHAR
411 dtypeBitmap |= (1u << SObjectId::DTYPE_CHAR);
412#endif
413#ifdef CONFIG_DAWN_DTYPE_BLOCK
414 dtypeBitmap |= (1u << SObjectId::DTYPE_BLOCK);
415#endif
416
417#ifdef CONFIG_DAWN_IO_TIMESTAMP
418 ioFlagsBitmap |= (1u << 0);
419#endif
420
421 buildFlags |= CAPS_BUILD_OS_NUTTX;
422#ifdef CONFIG_FS_PROCFS
423 buildFlags |= CAPS_BUILD_FILESYSTEM;
424#endif
425#ifdef CONFIG_DAWN_IO_NOTIFY
426 buildFlags |= CAPS_BUILD_IO_NOTIFY;
427#endif
428#ifdef CONFIG_DAWN_IO_HAS_STATS
429 buildFlags |= CAPS_BUILD_IO_HAS_STATS;
430#endif
431#ifdef CONFIG_DAWN_OBJECT_HAS_NAME
432 buildFlags |= CAPS_BUILD_OBJECT_HASNAME;
433#endif
434#if CONFIG_DAWN_DESC_SLOTS > 1
435 buildFlags |= CAPS_BUILD_DESC_DYNAMIC;
436#endif
437
438 // v2 metadata layout:
439 // [0] dtype bits lo, [1] dtype bits hi,
440 // [2] io flags lo, [3] io flags hi,
441 // [4] build flags lo, [5] build flags hi,
442 // [6] descriptor slots, [7] descriptor slot size,
443 // [8] max io class id, [9] max prog class id, [10] max proto class id,
444 // [11..] reserved.
445 setMetaWord(0, dtypeBitmap);
446 setMetaWord(1, 0);
447 setMetaWord(2, ioFlagsBitmap);
448 setMetaWord(3, 0);
449 setMetaWord(4, buildFlags);
450 setMetaWord(5, 0);
451 setMetaWord(6, CONFIG_DAWN_DESC_SLOTS);
452 setMetaWord(7, CONFIG_DAWN_DESC_SLOT_SIZE);
453 setMetaWord(8, 0x1ffu);
454 setMetaWord(9, 0x1ffu);
455 setMetaWord(10, 0x1ffu);
456 setMetaWord(11, 0);
457}
458
459int CIOCapabilities::configurePayload()
460{
461 std::memset(payloadBuf, 0, sizeof(payloadBuf));
462 buildIoBitmap();
463 buildProgBitmap();
464 buildProtoBitmap();
465 buildMetaPayload();
466 return OK;
467}
468
469size_t CIOCapabilities::copyFromBlob(uint8_t *dst, size_t offset, size_t len) const
470{
471 uint8_t hdr[CAPS_HDR_SIZE];
472 size_t copied;
473 size_t hstart;
474 size_t hcopy;
475 size_t pstart;
476 size_t pcopy;
477
478 hdr[0] = CAPS_VERSION;
479 hdr[1] = 0;
480 hdr[2] = static_cast<uint8_t>(CAPS_PAYLOAD_SIZE & 0xff);
481 hdr[3] = static_cast<uint8_t>((CAPS_PAYLOAD_SIZE >> 8) & 0xff);
482 hdr[4] = 0;
483 hdr[5] = 0;
484 hdr[6] = 0;
485 hdr[7] = 0;
486
487 copied = 0;
488
489 if (offset < CAPS_HDR_SIZE)
490 {
491 hstart = offset;
492 hcopy = CAPS_HDR_SIZE - hstart;
493 if (hcopy > len)
494 {
495 hcopy = len;
496 }
497
498 std::memcpy(dst, &hdr[hstart], hcopy);
499 copied += hcopy;
500 }
501
502 if (copied < len)
503 {
504 if (offset + copied < CAPS_HDR_SIZE)
505 {
506 pstart = 0;
507 }
508 else
509 {
510 pstart = offset + copied - CAPS_HDR_SIZE;
511 }
512
513 pcopy = CAPS_PAYLOAD_SIZE - pstart;
514 if (pcopy > (len - copied))
515 {
516 pcopy = len - copied;
517 }
518
519 if (pcopy > 0)
520 {
521 std::memcpy(dst + copied, payloadBuf + pstart, pcopy);
522 copied += pcopy;
523 }
524 }
525
526 return copied;
527}
528
529CIOCapabilities::~CIOCapabilities()
530{
531 deinit();
532}
533
535{
536 int ret;
537
538 ret = configureDesc(getDesc());
539 if (ret != OK)
540 {
541 return ret;
542 }
543
544 return configurePayload();
545}
546
548{
549 return OK;
550}
551
553{
554 (void)data;
555 (void)len;
556 return -ENOTSUP;
557}
558
560{
561 (void)data;
562 return -ENOTSUP;
563}
564
565int CIOCapabilities::getDataAtImpl(IODataCmn &data, size_t len, size_t offset)
566{
567 size_t total;
568 size_t avail;
569 size_t toCopy;
570
571 if (len != 1)
572 {
573 return -EINVAL;
574 }
575
576 total = getDataSize();
577 if (offset >= total)
578 {
579 return -EINVAL;
580 }
581
582 avail = total - offset;
583 toCopy = data.getDataSize() < avail ? data.getDataSize() : avail;
584 copyFromBlob(static_cast<uint8_t *>(data.getDataPtr()), offset, toCopy);
585
586 return OK;
587}
588
590{
591 return CAPS_TOTAL_SIZE;
592}
593
595{
596 return getDataSize();
597}
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:132
@ IO_CLASS_SENSOR_MAGNETICFIELD
Magnetic field sensor.
Definition common.hxx:114
@ IO_CLASS_SENSOR_PRODUCER_ACCELEROMETER
Accelerometer publisher.
Definition common.hxx:131
@ IO_CLASS_DAC
Digital-to-analog converter.
Definition common.hxx:188
@ IO_CLASS_TRIGGER
Trigger I/O.
Definition common.hxx:91
@ IO_CLASS_PWM
PWM output.
Definition common.hxx:183
@ IO_CLASS_SYSTEM_RESETCAUSE
Reset cause.
Definition common.hxx:164
@ IO_CLASS_ADC_STREAM
ADC stream (batch/high-throughput)
Definition common.hxx:191
@ IO_CLASS_VIRT
Virtual I/O.
Definition common.hxx:210
@ IO_CLASS_SYSTEM_UPTIME
System uptime.
Definition common.hxx:161
@ IO_CLASS_SYSTEM_POWEROFF
Power off control.
Definition common.hxx:165
@ IO_CLASS_GPI_SINGLE
Single GPIO input.
Definition common.hxx:175
@ IO_CLASS_SENSOR_PRODUCER_LIGHT
Light publisher.
Definition common.hxx:134
@ IO_CLASS_SENSOR_PRODUCER_ATEMPERATURE
Ambient temperature publisher.
Definition common.hxx:139
@ IO_CLASS_ANY
Any I/O class.
Definition common.hxx:86
@ IO_CLASS_SYSTEM_SYSTEMTIME
System time.
Definition common.hxx:168
@ IO_CLASS_SENSOR_PRODUCER_HUMIDITY
Humidity publisher.
Definition common.hxx:137
@ IO_CLASS_ENCODER_INDEX
Quadrature encoder (position+index)
Definition common.hxx:196
@ IO_CLASS_SENSOR_PRODUCER_IR
Infrared publisher.
Definition common.hxx:141
@ IO_CLASS_ADC_FETCH
ADC fetch (on-demand)
Definition common.hxx:189
@ IO_CLASS_CAPABILITIES
Capabilities bitmask I/O.
Definition common.hxx:94
@ IO_CLASS_PULSECOUNT
Finite pulse-train output.
Definition common.hxx:184
@ IO_CLASS_SENSOR_LIGHT
Light sensor.
Definition common.hxx:116
@ IO_CLASS_SENSOR_CO2
CO2 concentration sensor.
Definition common.hxx:126
@ IO_CLASS_SENSOR_BAROMETER
Barometer sensor.
Definition common.hxx:117
@ IO_CLASS_SENSOR_PRODUCER_UV
Ultraviolet publisher.
Definition common.hxx:142
@ 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:151
@ IO_CLASS_SENSOR_PRODUCER_GAS
Gas publisher.
Definition common.hxx:143
@ 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:133
@ IO_CLASS_SENSOR_PRODUCER_CO2
CO2 concentration publisher.
Definition common.hxx:144
@ IO_CLASS_CONTROL
Control I/O.
Definition common.hxx:93
@ IO_CLASS_BUTTONS
Button input.
Definition common.hxx:177
@ IO_CLASS_SYSTEM_HOSTNAME
System hostname.
Definition common.hxx:166
@ IO_CLASS_SENSOR_GNSS_INFO
GNSS accuracy + DOP (eph/epv/hdop/pdop/vdop)
Definition common.hxx:152
@ IO_CLASS_SENSOR_PRODUCER_RGB
RGB color publisher.
Definition common.hxx:140
@ IO_CLASS_SENSOR_PRODUCER_TEMPERATURE
Temperature publisher.
Definition common.hxx:138
@ 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:150
@ 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:167
@ IO_CLASS_SENSOR_PRODUCER_TVOC
TVOC concentration publisher.
Definition common.hxx:145
@ IO_CLASS_SENSOR_GNSS_SATELLITES
GNSS satellites used in fix.
Definition common.hxx:153
@ IO_CLASS_ADC_SYNC
ADC sync (HW-triggered control loop)
Definition common.hxx:190
@ IO_CLASS_ENCODER
Quadrature encoder (position)
Definition common.hxx:195
@ IO_CLASS_GPO_SINGLE
Single GPIO output.
Definition common.hxx:176
@ IO_CLASS_SENSOR_IR
Infrared sensor.
Definition common.hxx:123
@ IO_CLASS_SYSTEM_CPULOAD
CPU load.
Definition common.hxx:162
@ IO_CLASS_SENSOR_PRODUCER_PROXIMITY
Proximity publisher.
Definition common.hxx:136
@ 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:178
@ IO_CLASS_RGBLED
RGB LED output.
Definition common.hxx:179
@ IO_CLASS_RAND
Random number generator.
Definition common.hxx:104
@ IO_CLASS_SENSOR_TVOC
TVOC concentration sensor.
Definition common.hxx:127
@ IO_CLASS_SENSOR_GAS
Gas sensor.
Definition common.hxx:125
@ IO_CLASS_SENSOR_PRODUCER_BAROMETER
Barometer publisher.
Definition common.hxx:135
@ IO_CLASS_DESCRIPTOR
Descriptor I/O.
Definition common.hxx:92
@ IO_CLASS_SYSTEM_RESET
System reset control.
Definition common.hxx:163
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.