Dawn Framework 1.0
Universal data acquisition framework for embedded systems
sensors.hxx
1// dawn/include/dawn/porting/nuttx/sensors.hxx
2//
3// SPDX-License-Identifier: Apache-2.0
4//
5
6#pragma once
7
8#include <nuttx/sensors/sensor.h>
9
10#include <cstddef>
11
12#include "dawn/io/common.hxx"
13#include "dawn/porting/config.hxx"
14
15// PATH format for sensor
16
17#define SENSOR_PATH_FMT "/dev/uorb/sensor_%s%s%d"
18
19namespace dawn
20{
23class CIOSensorPorting
24{
25public:
26 // Sensor map info
27
28 struct io_sensor_map_info_s
29 {
30 int16_t cls; // Dawn sensor class
31 const char *path; // NuttX sensor path suffix
32 size_t rsize; // Kernel event structure size
33 size_t dsize; // Number of sensor_data_t payload values
34 size_t payloadOffset; // Offset of the first payload value in the event
35 } typedef SIOSensorMapInfo;
36
37 // Get sensor info
38
39 static const SIOSensorMapInfo *getSensorInfo(int16_t cls)
40 {
41 static const SIOSensorMapInfo map[] = {
43 "accel",
44 sizeof(struct sensor_accel),
45 4,
46 offsetof(struct sensor_accel, x)},
47 {CIOCommon::IO_CLASS_SENSOR_MAGNETICFIELD,
48 "mag",
49 sizeof(struct sensor_mag),
50 4,
51 offsetof(struct sensor_mag, x)},
52 {CIOCommon::IO_CLASS_SENSOR_GYROSCOPE,
53 "gyro",
54 sizeof(struct sensor_gyro),
55 4,
56 offsetof(struct sensor_gyro, x)},
57 {CIOCommon::IO_CLASS_SENSOR_LIGHT,
58 "light",
59 sizeof(struct sensor_light),
60 2,
61 offsetof(struct sensor_light, light)},
62 {CIOCommon::IO_CLASS_SENSOR_BAROMETER,
63 "baro",
64 sizeof(struct sensor_baro),
65 2,
66 offsetof(struct sensor_baro, pressure)},
67 {CIOCommon::IO_CLASS_SENSOR_PROXIMITY,
68 "prox",
69 sizeof(struct sensor_prox),
70 1,
71 offsetof(struct sensor_prox, proximity)},
72 {CIOCommon::IO_CLASS_SENSOR_HUMIDITY,
73 "humi",
74 sizeof(struct sensor_humi),
75 1,
76 offsetof(struct sensor_humi, humidity)},
77 {CIOCommon::IO_CLASS_SENSOR_TEMPERATURE,
78 "temp",
79 sizeof(struct sensor_temp),
80 1,
81 offsetof(struct sensor_temp, temperature)},
82 {CIOCommon::IO_CLASS_SENSOR_ATEMPERATURE,
83 "ambient_temp",
84 sizeof(struct sensor_temp),
85 1,
86 offsetof(struct sensor_temp, temperature)},
87 {CIOCommon::IO_CLASS_SENSOR_RGB,
88 "rgb",
89 sizeof(struct sensor_rgb),
90 3,
91 offsetof(struct sensor_rgb, r)},
92 {CIOCommon::IO_CLASS_SENSOR_IR,
93 "ir",
94 sizeof(struct sensor_ir),
95 1,
96 offsetof(struct sensor_ir, ir)},
97 {CIOCommon::IO_CLASS_SENSOR_UV,
98 "uv",
99 sizeof(struct sensor_uv),
100 1,
101 offsetof(struct sensor_uv, uvi)},
102 {CIOCommon::IO_CLASS_SENSOR_GAS,
103 "gas",
104 sizeof(struct sensor_gas),
105 1,
106 offsetof(struct sensor_gas, gas_resistance)},
107 {CIOCommon::IO_CLASS_SENSOR_CO2,
108 "co2",
109 sizeof(struct sensor_co2),
110 1,
111 offsetof(struct sensor_co2, co2)},
112 {CIOCommon::IO_CLASS_SENSOR_TVOC,
113 "tvoc",
114 sizeof(struct sensor_tvoc),
115 1,
116 offsetof(struct sensor_tvoc, tvoc)},
117 // GNSS variants (handled by CIOSensorGnss). All read the same
118 // /dev/uorb/sensor_gnss device; the payload offset is unused because
119 // CIOSensorGnss::getDataImpl assembles the specific fields itself. Only
120 // the element count (dim) matters here, for getDataSize().
121 {CIOCommon::IO_CLASS_SENSOR_GNSS, // position+velocity: lat/lon/alt/speed/course
122 "gnss",
123 sizeof(struct sensor_gnss),
124 5,
125 0},
126 {CIOCommon::IO_CLASS_SENSOR_GNSS_TIME, // UTC seconds (uint64)
127 "gnss",
128 sizeof(struct sensor_gnss),
129 1,
130 0},
131 {CIOCommon::IO_CLASS_SENSOR_GNSS_INFO, // eph/epv/hdop/pdop/vdop
132 "gnss",
133 sizeof(struct sensor_gnss),
134 5,
135 0},
136 {CIOCommon::IO_CLASS_SENSOR_GNSS_SATELLITES, // satellites used (uint32)
137 "gnss",
138 sizeof(struct sensor_gnss),
139 1,
140 0},
141 };
142
143 for (size_t i = 0; i < sizeof(map) / sizeof(map[0]); i++)
144 {
145 if (map[i].cls == cls)
146 {
147 return &map[i];
148 }
149 }
150
151 return nullptr;
152 }
153
154 static int16_t producerToSensorClass(int16_t cls)
155 {
156 static_assert(CIOCommon::IO_CLASS_SENSOR_PRODUCER_TVOC -
157 CIOCommon::IO_CLASS_SENSOR_PRODUCER_ACCELEROMETER ==
158 CIOCommon::IO_CLASS_SENSOR_TVOC - CIOCommon::IO_CLASS_SENSOR_ACCELEROMETER,
159 "Sensor and sensor producer class ranges must stay aligned");
160
161 if (cls < CIOCommon::IO_CLASS_SENSOR_PRODUCER_ACCELEROMETER ||
162 cls > CIOCommon::IO_CLASS_SENSOR_PRODUCER_TVOC)
163 {
164 return CIOCommon::IO_CLASS_ANY;
165 }
166
167 return cls - CIOCommon::IO_CLASS_SENSOR_PRODUCER_ACCELEROMETER +
168 CIOCommon::IO_CLASS_SENSOR_ACCELEROMETER;
169 }
170};
171} // namespace dawn
@ IO_CLASS_SENSOR_ACCELEROMETER
Accelerometer sensor.
Definition common.hxx:113
Out-of-tree user-extension hooks for Dawn.
Definition bindable.hxx:13