kopia lustrzana https://github.com/villares/sketch-a-day
				
				
				
			
		
			
	
	
		
			194 wiersze
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Python
		
	
	
		
		
			
		
	
	
			194 wiersze
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Python
		
	
	
| 
								 | 
							
								# -*- coding: utf-8 -*-
							 | 
						||
| 
								 | 
							
								from __future__ import unicode_literals
							 | 
						||
| 
								 | 
							
								from javax.swing import JOptionPane
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								"""
							 | 
						||
| 
								 | 
							
								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, slider_pins):
							 | 
						||
| 
								 | 
							
								        self.select_source(Arduino)
							 | 
						||
| 
								 | 
							
								        if self.source > 0:
							 | 
						||
| 
								 | 
							
								            self.arduino = Arduino(this, Arduino.list()[self.source], 57600)
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            # start, end, default
							 | 
						||
| 
								 | 
							
								            A = Slider(0, 1023, 128)
							 | 
						||
| 
								 | 
							
								            B = Slider(0, 1023, 128)
							 | 
						||
| 
								 | 
							
								            C = Slider(0, 1023, 128)
							 | 
						||
| 
								 | 
							
								            D = Slider(0, 1023, 128)
							 | 
						||
| 
								 | 
							
								            A.position(40, height - 70)
							 | 
						||
| 
								 | 
							
								            B.position(40, height - 30)
							 | 
						||
| 
								 | 
							
								            C.position(width - 140, height - 70)
							 | 
						||
| 
								 | 
							
								            D.position(width - 140, height - 30)
							 | 
						||
| 
								 | 
							
								            a, b, c, d = slider_pins
							 | 
						||
| 
								 | 
							
								            self.sliders = {a: A, b: B, c: C, d: 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 keyPressed(self):
							 | 
						||
| 
								 | 
							
								        if key == 'a':
							 | 
						||
| 
								 | 
							
								            self.sliders[1].down = True
							 | 
						||
| 
								 | 
							
								        if key == 'd':
							 | 
						||
| 
								 | 
							
								            self.sliders[1].up = True
							 | 
						||
| 
								 | 
							
								        if key == 's':
							 | 
						||
| 
								 | 
							
								            self.sliders[2].down = True
							 | 
						||
| 
								 | 
							
								        if key == 'w':
							 | 
						||
| 
								 | 
							
								            self.sliders[2].up = True
							 | 
						||
| 
								 | 
							
								        if keyCode == LEFT:
							 | 
						||
| 
								 | 
							
								            self.sliders[3].down = True
							 | 
						||
| 
								 | 
							
								        if keyCode == RIGHT:
							 | 
						||
| 
								 | 
							
								            self.sliders[3].up = True
							 | 
						||
| 
								 | 
							
								        if keyCode == DOWN:
							 | 
						||
| 
								 | 
							
								            self.sliders[4].down = True
							 | 
						||
| 
								 | 
							
								        if keyCode == UP:
							 | 
						||
| 
								 | 
							
								            self.sliders[4].up = True
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def keyReleased(self):
							 | 
						||
| 
								 | 
							
								        if key == 'a':
							 | 
						||
| 
								 | 
							
								            self.sliders[1].down = False
							 | 
						||
| 
								 | 
							
								        if key == 'd':
							 | 
						||
| 
								 | 
							
								            self.sliders[1].up = False
							 | 
						||
| 
								 | 
							
								        if key == 's':
							 | 
						||
| 
								 | 
							
								            self.sliders[2].down = False
							 | 
						||
| 
								 | 
							
								        if key == 'w':
							 | 
						||
| 
								 | 
							
								            self.sliders[2].up = False
							 | 
						||
| 
								 | 
							
								        if keyCode == LEFT:
							 | 
						||
| 
								 | 
							
								            self.sliders[3].down = False
							 | 
						||
| 
								 | 
							
								        if keyCode == RIGHT:
							 | 
						||
| 
								 | 
							
								            self.sliders[3].up = False
							 | 
						||
| 
								 | 
							
								        if keyCode == DOWN:
							 | 
						||
| 
								 | 
							
								            self.sliders[4].down = False
							 | 
						||
| 
								 | 
							
								        if keyCode == UP:
							 | 
						||
| 
								 | 
							
								            self.sliders[4].up = False
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    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)
							 | 
						||
| 
								 | 
							
								        self.source = option_pane("O seu Arduino está conectado?",
							 | 
						||
| 
								 | 
							
								                                  "Escolha a porta ou pressione Cancel\npara usar 'sliders':",
							 | 
						||
| 
								 | 
							
								                                  port_list,
							 | 
						||
| 
								 | 
							
								                                  -1)  # index for default option
							 | 
						||
| 
								 | 
							
								        self.help()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def help(self):
							 | 
						||
| 
								 | 
							
								        if self.source:
							 | 
						||
| 
								 | 
							
								            message = """   Teclas:
							 | 
						||
| 
								 | 
							
								            'h' para esta ajuda
							 | 
						||
| 
								 | 
							
								            'p' para salvar uma imagem
							 | 
						||
| 
								 | 
							
								            'g' para salvar um GIF
							 | 
						||
| 
								 | 
							
								            Tombe a lousa para lousa para limpar o desenho!"""
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            message = """    Teclas:
							 | 
						||
| 
								 | 
							
								            'h' para esta ajuda
							 | 
						||
| 
								 | 
							
								            'p' para salvar uma imagem
							 | 
						||
| 
								 | 
							
								            'g' para salvar um GIF
							 | 
						||
| 
								 | 
							
								            'a' (-) ou 'd' (+) para o slider 1
							 | 
						||
| 
								 | 
							
								            's' (-) ou 'w' (+) para o slider 2
							 | 
						||
| 
								 | 
							
								             ←(-) ou  → (+) para o slider 3
							 | 
						||
| 
								 | 
							
								             ↓  (-) ou  ↑  (+) para o slider 4
							 | 
						||
| 
								 | 
							
								            [barra de espaço] para limpar o desenho"""
							 | 
						||
| 
								 | 
							
								        ok = JOptionPane.showMessageDialog(None, message)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def option_pane(title, message, options, default=None, index_only=True):
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    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):
							 | 
						||
| 
								 | 
							
								        '''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.up, self.down = False, False
							 | 
						||
| 
								 | 
							
								        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 self.up:
							 | 
						||
| 
								 | 
							
								            self.rectx += 1
							 | 
						||
| 
								 | 
							
								        if self.down:
							 | 
						||
| 
								 | 
							
								            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()
							 |