Esempio n. 1
0
def handle_gpio_out():

    # Pin selection
    if not str(request.args.get("pin", default="")).isdigit():
        return jsonify(status="PARAM_ERR", message="Bad Request, pin argument is not even a number")

    selected_pin = int(request.args.get("pin"))

    # FIXME: use regexp later
    # Selected pin must be 0, 14-17 (used by soft SPI), 39 to 42, or it should return 400 to block this request
    if not selected_pin == 0 and not 39 <= selected_pin <= 42:
        return jsonify(status="PARAM_ERR", message="Bad Request: not a valid pin number")

    # Value selection
    if not str(request.args.get("value")).isdigit():
        return jsonify(status="PARAM_ERR", message="Bad Request: value selection incorrect")

    value = int(request.args.get("value", default="-1"))

    # If all good, then...
    gpio = Gpio(selected_pin, app)

    if not gpio.set_mode("out"):
        return jsonify(status="INTERNAL_ERR", message="Internal Error: set mode failed, check dmesg log please")

    if not gpio.set_value(value):
        return jsonify(status="INTERNAL_ERR", message="Internal Error: set value failed, check dmesg log please")

    return jsonify(status="OK", message="OK")
Esempio n. 2
0
    def initGpio(self, config):

        if config.getBool('Gpio', 'enable'):
            lamp_pin = config.getInt('Gpio', 'lamp_pin')
            trigger_pin = config.getInt('Gpio', 'trigger_pin')
            exit_pin = config.getInt('Gpio', 'exit_pin')

            logging.info(('GPIO enabled (lamp_pin=%d, trigger_pin=%d, '
                          'exit_pin=%d)'), lamp_pin, trigger_pin, exit_pin)

            from Gpio import Gpio

            self._gpio = Gpio()

            lamp = self._gpio.setLamp(lamp_pin)
            self._lampOn = lambda: self._gpio.lampOn(lamp)
            self._lampOff = lambda: self._gpio.lampOff(lamp)

            self._gpio.setButton(trigger_pin, self.gpioTrigger)
            self._gpio.setButton(exit_pin, self.gpioExit)
        else:
            logging.info('GPIO disabled')
            self._lampOn = lambda: None
            self._lampOff = lambda: None
Esempio n. 3
0
#!/usr/bin/env python3
from Gpio import Gpio
import sys

Gpio.setup(False)

if len(sys.argv) < 2:
    print("Usage: effects.py effect parameter1 [parameter2 [parameter3 [parameter4]]]")
else:
    if sys.argv[1].startswith('dis'):
        if len(sys.argv) != 3:
            print("Usage: effects.py dist[ortion] amount(between 0 and 100)")
        else:
            print("Sending distortion parameters")
            Gpio.send_distortion_data(True, int(sys.argv[2]))
    elif sys.argv[1].startswith('del'):
        if len(sys.argv) != 5:
            print("Usage: effects.py del[ay] para1 para2 para3")
        else:
            print("Sending delay parameters")
            Gpio.send_reset_data()
            Gpio.send_data(0b00000001)
            Gpio.send_data(int(sys.argv[2]))
            Gpio.send_data(int(sys.argv[3]))
            Gpio.send_data(int(sys.argv[4]))
            # do something
    elif sys.argv[1].startswith('rev'):
        if len(sys.argv) != 6:
            print("Usage: effects.py rev[erb] para1 para2 para3 para4")
        else:
            print("Sending reverb parameters")
Esempio n. 4
0
class Photobooth:
    def __init__(self, config, camera, conn, queue):

        self._conn = conn
        self._queue = queue

        self._worker_list = [PictureSaver(config)]

        self.initCamera(config, camera())
        self.initGpio(config)

        self.triggerOff()

    def initCamera(self, config, camera):

        self._cap = camera
        self._pic_dims = PictureDimensions(config, self._cap.getPicture().size)

        if (config.getBool('Photobooth', 'show_preview')
                and self._cap.hasPreview):
            logging.info('Countdown with preview activated')
            self._show_counter = self.showCountdownPreview
        else:
            logging.info('Countdown without preview activated')
            self._show_counter = self.showCountdownNoPreview

    def initGpio(self, config):

        if config.getBool('Gpio', 'enable'):
            lamp_pin = config.getInt('Gpio', 'lamp_pin')
            trigger_pin = config.getInt('Gpio', 'trigger_pin')
            exit_pin = config.getInt('Gpio', 'exit_pin')

            logging.info(('GPIO enabled (lamp_pin=%d, trigger_pin=%d, '
                          'exit_pin=%d)'), lamp_pin, trigger_pin, exit_pin)

            from Gpio import Gpio

            self._gpio = Gpio()

            lamp = self._gpio.setLamp(lamp_pin)
            self._lampOn = lambda: self._gpio.lampOn(lamp)
            self._lampOff = lambda: self._gpio.lampOff(lamp)

            self._gpio.setButton(trigger_pin, self.gpioTrigger)
            self._gpio.setButton(exit_pin, self.gpioExit)
        else:
            logging.info('GPIO disabled')
            self._lampOn = lambda: None
            self._lampOff = lambda: None

    def teardown(self):

        logging.info('Teardown of camera')
        self.triggerOff()
        self.setCameraIdle()

    def recvEvent(self, expected):

        event = self._conn.recv()

        try:
            event_idx = expected.index(str(event))
        except ValueError:
            logging.error('Unknown event received: %s', str(event))
            raise ValueError('Unknown event received', str(event))

        return event_idx

    def recvAck(self):

        events = ['ack', 'cancel', 'teardown']

        if self.recvEvent(events) != 0:
            logging.info('Teardown of camera requested')
            raise TeardownException()

    def recvTriggered(self):

        events = ['triggered', 'teardown']

        if self.recvEvent(events) != 0:
            logging.info('Teardown of camera requested')
            raise TeardownException()

    @property
    def showCountdown(self):

        return self._show_counter

    def initRun(self):

        self.setCameraIdle()
        self._conn.send(GuiState.IdleState())
        self.triggerOn()

    def run(self):

        self.initRun()

        try:
            while True:
                try:
                    self.recvTriggered()
                except EOFError:
                    return 0

                try:
                    self.trigger()
                except RuntimeError as e:
                    logging.error('Camera error: %s', str(e))
                    self._conn.send(GuiState.ErrorState('Cam error', str(e)))
                    self.recvAck()

        except TeardownException:
            self.teardown()
            return 123

    def setCameraActive(self):

        self._cap.setActive()

    def setCameraIdle(self):

        if self._cap.hasIdle:
            self._cap.setIdle()

    def showCountdownPreview(self):

        self._conn.send(GuiState.CountdownState())

        while not self._conn.poll():
            picture = ImageOps.mirror(self._cap.getPreview())
            self._conn.send(GuiState.PreviewState(picture=picture))

        self.recvAck()

    def showCountdownNoPreview(self):

        self._conn.send(GuiState.CountdownState())
        self.recvAck()

    def showPose(self, num_picture):

        self._conn.send(GuiState.PoseState(num_picture))

    def captureSinglePicture(self, num_picture):

        self.showCountdown()
        self.setCameraIdle()
        self.showPose(num_picture)
        picture = self._cap.getPicture()
        self.setCameraActive()
        return picture

    def capturePictures(self):

        return [
            self.captureSinglePicture(i + 1)
            for i in range(self._pic_dims.totalNumPictures)
        ]

    def assemblePictures(self, pictures):

        image = Image.new('RGB', self._pic_dims.outputSize, (255, 255, 255))

        for i in range(self._pic_dims.totalNumPictures):
            image.paste(pictures[i].resize(self._pic_dims.thumbnailSize),
                        self._pic_dims.thumbnailOffset[i])

        return image

    def enqueueWorkerTasks(self, picture):

        for task in self._worker_list:
            self._queue.put(task.get(picture))

    def trigger(self):

        logging.info('Photobooth triggered')

        self.triggerOff()
        self._conn.send(GuiState.GreeterState())

        self.setCameraActive()
        self.recvAck()

        pics = self.capturePictures()
        self._conn.send(GuiState.AssembleState())

        img = self.assemblePictures(pics)
        self._conn.send(GuiState.ReviewState(picture=img))

        self.enqueueWorkerTasks(img)

        self.setCameraIdle()
        self.recvAck()

        self._conn.send(GuiState.IdleState())
        self.triggerOn()

    def gpioTrigger(self):

        self._gpioTrigger()

    def gpioExit(self):

        self._conn.send(GuiState.TeardownState())

    def triggerOff(self):

        self._lampOff()
        self._gpioTrigger = lambda: None

    def triggerOn(self):

        self._lampOn()
        self._gpioTrigger = lambda: self._conn.send(GuiState.TriggerState())
Esempio n. 5
0
import time
from Gpio import Gpio

print('Settting up')
Gpio.setup()

# Reset
print('Sending byte 1111 1111')
Gpio.send_data(0b11111111)

# Effect
print('Sending byte 0000 0001')
Gpio.send_data(0b00000001)

# Para 1
print('Sending byte 0000 0101')
Gpio.send_data(0b00000101)

# Para 2
print('Sending byte 0000 1111')
Gpio.send_data(0b00001111)

# Para 3
print('Sending byte 0001 1111')
Gpio.send_data(0b00011111)

# Para 4
print('Sending byte 0101 1111')
Gpio.send_data(0b01011111)

# Reset