lib/arduino_firmata/main.rb in arduino_firmata-0.0.3 vs lib/arduino_firmata/main.rb in arduino_firmata-0.0.4
- old
+ new
@@ -1,136 +1,17 @@
-require 'serialport'
-require 'stringio'
-
module ArduinoFirmata
- class Arduino
+ def self.list
+ Dir.entries('/dev').grep(/tty\.?usb/i).map{|fname| "/dev/#{fname}"}
+ end
- attr_reader :version
+ def self.connect(serial_name=nil, params={})
+ serial_name = self.list[0] unless serial_name
- def initialize(serial_name=nil, bps=57600)
- serial_name = ArduinoFirmata.list[0] unless serial_name
- @wait_for_data = 0
- @execute_multi_byte_command = 0
- @multi_byte_channel = 0
- @stored_input_data = []
- @parsing_sysex = false
- @sysex_bytes_read
-
- @digital_output_data = Array.new(16, 0)
- @digital_input_data = Array.new(16, 0)
- @analog_input_data = Array.new(16, 0)
-
- @version = nil
-
- @serial = SerialPort.new(serial_name, bps, 8, 1, 0)
- sleep 3
-
- Thread.new{
- loop do
- process_input
- sleep 0.1
- end
- }.run
-
- (0...6).each do |i|
- write(REPORT_ANALOG | i)
- write 1
- end
- (0...2).each do |i|
- write(REPORT_DIGITAL | i)
- write 1
- end
-
- loop do
- break if @version
- sleep 0.3
- end
- sleep 0.5
-
+ Params.default.each do |k,v|
+ params[k] = v unless params[k]
end
- def digital_read(pin)
- (@digital_input_data[pin >> 3] >> (pin & 0x07)) & 0x01 > 0
- end
-
- def analog_read(pin)
- @analog_input_data[pin]
- end
-
- def pin_mode(pin, mode)
- write SET_PIN_MODE
- write pin
- write mode
- end
-
- def digital_write(pin, value)
- port_num = (pin >> 3) & 0x0F
- if value == 0 or value == true
- @digital_output_data[port_num] &= ~(1 << (pin & 0x07))
- else
- @digital_output_data[port_num] |= (1 << (pin & 0x07))
- end
-
- write(DIGITAL_MESSAGE | port_num)
- write(@digital_output_data[port_num] & 0x7F)
- write(@digital_output_data[port_num] >> 7)
- end
-
- def analog_write(pin, value)
- pin_mode pin, PWM
- write(ANALOG_MESSAGE | (pin & 0x0F))
- write(value & 0x7F)
- write(value >> 7)
- end
-
- private
- def write(cmd)
- @serial.write_nonblock cmd.chr
- end
-
- def read
- @serial.read_nonblock 9600 rescue EOFError
- end
-
- def process_input
- StringIO.new(String read).bytes.each do |input_data|
- command = nil
-
- if @parsing_sysex
- if input_data == END_SYSEX
- @parsing_sysex = FALSE
- else
- @stored_input_data[@sysex_bytes_read] = input_data
- @sysex_bytes_read += 1
- end
- elsif @wait_for_data > 0 and input_data < 128
- @wait_for_data -= 1
- @stored_input_data[@wait_for_data] = input_data
- if @execute_multi_byte_command != 0 and @wait_for_data == 0
- case @execute_multi_byte_command
- when DIGITAL_MESSAGE
- @digital_input_data[@multi_byte_channel] = (@stored_input_data[0] << 7) + @stored_input_data[1]
- when ANALOG_MESSAGE
- @analog_input_data[@multi_byte_channel] = (@stored_input_data[0] << 7) + @stored_input_data[1]
- when REPORT_VERSION
- @version = "#{@stored_input_data[1]}.#{@stored_input_data[0]}"
- end
- end
- else
- if input_data < 0xF0
- command = input_data & 0xF0
- @multi_byte_channel = input_data & 0x0F
- else
- command = input_data
- end
- if [DIGITAL_MESSAGE, ANALOG_MESSAGE, REPORT_VERSION].include? command
- @wait_for_data = 2
- @execute_multi_byte_command = command
- end
- end
- end
- end
-
+ Arduino.new serial_name, params
end
-
+
end