diff --git a/.gitignore b/.gitignore index 047d442..5f22052 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,6 @@ venv/ cache/ .idea/ compile_commands.json +node_modules/ +dist/ +.nix-platformio diff --git a/board-defaults.json b/board-defaults.json new file mode 100644 index 0000000..fb41e43 --- /dev/null +++ b/board-defaults.json @@ -0,0 +1,589 @@ +{ + "$schema": "board-defaults.schema.json", + "toolchain": "platformio", + "defaults": { + "BOARD_SLIMEVR": { + "values": { + "SENSORS": [ + { + "protocol": "I2C", + "imu": "IMU_AUTO", + "int": "16", + "rotation": "DEG_270", + "scl": "12", + "sda": "14" + }, + { + "protocol": "I2C", + "imu": "IMU_AUTO", + "int": "13", + "rotation": "DEG_270", + "scl": "12", + "sda": "14" + } + ], + "BATTERY": { + "type": "BAT_EXTERNAL", + "r1": 10, + "r2": 40.2, + "shieldR": 0, + "pin": "17" + }, + "LED": { + "LED_PIN": "2", + "LED_INVERTED": true + } + }, + "flashingRules": { + "applicationOffset": 0, + "needBootPress": true, + "needManualReboot": true, + "shouldOnlyUseDefaults": true + } + }, + "BOARD_SLIMEVR_V1_2": { + "values": { + "SENSORS": [ + { + "protocol": "SPI", + "imu": "IMU_AUTO", + "int": "2", + "rotation": "DEG_270" + }, + { + "protocol": "I2C", + "imu": "IMU_AUTO", + "int": "16", + "rotation": "DEG_270", + "scl": "5", + "sda": "4" + } + ], + "BATTERY": { + "type": "BAT_EXTERNAL", + "r1": 10, + "r2": 40.2, + "shieldR": 0, + "pin": "17" + }, + "LED": { + "LED_PIN": "2", + "LED_INVERTED": true + } + }, + "flashingRules": { + "applicationOffset": 0, + "needBootPress": true, + "needManualReboot": true, + "shouldOnlyUseDefaults": true + } + }, + "BOARD_SLIMEVR_DEV": { + "values": { + "SENSORS": [ + { + "protocol": "I2C", + "imu": "IMU_AUTO", + "int": "10", + "rotation": "DEG_270", + "scl": "5", + "sda": "4" + }, + { + "protocol": "I2C", + "imu": "IMU_AUTO", + "int": "13", + "rotation": "DEG_270", + "scl": "5", + "sda": "4" + } + ], + "BATTERY": { + "type": "BAT_EXTERNAL", + "r1": 10, + "r2": 40.2, + "shieldR": 0, + "pin": "17" + }, + "LED": { + "LED_PIN": "2", + "LED_INVERTED": true + } + }, + "flashingRules": { + "applicationOffset": 0, + "needBootPress": true, + "needManualReboot": true, + "shouldOnlyUseDefaults": true + } + }, + "BOARD_WEMOSD1MINI": { + "values": { + "SENSORS": [ + { + "protocol": "I2C", + "imu": "IMU_AUTO", + "int": "D5", + "rotation": "DEG_270", + "scl": "D1", + "sda": "D2" + }, + { + "protocol": "I2C", + "imu": "IMU_AUTO", + "int": "D6", + "rotation": "DEG_270", + "scl": "D1", + "sda": "D2" + } + ], + "BATTERY": { + "type": "BAT_EXTERNAL", + "r1": 100, + "r2": 220, + "shieldR": 180, + "pin": "A0" + }, + "LED": { + "LED_PIN": "2", + "LED_INVERTED": true + } + }, + "flashingRules": { + "applicationOffset": 0, + "needBootPress": false, + "needManualReboot": false, + "shouldOnlyUseDefaults": false + } + }, + "BOARD_NODEMCU": { + "values": { + "SENSORS": [ + { + "protocol": "I2C", + "imu": "IMU_BNO085", + "int": "D5", + "rotation": "DEG_270", + "scl": "D1", + "sda": "D2" + }, + { + "protocol": "I2C", + "imu": "IMU_BNO085", + "int": "D6", + "rotation": "DEG_270", + "scl": "D1", + "sda": "D2" + } + ], + "BATTERY": { + "type": "BAT_EXTERNAL", + "r1": 100, + "r2": 220, + "shieldR": 180, + "pin": "A0" + }, + "LED": { + "LED_PIN": "2", + "LED_INVERTED": true + } + }, + "flashingRules": { + "applicationOffset": 0, + "needBootPress": false, + "needManualReboot": false, + "shouldOnlyUseDefaults": false + } + }, + "BOARD_ESP01": { + "values": { + "SENSORS": [ + { + "protocol": "I2C", + "imu": "IMU_BNO085", + "int": "255", + "rotation": "DEG_270", + "scl": "0", + "sda": "2" + }, + { + "protocol": "I2C", + "imu": "IMU_BNO085", + "int": "255", + "rotation": "DEG_270", + "scl": "0", + "sda": "2" + } + ], + "BATTERY": { + "type": "BAT_INTERNAL", + "r1": 100, + "r2": 220, + "shieldR": 180, + "pin": "255" + }, + "LED": { + "LED_PIN": "255", + "LED_INVERTED": true + } + }, + "flashingRules": { + "applicationOffset": 0, + "needBootPress": false, + "needManualReboot": false, + "shouldOnlyUseDefaults": false + } + }, + "BOARD_TTGO_TBASE": { + "values": { + "SENSORS": [ + { + "protocol": "I2C", + "imu": "IMU_BNO085", + "int": "14", + "rotation": "DEG_270", + "scl": "4", + "sda": "5" + }, + { + "protocol": "I2C", + "imu": "IMU_BNO085", + "int": "13", + "rotation": "DEG_270", + "scl": "4", + "sda": "5" + } + ], + "BATTERY": { + "type": "BAT_EXTERNAL", + "r1": 100, + "r2": 220, + "shieldR": 0, + "pin": "A0" + }, + "LED": { + "LED_PIN": "2", + "LED_INVERTED": true + } + }, + "flashingRules": { + "applicationOffset": 0, + "needBootPress": false, + "needManualReboot": false, + "shouldOnlyUseDefaults": false + } + }, + "BOARD_WROOM32": { + "values": { + "SENSORS": [ + { + "protocol": "I2C", + "imu": "IMU_BNO085", + "int": "23", + "rotation": "DEG_270", + "scl": "22", + "sda": "21" + }, + { + "protocol": "I2C", + "imu": "IMU_BNO085", + "int": "25", + "rotation": "DEG_270", + "scl": "22", + "sda": "21" + } + ], + "BATTERY": { + "type": "BAT_EXTERNAL", + "r1": 100, + "r2": 220, + "shieldR": 180, + "pin": "36" + }, + "LED": { + "LED_PIN": "255", + "LED_INVERTED": true + } + }, + "flashingRules": { + "applicationOffset": 0, + "needBootPress": false, + "needManualReboot": false, + "shouldOnlyUseDefaults": false + } + }, + "BOARD_LOLIN_C3_MINI": { + "values": { + "SENSORS": [ + { + "protocol": "I2C", + "imu": "IMU_ICM45686", + "int": "6", + "rotation": "DEG_270", + "scl": "4", + "sda": "5" + }, + { + "protocol": "I2C", + "imu": "IMU_ICM45686", + "int": "8", + "rotation": "DEG_270", + "scl": "4", + "sda": "5" + } + ], + "BATTERY": { + "type": "BAT_EXTERNAL", + "r1": 100, + "r2": 220, + "shieldR": 180, + "pin": "3" + }, + "LED": { + "LED_PIN": "7", + "LED_INVERTED": true + } + }, + "flashingRules": { + "applicationOffset": 0, + "needBootPress": false, + "needManualReboot": false, + "shouldOnlyUseDefaults": false + } + }, + "BOARD_BEETLE32C3": { + "values": { + "SENSORS": [ + { + "protocol": "I2C", + "imu": "IMU_ICM45686", + "int": "6", + "rotation": "DEG_270", + "scl": "9", + "sda": "8" + }, + { + "protocol": "I2C", + "imu": "IMU_ICM45686", + "int": "7", + "rotation": "DEG_270", + "scl": "9", + "sda": "8" + } + ], + "BATTERY": { + "type": "BAT_EXTERNAL", + "r1": 100, + "r2": 220, + "shieldR": 180, + "pin": "3" + }, + "LED": { + "LED_PIN": "10", + "LED_INVERTED": false + } + }, + "flashingRules": { + "applicationOffset": 0, + "needBootPress": false, + "needManualReboot": false, + "shouldOnlyUseDefaults": false + } + }, + "BOARD_ESP32C3DEVKITM1": { + "values": { + "SENSORS": [ + { + "protocol": "I2C", + "imu": "IMU_ICM45686", + "int": "6", + "rotation": "DEG_270", + "scl": "4", + "sda": "5" + }, + { + "protocol": "I2C", + "imu": "IMU_ICM45686", + "int": "7", + "rotation": "DEG_270", + "scl": "4", + "sda": "5" + } + ], + "BATTERY": { + "type": "BAT_EXTERNAL", + "r1": 100, + "r2": 220, + "shieldR": 180, + "pin": "3" + }, + "LED": { + "LED_PIN": "LED_BUILTIN", + "LED_INVERTED": false + } + }, + "flashingRules": { + "applicationOffset": 0, + "needBootPress": false, + "needManualReboot": false, + "shouldOnlyUseDefaults": false + } + }, + "BOARD_ESP32C6DEVKITC1": { + "values": { + "SENSORS": [ + { + "protocol": "I2C", + "imu": "IMU_ICM45686", + "int": "6", + "rotation": "DEG_270", + "scl": "4", + "sda": "5" + }, + { + "protocol": "I2C", + "imu": "IMU_ICM45686", + "int": "7", + "rotation": "DEG_270", + "scl": "4", + "sda": "5" + } + ], + "BATTERY": { + "type": "BAT_EXTERNAL", + "r1": 100, + "r2": 220, + "shieldR": 180, + "pin": "3" + }, + "LED": { + "LED_PIN": "LED_BUILTIN", + "LED_INVERTED": false + } + }, + "flashingRules": { + "applicationOffset": 0, + "needBootPress": false, + "needManualReboot": false, + "shouldOnlyUseDefaults": false + } + }, + "BOARD_WEMOSWROOM02": { + "values": { + "SENSORS": [ + { + "protocol": "I2C", + "imu": "IMU_ICM45686", + "int": "0", + "rotation": "DEG_270", + "scl": "14", + "sda": "2" + }, + { + "protocol": "I2C", + "imu": "IMU_ICM45686", + "int": "4", + "rotation": "DEG_270", + "scl": "14", + "sda": "2" + } + ], + "BATTERY": { + "type": "BAT_EXTERNAL", + "r1": 100, + "r2": 220, + "shieldR": 180, + "pin": "A0" + }, + "LED": { + "LED_PIN": "16", + "LED_INVERTED": true + } + }, + "flashingRules": { + "applicationOffset": 0, + "needBootPress": false, + "needManualReboot": false, + "shouldOnlyUseDefaults": false + } + }, + "BOARD_XIAO_ESP32C3": { + "values": { + "SENSORS": [ + { + "protocol": "I2C", + "imu": "IMU_ICM45686", + "int": "5", + "rotation": "DEG_270", + "scl": "7", + "sda": "6" + }, + { + "protocol": "I2C", + "imu": "IMU_ICM45686", + "int": "10", + "rotation": "DEG_270", + "scl": "7", + "sda": "6" + } + ], + "BATTERY": { + "type": "BAT_EXTERNAL", + "r1": 100, + "r2": 100, + "shieldR": 0, + "pin": "2" + }, + "LED": { + "LED_PIN": "4", + "LED_INVERTED": false + } + }, + "flashingRules": { + "applicationOffset": 0, + "needBootPress": false, + "needManualReboot": false, + "shouldOnlyUseDefaults": false + } + }, + "BOARD_ESP32S3_SUPERMINI": { + "values": { + "SENSORS": [ + { + "protocol": "I2C", + "imu": "IMU_ICM45686", + "int": "5", + "rotation": "DEG_270", + "scl": "6", + "sda": "7" + }, + { + "protocol": "I2C", + "imu": "IMU_ICM45686", + "int": "4", + "rotation": "DEG_270", + "scl": "6", + "sda": "7" + } + ], + "BATTERY": { + "type": "BAT_EXTERNAL", + "r1": 10, + "r2": 40.2, + "shieldR": 0, + "pin": "A2" + }, + "LED": { + "LED_PIN": "LED_BUILTIN", + "LED_INVERTED": true + } + }, + "flashingRules": { + "applicationOffset": 0, + "needBootPress": false, + "needManualReboot": false, + "shouldOnlyUseDefaults": false + } + } + } +} diff --git a/board-defaults.schema.json b/board-defaults.schema.json new file mode 100644 index 0000000..227064f --- /dev/null +++ b/board-defaults.schema.json @@ -0,0 +1,242 @@ +{ + "$id": "board-defaults.schema.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + + "$defs": { + "pin": { + "type": "string", + "pattern": "^[AD]?[0-9]\\d*$" + }, + + "LED_PIN": { + "type": "string", + "pattern": "^([AD]?[0-9]\\d*|LED_BUILTIN)$" + }, + + "IMU_TYPE": { + "type": "string", + "enum": [ + "IMU_AUTO", + "IMU_MPU9250", + "IMU_MPU6500", + "IMU_BNO080", + "IMU_BNO085", + "IMU_BNO055", + "IMU_MPU6050", + "IMU_BNO086", + "IMU_BMI160", + "IMU_ICM20948", + "IMU_ICM42688", + "IMU_LSM6DS3TRC", + "IMU_LSM6DSV", + "IMU_LSM6DSO", + "IMU_LSM6DSR", + "IMU_MPU6050_SF", + "IMU_ICM45686", + "IMU_ICM45605" + ], + "description": "Imu Type" + }, + + "PROTOCOL": { + "type": "string", + "enum": ["I2C", "SPI"], + "description": "Protocol" + }, + + "IMU_ROTATION": { + "type": "string", + "enum": ["DEG_0", "DEG_90", "DEG_180", "DEG_270"], + "description": "Protocol" + }, + + "I2C_IMU": { + "type": "object", + "description": "I2C Imu", + "properties": { + "protocol": { "const": "I2C" }, + "imu": { "$ref": "#/$defs/IMU_TYPE" }, + "sda": { "$ref": "#/$defs/pin", "description": "SDA Pin" }, + "scl": { "$ref": "#/$defs/pin", "description": "SCL Pin" }, + "int": { "$ref": "#/$defs/pin", "description": "INT Pin" }, + "address": { + "type": "number", + "description": "IMU Address" + }, + "rotation": { + "$ref": "#/$defs/IMU_ROTATION", + "description": "IMU Rotation" + } + }, + "required": ["protocol", "imu", "sda", "scl"] + }, + + "SPI_IMU": { + "type": "object", + "description": "SPI Imu", + "properties": { + "protocol": { "const": "SPI" }, + "imu": { "$ref": "#/$defs/IMU_TYPE" }, + "int": { "$ref": "#/$defs/pin", "description": "INT Pin" }, + "rotation": { + "$ref": "#/$defs/IMU_ROTATION", + "description": "IMU Rotation" + } + }, + "required": ["protocol", "imu"] + }, + + "IMU": { + "type": "object", + "discriminator": { + "propertyName": "protocol" + }, + "oneOf": [ + { "$ref": "#/$defs/I2C_IMU" }, + { "$ref": "#/$defs/SPI_IMU" } + ], + "required": ["protocol"] + }, + + "BOARD_TYPES": { + "type": "string", + "enum": [ + "BOARD_SLIMEVR", + "BOARD_SLIMEVR_V1_2", + "BOARD_SLIMEVR_DEV", + "BOARD_NODEMCU", + "BOARD_WEMOSD1MINI", + "BOARD_ESP01", + "BOARD_TTGO_TBASE", + "BOARD_WROOM32", + "BOARD_LOLIN_C3_MINI", + "BOARD_BEETLE32C3", + "BOARD_ESP32C3DEVKITM1", + "BOARD_ESP32C6DEVKITC1", + "BOARD_WEMOSWROOM02", + "BOARD_XIAO_ESP32C3", + "BOARD_ESP32S3_SUPERMINI" + ], + "description": "Board Type" + }, + + "BATTERY": { + "type": "object", + "discriminator": { + "propertyName": "type" + }, + "description": "Battery Settings", + "oneOf": [ + { + "type": "object", + "properties": { + "type": { "const": "BAT_EXTERNAL" }, + "shieldR": { + "type": "number", + "description": "Battery Shield Resistor (Ohms)" + }, + "r1": { "type": "number", "description": "R1 (Ohms)" }, + "r2": { "type": "number", "description": "R2 (Ohms)" }, + "pin": { + "$ref": "#/$defs/pin", + "description": "Battery Pin" + } + } + }, + { + "type": "object", + "properties": { + "type": { "const": "BAT_INTERNAL" } + } + }, + { + "type": "object", + "properties": { + "type": { "const": "BAT_MCP3021" } + } + }, + { + "type": "object", + "properties": { + "type": { "const": "BAT_INTERNAL_MCP3021" } + } + } + ], + "required": ["type"] + }, + + "BASIC_IMU_BOARD_CONFIG": { + "type": "object", + "properties": { + "SENSORS": { + "type": "array", + "items": { "$ref": "#/$defs/IMU" }, + "maxItems": 2, + "minItems": 1, + "description": "Sensors List" + }, + "LED": { + "type": "object", + "description": "Led Settings", + "properties": { + "LED_PIN": { + "$ref": "#/$defs/LED_PIN", + "description": "Led pin" + }, + "LED_INVERTED": { + "type": "boolean", + "description": "Led inverted" + } + }, + "required": ["LED_PIN", "LED_INVERTED"] + }, + "BATTERY": { "$ref": "#/$defs/BATTERY" } + }, + "required": ["SENSORS", "LED", "BATTERY"] + }, + + "BoardConfig": { + "type": "object", + "properties": { + "values": { + "$ref": "#/$defs/BASIC_IMU_BOARD_CONFIG" + }, + "flashingRules": { + "type": "object", + "properties": { + "needBootPress": { "type": "boolean" }, + "needManualReboot": { "type": "boolean" }, + "shouldOnlyUseDefaults": { "type": "boolean" }, + "applicationOffset": { "type": "integer" } + }, + "required": [ + "needBootPress", + "needManualReboot", + "shouldOnlyUseDefaults", + "applicationOffset" + ] + }, + "ignored": { + "type": "boolean" + } + }, + "required": ["values", "flashingRules"] + } + }, + + "type": "object", + "properties": { + "toolchain": { + "type": "string", + "enum": ["platformio"] + }, + "defaults": { + "type": "object", + "propertyNames": { + "$ref": "#/$defs/BOARD_TYPES" + }, + "additionalProperties": { "$ref": "#/$defs/BoardConfig" } + } + }, + "required": ["toolchain", "defaults"] +} diff --git a/ci/build.py b/ci/build.py index 75df6a3..9a64406 100644 --- a/ci/build.py +++ b/ci/build.py @@ -32,12 +32,13 @@ def get_matrix() -> List[DeviceConfiguration]: matrix: List[DeviceConfiguration] = [] config = configparser.ConfigParser() - config.read("./platformio-tools.ini") + config.read("./platformio.ini") for section in config.sections(): - if section == "env": + split = section.split(":") + if len(split) != 2 or split[0] != 'env': continue - board = section.split(":")[1] + board = split[1] platform = config[section]["platform"] platformio_board = config[section]["board"] @@ -51,36 +52,15 @@ def get_matrix() -> List[DeviceConfiguration]: def prepare() -> None: print(f"🡢 {COLOR_CYAN}Preparation{COLOR_RESET}") - - print(f" 🡢 {COLOR_GRAY}Backing up platformio.ini{COLOR_RESET}") - shutil.copy("./platformio.ini", "platformio.ini.bak") - - print( - f" 🡢 {COLOR_GRAY}Switching platformio.ini to platformio-tools.ini{COLOR_RESET}") - shutil.copy("./platformio-tools.ini", "platformio.ini") - if os.path.exists("./build"): print(f" 🡢 {COLOR_GRAY}Removing existing build folder...{COLOR_RESET}") shutil.rmtree("./build") - print(f" 🡢 {COLOR_GRAY}Creating build folder...{COLOR_RESET}") os.mkdir("./build") print(f" 🡢 {COLOR_GREEN}Success!{COLOR_RESET}") -def cleanup() -> None: - print(f"🡢 {COLOR_CYAN}Cleanup{COLOR_RESET}") - - print(f" 🡢 {COLOR_GRAY}Restoring platformio.ini...{COLOR_RESET}") - shutil.copy("platformio.ini.bak", "platformio.ini") - - print(f" 🡢 {COLOR_GRAY}Removing platformio.ini.bak...{COLOR_RESET}") - os.remove("platformio.ini.bak") - - print(f" 🡢 {COLOR_GREEN}Success!{COLOR_RESET}") - - def build() -> int: print(f"🡢 {COLOR_CYAN}Build{COLOR_RESET}") @@ -135,7 +115,6 @@ def build_for_device(device: DeviceConfiguration) -> bool: def main() -> None: prepare() code = build() - cleanup() sys.exit(code) diff --git a/flake.nix b/flake.nix index 6998368..ed7b033 100644 --- a/flake.nix +++ b/flake.nix @@ -18,11 +18,21 @@ platformio platformio-core - # Python for PlatformIO + # Python for PlatformIO with needed packages python3 python3Packages.pip python3Packages.virtualenv + # Pre-install Python packages that need compilation + python3Packages.jsonschema + python3Packages.rpds-py + python3Packages.attrs + python3Packages.referencing + + # Rust toolchain (in case compilation is needed) + rustc + cargo + # Build tools gcc gnumake @@ -41,14 +51,27 @@ # Set PlatformIO core directory to project-local directory export PLATFORMIO_CORE_DIR=$PWD/.nix-platformio + # Create and activate Python virtual environment + if [ ! -d .venv ]; then + echo "Creating Python virtual environment..." + python3 -m venv .venv --system-site-packages + fi + source .venv/bin/activate + + # Prefer binary wheels over building from source + export PIP_PREFER_BINARY=1 + echo "PlatformIO development environment loaded" + echo "Python virtual environment activated: .venv" echo "PlatformIO version: $(pio --version)" + echo "Python version: $(python --version)" echo "" echo "Available commands:" echo " pio init - Initialize a new PlatformIO project" echo " pio run - Build the project" echo " pio run -t upload - Upload to device" echo " pio device monitor - Open serial monitor" + echo " pip install - Install Python packages in venv" echo "" ''; }; diff --git a/platformio-tools.ini b/platformio-tools.ini deleted file mode 100644 index ba718e1..0000000 --- a/platformio-tools.ini +++ /dev/null @@ -1,176 +0,0 @@ -[env] -lib_deps= - https://github.com/SlimeVR/CmdParser.git - https://github.com/SlimeVR/base64_arduino.git - https://github.com/adafruit/Adafruit-MCP23017-Arduino-Library.git - https://github.com/hideakitai/PCA9547.git -monitor_speed = 115200 -framework = arduino -build_flags = - !python scripts/get_git_commit.py - -O2 - -std=gnu++2a -build_unflags = - -Os - -std=gnu++11 -std=gnu++17 - -[env:BOARD_SLIMEVR] -platform = espressif8266 @ 4.2.1 -board = esp12e -build_flags = - ${env.build_flags} - -D BOARD=BOARD_SLIMEVR - -D VENDOR_NAME='"SlimeVR"' - -D VENDOR_URL='"https://slimevr.dev"' - -D PRODUCT_NAME='"SlimeVR Tracker"' - -D UPDATE_ADDRESS='"SlimeVR/SlimeVR-Tracker-ESP"' - -D UPDATE_NAME='"BOARD_SLIMEVR-firmware"' - -[env:BOARD_SLIMEVR_V1_2] -platform = espressif8266 @ 4.2.1 -board = esp12e -build_flags = - ${env.build_flags} - -D BOARD=BOARD_SLIMEVR_V1_2 - -D VENDOR_NAME='"SlimeVR"' - -D VENDOR_URL='"https://slimevr.dev"' - -D PRODUCT_NAME='"SlimeVR Tracker v1.2"' - -D UPDATE_ADDRESS='"SlimeVR/SlimeVR-Tracker-ESP"' - -D UPDATE_NAME='"BOARD_SLIMEVR_V1_2-firmware"' - -[env:BOARD_SLIMEVR_DEV] -platform = espressif8266 @ 4.2.1 -board = esp12e -build_flags = - ${env.build_flags} - -D BOARD=BOARD_SLIMEVR_DEV - -D VENDOR_NAME='"SlimeVR"' - -D PRODUCT_NAME='"SlimeVR Tracker (dev)"' - -[env:BOARD_GLOVE_IMU_SLIMEVR_DEV] -platform = espressif32 @ 6.7.0 -platform_packages = - framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#3.0.1 - framework-arduinoespressif32-libs @ https://github.com/espressif/arduino-esp32/releases/download/3.0.1/esp32-arduino-libs-3.0.1.zip -build_flags = - ${env.build_flags} - -DESP32C3 - -D BOARD=BOARD_GLOVE_IMU_SLIMEVR_DEV - -D PRODUCT_NAME='"SlimeVR Glove (dev)"' -board = lolin_c3_mini - -[env:BOARD_NODEMCU] -platform = espressif8266 @ 4.2.1 -board = esp12e -build_flags = - ${env.build_flags} - -D BOARD=BOARD_NODEMCU - -[env:BOARD_WEMOSD1MINI] -platform = espressif8266 @ 4.2.1 -board = esp12e -build_flags = - ${env.build_flags} - -D BOARD=BOARD_WEMOSD1MINI - -[env:BOARD_TTGO_TBASE] -platform = espressif8266 @ 4.2.1 -board = esp12e -build_flags = - ${env.build_flags} - -D BOARD=BOARD_TTGO_TBASE - -[env:BOARD_WEMOSWROOM02] -platform = espressif8266 @ 4.2.1 -board = esp12e -build_flags = - ${env.build_flags} - -D BOARD=BOARD_NODEMCU - -[env:BOARD_WROOM32] -platform = espressif32 @ 6.7.0 -platform_packages = - framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#3.0.1 - framework-arduinoespressif32-libs @ https://github.com/espressif/arduino-esp32/releases/download/3.0.1/esp32-arduino-libs-3.0.1.zip -board = esp32dev -build_flags = - ${env.build_flags} - -D BOARD=BOARD_WROOM32 - -[env:BOARD_ESP01] -platform = espressif32 @ 6.7.0 -platform_packages = - framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#3.0.1 - framework-arduinoespressif32-libs @ https://github.com/espressif/arduino-esp32/releases/download/3.0.1/esp32-arduino-libs-3.0.1.zip -board = esp32dev -build_flags = - ${env.build_flags} - -D BOARD=BOARD_ESP01 - -[env:BOARD_LOLIN_C3_MINI] -platform = espressif32 @ 6.7.0 -platform_packages = - framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#3.0.1 - framework-arduinoespressif32-libs @ https://github.com/espressif/arduino-esp32/releases/download/3.0.1/esp32-arduino-libs-3.0.1.zip -build_flags = - ${env.build_flags} - -DESP32C3 - -D BOARD=BOARD_LOLIN_C3_MINI -board = lolin_c3_mini - -[env:BOARD_BEETLE32C3] -platform = espressif32 @ 6.7.0 -platform_packages = - framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#3.0.1 - framework-arduinoespressif32-libs @ https://github.com/espressif/arduino-esp32/releases/download/3.0.1/esp32-arduino-libs-3.0.1.zip -build_flags = - ${env.build_flags} - -DESP32C3 - -D BOARD=BOARD_BEETLE32C3 -board = dfrobot_beetle_esp32c3 - -[env:BOARD_ESP32C3DEVKITM1] -platform = espressif32 @ 6.7.0 -platform_packages = - framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#3.0.1 - framework-arduinoespressif32-libs @ https://github.com/espressif/arduino-esp32/releases/download/3.0.1/esp32-arduino-libs-3.0.1.zip -build_flags = - ${env.build_flags} - -DESP32C3 - -D BOARD=BOARD_ESP32C3DEVKITM1 -board = esp32-c3-devkitm-1 - -[env:BOARD_ESP32C6DEVKITC1] -platform = https://github.com/tasmota/platform-espressif32/releases/download/2024.06.11/platform-espressif32.zip -build_flags = - ${env.build_flags} - -DESP32C6 - -D BOARD=BOARD_ESP32C6DEVKITC1 -board = esp32-c6-devkitc-1 - -[env:BOARD_XIAO_ESP32C3] -platform = espressif32 @ 6.7.0 -platform_packages = - framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#3.0.1 - framework-arduinoespressif32-libs @ https://github.com/espressif/arduino-esp32/releases/download/3.0.1/esp32-arduino-libs-3.0.1.zip -build_flags = - ${env.build_flags} - -DESP32C3 - -D BOARD=BOARD_XIAO_ESP32C3 -board = seeed_xiao_esp32c3 - -[env:BOARD_ESP32S3_SUPERMINI] -platform = espressif32 @ 6.7.0 -platform_packages = - framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#3.0.1 - framework-arduinoespressif32-libs @ https://github.com/espressif/arduino-esp32/releases/download/3.0.1/esp32-arduino-libs-3.0.1.zip -build_flags = - ${env.build_flags} - -DARDUINO_USB_MODE=1 - -DESP32S3 - -D BOARD=BOARD_ESP32S3_SUPERMINI -board = esp32s3_supermini -board_upload.use_1200bps_touch = 1 -board_upload.wait_for_upload_port = 1 -board_upload.require_upload_port = 1 -upload_speed = 921600 diff --git a/platformio.ini b/platformio.ini index fd7dbd0..a0dc9ff 100644 --- a/platformio.ini +++ b/platformio.ini @@ -13,6 +13,7 @@ [platformio] build_cache_dir = cache +default_envs = BOARD_WEMOSD1MINI [env] lib_deps= @@ -26,7 +27,8 @@ monitor_filters = colorize ;monitor_rts = 0 ;monitor_dtr = 0 framework = arduino -build_flags = +extra_scripts = pre:scripts/preprocessor.py +build_flags = !python scripts/get_git_commit.py ;If you want to set hardcoded WiFi SSID and password, uncomment and edit the lines below ;To uncomment, only remove ";" and leave the two spaces in front of the tags @@ -60,39 +62,57 @@ build_unflags = -Os -std=gnu++11 -std=gnu++17 ;upload_flags = ; --auth=SlimeVR-OTA -; Settings for different boards - -[env:esp12e] -platform = espressif8266 @ 4.2.1 -board = esp12e -; Comment out this line below if you have any trouble uploading the firmware -; and if it has a CP2102 on it (a square chip next to the usb port): change to 3000000 (3 million) for even faster upload speed -upload_speed = 921600 - ; Uncomment below if you want to build for ESP-01 ;[env:esp01_1m] ;platform = espressif8266 @ 4.2.1 ;board = esp01_1m ;board_build.arduino.ldscript = "eagle.flash.1m64.ld" -; Uncomment below if you want to build for ESP8285 (ESP8266 with embedded Flash) -;[env:esp8285] -;platform = espressif8266 @ 4.2.1 -;board = esp8285 -;board_build.arduino.ldscript = "eagle.flash.1m64.ld" -;board_build.flash_mode = dout +[env:BOARD_WEMOSD1MINI] +platform = espressif8266 @ 4.2.1 +board = esp12e +custom_slime_board = BOARD_WEMOSD1MINI -; Uncomment below if you want to build for esp32 -; Check your board name at https://docs.platformio.org/en/latest/platforms/espressif32.html#boards -; [env:esp32] -; platform = espressif32 @ 6.7.0 -; platform_packages = -; framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#3.0.1 -; framework-arduinoespressif32-libs @ https://github.com/espressif/arduino-esp32/releases/download/3.0.1/esp32-arduino-libs-3.0.1.zip -; board = esp32dev -; Comment out this line below if you have any trouble uploading the firmware - and if it has a CP2102 on it (a square chip next to the usb port): change to 3000000 (3 million) for even faster upload speed -;upload_speed = 921600 +[env:BOARD_NODEMCU] +platform = espressif8266 @ 4.2.1 +board = esp12e +custom_slime_board = BOARD_NODEMCU +[env:BOARD_TTGO_TBASE] +platform = espressif8266 @ 4.2.1 +board = esp12e +custom_slime_board = BOARD_TTGO_TBASE + +[env:BOARD_WEMOSWROOM02] +platform = espressif8266 @ 4.2.1 +board = esp12e +custom_slime_board = BOARD_WEMOSWROOM02 + +[env:BOARD_WROOM32] +platform = espressif32 @ 6.7.0 +platform_packages = + framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#3.0.1 + framework-arduinoespressif32-libs @ https://github.com/espressif/arduino-esp32/releases/download/3.0.1/esp32-arduino-libs-3.0.1.zip +board = esp32dev +custom_slime_board = BOARD_WROOM32 + +[env:BOARD_ESP01] +platform = espressif8266 @ 4.2.1 +board = esp01_1m +board_build.arduino.ldscript = "eagle.flash.1m64.ld" +custom_slime_board = BOARD_ESP01 + +[env:BOARD_LOLIN_C3_MINI] +platform = espressif32 @ 6.7.0 +platform_packages = + framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#3.0.1 + framework-arduinoespressif32-libs @ https://github.com/espressif/arduino-esp32/releases/download/3.0.1/esp32-arduino-libs-3.0.1.zip +custom_slime_board = BOARD_LOLIN_C3_MINI +build_flags = + ${env.build_flags} + -DESP32C3 +board = lolin_c3_mini +monitor_filters = colorize, esp32_exception_decoder ; If you want to use a ESP32C3, you can use this (experimental) ; Check your board name at https://docs.platformio.org/en/latest/platforms/espressif32.html#boards ; There are 2 main Boardtypes: @@ -102,38 +122,126 @@ upload_speed = 921600 ; -DARDUINO_USB_MODE=1 ; -DARDUINO_USB_CDC_ON_BOOT=1 -;[env:esp32c3] -;platform = espressif32 @ 6.7.0 -;platform_packages = -; framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#3.0.1 -; framework-arduinoespressif32-libs @ https://github.com/espressif/arduino-esp32/releases/download/3.0.1/esp32-arduino-libs-3.0.1.zip -;build_flags = -; ${env.build_flags} -; -DESP32C3 -;board = lolin_c3_mini -;monitor_filters = colorize, esp32_exception_decoder +[env:BOARD_BEETLE32C3] +platform = espressif32 @ 6.7.0 +platform_packages = + framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#3.0.1 + framework-arduinoespressif32-libs @ https://github.com/espressif/arduino-esp32/releases/download/3.0.1/esp32-arduino-libs-3.0.1.zip +custom_slime_board = BOARD_BEETLE32C3 +build_flags = + ${env.build_flags} + -DESP32C3 +board = dfrobot_beetle_esp32c3 +monitor_filters = colorize, esp32_exception_decoder +; If you want to use a ESP32C3, you can use this (experimental) +; Check your board name at https://docs.platformio.org/en/latest/platforms/espressif32.html#boards +; There are 2 main Boardtypes: +; 1. Boards that use a USB 2 Serial Chipset ( esp32-c3-devkitm-1, ttgo-t-oi-plus ) +; 2. Boards that relay on the USB interface of the ESP32C3 ( lolin_c3_mini , dfrobot_beetle_esp32c3) +; On this board there are 2 type some of them need to have set the build flag (menuconfig) +; -DARDUINO_USB_MODE=1 +; -DARDUINO_USB_CDC_ON_BOOT=1 -; If you want to use a ESP32C6, you can use this (experimental) -;[env:esp32c6] -;platform = https://github.com/tasmota/platform-espressif32/releases/download/2024.06.11/platform-espressif32.zip -;board = esp32-c6-devkitc-1 -;build_flags = -; ${env.build_flags} -; -DESP32C6 -; -DARDUINO_USB_MODE=1 -; -DARDUINO_USB_CDC_ON_BOOT=1 +[env:BOARD_ESP32C3DEVKITM1] +platform = espressif32 @ 6.7.0 +platform_packages = + framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#3.0.1 + framework-arduinoespressif32-libs @ https://github.com/espressif/arduino-esp32/releases/download/3.0.1/esp32-arduino-libs-3.0.1.zip +custom_slime_board = BOARD_ESP32C3DEVKITM1 +build_flags = + ${env.build_flags} + -DESP32C3 +board = esp32-c3-devkitm-1 +monitor_filters = colorize, esp32_exception_decoder +; If you want to use a ESP32C3, you can use this (experimental) +; Check your board name at https://docs.platformio.org/en/latest/platforms/espressif32.html#boards +; There are 2 main Boardtypes: +; 1. Boards that use a USB 2 Serial Chipset ( esp32-c3-devkitm-1, ttgo-t-oi-plus ) +; 2. Boards that relay on the USB interface of the ESP32C3 ( lolin_c3_mini , dfrobot_beetle_esp32c3) +; On this board there are 2 type some of them need to have set the build flag (menuconfig) +; -DARDUINO_USB_MODE=1 +; -DARDUINO_USB_CDC_ON_BOOT=1 -;[env:BOARD_ESP32S3_SUPERMINI] -;platform = espressif32 @ 6.7.0 -;platform_packages = -; framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#3.0.1 -; framework-arduinoespressif32-libs @ https://github.com/espressif/arduino-esp32/releases/download/3.0.1/esp32-arduino-libs-3.0.1.zip -;build_flags = -; ${env.build_flags} -; -DARDUINO_USB_MODE=1 -; -DESP32S3 -;board = esp32s3_supermini -;board_upload.use_1200bps_touch = 1 -;board_upload.wait_for_upload_port = 1 -;board_upload.require_upload_port = 1 -;upload_speed = 921600 +[env:BOARD_ESP32C6DEVKITC1] +platform = https://github.com/tasmota/platform-espressif32/releases/download/2024.06.11/platform-espressif32.zip +custom_slime_board = BOARD_ESP32C6DEVKITC1 +build_flags = + ${env.build_flags} + -DESP32C6 + -DARDUINO_USB_MODE=1 + -DARDUINO_USB_CDC_ON_BOOT=1 +board = esp32-c6-devkitc-1 + +[env:BOARD_XIAO_ESP32C3] +platform = espressif32 @ 6.7.0 +platform_packages = + framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#3.0.1 + framework-arduinoespressif32-libs @ https://github.com/espressif/arduino-esp32/releases/download/3.0.1/esp32-arduino-libs-3.0.1.zip +custom_slime_board = BOARD_XIAO_ESP32C3 +build_flags = + ${env.build_flags} + -DESP32C3 +board = seeed_xiao_esp32c3 +monitor_filters = colorize, esp32_exception_decoder + +[env:BOARD_ESP32S3_SUPERMINI] +platform = espressif32 @ 6.7.0 +platform_packages = + framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#3.0.1 + framework-arduinoespressif32-libs @ https://github.com/espressif/arduino-esp32/releases/download/3.0.1/esp32-arduino-libs-3.0.1.zip +custom_slime_board = BOARD_ESP32S3_SUPERMINI +build_flags = + ${env.build_flags} + -DARDUINO_USB_MODE=1 + -DESP32S3 +board = esp32s3_supermini +board_upload.use_1200bps_touch = 1 +board_upload.wait_for_upload_port = 1 +board_upload.require_upload_port = 1 +upload_speed = 921600 + +[env:BOARD_SLIMEVR] +platform = espressif8266 @ 4.2.1 +board = esp12e +custom_slime_board = BOARD_SLIMEVR +build_flags = + ${env.build_flags} + -D VENDOR_NAME='"SlimeVR"' + -D VENDOR_URL='"https://slimevr.dev"' + -D PRODUCT_NAME='"SlimeVR Tracker"' + -D UPDATE_ADDRESS='"SlimeVR/SlimeVR-Tracker-ESP"' + -D UPDATE_NAME='"BOARD_SLIMEVR-firmware"' + +[env:BOARD_SLIMEVR_V1_2] +platform = espressif8266 @ 4.2.1 +board = esp12e +custom_slime_board = BOARD_SLIMEVR_V1_2 +build_flags = + ${env.build_flags} + -D VENDOR_NAME='"SlimeVR"' + -D VENDOR_URL='"https://slimevr.dev"' + -D PRODUCT_NAME='"SlimeVR Tracker v1.2"' + -D UPDATE_ADDRESS='"SlimeVR/SlimeVR-Tracker-ESP"' + -D UPDATE_NAME='"BOARD_SLIMEVR_V1_2-firmware"' + +[env:BOARD_SLIMEVR_DEV] +platform = espressif8266 @ 4.2.1 +board = esp12e +custom_slime_board = BOARD_SLIMEVR_DEV +build_flags = + ${env.build_flags} + -D VENDOR_NAME='"SlimeVR"' + -D PRODUCT_NAME='"SlimeVR Tracker (dev)"' + +[env:BOARD_GLOVE_IMU_SLIMEVR_DEV] +platform = espressif32 @ 6.7.0 +platform_packages = + framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#3.0.1 + framework-arduinoespressif32-libs @ https://github.com/espressif/arduino-esp32/releases/download/3.0.1/esp32-arduino-libs-3.0.1.zip +build_flags = + ${env.build_flags} + -D BOARD=BOARD_GLOVE_IMU_SLIMEVR_DEV + -DESP32C3 + -D PRODUCT_NAME='"SlimeVR Glove (dev)"' +board = lolin_c3_mini +monitor_filters = colorize, esp32_exception_decoder diff --git a/scripts/preprocessor.py b/scripts/preprocessor.py new file mode 100644 index 0000000..8692deb --- /dev/null +++ b/scripts/preprocessor.py @@ -0,0 +1,157 @@ +import json +import re +import os +from pathlib import Path +from typing import Union, Optional, Dict, Any, List + +Import("env") + +try: + import jsonschema +except: + env.Execute( + env.VerboseAction( + '$PYTHONEXE -m pip install "jsonschema==4.22.0"', + "Installing jsonschema for validation", + ) + ) + +from jsonschema import Draft202012Validator, exceptions as jsonschema_exceptions + +def _load_json(maybe_path_or_dict: Union[str, Path, dict]) -> dict: + """Load JSON file or accept dict directly.""" + if isinstance(maybe_path_or_dict, dict): + return maybe_path_or_dict + p = Path(maybe_path_or_dict) + if not p.exists(): + raise FileNotFoundError(f"File not found: {p}") + try: + return json.loads(p.read_text(encoding="utf-8")) + except json.JSONDecodeError as e: + raise ValueError(f"Invalid JSON file {p}: {e}") + + +def _format_raw_value(value: Any) -> str: + """Format booleans for c/cpp, otherwise str(value).""" + if isinstance(value, bool): + return "true" if value else "false" + return str(value) + + +def _build_board_flags(defaults: dict, board_name: str) -> List[str]: + """Construct list of -D flags for one board.""" + if "defaults" not in defaults: + raise ValueError("Missing top-level 'defaults' key in defaults JSON.") + if board_name not in defaults["defaults"]: + raise ValueError(f"Invalid board selected - {board_name}") + + board_defaults = defaults["defaults"][board_name] + values = board_defaults.get("values", {}) + + args: Dict[str, Dict[str, Any]] = {} + + def add(key: str, value: Any, value_type: str): + if value is not None: + args[key] = {"value": value, "type": value_type} + + add("BOARD", board_name, "raw") + add("LED_PIN", values.get("LED").get("LED_PIN"), "pin") + add("LED_INVERTED", values.get("LED").get("LED_INVERTED"), "raw") + + sensors = values.get("SENSORS") + if sensors: + for index, sensor in enumerate(sensors): + if index == 0: + add("IMU", sensor.get("imu"), "raw") + add("PIN_IMU_INT", sensor.get("int"), "pin") + add("IMU_ROTATION", sensor.get("rotation"), "raw") + if sensor.get("protocol") == "I2C": + add("PRIMARY_IMU_ADDRESS_ONE", sensor.get("address"), "number") + if index == 1: + add("SECOND_IMU", sensor.get("imu"), "raw") + add("PIN_IMU_INT_2", sensor.get("int"), "pin") + add("SECOND_IMU_ROTATION", sensor.get("rotation"), "raw") + if sensor.get("protocol") == "I2C": + add("SECONDARY_IMU_ADDRESS_TWO", sensor.get("address"), "number") + + if sensor.get("protocol") == "I2C": + add("PIN_IMU_SDA", sensor.get("sda"), "pin") + add("PIN_IMU_SCL", sensor.get("scl"), "pin") + + battery = values.get("BATTERY") + if battery: + add("BATTERY_MONITOR", battery.get("type"), "raw") + add("PIN_BATTERY_LEVEL", battery.get("pin", 255), "pin") + add("BATTERY_SHIELD_RESISTANCE", battery.get("shieldR", 180), "number") + add("BATTERY_SHIELD_R1", battery.get("r1", 100), "number") + add("BATTERY_SHIELD_R2", battery.get("r2", 220), "number") + + parts: List[str] = [] + for key, meta in args.items(): + val = meta["value"] + typ = meta["type"] + + if typ == "pin": + if isinstance(val, str) and re.search(r"[AD]", val): + parts.append(f"-D{key}='{val}'") + else: + parts.append(f"-D{key}={_format_raw_value(val)}") + elif typ == "string": + parts.append(f"-D{key}='{val}'") + elif typ in ("raw", "number"): + parts.append(f"-D{key}={_format_raw_value(val)}") + + return parts + + +def build_boards( + schema_obj, + defaults_obj, + board_name: Optional[str] = None, +) -> Dict[str, List[str]]: + """ + Validate defaults.json against board-defaults.schema.json using jsonschema, + and return { board_name: [list of -D flags] }. + """ + validator = Draft202012Validator(schema_obj) + errors = sorted(validator.iter_errors(defaults_obj), key=lambda e: e.path) + + if errors: + print("✖ JSON Schema validation failed:") + for err in errors: + path = "/".join(map(str, err.path)) or "(root)" + print(f" • Path: {path}") + print(f" Error: {err.message}") + if err.context: + for ctx in err.context: + print(f" ↳ {ctx.message}") + raise ValueError(f"{len(errors)} schema validation errors found.") + + out: Dict[str, List[str]] = {} + if board_name: + out[board_name] = _build_board_flags(defaults_obj, board_name) + else: + for name in defaults_obj.get("defaults", {}).keys(): + out[name] = _build_board_flags(defaults_obj, name) + + return out + +schema_obj = _load_json("./board-defaults.schema.json") +defaults_obj = _load_json("./board-defaults.json") +slime_board = env.GetProjectOption("custom_slime_board", None) +if slime_board: + if 'SLIMEVR_OVERRIDE_DEFAULTS' in os.environ and slime_board in defaults_obj['defaults']: + print(">>> OVERIDING BOARD DEFAULTS ", os.environ['SLIMEVR_OVERRIDE_DEFAULTS']) + defaults_obj['defaults'][slime_board]['values'] = json.loads(os.environ['SLIMEVR_OVERRIDE_DEFAULTS']) + + output_flags = build_boards( + schema_obj, + defaults_obj, + slime_board, + ) + output_flags = output_flags.get(slime_board, []) if isinstance(output_flags, dict) else [] + + print(">>> Appending build flags:", output_flags) + env.Append(BUILD_FLAGS=output_flags) +else: + print(">>> custom_slime_board not set - skipping") diff --git a/src/boards/boards_default.h b/src/boards/boards_default.h index f329728..b16bd73 100644 --- a/src/boards/boards_default.h +++ b/src/boards/boards_default.h @@ -27,166 +27,6 @@ #include "defines_helpers.h" -// Board-specific configurations -#if BOARD == BOARD_SLIMEVR - -SDA(14) -SCL(12) -INT(16) -INT2(13) -BATTERY(17) -LED(2) -INVERTED_LED(true) -BATTERY_SHIELD_R(0) -BATTERY_R1(10) -BATTERY_R2(40.2) - -#elif BOARD == BOARD_SLIMEVR_V1_2 - -SDA(4) -SCL(5) -INT(2) -INT2(16) -BATTERY(17) -LED(2) -INVERTED_LED(true) -BATTERY_SHIELD_R(0) -BATTERY_R1(10) -BATTERY_R2(40.2) - -#elif BOARD == BOARD_SLIMEVR_LEGACY || BOARD == BOARD_SLIMEVR_DEV - -SDA(4) -SCL(5) -INT(10) -INT2(13) -BATTERY(17) -LED(2) -INVERTED_LED(true) -BATTERY_SHIELD_R(0) -BATTERY_R1(10) -BATTERY_R2(40.2) - -#elif BOARD == BOARD_NODEMCU || BOARD == BOARD_WEMOSD1MINI - -SDA(D2) -SCL(D1) -INT(D5) -INT2(D6) -BATTERY(A0) -BATTERY_SHIELD_R(180) -BATTERY_R1(100) -BATTERY_R2(220) - -#elif BOARD == BOARD_ESP01 - -SDA(2) -SCL(0) -INT(255) -INT2(255) -BATTERY(255) -LED(LED_OFF) -INVERTED_LED(false) - -#elif BOARD == BOARD_TTGO_TBASE - -SDA(5) -SCL(4) -INT(14) -INT2(13) -BATTERY(A0) - -#elif BOARD == BOARD_CUSTOM - -// Define pins by the examples above - -#elif BOARD == BOARD_WROOM32 - -SDA(21) -SCL(22) -INT(23) -INT2(25) -BATTERY(36) - -#elif BOARD == BOARD_LOLIN_C3_MINI - -SDA(5) -SCL(4) -INT(6) -INT2(8) -BATTERY(3) -LED(7) - -#elif BOARD == BOARD_BEETLE32C3 - -SDA(8) -SCL(9) -INT(6) -INT2(7) -BATTERY(3) -LED(10) -INVERTED_LED(false) - -#elif BOARD == BOARD_ESP32C3DEVKITM1 || BOARD == BOARD_ESP32C6DEVKITC1 - -SDA(5) -SCL(4) -INT(6) -INT2(7) -BATTERY(3) -LED(LED_OFF) - -#elif BOARD == BOARD_WEMOSWROOM02 - -SDA(2) -SCL(14) -INT(0) -INT2(4) -BATTERY(A0) -LED(16) -INVERTED_LED(true) - -#elif BOARD == BOARD_XIAO_ESP32C3 - -SDA(6) -SCL(7) // D5 -INT(5) // D3 -INT2(10) // D10 -LED(4) // D2 -INVERTED_LED(false) -BATTERY(2) // D0 / A0 -BATTERY_SHIELD_R(0) -BATTERY_R1(100) -BATTERY_R2(100) - -#elif BOARD == BOARD_GLOVE_IMU_SLIMEVR_DEV - -SDA(1) -SCL(0) -#define PCA_ADDR 0x70 -INT(16) -INT2(13) -BATTERY(3) -LED(2) -INVERTED_LED(true) -BATTERY_SHIELD_R(0) -BATTERY_R1(10) -BATTERY_R2(40.2) - -#elif BOARD == BOARD_ESP32S3_SUPERMINI - -SDA(7) -SCL(6) -INT(5) -INT2(4) -BATTERY(A2) // IO3 -BATTERY_SHIELD_R(0) -BATTERY_R1(10) -BATTERY_R2(40.2) -LED(LED_BUILTIN) - -#endif - // Default IMU pinouts and definitions for default tracker types #if BOARD != BOARD_GLOVE_IMU_SLIMEVR_DEV @@ -253,6 +93,18 @@ PIN_IMU_SDA, PRIMARY_IMU_OPTIONAL, BMI160_QMC_REMAP) \ #endif #else // BOARD == BOARD_GLOVE_IMU_SLIMEVR_DEV +SDA(1) +SCL(0) +#define PCA_ADDR 0x70 +INT(16) +INT2(13) +BATTERY(3) +LED(2) +INVERTED_LED(true) +BATTERY_SHIELD_R(0) +BATTERY_R1(10) +BATTERY_R2(40.2) + #include "glove_default.h" #endif // BOARD != BOARD_GLOVE_IMU_SLIMEVR_DEV diff --git a/src/boards/defines_helpers.cpp b/src/boards/defines_helpers.cpp index a2c5ad7..34272bf 100644 --- a/src/boards/defines_helpers.cpp +++ b/src/boards/defines_helpers.cpp @@ -29,5 +29,10 @@ #define LED_BUILTIN LED_OFF #endif +#ifndef LED_PIN extern const uint8_t __attribute__((weak)) LED_PIN = LED_BUILTIN; +#endif + +#ifndef LED_INVERTED extern const bool __attribute__((weak)) LED_INVERTED = true; +#endif