Loading files
This file is pinned to the selected release. Download the original to open it in your design tool.
#include "Hardware.h"
#include "Device/Baro/BaroBMP085.hpp"
#include "Device/Baro/BaroBMP280.hpp"
#include "Device/Baro/BaroSPL06.hpp"
#include "Device/BaroDevice.hpp"
#include "Device/Gyro/GyroBMI160.hpp"
#include "Device/Gyro/GyroICM20602.hpp"
#include "Device/Gyro/GyroICM42688.hpp"
#include "Device/Gyro/GyroLSM6DSO.hpp"
#include "Device/Gyro/GyroMPU6050.hpp"
#include "Device/Gyro/GyroMPU6500.hpp"
#include "Device/Gyro/GyroMPU9250.hpp"
#include "Device/GyroDevice.hpp"
#include "Device/Mag/MagAK8963.hpp"
#include "Device/Mag/MagHMC5883L.hpp"
#include "Device/Mag/MagQMC5883L.hpp"
#include "Device/Mag/MagQMC5883P.hpp"
#include "Hal/Board.hpp"
#include "Hal/Gpio.hpp"
#include "Hal/Time.hpp"
#include "Hal/Wifi.hpp"
namespace {
static Espfc::Device::BusSlave gyroSlaveBus;
static Espfc::Device::Gyro::GyroMPU6050 mpu6050;
static Espfc::Device::Gyro::GyroMPU6500 mpu6500;
static Espfc::Device::Gyro::GyroMPU9250 mpu9250;
static Espfc::Device::Gyro::GyroLSM6DSO lsm6dso;
static Espfc::Device::Gyro::GyroICM20602 icm20602;
static Espfc::Device::Gyro::GyroICM42688 icm42688;
static Espfc::Device::Gyro::GyroBMI160 bmi160;
static Espfc::Device::Mag::MagHMC5883L hmc5883l;
static Espfc::Device::Mag::MagQMC5883L qmc5883l;
static Espfc::Device::Mag::MagQMC5883P qmc5883p;
static Espfc::Device::Mag::MagAK8963 ak8963;
static Espfc::Device::Baro::BaroBMP085 bmp085;
static Espfc::Device::Baro::BaroBMP280 bmp280;
static Espfc::Device::Baro::BaroSPL06 spl06;
} // namespace
namespace Espfc {
Hardware::Hardware(Model& model): _model(model) {}
int Hardware::begin()
{
initBus();
detectGyro();
detectMag();
detectBaro();
return 1;
}
void Hardware::onI2CError()
{
_model.state.i2cErrorCount++;
_model.state.i2cErrorDelta++;
}
void Hardware::initBus()
{
#if defined(ESPFC_SPI_0)
auto* spiBus = Hal::getBusSPI(0);
int spiResult = spiBus->begin(_model.config.pin[PIN_SPI_0_SCK], _model.config.pin[PIN_SPI_0_MOSI],
_model.config.pin[PIN_SPI_0_MISO]);
if (spiResult)
{
_spiBus = spiBus;
}
{
auto& logger = spiResult ? _model.logger.info() : _model.logger.err();
logger.log("SPI")
.log(_model.config.pin[PIN_SPI_0_SCK])
.log(_model.config.pin[PIN_SPI_0_MOSI])
.log(_model.config.pin[PIN_SPI_0_MISO])
.logln(spiResult);
}
#endif
#if defined(ESPFC_I2C_0)
auto* i2cBus = Hal::getBusI2C(0);
int i2cResult = i2cBus->begin(_model.config.pin[PIN_I2C_0_SDA], _model.config.pin[PIN_I2C_0_SCL],
_model.config.i2cSpeed * 1000ul);
if (i2cResult)
{
_i2cBus = i2cBus;
_i2cBus->onError = [this]() { onI2CError(); };
}
{
auto& logger = i2cResult ? _model.logger.info() : _model.logger.err();
logger.log("I2C")
.log(_model.config.pin[PIN_I2C_0_SDA])
.log(_model.config.pin[PIN_I2C_0_SCL])
.log(_model.config.i2cSpeed)
.logln(i2cResult);
}
#endif
}
void Hardware::detectGyro()
{
if (_model.config.gyro.dev == GYRO_NONE) return;
Device::GyroDevice* detectedGyro = nullptr;
#if defined(ESPFC_SPI_0)
if (_spiBus && _model.config.pin[PIN_SPI_CS0] != -1)
{
Hal::Gpio::digitalWrite(_model.config.pin[PIN_SPI_CS0], Hal::Gpio::High);
Hal::Gpio::pinMode(_model.config.pin[PIN_SPI_CS0], Hal::Gpio::Output);
if (!detectedGyro && detectDevice(mpu9250, _spiBus, _model.config.pin[PIN_SPI_CS0])) detectedGyro = &mpu9250;
if (!detectedGyro && detectDevice(mpu6500, _spiBus, _model.config.pin[PIN_SPI_CS0])) detectedGyro = &mpu6500;
if (!detectedGyro && detectDevice(icm20602, _spiBus, _model.config.pin[PIN_SPI_CS0])) detectedGyro = &icm20602;
if (!detectedGyro && detectDevice(icm42688, _spiBus, _model.config.pin[PIN_SPI_CS0])) detectedGyro = &icm42688;
if (!detectedGyro && detectDevice(bmi160, _spiBus, _model.config.pin[PIN_SPI_CS0])) detectedGyro = &bmi160;
if (!detectedGyro && detectDevice(lsm6dso, _spiBus, _model.config.pin[PIN_SPI_CS0])) detectedGyro = &lsm6dso;
if (detectedGyro) gyroSlaveBus.begin(_spiBus, detectedGyro->getAddress());
}
#endif
#if defined(ESPFC_I2C_0)
if (!detectedGyro && _i2cBus && _model.config.pin[PIN_I2C_0_SDA] != -1 && _model.config.pin[PIN_I2C_0_SCL] != -1)
{
if (!detectedGyro && detectDevice(mpu9250, _i2cBus)) detectedGyro = &mpu9250;
if (!detectedGyro && detectDevice(mpu6500, _i2cBus)) detectedGyro = &mpu6500;
if (!detectedGyro && detectDevice(icm20602, _i2cBus)) detectedGyro = &icm20602;
if (!detectedGyro && detectDevice(bmi160, _i2cBus)) detectedGyro = &bmi160;
if (!detectedGyro && detectDevice(mpu6050, _i2cBus)) detectedGyro = &mpu6050;
if (!detectedGyro && detectDevice(lsm6dso, _i2cBus)) detectedGyro = &lsm6dso;
if (detectedGyro) gyroSlaveBus.begin(_i2cBus, detectedGyro->getAddress());
}
#endif
if (!detectedGyro) return;
detectedGyro->setDLPFMode(_model.config.gyro.dlpf);
_model.state.gyro.dev = detectedGyro;
_model.state.gyro.present = (bool)detectedGyro;
_model.state.accel.present = _model.state.gyro.present && _model.config.accel.dev != GYRO_NONE;
_model.state.gyro.clock = detectedGyro->getRate();
}
void Hardware::detectMag()
{
if (_model.config.mag.dev == MAG_NONE) return;
Device::MagDevice* detectedMag = nullptr;
#if defined(ESPFC_I2C_0)
if (_i2cBus && _model.config.pin[PIN_I2C_0_SDA] != -1 && _model.config.pin[PIN_I2C_0_SCL] != -1)
{
if (!detectedMag && detectDevice(ak8963, _i2cBus)) detectedMag = &ak8963;
if (!detectedMag && detectDevice(hmc5883l, _i2cBus)) detectedMag = &hmc5883l;
if (!detectedMag && detectDevice(qmc5883l, _i2cBus)) detectedMag = &qmc5883l;
if (!detectedMag && detectDevice(qmc5883p, _i2cBus)) detectedMag = &qmc5883p;
}
#endif
if (gyroSlaveBus.getBus())
{
if (!detectedMag && detectDevice(ak8963, &gyroSlaveBus)) detectedMag = &ak8963;
if (!detectedMag && detectDevice(hmc5883l, &gyroSlaveBus)) detectedMag = &hmc5883l;
if (!detectedMag && detectDevice(qmc5883l, &gyroSlaveBus)) detectedMag = &qmc5883l;
if (!detectedMag && detectDevice(qmc5883p, &gyroSlaveBus)) detectedMag = &qmc5883p;
}
_model.state.mag.dev = detectedMag;
_model.state.mag.present = (bool)detectedMag;
_model.state.mag.rate = detectedMag ? detectedMag->getRate() : 0;
}
void Hardware::detectBaro()
{
if (_model.config.baro.dev == BARO_NONE) return;
Device::BaroDevice* detectedBaro = nullptr;
#if defined(ESPFC_SPI_0)
if (_spiBus && _model.config.pin[PIN_SPI_CS1] != -1)
{
Hal::Gpio::digitalWrite(_model.config.pin[PIN_SPI_CS1], Hal::Gpio::High);
Hal::Gpio::pinMode(_model.config.pin[PIN_SPI_CS1], Hal::Gpio::Output);
if (!detectedBaro && detectDevice(bmp280, _spiBus, _model.config.pin[PIN_SPI_CS1])) detectedBaro = &bmp280;
if (!detectedBaro && detectDevice(bmp085, _spiBus, _model.config.pin[PIN_SPI_CS1])) detectedBaro = &bmp085;
if (!detectedBaro && detectDevice(spl06, _spiBus, _model.config.pin[PIN_SPI_CS1])) detectedBaro = &spl06;
}
#endif
#if defined(ESPFC_I2C_0)
if (_i2cBus && _model.config.pin[PIN_I2C_0_SDA] != -1 && _model.config.pin[PIN_I2C_0_SCL] != -1)
{
if (!detectedBaro && detectDevice(bmp280, _i2cBus)) detectedBaro = &bmp280;
if (!detectedBaro && detectDevice(bmp085, _i2cBus)) detectedBaro = &bmp085;
if (!detectedBaro && detectDevice(spl06, _i2cBus)) detectedBaro = &spl06;
}
#endif
if (gyroSlaveBus.getBus())
{
if (!detectedBaro && detectDevice(bmp280, &gyroSlaveBus)) detectedBaro = &bmp280;
if (!detectedBaro && detectDevice(bmp085, &gyroSlaveBus)) detectedBaro = &bmp085;
if (!detectedBaro && detectDevice(spl06, &gyroSlaveBus)) detectedBaro = &spl06;
}
_model.state.baro.dev = detectedBaro;
_model.state.baro.present = (bool)detectedBaro;
}
void Hardware::restart(const Model& model)
{
if (model.state.mixer.escMotor) model.state.mixer.escMotor->end();
if (model.state.mixer.escServo) model.state.mixer.escServo->end();
#ifdef ESPFC_SERIAL_SOFT_0_WIFI
Hal::Wifi::stop();
#endif
delay(100);
Hal::Board::reset();
}
} // namespace Espfc
174ef2efdThis file is pinned to the selected release. Download the original to open it in your design tool.