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