/*---------------------------------------------------------------------------* Project: horizon File: hid_GyroscopeReader.h Copyright 2010 Nintendo. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Rev: $ *---------------------------------------------------------------------------*/ /* Please see man pages for details */ #ifndef NN_HID_CTR_GYROSCOPEREADER_H_ #define NN_HID_CTR_GYROSCOPEREADER_H_ #include #include #include #include #include #include #include #include #include #include namespace nn { namespace hid { namespace CTR { /* Please see man pages for details */ enum ZeroDriftMode { GYROSCOPE_ZERODRIFT_LOOSE, // GYROSCOPE_ZERODRIFT_STANDARD,// GYROSCOPE_ZERODRIFT_TIGHT,// GYROSCOPE_ZERODRIFT_NUM }; /* Please see man pages for details */ class GyroscopeReader: private nn::util::NonCopyable { public: /* Please see man pages for details */ /* Please see man pages for details */ GyroscopeReader(AccelerometerReader* pAccelerometerReader = NULL, Gyroscope& gyroscope = GetGyroscope()); /* Please see man pages for details */ ~GyroscopeReader(); /* */ /* Please see man pages for details */ /* Please see man pages for details */ void Read(GyroscopeStatus* pBufs, s32* pReadLen, s32 bufLen); /* Please see man pages for details */ bool ReadLatest(GyroscopeStatus* pBuf); /* */ /* Please see man pages for details */ /* Please see man pages for details */ void Reset(); /* */ /* Please see man pages for details */ /* Please see man pages for details */ void SetAngle(f32 ax, f32 ay, f32 az); /* Please see man pages for details */ void SetDirection(const Direction& direction); /* Please see man pages for details */ void SetAngleMagnification(f32 pitch, f32 yaw, f32 roll); /* Please see man pages for details */ void SetDirectionMagnification(f32 magnification); /* */ /* Please see man pages for details */ /* Please see man pages for details */ void EnableZeroPlay(); /* Please see man pages for details */ void DisableZeroPlay(); /* Please see man pages for details */ bool IsEnableZeroPlay() const; /* Please see man pages for details */ f32 GetZeroPlayEffect() const; /* Please see man pages for details */ void SetZeroPlayParam(f32 radius); /* Please see man pages for details */ void GetZeroPlayParam(f32& radius) const; /* Please see man pages for details */ void ResetZeroPlayParam(); /* */ /* Please see man pages for details */ /* Please see man pages for details */ void EnableZeroDrift(); /* Please see man pages for details */ void DisableZeroDrift(); /* Please see man pages for details */ bool IsEnableZeroDrift() const; /* Please see man pages for details */ f32 GetZeroDriftEffect() const; /* Please see man pages for details */ void ResetZeroDriftMode(); /* Please see man pages for details */ void SetZeroDriftMode(const ZeroDriftMode& mode); /* Please see man pages for details */ void GetZeroDriftMode(ZeroDriftMode& mode) const; /* */ /* Please see man pages for details */ /* Please see man pages for details */ void EnableAccRevise(); /* Please see man pages for details */ void DisableAccRevise(); /* Please see man pages for details */ bool IsEnableAccRevise() const; /* Please see man pages for details */ f32 GetAccReviseEffect() const; /* Please see man pages for details */ void SetAccReviseParam(f32 revisePower, f32 reviseRange); /* Please see man pages for details */ void GetAccReviseParam(f32& revisePower, f32& reviseRange) const; /* Please see man pages for details */ void ResetAccReviseParam(); /* */ /* Please see man pages for details */ /* Please see man pages for details */ void EnableAxisRotation(); /* Please see man pages for details */ void DisableAxisRotation(); /* Please see man pages for details */ bool IsEnableAxisRotation() const; /* Please see man pages for details */ void SetAxisRotationMatrix(const nn::math::MTX34& mtx); /* Please see man pages for details */ nn::math::MTX34 GetAxisRotationMatrix() const; /* Please see man pages for details */ void GetAxisRotationMatrix(nn::math::MTX34* pMtx) const; /* Please see man pages for details */ void ResetAxisRotationMatrix(); /* */ private : void ReadLocal(GyroscopeStatus* pBufs, s32* pReadLen, s32 bufLen); void GetZeroDriftParam(f32& radius, s32& count, f32& power) const; void SetZeroDriftParam(f32 radius, s32 count, f32 power); f32 ReviseDirection_Acceleration(Direction& rev_dir, const nn::math::VEC3& acc); void CalculateGyroscopeAxisStatus( f32 *destSpeed, s32 *nearSamplingNum, f32 *zeroOffset, s32 srcSpeed, f32 speedScale, s32* oldValueArray); void CalculateDirection(); void InitializeCalibrationData(); private : /* Maximum drift adjustment count*/ static const u32 GYROSCOPE_DRIFT_COUNT_MAX = 256; //2 to the nth power private : static const s32 GYROSCOPE_LOCAL_BUFFER_SIZE = 32; s32 m_GyroscopeLocalBufferSize; GyroscopeStatus m_GyroscopeStatusLocalBuffer[GYROSCOPE_LOCAL_BUFFER_SIZE]; bool m_IsFirstRead; util::SizedEnum1 m_ZeroDriftMode; NN_PADDING2; AccelerometerReader m_DefaultAccelerometerReader; GyroscopeStatus m_CurrentStatus; AccelerometerReader* m_pAccelerometerReader; nn::math::VEC3 m_SpeedOld; nn::math::VEC3 m_SpeedVector; nn::math::VEC3 m_SpeedScale; f32 m_DirectionMagnification; // Magnification when calculating attitude f32 m_Period; // Coefficient for calculation f32 m_FreqDegree; // Coefficient for calculation f32 m_FreqRadian; // Coefficient for calculation bool m_EnableZeroPlay; // Set play to zero point? bool m_EnableZeroDrift; // Zero point automatic correction? bool m_EnableAccRevise; // Make attitude correction using acceleration? bool m_EnableRotate; f32 m_ZeroPlayRadius; // Zero point play radius (1 = 360deg/sec) f32 m_ZeroDriftRadius; // Drift count tolerance radius (1 = 360deg/sec) s32 m_ZeroDriftCount; // Drift adjustment count f32 m_ZeroDriftPower; // Drift adjustment power f32 m_AccRevisePower; // Acceleration correction power f32 m_AccReviseRange; // acceleration correction enabled radius f32 m_ZeroPlayEffect; // Play circle interior setting 0:outside to 1:center f32 m_ZeroDriftEffect; // Drift adjustment count continuation (0 to 1) f32 m_AccRevEffect; // How much acceleration correction is being applied? nn::math::VEC3 m_CalibrationZero; // Calibration value f64 m_CalibrationScale[3]; // Calibration value nn::math::VEC3 m_CountZero; // Count value that indicates zero point s32 m_CountIdx; // Buffer that stores the newest index s32 m_CountT[3][GYROSCOPE_DRIFT_COUNT_MAX]; // XYZ hardware value f32 m_DpsPitchMagnification; // Magnification when calculating angular velocity in pitch direction f32 m_DpsYawMagnification; // Magnification when calculating angular velocity in yaw direction f32 m_DpsRollMagnification; // Magnification when calculating angular velocity in roll direction NN_PADDING4; /*from Low*/ Gyroscope& m_Gyroscope; s32 m_IndexOfRead; s64 m_TickOfRead; /*rotate axis*/ nn::math::MTX34 m_RotateMtx; }; } // namespace CTR { } // namespace hid { } // namespace nn { #endif // #ifndef NN_HID_CTR_GYROSCOPEREADER_H_