1895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/*
2895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall $License:
3895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall   Copyright 2011 InvenSense, Inc.
4895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
5895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall Licensed under the Apache License, Version 2.0 (the "License");
6895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall you may not use this file except in compliance with the License.
7895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall You may obtain a copy of the License at
8895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
9895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall http://www.apache.org/licenses/LICENSE-2.0
10895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
11895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall Unless required by applicable law or agreed to in writing, software
12895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall distributed under the License is distributed on an "AS IS" BASIS,
13895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall See the License for the specific language governing permissions and
15895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall limitations under the License.
16895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall  $
17895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
18895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/*******************************************************************************
19895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
20895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * $RCSfile: mlcontrol.h,v $
21895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
22895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * $Date: 2011-06-10 20:13:08 -0700 (Fri, 10 Jun 2011) $
23895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
24895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * $Revision: 5629 $
25895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
26895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *******************************************************************************/
27895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
28895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/*******************************************************************************/
29895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/** @defgroup INV_CONTROL
30895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
31895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    The Control processes gyroscopes and accelerometers to provide control
32895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    signals that can be used in user interfaces to manipulate objects such as
33895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    documents, images, cursors, menus, etc.
34895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
35895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    @{
36895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        @file mlcontrol.h
37895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        @brief Header file for the Control Library.
38895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall*/
39895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/******************************************************************************/
40895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#ifndef MLCONTROL_H
41895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define MLCONTROL_H
42895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
43895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#ifdef __cplusplus
44895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallextern "C" {
45895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#endif
46895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
47895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "mltypes.h"
48895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "ml.h"
49895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#ifdef INV_INCLUDE_LEGACY_HEADERS
50895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "mlcontrol_legacy.h"
51895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#endif
52895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
53895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /* ------------ */
54895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /* - Defines. - */
55895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /* ------------ */
56895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
57895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /*******************************************************************************/
58895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /* Control Signals.                                                            */
59895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /*******************************************************************************/
60895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
61895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define INV_CONTROL_1                    0x0001
62895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define INV_CONTROL_2                    0x0002
63895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define INV_CONTROL_3                    0x0004
64895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define INV_CONTROL_4                    0x0008
65895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
66895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /*******************************************************************************/
67895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /* Control Functions.                                                          */
68895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /*******************************************************************************/
69895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
70895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define INV_GRID                         0x0001 // Indicates that the user will be controlling a system that
71895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    //   has discrete steps, such as icons, menu entries, pixels, etc.
72895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define INV_SMOOTH                       0x0002 // Indicates that noise from unintentional motion should be filtered out.
73895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define INV_DEAD_ZONE                    0x0004 // Indicates that a dead zone should be used, below which sensor data is set to zero.
74895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define INV_HYSTERESIS                   0x0008 // Indicates that, when INV_GRID is selected, hysteresis should be used to prevent
75895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    //   the control signal from switching rapidly across elements of the grid.</dd>
76895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
77895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /*******************************************************************************/
78895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /* Integral reset options.                                                     */
79895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /*******************************************************************************/
80895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
81895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define INV_NO_RESET                     0x0000
82895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define INV_RESET                        0x0001
83895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
84895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /*******************************************************************************/
85895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /* Data select options.                                                        */
86895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /*******************************************************************************/
87895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
88895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define INV_CTRL_SIGNAL                  0x0000
89895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define INV_CTRL_GRID_NUM                0x0001
90895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
91895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /*******************************************************************************/
92895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /* Control Axis.                                                               */
93895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /*******************************************************************************/
94895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define INV_CTRL_PITCH                   0x0000 // (INV_PITCH >> 1)
95895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define INV_CTRL_ROLL                    0x0001 // (INV_ROLL  >> 1)
96895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define INV_CTRL_YAW                     0x0002 // (INV_YAW   >> 1)
97895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
98895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /*******************************************************************************/
99895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /* control_params structure default values.                                   */
100895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /*******************************************************************************/
101895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
102895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define MLCTRL_SENSITIVITY_0_DEFAULT           128
103895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define MLCTRL_SENSITIVITY_1_DEFAULT           128
104895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define MLCTRL_SENSITIVITY_2_DEFAULT           128
105895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define MLCTRL_SENSITIVITY_3_DEFAULT           128
106895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define MLCTRL_FUNCTIONS_DEFAULT                 0
107895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define MLCTRL_CONTROL_SIGNALS_DEFAULT           0
108895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define MLCTRL_PARAMETER_ARRAY_0_DEFAULT         0
109895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define MLCTRL_PARAMETER_ARRAY_1_DEFAULT         0
110895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define MLCTRL_PARAMETER_ARRAY_2_DEFAULT         0
111895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define MLCTRL_PARAMETER_ARRAY_3_DEFAULT         0
112895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define MLCTRL_PARAMETER_AXIS_0_DEFAULT          0
113895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define MLCTRL_PARAMETER_AXIS_1_DEFAULT          0
114895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define MLCTRL_PARAMETER_AXIS_2_DEFAULT          0
115895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define MLCTRL_PARAMETER_AXIS_3_DEFAULT          0
116895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define MLCTRL_GRID_THRESHOLD_0_DEFAULT          1
117895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define MLCTRL_GRID_THRESHOLD_1_DEFAULT          1
118895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define MLCTRL_GRID_THRESHOLD_2_DEFAULT          1
119895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define MLCTRL_GRID_THRESHOLD_3_DEFAULT          1
120895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define MLCTRL_GRID_MAXIMUM_0_DEFAULT            0
121895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define MLCTRL_GRID_MAXIMUM_1_DEFAULT            0
122895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define MLCTRL_GRID_MAXIMUM_2_DEFAULT            0
123895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define MLCTRL_GRID_MAXIMUM_3_DEFAULT            0
124895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define MLCTRL_GRID_CALLBACK_DEFAULT             0
125895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
126895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /* --------------- */
127895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /* - Structures. - */
128895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /* --------------- */
129895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
130895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /**************************************************************************/
131895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /* Control Parameters Structure.                                          */
132895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /**************************************************************************/
133895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
134895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    struct control_params {
135895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        // Sensitivity of control signal 1, 2, 3, and 4.
136895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        unsigned short sensitivity[4];
137895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        // Indicates what functions will be used. Can be a bitwise OR of INV_GRID,
138895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        // ML_SMOOT, INV_DEAD_ZONE, and INV_HYSTERISIS.
139895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        unsigned short functions;
140895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        // Indicates which parameter array is being assigned to a control signal.
141895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        // Must be one of INV_GYROS, INV_ANGULAR_VELOCITY, or
142895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        // INV_ANGULAR_VELOCITY_WORLD.
143895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        unsigned short parameterArray[4];
144895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        // Indicates which axis of the parameter array will be used. Must be
145895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        // INV_ROLL, INV_PITCH, or INV_YAW.
146895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        unsigned short parameterAxis[4];
147895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        // Threshold of the control signal at which the grid number will be
148895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        // incremented or decremented.
149895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        long gridThreshold[4];
150895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        // Maximum grid number for the control signal.
151895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        long gridMaximum[4];
152895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        // User defined callback that will trigger when the grid location changes.
153895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        void (*gridCallback) (
154895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                                 // Indicates which control signal crossed a grid threshold. Must be
155895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                                 // one of INV_CONTROL_1, INV_CONTROL_2, INV_CONTROL_3 or INV_CONTROL_4.
156895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                                 unsigned short controlSignal,
157895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                                 // An array of four numbers representing the grid number for each
158895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                                 // control signal.
159895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                                 long *gridNum,
160895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                                 // An array of four numbers representing the change in grid number
161895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                                 // for each control signal.
162895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                                 long *gridChange);
163895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    };
164895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
165895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    struct control_obj {
166895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
167895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        long gridNum[4];        // Current grid number for each control signal.
168895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        long controlInt[4];     // Current data for each control signal.
169895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        long lastGridNum[4];    // Previous grid number
170895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        unsigned char controlDir[4];    // Direction of control signal
171895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        long gridChange[4];     // Change in grid number
172895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
173895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        long mlGridNumDMP[4];
174895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        long gridNumOffset[4];
175895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        long prevDMPGridNum[4];
176895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
177895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    };
178895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
179895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /* --------------------- */
180895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /* - Function p-types. - */
181895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /* --------------------- */
182895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
183895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /**************************************************************************/
184895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /* ML Control Functions.                                                  */
185895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /**************************************************************************/
186895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
187895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    unsigned short inv_get_control_params(struct control_params *params);
188895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    unsigned short inv_set_control_params(struct control_params *params);
189895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
190895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /*API for handling control signals */
191895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t inv_set_control_sensitivity(unsigned short controlSignal,
192895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                                            long sensitivity);
193895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t inv_set_control_func(unsigned short function);
194895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t inv_get_control_signal(unsigned short controlSignal,
195895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                                       unsigned short reset, long *data);
196895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t inv_get_grid_num(unsigned short controlSignal,
197895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                                 unsigned short reset, long *data);
198895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t inv_set_grid_thresh(unsigned short controlSignal,
199895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                                    long threshold);
200895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t inv_set_grid_max(unsigned short controlSignal, long maximum);
201895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t
202895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        inv_set_grid_callback(void (*func)
203895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                              (unsigned short controlSignal, long *gridNum,
204895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                               long *gridChange));
205895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t inv_set_control_data(unsigned short controlSignal,
206895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                                     unsigned short parameterArray,
207895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                                     unsigned short parameterNum);
208895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t inv_get_control_data(long *controlSignal, long *gridNum,
209895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                                     long *gridChange);
210895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t inv_update_control(struct inv_obj_t *inv_obj);
211895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t inv_enable_control(void);
212895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t inv_disable_control(void);
213895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
214895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#ifdef __cplusplus
215895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
216895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#endif
217895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#endif                          /* MLCONTROL_H */
218