cli_model_server.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573
  1. /**
  2. * \file cli_model_server.c
  3. *
  4. * This File contains the "model server" handlers for the CLI application,
  5. * to exercise various functionalities of the Mindtree Mesh stack.
  6. */
  7. /*
  8. * Copyright (C) 2017. Mindtree Ltd.
  9. * All rights reserved.
  10. */
  11. /* ------------------------------- Header File Inclusion */
  12. #include "cli_main.h"
  13. /* Model server application entry point */
  14. void main_generic_battery_server_operations(/* IN */ UINT8 have_menu);
  15. void main_generic_default_transition_time_server_operations(/* IN */ UINT8 have_menu);
  16. void main_generic_level_server_operations(/* IN */ UINT8 have_menu);
  17. void main_generic_location_server_operations(/* IN */ UINT8 have_menu);
  18. void main_generic_onoff_server_operations(/* IN */ UINT8 have_menu);
  19. void main_generic_power_level_server_operations(/* IN */ UINT8 have_menu);
  20. void main_generic_power_onoff_server_operations(/* IN */ UINT8 have_menu);
  21. void main_generic_property_server_operations(/* IN */ UINT8 have_menu);
  22. void main_health_server_operations(/* IN */ UINT8 have_menu);
  23. API_RESULT main_health_server_log_fault
  24. (
  25. /* IN */ UINT8 test_id,
  26. /* IN */ UINT8 fault
  27. );
  28. void main_light_ctl_server_operations(/* IN */ UINT8 have_menu);
  29. void main_light_hsl_server_operations(/* IN */ UINT8 have_menu);
  30. void main_light_lc_server_operations(/* IN */ UINT8 have_menu);
  31. void main_light_lightness_server_operations(/* IN */ UINT8 have_menu);
  32. void main_light_xyl_server_operations(/* IN */ UINT8 have_menu);
  33. void main_scene_server_operations(/* IN */ UINT8 have_menu);
  34. API_RESULT appl_model_light_lc_server_set_default_trans_timeout_in_ms(/* IN */ UINT32 time_in_ms);
  35. /* ------------------------------- Global Variables */
  36. /* Level - Model - Server */
  37. DECL_CONST CLI_COMMAND cli_models_cmd_list[] =
  38. {
  39. /* Help */
  40. { "help", "Help", cli_help },
  41. /* Back */
  42. { "back", "One Level Up", cli_back },
  43. /* Root */
  44. { "root", "Back to Root", cli_root },
  45. /* Reset */
  46. { "reset", "Emulate Reset", cli_models_reset },
  47. /* Foundation Model Setup */
  48. { "foundation", "Foundation Server Models Initialization", cli_models_foundation },
  49. #ifdef CLI_HEALTH_SERVER_MODEL
  50. /* Health Server Model Setup */
  51. { "health", "Health Server Options", cli_models_health },
  52. #endif /* CLI_HEALTH_SERVER_MODEL */
  53. #ifdef CLI_GENERICS_SERVER_MODEL
  54. /* Generics */
  55. { "generics", "Generic Server Options", cli_models_generics },
  56. #endif /* CLI_GENERICS_SERVER_MODEL */
  57. #if (defined CLI_GENERICS_SERVER_MODEL || defined CLI_LIGHTINGS_SERVER_MODEL)
  58. /* Scene */
  59. { "scene", "Scene Server Model Initialization", cli_models_scene },
  60. #endif /* (defined CLI_GENERICS_SERVER_MODEL || defined CLI_LIGHTINGS_SERVER_MODEL) */
  61. #ifdef CLI_LIGHTINGS_SERVER_MODEL
  62. /* Light */
  63. { "light", "Light Server Options", cli_models_light },
  64. #endif /* CLI_LIGHTINGS_SERVER_MODEL */
  65. #ifdef HAVE_VENDOR_MODEL_EXAMPLE_1
  66. /* Vendor Specific */
  67. { "vendor", "Vendor Specific", cli_models_vendor },
  68. #endif /* HAVE_VENDOR_MODEL_EXAMPLE_1 */
  69. };
  70. #ifdef CLI_HEALTH_SERVER_MODEL
  71. /* Level - Model = Server - Health */
  72. DECL_CONST CLI_COMMAND cli_models_health_cmd_list[] =
  73. {
  74. /* Help */
  75. { "help", "Help", cli_help },
  76. /* Back */
  77. { "back", "One Level Up", cli_back },
  78. /* Root */
  79. { "root", "Back to Root", cli_root },
  80. /* Model Server - Health - Log Fault */
  81. { "logfault", "Log Fault Values", cli_models_health_log_fault },
  82. /* Health - TODO: Temporary till model publication period is triggered */
  83. { "publishstatus", "Publish Health status", cli_health_status_publish }
  84. };
  85. #endif /* CLI_HEALTH_SERVER_MODEL */
  86. #ifdef CLI_GENERICS_SERVER_MODEL
  87. /* Level - Model = Server - Generics */
  88. DECL_CONST CLI_COMMAND cli_models_generics_cmd_list[] =
  89. {
  90. /* Help */
  91. { "help", "Help", cli_help },
  92. /* Back */
  93. { "back", "One Level Up", cli_back },
  94. /* Root */
  95. { "root", "Back to Root", cli_root },
  96. #ifdef CLI_GENERICS_ONOFF_SERVER_MODEL
  97. /* Model Server - Generics - OnOff */
  98. { "onoff", "OnOff Server Model Initialization", cli_models_generics_onoff },
  99. #endif /* CLI_GENERICS_ONOFF_SERVER_MODEL */
  100. #ifdef CLI_GENERICS_LEVEL_SERVER_MODEL
  101. /* Model Server - Generics - Level */
  102. { "level", "Level Server Model Initialization", cli_models_generics_level },
  103. #endif /* CLI_GENERICS_LEVEL_SERVER_MODEL */
  104. #ifdef CLI_GENERICS_TRANSITIONTIME_SERVER_MODEL
  105. /* Model Server - Generics - Default Transition Time */
  106. { "transitiontime", "Default Transition Time Server Model Initialization", cli_models_generics_default_transition_time },
  107. #endif /* CLI_GENERICS_TRANSITIONTIME_SERVER_MODEL */
  108. #ifdef CLI_GENERICS_PWRONOFF_SERVER_MODEL
  109. /* Model Server - Generics - Power OnOff */
  110. { "poweronoff", "Power OnOff Server Model Initialization", cli_models_generics_power_onoff },
  111. #endif /* CLI_GENERICS_PWRONOFF_SERVER_MODEL */
  112. #ifdef CLI_GENERICS_PWRLEVEL_SERVER_MODEL
  113. /* Model Server - Generics - Power Level */
  114. { "powerlevel", "Power Level Server Model Initialization", cli_models_generics_power_level },
  115. #endif /* CLI_GENERICS_PWRLEVEL_SERVER_MODEL */
  116. #ifdef CLI_GENERICS_BATTERY_SERVER_MODEL
  117. /* Model Server - Generics - Battery */
  118. { "battery", "Battery Server Model Initialization", cli_models_generics_battery },
  119. #endif /* CLI_GENERICS_BATTERY_SERVER_MODEL */
  120. #ifdef CLI_GENERICS_LOCATION_SERVER_MODEL
  121. /* Model Server - Generics - Location */
  122. { "location", "Location Server Model Initialization", cli_models_generics_location },
  123. #endif /* CLI_GENERICS_LOCATION_SERVER_MODEL */
  124. #ifdef CLI_GENERICS_PROPERTY_SERVER_MODEL
  125. /* Model Server - Generics - Property */
  126. { "property", "Property Server Model Initialization", cli_models_generics_property },
  127. #endif /* CLI_GENERICS_PROPERTY_SERVER_MODEL */
  128. };
  129. #endif /* CLI_GENERICS_SERVER_MODEL */
  130. #ifdef CLI_LIGHTINGS_SERVER_MODEL
  131. /* Level - Model = Server - Light */
  132. DECL_CONST CLI_COMMAND cli_models_light_cmd_list[] =
  133. {
  134. /* Help */
  135. { "help", "Help", cli_help },
  136. /* Back */
  137. { "back", "One Level Up", cli_back },
  138. /* Root */
  139. { "root", "Back to Root", cli_root },
  140. #ifdef CLI_LIGHTINGS_LIGHTNESS_SERVER_MODEL
  141. /* Model Server - Light Lightness */
  142. { "lightness", "Lightness Server Model Initialization", cli_models_light_lightness },
  143. #endif /* CLI_LIGHTINGS_LIGHTNESS_SERVER_MODEL */
  144. #ifdef CLI_LIGHTINGS_CTL_SERVER_MODEL
  145. /* Model Server - Light CTL */
  146. { "ctl", "CTL Server Model Initialization", cli_models_light_ctl },
  147. #endif /* CLI_LIGHTINGS_CTL_SERVER_MODEL */
  148. #ifdef CLI_LIGHTINGS_HSL_SERVER_MODEL
  149. /* Model Server - Light HSL */
  150. { "hsl", "HSL Server Model Initialization", cli_models_light_hsl },
  151. #endif /* CLI_LIGHTINGS_HSL_SERVER_MODEL */
  152. #ifdef CLI_LIGHTINGS_XYL_SERVER_MODEL
  153. /* Model Server - Light xyL */
  154. { "xyl", "xyL Server Model Initialization", cli_models_light_xyl },
  155. #endif /* CLI_LIGHTINGS_XYL_SERVER_MODEL */
  156. #ifdef CLI_LIGHTINGS_LC_SERVER_MODEL
  157. /* Model Server - Light LC */
  158. { "lc", "LC Server Model Initialization", cli_models_light_lc },
  159. /* Model Server - Set Default Transition Time in ms */
  160. { "lcsettranstime", "LC Set Default Transition time in ms", cli_models_light_lc_set_default_trans_timeout_in_ms}
  161. #endif /* CLI_LIGHTINGS_LC_SERVER_MODEL */
  162. };
  163. #endif /* CLI_LIGHTINGS_SERVER_MODEL */
  164. /* ------------------------------- Functions */
  165. /* Model Server */
  166. API_RESULT cli_model_server(UINT32 argc, UCHAR *argv[])
  167. {
  168. CONSOLE_OUT("In Model Server\n");
  169. cli_cmd_stack_push((CLI_COMMAND *)cli_models_cmd_list, sizeof(cli_models_cmd_list) / sizeof(CLI_COMMAND));
  170. cli_help(argc, argv);
  171. return API_SUCCESS;
  172. }
  173. /* Model Server - Foundation Models */
  174. #ifndef HSL_DONT_USE_MULTI_ELEMENTS
  175. /* Two additional elements are registerd for HSL Server */
  176. MS_ACCESS_ELEMENT_HANDLE sec_element_handle;
  177. MS_ACCESS_ELEMENT_HANDLE ter_element_handle;
  178. #endif /* HSL_DONT_USE_MULTI_ELEMENTS */
  179. API_RESULT cli_models_foundation(UINT32 argc, UCHAR *argv[])
  180. {
  181. MS_ACCESS_NODE_ID node_id;
  182. MS_ACCESS_ELEMENT_DESC element;
  183. MS_ACCESS_ELEMENT_HANDLE element_handle;
  184. MS_ACCESS_MODEL_HANDLE config_server_model_handle;
  185. API_RESULT retval;
  186. CONSOLE_OUT("In Model Server - Foundation Models\n");
  187. /* Create Node */
  188. retval = MS_access_create_node(&node_id);
  189. /* Register Element */
  190. /**
  191. * TBD: Define GATT Namespace Descriptions from
  192. * https://www.bluetooth.com/specifications/assigned-numbers/gatt-namespace-descriptors
  193. *
  194. * Using 'main' (0x0106) as Location temporarily.
  195. */
  196. element.loc = 0x0106;
  197. retval = MS_access_register_element
  198. (
  199. node_id,
  200. &element,
  201. &element_handle
  202. );
  203. #ifdef CLI_CONFIG_SERVER_MODEL
  204. if (API_SUCCESS == retval)
  205. {
  206. retval = MS_config_server_init(element_handle, &config_server_model_handle);
  207. }
  208. #endif /* CLI_CONFIG_SERVER_MODEL */
  209. CONSOLE_OUT("Model Registration Status: 0x%04X\n", retval);
  210. #ifdef CLI_HEALTH_SERVER_MODEL
  211. /* Health Server */
  212. main_health_server_operations(MS_FALSE);
  213. #endif /* CLI_HEALTH_SERVER_MODEL */
  214. #ifndef HSL_DONT_USE_MULTI_ELEMENTS
  215. /* Two additional elements are registerd for HSL Server */
  216. retval = MS_access_register_element
  217. (
  218. node_id,
  219. &element,
  220. &sec_element_handle
  221. );
  222. if (API_SUCCESS == retval)
  223. {
  224. CONSOLE_OUT("Secondary Element Handle Registered @: 0x%04X\n", sec_element_handle);
  225. }
  226. retval = MS_access_register_element
  227. (
  228. node_id,
  229. &element,
  230. &ter_element_handle
  231. );
  232. if (API_SUCCESS == retval)
  233. {
  234. CONSOLE_OUT("Tertiary Element Handle Registered @: 0x%04X\n", ter_element_handle);
  235. }
  236. #endif /* HSL_DONT_USE_MULTI_ELEMENTS */
  237. (void) config_server_model_handle;
  238. return API_SUCCESS;
  239. }
  240. #ifdef CLI_HEALTH_SERVER_MODEL
  241. /* Model Server - Health */
  242. API_RESULT cli_models_health(UINT32 argc, UCHAR *argv[])
  243. {
  244. CONSOLE_OUT("In Model Server - Health\n");
  245. cli_cmd_stack_push((CLI_COMMAND *)cli_models_health_cmd_list, sizeof(cli_models_health_cmd_list) / sizeof(CLI_COMMAND));
  246. cli_help(argc, argv);
  247. return API_SUCCESS;
  248. }
  249. /* Model Server - Health - Log Fault */
  250. API_RESULT cli_models_health_log_fault(UINT32 argc, UCHAR *argv[])
  251. {
  252. API_RESULT retval;
  253. int choice;
  254. UINT8 test_id, fault;
  255. CONSOLE_OUT("In Model Server - Health - Log Fault\n");
  256. retval = API_FAILURE;
  257. if (2 == argc)
  258. {
  259. choice = CLI_strtoi(argv[0], CLI_strlen(argv[0]), 16);
  260. test_id = (UINT8)choice;
  261. CONSOLE_OUT("Test ID (8-bit in HEX): 0x%02X\n", test_id);
  262. choice = CLI_strtoi(argv[1], CLI_strlen(argv[1]), 16);
  263. fault = (UINT8)choice;
  264. CONSOLE_OUT("Fault Value (8-bit in HEX): 0x%02X\n", fault);
  265. retval = main_health_server_log_fault(test_id, fault);
  266. }
  267. else
  268. {
  269. CONSOLE_OUT("Usage: logfault <test_id> <fault_code>\n");
  270. retval = API_FAILURE;
  271. }
  272. CONSOLE_OUT
  273. ("retval = 0x%04X\n", retval);
  274. return retval;
  275. }
  276. /* Health - TODO: Temporary till model publication period is triggered */
  277. API_RESULT cli_health_status_publish(UINT32 argc, UCHAR *argv[])
  278. {
  279. UCHAR current_status[4] = { 0x00, 0x6A, 0x00, 0x00 };
  280. if (1 != argc)
  281. {
  282. CONSOLE_OUT("Usage: publishstatus <current status>\n");
  283. return API_FAILURE;
  284. }
  285. current_status[0] = (UCHAR)CLI_strtoi(argv[0], CLI_strlen(argv[0]), 16);
  286. return MS_health_server_publish_current_status(current_status, sizeof(current_status));
  287. }
  288. #endif /* CLI_HEALTH_SERVER_MODEL */
  289. #ifdef CLI_GENERICS_SERVER_MODEL
  290. /* Model Server - Generics */
  291. API_RESULT cli_models_generics(UINT32 argc, UCHAR *argv[])
  292. {
  293. CONSOLE_OUT("In Model Server - Generics\n");
  294. cli_cmd_stack_push((CLI_COMMAND *)cli_models_generics_cmd_list, sizeof(cli_models_generics_cmd_list) / sizeof(CLI_COMMAND));
  295. cli_help(argc, argv);
  296. return API_SUCCESS;
  297. }
  298. /* Model Server - Generics - OnOff */
  299. API_RESULT cli_models_generics_onoff(UINT32 argc, UCHAR *argv[])
  300. {
  301. CONSOLE_OUT("In Model Server - Generics - OnOff\n");
  302. main_generic_onoff_server_operations(MS_FALSE);
  303. return API_SUCCESS;
  304. }
  305. /* Model Server - Generics - Level */
  306. API_RESULT cli_models_generics_level(UINT32 argc, UCHAR *argv[])
  307. {
  308. CONSOLE_OUT("In Model Server - Generics - Level\n");
  309. main_generic_level_server_operations(MS_FALSE);
  310. return API_SUCCESS;
  311. }
  312. /* Model Server - Generics - Default Transition Time */
  313. API_RESULT cli_models_generics_default_transition_time(UINT32 argc, UCHAR *argv[])
  314. {
  315. CONSOLE_OUT("In Model Server - Generics - Default Transition Time\n");
  316. main_generic_default_transition_time_server_operations(MS_FALSE);
  317. return API_SUCCESS;
  318. }
  319. /* Model Server - Generics - Power OnOff */
  320. API_RESULT cli_models_generics_power_onoff(UINT32 argc, UCHAR *argv[])
  321. {
  322. CONSOLE_OUT("In Model Server - Generics - Power OnOff\n");
  323. main_generic_power_onoff_server_operations(MS_FALSE);
  324. return API_SUCCESS;
  325. }
  326. /* Model Server - Generics - Power Level */
  327. API_RESULT cli_models_generics_power_level(UINT32 argc, UCHAR *argv[])
  328. {
  329. CONSOLE_OUT("In Model Server - Generics - Power Level\n");
  330. main_generic_power_level_server_operations(MS_FALSE);
  331. return API_SUCCESS;
  332. }
  333. /* Model Server - Generics - Battery */
  334. API_RESULT cli_models_generics_battery(UINT32 argc, UCHAR *argv[])
  335. {
  336. CONSOLE_OUT("In Model Server - Generics - Battery\n");
  337. main_generic_battery_server_operations(MS_FALSE);
  338. return API_SUCCESS;
  339. }
  340. /* Model Server - Generics - Location */
  341. API_RESULT cli_models_generics_location(UINT32 argc, UCHAR *argv[])
  342. {
  343. CONSOLE_OUT("In Model Server - Generics - Location\n");
  344. main_generic_location_server_operations(MS_FALSE);
  345. return API_SUCCESS;
  346. }
  347. /* Model Server - Generics - Property */
  348. API_RESULT cli_models_generics_property(UINT32 argc, UCHAR *argv[])
  349. {
  350. CONSOLE_OUT("In Model Server - Generics - Property\n");
  351. main_generic_property_server_operations(MS_FALSE);
  352. return API_SUCCESS;
  353. }
  354. #endif /* CLI_GENERICS_SERVER_MODEL */
  355. #if (defined CLI_GENERICS_SERVER_MODEL || defined CLI_LIGHTINGS_SERVER_MODEL)
  356. /* Model Server - Time and Scene */
  357. /* Model Server - Scene */
  358. API_RESULT cli_models_scene(UINT32 argc, UCHAR *argv[])
  359. {
  360. CONSOLE_OUT("In Model Server - Scene\n");
  361. main_scene_server_operations(MS_FALSE);
  362. return API_SUCCESS;
  363. }
  364. #endif /* (defined CLI_GENERICS_SERVER_MODEL || defined CLI_LIGHTINGS_SERVER_MODEL) */
  365. #ifdef CLI_LIGHTINGS_SERVER_MODEL
  366. /* Model Server - Light */
  367. API_RESULT cli_models_light(UINT32 argc, UCHAR *argv[])
  368. {
  369. CONSOLE_OUT("In Model Server - Light\n");
  370. cli_cmd_stack_push((CLI_COMMAND *)cli_models_light_cmd_list, sizeof(cli_models_light_cmd_list) / sizeof(CLI_COMMAND));
  371. cli_help(argc, argv);
  372. return API_SUCCESS;
  373. }
  374. /* Model Server - Light Lightness */
  375. API_RESULT cli_models_light_lightness(UINT32 argc, UCHAR *argv[])
  376. {
  377. CONSOLE_OUT("In Model Server - Light - Lightness\n");
  378. main_light_lightness_server_operations(MS_FALSE);
  379. return API_SUCCESS;
  380. }
  381. /* Model Server - Light CTL */
  382. API_RESULT cli_models_light_ctl(UINT32 argc, UCHAR *argv[])
  383. {
  384. CONSOLE_OUT("In Model Server - Light - CTL\n");
  385. main_light_ctl_server_operations(MS_FALSE);
  386. return API_SUCCESS;
  387. }
  388. /* Model Server - Light HSL */
  389. API_RESULT cli_models_light_hsl(UINT32 argc, UCHAR *argv[])
  390. {
  391. CONSOLE_OUT("In Model Server - Light - HSL\n");
  392. main_light_hsl_server_operations(MS_FALSE);
  393. return API_SUCCESS;
  394. }
  395. /* Model Server - Light xyL */
  396. API_RESULT cli_models_light_xyl(UINT32 argc, UCHAR *argv[])
  397. {
  398. CONSOLE_OUT("In Model Server - Light - xyL\n");
  399. main_light_xyl_server_operations(MS_FALSE);
  400. return API_SUCCESS;
  401. }
  402. /* Model Server - Light LC */
  403. API_RESULT cli_models_light_lc(UINT32 argc, UCHAR *argv[])
  404. {
  405. CONSOLE_OUT("In Model Server - Light - LC\n");
  406. main_light_lc_server_operations(MS_FALSE);
  407. return API_SUCCESS;
  408. }
  409. /* Model Server - Set Default Transition Time in ms */
  410. API_RESULT cli_models_light_lc_set_default_trans_timeout_in_ms(UINT32 argc, UCHAR *argv[])
  411. {
  412. UINT32 time_in_ms;
  413. CONSOLE_OUT("In Model Server - Light - LC - Set Default Timeout in ms\n");
  414. CONSOLE_OUT("In Core Provision Setup\n");
  415. if (1 != argc)
  416. {
  417. CONSOLE_OUT("Usage: lcsettranstime <timeout in ms in HEX>\n");
  418. return API_FAILURE;
  419. }
  420. time_in_ms = CLI_strtoi(argv[0], CLI_strlen(argv[0]), 16);
  421. appl_model_light_lc_server_set_default_trans_timeout_in_ms(time_in_ms);
  422. return API_SUCCESS;
  423. }
  424. #endif /* CLI_LIGHTINGS_SERVER_MODEL */
  425. #ifdef HAVE_VENDOR_MODEL_EXAMPLE_1
  426. /* Model Server - Vendor Example 1 */
  427. API_RESULT cli_models_vendor(UINT32 argc, UCHAR *argv[])
  428. {
  429. CONSOLE_OUT("In Model Server - Vendor\n");
  430. main_vendor_example_1_server_operations(MS_FALSE);
  431. return API_SUCCESS;
  432. }
  433. #endif /* HAVE_VENDOR_MODEL_EXAMPLE_1 */
  434. /* Reset */
  435. /* TODO: Shall be part of common reset called from root */
  436. API_RESULT cli_models_reset(UINT32 argc, UCHAR *argv[])
  437. {
  438. CONSOLE_OUT("In Model Server - calling RESET\n");
  439. appl_model_power_cycle();
  440. return API_SUCCESS;
  441. }