appl_sample_example_10.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828
  1. /**
  2. * \file appl_sample_example_10.c
  3. *
  4. * Source File for Generic OnOff Server as LPN Standalone application without CLI or
  5. * menu based console input interface.
  6. */
  7. /*
  8. * Copyright (C) 2018. Mindtree Ltd.
  9. * All rights reserved.
  10. */
  11. #if (MESH_STANDALONE == 10)
  12. /* ----------------------------------------- Header File Inclusion */
  13. #include "MS_common.h"
  14. #include "MS_access_api.h"
  15. #include "MS_config_api.h"
  16. #include "MS_health_server_api.h"
  17. #include "MS_generic_onoff_api.h"
  18. #include "blebrr.h"
  19. #include "nvsto.h"
  20. #include "model_state_handler_pl.h"
  21. /* Console Input/Output */
  22. #define CONSOLE_OUT(...) printf(__VA_ARGS__)
  23. #define CONSOLE_IN(...) scanf(__VA_ARGS__)
  24. void appl_dump_bytes(UCHAR *buffer, UINT16 length);
  25. void appl_mesh_sample (void);
  26. #define UI_FRND_CRITERIA 0x4B
  27. #define UI_FRND_RECEIVE_DELAY_MS 100
  28. #define UI_FRND_POLLTIMEOUT_100MS 100
  29. #define UI_FRND_SETUPTIMEOUT 10000
  30. /* ----------------------------------------- External Global Variables */
  31. /* ----------------------------------------- Exported Global Variables */
  32. /* ----------------------------------------- Static Global Variables */
  33. /* ----------------------------------------- Functions */
  34. /* Model Server - Foundation Models */
  35. /* Health Server - Test Routines */
  36. static void UI_health_self_test_00(UINT8 test_id, UINT16 company_id)
  37. {
  38. }
  39. static void UI_health_self_test_01(UINT8 test_id, UINT16 company_id)
  40. {
  41. }
  42. static void UI_health_self_test_FF(UINT8 test_id, UINT16 company_id)
  43. {
  44. }
  45. /* List of Self Tests */
  46. static MS_HEALTH_SERVER_SELF_TEST UI_health_server_self_tests[] =
  47. {
  48. {
  49. 0x00, /* Test ID: 0x00 */
  50. UI_health_self_test_00
  51. },
  52. {
  53. 0x01, /* Test ID: 0x01 */
  54. UI_health_self_test_01
  55. },
  56. {
  57. 0xFF, /* Test ID: 0xFF */
  58. UI_health_self_test_FF
  59. }
  60. };
  61. /**
  62. * \brief Health Server application Asynchronous Notification Callback.
  63. *
  64. * \par Description
  65. * Health Server calls the registered callback to indicate events occurred to the
  66. * application.
  67. *
  68. * \param handle Model Handle.
  69. * \param event_type Health Server Event type.
  70. * \param event_param Parameter associated with the event if any or NULL.
  71. * \param param_len Size of the event parameter data. 0 if event param is NULL.
  72. */
  73. static API_RESULT UI_health_server_cb
  74. (
  75. MS_ACCESS_MODEL_HANDLE * handle,
  76. UINT8 event_type,
  77. UINT8 * event_param,
  78. UINT16 param_len
  79. )
  80. {
  81. CONSOLE_OUT(
  82. "Health Server Callback. Not handled. Returning\n");
  83. return API_SUCCESS;
  84. }
  85. API_RESULT UI_register_foundation_model_servers
  86. (
  87. MS_ACCESS_ELEMENT_HANDLE element_handle
  88. )
  89. {
  90. /* Configuration Server */
  91. MS_ACCESS_MODEL_HANDLE UI_config_server_model_handle;
  92. MS_ACCESS_MODEL_HANDLE UI_health_server_model_handle;
  93. API_RESULT retval;
  94. /* Health Server */
  95. UINT16 company_id;
  96. MS_HEALTH_SERVER_SELF_TEST * self_tests;
  97. UINT32 num_self_tests;
  98. CONSOLE_OUT("In Model Server - Foundation Models\n");
  99. retval = MS_config_server_init(element_handle, &UI_config_server_model_handle);
  100. CONSOLE_OUT("Config Model Server Registration Status: 0x%04X\n", retval);
  101. /* Health Server */
  102. company_id = 0x0000;
  103. self_tests = &UI_health_server_self_tests[0];
  104. num_self_tests = sizeof(UI_health_server_self_tests)/sizeof(MS_HEALTH_SERVER_SELF_TEST);
  105. retval = MS_health_server_init
  106. (
  107. element_handle,
  108. &UI_health_server_model_handle,
  109. company_id,
  110. self_tests,
  111. num_self_tests,
  112. UI_health_server_cb
  113. );
  114. if (API_SUCCESS == retval)
  115. {
  116. CONSOLE_OUT(
  117. "Health Server Initialized. Model Handle: 0x%04X\n",
  118. UI_health_server_model_handle);
  119. }
  120. else
  121. {
  122. CONSOLE_OUT(
  123. "[ERR] Sensor Server Initialization Failed. Result: 0x%04X\n",
  124. retval);
  125. }
  126. return retval;
  127. }
  128. /* ---- Generic OnOff States and Get/Set Handlers */
  129. static MS_STATE_GENERIC_ONOFF_STRUCT UI_generic_onoff;
  130. /* Generic OnOff Model state Initialization */
  131. void UI_generic_onoff_model_states_initialization(void)
  132. {
  133. EM_mem_set(&UI_generic_onoff, 0, sizeof(UI_generic_onoff));
  134. }
  135. /* Generic OnOff Model Get Handler */
  136. API_RESULT UI_generic_onoff_model_state_get(UINT16 state_t, UINT16 state_inst, void * param, UINT8 direction)
  137. {
  138. API_RESULT retval;
  139. retval = API_SUCCESS;
  140. switch(state_t)
  141. {
  142. case MS_STATE_GENERIC_ONOFF_T:
  143. {
  144. MS_STATE_GENERIC_ONOFF_STRUCT * param_p;
  145. param_p = (MS_STATE_GENERIC_ONOFF_STRUCT *)param;
  146. /* Ignoring Instance and direction right now */
  147. *param_p = UI_generic_onoff;
  148. }
  149. break;
  150. default:
  151. break;
  152. }
  153. return retval;
  154. }
  155. /* Generic OnOff Model Set Handler */
  156. API_RESULT UI_generic_onoff_model_state_set(UINT16 state_t, UINT16 state_inst, void * param, UINT8 direction)
  157. {
  158. API_RESULT retval;
  159. retval = API_SUCCESS;
  160. switch (state_t)
  161. {
  162. case MS_STATE_GENERIC_ONOFF_T:
  163. {
  164. MS_STATE_GENERIC_ONOFF_STRUCT * param_p;
  165. param_p = (MS_STATE_GENERIC_ONOFF_STRUCT *)param;
  166. /* Instantaneous Change */
  167. UI_generic_onoff.onoff = param_p->onoff;
  168. *param_p = UI_generic_onoff;
  169. CONSOLE_OUT("[state] current: 0x%02X\n", UI_generic_onoff.onoff);
  170. CONSOLE_OUT("[state] target: 0x%02X\n", UI_generic_onoff.target_onoff);
  171. CONSOLE_OUT("[state] remaining_time: 0x%02X\n", UI_generic_onoff.transition_time);
  172. generic_onoff_set_pl(param_p->onoff);
  173. /* Ignoring Instance and direction right now */
  174. }
  175. break;
  176. default:
  177. break;
  178. }
  179. return retval;
  180. }
  181. /* Model state Initialization */
  182. void UI_model_states_initialization(void)
  183. {
  184. /* Generic OnOff States */
  185. UI_generic_onoff_model_states_initialization();
  186. }
  187. /* Generic OnOff Model Server */
  188. /**
  189. * \brief Server Application Asynchronous Notification Callback.
  190. *
  191. * \par Description
  192. * Generic_Onoff server calls the registered callback to indicate events occurred to the application.
  193. *
  194. * \param [in] ctx Context of message received for a specific model instance.
  195. * \param [in] msg_raw Uninterpreted/raw received message.
  196. * \param [in] req_type Requested message type.
  197. * \param [in] state_params Model specific state parameters.
  198. * \param [in] ext_params Additional parameters.
  199. */
  200. API_RESULT UI_generic_onoff_server_cb
  201. (
  202. /* IN */ MS_ACCESS_MODEL_REQ_MSG_CONTEXT * ctx,
  203. /* IN */ MS_ACCESS_MODEL_REQ_MSG_RAW * msg_raw,
  204. /* IN */ MS_ACCESS_MODEL_REQ_MSG_T * req_type,
  205. /* IN */ MS_ACCESS_MODEL_STATE_PARAMS * state_params,
  206. /* IN */ MS_ACCESS_MODEL_EXT_PARAMS * ext_params
  207. )
  208. {
  209. MS_STATE_GENERIC_ONOFF_STRUCT param;
  210. MS_ACCESS_MODEL_STATE_PARAMS current_state_params;
  211. API_RESULT retval;
  212. retval = API_SUCCESS;
  213. /* Check message type */
  214. if (MS_ACCESS_MODEL_REQ_MSG_T_GET == req_type->type)
  215. {
  216. CONSOLE_OUT("[GENERIC_ONOFF] GET Request.\n");
  217. UI_generic_onoff_model_state_get(state_params->state_type, 0, &param, 0);
  218. current_state_params.state_type = state_params->state_type;
  219. current_state_params.state = &param;
  220. /* Using same as target state and remaining time as 0 */
  221. }
  222. else if (MS_ACCESS_MODEL_REQ_MSG_T_SET == req_type->type)
  223. {
  224. CONSOLE_OUT("[GENERIC_ONOFF] SET Request.\n");
  225. retval = UI_generic_onoff_model_state_set(state_params->state_type, 0, (MS_STATE_GENERIC_ONOFF_STRUCT *)state_params->state, 0);
  226. current_state_params.state_type = state_params->state_type;
  227. current_state_params.state = (MS_STATE_GENERIC_ONOFF_STRUCT *)state_params->state;
  228. }
  229. /* See if to be acknowledged */
  230. if (0x01 == req_type->to_be_acked)
  231. {
  232. CONSOLE_OUT("[GENERIC_ONOFF] Sending Response.\n");
  233. /* Parameters: Request Context, Current State, Target State (NULL: to be ignored), Remaining Time (0: to be ignored), Additional Parameters (NULL: to be ignored) */
  234. retval = MS_generic_onoff_server_state_update(ctx, &current_state_params, NULL, 0, NULL);
  235. }
  236. return retval;
  237. }
  238. API_RESULT UI_register_generic_onoff_model_server
  239. (
  240. MS_ACCESS_ELEMENT_HANDLE element_handle
  241. )
  242. {
  243. /* Generic OnOff Server */
  244. MS_ACCESS_MODEL_HANDLE UI_generic_onoff_server_model_handle;
  245. API_RESULT retval;
  246. CONSOLE_OUT("In Generic OnOff Model Server\n");
  247. retval = MS_generic_onoff_server_init
  248. (
  249. element_handle,
  250. &UI_generic_onoff_server_model_handle,
  251. UI_generic_onoff_server_cb
  252. );
  253. if (API_SUCCESS == retval)
  254. {
  255. CONSOLE_OUT(
  256. "Generic Onoff Server Initialized. Model Handle: 0x%04X\n",
  257. UI_generic_onoff_server_model_handle);
  258. }
  259. else
  260. {
  261. CONSOLE_OUT(
  262. "[ERR] Generic Onoff Server Initialization Failed. Result: 0x%04X\n",
  263. retval);
  264. }
  265. return retval;
  266. }
  267. void UI_lpn_seek_friend(void);
  268. void UI_frndsetup_cb(MS_SUBNET_HANDLE subnet, UCHAR event_type, UINT16 status)
  269. {
  270. API_RESULT retval;
  271. UINT16 num_subaddr;
  272. UINT16 subaddr[5];
  273. CONSOLE_OUT("\nFriendship Event 0x%02X on Subnet 0x%04X - 0x%04X\n",
  274. event_type, subnet, status);
  275. switch (event_type)
  276. {
  277. case MS_TRN_FRIEND_SETUP_CNF:
  278. CONSOLE_OUT("Recvd MS_TRN_FRIEND_SETUP_CNF - 0x%04X\n", status);
  279. if (API_SUCCESS == status)
  280. {
  281. /* Get the subscription list */
  282. num_subaddr = sizeof(subaddr) / sizeof(UINT16);
  283. MS_access_cm_get_all_model_subscription_list(&num_subaddr, subaddr);
  284. if (0 < num_subaddr)
  285. {
  286. CONSOLE_OUT("Initiating FriendSubscriptionListAdd - %d addr\n", num_subaddr);
  287. retval = MS_trn_lpn_subscrn_list_add(subaddr, num_subaddr);
  288. CONSOLE_OUT("Retval - 0x%04X\n", retval);
  289. }
  290. }
  291. else
  292. {
  293. CONSOLE_OUT("Friendship Setup Failure%04X\n", status);
  294. UI_lpn_seek_friend();
  295. }
  296. break;
  297. case MS_TRN_FRIEND_SUBSCRNLIST_CNF:
  298. CONSOLE_OUT("Recvd MS_TRN_FRIEND_SUBSCRNLIST_CNF - 0x%04X\n", status);
  299. break;
  300. case MS_TRN_FRIEND_CLEAR_CNF:
  301. CONSOLE_OUT("Recvd MS_TRN_FRIEND_CLEAR_CNF - 0x%04X\n", status);
  302. break;
  303. case MS_TRN_FRIEND_TERMINATE_IND:
  304. CONSOLE_OUT("Recvd MS_TRN_FRIEND_TERMINATE_IND - 0x%04X\n", status);
  305. /* Enable Friend feature */
  306. MS_ENABLE_FRIEND_FEATURE();
  307. break;
  308. default:
  309. break;
  310. }
  311. }
  312. void UI_lpn_seek_friend (void)
  313. {
  314. API_RESULT retval;
  315. /* Disable Friend feature */
  316. MS_DISABLE_FRIEND_FEATURE();
  317. /* Enable LPN feature */
  318. MS_ENABLE_LPN_FEATURE();
  319. CONSOLE_OUT ("Requesting for friendship...\n");
  320. retval = MS_trn_lpn_setup_friendship
  321. (
  322. 0x00,
  323. UI_FRND_CRITERIA,
  324. UI_FRND_RECEIVE_DELAY_MS,
  325. UI_FRND_POLLTIMEOUT_100MS,
  326. UI_FRND_SETUPTIMEOUT,
  327. UI_frndsetup_cb
  328. );
  329. CONSOLE_OUT ("Retval - 0x%04X\n", retval);
  330. return;
  331. }
  332. /* Provisionee */
  333. #define UI_PROV_OUTPUT_OOB_ACTIONS \
  334. (PROV_MASK_OOOB_ACTION_BLINK | PROV_MASK_OOOB_ACTION_BEEP | \
  335. PROV_MASK_OOOB_ACTION_VIBRATE | PROV_MASK_OOOB_ACTION_NUMERIC | \
  336. PROV_MASK_OOOB_ACTION_ALPHANUMERIC)
  337. /** Output OOB Maximum size supported */
  338. #define UI_PROV_OUTPUT_OOB_SIZE 0x08
  339. /** Input OOB Actions supported */
  340. #define UI_PROV_INPUT_OOB_ACTIONS \
  341. (PROV_MASK_IOOB_ACTION_PUSH | PROV_MASK_IOOB_ACTION_TWIST | \
  342. PROV_MASK_IOOB_ACTION_NUMERIC | PROV_MASK_IOOB_ACTION_ALPHANUMERIC)
  343. /** Input OOB Maximum size supported */
  344. #define UI_PROV_INPUT_OOB_SIZE 0x08
  345. /** Beacon setup timeout in seconds */
  346. #define UI_PROV_SETUP_TIMEOUT_SECS 30
  347. /** Attention timeout for device in seconds */
  348. #define UI_PROV_DEVICE_ATTENTION_TIMEOUT 30
  349. #define PROV_AUTHVAL_SIZE_PL 16
  350. /** Authentication values for OOB Display - To be made random */
  351. #define UI_DISPLAY_AUTH_DIGIT 3
  352. #define UI_DISPLAY_AUTH_NUMERIC 35007
  353. #define UI_DISPLAY_AUTH_STRING "f00l"
  354. /** Provisioning capabilities of local device */
  355. DECL_STATIC PROV_CAPABILITIES_S UI_prov_capab =
  356. {
  357. /** Number of Elements */
  358. 0x01,
  359. /** Supported algorithms */
  360. PROV_MASK_ALGO_EC_FIPS_P256,
  361. /** Public key type */
  362. PROV_MASK_PUBKEY_OOBINFO,
  363. /** Static OOB type */
  364. PROV_MASK_STATIC_OOBINFO,
  365. /** Output OOB information */
  366. { UI_PROV_OUTPUT_OOB_ACTIONS, UI_PROV_OUTPUT_OOB_SIZE },
  367. /** Input OOB information */
  368. { UI_PROV_INPUT_OOB_ACTIONS, UI_PROV_INPUT_OOB_SIZE },
  369. };
  370. /** Unprovisioned device identifier */
  371. PROV_DEVICE_S UI_lprov_device =
  372. {
  373. /** UUID */
  374. {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF},
  375. /** OOB Flag */
  376. 0x00,
  377. /**
  378. * Encoded URI Information
  379. * For example, to give a web address, "https://www.abc.com"
  380. * the URI encoded data would be -
  381. * 0x17 0x2F 0x2F 0x77 0x77 0x77 0x2E 0x61 0x62 0x63 0x2E 0x63 0x6F 0x6D
  382. * where 0x17 is the URI encoding for https:
  383. */
  384. NULL
  385. };
  386. /** Data exchanged during Provisiong procedure */
  387. DECL_STATIC PROV_DATA_S UI_prov_data =
  388. {
  389. /** NetKey */
  390. { 0x45, 0x74, 0x68, 0x65, 0x72, 0x4d, 0x69, 0x6e, 0x64, 0x4e, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x00 },
  391. /** Index of the NetKey */
  392. 0x0000,
  393. /** Flags bitmask */
  394. 0x00,
  395. /** Current value of the IV index */
  396. 0x00000001,
  397. /** Unicast address of the primary element */
  398. 0x0002
  399. };
  400. /** Current role of application - Provisioner/Device */
  401. DECL_STATIC UCHAR UI_prov_role;
  402. /** Provisioning Handle */
  403. DECL_STATIC PROV_HANDLE UI_prov_handle;
  404. API_RESULT UI_prov_callback
  405. (
  406. PROV_HANDLE * phandle,
  407. UCHAR event_type,
  408. API_RESULT event_result,
  409. void * event_data,
  410. UINT16 event_datalen
  411. )
  412. {
  413. PROV_DEVICE_S * rdev;
  414. PROV_CAPABILITIES_S * rcap;
  415. PROV_DATA_S * rdata;
  416. PROV_OOB_TYPE_S * oob_info;
  417. API_RESULT retval;
  418. UCHAR i;
  419. UCHAR authstr[PROV_AUTHVAL_SIZE_PL << 1];
  420. UINT32 authnum;
  421. UCHAR authtype;
  422. UCHAR * pauth;
  423. UINT16 authsize;
  424. UCHAR pdata[(MS_DEVICE_UUID_SIZE * 2) + 1];
  425. UCHAR * t_data;
  426. switch (event_type)
  427. {
  428. case PROV_EVT_PROVISIONING_SETUP:
  429. CONSOLE_OUT("Recvd PROV_EVT_PROVISIONING_SETUP\n");
  430. CONSOLE_OUT("Status - 0x%04X\n", event_result);
  431. /* Display the attention timeout */
  432. CONSOLE_OUT("Attention TImeout - %d\n", *((UCHAR *)event_data));
  433. break;
  434. case PROV_EVT_OOB_DISPLAY:
  435. CONSOLE_OUT("Recvd PROV_EVT_OOB_DISPLAY\n");
  436. CONSOLE_OUT("Status - 0x%04X\n", event_result);
  437. /* Reference the Authenticatio Type information */
  438. oob_info = (PROV_OOB_TYPE_S *)event_data;
  439. CONSOLE_OUT("Authenticaion Action - 0x%02X\n", oob_info->action);
  440. CONSOLE_OUT("Authenticaion Size - 0x%02X\n", oob_info->size);
  441. /* If role is Device, the action is of Output OOB, else Input OOB */
  442. if (PROV_ROLE_DEVICE == UI_prov_role)
  443. {
  444. if (PROV_OOOB_ACTION_ALPHANUMERIC == oob_info->action)
  445. {
  446. authtype = 1;
  447. }
  448. else if (PROV_OOOB_ACTION_NUMERIC == oob_info->action)
  449. {
  450. authtype = 2;
  451. }
  452. else
  453. {
  454. authtype = 0;
  455. }
  456. }
  457. else
  458. {
  459. if (PROV_IOOB_ACTION_ALPHANUMERIC == oob_info->action)
  460. {
  461. authtype = 1;
  462. }
  463. else if (PROV_IOOB_ACTION_NUMERIC == oob_info->action)
  464. {
  465. authtype = 2;
  466. }
  467. else
  468. {
  469. authtype = 0;
  470. }
  471. }
  472. if (1 == authtype)
  473. {
  474. EM_str_copy (authstr, UI_DISPLAY_AUTH_STRING);
  475. CONSOLE_OUT("\n\n>>> AuthVal - %s <<<\n\n", authstr);
  476. pauth = authstr;
  477. authsize = EM_str_len(authstr);
  478. }
  479. else if (2 == authtype)
  480. {
  481. authnum = (UINT32)UI_DISPLAY_AUTH_NUMERIC;
  482. CONSOLE_OUT("\n\n>>> AuthVal - %d <<<\n\n", authnum);
  483. pauth = (UCHAR *)&authnum;
  484. authsize = sizeof(UINT32);
  485. }
  486. else
  487. {
  488. authnum = (UINT32)UI_DISPLAY_AUTH_DIGIT;
  489. CONSOLE_OUT("\n\n>>> AuthVal - %d <<<\n\n", authnum);
  490. pauth = (UCHAR *)&authnum;
  491. authsize = sizeof(UINT32);
  492. }
  493. /* Call to input the oob */
  494. CONSOLE_OUT("Setting the Authval...\n");
  495. retval = MS_prov_set_authval(&UI_prov_handle, pauth, authsize);
  496. CONSOLE_OUT("Retval - 0x%04X\n", retval);
  497. break;
  498. case PROV_EVT_OOB_ENTRY:
  499. CONSOLE_OUT("Recvd PROV_EVT_OOB_ENTRY\n");
  500. CONSOLE_OUT("Status - 0x%04X\n", event_result);
  501. /* Reference the Authenticatio Type information */
  502. oob_info = (PROV_OOB_TYPE_S *)event_data;
  503. CONSOLE_OUT("Authenticaion Action - 0x%02X\n", oob_info->action);
  504. CONSOLE_OUT("Authenticaion Size - 0x%02X\n", oob_info->size);
  505. break;
  506. case PROV_EVT_DEVINPUT_COMPLETE:
  507. CONSOLE_OUT("Recvd PROV_EVT_DEVINPUT_COMPLETE\n");
  508. CONSOLE_OUT("Status - 0x%04X\n", event_result);
  509. break;
  510. case PROV_EVT_PROVDATA_INFO:
  511. CONSOLE_OUT("Recvd PROV_EVT_PROVDATA_INFO\n");
  512. CONSOLE_OUT("Status - 0x%04X\n", event_result);
  513. /* Reference the Provisioning Data */
  514. rdata = (PROV_DATA_S *)event_data;
  515. CONSOLE_OUT("NetKey : "); appl_dump_bytes(rdata->netkey, PROV_KEY_NETKEY_SIZE);
  516. CONSOLE_OUT("Key ID : 0x%04X\n", rdata->keyid);
  517. CONSOLE_OUT("Flags : 0x%02X\n", rdata->flags);
  518. CONSOLE_OUT("IVIndex : 0x%08X\n", rdata->ivindex);
  519. CONSOLE_OUT("UAddr : 0x%04X\n", rdata->uaddr);
  520. /* Provide Provisioning Data to Access Layer */
  521. MS_access_cm_set_prov_data
  522. (
  523. rdata
  524. );
  525. break;
  526. case PROV_EVT_PROVISIONING_COMPLETE:
  527. CONSOLE_OUT("Recvd PROV_EVT_PROVISIONING_COMPLETE\n");
  528. CONSOLE_OUT("Status - 0x%04X\n", event_result);
  529. if (API_SUCCESS == event_result)
  530. {
  531. /* Already Set while handling PROV_EVT_PROVDATA_INFO */
  532. }
  533. break;
  534. default:
  535. CONSOLE_OUT("Unknown Event - 0x%02X\n", event_type);
  536. }
  537. return API_SUCCESS;
  538. }
  539. void UI_register_prov(void)
  540. {
  541. API_RESULT retval;
  542. CONSOLE_OUT("Registering with Provisioning layer...\n");
  543. retval = MS_prov_register(&UI_prov_capab, UI_prov_callback);
  544. CONSOLE_OUT("Retval - 0x%04X\n", retval);
  545. }
  546. void UI_setup_prov(UCHAR role, UCHAR brr)
  547. {
  548. API_RESULT retval;
  549. if (PROV_ROLE_PROVISIONER != role)
  550. {
  551. CONSOLE_OUT("Setting up Device for Provisioning ...\n");
  552. retval = MS_prov_setup
  553. (
  554. brr,
  555. role,
  556. &UI_lprov_device,
  557. UI_PROV_SETUP_TIMEOUT_SECS
  558. );
  559. UI_prov_role = PROV_ROLE_DEVICE;
  560. }
  561. else
  562. {
  563. CONSOLE_OUT("Setting up Provisioner for Provisioning ...\n");
  564. retval = MS_prov_setup
  565. (
  566. brr,
  567. role,
  568. NULL,
  569. UI_PROV_SETUP_TIMEOUT_SECS
  570. );
  571. UI_prov_role = PROV_ROLE_PROVISIONER;
  572. }
  573. CONSOLE_OUT("Retval - 0x%04X\n", retval);
  574. }
  575. void UI_prov_bind(UCHAR brr, UCHAR index)
  576. {
  577. API_RESULT retval;
  578. /* Call to bind with the selected device */
  579. CONSOLE_OUT("Binding with the selected device...\n");
  580. retval = MS_prov_bind(brr, &UI_lprov_device, UI_PROV_DEVICE_ATTENTION_TIMEOUT, &UI_prov_handle);
  581. CONSOLE_OUT("Retval - 0x%04X\n", retval);
  582. }
  583. void appl_mesh_sample (void)
  584. {
  585. MS_ACCESS_NODE_ID node_id;
  586. MS_ACCESS_ELEMENT_DESC element;
  587. MS_ACCESS_ELEMENT_HANDLE element_handle;
  588. API_RESULT retval;
  589. UCHAR role, brr;
  590. MS_CONFIG * config_ptr;
  591. #ifdef MS_HAVE_DYNAMIC_CONFIG
  592. MS_CONFIG config;
  593. /* Initialize dynamic configuration */
  594. MS_INIT_CONFIG(config);
  595. config_ptr = &config;
  596. #else
  597. config_ptr = NULL;
  598. #endif /* MS_HAVE_DYNAMIC_CONFIG */
  599. /* Initialize OSAL */
  600. EM_os_init();
  601. /* Initialize Debug Module */
  602. EM_debug_init();
  603. /* Initialize Timer Module */
  604. EM_timer_init();
  605. timer_em_init();
  606. /* Initialize utilities */
  607. nvsto_init();
  608. /* Initialize Mesh Stack */
  609. MS_init(config_ptr);
  610. /* Register with underlying BLE stack */
  611. blebrr_register();
  612. /* Create Node */
  613. retval = MS_access_create_node(&node_id);
  614. /* Register Element */
  615. /**
  616. * TBD: Define GATT Namespace Descriptions from
  617. * https://www.bluetooth.com/specifications/assigned-numbers/gatt-namespace-descriptors
  618. *
  619. * Using 'main' (0x0106) as Location temporarily.
  620. */
  621. element.loc = 0x0106;
  622. retval = MS_access_register_element
  623. (
  624. node_id,
  625. &element,
  626. &element_handle
  627. );
  628. if (API_SUCCESS == retval)
  629. {
  630. /* Register foundation model servers */
  631. retval = UI_register_foundation_model_servers(element_handle);
  632. }
  633. if (API_SUCCESS == retval)
  634. {
  635. /* Register Generic OnOff model server */
  636. retval = UI_register_generic_onoff_model_server(element_handle);
  637. }
  638. if (API_SUCCESS == retval)
  639. {
  640. /* Initialize model states */
  641. UI_model_states_initialization();
  642. }
  643. /* Configure as provisionee/device */
  644. UI_register_prov();
  645. /**
  646. * setup <role:[1 - Device, 2 - Provisioner]> <bearer:[1 - Adv, 2 - GATT]
  647. */
  648. role = PROV_ROLE_DEVICE;
  649. brr = PROV_BRR_ADV;
  650. UI_setup_prov(role, brr);
  651. UI_prov_bind(brr, 0x00);
  652. /* Enable Friend feature */
  653. MS_ENABLE_FRIEND_FEATURE();
  654. return;
  655. }
  656. #endif /* (MESH_STANDALONE == 10) */