Exemplo n.º 1
0
class Controller:
    def __init__(self, view=None):
        """
        :param view:AppFrame
        :return:Controller
        """

        self.view = view
        self.serial = SerialInterface(view=self.view)
        self.data = []
        self.initiatives = []
        self.members = []
        self.http = HttpInterface()
        self.conf = None

    def set_view(self, view):
        self.view = view
        self.serial.set_view(view)

    def get_interfaces(self):
        if not self.serial:
            return []
        else:
            return self.serial.get_available_serial_ports()

    def get_initiatives(self):
        return [i.get_name() for i in self.initiatives]

    def get_members(self):
        return [i.get_name() for i in self.members]

    def set_initiatives(self, inits):
        self.initiatives = inits

    def _view_message(self, s, level=1):
        if not self.view:
            raise RuntimeError("Controller does not have a view linked to it, cannot send it a message.")
        else:
            self.view.display_message(s, level)

    def upload(self, source):
        print "Controller.upload(source='" + source + "')"
        self._view_message("Attempting to gather data from the arduino")

        result = self.serial.connect(source)

        self._view_message("===========================")

        if not result:
            self._view_message("Failed to gather data from Arduino.", 2)
        else:
            self._view_message("Successfully gathered data from Arduino")
            self.data = result

        return result

    def reset(self):
        self.data = []
        self.serial.reset()

    def init(self):
        """
        Initializes the application logic:
        1) Checks that remote host for web server is available
        2) Fetches and stores current initiatives and tags from remote web server
        3) Other?
        :return: True if all checks and setup pass, False otherwise.
        """

        # Load the remote host info from the config file

        self.conf = cp.ConfigParser()
        self.conf.read('config.ini')
        self.http.set_host(str(self.conf.get('remotehost', 'hostname')))
        self.http.set_port(str(self.conf.get('remotehost', 'port')))

        print "http interface is configured to: " + str(self.http)

        # Check that the remote host can be connected to.

        if not self.http.check_remote():
            raise Exception("Could not contact server at: " + str(self.http.host) + " on port: " + str(self.http.port))

        # Fetch initiatives and tags from remote host

        self.initiatives = self.http.fetch_initiatives()
        self.members = self.http.fetch_members()

    def show_data(self):

        self.data = self.serial.get_data()

        if self.data:
            self._view_message("Data is: ")
            for i in self.data:
                self._view_message(str(i))

    def get_data(self):
        if self.data:
            return self.data
        else:
            self.data = self.serial.get_data()
            return self.data

    def get_tags_by_init(self, init_name):

        for i in self.initiatives:
            if i.get_name() == init_name:
                return i.get_tags()

    def find_init_by_name(self, name):

        for i in self.initiatives:
            if i.get_name() == name:
                return i

        return None

    def apply_init_to_data(self, init, data):

        tags = self.get_tags_by_init(init)

        print tags

        for d in self.data:
            d.initiative = self.find_init_by_name(init)
            d.tag = d.initiative.get_tags()[d.action-1]

        return self.data

    def get_member_from_name(self, name):
        for m in self.members:
            if m.name == name:
                return m

        return None

    def send_data(self, username):
        self.apply_init_to_data(self.view.initiatives.GetValue(), self.data)

        member = self.get_member_from_name(self.view.members.GetValue())

        print member

        for d in self.data:
            self.http.send_data(member.get_id(), d.initiative.get_id(), d.tag.get_id(),d.getUTCSeconds(), username)