class interfaceVTR: # Les variables déclarées ici sont accessibles avant les instanciations current_version = "v1.0" # ------------------------------------------------------------------ # Constructeur # Parametre: handler sur le fichier de log # ------------------------------------------------------------------ def __init__(self, fenetre, COMport): self.logger = logging.getLogger("socket") self.mode = 'remote' # on memorise la fenetre associée à ce compteur self.fenetre = fenetre # initialisation du port COM self.vtr = protocoleVTR(COMport) # initialisation de la machine à état self.state = StateMachine('stopped') # initialisation de l'horloge self.clock = Clock() self.clock.initCounterWithSeconds(0) self.logger.info( "interfaceVTR {ver}: Starting".format(ver=self.current_version)) # ------------------------------------------------------------------ # Renvoie le numero de port utilisé # ------------------------------------------------------------------ def getCOMport(self): return self.vtr.getCOMport() # ------------------------------------------------------------------ # Passe en mode LOCAL # ------------------------------------------------------------------ def setStatusToLocal(self): self.mode = 'local' b = self.fenetre.nametowidget('boutonLocal') b.configure(state=tkinter.DISABLED, bg="gold") b = self.fenetre.nametowidget('boutonRemote') b.configure(state=tkinter.NORMAL, bg="lightgrey") if (self.state.getStatus() != 'ejected'): # On dégrise les boutons PLAY et STOP #print (self.fenetre.winfo_children()) b = self.fenetre.nametowidget('boutonPlay') b.configure(state=tkinter.NORMAL) b = self.fenetre.nametowidget('boutonStop') b.configure(state=tkinter.NORMAL) b = self.fenetre.nametowidget('boutonFF') b.configure(state=tkinter.NORMAL) b = self.fenetre.nametowidget('boutonRW') b.configure(state=tkinter.NORMAL) # ------------------------------------------------------------------ # Passe en mode REMOTE # ------------------------------------------------------------------ def setStatusToRemote(self): self.mode = 'remote' # On grise les boutons PLAY et STOP b = self.fenetre.nametowidget('boutonPlay') b.configure(state=tkinter.DISABLED) b = self.fenetre.nametowidget('boutonStop') b.configure(state=tkinter.DISABLED) b = self.fenetre.nametowidget('boutonFF') b.configure(state=tkinter.DISABLED) b = self.fenetre.nametowidget('boutonRW') b.configure(state=tkinter.DISABLED) b = self.fenetre.nametowidget('boutonLocal') b.configure(state=tkinter.NORMAL, bg="lightgrey") b = self.fenetre.nametowidget('boutonRemote') b.configure(state=tkinter.DISABLED, bg="gold") # ------------------------------------------------------------------ # Passe en PLAY (si local) # ------------------------------------------------------------------ def play(self): # le bouton est actif si on est en Local # la fonction est active si on est en Stopped ou Cued status = self.state.getStatus() if ((status == 'stopped') or (status == 'cued')): self.state.setStatus('playing') # on initialise le compteur avec la valeur à laquelle on l'avait arrêté current_counter = self.clock.getCounterValue() self.clock.initCounterWithSeconds(current_counter) self.clock.start() # On grise les boutons PLAY, FF et RW b = self.fenetre.nametowidget('boutonPlay') b.configure(state=tkinter.DISABLED, bg="lime") b = self.fenetre.nametowidget('boutonFF') b.configure(state=tkinter.DISABLED, bg="yellowgreen") b = self.fenetre.nametowidget('boutonRW') b.configure(state=tkinter.DISABLED, bg="yellowgreen") b = self.fenetre.nametowidget('boutonStop') b.configure(bg="yellowgreen") # ------------------------------------------------------------------ # Passe en Fast Forward # ------------------------------------------------------------------ def fastForward(self): # le bouton est grisé si on est en Local # la fonction est active si on est en Stopped ou Cued status = self.state.getStatus() if ((status == 'stopped') or (status == 'cued')): self.state.setStatus('>>') # on initialise le compteur avec la valeur à laquelle on l'avait arrêté current_counter = self.clock.getCounterValue() self.clock.initCounterWithSeconds(current_counter) self.clock.start(10) # Speed x10 # On grise les boutons PLAY, FF et RW b = self.fenetre.nametowidget('boutonPlay') b.configure(state=tkinter.DISABLED, bg="yellowgreen") b = self.fenetre.nametowidget('boutonFF') b.configure(state=tkinter.DISABLED, bg="lime") b = self.fenetre.nametowidget('boutonRW') b.configure(state=tkinter.DISABLED, bg="yellowgreen") b = self.fenetre.nametowidget('boutonStop') b.configure(bg="yellowgreen") # ------------------------------------------------------------------ # Passe en Fast Rewind # ------------------------------------------------------------------ def fastRewind(self): # le bouton est grisé si on est en Local # la fonction est active si on est en Stopped ou Cued status = self.state.getStatus() if ((status == 'stopped') or (status == 'cued')): self.state.setStatus('<<') # on initialise le compteur avec la valeur à laquelle on l'avait arrêté current_counter = self.clock.getCounterValue() self.clock.initCounterWithSeconds(current_counter) self.clock.start(-10) # Speed x10 # On grise les boutons PLAY, FF et RW b = self.fenetre.nametowidget('boutonPlay') b.configure(state=tkinter.DISABLED, bg="yellowgreen") b = self.fenetre.nametowidget('boutonFF') b.configure(state=tkinter.DISABLED, bg="yellowgreen") b = self.fenetre.nametowidget('boutonRW') b.configure(state=tkinter.DISABLED, bg="lime") b = self.fenetre.nametowidget('boutonStop') b.configure(bg="yellowgreen") # ------------------------------------------------------------------ # Passe en STOP # ------------------------------------------------------------------ def stop(self): self.state.setStatus('stopped') self.clock.stop() # On dégrise les boutons PLAY, FF et RW b = self.fenetre.nametowidget('boutonPlay') b.configure(state=tkinter.NORMAL, bg="yellowgreen") b = self.fenetre.nametowidget('boutonFF') b.configure(state=tkinter.NORMAL, bg="yellowgreen") b = self.fenetre.nametowidget('boutonRW') b.configure(state=tkinter.NORMAL, bg="yellowgreen") b = self.fenetre.nametowidget('boutonStop') b.configure(bg="lime") # ------------------------------------------------------------------ # Commande PAUSE reçue # ------------------------------------------------------------------ def pause(self): self.state.setStatus('cued') self.clock.stop() # ------------------------------------------------------------------ # Commande CUE reçue # parametre = TC cible au format FFSSMMHH # ------------------------------------------------------------------ def cue(self, new_tc): # On positionne le compteur à la valeur demandée self.clock.stop() self.clock.resetCounter() self.clock.initCounterWithFFSSMMHH(new_tc) # On positionne le status self.state.setStatus('cueing') self.state.setStatusIn('cued', delay=2) # ------------------------------------------------------------------ # Ejecte la cassette # ------------------------------------------------------------------ def eject(self): self.state.setStatus('ejecting') self.state.setStatusIn('ejected', delay=1) # après dela de 1 seconde self.clock.stop() self.clock.resetCounter() b = self.fenetre.nametowidget('boutonEject') b.configure(state=tkinter.DISABLED) b = self.fenetre.nametowidget('boutonInsert') b.configure(state=tkinter.NORMAL) b = self.fenetre.nametowidget('boutonPlay') b.configure(state=tkinter.DISABLED, bg="yellowgreen") b = self.fenetre.nametowidget('boutonFF') b.configure(state=tkinter.DISABLED, bg="yellowgreen") b = self.fenetre.nametowidget('boutonRW') b.configure(state=tkinter.DISABLED, bg="yellowgreen") b = self.fenetre.nametowidget('boutonStop') b.configure(state=tkinter.DISABLED, bg="yellowgreen") # ------------------------------------------------------------------ # Insertion d'une nouvelle cassette # par defaut, le TCin de la cassette insérée est 10:00:00 # ------------------------------------------------------------------ def insert(self, tcin=36000): self.state.setStatus('stopped') self.clock.stop() self.clock.resetCounter() self.clock.initCounterWithSeconds(tcin) b = self.fenetre.nametowidget('boutonEject') b.configure(state=tkinter.NORMAL) b = self.fenetre.nametowidget('boutonInsert') b.configure(state=tkinter.DISABLED) if (self.mode == 'local'): # On dégrise les boutons PLAY et STOP b = self.fenetre.nametowidget('boutonPlay') b.configure(state=tkinter.NORMAL, bg="yellowgreen") b = self.fenetre.nametowidget('boutonStop') b.configure(state=tkinter.NORMAL, bg="yellowgreen") b = self.fenetre.nametowidget('boutonFF') b.configure(state=tkinter.NORMAL, bg="yellowgreen") b = self.fenetre.nametowidget('boutonRW') b.configure(state=tkinter.NORMAL, bg="yellowgreen") # ------------------------------------------------------------------ # met à jour le status affiché # ------------------------------------------------------------------ def updateDisplay(self, mode_var, status_var, compteur_var): # Refresh de l'affichage du mode mode_var.set(self.mode) # Refresh de l'affichage du status status_var.set(self.state.getStatus()) # Refresh de l'affichage du compteur if (self.state.getStatus() == 'ejected'): compteur_var.set("--:--:--:--") elif (self.state.getStatus() == 'cueing'): compteur_var.set(">>:>>") else: h, m, s, i = self.clock.getCounterHMSI() compteur_var.set("{h:02}:{m:02}:{s:02}:{i:02}".format( h=h % 24, m=m, s=s, i=i)) # h modulo 24 # Lecture des octets reçus, et envoi de la réponse message = self.vtr.readCommand() if (message): self.buildResponse(message) self.vtr.sendResponse() # Appel périodique (il faut répondre en moins de 10 ms) self.fenetre.after(5, self.updateDisplay, mode_var, status_var, compteur_var) # ------------------------------------------------------------------ # Construit le message a renvoyer # ------------------------------------------------------------------ def buildResponse(self, code_reponse): if (code_reponse == None): pass elif (code_reponse == 'TIME_SENSE'): h, m, s, i = self.clock.getCounterHMSI() self.vtr.buildResponseTC(h, m, s, i) elif (code_reponse == 'STATUS_SENSE'): self.vtr.buildResponseSTATUS(self.mode, self.state.getStatus()) elif (code_reponse == 'NACK'): self.vtr.buildResponseNACK() elif (code_reponse == 'DEVICE_TYPE'): self.vtr.buildResponseDEV_TYPE() elif (code_reponse == 'REW'): self.fastRewind() elif (code_reponse == 'FFWD'): self.fastForward() elif (code_reponse == 'EJECT'): self.eject() elif (code_reponse == 'STOP'): self.stop() elif (code_reponse == 'REC'): pass # le recording par le VTR n'est pas géré. elif (code_reponse == 'PLAY'): self.play() elif (code_reponse == 'SHTL'): pass # SHUTTLE non géré elif (code_reponse == 'PAUSE'): self.pause() elif (code_reponse == 'CUE'): self.cue(self.vtr.getNewTC()) else: self.logger.info("Unknown Response: {r}".format(r=code_reponse))