HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
1230
inoviaWindows上で加速度センサーの値を取得するモジュール0解決


inovia

リンク

2015/12/30(Wed) 22:57:27|NO.73882

Windows上で加速度センサーの値を取得するモジュールです。
(通常のHSP3のみの対応です。hsp3dishには対応していません。)

hsp3dishのWindows版では加速度センサーの値が取れないようなので、
作ってみました。
http://hsp.tv/play/pforum.php?mode=all&num=73867


#ifndef __mod_sensor__ #define __mod_sensor__ #module _mod_sensor_ #define ctype SUCCEEDED(%1) (%1 >= 0) #define ctype FAILED(%1) (%1 < 0) #define ctype isNULL(%1) (0 == %1) #define SafeRelease(%1) if (6 == vartype(%1)){ \ if (varuse(%1)){ \ delcom %1: \ %1 = 0 \ } \ } // 有効なCOMオブジェクトかどうか調べます #defcfunc isComObj var p1 if (6 == vartype(p1)){ if varuse(p1){ return 1 } } return 0 // 逆版 #defcfunc isNotComObj var p1 if (6 == vartype(p1)){ if varuse(p1){ return 0 } } return 1 #define CLSID_SensorManager "{77a1c827-fcd2-4689-8915-9d613cc5fa3e}" #define IID_ISensorManager "{bd77db67-45a8-42dc-8d00-6dcf15f8377a}" #define IID_ISensorCollection "{23571e11-e545-4dd8-a337-b89bf44b10df}" #define IID_ISensor "{5fa08f80-2657-458e-af75-46f73fa6ac5c}" #define IID_ISensorDataReport "{0ab9df9b-c4b5-4796-8898-0470706a2e1d}" #usecom ISensorManager IID_ISensorManager CLSID_SensorManager #comfunc ISensorManager_GetSensorsByCategory 3 var, var #usecom ISensorCollection IID_ISensorCollection #comfunc ISensorCollection_GetAt 3 int, var #usecom ISensor IID_ISensor #comfunc ISensor_GetData 13 var #usecom ISensorDataReport IID_ISensorDataReport #comfunc ISensorDataReport_GetSensorValue 4 var, var #deffunc initSensor SENSOR_TYPE_ACCELEROMETER_3D = 0xC2FB0F5F, 0x4C78E2D2, 0x2A35D0BC, 0x9D818295 SENSOR_DATA_TYPE_ACCELERATION_X_G = 0x3f8a69a2, 0x4e4807c5, 0x79cd65a9, 0xd556ab7a, 2 SENSOR_DATA_TYPE_ACCELERATION_Y_G = 0x3f8a69a2, 0x4e4807c5, 0x79cd65a9, 0xd556ab7a, 3 SENSOR_DATA_TYPE_ACCELERATION_Z_G = 0x3f8a69a2, 0x4e4807c5, 0x79cd65a9, 0xd556ab7a, 4 newcom pSensorManager, ISensorManager if isComObj(pSensorManager) { pMotionSensorCollectionPtr = 0 ISensorManager_GetSensorsByCategory pSensorManager, SENSOR_TYPE_ACCELEROMETER_3D, pMotionSensorCollectionPtr if FAILED(stat) || isNULL(pMotionSensorCollectionPtr) { SafeRelease pSensorManager logmes "ISensorManager::GetSensorsByCategory の呼び出し失敗" return -2 } newcom pMotionSensorCollection, IID_ISensorCollection, -1, pMotionSensorCollectionPtr if isNotComObj(pMotionSensorCollection) { SafeRelease pSensorManager logmes "ISensorCollection インターフェース失敗" return -3 } // 0番目固定 // (センサーデバイスが複数ある場合は、列挙してからでないとダメかも…?) pMotionSensorPtr = 0 ISensorCollection_GetAt pMotionSensorCollection, 0, pMotionSensorPtr if FAILED(stat) || isNULL(pMotionSensorPtr) { SafeRelease pMotionSensorCollection SafeRelease pSensorManager logmes "ISensorCollection::GetAt の呼び出し失敗" return -4 } newcom pMotionSensor, IID_ISensor, -1, pMotionSensorPtr if isNotComObj(pMotionSensor) { SafeRelease pMotionSensorCollection SafeRelease pSensorManager logmes "ISensor インターフェース失敗" return -5 } }else{ logmes "ISensorManager インターフェース失敗" return -1 } // Variant型変数をあらかじめ用意しておく dimtype x, vartype("variant"), 1 dimtype y, vartype("variant"), 1 dimtype z, vartype("variant"), 1 return // 加速度センサーの情報を取得 #deffunc updateSensorData if isComObj(pMotionSensor){ pDataPtr = 0 ISensor_GetData pMotionSensor, pDataPtr if FAILED(stat) || isNULL(pDataPtr) { logmes "ISensor::GetData の呼び出し失敗" return -1 } newcom pData, IID_ISensorDataReport, -1, pDataPtr if isNotComObj(pData) { logmes "ISensorDataReport インターフェース失敗" return -2 } ISensorDataReport_GetSensorValue pData, SENSOR_DATA_TYPE_ACCELERATION_X_G, x ISensorDataReport_GetSensorValue pData, SENSOR_DATA_TYPE_ACCELERATION_Y_G, y ISensorDataReport_GetSensorValue pData, SENSOR_DATA_TYPE_ACCELERATION_Z_G, z SafeRelease pData return 0 } return -3 // 加速度センサーのX軸の取得 #defcfunc getAccrX return x("value") // 加速度センサーのY軸の取得 #defcfunc getAccrY return y("value") // 加速度センサーのZ軸の取得 #defcfunc getAccrZ return z("value") // 解放 #deffunc termSensor SafeRelease pData SafeRelease pMotionSensor SafeRelease pMotionSensorCollection SafeRelease pSensorManager return #global #endif // 以下サンプル // 最初に一度だけ初期化する initSensor if stat < 0 { dialog "加速度センサーが見つかりません" end } onexit gosub *exit repeat pos 0, 0 color 255,255,255 : boxf : color // getAccrX〜Z()を取得する前に、updateSensorDataを実行すること // 何時まで経っても同じ値が取得されます。 updateSensorData mes "x:" + getAccrX() mes "y:" + getAccrY() mes "z:" + getAccrZ() redraw 1 wait 12 redraw 0 loop stop *exit // 最後に開放する termSensor end return


参考サイト:
http://blog.okazuki.jp/entry/2015/04/07/195929
http://codetter.com/?p=390
https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/+/35235140d0b428acef4c83de88634589c172e375/x86_64-w64-mingw32/include/sensorsapi.h
http://apt-browse.org/browse/ubuntu/trusty/universe/all/mingw-w64-common/3.1.0-1/file/usr/share/mingw-w64/include/sensors.h

プログラムへの組み込み、改造、および改造したプログラムの配布はご自由にどうぞ。
特に著作権表示は必要ありません。
(この掲示板のURLぐらいは貼っていただけると、良いかもしれませんが。)



この記事に返信する


ONION software Copyright 1997-2023(c) All rights reserved.