Ejemplo n.º 1
0
    def on_timer(self, event):
        state = self.state
        if state.close_event.wait(0.001):
            self.timer.Stop()
            self.Destroy()
            return
        while state.child_pipe_recv.poll():
            try:
                obj = state.child_pipe_recv.recv()
            except EOFError:
                self.timer.Stop()
                self.Destroy()
                return

            if isinstance(obj, Value):
                # request to set a status field
                if not obj.name in self.values:
                    # create a new status field
                    value = wx.StaticText(self.panel, -1, obj.text)
                    # possibly add more status rows
                    for i in range(len(self.status), obj.row + 1):
                        self.status.append(wx.BoxSizer(wx.HORIZONTAL))
                        self.vbox.Insert(len(self.status) - 1,
                                         self.status[i],
                                         0,
                                         flag=wx.ALIGN_LEFT | wx.TOP)
                        self.vbox.Layout()
                    self.status[obj.row].Add(value, border=5)
                    self.status[obj.row].AddSpacer(20)
                    self.values[obj.name] = value
                value = self.values[obj.name]
                value.SetForegroundColour(obj.fg)
                value.SetBackgroundColour(obj.bg)
                value.SetLabel(obj.text)
                self.panel.Layout()
                #self.values_rest[obj.name] = {"text": obj.text, "fg": obj.fg, "bg": obj.bg, "row": obj.row}
            elif isinstance(obj, Text):
                '''request to add text to the console'''
                #self.text_rest.add({"text": obj.text, "fg": obj.fg, "bg": obj.bg})
                self.pending.append(obj)
                for p in self.pending:
                    # we're scrolled at the bottom
                    oldstyle = self.control.GetDefaultStyle()
                    style = wx.TextAttr()
                    style.SetTextColour(p.fg)
                    style.SetBackgroundColour(p.bg)
                    self.control.SetDefaultStyle(style)
                    self.control.AppendText(p.text)
                    self.control.SetDefaultStyle(oldstyle)
                self.pending = []
            elif isinstance(obj, mp_menu.MPMenuTop):
                if obj is not None:
                    self.SetMenuBar(None)
                    self.menu = obj
                    self.SetMenuBar(self.menu.wx_menu())
                    self.Bind(wx.EVT_MENU, self.on_menu)
                self.Refresh()
                self.Update()
            elif isinstance(obj, win_layout.WinLayout):
                win_layout.set_wx_window_layout(self, obj)
Ejemplo n.º 2
0
    def on_timer(self, event):
        '''receive messages from MAVProxy and pass on to GUI'''
        state = self.state

        # update saved pos/size of GUI
        now = time.time()
        if now - self.last_layout_send > 1:
            self.last_layout_send = now
            state.child_pipe.send(
                (win_layout.get_wx_window_layout(self), 0, 0))

        if state.close_event.wait(0.001):
            self.timer.Stop()
            self.Destroy()
            return
        while state.child_pipe.poll():
            obj = state.child_pipe.recv()
            if obj[0] == 'updatelayout':
                self.updateLayout(obj[1])
            elif obj[0] == 'onmavlinkpacket':
                self.onmavlinkpacket(obj[1])
            elif obj[0] == 'updateHB':
                self.updateHB(obj[1])
            elif isinstance(obj[0], win_layout.WinLayout):
                win_layout.set_wx_window_layout(self, obj[0])
            elif obj[0] == 'changesetting' and obj[1][0] == 'takeoffalt':
                self.updatetakeoffalt(int(obj[1][1]))
Ejemplo n.º 3
0
    def on_idle(self, event):
        now = time.time()
        if now - self.last_layout_send > 1:
            self.last_layout_send = now
            self.event_queue.put(win_layout.get_wx_window_layout(self))

        obj = None
        while not self.state.object_queue.empty():
            obj = self.state.object_queue.get()
            if isinstance(obj, win_layout.WinLayout):
                win_layout.set_wx_window_layout(self, obj)
Ejemplo n.º 4
0
    def on_redraw_timer(self, event):
        '''the redraw timer ensures we show new map tiles as they
        are downloaded'''
        state = self.state
        while state.in_queue.qsize():
            try:
                obj = state.in_queue.get()
            except Exception:
                time.sleep(0.05)
                return
            if isinstance(obj, MPImageData):
                with warnings.catch_warnings():
                    warnings.simplefilter('ignore')
                    img = wx.EmptyImage(obj.width, obj.height)
                img.SetData(obj.data)
                self.img = img
                self.need_redraw = True
                if state.auto_size:
                    client_area = state.frame.GetClientSize()
                    total_area = state.frame.GetSize()
                    bx = max(total_area.x - client_area.x, 0)
                    by = max(total_area.y - client_area.y, 0)
                    state.frame.SetSize(
                        wx.Size(obj.width + bx, obj.height + by))
            if isinstance(obj, MPImageTitle):
                state.frame.SetTitle(obj.title)
            if isinstance(obj, MPImageRecenter):
                self.on_recenter(obj.location)
            if isinstance(obj, MPImageMenu):
                self.set_menu(obj.menu)
            if isinstance(obj, MPImagePopupMenu):
                self.set_popup_menu(obj.menu)
            if isinstance(obj, MPImageBrightness):
                state.brightness = obj.brightness
                self.need_redraw = True
            if isinstance(obj, MPImageFullSize):
                self.full_size()
            if isinstance(obj, MPImageFitToWindow):
                self.fit_to_window()
            if isinstance(obj, win_layout.WinLayout):
                win_layout.set_wx_window_layout(state.frame, obj)

        if self.need_redraw:
            self.redraw()
Ejemplo n.º 5
0
 def on_redraw_timer(self, event):
     '''the redraw timer ensures we show new map tiles as they
     are downloaded'''
     state = self.state
     while state.in_queue.qsize():
         try:
             obj = state.in_queue.get()
         except Exception:
             time.sleep(0.05)
             return
         if isinstance(obj, MPImageData):
             with warnings.catch_warnings():
                 warnings.simplefilter('ignore')
                 img = wx.EmptyImage(obj.width, obj.height)
             img.SetData(obj.data)
             self.img = img
             self.need_redraw = True
             if state.auto_size:
                 client_area = state.frame.GetClientSize()
                 total_area = state.frame.GetSize()
                 bx = max(total_area.x - client_area.x,0)
                 by = max(total_area.y - client_area.y,0)
                 state.frame.SetSize(wx.Size(obj.width+bx, obj.height+by))
         if isinstance(obj, MPImageTitle):
             state.frame.SetTitle(obj.title)
         if isinstance(obj, MPImageRecenter):
             self.on_recenter(obj.location)
         if isinstance(obj, MPImageMenu):
             self.set_menu(obj.menu)
         if isinstance(obj, MPImagePopupMenu):
             self.set_popup_menu(obj.menu)
         if isinstance(obj, MPImageBrightness):
             state.brightness = obj.brightness
             self.need_redraw = True
         if isinstance(obj, MPImageFullSize):
             self.full_size()
         if isinstance(obj, MPImageFitToWindow):
             self.fit_to_window()
         if isinstance(obj, win_layout.WinLayout):
             win_layout.set_wx_window_layout(state.frame, obj)
             
     if self.need_redraw:
         self.redraw()
Ejemplo n.º 6
0
    def on_idle(self, event):
        '''prevent the main loop spinning too fast'''
        state = self.state

        if state.close_window.acquire(False):
            self.state.app.ExitMainLoop()

        now = time.time()
        if now - self.last_layout_send > 1:
            self.last_layout_send = now
            state.event_queue.put(win_layout.get_wx_window_layout(self))

        # receive any display objects from the parent
        obj = None

        while not state.object_queue.empty():
            obj = state.object_queue.get()

            if isinstance(obj, win_layout.WinLayout):
                win_layout.set_wx_window_layout(self, obj)

            if isinstance(obj, SlipObject):
                self.add_object(obj)

            if isinstance(obj, SlipPosition):
                # move an object
                object = self.find_object(obj.key, obj.layer)
                if object is not None:
                    object.update_position(obj)
                    if getattr(object, 'follow', False):
                        self.follow(object)
                    if obj.label is not None:
                        object.label = obj.label
                    if obj.colour is not None:
                        object.colour = obj.colour
                    state.need_redraw = True

            if isinstance(obj, SlipDefaultPopup):
                state.default_popup = obj

            if isinstance(obj, SlipInformation):
                # see if its a existing one or a new one
                if obj.key in state.info:
                    #                    print('update %s' % str(obj.key))
                    state.info[obj.key].update(obj)
                else:
                    #                    print('add %s' % str(obj.key))
                    state.info[obj.key] = obj
                state.need_redraw = True

            if isinstance(obj, SlipCenter):
                # move center
                (lat, lon) = obj.latlon
                state.panel.re_center(state.width / 2, state.height / 2, lat,
                                      lon)
                state.need_redraw = True

            if isinstance(obj, SlipZoom):
                # change zoom
                state.panel.set_ground_width(obj.ground_width)
                state.need_redraw = True

            if isinstance(obj, SlipFollow):
                # enable/disable follow
                state.follow = obj.enable

            if isinstance(obj, SlipFollowObject):
                # enable/disable follow on an object
                for layer in state.layers:
                    if obj.key in state.layers[layer]:
                        if hasattr(state.layers[layer][obj.key], 'follow'):
                            state.layers[layer][obj.key].follow = obj.enable

            if isinstance(obj, SlipBrightness):
                # set map brightness
                state.brightness = obj.brightness
                state.need_redraw = True

            if isinstance(obj, SlipClearLayer):
                # remove all objects from a layer
                if obj.layer in state.layers:
                    state.layers.pop(obj.layer)
                state.need_redraw = True

            if isinstance(obj, SlipRemoveObject):
                # remove an object by key
                for layer in state.layers:
                    if obj.key in state.layers[layer]:
                        state.layers[layer].pop(obj.key)
                state.need_redraw = True

            if isinstance(obj, SlipHideObject):
                # hide an object by key
                for layer in state.layers:
                    if obj.key in state.layers[layer]:
                        state.layers[layer][obj.key].set_hidden(obj.hide)
                state.need_redraw = True

        if state.timelim_pipe is not None:
            while state.timelim_pipe[1].poll():
                try:
                    obj = state.timelim_pipe[1].recv()
                except Exception:
                    state.timelim_pipe = None
                    break
                for layer in state.layers:
                    for key in state.layers[layer].keys():
                        state.layers[layer][key].set_time_range(obj)
                state.need_redraw = True

        if obj is None:
            time.sleep(0.05)
Ejemplo n.º 7
0
    def on_timer(self, event):
        state = self.state
        if state.close_event.wait(0.001):
            self.timer.Stop()
            self.Destroy()
            return
        while state.child_pipe_recv.poll():
            try:
                obj = state.child_pipe_recv.recv()
            except EOFError:
                self.timer.Stop()
                self.Destroy()
                return

            if isinstance(obj, Value):
                # request to set a status field
                if obj.name not in self.values:
                    # create a new status field
                    statictextbox = wx.StaticText(self.panel, -1, obj.text)
                    font = wx.Font(18, wx.DEFAULT, wx.NORMAL, wx.NORMAL)
                    statictextbox.SetFont(font)
                    # possibly add more status rows
                    for i in range(len(self.status), obj.row + 1):
                        self.status.append(wx.BoxSizer(wx.HORIZONTAL))
                        self.vbox.Insert(len(self.status) - 1,
                                         self.status[i],
                                         0,
                                         flag=wx.ALIGN_LEFT | wx.TOP)
                        self.vbox.Layout()
                    self.status[obj.row].Add(statictextbox, border=5)
                    self.status[obj.row].AddSpacer(20)
                    self.values[obj.name] = statictextbox
                statictextbox = self.values[obj.name]
                statictextbox.SetForegroundColour(obj.fg)
                statictextbox.SetBackgroundColour(obj.bg)
                statictextbox.SetLabel(obj.text)
                self.panel.Layout()
            elif isinstance(obj, Text):
                '''request to add text to the console'''
                self.pending.append(obj)
                for p in self.pending:
                    # we're scrolled at the bottom
                    oldstyle = self.control.GetDefaultStyle()
                    style = wx.TextAttr()
                    style.SetTextColour(p.fg)
                    style.SetBackgroundColour(p.bg)
                    self.control.SetDefaultStyle(style)
                    self.control.AppendText(p.text)
                    self.control.SetDefaultStyle(oldstyle)
                self.pending = []
            elif isinstance(obj, mp_menu.MPMenuTop):
                if obj is not None:
                    self.SetMenuBar(None)
                    self.menu = obj
                    self.SetMenuBar(self.menu.wx_menu())
                    self.Bind(wx.EVT_MENU, self.on_menu)
                self.Refresh()
                self.Update()
            elif isinstance(obj, mp_menu.MPButton):
                if obj is not None:
                    newbtn = wx.Button(self.panel, label=obj.label)
                    newbtn.Bind(wx.EVT_BUTTON, self.on_button)
                    self.buttongridsizer.Add(newbtn, 0, wx.EXPAND)
                    self.buttons.append(obj)
            elif isinstance(obj, win_layout.WinLayout):
                win_layout.set_wx_window_layout(self, obj)
Ejemplo n.º 8
0
    def on_idle(self, event):
        '''prevent the main loop spinning too fast'''
        state = self.state

        if state.close_window.acquire(False):
            self.state.app.ExitMainLoop()

        now = time.time()
        if now - self.last_layout_send > 1:
            self.last_layout_send = now
            state.event_queue.put(win_layout.get_wx_window_layout(self))

        # receive any display objects from the parent
        obj = None

        while not state.object_queue.empty():
            obj = state.object_queue.get()

            if isinstance(obj, win_layout.WinLayout):
                win_layout.set_wx_window_layout(self, obj)
                
            if isinstance(obj, SlipObject):
                self.add_object(obj)

            if isinstance(obj, SlipPosition):
                # move an object
                object = self.find_object(obj.key, obj.layer)
                if object is not None:
                    object.update_position(obj)
                    if getattr(object, 'follow', False):
                        self.follow(object)
                    if obj.label is not None:
                        object.label = obj.label
                    if obj.colour is not None:
                        object.colour = obj.colour
                    state.need_redraw = True

            if isinstance(obj, SlipDefaultPopup):
                state.default_popup = obj

            if isinstance(obj, SlipInformation):
                # see if its a existing one or a new one
                if obj.key in state.info:
#                    print('update %s' % str(obj.key))
                    state.info[obj.key].update(obj)
                else:
#                    print('add %s' % str(obj.key))
                    state.info[obj.key] = obj
                state.need_redraw = True

            if isinstance(obj, SlipCenter):
                # move center
                (lat,lon) = obj.latlon
                state.panel.re_center(state.width/2, state.height/2, lat, lon)
                state.need_redraw = True

            if isinstance(obj, SlipZoom):
                # change zoom
                state.panel.set_ground_width(obj.ground_width)
                state.need_redraw = True
                
            if isinstance(obj, SlipFollow):
                # enable/disable follow
                state.follow = obj.enable

            if isinstance(obj, SlipFollowObject):
                # enable/disable follow on an object
                for layer in state.layers:
                    if obj.key in state.layers[layer]:
                        if hasattr(state.layers[layer][obj.key], 'follow'):
                            state.layers[layer][obj.key].follow = obj.enable
                
            if isinstance(obj, SlipBrightness):
                # set map brightness
                state.brightness = obj.brightness
                state.need_redraw = True

            if isinstance(obj, SlipClearLayer):
                # remove all objects from a layer
                if obj.layer in state.layers:
                    state.layers.pop(obj.layer)
                state.need_redraw = True

            if isinstance(obj, SlipRemoveObject):
                # remove an object by key
                for layer in state.layers:
                    if obj.key in state.layers[layer]:
                        state.layers[layer].pop(obj.key)
                state.need_redraw = True

            if isinstance(obj, SlipHideObject):
                # hide an object by key
                for layer in state.layers:
                    if obj.key in state.layers[layer]:
                        state.layers[layer][obj.key].set_hidden(obj.hide)
                state.need_redraw = True

        if obj is None:
            time.sleep(0.05)