Beispiel #1
0
#!/usr/bin/env python
import time
import os
from trackball import TrackBall

print("""Trackball: Mouse

Use the trackball as a mouse in Raspbian, with right-click
when the switch is pressed.

Press Ctrl+C to exit!
""")

trackball = TrackBall(interrupt_pin=4)
trackball.set_rgbw(0, 0, 0, 0)

# Check for xte (used to control mouse)
use_xte = os.system('which xte') == 0

while True:
    up, down, left, right, switch, state = trackball.read()

    # Send movements and clicks to xte
    if use_xte:
        if switch:
            cmd = 'xte "mouseclick 1"'
            os.system(cmd)
        elif right or up or left or down:
            x = right - left
            x = math.copysign(x**2, x)
            y = down - up
    x %= 100
    y = max(0, min(y, 100))

    # Calculate hue and brightness
    h = x / 100.0
    v = y / 100.0

    # Prevents button from retriggering
    debounce = 0.5

    # Change toggled state if switch is pressed
    if state and not toggled:
        toggled = True
        time.sleep(debounce)
    elif state and toggled:
        toggled = False
        time.sleep(debounce)

    # Set brightness to zero if switch toggled
    if toggled:
        v = 0

    # Calculate RGB vals
    w = 0
    r, g, b = [int(c * 255) for c in colorsys.hsv_to_rgb(h, 1.0, v)]

    # Set LEDs
    trackball.set_rgbw(r, g, b, w)

    time.sleep(0.01)
class TrackballHelper():
    """
    Helper class for Pimoroni's Trackball processing.
    """
    DEFAULT_I2C_BUS_ID = 3
    DEFAULT_INTERRUPT_ID = 4
    DEFAULT_INTERVAL = 0.5
    DEFAULT_THRESHOLD = 15
    DEFAULT_FLASH_DURATION = 5

    NOTIFY_LEFT = 1
    NOTIFY_RIGHT = 2
    NOTIFY_UP = 3
    NOTIFY_DOWN = 4
    NOTIFY_CLICK = 5

    ERR_MSG_NO_SETUP = "No trackball setup"
    ERR_MSG_ALREADY_STARTED = "Already started"
    ERR_MSG_NOT_STARTED = "Not started"
    ERR_MSG_ALREADY_RECORDING = "Already Recording"
    ERR_MSG_NOT_RECORDING = "Not Recording"

    def __init__(self, **kwargs):
        super(TrackballHelper, self).__init__(**kwargs)
        self.trackball = None
        self.trackball_event = None
        self.duration = TrackballHelper.DEFAULT_FLASH_DURATION
        self._video_lock = threading.Lock()

    def setup(self,
              bus_id=DEFAULT_I2C_BUS_ID,
              interrupt=DEFAULT_INTERRUPT_ID,
              flash_duration=DEFAULT_FLASH_DURATION):
        self.trackball = TrackBall(i2c_bus=bus_id, interrupt_pin=interrupt)
        self.duration = flash_duration
        self.recording_video = False

    def start(self, callback):
        if self.trackball_event:
            Logger.error(TrackballHelper.ERR_MSG_ALREADY_STARTED)
            return
        self.trackball_event = Clock.schedule_interval(
            partial(self.on_read_trackball, callback),
            TrackballHelper.DEFAULT_INTERVAL)

    def stop(self):
        if not self.trackball_event:
            Logger.error(TrackballHelper.ERR_MSG_NOT_STARTED)
            return
        self.trackball_event.cancel()
        self.trackball_event = None

    def on_read_trackball(self, callback, delta_time):
        up, down, left, right, switch, state = self.trackball.read()
        if left > TrackballHelper.DEFAULT_THRESHOLD:
            callback(TrackballHelper.NOTIFY_LEFT)
        elif right > TrackballHelper.DEFAULT_THRESHOLD:
            callback(TrackballHelper.NOTIFY_RIGHT)
        if up > TrackballHelper.DEFAULT_THRESHOLD:
            callback(TrackballHelper.NOTIFY_UP)
        elif down > TrackballHelper.DEFAULT_THRESHOLD:
            callback(TrackballHelper.NOTIFY_DOWN)
        if state:
            callback(TrackballHelper.NOTIFY_CLICK)

    def clear_trackball(self):
        if self.trackball:
            self.trackball.set_rgbw(0, 0, 0, 0)
        else:
            Logger.error(TrackballHelper.ERR_MSG_NO_SETUP)

    def click_red_trackball(self):
        if self.trackball:
            self.trackball.set_rgbw(255, 0, 0, 0)
        else:
            Logger.error(TrackballHelper.ERR_MSG_NO_SETUP)

    def click_green_trackball(self):
        if self.trackball:
            self.trackball.set_rgbw(0, 255, 0, 0)
        else:
            Logger.error(TrackballHelper.ERR_MSG_NO_SETUP)

    def click_blue_trackball(self):
        if self.trackball:
            self.trackball.set_rgbw(0, 0, 255, 0)
        else:
            Logger.error(TrackballHelper.ERR_MSG_NO_SETUP)

    def timer_still(self):
        if self.trackball:
            for i in range(int(self.duration)):
                self.click_red_trackball()
                time.sleep(0.5)
                self.clear_trackball()
                time.sleep(0.5)
        else:
            Logger.error(TrackballHelper.ERR_MSG_NO_SETUP)

    def activate_video(self):
        if self.trackball:
            if self.recording_video:
                Logger.warn(TrackballHelper.ERR_MSG_ALREADY_RECORDING)
            else:
                with self._video_lock:
                    self.recording_video = True
                self.video_thread = threading.Thread(
                    target=self.flash_video_recording)
                self.video_thread.start()
        else:
            Logger.error(TrackballHelper.ERR_MSG_NO_SETUP)

    def deactivate_video(self):
        if self.trackball:
            if not self.recording_video:
                Logger.warn(TrackballHelper.ERR_MSG_NOT_RECORDING)
            else:
                with self._video_lock:
                    self.recording_video = False
                self.video_thread.join()
                self.video_thread = None
        else:
            Logger.error(TrackballHelper.ERR_MSG_NO_SETUP)

    def flash_video_recording(self):
        if self.trackball:
            while self.recording_video:
                self.click_red_trackball()
                time.sleep(0.5)
                self.clear_trackball()
                time.sleep(0.5)
        else:
            Logger.error(TrackballHelper.ERR_MSG_NO_SETUP)