Hexiwear library for communicating with the on-board KW40Z BLE device. KW40Z handles also the touch buttons.
Dependents: Hexi_BLE_Example_Modified Hexi_BLE_Example_ModifiedPOTATO
Fork of Hexi_KW40Z by
Diff: Hexi_KW40Z.cpp
- Revision:
- 9:8058541a8e2d
- Parent:
- 8:2b9b24f3154d
- Child:
- 10:1bed2b28ee18
--- a/Hexi_KW40Z.cpp Sun Sep 25 05:50:22 2016 +0000 +++ b/Hexi_KW40Z.cpp Mon Sep 26 01:37:59 2016 +0000 @@ -34,12 +34,12 @@ */ #include "Hexi_KW40Z.h" - -#if defined (LIB_DEBUG) -RawSerial pc(USBTX, USBRX); // tx, rx + +KW40Z::KW40Z(PinName txPin,PinName rxPin) : +#if defined (LIB_DEBUG) +pc(USBTX, USBRX), #endif - -KW40Z::KW40Z(PinName txPin,PinName rxPin) : device(txPin, rxPin), mainThread(osPriorityNormal,1024), rxThread(osPriorityNormal,1024) +device(txPin, rxPin), rxThread(osPriorityNormal,1024), mainThread(osPriorityNormal,1024) { #if defined (LIB_DEBUG) pc.baud(115200); @@ -71,8 +71,8 @@ bondPassKey = 0; /* intialization finalized, signal to start the threads */ - mainThread.start(this,&KW40Z::mainTask); rxThread.start(this, &KW40Z::rxTask); + mainThread.start(this,&KW40Z::mainTask); } KW40Z::~KW40Z(void) @@ -104,9 +104,9 @@ osEvent evt = queue.get(); if (evt.status == osEventMessage) { - hostInterface_packet_t *rxPacket = (hostInterface_packet_t*)evt.value.p; - ProcessReceivedPacket(rxPacket); - mpool.free(rxPacket); + hostInterface_packet_t *packet = (hostInterface_packet_t*)evt.value.p; + ProcessPacket(packet); + mpool.free(packet); } } } @@ -133,56 +133,61 @@ } } -#if defined (LIB_DEBUG) -void KW40Z::DebugPrintTxPacket(hostInterface_packet_t * txPacket) +void KW40Z::SendPacket(hostInterface_packet_t * txPacket, bool confirmRequested) { - char * txBuff = (char *)txPacket; - uint8_t length = txPacket->length + gHostInterface_headerSize + 1; + /* copy txPacket to the mem pool */ + hostInterface_packet_t *packet = mpool.alloc(); + memcpy(packet, txPacket, sizeof(hostInterface_packet_t)); + + /* Set the TX bit in the Start 2 byte */ + packet->start2 |= gHostInterface_txPacketMask; + + if (true == confirmRequested) + { + /* Set the confirm requested bit in the Start 2 byte */ + packet->start2 |= gHostInterface_rxConfirmMask; + } + +#if defined (LIB_DEBUG) + pc.printf("SendPacket: "); + DebugPrintPacket(packet); +#endif - pc.printf("Tx: "); - for(uint8_t i = 0; i < length; i++) - { - pc.printf("%02X ",*txBuff); - txBuff++; - } - pc.printf("\r\n"); + /* send message to main task */ + queue.put(packet); } -void KW40Z::DebugPrintRxPacket() -{ - pc.printf("RX: "); - for(uint8_t * i = (uint8_t*)&hostInterface_rxPacket; i<rxBuff; i++) - { - pc.printf("%02X ",*i); - } - pc.printf("\r\n"); -} -#endif - - -void KW40Z::SendPacket(hostInterface_packet_t * txPacket, bool confirmRequested) +void KW40Z::SendInternal(hostInterface_packet_t * txPacket) { uint8_t retries = 0; + bool confirmRequested = false; confirmReceived = false; +#if defined (LIB_DEBUG) + pc.printf("SendInternal: "); + DebugPrintPacket(txPacket); +#endif + + if(gHostInterface_rxConfirmMask == (txPacket->start2 & gHostInterface_rxConfirmMask)) + { + confirmRequested = true; + pc.printf("Found confirmRequested\r\n"); + } + 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); +#if defined (LIB_DEBUG) + pc.printf("TX: "); + DebugPrintPacket(txPacket); #endif retries++; @@ -210,8 +215,8 @@ (hostInterface_rxPacket.length > gHostInterface_dataSize)) { #if defined (LIB_DEBUG) - DebugPrintRxPacket(); - pc.printf("check header failed\r\n"); + pc.printf("Check header failed: "); + DebugPrintPacket(&hostInterface_rxPacket); #endif SearchStartByte(); @@ -225,8 +230,8 @@ if(gHostInterface_trailerByte != hostInterface_rxPacket.data[hostInterface_rxPacket.length]) { #if defined (LIB_DEBUG) - DebugPrintRxPacket(); - pc.printf("trailer byte failed\r\n"); + pc.printf("Trailer byte failed: "); + DebugPrintPacket(&hostInterface_rxPacket); #endif SearchStartByte(); @@ -246,8 +251,9 @@ memcpy(rxPacket, &hostInterface_rxPacket, sizeof(hostInterface_packet_t)); queue.put(rxPacket); -#if defined (LIB_DEBUG) - DebugPrintRxPacket(); +#if defined (LIB_DEBUG) + pc.printf("RX: "); + DebugPrintPacket(&hostInterface_rxPacket); #endif /* reset buffer position */ rxBuff = (uint8_t*)&hostInterface_rxPacket; @@ -287,100 +293,113 @@ } #if defined (LIB_DEBUG) - pc.printf("search done\r\n"); - DebugPrintRxPacket(); + pc.printf("Search done: "); + DebugPrintPacket(&hostInterface_rxPacket); #endif } -void KW40Z::ProcessReceivedPacket(hostInterface_packet_t * rxPacket) +void KW40Z::ProcessPacket(hostInterface_packet_t * packet) { -#if defined (LIB_DEBUG) - pc.printf("packet found %d\r\n", rxPacket->type); +#if defined (LIB_DEBUG) + pc.printf("ProcessPacket: "); + DebugPrintPacket(packet); +#endif + + /* check if this is a TX packet */ + if(gHostInterface_txPacketMask == (packet->start2 & gHostInterface_txPacketMask)) + { + /* revert back the TX bit in Start2 byte */ + packet->start2 &= ~gHostInterface_txPacketMask; + + /* This is not a received packet, so call SendInternal */ + SendInternal(packet); + } + else + { +#ifdef gHostInterface_TxConfirmationEnable + /* acknowledge the packet reception if requested by sender */ + if(gHostInterface_rxConfirmMask == (packet->start2 & gHostInterface_rxConfirmMask)) + { + SendPacketOK(); + } #endif -#ifdef gHostInterface_TxConfirmationEnable - // acknowledge the packet reception - if ( 1 == ( rxPacket->start2 & 0x01 ) ) - { - SendPacketOK(); - } -#endif - - switch(rxPacket->type) - { - /* button presses */ - case packetType_pressUp: - if(buttonUpCb != NULL) buttonUpCb(); - break; + switch(packet->type) + { + /* button presses */ + case packetType_pressUp: + if(buttonUpCb != NULL) buttonUpCb(); + break; + + case packetType_pressDown: + if(buttonDownCb != NULL) buttonDownCb(); + break; + + case packetType_pressLeft: + if(buttonLeftCb != NULL) buttonLeftCb(); + break; + + case packetType_pressRight: + if(buttonRightCb != NULL) buttonRightCb(); + break; - case packetType_pressDown: - if(buttonDownCb != NULL) buttonDownCb(); - break; - - case packetType_pressLeft: - if(buttonLeftCb != NULL) buttonLeftCb(); - break; - - case packetType_pressRight: - if(buttonRightCb != NULL) buttonRightCb(); - break; - - case packetType_slide: - if(buttonSlideCb != NULL) buttonSlideCb(); - break; - - /* Alert Service */ - case packetType_alertIn: - if(alertCb != NULL) alertCb(&rxPacket->data[0], rxPacket->length); - break; + case packetType_slide: + if(buttonSlideCb != NULL) buttonSlideCb(); + break; - /* Passkey for pairing received */ - case packetType_passDisplay: - if(passkeyCb != NULL) - { - memcpy((uint8_t *)&bondPassKey,&rxPacket->data[0], 3); - passkeyCb(); - } - break; - - /* OTAP messages */ - case packetType_otapCompleted: - case packetType_otapFailed: - break; - - /* TSI Status */ - case packetType_buttonsGroupSendActive: - activeTsiGroup = rxPacket->data[0]; - break; + /* Alert Service */ + case packetType_alertIn: + if(alertCb != NULL) alertCb(&packet->data[0], packet->length); + break; - /* Advertisement Mode Info */ - case packetType_advModeSend: - advertisementMode = rxPacket->data[0]; - break; - - /* Link State */ - case packetType_linkStateSend: - linkState = rxPacket->data[0]; - break; + /* Passkey for pairing received */ + case packetType_passDisplay: + if(passkeyCb != NULL) + { + memcpy((uint8_t *)&bondPassKey,&packet->data[0], 3); + passkeyCb(); + } + break; + + /* OTAP messages */ + case packetType_otapCompleted: + case packetType_otapFailed: + break; + + /* TSI Status */ + case packetType_buttonsGroupSendActive: + activeTsiGroup = packet->data[0]; + break; + + /* Advertisement Mode Info */ + case packetType_advModeSend: + advertisementMode = packet->data[0]; + break; - /* ANCS Service Notification Received */ - case packetType_notification: - if(notificationsCb != NULL) notificationsCb(rxPacket->data[0], rxPacket->data[1]); - break; - - /* 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: - /* do nothing, the flag is set in the RxTask */ - break; - - default: - break; + /* Link State */ + case packetType_linkStateSend: + linkState = packet->data[0]; + break; + + /* ANCS Service Notification Received */ + case packetType_notification: + if(notificationsCb != NULL) notificationsCb(packet->data[0], packet->data[1]); + break; + + /* Build version */ + case packetType_buildVersion: + kw40_version.ver_patchNumber = packet->data[2]; + kw40_version.ver_minorNumber = packet->data[1]; + kw40_version.ver_majorNumber = packet->data[0]; + break; + + case packetType_OK: + /* do nothing, passthrough, the flag is set in the RxTask */ + break; + + default: + break; + } } } @@ -660,7 +679,7 @@ txPacket.data[2] = HEXIWEAR_VERSION_PATCH; txPacket.data[3] = gHostInterface_trailerByte; - SendPacket(&txPacket, false); + SendPacket(&txPacket, true); } void KW40Z::SendPacketOK(void) @@ -699,4 +718,19 @@ uint8_t KW40Z::GetTsiGroup(void) { return activeTsiGroup; -} +} + +#if defined (LIB_DEBUG) +void KW40Z::DebugPrintPacket(hostInterface_packet_t * packet) +{ + char * idx = (char *)packet; + uint8_t length = packet->length + gHostInterface_headerSize + 1; + + for(uint8_t i = 0; i < length; i++) + { + pc.printf("%02X ",*idx); + idx++; + } + pc.printf("\r\n"); +} +#endif