• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  $License:
3    Copyright 2011 InvenSense, Inc.
4 
5  Licensed under the Apache License, Version 2.0 (the "License");
6  you may not use this file except in compliance with the License.
7  You may obtain a copy of the License at
8 
9  http://www.apache.org/licenses/LICENSE-2.0
10 
11  Unless required by applicable law or agreed to in writing, software
12  distributed under the License is distributed on an "AS IS" BASIS,
13  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  See the License for the specific language governing permissions and
15  limitations under the License.
16   $
17  */
18 /*******************************************************************************
19  *
20  * $RCSfile: mlcontrol.h,v $
21  *
22  * $Date: 2011-06-10 20:13:08 -0700 (Fri, 10 Jun 2011) $
23  *
24  * $Revision: 5629 $
25  *
26  *******************************************************************************/
27 
28 /*******************************************************************************/
29 /** @defgroup INV_CONTROL
30 
31     The Control processes gyroscopes and accelerometers to provide control
32     signals that can be used in user interfaces to manipulate objects such as
33     documents, images, cursors, menus, etc.
34 
35     @{
36         @file mlcontrol.h
37         @brief Header file for the Control Library.
38 */
39 /******************************************************************************/
40 #ifndef MLCONTROL_H
41 #define MLCONTROL_H
42 
43 #ifdef __cplusplus
44 extern "C" {
45 #endif
46 
47 #include "mltypes.h"
48 #include "ml.h"
49 #ifdef INV_INCLUDE_LEGACY_HEADERS
50 #include "mlcontrol_legacy.h"
51 #endif
52 
53     /* ------------ */
54     /* - Defines. - */
55     /* ------------ */
56 
57     /*******************************************************************************/
58     /* Control Signals.                                                            */
59     /*******************************************************************************/
60 
61 #define INV_CONTROL_1                    0x0001
62 #define INV_CONTROL_2                    0x0002
63 #define INV_CONTROL_3                    0x0004
64 #define INV_CONTROL_4                    0x0008
65 
66     /*******************************************************************************/
67     /* Control Functions.                                                          */
68     /*******************************************************************************/
69 
70 #define INV_GRID                         0x0001 // Indicates that the user will be controlling a system that
71     //   has discrete steps, such as icons, menu entries, pixels, etc.
72 #define INV_SMOOTH                       0x0002 // Indicates that noise from unintentional motion should be filtered out.
73 #define INV_DEAD_ZONE                    0x0004 // Indicates that a dead zone should be used, below which sensor data is set to zero.
74 #define INV_HYSTERESIS                   0x0008 // Indicates that, when INV_GRID is selected, hysteresis should be used to prevent
75     //   the control signal from switching rapidly across elements of the grid.</dd>
76 
77     /*******************************************************************************/
78     /* Integral reset options.                                                     */
79     /*******************************************************************************/
80 
81 #define INV_NO_RESET                     0x0000
82 #define INV_RESET                        0x0001
83 
84     /*******************************************************************************/
85     /* Data select options.                                                        */
86     /*******************************************************************************/
87 
88 #define INV_CTRL_SIGNAL                  0x0000
89 #define INV_CTRL_GRID_NUM                0x0001
90 
91     /*******************************************************************************/
92     /* Control Axis.                                                               */
93     /*******************************************************************************/
94 #define INV_CTRL_PITCH                   0x0000 // (INV_PITCH >> 1)
95 #define INV_CTRL_ROLL                    0x0001 // (INV_ROLL  >> 1)
96 #define INV_CTRL_YAW                     0x0002 // (INV_YAW   >> 1)
97 
98     /*******************************************************************************/
99     /* control_params structure default values.                                   */
100     /*******************************************************************************/
101 
102 #define MLCTRL_SENSITIVITY_0_DEFAULT           128
103 #define MLCTRL_SENSITIVITY_1_DEFAULT           128
104 #define MLCTRL_SENSITIVITY_2_DEFAULT           128
105 #define MLCTRL_SENSITIVITY_3_DEFAULT           128
106 #define MLCTRL_FUNCTIONS_DEFAULT                 0
107 #define MLCTRL_CONTROL_SIGNALS_DEFAULT           0
108 #define MLCTRL_PARAMETER_ARRAY_0_DEFAULT         0
109 #define MLCTRL_PARAMETER_ARRAY_1_DEFAULT         0
110 #define MLCTRL_PARAMETER_ARRAY_2_DEFAULT         0
111 #define MLCTRL_PARAMETER_ARRAY_3_DEFAULT         0
112 #define MLCTRL_PARAMETER_AXIS_0_DEFAULT          0
113 #define MLCTRL_PARAMETER_AXIS_1_DEFAULT          0
114 #define MLCTRL_PARAMETER_AXIS_2_DEFAULT          0
115 #define MLCTRL_PARAMETER_AXIS_3_DEFAULT          0
116 #define MLCTRL_GRID_THRESHOLD_0_DEFAULT          1
117 #define MLCTRL_GRID_THRESHOLD_1_DEFAULT          1
118 #define MLCTRL_GRID_THRESHOLD_2_DEFAULT          1
119 #define MLCTRL_GRID_THRESHOLD_3_DEFAULT          1
120 #define MLCTRL_GRID_MAXIMUM_0_DEFAULT            0
121 #define MLCTRL_GRID_MAXIMUM_1_DEFAULT            0
122 #define MLCTRL_GRID_MAXIMUM_2_DEFAULT            0
123 #define MLCTRL_GRID_MAXIMUM_3_DEFAULT            0
124 #define MLCTRL_GRID_CALLBACK_DEFAULT             0
125 
126     /* --------------- */
127     /* - Structures. - */
128     /* --------------- */
129 
130     /**************************************************************************/
131     /* Control Parameters Structure.                                          */
132     /**************************************************************************/
133 
134     struct control_params {
135         // Sensitivity of control signal 1, 2, 3, and 4.
136         unsigned short sensitivity[4];
137         // Indicates what functions will be used. Can be a bitwise OR of INV_GRID,
138         // ML_SMOOT, INV_DEAD_ZONE, and INV_HYSTERISIS.
139         unsigned short functions;
140         // Indicates which parameter array is being assigned to a control signal.
141         // Must be one of INV_GYROS, INV_ANGULAR_VELOCITY, or
142         // INV_ANGULAR_VELOCITY_WORLD.
143         unsigned short parameterArray[4];
144         // Indicates which axis of the parameter array will be used. Must be
145         // INV_ROLL, INV_PITCH, or INV_YAW.
146         unsigned short parameterAxis[4];
147         // Threshold of the control signal at which the grid number will be
148         // incremented or decremented.
149         long gridThreshold[4];
150         // Maximum grid number for the control signal.
151         long gridMaximum[4];
152         // User defined callback that will trigger when the grid location changes.
153         void (*gridCallback) (
154                                  // Indicates which control signal crossed a grid threshold. Must be
155                                  // one of INV_CONTROL_1, INV_CONTROL_2, INV_CONTROL_3 or INV_CONTROL_4.
156                                  unsigned short controlSignal,
157                                  // An array of four numbers representing the grid number for each
158                                  // control signal.
159                                  long *gridNum,
160                                  // An array of four numbers representing the change in grid number
161                                  // for each control signal.
162                                  long *gridChange);
163     };
164 
165     struct control_obj {
166 
167         long gridNum[4];        // Current grid number for each control signal.
168         long controlInt[4];     // Current data for each control signal.
169         long lastGridNum[4];    // Previous grid number
170         unsigned char controlDir[4];    // Direction of control signal
171         long gridChange[4];     // Change in grid number
172 
173         long mlGridNumDMP[4];
174         long gridNumOffset[4];
175         long prevDMPGridNum[4];
176 
177     };
178 
179     /* --------------------- */
180     /* - Function p-types. - */
181     /* --------------------- */
182 
183     /**************************************************************************/
184     /* ML Control Functions.                                                  */
185     /**************************************************************************/
186 
187     unsigned short inv_get_control_params(struct control_params *params);
188     unsigned short inv_set_control_params(struct control_params *params);
189 
190     /*API for handling control signals */
191     inv_error_t inv_set_control_sensitivity(unsigned short controlSignal,
192                                             long sensitivity);
193     inv_error_t inv_set_control_func(unsigned short function);
194     inv_error_t inv_get_control_signal(unsigned short controlSignal,
195                                        unsigned short reset, long *data);
196     inv_error_t inv_get_grid_num(unsigned short controlSignal,
197                                  unsigned short reset, long *data);
198     inv_error_t inv_set_grid_thresh(unsigned short controlSignal,
199                                     long threshold);
200     inv_error_t inv_set_grid_max(unsigned short controlSignal, long maximum);
201     inv_error_t
202         inv_set_grid_callback(void (*func)
203                               (unsigned short controlSignal, long *gridNum,
204                                long *gridChange));
205     inv_error_t inv_set_control_data(unsigned short controlSignal,
206                                      unsigned short parameterArray,
207                                      unsigned short parameterNum);
208     inv_error_t inv_get_control_data(long *controlSignal, long *gridNum,
209                                      long *gridChange);
210     inv_error_t inv_update_control(struct inv_obj_t *inv_obj);
211     inv_error_t inv_enable_control(void);
212     inv_error_t inv_disable_control(void);
213 
214 #ifdef __cplusplus
215 }
216 #endif
217 #endif                          /* MLCONTROL_H */
218