示例#1
0
class MainModel(object):
    '''
    The model behind the main window
    '''

    _ConfigFileName = 'BalancingBotConfig.txt'

    def __init__(self, serialPort=6):
        '''
        Constructor
        '''

        self.SerialPort = serialPort
        self.SpeedControlParams = {
            'P': 0,
            'I': 0,
            'D': 0
        }  # P,I,D parameters for the speed controller
        self.BalancerParams = {
            'K1': 0,
            'K2': 0,
            'K3': 0,
            'K4': 0,
            'DPhi': 0
        }  # Coefficients K1, .. K4

        self._Settings = Settings(self)
        self._Settings.Load()

        print("MainModel load:")
        print(self.SpeedControlParams)
        print(self.BalancerParams)

        self.MaxAgeBuffer = MaxAgeBuffer(timedelta(seconds=10))
        #dataReceiver = TestDataReceiver()
        self._DataAdapter = DataAdapter(SerialDataGateway(self.SerialPort),
                                        self)
        self._DataAdapter.Start()

    def OnCoefficientsReceived(self, balancerParams):
        self.BalancerParams = balancerParams

    def SetSpeedControlParams(self, params):
        '''
        params is expected to a tuple holding three values that can be converted to floats representing the P,I,D parameters
        '''

        floatParams = tuple(float(param) for param in params)

        self.SpeedControlParams['P'] = floatParams[0]
        self.SpeedControlParams['I'] = floatParams[1]
        self.SpeedControlParams['D'] = floatParams[2]

        self._DataAdapter.SendSpeedControllerParams(floatParams)

    def SetSpeed(self, speed):
        self._DataAdapter.SendSpeed(float(speed))

    def SetBalancerParams(self, balancerParams):
        '''
        params is expected to a tuple holding four values that can be converted to floats representing the K1,... K4 parameters
        '''

        floatParams = tuple(
            float(balancerParam) for balancerParam in balancerParams)

        self.BalancerParams['K1'] = floatParams[0]
        self.BalancerParams['K2'] = floatParams[1]
        self.BalancerParams['K3'] = floatParams[2]
        self.BalancerParams['K4'] = floatParams[3]
        self.BalancerParams['DPhi'] = floatParams[4]

        self._DataAdapter.SendBalancerParams(floatParams)

    def Close(self):
        self._DataAdapter.Stop()
        print("MainModel close:")
        print(self.SpeedControlParams)
        print(self.BalancerParams)
        self._Settings.Save()
示例#2
0
class SampleApp(Tk):

    def save_settings(self_SampleApp):

        self_SampleApp.settings.OnOff = self_SampleApp.frames["MainPage"].OffBtn["text"]
        self_SampleApp.settings.SetTemp = self_SampleApp.frames["MainPage"].SetTemp["text"]
        self_SampleApp.settings.Temp1 = self_SampleApp.frames["PagePrg"].Temp1["text"]
        self_SampleApp.settings.Temp2 = self_SampleApp.frames["PagePrg"].Temp2["text"]
        self_SampleApp.settings.Temp3 = self_SampleApp.frames["PagePrg"].Temp3["text"]
        self_SampleApp.settings.Time1 = self_SampleApp.frames["PagePrg"].Time1["text"]
        self_SampleApp.settings.Time2 = self_SampleApp.frames["PagePrg"].Time2["text"]
        self_SampleApp.settings.Time3 = self_SampleApp.frames["PagePrg"].Time3["text"]

        self_SampleApp.settings.Save()        

    def on_closing(self):
        self.save_settings()
        if messagebox.askokcancel("Quit", "Do you want to quit?"):
            self.destroy()
   

    def __init__(self, server_queue ):
        Tk.__init__(self)
        
        # the container is where we'll stack a bunch of frames
        # on top of each other, then the one we want visible
        # will be raised above the others
        container = Frame(self)
        container.pack(side="top", fill="both", expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)
      
        if os.name == 'nt':
            # on windows
            self.geometry("480x320+200+200")
        elif(os.name == 'posix') :
            # on raspberry
            # hide mouse cursor
            self.config(cursor="none")

            # go fullscreen
            self.geometry("{0}x{1}+0+0".format(
                self.winfo_screenwidth(), self.winfo_screenheight()))
            self.overrideredirect(1)

            # set pin 40 as outpot to command the 220V relay
            import RPi.GPIO as GPIO
            GPIO.setmode(GPIO.BOARD)
            GPIO.setup(RELAY_PIN,GPIO.OUT)
            GPIO.output(RELAY_PIN,GPIO.HIGH)

        # Load Settings
        self.settings = Settings()
        self.settings.Load()
        self.frames = {}
        self.frames["PagePrg"] = PagePrg(parent=container, controller=self, queue=server_queue)
        self.frames["PagePrg"].Temp1["text"] = self.settings.Temp1
        self.frames["PagePrg"].Temp2["text"] = self.settings.Temp2
        self.frames["PagePrg"].Temp3["text"] = self.settings.Temp3
        self.frames["PagePrg"].Time1["text"] = self.settings.Time1
        self.frames["PagePrg"].Time2["text"] = self.settings.Time2
        self.frames["PagePrg"].Time3["text"] = self.settings.Time3
        self.frames["MainPage"] = MainPage(parent=container, controller=self, queue=server_queue)
        self.frames["MainPage"].SetTemp["text"] = self.settings.SetTemp
        self.frames["MainPage"].OffBtn["text"] = self.settings.OnOff

        # put all of the pages in the same location;
        # the one on the top of the stacking order
        # will be the one that is visible.
        self.frames["PagePrg"].grid(row=0, column=0, sticky="nsew")
        self.frames["MainPage"].grid(row=0, column=0, sticky="nsew")
 
        self.show_frame("MainPage")
        # clicking 3 times enables the right settings 
        self.frames["MainPage"].OffBtnClick()
        self.frames["MainPage"].OffBtnClick()
        self.frames["MainPage"].OffBtnClick()

        Tk.protocol(self,"WM_DELETE_WINDOW", self.on_closing)

    def show_frame(self, page_name):
        '''Show a frame for the given page name'''
        frame = self.frames[page_name]
        frame.tkraise()