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()
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()