Commit 1cf4a67f292945bd0d77cba80019fe7f53eda75c
1 parent
51c0662b
Exists in
dev
Affichage console CLEAN en mode normal (NO DEBUG) !
Showing
17 changed files
with
299 additions
and
165 deletions
Show diff stats
pyros.py
@@ -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__ == "__main__": | @@ -582,14 +583,14 @@ if __name__ == "__main__": | ||
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="localhost", myport:int=11110, PROTOCOL: | @@ -84,8 +86,8 @@ def get_SocketServer_UDP_TCP(myhost:str="localhost", 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="localhost", myport:int=11110, PROTOCOL: | @@ -125,9 +127,9 @@ def get_SocketServer_UDP_TCP(myhost:str="localhost", 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') |