Commit 1cf4a67f292945bd0d77cba80019fe7f53eda75c

Authored by Etienne Pallier
1 parent 51c0662b
Exists in dev

Affichage console CLEAN en mode normal (NO DEBUG) !

@@ -19,7 +19,7 @@ import time @@ -19,7 +19,7 @@ import time
19 ***************************************************************** 19 *****************************************************************
20 """ 20 """
21 21
22 -DEBUG = False 22 +#DEBUG = False
23 23
24 PYROS_DJANGO_BASE_DIR = "src/core/pyros_django" 24 PYROS_DJANGO_BASE_DIR = "src/core/pyros_django"
25 25
@@ -134,7 +134,7 @@ def die(msg: str = ""): @@ -134,7 +134,7 @@ def die(msg: str = ""):
134 def execProcess(command, from_venv=False, is_async=False): 134 def execProcess(command, from_venv=False, is_async=False):
135 from_venv_str = " from venv ("+VENV_BIN+")" if from_venv else "" 135 from_venv_str = " from venv ("+VENV_BIN+")" if from_venv else ""
136 #printFullTerm(Colors.BLUE, "Executing command" + " [" + command + "]" + from_venv_str) 136 #printFullTerm(Colors.BLUE, "Executing command" + " [" + command + "]" + from_venv_str)
137 - print("Executing command" + " [" + command + "]" + from_venv_str) 137 + printd("Executing command" + " [" + command + "]" + from_venv_str)
138 if from_venv: command = VENV_BIN+' ' + command 138 if from_venv: command = VENV_BIN+' ' + command
139 process = subprocess.Popen(command, shell=True) 139 process = subprocess.Popen(command, shell=True)
140 if is_async: 140 if is_async:
@@ -220,6 +220,9 @@ def global_test_options(func): @@ -220,6 +220,9 @@ def global_test_options(func):
220 return func 220 return func
221 ''' 221 '''
222 222
  223 +def printd(*args, **kwargs):
  224 + if os.environ.get('PYROS_DEBUG', '0')=='1': print(*args, **kwargs)
  225 +
223 GLOBAL_OPTIONS = {} 226 GLOBAL_OPTIONS = {}
224 def verbose_mode(): return GLOBAL_OPTIONS["verbose"] 227 def verbose_mode(): return GLOBAL_OPTIONS["verbose"]
225 def test_mode(): return GLOBAL_OPTIONS["test"] 228 def test_mode(): return GLOBAL_OPTIONS["test"]
@@ -237,8 +240,7 @@ def debug_mode(): return GLOBAL_OPTIONS["debug"] @@ -237,8 +240,7 @@ def debug_mode(): return GLOBAL_OPTIONS["debug"]
237 def pyros_launcher(debug, sim, test, verbose): 240 def pyros_launcher(debug, sim, test, verbose):
238 #pass 241 #pass
239 os.environ['PYROS_DEBUG'] = '1' if debug else '0' 242 os.environ['PYROS_DEBUG'] = '1' if debug else '0'
240 - if debug:  
241 - click.echo('DEBUG mode') 243 + if debug: click.echo('DEBUG mode')
242 if sim: click.echo('Starting and connecting to simulator instead of real device') 244 if sim: click.echo('Starting and connecting to simulator instead of real device')
243 if test: click.echo('Test mode') 245 if test: click.echo('Test mode')
244 if verbose: click.echo('Verbose mode') 246 if verbose: click.echo('Verbose mode')
@@ -308,8 +310,8 @@ def dbshell(): @@ -308,8 +310,8 @@ def dbshell():
308 #@global_test_options 310 #@global_test_options
309 def install(packages_only, database_only): 311 def install(packages_only, database_only):
310 print("Running install command") 312 print("Running install command")
311 - print("packages_only", packages_only)  
312 - print("database_only", database_only) 313 + print("- packages_only:", packages_only)
  314 + print("- database_only:", database_only)
313 #if test_mode(): print("in test mode") 315 #if test_mode(): print("in test mode")
314 # self.execProcess("python3 install/install.py install") 316 # self.execProcess("python3 install/install.py install")
315 # if (os.path.basename(os.getcwd()) != "private"): 317 # if (os.path.basename(os.getcwd()) != "private"):
@@ -416,9 +418,9 @@ def initdb(): @@ -416,9 +418,9 @@ def initdb():
416 #@click.option('--port', default=8000) 418 #@click.option('--port', default=8000)
417 #def start(agent:str, configfile:str, test, verbosity): 419 #def start(agent:str, configfile:str, test, verbosity):
418 def start(agent:str, configfile:str): 420 def start(agent:str, configfile:str):
419 - print("Running start command") 421 + printd("Running start command")
420 if configfile: 422 if configfile:
421 - print("With config file", configfile) 423 + printd("With config file", configfile)
422 else: 424 else:
423 configfile = '' 425 configfile = ''
424 #if test_mode(): print("in test mode") 426 #if test_mode(): print("in test mode")
@@ -453,8 +455,8 @@ def start(agent:str, configfile:str): @@ -453,8 +455,8 @@ def start(agent:str, configfile:str):
453 #if agent_name == "agentX": 455 #if agent_name == "agentX":
454 456
455 # execProcessFromVenvAsync(VENV_BIN + " manage.py runserver") 457 # execProcessFromVenvAsync(VENV_BIN + " manage.py runserver")
456 - print(VENV_BIN)  
457 - print("Launching agent", agent_name, "...") 458 + printd(VENV_BIN)
  459 + printd("Launching agent", agent_name, "...")
458 #if not test_mode(): execProcess(VENV_BIN + " manage.py runserver") 460 #if not test_mode(): execProcess(VENV_BIN + " manage.py runserver")
459 #if not test_mode(): execProcessFromVenv("start_agent_" + agent_name + ".py " + configfile) 461 #if not test_mode(): execProcessFromVenv("start_agent_" + agent_name + ".py " + configfile)
460 462
@@ -500,7 +502,7 @@ def start(agent:str, configfile:str): @@ -500,7 +502,7 @@ def start(agent:str, configfile:str):
500 #for (p,agent) in current_processes: 502 #for (p,agent) in current_processes:
501 for process in current_processes: 503 for process in current_processes:
502 p,agent,_ = process 504 p,agent,_ = process
503 - print(f"************ Waiting for end of execution of agent {agent} ************") 505 + printd(f"************ Waiting for end of execution of agent {agent} ************")
504 p.wait() 506 p.wait()
505 process[2] = p.returncode 507 process[2] = p.returncode
506 print(f"************ END of execution of agent {agent} ************") 508 print(f"************ END of execution of agent {agent} ************")
@@ -529,6 +531,7 @@ def start(agent:str, configfile:str): @@ -529,6 +531,7 @@ def start(agent:str, configfile:str):
529 return True if p.returncode==0 else False 531 return True if p.returncode==0 else False
530 532
531 533
  534 +# TODO: implรฉmenter le STOP !!!
532 @pyros_launcher.command(help="Kill an agent") 535 @pyros_launcher.command(help="Kill an agent")
533 @click.argument('agent') 536 @click.argument('agent')
534 def stop(agent): 537 def stop(agent):
@@ -594,9 +597,9 @@ def change_dir(path): @@ -594,9 +597,9 @@ def change_dir(path):
594 global _previous_dir 597 global _previous_dir
595 if path == "PREVIOUS": path=_previous_dir 598 if path == "PREVIOUS": path=_previous_dir
596 _previous_dir = os.getcwd() 599 _previous_dir = os.getcwd()
597 - if DEBUG: print("Moving to : " + path) 600 + printd("Moving to : " + path)
598 os.chdir(path) 601 os.chdir(path)
599 - if DEBUG: print("Current directory : " + str(os.getcwd())) 602 + printd("Current directory : " + str(os.getcwd()))
600 603
601 604
602 605
src/core/pyros_django/agent/Agent.py
@@ -54,7 +54,13 @@ py_pwd = os.path.normpath(os.getcwd() + "/../../../..") @@ -54,7 +54,13 @@ py_pwd = os.path.normpath(os.getcwd() + "/../../../..")
54 if (py_pwd not in os.sys.path): 54 if (py_pwd not in os.sys.path):
55 (os.sys.path).append(py_pwd) 55 (os.sys.path).append(py_pwd)
56 ##sys.path.append("src") 56 ##sys.path.append("src")
57 -print("Starting with this sys.path", sys.path) 57 +
  58 +
  59 +def printd(*args, **kwargs):
  60 + if os.environ.get('PYROS_DEBUG', '0')=='1': print(*args, **kwargs)
  61 +
  62 +
  63 +printd("Starting with this sys.path", sys.path)
58 64
59 # DJANGO setup 65 # DJANGO setup
60 # self.printd("file is", __file__) 66 # self.printd("file is", __file__)
@@ -62,7 +68,7 @@ print("Starting with this sys.path", sys.path) @@ -62,7 +68,7 @@ print("Starting with this sys.path", sys.path)
62 # Go into src/ 68 # Go into src/
63 ##os.chdir("..") 69 ##os.chdir("..")
64 ##os.chdir("src") 70 ##os.chdir("src")
65 -print("Current directory : " + str(os.getcwd())) 71 +printd("Current directory : " + str(os.getcwd()))
66 72
67 #os.environ.setdefault("DJANGO_SETTINGS_MODULE", "src.core.pyros_django.pyros.settings") 73 #os.environ.setdefault("DJANGO_SETTINGS_MODULE", "src.core.pyros_django.pyros.settings")
68 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "src.core.pyros_django.pyros.settings") 74 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "src.core.pyros_django.pyros.settings")
@@ -72,8 +78,8 @@ import django @@ -72,8 +78,8 @@ import django
72 78
73 django.setup() 79 django.setup()
74 80
75 -print("DB2 used is:", djangosettings.DATABASES["default"]["NAME"])  
76 -print() 81 +printd("DB2 used is:", djangosettings.DATABASES["default"]["NAME"])
  82 +printd()
77 83
78 84
79 """ 85 """
@@ -128,11 +134,6 @@ log = L.setupLogger("AgentLogger", "Agent") @@ -128,11 +134,6 @@ log = L.setupLogger("AgentLogger", "Agent")
128 IS_WINDOWS = platform.system() == "Windows" 134 IS_WINDOWS = platform.system() == "Windows"
129 135
130 136
131 -def printd(*args, **kwargs):  
132 - if os.environ.get('PYROS_DEBUG', '0')=='1': print(*args, **kwargs)  
133 -  
134 -  
135 -  
136 class Colors: 137 class Colors:
137 HEADER = "\033[95m" 138 HEADER = "\033[95m"
138 BLUE = "\033[94m" 139 BLUE = "\033[94m"
@@ -397,7 +398,7 @@ class Agent: @@ -397,7 +398,7 @@ class Agent:
397 #def __init__(self, name:str="Agent", config_filename:str=None, RUN_IN_THREAD=True): 398 #def __init__(self, name:str="Agent", config_filename:str=None, RUN_IN_THREAD=True):
398 def __init__(self, config_filename:str=None, RUN_IN_THREAD=True, DEBUG_MODE=False): 399 def __init__(self, config_filename:str=None, RUN_IN_THREAD=True, DEBUG_MODE=False):
399 #self.name = name 400 #self.name = name
400 - print("*** ENVIRONMENT VARIABLE PYROS_DEBUG is:", os.environ.get('PYROS_DEBUG'), '***') 401 + printd("*** ENVIRONMENT VARIABLE PYROS_DEBUG is:", os.environ.get('PYROS_DEBUG'), '***')
401 self.name = self.__class__.__name__ 402 self.name = self.__class__.__name__
402 self.DEBUG_MODE = DEBUG_MODE 403 self.DEBUG_MODE = DEBUG_MODE
403 self._log = LogPyros(self.name, AgentLogs) 404 self._log = LogPyros(self.name, AgentLogs)
@@ -619,7 +620,7 @@ class Agent: @@ -619,7 +620,7 @@ class Agent:
619 620
620 #self.waitfor(self.mainloop_waittime) 621 #self.waitfor(self.mainloop_waittime)
621 622
622 - self.print("-"*20, "MAIN LOOP ITERATION (END)", "-"*20) 623 + self.print("*"*20, "MAIN LOOP ITERATION (END)", "*"*20)
623 #self.do_log(LOG_DEBUG, "Ending main loop iteration") 624 #self.do_log(LOG_DEBUG, "Ending main loop iteration")
624 625
625 self._iter_num += 1 626 self._iter_num += 1
@@ -629,8 +630,10 @@ class Agent: @@ -629,8 +630,10 @@ class Agent:
629 630
630 for i in range(3): self.print() 631 for i in range(3): self.print()
631 #self.printd("-"*80) 632 #self.printd("-"*80)
632 - self.print("-"*20, f"MAIN LOOP ITERATION {self._iter_num} (START)", "-"*20)  
633 - self.print(f"Iteration {self._iter_num}") 633 + self.print("*"*73)
  634 + self.print("*"*20, f"MAIN LOOP ITERATION {self._iter_num} (START)", "*"*20)
  635 + self.print("*"*73, '\n')
  636 + #self.print(f"Iteration {self._iter_num}")
634 637
635 # EXIT because of nb of iterations ? 638 # EXIT because of nb of iterations ?
636 if nb_iter is not None: 639 if nb_iter is not None:
@@ -663,25 +666,33 @@ class Agent: @@ -663,25 +666,33 @@ class Agent:
663 def _command_process_if_exists(self): 666 def _command_process_if_exists(self):
664 ''' Processing the next pending command if exists ''' 667 ''' Processing the next pending command if exists '''
665 668
666 - self.print("\n\n--------- START NEXT COMMAND PROCESSING ---------") 669 + self.print()
  670 + self.print()
  671 + self.print("*"*10, "NEXT COMMAND PROCESSING (START)", "*"*10, '\n')
  672 +
667 673
668 # Purge commands (every N iterations, delete old commands) 674 # Purge commands (every N iterations, delete old commands)
669 N=5 675 N=5
670 if ((self._iter_num-1) % N) == 0: 676 if ((self._iter_num-1) % N) == 0:
671 - self.print("Looking for old commands to purge...") 677 + self.print("Purging old commands if exists")
672 #Command.purge_old_commands_for_agent(self.name) 678 #Command.purge_old_commands_for_agent(self.name)
673 self._purge_old_commands_sent_to_me() 679 self._purge_old_commands_sent_to_me()
674 680
675 # Get next command and process it (if exists) 681 # Get next command and process it (if exists)
676 cmd = self._get_next_valid_and_not_running_command() 682 cmd = self._get_next_valid_and_not_running_command()
  683 + #self._set_status(self.STATUS_GENERAL_PROCESS)
677 #if cmd: self.command_process(cmd) 684 #if cmd: self.command_process(cmd)
678 if cmd: 685 if cmd:
  686 + self.print('-'*6)
  687 + self.print('-'*6, "RECEIVED NEW COMMAND TO PROCESS:")
  688 + self.print('-'*6, cmd)
  689 + self.print('-'*6)
679 690
680 # CASE 1 - AGENT LEVEL command 691 # CASE 1 - AGENT LEVEL command
681 # => I process it directly without asking my DC 692 # => I process it directly without asking my DC
682 # => Simple action, short execution time, so I execute it directly (in current main thread, not in parallel) 693 # => Simple action, short execution time, so I execute it directly (in current main thread, not in parallel)
683 if self.is_agent_level_cmd(cmd): 694 if self.is_agent_level_cmd(cmd):
684 - self.print("********** AGENT LEVEL CMD *********") 695 + self.print("(AGENT LEVEL CMD)")
685 try: 696 try:
686 self._exec_agent_cmd(cmd) 697 self._exec_agent_cmd(cmd)
687 except AttributeError as e: 698 except AttributeError as e:
@@ -718,7 +729,7 @@ class Agent: @@ -718,7 +729,7 @@ class Agent:
718 # => Execute it only if I am active and no currently running another device level cmd 729 # => Execute it only if I am active and no currently running another device level cmd
719 # => Long execution time, so I will execute it in parallel (in a new thread or process) 730 # => Long execution time, so I will execute it in parallel (in a new thread or process)
720 elif self.is_device_level_cmd(cmd): 731 elif self.is_device_level_cmd(cmd):
721 - self.print("********** DEVICE LEVEL CMD *********") 732 + self.print("(DEVICE LEVEL CMD)")
722 try: 733 try:
723 self.exec_device_cmd_if_possible(cmd) 734 self.exec_device_cmd_if_possible(cmd)
724 except (UnimplementedGenericCmdException, UnknownNativeCmdException) as e: 735 except (UnimplementedGenericCmdException, UnknownNativeCmdException) as e:
@@ -739,14 +750,15 @@ class Agent: @@ -739,14 +750,15 @@ class Agent:
739 cmd.set_result("ERROR: INVALID COMMAND") 750 cmd.set_result("ERROR: INVALID COMMAND")
740 cmd.set_as_skipped() 751 cmd.set_as_skipped()
741 752
  753 + self.print()
  754 + self.print("*"*10, "NEXT COMMAND PROCESSING (END)", "*"*10, "\n")
742 755
743 - self.print("\n--------- END NEXT COMMAND PROCESSING ---------\n")  
744 756
745 757
746 def print_TEST_MODE(self): 758 def print_TEST_MODE(self):
747 if self.TEST_MODE: 759 if self.TEST_MODE:
748 - self.print("[IN TEST MODE]")  
749 - self.print("flush previous commands to be sure to start in clean state") 760 + self.printd("[IN TEST MODE]")
  761 + self.print("Flush previous commands to be sure to start in clean state")
750 Command.delete_pending_commands_for_agent(self.name) 762 Command.delete_pending_commands_for_agent(self.name)
751 else: 763 else:
752 self.printd("[IN NORMAL MODE]") 764 self.printd("[IN NORMAL MODE]")
@@ -764,10 +776,14 @@ class Agent: @@ -764,10 +776,14 @@ class Agent:
764 (or just a regular processing) 776 (or just a regular processing)
765 at each iteration 777 at each iteration
766 """ 778 """
767 - self.print("\n\n--------- START ROUTINE PROCESSING ---------") 779 + self.print()
  780 + self.print()
  781 + self.print("*"*10, "ROUTINE PROCESSING (START)", "*"*10, '\n')
  782 +
768 self._set_status(self.STATUS_ROUTINE_PROCESS) 783 self._set_status(self.STATUS_ROUTINE_PROCESS)
769 self.routine_process_body() 784 self.routine_process_body()
770 - self.print("\n--------- END ROUTINE PROCESSING ---------\n") 785 + self.print()
  786 + self.print("*"*10, "ROUTINE PROCESSING (END)", "*"*10)
771 787
772 # To be overridden by subclasses 788 # To be overridden by subclasses
773 def routine_process_body(self): 789 def routine_process_body(self):
@@ -1036,7 +1052,7 @@ class Agent: @@ -1036,7 +1052,7 @@ class Agent:
1036 Commands are read in chronological order 1052 Commands are read in chronological order
1037 """ 1053 """
1038 self._set_status(self.STATUS_GET_NEXT_COMMAND) 1054 self._set_status(self.STATUS_GET_NEXT_COMMAND)
1039 - #self.print("Looking for new commands from the database ...") 1055 + self.print("Looking for a new command to process (sent by another agent):")
1040 1056
1041 # 1) Get all pending commands for me (return if None) 1057 # 1) Get all pending commands for me (return if None)
1042 # Not sure this is necessary to do it in a transaction, 1058 # Not sure this is necessary to do it in a transaction,
@@ -1046,9 +1062,9 @@ class Agent: @@ -1046,9 +1062,9 @@ class Agent:
1046 self._pending_commands = Command.get_pending_and_running_commands_for_agent(self.name) 1062 self._pending_commands = Command.get_pending_and_running_commands_for_agent(self.name)
1047 commands = self._pending_commands 1063 commands = self._pending_commands
1048 if not commands.exists(): 1064 if not commands.exists():
1049 - self.print("No new command to process") 1065 + self.print("<None>")
1050 return None 1066 return None
1051 - self.printd("Current pending (or running) commands are (time ordered) :") 1067 + self.printd("Current pending (or running) commands are (time ordered):")
1052 Command.show_commands(commands) 1068 Command.show_commands(commands)
1053 1069
1054 # 2) If there is a "do_exit" or "do_abort" command pending (even at the end of the list), 1070 # 2) If there is a "do_exit" or "do_abort" command pending (even at the end of the list),
@@ -1056,8 +1072,9 @@ class Agent: @@ -1056,8 +1072,9 @@ class Agent:
1056 # then pass it straight away to general_process() for execution 1072 # then pass it straight away to general_process() for execution
1057 for cmd in commands: 1073 for cmd in commands:
1058 #if cmd.name in ("do_exit", "do_abort", "do_flush_commands"): break 1074 #if cmd.name in ("do_exit", "do_abort", "do_flush_commands"): break
1059 - if cmd.name in ("do_exit", "do_abort", "do_flush_commands"): break  
1060 - if cmd.name in ("do_exit", "do_abort", "do_flush_commands"): 1075 + if cmd.name in ("do_exit", "do_abort"): break
  1076 + #if cmd.name in ("do_exit", "do_abort", "do_flush_commands"):
  1077 + if cmd.name in ("do_exit", "do_abort"):
1061 if cmd.is_running(): 1078 if cmd.is_running():
1062 return None 1079 return None
1063 if cmd.is_expired(): 1080 if cmd.is_expired():
@@ -1110,11 +1127,7 @@ class Agent: @@ -1110,11 +1127,7 @@ class Agent:
1110 # 6) Current cmd must now be a valid (not expired) and PENDING one, 1127 # 6) Current cmd must now be a valid (not expired) and PENDING one,
1111 # so return it for execution 1128 # so return it for execution
1112 #self.printd(f"Got command {cmd.name} sent by agent {cmd.sender} at {cmd.sender_deposit_time}") 1129 #self.printd(f"Got command {cmd.name} sent by agent {cmd.sender} at {cmd.sender_deposit_time}")
1113 - self._set_status(self.STATUS_GENERAL_PROCESS)  
1114 - self.print("***")  
1115 - self.print("*** RECEIVED", cmd)  
1116 - self.print("***")  
1117 - self.print(f"Starting processing of this command") 1130 + #self.printd(f"Starting processing of this command")
1118 return cmd 1131 return cmd
1119 1132
1120 1133
@@ -1122,7 +1135,8 @@ class Agent: @@ -1122,7 +1135,8 @@ class Agent:
1122 #def _exec_agent_general_cmd(self, cmd:Command): 1135 #def _exec_agent_general_cmd(self, cmd:Command):
1123 def _exec_agent_cmd(self, cmd:Command): 1136 def _exec_agent_cmd(self, cmd:Command):
1124 1137
1125 - self.print(f"Starting execution of an AGENT LEVEL cmd {cmd}") 1138 + #self.print(f"Starting execution of an AGENT LEVEL cmd {cmd}...")
  1139 + self.print(f"Starting execution of an AGENT LEVEL cmd...")
1126 1140
1127 # Update read time to say that the command has been READ 1141 # Update read time to say that the command has been READ
1128 cmd.set_read_time() 1142 cmd.set_read_time()
@@ -1130,7 +1144,7 @@ class Agent: @@ -1130,7 +1144,7 @@ class Agent:
1130 1144
1131 # SPECIFIC command (only related to me, not to any agent) 1145 # SPECIFIC command (only related to me, not to any agent)
1132 if self._is_agent_specific_cmd(cmd): 1146 if self._is_agent_specific_cmd(cmd):
1133 - self.print("********** -- Agent Level SPECIFIC CMD") 1147 + self.print("(Agent level SPECIFIC cmd)")
1134 # Execute method self."cmd.name"() 1148 # Execute method self."cmd.name"()
1135 # This can raise an exception (caught by this method caller) 1149 # This can raise an exception (caught by this method caller)
1136 self.exec_cmd_from_its_name(cmd) 1150 self.exec_cmd_from_its_name(cmd)
@@ -1146,11 +1160,11 @@ class Agent: @@ -1146,11 +1160,11 @@ class Agent:
1146 ''' 1160 '''
1147 cmd.set_result("Agent level SPECIFIC cmd done") 1161 cmd.set_result("Agent level SPECIFIC cmd done")
1148 cmd.set_as_processed() 1162 cmd.set_as_processed()
1149 - self.print("********** -- Agent Level SPECIFIC cmd has been executed") 1163 + self.print("...Agent level SPECIFIC cmd has been executed")
1150 return 1164 return
1151 1165
1152 # GENERAL command (related to any agent) 1166 # GENERAL command (related to any agent)
1153 - self.print("********** -- Agent Level GENERAL CMD") 1167 + self.print("(Agent level GENERAL CMD)")
1154 _,cmd_name,cmd_args = cmd.get_full_name_parts() 1168 _,cmd_name,cmd_args = cmd.get_full_name_parts()
1155 #cmd_name, cmd_args = cmd.tokenize() 1169 #cmd_name, cmd_args = cmd.tokenize()
1156 #if cmd.name == "set_state:active": 1170 #if cmd.name == "set_state:active":
@@ -1191,16 +1205,17 @@ class Agent: @@ -1191,16 +1205,17 @@ class Agent:
1191 cmd.set_result(eval(cmd_args)) 1205 cmd.set_result(eval(cmd_args))
1192 1206
1193 cmd.set_as_processed() 1207 cmd.set_as_processed()
1194 - self.print("********** -- Agent Level GENERAL cmd has been executed") 1208 + self.print("...Agent level GENERAL cmd has been executed")
1195 1209
1196 # If cmd is "do_exit", kill myself (without any question, this is an order soldier !) 1210 # If cmd is "do_exit", kill myself (without any question, this is an order soldier !)
1197 # This "do_exit" should normally kill any current thread (to be checked...) 1211 # This "do_exit" should normally kill any current thread (to be checked...)
1198 if cmd.name == "do_exit": 1212 if cmd.name == "do_exit":
1199 - self.print("(before exiting) Here are the current (still) pending commands (time ordered) :") 1213 + self.print("Before exiting, Here are (if exists) the current (still) pending commands (time ordered) :")
1200 commands = Command.get_pending_and_running_commands_for_agent(self.name) 1214 commands = Command.get_pending_and_running_commands_for_agent(self.name)
1201 - Command.show_commands(commands) 1215 + Command.show_commands(commands, True)
1202 #if self.TEST_MODE and self.TEST_WITH_FINAL_TEST and self.TEST_COMMANDS_DEST == "myself": self.simulator_test_results() 1216 #if self.TEST_MODE and self.TEST_WITH_FINAL_TEST and self.TEST_COMMANDS_DEST == "myself": self.simulator_test_results()
1203 - if self.TEST_MODE and self.TEST_WITH_FINAL_TEST: self._TEST_test_results() 1217 + if self.TEST_MODE and self.TEST_WITH_FINAL_TEST:
  1218 + self._TEST_test_results()
1204 #self._DO_EXIT=True 1219 #self._DO_EXIT=True
1205 #exit(0) 1220 #exit(0)
1206 1221
@@ -1330,6 +1345,7 @@ class Agent: @@ -1330,6 +1345,7 @@ class Agent:
1330 TEST MODE ONLY 1345 TEST MODE ONLY
1331 """ 1346 """
1332 1347
  1348 + self.print("(TEST mode) Trying to send a new command if possible...")
1333 # There is a current command being processed 1349 # There is a current command being processed
1334 # => check if next command is "do_abort" 1350 # => check if next command is "do_abort"
1335 # => if so, instantly send a "do_abort" to abort previous command 1351 # => if so, instantly send a "do_abort" to abort previous command
@@ -1398,10 +1414,10 @@ class Agent: @@ -1398,10 +1414,10 @@ class Agent:
1398 self._DO_MAIN_LOOP = False 1414 self._DO_MAIN_LOOP = False
1399 return 1415 return
1400 # Send cmd (= set as pending and save) 1416 # Send cmd (= set as pending and save)
1401 - self.printd("***") 1417 + self.print("***")
1402 #self.printd(f"*** SEND ", self._cmdts) 1418 #self.printd(f"*** SEND ", self._cmdts)
1403 - self.printd(f"***", self._cmdts)  
1404 - self.printd("***") 1419 + self.print(f"*** NEW COMMAND TO SEND is:", self._cmdts)
  1420 + self.print("***")
1405 #self._cmdts.set_as_pending() 1421 #self._cmdts.set_as_pending()
1406 # SEND 1422 # SEND
1407 self._cmdts.send() 1423 self._cmdts.send()
@@ -1464,7 +1480,8 @@ class Agent: @@ -1464,7 +1480,8 @@ class Agent:
1464 self._TEST_test_results_end(nb_asserted) 1480 self._TEST_test_results_end(nb_asserted)
1465 1481
1466 def _TEST_test_results_start(self): 1482 def _TEST_test_results_start(self):
1467 - self.print("\n--- Testing if the commands I SENT had the awaited result") 1483 + self.print()
  1484 + self.print("--- Testing if the commands I SENT had the awaited result")
1468 self.print("Here are the last commands I sent:") 1485 self.print("Here are the last commands I sent:")
1469 #commands = list(Command.get_last_N_commands_for_agent(self.name, 16)) 1486 #commands = list(Command.get_last_N_commands_for_agent(self.name, 16))
1470 #commands = Command.get_last_N_commands_sent_to_agent(self.name, 16) 1487 #commands = Command.get_last_N_commands_sent_to_agent(self.name, 16)
@@ -1539,7 +1556,7 @@ def extract_parameters(): @@ -1539,7 +1556,7 @@ def extract_parameters():
1539 WITH_SIM = False 1556 WITH_SIM = False
1540 VERBOSE_MODE = False 1557 VERBOSE_MODE = False
1541 configfile = None 1558 configfile = None
1542 - print("args:", sys.argv) 1559 + printd("args:", sys.argv)
1543 for arg in sys.argv[1:] : 1560 for arg in sys.argv[1:] :
1544 if arg == "-t": TEST_MODE = True 1561 if arg == "-t": TEST_MODE = True
1545 elif arg == "-s": WITH_SIM = True 1562 elif arg == "-s": WITH_SIM = True
src/core/pyros_django/agent/AgentDevice.py
@@ -192,7 +192,7 @@ class AgentDevice(Agent): @@ -192,7 +192,7 @@ class AgentDevice(Agent):
192 192
193 # @override parent class (Agent) 193 # @override parent class (Agent)
194 def routine_process_body(self): 194 def routine_process_body(self):
195 - self.printd("Reading my dedicated device status information and storing it in DB)...") 195 + self.print("Getting my device status information and storing it in DB)")
196 196
197 # Save current device status to DB 197 # Save current device status to DB
198 #AgentDeviceTelescopeStatus.objects.create(radec=myradec) 198 #AgentDeviceTelescopeStatus.objects.create(radec=myradec)
@@ -227,7 +227,9 @@ class AgentDevice(Agent): @@ -227,7 +227,9 @@ class AgentDevice(Agent):
227 def exec_device_cmd_if_possible(self, cmd:Command): 227 def exec_device_cmd_if_possible(self, cmd:Command):
228 228
229 self._set_status(self.STATUS_SPECIFIC_PROCESS) 229 self._set_status(self.STATUS_SPECIFIC_PROCESS)
230 - self.print(f"Starting execution of a DEVICE cmd {cmd}") 230 + #self.print(f"Starting execution of a DEVICE cmd {cmd}")
  231 + self.print("Starting execution of a DEVICE cmd...")
  232 + self.printd(cmd)
231 233
232 if self._is_idle(): 234 if self._is_idle():
233 self.print("I am IDLE ==> I mark the cmd SKIPPED and ignore it") 235 self.print("I am IDLE ==> I mark the cmd SKIPPED and ignore it")
@@ -256,9 +258,10 @@ class AgentDevice(Agent): @@ -256,9 +258,10 @@ class AgentDevice(Agent):
256 cmd.set_read_time() 258 cmd.set_read_time()
257 #self._current_thread = threading.Thread(target=self.exec_command) 259 #self._current_thread = threading.Thread(target=self.exec_command)
258 260
  261 + self.print("Launching device cmd in a thread (or process)...")
259 # Run in a thread 262 # Run in a thread
260 if self.RUN_IN_THREAD: 263 if self.RUN_IN_THREAD:
261 - self.print("(run device cmd in a thread)") 264 + self.printd("(run device cmd in a thread)")
262 self._current_device_cmd_thread = StoppableThreadEvenWhenSleeping(target=self._thread_exec_device_cmd) 265 self._current_device_cmd_thread = StoppableThreadEvenWhenSleeping(target=self._thread_exec_device_cmd)
263 #self._current_device_cmd_thread = StoppableThreadEvenWhenSleeping(target=self.exec_specific_cmd, args=(cmd,)) 266 #self._current_device_cmd_thread = StoppableThreadEvenWhenSleeping(target=self.exec_specific_cmd, args=(cmd,))
264 #self._current_thread = threading.Thread(target=self.exec_command) 267 #self._current_thread = threading.Thread(target=self.exec_command)
@@ -268,7 +271,7 @@ class AgentDevice(Agent): @@ -268,7 +271,7 @@ class AgentDevice(Agent):
268 271
269 # Run in a process 272 # Run in a process
270 else: 273 else:
271 - self.print("(run cmd in a process)") 274 + self.printd("(run cmd in a process)")
272 # close the database connection first, it will be re-opened in each process 275 # close the database connection first, it will be re-opened in each process
273 db.connections.close_all() 276 db.connections.close_all()
274 self._current_device_cmd_thread = multiprocessing.Process(target=self._thread_exec_device_cmd) 277 self._current_device_cmd_thread = multiprocessing.Process(target=self._thread_exec_device_cmd)
@@ -497,7 +500,7 @@ class AgentDevice(Agent): @@ -497,7 +500,7 @@ class AgentDevice(Agent):
497 with transaction.atomic(): 500 with transaction.atomic():
498 cmd.set_as_processed() 501 cmd.set_as_processed()
499 """ 502 """
500 - self.tprintd(">>>>> Thread: ended execution of command", cmd.name) 503 + self.print(f">>>>> Thread: ended execution of command '{cmd.name}'")
501 cmd = None 504 cmd = None
502 # No more current thread 505 # No more current thread
503 #self._current_device_cmd_thread = None 506 #self._current_device_cmd_thread = None
@@ -543,6 +546,7 @@ class AgentDevice(Agent): @@ -543,6 +546,7 @@ class AgentDevice(Agent):
543 #cmd = self._current_device_cmd 546 #cmd = self._current_device_cmd
544 self.tprintd("*** DEVICE cmd name is", cmd.name) 547 self.tprintd("*** DEVICE cmd name is", cmd.name)
545 self.tprintd("*** PASS IT TO DEVICE TYPE", cmd.device_type) 548 self.tprintd("*** PASS IT TO DEVICE TYPE", cmd.device_type)
  549 + time.sleep(2)
546 try: 550 try:
547 res = self._device_ctrl.exec_cmd(cmd.full_name) 551 res = self._device_ctrl.exec_cmd(cmd.full_name)
548 except (DCCNotFoundException, UnimplementedGenericCmdException) as e: 552 except (DCCNotFoundException, UnimplementedGenericCmdException) as e:
src/core/pyros_django/agent/AgentDeviceGemini.py
@@ -76,8 +76,7 @@ class AgentDeviceGemini(AgentDevice): @@ -76,8 +76,7 @@ class AgentDeviceGemini(AgentDevice):
76 super().__init__( 76 super().__init__(
77 config_filename, 77 config_filename,
78 RUN_IN_THREAD, 78 RUN_IN_THREAD,
79 - device_controller=DC_Gemini,  
80 - host=self.HOST, port=self.PORT, 79 + device_controller=DC_Gemini, host=self.HOST, port=self.PORT,
81 DEBUG_MODE=DEBUG_MODE) 80 DEBUG_MODE=DEBUG_MODE)
82 ###device_simulator=DeviceSimulatorTelescopeGemini) 81 ###device_simulator=DeviceSimulatorTelescopeGemini)
83 82
src/core/pyros_django/agent/AgentDeviceSBIG.py
@@ -64,7 +64,7 @@ class AgentDeviceSBIG(AgentDevice): @@ -64,7 +64,7 @@ class AgentDeviceSBIG(AgentDevice):
64 """ 64 """
65 65
66 # @override 66 # @override
67 - def __init__(self, config_filename=None, RUN_IN_THREAD=True): 67 + def __init__(self, config_filename=None, RUN_IN_THREAD=True, DEBUG_MODE=False):
68 ''' 68 '''
69 if self.is_in_simulator_mode() and not self.WITH_SIMULATOR: 69 if self.is_in_simulator_mode() and not self.WITH_SIMULATOR:
70 # START device SIMULATOR (in a thread) so that we can connect to it in place of the real device 70 # START device SIMULATOR (in a thread) so that we can connect to it in place of the real device
@@ -76,7 +76,8 @@ class AgentDeviceSBIG(AgentDevice): @@ -76,7 +76,8 @@ class AgentDeviceSBIG(AgentDevice):
76 super().__init__( 76 super().__init__(
77 config_filename, 77 config_filename,
78 RUN_IN_THREAD, 78 RUN_IN_THREAD,
79 - device_controller=DC_SBIG, host=self.HOST, port=self.PORT) 79 + device_controller=DC_SBIG, host=self.HOST, port=self.PORT,
  80 + DEBUG_MODE=DEBUG_MODE)
80 #device_simulator=DeviceSimulatorSBIG) 81 #device_simulator=DeviceSimulatorSBIG)
81 82
82 # Initialize the device table status 83 # Initialize the device table status
src/core/pyros_django/agent/AgentMultiRequester.py
@@ -21,7 +21,7 @@ class AgentMultiRequester(Agent): @@ -21,7 +21,7 @@ class AgentMultiRequester(Agent):
21 # Run the assertion tests at the end 21 # Run the assertion tests at the end
22 TEST_WITH_FINAL_TEST = True 22 TEST_WITH_FINAL_TEST = True
23 #TEST_MAX_DURATION_SEC = None 23 #TEST_MAX_DURATION_SEC = None
24 - TEST_MAX_DURATION_SEC = 150 24 + TEST_MAX_DURATION_SEC = 200
25 # Who should I send commands to ? 25 # Who should I send commands to ?
26 #TEST_COMMANDS_DEST = "myself" 26 #TEST_COMMANDS_DEST = "myself"
27 #TEST_COMMANDS_DEST = "AgentDeviceTelescopeGemini" 27 #TEST_COMMANDS_DEST = "AgentDeviceTelescopeGemini"
@@ -30,15 +30,15 @@ class AgentMultiRequester(Agent): @@ -30,15 +30,15 @@ class AgentMultiRequester(Agent):
30 30
31 TEST_COMMANDS_LIST_GEMINI_AND_SBIG_SIMPLE = [ 31 TEST_COMMANDS_LIST_GEMINI_AND_SBIG_SIMPLE = [
32 'ad_mount do_flush_commands', 32 'ad_mount do_flush_commands',
33 - 'ad_filtersel do_flush_commands', 33 + ##'ad_filtersel do_flush_commands',
34 34
35 # Not executed because not known by Mount (but by the general DC Gemini only) 35 # Not executed because not known by Mount (but by the general DC Gemini only)
36 'ad_mount get_date', 36 'ad_mount get_date',
37 37
38 # for test purpose only 38 # for test purpose only
39 - 'ad_sensor get_date',  
40 - 'ad_sensor set_date 21/10/19',  
41 - 'ad_sensor get_date', 39 + ##'ad_sensor get_date',
  40 + ##'ad_sensor set_date 21/10/19',
  41 + ##'ad_sensor get_date',
42 42
43 'ad_mount get_ra', 43 'ad_mount get_ra',
44 #'ad_mount get_dec', 44 #'ad_mount get_dec',
@@ -55,7 +55,7 @@ class AgentMultiRequester(Agent): @@ -55,7 +55,7 @@ class AgentMultiRequester(Agent):
55 55
56 # Optional 56 # Optional
57 'ad_mount do_exit', 57 'ad_mount do_exit',
58 - 'ad_filtersel do_exit', 58 + ##'ad_filtersel do_exit',
59 ] 59 ]
60 TEST_COMMANDS_LIST_GEMINI_AND_SBIG = [ 60 TEST_COMMANDS_LIST_GEMINI_AND_SBIG = [
61 # Ask receiver to delete all its previous commands 61 # Ask receiver to delete all its previous commands
@@ -223,9 +223,9 @@ class AgentMultiRequester(Agent): @@ -223,9 +223,9 @@ class AgentMultiRequester(Agent):
223 223
224 ] 224 ]
225 225
226 - TEST_COMMANDS_LIST = TEST_COMMANDS_LIST_GEMINI_AND_SBIG  
227 TEST_COMMANDS_LIST = TEST_COMMANDS_LIST_SBIG_ONLY 226 TEST_COMMANDS_LIST = TEST_COMMANDS_LIST_SBIG_ONLY
228 TEST_COMMANDS_LIST = TEST_COMMANDS_LIST_GEMINI_AND_SBIG_SIMPLE 227 TEST_COMMANDS_LIST = TEST_COMMANDS_LIST_GEMINI_AND_SBIG_SIMPLE
  228 + TEST_COMMANDS_LIST = TEST_COMMANDS_LIST_GEMINI_AND_SBIG
229 229
230 230
231 """ 231 """
@@ -236,10 +236,10 @@ class AgentMultiRequester(Agent): @@ -236,10 +236,10 @@ class AgentMultiRequester(Agent):
236 236
237 # @override 237 # @override
238 #def __init__(self, name:str=None, config_filename=None, RUN_IN_THREAD=True): 238 #def __init__(self, name:str=None, config_filename=None, RUN_IN_THREAD=True):
239 - def __init__(self, config_filename=None, RUN_IN_THREAD=True): 239 + def __init__(self, config_filename=None, RUN_IN_THREAD=True, DEBUG_MODE=False):
240 ##if name is None: name = self.__class__.__name__ 240 ##if name is None: name = self.__class__.__name__
241 #super().__init__(name, config_filename, RUN_IN_THREAD) 241 #super().__init__(name, config_filename, RUN_IN_THREAD)
242 - super().__init__(config_filename, RUN_IN_THREAD) 242 + super().__init__(config_filename, RUN_IN_THREAD, DEBUG_MODE=DEBUG_MODE)
243 243
244 #TODO: : ร  mettre dans la config 244 #TODO: : ร  mettre dans la config
245 """ 245 """
src/core/pyros_django/common/models.py
1 ##from __future__ import unicode_literals 1 ##from __future__ import unicode_literals
2 2
  3 +# Stdlib imports
3 from enum import Enum 4 from enum import Enum
4 from datetime import datetime, timedelta 5 from datetime import datetime, timedelta
  6 +import os
  7 +import sys
5 from typing import List 8 from typing import List
6 9
  10 +# DJANGO imports
7 from django.contrib.auth.models import AbstractUser 11 from django.contrib.auth.models import AbstractUser
8 from django.db import models 12 from django.db import models
9 from django.db.models import Q 13 from django.db.models import Q
10 from django.core.validators import MaxValueValidator, MinValueValidator 14 from django.core.validators import MaxValueValidator, MinValueValidator
11 from model_utils import Choices 15 from model_utils import Choices
12 16
  17 +# Project imports
13 # DeviceCommand is used by class Command 18 # DeviceCommand is used by class Command
14 -import sys  
15 sys.path.append("../../..") 19 sys.path.append("../../..")
16 from src.device_controller.abstract_component.device_controller import DeviceCommand 20 from src.device_controller.abstract_component.device_controller import DeviceCommand
17 21
@@ -161,6 +165,9 @@ class Company(models.Model): @@ -161,6 +165,9 @@ class Company(models.Model):
161 """ 165 """
162 166
163 167
  168 +def printd(*args, **kwargs):
  169 + if os.environ.get('PYROS_DEBUG', '0')=='1': print(*args, **kwargs)
  170 +
164 # --- 171 # ---
165 # --- Utility functions 172 # --- Utility functions
166 # --- 173 # ---
@@ -521,7 +528,7 @@ class Command(models.Model): @@ -521,7 +528,7 @@ class Command(models.Model):
521 528
522 @classmethod 529 @classmethod
523 def delete_commands_with_running_status_for_agent(cls, agent_name): 530 def delete_commands_with_running_status_for_agent(cls, agent_name):
524 - print("Delete (false) 'running' command if exists:") 531 + printd("Delete (false) 'running' commands if exists:")
525 running_commands = cls.objects.filter( 532 running_commands = cls.objects.filter(
526 # only commands for agent agent_name 533 # only commands for agent agent_name
527 recipient = agent_name, 534 recipient = agent_name,
@@ -533,7 +540,7 @@ class Command(models.Model): @@ -533,7 +540,7 @@ class Command(models.Model):
533 if running_commands: 540 if running_commands:
534 Command.show_commands(running_commands) 541 Command.show_commands(running_commands)
535 running_commands.delete() 542 running_commands.delete()
536 - else: print("<None>") 543 + else: printd("<None>")
537 544
538 @classmethod 545 @classmethod
539 def delete_pending_commands_for_agent(cls, agent_name): 546 def delete_pending_commands_for_agent(cls, agent_name):
@@ -545,7 +552,7 @@ class Command(models.Model): @@ -545,7 +552,7 @@ class Command(models.Model):
545 - agentB will then delete the command just sent by agentA 552 - agentB will then delete the command just sent by agentA
546 - agentA will check regularly the status of its sent command, and this will crash as this command exists no more !! 553 - agentA will check regularly the status of its sent command, and this will crash as this command exists no more !!
547 """ 554 """
548 - print("Delete all pending command(s) if exists (except very recent ones):") 555 + printd("Delete all pending command(s) if exists (except very recent ones):")
549 now_minus_2sec = datetime.utcnow().astimezone() - timedelta(seconds = 2) 556 now_minus_2sec = datetime.utcnow().astimezone() - timedelta(seconds = 2)
550 #print("now_minus_2sec", now_minus_2sec) 557 #print("now_minus_2sec", now_minus_2sec)
551 pending_commands = cls.objects.filter( 558 pending_commands = cls.objects.filter(
@@ -559,7 +566,7 @@ class Command(models.Model): @@ -559,7 +566,7 @@ class Command(models.Model):
559 if pending_commands: 566 if pending_commands:
560 Command.show_commands(pending_commands) 567 Command.show_commands(pending_commands)
561 pending_commands.delete() 568 pending_commands.delete()
562 - else: print("<None>") 569 + else: printd("<None>")
563 570
564 @classmethod 571 @classmethod
565 def get_pending_and_running_commands_for_agent(cls, agent_name): 572 def get_pending_and_running_commands_for_agent(cls, agent_name):
@@ -608,7 +615,7 @@ class Command(models.Model): @@ -608,7 +615,7 @@ class Command(models.Model):
608 NB: datetime.utcnow() is equivalent to datetime.now(timezone.utc) 615 NB: datetime.utcnow() is equivalent to datetime.now(timezone.utc)
609 """ 616 """
610 617
611 - print(f"(Looking for commands sent to me that are not executing and older than {cls.COMMANDS_PEREMPTION_HOURS} hour(s))") 618 + printd(f"(Looking for commands sent to me that are not executing and older than {cls.COMMANDS_PEREMPTION_HOURS} hour(s))")
612 #COMMAND_PEREMPTION_DATE_FROM_NOW = datetime.utcnow() - timedelta(hours = cls.COMMANDS_PEREMPTION_HOURS) 619 #COMMAND_PEREMPTION_DATE_FROM_NOW = datetime.utcnow() - timedelta(hours = cls.COMMANDS_PEREMPTION_HOURS)
613 #print("peremption date", COMMAND_PEREMPTION_DATE_FROM_NOW) 620 #print("peremption date", COMMAND_PEREMPTION_DATE_FROM_NOW)
614 old_commands = cls.objects.filter( 621 old_commands = cls.objects.filter(
@@ -620,21 +627,25 @@ class Command(models.Model): @@ -620,21 +627,25 @@ class Command(models.Model):
620 state = cls.CMD_STATUS_CODES.CMD_RUNNING 627 state = cls.CMD_STATUS_CODES.CMD_RUNNING
621 ) 628 )
622 if old_commands.exists(): 629 if old_commands.exists():
623 - print("Found old commands to delete:") 630 + printd("Found old commands to delete:")
624 #for cmd in old_commands: print(cmd) 631 #for cmd in old_commands: print(cmd)
625 cls.show_commands(old_commands) 632 cls.show_commands(old_commands)
626 old_commands.delete() 633 old_commands.delete()
627 else: 634 else:
628 - print("<None>") 635 + printd("<None>")
629 636
630 @classmethod 637 @classmethod
631 #def show_commands(cls, commands:models.query): 638 #def show_commands(cls, commands:models.query):
632 - def show_commands(cls, commands:list): 639 + def show_commands(cls, commands:list, do_it:bool=False):
633 #def show_commands(cls, commands:List[Commmand]): 640 #def show_commands(cls, commands:List[Commmand]):
634 #if not commands.exists(): print("<No command>") 641 #if not commands.exists(): print("<No command>")
635 commands = list(commands) 642 commands = list(commands)
636 - if len(commands) == 0: print("<No command>")  
637 - for cmd in commands: print("-", cmd.name, cmd) 643 + if len(commands) == 0:
  644 + if do_it: print("<None>")
  645 + else: printd("<None>")
  646 + for cmd in commands:
  647 + if do_it: print("-", cmd.name, cmd)
  648 + else: printd("-", cmd.name, cmd)
638 649
639 650
640 # -------------- Command INSTANCE METHODS -------------- 651 # -------------- Command INSTANCE METHODS --------------
@@ -742,7 +753,7 @@ class Command(models.Model): @@ -742,7 +753,7 @@ class Command(models.Model):
742 def is_expired(self): 753 def is_expired(self):
743 #return (datetime.utcnow() - self.s_deposit_time) > timedelta(seconds = self.validity_duration) 754 #return (datetime.utcnow() - self.s_deposit_time) > timedelta(seconds = self.validity_duration)
744 elapsed_time = (datetime.utcnow().astimezone() - self.s_deposit_time) 755 elapsed_time = (datetime.utcnow().astimezone() - self.s_deposit_time)
745 - print("elapsed_time", elapsed_time) 756 + printd("elapsed_time", elapsed_time)
746 return elapsed_time > timedelta(seconds = self.validity_duration) 757 return elapsed_time > timedelta(seconds = self.validity_duration)
747 """ 758 """
748 elapsed_time = cmd.r_read_time - cmd.s_deposit_time 759 elapsed_time = cmd.r_read_time - cmd.s_deposit_time
@@ -770,7 +781,7 @@ class Command(models.Model): @@ -770,7 +781,7 @@ class Command(models.Model):
770 self.save(update_fields=["r_read_time"]) 781 self.save(update_fields=["r_read_time"])
771 782
772 def set_as_processed(self): 783 def set_as_processed(self):
773 - print(f"- Set command {self.name} as processed") 784 + printd(f"- Set command {self.name} as processed")
774 self.set_state_to(self.CMD_STATUS_CODES.CMD_EXECUTED) 785 self.set_state_to(self.CMD_STATUS_CODES.CMD_EXECUTED)
775 #print(self) 786 #print(self)
776 """ 787 """
@@ -792,12 +803,12 @@ class Command(models.Model): @@ -792,12 +803,12 @@ class Command(models.Model):
792 self.set_state_to(self.CMD_STATUS_CODES.CMD_SKIPPED) 803 self.set_state_to(self.CMD_STATUS_CODES.CMD_SKIPPED)
793 804
794 def set_as_killed_by(self, author_agent:str): 805 def set_as_killed_by(self, author_agent:str):
795 - print(f"- Set command {self.name} as killed") 806 + printd(f"- Set command {self.name} as killed")
796 #print(f"- Set this command as killed: {self}") 807 #print(f"- Set this command as killed: {self}")
797 self.set_state_to(self.CMD_STATUS_CODES.CMD_KILLED, author_agent) 808 self.set_state_to(self.CMD_STATUS_CODES.CMD_KILLED, author_agent)
798 809
799 def set_as_running(self): 810 def set_as_running(self):
800 - print(f"- Set command {self.name} as running") 811 + printd(f"- Set command {self.name} as running")
801 self.set_state_to(self.CMD_STATUS_CODES.CMD_RUNNING) 812 self.set_state_to(self.CMD_STATUS_CODES.CMD_RUNNING)
802 ''' 813 '''
803 def set_as_executed(self): 814 def set_as_executed(self):
src/device_controller/abstract_component/detector_sensor.py
@@ -22,7 +22,7 @@ import sys @@ -22,7 +22,7 @@ import sys
22 #from device_controller.abstract_component.base import * 22 #from device_controller.abstract_component.base import *
23 #sys.path.append("../..") 23 #sys.path.append("../..")
24 #from device_controller.abstract_component.base import * 24 #from device_controller.abstract_component.base import *
25 -from device_controller.abstract_component.device_controller import DeviceController 25 +from device_controller.abstract_component.device_controller import printd, DeviceController
26 26
27 27
28 28
@@ -54,7 +54,7 @@ class DC_DetectorSensor(DeviceController): @@ -54,7 +54,7 @@ class DC_DetectorSensor(DeviceController):
54 :param device_port: server port 54 :param device_port: server port
55 :param PROTOCOL: "UDP" or "TCP" 55 :param PROTOCOL: "UDP" or "TCP"
56 ''' 56 '''
57 - print("IN DeviceControllerFilterSelector") 57 + printd("IN DeviceControllerFilterSelector")
58 #self._my_gen2nat_cmds = { **self.GEN2NAT_CMDS, **gen2nat_cmds } 58 #self._my_gen2nat_cmds = { **self.GEN2NAT_CMDS, **gen2nat_cmds }
59 my_gen2nat_cmds = { **self.GEN2NAT_CMDS, **gen2nat_cmds } 59 my_gen2nat_cmds = { **self.GEN2NAT_CMDS, **gen2nat_cmds }
60 #super().__init__(device_host, device_port, PROTOCOL, buffer_size, DEBUG, device_sim) 60 #super().__init__(device_host, device_port, PROTOCOL, buffer_size, DEBUG, device_sim)
src/device_controller/abstract_component/detector_shutter.py
@@ -22,7 +22,7 @@ import sys @@ -22,7 +22,7 @@ import sys
22 #from device_controller.abstract_component.base import * 22 #from device_controller.abstract_component.base import *
23 #sys.path.append("../..") 23 #sys.path.append("../..")
24 #from device_controller.abstract_component.base import * 24 #from device_controller.abstract_component.base import *
25 -from device_controller.abstract_component.device_controller import DeviceController 25 +from device_controller.abstract_component.device_controller import printd, DeviceController
26 26
27 27
28 #class SocketClientTelescopeAbstract(SocketClientAbstract): 28 #class SocketClientTelescopeAbstract(SocketClientAbstract):
@@ -50,7 +50,7 @@ class DC_DetectorShutter(DeviceController): @@ -50,7 +50,7 @@ class DC_DetectorShutter(DeviceController):
50 :param device_port: server port 50 :param device_port: server port
51 :param PROTOCOL: "UDP" or "TCP" 51 :param PROTOCOL: "UDP" or "TCP"
52 ''' 52 '''
53 - print("IN DeviceControllerFilterSelector") 53 + printd("IN DeviceControllerFilterSelector")
54 #self._my_gen2nat_cmds = { **self.GEN2NAT_CMDS, **gen2nat_cmds } 54 #self._my_gen2nat_cmds = { **self.GEN2NAT_CMDS, **gen2nat_cmds }
55 my_gen2nat_cmds = { **self.GEN2NAT_CMDS, **gen2nat_cmds } 55 my_gen2nat_cmds = { **self.GEN2NAT_CMDS, **gen2nat_cmds }
56 #super().__init__(device_host, device_port, PROTOCOL, buffer_size, DEBUG, device_sim) 56 #super().__init__(device_host, device_port, PROTOCOL, buffer_size, DEBUG, device_sim)
src/device_controller/abstract_component/device_controller.py
@@ -53,7 +53,7 @@ TIMEOUT_RECEIVE = 10 @@ -53,7 +53,7 @@ TIMEOUT_RECEIVE = 10
53 53
54 54
55 def printd(*args, **kwargs): 55 def printd(*args, **kwargs):
56 - if os.environ.get('PYROS_DEBUG', '0')=='1': printd(*args, **kwargs) 56 + if os.environ.get('PYROS_DEBUG', '0')=='1': print(*args, **kwargs)
57 57
58 58
59 ''' 59 '''
@@ -325,11 +325,11 @@ class Gen2NatCmds: @@ -325,11 +325,11 @@ class Gen2NatCmds:
325 printd(f"\n{dcc_key} commands are:") 325 printd(f"\n{dcc_key} commands are:")
326 printd("- GET commands:") 326 printd("- GET commands:")
327 #print (list(cmd.replace('_',' ') for cmd in self._gen2nat_cmds.keys() if cmd.startswith('get_'))) 327 #print (list(cmd.replace('_',' ') for cmd in self._gen2nat_cmds.keys() if cmd.startswith('get_')))
328 - print (list(cmd for cmd in d.keys() if cmd.startswith('get_'))) 328 + printd (list(cmd for cmd in d.keys() if cmd.startswith('get_')))
329 printd("- SET commands:") 329 printd("- SET commands:")
330 - print (list(cmd for cmd in d.keys() if cmd.startswith('set_'))) 330 + printd (list(cmd for cmd in d.keys() if cmd.startswith('set_')))
331 printd("- DO commands:") 331 printd("- DO commands:")
332 - print (list(cmd for cmd in d.keys() if cmd.startswith('do_'))) 332 + printd (list(cmd for cmd in d.keys() if cmd.startswith('do_')))
333 333
334 334
335 335
@@ -450,7 +450,7 @@ class DeviceController(): @@ -450,7 +450,7 @@ class DeviceController():
450 self.stamp_current = None 450 self.stamp_current = None
451 451
452 #self.DEBUG_MODE = DEBUG 452 #self.DEBUG_MODE = DEBUG
453 - self.DEBUG_MODE = os.environ.get('PYROS_DEBUG', '0') == 1 453 + self.DEBUG_MODE = os.environ.get('PYROS_DEBUG', '0') == '1'
454 set_logger(self.DEBUG_MODE) 454 set_logger(self.DEBUG_MODE)
455 log_d("Logger configured") 455 log_d("Logger configured")
456 456
@@ -592,7 +592,7 @@ class DeviceController(): @@ -592,7 +592,7 @@ class DeviceController():
592 ##data = self.unformat_received_data(data_received) 592 ##data = self.unformat_received_data(data_received)
593 data = self.uncap(self.stamp_current, data_received) 593 data = self.uncap(self.stamp_current, data_received)
594 printd(f"(dc) ({self}) RECEIVED (useful data): {data}") 594 printd(f"(dc) ({self}) RECEIVED (useful data): {data}")
595 - log_i(f"(dc) ({self}) RECEIVED (useful data): {data}") 595 + ##log_i(f"(dc) ({self}) RECEIVED (useful data): {data}")
596 return data 596 return data
597 ''' 597 '''
598 def _receive_data(self): 598 def _receive_data(self):
@@ -963,7 +963,7 @@ class DeviceController(): @@ -963,7 +963,7 @@ class DeviceController():
963 return self.send_native_cmd(request) 963 return self.send_native_cmd(request)
964 964
965 965
966 - # wrapper methods 966 + # wrapper shortcut methods
967 def print_available_cmds(self): self._my_cmds.print_available_cmds() 967 def print_available_cmds(self): self._my_cmds.print_available_cmds()
968 def print_available_cmds_for_dcc(self, dcc_key): self._my_cmds.print_available_cmds_for_dcc(dcc_key) 968 def print_available_cmds_for_dcc(self, dcc_key): self._my_cmds.print_available_cmds_for_dcc(dcc_key)
969 969
@@ -1043,7 +1043,7 @@ class DeviceController(): @@ -1043,7 +1043,7 @@ class DeviceController():
1043 #printd("(DC): My ("+type(self).__name__+") commands are:", self._my_cmds.get()) 1043 #printd("(DC): My ("+type(self).__name__+") commands are:", self._my_cmds.get())
1044 #printd("(DC): My ("+type(self).__name__+") commands are:", self._my_cmds.get()) 1044 #printd("(DC): My ("+type(self).__name__+") commands are:", self._my_cmds.get())
1045 self.tprintd("(DC): My ("+type(self).__name__+") commands are:") 1045 self.tprintd("(DC): My ("+type(self).__name__+") commands are:")
1046 - pprint.pprint(self._my_cmds.get()) 1046 + if self.DEBUG_MODE: pprint.pprint(self._my_cmds.get())
1047 1047
1048 dcc, native_cmd_infos = self.get_dcc_and_native_cmd_for_generic(generic_cmd) 1048 dcc, native_cmd_infos = self.get_dcc_and_native_cmd_for_generic(generic_cmd)
1049 self.tprintd("native_cmd_infos", native_cmd_infos) 1049 self.tprintd("native_cmd_infos", native_cmd_infos)
src/device_controller/abstract_component/filter_selector.py
@@ -22,7 +22,7 @@ import sys @@ -22,7 +22,7 @@ import sys
22 #from device_controller.abstract_component.base import * 22 #from device_controller.abstract_component.base import *
23 #sys.path.append("../..") 23 #sys.path.append("../..")
24 #from device_controller.abstract_component.base import * 24 #from device_controller.abstract_component.base import *
25 -from device_controller.abstract_component.device_controller import DeviceController 25 +from device_controller.abstract_component.device_controller import printd, DeviceController
26 26
27 27
28 # Default timeouts 28 # Default timeouts
@@ -62,7 +62,7 @@ class DC_FilterSelector(DeviceController): @@ -62,7 +62,7 @@ class DC_FilterSelector(DeviceController):
62 :param device_port: server port 62 :param device_port: server port
63 :param PROTOCOL: "UDP" or "TCP" 63 :param PROTOCOL: "UDP" or "TCP"
64 ''' 64 '''
65 - print("IN DC_FilterSelector") 65 + printd("IN DC_FilterSelector")
66 #self._my_gen2nat_cmds = { **self.GEN2NAT_CMDS, **gen2nat_cmds } 66 #self._my_gen2nat_cmds = { **self.GEN2NAT_CMDS, **gen2nat_cmds }
67 my_gen2nat_cmds = { **self.GEN2NAT_CMDS, **gen2nat_cmds } 67 my_gen2nat_cmds = { **self.GEN2NAT_CMDS, **gen2nat_cmds }
68 #super().__init__(device_host, device_port, PROTOCOL, buffer_size, DEBUG, device_sim) 68 #super().__init__(device_host, device_port, PROTOCOL, buffer_size, DEBUG, device_sim)
src/device_controller/abstract_component/mount.py
@@ -27,7 +27,7 @@ import src.core.celme as celme @@ -27,7 +27,7 @@ import src.core.celme as celme
27 ##from src_socket.client.socket_client_abstract import * 27 ##from src_socket.client.socket_client_abstract import *
28 #from device_controller.abstract_component.device_controller import * 28 #from device_controller.abstract_component.device_controller import *
29 from device_controller.abstract_component.device_controller import ( 29 from device_controller.abstract_component.device_controller import (
30 - DeviceController, generic_cmd, GenericResult, 30 + printd, DeviceController, generic_cmd, GenericResult,
31 UnexpectedCommandReturnCode, UnknownGenericCmdArgException, TimeoutException 31 UnexpectedCommandReturnCode, UnknownGenericCmdArgException, TimeoutException
32 ) 32 )
33 33
@@ -61,6 +61,7 @@ class c(Enum): @@ -61,6 +61,7 @@ class c(Enum):
61 61
62 62
63 63
  64 +
64 class Position(): 65 class Position():
65 x = 0 66 x = 0
66 y = 0 67 y = 0
@@ -131,16 +132,16 @@ class DC_Mount(DeviceController): @@ -131,16 +132,16 @@ class DC_Mount(DeviceController):
131 :param device_port: server port 132 :param device_port: server port
132 :param CHANNEL: "UDP" or "TCP" 133 :param CHANNEL: "UDP" or "TCP"
133 ''' 134 '''
134 - print("IN DC_Mount") 135 + printd("IN DC_Mount")
135 136
136 # _my_gen2nat_cmds = GEN2NAT_CMDS + gen2nat_cmds 137 # _my_gen2nat_cmds = GEN2NAT_CMDS + gen2nat_cmds
137 #self._my_gen2nat_cmds = self.GEN2NAT_CMDS 138 #self._my_gen2nat_cmds = self.GEN2NAT_CMDS
138 #self._my_gen2nat_cmds.update(gen2nat_cmds) 139 #self._my_gen2nat_cmds.update(gen2nat_cmds)
139 - #print("(mount 1) my cmds (before):", self.GEN2NAT_CMDS)  
140 - #print("(mount 2) given cmds (before):", gen2nat_cmds) 140 + #printd("(mount 1) my cmds (before):", self.GEN2NAT_CMDS)
  141 + #printd("(mount 2) given cmds (before):", gen2nat_cmds)
141 ##self._my_gen2nat_cmds = { **self.GEN2NAT_CMDS, **gen2nat_cmds } 142 ##self._my_gen2nat_cmds = { **self.GEN2NAT_CMDS, **gen2nat_cmds }
142 my_gen2nat_cmds = { **self.GEN2NAT_CMDS, **gen2nat_cmds } 143 my_gen2nat_cmds = { **self.GEN2NAT_CMDS, **gen2nat_cmds }
143 - #print("(mount 3) my cmds (after):", self._my_gen2nat_cmds) 144 + #printd("(mount 3) my cmds (after):", self._my_gen2nat_cmds)
144 145
145 ##super().__init__(device_host, device_port, channel, buffer_size, DEBUG, device_sim) 146 ##super().__init__(device_host, device_port, channel, buffer_size, DEBUG, device_sim)
146 super().__init__(device_host, device_port, channel, buffer_size, protoc=protoc, gen2nat_cmds=my_gen2nat_cmds, device_sim=device_sim, DEBUG=DEBUG) 147 super().__init__(device_host, device_port, channel, buffer_size, protoc=protoc, gen2nat_cmds=my_gen2nat_cmds, device_sim=device_sim, DEBUG=DEBUG)
@@ -291,9 +292,9 @@ class DC_Mount(DeviceController): @@ -291,9 +292,9 @@ class DC_Mount(DeviceController):
291 # MACRO generic command 292 # MACRO generic command
292 def do_init(self): 293 def do_init(self):
293 294
294 - print("...STARTING TELESCOPE INITIALIZATION...") 295 + printd("...STARTING TELESCOPE INITIALIZATION...")
295 time.sleep(1) 296 time.sleep(1)
296 - print("...TELESCOPE INITIALIZATION ENDED") 297 + printd("...TELESCOPE INITIALIZATION ENDED")
297 return GenericResult("OK") 298 return GenericResult("OK")
298 299
299 ''' 300 '''
@@ -341,13 +342,13 @@ class DC_Mount(DeviceController): @@ -341,13 +342,13 @@ class DC_Mount(DeviceController):
341 => :SG{+-}hh# 342 => :SG{+-}hh#
342 ''' 343 '''
343 res = self.get_timezone() 344 res = self.get_timezone()
344 - print("Current timezone is", res) 345 + printd("Current timezone is", res)
345 res = self.set_timezone('+00') 346 res = self.set_timezone('+00')
346 #if res != '1': raise UnexpectedCommandReturnCode(res) 347 #if res != '1': raise UnexpectedCommandReturnCode(res)
347 if not res.ok: raise UnexpectedCommandReturnCode(res) 348 if not res.ok: raise UnexpectedCommandReturnCode(res)
348 res = self.get_timezone() 349 res = self.get_timezone()
349 if res.txt != '+00': raise UnexpectedCommandReturnCode(res) 350 if res.txt != '+00': raise UnexpectedCommandReturnCode(res)
350 - print("NEW timezone set is", res) 351 + printd("NEW timezone set is", res)
351 352
352 353
353 ''' 354 '''
@@ -362,12 +363,12 @@ class DC_Mount(DeviceController): @@ -362,12 +363,12 @@ class DC_Mount(DeviceController):
362 1Updating planetary data#<24 blanks># 363 1Updating planetary data#<24 blanks>#
363 ''' 364 '''
364 res = self.get_date() 365 res = self.get_date()
365 - print("Current date is", res) 366 + printd("Current date is", res)
366 # format is 2018-09-26T17:50:21 367 # format is 2018-09-26T17:50:21
367 d = self.get_utc_date() 368 d = self.get_utc_date()
368 # format to mm/dd/yy 369 # format to mm/dd/yy
369 now_utc_mm_dd_yy = d[5:7] + '/' + d[8:10] + '/' + d[2:4] 370 now_utc_mm_dd_yy = d[5:7] + '/' + d[8:10] + '/' + d[2:4]
370 - #print("date is", now_utc_mm_dd_yy) 371 + #printd("date is", now_utc_mm_dd_yy)
371 res = self.set_date(now_utc_mm_dd_yy) 372 res = self.set_date(now_utc_mm_dd_yy)
372 #res = self.set_DATE(self.get_utc_date()) 373 #res = self.set_DATE(self.get_utc_date())
373 #if res[0] != '1': raise UnexpectedCommandReturnCode(res) 374 #if res[0] != '1': raise UnexpectedCommandReturnCode(res)
@@ -375,7 +376,7 @@ class DC_Mount(DeviceController): @@ -375,7 +376,7 @@ class DC_Mount(DeviceController):
375 if not res.ok: raise UnexpectedCommandReturnCode(res) 376 if not res.ok: raise UnexpectedCommandReturnCode(res)
376 res = self.get_date() 377 res = self.get_date()
377 if res.txt != now_utc_mm_dd_yy: raise UnexpectedCommandReturnCode(res) 378 if res.txt != now_utc_mm_dd_yy: raise UnexpectedCommandReturnCode(res)
378 - print("NEW DATE set is", res) 379 + printd("NEW DATE set is", res)
379 380
380 ''' 381 '''
381 c) set TIME 382 c) set TIME
@@ -384,15 +385,15 @@ class DC_Mount(DeviceController): @@ -384,15 +385,15 @@ class DC_Mount(DeviceController):
384 :SL<hh>:<mm>:<ss># 385 :SL<hh>:<mm>:<ss>#
385 ''' 386 '''
386 res = self.get_time() 387 res = self.get_time()
387 - print("Current time is", res) 388 + printd("Current time is", res)
388 _,now_utc_hh_mm_ss = d.split('T') 389 _,now_utc_hh_mm_ss = d.split('T')
389 - #print("time is", now_utc_hh_mm_ss[:5]) 390 + #printd("time is", now_utc_hh_mm_ss[:5])
390 res = self.set_time(now_utc_hh_mm_ss) 391 res = self.set_time(now_utc_hh_mm_ss)
391 #if res != '1': raise UnexpectedCommandReturnCode(res) 392 #if res != '1': raise UnexpectedCommandReturnCode(res)
392 if not res.ok: raise UnexpectedCommandReturnCode(res) 393 if not res.ok: raise UnexpectedCommandReturnCode(res)
393 res = self.get_time() 394 res = self.get_time()
394 if res.txt[:5] != now_utc_hh_mm_ss[:5]: raise UnexpectedCommandReturnCode(res) 395 if res.txt[:5] != now_utc_hh_mm_ss[:5]: raise UnexpectedCommandReturnCode(res)
395 - print("NEW TIME set is", res) 396 + printd("NEW TIME set is", res)
396 397
397 398
398 ''' 399 '''
@@ -413,7 +414,7 @@ class DC_Mount(DeviceController): @@ -413,7 +414,7 @@ class DC_Mount(DeviceController):
413 ''' 414 '''
414 # TELE format is -002ยฐ02 (I convert it to -002:02) 415 # TELE format is -002ยฐ02 (I convert it to -002:02)
415 res = self.get_long() 416 res = self.get_long()
416 - print("Current longitude is", res) 417 + printd("Current longitude is", res)
417 418
418 # CELME format is -002:02:15 419 # CELME format is -002:02:15
419 res = self.get_celme_longitude("-2.0375") 420 res = self.get_celme_longitude("-2.0375")
@@ -421,7 +422,7 @@ class DC_Mount(DeviceController): @@ -421,7 +422,7 @@ class DC_Mount(DeviceController):
421 #res_ddd_mm = res[:-3].replace(':','*') 422 #res_ddd_mm = res[:-3].replace(':','*')
422 #res_ddd_mm = '-002:03' 423 #res_ddd_mm = '-002:03'
423 424
424 - #print("celme longitude is", res) 425 + #printd("celme longitude is", res)
425 ddd,mm,ss = res.split(':') 426 ddd,mm,ss = res.split(':')
426 #dddmm = '-002*03' 427 #dddmm = '-002*03'
427 res = self.set_long(ddd+'*'+mm) 428 res = self.set_long(ddd+'*'+mm)
@@ -429,7 +430,7 @@ class DC_Mount(DeviceController): @@ -429,7 +430,7 @@ class DC_Mount(DeviceController):
429 if not res.ok: raise UnexpectedCommandReturnCode(res) 430 if not res.ok: raise UnexpectedCommandReturnCode(res)
430 res = self.get_long() 431 res = self.get_long()
431 if res.txt != res_ddd_mm: raise UnexpectedCommandReturnCode(res_ddd_mm, res.txt) 432 if res.txt != res_ddd_mm: raise UnexpectedCommandReturnCode(res_ddd_mm, res.txt)
432 - print("NEW longitude set is", res) 433 + printd("NEW longitude set is", res)
433 434
434 ''' 435 '''
435 b) set Latitude 436 b) set Latitude
@@ -439,16 +440,16 @@ class DC_Mount(DeviceController): @@ -439,16 +440,16 @@ class DC_Mount(DeviceController):
439 ''' 440 '''
440 # TELE format is +43ยฐ38 (I convert it to +43:38) 441 # TELE format is +43ยฐ38 (I convert it to +43:38)
441 res = self.get_lat() 442 res = self.get_lat()
442 - print("Current latitude is", res) 443 + printd("Current latitude is", res)
443 444
444 # CELME format is +43:38:15 445 # CELME format is +43:38:15
445 res = self.get_celme_latitude("+43.6443") 446 res = self.get_celme_latitude("+43.6443")
446 res_dd_mm = res[:-3] 447 res_dd_mm = res[:-3]
447 #res_dd_mm = res[:-3].replace(':','*') 448 #res_dd_mm = res[:-3].replace(':','*')
448 - print("res is", res) 449 + printd("res is", res)
449 #res_dd_mm = '+43:50' 450 #res_dd_mm = '+43:50'
450 451
451 - #print("celme longitude is", res) 452 + #printd("celme longitude is", res)
452 dd,mm,ss = res.split(':') 453 dd,mm,ss = res.split(':')
453 ddmm = dd+'*'+mm 454 ddmm = dd+'*'+mm
454 #ddmm = '+43*50' 455 #ddmm = '+43*50'
@@ -457,7 +458,7 @@ class DC_Mount(DeviceController): @@ -457,7 +458,7 @@ class DC_Mount(DeviceController):
457 if not res.ok: raise UnexpectedCommandReturnCode(res) 458 if not res.ok: raise UnexpectedCommandReturnCode(res)
458 res = self.get_lat() 459 res = self.get_lat()
459 if res.txt != res_dd_mm: raise UnexpectedCommandReturnCode(res_dd_mm,res.txt) 460 if res.txt != res_dd_mm: raise UnexpectedCommandReturnCode(res_dd_mm,res.txt)
460 - print("NEW latitude set is", res) 461 + printd("NEW latitude set is", res)
461 462
462 463
463 ''' 464 '''
@@ -487,17 +488,17 @@ class DC_Mount(DeviceController): @@ -487,17 +488,17 @@ class DC_Mount(DeviceController):
487 def do_goto(self, ra, dec, speed_rate=None): 488 def do_goto(self, ra, dec, speed_rate=None):
488 489
489 # TODO: remove 490 # TODO: remove
490 - print("...Starting GOTO...") 491 + printd("...Starting GOTO...")
491 time.sleep(3) 492 time.sleep(3)
492 radec = self.get_radec() 493 radec = self.get_radec()
493 - print("...GOTO ended OK") 494 + printd("...GOTO ended OK")
494 return GenericResult("OK") 495 return GenericResult("OK")
495 496
496 # 1) set speed 497 # 1) set speed
497 if speed_rate : self.set_speed(speed_rate) 498 if speed_rate : self.set_speed(speed_rate)
498 499
499 radec = self.get_radec() 500 radec = self.get_radec()
500 - print("Current position is", radec) 501 + printd("Current position is", radec)
501 502
502 # 2) set RA-DEC 503 # 2) set RA-DEC
503 ''' 504 '''
@@ -526,12 +527,12 @@ class DC_Mount(DeviceController): @@ -526,12 +527,12 @@ class DC_Mount(DeviceController):
526 while vel != 'T': 527 while vel != 'T':
527 v = self.get_vel() 528 v = self.get_vel()
528 vel = v.txt 529 vel = v.txt
529 - print("Velocity is", v) 530 + printd("Velocity is", v)
530 time.sleep(2) 531 time.sleep(2)
531 532
532 time.sleep(2) 533 time.sleep(2)
533 radec= self.get_radec() 534 radec= self.get_radec()
534 - print("Current position is", radec) 535 + printd("Current position is", radec)
535 536
536 return GenericResult("OK") 537 return GenericResult("OK")
537 538
@@ -582,14 +583,14 @@ if __name__ == &quot;__main__&quot;: @@ -582,14 +583,14 @@ if __name__ == &quot;__main__&quot;:
582 #data_to_send = bytes(data + "\n", "utf-8") 583 #data_to_send = bytes(data + "\n", "utf-8")
583 tsock.send_data(data) 584 tsock.send_data(data)
584 #mysock.sendto("%s" % data, (HOST, PORT)) 585 #mysock.sendto("%s" % data, (HOST, PORT))
585 - #print("Sent: {}".format(data)) 586 + #printd("Sent: {}".format(data))
586 587
587 # 2) RECEIVE REPLY data from server 588 # 2) RECEIVE REPLY data from server
588 data_received = tsock.receive_data() 589 data_received = tsock.receive_data()
589 #reponse, adr = mysock.recvfrom(buf) 590 #reponse, adr = mysock.recvfrom(buf)
590 - #print("Received: {}".format(data_received))  
591 - #print("Useful data received: {}".format(data_useful))  
592 - print('\n') 591 + #printd("Received: {}".format(data_received))
  592 + #printd("Useful data received: {}".format(data_useful))
  593 + printd('\n')
593 594
594 #tsock.close() 595 #tsock.close()
595 ''' 596 '''
596 \ No newline at end of file 597 \ No newline at end of file
src/device_controller/channels/client_channel.py
@@ -7,6 +7,7 @@ To be used as a base class (interface) for any concrete socket client class @@ -7,6 +7,7 @@ To be used as a base class (interface) for any concrete socket client class
7 7
8 8
9 # Standard library imports 9 # Standard library imports
  10 +import os
10 11
11 # Third party imports 12 # Third party imports
12 # None 13 # None
@@ -15,6 +16,10 @@ To be used as a base class (interface) for any concrete socket client class @@ -15,6 +16,10 @@ To be used as a base class (interface) for any concrete socket client class
15 from device_controller.logs import * 16 from device_controller.logs import *
16 17
17 18
  19 +def printd(*args, **kwargs):
  20 + if os.environ.get('PYROS_DEBUG', '0')=='1': print(*args, **kwargs)
  21 +
  22 +
18 23
19 ##class SocketClientAbstract(): 24 ##class SocketClientAbstract():
20 class ClientChannel(): 25 class ClientChannel():
@@ -38,8 +43,9 @@ class ClientChannel(): @@ -38,8 +43,9 @@ class ClientChannel():
38 # Logger configuration 43 # Logger configuration
39 #self.set_logger() 44 #self.set_logger()
40 ##set_logger(DEBUG) 45 ##set_logger(DEBUG)
41 - log_d("\n**************************")  
42 - log_d("Client CHANNEL instanciated") 46 + printd("\n**************************")
  47 + ##log_d("Client CHANNEL instanciated")
  48 + printd("Client CHANNEL instanciated")
43 49
44 50
45 51
@@ -48,7 +54,7 @@ class ClientChannel(): @@ -48,7 +54,7 @@ class ClientChannel():
48 return self 54 return self
49 def __exit__(self, type, value, traceback): 55 def __exit__(self, type, value, traceback):
50 self.close() 56 self.close()
51 - #log_d("Client channel killed") 57 + #printd("Client channel killed")
52 print("Client channel killed") 58 print("Client channel killed")
53 59
54 60
@@ -79,8 +85,8 @@ class ClientChannel(): @@ -79,8 +85,8 @@ class ClientChannel():
79 def receive_data(self)->str: 85 def receive_data(self)->str:
80 data_received = self._receive_data() 86 data_received = self._receive_data()
81 ##data_received_bytes = self.mysock.recv(self.buf) 87 ##data_received_bytes = self.mysock.recv(self.buf)
82 - #log_d("Received (all data): {}".format(data_received))  
83 - #log_d("data in bytes: "+str(bytes(data_received, "utf-8"))) 88 + #printd("Received (all data): {}".format(data_received))
  89 + #printd("data in bytes: "+str(bytes(data_received, "utf-8")))
84 ##data_received_uncaped = self.uncap_received_data(data_received) 90 ##data_received_uncaped = self.uncap_received_data(data_received)
85 #log_i("RECEIVED (useful data): {}".format(data_received)) 91 #log_i("RECEIVED (useful data): {}".format(data_received))
86 return data_received 92 return data_received
@@ -89,7 +95,7 @@ class ClientChannel(): @@ -89,7 +95,7 @@ class ClientChannel():
89 pass 95 pass
90 ''' 96 '''
91 data_received = self.mysock.recv(self.buf) 97 data_received = self.mysock.recv(self.buf)
92 - #log_d("data type is "+str(type(data_received))) 98 + #printd("data type is "+str(type(data_received)))
93 log_i(f"RECEIVED (ALL BYTES): {data_received}") 99 log_i(f"RECEIVED (ALL BYTES): {data_received}")
94 #return str(data_received, "utf-8") 100 #return str(data_received, "utf-8")
95 return data_received 101 return data_received
src/device_controller/channels/client_channel_socket.py
@@ -86,7 +86,7 @@ class ClientChannelSocket(ClientChannel): @@ -86,7 +86,7 @@ class ClientChannelSocket(ClientChannel):
86 #@override 86 #@override
87 def _connect_to_server(self): 87 def _connect_to_server(self):
88 if self.PROTOCOL=="SOCKET-TCP": self.mysock.connect((self.HOST, self.PORT)) 88 if self.PROTOCOL=="SOCKET-TCP": self.mysock.connect((self.HOST, self.PORT))
89 - print(f"Ready to send commands to HOST {self.HOST} on PORT {self.PORT} \n") 89 + printd(f"Ready to send commands to HOST {self.HOST} on PORT {self.PORT} \n")
90 90
91 91
92 # Close socket 92 # Close socket
@@ -108,8 +108,11 @@ class ClientChannelSocket(ClientChannel): @@ -108,8 +108,11 @@ class ClientChannelSocket(ClientChannel):
108 else: 108 else:
109 # SOCKET-UDP 109 # SOCKET-UDP
110 nb_bytes_sent = self.mysock.sendto(data_to_send_bytes, (self.HOST, self.PORT)) 110 nb_bytes_sent = self.mysock.sendto(data_to_send_bytes, (self.HOST, self.PORT))
111 - log_i(f'(channel sock) Sent: {data_to_send_bytes}')  
112 - log_i(f"(channel sock) Sent {nb_bytes_sent} bytes") 111 + ##log_i(f'(channel sock) Sent: {data_to_send_bytes}')
  112 + ##log_i(f"(channel sock) Sent {nb_bytes_sent} bytes")
  113 + ##log_i(f"(channel sock) Sent {nb_bytes_sent} bytes ; mesg sent is: ", data_to_send_bytes)
  114 + ##log_i("(channel sock) Sent ",nb_bytes_sent, "bytes ; mesg sent is: ", data_to_send_bytes)
  115 + printd("(channel sock) Sent ",nb_bytes_sent, "bytes ; mesg sent is: ", data_to_send_bytes)
113 116
114 #@override 117 #@override
115 def _receive_data(self)->str: 118 def _receive_data(self)->str:
@@ -119,8 +122,9 @@ class ClientChannelSocket(ClientChannel): @@ -119,8 +122,9 @@ class ClientChannelSocket(ClientChannel):
119 # so, replace it by ':' (b'\x3A') 122 # so, replace it by ':' (b'\x3A')
120 if b'\xdf' in data_received_bytes: 123 if b'\xdf' in data_received_bytes:
121 data_received_bytes = data_received_bytes.replace(b'\xdf', b'\x3A') 124 data_received_bytes = data_received_bytes.replace(b'\xdf', b'\x3A')
122 - print(f"(channel sock) RECEIVED (ALL BYTES...): {data_received_bytes}")  
123 - log_i(f"(channel sock) ({self}) RECEIVED (ALL BYTES...): {data_received_bytes}") 125 + printd(f"(channel sock) RECEIVED (ALL BYTES...): {data_received_bytes}")
  126 + ##log_i(f"(channel sock) ({self}) RECEIVED (ALL BYTES...): {data_received_bytes}")
  127 + printd(f"(channel sock) ({self}) RECEIVED (ALL BYTES...): {data_received_bytes}")
124 128
125 data_received = data_received_bytes.decode() 129 data_received = data_received_bytes.decode()
126 #log_d("data type is "+str(type(data_received))) 130 #log_d("data type is "+str(type(data_received)))
src/device_controller/channels/server_udp_or_tcp.py
@@ -17,6 +17,8 @@ import sys @@ -17,6 +17,8 @@ import sys
17 17
18 # Local application imports 18 # Local application imports
19 # None 19 # None
  20 +from .client_channel import printd
  21 +
20 ''' 22 '''
21 sys.path.append('..') 23 sys.path.append('..')
22 from device_controller.abstract_component.device_simulator import getc, getp 24 from device_controller.abstract_component.device_simulator import getc, getp
@@ -25,7 +27,7 @@ from device_controller.abstract_component.device_simulator import getc, getp @@ -25,7 +27,7 @@ from device_controller.abstract_component.device_simulator import getc, getp
25 # Very BASIC implementation 27 # Very BASIC implementation
26 def make_answer_for_request_CMD_TO_UPPER(request_bytes): 28 def make_answer_for_request_CMD_TO_UPPER(request_bytes):
27 #raise NotImplementedError 29 #raise NotImplementedError
28 - print("(SIM serv) Request received is", request_bytes) 30 + printd("(SIM serv) Request received is", request_bytes)
29 31
30 # Convert to string 32 # Convert to string
31 request = request_bytes.decode("utf-8") 33 request = request_bytes.decode("utf-8")
@@ -38,7 +40,7 @@ def make_answer_for_request_CMD_TO_UPPER(request_bytes): @@ -38,7 +40,7 @@ def make_answer_for_request_CMD_TO_UPPER(request_bytes):
38 #stamp = request[0:STAMP_LENGTH] 40 #stamp = request[0:STAMP_LENGTH]
39 #command = request[STAMP_LENGTH:] 41 #command = request[STAMP_LENGTH:]
40 command = request 42 command = request
41 - print("(SIM serv) Command received is", repr(command)) 43 + printd("(SIM serv) Command received is", repr(command))
42 44
43 answer = 'ANSWER TO '+command.upper() 45 answer = 'ANSWER TO '+command.upper()
44 #if command == ':GR#': answer = "15:01:49" 46 #if command == ':GR#': answer = "15:01:49"
@@ -48,8 +50,8 @@ def make_answer_for_request_CMD_TO_UPPER(request_bytes): @@ -48,8 +50,8 @@ def make_answer_for_request_CMD_TO_UPPER(request_bytes):
48 50
49 #full_answer_in_bytes = bytes(stamp + answer + '#' + TERMINATOR, "utf-8") 51 #full_answer_in_bytes = bytes(stamp + answer + '#' + TERMINATOR, "utf-8")
50 full_answer_in_bytes = bytes(answer, "utf-8") 52 full_answer_in_bytes = bytes(answer, "utf-8")
51 - #print("request str upper is", str(request).upper())  
52 - print("(SIM serv) Answer sent is", full_answer_in_bytes) 53 + #printd("request str upper is", str(request).upper())
  54 + printd("(SIM serv) Answer sent is", full_answer_in_bytes)
53 return full_answer_in_bytes 55 return full_answer_in_bytes
54 56
55 57
@@ -84,8 +86,8 @@ def get_SocketServer_UDP_TCP(myhost:str=&quot;localhost&quot;, myport:int=11110, PROTOCOL: @@ -84,8 +86,8 @@ def get_SocketServer_UDP_TCP(myhost:str=&quot;localhost&quot;, myport:int=11110, PROTOCOL:
84 # For UDP, self.request consists of a pair of data and client socket 86 # For UDP, self.request consists of a pair of data and client socket
85 data_rcv = self.request[0].strip() 87 data_rcv = self.request[0].strip()
86 socket_client = self.request[1] 88 socket_client = self.request[1]
87 - print("(SIM serv) {} wrote:".format(self.client_address[0]))  
88 - print("(SIM serv)", data_rcv) 89 + printd("(SIM serv) {} wrote:".format(self.client_address[0]))
  90 + printd("(SIM serv)", data_rcv)
89 91
90 # Send back the same data, but upper-cased 92 # Send back the same data, but upper-cased
91 # - TCP 93 # - TCP
@@ -125,9 +127,9 @@ def get_SocketServer_UDP_TCP(myhost:str=&quot;localhost&quot;, myport:int=11110, PROTOCOL: @@ -125,9 +127,9 @@ def get_SocketServer_UDP_TCP(myhost:str=&quot;localhost&quot;, myport:int=11110, PROTOCOL:
125 #data_received = self.request.recv(1024) 127 #data_received = self.request.recv(1024)
126 data_received = self.rfile.readline().strip() # data is "bytes" type 128 data_received = self.rfile.readline().strip() # data is "bytes" type
127 data_useful = self.get_useful_data(data_received) 129 data_useful = self.get_useful_data(data_received)
128 - #print("data type is", type(data))  
129 - #print("\nFrom {}, received: {}".format(self.client_address[0], data_useful))  
130 - print(f"\n(SIM server_udp_or_tcp) From {self.client_address[0]}, received: {data_useful}\n") 130 + #printd("data type is", type(data))
  131 + #printd("\nFrom {}, received: {}".format(self.client_address[0], data_useful))
  132 + printd(f"\n(SIM server_udp_or_tcp) From {self.client_address[0]}, received: {data_useful}\n")
131 133
132 # 2) SEND REPLY to client 134 # 2) SEND REPLY to client
133 # Likewise, self.wfile is a file-like object used to write back to the client 135 # Likewise, self.wfile is a file-like object used to write back to the client
src/device_controller/concrete_component/gemini/proof_of_concept_for_logging/proof_of_concept_for_logging.py 0 โ†’ 100644
@@ -0,0 +1,83 @@ @@ -0,0 +1,83 @@
  1 +
  2 +import logging
  3 +from logging.handlers import SMTPHandler
  4 +
  5 +# https://docs.python.org/3/library/logging.html#logging.getLogger
  6 +#logger = logging.getLogger(__name__)
  7 +logger = logging.getLogger('pyros_logger')
  8 +# If not set, default level is NOTSET (all messages are logged)
  9 +# The defined levels, in order of increasing severity : DEBUG, INFO, WARNING, ERROR, CRITICAL
  10 +#logger.setLevel(logging.DEBUG)
  11 +
  12 +# Create handlers
  13 +
  14 +# Console should print ALL messages (starting from lower level DEBUG)
  15 +c_handler = logging.StreamHandler()
  16 +c_handler.setLevel(logging.DEBUG)
  17 +c_format = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
  18 +c_handler.setFormatter(c_format)
  19 +
  20 +# Log File should contain ONLY messages starting from level WARNING (ERROR ?)
  21 +f_handler = logging.FileHandler('file.log')
  22 +f_handler.setLevel(logging.WARNING)
  23 +# Create formatter and add it to handler
  24 +#f_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
  25 +f_format = logging.Formatter('%(asctime)s - %(levelname)s - %(filename)s : %(lineno)s - %(message)s')
  26 +f_handler.setFormatter(f_format)
  27 +
  28 +# DB should contain ONLY messages starting from level ERROR
  29 +# TODO:
  30 +
  31 +# Email should be sent ONLY for messages starting from level CRITICAL
  32 +# http://sametmax.com/envoi-dun-email-par-logging-en-cas-de-plantage-dun-script-python-ou-comment-faire-bouffer-uxe9-a-smtphandler/
  33 +# TODO: a ameliorer avec article ci-dessus pour UNICODE
  34 +m_handler = SMTPHandler(
  35 + # Host et port
  36 + ('SMTP.GMAIL.COM', 587),
  37 + # From
  38 + "MOI@GMAIL.COM",
  39 + # To (liste)
  40 + ["QUELQU.UN@QUELQUE.PART"],
  41 + # Sujet du message
  42 + "Erreur critique dans module MMM",
  43 + # pour l'authentification
  44 + credentials = ("MONEMAIL@GMAIL.COM", "MONSUPERPASSWORD"),
  45 + secure = ()
  46 +)
  47 +m_handler.setLevel(logging.WARNING)
  48 +m_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
  49 +m_handler.setFormatter(m_format)
  50 +
  51 +
  52 +
  53 +
  54 +# Add handlers to the logger
  55 +logger.addHandler(c_handler)
  56 +logger.addHandler(f_handler)
  57 +# TODO:
  58 +##logger.addHandler(db_handler)
  59 +##logger.addHandler(m_handler)
  60 +
  61 +def do_logs():
  62 + logger.debug('This is a debug msg')
  63 + logger.info('This is a info msg')
  64 + logger.warning('This is a warning')
  65 + logger.error('This is an error')
  66 + logger.critical('This is a critical msg')
  67 +
  68 +
  69 +# USE it
  70 +
  71 +# logger.debug(), info(), warning(), error(), critical()
  72 +
  73 +print("\nlevel is DEBUG:")
  74 +logger.setLevel(logging.DEBUG)
  75 +do_logs()
  76 +
  77 +print("\nlevel is INFO:")
  78 +logger.setLevel(logging.INFO)
  79 +do_logs()
  80 +
  81 +print("\nlevel is CRITICAL:")
  82 +logger.setLevel(logging.CRITICAL)
  83 +do_logs()
0 \ No newline at end of file 84 \ No newline at end of file
src/device_controller/logs.py
@@ -28,7 +28,7 @@ def log_c(msg:str, *args, **kwargs): logger.critical(msg, *args, **kwargs) @@ -28,7 +28,7 @@ def log_c(msg:str, *args, **kwargs): logger.critical(msg, *args, **kwargs)
28 28
29 29
30 #def set_logger(self): 30 #def set_logger(self):
31 -def set_logger(DEBUG=False): 31 +def set_logger(DEBUG_MODE:bool=False):
32 global logger 32 global logger
33 ''' 33 '''
34 # Logger configuration 34 # Logger configuration
@@ -41,26 +41,29 @@ def set_logger(DEBUG=False): @@ -41,26 +41,29 @@ def set_logger(DEBUG=False):
41 logging.basicConfig(level=logging.DEBUG, filename='client.log', filemode='a', format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') 41 logging.basicConfig(level=logging.DEBUG, filename='client.log', filemode='a', format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
42 logging.debug("Client instanciated") 42 logging.debug("Client instanciated")
43 ''' 43 '''
44 - 44 +
45 # Advanced configuration 45 # Advanced configuration
46 logger = logging.getLogger(__name__) 46 logger = logging.getLogger(__name__)
47 - # Absolument necessaire, sinon rien ne marche !!!  
48 - logger.setLevel(logging.DEBUG)  
49 - 47 + log_level = logging.DEBUG if DEBUG_MODE else logging.WARNING
  48 + logger.setLevel(log_level)
  49 +
50 # Create handlers for writing to console and file 50 # Create handlers for writing to console and file
51 c_handler = logging.StreamHandler() 51 c_handler = logging.StreamHandler()
52 f_handler = logging.FileHandler('client.log') 52 f_handler = logging.FileHandler('client.log')
53 - 53 +
54 # Set level for each handler 54 # Set level for each handler
55 # DEBUG < INFO < WARNING < ERROR < CRITICAL 55 # DEBUG < INFO < WARNING < ERROR < CRITICAL
56 - #if self.DEBUG:  
57 - if DEBUG: 56 + c_handler.setLevel(logging.DEBUG)
  57 + f_handler.setLevel(logging.WARNING)
  58 + '''
  59 + if DEBUG_MODE:
58 c_handler.setLevel(logging.DEBUG) 60 c_handler.setLevel(logging.DEBUG)
59 f_handler.setLevel(logging.DEBUG) 61 f_handler.setLevel(logging.DEBUG)
60 else: 62 else:
61 c_handler.setLevel(logging.INFO) 63 c_handler.setLevel(logging.INFO)
62 f_handler.setLevel(logging.INFO) 64 f_handler.setLevel(logging.INFO)
63 - 65 + '''
  66 +
64 # Set format for each handler 67 # Set format for each handler
65 #c_format = logging.Formatter('%(name)s - %(levelname)s - %(message)s') 68 #c_format = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
66 c_format = logging.Formatter('(%(name)s): %(message)s') 69 c_format = logging.Formatter('(%(name)s): %(message)s')