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