Nykhola Qui mange un chien,chie OuaOua | Bonjour à tous, Le titre n'est pas clair et pourtant je suis sur que la solution est toute bete...
je vous soumet mon soucis en python :
J'ai ce code que j'ai pondu pour gerer mon encodeur rotatif avec un rasp.
Le principe est simple, ma classe encodeur prend en paramètres les pins, et deux variables contenant le noms des fonctions du programme principale a exécuter si y'a rotation ou click.
Je vous passe le code, vous allez voir.
Code :
- #!/usr/bin/env python
- import RPi.GPIO as GPIO
- import time
- from datetime import datetime
- import Adafruit_CharLCD as LCD
- import os
- import subprocess
- import sys
- #from class_encoder import encoder
- class encoder:
- def __init__(self,pinA,pinB,pinS,functionrot,functionswitch):
- self.RoAPin = pinA
- self.RoBPin = pinB
- self.RoSwitch = pinS
- self.Last_RoB_Status = 0
- self.Current_RoB_Status = 0
- self.Encoder_A_old = 0
- self.Encoder_B_old = 0
- self.sens = 0
- GPIO.setmode(GPIO.BCM) # Numbers GPIOs by physical location
- GPIO.setup(self.RoAPin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) # input mode
- GPIO.setup(self.RoBPin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
- GPIO.setup(self.RoSwitch, GPIO.IN, pull_up_down=GPIO.PUD_UP)
- GPIO.add_event_detect(self.RoAPin, GPIO.BOTH, callback=self.rotate)
- GPIO.add_event_detect(self.RoBPin, GPIO.BOTH, callback=self.rotate)
- GPIO.add_event_detect(self.RoSwitch, GPIO.RISING, callback=self.click)
- self.funcrot = functionrot
- self.funcsw = functionswitch
- def rotate(self,term):
- self.Encoder_A,self.Encoder_B = GPIO.input(self.RoAPin),GPIO.input(self.RoBPin)
- if ((self.Encoder_A,self.Encoder_B) == (0,0)) and ((self.Encoder_A_old,self.Encoder_B_old) == (1,0)):
- globals()[self.funcrot](1)
- if ((self.Encoder_A,self.Encoder_B) == (0,0)) and ((self.Encoder_A_old,self.Encoder_B_old) == (0,1)):
- globals()[self.funcrot](-1)
- self.Encoder_A_old,self.Encoder_B_old = self.Encoder_A,self.Encoder_B
- return 1
- def click(self,term):
- globals()[self.funcsw]()
- return 1
- def setup():
- e=encoder(5,6,13,"protate","pclick" )
- print "load"
- def protate(sens):
- print "rotate " + str(sens)
- def pclick():
- print "click"
- def loop():
- global sens
- while True:
- time.sleep(2)
- print "loop"
- def destroy():
- GPIO.cleanup()
- if __name__ == '__main__':
- setup()
- try:
- loop()
- except KeyboardInterrupt:
- destroy()
- except Exception as inst:
- destroy()
|
Comme cela, cela fonctionne.
Par contre, si je met ma classe dans un fichier et que je l'importe, ca merde en me sortant :
une keyerror sur les globals()[self.funcsw]() etglobals()[self.funcrotate]()
Ce qui me parait assez logique, sauf que je vois pas par quoi remplacer
J'aurais pu faire en sorte que les interruptions ne soient pas geres dans la classe ce qui m'aurait éviter ce problème en n'ayant au final que deux méthodes dans ma classe pour savoir le sens de rotation et le click en appelant ces méthodes dans le callback...
Mais je veux que ce soit ma classe qui le gere, et je suppose qu'il doit pas manquer grand chose... |