Lab_interaccio/2020/MGC3130_TEST/MGC3130.cpp

531 lines
18 KiB
C++
Raw Permalink Normal View History

2025-02-25 21:29:42 +01:00
/* ===========================================================================
# 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
#
# ===========================================================================*/
#include "MGC3130.h"
#include <Wire.h>
#define WIRE Wire
const char MGC3130Init[] PROGMEM = "MGC3130 initialization in progress...wait";
const char MGC3130Ready[] PROGMEM = "MGC3130 device is ready";
void MGC3130::SetSerial(uint8_t Baud, uint8_t Config) {
Serial.begin(115200, Config);
delay(1000);
}
void MGC3130::SetAdd(uint8_t Addr) {
_i2caddr = Addr;
}
void MGC3130::ResetDevice(uint8_t Rst) {
pinMode(Rst, OUTPUT); // Set Reset line as Output
digitalWrite(Rst, LOW); // Reset MGC3130 device for 250 mSec
}
void MGC3130::ExitResetDevice(uint8_t Rst) {
pinMode(Rst, OUTPUT); // Set Reset line as Output
digitalWrite(Rst, HIGH);
}
void MGC3130::Begin(uint8_t Ts, uint8_t Rst) {
ReadStringFLASH((uint8_t *)MGC3130Init, strlen(MGC3130Init), TRUE); // Print "MGC3130 initialization in progress...wait"
//FirstStartPacket = TRUE;
WIRE.begin(_i2caddr); // Initialize I2c with hardware address
pinMode(Ts, INPUT); // Set TS line as Input
pinMode(Rst, OUTPUT); // Set Reset line as Output
digitalWrite(Rst, LOW); // Reset MGC3130 device for 250 mSec
delay(250); // Delay
digitalWrite(Rst, HIGH);
delay(250); // Delay
ReadStringFLASH((uint8_t *)MGC3130Ready, strlen(MGC3130Ready), TRUE); // Print "MGC3130 device is ready"
}
void MGC3130::ReleaseTsLine(uint8_t Ts) {
digitalWrite(Ts, HIGH); // Set TS line as Input
pinMode(Ts, INPUT); // Set TS level
}
boolean MGC3130::GetTsLineStatus(uint8_t Ts) {
if (digitalRead(Ts) == 0) {
// MGC3130 put TS line LOW. Data is available
pinMode(Ts, OUTPUT); // Set TS line as Output
digitalWrite(Ts, LOW); // Set TS level
return TRUE; // Return TRUE;
}
return FALSE; // Return FALSE
}
void MGC3130::GetEvent(void) {
int Counter = 0;
char c;
// if (FirstStartPacket == TRUE) {
// FirstStartPacket = FALSE;
// WIRE.requestFrom((uint8_t)_i2caddr, (uint8_t)0x84);
// } else {
// WIRE.requestFrom((uint8_t)_i2caddr, (uint8_t)0x1A);
// }
WIRE.requestFrom((uint8_t)_i2caddr, (uint8_t)0x1A);
while(WIRE.available()) {
data[Counter++] = WIRE.read();
}
switch (data[3])
{
case ID_FW_VERSION:
#ifdef PRINT_RAW_FW_INFO
PrintMGC3130RawFirmwareInfo();
#endif
if (data[4] == 0xAA) {
// Valid Gestic Library available
Serial.print("FW Version: ");
for (int i = 0; i < 120; i++) {
c = char(data[i + 10]);
Serial.print(c);
}
Serial.print("\n");
}
break;
case ID_DATA_OUTPUT:
// ----------------------------------------
// Save Data into internal array
for (int i = 0; i < 4; i++) {
GestureInfo.GestArray[i] = data[i + 10];
TouchInfo.TouchArray[i] = data[i + 14];
}
GestureInfo.Gesture &= MASK_GESTURE_RAW;
TouchInfo.Touch &= MASK_TOUCH_RAW;
AirWheelInfo = data[18];
for (int i = 0; i < 6; i++) {
xyzPosition.xyzArray[i] = data[i + 20];
}
// ----------------------------------------
break;
default:
break;
}
}
void MGC3130::DecodeGesture(void) {
uint32_t Mask = 0x00000001;
if (((TouchInfo.Touch ^ LastTouch) > 0) || ((GestureInfo.Gesture ^ LastGesture) > 0) ) {
#ifdef PRINT_RAW_DATA
PrintMGC3130RawData();
#endif
GestureOutput.Gesture = 0;
if ((TouchInfo.Touch ^ LastTouch) > 0) {
LastTouch = TouchInfo.Touch;
for (int i = 0; i < 15; i++) {
if ((TouchInfo.Touch & Mask) > 0) {
GestureOutput.Gesture |= Mask;
}
Mask = Mask << 1;
}
} else if ((GestureInfo.Gesture ^ LastGesture) > 0) {
LastGesture = GestureInfo.Gesture;
switch (GestureInfo.Bit.GestureCode)
{
case NO_GESTURE:
case GESTURE_GARBAGE:
break;
case GESTURE_WEST_EAST:
if (GestureInfo.Bit.EdgeFlick == 0) {
GestureOutput.Gesture |= GESTURE_MASK_WEST_EAST;
} else {
GestureOutput.Gesture |= GESTURE_MASK_EDGE_WEST_EAST;
}
break;
case GESTURE_EAST_WEST:
if (GestureInfo.Bit.EdgeFlick == 0) {
GestureOutput.Gesture |= GESTURE_MASK_EAST_WEST;
} else {
GestureOutput.Gesture |= GESTURE_MASK_EDGE_EAST_WEST;
}
break;
case GESTURE_SOUTH_NORTH:
if (GestureInfo.Bit.EdgeFlick == 0) {
GestureOutput.Gesture |= GESTURE_MASK_SOUTH_NORTH;
} else {
GestureOutput.Gesture |= GESTURE_MASK_EDGE_SOUTH_NORTH;
}
break;
case GESTURE_NORTH_SOUTH:
if (GestureInfo.Bit.EdgeFlick == 0) {
GestureOutput.Gesture |= GESTURE_MASK_NORTH_SOUTH;
} else {
GestureOutput.Gesture |= GESTURE_MASK_EDGE_NORTH_SOUTH;
}
break;
case GESTURE_CLOCK_WISE:
GestureOutput.Gesture |= GESTURE_MASK_CLOCK_WISE;
break;
case GESTURE_COUNTER_CLOCK_WISE:
GestureOutput.Gesture |= GESTURE_MASK_COUNTER_CLOCK_WISE;
break;
default:
break;
}
}
// Remove not desired Touch or Gesture Info. See MASK_FILTER_GESTURE into MGC3130.h file for details
GestureOutput.Gesture &= ~(MASK_FILTER_GESTURE);
#ifdef PRINT_GESTURE_DATA
PrintMGC3130Gesture();
#endif
#ifdef PRINT_XYZ
PrintMGC3130xyz();
#endif
}
}
#ifdef PRINT_RAW_FW_INFO
const char RawInfoIndent[] PROGMEM = "#####################################################################################\nRow Firmware Info from MGC3130 \n";
const char HeaderInfo[] PROGMEM = "Header: ";
const char PayloadInfo[] PROGMEM = "Payload: ";
const char RawInfoCloseIndent[] PROGMEM = "\n#####################################################################################\n\n";
void MGC3130::PrintMGC3130RawFirmwareInfo(void) {
if (data[3] = ID_FW_VERSION) {
ReadStringFLASH((uint8_t *)RawInfoIndent, strlen(RawInfoIndent), FALSE);
//----------------------------------------
// Header
ReadStringFLASH((uint8_t *)HeaderInfo, strlen(HeaderInfo), FALSE);
for (int i = 0; i < 4; i++) {
SetHexPrintOutput(data[i]);
}
Serial.print("\n");
//----------------------------------------
//----------------------------------------
// Payload
ReadStringFLASH((uint8_t *)PayloadInfo, strlen(PayloadInfo), FALSE);
//----------------------------------------
// Firmware Valid
SetHexPrintOutput(data[4]);
Serial.print(" | ");
//----------------------------------------
//----------------------------------------
// HwRev
for (int i = 5; i < 7; i++) {
SetHexPrintOutput(data[i]);
}
Serial.print(" | ");
//----------------------------------------
//----------------------------------------
// ParameterStartAddr
SetHexPrintOutput(data[7]);
Serial.print(" | ");
//----------------------------------------
//----------------------------------------
// LibraryLoaderVersion
for (int i = 8; i < 11; i++) {
SetHexPrintOutput(data[i]);
}
Serial.print(" | ");
//----------------------------------------
//----------------------------------------
// FwStartAddr
SetHexPrintOutput(data[11]);
Serial.print(" | ");
//----------------------------------------
//----------------------------------------
// FWVersion
for (int i = 12; i < 132; i++) {
SetHexPrintOutput(data[i]);
}
ReadStringFLASH((uint8_t *)RawInfoCloseIndent, strlen(RawInfoCloseIndent), FALSE);
//----------------------------------------
}
}
#endif
#ifdef PRINT_RAW_DATA
const char RawDataIndent[] PROGMEM = "#####################################################################################\nRow data from MGC3130 \n";
const char HeaderRawData[] PROGMEM = "Header: ";
const char PayloadRawData[] PROGMEM = "Payload: ";
const char RawDataCloseIndent[] PROGMEM = "\n#####################################################################################\n\n";
void MGC3130::PrintMGC3130RawData(void) {
if (data[3] = ID_DATA_OUTPUT) {
ReadStringFLASH((uint8_t *)RawDataIndent, strlen(RawDataIndent), FALSE);
//----------------------------------------
// Header
ReadStringFLASH((uint8_t *)HeaderRawData, strlen(HeaderRawData), FALSE);
for (int i = 0; i < 4; i++) {
SetHexPrintOutput(data[i]);
}
Serial.print("\n");
//----------------------------------------
//----------------------------------------
// Payload
ReadStringFLASH((uint8_t *)PayloadRawData, strlen(PayloadRawData), FALSE);
//----------------------------------------
// DataOutputConfigMask
for (int i = 4; i < 6; i++) {
SetHexPrintOutput(data[i]);
}
Serial.print(" | ");
//----------------------------------------
//----------------------------------------
// TimeStamp
SetHexPrintOutput(data[6]);
Serial.print(" | ");
//----------------------------------------
//----------------------------------------
// SystemInfo
SetHexPrintOutput(data[7]);
Serial.print(" | ");
//----------------------------------------
//----------------------------------------
// DSPStatus
for (int i = 8; i < 10; i++) {
SetHexPrintOutput(data[i]);
}
Serial.print(" | ");
//----------------------------------------
//----------------------------------------
// GestureInfo
for (int i = 10; i < 14; i++) {
SetHexPrintOutput(data[i]);
}
Serial.print(" | ");
//----------------------------------------
//----------------------------------------
// TouchInfo
for (int i = 14; i < 18; i++) {
SetHexPrintOutput(data[i]);
}
Serial.print(" | ");
//----------------------------------------
//----------------------------------------
// AirWheelInfo
for (int i = 18; i < 20; i++) {
SetHexPrintOutput(data[i]);
}
Serial.print(" | ");
//----------------------------------------
//----------------------------------------
// xyzPosition
for (int i = 20; i < 26; i++) {
SetHexPrintOutput(data[i]);
}
ReadStringFLASH((uint8_t *)RawDataCloseIndent, strlen(RawDataCloseIndent), FALSE);
//----------------------------------------
}
}
#endif
#ifdef PRINT_GESTURE_DATA
const char TouchSouth[] PROGMEM = "Touch South";
const char TouchWest[] PROGMEM = "Touch West";
const char TouchNorth[] PROGMEM = "Touch North";
const char TouchEast[] PROGMEM = "Touch East";
const char TouchCentre[] PROGMEM = "Touch Centre";
const char TapSouth[] PROGMEM = "Tap South";
const char TapWest[] PROGMEM = "Tap West";
const char TapNorth[] PROGMEM = "Tap North";
const char TapEast[] PROGMEM = "Tap East";
const char TapCentre[] PROGMEM = "Tap Centre";
const char DoubleTapSouth[] PROGMEM = "Double Tap South";
const char DoubleTapWest[] PROGMEM = "Double Tap West";
const char DoubleTapNorth[] PROGMEM = "Double Tap North";
const char DoubleTapEast[] PROGMEM = "Double Tap East";
const char DoubleTapCentre[] PROGMEM = "Double Tap Centre";
const char GestureWestToEast[] PROGMEM = "Gesture West to East";
const char GestureEastToWest[] PROGMEM = "Gesture East to West";
const char GestureNorthToSouth[] PROGMEM = "Gesture North to South";
const char GestureSouthToNorth[] PROGMEM = "Gesture South to North";
const char GestureEdgeWestToEast[] PROGMEM = "Gesture Edge West to East";
const char GestureEdgeEastToWest[] PROGMEM = "Gesture Edge East to West";
const char GestureEdgeNorthToSouth[] PROGMEM = "Gesture Edge North to South";
const char GestureEdgeSouthToNorth[] PROGMEM = "Gesture Edge South to North";
const char GestureClockWise[] PROGMEM = "Gesture Clock Wise";
const char GestureCounterClockWise[] PROGMEM = "Gesture Counter Clock Wise";
void MGC3130::PrintMGC3130Gesture(void) {
//----------------------------------------
if (GestureOutput.Bit.TouchSouth > 0) {
ReadStringFLASH((uint8_t *)TouchSouth, strlen(TouchSouth), TRUE);
}
if (GestureOutput.Bit.TouchWest > 0) {
ReadStringFLASH((uint8_t *)TouchWest, strlen(TouchWest), TRUE);
}
if (GestureOutput.Bit.TouchNorth > 0) {
ReadStringFLASH((uint8_t *)TouchNorth, strlen(TouchNorth), TRUE);
}
if (GestureOutput.Bit.TouchEast > 0) {
ReadStringFLASH((uint8_t *)TouchEast, strlen(TouchEast), TRUE);
}
if (GestureOutput.Bit.TouchCentre > 0) {
ReadStringFLASH((uint8_t *)TouchCentre, strlen(TouchCentre), TRUE);
}
//----------------------------------------
//----------------------------------------
if (GestureOutput.Bit.TapSouth > 0) {
ReadStringFLASH((uint8_t *)TapSouth, strlen(TapSouth), TRUE);
}
if (GestureOutput.Bit.TapWest > 0) {
ReadStringFLASH((uint8_t *)TapWest, strlen(TapWest), TRUE);
}
if (GestureOutput.Bit.TapNorth > 0) {
ReadStringFLASH((uint8_t *)TapNorth, strlen(TapNorth), TRUE);
}
if (GestureOutput.Bit.TapEast > 0) {
ReadStringFLASH((uint8_t *)TapEast, strlen(TapEast), TRUE);
}
if (GestureOutput.Bit.TapCentre > 0) {
ReadStringFLASH((uint8_t *)TapCentre, strlen(TapCentre), TRUE);
}
//----------------------------------------
//----------------------------------------
if (GestureOutput.Bit.DoubleTapSouth > 0) {
ReadStringFLASH((uint8_t *)DoubleTapSouth, strlen(DoubleTapSouth), TRUE);
}
if (GestureOutput.Bit.DoubleTapWest > 0) {
ReadStringFLASH((uint8_t *)DoubleTapWest, strlen(DoubleTapWest), TRUE);
}
if (GestureOutput.Bit.DoubleTapNorth > 0) {
ReadStringFLASH((uint8_t *)DoubleTapNorth, strlen(DoubleTapNorth), TRUE);
}
if (GestureOutput.Bit.DoubleTapEast > 0) {
ReadStringFLASH((uint8_t *)DoubleTapEast, strlen(DoubleTapEast), TRUE);
}
if (GestureOutput.Bit.DoubleTapCentre > 0) {
ReadStringFLASH((uint8_t *)DoubleTapCentre, strlen(DoubleTapCentre), TRUE);
}
//----------------------------------------
//----------------------------------------
if (GestureOutput.Bit.GestWestEast > 0) {
ReadStringFLASH((uint8_t *)GestureWestToEast, strlen(GestureWestToEast), TRUE);
}
if (GestureOutput.Bit.GestEastWest > 0) {
ReadStringFLASH((uint8_t *)GestureEastToWest, strlen(GestureEastToWest), TRUE);
}
if (GestureOutput.Bit.GestSouthNorth > 0) {
ReadStringFLASH((uint8_t *)GestureNorthToSouth, strlen(GestureNorthToSouth), TRUE);
}
if (GestureOutput.Bit.GestNorthSouth > 0) {
ReadStringFLASH((uint8_t *)GestureSouthToNorth, strlen(GestureSouthToNorth), TRUE);
}
if (GestureOutput.Bit.EdgeGestWestEast > 0) {
ReadStringFLASH((uint8_t *)GestureEdgeWestToEast, strlen(GestureEdgeWestToEast), TRUE);
}
if (GestureOutput.Bit.EdgeGestEastWest > 0) {
ReadStringFLASH((uint8_t *)GestureEdgeEastToWest, strlen(GestureEdgeEastToWest), TRUE);
}
if (GestureOutput.Bit.EdgeGestSouthNorth > 0) {
ReadStringFLASH((uint8_t *)GestureEdgeNorthToSouth, strlen(GestureEdgeNorthToSouth), TRUE);
}
if (GestureOutput.Bit.EdgeGestNorthSouth > 0) {
ReadStringFLASH((uint8_t *)GestureEdgeSouthToNorth, strlen(GestureEdgeSouthToNorth), TRUE);
}
if (GestureOutput.Bit.GestClockWise > 0) {
ReadStringFLASH((uint8_t *)GestureClockWise, strlen(GestureClockWise), TRUE);
}
if (GestureOutput.Bit.GestCounterClockWise > 0) {
ReadStringFLASH((uint8_t *)GestureCounterClockWise, strlen(GestureCounterClockWise), TRUE);
}
//----------------------------------------
}
#endif
#ifdef PRINT_XYZ
const char X[] PROGMEM = "The X coordinate is: ";
const char Y[] PROGMEM = "The Y coordinate is: ";
const char Z[] PROGMEM = "The Z coordinate is: ";
void MGC3130::PrintMGC3130xyz(void) {
if (Previous_x_pos != xyzPosition.xyzWord.x_pos) {
Previous_x_pos = xyzPosition.xyzWord.x_pos;
ReadStringFLASH((uint8_t *)X, strlen(X), TRUE);
Serial.println(xyzPosition.xyzWord.x_pos, DEC);
}
if (Previous_y_pos != xyzPosition.xyzWord.y_pos) {
Previous_y_pos = xyzPosition.xyzWord.y_pos;
ReadStringFLASH((uint8_t *)Y, strlen(Y), TRUE);
Serial.println(xyzPosition.xyzWord.y_pos, DEC);
}
if (Previous_z_pos != xyzPosition.xyzWord.z_pos) {
Previous_z_pos = xyzPosition.xyzWord.z_pos;
ReadStringFLASH((uint8_t *)Z, strlen(Z), TRUE);
Serial.println(xyzPosition.xyzWord.z_pos, DEC);
}
}
#endif
//----------------------------------------
// This function is used to read the string data by flash and print the data read on the screen
// It is useful to save SRAM memory instead that used the "println" function with a string type parameter
// The string type parameters are saved into FLASH memory using the "PROGMEM" function
void MGC3130::ReadStringFLASH(uint8_t *FlashPointer, uint8_t Lenght, boolean PrintCR) {
uint8_t k;
char myChar;
for (k = 0; k < Lenght; k++) {
myChar = pgm_read_byte_near(FlashPointer + k);
Serial.print(myChar);
}
if (PrintCR == TRUE) {
Serial.print("\n");
}
}
//----------------------------------------
void MGC3130::SetHexPrintOutput(uint8_t Data) {
if (Data < 0x10) {
Serial.print(0, HEX);
Serial.print(Data, HEX);
} else {
Serial.print(Data, HEX);
}
}