1c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/*
2a73d574dda77810ae10046c68e7a9aa38ad77603Nick Vaccaro * Copyright (C) 2014 The Android Open Source Project
3c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *
4c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * Licensed under the Apache License, Version 2.0 (the "License");
5c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * you may not use this file except in compliance with the License.
6c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * You may obtain a copy of the License at
7c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *
8c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *      http://www.apache.org/licenses/LICENSE-2.0
9c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *
10c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * Unless required by applicable law or agreed to in writing, software
11c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * distributed under the License is distributed on an "AS IS" BASIS,
12c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * See the License for the specific language governing permissions and
14c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * limitations under the License.
15c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */
16c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
17c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define LOG_NDEBUG 0
18c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
19c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <fcntl.h>
20c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <errno.h>
21c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <math.h>
22c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <unistd.h>
23c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <dirent.h>
24c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <sys/select.h>
25c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <cutils/log.h>
26c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <linux/input.h>
27c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <string.h>
28c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
29c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "CompassSensor.IIO.primary.h"
30c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "sensors.h"
31c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "MPLSupport.h"
32c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "sensor_params.h"
33c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "ml_sysfs_helper.h"
34c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
35c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define COMPASS_MAX_SYSFS_ATTRB sizeof(compassSysFs) / sizeof(char*)
36c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define COMPASS_NAME "USE_SYSFS"
37c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
38c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#if defined COMPASS_AK8975
39c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#pragma message("HAL:build Invensense compass cal with AK8975 on primary bus")
40c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define USE_MPL_COMPASS_HAL (1)
41c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define COMPASS_NAME        "INV_AK8975"
42c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
43c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
44c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/******************************************************************************/
45c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
46c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick VaccaroCompassSensor::CompassSensor()
47c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                  : SensorBase(COMPASS_NAME, NULL),
48c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    mCompassTimestamp(0),
49c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    mCompassInputReader(8),
50c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    mCoilsResetFd(0)
51c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
52c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FILE *fptr;
53c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
54c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    VFUNC_LOG;
55c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
56c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mYasCompass = false;
57c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if(!strcmp(dev_name, "USE_SYSFS")) {
58c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        char sensor_name[20];
59c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        find_name_by_sensor_type("in_magn_x_raw", "iio:device", sensor_name);
60c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        strncpy(dev_full_name, sensor_name,
61c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                sizeof(dev_full_name) / sizeof(dev_full_name[0]));
62c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if(!strncmp(dev_full_name, "yas", 3)) {
63c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            mYasCompass = true;
64c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        }
65c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    } else {
66c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
67c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef COMPASS_YAS53x
68c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        /* for YAS53x compasses, dev_name is just a prefix,
69c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro           we need to find the actual name */
70c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if (fill_dev_full_name_by_prefix(dev_name,
71c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                dev_full_name, sizeof(dev_full_name) / sizeof(dev_full_name[0]))) {
72c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            LOGE("Cannot find Yamaha device with prefix name '%s' - "
73c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                 "magnetometer will likely not work.", dev_name);
74c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        } else {
75c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            mYasCompass = true;
76c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        }
77c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#else
78c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        strncpy(dev_full_name, dev_name,
79c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                sizeof(dev_full_name) / sizeof(dev_full_name[0]));
80c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
81c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
82c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
83c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
84c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (inv_init_sysfs_attributes()) {
85c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        LOGE("Error Instantiating Compass\n");
86c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return;
87c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
88c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
89c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (!strcmp(dev_full_name, "INV_COMPASS")) {
90c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        mI2CBus = COMPASS_BUS_SECONDARY;
91c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    } else {
92c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        mI2CBus = COMPASS_BUS_PRIMARY;
93c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
94c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
95c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    memset(mCachedCompassData, 0, sizeof(mCachedCompassData));
96c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
97c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (!isIntegrated()) {
98c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        enable(ID_M, 0);
99c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
100c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
101c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    LOGV_IF(SYSFS_VERBOSE, "HAL:compass name: %s", dev_full_name);
102c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    enable_iio_sysfs();
103c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
104c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:cat %s (%lld)",
105c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            compassSysFs.compass_orient, getTimestamp());
106c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    fptr = fopen(compassSysFs.compass_orient, "r");
107c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (fptr != NULL) {
108c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        int om[9];
109c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if (fscanf(fptr, "%d,%d,%d,%d,%d,%d,%d,%d,%d",
110c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro               &om[0], &om[1], &om[2], &om[3], &om[4], &om[5],
111c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro               &om[6], &om[7], &om[8]) < 0 || fclose(fptr)) {
112c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            LOGE("HAL:could not read compass mounting matrix");
113c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        } else {
114c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
115c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            LOGV_IF(EXTRA_VERBOSE,
116c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    "HAL:compass mounting matrix: "
117c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    "%+d %+d %+d %+d %+d %+d %+d %+d %+d",
118c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    om[0], om[1], om[2], om[3], om[4], om[5], om[6], om[7], om[8]);
119c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
120c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            mCompassOrientation[0] = om[0];
121c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            mCompassOrientation[1] = om[1];
122c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            mCompassOrientation[2] = om[2];
123c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            mCompassOrientation[3] = om[3];
124c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            mCompassOrientation[4] = om[4];
125c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            mCompassOrientation[5] = om[5];
126c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            mCompassOrientation[6] = om[6];
127c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            mCompassOrientation[7] = om[7];
128c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            mCompassOrientation[8] = om[8];
129c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        }
130c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
131c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
132c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if(mYasCompass) {
133c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        mCoilsResetFd = fopen(compassSysFs.compass_attr_1, "r+");
134c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if (fptr == NULL) {
135c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            LOGE("HAL:Could not open compass overunderflow");
136c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        }
137c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
138c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
139c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
140c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid CompassSensor::enable_iio_sysfs()
141c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
142c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    VFUNC_LOG;
143c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
144c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int tempFd = 0;
145c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char iio_device_node[MAX_CHIP_ID_LEN];
146c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FILE *tempFp = NULL;
147c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    const char* compass = dev_full_name;
148c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
149c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
150c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            1, compassSysFs.in_timestamp_en, getTimestamp());
151c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    write_sysfs_int(compassSysFs.in_timestamp_en, 1);
152c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
153c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
154c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            IIO_BUFFER_LENGTH, compassSysFs.buffer_length, getTimestamp());
155c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    tempFp = fopen(compassSysFs.buffer_length, "w");
156c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (tempFp == NULL) {
157c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        LOGE("HAL:could not open buffer length");
158c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    } else {
159c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if (fprintf(tempFp, "%d", IIO_BUFFER_LENGTH) < 0 || fclose(tempFp) < 0) {
160c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            LOGE("HAL:could not write buffer length");
161c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        }
162c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
163c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
164c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(iio_device_node, "%s%d", "/dev/iio:device",
165c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            find_type_by_name(compass, "iio:device"));
166c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    compass_fd = open(iio_device_node, O_RDONLY);
167c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int res = errno;
168c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (compass_fd < 0) {
169c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        LOGE("HAL:could not open '%s' iio device node in path '%s' - "
170c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro             "error '%s' (%d)",
171c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro             compass, iio_device_node, strerror(res), res);
172c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    } else {
173c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        LOGV_IF(EXTRA_VERBOSE,
174c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                "HAL:iio %s, compass_fd opened : %d", compass, compass_fd);
175c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
176c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
177c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    /* TODO: need further tests for optimization to reduce context-switch
178c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo 1 > %s (%lld)",
179c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            compassSysFs.compass_x_fifo_enable, getTimestamp());
180c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    tempFd = open(compassSysFs.compass_x_fifo_enable, O_RDWR);
181c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    res = errno;
182c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (tempFd > 0) {
183c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        res = enable_sysfs_sensor(tempFd, 1);
184c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    } else {
185c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        LOGE("HAL:open of %s failed with '%s' (%d)",
186c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro             compassSysFs.compass_x_fifo_enable, strerror(res), res);
187c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
188c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
189c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo 1 > %s (%lld)",
190c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            compassSysFs.compass_y_fifo_enable, getTimestamp());
191c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    tempFd = open(compassSysFs.compass_y_fifo_enable, O_RDWR);
192c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    res = errno;
193c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (tempFd > 0) {
194c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        res = enable_sysfs_sensor(tempFd, 1);
195c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    } else {
196c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        LOGE("HAL:open of %s failed with '%s' (%d)",
197c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro             compassSysFs.compass_y_fifo_enable, strerror(res), res);
198c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
199c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
200c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo 1 > %s (%lld)",
201c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            compassSysFs.compass_z_fifo_enable, getTimestamp());
202c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    tempFd = open(compassSysFs.compass_z_fifo_enable, O_RDWR);
203c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    res = errno;
204c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (tempFd > 0) {
205c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        res = enable_sysfs_sensor(tempFd, 1);
206c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    } else {
207c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        LOGE("HAL:open of %s failed with '%s' (%d)",
208c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro             compassSysFs.compass_z_fifo_enable, strerror(res), res);
209c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
210c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    */
211c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
212c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
213c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick VaccaroCompassSensor::~CompassSensor()
214c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
215c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    VFUNC_LOG;
216c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
217c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    free(pathP);
218c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if( compass_fd > 0)
219c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        close(compass_fd);
220c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if(mYasCompass) {
221c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if( mCoilsResetFd != NULL )
222c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            fclose(mCoilsResetFd);
223c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
224c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
225c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
226c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint CompassSensor::getFd(void) const
227c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
228c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    VHANDLER_LOG;
229c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    LOGI_IF(0, "HAL:compass_fd=%d", compass_fd);
230c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return compass_fd;
231c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
232c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
233c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/**
234c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @brief        This function will enable/disable sensor.
235c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @param[in]    handle
236c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *                  which sensor to enable/disable.
237c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @param[in]    en
238c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *                  en=1, enable;
239c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *                  en=0, disable
240c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @return       if the operation is successful.
241c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */
242c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint CompassSensor::enable(int32_t handle, int en)
243c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
244c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    VFUNC_LOG;
245c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
246c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mEnable = en;
247c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int tempFd;
248c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int res = 0;
249c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
250c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    /* reset master enable */
251c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    res = masterEnable(0);
252c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (res < 0) {
253c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return res;
254c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
255c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
256c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (en) {
257c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
258c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                en, compassSysFs.compass_x_fifo_enable, getTimestamp());
259c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        res = write_sysfs_int(compassSysFs.compass_x_fifo_enable, en);
260c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
261c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                en, compassSysFs.compass_y_fifo_enable, getTimestamp());
262c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        res += write_sysfs_int(compassSysFs.compass_y_fifo_enable, en);
263c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
264c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                en, compassSysFs.compass_z_fifo_enable, getTimestamp());
265c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        res += write_sysfs_int(compassSysFs.compass_z_fifo_enable, en);
266c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
267c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        res = masterEnable(en);
268c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if (res < en) {
269c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            return res;
270c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        }
271c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
272c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
273c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return res;
274c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
275c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
276c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint CompassSensor::masterEnable(int en)
277c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
278c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    VFUNC_LOG;
279c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
280c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            en, compassSysFs.chip_enable, getTimestamp());
281c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return write_sysfs_int(compassSysFs.chip_enable, en);
282c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
283c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
284c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint CompassSensor::setDelay(int32_t handle, int64_t ns)
285c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
286c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    VFUNC_LOG;
287c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int tempFd;
288c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int res;
289c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
290c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mDelay = ns;
291c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (ns == 0)
292c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return -1;
293c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    tempFd = open(compassSysFs.compass_rate, O_RDWR);
294c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %.0f > %s (%lld)",
295c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            1000000000.f / ns, compassSysFs.compass_rate, getTimestamp());
296c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    res = write_attribute_sensor(tempFd, 1000000000.f / ns);
297c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if(res < 0) {
298c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        LOGE("HAL:Compass update delay error");
299c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
300c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return res;
301c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
302c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
303c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/**
304c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    @brief      This function will return the state of the sensor.
305c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    @return     1=enabled; 0=disabled
306c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro**/
307c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint CompassSensor::getEnable(int32_t handle)
308c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
309c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    VFUNC_LOG;
310c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return mEnable;
311c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
312c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
313c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/* use for Invensense compass calibration */
314c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define COMPASS_EVENT_DEBUG (0)
315c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid CompassSensor::processCompassEvent(const input_event *event)
316c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
317c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    VHANDLER_LOG;
318c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
319c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    switch (event->code) {
320c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    case EVENT_TYPE_ICOMPASS_X:
321c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        LOGV_IF(COMPASS_EVENT_DEBUG, "EVENT_TYPE_ICOMPASS_X\n");
322c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        mCachedCompassData[0] = event->value;
323c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        break;
324c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    case EVENT_TYPE_ICOMPASS_Y:
325c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        LOGV_IF(COMPASS_EVENT_DEBUG, "EVENT_TYPE_ICOMPASS_Y\n");
326c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        mCachedCompassData[1] = event->value;
327c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        break;
328c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    case EVENT_TYPE_ICOMPASS_Z:
329c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        LOGV_IF(COMPASS_EVENT_DEBUG, "EVENT_TYPE_ICOMPASS_Z\n");
330c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        mCachedCompassData[2] = event->value;
331c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        break;
332c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
333c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
334c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mCompassTimestamp =
335c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        (int64_t)event->time.tv_sec * 1000000000L + event->time.tv_usec * 1000L;
336c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
337c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
338c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid CompassSensor::getOrientationMatrix(signed char *orient)
339c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
340c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    VFUNC_LOG;
341c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    memcpy(orient, mCompassOrientation, sizeof(mCompassOrientation));
342c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
343c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
344c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarolong CompassSensor::getSensitivity()
345c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
346c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    VFUNC_LOG;
347c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
348c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    long sensitivity;
349c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:cat %s (%lld)",
350c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            compassSysFs.compass_scale, getTimestamp());
351c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    inv_read_data(compassSysFs.compass_scale, &sensitivity);
352c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return sensitivity;
353c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
354c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
355c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/**
356c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    @brief         This function is called by sensors_mpl.cpp
357c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                   to read sensor data from the driver.
358c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    @param[out]    data      sensor data is stored in this variable. Scaled such that
359c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                             1 uT = 2^16
360c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    @para[in]      timestamp data's timestamp
361c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    @return        1, if 1   sample read, 0, if not, negative if error
362c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */
363c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint CompassSensor::readSample(long *data, int64_t *timestamp) {
364c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    VFUNC_LOG;
365c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
366c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int i;
367c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char *rdata = mIIOBuffer;
368c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
369c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    size_t rsize = read(compass_fd, rdata, (8 * mEnable + 8) * 1);
370c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
371c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (!mEnable) {
372c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        rsize = read(compass_fd, rdata, (8 + 8) * IIO_BUFFER_LENGTH);
373c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        // LOGI("clear buffer with size: %d", rsize);
374c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
375c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/*
376c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    LOGI("get one sample of AMI IIO data with size: %d", rsize);
377c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    LOGI_IF(mEnable, "compass x/y/z: %d/%d/%d", *((short *) (rdata + 0)),
378c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        *((short *) (rdata + 2)), *((short *) (rdata + 4)));
379c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro*/
380c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (mEnable) {
381c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        for (i = 0; i < 3; i++) {
382c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            data[i] = *((short *) (rdata + i * 2));
383c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        }
384c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        *timestamp = *((long long *) (rdata + 8 * mEnable));
385c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
386c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
387c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return mEnable;
388c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
389c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
390c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/**
391c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @brief  This function will return the current delay for this sensor.
392c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @return delay in nanoseconds.
393c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */
394c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint64_t CompassSensor::getDelay(int32_t handle)
395c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
396c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    VFUNC_LOG;
397c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return mDelay;
398c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
399c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
400c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid CompassSensor::fillList(struct sensor_t *list)
401c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
402c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    VFUNC_LOG;
403c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
404c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    const char *compass = dev_full_name;
405c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
406c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (compass) {
407c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if(!strcmp(compass, "INV_COMPASS")) {
408c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            list->maxRange = COMPASS_MPU9150_RANGE;
409c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            list->resolution = COMPASS_MPU9150_RESOLUTION;
410c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            list->power = COMPASS_MPU9150_POWER;
411c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            list->minDelay = COMPASS_MPU9150_MINDELAY;
412c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            mMinDelay = list->minDelay;
413c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            return;
414c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        }
415c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if(!strcmp(compass, "compass")
416c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                || !strcmp(compass, "INV_AK8975")
417a73d574dda77810ae10046c68e7a9aa38ad77603Nick Vaccaro                || !strcmp(compass, "AKM8975")
418a73d574dda77810ae10046c68e7a9aa38ad77603Nick Vaccaro                || !strcmp(compass, "akm8975")) {
419c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            list->maxRange = COMPASS_AKM8975_RANGE;
420c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            list->resolution = COMPASS_AKM8975_RESOLUTION;
421c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            list->power = COMPASS_AKM8975_POWER;
422c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            list->minDelay = COMPASS_AKM8975_MINDELAY;
423c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            mMinDelay = list->minDelay;
424c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            return;
425c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        }
426c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if(!strcmp(compass, "compass")
427c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                || !strcmp(compass, "INV_AK8963")
428a73d574dda77810ae10046c68e7a9aa38ad77603Nick Vaccaro                || !strcmp(compass, "AKM8963")
429a73d574dda77810ae10046c68e7a9aa38ad77603Nick Vaccaro                || !strcmp(compass, "akm8963")) {
430c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            list->maxRange = COMPASS_AKM8963_RANGE;
431c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            list->resolution = COMPASS_AKM8963_RESOLUTION;
432c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            list->power = COMPASS_AKM8963_POWER;
433c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            list->minDelay = COMPASS_AKM8963_MINDELAY;
434c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            mMinDelay = list->minDelay;
435c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            return;
436c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        }
437a73d574dda77810ae10046c68e7a9aa38ad77603Nick Vaccaro        if(!strcmp(compass, "compass")
438a73d574dda77810ae10046c68e7a9aa38ad77603Nick Vaccaro                || !strcmp(compass, "INV_AK09911")
439a73d574dda77810ae10046c68e7a9aa38ad77603Nick Vaccaro                || !strcmp(compass, "AK09911")
440a73d574dda77810ae10046c68e7a9aa38ad77603Nick Vaccaro                || !strcmp(compass, "ak09911")) {
441a73d574dda77810ae10046c68e7a9aa38ad77603Nick Vaccaro            list->maxRange = COMPASS_AKM9911_RANGE;
442a73d574dda77810ae10046c68e7a9aa38ad77603Nick Vaccaro            list->resolution = COMPASS_AKM9911_RESOLUTION;
443a73d574dda77810ae10046c68e7a9aa38ad77603Nick Vaccaro            list->power = COMPASS_AKM9911_POWER;
444a73d574dda77810ae10046c68e7a9aa38ad77603Nick Vaccaro            list->minDelay = COMPASS_AKM9911_MINDELAY;
445a73d574dda77810ae10046c68e7a9aa38ad77603Nick Vaccaro            mMinDelay = list->minDelay;
446a73d574dda77810ae10046c68e7a9aa38ad77603Nick Vaccaro            return;
447a73d574dda77810ae10046c68e7a9aa38ad77603Nick Vaccaro        }
448c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if(!strcmp(compass, "ami306")) {
449c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            list->maxRange = COMPASS_AMI306_RANGE;
450c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            list->resolution = COMPASS_AMI306_RESOLUTION;
451c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            list->power = COMPASS_AMI306_POWER;
452c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            list->minDelay = COMPASS_AMI306_MINDELAY;
453c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            mMinDelay = list->minDelay;
454c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            return;
455c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        }
456c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if(!strcmp(compass, "yas530")
457c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                || !strcmp(compass, "yas532")
458c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                || !strcmp(compass, "yas533")) {
459c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            list->maxRange = COMPASS_YAS53x_RANGE;
460c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            list->resolution = COMPASS_YAS53x_RESOLUTION;
461c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            list->power = COMPASS_YAS53x_POWER;
462c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            list->minDelay = COMPASS_YAS53x_MINDELAY;
463c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            mMinDelay = list->minDelay;
464c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            return;
465c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        }
466c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
467c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
468c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    LOGE("HAL:unknown compass id %s -- "
469c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro         "params default to ak8975 and might be wrong.",
470c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro         compass);
471c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    list->maxRange = COMPASS_AKM8975_RANGE;
472c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    list->resolution = COMPASS_AKM8975_RESOLUTION;
473c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    list->power = COMPASS_AKM8975_POWER;
474c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    list->minDelay = COMPASS_AKM8975_MINDELAY;
475c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mMinDelay = list->minDelay;
476c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
477c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
478c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/* Read sysfs entry to determine whether overflow had happend
479c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro   then write to sysfs to reset to zero */
480c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint CompassSensor::checkCoilsReset()
481c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
482c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int result=-1;
483c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    VFUNC_LOG;
484c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
485c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if(mCoilsResetFd != NULL) {
486c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        int attr;
487c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        rewind(mCoilsResetFd);
488c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        fscanf(mCoilsResetFd, "%d", &attr);
489c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if(attr == 0)
490c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            return 0;
491c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        else {
492c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            LOGV_IF(SYSFS_VERBOSE, "HAL:overflow detected");
493c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            rewind(mCoilsResetFd);
494c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            if(fprintf(mCoilsResetFd, "%d", 0) < 0)
495c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                LOGE("HAL:could not write overunderflow");
496c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            else
497c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                return 1;
498c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        }
499c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    } else {
500c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        LOGE("HAL:could not read overunderflow");
501c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
502c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return result;
503c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
504c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
505c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint CompassSensor::inv_init_sysfs_attributes(void)
506c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
507c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    VFUNC_LOG;
508c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
509c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    unsigned char i = 0;
510c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char sysfs_path[MAX_SYSFS_NAME_LEN], tbuf[2];
511c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char *sptr;
512c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char **dptr;
513c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int num;
514c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    const char* compass = dev_full_name;
515c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
516c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    pathP = (char*)malloc(
517c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    sizeof(char[COMPASS_MAX_SYSFS_ATTRB][MAX_SYSFS_NAME_LEN]));
518c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sptr = pathP;
519c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    dptr = (char**)&compassSysFs;
520c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (sptr == NULL)
521c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return -1;
522c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
523c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    do {
524c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        *dptr++ = sptr;
525c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        sptr += sizeof(char[MAX_SYSFS_NAME_LEN]);
526c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    } while (++i < COMPASS_MAX_SYSFS_ATTRB);
527c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
528c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    // get proper (in absolute/relative) IIO path & build sysfs paths
529c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(sysfs_path, "%s%d", "/sys/bus/iio/devices/iio:device",
530c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    find_type_by_name(compass, "iio:device"));
531c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
532c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#if defined COMPASS_AK8975
533c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    inv_get_input_number(compass, &num);
534c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    tbuf[0] = num + 0x30;
535c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    tbuf[1] = 0;
536c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(sysfs_path, "%s%s", "sys/class/input/input", tbuf);
537c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    strcat(sysfs_path, "/ak8975");
538c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
539c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(compassSysFs.compass_enable, "%s%s", sysfs_path, "/enable");
540c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(compassSysFs.compass_rate, "%s%s", sysfs_path, "/rate");
541c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(compassSysFs.compass_scale, "%s%s", sysfs_path, "/scale");
542c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(compassSysFs.compass_orient, "%s%s", sysfs_path, "/compass_matrix");
543c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#else /* IIO */
544c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(compassSysFs.chip_enable, "%s%s", sysfs_path, "/buffer/enable");
545c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(compassSysFs.in_timestamp_en, "%s%s", sysfs_path, "/scan_elements/in_timestamp_en");
546c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(compassSysFs.buffer_length, "%s%s", sysfs_path, "/buffer/length");
547c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
548c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(compassSysFs.compass_x_fifo_enable, "%s%s", sysfs_path, "/scan_elements/in_magn_x_en");
549c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(compassSysFs.compass_y_fifo_enable, "%s%s", sysfs_path, "/scan_elements/in_magn_y_en");
550c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(compassSysFs.compass_z_fifo_enable, "%s%s", sysfs_path, "/scan_elements/in_magn_z_en");
551c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(compassSysFs.compass_rate, "%s%s", sysfs_path, "/sampling_frequency");
552c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(compassSysFs.compass_scale, "%s%s", sysfs_path, "/in_magn_scale");
553c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(compassSysFs.compass_orient, "%s%s", sysfs_path, "/compass_matrix");
554c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
555c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if(mYasCompass) {
556c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        sprintf(compassSysFs.compass_attr_1, "%s%s", sysfs_path, "/overunderflow");
557c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
558c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
559c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
560c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#if 0
561c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    // test print sysfs paths
562c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    dptr = (char**)&compassSysFs;
563c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    LOGI("sysfs path base: %s", sysfs_path);
564c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    for (i = 0; i < COMPASS_MAX_SYSFS_ATTRB; i++) {
565c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        LOGE("HAL:sysfs path: %s", *dptr++);
566c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
567c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
568c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return 0;
569c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
570c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
571c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint CompassSensor::isYasCompass(void)
572c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
573c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return mYasCompass;
574c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
575