6#include "dawn/io/sensor_producer.hxx"
11#include <nuttx/sensors/sensor.h>
15int CIOSensorProducer::configureDesc(
const CDescObject &desc)
20 for (
size_t i = 0; i < desc.
getSize(); i++)
44 DAWNERR(
"Sensor producer config class %u does not match object class %u\n",
52 case CIOSensorProducer::IO_SENSOR_PRODUCER_CFG_QUEUE_SIZE:
54 const uint32_t *tmp =
reinterpret_cast<const uint32_t *
>(&item->
data);
60 case CIOSensorProducer::IO_SENSOR_PRODUCER_CFG_PERSIST:
62 const uint32_t *tmp =
reinterpret_cast<const uint32_t *
>(&item->
data);
63 persist = (*tmp != 0);
70 DAWNERR(
"Unsupported sensor producer config 0x%08" PRIx32
"\n",
86 DAWNERR(
"Unsupported sensor producer config 0x%08" PRIx32
"\n", item->
cfgid.
v);
95CIOSensorProducer::~CIOSensorProducer()
107 DAWNERR(
"Unsupported sensor producer class %d\n",
getCls());
111#ifdef CONFIG_SENSORS_USE_B16
114 DAWNERR(
"Sensor producer requires DTYPE_B16 when CONFIG_SENSORS_USE_B16 is enabled\n");
120 DAWNERR(
"Sensor producer requires DTYPE_FLOAT when CONFIG_SENSORS_USE_FLOAT is enabled\n");
126 if (dtypeSize !=
sizeof(sensor_data_t))
128 DAWNERR(
"Sensor producer dtype size %d does not match NuttX sensor data size %zu\n",
130 sizeof(sensor_data_t));
134 if (info->path ==
nullptr || info->rsize == 0 || info->dsize == 0 ||
137 DAWNERR(
"Unsupported sensor producer class %d\n",
getCls());
141 if (DATA_BUFFER_SIZE < info->rsize)
144 "Sensor producer event size %zu exceeds buffer size %zu\n", info->rsize, DATA_BUFFER_SIZE);
148 ret = configureDesc(
getDesc());
151 DAWNERR(
"Sensor producer configure failed (error %d)\n", ret);
157 DAWNERR(
"SENSOR producer device number not configured\n");
161 snprintf(path,
sizeof(path), SENSOR_PATH_FMT, info->path,
"",
getCmnDevno());
163 ret = sensor_user_register(path, info->rsize, queueSize, persist);
168 else if (ret != -EEXIST)
170 DAWNERR(
"failed to register sensor producer %s %d\n", path, ret);
174 fd = sensor_open_write(path);
179 sensor_user_unregister(path);
198 sensor_user_unregister(path);
207 uint8_t buf[DATA_BUFFER_SIZE];
221 std::memset(buf, 0, info->rsize);
222 eventTs =
reinterpret_cast<io_ts_t *
>(buf);
223 *eventTs = sensor_get_timestamp();
226 ret = sensor_write(fd, buf, info->rsize);
229 DAWNERR(
"sensor producer write failed %d\n", ret);
233 if (
static_cast<size_t>(ret) != info->rsize)
238#ifdef CONFIG_DAWN_IO_TIMESTAMP
241 eventTs =
reinterpret_cast<io_ts_t *
>(buf);
251 return info !=
nullptr ? info->dsize *
sizeof(sensor_data_t) : 0;
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.
bool isTimestamp() const
Check if I/O supports timestamp.
int getCmnDevno() const
Get device number for this I/O.
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_PRODUCER_ACCELEROMETER
Accelerometer publisher.
@ IO_CLASS_SENSOR_PRODUCER_LIGHT
Light publisher.
@ IO_CLASS_SENSOR_PRODUCER_ATEMPERATURE
Ambient temperature publisher.
@ IO_CLASS_ANY
Any I/O class.
@ IO_CLASS_SENSOR_PRODUCER_HUMIDITY
Humidity publisher.
@ IO_CLASS_SENSOR_PRODUCER_IR
Infrared publisher.
@ IO_CLASS_SENSOR_PRODUCER_UV
Ultraviolet publisher.
@ IO_CLASS_SENSOR_PRODUCER_GAS
Gas publisher.
@ IO_CLASS_SENSOR_PRODUCER_GYROSCOPE
Gyroscope publisher.
@ IO_CLASS_SENSOR_PRODUCER_CO2
CO2 concentration publisher.
@ IO_CLASS_SENSOR_PRODUCER_RGB
RGB color publisher.
@ IO_CLASS_SENSOR_PRODUCER_TEMPERATURE
Temperature publisher.
@ IO_CLASS_SENSOR_PRODUCER_TVOC
TVOC concentration publisher.
@ IO_CLASS_SENSOR_PRODUCER_PROXIMITY
Proximity publisher.
@ IO_CLASS_SENSOR_PRODUCER_BAROMETER
Barometer publisher.
size_t getDataDim() const
Get data vector dimension.
int configure()
Configure object from descriptor data.
int setDataImpl(IODataCmn &data)
Set data implementation (override in derived classes).
size_t getDataSize() const
Get data size in bytes.
int deinit()
De-initialize object.
uint16_t getCls() const
Get object class field.
CDescObject & getDesc()
Get descriptor object for this object.
uint8_t getDtype() const
Get data type field.
Out-of-tree user-extension hooks for Dawn.
uint64_t io_ts_t
Timestamp data type (uint64_t, typically microseconds since boot).
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.
ObjectCfgData_t data[]
Configuration data array (flexible, size from cfgid.s.size).
UObjectCfgId cfgid
Configuration ID header (type, class, id, size, rw, dtype).
EObjectDataType
Data types supported by Dawn framework.
@ DTYPE_FLOAT
IEEE 754 single-precision floating point (32-bit).
@ DTYPE_B16
Signed 16.16 fixed-point (32-bit).
static int getDtypeSize_(const EObjectDataType dtype)
Get byte size for a specific data type.
ObjectCfgId v
Raw 32-bit ConfigID value (for storage, comparison).
uint32_t cls
Object class (bits 21-29, max 511).
uint32_t id
Configuration identifier (bits 0-4, max 31).
struct dawn::SObjectCfg::UObjectCfgId::@10 s
Bit-field structure for named member access.