phymodel_client.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505
  1. /**
  2. * \file phy_model_client.c
  3. *
  4. * \brief This file defines the Mesh Configuration Model Application Interface
  5. * - includes Data Structures and Methods for both Server and Client.
  6. */
  7. /*
  8. * Copyright (C) 2020. phyplus Ltd.
  9. * All rights reserved.
  10. */
  11. /* --------------------------------------------- Header File Inclusion */
  12. #include "phymodel_client.h"
  13. /* --------------------------------------------- Data Types/ Structures */
  14. /* --------------------------------------------- Global Definitions */
  15. /* --------------------------------------------- Static Global Variables */
  16. static DECL_CONST UINT32 phy_model_client_opcode_list[] =
  17. {
  18. MS_ACCESS_PHY_MODEL_STATUS_OPCODE,
  19. MS_ACCESS_PHY_MODEL_INDICATION_OPCODE,
  20. MS_ACCESS_PHY_MODEL_WRITECMD_OPCODE,
  21. MS_ACCESS_PHY_MODEL_NOTIFY_OPCODE
  22. };
  23. static MS_ACCESS_MODEL_HANDLE phy_model_client_model_handle;
  24. static MS_PHY_MODEL_CLIENT_CB phy_model_client_UI_cb;
  25. /* --------------------------------------------- External Global Variables */
  26. /* --------------------------------------------- Function */
  27. /**
  28. * \brief Access Layer Application Asynchronous Notification Callback.
  29. *
  30. * \par Description
  31. * Access Layer calls the registered callback to indicate events occurred to the application.
  32. *
  33. * \param [in] handle Model Handle.
  34. * \param [in] saddr 16 bit Source Address.
  35. * \param [in] daddr 16 bit Destination Address.
  36. * \param [in] appkey_handle AppKey Handle.
  37. * \param [in] subnet_handle Subnet Handle.
  38. * \param [in] opcode Opcode.
  39. * \param [in] data_param Data associated with the event if any or NULL.
  40. * \param [in] data_len Size of the event data. 0 if event data is NULL.
  41. */
  42. API_RESULT phy_model_client_cb
  43. (
  44. /* IN */ MS_ACCESS_MODEL_HANDLE * handle,
  45. /* IN */ MS_NET_ADDR saddr,
  46. /* IN */ MS_NET_ADDR daddr,
  47. /* IN */ MS_SUBNET_HANDLE subnet_handle,
  48. /* IN */ MS_APPKEY_HANDLE appkey_handle,
  49. /* IN */ UINT32 opcode,
  50. /* IN */ UCHAR * data_param,
  51. /* IN */ UINT16 data_len
  52. )
  53. {
  54. MS_ACCESS_MODEL_REQ_MSG_CONTEXT req_context;
  55. MS_ACCESS_MODEL_REQ_MSG_RAW req_raw;
  56. MS_ACCESS_MODEL_REQ_MSG_T req_type;
  57. MS_ACCESS_MODEL_EXT_PARAMS * ext_params_p;
  58. MS_ACCESS_PHY_MODEL_STATE_PARAMS state_params;
  59. UINT16 marker = 0;
  60. API_RESULT retval;
  61. retval = API_SUCCESS;
  62. ext_params_p = NULL;
  63. /* Request Context */
  64. req_context.handle = *handle;
  65. req_context.saddr = saddr;
  66. req_context.daddr = daddr;
  67. req_context.subnet_handle = subnet_handle;
  68. req_context.appkey_handle = appkey_handle;
  69. /* Request Raw */
  70. req_raw.opcode = opcode;
  71. req_raw.data_param = data_param;
  72. req_raw.data_len = data_len;
  73. // printf(
  74. // "[PHY_MODEL_CLIENT] Callback. Opcode 0x%04X\n", opcode);
  75. // appl_dump_bytes(data_param, data_len);
  76. switch(opcode)
  77. {
  78. case MS_ACCESS_PHY_MODEL_STATUS_OPCODE:
  79. {
  80. // printf(
  81. // "MS_ACCESS_PHY_MODEL_STATUS_MSG\n");
  82. MODEL_OPCODE_HANDLER_CALL(vendor_example_transparent_msg_handler);
  83. /* Set Request Type */
  84. req_type.type = MS_ACCESS_MODEL_REQ_MSG_T_OTHERS;
  85. req_type.to_be_acked = 0x00;
  86. }
  87. break;
  88. case MS_ACCESS_PHY_MODEL_INDICATION_OPCODE:
  89. {
  90. // printf(
  91. // "MS_ACCESS_PHY_MODEL_INDICATION_OPCODE_MSG\n");
  92. marker = 1;
  93. MS_UNPACK_LE_2_BYTE(&state_params.phy_mode_type, data_param+marker);
  94. marker += 2;
  95. state_params.phy_mode_param = &data_param[marker];
  96. /* Set Request Type */
  97. req_type.type = MS_ACCESS_MODEL_REQ_MSG_T_OTHERS;
  98. req_type.to_be_acked = 0x01;
  99. }
  100. break;
  101. case MS_ACCESS_PHY_MODEL_WRITECMD_OPCODE:
  102. {
  103. // printf(
  104. // "MS_ACCESS_PHY_MODEL_WRITECMD_OPCODE\n");
  105. // UCHAR *_data_pram;
  106. marker = 1;
  107. MS_UNPACK_LE_2_BYTE(&state_params.phy_mode_type, data_param+marker);
  108. marker += 2;
  109. // if(data_len>3)
  110. // {
  111. // _data_pram = EM_alloc_mem(data_len - 3);
  112. // EM_mem_copy(_data_pram, data_param+marker, data_len-3);
  113. // }
  114. // EM_mem_copy((UCHAR *)state_params.state,data_param+marker,data_len-3);
  115. state_params.phy_mode_param = &data_param[marker];
  116. // EM_free_mem(_data_pram);
  117. /* Set Request Type */
  118. req_type.type = MS_ACCESS_MODEL_REQ_MSG_T_OTHERS;
  119. req_type.to_be_acked = 0x00;
  120. }
  121. break;
  122. case MS_ACCESS_PHY_MODEL_NOTIFY_OPCODE:
  123. {
  124. // UCHAR *_data_pram;
  125. state_params.phy_mode_type = MS_STATE_PHYMODEL_NOTIFY_T;
  126. marker = 1;
  127. // if(data_len > 1)
  128. // {
  129. // _data_pram = EM_alloc_mem(data_len - 1);
  130. // EM_mem_copy(_data_pram, data_param+marker, data_len-1);
  131. // }
  132. state_params.phy_mode_param = &data_param[marker];
  133. // EM_free_mem(_data_pram);
  134. /* Set Request Type */
  135. req_type.type = MS_ACCESS_MODEL_REQ_MSG_T_OTHERS;
  136. req_type.to_be_acked = 0x00;
  137. }
  138. break;
  139. default:
  140. // printf(
  141. // "MS_ACCESS_PHY_MODEL_NONE_OPCODE\n");
  142. break;
  143. }
  144. /* Application callback */
  145. if (NULL != phy_model_client_UI_cb)
  146. {
  147. phy_model_client_UI_cb(&req_context, &req_raw, &req_type, &state_params, ext_params_p);
  148. }
  149. return retval;
  150. }
  151. /* ----------------------------------------- Functions */
  152. /**
  153. * \brief API to send reply or to update state change
  154. *
  155. * \par Description
  156. * This is to send reply for a request or to inform change in state.
  157. *
  158. * \param [in] ctx Context of the message.
  159. * \param [in] current_state_params Model specific current state parameters.
  160. * \param [in] target_state_params Model specific target state parameters (NULL: to be ignored).
  161. * \param [in] remaining_time Time from current state to target state (0: to be ignored).
  162. * \param [in] ext_params Additional parameters (NULL: to be ignored).
  163. *
  164. * \return API_SUCCESS or an error code indicating reason for failure
  165. */
  166. API_RESULT MS_phy_model_client_state_update
  167. (
  168. /* IN */ MS_ACCESS_MODEL_REQ_MSG_CONTEXT * ctx,
  169. /* IN */ MS_ACCESS_PHY_MODEL_STATE_PARAMS * current_state_params,
  170. /* IN */ MS_ACCESS_MODEL_STATE_PARAMS * target_state_params,
  171. /* IN */ UINT16 remaining_time,
  172. /* IN */ MS_ACCESS_MODEL_EXT_PARAMS * ext_params,
  173. /* IN */ UINT16 data_length
  174. )
  175. {
  176. API_RESULT retval;
  177. /* TODO: Check what should be maximum length */
  178. UCHAR buffer[256];
  179. UCHAR * pdu_ptr;
  180. UINT16 marker;
  181. UINT32 opcode;
  182. retval = API_FAILURE;
  183. marker = 0;
  184. // printf(
  185. // "current_state_params->state_type 0x%04X.\n",current_state_params->phy_mode_type);
  186. switch (current_state_params->phy_mode_type)
  187. {
  188. case MS_STATE_PHY_MODEL_ONOFF_T:
  189. {
  190. buffer[marker] = ++vendor_tid;
  191. marker++;
  192. MS_PACK_LE_2_BYTE_VAL(&buffer[marker], current_state_params->phy_mode_type);
  193. marker += 2;
  194. EM_mem_copy(&buffer[marker], current_state_params->phy_mode_param, 1);
  195. marker++;
  196. /* Set Opcode */
  197. opcode = MS_ACCESS_PHY_MODEL_CONFIRMATION_OPCODE;
  198. }
  199. break;
  200. default:
  201. break;
  202. }
  203. /* Publish - reliable */
  204. if (0 == marker)
  205. {
  206. pdu_ptr = NULL;
  207. }
  208. else
  209. {
  210. pdu_ptr = buffer;
  211. }
  212. retval = MS_access_reply
  213. (
  214. &ctx->handle,
  215. ctx->daddr,
  216. ctx->saddr,
  217. ctx->subnet_handle,
  218. ctx->appkey_handle,
  219. ACCESS_INVALID_DEFAULT_TTL,
  220. opcode,
  221. pdu_ptr,
  222. marker
  223. );
  224. return retval;
  225. }
  226. /**
  227. * \brief API to send acknowledged commands
  228. *
  229. * \par Description
  230. * This is to initialize sending acknowledged commands.
  231. *
  232. * \param [in] req_opcode Request Opcode.
  233. * \param [in] param Parameter associated with Request Opcode.
  234. * \param [in] rsp_opcode Response Opcode.
  235. *
  236. * \return API_SUCCESS or an error code indicating reason for failure
  237. */
  238. API_RESULT MS_phymodel_client_send_reliable_pdu
  239. (
  240. /* IN */ UINT32 req_opcode,
  241. /* IN */ void * param,
  242. /* IN */ MS_NET_ADDR dst_addr
  243. )
  244. {
  245. API_RESULT retval;
  246. /* TODO: Check what should be maximum length */
  247. UCHAR buffer[256];
  248. UCHAR * pdu_ptr;
  249. UINT16 marker;
  250. MS_APPKEY_HANDLE key_handle;
  251. retval = API_FAILURE;
  252. marker = 0;
  253. // printf(
  254. // "[VENDOR_MODEL_CLIENT] Send Reliable PDU. Req Opcode 0x%08X\n",
  255. // req_opcode);
  256. switch(req_opcode)
  257. {
  258. case MS_ACCESS_PHY_MODEL_GET_OPCODE:
  259. {
  260. MS_ACCESS_PHY_MODEL_STATE_PARAMS * param_p;
  261. buffer[marker] = ++vendor_tid;
  262. marker++;
  263. param_p = (MS_ACCESS_PHY_MODEL_STATE_PARAMS *) param;
  264. MS_PACK_LE_2_BYTE_VAL(&buffer[marker], param_p->phy_mode_type);
  265. marker += 2;
  266. }
  267. break;
  268. case MS_ACCESS_PHY_MODEL_SET_OPCODE:
  269. case MS_ACCESS_PHY_MODEL_SET_UNACKNOWLEDGED_OPCODE:
  270. {
  271. MS_ACCESS_PHY_MODEL_STATE_PARAMS * param_p;
  272. buffer[marker] = ++vendor_tid;
  273. marker++;
  274. param_p = (MS_ACCESS_PHY_MODEL_STATE_PARAMS *) param;
  275. MS_PACK_LE_2_BYTE_VAL(&buffer[marker], param_p->phy_mode_type);
  276. marker += 2;
  277. switch(param_p->phy_mode_type)
  278. {
  279. case MS_STATE_PHY_MODEL_ONOFF_T:
  280. {
  281. EM_mem_copy(&buffer[marker], param_p->phy_mode_param, 1);
  282. marker += 1;
  283. }
  284. break;
  285. case MS_STATE_PHY_MODEL_HSL_T:
  286. {
  287. EM_mem_copy(&buffer[marker], param_p->phy_mode_param, 6);
  288. marker += 6;
  289. }
  290. break;
  291. default :
  292. break;
  293. }
  294. }
  295. break;
  296. case MS_ACCESS_PHY_MODEL_NOTIFY_OPCODE:
  297. {
  298. UINT16 len;
  299. MS_ACCESS_PHY_MODEL_STATE_PARAMS * param_p;
  300. param_p = (MS_ACCESS_PHY_MODEL_STATE_PARAMS *) param;
  301. MS_IGNORE_UNUSED_PARAM(param_p->phy_mode_type);
  302. MS_UNPACK_LE_2_BYTE(&len, param_p->phy_mode_param);
  303. buffer[marker] = ++vendor_tid;
  304. marker ++;
  305. if(len)
  306. {
  307. EM_mem_copy(&buffer[marker], &param_p->phy_mode_param[2], len);
  308. marker += len;
  309. }
  310. }
  311. break;
  312. default:
  313. break;
  314. }
  315. /* Publish - reliable */
  316. if (0 == marker)
  317. {
  318. pdu_ptr = NULL;
  319. }
  320. else
  321. {
  322. pdu_ptr = buffer;
  323. }
  324. MS_access_get_appkey_handle
  325. (
  326. &phy_model_client_model_handle,
  327. &key_handle
  328. );
  329. retval = MS_access_raw_data
  330. (
  331. &phy_model_client_model_handle,
  332. req_opcode,
  333. dst_addr,
  334. key_handle,
  335. pdu_ptr,
  336. marker,
  337. MS_FALSE
  338. );
  339. return retval;
  340. }
  341. /**
  342. * \brief API to initialize Vendor_Example_1 Server model
  343. *
  344. * \par Description
  345. * This is to initialize Vendor_Example_1 Server model and to register with Acess layer.
  346. *
  347. * \param [in] element_handle
  348. * Element identifier to be associated with the model instance.
  349. *
  350. * \param [in, out] model_handle
  351. * Model identifier associated with the model instance on successful initialization.
  352. * After power cycle of an already provisioned node, the model handle will have
  353. * valid value and the same will be reused for registration.
  354. *
  355. * \param [in] UI_cb Application Callback to be used by the Vendor_Example_1 Server.
  356. *
  357. * \return API_SUCCESS or an error code indicating reason for failure
  358. */
  359. API_RESULT MS_phy_model_client_init
  360. (
  361. /* IN */ MS_ACCESS_ELEMENT_HANDLE element_handle,
  362. /* INOUT */ MS_ACCESS_MODEL_HANDLE * model_handle,
  363. /* IN */ MS_PHY_MODEL_CLIENT_CB UI_cb
  364. )
  365. {
  366. API_RESULT retval;
  367. MS_ACCESS_NODE_ID node_id;
  368. MS_ACCESS_MODEL model;
  369. /* TBD: Initialize MUTEX and other data structures */
  370. /* Using default node ID */
  371. node_id = MS_ACCESS_DEFAULT_NODE_ID;
  372. // printf(
  373. // "[PHY_MODEL] Registered Element Handle 0x%02X\n", element_handle);
  374. /* Configure Model */
  375. model.model_id.id = MS_MODEL_ID_PHY_MODEL_CLIENT;
  376. model.model_id.type = MS_ACCESS_MODEL_TYPE_VENDOR;
  377. model.elem_handle = element_handle;
  378. /* Register Callback */
  379. model.cb = phy_model_client_cb;
  380. /* List of Opcodes */
  381. model.opcodes = phy_model_client_opcode_list;
  382. model.num_opcodes = sizeof(phy_model_client_opcode_list) / sizeof(UINT32);
  383. retval = MS_access_register_model
  384. (
  385. node_id,
  386. &model,
  387. model_handle
  388. );
  389. /* Save Application Callback */
  390. phy_model_client_UI_cb = UI_cb;
  391. phy_model_client_model_handle = *model_handle;
  392. return retval;
  393. }