mbed-os

Dependents:   cobaLCDJoyMotor_Thread odometry_omni_3roda_v3 odometry_omni_3roda_v1 odometry_omni_3roda_v2 ... more

Committer:
be_bryan
Date:
Mon Dec 11 17:54:04 2017 +0000
Revision:
0:b74591d5ab33
motor ++

Who changed what in which revision?

UserRevisionLine numberNew contents of line
be_bryan 0:b74591d5ab33 1 /*******************************************************************************
be_bryan 0:b74591d5ab33 2 * Copyright (C) 2017 Maxim Integrated Products, Inc., All Rights Reserved.
be_bryan 0:b74591d5ab33 3 *
be_bryan 0:b74591d5ab33 4 * Permission is hereby granted, free of charge, to any person obtaining a
be_bryan 0:b74591d5ab33 5 * copy of this software and associated documentation files (the "Software"),
be_bryan 0:b74591d5ab33 6 * to deal in the Software without restriction, including without limitation
be_bryan 0:b74591d5ab33 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
be_bryan 0:b74591d5ab33 8 * and/or sell copies of the Software, and to permit persons to whom the
be_bryan 0:b74591d5ab33 9 * Software is furnished to do so, subject to the following conditions:
be_bryan 0:b74591d5ab33 10 *
be_bryan 0:b74591d5ab33 11 * The above copyright notice and this permission notice shall be included
be_bryan 0:b74591d5ab33 12 * in all copies or substantial portions of the Software.
be_bryan 0:b74591d5ab33 13 *
be_bryan 0:b74591d5ab33 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
be_bryan 0:b74591d5ab33 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
be_bryan 0:b74591d5ab33 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
be_bryan 0:b74591d5ab33 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
be_bryan 0:b74591d5ab33 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
be_bryan 0:b74591d5ab33 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
be_bryan 0:b74591d5ab33 20 * OTHER DEALINGS IN THE SOFTWARE.
be_bryan 0:b74591d5ab33 21 *
be_bryan 0:b74591d5ab33 22 * Except as contained in this notice, the name of Maxim Integrated
be_bryan 0:b74591d5ab33 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
be_bryan 0:b74591d5ab33 24 * Products, Inc. Branding Policy.
be_bryan 0:b74591d5ab33 25 *
be_bryan 0:b74591d5ab33 26 * The mere transfer of this software does not imply any licenses
be_bryan 0:b74591d5ab33 27 * of trade secrets, proprietary technology, copyrights, patents,
be_bryan 0:b74591d5ab33 28 * trademarks, maskwork rights, or any other form of intellectual
be_bryan 0:b74591d5ab33 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
be_bryan 0:b74591d5ab33 30 * ownership rights.
be_bryan 0:b74591d5ab33 31 *******************************************************************************
be_bryan 0:b74591d5ab33 32 */
be_bryan 0:b74591d5ab33 33
be_bryan 0:b74591d5ab33 34 #include "mbed.h"
be_bryan 0:b74591d5ab33 35 #include "us_ticker_api.h"
be_bryan 0:b74591d5ab33 36 #include "MaximBLE.h"
be_bryan 0:b74591d5ab33 37 #include "wsf_types.h"
be_bryan 0:b74591d5ab33 38 #include "wsf_msg.h"
be_bryan 0:b74591d5ab33 39 #include "wsf_os.h"
be_bryan 0:b74591d5ab33 40 #include "wsf_buf.h"
be_bryan 0:b74591d5ab33 41 #include "wsf_sec.h"
be_bryan 0:b74591d5ab33 42 #include "wsf_timer.h"
be_bryan 0:b74591d5ab33 43 #include "hci_handler.h"
be_bryan 0:b74591d5ab33 44 #include "dm_handler.h"
be_bryan 0:b74591d5ab33 45 #include "l2c_handler.h"
be_bryan 0:b74591d5ab33 46 #include "att_handler.h"
be_bryan 0:b74591d5ab33 47 #include "smp_handler.h"
be_bryan 0:b74591d5ab33 48 #include "l2c_api.h"
be_bryan 0:b74591d5ab33 49 #include "att_api.h"
be_bryan 0:b74591d5ab33 50 #include "smp_api.h"
be_bryan 0:b74591d5ab33 51 #include "hci_drv.h"
be_bryan 0:b74591d5ab33 52 #include "hci_vs.h"
be_bryan 0:b74591d5ab33 53
be_bryan 0:b74591d5ab33 54 /* Number of WSF buffer pools */
be_bryan 0:b74591d5ab33 55 #define WSF_BUF_POOLS 5
be_bryan 0:b74591d5ab33 56
be_bryan 0:b74591d5ab33 57 /*! Free memory for pool buffers. */
be_bryan 0:b74591d5ab33 58 static uint8_t mainBufMem[1040];
be_bryan 0:b74591d5ab33 59
be_bryan 0:b74591d5ab33 60 /*! Default pool descriptor. */
be_bryan 0:b74591d5ab33 61 static wsfBufPoolDesc_t mainPoolDesc[WSF_BUF_POOLS] =
be_bryan 0:b74591d5ab33 62 {
be_bryan 0:b74591d5ab33 63 { 16, 8 },
be_bryan 0:b74591d5ab33 64 { 32, 4 },
be_bryan 0:b74591d5ab33 65 { 64, 2 },
be_bryan 0:b74591d5ab33 66 { 128, 2 },
be_bryan 0:b74591d5ab33 67 { 272, 1 }
be_bryan 0:b74591d5ab33 68 };
be_bryan 0:b74591d5ab33 69
be_bryan 0:b74591d5ab33 70 /* Store the Event signalling */
be_bryan 0:b74591d5ab33 71 bool isEventsSignaled = false;
be_bryan 0:b74591d5ab33 72
be_bryan 0:b74591d5ab33 73 /*! WSF handler ID */
be_bryan 0:b74591d5ab33 74 wsfHandlerId_t maximHandlerId;
be_bryan 0:b74591d5ab33 75 static volatile int reset_complete;
be_bryan 0:b74591d5ab33 76
be_bryan 0:b74591d5ab33 77 #ifdef BLE_HCI_UART
be_bryan 0:b74591d5ab33 78 static DigitalIn _rts(BT_CTS);
be_bryan 0:b74591d5ab33 79 static DigitalIn _cts(BT_RTS);
be_bryan 0:b74591d5ab33 80 static DigitalIn _clk(BT_CLK);
be_bryan 0:b74591d5ab33 81 static DigitalOut _shutdown(BT_RST, 0);
be_bryan 0:b74591d5ab33 82 static Serial _uart(BT_TX, BT_RX, 115200);
be_bryan 0:b74591d5ab33 83 #else
be_bryan 0:b74591d5ab33 84 /* Current mbed SPI API does not support HW slave selects. Configured in HCI driver. */
be_bryan 0:b74591d5ab33 85 static DigitalOut _csn(HCI_CSN, 1);
be_bryan 0:b74591d5ab33 86 static SPI _spi(HCI_MOSI, HCI_MISO, HCI_SCK, HCI_CSN);
be_bryan 0:b74591d5ab33 87 static DigitalOut _rst(HCI_RST, 0);
be_bryan 0:b74591d5ab33 88 static InterruptIn _irq(HCI_IRQ);
be_bryan 0:b74591d5ab33 89 #endif
be_bryan 0:b74591d5ab33 90
be_bryan 0:b74591d5ab33 91 /**
be_bryan 0:b74591d5ab33 92 * The singleton which represents the MaximBLE transport for the BLE.
be_bryan 0:b74591d5ab33 93 */
be_bryan 0:b74591d5ab33 94 static MaximBLE deviceInstance;
be_bryan 0:b74591d5ab33 95
be_bryan 0:b74591d5ab33 96 extern "C" {
be_bryan 0:b74591d5ab33 97
be_bryan 0:b74591d5ab33 98 /*
be_bryan 0:b74591d5ab33 99 * This function will signal to the user code by calling signalEventsToProcess.
be_bryan 0:b74591d5ab33 100 * It is registered and called into the Wsf Stack.
be_bryan 0:b74591d5ab33 101 */
be_bryan 0:b74591d5ab33 102 void wsf_mbed_ble_signal_event(void)
be_bryan 0:b74591d5ab33 103 {
be_bryan 0:b74591d5ab33 104 if (isEventsSignaled == false) {
be_bryan 0:b74591d5ab33 105 isEventsSignaled = true;
be_bryan 0:b74591d5ab33 106 deviceInstance.signalEventsToProcess(::BLE::DEFAULT_INSTANCE);
be_bryan 0:b74591d5ab33 107 }
be_bryan 0:b74591d5ab33 108 }
be_bryan 0:b74591d5ab33 109
be_bryan 0:b74591d5ab33 110 }
be_bryan 0:b74591d5ab33 111
be_bryan 0:b74591d5ab33 112 /**
be_bryan 0:b74591d5ab33 113 * BLE-API requires an implementation of the following function in order to
be_bryan 0:b74591d5ab33 114 * obtain its transport handle.
be_bryan 0:b74591d5ab33 115 */
be_bryan 0:b74591d5ab33 116 BLEInstanceBase *createBLEInstance(void)
be_bryan 0:b74591d5ab33 117 {
be_bryan 0:b74591d5ab33 118 return (&deviceInstance);
be_bryan 0:b74591d5ab33 119 }
be_bryan 0:b74591d5ab33 120
be_bryan 0:b74591d5ab33 121 MaximBLE::MaximBLE(void) : initialized(false), instanceID(BLE::DEFAULT_INSTANCE)
be_bryan 0:b74591d5ab33 122 {
be_bryan 0:b74591d5ab33 123 }
be_bryan 0:b74591d5ab33 124
be_bryan 0:b74591d5ab33 125 MaximBLE::~MaximBLE(void)
be_bryan 0:b74591d5ab33 126 {
be_bryan 0:b74591d5ab33 127 }
be_bryan 0:b74591d5ab33 128
be_bryan 0:b74591d5ab33 129 const char *MaximBLE::getVersion(void)
be_bryan 0:b74591d5ab33 130 {
be_bryan 0:b74591d5ab33 131 static char versionString[32];
be_bryan 0:b74591d5ab33 132
be_bryan 0:b74591d5ab33 133 strncpy(versionString, "unknown", sizeof(versionString));
be_bryan 0:b74591d5ab33 134
be_bryan 0:b74591d5ab33 135 return versionString;
be_bryan 0:b74591d5ab33 136 }
be_bryan 0:b74591d5ab33 137
be_bryan 0:b74591d5ab33 138 static void DmCback(dmEvt_t *pDmEvt)
be_bryan 0:b74591d5ab33 139 {
be_bryan 0:b74591d5ab33 140 dmEvt_t *pMsg;
be_bryan 0:b74591d5ab33 141
be_bryan 0:b74591d5ab33 142 if ((pMsg = (dmEvt_t*)WsfMsgAlloc(sizeof(dmEvt_t))) != NULL)
be_bryan 0:b74591d5ab33 143 {
be_bryan 0:b74591d5ab33 144 memcpy(pMsg, pDmEvt, sizeof(dmEvt_t));
be_bryan 0:b74591d5ab33 145 WsfMsgSend(maximHandlerId, pMsg);
be_bryan 0:b74591d5ab33 146 }
be_bryan 0:b74591d5ab33 147 }
be_bryan 0:b74591d5ab33 148
be_bryan 0:b74591d5ab33 149 static void maximHandler(wsfEventMask_t event, wsfMsgHdr_t *pMsg)
be_bryan 0:b74591d5ab33 150 {
be_bryan 0:b74591d5ab33 151 if (pMsg != NULL)
be_bryan 0:b74591d5ab33 152 {
be_bryan 0:b74591d5ab33 153 switch(pMsg->event)
be_bryan 0:b74591d5ab33 154 {
be_bryan 0:b74591d5ab33 155 case DM_RESET_CMPL_IND:
be_bryan 0:b74591d5ab33 156 reset_complete = 1;
be_bryan 0:b74591d5ab33 157 break;
be_bryan 0:b74591d5ab33 158 case DM_ADV_START_IND:
be_bryan 0:b74591d5ab33 159 break;
be_bryan 0:b74591d5ab33 160 case DM_ADV_STOP_IND:
be_bryan 0:b74591d5ab33 161 MaximGap::getInstance().advertisingStopped();
be_bryan 0:b74591d5ab33 162 break;
be_bryan 0:b74591d5ab33 163 case DM_SCAN_REPORT_IND:
be_bryan 0:b74591d5ab33 164 {
be_bryan 0:b74591d5ab33 165 hciLeAdvReportEvt_t *scanReport = (hciLeAdvReportEvt_t*)pMsg;
be_bryan 0:b74591d5ab33 166 MaximGap::getInstance().processAdvertisementReport( scanReport->addr,
be_bryan 0:b74591d5ab33 167 scanReport->rssi,
be_bryan 0:b74591d5ab33 168 (scanReport->eventType == DM_ADV_SCAN_RESPONSE) ? true : false,
be_bryan 0:b74591d5ab33 169 (GapAdvertisingParams::AdvertisingType_t)scanReport->eventType,
be_bryan 0:b74591d5ab33 170 scanReport->len,
be_bryan 0:b74591d5ab33 171 scanReport->pData);
be_bryan 0:b74591d5ab33 172 }
be_bryan 0:b74591d5ab33 173 break;
be_bryan 0:b74591d5ab33 174 case DM_CONN_OPEN_IND:
be_bryan 0:b74591d5ab33 175 {
be_bryan 0:b74591d5ab33 176 hciLeConnCmplEvt_t *connOpen = (hciLeConnCmplEvt_t*)pMsg;
be_bryan 0:b74591d5ab33 177 MaximGap::getInstance().setConnectionHandle(connOpen->handle);
be_bryan 0:b74591d5ab33 178 Gap::ConnectionParams_t params = { connOpen->connInterval, connOpen->connInterval, connOpen->connLatency, connOpen->supTimeout };
be_bryan 0:b74591d5ab33 179 Gap::AddressType_t ownAddrType;
be_bryan 0:b74591d5ab33 180 Gap::Address_t ownAddr;
be_bryan 0:b74591d5ab33 181 MaximGap::getInstance().getAddress(&ownAddrType, ownAddr);
be_bryan 0:b74591d5ab33 182 MaximGap::getInstance().processConnectionEvent(connOpen->handle,
be_bryan 0:b74591d5ab33 183 Gap::PERIPHERAL,
be_bryan 0:b74591d5ab33 184 (Gap::AddressType_t)connOpen->addrType,
be_bryan 0:b74591d5ab33 185 connOpen->peerAddr,
be_bryan 0:b74591d5ab33 186 ownAddrType,
be_bryan 0:b74591d5ab33 187 ownAddr,
be_bryan 0:b74591d5ab33 188 &params);
be_bryan 0:b74591d5ab33 189 }
be_bryan 0:b74591d5ab33 190 break;
be_bryan 0:b74591d5ab33 191 case DM_CONN_CLOSE_IND:
be_bryan 0:b74591d5ab33 192 {
be_bryan 0:b74591d5ab33 193 hciDisconnectCmplEvt_t *connClose = (hciDisconnectCmplEvt_t*)pMsg;
be_bryan 0:b74591d5ab33 194 MaximGap::getInstance().setConnectionHandle(DM_CONN_ID_NONE);
be_bryan 0:b74591d5ab33 195 MaximGap::getInstance().processDisconnectionEvent(connClose->handle, (Gap::DisconnectionReason_t)connClose->reason);
be_bryan 0:b74591d5ab33 196 }
be_bryan 0:b74591d5ab33 197 break;
be_bryan 0:b74591d5ab33 198 case DM_HW_ERROR_IND:
be_bryan 0:b74591d5ab33 199 {
be_bryan 0:b74591d5ab33 200 hciHwErrorEvt_t *error = (hciHwErrorEvt_t*)pMsg;
be_bryan 0:b74591d5ab33 201 printf("HCI Hardware Error 0x%02x occurred\n", error->code);
be_bryan 0:b74591d5ab33 202 }
be_bryan 0:b74591d5ab33 203 break;
be_bryan 0:b74591d5ab33 204 default:
be_bryan 0:b74591d5ab33 205 break;
be_bryan 0:b74591d5ab33 206 }
be_bryan 0:b74591d5ab33 207 }
be_bryan 0:b74591d5ab33 208 }
be_bryan 0:b74591d5ab33 209
be_bryan 0:b74591d5ab33 210 static void AppServerConnCback(dmEvt_t *pDmEvt)
be_bryan 0:b74591d5ab33 211 {
be_bryan 0:b74591d5ab33 212 dmConnId_t connId = (dmConnId_t)pDmEvt->hdr.param;
be_bryan 0:b74591d5ab33 213
be_bryan 0:b74591d5ab33 214 switch (pDmEvt->hdr.event)
be_bryan 0:b74591d5ab33 215 {
be_bryan 0:b74591d5ab33 216 case DM_CONN_OPEN_IND:
be_bryan 0:b74591d5ab33 217 /* set up CCC table with uninitialized (all zero) values */
be_bryan 0:b74591d5ab33 218 AttsCccInitTable(connId, NULL);
be_bryan 0:b74591d5ab33 219 break;
be_bryan 0:b74591d5ab33 220 case DM_CONN_CLOSE_IND:
be_bryan 0:b74591d5ab33 221 /* clear CCC table on connection close */
be_bryan 0:b74591d5ab33 222 AttsCccClearTable(connId);
be_bryan 0:b74591d5ab33 223 break;
be_bryan 0:b74591d5ab33 224 default:
be_bryan 0:b74591d5ab33 225 break;
be_bryan 0:b74591d5ab33 226 }
be_bryan 0:b74591d5ab33 227 }
be_bryan 0:b74591d5ab33 228
be_bryan 0:b74591d5ab33 229 ble_error_t MaximBLE::init(BLE::InstanceID_t instanceID, FunctionPointerWithContext<BLE::InitializationCompleteCallbackContext *> initCallback)
be_bryan 0:b74591d5ab33 230 {
be_bryan 0:b74591d5ab33 231 wsfHandlerId_t handlerId;
be_bryan 0:b74591d5ab33 232
be_bryan 0:b74591d5ab33 233 /* init OS subsystems */
be_bryan 0:b74591d5ab33 234 WsfTimerInit(1);
be_bryan 0:b74591d5ab33 235 WsfBufInit(sizeof(mainBufMem), mainBufMem, WSF_BUF_POOLS, mainPoolDesc);
be_bryan 0:b74591d5ab33 236 WsfSecInit();
be_bryan 0:b74591d5ab33 237
be_bryan 0:b74591d5ab33 238 /* init stack */
be_bryan 0:b74591d5ab33 239 handlerId = WsfOsSetNextHandler(HciHandler);
be_bryan 0:b74591d5ab33 240 HciHandlerInit(handlerId);
be_bryan 0:b74591d5ab33 241
be_bryan 0:b74591d5ab33 242 handlerId = WsfOsSetNextHandler(DmHandler);
be_bryan 0:b74591d5ab33 243 DmAdvInit();
be_bryan 0:b74591d5ab33 244 DmScanInit();
be_bryan 0:b74591d5ab33 245 DmConnInit();
be_bryan 0:b74591d5ab33 246 DmConnSlaveInit();
be_bryan 0:b74591d5ab33 247 DmSecInit();
be_bryan 0:b74591d5ab33 248 DmHandlerInit(handlerId);
be_bryan 0:b74591d5ab33 249
be_bryan 0:b74591d5ab33 250 handlerId = WsfOsSetNextHandler(L2cSlaveHandler);
be_bryan 0:b74591d5ab33 251 L2cSlaveHandlerInit(handlerId);
be_bryan 0:b74591d5ab33 252 L2cInit();
be_bryan 0:b74591d5ab33 253 L2cMasterInit();
be_bryan 0:b74591d5ab33 254 L2cSlaveInit();
be_bryan 0:b74591d5ab33 255
be_bryan 0:b74591d5ab33 256 handlerId = WsfOsSetNextHandler(AttHandler);
be_bryan 0:b74591d5ab33 257 AttHandlerInit(handlerId);
be_bryan 0:b74591d5ab33 258 AttsInit();
be_bryan 0:b74591d5ab33 259 AttsIndInit();
be_bryan 0:b74591d5ab33 260 AttcInit();
be_bryan 0:b74591d5ab33 261
be_bryan 0:b74591d5ab33 262 handlerId = WsfOsSetNextHandler(SmpHandler);
be_bryan 0:b74591d5ab33 263 SmpHandlerInit(handlerId);
be_bryan 0:b74591d5ab33 264 SmpiInit();
be_bryan 0:b74591d5ab33 265 SmprInit();
be_bryan 0:b74591d5ab33 266
be_bryan 0:b74591d5ab33 267 /* store handler ID */
be_bryan 0:b74591d5ab33 268 maximHandlerId = WsfOsSetNextHandler(maximHandler);
be_bryan 0:b74591d5ab33 269
be_bryan 0:b74591d5ab33 270 /* init HCI */
be_bryan 0:b74591d5ab33 271 #ifdef BLE_HCI_UART
be_bryan 0:b74591d5ab33 272 hciDrvInit(BT_TX, BT_RST, BT_CLK);
be_bryan 0:b74591d5ab33 273 #else
be_bryan 0:b74591d5ab33 274 _irq.disable_irq();
be_bryan 0:b74591d5ab33 275 _irq.rise(hciDrvIsr);
be_bryan 0:b74591d5ab33 276 _irq.fall(NULL);
be_bryan 0:b74591d5ab33 277 hciDrvInit(HCI_CSN, HCI_RST, HCI_IRQ);
be_bryan 0:b74591d5ab33 278 #endif
be_bryan 0:b74591d5ab33 279
be_bryan 0:b74591d5ab33 280 /* Register for stack callbacks */
be_bryan 0:b74591d5ab33 281 DmRegister(DmCback);
be_bryan 0:b74591d5ab33 282 DmConnRegister(DM_CLIENT_ID_APP, DmCback);
be_bryan 0:b74591d5ab33 283 AttConnRegister(AppServerConnCback);
be_bryan 0:b74591d5ab33 284
be_bryan 0:b74591d5ab33 285 /* Reset the device */
be_bryan 0:b74591d5ab33 286 reset_complete = 0;
be_bryan 0:b74591d5ab33 287 DmDevReset();
be_bryan 0:b74591d5ab33 288
be_bryan 0:b74591d5ab33 289 while (!reset_complete) {
be_bryan 0:b74591d5ab33 290 callDispatcher();
be_bryan 0:b74591d5ab33 291 }
be_bryan 0:b74591d5ab33 292
be_bryan 0:b74591d5ab33 293 initialized = true;
be_bryan 0:b74591d5ab33 294 BLE::InitializationCompleteCallbackContext context = {
be_bryan 0:b74591d5ab33 295 BLE::Instance(instanceID),
be_bryan 0:b74591d5ab33 296 BLE_ERROR_NONE
be_bryan 0:b74591d5ab33 297 };
be_bryan 0:b74591d5ab33 298 initCallback.call(&context);
be_bryan 0:b74591d5ab33 299 return BLE_ERROR_NONE;
be_bryan 0:b74591d5ab33 300 }
be_bryan 0:b74591d5ab33 301
be_bryan 0:b74591d5ab33 302 ble_error_t MaximBLE::shutdown(void)
be_bryan 0:b74591d5ab33 303 {
be_bryan 0:b74591d5ab33 304 return BLE_ERROR_NOT_IMPLEMENTED;
be_bryan 0:b74591d5ab33 305 }
be_bryan 0:b74591d5ab33 306
be_bryan 0:b74591d5ab33 307 void MaximBLE::waitForEvent(void)
be_bryan 0:b74591d5ab33 308 {
be_bryan 0:b74591d5ab33 309 static LowPowerTimeout nextTimeout;
be_bryan 0:b74591d5ab33 310 timestamp_t nextTimestamp;
be_bryan 0:b74591d5ab33 311 bool_t pTimerRunning;
be_bryan 0:b74591d5ab33 312
be_bryan 0:b74591d5ab33 313 callDispatcher();
be_bryan 0:b74591d5ab33 314
be_bryan 0:b74591d5ab33 315 if (wsfOsReadyToSleep()) {
be_bryan 0:b74591d5ab33 316 // setup an mbed timer for the next Wicentric timeout
be_bryan 0:b74591d5ab33 317 nextTimestamp = (timestamp_t)WsfTimerNextExpiration(&pTimerRunning) * 1000;
be_bryan 0:b74591d5ab33 318 if (pTimerRunning) {
be_bryan 0:b74591d5ab33 319 nextTimeout.attach_us(timeoutCallback, nextTimestamp);
be_bryan 0:b74591d5ab33 320 }
be_bryan 0:b74591d5ab33 321
be_bryan 0:b74591d5ab33 322 // go to sleep
be_bryan 0:b74591d5ab33 323 if (hciDrvReadyToSleep()) {
be_bryan 0:b74591d5ab33 324 // go to deep sleep
be_bryan 0:b74591d5ab33 325 deepsleep();
be_bryan 0:b74591d5ab33 326 hciDrvResume();
be_bryan 0:b74591d5ab33 327 }
be_bryan 0:b74591d5ab33 328 else {
be_bryan 0:b74591d5ab33 329 sleep();
be_bryan 0:b74591d5ab33 330 }
be_bryan 0:b74591d5ab33 331 }
be_bryan 0:b74591d5ab33 332 }
be_bryan 0:b74591d5ab33 333
be_bryan 0:b74591d5ab33 334 void MaximBLE::processEvents()
be_bryan 0:b74591d5ab33 335 {
be_bryan 0:b74591d5ab33 336 if (isEventsSignaled) {
be_bryan 0:b74591d5ab33 337 isEventsSignaled = false;
be_bryan 0:b74591d5ab33 338 callDispatcher();
be_bryan 0:b74591d5ab33 339 }
be_bryan 0:b74591d5ab33 340 }
be_bryan 0:b74591d5ab33 341
be_bryan 0:b74591d5ab33 342 void MaximBLE::timeoutCallback(void)
be_bryan 0:b74591d5ab33 343 {
be_bryan 0:b74591d5ab33 344 wsf_mbed_ble_signal_event();
be_bryan 0:b74591d5ab33 345 }
be_bryan 0:b74591d5ab33 346
be_bryan 0:b74591d5ab33 347 void MaximBLE::callDispatcher(void)
be_bryan 0:b74591d5ab33 348 {
be_bryan 0:b74591d5ab33 349 static uint32_t lastTimeUs = us_ticker_read();
be_bryan 0:b74591d5ab33 350 uint32_t currTimeUs, deltaTimeMs;
be_bryan 0:b74591d5ab33 351
be_bryan 0:b74591d5ab33 352 // Update the current Wicentric time
be_bryan 0:b74591d5ab33 353 currTimeUs = us_ticker_read();
be_bryan 0:b74591d5ab33 354 deltaTimeMs = (currTimeUs - lastTimeUs) / 1000;
be_bryan 0:b74591d5ab33 355 if (deltaTimeMs > 0) {
be_bryan 0:b74591d5ab33 356 WsfTimerUpdate(deltaTimeMs);
be_bryan 0:b74591d5ab33 357 lastTimeUs += deltaTimeMs * 1000;
be_bryan 0:b74591d5ab33 358 }
be_bryan 0:b74591d5ab33 359
be_bryan 0:b74591d5ab33 360 wsfOsDispatcher();
be_bryan 0:b74591d5ab33 361 }