#include "sensor/calibration.hpp" #include "sensor/sensor.hpp" #include "serial.hpp" #include "std/memory.hpp" #include #include #include constexpr uint8_t SENSOR_ADDRESS = 0x68U; constexpr uint32_t SENSOR_THROTTLE_TIME = 50U; // milliseconds constexpr uint32_t SENSOR_RETRY_TIME = 2000U; // milliseconds constexpr uint32_t BAUD_RATE = 9600U; auto sout = SerialStream(Serial_(), BAUD_RATE); auto sensor = Sensor(SENSOR_ADDRESS, Wire, sout, SENSOR_THROTTLE_TIME); void setup() { sout.waitReady(); while (!sensor.begin()) { sout << "Error: Could not connect to the sensor. Retrying after 2000 " "milliseconds..." << endl; delay(SENSOR_RETRY_TIME); } if (!sensor.setAccelSensitivity(2)) // 8g { sout << "Error: Failed to set the sensor's accelerometer sensitivity. Status: " << static_cast(sensor.getStatus()) << endl; stop(); } if (!sensor.setGyroSensitivity(1)) // 500 degrees/s { sout << "Error: Failed to set the sensor's gyro sensitivity. Status: " << static_cast(sensor.getStatus()) << endl; stop(); } sout << "Calibrating sensor..." << endl; SensorCalibrator sensor_calibrator(sensor, sout); if (!sensor_calibrator.calibrate(SENSOR_THROTTLE_TIME)) { sout << "Error: Sensor calibration timed out after " << CALIBRATION_TIMEOUT << " milliseconds" << endl; stop(); } sout << "Finished calibrating sensor\n"; sout << "Calibration values:\n" << "Accelerometer X: " << sensor.accel_cal_x << "\n" << "Accelerometer Y: " << sensor.accel_cal_y << "\n" << "Accelerometer Z: " << sensor.accel_cal_z << "\n" << "Gyro X: " << sensor.gyro_cal_x << "\n" << "Gyro Y: " << sensor.gyro_cal_y << "\n" << "Gyro Z: " << sensor.gyro_cal_z << "\n"; sout << "Starting..." << endl; XInput.begin(); } void loop() { delay(SENSOR_THROTTLE_TIME); if (!sensor.read()) { SensorStatus status = sensor.getStatus(); if (status == SensorStatus::THROTTLED) { sout << "Warning: The sensor was read too frequently and throttled" << endl; return; } sout << "Error: Failed to read sensor. Status: " << static_cast(status) << endl; stop(); } sout << "Pitch: " << sensor.getPitch() << " Roll: " << sensor.getRoll() << endl; XInput.setJoystick(JOY_LEFT, static_cast(sensor.getRoll()), static_cast(sensor.getPitch())); XInput.printDebug(Serial); }