Hexiwear / Hexi_KW40Z

Dependents:   Hexi_Buttons_Example Hexi_Click_Relay-v2_Example Hexi_Click_Relay-v3_Example Hexi_Catch-the-dot_Game ... more

Files at this revision

API Documentation at this revision

Comitter:
cotigac
Date:
Mon Sep 19 05:45:31 2016 +0000
Parent:
1:f6f9b24aea57
Child:
3:9e92f113c671
Commit message:
Added BLE primitives -- not tested yet

Changed in this revision

Hexi_KW40Z.cpp Show annotated file Show diff for this revision Revisions of this file
Hexi_KW40Z.h Show annotated file Show diff for this revision Revisions of this file
--- a/Hexi_KW40Z.cpp	Mon Sep 19 03:39:36 2016 +0000
+++ b/Hexi_KW40Z.cpp	Mon Sep 19 05:45:31 2016 +0000
@@ -60,6 +60,14 @@
     alertCb = NULL;
     passkeyCb = NULL;
     notificationsCb = NULL;
+
+    kw40_version.ver_patchNumber = 0;
+    kw40_version.ver_minorNumber = 0;
+    kw40_version.ver_majorNumber = 0;
+    
+    activeTsiGroup = 0;
+    advertisementMode = 0;
+    linkState = 0;
     
     /* intialization finalized, signal to start the threads */
     mainThread.signal_set(START_THREAD);
@@ -70,45 +78,14 @@
 {
 }
 
-void KW40Z::attach_buttonUp(button_t btnFct)
-{
-    buttonUpCb = btnFct;
-}
-
-void KW40Z::attach_buttonDown(button_t btnFct)
-{
-    buttonDownCb = btnFct;
-}
-
-void KW40Z::attach_buttonLeft(button_t btnFct)
-{
-    buttonLeftCb = btnFct;
-}
-
-void KW40Z::attach_buttonRight(button_t btnFct)
-{
-    buttonRightCb = btnFct;
-}
-
-void KW40Z::attach_buttonSlide(button_t btnFct)
-{
-    buttonSlideCb = btnFct;
-}
-
-void KW40Z::attach_alert(alert_t alertFct)
-{
-    alertCb = alertFct;
-}
-
-void KW40Z::attach_passkey(passkey_t passkeyFct)
-{
-    passkeyCb = passkeyFct;
-}
-
-void KW40Z::attach_notifications(notifications_t notFct)
-{
-    notificationsCb = notFct;
-}
+void KW40Z::attach_buttonUp(button_t btnFct)    { buttonUpCb = btnFct;    }
+void KW40Z::attach_buttonDown(button_t btnFct)  { buttonDownCb = btnFct;  }
+void KW40Z::attach_buttonLeft(button_t btnFct)  { buttonLeftCb = btnFct;  }
+void KW40Z::attach_buttonRight(button_t btnFct) { buttonRightCb = btnFct; }
+void KW40Z::attach_buttonSlide(button_t btnFct) { buttonSlideCb = btnFct; }
+void KW40Z::attach_alert(alert_t alertFct)      { alertCb = alertFct;     }
+void KW40Z::attach_passkey(passkey_t passkeyFct){ passkeyCb = passkeyFct; }
+void KW40Z::attach_notifications(notifications_t notFct) { notificationsCb = notFct; }
 
 void KW40Z::rxStarter(void const *p) {
   KW40Z *instance = (KW40Z*)p;
@@ -120,61 +97,6 @@
   instance->mainTask();
 }
 
-void KW40Z::GetVersion()
-{
-    hostInterface_packet_t txPacket = {0};
-    
-    txPacket.start1     = gHostInterface_startByte1,
-    txPacket.start2     = gHostInterface_startByte2,
-    txPacket.type       = packetType_buildVersion,
-    txPacket.length     = 3,
-    txPacket.data[0]    = HEXIWEAR_VERSION_MAJOR;
-    txPacket.data[1]    = HEXIWEAR_VERSION_MINOR;
-    txPacket.data[2]    = HEXIWEAR_VERSION_PATCH;
-    txPacket.data[3]    = gHostInterface_trailerByte;
-    
-    SendPacket(&txPacket, false);
-}
-
-void KW40Z::SendPacket(hostInterface_packet_t * txPacket, bool confirmRequested)
-{
-    uint8_t retries = 0;
-    confirmReceived = false;
-    
-    do
-    {
-        char * txBuff = (char *)txPacket;
-        uint8_t length = txPacket->length + gHostInterface_headerSize + 1;
-        
-        if(confirmRequested == true)
-        {
-            txPacket->start2 |= 0x01;
-        }
-        
-        for(uint8_t i = 0; i < length; i++)
-        {
-            device.putc(*txBuff);
-            txBuff++;
-        }
-        
-#if defined (LIB_DEBUG)   
-        DebugPrintTxPacket(txPacket);
-#endif
-
-        retries++;
-        
-        #if defined (gHostInterface_RxConfirmationEnable)
-        if((confirmRequested == true) && (confirmReceived == false))
-        {
-            Thread::wait(gHostInterface_retransmitTimeout);
-        }
-        #endif
-    }
-    while((confirmRequested == true) && 
-          (confirmReceived == false) && 
-          (retries < gHostInterface_retransmitCount));
-}
-
 void KW40Z::mainTask(void)
 {
     mainThread.signal_wait(START_THREAD);
@@ -183,6 +105,13 @@
     pc.printf("MainTask Stared\r\n");
 #endif
 
+#if 0
+    SendGetActiveTsiGroup();
+    SendGetAdvertisementMode();
+    SendGetLinkState();
+    SendGetVersion();
+#endif
+
     while(1)
     {
         osEvent evt = queue.get();
@@ -245,6 +174,46 @@
 }
 #endif
 
+
+void KW40Z::SendPacket(hostInterface_packet_t * txPacket, bool confirmRequested)
+{
+    uint8_t retries = 0;
+    confirmReceived = false;
+    
+    do
+    {
+        char * txBuff = (char *)txPacket;
+        uint8_t length = txPacket->length + gHostInterface_headerSize + 1;
+        
+        if(confirmRequested == true)
+        {
+            txPacket->start2 |= 0x01;
+        }
+        
+        for(uint8_t i = 0; i < length; i++)
+        {
+            device.putc(*txBuff);
+            txBuff++;
+        }
+        
+#if defined (LIB_DEBUG)   
+        DebugPrintTxPacket(txPacket);
+#endif
+
+        retries++;
+        
+        #if defined (gHostInterface_RxConfirmationEnable)
+        if((confirmRequested == true) && (confirmReceived == false))
+        {
+            Thread::wait(gHostInterface_retransmitTimeout);
+        }
+        #endif
+    }
+    while((confirmRequested == true) && 
+          (confirmReceived == false) && 
+          (retries < gHostInterface_retransmitCount));
+}
+
 void KW40Z::ProcessBuffer()
 {    
     /* check if header has been received */
@@ -338,23 +307,6 @@
 #endif
 }
 
-void KW40Z::SendPacketOK()
-{
-    hostInterface_packet_t txPacket = {0};
-    
-    txPacket.start1     = gHostInterface_startByte1,
-    txPacket.start2     = gHostInterface_startByte2,
-    txPacket.type       = packetType_OK,
-    txPacket.length     = 0,
-    txPacket.data[0]    = gHostInterface_trailerByte;
-    
-    SendPacket(&txPacket, false);    
-}
-
-void KW40Z::ConfirmPacketOK()
-{
-}
-
 void KW40Z::ProcessReceivedPacket(hostInterface_packet_t * rxPacket)
 {
 #if defined (LIB_DEBUG) 
@@ -409,14 +361,17 @@
             
         /* TSI Status */
         case packetType_buttonsGroupSendActive:
+            activeTsiGroup = rxPacket->data[0];
             break;
             
         /* Advertisement Mode Info */
         case packetType_advModeSend:
+            advertisementMode = rxPacket->data[0];
             break;
         
         /* Link State */
         case packetType_linkStateSend:
+            linkState = rxPacket->data[0];
             break;
             
         /* ANCS Service Notification Received */
@@ -426,6 +381,9 @@
             
         /* Build version */
         case packetType_buildVersion:
+            kw40_version.ver_patchNumber = rxPacket->data[2];
+            kw40_version.ver_minorNumber = rxPacket->data[1];
+            kw40_version.ver_majorNumber = rxPacket->data[0];
             break;
       
         case packetType_OK:
@@ -436,3 +394,285 @@
             break;
     }
 }
+
+void KW40Z::SendBatteryLevel(uint8_t percentage)
+{
+    hostInterface_packet_t txPacket = {0};
+    
+    txPacket.start1     = gHostInterface_startByte1;
+    txPacket.start2     = gHostInterface_startByte2;
+    txPacket.type       = packetType_batteryLevel;
+    txPacket.length     = 1;
+    txPacket.data[0]    = percentage;
+    txPacket.data[1]    = gHostInterface_trailerByte;
+    
+    SendPacket(&txPacket, true);
+}
+
+void KW40Z::SendAccel(uint8_t x, uint8_t y, uint8_t z)
+{
+    hostInterface_packet_t txPacket = {0};
+    
+    txPacket.start1     = gHostInterface_startByte1;
+    txPacket.start2     = gHostInterface_startByte2;
+    txPacket.type       = packetType_accel;
+    txPacket.length     = 3;
+    txPacket.data[0]    = x;
+    txPacket.data[1]    = y;
+    txPacket.data[2]    = z;    
+    txPacket.data[3]    = gHostInterface_trailerByte;
+    
+    SendPacket(&txPacket, true);
+}
+
+void KW40Z::SendGyro(uint8_t x, uint8_t y, uint8_t z)
+{
+    hostInterface_packet_t txPacket = {0};
+    
+    txPacket.start1     = gHostInterface_startByte1;
+    txPacket.start2     = gHostInterface_startByte2;
+    txPacket.type       = packetType_gyro;
+    txPacket.length     = 3;
+    txPacket.data[0]    = x;
+    txPacket.data[1]    = y;
+    txPacket.data[2]    = z;    
+    txPacket.data[3]    = gHostInterface_trailerByte;
+    
+    SendPacket(&txPacket, true);
+}
+
+void KW40Z::SendMag(uint8_t x, uint8_t y, uint8_t z)
+{
+    hostInterface_packet_t txPacket = {0};
+    
+    txPacket.start1     = gHostInterface_startByte1;
+    txPacket.start2     = gHostInterface_startByte2;
+    txPacket.type       = packetType_magnet;
+    txPacket.length     = 3;
+    txPacket.data[0]    = x;
+    txPacket.data[1]    = y;
+    txPacket.data[2]    = z;    
+    txPacket.data[3]    = gHostInterface_trailerByte;
+    
+    SendPacket(&txPacket, true);
+}
+
+void KW40Z::SendAmbientLight(uint8_t percentage)
+{
+    hostInterface_packet_t txPacket = {0};
+    
+    txPacket.start1     = gHostInterface_startByte1;
+    txPacket.start2     = gHostInterface_startByte2;
+    txPacket.type       = packetType_ambiLight;
+    txPacket.length     = 1;
+    txPacket.data[0]    = percentage;
+    txPacket.data[1]    = gHostInterface_trailerByte;
+    
+    SendPacket(&txPacket, true);
+}
+
+void KW40Z::SendTemperature(uint16_t celsius)
+{
+    hostInterface_packet_t txPacket = {0};
+    
+    txPacket.start1     = gHostInterface_startByte1;
+    txPacket.start2     = gHostInterface_startByte2;
+    txPacket.type       = packetType_temperature;
+    txPacket.length     = 2;
+    memcpy(&txPacket.data[0],(uint8_t*)&celsius,txPacket.length);
+    txPacket.data[2]    = gHostInterface_trailerByte;
+    
+    SendPacket(&txPacket, true);
+}
+
+void KW40Z::SendHumidity(uint16_t percentage)
+{
+    hostInterface_packet_t txPacket = {0};
+    
+    txPacket.start1     = gHostInterface_startByte1;
+    txPacket.start2     = gHostInterface_startByte2;
+    txPacket.type       = packetType_humidity;
+    txPacket.length     = 2;
+    memcpy(&txPacket.data[0],(uint8_t*)&percentage,txPacket.length);
+    txPacket.data[2]    = gHostInterface_trailerByte;
+    
+    SendPacket(&txPacket, true);
+}
+
+void KW40Z::SendPressure(uint16_t pascal)
+{
+    hostInterface_packet_t txPacket = {0};
+    
+    txPacket.start1     = gHostInterface_startByte1;
+    txPacket.start2     = gHostInterface_startByte2;
+    txPacket.type       = packetType_pressure;
+    txPacket.length     = 2;
+    memcpy(&txPacket.data[0],(uint8_t*)&pascal,txPacket.length);
+    txPacket.data[2]    = gHostInterface_trailerByte;
+    
+    SendPacket(&txPacket, true);
+}
+
+void KW40Z::SendHearRate(uint8_t rate)
+{
+    hostInterface_packet_t txPacket = {0};
+    
+    txPacket.start1     = gHostInterface_startByte1;
+    txPacket.start2     = gHostInterface_startByte2;
+    txPacket.type       = packetType_steps;
+    txPacket.length     = 1;
+    txPacket.data[0]    = rate;
+    txPacket.data[1]    = gHostInterface_trailerByte;
+    
+    SendPacket(&txPacket, true);
+}
+
+void KW40Z::SendSteps(uint16_t steps)
+{
+    hostInterface_packet_t txPacket = {0};
+    
+    txPacket.start1     = gHostInterface_startByte1;
+    txPacket.start2     = gHostInterface_startByte2;
+    txPacket.type       = packetType_steps;
+    txPacket.length     = 2;
+    memcpy(&txPacket.data[0],(uint8_t*)&steps,txPacket.length);
+    txPacket.data[2]    = gHostInterface_trailerByte;
+    
+    SendPacket(&txPacket, true);
+}
+
+void KW40Z::SendCalories(uint16_t calories)
+{
+    hostInterface_packet_t txPacket = {0};
+    
+    txPacket.start1     = gHostInterface_startByte1;
+    txPacket.start2     = gHostInterface_startByte2;
+    txPacket.type       = packetType_calories;
+    txPacket.length     = 2;
+    memcpy(&txPacket.data[0],(uint8_t*)&calories,txPacket.length);
+    txPacket.data[2]    = gHostInterface_trailerByte;
+    
+    SendPacket(&txPacket, true);
+}
+
+void KW40Z::SendAlert(uint8_t *pData, uint8_t length)
+{
+    hostInterface_packet_t txPacket = {0};
+    
+    txPacket.start1     = gHostInterface_startByte1;
+    txPacket.start2     = gHostInterface_startByte2;
+    txPacket.type       = packetType_alertOut;
+    txPacket.length     = length;
+    memcpy(&txPacket.data[0],pData,length);
+    txPacket.data[length] = gHostInterface_trailerByte;
+    
+    SendPacket(&txPacket, true);
+}
+
+void KW40Z::ToggleTsiGroup(void)
+{
+    hostInterface_packet_t txPacket = {0};
+    
+    txPacket.start1     = gHostInterface_startByte1;
+    txPacket.start2     = gHostInterface_startByte2;
+    txPacket.type       = packetType_buttonsGroupToggleActive;
+    txPacket.length     = 0;
+    txPacket.data[0]    = gHostInterface_trailerByte;
+    
+    SendPacket(&txPacket, true);
+}
+
+void KW40Z::ToggleAdvertisementMode(void)
+{
+    hostInterface_packet_t txPacket = {0};
+    
+    txPacket.start1     = gHostInterface_startByte1;
+    txPacket.start2     = gHostInterface_startByte2;
+    txPacket.type       = packetType_advModeToggle;
+    txPacket.length     = 0;
+    txPacket.data[0]    = gHostInterface_trailerByte;
+    
+    SendPacket(&txPacket, true);
+}
+
+void KW40Z::SendSetApplicationMode(gui_current_app_t mode)
+{
+    hostInterface_packet_t txPacket = {0};
+    
+    txPacket.start1     = gHostInterface_startByte1;
+    txPacket.start2     = gHostInterface_startByte2;
+    txPacket.type       = packetType_appMode;
+    txPacket.length     = 1;
+    txPacket.data[0]    = (uint8_t)mode;
+    txPacket.data[1]    = gHostInterface_trailerByte;
+    
+    SendPacket(&txPacket, true);
+}
+
+void KW40Z::SendGetActiveTsiGroup(void)
+{
+    hostInterface_packet_t txPacket = {0};
+    
+    txPacket.start1     = gHostInterface_startByte1;
+    txPacket.start2     = gHostInterface_startByte2;
+    txPacket.type       = packetType_buttonsGroupGetActive;
+    txPacket.length     = 0;
+    txPacket.data[0]    = gHostInterface_trailerByte;
+    
+    SendPacket(&txPacket, false);
+}
+
+void KW40Z::SendGetAdvertisementMode(void)
+{
+    hostInterface_packet_t txPacket = {0};
+    
+    txPacket.start1     = gHostInterface_startByte1;
+    txPacket.start2     = gHostInterface_startByte2;
+    txPacket.type       = packetType_advModeGet;
+    txPacket.length     = 0;
+    txPacket.data[0]    = gHostInterface_trailerByte;
+    
+    SendPacket(&txPacket, false);
+}
+
+void KW40Z::SendGetLinkState(void)
+{
+    hostInterface_packet_t txPacket = {0};
+    
+    txPacket.start1     = gHostInterface_startByte1;
+    txPacket.start2     = gHostInterface_startByte2;
+    txPacket.type       = packetType_linkStateGet;
+    txPacket.length     = 0;
+    txPacket.data[0]    = gHostInterface_trailerByte;
+    
+    SendPacket(&txPacket, false);
+}
+
+void KW40Z::SendGetVersion(void)
+{
+    hostInterface_packet_t txPacket = {0};
+    
+    txPacket.start1     = gHostInterface_startByte1;
+    txPacket.start2     = gHostInterface_startByte2;
+    txPacket.type       = packetType_buildVersion;
+    txPacket.length     = 3;
+    txPacket.data[0]    = HEXIWEAR_VERSION_MAJOR;
+    txPacket.data[1]    = HEXIWEAR_VERSION_MINOR;
+    txPacket.data[2]    = HEXIWEAR_VERSION_PATCH;
+    txPacket.data[3]    = gHostInterface_trailerByte;
+    
+    SendPacket(&txPacket, false);
+}
+
+void KW40Z::SendPacketOK(void)
+{
+    hostInterface_packet_t txPacket = {0};
+    
+    txPacket.start1     = gHostInterface_startByte1;
+    txPacket.start2     = gHostInterface_startByte2;
+    txPacket.type       = packetType_OK;
+    txPacket.length     = 0;
+    txPacket.data[0]    = gHostInterface_trailerByte;
+    
+    SendPacket(&txPacket, false);    
+}
--- a/Hexi_KW40Z.h	Mon Sep 19 03:39:36 2016 +0000
+++ b/Hexi_KW40Z.h	Mon Sep 19 05:45:31 2016 +0000
@@ -143,14 +143,14 @@
     alertIn_type_timeUpdate          = 3,
 } hostInterface_alertIn_type_t;
 
+/** current app enum */
 typedef enum
 {
-    pressUp          = 0, /**< touch press up */
-    pressDown        = 1, /**< touch press down */
-    pressLeft        = 2, /**< touch press left */
-    pressRight       = 3, /**< touch press right */
-    slide            = 4, /**< touch slide */
-} hexi_buttons_t;
+  GUI_CURRENT_APP_IDLE                = 0, /**< no app active */
+  GUI_CURRENT_APP_SENSOR_TAG          = 2, /**< sensor tag */
+  GUI_CURRENT_APP_HEART_RATE          = 5, /**< heart rate */
+  GUI_CURRENT_APP_PEDOMETER           = 6  /**< Pedometer */
+} gui_current_app_t;
 
 typedef void (*button_t)(void);
 typedef void (*alert_t)(uint8_t *data, uint8_t length);
@@ -192,7 +192,27 @@
     void attach_passkey(passkey_t passkeyFct);
     void attach_notifications(notifications_t notFct);
 
-    void GetVersion();
+    void SendBatteryLevel(uint8_t percentage);
+    void SendAccel(uint8_t x, uint8_t y, uint8_t z);
+    void SendGyro(uint8_t x, uint8_t y, uint8_t z);
+    void SendMag(uint8_t x, uint8_t y, uint8_t z);
+    void SendAmbientLight(uint8_t percentage);
+    void SendTemperature(uint16_t celsius);
+    void SendHumidity(uint16_t percentage);
+    void SendPressure(uint16_t pascal);
+    void SendHearRate(uint8_t rate);
+    void SendSteps(uint16_t steps);
+    void SendCalories(uint16_t calories);
+    void SendAlert(uint8_t *pData, uint8_t length);
+    void SendSetApplicationMode(gui_current_app_t mode);
+    
+    void ToggleTsiGroup(void);
+    void ToggleAdvertisementMode(void);
+    
+    uint8_t GetTsiGroup(void);
+    uint8_t GetAdvertisementMode(void);
+    uint8_t GetLinkState(void);
+    hexiwear_version_t GetVersion(void);
   
 private:
     RawSerial device;    
@@ -215,6 +235,11 @@
     uint8_t * rxBuff;
     bool confirmReceived;
     
+    hexiwear_version_t kw40_version;
+    uint8_t activeTsiGroup;
+    uint8_t advertisementMode;
+    uint8_t linkState;
+    
     MemoryPool<hostInterface_packet_t, 16> mpool;
     Queue<hostInterface_packet_t, 16> queue;
 
@@ -225,8 +250,12 @@
     void ProcessReceivedPacket(hostInterface_packet_t * rxPacket);
     void SendPacket(hostInterface_packet_t * txPacket, bool confirmRequested);
     void SearchStartByte();
-    void SendPacketOK();
-    void ConfirmPacketOK();
+    
+    void SendPacketOK(void);
+    void SendGetActiveTsiGroup(void);
+    void SendGetAdvertisementMode(void);
+    void SendGetLinkState(void);
+    void SendGetVersion(void);
     
 #if defined (LIB_DEBUG) 
     void DebugPrintRxPacket();