295 lines
12 KiB
C++
295 lines
12 KiB
C++
/* ===========================================================================
|
|
# This is the library for MGC3130.
|
|
#
|
|
# MGC3130 is a device that lets you control your hardware projects in a whole new way.
|
|
# MGC3130 detects hands movements and converts these in gestures. These gestures
|
|
# permit to manage a device without touch it.
|
|
#
|
|
# Written by Matteo Destro for Futura Group srl
|
|
# www.Futurashop.it
|
|
# www.open-electronics.org
|
|
#
|
|
# BSD license, all text above must be included in any redistribution
|
|
# ===========================================================================
|
|
#
|
|
# REVISION 1.0.0 22/03/2015
|
|
#
|
|
# ===========================================================================
|
|
#
|
|
# INSTALLATION
|
|
# The 3 library files (MGC3130.cpp, MGC3130.h and keywords.txt) in the MGC3130 folder should be placed in your Arduino Library folder.
|
|
# Run the MGC3130_Demo.ino file from your Arduino IDE.
|
|
#
|
|
# SUPPORT
|
|
#
|
|
# info@open-electronics.org
|
|
#
|
|
# ===========================================================================*/
|
|
|
|
|
|
#ifndef _MGC3130_H
|
|
#define _MGC3130_H
|
|
|
|
#include "Arduino.h"
|
|
|
|
#define TRUE 0
|
|
#define FALSE 1
|
|
|
|
#define PRINT_RAW_FW_INFO // Enable Print on Serial interface of RAW Firmware Info
|
|
#define PRINT_RAW_DATA // Enable Print on Serial interface of RAW data
|
|
#define PRINT_GESTURE_DATA // Enable Print on Serial interface of Gesture recognized
|
|
#define PRINT_XYZ // Enable Print on serial interface of xyz coordinates
|
|
|
|
//-----------------------------------------------------------------------
|
|
// MGC3130 CMD ID
|
|
#define ID_DATA_OUTPUT 0x91
|
|
#define ID_FW_VERSION 0x83
|
|
//-----------------------------------------------------------------------
|
|
|
|
#define MASK_GESTURE_RAW (uint32_t)(0x0001F0FF) // Filter mask to remove invalid data into gesture packet
|
|
#define MASK_TOUCH_RAW (uint32_t)(0x00007FFF) // Filter mask to remove invalid data into touch packet
|
|
|
|
#define MASK_FILTER_GESTURE (uint32_t)(0x00000000) // To calculate exactly value of mask see below
|
|
// B00000000000000000000000000000000 // Set bit to "1" to mask Gesture and convert binary data into hexadecimal data
|
|
// ||||||||||||||||||||||||||||||||
|
|
// |||||||||||||||||||||||||||||||+------> if "1" MASK Touch South
|
|
// ||||||||||||||||||||||||||||||+-------> if "1" MASK Touch West
|
|
// |||||||||||||||||||||||||||||+--------> if "1" MASK Touch North
|
|
// ||||||||||||||||||||||||||||+---------> if "1" MASK Touch East
|
|
// |||||||||||||||||||||||||||+----------> if "1" MASK Touch Centre
|
|
// ||||||||||||||||||||||||||+-----------> if "1" MASK Tap South
|
|
// |||||||||||||||||||||||||+------------> if "1" MASK Tap West
|
|
// ||||||||||||||||||||||||+-------------> if "1" MASK Tap North
|
|
// |||||||||||||||||||||||+--------------> if "1" MASK Tap East
|
|
// ||||||||||||||||||||||+---------------> if "1" MASK Tap Centre
|
|
// |||||||||||||||||||||+----------------> if "1" MASK Double Tap South
|
|
// ||||||||||||||||||||+-----------------> if "1" MASK Double Tap West
|
|
// |||||||||||||||||||+------------------> if "1" MASK Double Tap North
|
|
// ||||||||||||||||||+-------------------> if "1" MASK Double Tap East
|
|
// |||||||||||||||||+--------------------> if "1" MASK Double Tap Centre
|
|
// ||||||||||||||||+---------------------> if "1" MASK Gesture West To East
|
|
// |||||||||||||||+----------------------> if "1" MASK Gesture East To West
|
|
// ||||||||||||||+-----------------------> if "1" MASK Gesture South To North
|
|
// |||||||||||||+------------------------> if "1" MASK Gesture North To South
|
|
// ||||||||||||+-------------------------> if "1" MASK Gesture Edge West To East
|
|
// |||||||||||+--------------------------> if "1" MASK Gesture Edge East To West
|
|
// ||||||||||+---------------------------> if "1" MASK Gesture Edge South To North
|
|
// |||||||||+----------------------------> if "1" MASK Gesture Edge North To South
|
|
// ||||||||+-----------------------------> if "1" MASK Gesture Clock Wise
|
|
// |||||||+------------------------------> if "1" MASK Gesture Counter Clock Wise
|
|
// ||||||+-------------------------------> if "1" MASK Gesture Complete Rotation
|
|
// ++++++--------------------------------> Free
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Use this MASK constant to create application code for gestic gesture decode
|
|
//-----------------------------------------------------------------------
|
|
// TOUCH/GESTURE OUTPUT MASK
|
|
#define GESTURE_MASK_TOUCH_SOUTH (uint32_t)(0x00000001)
|
|
#define GESTURE_MASK_TOUCH_WEST (uint32_t)(0x00000002)
|
|
#define GESTURE_MASK_TOUCH_NORTH (uint32_t)(0x00000004)
|
|
#define GESTURE_MASK_TOUCH_EAST (uint32_t)(0x00000008)
|
|
#define GESTURE_MASK_TOUCH_CENTRE (uint32_t)(0x00000010)
|
|
#define GESTURE_MASK_TAP_SOUTH (uint32_t)(0x00000020)
|
|
#define GESTURE_MASK_TAP_WEST (uint32_t)(0x00000040)
|
|
#define GESTURE_MASK_TAP_NORTH (uint32_t)(0x00000080)
|
|
#define GESTURE_MASK_TAP_EAST (uint32_t)(0x00000100)
|
|
#define GESTURE_MASK_TAP_CENTRE (uint32_t)(0x00000200)
|
|
#define GESTURE_MASK_DOUBLE_TAP_SOUTH (uint32_t)(0x00000400)
|
|
#define GESTURE_MASK_DOUBLE_TAP_WEST (uint32_t)(0x00000800)
|
|
#define GESTURE_MASK_DOUBLE_TAP_NORTH (uint32_t)(0x00001000)
|
|
#define GESTURE_MASK_DOUBLE_TAP_EAST (uint32_t)(0x00002000)
|
|
#define GESTURE_MASK_DOUBLE_TAP_CENTRE (uint32_t)(0x00004000)
|
|
#define GESTURE_MASK_WEST_EAST (uint32_t)(0x00008000)
|
|
#define GESTURE_MASK_EAST_WEST (uint32_t)(0x00010000)
|
|
#define GESTURE_MASK_SOUTH_NORTH (uint32_t)(0x00020000)
|
|
#define GESTURE_MASK_NORTH_SOUTH (uint32_t)(0x00040000)
|
|
#define GESTURE_MASK_EDGE_WEST_EAST (uint32_t)(0x00080000)
|
|
#define GESTURE_MASK_EDGE_EAST_WEST (uint32_t)(0x00100000)
|
|
#define GESTURE_MASK_EDGE_SOUTH_NORTH (uint32_t)(0x00200000)
|
|
#define GESTURE_MASK_EDGE_NORTH_SOUTH (uint32_t)(0x00400000)
|
|
#define GESTURE_MASK_CLOCK_WISE (uint32_t)(0x00800000)
|
|
#define GESTURE_MASK_COUNTER_CLOCK_WISE (uint32_t)(0x01000000)
|
|
#define GESTURE_MASK_COMPLETE_ROTATION (uint32_t)(0x02000000)
|
|
//-----------------------------------------------------------------------
|
|
|
|
//-----------------------------------------------------------------------
|
|
// GESTURE INPUT CODE MASK
|
|
#define NO_GESTURE 0x00
|
|
#define GESTURE_GARBAGE 0x01
|
|
#define GESTURE_WEST_EAST 0x02
|
|
#define GESTURE_EAST_WEST 0x03
|
|
#define GESTURE_SOUTH_NORTH 0x04
|
|
#define GESTURE_NORTH_SOUTH 0x05
|
|
#define GESTURE_CLOCK_WISE 0x06
|
|
#define GESTURE_COUNTER_CLOCK_WISE 0x07
|
|
//-----------------------------------------------------------------------
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Sequence for Tap gesture
|
|
// Touch -> Tap
|
|
//
|
|
// Sequence for Double Tap gesture
|
|
// Touch -> Tap -> Touch -> DoubleTap -> Touch -> Tap
|
|
//-----------------------------------------------------------------------
|
|
|
|
class MGC3130 {
|
|
public:
|
|
void SetSerial(uint8_t Baud, uint8_t Config);
|
|
void SetAdd(uint8_t Addr);
|
|
void ResetDevice(uint8_t Rst);
|
|
void ExitResetDevice(uint8_t Rst);
|
|
void Begin(uint8_t Ts, uint8_t Rst);
|
|
void ReleaseTsLine(uint8_t Ts);
|
|
void GetEvent(void);
|
|
void DecodeGesture(void);
|
|
|
|
boolean GetTsLineStatus(uint8_t Ts);
|
|
|
|
//----------------------------------------
|
|
// Gesture decoded. Global variable
|
|
union GestureOutput {
|
|
uint32_t Gesture;
|
|
uint8_t GestArray[4];
|
|
struct {
|
|
uint8_t Byte_0;
|
|
uint8_t Byte_1;
|
|
uint8_t Byte_2;
|
|
uint8_t Byte_3;
|
|
} GestureByte;
|
|
struct {
|
|
uint8_t TouchSouth :1; // GESTURE_TOUCH_SOUTH 0x00000001
|
|
uint8_t TouchWest :1; // GESTURE_TOUCH_WEST 0x00000002
|
|
uint8_t TouchNorth :1; // GESTURE_TOUCH_NORTH 0x00000004
|
|
uint8_t TouchEast :1; // GESTURE_TOUCH_EAST 0x00000008
|
|
uint8_t TouchCentre :1; // GESTURE_TOUCH_CENTRE 0x00000010
|
|
uint8_t TapSouth :1; // GESTURE_TAP_SOUTH 0x00000020
|
|
uint8_t TapWest :1; // GESTURE_TAP_WEST 0x00000040
|
|
uint8_t TapNorth :1; // GESTURE_TAP_NORTH 0x00000080
|
|
uint8_t TapEast :1; // GESTURE_TAP_EAST 0x00000100
|
|
uint8_t TapCentre :1; // GESTURE_TAP_CENTRE 0x00000200
|
|
uint8_t DoubleTapSouth :1; // GESTURE_DOUBLE_TAP_SOUTH 0x00000400
|
|
uint8_t DoubleTapWest :1; // GESTURE_DOUBLE_TAP_WEST 0x00000800
|
|
uint8_t DoubleTapNorth :1; // GESTURE_DOUBLE_TAP_NORTH 0x00001000
|
|
uint8_t DoubleTapEast :1; // GESTURE_DOUBLE_TAP_EAST 0x00002000
|
|
uint8_t DoubleTapCentre :1; // GESTURE_DOUBLE_TAP_CENTRE 0x00004000
|
|
uint8_t GestWestEast :1; // GESTURE_WEST_EAST 0x00008000
|
|
uint8_t GestEastWest :1; // GESTURE_EAST_WEST 0x00010000
|
|
uint8_t GestSouthNorth :1; // GESTURE_SOUTH_NORTH 0x00020000
|
|
uint8_t GestNorthSouth :1; // GESTURE_NORTH_SOUTH 0x00040000
|
|
uint8_t EdgeGestWestEast :1; // GESTURE_EDGE_WEST_EAST 0x00080000
|
|
uint8_t EdgeGestEastWest :1; // GESTURE_EDGE_EAST_WEST 0x00100000
|
|
uint8_t EdgeGestSouthNorth :1; // GESTURE_EDGE_SOUTH_NORTH 0x00200000
|
|
uint8_t EdgeGestNorthSouth :1; // GESTURE_EDGE_NORTH_SOUTH 0x00400000
|
|
uint8_t GestClockWise :1; // GESTURE_CLOCK_WISE 0x00800000
|
|
uint8_t GestCounterClockWise :1; // GESTURE_COUNTER_CLOCK_WISE 0x01000000
|
|
uint8_t FreeBit :7;
|
|
} Bit;
|
|
} GestureOutput;
|
|
//----------------------------------------
|
|
|
|
//----------------------------------------
|
|
// AirWheel Variable
|
|
uint8_t AirWheelInfo;
|
|
//----------------------------------------
|
|
|
|
//----------------------------------------
|
|
// X-Y-Z Position
|
|
union xyzPosition{
|
|
struct {
|
|
uint16_t x_pos;
|
|
uint16_t y_pos;
|
|
uint16_t z_pos;
|
|
} xyzWord;
|
|
uint8_t xyzArray[6];
|
|
struct {
|
|
uint8_t Byte_0;
|
|
uint8_t Byte_1;
|
|
uint8_t Byte_2;
|
|
uint8_t Byte_3;
|
|
uint8_t Byte_4;
|
|
uint8_t Byte_5;
|
|
} xyzByte;
|
|
} xyzPosition;
|
|
//----------------------------------------
|
|
|
|
private:
|
|
void EnableInt1(void);
|
|
void PrintMGC3130RawFirmwareInfo(void);
|
|
void PrintMGC3130RawData(void);
|
|
void PrintMGC3130Gesture(void);
|
|
void PrintMGC3130xyz(void);
|
|
void ReadStringFLASH(uint8_t *FlashPointer, uint8_t Lenght, boolean PrintC);
|
|
void SetHexPrintOutput(uint8_t Data);
|
|
|
|
boolean FirstStartPacket;
|
|
uint8_t _i2caddr;
|
|
uint8_t data[192];
|
|
|
|
//----------------------------------------
|
|
// Gesture and Touch Variable
|
|
uint32_t LastGesture;
|
|
union GestureInfo {
|
|
uint32_t Gesture;
|
|
uint8_t GestArray[4];
|
|
struct {
|
|
uint8_t Byte_0;
|
|
uint8_t Byte_1;
|
|
uint8_t Byte_2;
|
|
uint8_t Byte_3;
|
|
} GestureByte;
|
|
struct {
|
|
uint8_t GestureCode :8; // 0 -> No Gesture
|
|
// 1 -> Garbage Model
|
|
// 2 -> Flick West To East
|
|
// 3 -> Flick East to West
|
|
// 4 -> Flick South to North
|
|
// 5 -> Flick North to South
|
|
// 6 -> Circle Clockwise
|
|
// 7 -> Circle Counter-Clockwise
|
|
uint8_t Reserved :4;
|
|
uint8_t GestureType :4; // 0 -> Garbage Model
|
|
// 1 -> Flick Gesture
|
|
// 2 -> Circular Gesture
|
|
uint8_t EdgeFlick :1; // If "1" Edge Flick
|
|
uint8_t Reserved2 :14;
|
|
uint8_t GestureInProgress :1; // If "1" Gesture recognition in progress
|
|
} Bit;
|
|
} GestureInfo;
|
|
|
|
uint32_t LastTouch;
|
|
union TouchInfo {
|
|
uint32_t Touch;
|
|
uint8_t TouchArray[4];
|
|
struct {
|
|
uint8_t Byte_0;
|
|
uint8_t Byte_1;
|
|
uint8_t Byte_2;
|
|
uint8_t Byte_3;
|
|
} TouchByte;
|
|
struct {
|
|
uint8_t TouchSouth :1; // Bit 00 Touch Info Sensor_Data_Output (ID = 0x91)
|
|
uint8_t TouchWest :1; // Bit 01 Touch Info Sensor_Data_Output (ID = 0x91)
|
|
uint8_t TouchNorth :1; // Bit 02 Touch Info Sensor_Data_Output (ID = 0x91)
|
|
uint8_t TouchEast :1; // Bit 03 Touch Info Sensor_Data_Output (ID = 0x91)
|
|
uint8_t TouchCentre :1; // Bit 04 Touch Info Sensor_Data_Output (ID = 0x91)
|
|
uint8_t TapSouth :1; // Bit 05 Touch Info Sensor_Data_Output (ID = 0x91)
|
|
uint8_t TapWest :1; // Bit 06 Touch Info Sensor_Data_Output (ID = 0x91)
|
|
uint8_t TapNorth :1; // Bit 07 Touch Info Sensor_Data_Output (ID = 0x91)
|
|
uint8_t TapEast :1; // Bit 08 Touch Info Sensor_Data_Output (ID = 0x91)
|
|
uint8_t TapCentre :1; // Bit 09 Touch Info Sensor_Data_Output (ID = 0x91)
|
|
uint8_t DoubleTapSouth :1; // Bit 10 Touch Info Sensor_Data_Output (ID = 0x91)
|
|
uint8_t DoubleTapWest :1; // Bit 11 Touch Info Sensor_Data_Output (ID = 0x91)
|
|
uint8_t DoubleTapNorth :1; // Bit 12 Touch Info Sensor_Data_Output (ID = 0x91)
|
|
uint8_t DoubleTapEast :1; // Bit 13 Touch Info Sensor_Data_Output (ID = 0x91)
|
|
uint8_t DoubleTapCentre :1; // Bit 14 Touch Info Sensor_Data_Output (ID = 0x91)
|
|
uint8_t FreeBit :17;
|
|
} Bit;
|
|
} TouchInfo;
|
|
//----------------------------------------
|
|
|
|
uint16_t Previous_x_pos;
|
|
uint16_t Previous_y_pos;
|
|
uint16_t Previous_z_pos;
|
|
};
|
|
|
|
#endif |