wiliot-certificate 4.4.2__py3-none-any.whl → 4.5.0__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 (297) 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. certificate/cert_common.py +1488 -0
  4. certificate/cert_config.py +480 -0
  5. {brg_certificate → certificate}/cert_data_sim.py +134 -46
  6. {brg_certificate → certificate}/cert_defines.py +129 -128
  7. {brg_certificate → certificate}/cert_gw_sim.py +183 -53
  8. {brg_certificate → certificate}/cert_mqtt.py +179 -64
  9. {brg_certificate → certificate}/cert_prints.py +35 -33
  10. {brg_certificate → certificate}/cert_protobuf.py +15 -6
  11. {brg_certificate → certificate}/cert_results.py +240 -64
  12. certificate/cert_utils.py +634 -0
  13. certificate/certificate.py +205 -0
  14. certificate/certificate_cli.py +76 -0
  15. certificate/certificate_eth_test_list.txt +76 -0
  16. certificate/certificate_sanity_test_list.txt +66 -0
  17. certificate/certificate_test_list.txt +76 -0
  18. {brg_certificate → certificate}/tests/calibration/interval_test/interval_test.json +3 -2
  19. {brg_certificate → certificate}/tests/calibration/interval_test/interval_test.py +7 -6
  20. certificate/tests/calibration/output_power_test/output_power_test.json +23 -0
  21. certificate/tests/calibration/output_power_test/output_power_test.py +39 -0
  22. {brg_certificate → certificate}/tests/calibration/pattern_test/pattern_test.json +2 -1
  23. {brg_certificate → certificate}/tests/calibration/pattern_test/pattern_test.py +20 -15
  24. certificate/tests/cloud_connectivity/acl_ext_adv_test/acl_ext_adv_test.json +15 -0
  25. certificate/tests/cloud_connectivity/acl_ext_adv_test/acl_ext_adv_test.py +140 -0
  26. certificate/tests/cloud_connectivity/acl_test/acl_test.json +15 -0
  27. certificate/tests/cloud_connectivity/acl_test/acl_test.py +96 -0
  28. certificate/tests/cloud_connectivity/brg_ota_test/brg_ota_test.json +19 -0
  29. certificate/tests/cloud_connectivity/brg_ota_test/brg_ota_test.py +41 -0
  30. certificate/tests/cloud_connectivity/channel_scan_behaviour_test/channel_scan_behaviour_test.json +19 -0
  31. certificate/tests/cloud_connectivity/channel_scan_behaviour_test/channel_scan_behaviour_test.py +215 -0
  32. certificate/tests/cloud_connectivity/connection_test/connection_test.json +18 -0
  33. certificate/tests/cloud_connectivity/connection_test/connection_test.py +67 -0
  34. certificate/tests/cloud_connectivity/deduplication_test/deduplication_test.json +15 -0
  35. certificate/tests/cloud_connectivity/deduplication_test/deduplication_test.py +80 -0
  36. certificate/tests/cloud_connectivity/downlink_test/downlink_test.json +21 -0
  37. certificate/tests/cloud_connectivity/downlink_test/downlink_test.py +201 -0
  38. certificate/tests/cloud_connectivity/ext_adv_stress_test/ext_adv_stress_test.json +17 -0
  39. certificate/tests/cloud_connectivity/ext_adv_stress_test/ext_adv_stress_test.py +104 -0
  40. certificate/tests/cloud_connectivity/reboot_test/reboot_test.json +18 -0
  41. certificate/tests/cloud_connectivity/reboot_test/reboot_test.py +59 -0
  42. certificate/tests/cloud_connectivity/registration_test/registration_test.json +20 -0
  43. certificate/tests/cloud_connectivity/registration_test/registration_test.py +384 -0
  44. certificate/tests/cloud_connectivity/registration_test/registration_test_cli.py +90 -0
  45. certificate/tests/cloud_connectivity/stress_test/stress_test.json +17 -0
  46. certificate/tests/cloud_connectivity/stress_test/stress_test.py +101 -0
  47. certificate/tests/cloud_connectivity/uplink_ext_adv_test/uplink_ext_adv_test.json +25 -0
  48. certificate/tests/cloud_connectivity/uplink_ext_adv_test/uplink_ext_adv_test.py +92 -0
  49. certificate/tests/cloud_connectivity/uplink_test/uplink_test.json +20 -0
  50. certificate/tests/cloud_connectivity/uplink_test/uplink_test.py +169 -0
  51. {brg_certificate → certificate}/tests/datapath/aging_test/aging_test.json +2 -1
  52. certificate/tests/datapath/aging_test/aging_test.py +142 -0
  53. certificate/tests/datapath/event_ble5_test/event_ble5_test.json +17 -0
  54. certificate/tests/datapath/event_ble5_test/event_ble5_test.py +89 -0
  55. certificate/tests/datapath/event_test/event_test.json +17 -0
  56. certificate/tests/datapath/event_test/event_test.py +80 -0
  57. {brg_certificate → certificate}/tests/datapath/num_of_tags_test/num_of_tags_test.json +4 -3
  58. {brg_certificate → certificate}/tests/datapath/num_of_tags_test/num_of_tags_test.py +19 -13
  59. certificate/tests/datapath/output_power_test/output_power_test.json +23 -0
  60. {brg_certificate → certificate}/tests/datapath/output_power_test/output_power_test.py +17 -6
  61. {brg_certificate → certificate}/tests/datapath/pacer_interval_ble5_test/pacer_interval_ble5_test.json +2 -1
  62. {brg_certificate → certificate}/tests/datapath/pacer_interval_ble5_test/pacer_interval_ble5_test.py +13 -11
  63. {brg_certificate → certificate}/tests/datapath/pacer_interval_test/pacer_interval_test.json +2 -1
  64. {brg_certificate → certificate}/tests/datapath/pacer_interval_test/pacer_interval_test.py +9 -7
  65. {brg_certificate → certificate}/tests/datapath/pattern_test/pattern_test.json +3 -2
  66. {brg_certificate → certificate}/tests/datapath/pattern_test/pattern_test.py +18 -6
  67. certificate/tests/datapath/pkt_filter_ble5_chl21_test/pkt_filter_ble5_chl21_test.json +20 -0
  68. certificate/tests/datapath/pkt_filter_ble5_chl21_test/pkt_filter_ble5_chl21_test.py +61 -0
  69. {brg_certificate → certificate}/tests/datapath/pkt_filter_ble5_test/pkt_filter_ble5_test.json +2 -1
  70. {brg_certificate → certificate}/tests/datapath/pkt_filter_ble5_test/pkt_filter_ble5_test.py +15 -14
  71. certificate/tests/datapath/pkt_filter_brg2gw_ext_adv_test/pkt_filter_brg2gw_ext_adv_test.json +19 -0
  72. certificate/tests/datapath/pkt_filter_brg2gw_ext_adv_test/pkt_filter_brg2gw_ext_adv_test.py +85 -0
  73. {brg_certificate → certificate}/tests/datapath/pkt_filter_gen3_test/pkt_filter_gen3_test.json +2 -1
  74. {brg_certificate → certificate}/tests/datapath/pkt_filter_gen3_test/pkt_filter_gen3_test.py +10 -9
  75. {brg_certificate → certificate}/tests/datapath/pkt_filter_test/pkt_filter_test.json +2 -1
  76. {brg_certificate → certificate}/tests/datapath/pkt_filter_test/pkt_filter_test.py +10 -9
  77. {brg_certificate → certificate}/tests/datapath/rssi_threshold_test/rssi_threshold_test.json +3 -2
  78. {brg_certificate → certificate}/tests/datapath/rssi_threshold_test/rssi_threshold_test.py +9 -8
  79. brg_certificate/tests/datapath/output_power_test/output_power_test.json → certificate/tests/datapath/rx_channel_hopping_test/rx_channel_hopping_test.json +6 -4
  80. certificate/tests/datapath/rx_channel_hopping_test/rx_channel_hopping_test.py +77 -0
  81. {brg_certificate → certificate}/tests/datapath/rx_channel_test/rx_channel_test.json +3 -2
  82. {brg_certificate → certificate}/tests/datapath/rx_channel_test/rx_channel_test.py +7 -6
  83. {brg_certificate → certificate}/tests/datapath/rx_rate_gen2_test/rx_rate_gen2_test.json +8 -7
  84. {brg_certificate → certificate}/tests/datapath/rx_rate_gen2_test/rx_rate_gen2_test.py +113 -73
  85. {brg_certificate → certificate}/tests/datapath/rx_rate_gen3_test/rx_rate_gen3_test.json +8 -7
  86. {brg_certificate → certificate}/tests/datapath/rx_rate_gen3_test/rx_rate_gen3_test.py +112 -72
  87. {brg_certificate → certificate}/tests/datapath/stress_gen3_test/stress_gen3_test.json +4 -3
  88. {brg_certificate → certificate}/tests/datapath/stress_gen3_test/stress_gen3_test.py +15 -11
  89. {brg_certificate → certificate}/tests/datapath/stress_test/stress_test.json +4 -3
  90. {brg_certificate → certificate}/tests/datapath/stress_test/stress_test.py +15 -11
  91. {brg_certificate → certificate}/tests/datapath/tx_repetition_test/tx_repetition_test.json +3 -1
  92. {brg_certificate → certificate}/tests/datapath/tx_repetition_test/tx_repetition_test.py +14 -13
  93. certificate/tests/edge_mgmt/action_blink_test/action_blink_test.json +15 -0
  94. certificate/tests/edge_mgmt/action_blink_test/action_blink_test.py +24 -0
  95. certificate/tests/edge_mgmt/action_get_battery_sensor_test/action_get_battery_sensor_test.json +15 -0
  96. certificate/tests/edge_mgmt/action_get_battery_sensor_test/action_get_battery_sensor_test.py +43 -0
  97. certificate/tests/edge_mgmt/action_get_module_test/action_get_module_test.json +15 -0
  98. certificate/tests/edge_mgmt/action_get_module_test/action_get_module_test.py +42 -0
  99. certificate/tests/edge_mgmt/action_get_pof_data_test/action_get_pof_data_test.json +15 -0
  100. certificate/tests/edge_mgmt/action_get_pof_data_test/action_get_pof_data_test.py +44 -0
  101. certificate/tests/edge_mgmt/action_gw_hb_test/action_gw_hb_test.json +16 -0
  102. certificate/tests/edge_mgmt/action_gw_hb_test/action_gw_hb_test.py +42 -0
  103. certificate/tests/edge_mgmt/action_reboot_test/action_reboot_test.json +15 -0
  104. certificate/tests/edge_mgmt/action_reboot_test/action_reboot_test.py +49 -0
  105. certificate/tests/edge_mgmt/action_restore_defaults_test/action_restore_defaults_test.json +15 -0
  106. certificate/tests/edge_mgmt/action_restore_defaults_test/action_restore_defaults_test.py +102 -0
  107. certificate/tests/edge_mgmt/action_send_hb_test/action_send_hb_test.json +15 -0
  108. certificate/tests/edge_mgmt/action_send_hb_test/action_send_hb_test.py +45 -0
  109. {brg_certificate → certificate}/tests/edge_mgmt/periodic_msgs_test/periodic_msgs_test.json +3 -2
  110. {brg_certificate → certificate}/tests/edge_mgmt/periodic_msgs_test/periodic_msgs_test.py +22 -11
  111. {brg_certificate → certificate}/tests/energy2400/duty_cycle_test/duty_cycle_test.json +2 -1
  112. {brg_certificate → certificate}/tests/energy2400/duty_cycle_test/duty_cycle_test.py +7 -6
  113. certificate/tests/energy2400/output_power_test/output_power_test.json +23 -0
  114. {brg_certificate → certificate}/tests/energy2400/output_power_test/output_power_test.py +17 -6
  115. {brg_certificate → certificate}/tests/energy2400/pattern_test/pattern_test.json +2 -1
  116. {brg_certificate → certificate}/tests/energy2400/pattern_test/pattern_test.py +7 -6
  117. certificate/tests/energy2400/signal_indicator_ble5_test/signal_indicator_ble5_test.json +26 -0
  118. certificate/tests/energy2400/signal_indicator_ble5_test/signal_indicator_ble5_test.py +379 -0
  119. certificate/tests/energy2400/signal_indicator_ext_adv_test/signal_indicator_ext_adv_test.json +20 -0
  120. certificate/tests/energy2400/signal_indicator_ext_adv_test/signal_indicator_ext_adv_test.py +173 -0
  121. certificate/tests/energy2400/signal_indicator_test/signal_indicator_test.json +24 -0
  122. certificate/tests/energy2400/signal_indicator_test/signal_indicator_test.py +350 -0
  123. {brg_certificate → certificate}/tests/energy_sub1g/duty_cycle_test/duty_cycle_test.json +2 -1
  124. {brg_certificate → certificate}/tests/energy_sub1g/duty_cycle_test/duty_cycle_test.py +7 -6
  125. {brg_certificate → certificate}/tests/energy_sub1g/pattern_test/pattern_test.json +2 -1
  126. {brg_certificate → certificate}/tests/energy_sub1g/pattern_test/pattern_test.py +7 -6
  127. {brg_certificate → certificate}/tests/pwr_mgmt/pwr_mgmt_test/pwr_mgmt_test.json +2 -1
  128. {brg_certificate → certificate}/tests/pwr_mgmt/pwr_mgmt_test/pwr_mgmt_test.py +10 -10
  129. {brg_certificate → certificate}/tests/sensors/ext_sensor_test/ext_sensor_test.json +5 -4
  130. certificate/tests/sensors/ext_sensor_test/ext_sensor_test.py +450 -0
  131. certificate/wlt_types.py +122 -0
  132. {gw_certificate → common}/api_if/202/status.json +6 -0
  133. {gw_certificate → common}/api_if/203/status.json +6 -0
  134. {gw_certificate → common}/api_if/204/status.json +6 -0
  135. common/api_if/206/data.json +85 -0
  136. common/api_if/206/status.json +69 -0
  137. common/api_if/api_validation.py +91 -0
  138. common/web/templates/generator.html +210 -0
  139. common/web/templates/index.html +20 -0
  140. common/web/templates/menu.html +54 -0
  141. common/web/templates/parser.html +53 -0
  142. {brg_certificate/ag → common/web/templates}/wlt_types.html +1216 -191
  143. common/web/web_utils.py +399 -0
  144. {brg_certificate → common}/wltPb_pb2.py +14 -12
  145. {gw_certificate/common → common}/wltPb_pb2.pyi +16 -2
  146. gui_certificate/gui_certificate_cli.py +14 -0
  147. gui_certificate/server.py +1267 -0
  148. gui_certificate/templates/cert_run.html +1273 -0
  149. wiliot_certificate-4.5.0.dist-info/METADATA +99 -0
  150. wiliot_certificate-4.5.0.dist-info/RECORD +168 -0
  151. {wiliot_certificate-4.4.2.dist-info → wiliot_certificate-4.5.0.dist-info}/WHEEL +1 -1
  152. wiliot_certificate-4.5.0.dist-info/entry_points.txt +5 -0
  153. wiliot_certificate-4.5.0.dist-info/top_level.txt +3 -0
  154. brg_certificate/ag/energous_v0_defines.py +0 -925
  155. brg_certificate/ag/energous_v1_defines.py +0 -931
  156. brg_certificate/ag/energous_v2_defines.py +0 -925
  157. brg_certificate/ag/energous_v3_defines.py +0 -925
  158. brg_certificate/ag/energous_v4_defines.py +0 -925
  159. brg_certificate/ag/fanstel_lan_v0_defines.py +0 -925
  160. brg_certificate/ag/fanstel_lte_v0_defines.py +0 -925
  161. brg_certificate/ag/fanstel_wifi_v0_defines.py +0 -925
  162. brg_certificate/ag/minew_lte_v0_defines.py +0 -925
  163. brg_certificate/ag/wlt_types_ag_jsons/brg2brg_ota.json +0 -142
  164. brg_certificate/ag/wlt_types_ag_jsons/brg2gw_hb.json +0 -785
  165. brg_certificate/ag/wlt_types_ag_jsons/brg2gw_hb_sleep.json +0 -139
  166. brg_certificate/ag/wlt_types_ag_jsons/calibration.json +0 -394
  167. brg_certificate/ag/wlt_types_ag_jsons/custom.json +0 -515
  168. brg_certificate/ag/wlt_types_ag_jsons/datapath.json +0 -672
  169. brg_certificate/ag/wlt_types_ag_jsons/energy2400.json +0 -550
  170. brg_certificate/ag/wlt_types_ag_jsons/energySub1g.json +0 -595
  171. brg_certificate/ag/wlt_types_ag_jsons/externalSensor.json +0 -598
  172. brg_certificate/ag/wlt_types_ag_jsons/interface.json +0 -938
  173. brg_certificate/ag/wlt_types_ag_jsons/powerManagement.json +0 -1234
  174. brg_certificate/ag/wlt_types_ag_jsons/side_info_sensor.json +0 -105
  175. brg_certificate/ag/wlt_types_ag_jsons/signal_indicator_data.json +0 -77
  176. brg_certificate/ag/wlt_types_ag_jsons/unified_echo_ext_pkt.json +0 -61
  177. brg_certificate/ag/wlt_types_ag_jsons/unified_echo_pkt.json +0 -110
  178. brg_certificate/brg_certificate.py +0 -225
  179. brg_certificate/brg_certificate_cli.py +0 -63
  180. brg_certificate/cert_common.py +0 -923
  181. brg_certificate/cert_config.py +0 -402
  182. brg_certificate/cert_utils.py +0 -362
  183. brg_certificate/certificate_bcc_sanity_test_list.txt +0 -40
  184. brg_certificate/certificate_bcc_test_list.txt +0 -48
  185. brg_certificate/certificate_sanity_test_list.txt +0 -43
  186. brg_certificate/certificate_test_list.txt +0 -53
  187. brg_certificate/config/eclipse.json +0 -10
  188. brg_certificate/config/hivemq.json +0 -10
  189. brg_certificate/config/mosquitto.json +0 -10
  190. brg_certificate/config/mosquitto.md +0 -95
  191. brg_certificate/config/wiliot-dev.json +0 -10
  192. brg_certificate/restore_brg.py +0 -61
  193. brg_certificate/tests/calibration/output_power_test/output_power_test.json +0 -16
  194. brg_certificate/tests/calibration/output_power_test/output_power_test.py +0 -28
  195. brg_certificate/tests/datapath/aging_test/aging_test.py +0 -143
  196. brg_certificate/tests/datapath/pacer_interval_tags_count_test/pacer_interval_tags_count_test.json +0 -16
  197. brg_certificate/tests/datapath/pacer_interval_tags_count_test/pacer_interval_tags_count_test.py +0 -73
  198. brg_certificate/tests/datapath/tx_repetition_algo_test/tx_repetition_algo_test.json +0 -17
  199. brg_certificate/tests/datapath/tx_repetition_algo_test/tx_repetition_algo_test.py +0 -118
  200. brg_certificate/tests/edge_mgmt/actions_test/actions_test.json +0 -14
  201. brg_certificate/tests/edge_mgmt/actions_test/actions_test.py +0 -396
  202. brg_certificate/tests/edge_mgmt/brg2brg_ota_ble5_test/brg2brg_ota_ble5_test.json +0 -20
  203. brg_certificate/tests/edge_mgmt/brg2brg_ota_ble5_test/brg2brg_ota_ble5_test.py +0 -94
  204. brg_certificate/tests/edge_mgmt/brg2brg_ota_test/brg2brg_ota_test.json +0 -19
  205. brg_certificate/tests/edge_mgmt/brg2brg_ota_test/brg2brg_ota_test.py +0 -87
  206. brg_certificate/tests/edge_mgmt/leds_test/leds_test.json +0 -17
  207. brg_certificate/tests/edge_mgmt/leds_test/leds_test.py +0 -223
  208. brg_certificate/tests/edge_mgmt/ota_test/ota_test.json +0 -17
  209. brg_certificate/tests/edge_mgmt/ota_test/ota_test.py +0 -128
  210. brg_certificate/tests/energy2400/output_power_test/output_power_test.json +0 -16
  211. brg_certificate/tests/energy2400/signal_indicator_ble5_10_250k_test/signal_indicator_ble5_10_250k_test.json +0 -20
  212. brg_certificate/tests/energy2400/signal_indicator_ble5_10_250k_test/signal_indicator_ble5_10_250k_test.py +0 -321
  213. brg_certificate/tests/energy2400/signal_indicator_ble5_10_500k_test/signal_indicator_ble5_10_500k_test.json +0 -20
  214. brg_certificate/tests/energy2400/signal_indicator_ble5_10_500k_test/signal_indicator_ble5_10_500k_test.py +0 -321
  215. brg_certificate/tests/energy2400/signal_indicator_sub1g_2_4_test/signal_indicator_sub1g_2_4_test.json +0 -20
  216. brg_certificate/tests/energy2400/signal_indicator_sub1g_2_4_test/signal_indicator_sub1g_2_4_test.py +0 -141
  217. brg_certificate/tests/energy2400/signal_indicator_test/signal_indicator_test.json +0 -20
  218. brg_certificate/tests/energy2400/signal_indicator_test/signal_indicator_test.py +0 -276
  219. brg_certificate/tests/energy_sub1g/signal_indicator_functionality_test/signal_indicator_functionality_test.json +0 -20
  220. brg_certificate/tests/energy_sub1g/signal_indicator_functionality_test/signal_indicator_functionality_test.py +0 -390
  221. brg_certificate/tests/energy_sub1g/signal_indicator_test/signal_indicator_test.json +0 -16
  222. brg_certificate/tests/energy_sub1g/signal_indicator_test/signal_indicator_test.py +0 -28
  223. brg_certificate/tests/sensors/ext_sensor_test/ext_sensor_test.py +0 -305
  224. brg_certificate/wltPb_pb2.pyi +0 -234
  225. brg_certificate/wlt_types.py +0 -113
  226. gw_certificate/ag/ut_defines.py +0 -364
  227. gw_certificate/ag/wlt_types.py +0 -85
  228. gw_certificate/ag/wlt_types_ag.py +0 -5310
  229. gw_certificate/ag/wlt_types_data.py +0 -64
  230. gw_certificate/api/extended_api.py +0 -23
  231. gw_certificate/api_if/200/data.json +0 -106
  232. gw_certificate/api_if/200/status.json +0 -47
  233. gw_certificate/api_if/201/data.json +0 -98
  234. gw_certificate/api_if/201/status.json +0 -53
  235. gw_certificate/api_if/205/logs.json +0 -12
  236. gw_certificate/api_if/api_validation.py +0 -38
  237. gw_certificate/api_if/gw_capabilities.py +0 -54
  238. gw_certificate/cert_results.py +0 -145
  239. gw_certificate/common/analysis_data_bricks.py +0 -60
  240. gw_certificate/common/debug.py +0 -42
  241. gw_certificate/common/serialization_formatter.py +0 -93
  242. gw_certificate/common/utils.py +0 -8
  243. gw_certificate/common/utils_defines.py +0 -15
  244. gw_certificate/common/wltPb_pb2.py +0 -84
  245. gw_certificate/gw_certificate.py +0 -154
  246. gw_certificate/gw_certificate_cli.py +0 -87
  247. gw_certificate/interface/4.4.91_app.zip +0 -0
  248. gw_certificate/interface/4.4.91_sd_bl_app.zip +0 -0
  249. gw_certificate/interface/ble_simulator.py +0 -61
  250. gw_certificate/interface/ble_sniffer.py +0 -189
  251. gw_certificate/interface/flash_fw.py +0 -90
  252. gw_certificate/interface/if_defines.py +0 -36
  253. gw_certificate/interface/mqtt.py +0 -563
  254. gw_certificate/interface/nrfutil-linux +0 -0
  255. gw_certificate/interface/nrfutil-mac +0 -0
  256. gw_certificate/interface/nrfutil.exe +0 -0
  257. gw_certificate/interface/pkt_generator.py +0 -594
  258. gw_certificate/interface/uart_if.py +0 -236
  259. gw_certificate/interface/uart_ports.py +0 -20
  260. gw_certificate/templates/results.html +0 -241
  261. gw_certificate/templates/stage.html +0 -22
  262. gw_certificate/templates/table.html +0 -6
  263. gw_certificate/templates/test.html +0 -38
  264. gw_certificate/tests/__init__.py +0 -10
  265. gw_certificate/tests/actions.py +0 -289
  266. gw_certificate/tests/bad_crc_to_PER_quantization.csv +0 -51
  267. gw_certificate/tests/connection.py +0 -188
  268. gw_certificate/tests/downlink.py +0 -172
  269. gw_certificate/tests/generic.py +0 -238
  270. gw_certificate/tests/registration.py +0 -340
  271. gw_certificate/tests/static/__init__.py +0 -0
  272. gw_certificate/tests/static/connection_defines.py +0 -9
  273. gw_certificate/tests/static/downlink_defines.py +0 -9
  274. gw_certificate/tests/static/generated_packet_table.py +0 -195
  275. gw_certificate/tests/static/packet_table.csv +0 -10067
  276. gw_certificate/tests/static/references.py +0 -5
  277. gw_certificate/tests/static/uplink_defines.py +0 -14
  278. gw_certificate/tests/throughput.py +0 -240
  279. gw_certificate/tests/uplink.py +0 -853
  280. wiliot_certificate-4.4.2.dist-info/METADATA +0 -211
  281. wiliot_certificate-4.4.2.dist-info/RECORD +0 -210
  282. wiliot_certificate-4.4.2.dist-info/entry_points.txt +0 -3
  283. wiliot_certificate-4.4.2.dist-info/top_level.txt +0 -3
  284. {brg_certificate → certificate}/__init__.py +0 -0
  285. {gw_certificate → common}/api_if/202/data.json +0 -0
  286. {gw_certificate/api_if/200 → common/api_if/202}/logs.json +0 -0
  287. {gw_certificate → common}/api_if/203/data.json +0 -0
  288. {gw_certificate/api_if/201 → common/api_if/203}/logs.json +0 -0
  289. {gw_certificate → common}/api_if/204/data.json +0 -0
  290. {gw_certificate/api_if/202 → common/api_if/204}/logs.json +0 -0
  291. {gw_certificate → common}/api_if/205/data.json +0 -0
  292. {gw_certificate/api_if/203 → common/api_if/205}/logs.json +0 -0
  293. {gw_certificate → common}/api_if/205/status.json +0 -0
  294. {gw_certificate/api_if/204 → common/api_if/206}/logs.json +0 -0
  295. {gw_certificate → common/api_if}/__init__.py +0 -0
  296. {gw_certificate/api_if → gui_certificate}/__init__.py +0 -0
  297. {wiliot_certificate-4.4.2.dist-info → wiliot_certificate-4.5.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,85 @@
1
+ {
2
+ "type": "object",
3
+ "properties": {
4
+ "gatewayId": {
5
+ "type": "string",
6
+ "maxLength": 36
7
+ },
8
+ "gatewayType": {
9
+ "type": "string"
10
+ },
11
+ "timestamp": {
12
+ "type": "number"
13
+ },
14
+ "packets": {
15
+ "description": "Unified Packet",
16
+ "type": "array",
17
+ "items": {
18
+ "type": "object",
19
+ "properties": {
20
+ "aliasBridgeId": {
21
+ "type": "string"
22
+ },
23
+ "timestamp": {
24
+ "type": "number"
25
+ },
26
+ "sequenceId": {
27
+ "type": "number"
28
+ },
29
+ "rssi": {
30
+ "type": "number"
31
+ },
32
+ "payload": {
33
+ "type": "string"
34
+ }
35
+ },
36
+ "if": {
37
+ "description": "unified SI packet + Sensor packet",
38
+ "properties":{
39
+ "payload": {
40
+ "oneOf": [
41
+ { "pattern": "[1][eE][1][6][cC][6][fF][cC][0][0][0][0][37bBfF][fF]" },
42
+ { "pattern": "[1][eE][1][6][cC][6][fF][cC][0][0][0][0][eE][eE]" },
43
+ { "pattern": "[1][eE][1][6][9][0][fF][cC]" },
44
+ { "pattern": "[1][eE][1][6][cC][6][fF][cC][0][0][0][0][eE][bB]" }
45
+ ]
46
+ }
47
+ }
48
+ },
49
+ "then": {
50
+ "required": ["aliasBridgeId", "timestamp", "sequenceId", "payload"]
51
+ },
52
+ "else": {
53
+ "required": ["timestamp", "sequenceId", "payload"]
54
+ }
55
+ }
56
+ }
57
+ },
58
+ "required": [
59
+ "gatewayId",
60
+ "gatewayType",
61
+ "timestamp",
62
+ "packets"
63
+ ],
64
+ "dependentSchemas": {
65
+ "location": {
66
+ "properties": {
67
+ "location": {
68
+ "type": "object",
69
+ "properties": {
70
+ "lat": {
71
+ "type": "number"
72
+ },
73
+ "lng": {
74
+ "type": "number"
75
+ }
76
+ },
77
+ "required": [
78
+ "lat",
79
+ "lng"
80
+ ]
81
+ }
82
+ }
83
+ }
84
+ }
85
+ }
@@ -0,0 +1,69 @@
1
+ {
2
+ "type": "object",
3
+ "patternProperties": {
4
+ "^gatewayI[dD]$": {
5
+ "type": "string",
6
+ "maxLength": 36
7
+ }
8
+ },
9
+ "properties": {
10
+ "gatewayType": {
11
+ "type": "string"
12
+ },
13
+ "gatewayConf": {
14
+ "type": "object",
15
+ "properties": {
16
+ "apiVersion": {
17
+ "type": "string",
18
+ "enum": ["206"]
19
+ },
20
+ "bleAddress": {
21
+ "type": "string"
22
+ },
23
+ "gatewayVersion": {
24
+ "type": "string"
25
+ },
26
+ "interfaceChipSwVersion": {
27
+ "type": "string"
28
+ },
29
+ "bleChipSwVersion": {
30
+ "type": "string"
31
+ },
32
+ "additional": {
33
+ "additionalProperties": true
34
+ }
35
+ },
36
+ "required": ["apiVersion", "bleAddress"],
37
+ "oneOf":[
38
+ {"required": ["gatewayVersion"]},
39
+ {"required": ["interfaceChipSwVersion", "bleChipSwVersion"]}
40
+ ]
41
+ },
42
+ "tagMetadataCouplingSupported": {
43
+ "type": "boolean"
44
+ },
45
+ "downlinkSupported": {
46
+ "type": "boolean"
47
+ },
48
+ "bridgeOtaUpgradeSupported": {
49
+ "type": "boolean"
50
+ },
51
+ "fwUpgradeSupported": {
52
+ "type": "boolean"
53
+ },
54
+ "geoLocationSupport": {
55
+ "type": "boolean"
56
+ },
57
+ "gatewayInfo": {
58
+ "type":"object",
59
+ "additionalProperties":true
60
+ }
61
+ },
62
+ "oneOf":[
63
+ {"required": ["gatewayId", "gatewayType", "gatewayConf", "tagMetadataCouplingSupported", "downlinkSupported", "bridgeOtaUpgradeSupported", "fwUpgradeSupported"]},
64
+ {"required": ["gatewayID", "gatewayType", "gatewayConf", "tagMetadataCouplingSupported", "downlinkSupported", "bridgeOtaUpgradeSupported", "fwUpgradeSupported"]}
65
+ ],
66
+ "additionalProperties": false
67
+ }
68
+
69
+
@@ -0,0 +1,91 @@
1
+ import json
2
+ from jsonschema import Draft202012Validator
3
+ import pkg_resources
4
+ from enum import Enum
5
+
6
+ from certificate.cert_prints import *
7
+ from certificate.cert_defines import GW_LOGS
8
+ import certificate.cert_utils as cert_utils
9
+ import certificate.cert_mqtt as cert_mqtt
10
+
11
+ class MESSAGE_TYPES(Enum):
12
+ STATUS = "status"
13
+ DATA = "data"
14
+ LOGS = "logs"
15
+
16
+ API_VALIDATION = "API Validation"
17
+
18
+ def api_validation(test):
19
+ phase_run_print(API_VALIDATION)
20
+ api_validation_phase = cert_utils.Phase(API_VALIDATION, rc=TEST_PASSED)
21
+
22
+ if test.dut.protobuf:
23
+ utPrint("API validation is skipped for protobuf messages", "WARNING")
24
+ api_validation_phase.rc = TEST_SKIPPED
25
+ api_validation_phase.reason = "API validation is skipped for protobuf messages"
26
+ test.add_phase(api_validation_phase)
27
+ return test
28
+ elif not test.dut.gw_api_version:
29
+ utPrint("API validation is skipped because no API version was specified", "WARNING")
30
+ api_validation_phase.rc = TEST_FAILED
31
+ api_validation_phase.reason = "API validation is skipped because no API version was specified"
32
+ test.add_phase(api_validation_phase)
33
+ return test
34
+ else:
35
+ def validate_message(message: dict, msg_type=MESSAGE_TYPES.DATA.value) -> tuple[bool, str]:
36
+ json_path = pkg_resources.resource_filename(__name__, f"{test.dut.gw_api_version}/{msg_type}.json")
37
+ with open(json_path) as f:
38
+ relevant_schema = json.load(f)
39
+ validator = Draft202012Validator(relevant_schema)
40
+ valid = validator.is_valid(message)
41
+ errors = [e for e in validator.iter_errors(message)]
42
+ return (valid, errors)
43
+
44
+ utPrint(f"Validating all messages in the test according to API version {test.dut.gw_api_version} validation schema", "BLUE")
45
+ report = []
46
+ phase_passed = True
47
+ for msg_type in MESSAGE_TYPES:
48
+ if msg_type.value == MESSAGE_TYPES.STATUS.value:
49
+ all_msgs = [msg.body for msg in test.get_mqttc_by_target(DUT)._userdata[PKTS].status if GW_LOGS not in msg.body]
50
+ elif msg_type.value == MESSAGE_TYPES.LOGS.value:
51
+ all_msgs = [msg.body for msg in test.get_mqttc_by_target(DUT)._userdata[PKTS].status if GW_LOGS in msg.body]
52
+ else:
53
+ all_msgs = [msg.body for msg in test.get_mqttc_by_target(DUT)._userdata[PKTS].data]
54
+
55
+ utPrint(f"Validating {msg_type.value} messages", "BLUE")
56
+ message_type_passed = True
57
+ total_num_of_errors = 0
58
+ error_report = []
59
+ for idx, message_body in enumerate(all_msgs):
60
+ if msg_type.value == MESSAGE_TYPES.DATA.value and len(message_body[PACKETS]) == 0:
61
+ continue
62
+ validation = validate_message(message_body, msg_type.value)
63
+ errors = []
64
+ for e in validation[1]:
65
+ if e.message not in errors:
66
+ errors.append(e.message)
67
+ if not validation[0]:
68
+ phase_passed = False
69
+ message_type_passed = False
70
+ total_num_of_errors += len(errors)
71
+ error_report.append(f'The errors in message (idx={idx}, json timestamp={message_body.get(TIMESTAMP)}) Errors:')
72
+ for idx, e in enumerate(errors):
73
+ error_report.append(f'Error number {idx}:\n {e}')
74
+ report.append("\n")
75
+ report.append(f'Summary for {msg_type.value} messages')
76
+ report.append({'valid': {message_type_passed}, 'num of errors': total_num_of_errors})
77
+ report.append('******************************************************\n')
78
+ report.extend(error_report)
79
+ utPrint("\nAPI validation errors:", "BLUE")
80
+ for line in report:
81
+ print(line)
82
+ report_path = os.path.join(ARTIFACTS_DIR, test.dir, 'api_validation_report.txt')
83
+ with open(report_path, 'w') as f:
84
+ for line in report:
85
+ f.write(str(line) + '\n')
86
+ if not phase_passed:
87
+ api_validation_phase.rc = TEST_FAILED
88
+ api_validation_phase.reason = "API (JSON strcture) is invalid"
89
+ field_functionality_pass_fail_print(api_validation_phase, API_VALIDATION)
90
+ test.add_phase(api_validation_phase)
91
+ return test
@@ -0,0 +1,210 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <!-- Required meta tags -->
5
+ <meta charset="utf-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1">
7
+ <title>{{ app }}</title>
8
+ <link rel="icon" href="https://www.wiliot.com/favicon.ico" type="image/x-icon" />
9
+ <!-- Bootstrap CSS -->
10
+ <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
11
+ <style>
12
+ #card-body {
13
+ height: 550px;
14
+ overflow:auto;
15
+ }
16
+ </style>
17
+ </head>
18
+ <body>
19
+ <div class="container">
20
+ {% include 'menu.html' %}
21
+ <h1 style="color:#00AB83">{{ title }}</h1>
22
+ <hr>
23
+ <form class="form-horizontal" id="form" action="">
24
+ <div class="row mb-3">
25
+ <div class="col-md-6">
26
+ <label for="filter_category" class="form-label"><strong>Filter by Type:</strong></label>
27
+ <select class="form-select" id="filter_category" name="filter_category" onchange="applyFilters()">
28
+ <option value="">All Types</option>
29
+ {% for cat in categories %}
30
+ <option value="{{ cat }}" {% if cat == filter_category or (not filter_category and cat == 'Module') %}selected{% endif %}>{{ cat }}</option>
31
+ {% endfor %}
32
+ </select>
33
+ </div>
34
+ <div class="col-md-6">
35
+ <label for="filter_version" class="form-label"><strong>Filter by API Version:</strong></label>
36
+ <select class="form-select" id="filter_version" name="filter_version" onchange="applyFilters()">
37
+ <option value="">All Versions</option>
38
+ {% for ver in api_versions %}
39
+ <option value="{{ ver }}" {% if ver == filter_version or (not filter_version and ver|int == API_VERSION_LATEST) %}selected{% endif %}>V{{ ver }}</option>
40
+ {% endfor %}
41
+ </select>
42
+ </div>
43
+ </div>
44
+ <hr>
45
+ <div id="builder_form">
46
+ {% for n in pkt_types_list %}
47
+ <div class="form-check form-check-inline pkt-radio"
48
+ data-category="{{ pkt_metadata.get(n, {}).get('category', 'Other') }}"
49
+ data-version="{{ pkt_metadata.get(n, {}).get('api_version', '') }}">
50
+ <input class="form-check-input" type="radio" name="radios" value="{{ n }}" id="radio_{{ n }}"
51
+ {% if n == wanted_pkt_type %}checked{% endif %} onclick="show();">
52
+ <label class="form-check-label" for="radio_{{ n }}">{{ n }}</label>
53
+ </div>
54
+ {% endfor %}
55
+ {% for n,p in pkt_types.items() %}
56
+ <div id="{{ n }}_form" style="display: none;">
57
+ <hr>
58
+ {% for k,v in p.__dict__.items() %}
59
+ <div class="row">
60
+ <label for="{{ n }}_{{ k }}" class="col-sm-2">{{ k }}:</label>
61
+ {% set field_name = n + '_' + k %}
62
+ {% set saved_value = form_values.get(field_name, '') %}
63
+ {% if saved_value %}
64
+ {% set display_value = saved_value %}
65
+ {% elif k == 'brg_mac' or k == 'pkt_size' or k == 'ad_type' or k == 'uuid_msb' or k == 'uuid_lsb' or k == 'group_id' %}
66
+ {% set display_value = '0x' + ('%0x' % v).upper() %}
67
+ {% else %}
68
+ {% set display_value = v %}
69
+ {% endif %}
70
+ <input type="text" class="col-sm-4" name="{{ n }}_{{ k }}" value="{{ display_value }}">
71
+ </div>
72
+ {% endfor %}
73
+ </div>
74
+ {% endfor %}
75
+ </div>
76
+ <hr>
77
+ <div class="row">
78
+ <button type="submit" class="btn btn-primary col-sm-12">Build Packet</button>
79
+ </div>
80
+ </form>
81
+ <br>
82
+ <br>
83
+ <div class="card">
84
+ <div class="card-header">
85
+ Output
86
+ </div>
87
+ <div class="card-body" id="card-body">
88
+ <samp>{{ output | safe }}</samp>
89
+ </div>
90
+ </div>
91
+ <br>
92
+ <br>
93
+ <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
94
+ <script>
95
+ var pktMetadata = {{ pkt_metadata | tojson | safe }};
96
+
97
+ function applyFilters() {
98
+ const categoryFilter = document.getElementById('filter_category').value;
99
+ const versionFilter = document.getElementById('filter_version').value;
100
+ const radioContainers = document.querySelectorAll('.pkt-radio');
101
+ radioContainers.forEach(function(container) {
102
+ const category = container.getAttribute('data-category');
103
+ const version = container.getAttribute('data-version');
104
+ const radio = container.querySelector('input[type="radio"]');
105
+ let show = true;
106
+ // Filter by category
107
+ if (categoryFilter && category !== categoryFilter) {
108
+ show = false;
109
+ }
110
+ // Filter by version
111
+ if (versionFilter && version !== versionFilter) {
112
+ show = false;
113
+ }
114
+ // Show/hide the container
115
+ if (show) {
116
+ container.style.display = 'inline-block';
117
+ } else {
118
+ container.style.display = 'none';
119
+ // Uncheck if hidden
120
+ if (radio.checked) {
121
+ radio.checked = false;
122
+ }
123
+ }
124
+ });
125
+ }
126
+
127
+ const form = document.getElementById('form');
128
+ const group_id_brg2gw = {{ GROUP_ID_BRG2GW }};
129
+ const group_id_gw2brg = {{ GROUP_ID_GW2BRG }};
130
+ const group_id_side_info_sensor = {{ GROUP_ID_SIDE_INFO_SENSOR }};
131
+ const group_id_side_info = {{ GROUP_ID_SIDE_INFO }};
132
+ const group_id_signal_indicator = {{ GROUP_ID_SIGNAL_INDICATOR }};
133
+ const group_id_unified_v0 = {{ GROUP_ID_UNIFIED_PKT_V0 }};
134
+ const group_id_unified_v1 = {{ GROUP_ID_UNIFIED_PKT_V1 }};
135
+ const group_id_unified_v2 = {{ GROUP_ID_UNIFIED_PKT_V2 }};
136
+ const group_id_unified_ext_v0 = {{ GROUP_ID_BLE5_EXTENDED_V0 }};
137
+ const group_id_unified_ext_v1 = {{ GROUP_ID_BLE5_EXTENDED_V1 }};
138
+ var pktTypes = {{ pkt_types_list | tojson | safe }};
139
+
140
+ function showPktForm(pktType) {
141
+ // Hide all packet forms
142
+ pktTypes.forEach(function(type) {
143
+ var formEl = document.getElementById(type + "_form");
144
+ if (formEl) formEl.style.display = 'none';
145
+ });
146
+
147
+ // Show appropriate header and packet form
148
+ if (pktType && pktType.includes("Unified")) {
149
+ document.getElementById("Hdr_form").style.display = 'none';
150
+ document.getElementById("DataHdr_form").style.display = 'block';
151
+ var default_value = 0;
152
+ if (pktType.includes("V0")) {
153
+ default_value = pktType.includes("Ext") ? group_id_unified_ext_v0 : group_id_unified_v0;
154
+ } else if (pktType.includes("V1")) {
155
+ default_value = pktType.includes("Ext") ? group_id_unified_ext_v1 : group_id_unified_v1;
156
+ } else if (pktType.includes("V2")) {
157
+ default_value = group_id_unified_v2;
158
+ }
159
+ if (form.elements.DataHdr_group_id_major) {
160
+ form.elements.DataHdr_group_id_major.value = "0x" + default_value.toString(16).toUpperCase();
161
+ }
162
+ } else {
163
+ document.getElementById("Hdr_form").style.display = 'block';
164
+ document.getElementById("DataHdr_form").style.display = 'none';
165
+ var default_value = 0;
166
+ if (pktType && pktType.includes("Brg2Gw")) {
167
+ default_value = group_id_brg2gw;
168
+ } else if (pktType && pktType.includes("Gw2Brg")) {
169
+ default_value = group_id_gw2brg;
170
+ } else if (pktType && pktType.includes("SignalIndicator")) {
171
+ default_value = group_id_signal_indicator;
172
+ } else if (pktType && pktType.includes("SideInfoSensor")) {
173
+ default_value = group_id_side_info_sensor;
174
+ } else if (pktType && pktType.includes("SideInfo")) {
175
+ default_value = group_id_side_info;
176
+ }
177
+ if (form.elements.Hdr_group_id) {
178
+ form.elements.Hdr_group_id.value = "0x" + default_value.toString(16).toUpperCase();
179
+ }
180
+ }
181
+
182
+ // Show the selected packet form
183
+ if (pktType) {
184
+ var pktForm = document.getElementById(pktType + "_form");
185
+ if (pktForm) pktForm.style.display = 'block';
186
+ }
187
+ }
188
+
189
+ function show() {
190
+ // Set up click handlers
191
+ var radios = document.getElementsByName("radios");
192
+ for (var i = 0; i < radios.length; i++) {
193
+ radios[i].onclick = function() {
194
+ showPktForm(this.value);
195
+ };
196
+ }
197
+
198
+ // Show form for checked radio (if any)
199
+ for (var i = 0; i < radios.length; i++) {
200
+ if (radios[i].checked) {
201
+ showPktForm(radios[i].value);
202
+ break;
203
+ }
204
+ }
205
+ }
206
+ applyFilters(); // Apply filters on page load
207
+ show(); // Initialize form display (will show selected packet form if one is checked)
208
+ </script>
209
+ </body>
210
+ </html>
@@ -0,0 +1,20 @@
1
+
2
+ <!DOCTYPE html>
3
+ <html>
4
+ <head>
5
+ <!-- Required meta tags -->
6
+ <meta charset="utf-8">
7
+ <meta name="viewport" content="width=device-width, initial-scale=1">
8
+ <title>{{ app }}</title>
9
+ <link rel="icon" href="https://www.wiliot.com/favicon.ico" type="image/x-icon" />
10
+ <!-- Bootstrap CSS -->
11
+ <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
12
+ </head>
13
+ <body>
14
+ <div class="container">
15
+ {% include 'menu.html' %}
16
+ <h1 style="color:#00AB83">{{ title }}</h1>
17
+ <hr>
18
+ {% include wlt_types_html %}
19
+ </body>
20
+ </html>
@@ -0,0 +1,54 @@
1
+ <nav class="navbar navbar-light navbar-expand-lg" style="background-color: #E5F7F3;">
2
+ <div class="container-fluid">
3
+ <ul class="navbar-nav">
4
+ <li class="nav-item">
5
+ <a class="nav-link active" aria-current="page" href="/">
6
+ <img src="https://www.wiliot.com/src/img/svg/logo.svg" width="100" height="40" alt="Wiliot logo">
7
+ </a>
8
+ </li>
9
+ {% if app == FDM %}
10
+ <li>
11
+ <a class="nav-link" href="/">
12
+ <button class="btn btn-outline-success my-5 my-sm-0">DEV MODE</button>
13
+ </a>
14
+ </li>
15
+ <li>
16
+ <a class="nav-link" href="/gw">
17
+ <button class="btn btn-outline-success my-5 my-sm-0">GW</button>
18
+ </a>
19
+ </li>
20
+ <li>
21
+ <a class="nav-link" href="/brg">
22
+ <button class="btn btn-outline-success my-5 my-sm-0">BRG</button>
23
+ </a>
24
+ </li>
25
+ <li>
26
+ <a class="nav-link" href="/tag2brg">
27
+ <button class="btn btn-outline-success my-5 my-sm-0">Tag to Bridge Packet</button>
28
+ </a>
29
+ </li>
30
+ {% elif app == CERT_WEB %}
31
+ <li>
32
+ <a class="nav-link" href="/">
33
+ <button class="btn btn-outline-success my-5 my-sm-0">RUN CERTIFICATE</button>
34
+ </a>
35
+ </li>
36
+ {% endif %}
37
+ <li>
38
+ <a class="nav-link" href="/parser">
39
+ <button class="btn btn-outline-success my-5 my-sm-0">PACKET PARSER</button>
40
+ </a>
41
+ </li>
42
+ <li>
43
+ <a class="nav-link" href="/generator">
44
+ <button class="btn btn-outline-success my-5 my-sm-0">PACKET GENERATOR</button>
45
+ </a>
46
+ </li>
47
+ <li>
48
+ <a class="nav-link" href="/data_structs">
49
+ <button class="btn btn-outline-success my-5 my-sm-0">DATA STRUCTURES</button>
50
+ </a>
51
+ </li>
52
+ </ul>
53
+ </div>
54
+ </nav>
@@ -0,0 +1,53 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <!-- Required meta tags -->
5
+ <meta charset="utf-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1">
7
+ <title>{{ app }}</title>
8
+ <link rel="icon" href="https://www.wiliot.com/favicon.ico" type="image/x-icon" />
9
+ <!-- Bootstrap CSS -->
10
+ <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
11
+ <style>
12
+ #card-body {
13
+ height: 550px;
14
+ overflow:auto;
15
+ }
16
+ </style>
17
+ </head>
18
+ <body>
19
+ <div class="container">
20
+ {% include 'menu.html' %}
21
+ <h1 style="color:#00AB83">{{ title }}</h1>
22
+ <hr>
23
+ <form class="form-horizontal" action="">
24
+ <div class="row">
25
+ <label for="payload" class="col-sm-2">PAYLOAD:</label>
26
+ <input type="text" class="col-sm-4" name="payload" value="" placeholder="required" required>
27
+ </div>
28
+ {% if app == FDM %}
29
+ <div class="row">
30
+ <label for="packet_version" class="col-sm-2">PACKET VERSION:</label>
31
+ <input type="text" class="col-sm-4" name="packet_version" value="3.0">
32
+ </div>
33
+ {% endif %}
34
+ <hr>
35
+ <div class="row">
36
+ <button type="submit" class="btn btn-primary col-sm-12">Parse Packet</button>
37
+ </div>
38
+ </form>
39
+ <br>
40
+ <br>
41
+ <div class="card">
42
+ <div class="card-header">
43
+ Output
44
+ </div>
45
+ <div class="card-body" id="card-body">
46
+ <samp>{{ output | safe }}</samp>
47
+ </div>
48
+ </div>
49
+ <br>
50
+ <br>
51
+ <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
52
+ </body>
53
+ </html>