Hover!( Microchip MGC3130 ) library. Now, it is development version. http://www.hoverlabs.co/#hover https://www.switch-science.com/catalog/2124/

Dependents:   MjHover_Hello

Files at this revision

API Documentation at this revision

Comitter:
matsujirushi
Date:
Sat Apr 04 14:51:27 2015 +0000
Parent:
6:8d68ac1bab97
Commit message:
Added MjHover2 class.

Changed in this revision

MjHover.cpp Show annotated file Show diff for this revision Revisions of this file
MjHover.h Show annotated file Show diff for this revision Revisions of this file
MjHover2.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/MjHover.cpp	Fri Apr 03 13:56:44 2015 +0000
+++ b/MjHover.cpp	Sat Apr 04 14:51:27 2015 +0000
@@ -8,7 +8,7 @@
 
 void MjHover::begin()
 {
-    this->Reset();
+    MjHoverBase::Reset();
     wait_ms(1000);
 }
 
@@ -18,7 +18,7 @@
 
 bool MjHover::getStatus()
 {
-    if (this->DataAvailable())
+    if (MjHoverBase::DataAvailable())
     {
         return false;
     }
@@ -30,7 +30,7 @@
     uint8_t id;
     uint8_t payload[255 - 4];
     uint8_t readPayloadSize;
-    if (!ReadMessage(&id, payload, sizeof (payload), &readPayloadSize))
+    if (!MjHoverBase::ReadMessage(&id, payload, sizeof (payload), &readPayloadSize))
     {
         return 0x00;
     }
@@ -90,7 +90,3 @@
 
 } // namespace matsujirushi
 
-
-
-
-
--- a/MjHover.h	Fri Apr 03 13:56:44 2015 +0000
+++ b/MjHover.h	Sat Apr 04 14:51:27 2015 +0000
@@ -53,6 +53,63 @@
     
 };
 
+class MjHover2 : private MjHoverBase
+{
+public:
+    enum GestureInfoType
+    {
+        FLICK_WEST_TO_EAST       ,
+        FLICK_EAST_TO_WEST       ,
+        FLICK_SOUTH_TO_NORTH     ,
+        FLICK_NORTH_TO_SOUTH     ,
+        EDGE_FLICK_WEST_TO_EAST  ,
+        EDGE_FLICK_EAST_TO_WEST  ,
+        EDGE_FLICK_SOUTH_TO_NORTH,
+        EDGE_FLICK_NORTH_TO_SOUTH,
+    };
+    enum TouchInfoType
+    {
+        TOUCH_SOUTH       = 0x00000001,
+        TOUCH_WEST        = 0x00000002,
+        TOUCH_NORTH       = 0x00000004,
+        TOUCH_EAST        = 0x00000008,
+        TOUCH_CENTER      = 0x00000010,
+        TAP_SOUTH         = 0x00000020,
+        TAP_WEST          = 0x00000040,
+        TAP_NORTH         = 0x00000080,
+        TAP_EAST          = 0x00000100,
+        TAP_CENTER        = 0x00000200,
+        DOUBLE_TAP_SOUTH  = 0x00000400,
+        DOUBLE_TAP_WEST   = 0x00000800,
+        DOUBLE_TAP_NORTH  = 0x00001000,
+        DOUBLE_TAP_EAST   = 0x00002000,
+        DOUBLE_TAP_CENTER = 0x00004000,
+    };
+    struct XyzPositionType
+    {
+        uint16_t X;
+        uint16_t Y;
+        uint16_t Z;
+    };
+    struct
+    {
+        bool GestureInfoValid;
+        GestureInfoType GestureInfo;
+
+        bool TouchInfoValid;
+        TouchInfoType TouchInfo;
+        
+        bool XyzPositionValid;
+        XyzPositionType XyzPosition;
+    }
+    SensorData;
+        
+
+    MjHover2(I2C* i2c, uint8_t address, DigitalInOut* ts_n, DigitalInOut* reset_n);
+    void Reset();
+    void Task();
+};
+
 } // namespace matsujirushi
 
 #endif
@@ -60,3 +117,4 @@
 
 
 
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MjHover2.cpp	Sat Apr 04 14:51:27 2015 +0000
@@ -0,0 +1,104 @@
+#include "MjHover.h"
+
+namespace matsujirushi {
+
+MjHover2::MjHover2(I2C* i2c, uint8_t address, DigitalInOut* ts_n, DigitalInOut* reset_n) : MjHoverBase(i2c, address, ts_n, reset_n)
+{
+}
+
+void MjHover2::Reset()
+{
+    MjHoverBase::Reset();
+    
+    while (!MjHoverBase::DataAvailable())
+    {
+    }
+    
+    uint8_t id;
+    uint8_t payload[255 - 4];
+    uint8_t readPayloadSize;
+    ReadMessage(&id, payload, sizeof (payload), &readPayloadSize);
+}
+
+void MjHover2::Task()
+{
+    uint8_t id;
+    uint8_t payload[255 - 4];
+    uint8_t readPayloadSize;
+    if (MjHoverBase::ReadMessage(&id, payload, sizeof (payload), &readPayloadSize))
+    {
+        if (id == 0x91) // SENSOR_DATA_OUTPUT
+        {
+            this->SensorData.GestureInfoValid = false;
+            this->SensorData.TouchInfoValid   = false;
+            this->SensorData.XyzPositionValid = false;
+            
+            uint16_t dataOutputConfigMask = payload[0] | payload[1] << 8;
+            uint8_t systemInfo = payload[3];
+            uint8_t* data = &payload[4];
+            if (dataOutputConfigMask & 0x0001)  // DSPStatus
+            {
+                data += 2;
+            }
+            if (dataOutputConfigMask & 0x0002)  // GestureInfo
+            {
+                uint32_t gestureInfo = data[0] | data[1] << 8 | data[2] << 16 | data[3] << 24;
+                uint8_t gesture      =  gestureInfo & 0x0000003f;
+                uint8_t gestureClass = (gestureInfo & 0x0000f000) >> 12;
+                bool edgeFlick       =  gestureInfo & 0x00010000 ? true : false;
+
+                if (gestureClass == 1)  // Flick gesture
+                {
+                    if (gesture == 2)
+                    {
+                        this->SensorData.GestureInfo = edgeFlick ? EDGE_FLICK_WEST_TO_EAST : FLICK_WEST_TO_EAST;
+                        this->SensorData.GestureInfoValid = true;
+                    }
+                    else if (gesture == 3)
+                    {
+                        this->SensorData.GestureInfo = edgeFlick ? EDGE_FLICK_EAST_TO_WEST : FLICK_EAST_TO_WEST;
+                        this->SensorData.GestureInfoValid = true;
+                    }
+                    else if (gesture == 4)
+                    {
+                        this->SensorData.GestureInfo = edgeFlick ? EDGE_FLICK_SOUTH_TO_NORTH : FLICK_SOUTH_TO_NORTH;
+                        this->SensorData.GestureInfoValid = true;
+                    }
+                    else if (gesture == 5)
+                    {
+                        this->SensorData.GestureInfo = edgeFlick ? EDGE_FLICK_NORTH_TO_SOUTH : FLICK_NORTH_TO_SOUTH;
+                        this->SensorData.GestureInfoValid = true;
+                    }
+                }
+                data += 4;
+            }
+            if (dataOutputConfigMask & 0x0004)  // TouchInfo
+            {
+                TouchInfoType touchInfo = (TouchInfoType)((data[0] | data[1] << 8) & 0x7fff);
+                if (touchInfo != 0)
+                {
+                    this->SensorData.TouchInfo = touchInfo;
+                    this->SensorData.TouchInfoValid = true;
+                }
+                data += 4;
+            }
+            if (dataOutputConfigMask & 0x0008)  // AirWheelInfo
+            {
+                data += 2;
+            }
+            if (dataOutputConfigMask & 0x0010)  // xyzPosition
+            {
+                if (systemInfo & 0x01)
+                {
+                    this->SensorData.XyzPosition.X = data[0] | data[1] << 8;
+                    this->SensorData.XyzPosition.Y = data[2] | data[3] << 8;
+                    this->SensorData.XyzPosition.Z = data[4] | data[5] << 8;
+                    this->SensorData.XyzPositionValid = true;
+                }
+                data += 6;
+            }
+        }
+    }
+}
+
+} // namespace matsujirushi