6#include "dawn/io/capabilities.hxx"
12#include "dawn/prog/common.hxx"
13#include "dawn/proto/common.hxx"
17int CIOCapabilities::configureDesc(
const CDescObject &desc)
23 for (i = 0; i < desc.
getSize(); i++)
37 DAWNERR(
"unsupported capabilities cfg 0x08%" PRIx32
"\n", item->
cfgid.
v);
46void CIOCapabilities::setBitmapBit(uint8_t *bitmap, uint16_t bit)
51 by =
static_cast<uint16_t
>(bit / 8u);
52 bi =
static_cast<uint16_t
>(bit % 8u);
54 if (by < CAPS_BITMAP_BYTES)
56 bitmap[by] |=
static_cast<uint8_t
>(1u << bi);
60void CIOCapabilities::buildIoBitmap()
64 ioBitmap = payloadBuf + CAPS_IO_BITMAP_OFFSET;
65 std::memset(ioBitmap, 0, CAPS_BITMAP_BYTES);
67#ifdef CONFIG_DAWN_IO_CONFIG
70#ifdef CONFIG_DAWN_IO_TRIGGER
73#ifdef CONFIG_DAWN_IO_DESCRIPTOR
76#ifdef CONFIG_DAWN_IO_CONTROL
79#ifdef CONFIG_DAWN_IO_CAPABILITIES
82#ifdef CONFIG_DAWN_IO_DESC_SELECTOR
85#ifdef CONFIG_DAWN_IO_DUMMY
88#ifdef CONFIG_DAWN_IO_TIMESTAMPIO
91#ifdef CONFIG_DAWN_IO_RANDIO
94#ifdef CONFIG_DAWN_IO_DUMMY_NOTIFY
97#ifdef CONFIG_DAWN_IO_FILE
100#ifdef CONFIG_DAWN_IO_SENSOR
115#ifdef CONFIG_DAWN_IO_SENSOR_PRODUCER
130#ifdef CONFIG_DAWN_IO_SYSINFO
134#ifdef CONFIG_DAWN_IO_BOARDCTL
139#ifdef CONFIG_DAWN_IO_UNAME
142#ifdef CONFIG_DAWN_IO_UUID
145#ifdef CONFIG_DAWN_IO_SYSTIME
148#ifdef CONFIG_DAWN_IO_GPI
151#ifdef CONFIG_DAWN_IO_GPO
154#ifdef CONFIG_DAWN_IO_BUTTONS
157#ifdef CONFIG_DAWN_IO_LEDS
160#ifdef CONFIG_DAWN_IO_RGB_LED
163#ifdef CONFIG_DAWN_IO_PWM
166#ifdef CONFIG_DAWN_IO_ADC_FETCH
169#ifdef CONFIG_DAWN_IO_ADC_SYNC
172#ifdef CONFIG_DAWN_IO_ADC_STREAM
175#ifdef CONFIG_DAWN_IO_DAC
178#ifdef CONFIG_DAWN_IO_ENCODER
181#ifdef CONFIG_DAWN_IO_ENCODER_INDEX
184#ifdef CONFIG_DAWN_IO_VIRT
189void CIOCapabilities::buildProgBitmap()
193 progBitmap = payloadBuf + CAPS_PROG_BITMAP_OFFSET;
194 std::memset(progBitmap, 0, CAPS_BITMAP_BYTES);
196#ifdef CONFIG_DAWN_PROG_STATS_MIN
199#ifdef CONFIG_DAWN_PROG_STATS_MAX
202#ifdef CONFIG_DAWN_PROG_STATS_AVG
205#ifdef CONFIG_DAWN_PROG_STATS_SUM
208#ifdef CONFIG_DAWN_PROG_STATS_COUNT
211#ifdef CONFIG_DAWN_PROG_STATS_RMS
214#ifdef CONFIG_DAWN_PROG_SAMPLING
217#ifdef CONFIG_DAWN_PROG_DUMMY
220#ifdef CONFIG_DAWN_PROG_ADJUST
223#ifdef CONFIG_DAWN_PROG_GATEWAY
226#ifdef CONFIG_DAWN_PROG_LATEST
229#ifdef CONFIG_DAWN_PROG_REDIRECT
232#ifdef CONFIG_DAWN_PROG_MOVING_AVG
235#ifdef CONFIG_DAWN_PROG_IIR_FILTER
238#ifdef CONFIG_DAWN_PROG_THRESHOLD
241#ifdef CONFIG_DAWN_PROG_THRESHOLD_VALUE
244#ifdef CONFIG_DAWN_PROG_BUFFER
247#ifdef CONFIG_DAWN_PROG_SEQUENCER
250#ifdef CONFIG_DAWN_PROG_BITSPLIT
251 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_BITSPLIT);
253#ifdef CONFIG_DAWN_PROG_TOGGLE
254 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_TOGGLE);
256#ifdef CONFIG_DAWN_PROG_COUNTER
257 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_COUNTER);
259#ifdef CONFIG_DAWN_PROG_SWITCH
260 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_SWITCH);
262#ifdef CONFIG_DAWN_PROG_EXPRESSION
263 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_EXPRESSION);
265#ifdef CONFIG_DAWN_PROG_SELECTOR
266 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_SELECTOR);
268#ifdef CONFIG_DAWN_PROG_BITPACK
269 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_BITPACK);
271#ifdef CONFIG_DAWN_PROG_VECPACK
272 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_VECPACK);
274#ifdef CONFIG_DAWN_PROG_VECSPLIT
275 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_VECSPLIT);
277#ifdef CONFIG_DAWN_PROG_CONFIGWRITER
278 setBitmapBit(progBitmap, CProgCommon::PROG_CLASS_CONFIGWRITER);
282void CIOCapabilities::buildProtoBitmap()
284 uint8_t *protoBitmap;
286 protoBitmap = payloadBuf + CAPS_PROTO_BITMAP_OFFSET;
287 std::memset(protoBitmap, 0, CAPS_BITMAP_BYTES);
289#ifdef CONFIG_DAWN_PROTO_DUMMY
292#ifdef CONFIG_DAWN_PROTO_NIMBLE_PERIPHERAL
295#ifdef CONFIG_DAWN_PROTO_NXSCOPE_DUMMY
298#ifdef CONFIG_DAWN_PROTO_NXSCOPE_SERIAL
301#ifdef CONFIG_DAWN_PROTO_NXSCOPE_UDP
304#ifdef CONFIG_DAWN_PROTO_SHELL_PRETTY
307#ifdef CONFIG_DAWN_PROTO_SERIAL
310#ifdef CONFIG_DAWN_PROTO_MODBUS_RTU
313#ifdef CONFIG_DAWN_PROTO_MODBUS_TCP
316#ifdef CONFIG_DAWN_PROTO_CAN
319#ifdef CONFIG_DAWN_PROTO_UDP
322#ifdef CONFIG_DAWN_PROTO_IPC
327void CIOCapabilities::setMetaWord(uint16_t index, uint32_t value)
331 if (index >= CAPS_META_WORDS)
336 off = CAPS_META_OFFSET +
static_cast<size_t>(index) * 4u;
337 payloadBuf[off + 0] =
static_cast<uint8_t
>(value & 0xffu);
338 payloadBuf[off + 1] =
static_cast<uint8_t
>((value >> 8) & 0xffu);
339 payloadBuf[off + 2] =
static_cast<uint8_t
>((value >> 16) & 0xffu);
340 payloadBuf[off + 3] =
static_cast<uint8_t
>((value >> 24) & 0xffu);
343void CIOCapabilities::buildMetaPayload()
345 uint32_t dtypeBitmap;
346 uint32_t ioFlagsBitmap;
349 std::memset(payloadBuf + CAPS_META_OFFSET, 0, CAPS_PAYLOAD_SIZE - CAPS_META_OFFSET);
357#ifdef CONFIG_DAWN_DTYPE_BOOL
360#ifdef CONFIG_DAWN_DTYPE_INT8
363#ifdef CONFIG_DAWN_DTYPE_UINT8
366#ifdef CONFIG_DAWN_DTYPE_INT16
369#ifdef CONFIG_DAWN_DTYPE_UINT16
372#ifdef CONFIG_DAWN_DTYPE_INT32
375#ifdef CONFIG_DAWN_DTYPE_UINT32
378#ifdef CONFIG_DAWN_DTYPE_INT64
381#ifdef CONFIG_DAWN_DTYPE_UINT64
384#ifdef CONFIG_DAWN_DTYPE_FLOAT
387#ifdef CONFIG_DAWN_DTYPE_DOUBLE
390#ifdef CONFIG_DAWN_DTYPE_B16
393#ifdef CONFIG_DAWN_DTYPE_UB16
396#ifdef CONFIG_DAWN_DTYPE_CHAR
399#ifdef CONFIG_DAWN_DTYPE_BLOCK
403#ifdef CONFIG_DAWN_IO_TIMESTAMP
404 ioFlagsBitmap |= (1u << 0);
407 buildFlags |= CAPS_BUILD_OS_NUTTX;
408#ifdef CONFIG_FS_PROCFS
409 buildFlags |= CAPS_BUILD_FILESYSTEM;
411#ifdef CONFIG_DAWN_IO_NOTIFY
412 buildFlags |= CAPS_BUILD_IO_NOTIFY;
414#ifdef CONFIG_DAWN_IO_HAS_STATS
415 buildFlags |= CAPS_BUILD_IO_HAS_STATS;
417#ifdef CONFIG_DAWN_OBJECT_HAS_NAME
418 buildFlags |= CAPS_BUILD_OBJECT_HASNAME;
420#if CONFIG_DAWN_DESC_SLOTS > 1
421 buildFlags |= CAPS_BUILD_DESC_DYNAMIC;
431 setMetaWord(0, dtypeBitmap);
433 setMetaWord(2, ioFlagsBitmap);
435 setMetaWord(4, buildFlags);
437 setMetaWord(6, CONFIG_DAWN_DESC_SLOTS);
438 setMetaWord(7, CONFIG_DAWN_DESC_SLOT_SIZE);
439 setMetaWord(8, 0x1ffu);
440 setMetaWord(9, 0x1ffu);
441 setMetaWord(10, 0x1ffu);
445int CIOCapabilities::configurePayload()
447 std::memset(payloadBuf, 0,
sizeof(payloadBuf));
455size_t CIOCapabilities::copyFromBlob(uint8_t *dst,
size_t offset,
size_t len)
const
457 uint8_t hdr[CAPS_HDR_SIZE];
464 hdr[0] = CAPS_VERSION;
466 hdr[2] =
static_cast<uint8_t
>(CAPS_PAYLOAD_SIZE & 0xff);
467 hdr[3] =
static_cast<uint8_t
>((CAPS_PAYLOAD_SIZE >> 8) & 0xff);
475 if (offset < CAPS_HDR_SIZE)
478 hcopy = CAPS_HDR_SIZE - hstart;
484 std::memcpy(dst, &hdr[hstart], hcopy);
490 if (offset + copied < CAPS_HDR_SIZE)
496 pstart = offset + copied - CAPS_HDR_SIZE;
499 pcopy = CAPS_PAYLOAD_SIZE - pstart;
500 if (pcopy > (len - copied))
502 pcopy = len - copied;
507 std::memcpy(dst + copied, payloadBuf + pstart, pcopy);
515CIOCapabilities::~CIOCapabilities()
524 ret = configureDesc(
getDesc());
530 return configurePayload();
568 avail = total - offset;
570 copyFromBlob(
static_cast<uint8_t *
>(data.
getDataPtr()), offset, toCopy);
577 return CAPS_TOTAL_SIZE;
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.
@ IO_CLASS_SENSOR_PRODUCER_MAGNETICFIELD
Magnetic field publisher.
@ IO_CLASS_SENSOR_MAGNETICFIELD
Magnetic field sensor.
@ IO_CLASS_SENSOR_PRODUCER_ACCELEROMETER
Accelerometer publisher.
@ IO_CLASS_DAC
Digital-to-analog converter.
@ IO_CLASS_TRIGGER
Trigger I/O.
@ IO_CLASS_PWM
PWM output.
@ IO_CLASS_SYSTEM_RESETCAUSE
Reset cause.
@ IO_CLASS_ADC_STREAM
ADC stream (batch/high-throughput)
@ IO_CLASS_VIRT
Virtual I/O.
@ IO_CLASS_SYSTEM_UPTIME
System uptime.
@ IO_CLASS_SYSTEM_POWEROFF
Power off control.
@ IO_CLASS_GPI_SINGLE
Single GPIO input.
@ IO_CLASS_SENSOR_PRODUCER_LIGHT
Light publisher.
@ IO_CLASS_SENSOR_PRODUCER_ATEMPERATURE
Ambient temperature publisher.
@ IO_CLASS_ANY
Any I/O class.
@ IO_CLASS_SYSTEM_SYSTEMTIME
System time.
@ IO_CLASS_SENSOR_PRODUCER_HUMIDITY
Humidity publisher.
@ IO_CLASS_ENCODER_INDEX
Quadrature encoder (position+index)
@ IO_CLASS_SENSOR_PRODUCER_IR
Infrared publisher.
@ IO_CLASS_ADC_FETCH
ADC fetch (on-demand)
@ IO_CLASS_CAPABILITIES
Capabilities bitmask I/O.
@ IO_CLASS_SENSOR_LIGHT
Light sensor.
@ IO_CLASS_SENSOR_BAROMETER
Barometer sensor.
@ IO_CLASS_SENSOR_PRODUCER_UV
Ultraviolet publisher.
@ IO_CLASS_SENSOR_HUMIDITY
Humidity sensor.
@ IO_CLASS_SENSOR_PROXIMITY
Proximity sensor.
@ IO_CLASS_SENSOR_PRODUCER_GAS
Gas publisher.
@ IO_CLASS_SENSOR_TEMPERATURE
Temperature sensor.
@ IO_CLASS_FILE
File system I/O.
@ IO_CLASS_SENSOR_PRODUCER_GYROSCOPE
Gyroscope publisher.
@ IO_CLASS_CONTROL
Control I/O.
@ IO_CLASS_BUTTONS
Button input.
@ IO_CLASS_SYSTEM_HOSTNAME
System hostname.
@ IO_CLASS_SENSOR_PRODUCER_RGB
RGB color publisher.
@ IO_CLASS_SENSOR_PRODUCER_TEMPERATURE
Temperature publisher.
@ IO_CLASS_SENSOR_UV
Ultraviolet sensor.
@ IO_CLASS_CONFIG
Configuration I/O.
@ IO_CLASS_DESC_SELECTOR
Descriptor slot selector I/O.
@ IO_CLASS_DUMMY
Dummy I/O (for testing)
@ IO_CLASS_SENSOR_ACCELEROMETER
Accelerometer sensor.
@ IO_CLASS_SENSOR_RGB
RGB color sensor.
@ IO_CLASS_TIMESTAMP
Timestamp generator.
@ IO_CLASS_SENSOR_GYROSCOPE
Gyroscope sensor.
@ IO_CLASS_SYSTEM_UUID
UUID.
@ IO_CLASS_ADC_SYNC
ADC sync (HW-triggered control loop)
@ IO_CLASS_ENCODER
Quadrature encoder (position)
@ IO_CLASS_GPO_SINGLE
Single GPIO output.
@ IO_CLASS_SENSOR_IR
Infrared sensor.
@ IO_CLASS_SYSTEM_CPULOAD
CPU load.
@ IO_CLASS_SENSOR_PRODUCER_PROXIMITY
Proximity publisher.
@ IO_CLASS_SENSOR_ATEMPERATURE
Ambient temperature sensor.
@ IO_CLASS_DUMMY_NOTIFY
Timer-driven dummy IO.
@ IO_CLASS_LEDS
LED output.
@ IO_CLASS_RGBLED
RGB LED output.
@ IO_CLASS_RAND
Random number generator.
@ IO_CLASS_SENSOR_GAS
Gas sensor.
@ IO_CLASS_SENSOR_PRODUCER_BAROMETER
Barometer publisher.
@ IO_CLASS_DESCRIPTOR
Descriptor I/O.
@ IO_CLASS_SYSTEM_RESET
System reset control.
CDescObject & getDesc()
Get descriptor object for this object.
@ PROG_CLASS_LATEST
Cache latest notified sample for fetch-based readers.
@ PROG_CLASS_MOVING_AVG
Moving average filter.
@ PROG_CLASS_IIR_FILTER
First-order IIR filter.
@ PROG_CLASS_DUMMY
Dummy program (test/helper).
@ PROG_CLASS_THRESHOLD_VALUE
Threshold comparator returning gated source value.
@ PROG_CLASS_STATS_MAX
Maximum value tracker.
@ PROG_CLASS_STATS_MIN
Minimum value tracker.
@ PROG_CLASS_GATEWAY
Protocol-to-protocol IO gateway.
@ PROG_CLASS_SEQUENCER
Periodic state sequencer.
@ PROG_CLASS_STATS_SUM
Sum accumulator.
@ PROG_CLASS_BUFFER
Notify-driven history capture buffer.
@ PROG_CLASS_SAMPLING
Periodic data sampler.
@ PROG_CLASS_THRESHOLD
Threshold and hysteresis comparator.
@ PROG_CLASS_REDIRECT
Generic input-to-output routing bridge.
@ PROG_CLASS_STATS_RMS
Running RMS (root mean square) calculator.
@ PROG_CLASS_ADJUST
Scale/offset adjustment.
@ PROG_CLASS_STATS_COUNT
Sample counter.
@ PROG_CLASS_STATS_AVG
Running average calculator.
@ PROTO_CLASS_NXSCOPE_UDP
NxScope real-time visualization (UDP interface).
@ PROTO_CLASS_MODBUS_TCP
Modbus TCP (network implementation).
@ PROTO_CLASS_MODBUS_RTU
Modbus RTU (serial implementation).
@ PROTO_CLASS_NXSCOPE_SERIAL
NxScope real-time visualization (serial interface).
@ PROTO_CLASS_DUMMY
Dummy protocol (test/helper).
@ PROTO_CLASS_UDP
UDP-based protocol.
@ PROTO_CLASS_SERIAL
Compact binary protocol over serial port.
@ PROTO_CLASS_NIMBLE_PRPH
BLE Peripheral using Apache NimBLE stack.
@ PROTO_CLASS_IPC
FIFO-based local IPC protocol.
@ PROTO_CLASS_NXSCOPE_DUMMY
NxScope real-time visualization (dummy interface).
@ PROTO_CLASS_SHELL_STD
Interactive shell on stdin/stdout.
@ PROTO_CLASS_CAN
CAN bus protocol.
Out-of-tree user-extension hooks for Dawn.
Base interface for I/O data buffers (static and dynamic).
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).
@ DTYPE_INT32
Signed 32-bit integer (-2147483648 to 2147483647).
@ DTYPE_UINT8
Unsigned 8-bit integer (0 to 255).
@ DTYPE_INT16
Signed 16-bit integer (-32768 to 32767).
@ DTYPE_INT8
Signed 8-bit integer (-128 to 127).
@ DTYPE_ANY
Wildcard data type (matches any actual type).
@ DTYPE_BLOCK
Opaque block/byte-stream data type.
@ DTYPE_UINT64
Unsigned 64-bit integer.
@ DTYPE_UINT16
Unsigned 16-bit integer (0 to 65535).
@ DTYPE_UB16
Unsigned 16.16 fixed-point (32-bit).
@ DTYPE_DOUBLE
IEEE 754 double-precision floating point (64-bit).
@ DTYPE_CHAR
Character/string type (null-terminated, 4-byte aligned).
@ DTYPE_INT64
Signed 64-bit integer.
@ DTYPE_UINT32
Unsigned 32-bit integer (0 to 4294967295).
@ DTYPE_BOOL
Boolean data type (stored in 32-bit container).
@ DTYPE_B16
Signed 16.16 fixed-point (32-bit).
ObjectCfgId v
Raw 32-bit ConfigID value (for storage, comparison).
uint32_t cls
Object class (bits 21-29, max 511).
struct dawn::SObjectCfg::UObjectCfgId::@10 s
Bit-field structure for named member access.