Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions Documentation/components/io/sensor.rst
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ Dawn Type Default Dawn Unit
``ir`` ``float`` or ``b16``, lux
``uv`` ``float`` or ``b16``, UV index
``gas`` ``float`` or ``b16``, kilohms
``co2`` ``float`` or ``b16``, ppm
``tvoc`` ``float`` or ``b16``, ppm
``gnss`` ``float``, 5-vector: latitude, longitude (degrees), altitude (metres), ground speed (m/s), course (degrees)
``gnss_time`` ``uint64``, UTC time in seconds since the Unix epoch
``gnss_info`` ``float``, 5-vector: horizontal/vertical accuracy (metres), HDOP, PDOP, VDOP
Expand Down Expand Up @@ -107,6 +109,8 @@ underlying NuttX sensor structures:
"ir", "sensor_ir", "struct sensor_ir"
"uv", "sensor_uv", "struct sensor_uv"
"gas", "sensor_gas", "struct sensor_gas"
"co2", "sensor_co2", "struct sensor_co2"
"tvoc", "sensor_tvoc", "struct sensor_tvoc"
"gnss", "sensor_gnss", "struct sensor_gnss"
"gnss_time", "sensor_gnss", "struct sensor_gnss"
"gnss_info", "sensor_gnss", "struct sensor_gnss"
Expand Down
2 changes: 2 additions & 0 deletions Documentation/components/proto/nimble/imds.rst
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ Supported keys:
- ``uv_index``
- ``gas_resistance`` (uses non-standard 0x272A UUID; see :ref:`nimble_units`)
- ``light``
- ``co2`` (CO2 Concentration, 0x2B8C)
- ``tvoc`` (VOC Concentration, 0x2BE7)

Each measurement may be either a direct IO reference or a mapping with
``data``/``io`` and ``metadata``. Supported metadata:
Expand Down
2 changes: 2 additions & 0 deletions Documentation/components/proto/nimble/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,8 @@ Relative Humidity float, percent (%), scale = 1 sint16, percent (%),
PM1P0 float, SI units (ug/m^3), scale = 1 not yet supported in Dawn
PH float, pH unit, scale = 1 not yet supported in Dawn
Gas resistance float, kilohm, scale = 1 sint16, kilohm, scale = 1 (non-standard UUID 0x272A)
CO2 float, ppm, scale = 1 uint16, ppm, scale = 1
TVOC float, ppm, scale = 1 uint16, ppb, scale = 1000
Force float, N unit, scale = 1 not yet supported in Dawn
Hall int32_t, hall state not yet supported in Dawn
IR float, lux unit, scale = 1 uint24, lux, scale = 0.01
Expand Down
7 changes: 7 additions & 0 deletions boards/arm/nrf52/thingy52/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# boards/arm/nrf52/thingy52/CMakeLists.txt
#
# SPDX-License-Identifier: Apache-2.0
#

add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../../../common
${CMAKE_BINARY_DIR}/boards/common)
105 changes: 105 additions & 0 deletions boards/arm/nrf52/thingy52/configs/nimble_thingy52/defconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
#
# This file is autogenerated: PLEASE DO NOT EDIT IT.
#
# You can use "make menuconfig" to make any modifications to the installed .config file.
# You can then do "make savedefconfig" to generate a new defconfig file that includes your
# modifications.
#
# CONFIG_NET_ETHERNET is not set
# CONFIG_NET_IPv4 is not set
# CONFIG_STANDARD_SERIAL is not set
# CONFIG_WIRELESS_BLUETOOTH_HOST is not set
CONFIG_ADC=y
CONFIG_ADC_FIFOSIZE=2
CONFIG_ALLOW_BSDNORDIC_COMPONENTS=y
CONFIG_ALLOW_BSD_COMPONENTS=y
CONFIG_ANALOG=y
CONFIG_ARCH="arm"
CONFIG_ARCH_BOARD_COMMON=y
CONFIG_ARCH_BOARD_CUSTOM=y
CONFIG_ARCH_BOARD_CUSTOM_DIR="boards/arm/nrf52/thingy52/"
CONFIG_ARCH_BOARD_CUSTOM_DIR_RELPATH=y
CONFIG_ARCH_BOARD_CUSTOM_NAME="thingy52"
CONFIG_ARCH_CHIP="nrf52"
CONFIG_ARCH_CHIP_NRF52=y
CONFIG_ARCH_CHIP_NRF52832=y
CONFIG_ARCH_STACKDUMP=y
CONFIG_ARCH_STDARG_H=y
CONFIG_BLUETOOTH_BUFFER_PREALLOC=8
CONFIG_BOARDCTL=y
CONFIG_BOARD_LOOPSPERMSEC=5500
CONFIG_CXX_LOCALIZATION=y
CONFIG_CXX_WCHAR=y
CONFIG_DEBUG_ASSERTIONS=y
CONFIG_DEBUG_ASSERTIONS_EXPRESSION=y
CONFIG_DEBUG_FEATURES=y
CONFIG_DEBUG_FULLOPT=y
CONFIG_DEBUG_SENSORS=y
CONFIG_DEBUG_SENSORS_ERROR=y
CONFIG_DEBUG_SENSORS_INFO=y
CONFIG_DEBUG_SENSORS_WARN=y
CONFIG_DEBUG_SYMBOLS=y
CONFIG_DEV_GPIO=y
CONFIG_FS_PROCFS=y
CONFIG_GPIO_LOWER_HALF=y
CONFIG_HAVE_CXX=y
CONFIG_I2C=y
CONFIG_I2C_POLLED=y
CONFIG_IDLETHREAD_STACKSIZE=2048
CONFIG_INIT_ENTRYPOINT="dawn_main"
CONFIG_INTELHEX_BINARY=y
CONFIG_IOEXPANDER=y
CONFIG_IOEXPANDER_PWM=y
CONFIG_IOEXPANDER_SX1509=y
CONFIG_LIBCXX=y
CONFIG_LIBCXXABI=y
CONFIG_LIBC_LOCALE=y
CONFIG_LINE_MAX=64
CONFIG_MM_REGIONS=2
CONFIG_NET=y
CONFIG_IOB_NBUFFERS=4
CONFIG_NETDEV_LATEINIT=y
CONFIG_NETUTILS_NETINIT=y
CONFIG_NET_BLUETOOTH=y
CONFIG_NIMBLE=y
CONFIG_NIMBLE_TRANSPORT_ACL_FROM_HS_COUNT=3
CONFIG_NIMBLE_TRANSPORT_ACL_FROM_LL_COUNT=3
CONFIG_NIMBLE_BLE_ATT_PREFFERED_MTU=128
CONFIG_NIMBLE_MSYS_1_BLOCK_COUNT=6
CONFIG_NIMBLE_MSYS_1_BLOCK_SIZE=200
CONFIG_NIMBLE_ROLE_PERIPHERAL=y
CONFIG_NRF52_GPIOTE=y
CONFIG_NRF52_I2C0_MASTER=y
CONFIG_NRF52_SAADC=y
CONFIG_NRF52_SAADC_RESOLUTION=2
CONFIG_NRF52_SAADC_CHANNELS=1
CONFIG_NRF52_SOFTDEVICE_CONTROLLER=y
CONFIG_NRF52_SDC_DLE=y
CONFIG_NRF52_SDC_LE_2M_PHY=y
CONFIG_PREALLOC_MQ_MSGS=8
CONFIG_PWM=y
CONFIG_PWM_NCHANNELS=3
CONFIG_PREALLOC_TIMERS=4
CONFIG_RAM_SIZE=65536
CONFIG_RAM_START=0x20000000
CONFIG_RAW_BINARY=y
CONFIG_RGBLED=y
CONFIG_RR_INTERVAL=200
CONFIG_SCHED_WAITPID=y
CONFIG_SEGGER_RTT_BUFFER_SIZE_UP=256
CONFIG_SENSORS=y
CONFIG_SENSORS_CCS811=y
CONFIG_SENSORS_HTS221=y
CONFIG_SENSORS_LPS22HB=y
CONFIG_SERIAL_RTT0=y
CONFIG_SIG_EVTHREAD=y
CONFIG_START_DAY=26
CONFIG_START_MONTH=3
CONFIG_SX1509_LED_ENABLE=y
CONFIG_SYMTAB_ORDEREDBYNAME=y
CONFIG_SYSLOG_RTT=y
CONFIG_TASK_NAME_SIZE=64
CONFIG_TLS_NELEM=4
CONFIG_WIRELESS=y
CONFIG_WIRELESS_BLUETOOTH=y
#include "defconfig.dawn"
21 changes: 21 additions & 0 deletions boards/arm/nrf52/thingy52/configs/nimble_thingy52/defconfig.dawn
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
CONFIG_DAWN=y
CONFIG_DAWN_APPS_DAWN=y
CONFIG_DAWN_APPS_EXAMPLE_DESC_FORMAT_YAML=y
CONFIG_DAWN_APPS_EXAMPLE_DESC_YAML_PATH="../../../descriptors/examples/nimble_thingy52_demo.yaml"
CONFIG_DAWN_DEBUG_ERROR=y
CONFIG_DAWN_DEBUG_INFO=y
CONFIG_DAWN_DEBUG_WARN=y
CONFIG_DAWN_IO_NOTIFY=y
CONFIG_DAWN_IO_RGB_LED=y
CONFIG_DAWN_IO_ADC_FETCH=y
CONFIG_DAWN_IO_SENSOR=y
CONFIG_DAWN_IO_VIRT=y
CONFIG_DAWN_PROG=y
CONFIG_DAWN_PROG_ADJUST=y
CONFIG_DAWN_PROG_SAMPLING=y
CONFIG_DAWN_PROTO=y
CONFIG_DAWN_PROTO_NIMBLE=y
CONFIG_DAWN_PROTO_NIMBLE_BAS=y
CONFIG_DAWN_PROTO_NIMBLE_DIS=y
CONFIG_DAWN_PROTO_NIMBLE_ESS=y
CONFIG_DAWN_PROTO_NIMBLE_IMDS=y
56 changes: 30 additions & 26 deletions dawn/include/dawn/io/common.hxx
Original file line number Diff line number Diff line change
Expand Up @@ -123,47 +123,51 @@ public:
IO_CLASS_SENSOR_IR = 20, ///< Infrared sensor
IO_CLASS_SENSOR_UV = 21, ///< Ultraviolet sensor
IO_CLASS_SENSOR_GAS = 22, ///< Gas sensor
IO_CLASS_SENSOR_CO2 = 23, ///< CO2 concentration sensor
IO_CLASS_SENSOR_TVOC = 24, ///< TVOC concentration sensor

// Sensor producers

IO_CLASS_SENSOR_PRODUCER_ACCELEROMETER = 23, ///< Accelerometer publisher
IO_CLASS_SENSOR_PRODUCER_MAGNETICFIELD = 24, ///< Magnetic field publisher
IO_CLASS_SENSOR_PRODUCER_GYROSCOPE = 25, ///< Gyroscope publisher
IO_CLASS_SENSOR_PRODUCER_LIGHT = 26, ///< Light publisher
IO_CLASS_SENSOR_PRODUCER_BAROMETER = 27, ///< Barometer publisher
IO_CLASS_SENSOR_PRODUCER_PROXIMITY = 28, ///< Proximity publisher
IO_CLASS_SENSOR_PRODUCER_HUMIDITY = 29, ///< Humidity publisher
IO_CLASS_SENSOR_PRODUCER_TEMPERATURE = 30, ///< Temperature publisher
IO_CLASS_SENSOR_PRODUCER_ATEMPERATURE = 31, ///< Ambient temperature publisher
IO_CLASS_SENSOR_PRODUCER_RGB = 32, ///< RGB color publisher
IO_CLASS_SENSOR_PRODUCER_IR = 33, ///< Infrared publisher
IO_CLASS_SENSOR_PRODUCER_UV = 34, ///< Ultraviolet publisher
IO_CLASS_SENSOR_PRODUCER_GAS = 35, ///< Gas publisher
IO_CLASS_SENSOR_PRODUCER_ACCELEROMETER = 25, ///< Accelerometer publisher
IO_CLASS_SENSOR_PRODUCER_MAGNETICFIELD = 26, ///< Magnetic field publisher
IO_CLASS_SENSOR_PRODUCER_GYROSCOPE = 27, ///< Gyroscope publisher
IO_CLASS_SENSOR_PRODUCER_LIGHT = 28, ///< Light publisher
IO_CLASS_SENSOR_PRODUCER_BAROMETER = 29, ///< Barometer publisher
IO_CLASS_SENSOR_PRODUCER_PROXIMITY = 30, ///< Proximity publisher
IO_CLASS_SENSOR_PRODUCER_HUMIDITY = 31, ///< Humidity publisher
IO_CLASS_SENSOR_PRODUCER_TEMPERATURE = 32, ///< Temperature publisher
IO_CLASS_SENSOR_PRODUCER_ATEMPERATURE = 33, ///< Ambient temperature publisher
IO_CLASS_SENSOR_PRODUCER_RGB = 34, ///< RGB color publisher
IO_CLASS_SENSOR_PRODUCER_IR = 35, ///< Infrared publisher
IO_CLASS_SENSOR_PRODUCER_UV = 36, ///< Ultraviolet publisher
IO_CLASS_SENSOR_PRODUCER_GAS = 37, ///< Gas publisher
IO_CLASS_SENSOR_PRODUCER_CO2 = 38, ///< CO2 concentration publisher
IO_CLASS_SENSOR_PRODUCER_TVOC = 39, ///< TVOC concentration publisher

// GNSS sensor (uORB sensor_gnss). Read-only, so it has no producer
// counterpart and lives outside the aligned sensor/producer ranges above.

IO_CLASS_SENSOR_GNSS = 36, ///< GNSS position+velocity (lat/lon/alt/speed/course)
IO_CLASS_SENSOR_GNSS_TIME = 37, ///< GNSS UTC time (seconds since epoch)
IO_CLASS_SENSOR_GNSS_INFO = 38, ///< GNSS accuracy + DOP (eph/epv/hdop/pdop/vdop)
IO_CLASS_SENSOR_GNSS_SATELLITES = 39, ///< GNSS satellites used in fix
IO_CLASS_SENSOR_GNSS = 40, ///< GNSS position+velocity (lat/lon/alt/speed/course)
IO_CLASS_SENSOR_GNSS_TIME = 41, ///< GNSS UTC time (seconds since epoch)
IO_CLASS_SENSOR_GNSS_INFO = 42, ///< GNSS accuracy + DOP (eph/epv/hdop/pdop/vdop)
IO_CLASS_SENSOR_GNSS_SATELLITES = 43, ///< GNSS satellites used in fix

// there is 59 sensor types in Nuttx now, most likely it grows later
// we still have many free slots, but in the future, it there are no free IO slots
// we can thing about combining sensor and sensor producer

// System information

IO_CLASS_SYSTEM_UPTIME = 40, ///< System uptime
IO_CLASS_SYSTEM_CPULOAD = 41, ///< CPU load
IO_CLASS_SYSTEM_RESET = 42, ///< System reset control
IO_CLASS_SYSTEM_RESETCAUSE = 43, ///< Reset cause
IO_CLASS_SYSTEM_POWEROFF = 44, ///< Power off control
IO_CLASS_SYSTEM_HOSTNAME = 45, ///< System hostname
IO_CLASS_SYSTEM_UUID = 46, ///< UUID
IO_CLASS_SYSTEM_SYSTEMTIME = 47, ///< System time
IO_CLASS_SYSTEM_UPTIME = 44, ///< System uptime
IO_CLASS_SYSTEM_CPULOAD = 45, ///< CPU load
IO_CLASS_SYSTEM_RESET = 46, ///< System reset control
IO_CLASS_SYSTEM_RESETCAUSE = 47, ///< Reset cause
IO_CLASS_SYSTEM_POWEROFF = 48, ///< Power off control
IO_CLASS_SYSTEM_HOSTNAME = 49, ///< System hostname
IO_CLASS_SYSTEM_UUID = 50, ///< UUID
IO_CLASS_SYSTEM_SYSTEMTIME = 51, ///< System time

// Slots 48-59 reserved for future system classes (serial number,
// Slots 52-59 reserved for future system classes (serial number,
// firmware version, firmware update, etc.).

// GPIO
Expand Down
14 changes: 14 additions & 0 deletions dawn/include/dawn/io/sensor.hxx
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,10 @@ public:
return "uv";
case IO_CLASS_SENSOR_GAS:
return "gas";
case IO_CLASS_SENSOR_CO2:
return "co2";
case IO_CLASS_SENSOR_TVOC:
return "tvoc";
case IO_CLASS_SENSOR_GNSS:
return "gnss";
case IO_CLASS_SENSOR_GNSS_TIME:
Expand Down Expand Up @@ -212,6 +216,16 @@ public:
return CIOSensor::objectId(CIOCommon::IO_CLASS_SENSOR_GAS, dtype, ts, inst);
}

constexpr static SObjectId::ObjectId objectIdCo2(uint8_t dtype, bool ts, uint16_t inst)
{
return CIOSensor::objectId(CIOCommon::IO_CLASS_SENSOR_CO2, dtype, ts, inst);
}

constexpr static SObjectId::ObjectId objectIdTvoc(uint8_t dtype, bool ts, uint16_t inst)
{
return CIOSensor::objectId(CIOCommon::IO_CLASS_SENSOR_TVOC, dtype, ts, inst);
}

constexpr static SObjectId::ObjectId objectIdGnss(uint8_t dtype, bool ts, uint16_t inst)
{
return CIOSensor::objectId(CIOCommon::IO_CLASS_SENSOR_GNSS, dtype, ts, inst);
Expand Down
14 changes: 14 additions & 0 deletions dawn/include/dawn/io/sensor_producer.hxx
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,10 @@ public:
return "sprod_uv";
case IO_CLASS_SENSOR_PRODUCER_GAS:
return "sprod_gas";
case IO_CLASS_SENSOR_PRODUCER_CO2:
return "sprod_co2";
case IO_CLASS_SENSOR_PRODUCER_TVOC:
return "sprod_tvoc";
default:
return "sprod";
}
Expand Down Expand Up @@ -199,6 +203,16 @@ public:
return CIOSensorProducer::objectId(CIOCommon::IO_CLASS_SENSOR_PRODUCER_GAS, dtype, ts, inst);
}

constexpr static SObjectId::ObjectId objectIdCo2(uint8_t dtype, bool ts, uint16_t inst)
{
return CIOSensorProducer::objectId(CIOCommon::IO_CLASS_SENSOR_PRODUCER_CO2, dtype, ts, inst);
}

constexpr static SObjectId::ObjectId objectIdTvoc(uint8_t dtype, bool ts, uint16_t inst)
{
return CIOSensorProducer::objectId(CIOCommon::IO_CLASS_SENSOR_PRODUCER_TVOC, dtype, ts, inst);
}

constexpr static SObjectCfg::ObjectCfgId cfgIdQueueSize(uint16_t cls)
{
return SObjectCfg::objectCfg(SObjectId::OBJTYPE_IO,
Expand Down
16 changes: 13 additions & 3 deletions dawn/include/dawn/porting/nuttx/sensors.hxx
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,16 @@ public:
sizeof(struct sensor_gas),
1,
offsetof(struct sensor_gas, gas_resistance)},
{CIOCommon::IO_CLASS_SENSOR_CO2,
"co2",
sizeof(struct sensor_co2),
1,
offsetof(struct sensor_co2, co2)},
{CIOCommon::IO_CLASS_SENSOR_TVOC,
"tvoc",
sizeof(struct sensor_tvoc),
1,
offsetof(struct sensor_tvoc, tvoc)},
// GNSS variants (handled by CIOSensorGnss). All read the same
// /dev/uorb/sensor_gnss device; the payload offset is unused because
// CIOSensorGnss::getDataImpl assembles the specific fields itself. Only
Expand Down Expand Up @@ -143,13 +153,13 @@ public:

static int16_t producerToSensorClass(int16_t cls)
{
static_assert(CIOCommon::IO_CLASS_SENSOR_PRODUCER_GAS -
static_assert(CIOCommon::IO_CLASS_SENSOR_PRODUCER_TVOC -
CIOCommon::IO_CLASS_SENSOR_PRODUCER_ACCELEROMETER ==
CIOCommon::IO_CLASS_SENSOR_GAS - CIOCommon::IO_CLASS_SENSOR_ACCELEROMETER,
CIOCommon::IO_CLASS_SENSOR_TVOC - CIOCommon::IO_CLASS_SENSOR_ACCELEROMETER,
"Sensor and sensor producer class ranges must stay aligned");

if (cls < CIOCommon::IO_CLASS_SENSOR_PRODUCER_ACCELEROMETER ||
cls > CIOCommon::IO_CLASS_SENSOR_PRODUCER_GAS)
cls > CIOCommon::IO_CLASS_SENSOR_PRODUCER_TVOC)
{
return CIOCommon::IO_CLASS_ANY;
}
Expand Down
28 changes: 28 additions & 0 deletions dawn/include/dawn/proto/nimble/iprph.hxx
Original file line number Diff line number Diff line change
Expand Up @@ -345,6 +345,30 @@ public:

constexpr static uint16_t UUID16_RESISTANCE = 0x272a;

/**
* @brief CO2 Concentration Characteristic UUID (0x2B8C).
*
* CO2 concentration in 1 ppm units (uint16).
*/

constexpr static uint32_t UUID_CO2[4] = {0x2b8c0010, 0x7474754e, 0x694e2058, 0x454c426d};

/** @brief 16-bit UUID for CO2 Concentration characteristic. */

constexpr static uint16_t UUID16_CO2 = 0x2b8c;

/**
* @brief VOC Concentration Characteristic UUID (0x2BE7).
*
* VOC concentration in 1 ppb units (uint16).
*/

constexpr static uint32_t UUID_TVOC[4] = {0x2be70010, 0x7474754e, 0x694e2058, 0x454c426d};

/** @brief 16-bit UUID for VOC Concentration characteristic. */

constexpr static uint16_t UUID16_TVOC = 0x2be7;

/**
* @brief Scaling factors for GATT characteristics.
*
Expand All @@ -364,6 +388,10 @@ public:

{UUID16_ILLUMINANCE, 100.0f}, /** Illuminance: 0.01 lux units */

{UUID16_CO2, 1.0f}, /** CO2 concentration: 1 ppm units (no scaling) */

{UUID16_TVOC, 1000.0f}, /** VOC concentration: IO ppm -> 1 ppb units */

};

/** @brief Number of characteristic scaling entries. */
Expand Down
2 changes: 2 additions & 0 deletions dawn/include/dawn/proto/nimble/prph_imds.hxx
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ public:
PRPH_IMDS_TYPE_GAS, ///< Industrial gas resistance sensor (non-standard
///< UUID).
PRPH_IMDS_TYPE_LIGHT, ///< Industrial illuminance / light sensor.
PRPH_IMDS_TYPE_CO2, ///< Industrial CO2 concentration sensor.
PRPH_IMDS_TYPE_TVOC, ///< Industrial VOC concentration sensor.
};

struct
Expand Down
Loading
Loading