#pragma once #ifndef IIMU_H #define IIMU_H #pragma pack(push, 1) struct IMU_Data { long Temp; struct { float X, Y, Z; } Acc; struct { float X, Y, Z; } RawAcc; struct { float X, Y, Z; } Gyr; struct { float X, Y, Z; } RawGyr; struct { float X, Y, Z; } Mag; struct { float X, Y, Z; } RawMag; }; struct XYZ_Calib { short X[2] = {-4096, 4096}; short Y[2] = {-4096, 4096}; short Z[2] = {-4096, 4096}; }; struct XYZ_IMU_DATA { char Writed = sizeof(XYZ_IMU_DATA); XYZ_Calib Acc; }; struct IMU_Calib_Data { bool AllowedCalib = false; bool AccCalibNeed = true; XYZ_IMU_DATA Data; }; struct IMU_Info { unsigned char Addrs[1] = {0x68}; unsigned char WhoIAMReg[1] = {0x00}; unsigned char ExpectedIDs[1] = {0xEA}; }; #pragma pack(pop) typedef void (*IMU_Proc)(IMU_Data&); extern IMU_Calib_Data CalibDataIMU; void IMU_InitPower(); void IMU_SetReg(unsigned char Addr, unsigned char Reg, unsigned char Value); unsigned char IMU_GetReg(unsigned char Addr, unsigned char Reg); class IIMU { protected: virtual ~IIMU() = default; public: virtual void Init() = 0; virtual void Get(IMU_Data& Data) = 0; virtual void GetAsync(const IMU_Proc& DoneProc) = 0; }; IIMU* TryFindIMU(bool& find); #endif