/*---------------------------------------------------------------------------* Project: Horizon File: hid_AccelerometerReader.h Copyright (C)2009 Nintendo Co., Ltd. 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: 35723 $ *---------------------------------------------------------------------------*/ /*! @file @brief AccelerometerReader クラスを定義します。 */ #ifndef NN_HID_CTR_HID_ACCELEROMETERREADER_H_ #define NN_HID_CTR_HID_ACCELEROMETERREADER_H_ #include #include #include #include #include #include #include #include #include #include namespace nn { namespace hid { namespace CTR { /*! @brief 加速度センサの取る最大の絶対値です。 */ const s16 MAX_OF_ACCELEROMETER_VALUE = 930; /*! @brief 加速度センサの 1G あたりの 値です。 */ const s16 ACCELEROMETER_VALUE_PER_1G = 512; const f32 ACCELERATION_SCALE_PER_1G = 1.f / ACCELEROMETER_VALUE_PER_1G; /*! @brief 加速度センサの遊びの最大値です。 */ const s16 MAX_OF_ACCELEROMETER_PLAY = MAX_OF_ACCELEROMETER_VALUE * 2; const s16 ACCELEROMETER_SENSITIVITY_SCALE_SHIFT = 7; /*! @brief 加速度センサの検出感度の最大値です。 */ const s16 MAX_OF_ACCELEROMETER_SENSITIVITY = 128; // 1 << ACCELEROMETER_SENSITIVITY_SCALE_SHIFT /*! @brief 加速度センサのサンプリングデータを読み込むクラスです。 */ class AccelerometerReader : private nn::util::NonCopyable { public: /*! @name コンストラクタ/デストラクタ @{ */ /*! @brief コンストラクタです。 インスタンスを生成する前に @ref nn::hid::CTR::Initialize( ) で初期化してください。 */ AccelerometerReader(Accelerometer& accelerometer = GetAccelerometer( )); /*! @brief デストラクタです。 */ ~AccelerometerReader( ); /*! @} */ /*! @name サンプリングデータの読み込み @{ */ /*! @brief 加速度センサのサンプリングデータを新しいものから順に読み込みます。以前に読み込んだデータは読み込まれません。 @param[out] pBufs 新しいものから順にサンプリングデータが読み込まれます。 @param[out] pReadLen 読み込んだサンプリングデータの数です。 @param[in] bufLen pBufs に読み込めるサンプリングデータの数を指定します。 @return なし。 */ void Read(AccelerometerStatus* pBufs, s32* pReadLen, s32 bufLen); /*! @brief 最新の加速度センサのサンプリングデータを読み込みます。 nn::hid::CTR::AccelerometerReader::Read( ) とちがい同じサンプリングデータを読み込むことが出来ます。 内部では一つ前の ReadLatest( ) のサンプリングデータとの差を加速度の変位として検出感度を計算します。 @param[out] pBuf サンプリングデータが読み込まれます。 @return サンプリングデータの読み込み結果を返します。
true ・・・ 読み込めました。
false ・・・ 読み込めませんでした。(AccelerometerReaderのインスタンス生成後あるいはスリープ復帰後の最初のサンプリングが行われ次第、読み込めます。) */ bool ReadLatest(AccelerometerStatus* pBuf); /*! @} */ /*! @name 加速度変位の遊びに関するコントロール関数 @{ */ /*! @brief サンプリング間の加速度変位の遊びと、検出感度の設定値を取得します。 @param[out] pPlay 現在設定されている遊びを読み込みます。 @param[out] pSensitivity 現在設定されている検出感度を読み込みます。 @return なし。 */ void GetSensitivity(s16* pPlay, s16* pSensitivity) const; /*! @brief サンプリング間の加速度変位の遊びと、検出感度の設定を行います。 デフォルトは、 play、sensitivity がそれぞれ 0、@ref nn::hid::CTR::MAX_OF_ACCELEROMETER_SENSITIVITY です。 @param[in] play 遊びです。 0 以上 @ref nn::hid::CTR::MAX_OF_ACCELEROMETER_PLAY 以下の数値を指定してください。 @param[in] sensitivity 検出感度を表します。 0 ~ @ref nn::hid::CTR::MAX_OF_ACCELEROMETER_SENSITIVITY の範囲で指定します。 0 だと全く反応しなくなり、 @ref nn::hid::CTR::MAX_OF_ACCELEROMETER_SENSITIVITY ではデバイスから取得した値そのままに反応します。 @return なし。 */ void SetSensitivity(s16 play, s16 sensitivity); /*! @} */ /*! @name 軸回転 @{ */ /*! @brief 加速度センサの軸回転を有効にします。 軸回転が有効なとき、@ref SetAxisRotationMatrix( ) で設定された回転行列使用し、サンプリングデータに回転変換処理を行った値が出力されるようになります。 この処理によって、CTR内にセンサが傾いて配置されている様に扱うことができます。 オフセットと軸回転が両方とも有効の場合には、オフセット処理、回転処理の順に変換処理を行います。 */ void EnableAxisRotation(); /*! @brief 加速度センサの軸回転を無効にします。 */ void DisableAxisRotation(); /*! @brief 加速度センサの軸回転が有効か無効か調べます。 @return 有効であればtrue,無効であればfalse */ bool IsEnableAxisRotation(); /*! @brief 加速度センサのサンプリングデータを軸回転するための回転行列を指定します。 @param[in] mtx 変換する回転行列 */ void SetAxisRotationMatrix(nn::math::MTX34 mtx); /*! @brief 加速度センサのサンプリングデータを軸回転するために指定している回転行列を取得します。 @return 設定されている回転行列 */ nn::math::MTX34 GetAxisRotationMatrix(); /*! @brief 加速度センサのサンプリングデータを変換するための回転行列を初期化します。 この関数を呼び出すと、回転行列は @ref nn::math::MTX34 の単位行列に初期化されます。 これは軸回転が無効な場合と同等です。 */ void ResetAxisRotationMatrix(); /*! @} */ /*! @name オフセット @{ */ /*! @brief 加速度センサのオフセットを有効にします。 オフセットが有効なとき、@ref SetOffset( ) や @ref SetOffsetFromBaseStatus( ) で設定されたオフセット値をサンプリングデータから引いて出力します。 オフセットと軸回転が両方とも有効の場合には、オフセット処理、回転処理の順に変換処理を行います。 初期値は有効になっています。 */ void EnableOffset(); /*! @brief 加速度センサのオフセットを無効にします。 初期値は有効になっています。 */ void DisableOffset(); /*! @brief 加速度センサのオフセットが有効か無効か調べます。 @return 有効であればtrue,無効であればfalse */ bool IsEnableOffset(); /*! @brief 加速度センサのオフセット値を指定します。 オフセットが有効なとき、指定した値がサンプリングデータから引かれて出力されるようになります。 初期値は全て 0 になっています。 @param[in] x オフセット値のx成分 @param[in] y オフセット値のy成分 @param[in] z オフセット値のz成分 */ void SetOffset(s16 x, s16 y,s16 z); /*! @brief 加速度センサのオフセット値を設定します。 オフセットが有効なとき、ここで指定した加速度センサの値の時に水平となるようオフセットが引かれてサンプリングデータが出力されるようになります。 @param[in] baseAccelerometerStatus 水平状態とみなす加速度センサの値 */ void SetOffsetFromBaseStatus(AccelerometerStatus baseAccelerometerStatus); /*! @brief 加速度センサのオフセット値を取得します。 @param[out] pX オフセット値のx成分 @param[out] pY オフセット値のy成分 @param[out] pZ オフセット値のz成分 */ void GetOffset(s16* pX, s16* pY, s16*pZ); /*! @brief 加速度センサのオフセット値を初期値に戻します。 この関数を呼びだすと、加速度センサのオフセット値は(0,0,0)となります。これはオフセットが無効な場合と同等です。 */ void ResetOffset(); /*! @} */ /*! @name その他 @{ */ /*! @brief 加速度センサのサンプリングデータを、加速度 (単位は G ) へ変換します。 @param[out] pAcceleration 加速度に変換されたデータが格納されます。 @param[in] bufLen pAcceleration に格納できる加速度データの数を指定します。 @param[in] pSamplingData 変換前の加速度センサのサンプリングデータ @return なし。 */ void ConvertToAcceleration(AccelerationFloat* pAcceleration, s32 bufLen, const AccelerometerStatus* pSamplingData); /*! @} */ private: void Transform(AccelerometerStatus* pAccStatus); protected: Accelerometer& m_Accelerometer; s16 m_Play; s16 m_Sensitivity; AccelerometerStatus m_LatestCalculatedStatus; AccelerometerStatus m_OffsetAccStatus; NN_PADDING4; nn::math::MTX34 m_RotateMtx; bool m_EnableOffset; bool m_EnableRotate; NN_PADDING2; s32 m_IndexOfRead; s64 m_TickOfRead; }; // inline 実装 inline void AccelerometerReader::SetSensitivity(s16 play, s16 sensitivity) { NN_TASSERT_(0 <= play && MAX_OF_ACCELEROMETER_PLAY >= play && 0 <= sensitivity && MAX_OF_ACCELEROMETER_SENSITIVITY >= sensitivity); m_Play = play; m_Sensitivity = sensitivity; } inline void AccelerometerReader::GetSensitivity(s16* pPlay, s16* pSensitivity) const { *pPlay = m_Play; *pSensitivity = m_Sensitivity; } } // namespace CTR { } // namespace hid { } // namespace nn { #endif // #ifndef NN_HID_CTR_HID_ACCELEROMETERREADER_H_