isar 1.31.0__py3-none-any.whl → 1.31.1__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.

Potentially problematic release.


This version of isar might be problematic. Click here for more details.

Files changed (46) hide show
  1. isar/config/open_telemetry.py +2 -8
  2. isar/eventhandlers/eventhandler.py +93 -0
  3. isar/models/events.py +118 -0
  4. isar/modules.py +1 -1
  5. isar/robot/robot.py +16 -18
  6. isar/robot/robot_start_mission.py +8 -14
  7. isar/robot/robot_status.py +2 -3
  8. isar/robot/robot_stop_mission.py +3 -9
  9. isar/robot/robot_task_status.py +3 -7
  10. isar/script.py +2 -1
  11. isar/services/utilities/scheduling_utilities.py +26 -24
  12. isar/state_machine/state_machine.py +79 -9
  13. isar/state_machine/states/await_next_mission.py +46 -11
  14. isar/state_machine/states/blocked_protective_stop.py +24 -15
  15. isar/state_machine/states/home.py +40 -9
  16. isar/state_machine/states/monitor.py +83 -12
  17. isar/state_machine/states/offline.py +25 -13
  18. isar/state_machine/states/paused.py +24 -38
  19. isar/state_machine/states/returning_home.py +75 -14
  20. isar/state_machine/states/robot_standing_still.py +41 -11
  21. isar/state_machine/states/stopping.py +52 -67
  22. isar/state_machine/states/unknown_status.py +37 -64
  23. isar/state_machine/transitions/functions/robot_status.py +4 -5
  24. isar/state_machine/transitions/functions/stop.py +3 -12
  25. isar/state_machine/utils/common_event_handlers.py +166 -0
  26. isar/storage/uploader.py +1 -1
  27. {isar-1.31.0.dist-info → isar-1.31.1.dist-info}/METADATA +1 -1
  28. {isar-1.31.0.dist-info → isar-1.31.1.dist-info}/RECORD +32 -43
  29. isar/models/communication/__init__.py +0 -0
  30. isar/models/communication/message.py +0 -8
  31. isar/models/communication/queues/__init__.py +0 -0
  32. isar/models/communication/queues/events.py +0 -58
  33. isar/models/communication/queues/queue_io.py +0 -12
  34. isar/models/communication/queues/queue_timeout_error.py +0 -2
  35. isar/models/communication/queues/queue_utils.py +0 -38
  36. isar/models/communication/queues/status_queue.py +0 -22
  37. isar/models/mission_metadata/__init__.py +0 -0
  38. isar/services/service_connections/stid/__init__.py +0 -0
  39. isar/services/utilities/queue_utilities.py +0 -39
  40. isar/state_machine/generic_states/idle.py +0 -133
  41. isar/state_machine/generic_states/ongoing_mission.py +0 -309
  42. isar/state_machine/generic_states/robot_unavailable.py +0 -61
  43. {isar-1.31.0.dist-info → isar-1.31.1.dist-info}/WHEEL +0 -0
  44. {isar-1.31.0.dist-info → isar-1.31.1.dist-info}/entry_points.txt +0 -0
  45. {isar-1.31.0.dist-info → isar-1.31.1.dist-info}/licenses/LICENSE +0 -0
  46. {isar-1.31.0.dist-info → isar-1.31.1.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  isar/__init__.py,sha256=cH8p8bVveu3FUL6kBhldcSlLaoHgD82Kd0-SwSNfGXw,87
2
- isar/modules.py,sha256=QBB1pge1i17HVMLA5n-qd9K3APCrX9bFF2vlfjheOhU,4778
3
- isar/script.py,sha256=OC0O3y5HO5OAstg7g-tLKgF7mulKfglkpztDRk9PvT0,6159
2
+ isar/modules.py,sha256=1QdULg-9gV5Ds4pMV4IQTlImSgsVwqs-g15ifllF2kg,4757
3
+ isar/script.py,sha256=8wDcpsbOdFzSkkOOUBFxz9OJYzBiqnTDqr-175tiyL4,6211
4
4
  isar/apis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  isar/apis/api.py,sha256=B0fVZPKtnvrxzk48xoazGPYsJVjjBH4IL6glDJ3PGWI,13328
6
6
  isar/apis/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -15,7 +15,7 @@ isar/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
15
  isar/config/configuration_error.py,sha256=rO6WOhafX6xvVib8WxV-eY483Z0PpN-9PxGsq5ATfKc,46
16
16
  isar/config/log.py,sha256=_zeHrsI4XqoHc1Um50PLHFjlwGiClM_M5CzcXoqwZuY,1380
17
17
  isar/config/logging.conf,sha256=mYO1xf27gAopEMHhGzY7-mwyfN16rwRLkPNMvy3zn2g,1127
18
- isar/config/open_telemetry.py,sha256=7hO6lR4lgK3IRZVh0a4shxIuamyt9paLM6d_FwXw5OY,2661
18
+ isar/config/open_telemetry.py,sha256=965IlPi7urVTL0Yy4uYu4e1P2Ne6HC_RXizM2vCX9kY,2371
19
19
  isar/config/settings.py,sha256=-fBxs0TUGmoCX4nF1Rwg0YMZ-WQ6qsqFZpWHxqwOrlk,13029
20
20
  isar/config/certs/ca-cert.pem,sha256=qoNljfad_qcMxhXJIUMLd7nT-Qwf_d4dYSdoOFEOE8I,2179
21
21
  isar/config/keyvault/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -35,26 +35,19 @@ isar/config/predefined_mission_definition/default_turtlebot.json,sha256=20ee7q1E
35
35
  isar/config/predefined_missions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
36
  isar/config/predefined_missions/default.json,sha256=NWo9y5noPmpjlNUxLnZK95Sz7DIEaUR-ISYlw3MP8i0,1251
37
37
  isar/config/predefined_missions/default_turtlebot.json,sha256=8Vk1_0P0BBsG0vwh4vwIYINiiWioErHZ0Ppjq3ctaPM,2143
38
+ isar/eventhandlers/eventhandler.py,sha256=POriVZzl97igY9Ny4_hILKf-PWFSsegxuqkXpOsdMIw,2771
38
39
  isar/mission_planner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
40
  isar/mission_planner/local_planner.py,sha256=Mkg3vvUBF1jImfQnaFvXLNpKVadR21X4mwDd_wHqJ2w,2520
40
41
  isar/mission_planner/mission_planner_interface.py,sha256=UgpPIM4FbrWOD7fGY3Ul64k3uYb8wo0FwSWGewYoVbc,485
41
42
  isar/mission_planner/sequential_task_selector.py,sha256=66agRPHuJnEa1vArPyty4muTasAZ50XPjjrSaTdY_Cc,643
42
43
  isar/mission_planner/task_selector_interface.py,sha256=pnLeaGPIuyXThcflZ_A7YL2b2xQjFT88hAZidkMomxU,707
43
44
  isar/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
- isar/models/communication/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
- isar/models/communication/message.py,sha256=ge2EdUXRnYkiEu5TIAYJFQET_5w-N8MRgc2Y31vetno,155
46
- isar/models/communication/queues/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
47
- isar/models/communication/queues/events.py,sha256=mZt1ZarqmyDW_y42w7aD1Iv-m7HLwrpUyOh3pM4w79Q,2412
48
- isar/models/communication/queues/queue_io.py,sha256=AnHWUCkZ0tunkxKKeBarq-OUkRM97IaMfA-a1pmf1cQ,394
49
- isar/models/communication/queues/queue_timeout_error.py,sha256=rF8TlNF7RHS_ueTZ5mp7aFkhLY1j0dcwMwH-Ba6lVpE,45
50
- isar/models/communication/queues/queue_utils.py,sha256=3kw7LxMVxCUM7JF7DVQgxbiUzMBMtVa8nwfpr7xDSGc,872
51
- isar/models/communication/queues/status_queue.py,sha256=on8kvlNsG6MJjEVsyqtBswIpmOdOggQiKr7F5x0T3jw,514
52
- isar/models/mission_metadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
53
- isar/robot/robot.py,sha256=MmdrJzC4U_dGK3NLA6vgGNi0awNQwFvsPDsr9030fso,5431
54
- isar/robot/robot_start_mission.py,sha256=vQKsKnrWQuY70jEK-qeeaZYpXxQH4vElorczYZheXTQ,3423
55
- isar/robot/robot_status.py,sha256=FpkTIAA-O5vKuyU7fnWn2YXtbstq5qbk9XSxbn_0MXU,2015
56
- isar/robot/robot_stop_mission.py,sha256=jUyfemvbyigxrlIp9aKPn-PvarhagJEgajQPS_LgJ7g,2442
57
- isar/robot/robot_task_status.py,sha256=71SYPnoqaFbTe1bELLTvAUigAJ-McpomC2sjYQNQs_A,3290
45
+ isar/models/events.py,sha256=9NgvX68Nb8WJyuafD-NYyxxb2Bo9zN15ozNPKURyrxk,3782
46
+ isar/robot/robot.py,sha256=keqsYmfRlyIC4CWkMG0erDt_4uIC0IPvyG2ni4MemyI,5350
47
+ isar/robot/robot_start_mission.py,sha256=RPYH9VtXDFdPqhOpt6kSbT17RHkJQPKkQ6d4784_pFE,3210
48
+ isar/robot/robot_status.py,sha256=NMZZOV1DHOVrJwMsSjKbDSaSiWYnrfAW1cQHtc6heKk,1903
49
+ isar/robot/robot_stop_mission.py,sha256=4GZyhLU0hB6ZK0ArCVhFS9Sf3ZbqFI9DvPNfvD889Ps,2270
50
+ isar/robot/robot_task_status.py,sha256=jefIDfrbly7vWZztWA2zLmK5Yz1NSEytw2YUmprccNA,3161
58
51
  isar/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
59
52
  isar/services/auth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
53
  isar/services/auth/azure_credentials.py,sha256=9PlwGe5FrPRbW2dp0go7LMp8_l_FRvL8xOXotXwzRDo,364
@@ -64,29 +57,24 @@ isar/services/service_connections/mqtt/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JC
64
57
  isar/services/service_connections/mqtt/mqtt_client.py,sha256=se8uLvjy-cElM-WhmHEPXfEA8u05huOLnkcOCYRpcE4,3551
65
58
  isar/services/service_connections/mqtt/robot_heartbeat_publisher.py,sha256=_bUOG7CfqBlCRvG4vh2XGoMXucBxsJarFIeXIKOH1aw,1019
66
59
  isar/services/service_connections/mqtt/robot_info_publisher.py,sha256=AxokGk51hRPTxxD2r0P9braPJCMrf1InaCxrUBKkF4g,1402
67
- isar/services/service_connections/stid/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
68
60
  isar/services/utilities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
69
- isar/services/utilities/queue_utilities.py,sha256=Pw3hehSwkXJNeDv-bDVDfs58VOwtt3i5hpiJ2ZpphuQ,1225
70
61
  isar/services/utilities/robot_utilities.py,sha256=4zCigsLXfqDC8POHchktSq81zr1_pTaRve_LQsVr6Mk,514
71
- isar/services/utilities/scheduling_utilities.py,sha256=eXeTEe4JmP2mgVd77DC5SLGTPjpG6O9IhN330dAyh-4,11122
62
+ isar/services/utilities/scheduling_utilities.py,sha256=O-V6EBfYcx8HMxa2bf0QBxX7Km5m1hBf9h4P5RGlMfY,10907
72
63
  isar/services/utilities/threaded_request.py,sha256=py4G-_RjnIdHljmKFAcQ6ddqMmp-ZYV39Ece-dqRqjs,1874
73
64
  isar/state_machine/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
74
- isar/state_machine/state_machine.py,sha256=6rksxhG4OLoZYfRSB5wfpqHXQUperbRjqwnY-6ue8Gk,13099
65
+ isar/state_machine/state_machine.py,sha256=RDpUngEf1BAVXDRC52FkUVMSIVhmfTEgQw_kDC06WPE,15663
75
66
  isar/state_machine/states_enum.py,sha256=Z3dO6k6JmQAZ1lzcR58oVCxoCky_-ZS9MaL3RSaNbZ4,434
76
- isar/state_machine/generic_states/idle.py,sha256=uXVHtKeX3jPZC7iVmic1sKD6nLtSOVynrHNiUCdTDcw,4371
77
- isar/state_machine/generic_states/ongoing_mission.py,sha256=ns6mbaSJvjM7JAbl1txPA9VdjxTv4iWKGbdYahtTtGc,11571
78
- isar/state_machine/generic_states/robot_unavailable.py,sha256=pHmed1uRPwCWAR4uBJmdnxi9WX8veTbGG9ephmROhm0,1851
79
67
  isar/state_machine/states/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
- isar/state_machine/states/await_next_mission.py,sha256=U0oGi-O05S-ZvdhpQRuirrY3ZBbblURo5U95PsscMlQ,573
81
- isar/state_machine/states/blocked_protective_stop.py,sha256=KDux2lm5kwEEarnDt9FG4MFrWbYUzs1_DX5hu2ILIlI,675
82
- isar/state_machine/states/home.py,sha256=2v7BFQn4QZ0npOrXpWLWCoHD5IpSyAJr-vQCS3MQWJs,514
83
- isar/state_machine/states/monitor.py,sha256=BVrfZb-EWIdNYTC75F8HCi_OOtjBYbphrwki98p1WdE,597
84
- isar/state_machine/states/offline.py,sha256=vZnBMVDnehZ-0gPsHNVRpZtb8OBBFkeEnq2olo_Ep6M,609
85
- isar/state_machine/states/paused.py,sha256=IgnWBM6WXj3wjFZMARAPWIpzWGyUSW35DVBvNHuiNP8,1460
86
- isar/state_machine/states/returning_home.py,sha256=BBQo3PoNP-THlvJa5gQr0fNBhInh_Ox1L2OeH8evUq8,638
87
- isar/state_machine/states/robot_standing_still.py,sha256=RbOZSiQz72tWAJID5ksgzcb4lND6OniiG35IE1wMUHk,579
88
- isar/state_machine/states/stopping.py,sha256=yJE7KT1aGo_qd1VTETfg1rTrlM-hKKQYKQp7xu4py_Y,2854
89
- isar/state_machine/states/unknown_status.py,sha256=qfIoL5f7Hj-aZKq5tCM1FctkuEI6SwgpQuixzKx11Zk,2428
68
+ isar/state_machine/states/await_next_mission.py,sha256=RDWqGFdQ6PX7AtSjlrR-fH6s441mKooOpkceTO7pvkc,1873
69
+ isar/state_machine/states/blocked_protective_stop.py,sha256=GEOvxnHXjpCsrh3aa8Idtn1zMYv5HLQzj9qQAq8HvaU,1180
70
+ isar/state_machine/states/home.py,sha256=NUVmSmwG5_N7ZDLfbS0eWMnDVpVXmADrZXjh-s_klks,1862
71
+ isar/state_machine/states/monitor.py,sha256=QEV_lc-lHoFAOK2e6HD4FdzpN607LbqZx2Y9-LknrLA,3666
72
+ isar/state_machine/states/offline.py,sha256=5wdNzC1wG0cWrpuT_r_mk8UNFHA4QSyg8ejXUTAg4Io,1137
73
+ isar/state_machine/states/paused.py,sha256=tegYTUioSIKP2TUiMqBLNp9owyLwcuEM3a_LyKZSwQM,1087
74
+ isar/state_machine/states/returning_home.py,sha256=bO8i61xzQAvT0upgK1Fi_OzyRfsRaZlfK3A_2-tThpo,3420
75
+ isar/state_machine/states/robot_standing_still.py,sha256=ee2ORQD0IfUMMBz7bpuUMyA_sMYtdiy17h48KrZJxRc,1897
76
+ isar/state_machine/states/stopping.py,sha256=fMXXvcXtzML-Q5A-uRD_gXePy51fnt9jhOTVFN-3qqA,2420
77
+ isar/state_machine/states/unknown_status.py,sha256=m9XoGGgdjhjX-LRW31mwiU8r7LREB0yOSv2DFZtZH7Y,1789
90
78
  isar/state_machine/transitions/mission.py,sha256=Lsiee_hSn5wd7KWpmvIdaG-49f6HGdkCdiXAo5L0ciE,5803
91
79
  isar/state_machine/transitions/return_home.py,sha256=6aBpKpozT48RJ__w13gv-r7dSz-fEOCzkAuKq5Hwm6k,2728
92
80
  isar/state_machine/transitions/robot_status.py,sha256=c1ceyWRGCtx-KTDtxHXRD7oPbt8TQ2ej24A0wyim8vc,2720
@@ -95,17 +83,18 @@ isar/state_machine/transitions/functions/finish_mission.py,sha256=TRQrk7HdllmAkw
95
83
  isar/state_machine/transitions/functions/pause.py,sha256=oaIFd4aZnbeaHb-EGQE9ozJctskqXKsRKkNc68M8sp0,1975
96
84
  isar/state_machine/transitions/functions/resume.py,sha256=HgAEn4jQOPkVPWWZCAh7dqnIerdF8nGcgFcZ1KsCNSQ,2104
97
85
  isar/state_machine/transitions/functions/return_home.py,sha256=UlniwYvpz74hxqgN0TyVv3LCmiMsqsosKEtEGLqkNj0,1139
98
- isar/state_machine/transitions/functions/robot_status.py,sha256=xhKZ5u_X8uDvnhvGnAIABuKaPXeVqFjkgj4H2Om-j_A,1013
86
+ isar/state_machine/transitions/functions/robot_status.py,sha256=P1Cu8xVysbiKRKL4E8mSyoL2-72HfxrLvvOcdnBOlvw,889
99
87
  isar/state_machine/transitions/functions/start_mission.py,sha256=ricRfhLH1_lNpqWxneMZcm7ps2YfY6sQGHkiT0Glf6M,2564
100
- isar/state_machine/transitions/functions/stop.py,sha256=JK4hjGc3QtgSzvCWeOr1YG61SH1QOhmVNjw_jOnahQg,3123
88
+ isar/state_machine/transitions/functions/stop.py,sha256=5tPYE4WB98iammX81wEdrAUvX0huJ2PBooVaY_7i6GY,2902
101
89
  isar/state_machine/transitions/functions/utils.py,sha256=Wa72Ocq4QT1E6qkpEJZQ3h5o33pGvx7Tlkt2JZ2Grbk,314
90
+ isar/state_machine/utils/common_event_handlers.py,sha256=Grv34hVwDjzi9BizqRLMJAKtRpucuklXGR3hoC_0kkQ,5773
102
91
  isar/storage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
103
92
  isar/storage/blob_storage.py,sha256=D67y3Z939iXoRxs8npOuKOhgs2o6dYz2ivTm5IXXhJE,3168
104
93
  isar/storage/local_storage.py,sha256=Bnmoi5gyN8r-oRh0aHrOdGqaH3JqRScFKMRXYojW5kY,1855
105
94
  isar/storage/storage_interface.py,sha256=DYDry4I7aZpDHJhsBF6s8zrgokFAc7fdKJKfA8AvL7o,828
106
- isar/storage/uploader.py,sha256=1F4M34aVnD828WV62muTIE04vj3D52lrTOOh8r6SgwA,9464
95
+ isar/storage/uploader.py,sha256=uD1DzvJ2yYtNAwQGa7UD7kNOxZfKxJ1cCdi7sfOVZ10,9443
107
96
  isar/storage/utilities.py,sha256=oLH0Rp7UtrQQdilfITnmXO1Z0ExdeDhBImYHid55vBA,3449
108
- isar-1.31.0.dist-info/licenses/LICENSE,sha256=3fc2-ebLwHWwzfQbulGNRdcNob3SBQeCfEVUDYxsuqw,14058
97
+ isar-1.31.1.dist-info/licenses/LICENSE,sha256=3fc2-ebLwHWwzfQbulGNRdcNob3SBQeCfEVUDYxsuqw,14058
109
98
  robot_interface/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
110
99
  robot_interface/robot_interface.py,sha256=-jCAKkZ2eiyzUyHVQmOzw4hMgLWR7pE8MHj-WZo85ZY,7978
111
100
  robot_interface/test_robot_interface.py,sha256=FV1urn7SbsMyWBIcTKjsBwAG4IsXeZ6pLHE0mA9EGGs,692
@@ -129,8 +118,8 @@ robot_interface/telemetry/payloads.py,sha256=PpvmV7XeGgfhc_aRUYFOdwBTwV2x8TwTBIN
129
118
  robot_interface/utilities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
130
119
  robot_interface/utilities/json_service.py,sha256=qkzVkb60Gi_pto-b5n1vNzCrQze2yqgIJqSLNLYj1Fg,1034
131
120
  robot_interface/utilities/uuid_string_factory.py,sha256=_NQIbBQ56w0qqO0MUDP6aPpHbxW7ATRhK8HnQiBSLkc,76
132
- isar-1.31.0.dist-info/METADATA,sha256=RZo3tvmuEPeEdu1CQeqgKAQyWysrlJExNPMVn8zjqPs,31217
133
- isar-1.31.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
134
- isar-1.31.0.dist-info/entry_points.txt,sha256=TFam7uNNw7J0iiDYzsH2gfG0u1eV1wh3JTw_HkhgKLk,49
135
- isar-1.31.0.dist-info/top_level.txt,sha256=UwIML2RtuQKCyJJkatcSnyp6-ldDjboB9k9JgKipO-U,21
136
- isar-1.31.0.dist-info/RECORD,,
121
+ isar-1.31.1.dist-info/METADATA,sha256=bilh123vt-dD-IraRBTR4yhxI1YJim_NydR9zPveUYA,31217
122
+ isar-1.31.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
123
+ isar-1.31.1.dist-info/entry_points.txt,sha256=TFam7uNNw7J0iiDYzsH2gfG0u1eV1wh3JTw_HkhgKLk,49
124
+ isar-1.31.1.dist-info/top_level.txt,sha256=UwIML2RtuQKCyJJkatcSnyp6-ldDjboB9k9JgKipO-U,21
125
+ isar-1.31.1.dist-info/RECORD,,
File without changes
@@ -1,8 +0,0 @@
1
- from dataclasses import dataclass
2
-
3
- from robot_interface.models.mission.mission import Mission
4
-
5
-
6
- @dataclass
7
- class StartMissionMessage:
8
- mission: Mission
File without changes
@@ -1,58 +0,0 @@
1
- from queue import Queue
2
-
3
- from transitions import State
4
-
5
- from isar.config.settings import settings
6
- from isar.models.communication.queues.queue_io import QueueIO
7
- from isar.models.communication.queues.status_queue import StatusQueue
8
- from robot_interface.models.exceptions.robot_exceptions import ErrorMessage
9
- from robot_interface.models.mission.mission import Mission
10
- from robot_interface.models.mission.status import RobotStatus, TaskStatus
11
- from robot_interface.models.mission.task import TASKS
12
-
13
-
14
- class Events:
15
- def __init__(self) -> None:
16
- self.api_requests: APIRequests = APIRequests()
17
- self.state_machine_events: StateMachineEvents = StateMachineEvents()
18
- self.robot_service_events: RobotServiceEvents = RobotServiceEvents()
19
-
20
- self.upload_queue: Queue = Queue(maxsize=10)
21
-
22
- if settings.MQTT_ENABLED:
23
- self.mqtt_queue: Queue = Queue()
24
-
25
-
26
- class APIRequests:
27
- def __init__(self) -> None:
28
- self.start_mission: QueueIO = QueueIO(input_size=1, output_size=1)
29
- self.stop_mission: QueueIO = QueueIO(input_size=1, output_size=1)
30
- self.pause_mission: QueueIO = QueueIO(input_size=1, output_size=1)
31
- self.resume_mission: QueueIO = QueueIO(input_size=1, output_size=1)
32
- self.return_home: QueueIO = QueueIO(input_size=1, output_size=1)
33
-
34
-
35
- class StateMachineEvents:
36
- def __init__(self) -> None:
37
- self.start_mission: Queue[Mission] = Queue(maxsize=1)
38
- self.stop_mission: Queue[str] = Queue(maxsize=1)
39
- self.pause_mission: Queue[bool] = Queue(maxsize=1)
40
- self.task_status_request: Queue[str] = Queue(maxsize=1)
41
-
42
-
43
- class RobotServiceEvents:
44
- def __init__(self) -> None:
45
- self.task_status_updated: Queue[TaskStatus] = Queue(maxsize=1)
46
- self.task_status_failed: Queue[ErrorMessage] = Queue(maxsize=1)
47
- self.mission_started: Queue[bool] = Queue(maxsize=1)
48
- self.mission_failed: Queue[ErrorMessage] = Queue(maxsize=1)
49
- self.robot_status_changed: Queue[bool] = Queue(maxsize=1)
50
- self.mission_failed_to_stop: Queue[ErrorMessage] = Queue(maxsize=1)
51
- self.mission_successfully_stopped: Queue[bool] = Queue(maxsize=1)
52
-
53
-
54
- class SharedState:
55
- def __init__(self) -> None:
56
- self.state: StatusQueue[State] = StatusQueue()
57
- self.robot_status: StatusQueue[RobotStatus] = StatusQueue()
58
- self.state_machine_current_task: StatusQueue[TASKS] = StatusQueue()
@@ -1,12 +0,0 @@
1
- from queue import Queue
2
-
3
-
4
- class QueueIO:
5
- """
6
- Creates input and output queue. The queues are defined such that the input is from
7
- api to state machine while the output is from state machine to api.
8
- """
9
-
10
- def __init__(self, input_size: int = 0, output_size: int = 0):
11
- self.input: Queue = Queue(maxsize=input_size)
12
- self.output: Queue = Queue(maxsize=output_size)
@@ -1,2 +0,0 @@
1
- class QueueTimeoutError(Exception):
2
- pass
@@ -1,38 +0,0 @@
1
- from queue import Empty, Queue
2
- from typing import Any, Optional, TypeVar
3
-
4
- from isar.models.communication.queues.status_queue import StatusQueue
5
-
6
- T = TypeVar("T")
7
-
8
-
9
- def trigger_event_without_data(queue: Queue[Any]) -> None:
10
- queue.put(True)
11
-
12
-
13
- def trigger_event(queue: Queue[T], data: T) -> None:
14
- queue.put(data)
15
-
16
-
17
- def check_shared_state(queue: StatusQueue[T]) -> Optional[T]:
18
- try:
19
- return queue.check()
20
- except Empty:
21
- return None
22
-
23
-
24
- def update_shared_state(queue: StatusQueue[T], data: T) -> None:
25
- queue.update(data)
26
-
27
-
28
- def check_for_event(queue: Queue[T]) -> Optional[T]:
29
- try:
30
- return queue.get(block=False)
31
- except Empty:
32
- return None
33
-
34
-
35
- def check_for_event_without_consumption(queue: Queue[T]) -> bool:
36
- return (
37
- queue.qsize() != 0
38
- ) # Queue size is not reliable, but should be sufficient for this case
@@ -1,22 +0,0 @@
1
- from collections import deque
2
- from queue import Empty, Queue
3
- from typing import TypeVar
4
-
5
- T = TypeVar("T")
6
-
7
-
8
- class StatusQueue(Queue[T]):
9
- def __init__(self) -> None:
10
- super().__init__()
11
-
12
- def check(self) -> T:
13
- if not self._qsize():
14
- raise Empty
15
- with self.mutex:
16
- queueList = list(self.queue)
17
- return queueList.pop()
18
-
19
- def update(self, item: T):
20
- with self.mutex:
21
- self.queue: deque[T] = deque()
22
- self.queue.append(item)
File without changes
File without changes
@@ -1,39 +0,0 @@
1
- import logging
2
- from queue import Empty, Queue
3
- from typing import Any
4
-
5
- from isar.models.communication.queues.queue_timeout_error import QueueTimeoutError
6
-
7
- logger = logging.getLogger("api")
8
-
9
-
10
- class QueueUtilities:
11
- """
12
- Contains utility functions for handling queue communication between threads.
13
- """
14
-
15
- @staticmethod
16
- def check_queue(queue: Queue, queue_timeout: int = None) -> Any:
17
- """
18
- Checks if there is a message on a queue. If a timeout is specified the function
19
- will raise a QueueTimeoutError if there is no message within the timeout. If
20
- there is no timeout specified this function will block.
21
- :param queue: The queue to be checked for a message
22
- :param queue_timeout: Timeout in seconds
23
- :return: Message found on queue
24
- :raises QueueTimeoutError
25
- """
26
- try:
27
- message: Any = queue.get(timeout=queue_timeout)
28
- except Empty:
29
- logger.error("Queue timed out")
30
- raise QueueTimeoutError
31
- return message
32
-
33
- @staticmethod
34
- def clear_queue(queue: Queue) -> None:
35
- while True:
36
- try:
37
- queue.get(block=False)
38
- except Empty:
39
- break
@@ -1,133 +0,0 @@
1
- import logging
2
- import time
3
- from enum import Enum
4
- from queue import Queue
5
- from typing import TYPE_CHECKING, Optional
6
-
7
- from isar.config.settings import settings
8
- from isar.models.communication.message import StartMissionMessage
9
- from isar.models.communication.queues.queue_io import QueueIO
10
- from isar.models.communication.queues.queue_utils import (
11
- check_for_event,
12
- check_shared_state,
13
- )
14
- from isar.models.communication.queues.status_queue import StatusQueue
15
- from robot_interface.models.mission.status import RobotStatus
16
-
17
- if TYPE_CHECKING:
18
- from isar.state_machine.state_machine import StateMachine
19
-
20
-
21
- class IdleStates(str, Enum):
22
- AwaitNextMission = "awaitNextMission"
23
- Home = "home"
24
- RobotStandingStill = "robotStandingStill"
25
-
26
-
27
- if TYPE_CHECKING:
28
- from isar.state_machine.state_machine import StateMachine
29
-
30
-
31
- class Idle:
32
- def __init__(
33
- self,
34
- state_machine: "StateMachine",
35
- state: IdleStates,
36
- ) -> None:
37
- self.state_machine: "StateMachine" = state_machine
38
- self.logger = logging.getLogger("state_machine")
39
- self.events = state_machine.events
40
- self.shared_state = self.state_machine.shared_state
41
- self.signal_state_machine_to_stop = state_machine.signal_state_machine_to_stop
42
- self.state: IdleStates = state
43
-
44
- # Only used for await_next_mission state
45
- self.entered_time: float = time.time()
46
- self.return_home_delay: float = settings.RETURN_HOME_DELAY
47
-
48
- def start(self) -> None:
49
- self.state_machine.update_state()
50
- self.entered_time = time.time()
51
- self._run()
52
-
53
- def stop(self) -> None:
54
- return
55
-
56
- def _check_and_handle_start_mission_event(
57
- self, event: Queue[StartMissionMessage]
58
- ) -> bool:
59
- start_mission: Optional[StartMissionMessage] = check_for_event(event)
60
- if start_mission:
61
- self.state_machine.start_mission(mission=start_mission.mission)
62
- self.state_machine.request_mission_start() # type: ignore
63
- return True
64
- return False
65
-
66
- def _check_and_handle_return_home_event(self, event: QueueIO) -> bool:
67
- if check_for_event(event.input):
68
- event.output.put(True)
69
- self.state_machine.request_return_home() # type: ignore
70
- return True
71
- return False
72
-
73
- def _check_and_handle_robot_status_event(
74
- self, event: StatusQueue[RobotStatus]
75
- ) -> bool:
76
- robot_status: RobotStatus = check_shared_state(event)
77
-
78
- expected_robot_status = (
79
- RobotStatus.Home if self.state == IdleStates.Home else RobotStatus.Available
80
- )
81
-
82
- if robot_status != expected_robot_status:
83
- self.state_machine.robot_status_changed() # type: ignore
84
- return True
85
-
86
- return False
87
-
88
- def _check_and_handle_stop_mission_event(self, event: Queue) -> bool:
89
- if check_for_event(event) is not None:
90
- self.state_machine.stop() # type: ignore
91
- return True
92
- return False
93
-
94
- def _should_return_home(self) -> bool:
95
- time_since_entered = time.time() - self.entered_time
96
- return time_since_entered > self.return_home_delay
97
-
98
- def _run(self) -> None:
99
- while True:
100
- if self.signal_state_machine_to_stop.is_set():
101
- self.logger.info(
102
- "Stopping state machine from %s state", self.state.name
103
- )
104
- break
105
-
106
- if self._check_and_handle_stop_mission_event(
107
- self.events.api_requests.stop_mission.input
108
- ):
109
- break
110
-
111
- if self._check_and_handle_start_mission_event(
112
- self.events.api_requests.start_mission.input
113
- ):
114
- break
115
-
116
- if self._check_and_handle_return_home_event(
117
- self.events.api_requests.return_home
118
- ):
119
- break
120
-
121
- if (
122
- self.state != IdleStates.AwaitNextMission
123
- and self._check_and_handle_robot_status_event(
124
- self.shared_state.robot_status
125
- )
126
- ):
127
- break
128
-
129
- if self.state == IdleStates.AwaitNextMission and self._should_return_home():
130
- self.state_machine.request_return_home() # type: ignore
131
- break
132
-
133
- time.sleep(self.state_machine.sleep_time)