//センサーの初期化 void init_sensors(struct engine* engine,struct android_app* state) { // センサーマネージャの取得 ASensorList list; int sensor_list[] = { ASENSOR_TYPE_ACCELEROMETER, ASENSOR_TYPE_MAGNETIC_FIELD, ASENSOR_TYPE_GYROSCOPE, ASENSOR_TYPE_LIGHT, ASENSOR_TYPE_PROXIMITY }; engine->sensorManager = ASensorManager_getInstance(); /////-----(1) // 利用可能なセンサーの一覧を取得 int num = ASensorManager_getSensorList(engine->sensorManager, &list); /////-----(2) int i, j; // バッファの初期化 for (i = 0; i < SENSOR_MAX; i++) { engine->sensors[i].sensor = NULL; engine->sensors[i].type = sensor_list[i]; } // センサーのデータ取得準備 for (i = 0; i < num; i++) { ASensorRef sensor = list[i]; int type = ASensor_getType(sensor); // センサーのTYPEを取得 /////-----(3) LOGI("type=%d sensor=%s", type, ASensor_getName(sensor)); // センサーから値を取得できるようにする for (j = 0; j < SENSOR_MAX; j++) { if ((type == engine->sensors[j].type) && (engine->sensors[j].sensor == NULL)) { engine->sensors[j].sensor = ASensorManager_getDefaultSensor( /////-----(4) engine->sensorManager, type); break; } } } // センサー情報取得キューの新規作成 engine->sensorEventQueue = ASensorManager_createEventQueue( /////-----(5) engine->sensorManager, state->looper, LOOPER_ID_USER, NULL, NULL); }
void QuerySensors() { int I; State->Manager = ASensorManager_getInstance(); State->Count = ASensorManager_getSensorList(State->Manager, &State->Sensors); State->Info = (InfoStructure *) malloc(State->Count * sizeof(InfoStructure)); LOG(ANDROID_LOG_INFO, "Found %d sensors", State->Count); for (I = 0; I < State->Count; I++) { State->Info[I].Index = I; State->Info[I].Type = ASensor_getType(State->Sensors[I]); State->Info[I].Vendor = ASensor_getVendor(State->Sensors[I]); State->Info[I].Name = ASensor_getName(State->Sensors[I]); State->Info[I].Delay = ASensor_getMinDelay(State->Sensors[I]); State->Info[I].Resolution = ASensor_getResolution(State->Sensors[I]); LOG(ANDROID_LOG_INFO, "Sensor: %d, %s, %s, %dus, %f", State->Info[I].Type, State->Info[I].Vendor, State->Info[I].Name, State->Info[I].Delay, State->Info[I].Resolution); State->Info[I].Shift = 0; } }
// try and open up the JoyWarrior file descriptor bool CSensorAndroidBuiltIn::detect() { setType(); setPort(); // get the singleton instance of the m_pSensorManager if (!m_pSensorManager) m_pSensorManager = (ASensorManager*) ASensorManager_getInstance(); /* // sensor listing ASensorList pSensorList = NULL; int iNum = ASensorManager_getSensorList(m_pSensorManager, &pSensorList); if (iNum && pSensorList) { fprintf(stdout, "\n\n%d Detected Sensors:\n", iNum); //int i = 0; for (int i=0; i < iNum; i++) { //while (i<10 && (pSensorList+i)) { //for (int i=0; i < iNum; i++) { fprintf(stdout, " %s\n", ASensor_getName(*(pSensorList+i))); i++; } } else { fprintf(stdout, "\n\nNo Sensor List? %d\n\n", iNum); } */ // create looper m_pLooper = ALooper_forThread(); // get existing looper if (!m_pLooper) { // make new looper //m_pLooper = ALooper_prepare(0); m_pLooper = ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS); } if (!m_pLooper) { // no existing or new looper -- error fprintf(stderr, "can't create Looper\n"); return false; // can't create looper } // setup event queue //m_pSensorEventQueue = ASensorManager_createEventQueue(m_pSensorManager, m_pLooper, // LOOPER_ID_QCN, QCN_ALooper_callback, &l_SensorVector); m_pSensorEventQueue = ASensorManager_createEventQueue(m_pSensorManager, m_pLooper, LOOPER_ID_QCN, NULL, NULL); if (!m_pSensorEventQueue) { fprintf(stderr, "can't create SensorEventQueue\n"); return false; // can't setup queue } // get the default accelerometer m_pSensor = (ASensor*) ASensorManager_getDefaultSensor(m_pSensorManager, ASENSOR_TYPE_ACCELEROMETER); if (!m_pSensor) { //fprintf(stdout, "No Android accelerometer detected.\n"); return false; // no sensor } int iRetVal = 0; if ((iRetVal = ASensorEventQueue_enableSensor(m_pSensorEventQueue, m_pSensor)) < 0) { fprintf(stderr, "Error in enableSensor %d\n", iRetVal); return false; }; m_fResolution = ASensor_getResolution(m_pSensor); m_minDelayMsec = ASensor_getMinDelay(m_pSensor); int rateMsec = (int)((sm->dt > 0. ? sm->dt : g_DT) * 1000.); //fprintf(stdout, "Rates: m_minDelayMSec = %d raceMsec = %d\n", m_minDelayMsec, rateMsec); //if (rateMsec > m_minDelayMsec) m_minDelayMsec = rateMsec; if (rateMsec < m_minDelayMsec) m_minDelayMsec = rateMsec; fprintf(stdout, "Setting data rate to %d Hz\n", 1000L/m_minDelayMsec); strlcpy(m_strSensor, ASensor_getName(m_pSensor), _MAX_PATH); strlcpy(m_strVendor, ASensor_getVendor(m_pSensor), _MAX_PATH); // NB: the rate is in microseconds! if ((iRetVal = ASensorEventQueue_setEventRate(m_pSensorEventQueue, m_pSensor, m_minDelayMsec * 1000L)) < 0) { fprintf(stderr, "Error in setEventRate %d\n", iRetVal); // return false; // not really a fatal error } fprintf(stdout, "Android Default Sensor Detected: \n\n %s - %s\n" " Res = %f --- Min Delay msec = %d\n" " m_pSensor=%x m_pSensorEventQueue=%x\n", m_strVendor, m_strSensor, m_fResolution, m_minDelayMsec, m_pSensor, m_pSensorEventQueue); setType(SENSOR_ANDROID); setSingleSampleDT(true); // set to true in raw mode so we don't get any interpolated/avg points (i.e. just the "integer" value hopefully) return (bool)(getTypeEnum() == SENSOR_ANDROID); }
static const char * SDL_ANDROID_SensorGetDeviceName(int device_index) { return ASensor_getName(SDL_sensors[device_index].asensor); }