44import signal
55import subprocess
66import sys
7+ import re
78import psutil
89import time
910if ("noetic" in str (subprocess .check_output (['bash' , '-c' , 'echo $ROS_DISTRO' ]))):
@@ -163,6 +164,29 @@ def on_prepare_visualization(self, event):
163164 self .gui_server .start ()
164165 LogManager .logger .info ("Visualization transition finished" )
165166
167+ def add_frequency_control (self , code ):
168+ frequency_control_code_imports = """
169+ from datetime import datetime
170+ ideal_cycle = 20
171+ """
172+ code = frequency_control_code_imports + code
173+ infinite_loop = re .search (
174+ r'[^ ]while\s*\(\s*True\s*\)\s*:|[^ ]while\s*True\s*:|[^ ]while\s*1\s*:|[^ ]while\s*\(\s*1\s*\)\s*:' , code )
175+ frequency_control_code_pre = """
176+ start_time = datetime.now()
177+ """
178+ code = code [:infinite_loop .end ()] + frequency_control_code_pre + code [infinite_loop .end ():]
179+ frequency_control_code_post = """
180+ finish_time = datetime.now()
181+ dt = finish_time - start_time
182+ ms = (dt.days * 24 * 60 * 60 + dt.seconds) * 1000 + dt.microseconds / 1000.0
183+
184+ if (ms < ideal_cycle):
185+ time.sleep((ideal_cycle - ms) / 1000.0)
186+ """
187+ code = code + frequency_control_code_post
188+ return code
189+
166190 def on_run_application (self , event ):
167191 application_configuration = event .kwargs .get ('data' , {})
168192 application_file = application_configuration ['template' ]
@@ -171,13 +195,14 @@ def on_run_application(self, event):
171195
172196 errors = self .linter .evaluate_code (code , exercise_id )
173197 if errors == "" :
198+ code = self .add_frequency_control (code )
174199 f = open ("/workspace/code/academy.py" , "w" )
175200 f .write (code )
176201 f .close ()
177202
203+ self .unpause_sim ()
178204 self .application_process = subprocess .Popen (["python3" , application_file ], stdout = sys .stdout , stderr = subprocess .STDOUT ,
179205 bufsize = 1024 , universal_newlines = True )
180- self .unpause_sim ()
181206 else :
182207 print ('errors' )
183208 raise Exception (errors )
0 commit comments