# -*- coding: utf-8 -*- from __future__ import unicode_literals """ This will hpefully switch between Arduino (Firmata) variable input and nice sliders based on Peter Farell's Sliders htts://twitter.com/hackingmath https://github.com/hackingmath/python-sliders http://farrellpolymath.com/ """ class Input: def __init__(self, Arduino): self.source = self.select_source(Arduino) if self.source > 0: self.arduino = Arduino(this, Arduino.list()[self.source], 57600) else: # start, end, default, + key, - key A = Slider(0, 1023, 128, 'q', 'a') B = Slider(0, 1023, 128, 'w', 's') C = Slider(0, 1023, 128, 'e', 'd') D = Slider(0, 1023, 128, 'r', 'f') A.position(40, height - 70) B.position(40, height - 30) C.position(width - 140, height - 70) D.position(width - 140, height - 30) self.sliders = {1 : A, 2 : B, 3 : C, 4 : D} def analog(self, pin): if self.source: return self.arduino.analogRead(pin) else: return self.sliders[pin].val def update(self): if not self.source: for pin, slider in self.sliders.iteritems(): slider.update() def digital(self, pin): space_pressed = keyPressed and key == ' ' if self.source: if pin == 13: return self.arduino.digitalRead(13) or space_pressed else: return arduino.digitalRead(pin) else: return space_pressed def select_source(self, Arduino): #Input.Arduino = Arduino # to make available on this module port_list = [str(num) + ": " + port for num, port in enumerate(Arduino.list())] if not port_list: port_list.append(None) user_input = option_pane("Is your Arduino connected?", "Choose the port or, Cancel\nto use sliders:", port_list, 0) # index for default option return user_input def option_pane(title, message, options, default=None, index_only=True): from javax.swing import JOptionPane if default == None: default = options[0] elif index_only: default = options[default] selection = JOptionPane.showInputDialog( frame, message, title, JOptionPane.INFORMATION_MESSAGE, None, # for Java null options, default) # must be in options, otherwise 1st is shown if selection: if index_only: return options.index(selection) else: return selection class Slider: SLIDERS = [] def __init__(self, low, high, default, more_key, less_key): '''slider has range from low to high and is set to default''' self.low = low self.high = high self.val = default self.clicked = False self.more = more_key self.less = less_key Slider.SLIDERS.append(self) def position(self, x, y): '''slider's position on screen''' self.x = x self.y = y # the position of the rect you slide: self.rectx = self.x + map(self.val, self.low, self.high, 0, 120) self.recty = self.y - 10 def update(self): '''updates the slider''' pushStyle() rectMode(CENTER) # black translucid rect behind slider fill(0, 100) noStroke() rect(self.x + 60, self.y, 130, 20) # gray line behind slider strokeWeight(4) stroke(200) line(self.x, self.y, self.x + 120, self.y) # press mouse to move slider if (self.x < mouseX < self.x + 120 and self.y < mouseY < self.y + 20): fill(250) textSize(10) text(str(int(self.val)), self.rectx, self.recty + 35) if mousePressed: self.rectx = mouseX # key usage if keyPressed: if key == self.more: self.rectx += 1 if key == self.less: self.rectx -= 1 # constrain rectangle self.rectx = constrain(self.rectx, self.x, self.x + 120) # draw rectangle strokeWeight(1) fill(255) rect(self.rectx, self.recty + 10, 10, 20) self.val = map(self.rectx, self.x, self.x + 120, self.low, self.high) popStyle()