47 #include "mxc_config.h"
50 #include "wsf_types.h"
53 #include "wsf_trace.h"
83 #define GREEN_LED_PIN 6
86 #define FIT_MSG_START 0xA0
111 static const appSlaveCfg_t fitSlaveCfg = {
124 static const appSecCfg_t fitSecCfg = {
133 static const appUpdateCfg_t fitUpdateCfg = {
144 static const hrpsCfg_t fitHrpsCfg = {
149 static const basCfg_t fitBasCfg = {
160 static const uint8_t fitAdvDataDisc[] =
165 DM_FLAG_LE_GENERAL_DISC |
166 DM_FLAG_LE_BREDR_NOT_SUP,
170 DM_ADV_TYPE_TX_POWER,
176 UINT16_TO_BYTES(ATT_UUID_HEART_RATE_SERVICE),
177 UINT16_TO_BYTES(ATT_UUID_DEVICE_INFO_SERVICE),
178 UINT16_TO_BYTES(ATT_UUID_BATTERY_SERVICE)
182 static const uint8_t fitScanDataDisc[] =
186 DM_ADV_TYPE_LOCAL_NAME,
218 {GATT_SC_CH_CCC_HDL, ATT_CLIENT_CFG_INDICATE, DM_SEC_LEVEL_NONE},
219 {HRS_HRM_CH_CCC_HDL, ATT_CLIENT_CFG_NOTIFY, DM_SEC_LEVEL_NONE},
220 {BATT_LVL_CH_CCC_HDL, ATT_CLIENT_CFG_NOTIFY, DM_SEC_LEVEL_NONE}
241 static void fitDmCback(dmEvt_t *pDmEvt)
245 if ((pMsg = WsfMsgAlloc(
sizeof(dmEvt_t))) != NULL)
247 memcpy(pMsg, pDmEvt,
sizeof(dmEvt_t));
263 static void fitAttCback(attEvt_t *pEvt)
280 static void fitCccCback(attsCccEvt_t *pEvt)
286 if ((pEvt->handle != ATT_HANDLE_NONE) &&
287 ((dbHdl = AppDbGetHdl((dmConnId_t) pEvt->hdr.param)) != APP_DB_HDL_NONE))
290 AppDbSetCccTblValue(dbHdl, pEvt->idx, pEvt->value);
293 if ((pMsg = WsfMsgAlloc(
sizeof(attsCccEvt_t))) != NULL)
295 memcpy(pMsg, pEvt,
sizeof(attsCccEvt_t));
311 static void fitProcCccState(
fitMsg_t *pMsg)
313 APP_TRACE_INFO3(
"ccc state ind value:%d handle:%d idx:%d", pMsg->
ccc.value,
314 pMsg->
ccc.handle, pMsg->
ccc.idx);
319 if (pMsg->
ccc.value == ATT_CLIENT_CFG_NOTIFY)
333 if (pMsg->
ccc.value == ATT_CLIENT_CFG_NOTIFY)
356 static void fitClose(
fitMsg_t *pMsg)
377 static void fitSetup(
fitMsg_t *pMsg)
380 uint32_t random_num = RTC_GetVal();
383 randAddr[0] = random_num & 0xff;
384 randAddr[1] = (random_num >> 8) & 0xff;
385 randAddr[2] = (random_num >> 16) & 0xff;
386 randAddr[3] = (random_num >> 24) & 0xff;
389 randAddr[4] = random_num & 0xff;
390 randAddr[5] = (random_num >> 8) & 0xff;
393 DM_RAND_ADDR_SET(randAddr, DM_RAND_ADDR_STATIC);
396 DmDevSetRandAddr(randAddr);
397 DmAdvSetAddrType(DM_ADDR_RANDOM);
400 AppAdvSetData(APP_ADV_DATA_DISCOVERABLE,
sizeof(fitAdvDataDisc), (uint8_t *) fitAdvDataDisc);
401 AppAdvSetData(APP_SCAN_DATA_DISCOVERABLE,
sizeof(fitScanDataDisc), (uint8_t *) fitScanDataDisc);
404 AppAdvSetData(APP_ADV_DATA_CONNECTABLE, 0, NULL);
405 AppAdvSetData(APP_SCAN_DATA_CONNECTABLE, 0, NULL);
408 AppAdvStart(APP_MODE_AUTO_INIT);
422 static void fitBtnCback(uint8_t btn)
425 static uint8_t heartRate = 78;
428 if ((connId = AppConnIsOpen()) != DM_CONN_ID_NONE)
432 case APP_UI_BTN_1_SHORT:
434 AppHwHrmTest(++heartRate);
437 case APP_UI_BTN_1_MED:
440 case APP_UI_BTN_1_LONG:
441 AppConnClose(connId);
444 case APP_UI_BTN_2_SHORT:
446 AppHwHrmTest(--heartRate);
458 case APP_UI_BTN_1_SHORT:
460 AppAdvStart(APP_MODE_AUTO_INIT);
463 case APP_UI_BTN_1_MED:
465 AppSetBondable(TRUE);
466 AppAdvStart(APP_MODE_DISCOVERABLE);
469 case APP_UI_BTN_1_LONG:
471 AppDbDeleteAllRecords();
472 AppAdvStart(APP_MODE_AUTO_INIT);
492 static void fitProcMsg(
fitMsg_t *pMsg)
494 uint8_t uiEvent = APP_UI_NONE;
496 switch(pMsg->
hdr.event)
499 HrpsProcMsg(&pMsg->
hdr);
503 BasProcMsg(&pMsg->
hdr);
506 case ATTS_CCC_STATE_IND:
507 fitProcCccState(pMsg);
510 case DM_RESET_CMPL_IND:
512 uiEvent = APP_UI_RESET_CMPL;
515 case DM_ADV_START_IND:
516 uiEvent = APP_UI_ADV_START;
521 case DM_ADV_STOP_IND:
522 uiEvent = APP_UI_ADV_STOP;
527 case DM_CONN_OPEN_IND:
528 uiEvent = APP_UI_CONN_OPEN;
535 case DM_CONN_CLOSE_IND:
537 uiEvent = APP_UI_CONN_CLOSE;
542 case DM_SEC_PAIR_CMPL_IND:
543 uiEvent = APP_UI_SEC_PAIR_CMPL;
546 case DM_SEC_PAIR_FAIL_IND:
547 uiEvent = APP_UI_SEC_PAIR_FAIL;
550 case DM_SEC_ENCRYPT_IND:
551 uiEvent = APP_UI_SEC_ENCRYPT;
554 case DM_SEC_ENCRYPT_FAIL_IND:
555 uiEvent = APP_UI_SEC_ENCRYPT_FAIL;
558 case DM_SEC_AUTH_REQ_IND:
559 AppHandlePasskey(&pMsg->
dm.authReq);
566 if (uiEvent != APP_UI_NONE)
568 AppUiAction(uiEvent);
585 APP_TRACE_INFO0(
"FitHandlerInit");
591 pAppSlaveCfg = (appSlaveCfg_t *) &fitSlaveCfg;
592 pAppSecCfg = (appSecCfg_t *) &fitSecCfg;
593 pAppUpdateCfg = (appUpdateCfg_t *) &fitUpdateCfg;
599 BasInit(handlerId, (basCfg_t *) &fitBasCfg);
602 HrpsInit(handlerId, (hrpsCfg_t *) &fitHrpsCfg);
603 HrpsSetFlags(CH_HRM_FLAGS_VALUE_8BIT | CH_HRM_FLAGS_ENERGY_EXP);
622 APP_TRACE_INFO1(
"Fit got evt %d", pMsg->event);
624 if (pMsg->event >= DM_CBACK_START && pMsg->event <= DM_CBACK_END)
627 AppSlaveProcDmMsg((dmEvt_t *) pMsg);
630 AppSlaveSecProcDmMsg((dmEvt_t *) pMsg);
650 DmRegister(fitDmCback);
651 DmConnRegister(DM_CLIENT_ID_APP, fitDmCback);
652 AttRegister(fitAttCback);
653 AttConnRegister(AppServerConnCback);
654 AttsCccRegister(
FIT_NUM_CCC_IDX, (attsCccSet_t *) fitCccSet, fitCccCback);
657 AppUiBtnRegister(fitBtnCback);
661 SvcHrsCbackRegister(NULL, HrpsWriteCback);
664 SvcBattCbackRegister(BasReadCback, NULL);