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 };
108
109 for (size_t i = 0; i < sizeof(map) / sizeof(map[0]); i++)
110 {
111 if (map[i].cls == cls)
112 {
113 return &map[i];
114 }
115 }
116
117 return nullptr;
118 }
119
120 static int16_t producerToSensorClass(int16_t cls)
121 {
122 static_assert(CIOCommon::IO_CLASS_SENSOR_PRODUCER_GAS -
123 CIOCommon::IO_CLASS_SENSOR_PRODUCER_ACCELEROMETER ==
124 CIOCommon::IO_CLASS_SENSOR_GAS - CIOCommon::IO_CLASS_SENSOR_ACCELEROMETER,
125 "Sensor and sensor producer class ranges must stay aligned");
126
127 if (cls < CIOCommon::IO_CLASS_SENSOR_PRODUCER_ACCELEROMETER ||
128 cls > CIOCommon::IO_CLASS_SENSOR_PRODUCER_GAS)
129 {
130 return CIOCommon::IO_CLASS_ANY;
131 }
132
133 return cls - CIOCommon::IO_CLASS_SENSOR_PRODUCER_ACCELEROMETER +
134 CIOCommon::IO_CLASS_SENSOR_ACCELEROMETER;
135 }
136};
137} // namespace dawn
@ IO_CLASS_SENSOR_ACCELEROMETER
Accelerometer sensor.
Definition common.hxx:113
Out-of-tree user-extension hooks for Dawn.
Definition bindable.hxx:13