Example #1
0
//センサーの初期化
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;
    }
}
Example #3
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);
}
Example #4
0
static const char *
SDL_ANDROID_SensorGetDeviceName(int device_index)
{
    return ASensor_getName(SDL_sensors[device_index].asensor);
}