diff options
author | Satish kumar sugasi <ssugas@codeaurora.org> | 2017-12-06 00:13:50 -0800 |
---|---|---|
committer | Satish kumar sugasi <ssugas@codeaurora.org> | 2017-12-06 00:13:50 -0800 |
commit | 1976d0714285850d8e0fc957b20eb4777fe49907 (patch) | |
tree | 05462ccffa1a77d79c5fb06e16f0be31daaf0828 /src/vfs/ant_native_chardev.c | |
parent | 1db5b42bde348c4db12d0d835ed7722b791fc9c6 (diff) | |
parent | 84a310bf2221c04e5d24586a7a46a6d8d4a69848 (diff) | |
download | android_external_ant-wireless_ant_native-1976d0714285850d8e0fc957b20eb4777fe49907.tar.gz android_external_ant-wireless_ant_native-1976d0714285850d8e0fc957b20eb4777fe49907.tar.bz2 android_external_ant-wireless_ant_native-1976d0714285850d8e0fc957b20eb4777fe49907.zip |
Merge remote-tracking branch 'remotes/quic/caf/github/master' into tip
Change-Id: I4d36f95e54ba096275188b273eb95c9ee71752c7
Diffstat (limited to 'src/vfs/ant_native_chardev.c')
-rw-r--r-- | src/vfs/ant_native_chardev.c | 148 |
1 files changed, 102 insertions, 46 deletions
diff --git a/src/vfs/ant_native_chardev.c b/src/vfs/ant_native_chardev.c index 759b385..2605776 100644 --- a/src/vfs/ant_native_chardev.c +++ b/src/vfs/ant_native_chardev.c @@ -34,6 +34,7 @@ #include <stdint.h> /* for uint64_t */ #include <sys/eventfd.h> /* For eventfd() */ #include <unistd.h> /* for read(), write(), and close() */ +#include <string.h> #include "ant_types.h" #include "ant_native.h" @@ -44,6 +45,10 @@ #include "ant_hci_defines.h" #include "ant_log.h" +#if (ANT_HCI_CHANNEL_SIZE > 0) || !defined(ANT_DEVICE_NAME) +#define MULTIPATH_TX +#endif + #if ANT_HCI_SIZE_SIZE > 1 #include "ant_utils.h" // Put HCI Size value across multiple bytes #endif @@ -170,16 +175,20 @@ ANTStatus ant_deinit(void) // Psuedocode: /* LOCK enable_LOCK - State callback: STATE = ENABLING - ant enable - IF ant_enable success - State callback: STATE = ENABLED - RESULT = SUCCESS - ELSE - ant disable - State callback: STATE = Current state - RESULT = FAILURE - ENDIF + IF current_state != ENABLED + State callback: STATE = ENABLING + ant enable + IF ant_enable success + State callback: STATE = ENABLED + RESULT = SUCCESS + ELSE + ant disable + State callback: STATE = Current state + RESULT = FAILURE + ENDIF + ELSE + RESULT = SUCCESS + ENDIF UNLOCK */ //////////////////////////////////////////////////////////////////// @@ -197,23 +206,28 @@ ANTStatus ant_enable_radio(void) } ANT_DEBUG_V("got stEnabledStatusLock in %s", __FUNCTION__); - if (g_fnStateCallback) { - g_fnStateCallback(RADIO_STATUS_ENABLING); - } + if (ant_radio_enabled_status() != RADIO_STATUS_ENABLED) { + if (g_fnStateCallback) { + g_fnStateCallback(RADIO_STATUS_ENABLING); + } - if (ant_enable() < 0) { - ANT_ERROR("ant enable failed: %s", strerror(errno)); + if (ant_enable() < 0) { + ANT_ERROR("ant enable failed: %s", strerror(errno)); - ant_disable(); + ant_disable(); - if (g_fnStateCallback) { - g_fnStateCallback(ant_radio_enabled_status()); + if (g_fnStateCallback) { + g_fnStateCallback(ant_radio_enabled_status()); + } + } else { + if (g_fnStateCallback) { + g_fnStateCallback(RADIO_STATUS_ENABLED); + } + + result_status = ANT_STATUS_SUCCESS; } } else { - if (g_fnStateCallback) { - g_fnStateCallback(RADIO_STATUS_ENABLED); - } - + ANT_DEBUG_D("Ignoring redundant enable call."); result_status = ANT_STATUS_SUCCESS; } @@ -336,10 +350,12 @@ out: // Psuedocode: /* LOCK enable_LOCK - State callback: STATE = DISABLING - ant disable - State callback: STATE = Current state - RESULT = SUCCESS + IF current_state != DISABLED + State callback: STATE = DISABLING + ant disable + State callback: STATE = Current state + ENDIF + RESULT = SUCCESS UNLOCK */ //////////////////////////////////////////////////////////////////// @@ -357,14 +373,18 @@ ANTStatus ant_disable_radio(void) } ANT_DEBUG_V("got stEnabledStatusLock in %s", __FUNCTION__); - if (g_fnStateCallback) { - g_fnStateCallback(RADIO_STATUS_DISABLING); - } + if (ant_radio_enabled_status() != RADIO_STATUS_DISABLED) { + if (g_fnStateCallback) { + g_fnStateCallback(RADIO_STATUS_DISABLING); + } - ant_disable(); + ant_disable(); - if (g_fnStateCallback) { - g_fnStateCallback(ant_radio_enabled_status()); + if (g_fnStateCallback) { + g_fnStateCallback(ant_radio_enabled_status()); + } + } else { + ANT_DEBUG_D("Ignoring redundant disable call."); } ret = ANT_STATUS_SUCCESS; @@ -723,6 +743,11 @@ ENDIF //////////////////////////////////////////////////////////////////// ANTStatus ant_tx_message(ANT_U8 ucLen, ANT_U8 *pucMesg) { +#if defined(MULTIPATH_TX) + ANT_BOOL bIsData; +#endif + ant_channel_type eTxChannel; + ant_channel_type eFlowChannel; ANTStatus status = ANT_STATUS_FAILED; // TODO ANT_HCI_MAX_MSG_SIZE is transport (driver) dependent. ANT_U8 txBuffer[ANT_HCI_MAX_MSG_SIZE]; @@ -736,12 +761,37 @@ ANTStatus ant_tx_message(ANT_U8 ucLen, ANT_U8 *pucMesg) goto out; } +#if defined(MULTIPATH_TX) +switch (pucMesg[ANT_MSG_ID_OFFSET]) { + case MESG_BROADCAST_DATA_ID: + case MESG_ACKNOWLEDGED_DATA_ID: + case MESG_BURST_DATA_ID: + case MESG_EXT_BROADCAST_DATA_ID: + case MESG_EXT_ACKNOWLEDGED_DATA_ID: + case MESG_EXT_BURST_DATA_ID: + case MESG_ADV_BURST_DATA_ID: + bIsData = ANT_TRUE; + break; + default: + bIsData = ANT_FALSE; + break; + } + + ANT_DEBUG_V("tx message: bIsData=%d", bIsData); +#endif + #if ANT_HCI_OPCODE_SIZE == 1 txBuffer[ANT_HCI_OPCODE_OFFSET] = ANT_HCI_OPCODE_TX; #elif ANT_HCI_OPCODE_SIZE > 1 #error "Specified ANT_HCI_OPCODE_SIZE not currently supported" #endif +#if ANT_HCI_CHANNEL_SIZE == 1 + txBuffer[ANT_HCI_CHANNEL_OFFSET] = bIsData ? ANT_HCI_DATA_CHANNEL : ANT_HCI_COMMAND_CHANNEL; +#elif ANT_HCI_OPCODE_SIZE > 1 +#error "Specified ANT_HCI_CHANNEL_SIZE not currently supported" +#endif + #if ANT_HCI_SIZE_SIZE == 1 txBuffer[ANT_HCI_SIZE_OFFSET] = ucLen; #elif ANT_HCI_SIZE_SIZE == 2 @@ -754,21 +804,24 @@ ANTStatus ant_tx_message(ANT_U8 ucLen, ANT_U8 *pucMesg) ANT_SERIAL(txBuffer, txMessageLength, 'T'); -#ifdef ANT_DEVICE_NAME // Single transport path - status = ant_tx_message_flowcontrol_wait(SINGLE_CHANNEL, SINGLE_CHANNEL, txMessageLength, txBuffer); +#ifdef ANT_DEVICE_NAME + eTxChannel = SINGLE_CHANNEL; + eFlowChannel = SINGLE_CHANNEL; +#else + eTxChannel = bIsData ? DATA_CHANNEL : COMMAND_CHANNEL; + eFlowChannel = COMMAND_CHANNEL; +#endif + +#if !defined(MULTIPATH_TX) // Single transport path + status = ant_tx_message_flowcontrol_wait(eTxChannel, eFlowChannel, txMessageLength, txBuffer); #else // Separate data/command paths - switch (txBuffer[ANT_HCI_DATA_OFFSET + ANT_MSG_ID_OFFSET]) { - case MESG_BROADCAST_DATA_ID: - case MESG_ACKNOWLEDGED_DATA_ID: - case MESG_BURST_DATA_ID: - case MESG_EXT_BROADCAST_DATA_ID: - case MESG_EXT_ACKNOWLEDGED_DATA_ID: - case MESG_EXT_BURST_DATA_ID: - case MESG_ADV_BURST_DATA_ID: - status = ant_tx_message_flowcontrol_wait(DATA_CHANNEL, COMMAND_CHANNEL, txMessageLength, txBuffer); - break; - default: - status = ant_tx_message_flowcontrol_none(COMMAND_CHANNEL, txMessageLength, txBuffer); + if (bIsData) + { + status = ant_tx_message_flowcontrol_wait(eTxChannel, eFlowChannel, txMessageLength, txBuffer); + } + else + { + status = ant_tx_message_flowcontrol_none(eTxChannel, txMessageLength, txBuffer); } #endif // Separate data/command paths @@ -897,6 +950,9 @@ int ant_enable(void) iRet = 0; out: + if (stRxThreadInfo.stRxThread == 0) { + stRxThreadInfo.ucRunThread = 0; + } ANT_FUNC_END(); return iRet; } |