MainUnit - Mpu6050 Static Architecture MPU6050 module - class relationshipsMPU6050 module - class relationshipsI2c«noncopyable»SensorDatapthread_mutex_t acc_lock_std::map raw_accelerations_std::map physical_accelerations_std::map spirit_angles_Mpu6050SensorI2c* i2c_handle_SensorData& data_to_fill_Init()Start()ReadSensorData()SetLowPassFilter()Mpu6050AccConverterSensorData& data_ConvertRawToPhysical()Mpu6050AngleConverterSensorData& data_CalculateAngle(int32_t)CalculateSpiritAngles()Mpu6050I2c* i2c_handle_SensorData sensor_data_Mpu6050Sensor sensor_Mpu6050AccConverter acc_converter_Mpu6050AngleConverter angle_converter_Init()Start()ReadSensorData()ProcessSensorData()- Contains mutex (non-copyable)- Shared by components; must outlive referencesMember order ensures sensor_data_ is constructed beforecomponent members that hold references to it.ownsownsownsownsreferencesreferencesreferencesholds pointerusesMPU6050 module - class relationshipsMPU6050 module - class relationshipsI2c«noncopyable»SensorDatapthread_mutex_t acc_lock_std::map raw_accelerations_std::map physical_accelerations_std::map spirit_angles_Mpu6050SensorI2c* i2c_handle_SensorData& data_to_fill_Init()Start()ReadSensorData()SetLowPassFilter()Mpu6050AccConverterSensorData& data_ConvertRawToPhysical()Mpu6050AngleConverterSensorData& data_CalculateAngle(int32_t)CalculateSpiritAngles()Mpu6050I2c* i2c_handle_SensorData sensor_data_Mpu6050Sensor sensor_Mpu6050AccConverter acc_converter_Mpu6050AngleConverter angle_converter_Init()Start()ReadSensorData()ProcessSensorData()- Contains mutex (non-copyable)- Shared by components; must outlive referencesMember order ensures sensor_data_ is constructed beforecomponent members that hold references to it.ownsownsownsownsreferencesreferencesreferencesholds pointeruses Dynamic Architecture Reading the MPU sensorReading the MPU sensorThr_Mpu6050_ReadBalancermpu6050Mpu6050_sensori2cThr_Mpu6050_ReadBalancermpu6050Mpu6050_sensori2cThr_Mpu6050_ReadThr_Mpu6050_ReadBalancerBalancermpu6050mpu6050Mpu6050_sensorMpu6050_sensori2ci2cThr_Mpu6050_ReadBalancermpu6050Mpu6050_sensori2cReadAccSensor()mpu6050.ReadSensorData()sensor_.ReadSensorData()ReadAcceleration()Atomic write to raw accelerations - 'acc_lock_'ReadBlockOfBytes()Reading the MPU sensorReading the MPU sensorThr_Mpu6050_ReadBalancermpu6050Mpu6050_sensori2cThr_Mpu6050_ReadBalancermpu6050Mpu6050_sensori2cThr_Mpu6050_ReadThr_Mpu6050_ReadBalancerBalancermpu6050mpu6050Mpu6050_sensorMpu6050_sensori2ci2cThr_Mpu6050_ReadBalancermpu6050Mpu6050_sensori2cReadAccSensor()mpu6050.ReadSensorData()sensor_.ReadSensorData()ReadAcceleration()Atomic write to raw accelerations - 'acc_lock_'ReadBlockOfBytes() Performing ACC Calculation and PID controlPerforming ACC Calculation and PID controlThr_Flight_CtrlBalancermpu6050mpu6050Mpu6050_acc_converterMpu6050_angle_converterSpi_HwThr_Flight_CtrlBalancermpu6050Mpu6050_acc_converterMpu6050_angle_converterSpi_HwThr_Flight_CtrlThr_Flight_CtrlBalancerBalancermpu6050mpu6050Mpu6050_acc_converterMpu6050_acc_converterMpu6050_angle_converterMpu6050_angle_converterSpi_HwSpi_HwThr_Flight_CtrlBalancermpu6050mpu6050Mpu6050_acc_converterMpu6050_angle_converterSpi_HwCalculateFlightControls()mpu6050.ProcessSensorData()ConvertRawToPhysical()Atomic read of raw accelerations - 'acc_lock_'CalculateSpiritAngles()CalculateAngle()mpu6050.GetSpiritAngle()CalculatePID()spi_bus.ReadWriteData()Performing ACC Calculation and PID controlPerforming ACC Calculation and PID controlThr_Flight_CtrlBalancermpu6050mpu6050Mpu6050_acc_converterMpu6050_angle_converterSpi_HwThr_Flight_CtrlBalancermpu6050Mpu6050_acc_converterMpu6050_angle_converterSpi_HwThr_Flight_CtrlThr_Flight_CtrlBalancerBalancermpu6050mpu6050Mpu6050_acc_converterMpu6050_acc_converterMpu6050_angle_converterMpu6050_angle_converterSpi_HwSpi_HwThr_Flight_CtrlBalancermpu6050mpu6050Mpu6050_acc_converterMpu6050_angle_converterSpi_HwCalculateFlightControls()mpu6050.ProcessSensorData()ConvertRawToPhysical()Atomic read of raw accelerations - 'acc_lock_'CalculateSpiritAngles()CalculateAngle()mpu6050.GetSpiritAngle()CalculatePID()spi_bus.ReadWriteData()