blob: 2a9487c3e2f485bf088642b9c399a73b1dc7167e [file] [log] [blame]
/*
$License:
Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
$
*/
/******************************************************************************
* $Id: gestureMenu.c 5705 2011-06-28 19:32:29Z nroyer $
*****************************************************************************/
#define _USE_MATH_DEFINES
#include <stdio.h>
#include <stddef.h>
#include <math.h>
#include <string.h>
#include "ml.h"
#include "mlmath.h"
#include "gesture.h"
#include "orientation.h"
#include "gestureMenu.h"
#include "fifo.h"
#undef MPL_LOG_TAG
#define MPL_LOG_TAG "gest"
#include "log.h"
#include "mldl_cfg.h"
static unsigned long sensors[] = {
INV_NINE_AXIS,
INV_THREE_AXIS_GYRO,
INV_DMP_PROCESSOR | INV_THREE_AXIS_ACCEL,
INV_THREE_AXIS_ACCEL,
INV_DMP_PROCESSOR | INV_THREE_AXIS_COMPASS,
INV_THREE_AXIS_COMPASS,
INV_SIX_AXIS_GYRO_ACCEL,
INV_DMP_PROCESSOR | INV_SIX_AXIS_ACCEL_COMPASS,
INV_SIX_AXIS_ACCEL_COMPASS,
};
static char *sensors_string[] = {
"INV_NINE_AXIS",
"INV_THREE_AXIS_GYRO",
"INV_DMP_PROCESSOR | INV_THREE_AXIS_ACCEL",
"INV_THREE_AXIS_ACCEL",
"INV_DMP_PROCESSOR | INV_THREE_AXIS_COMPASS",
"INV_THREE_AXIS_COMPASS",
"INV_SIX_AXIS_GYRO_ACCEL",
"INV_DMP_PROCESSOR | INV_SIX_AXIS_ACCEL_COMPASS",
"INV_SIX_AXIS_ACCEL_COMPASS",
};
/**
* Prints the menu with the current thresholds
*
* @param params The parameters to print
*/
void PrintGestureMenu(tGestureMenuParams const * const params)
{
MPL_LOGI("Press h at any time to re-display this menu\n");
MPL_LOGI("TAP PARAMETERS:\n");
MPL_LOGI(" Use LEFT and RIGHT arrows to adjust Tap Time \n\n");
MPL_LOGI(" j : Increase X threshold : %5d\n",
params->xTapThreshold);
MPL_LOGI(" J (Shift-j): Decrease X threshold\n");
MPL_LOGI(" k : Increase Y threshold : %5d\n",
params->yTapThreshold);
MPL_LOGI(" K (Shift-k): Decrease Y threshold\n");
MPL_LOGI(" i : Increase Z threshold : %5d\n",
params->zTapThreshold);
MPL_LOGI(" I (Shift-i): Decrease Z threshold\n");
MPL_LOGI(" l : Increase tap time : %5d\n",
params->tapTime);
MPL_LOGI(" L (Shift-l): Decrease tap time\n");
MPL_LOGI(" o : Increase next tap time : %5d\n",
params->nextTapTime);
MPL_LOGI(" O (Shift-o): Increase next tap time\n");
MPL_LOGI(" u : Increase max Taps : %5d\n",
params->maxTaps);
MPL_LOGI(" U (Shift-u): Increase max Taps\n");
MPL_LOGI("SHAKE PARAMETERS:\n");
MPL_LOGI(" x : Increase X threshold : %5d\n",
params->xShakeThresh);
MPL_LOGI(" X (Shift-x): Decrease X threshold\n");
MPL_LOGI(" y : Increase Y threshold : %5d\n",
params->yShakeThresh);
MPL_LOGI(" Y (Shift-y): Decrease Y threshold\n");
MPL_LOGI(" z : Increase Z threshold : %5d\n",
params->zShakeThresh);
MPL_LOGI(" Z (Shift-z): Decrease Z threshold\n");
MPL_LOGI(" s : Toggle Shake Function : %5d\n",
params->shakeFunction);
MPL_LOGI(" t : Increase Shake Time : %5d\n",
params->shakeTime);
MPL_LOGI(" T (Shift-T): Decrease Shake Time\n");
MPL_LOGI(" n : Increase Next Shake Time : %5d\n",
params->nextShakeTime);
MPL_LOGI(" N (Shift-n): Decrease Next Shake Time\n");
MPL_LOGI(" m : Increase max Shakes : %5d\n",
params->maxShakes);
MPL_LOGI(" M (Shift-m): Decrease max Shakes\n");
MPL_LOGI("SNAP PARAMETERS:\n");
MPL_LOGI(" p : Increase Pitch threshold : %5d\n",
params->xSnapThresh);
MPL_LOGI(" P (Shift-p): Decrease Pitch threshold\n");
MPL_LOGI(" r : Increase Roll threshold : %5d\n",
params->ySnapThresh);
MPL_LOGI(" R (Shift-r): Decrease Roll threshold\n");
MPL_LOGI(" a : Increase yAw threshold : %5d\n",
params->zSnapThresh);
MPL_LOGI(" A (Shift-a): Decrease yAw threshold\n");
MPL_LOGI("YAW ROTATION PARAMETERS:\n");
MPL_LOGI(" e : Increase yaW Rotate time : %5d\n",
params->yawRotateTime);
MPL_LOGI(" E (Shift-r): Decrease yaW Rotate time\n");
MPL_LOGI(" w : Increase yaW Rotate threshold : %5d\n",
params->yawRotateThreshold);
MPL_LOGI(" W (Shift-w): Decrease yaW Rotate threshold\n");
MPL_LOGI("ORIENTATION PARAMETER:\n");
MPL_LOGI(" d : Increase orientation angle threshold : %5f\n",
params->orientationThreshold);
MPL_LOGI(" D (Shift-d): Decrease orientation angle threshold\n");
MPL_LOGI("FIFO RATE:\n");
MPL_LOGI(" f : Increase fifo divider : %5d\n",
inv_get_fifo_rate());
MPL_LOGI(" F (Shift-f): Decrease fifo divider\n");
MPL_LOGI("REQUESTED SENSORS:\n");
MPL_LOGI(" S (Shift-s): Toggle in use sensors : %s\n",
sensors_string[params->sensorsIndex]);
MPL_LOGI(" F (Shift-f): Decrease fifo divider\n");
/* V,v, B,b, Q,q, C,c, G,g, are available letters upper and lowercase */
/* S is available */
MPL_LOGI("\n\n");
}
/**
* Handles a keyboard input and updates an appropriate threshold, prints then
* menu or returns false if the character is not processed.
*
* @param params The parameters to modify if the thresholds are updated
* @param ch The input character
*
* @return true if the character was processed, false otherwise
*/
inv_error_t GestureMenuProcessChar(tGestureMenuParams * const params, char ch)
{
int result = INV_SUCCESS;
/* Dynamic keyboard processing */
switch (ch) {
case 'j':
params->xTapThreshold += 20;
// Intentionally fall through
case 'J': {
params->xTapThreshold -= 10;
if (params->xTapThreshold < 0) params->xTapThreshold = 0;
result = inv_set_tap_threshold(INV_TAP_AXIS_X, params->xTapThreshold);
if (INV_SUCCESS != result) {
MPL_LOGE("MLSetTapThresh returned :%d\n", result);
}
MPL_LOGI("inv_set_tap_threshold(INV_TAP_AXIS_X, %d)\n",
params->xTapThreshold);
} break;
case 'k':
params->yTapThreshold += 20;
// Intentionally fall through
case 'K': {
params->yTapThreshold -= 10;
if (params->yTapThreshold < 0) params->yTapThreshold = 0;
result = inv_set_tap_threshold(INV_TAP_AXIS_Y, params->yTapThreshold);
if (INV_SUCCESS != result) {
MPL_LOGE("MLSetTapThresh returned :%d\n", result);
}
MPL_LOGI("inv_set_tap_threshold(INV_TAP_AXIS_Y, %d)\n",
params->yTapThreshold);
} break;
case 'i':
params->zTapThreshold += 20;
// Intentionally fall through
case 'I': {
params->zTapThreshold -= 10;
if (params->zTapThreshold < 0) params->zTapThreshold = 0;
result = inv_set_tap_threshold(INV_TAP_AXIS_Z, params->zTapThreshold);
if (INV_SUCCESS != result) {
MPL_LOGE("MLSetTapThresh returned :%d\n", result);
}
MPL_LOGI("inv_set_tap_threshold(INV_TAP_AXIS_Z, %d)\n",
params->zTapThreshold);
} break;
case 'l':
params->tapTime += 20;
// Intentionally fall through
case 'L': {
params->tapTime -= 10;
if (params->tapTime < 0) params->tapTime = 0;
result = inv_set_next_tap_time(params->tapTime);
if (INV_SUCCESS != result) {
MPL_LOGE("inv_set_next_tap_time returned :%d\n", result);
}
MPL_LOGI("inv_set_next_tap_time(%d)\n", params->tapTime);
} break;
case 'o':
params->nextTapTime += 20;
// Intentionally fall through
case 'O': {
params->nextTapTime -= 10;
if (params->nextTapTime < 0) params->nextTapTime = 0;
result = MLSetNextTapTime(params->nextTapTime);
if (INV_SUCCESS != result) {
MPL_LOGE("MLSetNextTapTime returned :%d\n", result);
}
MPL_LOGI("MLSetNextTapTime(%d)\n", params->nextTapTime);
} break;
case 'u':
params->maxTaps += 2;
// Intentionally fall through
case 'U': {
params->maxTaps -= 1;
if (params->maxTaps < 0) params->maxTaps = 0;
result = inv_set_max_taps(params->maxTaps);
if (INV_SUCCESS != result) {
MPL_LOGE("inv_set_max_taps returned :%d\n", result);
}
MPL_LOGI("inv_set_max_taps(%d)\n", params->maxTaps);
} break;
case 's': {
int shakeParam;
params->shakeFunction = (params->shakeFunction + 1) % 2;
switch (params->shakeFunction)
{
case 0:
shakeParam = INV_NO_RETRACTION;
MPL_LOGE("inv_set_shake_func(INV_NO_RETRACTION)\n");
break;
case 1:
shakeParam = INV_RETRACTION;
MPL_LOGI("inv_set_shake_func(INV_RETRACTION)\n");
break;
};
result = inv_set_shake_func(shakeParam);
if (INV_SUCCESS != result) {
MPL_LOGE("inv_set_shake_func returned :%d\n", result);
}
} break;
case 'x':
params->xShakeThresh += 200;
// Intentionally fall through
case 'X': {
params->xShakeThresh -= 100;
result = inv_set_shake_thresh(INV_PITCH_SHAKE, params->xShakeThresh);
if (INV_SUCCESS != result) {
MPL_LOGE("inv_set_shake_thresh returned :%d\n", result);
}
MPL_LOGI("inv_set_shake_thresh(INV_PITCH_SHAKE, %d)\n", params->xShakeThresh);
} break;
case 'y':
params->yShakeThresh += 200;
// Intentionally fall through
case 'Y': {
params->yShakeThresh -= 100;
result = inv_set_shake_thresh(INV_ROLL_SHAKE, params->yShakeThresh);
if (INV_SUCCESS != result) {
MPL_LOGE("inv_set_shake_thresh returned :%d\n", result);
}
MPL_LOGI("inv_set_shake_thresh(INV_ROLL_SHAKE, %d)\n", params->yShakeThresh);
} break;
case 'z':
params->zShakeThresh += 200;
// Intentionally fall through
case 'Z':{
params->zShakeThresh -= 100;
result = inv_set_shake_thresh(INV_YAW_SHAKE, params->zShakeThresh);
if (INV_SUCCESS != result) {
MPL_LOGE("inv_set_shake_thresh returned :%d\n", result);
}
MPL_LOGI("inv_set_shake_thresh(INV_YAW_SHAKE, %d)\n",params->zShakeThresh);
} break;
case 'r':
params->ySnapThresh += 20;
// Intentionally fall through
case 'R': {
params->ySnapThresh -= 10;
result = inv_set_hard_shake_thresh(INV_ROLL_SHAKE, params->ySnapThresh);
if (INV_SUCCESS != result) {
MPL_LOGE("inv_set_hard_shake_thresh returned :%d\n", result);
}
MPL_LOGI("inv_set_hard_shake_thresh(INV_ROLL_SHAKE, %d)\n",params->ySnapThresh);
} break;
case 'p':
params->xSnapThresh += 20;
// Intentionally fall through
case 'P': {
params->xSnapThresh -= 10;
result = inv_set_hard_shake_thresh(INV_PITCH_SHAKE, params->xSnapThresh);
if (INV_SUCCESS != result) {
MPL_LOGE("inv_set_hard_shake_thresh returned :%d\n", result);
}
MPL_LOGI("inv_set_hard_shake_thresh(INV_PITCH_SHAKE, %d)\n",
params->xSnapThresh);
} break;
case 'a':
params->zSnapThresh += 20;
case 'A': {
params->zSnapThresh -= 10;
result = inv_set_hard_shake_thresh(INV_YAW_SHAKE, params->zSnapThresh);
if (INV_SUCCESS != result) {
MPL_LOGE("inv_set_hard_shake_thresh returned :%d\n", result);
}
MPL_LOGI("inv_set_hard_shake_thresh(INV_YAW_SHAKE, %d)\n",params->zSnapThresh);
} break;
case 't':
params->shakeTime += 20;
case 'T':{
params->shakeTime -= 10;
result = inv_set_shake_time(params->shakeTime);
if (INV_SUCCESS != result) {
MPL_LOGE("inv_set_shake_time returned :%d\n", result);
}
MPL_LOGI("inv_set_shake_time(%d)\n", params->shakeTime);
} break;
case 'n':
params->nextShakeTime += 20;
case 'N':{
params->nextShakeTime -= 10;
result = inv_set_next_shake_time(params->nextShakeTime);
if (INV_SUCCESS != result) {
MPL_LOGE("inv_set_next_shake_time returned :%d\n", result);
}
MPL_LOGI("inv_set_next_shake_time(%d)\n", params->nextShakeTime);
} break;
case 'm':
params->maxShakes += 2;
case 'M':{
params->maxShakes -= 1;
result = inv_set_max_shakes(INV_SHAKE_ALL, params->maxShakes);
if (INV_SUCCESS != result) {
MPL_LOGE("inv_set_max_shakes returned :%d\n", result);
}
MPL_LOGI("inv_set_max_shakes(%d)\n", params->maxShakes);
} break;
case 'e':
params->yawRotateTime += 20;
case 'E':{
params->yawRotateTime -= 10;
result = inv_set_yaw_rotate_time(params->yawRotateTime);
if (INV_SUCCESS != result) {
MPL_LOGE("inv_set_yaw_rotate_time returned :%d\n", result);
}
MPL_LOGI("inv_set_yaw_rotate_time(%d)\n", params->yawRotateTime);
} break;
case 'w':
params->yawRotateThreshold += 2;
case 'W':{
params->yawRotateThreshold -= 1;
result = inv_set_yaw_rotate_thresh(params->yawRotateThreshold);
if (INV_SUCCESS != result) {
MPL_LOGE("inv_set_yaw_rotate_thresh returned :%d\n", result);
}
MPL_LOGI("inv_set_yaw_rotate_thresh(%d)\n", params->yawRotateThreshold);
} break;
case 'c':
params->shakeRejectValue += 0.20f;
case 'C':{
params->shakeRejectValue -= 0.10f;
result = inv_set_tap_shake_reject(params->shakeRejectValue);
if (INV_SUCCESS != result) {
MPL_LOGE("inv_set_tap_shake_reject returned :%d\n", result);
}
MPL_LOGI("inv_set_tap_shake_reject(%f)\n", params->shakeRejectValue);
} break;
case 'd':
params->orientationThreshold += 10;
case 'D':{
params->orientationThreshold -= 5;
if (params->orientationThreshold > 90) {
params->orientationThreshold = 90;
}
if (params->orientationThreshold < 0 ) {
params->orientationThreshold = 0;
}
result = inv_set_orientation_thresh(params->orientationThreshold,
5, 80,
INV_X_AXIS | INV_Y_AXIS | INV_Z_AXIS);
if (INV_SUCCESS != result) {
MPL_LOGE("inv_set_orientation_thresh returned :%d\n", result);
}
MPL_LOGI("inv_set_orientation_thresh(%f, %d, %d,"
" INV_X_AXIS | INV_Y_AXIS | INV_Z_AXIS)\n",
params->orientationThreshold, 5, 80);
} break;
case 'f':
result = inv_set_fifo_rate(inv_get_fifo_rate() + 1);
MPL_LOGI("inv_set_fifo_rate(%d)\n",inv_get_fifo_rate());
break;
case 'F':
{
unsigned short newRate = inv_get_fifo_rate();
if (newRate > 0)
newRate--;
result = inv_set_fifo_rate(newRate);
MPL_LOGI("inv_set_fifo_rate(%d)\n",inv_get_fifo_rate());
break;
}
case 'S':
params->sensorsIndex++;
if (params->sensorsIndex >= ARRAY_SIZE(sensors)) {
params->sensorsIndex = 0;
}
result = inv_set_mpu_sensors(
sensors[params->sensorsIndex] & params->available_sensors);
if (result) {
LOG_RESULT_LOCATION(result);
return result;
}
MPL_LOGI("%d = inv_set_mpu_sensors(%s)\n", result,
sensors_string[params->sensorsIndex]);
break;
case 'h':
case 'H': {
PrintGestureMenu(params);
} break;
default: {
result = INV_ERROR;
} break;
};
return result;
}
/**
* Initializes the tGestureMenuParams to a set of defaults.
*
* @param params The parameters to initialize.
*/
void GestureMenuSetDefaults(tGestureMenuParams * const params)
{
params->xTapThreshold = 100;
params->yTapThreshold = 100;
params->zTapThreshold = 100;
params->tapTime = 100;
params->nextTapTime = 600;
params->maxTaps = 2;
params->shakeRejectValue = 0.8f;
params->xShakeThresh = 750;
params->yShakeThresh = 750;
params->zShakeThresh = 750;
params->xSnapThresh = 160;
params->ySnapThresh = 320;
params->zSnapThresh = 160;
params->shakeTime = 100;
params->nextShakeTime = 1000;
params->shakeFunction = 0;
params->maxShakes = 3;
params->yawRotateTime = 80;
params->yawRotateThreshold = 70;
params->orientationThreshold = 60;
params->sensorsIndex = 0;
params->available_sensors = INV_NINE_AXIS;
}
void GestureMenuSetAvailableSensors(tGestureMenuParams * const params,
unsigned long available_sensors)
{
params->available_sensors = available_sensors;
}
/**
* Call the appropriate MPL set threshold functions and checkes the error codes
*
* @param params The parametrs to use in setting the thresholds
*
* @return INV_SUCCESS or the first error code encountered.
*/
inv_error_t GestureMenuSetMpl(tGestureMenuParams const * const params)
{
inv_error_t result = INV_SUCCESS;
result = inv_set_tap_threshold(INV_TAP_AXIS_X, params->xTapThreshold);
if (INV_SUCCESS != result) {
MPL_LOGE("inv_set_tap_threshold returned :%d\n", result);
return result;
}
result = inv_set_tap_threshold(INV_TAP_AXIS_Y, params->yTapThreshold);
if (INV_SUCCESS != result) {
MPL_LOGE("inv_set_tap_threshold returned :%d\n", result);
return result;
}
result = inv_set_tap_threshold(INV_TAP_AXIS_Z, params->zTapThreshold);
if (INV_SUCCESS != result) {
MPL_LOGE("inv_set_tap_threshold returned :%d\n", result);
return result;
}
result = inv_set_next_tap_time(params->tapTime);
if (INV_SUCCESS != result) {
MPL_LOGE("inv_set_next_tap_time returned :%d\n", result);
return result;
}
result = MLSetNextTapTime(params->nextTapTime);
if (INV_SUCCESS != result) {
MPL_LOGE("MLSetNextTapTime returned :%d\n", result);
return result;
}
result = inv_set_max_taps(params->maxTaps);
if (INV_SUCCESS != result) {
MPL_LOGE("inv_set_max_taps returned :%d\n", result);
return result;
}
result = inv_set_tap_shake_reject(params->shakeRejectValue);
if (INV_SUCCESS != result) {
MPL_LOGE("inv_set_tap_shake_reject returned :%d\n", result);
return result;
}
//Set up shake gesture
result = inv_set_shake_func(params->shakeFunction);
if (INV_SUCCESS != result) {
MPL_LOGE("inv_set_shake_func returned :%d\n", result);
return result;
}
result = inv_set_shake_thresh(INV_ROLL_SHAKE, params->xShakeThresh);
if (INV_SUCCESS != result) {
MPL_LOGE("inv_set_shake_thresh returned :%d\n", result);
return result;
}
result = inv_set_shake_thresh(INV_PITCH_SHAKE, params->yShakeThresh);
if (INV_SUCCESS != result) {
MPL_LOGE("inv_set_shake_thresh returned :%d\n", result);
return result;
}
result = inv_set_shake_thresh(INV_YAW_SHAKE, params->zShakeThresh);
if (INV_SUCCESS != result) {
MPL_LOGE("inv_set_shake_thresh returned :%d\n", result);
return result;
}
result = inv_set_shake_time(params->shakeTime);
if (INV_SUCCESS != result) {
MPL_LOGE("inv_set_shake_time returned :%d\n", result);
return result;
}
result = inv_set_next_shake_time(params->nextShakeTime);
if (INV_SUCCESS != result) {
MPL_LOGE("inv_set_next_shake_time returned :%d\n", result);
return result;
}
result = inv_set_max_shakes(INV_SHAKE_ALL,params->maxShakes);
if (INV_SUCCESS != result) {
MPL_LOGE("inv_set_max_shakes returned :%d\n", result);
return result;
}
// Yaw rotate settings
result = inv_set_yaw_rotate_time(params->yawRotateTime);
if (INV_SUCCESS != result) {
MPL_LOGE("inv_set_yaw_rotate_time returned :%d\n", result);
return result;
}
result = inv_set_yaw_rotate_thresh(params->yawRotateThreshold);
if (INV_SUCCESS != result) {
MPL_LOGE("inv_set_yaw_rotate_thresh returned :%d\n", result);
return result;
}
// Orientation settings
result = inv_set_orientation_thresh(params->orientationThreshold, 5, 80,
INV_X_AXIS | INV_Y_AXIS | INV_Z_AXIS);
if (INV_SUCCESS != result) {
MPL_LOGE("inv_set_orientation_thresh returned: %d\n", result);
return result;
}
// Requested Sensors
result = inv_set_mpu_sensors(
sensors[params->sensorsIndex] & params->available_sensors);
if (INV_SUCCESS != result) {
MPL_LOGE("MLSetMPUSesnors returned: %d %lx\n", result,
sensors[params->sensorsIndex] & params->available_sensors);
return result;
}
return INV_SUCCESS;
}
void PrintGesture(tGesture* gesture)
{
float speed;
char type[1024];
switch (gesture->type)
{
case INV_TAP:
{
if (gesture->meta < 0) {
snprintf(type,sizeof(type),"-");
} else {
snprintf(type,sizeof(type),"+");
}
switch (ABS(gesture->meta))
{
case 1:
strcat(type,"X");
break;
case 2:
strcat(type,"Y");
break;
case 3:
strcat(type,"Z");
break;
default:
strcat(type,"ERROR");
break;
};
MPL_LOGI("TAP: %s %2d, X: %6d Y: %6d Z: %6d XY: %6.2f, YZ: %6.2f, XZ: %6.2f\n",
type,
gesture->num,
gesture->strength,
gesture->speed,
gesture->reserved,
(180 / M_PI) * atan2(
(float)gesture->strength, (float)gesture->speed),
(180 / M_PI) * atan2(
(float)gesture->speed, (float)gesture->reserved),
(180 / M_PI) * atan2(
(float)gesture->strength, (float)gesture->reserved)
);
}
break;
case INV_ROLL_SHAKE:
case INV_PITCH_SHAKE:
case INV_YAW_SHAKE:
{
if (gesture->strength){
snprintf(type, sizeof(type), "Snap : ");
} else {
snprintf(type, sizeof(type), "Shake: ");
}
if (gesture->meta==0) {
strcat(type, "+");
} else {
strcat(type, "-");
}
if (gesture->type == INV_ROLL_SHAKE) {
strcat(type, "Roll ");
} else if (gesture->type == INV_PITCH_SHAKE) {
strcat(type, "Pitch ");
} else if (gesture->type == INV_YAW_SHAKE) {
strcat(type, "Yaw ");
}
speed = (float)gesture->speed +
(float)(gesture->reserved / (float)(1 << 16));
MPL_LOGI("%s:%3d (speed: %8.2f)\n",type, gesture->num, speed);
}
break;
case INV_YAW_IMAGE_ROTATE:
{
if (gesture->meta == 0) {
snprintf(type, sizeof(type), "Positive ");
} else {
snprintf(type, sizeof(type), "Negative ");
}
MPL_LOGI("%s Yaw Image Rotation\n", type);
}
break;
default:
MPL_LOGE("Unknown Gesture received\n");
break;
}
}
/**
* Prints the new or current orientation using MPL_LOGI and remembers the last
* orientation to print orientation flips.
*
* @param orientation the new or current orientation. 0 to reset.
*/
void PrintOrientation(unsigned short orientation)
{
// Determine if it was a flip
static int sLastOrientation = 0;
int flip = orientation | sLastOrientation;
if ((INV_X_UP | INV_X_DOWN) == flip) {
MPL_LOGI("Flip about the X Axis: \n");
} else if ((INV_Y_UP | INV_Y_DOWN) == flip) {
MPL_LOGI("Flip about the Y axis: \n");
} else if ((INV_Z_UP | INV_Z_DOWN) == flip) {
MPL_LOGI("Flip about the Z axis: \n");
}
sLastOrientation = orientation;
switch (orientation) {
case INV_X_UP:
MPL_LOGI("X Axis is up\n");
break;
case INV_X_DOWN:
MPL_LOGI("X Axis is down\n");
break;
case INV_Y_UP:
MPL_LOGI("Y Axis is up\n");
break;
case INV_Y_DOWN:
MPL_LOGI("Y Axis is down\n");
break;
case INV_Z_UP:
MPL_LOGI("Z Axis is up\n");
break;
case INV_Z_DOWN:
MPL_LOGI("Z Axis is down\n");
break;
case 0:
break; /* Not an error. Resets sLastOrientation */
default:
MPL_LOGE("%s: Unreconized orientation %hx\n", __func__, orientation);
break;
}
}