SlimeVR / SlimeVR-Tracker-ESP

SlimeVR tracker firmware for ESP32/ESP8266 and different IMUs
Apache License 2.0
868 stars 298 forks source link

Add Per-Sensor Descriptor and Support Multiple IMUs #249

Closed nekomona closed 1 year ago

nekomona commented 1 year ago

This modification introduces sensor descriptor to specify sensor config in a clearer way. Currently it contains sensor types, address, pins and extra configs like axis remapping. It may extend to more parameters like magnetometer type in the future.

Descriptors are written in macros in the following format thanks to @yoyobuae :

#define IMU_DESC_LIST \
             IMU_DESC_ENTRY(IMU_MPU6050, 0x68, DEG_270, PIN_IMU_SCL, PIN_IMU_SDA) \
             IMU_DESC_ENTRY(IMU_BMI160,  0x69, DEG_270, PIN_IMU_SCL, PIN_IMU_SDA, AXIS_REMAP_DEFAULT)

They will be expanded to sensor building and detecting in the SensorManager. Sensor ID is assigned by the sequence of sensors in the list, and other parameters will be passed to building functions. This creates a direct connection between sensor id, sensor address, and sensor pins / configs in the same place.

The new descriptor also allows to add more than 2 sensors by appending more lines to the descriptor. To implement this, each sensor config contains the pin for that sensor. Internal pinmux inside ESPs are used to switch between different sensors, so more than 2 sensors with the same base address could be hooked up to different pins without extra hardware.

The code is highly experimental but attempted to be compatible with previous configs. When not specified, the descriptors will be generated from previous defines with matching address and ids. If a previous config uses two types of sensors but with incorrect address pin connection, the new code won't try the other address to avoid mismatch between config and assigned sensor id.

Axis remapping for BMI160 may not be fully compatible with previous configs. Now axis mapping is described by a number generated from defines. The sensor will use the number for no remapping by default to match the previous default behavior. Each BMI160 could have its own number for a different remapping in its descriptor. To migrate for this patch, previous changes in bmi160_defines.h for axis mapping will need to be rewritten in the new descriptors unless no remapping is used.

I have tested this in 2-sensor setups with combination of BMI160 and MPU6050s. An experimental setup driving 8 MPU6050s are also tested and works with only additional lines in the descriptor. INT pin for BNOs may need to be tested but should be working as the only difference is in passing pin numbers.

Eirenliel commented 1 year ago

Firmware webflasher would need to be rebuilt for this... @ButterscotchV @loucass003...