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")
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
#!/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")
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())
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