Compare commits
3 Commits
a65b65ab13
...
651da1c896
Author | SHA1 | Date |
---|---|---|
Martin Felis | 651da1c896 | |
Martin Felis | 5c97976f15 | |
Martin Felis | b3778d8cd2 |
|
@ -4,7 +4,6 @@ import pathlib
|
|||
from mopidy import config, ext
|
||||
|
||||
from .pinconfig import PinConfig
|
||||
from .rotencoder import RotEncoder
|
||||
|
||||
__version__ = "0.0.2"
|
||||
|
||||
|
|
|
@ -7,6 +7,7 @@ from .rotencoder import RotEncoder
|
|||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class RaspberryGPIOFrontend(pykka.ThreadingActor, core.CoreListener):
|
||||
def __init__(self, config, core):
|
||||
super().__init__()
|
||||
|
@ -35,9 +36,9 @@ class RaspberryGPIOFrontend(pykka.ThreadingActor, core.CoreListener):
|
|||
pull = GPIO.PUD_DOWN
|
||||
edge = GPIO.RISING
|
||||
|
||||
if 'rotenc_id' in settings.options:
|
||||
if "rotenc_id" in settings.options:
|
||||
edge = GPIO.BOTH
|
||||
rotenc_id = settings.options['rotenc_id']
|
||||
rotenc_id = settings.options["rotenc_id"]
|
||||
encoder = None
|
||||
if rotenc_id in self.rot_encoders.keys():
|
||||
encoder = self.rot_encoders[rotenc_id]
|
||||
|
@ -67,7 +68,7 @@ class RaspberryGPIOFrontend(pykka.ThreadingActor, core.CoreListener):
|
|||
def gpio_event(self, pin):
|
||||
settings = self.pin_settings[pin]
|
||||
event = settings.event
|
||||
encoder = self.find_pin_rotenc (pin)
|
||||
encoder = self.find_pin_rotenc(pin)
|
||||
if encoder:
|
||||
event = encoder.get_event()
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@ import logging
|
|||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class RotEncoder:
|
||||
def __init__(self, rot_id):
|
||||
self.id = rot_id
|
||||
|
@ -9,30 +10,31 @@ class RotEncoder:
|
|||
self.events = []
|
||||
self.state = (None, None)
|
||||
self.state_map = {
|
||||
((False, False), (False,True)): 0,
|
||||
((False, False), (True,False)): 1,
|
||||
((False, True), (True,True)): 0,
|
||||
((False, True), (False,False)): 1,
|
||||
((True, False), (False,False)): 0,
|
||||
((True, False), (True,True)): 1,
|
||||
((True, True), (True, False)): 0,
|
||||
((True, True), (False,True)): 1
|
||||
}
|
||||
((False, False), (False, True)): 0,
|
||||
((False, False), (True, False)): 1,
|
||||
((False, True), (True, True)): 0,
|
||||
((False, True), (False, False)): 1,
|
||||
((True, False), (False, False)): 0,
|
||||
((True, False), (True, True)): 1,
|
||||
((True, True), (True, False)): 0,
|
||||
((True, True), (False, True)): 1,
|
||||
}
|
||||
|
||||
def add_pin(self, pin, event):
|
||||
if len(self.pins) == 2:
|
||||
raise RuntimeError (f"Too many pins for rotary encoder {self.id}!")
|
||||
raise RuntimeError(f"Too many pins for rotary encoder {self.id}!")
|
||||
self.pins.append(pin)
|
||||
self.events.append(event)
|
||||
|
||||
def get_state(self):
|
||||
import RPi.GPIO as GPIO
|
||||
|
||||
level0 = GPIO.input(self.pins[0])
|
||||
level1 = GPIO.input(self.pins[1])
|
||||
|
||||
return (level0, level1)
|
||||
|
||||
def get_direction (self, current, new):
|
||||
def get_direction(self, current, new):
|
||||
return self.state_map[(current, new)]
|
||||
|
||||
def get_event(self):
|
||||
|
|
|
@ -216,8 +216,8 @@ def test_frontend_rot_encoder_event(patched_input):
|
|||
frontend.dispatch_input = dispatch_input
|
||||
|
||||
frontend.gpio_event(4)
|
||||
assert (dispatch_input.call_args[0][0] == "volume_up")
|
||||
assert (encoder.state == (False, False))
|
||||
assert dispatch_input.call_args[0][0] == "volume_up"
|
||||
assert encoder.state == (False, False)
|
||||
|
||||
# Check that we do not submit an event for the invalid transition
|
||||
# (False, False) -> (False, False)
|
||||
|
|
|
@ -1,34 +1,32 @@
|
|||
import sys
|
||||
import pytest
|
||||
import unittest
|
||||
|
||||
from unittest.mock import patch
|
||||
from mopidy_raspberry_gpio import RotEncoder
|
||||
from unittest.mock import patch, MagicMock
|
||||
|
||||
|
||||
class RotEncoderTests(unittest.TestCase):
|
||||
|
||||
def test_rotenc_init(self):
|
||||
rot_enc = RotEncoder("vol")
|
||||
self.assertTrue (rot_enc.id == "vol")
|
||||
self.assertTrue (((False,False), (False, True)) in rot_enc.state_map)
|
||||
self.assertTrue(rot_enc.id == "vol")
|
||||
self.assertTrue(((False, False), (False, True)) in rot_enc.state_map)
|
||||
|
||||
def test_get_direction(self):
|
||||
rot_enc = RotEncoder("vol")
|
||||
rot_enc.add_pin(123, "vol_up")
|
||||
rot_enc.add_pin(124, "vol_down")
|
||||
|
||||
dir_down = rot_enc.get_direction ((False, False), (False, True))
|
||||
dir_up = rot_enc.get_direction ((False, False), (True, False))
|
||||
dir_down = rot_enc.get_direction((False, False), (False, True))
|
||||
dir_up = rot_enc.get_direction((False, False), (True, False))
|
||||
|
||||
self.assertEqual (dir_up, 1)
|
||||
self.assertEqual (dir_down, 0)
|
||||
self.assertEqual(dir_up, 1)
|
||||
self.assertEqual(dir_down, 0)
|
||||
|
||||
def test_add_pin_invalid(self):
|
||||
rot_enc = RotEncoder("vol")
|
||||
rot_enc.add_pin(123, "vol_up")
|
||||
rot_enc.add_pin(124, "vol_down")
|
||||
|
||||
with self.assertRaises(RuntimeError) as cm:
|
||||
with self.assertRaises(RuntimeError):
|
||||
rot_enc.add_pin(124, "vol_down")
|
||||
|
||||
@patch("RPi.GPIO.input")
|
||||
|
@ -37,8 +35,8 @@ class RotEncoderTests(unittest.TestCase):
|
|||
patched_input.return_value = False
|
||||
|
||||
rot_enc = RotEncoder("vol")
|
||||
rot_enc.add_pin(123, "vol_down") # dir 0 => vol_down
|
||||
rot_enc.add_pin(124, "vol_up") # dir 1 => vol_up
|
||||
rot_enc.add_pin(123, "vol_down") # dir 0 => vol_down
|
||||
rot_enc.add_pin(124, "vol_up") # dir 1 => vol_up
|
||||
|
||||
# from False,True to False,False => dir 1
|
||||
rot_enc.state = (False, True)
|
||||
|
|
Loading…
Reference in New Issue