| /* |
| * STMicroelectronics Step Counter Sensor Class |
| * |
| * Copyright 2013-2015 STMicroelectronics Inc. |
| * Author: Denis Ciocca - <denis.ciocca@st.com> |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"). |
| */ |
| |
| #include <fcntl.h> |
| #include <assert.h> |
| #include <signal.h> |
| |
| #include "StepCounter.h" |
| |
| StepCounter::StepCounter(HWSensorBaseCommonData *data, const char *name, |
| int handle, unsigned int hw_fifo_len, int pipe_data_fd, |
| float power_consumption, bool wakeup) : |
| HWSensorBase(data, name, handle, |
| SENSOR_TYPE_STEP_COUNTER, hw_fifo_len, pipe_data_fd, power_consumption) |
| { |
| sensor_t_data.stringType = SENSOR_STRING_TYPE_STEP_COUNTER; |
| sensor_t_data.flags = SENSOR_FLAG_ON_CHANGE_MODE; |
| |
| if (wakeup) |
| sensor_t_data.flags |= SENSOR_FLAG_WAKE_UP; |
| |
| sensor_t_data.resolution = 1.0f; |
| sensor_t_data.maxRange = pow(2.0, (double)data->channels[0].bits_used) - 1; |
| |
| num_data_axis = SENSOR_BASE_1AXIS; |
| } |
| |
| StepCounter::~StepCounter() |
| { |
| |
| } |
| |
| int StepCounter::Enable(int handle, bool enable) |
| { |
| int err; |
| |
| err = HWSensorBase::Enable(handle, enable); |
| if (err < 0) |
| return err; |
| |
| if (!GetStatus()) |
| last_data_timestamp = 0; |
| |
| return 0; |
| } |
| |
| int StepCounter::SetDelay(int handle, int64_t period_ns, int64_t timeout) |
| { |
| int err; |
| int64_t min_pollrate_ns; |
| |
| err = SensorBase::SetDelay(handle, period_ns, timeout); |
| if (err < 0) |
| return err; |
| |
| min_pollrate_ns = GetMinPeriod(); |
| |
| err = write_sysfs_int((char *)FILENAME_MAX_DELIVERY_RATE, |
| common_data.iio_sysfs_path, (int)NS_TO_MS(min_pollrate_ns)); |
| if (err < 0) { |
| ALOGE("%s: Failed to write max rate delivery \"%s/%s\".", |
| common_data.device_name, common_data.iio_sysfs_path, |
| FILENAME_MAX_DELIVERY_RATE); |
| return err; |
| } |
| |
| return 0; |
| } |
| |
| void StepCounter::ProcessData(SensorBaseData *data) |
| { |
| #define STEP_COUNTER_DATA_MASK 0xFFFF |
| sensor_event.u64.step_counter = (uint64_t)data->raw[0] & STEP_COUNTER_DATA_MASK; |
| sensor_event.timestamp = data->timestamp; |
| |
| HWSensorBase::WriteDataToPipe(); |
| HWSensorBase::ProcessData(data); |
| } |