diff --git a/python/conf.d/reset,json b/python/conf.d/reset,json new file mode 100644 index 00000000..4343247c --- /dev/null +++ b/python/conf.d/reset,json @@ -0,0 +1,21 @@ +{ + "pal": [ + "trajman", + "actuators", + "robot", + "ai" + ], + "pmi": [ + "trajman", + "actuators", + "robot", + "ai" + ], + "beacon": [ + "config", + "match" + ], + "basket": [ + "basket" + ] +} \ No newline at end of file diff --git a/python/evolutek/lib/settings.py b/python/evolutek/lib/settings.py index 3071d555..320906d7 100755 --- a/python/evolutek/lib/settings.py +++ b/python/evolutek/lib/settings.py @@ -15,7 +15,7 @@ hostname = socket.gethostname() # Check if the machine is not on a Rpi (Robot, Beacon) -if hostname not in ['pal', 'pmi', 'beacon']: +if hostname not in ['pal', 'pmi', 'beacon', 'basket']: # Set the simulation flag make_setting('SIMULATION', True, 'evolutek', 'simulation', 'SIMULATION') diff --git a/python/evolutek/services/reset.py b/python/evolutek/services/reset.py new file mode 100644 index 00000000..35cc63e7 --- /dev/null +++ b/python/evolutek/services/reset.py @@ -0,0 +1,67 @@ +import json +from os import system +from time import sleep + +from cellaserv.service import Service + +from evolutek.lib.gpio.gpio_factory import GpioType, create_gpio +from evolutek.lib.gpio.gpio import Edge +from evolutek.lib.settings import ROBOT + +FILEPATH = "/etc/conf.d/reset.json" + +#TODO : +# - Get status + +class Reset(Service): + + def __init__(self): + + self.services = [] + if not self.parse_config(): + raise Exception('Error during parsing') + + self.reset = create_gpio(21, 'reset', dir=False, edge=Edge.RISING, type=GpioType.RPI) + self.reset.auto_refresh(refresh=0.5, callback=self._reset) + self.reset_soft = create_gpio(26, 'reset_soft', dir=True, default_value=False, type=GpioType.RPI) + + super().__init__(ROBOT) + + def parse_config(self): + data = None + try: + with open(FILEPATH, 'r') as config: + data = config.read() + except Exception as e: + print('[RESET] Failed to read file: %s' % str(e)) + return False + + config = json.loads(data) + try: + self.services = config[ROBOT] + except Exception as e: + print('[RESET] Failed to get services: %s' % str(e)) + return False + + return True + + @Service.event('reset-%s' % ROBOT) + @Service.event('reset-all') + @Service.action() + def reset(self): + print('[RESET] Toggling software reset') + self.reset_soft.write(True) + sleep(1) + self.reset_soft.write(False) + + def _reset(self): + print('[RESET] Resetting all services') + for service in self.services: + system('sudo systemctl restart %s' % service) + +def main(): + reset = Reset() + reset.run() + +if __name__ == '__main__': + main() diff --git a/python/evolutek/utils/service_reset.py b/python/evolutek/utils/service_reset.py deleted file mode 100644 index 5a84e70e..00000000 --- a/python/evolutek/utils/service_reset.py +++ /dev/null @@ -1,37 +0,0 @@ -from os import system -from time import sleep -import RPi.GPIO as GPIO - -RESET_GPIO = 40 - -def restartAll(): - print("let's fucking go for a reset lmao") - system("sudo systemctl restart trajman") - system("sudo systemctl restart actuators") - system("sudo systemctl restart robot") - system("sudo systemctl restart ai") - -def main(): - - GPIO.setmode(GPIO.BOARD) - GPIO.setup(RESET_GPIO, GPIO.IN) - triggered = False - needRestart = False - lastVal = GPIO.LOW - while True: - val = GPIO.input(RESET_GPIO) - if val == GPIO.HIGH and lastVal == GPIO.LOW: - needRestart = True - elif val == GPIO.LOW: - needRestart = False - if needRestart: - restartAll() - needRestart = False - lastVal = val - - sleep(0.5) - - - -if __name__ == '__main__': - main() diff --git a/python/setup.py b/python/setup.py index f0ceb46a..4411961c 100755 --- a/python/setup.py +++ b/python/setup.py @@ -31,8 +31,7 @@ def run(self): 'match = evolutek.services.match:main', 'robot = evolutek.services.robot:main', 'ai = evolutek.services.ai:main', - # Utils - 'reset = evolutek.utils.service_reset:main', + 'reset = evolutek.services.reset:main', ], }, )