1c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/**
2c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  Gesture Test application for Invensense's MPU6/9xxx (w/ DMP).
3c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */
4c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
5c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <unistd.h>
6c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <dirent.h>
7c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <fcntl.h>
8c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <stdio.h>
9c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <errno.h>
10c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <sys/stat.h>
11c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <stdlib.h>
12c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <features.h>
13c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <dirent.h>
14c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <string.h>
15c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <poll.h>
16c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <stddef.h>
17c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <linux/input.h>
18c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <time.h>
19c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <linux/time.h>
20c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <unistd.h>
21c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <termios.h>
22c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
23c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "invensense.h"
24c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "ml_math_func.h"
25c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "storage_manager.h"
26c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "ml_stored_data.h"
27c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "ml_sysfs_helper.h"
28c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "mlos.h"
29c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
30c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro//#define DEBUG_PRINT   /* Uncomment to print Gyro & Accel read from Driver */
31c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
32c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define SUPPORT_SCREEN_ORIENTATION
33c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro//#define SUPPORT_TAP
34c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro//#define SUPPORT_ORIENTATION
35c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define SUPPORT_PEDOMETER
36c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define SUPPORT_SMD
37c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
38c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define MAX_SYSFS_NAME_LEN  (100)
39c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define MAX_SYSFS_ATTRB     (sizeof(struct sysfs_attrbs) / sizeof(char*))
40c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define IIO_SYSFS_PATH      "/sys/bus/iio/devices/iio:device0"
41c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define IIO_HUB_NAME        "inv_hub"
42c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
43c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define POLL_TIME           (2000) // 2sec
44c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
45c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostruct sysfs_attrbs {
46c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char *name;
47c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char *enable;
48c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char *power_state;
49c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char *dmp_on;
50c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char *dmp_int_on;
51c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char *dmp_firmware;
52c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char *firmware_loaded;
53c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_SCREEN_ORIENTATION
54c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char *event_display_orientation;
55c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char *display_orientation_on;
56c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
57c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_ORIENTATION
58c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char *event_orientation;
59c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char *orientation_on;
60c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
61c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_TAP
62c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char *event_tap;
63c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char *tap_min_count;
64c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char *tap_on;
65c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char *tap_threshold;
66c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char *tap_time;
67c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
68c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_PEDOMETER
69c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char *pedometer_on;
70c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char *pedometer_steps;
71c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char *pedometer_time;
72c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
73c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_SMD
74c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char *event_smd;
75c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char *smd_enable;
76c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char *smd_threshold;
77c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char *smd_delay_threshold;
78c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char *smd_delay_threshold2;
79c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
80c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} mpu;
81c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
82c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroenum {
83c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_TAP
84c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FEAT_TAP,
85c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
86c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_SCREEN_ORIENTATION
87c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FEAT_SCREEN_ORIENTATION,
88c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
89c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_ORIENTATION
90c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FEAT_ORIENTATION,
91c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
92c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_PEDOMETER
93c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FEAT_PEDOMETER,
94c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
95c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_SMD
96c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FEAT_SMD,
97c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
98c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
99c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    NUM_DMP_FEATS
100c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro};
101c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
102c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarochar *sysfs_names_ptr;
103c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_PEDOMETER
104c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarounsigned long last_pedometer_poll = 0L;
105c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarounsigned long pedometer_poll_timeout = 500L; // .5 second
106c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
107c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostruct pollfd pfd[NUM_DMP_FEATS];
108c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarobool android_hub = false;   // flag to indicate true=Hub, false=non-hub
109c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
110c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/*******************************************************************************
111c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *                       DMP Feature Supported Functions
112c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ******************************************************************************/
113c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
114c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint read_sysfs_int(char *filename, int *var)
115c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
116c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int res=0;
117c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FILE *fp;
118c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
119c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    fp = fopen(filename, "r");
120c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (fp!=NULL) {
121c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        fscanf(fp, "%d\n", var);
122c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        fclose(fp);
123c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    } else {
124c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("ERR open file to read: %s\n", filename);
125c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        res= -1;
126c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
127c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return res;
128c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
129c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
130c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint write_sysfs_int(char *filename, int data)
131c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
132c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int res=0;
133c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FILE  *fp;
134c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
135c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef DEBUG_PRINT
136c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    printf("writing '%s' with '%d'\n", filename, data);
137c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
138c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
139c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    fp = fopen(filename, "w");
140c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (fp != NULL) {
141c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        fprintf(fp, "%d\n", data);
142c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        fclose(fp);
143c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    } else {
144c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("ERR open file to write: %s\n", filename);
145c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        res = -1;
146c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
147c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return res;
148c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
149c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
150c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/**************************************************
151c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    This _kbhit() function is courtesy of the web
152c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro***************************************************/
153c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint _kbhit(void)
154c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
155c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    static const int STDIN = 0;
156c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    static bool initialized = false;
157c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
158c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (! initialized) {
159c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        // Use termios to turn off line buffering
160c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        struct termios term;
161c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        tcgetattr(STDIN, &term);
162c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        term.c_lflag &= ~ICANON;
163c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        tcsetattr(STDIN, TCSANOW, &term);
164c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        setbuf(stdin, NULL);
165c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        initialized = true;
166c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
167c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
168c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int bytesWaiting;
169c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    ioctl(STDIN, FIONREAD, &bytesWaiting);
170c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return bytesWaiting;
171c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
172c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
173c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint inv_init_sysfs_attributes(void)
174c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
175c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    unsigned char i = 0;
176c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char sysfs_path[MAX_SYSFS_NAME_LEN];
177c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char *sptr;
178c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char **dptr;
179c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
180c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sysfs_names_ptr =
181c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            (char*)malloc(sizeof(char[MAX_SYSFS_ATTRB][MAX_SYSFS_NAME_LEN]));
182c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sptr = sysfs_names_ptr;
183c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (sptr != NULL) {
184c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        dptr = (char**)&mpu;
185c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        do {
186c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            *dptr++ = sptr;
187c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            sptr += sizeof(char[MAX_SYSFS_NAME_LEN]);
188c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        } while (++i < MAX_SYSFS_ATTRB);
189c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    } else {
190c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("couldn't alloc mem for sysfs paths\n");
191c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return -1;
192c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
193c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
194c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    // get proper (in absolute/relative) IIO path & build MPU's sysfs paths
195c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    inv_get_sysfs_path(sysfs_path);
196c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
197c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(mpu.name, "%s%s", sysfs_path, "/name");
198c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(mpu.enable, "%s%s", sysfs_path, "/buffer/enable");
199c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(mpu.power_state, "%s%s", sysfs_path, "/power_state");
200c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(mpu.dmp_on,"%s%s", sysfs_path, "/dmp_on");
201c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(mpu.dmp_int_on, "%s%s", sysfs_path, "/dmp_int_on");
202c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(mpu.dmp_firmware, "%s%s", sysfs_path, "/dmp_firmware");
203c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(mpu.firmware_loaded, "%s%s", sysfs_path, "/firmware_loaded");
204c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
205c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_SCREEN_ORIENTATION
206c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(mpu.event_display_orientation, "%s%s",
207c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            sysfs_path, "/event_display_orientation");
208c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(mpu.display_orientation_on, "%s%s",
209c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            sysfs_path, "/display_orientation_on");
210c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
211c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_ORIENTATION
212c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(mpu.event_orientation, "%s%s", sysfs_path, "/event_orientation");
213c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(mpu.orientation_on, "%s%s", sysfs_path, "/orientation_on");
214c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
215c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_TAP
216c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(mpu.event_tap, "%s%s", sysfs_path, "/event_tap");
217c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(mpu.tap_min_count, "%s%s", sysfs_path, "/tap_min_count");
218c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(mpu.tap_on, "%s%s", sysfs_path, "/tap_on");
219c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(mpu.tap_threshold, "%s%s", sysfs_path, "/tap_threshold");
220c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(mpu.tap_time, "%s%s", sysfs_path, "/tap_time");
221c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
222c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_PEDOMETER
223c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(mpu.pedometer_on, "%s%s", sysfs_path, "/dmp_on");
224c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(mpu.pedometer_steps, "%s%s", sysfs_path, "/pedometer_steps");
225c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(mpu.pedometer_time, "%s%s", sysfs_path, "/pedometer_time");
226c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
227c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_SMD
228c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(mpu.event_smd, "%s%s", sysfs_path, "/event_smd");
229c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(mpu.smd_enable, "%s%s", sysfs_path, "/smd_enable");
230c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(mpu.smd_threshold, "%s%s", sysfs_path, "/smd_threshold");
231c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(mpu.smd_delay_threshold, "%s%s",
232c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            sysfs_path, "/smd_delay_threshold");
233c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(mpu.smd_delay_threshold2, "%s%s",
234c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            sysfs_path, "/smd_delay_threshold2");
235c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
236c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
237c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#if 0
238c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    // test print sysfs paths
239c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    dptr = (char**)&mpu;
240c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    for (i = 0; i < MAX_SYSFS_ATTRB; i++) {
241c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        MPL_LOGE("sysfs path: %s", *dptr++);
242c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
243c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
244c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return 0;
245c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
246c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
247c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint dmp_fw_loaded(void)
248c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
249c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int fw_loaded;
250c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (read_sysfs_int(mpu.firmware_loaded, &fw_loaded) < 0)
251c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        fw_loaded= 0;
252c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return fw_loaded;
253c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
254c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
255c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint is_android_hub(void)
256c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
257c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char dev_name[8];
258c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FILE *fp;
259c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
260c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    fp= fopen(mpu.name, "r");
261c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    fgets(dev_name, 8, fp);
262c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    fclose(fp);
263c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
264c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (!strncmp(dev_name, IIO_HUB_NAME, sizeof(IIO_HUB_NAME))) {
265c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        android_hub = true;
266c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }else {
267c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        android_hub = false;
268c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
269c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
270c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return 0;
271c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
272c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
273c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/*
274c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    Enablers for the gestures
275c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro*/
276c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
277c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint master_enable(int en)
278c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
279c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (write_sysfs_int(mpu.enable, en) < 0) {
280c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("GT:ERR-can't write 'buffer/enable'");
281c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return -1;
282c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
283c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return 0;
284c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
285c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
286c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_TAP
287c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint enable_tap(int en)
288c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
289c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (write_sysfs_int(mpu.tap_on, en) < 0) {
290c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("GT:ERR-can't write 'tap_on'\n");
291c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return -1;
292c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
293c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
294c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return 0;
295c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
296c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
297c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
298c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/* Unnecessary: pedometer_on == dmp_on, which is always on
299c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_PEDOMETER
300c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint enable_pedometer(int en)
301c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
302c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (write_sysfs_int(mpu.pedometer_on, en) < 0) {
303c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("GT:ERR-can't write 'pedometer_on'\n");
304c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return -1;
305c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
306c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
307c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return 0;
308c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
309c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
310c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro*/
311c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
312c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_SCREEN_ORIENTATION
313c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint enable_display_orientation(int en)
314c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
315c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (write_sysfs_int(mpu.display_orientation_on, en) < 0) {
316c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("GT:ERR-can't write 'display_orientation_on'\n");
317c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return -1;
318c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
319c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
320c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return 0;
321c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
322c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
323c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
324c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_ORIENTATION
325c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint enable_orientation(int en)
326c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
327c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (write_sysfs_int(mpu.orientation_on, en) < 0) {
328c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("GT:ERR-can't write 'orientation_on'\n");
329c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return -1;
330c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
331c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
332c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return 0;
333c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
334c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
335c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
336c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_SMD
337c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint enable_smd(int en)
338c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
339c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (write_sysfs_int(mpu.smd_enable, en) < 0) {
340c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("GT:ERR-can't write 'smd_enable'\n");
341c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return -1;
342c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
343c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return 0;
344c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
345c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
346c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
347c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/*
348c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    Handlers for the gestures
349c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro*/
350c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_TAP
351c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint tap_handler(void)
352c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
353c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FILE *fp;
354c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int tap, tap_dir, tap_num;
355c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
356c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    fp = fopen(mpu.event_tap, "rt");
357c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    fscanf(fp, "%d\n", &tap);
358c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    fclose(fp);
359c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
360c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    tap_dir = tap/8;
361c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    tap_num = tap%8 + 1;
362c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
363c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef DEBUG_PRINT
364c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    printf("GT:Tap Handler **\n");
365c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    printf("Tap= %x\n", tap);
366c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    printf("Tap Dir= %x\n", tap_dir);
367c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    printf("Tap Num= %x\n", tap_num);
368c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
369c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
370c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    switch (tap_dir) {
371c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        case 1:
372c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            printf("Tap Axis->X Pos, ");
373c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            break;
374c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        case 2:
375c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            printf("Tap Axis->X Neg, ");
376c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            break;
377c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        case 3:
378c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            printf("Tap Axis->Y Pos, ");
379c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            break;
380c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        case 4:
381c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            printf("Tap Axis->Y Neg, ");
382c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            break;
383c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        case 5:
384c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            printf("Tap Axis->Z Pos, ");
385c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            break;
386c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        case 6:
387c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            printf("Tap Axis->Z Neg, ");
388c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            break;
389c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        default:
390c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            printf("Tap Axis->Unknown, ");
391c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            break;
392c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
393c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    printf("#%d\n", tap_num);
394c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
395c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return 0;
396c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
397c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
398c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
399c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_PEDOMETER
400c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint pedometer_handler(void)
401c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
402c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FILE *fp;
403c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    static int last_pedometer_steps = -1;
404c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    static long last_pedometer_time = -1;
405c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int pedometer_steps;
406c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    long pedometer_time;
407c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
408c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef DEBUG_PRINT
409c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    printf("GT:Pedometer Handler\n");
410c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
411c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
412c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    fp = fopen(mpu.pedometer_steps, "rt");
413c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    fscanf(fp, "%d\n", &pedometer_steps);
414c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    fclose(fp);
415c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
416c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    fp = fopen(mpu.pedometer_time, "rt");
417c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    fscanf(fp, "%ld\n", &pedometer_time);
418c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    fclose(fp);
419c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
420c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (last_pedometer_steps == -1 && last_pedometer_time == -1) {
421c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("Pedometer Steps: %d Time: %ld ",
422c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro               pedometer_steps, pedometer_time);
423c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if (pedometer_steps > 10
424c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                || pedometer_time > (pedometer_poll_timeout * 2))
425c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            printf("(resumed)\n");
426c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        else
427c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            printf("\n");
428c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    } else if (last_pedometer_steps != pedometer_steps
429c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    || last_pedometer_time != pedometer_time) {
430c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    printf("Pedometer Steps: %d Time: %ld\n",
431c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro           pedometer_steps, pedometer_time);
432c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
433c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
434c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    last_pedometer_steps = pedometer_steps;
435c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    last_pedometer_time = pedometer_time;
436c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
437c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return 0;
438c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
439c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
440c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
441c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_SCREEN_ORIENTATION
442c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint display_orientation_handler(void)
443c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
444c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FILE *fp;
445c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int orient;
446c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
447c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef DEBUG_PRINT
448c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    printf("GT:Screen Orient Handler\n");
449c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
450c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
451c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    fp = fopen(mpu.event_display_orientation, "rt");
452c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (!fp) {
453c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("GT:Cannot open '%s'\n", mpu.event_display_orientation);
454c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return -1;
455c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
456c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    fscanf(fp, "%d\n", &orient);
457c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    fclose(fp);
458c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
459c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    printf("Screen Orient-> %d\n", orient);
460c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
461c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return 0;
462c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
463c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
464c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
465c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_ORIENTATION
466c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint host_orientation_handler(void)
467c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
468c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FILE *fp;
469c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int orient;
470c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
471c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    fp = fopen(mpu.event_orientation, "rt");
472c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    fscanf(fp, "%d\n", &orient);
473c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    fclose(fp);
474c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
475c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef DEBUG_PRINT
476c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    printf("GT:Reg Orient Handler\n");
477c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
478c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
479c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (orient & 0x01)
480c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("Orient->X Up\n");
481c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (orient & 0x02)
482c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("Orient->X Down\n");
483c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (orient & 0x04)
484c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("Orient->Y Up\n");
485c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (orient & 0x08)
486c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("Orient->Y Down\n");
487c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (orient & 0x10)
488c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("Orient->Z Up\n");
489c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (orient & 0x20)
490c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("Orient->Z Down\n");
491c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (orient & 0x40)
492c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("Orient->Flip\n");
493c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
494c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return 0;
495c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
496c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
497c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
498c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_SMD
499c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint smd_handler(void)
500c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
501c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FILE *fp;
502c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int smd;
503c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
504c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    fp = fopen(mpu.event_smd, "rt");
505c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    fscanf(fp, "%d\n", &smd);
506c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    fclose(fp);
507c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
508c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef DEBUG_PRINT
509c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    printf("GT:SMD Handler\n");
510c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
511c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    printf("SMD (%d)\n", smd);
512c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
513c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    /* wait for the acceleration low pass filtered tail to die off -
514c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro       this is to prevent that the tail end of a 2nd event of above threhsold
515c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro       motion be considered as also the 1st event for the next SM detection */
516c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    inv_sleep(1000);
517c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
518c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    /* re-enable to continue the detection */
519c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    master_enable(0);
520c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    enable_smd(1);
521c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    master_enable(1);
522c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
523c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return 0;
524c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
525c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
526c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
527c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint enable_dmp_features(int en)
528c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
529c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int res= -1;
530c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
531c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (android_hub || dmp_fw_loaded()) {
532c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        /* Currently there's no info regarding DMP's supported features/capabilities
533c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro           An error in enabling features below could be an indication of the feature
534c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro           not supported in current loaded DMP firmware */
535c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
536c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        master_enable(0);
537c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_TAP
538c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        enable_tap(en);
539c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
540c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_SCREEN_ORIENTATION
541c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        enable_display_orientation(en);
542c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
543c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_ORIENTATION
544c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if (android_hub == false) {
545c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            // Android Hub does not support 'regular' orientation feature
546c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            enable_orientation(en);
547c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        }
548c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
549c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_SMD
550c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        enable_smd(en);
551c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
552c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        master_enable(1);
553c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        res = 0;
554c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
555c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    } else {
556c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("GT:ERR-No DMP firmware\n");
557c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        res= -1;
558c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
559c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
560c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return res;
561c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
562c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
563c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint init_fds(void)
564c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
565c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int i;
566c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
567c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    for (i = 0; i < NUM_DMP_FEATS; i++) {
568c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        switch(i) {
569c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_TAP
570c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        case FEAT_TAP:
571c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            pfd[i].fd = open(mpu.event_tap, O_RDONLY | O_NONBLOCK);
572c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            break;
573c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
574c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_SCREEN_ORIENTATION
575c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        case FEAT_SCREEN_ORIENTATION:
576c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            pfd[i].fd = open(mpu.event_display_orientation,
577c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                             O_RDONLY | O_NONBLOCK);
578c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            break;
579c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
580c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_ORIENTATION
581c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        case FEAT_ORIENTATION:
582c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            pfd[i].fd = open(mpu.event_orientation, O_RDONLY | O_NONBLOCK);
583c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            break;
584c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
585c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_SMD
586c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        case FEAT_SMD:
587c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            pfd[i].fd = open(mpu.event_smd, O_RDONLY | O_NONBLOCK);
588c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            break;
589c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
590c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        default:
591c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            pfd[i].fd = -1;
592c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        }
593c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
594c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        pfd[i].events = POLLPRI|POLLERR,
595c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        pfd[i].revents = 0;
596c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
597c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
598c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return 0;
599c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
600c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
601c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid parse_events(struct pollfd pfd[], int num_fds)
602c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
603c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int i;
604c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
605c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    for (i = 0; i < num_fds; i++) {
606c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if(pfd[i].revents != 0) {
607c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            switch(i) {
608c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_TAP
609c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            case FEAT_TAP:
610c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                tap_handler();
611c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                break;
612c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
613c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_SCREEN_ORIENTATION
614c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            case FEAT_SCREEN_ORIENTATION:
615c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                display_orientation_handler();
616c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                break;
617c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
618c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_ORIENTATION
619c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            case FEAT_ORIENTATION:
620c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                host_orientation_handler();
621c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                break;
622c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
623c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_SMD
624c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            case FEAT_SMD:
625c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                smd_handler();
626c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                break;
627c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
628c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            default:
629c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                printf("GT:ERR-unhandled/unrecognized gesture event");
630c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                break;
631c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            }
632c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            pfd[i].revents = 0;   // no need: reset anyway
633c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        }
634c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
635c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
636c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef SUPPORT_PEDOMETER
637c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    {
638c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        unsigned long now;
639c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        // pedometer is not event based, therefore we poll using a timer every
640c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        //  pedometer_poll_timeout milliseconds
641c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if ((now = inv_get_tick_count()) - last_pedometer_poll
642c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                > pedometer_poll_timeout) {
643c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            pedometer_handler();
644c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            last_pedometer_poll = now;
645c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        }
646c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
647c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
648c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
649c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
650c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint close_fds(void)
651c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
652c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int i;
653c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    for (i = 0; i < NUM_DMP_FEATS; i++) {
654c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if (!pfd[i].fd)
655c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            close(pfd[i].fd);
656c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
657c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return 0;
658c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
659c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
660c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/*******************************************************************************
661c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *                       M a i n
662c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ******************************************************************************/
663c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
664c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint main(int argc, char **argv)
665c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
666c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char data[4];
667c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int i, res= 0;
668c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
669c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    printf("\n"
670c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro           "****************************************************************\n"
671c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro           "*** NOTE:                                                    ***\n"
672c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro           "***       the HAL must be compiled with Low power quaternion ***\n"
673c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro           "***           and/or DMP screen orientation support.         ***\n"
674c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro           "***       'At least' one of the 4 Android virtual sensors    ***\n"
675c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro           "***           must be enabled.                               ***\n"
676c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro           "***                                                          ***\n"
677c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro           "*** Please perform gestures to see the output.               ***\n"
678c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro           "*** Press any key to stop the program.                       ***\n"
679c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro           "****************************************************************\n"
680c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro           "\n");
681c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
682c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    res = inv_init_sysfs_attributes();
683c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (res) {
684c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("GT:ERR-Can't allocate mem\n");
685c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return -1;
686c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
687c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
688c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    /* check if Android Hub */
689c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    is_android_hub();
690c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
691c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    /* init Fds to poll for gesture data */
692c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    init_fds();
693c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
694c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    /* on Gesture/DMP supported features */
695c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (enable_dmp_features(1) < 0) {
696c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("GT:ERR-Can't enable Gestures\n");
697c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return -1;
698c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
699c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
700c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    do {
701c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        for (i = 0; i < NUM_DMP_FEATS; i++)
702c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            read(pfd[i].fd, data, 4);
703c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        poll(pfd, NUM_DMP_FEATS, POLL_TIME);
704c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        parse_events(pfd, NUM_DMP_FEATS);
705c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    } while (!_kbhit());
706c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
707c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    /* off Gesture/DMP supported features */
708c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (enable_dmp_features(0) < 0) {
709c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("GT:ERR-Can't disable Gestures\n");
710c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return -1;
711c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
712c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
713c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    /* release resources */
714c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    close_fds();
715c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (sysfs_names_ptr)
716c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        free(sysfs_names_ptr);
717c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
718c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return res;
719c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
720c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
721