SensorRunnable(const sensors_event_t& data, const sensor_t* sensors, ssize_t size) { mSensorData.sensor() = HardwareSensorToHalSensor(data.type); if (mSensorData.sensor() == SENSOR_UNKNOWN) { // Emulator is broken and gives us events without types set if (data.sensor < size) mSensorData.sensor() = HardwareSensorToHalSensor(sensors[data.sensor].type); } mSensorData.accuracy() = HardwareStatusToHalAccuracy(SensorseventStatus(data)); mSensorData.timestamp() = data.timestamp; if (mSensorData.sensor() == SENSOR_GYROSCOPE) { // libhardware returns gyro as rad. convert. mSensorValues.AppendElement(radToDeg(data.data[0])); mSensorValues.AppendElement(radToDeg(data.data[1])); mSensorValues.AppendElement(radToDeg(data.data[2])); } else if (mSensorData.sensor() == SENSOR_PROXIMITY) { mSensorValues.AppendElement(data.data[0]); mSensorValues.AppendElement(0); // Determine the maxRange for this sensor. for (ssize_t i = 0; i < size; i++) { if (sensors[i].type == SENSOR_TYPE_PROXIMITY) { mSensorValues.AppendElement(sensors[i].maxRange); } } } else if (mSensorData.sensor() == SENSOR_LIGHT) { mSensorValues.AppendElement(data.data[0]); } else { mSensorValues.AppendElement(data.data[0]); mSensorValues.AppendElement(data.data[1]); mSensorValues.AppendElement(data.data[2]); } mSensorData.values() = mSensorValues; }
static void PollSensors() { const size_t numEventMax = 16; sensors_event_t buffer[numEventMax]; const sensor_t* sensors; int size = sSensorModule->get_sensors_list(sSensorModule, &sensors); do { // didn't check sSensorDevice because already be done on creating pollingThread. int n = sSensorDevice->poll(sSensorDevice, buffer, numEventMax); if (n < 0) { LOGE("Error polling for sensor data (err=%d)", n); break; } for (int i = 0; i < n; ++i) { // FIXME: bug 802004, add proper support for the magnetic field sensor. if (buffer[i].type == SENSOR_TYPE_MAGNETIC_FIELD) continue; if (HardwareSensorToHalSensor(buffer[i].type) == SENSOR_UNKNOWN) { // Emulator is broken and gives us events without types set int index; for (index = 0; index < size; index++) { if (sensors[index].handle == buffer[i].sensor) { break; } } if (index < size && HardwareSensorToHalSensor(sensors[index].type) != SENSOR_UNKNOWN) { buffer[i].type = sensors[index].type; } else { LOGW("Could not determine sensor type of event"); continue; } } NS_DispatchToMainThread(new SensorRunnable(buffer[i], sensors, size)); } } while (true); }
static void SwitchSensor(bool aActivate, sensor_t aSensor, pthread_t aThreadId) { int index = HardwareSensorToHalSensor(aSensor.type); MOZ_ASSERT(sSensorRefCount[index] || aActivate); sSensorDevice->activate(sSensorDevice, aSensor.handle, aActivate); if (aActivate) { sSensorDevice->setDelay(sSensorDevice, aSensor.handle, DEFAULT_DEVICE_POLL_RATE); } if (aActivate) { sSensorRefCount[index]++; } else { sSensorRefCount[index]--; } }