1cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca/* 2cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca * Copyright (C) 2015 Intel Corporation 3cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca * 4cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca * Licensed under the Apache License, Version 2.0 (the "License"); 5cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca * you may not use this file except in compliance with the License. 6cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca * You may obtain a copy of the License at 7cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca * 8cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca * http://www.apache.org/licenses/LICENSE-2.0 9cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca * 10cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca * Unless required by applicable law or agreed to in writing, software 11cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca * distributed under the License is distributed on an "AS IS" BASIS, 12cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca * See the License for the specific language governing permissions and 14cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca * limitations under the License. 15cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca */ 16cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca 17cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca#include <cutils/log.h> 18cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca#include "MMA7660Accelerometer.hpp" 192260148caf820ec683166792851b504e036c1f39Constantin Musca#include "SensorsHAL.hpp" 202260148caf820ec683166792851b504e036c1f39Constantin Musca#include "SensorUtils.hpp" 21cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca 222260148caf820ec683166792851b504e036c1f39Constantin Muscastruct sensor_t MMA7660Accelerometer::sensorDescription = { 236134630c71b16746935fe284c64dc29014a89577Bruce Beare .name = "MMA7660 Accelerometer", 241a7a7ca125ef0eb3e576e94412eba05ed916acaaConstantin Musca .vendor = "Freescale Semiconductor", 256134630c71b16746935fe284c64dc29014a89577Bruce Beare .version = 1, 266134630c71b16746935fe284c64dc29014a89577Bruce Beare .handle = -1, 276134630c71b16746935fe284c64dc29014a89577Bruce Beare .type = SENSOR_TYPE_ACCELEROMETER, 281a7a7ca125ef0eb3e576e94412eba05ed916acaaConstantin Musca /* maxRange = 1.5g */ 291a7a7ca125ef0eb3e576e94412eba05ed916acaaConstantin Musca .maxRange = 14.72f, 301a7a7ca125ef0eb3e576e94412eba05ed916acaaConstantin Musca .resolution = 0.459915612f, 311a7a7ca125ef0eb3e576e94412eba05ed916acaaConstantin Musca .power = 0.047f, 321a7a7ca125ef0eb3e576e94412eba05ed916acaaConstantin Musca .minDelay = 10, 336134630c71b16746935fe284c64dc29014a89577Bruce Beare .fifoReservedEventCount = 0, 346134630c71b16746935fe284c64dc29014a89577Bruce Beare .fifoMaxEventCount = 0, 356134630c71b16746935fe284c64dc29014a89577Bruce Beare .stringType = SENSOR_STRING_TYPE_ACCELEROMETER, 366134630c71b16746935fe284c64dc29014a89577Bruce Beare .requiredPermission = "", 371a7a7ca125ef0eb3e576e94412eba05ed916acaaConstantin Musca .maxDelay = 1000, 386134630c71b16746935fe284c64dc29014a89577Bruce Beare .flags = SENSOR_FLAG_CONTINUOUS_MODE, 396134630c71b16746935fe284c64dc29014a89577Bruce Beare .reserved = {}, 40cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca}; 41cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca 422260148caf820ec683166792851b504e036c1f39Constantin MuscaSensor * MMA7660Accelerometer::createSensor(int pollFd) { 432260148caf820ec683166792851b504e036c1f39Constantin Musca return new MMA7660Accelerometer(pollFd, 442260148caf820ec683166792851b504e036c1f39Constantin Musca SensorUtils::getI2cBusNumber(), 452260148caf820ec683166792851b504e036c1f39Constantin Musca MMA7660_DEFAULT_I2C_ADDR); 462260148caf820ec683166792851b504e036c1f39Constantin Musca} 472260148caf820ec683166792851b504e036c1f39Constantin Musca 482260148caf820ec683166792851b504e036c1f39Constantin Muscavoid MMA7660Accelerometer::initModule() { 492260148caf820ec683166792851b504e036c1f39Constantin Musca SensorContext::addSensorModule(&sensorDescription, createSensor); 502260148caf820ec683166792851b504e036c1f39Constantin Musca} 512260148caf820ec683166792851b504e036c1f39Constantin Musca 522260148caf820ec683166792851b504e036c1f39Constantin MuscaMMA7660Accelerometer::MMA7660Accelerometer(int pollFd, int bus, uint8_t address) 532260148caf820ec683166792851b504e036c1f39Constantin Musca : MMA7660 (bus, address), pollFd(pollFd) { 542260148caf820ec683166792851b504e036c1f39Constantin Musca handle = sensorDescription.handle; 55cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca type = SENSOR_TYPE_ACCELEROMETER; 56cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca} 57cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca 58cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin MuscaMMA7660Accelerometer::~MMA7660Accelerometer() {} 59cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca 60cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Muscaint MMA7660Accelerometer::pollEvents(sensors_event_t* data, int count) { 61cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca getAcceleration(&data->acceleration.x, &data->acceleration.y, &data->acceleration.z); 62d6572c0c36e5e96c4a40bb6d8728d0fef0adc351Constantin Musca data->acceleration.x *= Sensor::kGravitationalAcceleration; 63d6572c0c36e5e96c4a40bb6d8728d0fef0adc351Constantin Musca data->acceleration.y *= Sensor::kGravitationalAcceleration; 64d6572c0c36e5e96c4a40bb6d8728d0fef0adc351Constantin Musca data->acceleration.z *= Sensor::kGravitationalAcceleration; 65cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca return 1; 66cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca} 67cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca 68cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca// MMA7660 accelerometer sensor implementation 69cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Muscaint MMA7660Accelerometer::activate(int handle, int enabled) { 70cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca setModeStandby(); 712260148caf820ec683166792851b504e036c1f39Constantin Musca if (enabled) { 72cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca if (!setSampleRate(upm::MMA7660::AUTOSLEEP_64)) { 73cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca ALOGE("%s: Failed to set sensor SampleRate", __func__); 74cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca return -1; 75cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca } 76cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca 77cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca setModeActive(); 78df580e12c1420edfebf72fe63251d5d9cd3ff196Constantin Musca usleep(kActivationPeriod); 79cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca } 80cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca 812260148caf820ec683166792851b504e036c1f39Constantin Musca /* start or stop the acquisition thread */ 822260148caf820ec683166792851b504e036c1f39Constantin Musca return activateAcquisitionThread(pollFd, handle, enabled); 832260148caf820ec683166792851b504e036c1f39Constantin Musca} 84