projet crepp_git/crepp-projects/raspi-bot · branche main
IntRaspibot10Main.py Voir sur GitLab
#!/usr/bin/python
# -*- coding: utf-8 -*-

# modules a importer 
from PyQt4.QtGui import *
from PyQt4.QtCore import *  
import glob
import os,sys
import serial  # bibliothèque permettant la communication série
import time    # pour le délai d'attente entre les messages

from IntRaspibotDesign10 import * 
memclicVG=40
memclicVD=40
VG=0
VD=0
sensG = 0
sensD = 0

sensibilite = 4 #(augmenter pour diminuer la sensibilite du pad moteurs)

class myApp(QWidget, Ui_InterfaceCommande): # la classe reçoit le Qwidget principal ET la classe définie dans test.py obtenu avec pyuic4
	def __init__(self, parent=None):
		
		QWidget.__init__(self) # initialise le Qwidget principal 
		self.setupUi(parent) # Obligatoire 
		
		#Signaux (servo)moteurs
		self.connect(self.RBS, SIGNAL("sliderReleased()"), self.RBSReleased) 
		self.connect(self.EBS, SIGNAL("sliderReleased()"), self.EBSReleased)
		self.connect(self.AvArBS, SIGNAL("sliderReleased()"), self.AvArBSReleased)
		self.connect(self.PinceS, SIGNAL("sliderReleased()"), self.PinceSReleased)
		self.connect(self.RCS, SIGNAL("sliderReleased()"), self.RCSReleased)
		self.connect(self.HBCS, SIGNAL("sliderReleased()"), self.HBCSReleased)
		self.connect(self.RAZgeneral, SIGNAL("clicked()"), self.RAZgeneralClicked)
		self.connect(self.MGini, SIGNAL("clicked()"), self.MGiniClicked)
		self.connect(self.MDini, SIGNAL("clicked()"), self.MDiniClicked)
		self.connect(self.Stopper, SIGNAL("clicked()"), self.StopperClicked)
		self.connect(self.RotCini, SIGNAL("clicked()"), self.RotCiniClicked)
		self.connect(self.HBCini, SIGNAL("clicked()"), self.HBCiniClicked)
		self.connect(self.RBini, SIGNAL("clicked()"), self.RBiniClicked)
		self.connect(self.ElevBini, SIGNAL("clicked()"), self.ElevBiniClicked)
		self.connect(self.AvArBini, SIGNAL("clicked()"), self.AvArBiniClicked)
		self.connect(self.pinceini, SIGNAL("clicked()"), self.pinceiniClicked)
		#Signaux port serie
		self.serialPort=None
		self.connect(self.Envoi, SIGNAL("clicked()"), self.EnvoiClicked)
		self.connect(self.Connexion, SIGNAL("clicked()"), self.ConnexionClicked)
		#initialisation Timer
		self.timer=QTimer()
		self.connect(self.timer,SIGNAL("timeout()"), self.timerEvent)
		#declaration filtre d'evenements
		self.moteurs.installEventFilter(self)
		#self.connect(self.moteurs, SIGNAL("clicked()"),self.clicmoteurClicked)
		
		# DEF CONSOLE SERIE
		
	def PortDetect(self):#detection des ports serie disponibles			
		if sys.platform.startswith('linux') :
	        # exclusion terminal courant
			ports = glob.glob('/dev/tty[A-Za-z]*')
		else:
			raise EnvironmentError('Unsupported platform')
		result = []
		i=0
		for port in ports:
			try:			
				s = serial.Serial(port)
				s.close()
				result.append(port)
				self.PortSerie.insertItem(i,port,0)
				i = i+1					
			except (OSError, serial.SerialException):
				pass
		return result	

		
	def EnvoiClicked(self):#envoi manuel d'instructions
		if self.serialPort:
			self.serialPort.write(str(self.lineEditChaineEnvoi.text())+ '\n' )# envoie le texte tape a aérduino
			commande =[0,1,2,3,self.HBCS,self.RCS,self.RBS,self.AvArBS,self.EBS,self.PinceS]
			chaine = self.lineEditChaineEnvoi.text()
			indice = int(chaine[0])# indice envoye
			mvmt = int(chaine[1:])# valeur envoyee
			if (indice>3):
				commande[indice].setValue(mvmt)
			if (indice==0):
				VG = mvmt
				memclicVG = mvmt
				self.sourisY.display(VG)
			if (indice==1):
				VD = mvmt
				memclicVD = mvmt
				self.sourisX.display(VD)				
			if (indice==2):
				sensG = mvmt
			if (indice==3):
				sensD = mvmt

			self.lineEditChaineEnvoi.setText("")
			

	def ConnexionClicked(self): #  bouton connexion				               
			if  self.PortSerie.currentText()=="" : # si le champ  Port est vide = detection
				self.PortDetect() 
			else :
				strPortInit=str(self.PortSerie.currentText()) #sinon utilise paramètre selectionne pour le port
				strDebitInit=str(self.Vcom.currentText()) # paramètre selectionne pour debit
                     
			try: 
                        # initialise port serie avec délai attente en réception en sec
				self.serialPort=serial.Serial(strPortInit, strDebitInit, serial.EIGHTBITS, serial.PARITY_NONE, serial.STOPBITS_ONE, 0.100)                     
				self.serialPort.flushInput() # vide la file d'attente série
				self.Connexion.setStyleSheet(QString.fromUtf8("background-color: rgb(0, 255, 0);")) # bouton en vert(connexion OK)
				self.Connexion.setText("       OK")  # change titre bouton
					
			except: # si erreur initialisation                                 
				self.Connexion.setStyleSheet(QString.fromUtf8("background-color: rgb(255, 127, 0);")) # bouton en orange (non connecte)
				self.Connexion.setText(QString.fromUtf8("Non connecté"))  # change titre bouton

			self.timer.start(10) # lance le timer avec délai en ms - 10 pour réception rapide 
                
	                
				
	def timerEvent(self): # fonction appelée lors de la survenue d'un évènement Timer - nom fonction indiférrent
			self.chaineIn="";
			self.char="";
                # lecture des données reçues           
			if self.serialPort: # seulement si le port série existe
					self.timer.stop() # stoppe le timer le temps de lire les caractères et éviter "réentrée"
					
					while (self.serialPort.inWaiting()): # tant que au moins un caractère en réception
							self.char=self.serialPort.read() # on lit le caractère
							if self.char=='\n': # si saut de ligne, on sort du while
									#print("saut ligne reçu") # debug
									break # sort du while
							else: #tant que c'est pas le saut de ligne, on l'ajoute à la chaine
									self.chaineIn=self.chaineIn+self.char                                                                

					if len(self.chaineIn)>0: # ... pour ne pas avoir d'affichage si ""     
							print(self.chaineIn) # affiche la chaîne
							#self.textReception.append(self.chaineIn[:-1]) # ajoute le texte - le dernier caractère
							self.textReception.append(self.chaineIn) # ajoute le texte - le dernier caractère

					self.timer.start() # redémarre le timer
					
	#def clicmoteurClicked(self):
		#self.clic.setGeometry(QtCore.QRect(Xc,Yc,3,3))				
			#DEF PAD MOTEURS
		
	def eventFilter(self, _, event): # fonction pour gérer filtrage évènements		
		if event.type() == QEvent.MouseButtonPress:
			
			Xc=event.pos().x() # coordonnée souris 
			Yc=event.pos().y()
			X=Xc - 127
			Y = 127 - Yc
			global VG 
			global VD 
			global memclicVG
			global memclicVD
			global sensG
			global sensD
			global sensibilite
			
			#for colX in range (Xc-2,Xc+2):
				#for colY in range (Yc-2,Yc+2):
			#self.widget.move(QString.fromUtf8("selection-color: rgb(255, 0, 0);"))
			#self.clic.move(QtGui.QWidget(self.clic.move(Xc,Yc))
			#self.position = moteurs(self.clic)
			#self.position.move(Xc,Yc)
			self.clic.setGeometry(QtCore.QRect(Xc,Yc,3,3))				

			
			if Y>0:
				sensG=0
				sensD=0
			else:
				sensG=1
				sensD=1				
			
			if ((Y>109) or (Y<-119)):
				if (X<-13):					
					VG = 255
					VD = memclicVD
					
				elif (X>13):
					VD = 255
					VG= memclicVG
				else:
					VG = 255
					VD = 255
						
			if ((Y>-21) and (Y<11)):								
					VG= 40
					VD= 40
					memclicVD = VD
					memclicVG = VG
					
			if ((Y>10) and (Y<110)):				
				if  (X<-13):
					VGi,p = str(18.5+2.15*Y).split(".")
					VG = int(VGi)
					a = abs(memclicVG-VG)
					if (a<sensibilite):
						VG = memclicVG
					VDi,q = str((VG-40)*X/114 +1.11*VG - 2.3).split(".")
					VD = int(VDi)
					memclicVG=VG
					memclicVD = VD #					
					if self.InversionB.isChecked() :
						sensD = 1- sensD					
					
				elif (X>13):
					VDi,p = str(18.5+2.15*Y).split(".")
					VD= int(VDi)
					a = abs(memclicVD-VD)
					if (a<sensibilite):
						VD=memclicVD
					VGi,q = str((VD-40)*X/-114 +1.11*VD-2.3).split(".")
					VG = int(VGi)
					memclicVD = VD
					memclicVG = VG#
					if self.InversionB.isChecked() :
						sensG = 1 - sensG						
				else:
					VGi,p = str(18.5+2.15*Y).split(".")
					VG = int(VGi)
					VD = VG	
					memclicVG = VG#
					memclicVD = VD#
					
			if ((Y<-20) and (Y>-120)):				
				if  (X<-13):
					VGi,p = str(-3-2.15*Y).split(".")
					VG= int(VGi)
					a = abs(memclicVG-VG)
					if (a<sensibilite):
						VG = memclicVG
					VDi,q = str((-VG+40)*X/-114 +1.11*VG - 2.3).split(".")
					VD= int(VDi)
					memclicVG = VG
					memclicVD = VD#
					if self.InversionB.isChecked() :
						sensD = 1 - sensD

				elif (X>13) :
					VDi,p = str(-3-2.15*Y).split(".")
					VD= int(VDi)
					a = abs(memclicVD-VD)
					if (a<sensibilite):
						VD = memclicVD
					VGi,q = str((VD-40)*X/-114 +1.11*VD - 2.3).split(".")	
					VG = int(VGi)
					memclicVD = VD
					memclicVG = VG#		
					if self.InversionB.isChecked():
						sensG = 1 - sensG
				else:
					VGi,p = str(-3-2.15*(Y)).split(".")
					VG = int(VGi)
					VD = VG	
					memclicVG = VG#
					memclicVD = VD#	

			self.sourisX.display(VD)
			self.sourisY.display(VG)			
			#print sensG
			#print sensD
			#print VG
			#print VD
			
			SD = str(3) + str(sensD) + "\n"
			SG = str(2) + str(sensG) + "\n"
			MD = str(1) + str(VD) + "\n"
			MG = str(0) + str(VG) + "\n"
			self.serialPort.write(SD)
			time.sleep(0.001)
			self.serialPort.write(SG)
			time.sleep(0.001)
			self.serialPort.write(MD)
			time.sleep(0.001)
			self.serialPort.write(MG)


		return False # obligatoire...
		
	def StopperClicked(self):
		global sensG
		global sensD
		global VD
		global VG
		VD=40
		VG=40
		self.sourisX.display(VD)#valeur d'arret moteur gauche
		self.sourisY.display(VG)#valeur d'arret moteur droit
		SD = str(3) + str(sensD) + "\n"
		SG = str(2) + str(sensG) + "\n"
		MD = str(1) + str(VD) + "\n"
		MG = str(0) + str(VG) + "\n"  
		self.serialPort.write(SD)
		time.sleep(0.001)
		self.serialPort.write(SG)
		time.sleep(0.001)
		self.serialPort.write(MD)
		time.sleep(0.001)
		self.serialPort.write(MG)
				
	def MGiniClicked(self):
		global sensG
		global sensD
		global VD
		global VG		
		self.sourisY.display(40)#valeur d'arret moteur droit
		VG = 40
		SD = str(3) + str(sensD) + "\n"
		SG = str(2) + str(sensG) + "\n"
		MD = str(1) + str(VD) + "\n"
		MG = str(0) + str(VG) + "\n"  
		self.serialPort.write(SD)
		time.sleep(0.001)
		self.serialPort.write(SG)
		time.sleep(0.001)
		self.serialPort.write(MD)
		time.sleep(0.001)
		self.serialPort.write(MG)
		
	def MDiniClicked(self):	
		global sensG
		global sensD
		global VD
		global VG
		self.sourisX.display(40)
		VD = 40
		SD = str(3) + str(sensD) + "\n"
		SG = str(2) + str(sensG) + "\n"
		MD = str(1) + str(VD) + "\n"
		MG = str(0) + str(VG) + "\n"
		self.serialPort.write(SD)
		time.sleep(0.001)
		self.serialPort.write(SG)
		time.sleep(0.001)
		self.serialPort.write(MD)
		time.sleep(0.001)
		self.serialPort.write(MG)
	
		
		#DEF BOUTONS INI
		
	def HBCiniClicked(self):# init haut/bas camera
		global mema
		self.HBCS.setValue(60)
		a = str(460) + "\n"
		mema = a
		self.serialPort.write(a)
		time.sleep(0.001)
		
	def RotCiniClicked(self):# init rotation camera
		global memb
		self.RCS.setValue(60)
		b = str(560) + "\n"
		memb = b
		self.serialPort.write(b)
		time.sleep(0.001)
		
	def RBiniClicked(self):# init rotation bras
		global memc
		self.RBS.setValue(60)
		c = str(660) + "\n"
		memc = c
		self.serialPort.write(c)
		time.sleep(0.001)
		
	def AvArBiniClicked(self):# init Av/Ar Bras
		global memd
		self.AvArBS.setValue(60)	
		d = str(760) + "\n"
		memd = d
		self.serialPort.write(d)
		time.sleep(0.001)		

		
	def ElevBiniClicked(self):# init elevation bras
		global meme
		self.EBS.setValue(60)
		e = str(860) + "\n"
		meme = e
		self.serialPort.write(e)
		time.sleep(0.001)			
		
	def pinceiniClicked(self): #init Pince
		global memf
		self.PinceS.setValue(60)
		f = str(960) + "\n"
		memf = f
		self.serialPort.write(f)
		time.sleep(0.001)		
		
	def RAZgeneralClicked(self):
		self.HBCiniClicked()
		self.RotCiniClicked()
		self.RBiniClicked()
		self.AvArBiniClicked()
		self.ElevBiniClicked()
		self.pinceiniClicked()
				
		
		#DEF SLIDERS
		
	def HBCSReleased(self): # Haut Bas Camera
		a = str(4) + str(self.HBCS.value()) + "\n" 		
		self.serialPort.write(a)
		
	def RCSReleased(self): # Rotation Camera
		b=str(5)+str(self.RCS.value()) + "\n" 
		self.serialPort.write(b)	
				
	def RBSReleased(self): # Rotation Bras
		global memc		
		c = str(6)+str(self.RBS.value()) + "\n" 
		self.serialPort.write(c)
		
	def AvArBSReleased(self): # Avant/Arriere Bras
		d=str(7)+str(self.AvArBS.value()) + "\n" 
		self.serialPort.write(d)
					
	def EBSReleased(self): # Elevation Bras
		e=str(8)+str(self.EBS.value()) + "\n"
		self.serialPort.write(e)
	
	def PinceSReleased(self): # Pince Bras
		f=str(9)+str(self.PinceS.value()) + "\n"
		self.serialPort.write(f)	
		        
        
def main(args):
	global a
	a=QApplication(args) # crée l'objet application 
	f=QWidget() # crée le QWidget racine
	c=myApp(f) # appelle la classe contenant le code de l'application 
	f.show() # affiche la fenêtre QWidget
	c.PortDetect()#routine de detection du port
	r=a.exec_() # lance l'exécution de l'application 
	return r
		

if __name__=="__main__": # pour rendre le code exécutable 
	main(sys.argv) # appelle la fonction main