cleanup ikoka variants and add all supported sensors

This commit is contained in:
Rastislav Vysoky
2026-01-12 19:29:32 +01:00
parent e31c46ff56
commit 324eab9394
3 changed files with 90 additions and 146 deletions

View File

@@ -1,8 +1,5 @@
[ikoka_nrf52]
extends = Xiao_nrf52
lib_deps = ${nrf52_base.lib_deps}
${sensor_base.lib_deps}
densaugeo/base64 @ ~1.4.0
[ikoka_handheld_nrf]
extends = nrf52_base
build_flags = ${nrf52_base.build_flags}
${sensor_base.build_flags}
-I lib/nrf52/s140_nrf52_7.3.0_API/include
@@ -26,12 +23,15 @@ build_flags = ${nrf52_base.build_flags}
build_src_filter = ${nrf52_base.build_src_filter}
+<../variants/ikoka_handheld_nrf>
+<helpers/sensors>
lib_deps = ${nrf52_base.lib_deps}
${sensor_base.lib_deps}
densaugeo/base64 @ ~1.4.0
# larger screen has a different driver, this is for the 0.96 inch
[ikoka_nrf52_ssd1306_companion]
lib_deps = ${ikoka_nrf52.lib_deps}
[ikoka_handheld_nrf_ssd1306_companion]
lib_deps = ${ikoka_handheld_nrf.lib_deps}
adafruit/Adafruit SSD1306 @ ^2.5.13
build_flags = ${ikoka_nrf52.build_flags}
build_flags = ${ikoka_handheld_nrf.build_flags}
-D DISPLAY_CLASS=SSD1306Display
-D DISPLAY_ROTATION=0
-D PIN_WIRE_SCL=D6
@@ -42,62 +42,62 @@ build_flags = ${ikoka_nrf52.build_flags}
-D OFFLINE_QUEUE_SIZE=256
-D QSPIFLASH=1
-I examples/companion_radio/ui-new
build_src_filter = ${ikoka_nrf52.build_src_filter}
build_src_filter = ${ikoka_handheld_nrf.build_src_filter}
+<helpers/ui/SSD1306Display.cpp>
+<../examples/companion_radio/ui-new/UITask.cpp>
+<../examples/companion_radio/*.cpp>
[env:ikoka_handheld_nrf_e22_30dbm_096_companion_radio_ble]
extends = ikoka_nrf52
build_flags = ${ikoka_nrf52_ssd1306_companion.build_flags}
build_flags = ${ikoka_handheld_nrf_ssd1306_companion.build_flags}
-D BLE_PIN_CODE=123456
-D LORA_TX_POWER=20
build_src_filter = ${ikoka_nrf52_ssd1306_companion.build_src_filter}
build_src_filter = ${ikoka_handheld_nrf_ssd1306_companion.build_src_filter}
+<helpers/nrf52/SerialBLEInterface.cpp>
[env:ikoka_handheld_nrf_e22_30dbm_096_rotated_companion_radio_ble]
extends = ikoka_nrf52
build_flags = ${ikoka_nrf52_ssd1306_companion.build_flags}
build_flags = ${ikoka_handheld_nrf_ssd1306_companion.build_flags}
-D BLE_PIN_CODE=123456
-D LORA_TX_POWER=20
-D DISPLAY_ROTATION=2
build_src_filter = ${ikoka_nrf52_ssd1306_companion.build_src_filter}
-D DISPLAY_ROTATION=2
build_src_filter = ${ikoka_handheld_nrf_ssd1306_companion.build_src_filter}
+<helpers/nrf52/SerialBLEInterface.cpp>
[env:ikoka_handheld_nrf_e22_30dbm_096_companion_radio_usb]
extends = ikoka_nrf52
build_flags = ${ikoka_nrf52_ssd1306_companion.build_flags}
build_flags = ${ikoka_handheld_nrf_ssd1306_companion.build_flags}
-D LORA_TX_POWER=20
build_src_filter = ${ikoka_nrf52_ssd1306_companion.build_src_filter}
build_src_filter = ${ikoka_handheld_nrf_ssd1306_companion.build_src_filter}
[env:ikoka_handheld_nrf_e22_30dbm_096_rotated_companion_radio_usb]
extends = ikoka_nrf52
build_flags = ${ikoka_nrf52_ssd1306_companion.build_flags}
build_flags = ${ikoka_handheld_nrf_ssd1306_companion.build_flags}
-D LORA_TX_POWER=20
-D DISPLAY_ROTATION=2
build_src_filter = ${ikoka_nrf52_ssd1306_companion.build_src_filter}
build_src_filter = ${ikoka_handheld_nrf_ssd1306_companion.build_src_filter}
[env:ikoka_handheld_nrf_e22_30dbm_repeater]
extends = ikoka_nrf52
build_flags =
${ikoka_nrf52.build_flags}
${ikoka_handheld_nrf.build_flags}
-D ADVERT_NAME='"ikoka_handheld Repeater"'
-D ADVERT_LAT=0.0
-D ADVERT_LON=0.0
-D ADMIN_PASSWORD='"password"'
-D MAX_NEIGHBOURS=50
-D LORA_TX_POWER=20
build_src_filter = ${ikoka_nrf52.build_src_filter}
-D LORA_TX_POWER=20
build_src_filter = ${ikoka_handheld_nrf.build_src_filter}
+<../examples/simple_repeater/*.cpp>
[env:ikoka_handheld_nrf_e22_30dbm_room_server]
extends = ikoka_nrf52
build_flags =
${ikoka_nrf52.build_flags}
${ikoka_handheld_nrf.build_flags}
-D ADVERT_NAME='"ikoka_handheld Room"'
-D ADVERT_LAT=0.0
-D ADVERT_LON=0.0
-D ADMIN_PASSWORD='"password"'
-D LORA_TX_POWER=20
build_src_filter = ${ikoka_nrf52.build_src_filter}
-D LORA_TX_POWER=20
build_src_filter = ${ikoka_handheld_nrf.build_src_filter}
+<../examples/simple_room_server/*.cpp>

View File

@@ -1,151 +1,124 @@
[nrf52840_xiao]
[ikoka_nano_nrf]
extends = nrf52_base
platform_packages =
toolchain-gccarmnoneeabi@~1.100301.0
framework-arduinoadafruitnrf52
board = seeed-xiao-afruitnrf52-nrf52840
board_build.ldscript = boards/nrf52840_s140_v7.ld
build_flags = ${nrf52_base.build_flags}
${sensor_base.build_flags}
-D NRF52_PLATFORM -D XIAO_NRF52
-I lib/nrf52/s140_nrf52_7.3.0_API/include
-I lib/nrf52/s140_nrf52_7.3.0_API/include/nrf52
lib_ignore =
BluetoothOTA
lvgl
lib5b4
lib_deps =
${nrf52_base.lib_deps}
rweather/Crypto @ ^0.4.0
adafruit/Adafruit INA3221 Library @ ^1.0.1
adafruit/Adafruit INA219 @ ^1.2.3
adafruit/Adafruit AHTX0 @ ^2.0.5
adafruit/Adafruit BME280 Library @ ^2.3.0
adafruit/Adafruit SSD1306 @ ^2.5.13
[ikoka_nano_nrf_baseboard]
extends = nrf52840_xiao
;board_build.ldscript = boards/nrf52840_s140_v7.ld
build_flags = ${nrf52840_xiao.build_flags}
-D P_LORA_TX_LED=11
-I variants/ikoka_nano_nrf
-I src/helpers/nrf52
-D P_LORA_TX_LED=11
-D DISPLAY_CLASS=NullDisplayDriver
-D RADIO_CLASS=CustomSX1262
-D WRAPPER_CLASS=CustomSX1262Wrapper
-D P_LORA_DIO_1=D1
; -D P_LORA_BUSY=D3
-D P_LORA_BUSY=D2 ; specific to ikoka nano variant.
; -D P_LORA_RESET=D2
-D P_LORA_RESET=D3 ; specific to ikoka nano variant.
; -D P_LORA_NSS=D4
-D P_LORA_NSS=D0 ; specific to ikoka nano variant.
; -D SX126X_RXEN=D5
-D P_LORA_BUSY=D2
-D P_LORA_RESET=D3
-D P_LORA_NSS=D0
-D SX126X_RXEN=D7
-D SX126X_TXEN=RADIOLIB_NC
-D SX126X_DIO2_AS_RF_SWITCH=1
-D SX126X_DIO3_TCXO_VOLTAGE=1.8
-D SX126X_CURRENT_LIMIT=140
-D SX126X_RX_BOOSTED_GAIN=1
-D PIN_WIRE_SCL=5 ; specific to ikoka nano variant.
-D PIN_WIRE_SDA=4 ; specific to ikoka nano variant.
-D ENV_INCLUDE_AHTX0=1
-D ENV_INCLUDE_BME280=1
-D ENV_INCLUDE_INA3221=1
-D ENV_INCLUDE_INA219=1
-D PIN_WIRE_SCL=5
-D PIN_WIRE_SDA=4
-UENV_INCLUDE_GPS
debug_tool = jlink
upload_protocol = nrfutil
;;; abstracted hardware variants
lib_deps = ${nrf52_base.lib_deps}
${sensor_base.lib_deps}
[ikoka_nano_nrf_e22_22dbm]
extends = ikoka_nano_nrf_baseboard
extends = ikoka_nano_nrf
; No PA in this model, full 22dBm
build_flags =
${ikoka_nano_nrf_baseboard.build_flags}
${ikoka_nano_nrf.build_flags}
-D MANUFACTURER_STRING='"Ikoka Nano-E22-22dBm (Xiao_nrf52)"'
-D LORA_TX_POWER=22
build_src_filter = ${nrf52840_xiao.build_src_filter}
build_src_filter = ${ikoka_nano_nrf.build_src_filter}
+<helpers/*.cpp>
+<helpers/sensors>
+<helpers/ui/NullDisplayDriver.cpp>
+<../variants/ikoka_nano_nrf>
[ikoka_nano_nrf_e22_30dbm]
extends = ikoka_nano_nrf_baseboard
extends = ikoka_nano_nrf
; limit txpower to 20dBm on E22-900M30S. Anything higher will
; cause distortion in the PA output. 20dBm in -> 30dBm out
build_flags =
${ikoka_nano_nrf_baseboard.build_flags}
${ikoka_nano_nrf.build_flags}
-D MANUFACTURER_STRING='"Ikoka Nano-E22-30dBm (Xiao_nrf52)"'
-D LORA_TX_POWER=20
build_src_filter = ${nrf52840_xiao.build_src_filter}
build_src_filter = ${ikoka_nano_nrf.build_src_filter}
+<helpers/*.cpp>
+<helpers/sensors>
+<helpers/ui/NullDisplayDriver.cpp>
+<../variants/ikoka_nano_nrf>
[ikoka_nano_nrf_e22_33dbm]
extends = ikoka_nano_nrf_baseboard
extends = ikoka_nano_nrf
; limit txpower to 9dBm on E22-900M33S to avoid hardware damage
; to the rf amplifier frontend. 9dBm in -> 33dBm out
build_flags =
${ikoka_nano_nrf_baseboard.build_flags}
${ikoka_nano_nrf.build_flags}
-D MANUFACTURER_STRING='"Ikoka Nano-E22-33dBm (Xiao_nrf52)"'
-D LORA_TX_POWER=9
build_src_filter = ${nrf52840_xiao.build_src_filter}
build_src_filter = ${ikoka_nano_nrf.build_src_filter}
+<helpers/*.cpp>
+<helpers/sensors>
+<helpers/ui/NullDisplayDriver.cpp>
+<../variants/ikoka_nano_nrf>
;;; abstracted firmware roles
[ikoka_nano_nrf_companion_radio_ble]
extends = ikoka_nano_nrf_baseboard
extends = ikoka_nano_nrf
board_build.ldscript = boards/nrf52840_s140_v7_extrafs.ld
board_upload.maximum_size = 708608
build_flags =
${ikoka_nano_nrf_baseboard.build_flags}
${ikoka_nano_nrf.build_flags}
-D MAX_CONTACTS=350
-D MAX_GROUP_CHANNELS=40
-D BLE_PIN_CODE=123456
-D OFFLINE_QUEUE_SIZE=256
-I examples/companion_radio/ui-new
-D QSPIFLASH=1
; -D BLE_DEBUG_LOGGING=1
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
build_src_filter = ${ikoka_nano_nrf_baseboard.build_src_filter}
build_src_filter = ${ikoka_nano_nrf.build_src_filter}
+<helpers/nrf52/SerialBLEInterface.cpp>
+<../examples/companion_radio/*.cpp>
+<../examples/companion_radio/ui-new/*.cpp>
lib_deps =
${ikoka_nano_nrf_baseboard.lib_deps}
${ikoka_nano_nrf.lib_deps}
densaugeo/base64 @ ~1.4.0
[ikoka_nano_nrf_companion_radio_usb]
extends = ikoka_nano_nrf_baseboard
extends = ikoka_nano_nrf
board_build.ldscript = boards/nrf52840_s140_v7_extrafs.ld
board_upload.maximum_size = 708608
build_flags =
${ikoka_nano_nrf_baseboard.build_flags}
${ikoka_nano_nrf.build_flags}
-D MAX_CONTACTS=350
-D MAX_GROUP_CHANNELS=40
-I examples/companion_radio/ui-new
-D QSPIFLASH=1
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
build_src_filter = ${ikoka_nano_nrf_baseboard.build_src_filter}
build_src_filter = ${ikoka_nano_nrf.build_src_filter}
+<helpers/nrf52/SerialBLEInterface.cpp>
+<../examples/companion_radio/*.cpp>
+<../examples/companion_radio/ui-new/*.cpp>
lib_deps =
${ikoka_nano_nrf_baseboard.lib_deps}
${ikoka_nano_nrf.lib_deps}
densaugeo/base64 @ ~1.4.0
[ikoka_nano_nrf_repeater]
extends = ikoka_nano_nrf_baseboard
extends = ikoka_nano_nrf
build_flags =
${ikoka_nano_nrf_baseboard.build_flags}
${ikoka_nano_nrf.build_flags}
-D ADVERT_NAME='"Ikoka Nano Repeater"'
-D ADVERT_LAT=0.0
-D ADVERT_LON=0.0
@@ -153,26 +126,23 @@ build_flags =
-D MAX_NEIGHBOURS=50
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
build_src_filter = ${ikoka_nano_nrf_baseboard.build_src_filter}
build_src_filter = ${ikoka_nano_nrf.build_src_filter}
+<../examples/simple_repeater/*.cpp>
[ikoka_nano_nrf_room_server]
extends = ikoka_nano_nrf_baseboard
extends = ikoka_nano_nrf
build_flags =
${ikoka_nano_nrf_baseboard.build_flags}
${ikoka_nano_nrf.build_flags}
-D ADVERT_NAME='"Ikoka Nano Room"'
-D ADVERT_LAT=0.0
-D ADVERT_LON=0.0
-D ADMIN_PASSWORD='"password"'
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
build_src_filter = ${ikoka_nano_nrf_baseboard.build_src_filter}
build_src_filter = ${ikoka_nano_nrf.build_src_filter}
+<../examples/simple_room_server/*.cpp>
;;; hardware + firmware variants
;;; 22dBm EBYTE E22-900M22 variants
[env:ikoka_nano_nrf_22dbm_companion_radio_usb]
extends =
ikoka_nano_nrf_e22_22dbm
@@ -219,7 +189,6 @@ build_src_filter =
;;; 30dBm EBYTE E22-900M30 variants
[env:ikoka_nano_nrf_30dbm_companion_radio_usb]
extends =
ikoka_nano_nrf_e22_30dbm
@@ -266,7 +235,6 @@ build_src_filter =
;;; 33dBm EBYTE E22-900M33 variants
[env:ikoka_nano_nrf_33dbm_companion_radio_usb]
extends =
ikoka_nano_nrf_e22_33dbm

View File

@@ -1,34 +1,15 @@
[nrf52840_xiao]
[ikoka_stick_nrf]
extends = nrf52_base
platform_packages =
toolchain-gccarmnoneeabi@~1.100301.0
framework-arduinoadafruitnrf52
board = seeed-xiao-afruitnrf52-nrf52840
board_build.ldscript = boards/nrf52840_s140_v7.ld
build_flags = ${nrf52_base.build_flags}
${sensor_base.build_flags}
-D NRF52_PLATFORM -D XIAO_NRF52
-I lib/nrf52/s140_nrf52_7.3.0_API/include
-I lib/nrf52/s140_nrf52_7.3.0_API/include/nrf52
lib_ignore =
BluetoothOTA
lvgl
lib5b4
lib_deps =
${nrf52_base.lib_deps}
rweather/Crypto @ ^0.4.0
adafruit/Adafruit INA3221 Library @ ^1.0.1
adafruit/Adafruit INA219 @ ^1.2.3
adafruit/Adafruit AHTX0 @ ^2.0.5
adafruit/Adafruit BME280 Library @ ^2.3.0
adafruit/Adafruit SSD1306 @ ^2.5.13
[ikoka_stick_nrf_baseboard]
extends = nrf52840_xiao
;board_build.ldscript = boards/nrf52840_s140_v7.ld
build_flags = ${nrf52840_xiao.build_flags}
-D P_LORA_TX_LED=11
-I variants/ikoka_stick_nrf
-I src/helpers/nrf52
-D P_LORA_TX_LED=11
-D DISPLAY_CLASS=SSD1306Display
-D DISPLAY_ROTATION=2
-D RADIO_CLASS=CustomSX1262
@@ -46,24 +27,17 @@ build_flags = ${nrf52840_xiao.build_flags}
-D PIN_USER_BTN=0
-D PIN_WIRE_SCL=7
-D PIN_WIRE_SDA=6
-D ENV_INCLUDE_AHTX0=1
-D ENV_INCLUDE_BME280=1
-D ENV_INCLUDE_INA3221=1
-D ENV_INCLUDE_INA219=1
debug_tool = jlink
upload_protocol = nrfutil
;;; abstracted hardware variants
lib_deps = ${nrf52_base.lib_deps}
${sensor_base.lib_deps}
[ikoka_stick_nrf_e22_22dbm]
extends = ikoka_stick_nrf_baseboard
extends = ikoka_stick_nrf
; No PA in this model, full 22dBm
build_flags =
${ikoka_stick_nrf_baseboard.build_flags}
${ikoka_stick_nrf.build_flags}
-D MANUFACTURER_STRING='"Ikoka Stick-E22-22dBm (Xiao_nrf52)"'
-D LORA_TX_POWER=22
build_src_filter = ${nrf52840_xiao.build_src_filter}
build_src_filter = ${ikoka_stick_nrf.build_src_filter}
+<helpers/*.cpp>
+<helpers/sensors>
+<helpers/ui/MomentaryButton.cpp>
@@ -71,14 +45,14 @@ build_src_filter = ${nrf52840_xiao.build_src_filter}
+<../variants/ikoka_stick_nrf>
[ikoka_stick_nrf_e22_30dbm]
extends = ikoka_stick_nrf_baseboard
extends = ikoka_stick_nrf
; limit txpower to 20dBm on E22-900M30S. Anything higher will
; cause distortion in the PA output. 20dBm in -> 30dBm out
build_flags =
${ikoka_stick_nrf_baseboard.build_flags}
${ikoka_stick_nrf.build_flags}
-D MANUFACTURER_STRING='"Ikoka Stick-E22-30dBm (Xiao_nrf52)"'
-D LORA_TX_POWER=20
build_src_filter = ${nrf52840_xiao.build_src_filter}
build_src_filter = ${ikoka_stick_nrf.build_src_filter}
+<helpers/*.cpp>
+<helpers/sensors>
+<helpers/ui/MomentaryButton.cpp>
@@ -86,14 +60,14 @@ build_src_filter = ${nrf52840_xiao.build_src_filter}
+<../variants/ikoka_stick_nrf>
[ikoka_stick_nrf_e22_33dbm]
extends = ikoka_stick_nrf_baseboard
extends = ikoka_stick_nrf
; limit txpower to 9dBm on E22-900M33S to avoid hardware damage
; to the rf amplifier frontend. 9dBm in -> 33dBm out
build_flags =
${ikoka_stick_nrf_baseboard.build_flags}
${ikoka_stick_nrf.build_flags}
-D MANUFACTURER_STRING='"Ikoka Stick-E22-33dBm (Xiao_nrf52)"'
-D LORA_TX_POWER=9
build_src_filter = ${nrf52840_xiao.build_src_filter}
build_src_filter = ${ikoka_stick_nrf.build_src_filter}
+<helpers/*.cpp>
+<helpers/sensors>
+<helpers/ui/MomentaryButton.cpp>
@@ -103,50 +77,52 @@ build_src_filter = ${nrf52840_xiao.build_src_filter}
;;; abstracted firmware roles
[ikoka_stick_nrf_companion_radio_ble]
extends = ikoka_stick_nrf_baseboard
extends = ikoka_stick_nrf
board_build.ldscript = boards/nrf52840_s140_v7_extrafs.ld
board_upload.maximum_size = 708608
build_flags =
${ikoka_stick_nrf_baseboard.build_flags}
${ikoka_stick_nrf.build_flags}
-D MAX_CONTACTS=350
-D MAX_GROUP_CHANNELS=40
-D BLE_PIN_CODE=123456
-D OFFLINE_QUEUE_SIZE=256
-I examples/companion_radio/ui-new
-D QSPIFLASH=1
; -D BLE_DEBUG_LOGGING=1
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
build_src_filter = ${ikoka_stick_nrf_baseboard.build_src_filter}
build_src_filter = ${ikoka_stick_nrf.build_src_filter}
+<helpers/nrf52/SerialBLEInterface.cpp>
+<../examples/companion_radio/*.cpp>
+<../examples/companion_radio/ui-new/*.cpp>
lib_deps =
${ikoka_stick_nrf_baseboard.lib_deps}
${ikoka_stick_nrf.lib_deps}
densaugeo/base64 @ ~1.4.0
[ikoka_stick_nrf_companion_radio_usb]
extends = ikoka_stick_nrf_baseboard
extends = ikoka_stick_nrf
board_build.ldscript = boards/nrf52840_s140_v7_extrafs.ld
board_upload.maximum_size = 708608
build_flags =
${ikoka_stick_nrf_baseboard.build_flags}
${ikoka_stick_nrf.build_flags}
-D MAX_CONTACTS=350
-D MAX_GROUP_CHANNELS=40
-I examples/companion_radio/ui-new
-D QSPIFLASH=1
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
build_src_filter = ${ikoka_stick_nrf_baseboard.build_src_filter}
build_src_filter = ${ikoka_stick_nrf.build_src_filter}
+<helpers/nrf52/SerialBLEInterface.cpp>
+<../examples/companion_radio/*.cpp>
+<../examples/companion_radio/ui-new/*.cpp>
lib_deps =
${ikoka_stick_nrf_baseboard.lib_deps}
${ikoka_stick_nrf.lib_deps}
densaugeo/base64 @ ~1.4.0
[ikoka_stick_nrf_repeater]
extends = ikoka_stick_nrf_baseboard
extends = ikoka_stick_nrf
build_flags =
${ikoka_stick_nrf_baseboard.build_flags}
${ikoka_stick_nrf.build_flags}
-D ADVERT_NAME='"Ikoka Stick Repeater"'
-D ADVERT_LAT=0.0
-D ADVERT_LON=0.0
@@ -154,21 +130,21 @@ build_flags =
-D MAX_NEIGHBOURS=50
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
build_src_filter = ${ikoka_stick_nrf_baseboard.build_src_filter}
build_src_filter = ${ikoka_stick_nrf.build_src_filter}
+<helpers/ui/SSD1306Display.cpp>
+<../examples/simple_repeater/*.cpp>
[ikoka_stick_nrf_room_server]
extends = ikoka_stick_nrf_baseboard
extends = ikoka_stick_nrf
build_flags =
${ikoka_stick_nrf_baseboard.build_flags}
${ikoka_stick_nrf.build_flags}
-D ADVERT_NAME='"Ikoka Stick Room"'
-D ADVERT_LAT=0.0
-D ADVERT_LON=0.0
-D ADMIN_PASSWORD='"password"'
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
build_src_filter = ${ikoka_stick_nrf_baseboard.build_src_filter}
build_src_filter = ${ikoka_stick_nrf.build_src_filter}
+<../examples/simple_room_server/*.cpp>
;;; hardware + firmware variants