1c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/*
2c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * Copyright (c) Invensense Inc. 2012
3c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *
4c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * This program is free software; you can redistribute it and/or modify it
5c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * under the terms of the GNU General Public License version 2 as published by
6c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * the Free Software Foundation.
7c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */
8c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
9c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <unistd.h>
10c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <dirent.h>
11c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <fcntl.h>
12c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <stdio.h>
13c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <errno.h>
14c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <sys/stat.h>
15c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <dirent.h>
16c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <linux/types.h>
17c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <string.h>
18c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <poll.h>
19c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <termios.h>
20c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
21c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "iio_utils.h"
22c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "ml_load_dmp.h"
23c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "ml_sysfs_helper.h"
24c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "authenticate.h"
25c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "mlos.h"
26c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
27c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define DMP_CODE_SIZE (3060)
28c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define POLL_TIME     (2000) // 2sec
29c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
30c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro// settings
31c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int accel_only = false;
32c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int test_motion = false;
33c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int test_flick = false;
34c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int test_pedometer = false;
35c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int test_orientation = false;
36c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint verbose = false;
37c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
38c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro// paths
39c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarochar *dev_dir_name, *buf_dir_name;
40c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
41c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro// all the DMP features supported
42c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroenum {
43c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FEAT_TAP = 0,
44c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FEAT_ORIENTATION,
45c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FEAT_DISPLAY_ORIENTATION,
46c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FEAT_MOTION,
47c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FEAT_FLICK,
48c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
49c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FEAT_NUM,
50c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} features;
51c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
52c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarotypedef void (*handler_t) (int data);
53c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
54c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostruct dmp_feat_t {
55c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int enabled;
56c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    struct pollfd *pollfd;
57c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char *sysfs_name;
58c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    handler_t phandler;
59c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro};
60c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
61c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic struct dmp_feat_t dmp_feat[FEAT_NUM] = {{0}};
62c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic struct pollfd pollfds[FEAT_NUM];
63c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int pollfds_used = 0;
64c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
65c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/**************************************************
66c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro   This _kbhit() function is courtesy of the web
67c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro***************************************************/
68c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint _kbhit(void)
69c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
70c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    static const int STDIN = 0;
71c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    static bool initialized = false;
72c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
73c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (!initialized) {
74c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        // Use termios to turn off line buffering
75c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        struct termios term;
76c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        tcgetattr(STDIN, &term);
77c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        term.c_lflag &= ~ICANON;
78c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        tcsetattr(STDIN, TCSANOW, &term);
79c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        setbuf(stdin, NULL);
80c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        initialized = true;
81c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
82c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
83c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int bytesWaiting;
84c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    ioctl(STDIN, FIONREAD, &bytesWaiting);
85c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return bytesWaiting;
86c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
87c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
88c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/**
89c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * size_from_channelarray() - calculate the storage size of a scan
90c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @channels: the channel info array
91c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @num_channels: size of the channel info array
92c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *
93c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * Has the side effect of filling the channels[i].location values used
94c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * in processing the buffer output.
95c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */
96c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint size_from_channelarray(struct iio_channel_info *channels, int num_channels)
97c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
98c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int bytes = 0;
99c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int i = 0;
100c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    while (i < num_channels) {
101c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if (bytes % channels[i].bytes == 0)
102c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            channels[i].location = bytes;
103c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        else
104c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            channels[i].location = bytes - bytes%channels[i].bytes
105c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                + channels[i].bytes;
106c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        bytes = channels[i].location + channels[i].bytes;
107c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        i++;
108c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
109c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return bytes;
110c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
111c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
112c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid print2byte(int input, struct iio_channel_info *info)
113c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
114c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    /* shift before conversion to avoid sign extension
115c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro       of left aligned data */
116c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    input = input >> info->shift;
117c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (info->is_signed) {
118c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        int16_t val = input;
119c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        val &= (1 << info->bits_used) - 1;
120c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        val = (int16_t)(val << (16 - info->bits_used)) >>
121c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            (16 - info->bits_used);
122c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        /*printf("%d, %05f, scale=%05f", val,
123c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro               (float)(val + info->offset)*info->scale, info->scale);*/
124c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("%d, ", val);
125c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
126c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    } else {
127c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        uint16_t val = input;
128c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        val &= (1 << info->bits_used) - 1;
129c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("%05f ", ((float)val + info->offset)*info->scale);
130c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
131c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
132c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
133c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/**
134c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * process_scan() - print out the values in SI units
135c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @data:        pointer to the start of the scan
136c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @infoarray:        information about the channels. Note
137c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  size_from_channelarray must have been called first to fill the
138c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  location offsets.
139c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @num_channels:    the number of active channels
140c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */
141c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid process_scan(char *data, struct iio_channel_info *infoarray,
142c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro          int num_channels)
143c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
144c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int k;
145c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    //char *tmp;
146c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    for (k = 0; k < num_channels; k++) {
147c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        switch (infoarray[k].bytes) {
148c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            /* only a few cases implemented so far */
149c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        case 2:
150c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            print2byte(*(uint16_t *)(data + infoarray[k].location),
151c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                   &infoarray[k]);
152c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            //tmp = data + infoarray[k].location;
153c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            break;
154c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        case 4:
155c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            if (infoarray[k].is_signed) {
156c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                int32_t val = *(int32_t *)(data + infoarray[k].location);
157c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                if ((val >> infoarray[k].bits_used) & 1)
158c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    val = (val & infoarray[k].mask) | ~infoarray[k].mask;
159c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                /* special case for timestamp */
160c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                printf(" %d ", val);
161c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            }
162c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            break;
163c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        case 8:
164c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            if (infoarray[k].is_signed) {
165c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                int64_t val = *(int64_t *)(data + infoarray[k].location);
166c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                if ((val >> infoarray[k].bits_used) & 1)
167c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    val = (val & infoarray[k].mask) | ~infoarray[k].mask;
168c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                /* special case for timestamp */
169c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                if (infoarray[k].scale == 1.0f &&
170c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    infoarray[k].offset == 0.0f)
171c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    printf(" %lld", val);
172c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                else
173c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    printf("%05f ", ((float)val + infoarray[k].offset)
174c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                            * infoarray[k].scale);
175c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            }
176c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            break;
177c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        default:
178c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            break;
179c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        }
180c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
181c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    printf("\n");
182c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
183c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
184c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/*
185c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    Enablers for the gestures
186c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro*/
187c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
188c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint enable_flick(char *p, int on)
189c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
190c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int ret;
191c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    printf("flick:%s\n", p);
192c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    ret = write_sysfs_int_and_verify("flick_int_on", p, on);
193c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (ret < 0)
194c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return ret;
195c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    ret = write_sysfs_int_and_verify("flick_upper", p, 3147790);
196c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (ret < 0)
197c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return ret;
198c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    ret = write_sysfs_int_and_verify("flick_lower", p, -3147790);
199c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (ret < 0)
200c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return ret;
201c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    ret = write_sysfs_int_and_verify("flick_counter", p, 50);
202c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (ret < 0)
203c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return ret;
204c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    ret = write_sysfs_int_and_verify("flick_message_on", p, 0);
205c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (ret < 0)
206c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return ret;
207c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    ret = write_sysfs_int_and_verify("flick_axis", p, 0);
208c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (ret < 0)
209c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return ret;
210c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
211c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return 0;
212c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
213c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
214c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid verify_img(char *dmp_path)
215c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
216c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FILE *fp;
217c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int i;
218c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char dmp_img[DMP_CODE_SIZE];
219c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
220c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if ((fp = fopen(dmp_path, "rb")) < 0) {
221c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        perror("dmp fail");
222c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
223c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    i = fread(dmp_img, 1, DMP_CODE_SIZE, fp);
224c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    printf("Result=%d\n", i);
225c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    fclose(fp);
226c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    fp = fopen("/dev/read_img.h", "wt");
227c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    fprintf(fp, "char rec[]={\n");
228c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    for(i = 0; i < DMP_CODE_SIZE; i++) {
229c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        fprintf(fp, "0x%02x, ", dmp_img[i]);
230c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if(((i + 1) % 16) == 0) {
231c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            fprintf(fp, "\n");
232c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        }
233c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
234c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    fprintf(fp, "};\n ");
235c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    fclose(fp);
236c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
237c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
238c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint setup_dmp(char *dev_path, int p_event)
239c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
240c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char dmp_path[100];
241c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int ret;
242c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FILE *fd;
243c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
244c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    printf("INFO: sysfs path=%s\n", dev_path);
245c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
246c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    ret = write_sysfs_int_and_verify("power_state", dev_path, 1);
247c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (ret < 0)
248c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return ret;
249c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
250c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    ret = write_sysfs_int("in_accel_scale", dev_path, 0);
251c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (ret < 0)
252c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return ret;
253c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    ret = write_sysfs_int("in_anglvel_scale", dev_path, 3);
254c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (ret < 0)
255c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return ret;
256c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    ret = write_sysfs_int("sampling_frequency", dev_path, 200);
257c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (ret < 0)
258c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return ret;
259c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    ret = write_sysfs_int_and_verify("firmware_loaded", dev_path, 0);
260c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (ret < 0)
261c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return ret;
262c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
263c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sprintf(dmp_path, "%s/dmp_firmware", dev_path);
264c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if ((fd = fopen(dmp_path, "wb")) < 0 ) {
265c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        perror("dmp fail");
266c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
267c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    inv_load_dmp(fd);
268c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    fclose(fd);
269c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
270c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    printf("INFO: firmware_loaded=%d\n",
271c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro           read_sysfs_posint("firmware_loaded", dev_path));
272c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
273c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    // set accel offsets
274c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    //ret = write_sysfs_int_and_verify("in_accel_x_offset",
275c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    //                                 dev_path, 0xabcd0000);
276c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    //if (ret < 0)
277c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    //    return ret;
278c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    //ret = write_sysfs_int_and_verify("in_accel_y_offset",
279c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    //                                 dev_path, 0xffff0000);
280c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    //if (ret < 0)
281c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    //    return ret;
282c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    //ret = write_sysfs_int_and_verify("in_accel_z_offset",
283c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    //                                 dev_path, 0xcdef0000);
284c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    //if (ret < 0)
285c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    //    return ret;
286c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
287c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    ret = write_sysfs_int_and_verify("dmp_on", dev_path, 1);
288c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (ret < 0)
289c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return ret;
290c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    ret = write_sysfs_int_and_verify("dmp_int_on", dev_path, 1);
291c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (ret < 0)
292c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return ret;
293c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
294c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    /* select which event to enable and interrupt on/off here */
295c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (test_flick) {
296c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        ret = enable_flick(dev_path, 1);
297c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if (ret < 0)
298c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            return ret;
299c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
300c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
301c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    /*
302c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    ret = write_sysfs_int_and_verify("tap_on", dev_path, 1);
303c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (ret < 0)
304c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return ret;
305c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    */
306c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
307c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    /*ret = write_sysfs_int_and_verify("display_orientation_on",
308c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                                     dev_path, 1);
309c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (ret < 0)
310c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return ret;*/
311c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (test_orientation) {
312c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        ret = write_sysfs_int_and_verify("orientation_on", dev_path, 1);
313c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if (ret < 0)
314c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            return ret;
315c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
316c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro   /* ret = write_sysfs_int_and_verify("dmp_output_rate", dev_path, 25);
317c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (ret < 0)
318c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return ret;*/
319c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    ret = write_sysfs_int_and_verify("dmp_event_int_on", dev_path, p_event);
320c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (ret < 0)
321c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return ret;
322c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
323c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    //verify_img(dmp_path);
324c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return 0;
325c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
326c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
327c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/*
328c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    Handlers for the gestures
329c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro*/
330c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
331c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid handle_flick(int flick)
332c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
333c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    printf("flick=%x\n", flick);
334c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
335c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
336c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid handle_display_orientation(int orient)
337c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
338c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    printf("display_orientation=%x\n", orient);
339c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
340c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
341c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid handle_motion(int motion)
342c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
343c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    printf("motion=%x\n", motion);
344c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
345c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
346c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid handle_orientation(int orient)
347c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
348c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    printf("orientation=");
349c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (orient & 0x01)
350c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("+X, ");
351c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (orient & 0x02)
352c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("-X, ");
353c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (orient & 0x04)
354c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("+Y, ");
355c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (orient & 0x08)
356c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("-Y, ");
357c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (orient & 0x10)
358c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("+Z, ");
359c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (orient & 0x20)
360c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("-Z, ");
361c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (orient & 0x40)
362c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("flip");
363c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    printf("\n");
364c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
365c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
366c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid handle_tap(int tap)
367c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
368c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int tap_dir = tap / 8;
369c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int tap_num = tap % 8 + 1;
370c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
371c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    printf("tap=");
372c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    switch (tap_dir) {
373c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        case 1:
374c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            printf("+X, ");
375c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            break;
376c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        case 2:
377c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            printf("-X, ");
378c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            break;
379c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        case 3:
380c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            printf("+Y, ");
381c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            break;
382c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        case 4:
383c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            printf("-Y, ");
384c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            break;
385c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        case 5:
386c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            printf("+Z, ");
387c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            break;
388c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        case 6:
389c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            printf("-Z, ");
390c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            break;
391c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        default:
392c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            break;
393c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
394c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    printf("#%d\n", tap_num);
395c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
396c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
397c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint handle_pedometer(int *got_event)
398c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
399c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    static int last_pedometer_steps = -1;
400c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    static long last_pedometer_time = -1;
401c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    static unsigned long last_pedometer_poll = 0L;
402c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    static unsigned long pedometer_poll_timeout = 500L; // .5 second
403c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
404c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    unsigned long now;
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    if ((now = inv_get_tick_count()) - last_pedometer_poll
413c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            < pedometer_poll_timeout) {
414c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return 0;
415c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
416c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    last_pedometer_poll = now;
417c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
418c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    pedometer_steps = read_sysfs_posint("pedometer_steps", dev_dir_name);
419c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    pedometer_time = read_sysfs_posint("pedometer_time", dev_dir_name);
420c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
421c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (last_pedometer_steps == -1 && last_pedometer_time == -1) {
422c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if (!*got_event)
423c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            printf("\n");
424c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("p> pedometer=%d, %ld ",
425c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro               pedometer_steps, pedometer_time);
426c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if (pedometer_steps > 10
427c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                || pedometer_time > (pedometer_poll_timeout * 2))
428c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            printf("(resumed)\n");
429c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        else
430c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            printf("\n");
431c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        *got_event = true;
432c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    } else if (last_pedometer_steps != pedometer_steps
433c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    || last_pedometer_time != pedometer_time) {
434c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if (!*got_event)
435c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            printf("\n");
436c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("p> pedometer=%d, %ld\n",
437c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro               pedometer_steps, pedometer_time);
438c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        *got_event = true;
439c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
440c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
441c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    last_pedometer_steps = pedometer_steps;
442c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    last_pedometer_time = pedometer_time;
443c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
444c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return 0;
445c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
446c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
447c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/*
448c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    Main processing functions
449c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro*/
450c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
451c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid dump_dmp_event_struct(void)
452c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
453c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define VARVAL(f, v) printf("\t%s : " f "\n", #v, v);
454c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int i;
455c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
456c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    printf("dmp_feat structure content:\n");
457c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    for (i = 0; i < FEAT_NUM; i++) {
458c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("%d - ", i);
459c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        VARVAL("%d", dmp_feat[i].enabled);
460c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        VARVAL("%s", dmp_feat[i].sysfs_name);
461c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        VARVAL("%p", dmp_feat[i].phandler);
462c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        VARVAL("%p", dmp_feat[i].pollfd);
463c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if (dmp_feat[i].pollfd) {
464c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            VARVAL("%d", dmp_feat[i].pollfd->events);
465c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            VARVAL("%d", dmp_feat[i].pollfd->revents);
466c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            VARVAL("%d", dmp_feat[i].pollfd->fd);
467c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        }
468c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
469c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    printf("dmp_feat structure content:\n");
470c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    for (i = 0; i < FEAT_NUM; i++) {
471c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("%d - ", i);
472c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        VARVAL("%d", pollfds[i].fd);
473c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        VARVAL("%d", pollfds[i].events);
474c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        VARVAL("%d", pollfds[i].revents);
475c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
476c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    printf("end.\n");
477c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
478c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
479c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid init_dmp_event_fds(void)
480c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
481c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int i, j = 0;
482c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char file_name[100];
483c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
484c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    for (i = 0; i < FEAT_NUM; i++) {
485c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if (!dmp_feat[i].enabled)
486c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            continue;
487c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        sprintf(file_name, "%s/%s", dev_dir_name, dmp_feat[i].sysfs_name);
488c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        pollfds[j].fd = open(file_name, O_RDONLY | O_NONBLOCK);
489c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if (pollfds[j].fd < 0) {
490c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            printf("Err: cannot open requested event file '%s'\n", file_name);
491c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        } else {
492c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            printf("INFO: opened event node '%s'\n", file_name);
493c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        }
494c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        pollfds[j].events = POLLPRI | POLLERR;
495c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        pollfds[j].revents = 0;
496c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
497c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        dmp_feat[i].pollfd = &pollfds[j];
498c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        j++;
499c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
500c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
501c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
502c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid close_dmp_event_fds(void)
503c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
504c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int i;
505c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    for (i = 0; i < pollfds_used; i++)
506c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        close(pollfds[i].fd);
507c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
508c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
509c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid poll_dmp_event_fds(void)
510c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
511c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int i;
512c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char d[4];
513c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    static int got_event = 1;
514c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
515c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    // read the pollable fds
516c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    for (i = 0; i < pollfds_used; i++)
517c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        read(pollfds[i].fd, d, 4);
518c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
519c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    // poll
520c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (got_event)
521c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("e> ");
522c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    got_event = false;
523c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    poll(pollfds, pollfds_used, POLL_TIME);
524c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
525c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    for (i = 0; i < FEAT_NUM; i++) {
526c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if (!dmp_feat[i].enabled)
527c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            continue;
528c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
529c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if (dmp_feat[i].pollfd->revents != 0) {
530c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            char file_name[200];
531c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            int data;
532c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
533c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            sprintf(file_name, "%s/%s",
534c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    dev_dir_name, dmp_feat[i].sysfs_name);
535c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            FILE *fp = fopen(file_name, "rt");
536c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            if (!fp) {
537c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                printf("Err:cannot open requested event file '%s'\n",
538c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                       dmp_feat[i].sysfs_name);
539c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                continue;
540c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            }
541c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            fscanf(fp, "%d\n", &data);
542c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            fclose(fp);
543c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            dmp_feat[i].pollfd->revents = 0;
544c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
545c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            dmp_feat[i].phandler(data);
546c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            got_event = true;
547c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        }
548c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
549c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
550c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (test_pedometer) {
551c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        /* pedometer is not event based, therefore we poll using a timer every
552c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro           pedometer_poll_timeout milliseconds */
553c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        handle_pedometer(&got_event);
554c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
555c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
556c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
557c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/*
558c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    Main
559c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro*/
560c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
561c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint main(int argc, char **argv)
562c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
563c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    unsigned long num_loops = 2;
564c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    unsigned long timedelay = 100000;
565c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    unsigned long buf_len = 128;
566c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
567c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int ret, c, i, j, toread;
568c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int fp;
569c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
570c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int num_channels;
571c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char *trigger_name = NULL;
572c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
573c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int datardytrigger = 1;
574c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char *data;
575c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int read_size;
576c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int dev_num, trig_num;
577c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char *buffer_access;
578c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int scan_size;
579c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int noevents = 0;
580c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int p_event = 0, nodmp = 0;
581c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char *dummy;
582c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char chip_name[10];
583c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char device_name[10];
584c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char sysfs[100];
585c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
586c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    struct iio_channel_info *infoarray;
587c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
588c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    // all output to stdout must be delivered immediately, no buffering
589c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    setvbuf(stdout, NULL, _IONBF, 0);
590c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
591c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    // get info about the device and driver
592c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    inv_get_sysfs_path(sysfs);
593c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (inv_get_chip_name(chip_name) != INV_SUCCESS) {
594c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("get chip name fail\n");
595c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        exit(0);
596c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
597c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    printf("INFO: chip_name=%s\n", chip_name);
598c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
599c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    for (i = 0; i < strlen(chip_name); i++)
600c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        device_name[i] = tolower(chip_name[i]);
601c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    device_name[strlen(chip_name)] = '\0';
602c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    printf("INFO: device name=%s\n", device_name);
603c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
604c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    /* parse the command line parameters
605c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro      -r means no DMP is enabled (raw) -> should be used for mpu3050.
606c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro       -p means no print of data
607c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro       when using -p, 1 means orientation, 2 means tap, 3 means flick */
608c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    while ((c = getopt(argc, argv, "l:w:c:premavt:")) != -1) {
609c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        switch (c) {
610c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        case 't':
611c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            trigger_name = optarg;
612c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            datardytrigger = 0;
613c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            break;
614c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        case 'e':
615c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            noevents = 1;
616c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            break;
617c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        case 'p':
618c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            p_event = 1;
619c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            break;
620c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        case 'r':
621c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            nodmp = 1;
622c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            break;
623c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        case 'c':
624c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            num_loops = strtoul(optarg, &dummy, 10);
625c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            break;
626c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        case 'w':
627c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            timedelay = strtoul(optarg, &dummy, 10);
628c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            break;
629c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        case 'l':
630c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            buf_len = strtoul(optarg, &dummy, 10);
631c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            break;
632c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        case 'm':
633c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            test_motion = true;
634c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            break;
635c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        case 'a':
636c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            accel_only = true;
637c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            break;
638c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        case 'v':
639c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            verbose = true;
640c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            break;
641c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        case '?':
642c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            return -1;
643c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        }
644c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
645c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
646c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    pollfds_used = 0;
647c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
648c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    // comment out/remove/if(0) the block corresponding to the feature
649c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    //  that you want to disable
650c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
651c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (0) {
652c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        struct dmp_feat_t f = {
653c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            true,
654c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            NULL,
655c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            "event_tap",
656c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            handle_tap
657c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        };
658c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        dmp_feat[pollfds_used] = f;
659c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        pollfds_used++;
660c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
661c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (test_orientation) {
662c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        struct dmp_feat_t f = {
663c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            true,
664c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            NULL,
665c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            "event_orientation",
666c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            handle_orientation
667c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        };
668c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        dmp_feat[pollfds_used] = f;
669c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        pollfds_used++;
670c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
671c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    /*if (1) {
672c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        struct dmp_feat_t f = {
673c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            true,
674c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            NULL,
675c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            "event_display_orientation",
676c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            handle_display_orientation
677c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        };
678c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        dmp_feat[pollfds_used] = f;
679c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        pollfds_used++;
680c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }*/
681c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (test_motion) {
682c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        struct dmp_feat_t f = {
683c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            true,
684c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            NULL,
685c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            "event_accel_motion",
686c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            handle_motion
687c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        };
688c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        dmp_feat[pollfds_used] = f;
689c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        pollfds_used++;
690c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
691c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (test_flick) {
692c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        struct dmp_feat_t f = {
693c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            true,
694c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            NULL,
695c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            "event_flick",
696c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            handle_flick
697c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        };
698c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        dmp_feat[pollfds_used] = f;
699c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        pollfds_used++;
700c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
701c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
702c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    // debug
703c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    printf("INFO\n");
704c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    printf("INFO: Configured features:\n");
705c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    for (i = 0; i < pollfds_used; i++)
706c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("INFO:   %d -> %s\n", i, dmp_feat[i].sysfs_name);
707c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    printf("INFO\n");
708c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
709c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    /* Find the device requested */
710c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    dev_num = find_type_by_name(device_name, "iio:device");
711c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (dev_num < 0) {
712c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("Failed to find the %s\n", device_name);
713c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        ret = -ENODEV;
714c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        goto error_ret;
715c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
716c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    printf("INFO: iio device number=%d\n", dev_num);
717c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    asprintf(&dev_dir_name, "%siio:device%d", iio_dir, dev_num);
718c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (trigger_name == NULL) {
719c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        /*
720c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro         * Build the trigger name. If it is device associated it's
721c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro         * name is <device_name>_dev[n] where n matches the device
722c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro         * number found above
723c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro         */
724c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        ret = asprintf(&trigger_name, "%s-dev%d", device_name, dev_num);
725c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if (ret < 0) {
726c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            ret = -ENOMEM;
727c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            goto error_ret;
728c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        }
729c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
730c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
731c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro   ret = write_sysfs_int_and_verify("master_enable", dev_dir_name, 0);
732c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (ret < 0)
733c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return ret;
734c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    ret = write_sysfs_int_and_verify("buffer/enable", dev_dir_name, 0);
735c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (ret < 0)
736c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return ret;
737c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    ret = write_sysfs_int_and_verify("power_state", dev_dir_name, 1);
738c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
739c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    //
740c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    //  motion interrupt in low power accel mode
741c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    //
742c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (test_motion) {
743c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        ret = write_sysfs_int_and_verify("motion_lpa_on", dev_dir_name, 1);
744c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if (ret < 0)
745c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            return ret;
746c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        // magnitude threshold - range [0, 1020] in 32 mg increments
747c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        ret = write_sysfs_int_and_verify("motion_lpa_threshold", dev_dir_name,
748c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                                         3 * 32);
749c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if (ret < 0)
750c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            return ret;
751c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        // duration in ms up to 2^16
752c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro      //  ret = write_sysfs_int_and_verify("motion_lpa_dur", dev_dir_name,
753c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        //                                 200 * 1);
754c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        //if (ret < 0)
755c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro          //  return ret;
756c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        // motion_lpa_freq: 0 for 1.25, 1 for 5, 2 for 20, 3 for 40 Hz update rate
757c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        //  of the low power accel mode.
758c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        //  The higher the rate, the better responsiveness of the motion interrupt.
759c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        ret = write_sysfs_int("motion_lpa_freq", dev_dir_name, 2);
760c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if (ret < 0)
761c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            return ret;
762c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    } else {
763c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        ret = write_sysfs_int_and_verify("motion_lpa_on", dev_dir_name, 0);
764c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if (ret < 0)
765c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            return ret;
766c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
767c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
768c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    /* Verify the trigger exists */
769c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    trig_num = find_type_by_name(trigger_name, "trigger");
770c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (trig_num < 0) {
771c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("Failed to find the trigger %s\n", trigger_name);
772c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        ret = -ENODEV;
773c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        goto error_free_triggername;
774c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
775c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    printf("INFO: iio trigger number=%d\n", trig_num);
776c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
777c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (!nodmp)
778c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        setup_dmp(dev_dir_name, p_event);
779c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
780c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    /*
781c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro     * Construct the directory name for the associated buffer.
782c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro     * As we know that the lis3l02dq has only one buffer this may
783c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro     * be built rather than found.
784c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro     */
785c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    ret = asprintf(&buf_dir_name, "%siio:device%d/buffer", iio_dir, dev_num);
786c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (ret < 0) {
787c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        ret = -ENOMEM;
788c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        goto error_free_triggername;
789c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
790c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
791c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    /* Set the device trigger to be the data rdy trigger found above */
792c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    ret = write_sysfs_string_and_verify("trigger/current_trigger",
793c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    dev_dir_name,
794c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    trigger_name);
795c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (ret < 0) {
796c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("Failed to write current_trigger file\n");
797c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        goto error_free_buf_dir_name;
798c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
799c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
800c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    /* Setup ring buffer parameters
801c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro       length must be even number because iio_store_to_sw_ring is expecting
802c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro       half pointer to be equal to the read pointer, which is impossible
803c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro       when buflen is odd number. This is actually a bug in the code */
804c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    ret = write_sysfs_int("length", buf_dir_name, buf_len * 2);
805c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (ret < 0)
806c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        goto exit_here;
807c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
808c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    // gyro
809c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (accel_only) {
810c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        ret = enable_anglvel_se(dev_dir_name, &infoarray, &num_channels, 0);
811c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if (ret < 0)
812c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            return ret;
813c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        ret = write_sysfs_int_and_verify("gyro_enable", dev_dir_name, 0);
814c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if (ret < 0)
815c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            return ret;
816c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    } else {
817c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        ret = enable_anglvel_se(dev_dir_name, &infoarray, &num_channels, 1);
818c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if (ret < 0)
819c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            return ret;
820c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        ret = write_sysfs_int_and_verify("gyro_enable", dev_dir_name, 1);
821c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if (ret < 0)
822c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            return ret;
823c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
824c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
825c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    // accel
826c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    ret = enable_accel_se(dev_dir_name, &infoarray, &num_channels, 1);
827c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (ret < 0)
828c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return ret;
829c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    ret = write_sysfs_int_and_verify("accel_enable", dev_dir_name, 1);
830c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (ret < 0)
831c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return ret;
832c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
833c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    // quaternion
834c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (!nodmp) {
835c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        ret = enable_quaternion_se(dev_dir_name, &infoarray, &num_channels, 1);
836c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if (ret < 0)
837c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            return ret;
838c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        ret = write_sysfs_int_and_verify("three_axes_q_on", dev_dir_name, 1);
839c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if (ret < 0)
840c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            return ret;
841c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    } else {
842c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        ret = enable_quaternion_se(dev_dir_name, &infoarray, &num_channels, 0);
843c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if (ret < 0)
844c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            return ret;
845c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        ret = write_sysfs_int_and_verify("dmp_on", dev_dir_name, 0);
846c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if (ret < 0)
847c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            return ret;
848c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
849c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
850c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    //sprintf(dmp_path, "%s/dmp_firmware", dev_dir_name);
851c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    //verify_img(dmp_path);
852c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
853c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    ret = build_channel_array(dev_dir_name, &infoarray, &num_channels);
854c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (ret) {
855c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        printf("Problem reading scan element information\n");
856c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        goto exit_here;
857c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
858c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
859c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    /* enable the buffer */
860c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    ret = write_sysfs_int_and_verify("enable", buf_dir_name, 1);
861c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (ret < 0)
862c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        goto exit_here;
863c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    scan_size = size_from_channelarray(infoarray, num_channels);
864c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    data = malloc(scan_size * buf_len);
865c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (!data) {
866c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        ret = -ENOMEM;
867c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        goto exit_here;
868c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
869c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/*ADDED*/
870c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro   ret = write_sysfs_int_and_verify("master_enable", dev_dir_name, 1);
871c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (ret < 0)
872c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return ret;
873c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (p_event) {
874c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
875c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        /* polling events from the DMP */
876c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        init_dmp_event_fds();
877c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        while(!_kbhit())
878c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            poll_dmp_event_fds();
879c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        close_dmp_event_fds();
880c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
881c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    } else {
882c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
883c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        /* attempt to open non blocking the access dev */
884c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        ret = asprintf(&buffer_access, "/dev/iio:device%d", dev_num);
885c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if (ret < 0) {
886c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            ret = -ENOMEM;
887c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            goto error_free_data;
888c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        }
889c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        fp = open(buffer_access, O_RDONLY | O_NONBLOCK);
890c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if (fp == -1) { /*If it isn't there make the node */
891c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            printf("Failed to open %s\n", buffer_access);
892c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            ret = -errno;
893c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            goto error_free_buffer_access;
894c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        }
895c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        /* wait for events num_loops times */
896c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        for (j = 0; j < num_loops; j++) {
897c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            if (!noevents) {
898c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                struct pollfd pfd = {
899c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    .fd = fp,
900c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    .events = POLLIN,
901c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                };
902c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                poll(&pfd, 1, -1);
903c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                toread = 1;
904c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                if (j % 128 == 0)
905c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    usleep(timedelay);
906c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
907c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            } else {
908c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                usleep(timedelay);
909c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                toread = 1;
910c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            }
911c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            read_size = read(fp, data, toread * scan_size);
912c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            if (read_size == -EAGAIN) {
913c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                printf("nothing available\n");
914c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                continue;
915c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            }
916c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            if (!p_event) {
917c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                for (i = 0; i < read_size / scan_size; i++)
918c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    process_scan(data + scan_size * i, infoarray, num_channels);
919c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            }
920c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        }
921c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        close(fp);
922c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
923c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
924c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_free_buffer_access:
925c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    free(buffer_access);
926c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_free_data:
927c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    free(data);
928c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroexit_here:
929c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    /* stop the ring buffer */
930c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    ret = write_sysfs_int_and_verify("enable", buf_dir_name, 0);
931c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    /* disable the dmp */
932c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (p_event)
933c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        ret = write_sysfs_int_and_verify("dmp_on", dev_dir_name, 0);
934c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
935c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_free_buf_dir_name:
936c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    free(buf_dir_name);
937c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_free_triggername:
938c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (datardytrigger)
939c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        free(trigger_name);
940c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_ret:
941c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return ret;
942c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
943