Exemplo n.º 1
0
class Daemon(Thread):
    def __init__(self, ip_address, orders_file_path):
        super(Daemon, self).__init__()

        self.__commands = Commands(orders_file_path)

        self.__master = Master(0, "00:00:00:00:00:00", ip_address, "0", 0)

        self.__master.add_stack(Stack(0,0))

        self.__udp_comm = CommunicatorUDP(42666, self.__master.get_ip_address())

        self.__udp_comm.open_communication()
        print("Master listening on {}:{}".format(ip_address, 42666))
        
        self.__i2c_comm = CommunicatorI2C()


    def run(self):
        nb_stack = 0
        nb_slave = 0
        value = 1
        
        while True:

            print("Broadcasting cpu request")
            self.__udp_comm.broadcast(self.__commands.get_index("cpu")+";", self.__master.get_cluster_ip_addresses())
            
            data, addr = self.__udp_comm.receive(1024)    
            print("received message: {} from {}".format(data, addr))
                            
            print(data[:-1])
            if data[:-1] == b"configure;":#To-Do: check why data is bstr
                if(nb_slave <= 5):
                    stack = self.__master.get_stack(nb_stack)
                    #To-do : check for ip_address conflict, implement some kind of simple DHCP. May look for DHCP Py libs
                    new_slave = Slave(nb_stack + RASP_CLASS_ADDRESSES[int(data[10:])-1], nb_stack, "AA:AA:AA:AA:AA:AA", addr[0], int(data.decode().split(";")[1]))
                    self.__master.get_stack(nb_stack).add_pi_device(new_slave)
                    value = value + 1
                    self.__udp_comm.send(self.__commands.get_index("configure") + ";" + addr[0] + ";", new_slave.get_ip_address())
                    print("Configured new slave of ip_addr {}".format(addr[0]))
                    nb_slave = nb_slave + 1
                else:
                    nb_stack = nb_stack + 1
                    new_stack = Stack(nb_stack, nb_stack)
                    self.__master.add_stack(new_stack)
                    nb_slave = 0


            elif data[:4] == b"cpu;":
                cpu_value = data.decode().split(";")[1]
                self.__master.get_slave_by_ip(addr[0]).set_cpu_usage(cpu_value)
                value = value + 1
                print("Received cpu_usage ({}) from slave {}, updating value".format(addr[0], cpu_value))
                


    def get_master(self):
        return self.__master

    def get_udp_comm(self):
        return self.__udp_comm

    def get_i2c_comm(self):
        return self.__i2c_comm

    def get_commands(self):
        return self.__commands

    def enable_alimentation_stack(self, stack):
        """ TODO for all the stack
        Only for one stack
        """
        self.__master.enable_alim()

    def disable_alimentation_stack(self, stack):
        """ TODO for all the stack
        Only for one stack
        """
        self.__master.disable_alim()