wiliot-certificate 4.4.3__py3-none-any.whl → 4.5.0a1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (295) hide show
  1. {brg_certificate → certificate}/ag/wlt_cmd_if.html +10 -4
  2. {brg_certificate → certificate}/ag/wlt_types_ag.py +1878 -519
  3. {brg_certificate → certificate}/ag/wlt_types_ag_jsons/brg2brg_ota.json +69 -0
  4. {brg_certificate → certificate}/ag/wlt_types_ag_jsons/brg2gw_hb.json +109 -0
  5. {brg_certificate → certificate}/ag/wlt_types_ag_jsons/brg2gw_hb_sleep.json +45 -0
  6. {brg_certificate → certificate}/ag/wlt_types_ag_jsons/calibration.json +96 -0
  7. {brg_certificate → certificate}/ag/wlt_types_ag_jsons/custom.json +99 -0
  8. {brg_certificate → certificate}/ag/wlt_types_ag_jsons/datapath.json +241 -13
  9. {brg_certificate → certificate}/ag/wlt_types_ag_jsons/energy2400.json +120 -0
  10. {brg_certificate → certificate}/ag/wlt_types_ag_jsons/energySub1g.json +96 -0
  11. {brg_certificate → certificate}/ag/wlt_types_ag_jsons/externalSensor.json +135 -6
  12. {brg_certificate → certificate}/ag/wlt_types_ag_jsons/interface.json +157 -0
  13. {brg_certificate → certificate}/ag/wlt_types_ag_jsons/powerManagement.json +205 -0
  14. brg_certificate/ag/wlt_types_ag_jsons/unified_echo_pkt.json → certificate/ag/wlt_types_ag_jsons/unified_echo_ext_pkt.json +27 -11
  15. certificate/ag/wlt_types_ag_jsons/unified_echo_pkt.json +175 -0
  16. certificate/ag/wlt_types_ag_jsons/unified_sensor_pkt.json +65 -0
  17. certificate/cert_common.py +1459 -0
  18. certificate/cert_config.py +455 -0
  19. {brg_certificate → certificate}/cert_data_sim.py +131 -46
  20. {brg_certificate → certificate}/cert_defines.py +120 -128
  21. {brg_certificate → certificate}/cert_gw_sim.py +151 -49
  22. {brg_certificate → certificate}/cert_mqtt.py +164 -59
  23. {brg_certificate → certificate}/cert_prints.py +34 -33
  24. {brg_certificate → certificate}/cert_protobuf.py +15 -6
  25. {brg_certificate → certificate}/cert_results.py +205 -48
  26. certificate/cert_utils.py +622 -0
  27. certificate/certificate.py +198 -0
  28. certificate/certificate_cli.py +79 -0
  29. certificate/certificate_eth_test_list.txt +74 -0
  30. certificate/certificate_sanity_test_list.txt +65 -0
  31. certificate/certificate_test_list.txt +75 -0
  32. {brg_certificate → certificate}/tests/calibration/interval_test/interval_test.json +2 -2
  33. {brg_certificate → certificate}/tests/calibration/interval_test/interval_test.py +7 -6
  34. certificate/tests/calibration/output_power_test/output_power_test.json +22 -0
  35. certificate/tests/calibration/output_power_test/output_power_test.py +39 -0
  36. {brg_certificate → certificate}/tests/calibration/pattern_test/pattern_test.json +1 -1
  37. {brg_certificate → certificate}/tests/calibration/pattern_test/pattern_test.py +20 -15
  38. certificate/tests/cloud_connectivity/acl_ext_adv_test/acl_ext_adv_test.json +14 -0
  39. certificate/tests/cloud_connectivity/acl_ext_adv_test/acl_ext_adv_test.py +140 -0
  40. certificate/tests/cloud_connectivity/acl_test/acl_test.json +14 -0
  41. certificate/tests/cloud_connectivity/acl_test/acl_test.py +98 -0
  42. certificate/tests/cloud_connectivity/brg_ota_test/brg_ota_test.json +18 -0
  43. certificate/tests/cloud_connectivity/brg_ota_test/brg_ota_test.py +39 -0
  44. certificate/tests/cloud_connectivity/channel_scan_behaviour_test/channel_scan_behaviour_test.json +18 -0
  45. certificate/tests/cloud_connectivity/channel_scan_behaviour_test/channel_scan_behaviour_test.py +215 -0
  46. certificate/tests/cloud_connectivity/connection_test/connection_test.json +17 -0
  47. certificate/tests/cloud_connectivity/connection_test/connection_test.py +74 -0
  48. certificate/tests/cloud_connectivity/downlink_test/downlink_test.json +20 -0
  49. certificate/tests/cloud_connectivity/downlink_test/downlink_test.py +204 -0
  50. certificate/tests/cloud_connectivity/ext_adv_stress_test/ext_adv_stress_test.json +16 -0
  51. certificate/tests/cloud_connectivity/ext_adv_stress_test/ext_adv_stress_test.py +98 -0
  52. certificate/tests/cloud_connectivity/reboot_test/reboot_test.json +17 -0
  53. certificate/tests/cloud_connectivity/reboot_test/reboot_test.py +57 -0
  54. certificate/tests/cloud_connectivity/registration_test/registration_test.json +19 -0
  55. certificate/tests/cloud_connectivity/registration_test/registration_test.py +384 -0
  56. certificate/tests/cloud_connectivity/registration_test/registration_test_cli.py +90 -0
  57. certificate/tests/cloud_connectivity/stress_test/stress_test.json +16 -0
  58. certificate/tests/cloud_connectivity/stress_test/stress_test.py +97 -0
  59. certificate/tests/cloud_connectivity/uplink_ext_adv_test/uplink_ext_adv_test.json +24 -0
  60. certificate/tests/cloud_connectivity/uplink_ext_adv_test/uplink_ext_adv_test.py +93 -0
  61. certificate/tests/cloud_connectivity/uplink_test/uplink_test.json +19 -0
  62. certificate/tests/cloud_connectivity/uplink_test/uplink_test.py +161 -0
  63. {brg_certificate → certificate}/tests/datapath/aging_test/aging_test.json +1 -1
  64. certificate/tests/datapath/aging_test/aging_test.py +138 -0
  65. certificate/tests/datapath/event_ble5_test/event_ble5_test.json +16 -0
  66. certificate/tests/datapath/event_ble5_test/event_ble5_test.py +95 -0
  67. certificate/tests/datapath/event_test/event_test.json +16 -0
  68. certificate/tests/datapath/event_test/event_test.py +85 -0
  69. {brg_certificate → certificate}/tests/datapath/num_of_tags_test/num_of_tags_test.json +1 -1
  70. {brg_certificate → certificate}/tests/datapath/num_of_tags_test/num_of_tags_test.py +10 -8
  71. certificate/tests/datapath/output_power_test/output_power_test.json +22 -0
  72. {brg_certificate → certificate}/tests/datapath/output_power_test/output_power_test.py +17 -6
  73. {brg_certificate → certificate}/tests/datapath/pacer_interval_ble5_test/pacer_interval_ble5_test.json +1 -1
  74. {brg_certificate → certificate}/tests/datapath/pacer_interval_ble5_test/pacer_interval_ble5_test.py +10 -8
  75. {brg_certificate → certificate}/tests/datapath/pacer_interval_test/pacer_interval_test.json +1 -1
  76. {brg_certificate → certificate}/tests/datapath/pacer_interval_test/pacer_interval_test.py +9 -7
  77. {brg_certificate → certificate}/tests/datapath/pattern_test/pattern_test.json +2 -2
  78. {brg_certificate → certificate}/tests/datapath/pattern_test/pattern_test.py +18 -6
  79. certificate/tests/datapath/pkt_filter_ble5_chl21_test/pkt_filter_ble5_chl21_test.json +19 -0
  80. certificate/tests/datapath/pkt_filter_ble5_chl21_test/pkt_filter_ble5_chl21_test.py +61 -0
  81. {brg_certificate → certificate}/tests/datapath/pkt_filter_ble5_test/pkt_filter_ble5_test.json +1 -1
  82. {brg_certificate → certificate}/tests/datapath/pkt_filter_ble5_test/pkt_filter_ble5_test.py +11 -10
  83. certificate/tests/datapath/pkt_filter_brg2gw_ext_adv_test/pkt_filter_brg2gw_ext_adv_test.json +18 -0
  84. certificate/tests/datapath/pkt_filter_brg2gw_ext_adv_test/pkt_filter_brg2gw_ext_adv_test.py +83 -0
  85. {brg_certificate → certificate}/tests/datapath/pkt_filter_gen3_test/pkt_filter_gen3_test.json +1 -1
  86. {brg_certificate → certificate}/tests/datapath/pkt_filter_gen3_test/pkt_filter_gen3_test.py +10 -9
  87. {brg_certificate → certificate}/tests/datapath/pkt_filter_test/pkt_filter_test.json +1 -1
  88. {brg_certificate → certificate}/tests/datapath/pkt_filter_test/pkt_filter_test.py +10 -9
  89. {brg_certificate → certificate}/tests/datapath/rssi_threshold_test/rssi_threshold_test.json +1 -1
  90. {brg_certificate → certificate}/tests/datapath/rssi_threshold_test/rssi_threshold_test.py +9 -8
  91. brg_certificate/tests/datapath/output_power_test/output_power_test.json → certificate/tests/datapath/rx_channel_hopping_test/rx_channel_hopping_test.json +5 -4
  92. certificate/tests/datapath/rx_channel_hopping_test/rx_channel_hopping_test.py +77 -0
  93. {brg_certificate → certificate}/tests/datapath/rx_channel_test/rx_channel_test.json +2 -2
  94. {brg_certificate → certificate}/tests/datapath/rx_channel_test/rx_channel_test.py +7 -6
  95. {brg_certificate → certificate}/tests/datapath/rx_rate_gen2_test/rx_rate_gen2_test.json +7 -7
  96. {brg_certificate → certificate}/tests/datapath/rx_rate_gen2_test/rx_rate_gen2_test.py +112 -72
  97. {brg_certificate → certificate}/tests/datapath/rx_rate_gen3_test/rx_rate_gen3_test.json +7 -7
  98. {brg_certificate → certificate}/tests/datapath/rx_rate_gen3_test/rx_rate_gen3_test.py +112 -72
  99. {brg_certificate → certificate}/tests/datapath/stress_gen3_test/stress_gen3_test.json +3 -3
  100. {brg_certificate → certificate}/tests/datapath/stress_gen3_test/stress_gen3_test.py +12 -11
  101. {brg_certificate → certificate}/tests/datapath/stress_test/stress_test.json +3 -3
  102. {brg_certificate → certificate}/tests/datapath/stress_test/stress_test.py +12 -11
  103. {brg_certificate → certificate}/tests/datapath/tx_repetition_test/tx_repetition_test.json +2 -1
  104. {brg_certificate → certificate}/tests/datapath/tx_repetition_test/tx_repetition_test.py +14 -13
  105. certificate/tests/edge_mgmt/action_blink_test/action_blink_test.json +14 -0
  106. certificate/tests/edge_mgmt/action_blink_test/action_blink_test.py +24 -0
  107. certificate/tests/edge_mgmt/action_get_battery_sensor_test/action_get_battery_sensor_test.json +14 -0
  108. certificate/tests/edge_mgmt/action_get_battery_sensor_test/action_get_battery_sensor_test.py +43 -0
  109. certificate/tests/edge_mgmt/action_get_module_test/action_get_module_test.json +14 -0
  110. certificate/tests/edge_mgmt/action_get_module_test/action_get_module_test.py +42 -0
  111. certificate/tests/edge_mgmt/action_get_pof_data_test/action_get_pof_data_test.json +14 -0
  112. certificate/tests/edge_mgmt/action_get_pof_data_test/action_get_pof_data_test.py +44 -0
  113. certificate/tests/edge_mgmt/action_gw_hb_test/action_gw_hb_test.json +15 -0
  114. certificate/tests/edge_mgmt/action_gw_hb_test/action_gw_hb_test.py +42 -0
  115. certificate/tests/edge_mgmt/action_reboot_test/action_reboot_test.json +14 -0
  116. certificate/tests/edge_mgmt/action_reboot_test/action_reboot_test.py +49 -0
  117. certificate/tests/edge_mgmt/action_restore_defaults_test/action_restore_defaults_test.json +14 -0
  118. certificate/tests/edge_mgmt/action_restore_defaults_test/action_restore_defaults_test.py +102 -0
  119. certificate/tests/edge_mgmt/action_send_hb_test/action_send_hb_test.json +14 -0
  120. certificate/tests/edge_mgmt/action_send_hb_test/action_send_hb_test.py +41 -0
  121. {brg_certificate → certificate}/tests/edge_mgmt/periodic_msgs_test/periodic_msgs_test.json +2 -2
  122. {brg_certificate → certificate}/tests/edge_mgmt/periodic_msgs_test/periodic_msgs_test.py +22 -11
  123. {brg_certificate → certificate}/tests/energy2400/duty_cycle_test/duty_cycle_test.json +1 -1
  124. {brg_certificate → certificate}/tests/energy2400/duty_cycle_test/duty_cycle_test.py +7 -6
  125. certificate/tests/energy2400/output_power_test/output_power_test.json +22 -0
  126. {brg_certificate → certificate}/tests/energy2400/output_power_test/output_power_test.py +17 -6
  127. {brg_certificate → certificate}/tests/energy2400/pattern_test/pattern_test.json +1 -1
  128. {brg_certificate → certificate}/tests/energy2400/pattern_test/pattern_test.py +7 -6
  129. certificate/tests/energy2400/signal_indicator_ble5_test/signal_indicator_ble5_test.json +25 -0
  130. certificate/tests/energy2400/signal_indicator_ble5_test/signal_indicator_ble5_test.py +378 -0
  131. brg_certificate/tests/energy2400/signal_indicator_ble5_10_500k_test/signal_indicator_ble5_10_500k_test.json → certificate/tests/energy2400/signal_indicator_ext_adv_test/signal_indicator_ext_adv_test.json +3 -3
  132. brg_certificate/tests/energy2400/signal_indicator_ble5_10_500k_test/signal_indicator_ble5_10_500k_test.py → certificate/tests/energy2400/signal_indicator_ext_adv_test/signal_indicator_ext_adv_test.py +97 -87
  133. certificate/tests/energy2400/signal_indicator_test/signal_indicator_test.json +23 -0
  134. certificate/tests/energy2400/signal_indicator_test/signal_indicator_test.py +350 -0
  135. {brg_certificate → certificate}/tests/energy_sub1g/duty_cycle_test/duty_cycle_test.json +1 -1
  136. {brg_certificate → certificate}/tests/energy_sub1g/duty_cycle_test/duty_cycle_test.py +7 -6
  137. {brg_certificate → certificate}/tests/energy_sub1g/pattern_test/pattern_test.json +1 -1
  138. {brg_certificate → certificate}/tests/energy_sub1g/pattern_test/pattern_test.py +7 -6
  139. {brg_certificate → certificate}/tests/pwr_mgmt/pwr_mgmt_test/pwr_mgmt_test.json +1 -1
  140. {brg_certificate → certificate}/tests/pwr_mgmt/pwr_mgmt_test/pwr_mgmt_test.py +10 -10
  141. {brg_certificate → certificate}/tests/sensors/ext_sensor_test/ext_sensor_test.json +4 -4
  142. certificate/tests/sensors/ext_sensor_test/ext_sensor_test.py +455 -0
  143. certificate/wlt_types.py +122 -0
  144. {gw_certificate → common}/api_if/202/status.json +6 -0
  145. {gw_certificate → common}/api_if/203/status.json +6 -0
  146. {gw_certificate → common}/api_if/204/status.json +6 -0
  147. common/api_if/206/data.json +85 -0
  148. common/api_if/206/status.json +69 -0
  149. common/api_if/api_validation.py +85 -0
  150. common/web/templates/generator.html +148 -0
  151. common/web/templates/index.html +20 -0
  152. common/web/templates/menu.html +54 -0
  153. common/web/templates/parser.html +53 -0
  154. {brg_certificate/ag → common/web/templates}/wlt_types.html +1216 -191
  155. common/web/web_utils.py +377 -0
  156. {brg_certificate → common}/wltPb_pb2.py +14 -12
  157. {gw_certificate/common → common}/wltPb_pb2.pyi +16 -2
  158. gui_certificate/gui_certificate_cli.py +14 -0
  159. gui_certificate/server.py +1062 -0
  160. gui_certificate/templates/cert_run.html +1207 -0
  161. wiliot_certificate-4.5.0a1.dist-info/METADATA +110 -0
  162. wiliot_certificate-4.5.0a1.dist-info/RECORD +182 -0
  163. {wiliot_certificate-4.4.3.dist-info → wiliot_certificate-4.5.0a1.dist-info}/WHEEL +1 -1
  164. wiliot_certificate-4.5.0a1.dist-info/entry_points.txt +5 -0
  165. wiliot_certificate-4.5.0a1.dist-info/top_level.txt +3 -0
  166. brg_certificate/ag/energous_v0_defines.py +0 -925
  167. brg_certificate/ag/energous_v1_defines.py +0 -931
  168. brg_certificate/ag/energous_v2_defines.py +0 -925
  169. brg_certificate/ag/energous_v3_defines.py +0 -925
  170. brg_certificate/ag/energous_v4_defines.py +0 -925
  171. brg_certificate/ag/fanstel_lan_v0_defines.py +0 -925
  172. brg_certificate/ag/fanstel_lte_v0_defines.py +0 -925
  173. brg_certificate/ag/fanstel_wifi_v0_defines.py +0 -925
  174. brg_certificate/ag/minew_lte_v0_defines.py +0 -925
  175. brg_certificate/ag/wlt_types_ag_jsons/unified_echo_ext_pkt.json +0 -61
  176. brg_certificate/brg_certificate.py +0 -225
  177. brg_certificate/brg_certificate_cli.py +0 -63
  178. brg_certificate/cert_common.py +0 -923
  179. brg_certificate/cert_config.py +0 -402
  180. brg_certificate/cert_utils.py +0 -362
  181. brg_certificate/certificate_bcc_sanity_test_list.txt +0 -40
  182. brg_certificate/certificate_bcc_test_list.txt +0 -48
  183. brg_certificate/certificate_sanity_test_list.txt +0 -43
  184. brg_certificate/certificate_test_list.txt +0 -53
  185. brg_certificate/config/eclipse.json +0 -10
  186. brg_certificate/config/hivemq.json +0 -10
  187. brg_certificate/config/mosquitto.json +0 -10
  188. brg_certificate/config/mosquitto.md +0 -95
  189. brg_certificate/config/wiliot-dev.json +0 -10
  190. brg_certificate/restore_brg.py +0 -61
  191. brg_certificate/tests/calibration/output_power_test/output_power_test.json +0 -16
  192. brg_certificate/tests/calibration/output_power_test/output_power_test.py +0 -28
  193. brg_certificate/tests/datapath/aging_test/aging_test.py +0 -143
  194. brg_certificate/tests/datapath/pacer_interval_tags_count_test/pacer_interval_tags_count_test.json +0 -16
  195. brg_certificate/tests/datapath/pacer_interval_tags_count_test/pacer_interval_tags_count_test.py +0 -73
  196. brg_certificate/tests/datapath/tx_repetition_algo_test/tx_repetition_algo_test.json +0 -17
  197. brg_certificate/tests/datapath/tx_repetition_algo_test/tx_repetition_algo_test.py +0 -118
  198. brg_certificate/tests/edge_mgmt/actions_test/actions_test.json +0 -14
  199. brg_certificate/tests/edge_mgmt/actions_test/actions_test.py +0 -396
  200. brg_certificate/tests/edge_mgmt/brg2brg_ota_ble5_test/brg2brg_ota_ble5_test.json +0 -20
  201. brg_certificate/tests/edge_mgmt/brg2brg_ota_ble5_test/brg2brg_ota_ble5_test.py +0 -94
  202. brg_certificate/tests/edge_mgmt/brg2brg_ota_test/brg2brg_ota_test.json +0 -19
  203. brg_certificate/tests/edge_mgmt/brg2brg_ota_test/brg2brg_ota_test.py +0 -87
  204. brg_certificate/tests/edge_mgmt/leds_test/leds_test.json +0 -17
  205. brg_certificate/tests/edge_mgmt/leds_test/leds_test.py +0 -223
  206. brg_certificate/tests/edge_mgmt/ota_test/ota_test.json +0 -17
  207. brg_certificate/tests/edge_mgmt/ota_test/ota_test.py +0 -128
  208. brg_certificate/tests/energy2400/output_power_test/output_power_test.json +0 -16
  209. brg_certificate/tests/energy2400/signal_indicator_ble5_10_250k_test/signal_indicator_ble5_10_250k_test.json +0 -20
  210. brg_certificate/tests/energy2400/signal_indicator_ble5_10_250k_test/signal_indicator_ble5_10_250k_test.py +0 -321
  211. brg_certificate/tests/energy2400/signal_indicator_sub1g_2_4_test/signal_indicator_sub1g_2_4_test.json +0 -20
  212. brg_certificate/tests/energy2400/signal_indicator_sub1g_2_4_test/signal_indicator_sub1g_2_4_test.py +0 -141
  213. brg_certificate/tests/energy2400/signal_indicator_test/signal_indicator_test.json +0 -20
  214. brg_certificate/tests/energy2400/signal_indicator_test/signal_indicator_test.py +0 -276
  215. brg_certificate/tests/energy_sub1g/signal_indicator_functionality_test/signal_indicator_functionality_test.json +0 -20
  216. brg_certificate/tests/energy_sub1g/signal_indicator_functionality_test/signal_indicator_functionality_test.py +0 -390
  217. brg_certificate/tests/energy_sub1g/signal_indicator_test/signal_indicator_test.json +0 -16
  218. brg_certificate/tests/energy_sub1g/signal_indicator_test/signal_indicator_test.py +0 -28
  219. brg_certificate/tests/sensors/ext_sensor_test/ext_sensor_test.py +0 -305
  220. brg_certificate/wltPb_pb2.pyi +0 -234
  221. brg_certificate/wlt_types.py +0 -113
  222. gw_certificate/ag/ut_defines.py +0 -364
  223. gw_certificate/ag/wlt_types.py +0 -85
  224. gw_certificate/ag/wlt_types_ag.py +0 -5310
  225. gw_certificate/ag/wlt_types_data.py +0 -64
  226. gw_certificate/api/extended_api.py +0 -23
  227. gw_certificate/api_if/200/data.json +0 -106
  228. gw_certificate/api_if/200/status.json +0 -47
  229. gw_certificate/api_if/201/data.json +0 -98
  230. gw_certificate/api_if/201/status.json +0 -53
  231. gw_certificate/api_if/205/logs.json +0 -12
  232. gw_certificate/api_if/api_validation.py +0 -38
  233. gw_certificate/api_if/gw_capabilities.py +0 -54
  234. gw_certificate/cert_results.py +0 -145
  235. gw_certificate/common/analysis_data_bricks.py +0 -60
  236. gw_certificate/common/debug.py +0 -42
  237. gw_certificate/common/serialization_formatter.py +0 -93
  238. gw_certificate/common/utils.py +0 -8
  239. gw_certificate/common/utils_defines.py +0 -15
  240. gw_certificate/common/wltPb_pb2.py +0 -84
  241. gw_certificate/gw_certificate.py +0 -154
  242. gw_certificate/gw_certificate_cli.py +0 -87
  243. gw_certificate/interface/4.4.93_app.zip +0 -0
  244. gw_certificate/interface/4.4.93_sd_bl_app.zip +0 -0
  245. gw_certificate/interface/ble_simulator.py +0 -61
  246. gw_certificate/interface/ble_sniffer.py +0 -189
  247. gw_certificate/interface/flash_fw.py +0 -90
  248. gw_certificate/interface/if_defines.py +0 -36
  249. gw_certificate/interface/mqtt.py +0 -563
  250. gw_certificate/interface/nrfutil-linux +0 -0
  251. gw_certificate/interface/nrfutil-mac +0 -0
  252. gw_certificate/interface/nrfutil.exe +0 -0
  253. gw_certificate/interface/pkt_generator.py +0 -594
  254. gw_certificate/interface/uart_if.py +0 -236
  255. gw_certificate/interface/uart_ports.py +0 -20
  256. gw_certificate/templates/results.html +0 -241
  257. gw_certificate/templates/stage.html +0 -22
  258. gw_certificate/templates/table.html +0 -6
  259. gw_certificate/templates/test.html +0 -38
  260. gw_certificate/tests/__init__.py +0 -10
  261. gw_certificate/tests/actions.py +0 -289
  262. gw_certificate/tests/bad_crc_to_PER_quantization.csv +0 -51
  263. gw_certificate/tests/connection.py +0 -188
  264. gw_certificate/tests/downlink.py +0 -172
  265. gw_certificate/tests/generic.py +0 -238
  266. gw_certificate/tests/registration.py +0 -340
  267. gw_certificate/tests/static/__init__.py +0 -0
  268. gw_certificate/tests/static/connection_defines.py +0 -9
  269. gw_certificate/tests/static/downlink_defines.py +0 -9
  270. gw_certificate/tests/static/generated_packet_table.py +0 -195
  271. gw_certificate/tests/static/packet_table.csv +0 -10067
  272. gw_certificate/tests/static/references.py +0 -5
  273. gw_certificate/tests/static/uplink_defines.py +0 -14
  274. gw_certificate/tests/throughput.py +0 -240
  275. gw_certificate/tests/uplink.py +0 -853
  276. wiliot_certificate-4.4.3.dist-info/METADATA +0 -211
  277. wiliot_certificate-4.4.3.dist-info/RECORD +0 -210
  278. wiliot_certificate-4.4.3.dist-info/entry_points.txt +0 -3
  279. wiliot_certificate-4.4.3.dist-info/top_level.txt +0 -3
  280. {brg_certificate → certificate}/__init__.py +0 -0
  281. {brg_certificate → certificate}/ag/wlt_types_ag_jsons/side_info_sensor.json +0 -0
  282. {brg_certificate → certificate}/ag/wlt_types_ag_jsons/signal_indicator_data.json +0 -0
  283. {gw_certificate → common}/api_if/202/data.json +0 -0
  284. {gw_certificate/api_if/200 → common/api_if/202}/logs.json +0 -0
  285. {gw_certificate → common}/api_if/203/data.json +0 -0
  286. {gw_certificate/api_if/201 → common/api_if/203}/logs.json +0 -0
  287. {gw_certificate → common}/api_if/204/data.json +0 -0
  288. {gw_certificate/api_if/202 → common/api_if/204}/logs.json +0 -0
  289. {gw_certificate → common}/api_if/205/data.json +0 -0
  290. {gw_certificate/api_if/203 → common/api_if/205}/logs.json +0 -0
  291. {gw_certificate → common}/api_if/205/status.json +0 -0
  292. {gw_certificate/api_if/204 → common/api_if/206}/logs.json +0 -0
  293. {gw_certificate → common/api_if}/__init__.py +0 -0
  294. {gw_certificate/api_if → gui_certificate}/__init__.py +0 -0
  295. {wiliot_certificate-4.4.3.dist-info → wiliot_certificate-4.5.0a1.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,377 @@
1
+ from __future__ import annotations
2
+ from flask import render_template, request
3
+ import inspect
4
+ import argparse
5
+ import json
6
+ import re
7
+ from pathlib import Path
8
+ from typing import Any, Dict, List
9
+ import os, platform, shutil, subprocess, shlex
10
+ from certificate.cert_defines import *
11
+ from certificate.cert_prints import *
12
+ from certificate.wlt_types import *
13
+
14
+ ##### Defines #####
15
+
16
+ CREATE_NEW_CONSOLE = getattr(subprocess, "CREATE_NEW_CONSOLE", 0x00000010)
17
+ CFG_STRS = [
18
+ WLT_SERVER,
19
+ LAT,
20
+ LNG,
21
+ WIFI_VERSION,
22
+ BLE_VERSION,
23
+ GW_API_VERSION,
24
+ SERIALIZATION_FORMAT
25
+ ]
26
+ # App names
27
+ FDM = "FDM"
28
+ CERT_WEB = "CERTIFICATE WEB"
29
+
30
+ # Defines to update jinja_env globals
31
+ GLOBAL_DEFINES_TO_UPDATE = {k:v for k,v in ag.__dict__.items() if 'GROUP_ID' in k}
32
+
33
+ TestSchema = Dict[str, Any]
34
+ ModuleSchema = Dict[str, Any]
35
+ hex_str2int = lambda x: int(x,16)
36
+ txt2html = lambda txt : str(txt).replace(" ", "&nbsp").replace("\n", "<br>").replace("\\r\\n", "<br>").replace("//", "<br>//").lstrip("b").strip('"')
37
+ def num_to_str(id):
38
+ return str(id).zfill(2)
39
+
40
+ ##### Template Handling Functions #####
41
+
42
+ def utils_data_structs(app):
43
+ title="Enums & Packet Sructures"
44
+ wlt_types_html = "wlt_types.html"
45
+ return render_template('index.html',
46
+ app=app, title=title, wlt_types_html=wlt_types_html)
47
+
48
+ def utils_parser(app):
49
+ title = "Packet Parser"
50
+ output = ""
51
+ received_payload = request.args.get('payload')
52
+ received_payload = received_payload.upper() if received_payload else received_payload
53
+ if received_payload:
54
+ wlt_pkt = WltPkt(received_payload)
55
+ if wlt_pkt.pkt != None:
56
+ output += f"<br>Raw Packet:<br>{received_payload}<br><br>Parsed Packet:<br>{wlt_pkt}"
57
+ else:
58
+ output += "<br>Unable to parse received payload!"
59
+ print(f"output: {output}")
60
+ return render_template('parser.html',
61
+ app=app, title=title, output=txt2html(output))
62
+
63
+ def utils_generator(app):
64
+ title = "Packet Generator"
65
+ output = ""
66
+ wanted_pkt_type = request.args.get('radios')
67
+ pkt = None
68
+ dont_generate = ["Generic", "Gw2BrgHb", "PktTypesMask", "WltPkt"]
69
+ wlt_pkt_types = {
70
+ name: cls()
71
+ for name, cls in inspect.getmembers(ag, inspect.isclass)
72
+ if cls.__module__ == ag.__name__ and name not in dont_generate
73
+ }
74
+ # Find selected pkt type
75
+ for name ,p in wlt_pkt_types.items():
76
+ if name == wanted_pkt_type:
77
+ pkt = p
78
+ break
79
+
80
+ # Handle Hdr
81
+ hdr = wlt_pkt_types['Hdr']
82
+ wlt_pkt_types = {'Hdr': hdr, **{k: v for k, v in wlt_pkt_types.items() if k != 'Hdr'}} # Put 'Hdr' first
83
+ hdr_string = ""
84
+ for k in hdr.__dict__.keys():
85
+ if not request.args.get(f"Hdr_{k}"):
86
+ hdr_string += "{}={},".format(k, str(hdr.__dict__[k]))
87
+ else:
88
+ hdr_string += "{}={},".format(k, str(request.args.get(f"Hdr_{k}")))
89
+ hdr = eval_pkt(f"Hdr({hdr_string[:-1]})")
90
+ output += hdr.dump()
91
+
92
+ # Handle selected pkt
93
+ if pkt:
94
+ pkt_string = ""
95
+ for k in pkt.__dict__.keys():
96
+ if not request.args.get(f"{type(pkt).__name__}_{k}"):
97
+ pkt_string += "{}={},".format(k, str(0))
98
+ else:
99
+ pkt_string += "{}={},".format(k, str(request.args.get(f"{type(pkt).__name__}_{k}")))
100
+ pkt = eval_pkt(f"{type(pkt).__name__}({pkt_string[0:-1]})")
101
+ output += pkt.dump()
102
+ print(output)
103
+ return render_template('generator.html',
104
+ app=app, title=title, output=txt2html(output),
105
+ pkt_types=wlt_pkt_types, pkt_types_list=[k for k in wlt_pkt_types.keys() if k != 'Hdr'])
106
+
107
+ def utils_tag2brg(app):
108
+ title = "Tag to Bridge Packet Converter"
109
+ output = ""
110
+ # Get the inputs
111
+ payload = request.args.get('payload')
112
+ payload = payload.upper() if payload else payload
113
+
114
+ brg_id = request.args.get('brg_id')
115
+ brg_id = brg_id.upper() if brg_id else brg_id
116
+ rssi = request.args.get('rssi')
117
+ tbc = request.args.get('tbc')
118
+ nfpkt = request.args.get('nfpkt')
119
+ brg_latency = request.args.get('brg_latency')
120
+
121
+ if payload and brg_id and rssi and tbc and nfpkt and brg_latency:
122
+ try:
123
+ if len(payload) < 37 * 2:
124
+ raise Exception("The payload should be of size 37 bytes!")
125
+
126
+ hdr = ag.DataHdr(group_id_minor=hex_str2int(payload[20:24]), group_id_major=ag.GROUP_ID_UNIFIED_PKT_V1, pkt_type=hex_str2int(payload[24:26]))
127
+
128
+ # Convert inputs to appropriate types
129
+ rssi = int(rssi)
130
+ tbc = int(tbc)
131
+ nfpkt = int(nfpkt)
132
+ brg_latency = int(brg_latency)
133
+
134
+ # Create the bridge packet
135
+ brg_pkt = ag.UnifiedEchoPktV1(
136
+ nonce_n_unique_id=hex_str2int(payload[26:46]),
137
+ tbc=tbc,
138
+ rssi=rssi,
139
+ brg_latency=brg_latency,
140
+ nfpkt=nfpkt,
141
+ mic=hex_str2int(payload[52:58]),
142
+ data=hex_str2int(payload[58:74])
143
+ )
144
+
145
+ output += "Bridge Packet:<br>"
146
+ output += brg_id
147
+ output += hdr.dump()
148
+ output += brg_pkt.dump()
149
+ except Exception as e:
150
+ output = f"Error processing packet: {str(e)}"
151
+ else:
152
+ output = "Please fill in all required fields"
153
+
154
+ return render_template('tag2brg.html',
155
+ app=app, title=title,
156
+ output=txt2html(output))
157
+
158
+ ##### Utility Functions #####
159
+
160
+ def action_to_field(a: argparse.Action) -> Dict[str, Any]:
161
+ # field name = dest
162
+ name = a.dest
163
+
164
+ # Basic widget inference
165
+ choices = list(a.choices) if getattr(a, "choices", None) else None
166
+ is_multi = a.nargs in ("+", "*") # '+' = at least one, '*' = zero or more
167
+ is_flag = isinstance(a, (argparse._StoreTrueAction, argparse._StoreFalseAction))
168
+
169
+ html_type = "checkbox" if is_flag else "text"
170
+ widget = "input"
171
+ if choices and is_multi:
172
+ widget, html_type = "checkbox_group", "checkbox"
173
+ elif choices:
174
+ widget, html_type = "select", "text"
175
+
176
+ default = None if a.default is argparse.SUPPRESS else a.default
177
+
178
+ # Extract URL from help text if present
179
+ help_text = (a.help or "").strip()
180
+ help_link = None
181
+ if help_text:
182
+ # Match URLs (http:// or https:// followed by non-whitespace characters)
183
+ url_pattern = r'https?://[^\s]+'
184
+ url_match = re.search(url_pattern, help_text)
185
+ if url_match:
186
+ help_link = url_match.group(0)
187
+ # Remove URL from help text to avoid duplication
188
+ help_text = re.sub(url_pattern, '', help_text).strip()
189
+ return {
190
+ "name": name,
191
+ "label": (a.help or name).split('.')[0].strip().title(),
192
+ "help": help_text,
193
+ "help_link": help_link,
194
+ "required": bool(getattr(a, "required", False)) or (not a.option_strings),
195
+ "default": default,
196
+ "choices": choices,
197
+ "nargs": a.nargs,
198
+ "type": html_type,
199
+ "widget": widget,
200
+ "is_flag": is_flag,
201
+ "option_strings": a.option_strings,
202
+ }
203
+
204
+ def parser_to_schema(parser: argparse.ArgumentParser) -> Dict[str, Any]:
205
+ fields: List[Dict[str, Any]] = []
206
+ for a in parser._actions:
207
+ if argparse.SUPPRESS in a.help: continue
208
+ if isinstance(a, (argparse._HelpAction, argparse._VersionAction)):
209
+ continue
210
+ fields.append(action_to_field(a))
211
+ return {
212
+ "title": parser.prog or "CLI",
213
+ "description": parser.description or "",
214
+ "fields": fields,
215
+ }
216
+
217
+ def open_in_terminal(base_cmd: list[str], preferred: str = "auto"):
218
+ """
219
+ base_cmd: e.g. ["wlt-cert-cli", "--gw", "SIM", "--brg", "XYZ", ...]
220
+ preferred: terminal choice ("auto", "terminal", "iterm", "cmd", "powershell", "gnome-terminal", etc.)
221
+ Returns Popen handle (may be None-like if osascript exits immediately).
222
+ """
223
+ system = platform.system()
224
+ _as_quote_for_applescript = lambda s: s.replace("\\", "\\\\").replace('"', '\\"')
225
+
226
+ if system == "Windows":
227
+ term = preferred.lower()
228
+ # On Windows, use subprocess.list2cmdline for proper Windows command line formatting
229
+ import subprocess as sp
230
+ cmd_line = sp.list2cmdline(base_cmd)
231
+ if term in ("auto", "cmd"):
232
+ return subprocess.Popen(["cmd.exe", "/k", cmd_line], creationflags=CREATE_NEW_CONSOLE)
233
+ if term == "powershell":
234
+ return subprocess.Popen(["powershell.exe", "-NoExit", "-Command", cmd_line], creationflags=CREATE_NEW_CONSOLE)
235
+ # Default to cmd
236
+ return subprocess.Popen(["cmd.exe", "/k", cmd_line], creationflags=CREATE_NEW_CONSOLE)
237
+
238
+ # For non-Windows systems, use shlex.join (POSIX-safe)
239
+ cmd_str = shlex.join(base_cmd)
240
+
241
+ if system == "Darwin": # macOS
242
+ term = preferred.lower()
243
+ shell = os.environ.get("SHELL", "/bin/zsh")
244
+ # Run in login shell (loads PATH/env) and keep window open
245
+ inner = f'{shell} -lc {shlex.quote(cmd_str + f"; exec {shell}")}'
246
+
247
+ if term in ("auto", "terminal"):
248
+ scpt_activate = 'tell application "Terminal" to activate'
249
+ scpt_run = 'tell application "Terminal" to do script "{}"'.format(
250
+ _as_quote_for_applescript(inner)
251
+ )
252
+ return subprocess.Popen(["osascript", "-e", scpt_activate, "-e", scpt_run])
253
+
254
+ if term in ("iterm", "iterm2"):
255
+ scpt = (
256
+ 'tell application "iTerm"\n'
257
+ ' if (count of windows) = 0 then create window with default profile\n'
258
+ ' tell current session of current window to write text "{}"\n'
259
+ ' activate\n'
260
+ 'end tell'.format(_as_quote_for_applescript(inner))
261
+ )
262
+ return subprocess.Popen(["osascript", "-e", scpt])
263
+
264
+ # fallback to Terminal
265
+ scpt_activate = 'tell application "Terminal" to activate'
266
+ scpt_run = 'tell application "Terminal" to do script "{}"'.format(
267
+ _as_quote_for_applescript(inner)
268
+ )
269
+ return subprocess.Popen(["osascript", "-e", scpt_activate, "-e", scpt_run])
270
+
271
+ # Linux / Unix
272
+ term = preferred
273
+ def have(x): return shutil.which(x) is not None
274
+ if term == "auto":
275
+ for t in ("gnome-terminal", "konsole", "xfce4-terminal", "xterm"):
276
+ if have(t):
277
+ term = t
278
+ break
279
+ if term == "gnome-terminal":
280
+ return subprocess.Popen(["gnome-terminal", "--", "bash", "-lc", cmd_str + "; exec bash"])
281
+ if term == "konsole":
282
+ return subprocess.Popen(["konsole", "-e", "bash", "-lc", cmd_str + "; exec bash"])
283
+ if term == "xfce4-terminal":
284
+ return subprocess.Popen(["xfce4-terminal", "--command", f"bash -lc {shlex.quote(cmd_str)}; exec bash"])
285
+ if term == "xterm":
286
+ return subprocess.Popen(["xterm", "-e", f"bash -lc {shlex.quote(cmd_str)}; exec bash"])
287
+
288
+ # last resort: run without opening a new terminal
289
+ return subprocess.Popen(base_cmd)
290
+
291
+ def _read_json_safe(p: Path) -> Dict[str, Any]:
292
+ try:
293
+ with p.open("r", encoding="utf-8") as f:
294
+ return json.load(f)
295
+ except Exception:
296
+ return {}
297
+
298
+ def _tooltip(meta: Dict[str, Any], fallback: str) -> str:
299
+ if not meta:
300
+ return fallback
301
+ # prefer human fields; keep it short
302
+ parts: List[str] = []
303
+ # for k in ("name", "title"):
304
+ # if isinstance(meta.get(k), str):
305
+ # parts.append(meta[k].strip())
306
+ for k in ("description", "desc", "objective", "purpose"):
307
+ if isinstance(meta.get(k), str):
308
+ parts.append(meta[k].strip())
309
+ break
310
+ if parts:
311
+ return "\n".join(parts[:2])
312
+ try:
313
+ s = json.dumps(meta, ensure_ascii=False, separators=(",", ":"))
314
+ return s[:240] + ("…" if len(s) > 240 else "")
315
+ except Exception:
316
+ return fallback
317
+
318
+ def scan_tests_dir(root: str | Path) -> Dict[str, Any]:
319
+ """
320
+ Expect: <root>/<module>/<test>/{<test>.py, <test>.json}
321
+ Returns:
322
+ {
323
+ "root": "<abs>",
324
+ "modules": [
325
+ {"name": "datapath", "path": ".../datapath", "tests": [
326
+ {"id": "datapath/interval_test", "module": "datapath", "name": "interval_test",
327
+ "label": "interval test", "dir": "...", "py": ".../interval_test.py",
328
+ "json_path": ".../interval_test.json", "meta": {...}, "tooltip": "..." }
329
+ ]},
330
+ ...
331
+ ],
332
+ "id_to_py": {"datapath/interval_test": ".../interval_test.py", ...}
333
+ }
334
+ """
335
+ root = Path(root).resolve()
336
+ modules: List[ModuleSchema] = []
337
+ id_to_py: Dict[str, str] = {}
338
+
339
+ if not root.exists():
340
+ return {"root": str(root), "modules": [], "id_to_py": {}}
341
+
342
+ for mod_dir in sorted([p for p in root.iterdir() if p.is_dir()]):
343
+ if mod_dir.name == 'ut': continue
344
+ tests: List[TestSchema] = []
345
+ for test_dir in sorted([p for p in mod_dir.iterdir() if p.is_dir()]):
346
+ if test_dir.name == 'ut' or test_dir.name == 'registration_test': continue
347
+ # prefer <dir>/<dir>.py then first *.py
348
+ py = test_dir / (test_dir.name + ".py")
349
+ if not py.exists():
350
+ py = next(test_dir.glob("*.py"), None)
351
+ # prefer <dir>/<dir>.json then first *.json
352
+ j = test_dir / (test_dir.name + ".json")
353
+ if not j.exists():
354
+ j = next(test_dir.glob("*.json"), None)
355
+
356
+ meta = _read_json_safe(j) if j else {}
357
+ tid = f"{mod_dir.name}/{test_dir.name}"
358
+ item = {
359
+ "id": tid,
360
+ "module": mod_dir.name,
361
+ "name": test_dir.name,
362
+ # "label": test_dir.name.replace("_", " "),
363
+ "label": meta.get('name', test_dir.name.replace("_", " ")),
364
+ "dir": str(test_dir),
365
+ "py": str(py) if py else "",
366
+ "json_path": str(j) if j else "",
367
+ "meta": meta,
368
+ "tooltip": _tooltip(meta, test_dir.name),
369
+ }
370
+ tests.append(item)
371
+ if py:
372
+ id_to_py[tid] = str(py)
373
+
374
+ if tests:
375
+ modules.append({"name": mod_dir.name, "path": str(mod_dir), "tests": tests})
376
+
377
+ return {"root": str(root), "modules": modules, "id_to_py": id_to_py}
@@ -24,7 +24,7 @@ _sym_db = _symbol_database.Default()
24
24
 
25
25
 
26
26
 
27
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0bwltPb.proto\x12\x05wltPb\"$\n\x08Location\x12\x0b\n\x03lat\x18\x01 \x01(\x01\x12\x0b\n\x03lng\x18\x02 \x01(\x01\"j\n\x05Value\x12\x16\n\x0cintegerValue\x18\x01 \x01(\x03H\x00\x12\x15\n\x0bnumberValue\x18\x02 \x01(\x01H\x00\x12\x15\n\x0bstringValue\x18\x03 \x01(\tH\x00\x12\x13\n\tboolValue\x18\x04 \x01(\x08H\x00\x42\x06\n\x04type\"\x89\x02\n\x0bGatewayData\x12\x11\n\tgatewayId\x18\x01 \x01(\t\x12\x11\n\ttimestamp\x18\x02 \x01(\x04\x12*\n\x07packets\x18\x03 \x03(\x0b\x32\x19.wltPb.GatewayData.Packet\x12&\n\x08location\x18\x04 \x01(\x0b\x32\x0f.wltPb.LocationH\x00\x88\x01\x01\x1as\n\x06Packet\x12\x0f\n\x07payload\x18\x01 \x01(\x0c\x12\x11\n\ttimestamp\x18\x02 \x01(\x04\x12\x12\n\nsequenceId\x18\x03 \x01(\r\x12\x11\n\x04rssi\x18\x04 \x01(\rH\x00\x88\x01\x01\x12\x15\n\raliasBridgeId\x18\x05 \x01(\tB\x07\n\x05_rssiB\x0b\n\t_location\"\xc9\x01\n\rUplinkMessage\x12-\n\rgatewayStatus\x18\x01 \x01(\x0b\x32\x14.wltPb.GatewayStatusH\x00\x12)\n\x0bgatewayInfo\x18\x02 \x01(\x0b\x32\x12.wltPb.GatewayInfoH\x00\x12)\n\x0bgatewayLogs\x18\x03 \x01(\x0b\x32\x12.wltPb.GatewayLogsH\x00\x12+\n\x0c\x61\x63tionStatus\x18\x04 \x01(\x0b\x32\x13.wltPb.ActionStatusH\x00\x42\x06\n\x04type\"&\n\x03\x41\x43L\x12\x12\n\nmode_allow\x18\x01 \x01(\x08\x12\x0b\n\x03ids\x18\x02 \x03(\x0c\"\x97\x01\n\x12GatewayConfigValue\x12\x16\n\x0cintegerValue\x18\x01 \x01(\x03H\x00\x12\x15\n\x0bnumberValue\x18\x02 \x01(\x01H\x00\x12\x15\n\x0bstringValue\x18\x03 \x01(\tH\x00\x12\x13\n\tboolValue\x18\x04 \x01(\x08H\x00\x12\x1e\n\x08\x61\x63lValue\x18\x05 \x01(\x0b\x32\n.wltPb.ACLH\x00\x42\x06\n\x04type\"\xe8\x03\n\rGatewayStatus\x12\x11\n\tgatewayId\x18\x01 \x01(\t\x12\x13\n\x0bgatewayType\x18\x02 \x01(\t\x12\x19\n\x11\x64ownlinkSupported\x18\x03 \x01(\x08\x12!\n\x19\x62ridgeOtaUpgradeSupported\x18\x04 \x01(\x08\x12\x12\n\napiVersion\x18\x05 \x01(\r\x12\x14\n\x07version\x18\x06 \x01(\tH\x00\x88\x01\x01\x12\x19\n\x0c\x62leSwVersion\x18\x07 \x01(\tH\x01\x88\x01\x01\x12\x1f\n\x12interfaceSwVersion\x18\x08 \x01(\tH\x02\x88\x01\x01\x12&\n\x08location\x18\t \x01(\x0b\x32\x0f.wltPb.LocationH\x03\x88\x01\x01\x12\x30\n\x06\x63onfig\x18\n \x03(\x0b\x32 .wltPb.GatewayStatus.ConfigEntry\x12\x17\n\nbleAddress\x18\x0b \x01(\tH\x04\x88\x01\x01\x1aH\n\x0b\x43onfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12(\n\x05value\x18\x02 \x01(\x0b\x32\x19.wltPb.GatewayConfigValue:\x02\x38\x01\x42\n\n\x08_versionB\x0f\n\r_bleSwVersionB\x15\n\x13_interfaceSwVersionB\x0b\n\t_locationB\r\n\x0b_bleAddress\"}\n\x0bGatewayInfo\x12\x30\n\x07\x65ntries\x18\x01 \x03(\x0b\x32\x1f.wltPb.GatewayInfo.EntriesEntry\x1a<\n\x0c\x45ntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.wltPb.Value:\x02\x38\x01\"\x1b\n\x0bGatewayLogs\x12\x0c\n\x04logs\x18\x01 \x03(\t\"\x92\x01\n\x0c\x41\x63tionStatus\x12\x0e\n\x06\x61\x63tion\x18\x01 \x01(\r\x12\x0e\n\x06status\x18\x02 \x01(\r\x12\x11\n\x04step\x18\x03 \x01(\rH\x00\x88\x01\x01\x12\x15\n\x08progress\x18\x04 \x01(\rH\x01\x88\x01\x01\x12\x15\n\x08\x62ridgeId\x18\x05 \x01(\x0cH\x02\x88\x01\x01\x42\x07\n\x05_stepB\x0b\n\t_progressB\x0b\n\t_bridgeId\"\x8e\x02\n\x0f\x44ownlinkMessage\x12#\n\x08txPacket\x18\x01 \x01(\x0b\x32\x0f.wltPb.TxPacketH\x00\x12-\n\rgatewayAction\x18\x02 \x01(\x0b\x32\x14.wltPb.GatewayActionH\x00\x12-\n\rbridgeUpgrade\x18\x03 \x01(\x0b\x32\x14.wltPb.BridgeUpgradeH\x00\x12-\n\rgatewayConfig\x18\x04 \x01(\x0b\x32\x14.wltPb.GatewayConfigH\x00\x12-\n\rcustomMessage\x18\x06 \x01(\x0b\x32\x14.wltPb.CustomMessageH\x00\x42\x06\n\x04typeJ\x04\x08\x05\x10\x06R\x0c\x63ustomBroker\"F\n\x08TxPacket\x12\x0f\n\x07payload\x18\x01 \x01(\x0c\x12\x12\n\nmaxRetries\x18\x02 \x01(\r\x12\x15\n\rmaxDurationMs\x18\x03 \x01(\r\"\x1f\n\rGatewayAction\x12\x0e\n\x06\x61\x63tion\x18\x01 \x01(\t\"\xa5\x01\n\rBridgeUpgrade\x12\x14\n\x0crebootPacket\x18\x01 \x01(\x0c\x12\x17\n\x0ftxMaxDurationMs\x18\x02 \x01(\r\x12\x14\n\x0ctxMaxRetries\x18\x03 \x01(\r\x12\x10\n\x08\x62ridgeId\x18\x04 \x01(\t\x12\x13\n\x0bversionUuid\x18\x05 \x01(\t\x12\x13\n\x0bupgradeBlSd\x18\x06 \x01(\x08\x12\x13\n\x0bimageDirUrl\x18\x07 \x01(\t\"\xc6\x02\n\rGatewayConfig\x12\x14\n\x07version\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x19\n\x0c\x62leSwVersion\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x1f\n\x12interfaceSwVersion\x18\x03 \x01(\tH\x02\x88\x01\x01\x12&\n\x08location\x18\x04 \x01(\x0b\x32\x0f.wltPb.LocationH\x03\x88\x01\x01\x12\x30\n\x06\x63onfig\x18\x05 \x03(\x0b\x32 .wltPb.GatewayConfig.ConfigEntry\x1aH\n\x0b\x43onfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12(\n\x05value\x18\x02 \x01(\x0b\x32\x19.wltPb.GatewayConfigValue:\x02\x38\x01\x42\n\n\x08_versionB\x0f\n\r_bleSwVersionB\x15\n\x13_interfaceSwVersionB\x0b\n\t_location\"\x81\x01\n\rCustomMessage\x12\x32\n\x07\x65ntries\x18\x01 \x03(\x0b\x32!.wltPb.CustomMessage.EntriesEntry\x1a<\n\x0c\x45ntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.wltPb.Value:\x02\x38\x01\x62\x06proto3')
27
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0bwltPb.proto\x12\x05wltPb\"$\n\x08Location\x12\x0b\n\x03lat\x18\x01 \x01(\x01\x12\x0b\n\x03lng\x18\x02 \x01(\x01\"j\n\x05Value\x12\x16\n\x0cintegerValue\x18\x01 \x01(\x03H\x00\x12\x15\n\x0bnumberValue\x18\x02 \x01(\x01H\x00\x12\x15\n\x0bstringValue\x18\x03 \x01(\tH\x00\x12\x13\n\tboolValue\x18\x04 \x01(\x08H\x00\x42\x06\n\x04type\"\x89\x02\n\x0bGatewayData\x12\x11\n\tgatewayId\x18\x01 \x01(\t\x12\x11\n\ttimestamp\x18\x02 \x01(\x04\x12*\n\x07packets\x18\x03 \x03(\x0b\x32\x19.wltPb.GatewayData.Packet\x12&\n\x08location\x18\x04 \x01(\x0b\x32\x0f.wltPb.LocationH\x00\x88\x01\x01\x1as\n\x06Packet\x12\x0f\n\x07payload\x18\x01 \x01(\x0c\x12\x11\n\ttimestamp\x18\x02 \x01(\x04\x12\x12\n\nsequenceId\x18\x03 \x01(\r\x12\x11\n\x04rssi\x18\x04 \x01(\rH\x00\x88\x01\x01\x12\x15\n\raliasBridgeId\x18\x05 \x01(\tB\x07\n\x05_rssiB\x0b\n\t_location\"\xc9\x01\n\rUplinkMessage\x12-\n\rgatewayStatus\x18\x01 \x01(\x0b\x32\x14.wltPb.GatewayStatusH\x00\x12)\n\x0bgatewayInfo\x18\x02 \x01(\x0b\x32\x12.wltPb.GatewayInfoH\x00\x12)\n\x0bgatewayLogs\x18\x03 \x01(\x0b\x32\x12.wltPb.GatewayLogsH\x00\x12+\n\x0c\x61\x63tionStatus\x18\x04 \x01(\x0b\x32\x13.wltPb.ActionStatusH\x00\x42\x06\n\x04type\"&\n\x03\x41\x43L\x12\x12\n\nmode_allow\x18\x01 \x01(\x08\x12\x0b\n\x03ids\x18\x02 \x03(\x0c\"\x97\x01\n\x12GatewayConfigValue\x12\x16\n\x0cintegerValue\x18\x01 \x01(\x03H\x00\x12\x15\n\x0bnumberValue\x18\x02 \x01(\x01H\x00\x12\x15\n\x0bstringValue\x18\x03 \x01(\tH\x00\x12\x13\n\tboolValue\x18\x04 \x01(\x08H\x00\x12\x1e\n\x08\x61\x63lValue\x18\x05 \x01(\x0b\x32\n.wltPb.ACLH\x00\x42\x06\n\x04type\"\xe8\x03\n\rGatewayStatus\x12\x11\n\tgatewayId\x18\x01 \x01(\t\x12\x13\n\x0bgatewayType\x18\x02 \x01(\t\x12\x19\n\x11\x64ownlinkSupported\x18\x03 \x01(\x08\x12!\n\x19\x62ridgeOtaUpgradeSupported\x18\x04 \x01(\x08\x12\x12\n\napiVersion\x18\x05 \x01(\r\x12\x14\n\x07version\x18\x06 \x01(\tH\x00\x88\x01\x01\x12\x19\n\x0c\x62leSwVersion\x18\x07 \x01(\tH\x01\x88\x01\x01\x12\x1f\n\x12interfaceSwVersion\x18\x08 \x01(\tH\x02\x88\x01\x01\x12&\n\x08location\x18\t \x01(\x0b\x32\x0f.wltPb.LocationH\x03\x88\x01\x01\x12\x30\n\x06\x63onfig\x18\n \x03(\x0b\x32 .wltPb.GatewayStatus.ConfigEntry\x12\x17\n\nbleAddress\x18\x0b \x01(\tH\x04\x88\x01\x01\x1aH\n\x0b\x43onfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12(\n\x05value\x18\x02 \x01(\x0b\x32\x19.wltPb.GatewayConfigValue:\x02\x38\x01\x42\n\n\x08_versionB\x0f\n\r_bleSwVersionB\x15\n\x13_interfaceSwVersionB\x0b\n\t_locationB\r\n\x0b_bleAddress\"}\n\x0bGatewayInfo\x12\x30\n\x07\x65ntries\x18\x01 \x03(\x0b\x32\x1f.wltPb.GatewayInfo.EntriesEntry\x1a<\n\x0c\x45ntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.wltPb.Value:\x02\x38\x01\"\x1b\n\x0bGatewayLogs\x12\x0c\n\x04logs\x18\x01 \x03(\t\"\x92\x01\n\x0c\x41\x63tionStatus\x12\x0e\n\x06\x61\x63tion\x18\x01 \x01(\r\x12\x0e\n\x06status\x18\x02 \x01(\r\x12\x11\n\x04step\x18\x03 \x01(\rH\x00\x88\x01\x01\x12\x15\n\x08progress\x18\x04 \x01(\rH\x01\x88\x01\x01\x12\x15\n\x08\x62ridgeId\x18\x05 \x01(\x0cH\x02\x88\x01\x01\x42\x07\n\x05_stepB\x0b\n\t_progressB\x0b\n\t_bridgeId\"\xbf\x02\n\x0f\x44ownlinkMessage\x12#\n\x08txPacket\x18\x01 \x01(\x0b\x32\x0f.wltPb.TxPacketH\x00\x12-\n\rgatewayAction\x18\x02 \x01(\x0b\x32\x14.wltPb.GatewayActionH\x00\x12-\n\rbridgeUpgrade\x18\x03 \x01(\x0b\x32\x14.wltPb.BridgeUpgradeH\x00\x12-\n\rgatewayConfig\x18\x04 \x01(\x0b\x32\x14.wltPb.GatewayConfigH\x00\x12-\n\rcustomMessage\x18\x06 \x01(\x0b\x32\x14.wltPb.CustomMessageH\x00\x12/\n\x0egatewayUpgrade\x18\x07 \x01(\x0b\x32\x15.wltPb.GatewayUpgradeH\x00\x42\x06\n\x04typeJ\x04\x08\x05\x10\x06R\x0c\x63ustomBroker\"F\n\x08TxPacket\x12\x0f\n\x07payload\x18\x01 \x01(\x0c\x12\x12\n\nmaxRetries\x18\x02 \x01(\r\x12\x15\n\rmaxDurationMs\x18\x03 \x01(\r\"\x1f\n\rGatewayAction\x12\x0e\n\x06\x61\x63tion\x18\x01 \x01(\t\"\xa5\x01\n\rBridgeUpgrade\x12\x14\n\x0crebootPacket\x18\x01 \x01(\x0c\x12\x17\n\x0ftxMaxDurationMs\x18\x02 \x01(\r\x12\x14\n\x0ctxMaxRetries\x18\x03 \x01(\r\x12\x10\n\x08\x62ridgeId\x18\x04 \x01(\t\x12\x13\n\x0bversionUuid\x18\x05 \x01(\t\x12\x13\n\x0bupgradeBlSd\x18\x06 \x01(\x08\x12\x13\n\x0bimageDirUrl\x18\x07 \x01(\t\"\xc6\x02\n\rGatewayConfig\x12\x14\n\x07version\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x19\n\x0c\x62leSwVersion\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x1f\n\x12interfaceSwVersion\x18\x03 \x01(\tH\x02\x88\x01\x01\x12&\n\x08location\x18\x04 \x01(\x0b\x32\x0f.wltPb.LocationH\x03\x88\x01\x01\x12\x30\n\x06\x63onfig\x18\x05 \x03(\x0b\x32 .wltPb.GatewayConfig.ConfigEntry\x1aH\n\x0b\x43onfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12(\n\x05value\x18\x02 \x01(\x0b\x32\x19.wltPb.GatewayConfigValue:\x02\x38\x01\x42\n\n\x08_versionB\x0f\n\r_bleSwVersionB\x15\n\x13_interfaceSwVersionB\x0b\n\t_location\"\x81\x01\n\rCustomMessage\x12\x32\n\x07\x65ntries\x18\x01 \x03(\x0b\x32!.wltPb.CustomMessage.EntriesEntry\x1a<\n\x0c\x45ntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.wltPb.Value:\x02\x38\x01\"\x9a\x01\n\x0eGatewayUpgrade\x12\x13\n\x0bimageDirUrl\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\t\x12\x1f\n\x12interfaceSwVersion\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x19\n\x0c\x62leSwVersion\x18\x04 \x01(\tH\x01\x88\x01\x01\x42\x15\n\x13_interfaceSwVersionB\x0f\n\r_bleSwVersionb\x06proto3')
28
28
 
29
29
  _globals = globals()
30
30
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -66,19 +66,21 @@ if not _descriptor._USE_C_DESCRIPTORS:
66
66
  _globals['_ACTIONSTATUS']._serialized_start=1482
67
67
  _globals['_ACTIONSTATUS']._serialized_end=1628
68
68
  _globals['_DOWNLINKMESSAGE']._serialized_start=1631
69
- _globals['_DOWNLINKMESSAGE']._serialized_end=1901
70
- _globals['_TXPACKET']._serialized_start=1903
71
- _globals['_TXPACKET']._serialized_end=1973
72
- _globals['_GATEWAYACTION']._serialized_start=1975
73
- _globals['_GATEWAYACTION']._serialized_end=2006
74
- _globals['_BRIDGEUPGRADE']._serialized_start=2009
75
- _globals['_BRIDGEUPGRADE']._serialized_end=2174
76
- _globals['_GATEWAYCONFIG']._serialized_start=2177
77
- _globals['_GATEWAYCONFIG']._serialized_end=2503
69
+ _globals['_DOWNLINKMESSAGE']._serialized_end=1950
70
+ _globals['_TXPACKET']._serialized_start=1952
71
+ _globals['_TXPACKET']._serialized_end=2022
72
+ _globals['_GATEWAYACTION']._serialized_start=2024
73
+ _globals['_GATEWAYACTION']._serialized_end=2055
74
+ _globals['_BRIDGEUPGRADE']._serialized_start=2058
75
+ _globals['_BRIDGEUPGRADE']._serialized_end=2223
76
+ _globals['_GATEWAYCONFIG']._serialized_start=2226
77
+ _globals['_GATEWAYCONFIG']._serialized_end=2552
78
78
  _globals['_GATEWAYCONFIG_CONFIGENTRY']._serialized_start=1171
79
79
  _globals['_GATEWAYCONFIG_CONFIGENTRY']._serialized_end=1243
80
- _globals['_CUSTOMMESSAGE']._serialized_start=2506
81
- _globals['_CUSTOMMESSAGE']._serialized_end=2635
80
+ _globals['_CUSTOMMESSAGE']._serialized_start=2555
81
+ _globals['_CUSTOMMESSAGE']._serialized_end=2684
82
82
  _globals['_CUSTOMMESSAGE_ENTRIESENTRY']._serialized_start=1390
83
83
  _globals['_CUSTOMMESSAGE_ENTRIESENTRY']._serialized_end=1450
84
+ _globals['_GATEWAYUPGRADE']._serialized_start=2687
85
+ _globals['_GATEWAYUPGRADE']._serialized_end=2841
84
86
  # @@protoc_insertion_point(module_scope)
@@ -152,18 +152,20 @@ class ActionStatus(_message.Message):
152
152
  def __init__(self, action: _Optional[int] = ..., status: _Optional[int] = ..., step: _Optional[int] = ..., progress: _Optional[int] = ..., bridgeId: _Optional[bytes] = ...) -> None: ...
153
153
 
154
154
  class DownlinkMessage(_message.Message):
155
- __slots__ = ("txPacket", "gatewayAction", "bridgeUpgrade", "gatewayConfig", "customMessage")
155
+ __slots__ = ("txPacket", "gatewayAction", "bridgeUpgrade", "gatewayConfig", "customMessage", "gatewayUpgrade")
156
156
  TXPACKET_FIELD_NUMBER: _ClassVar[int]
157
157
  GATEWAYACTION_FIELD_NUMBER: _ClassVar[int]
158
158
  BRIDGEUPGRADE_FIELD_NUMBER: _ClassVar[int]
159
159
  GATEWAYCONFIG_FIELD_NUMBER: _ClassVar[int]
160
160
  CUSTOMMESSAGE_FIELD_NUMBER: _ClassVar[int]
161
+ GATEWAYUPGRADE_FIELD_NUMBER: _ClassVar[int]
161
162
  txPacket: TxPacket
162
163
  gatewayAction: GatewayAction
163
164
  bridgeUpgrade: BridgeUpgrade
164
165
  gatewayConfig: GatewayConfig
165
166
  customMessage: CustomMessage
166
- def __init__(self, txPacket: _Optional[_Union[TxPacket, _Mapping]] = ..., gatewayAction: _Optional[_Union[GatewayAction, _Mapping]] = ..., bridgeUpgrade: _Optional[_Union[BridgeUpgrade, _Mapping]] = ..., gatewayConfig: _Optional[_Union[GatewayConfig, _Mapping]] = ..., customMessage: _Optional[_Union[CustomMessage, _Mapping]] = ...) -> None: ...
167
+ gatewayUpgrade: GatewayUpgrade
168
+ def __init__(self, txPacket: _Optional[_Union[TxPacket, _Mapping]] = ..., gatewayAction: _Optional[_Union[GatewayAction, _Mapping]] = ..., bridgeUpgrade: _Optional[_Union[BridgeUpgrade, _Mapping]] = ..., gatewayConfig: _Optional[_Union[GatewayConfig, _Mapping]] = ..., customMessage: _Optional[_Union[CustomMessage, _Mapping]] = ..., gatewayUpgrade: _Optional[_Union[GatewayUpgrade, _Mapping]] = ...) -> None: ...
167
169
 
168
170
  class TxPacket(_message.Message):
169
171
  __slots__ = ("payload", "maxRetries", "maxDurationMs")
@@ -232,3 +234,15 @@ class CustomMessage(_message.Message):
232
234
  ENTRIES_FIELD_NUMBER: _ClassVar[int]
233
235
  entries: _containers.MessageMap[str, Value]
234
236
  def __init__(self, entries: _Optional[_Mapping[str, Value]] = ...) -> None: ...
237
+
238
+ class GatewayUpgrade(_message.Message):
239
+ __slots__ = ("imageDirUrl", "version", "interfaceSwVersion", "bleSwVersion")
240
+ IMAGEDIRURL_FIELD_NUMBER: _ClassVar[int]
241
+ VERSION_FIELD_NUMBER: _ClassVar[int]
242
+ INTERFACESWVERSION_FIELD_NUMBER: _ClassVar[int]
243
+ BLESWVERSION_FIELD_NUMBER: _ClassVar[int]
244
+ imageDirUrl: str
245
+ version: str
246
+ interfaceSwVersion: str
247
+ bleSwVersion: str
248
+ def __init__(self, imageDirUrl: _Optional[str] = ..., version: _Optional[str] = ..., interfaceSwVersion: _Optional[str] = ..., bleSwVersion: _Optional[str] = ...) -> None: ...
@@ -0,0 +1,14 @@
1
+ import argparse
2
+ import webbrowser
3
+ from .server import app
4
+
5
+ def main():
6
+ parser = argparse.ArgumentParser(prog="wlt-cert-gui")
7
+ parser.add_argument("--host", default="127.0.0.1")
8
+ parser.add_argument("--port", type=int, default=5000)
9
+ parser.add_argument("--debug", action="store_true")
10
+ args = parser.parse_args()
11
+
12
+ webbrowser.open(f"http://{args.host}:{args.port}")
13
+ app.run(host=args.host, port=args.port, debug=args.debug)
14
+