digiusb 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/bin/digiterm +28 -0
- data/examples/finn.rb +13 -0
- data/lib/digiusb.rb +117 -0
- data/license.txt +1 -0
- data/readme.txt +21 -0
- metadata +73 -0
data/bin/digiterm
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
$:.unshift File.dirname(__FILE__) + "/../lib"
|
3
|
+
require 'digiusb'
|
4
|
+
require 'io/console'
|
5
|
+
|
6
|
+
puts "Looking for Digispark running DigiUSB..."
|
7
|
+
|
8
|
+
sleep 0.25 until DigiUSB.sparks.length > 0
|
9
|
+
spark = DigiUSB.sparks.last
|
10
|
+
|
11
|
+
puts "Attached to #{spark}"
|
12
|
+
puts "Type control + c to exit"
|
13
|
+
|
14
|
+
begin
|
15
|
+
loop do
|
16
|
+
print spark.getc
|
17
|
+
|
18
|
+
begin
|
19
|
+
char = IO.console.read_nonblock(1)
|
20
|
+
spark.putc char
|
21
|
+
rescue Errno::EAGAIN
|
22
|
+
end
|
23
|
+
end
|
24
|
+
rescue LIBUSB::ERROR_PIPE
|
25
|
+
puts "Digispark disconnected or crashed"
|
26
|
+
rescue Interrupt
|
27
|
+
puts ""
|
28
|
+
end
|
data/examples/finn.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'digiusb'
|
2
|
+
|
3
|
+
spark = DigiUSB.sparks.last
|
4
|
+
|
5
|
+
print spark.puts "Jake! Jake! Good Morning! Whatcha' doin' buddy?"
|
6
|
+
print msg = spark.gets
|
7
|
+
print spark.puts "What are you #{msg.downcase.gsub(/[^a-z]/, '')} about, dude?"
|
8
|
+
print spark.gets
|
9
|
+
print spark.puts "Haha! Beep! Boop! Boooop! Beep! Boop!"
|
10
|
+
print spark.gets
|
11
|
+
print spark.puts "Huh! I like it!"
|
12
|
+
print spark.puts "Weeeeoooooooo!"
|
13
|
+
print spark.puts "Woooooah! Algebraic!"
|
data/lib/digiusb.rb
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
require 'libusb'
|
2
|
+
|
3
|
+
# simple IO-like read/write access to a digispark using the DigiUSB library
|
4
|
+
class DigiUSB
|
5
|
+
ProductID = 0x05df
|
6
|
+
VendorID = 0x16c0
|
7
|
+
Manufacturer = "digistump.com"
|
8
|
+
Timeout = 1_000 # one second till device crashes due to lack of calling DigiUSB.refresh()
|
9
|
+
|
10
|
+
def initialize device
|
11
|
+
@device = device
|
12
|
+
@handle = nil
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.sparks
|
16
|
+
usb = LIBUSB::Context.new
|
17
|
+
usb.devices.select { |device|
|
18
|
+
device.idProduct == ProductID && device.idVendor == VendorID && device.manufacturer == "digistump.com"
|
19
|
+
}.map { |handle|
|
20
|
+
self.new(handle)
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
# read a single character
|
26
|
+
def getc
|
27
|
+
control_transfer(
|
28
|
+
bRequest: 0x01, # hid get report
|
29
|
+
dataIn: 1
|
30
|
+
)
|
31
|
+
end
|
32
|
+
|
33
|
+
# write a single character
|
34
|
+
def putc character
|
35
|
+
character = [character].pack('c') if character.is_a? Integer
|
36
|
+
raise "Cannot putc more than one byte" if character.bytesize > 1
|
37
|
+
raise "Cannot putc fewer than one byte" if character.bytesize < 1
|
38
|
+
|
39
|
+
control_transfer(
|
40
|
+
bRequest: 0x09, # hid set report
|
41
|
+
wIndex: character.ord
|
42
|
+
)
|
43
|
+
end
|
44
|
+
|
45
|
+
# get a string up until the first newline
|
46
|
+
def gets
|
47
|
+
chars = ""
|
48
|
+
chars += getc() until chars.include? "\n"
|
49
|
+
return chars
|
50
|
+
end
|
51
|
+
|
52
|
+
# write a string followed by a newline
|
53
|
+
def puts string = ""
|
54
|
+
write "#{string}\n"
|
55
|
+
end
|
56
|
+
alias_method :println, :puts
|
57
|
+
|
58
|
+
# write a string
|
59
|
+
def write string
|
60
|
+
string.each_byte do |byte|
|
61
|
+
putc byte
|
62
|
+
end
|
63
|
+
string
|
64
|
+
end
|
65
|
+
alias_method :print, :write
|
66
|
+
|
67
|
+
# read a certain number of bytes and return them as a string
|
68
|
+
def read bytes = 1
|
69
|
+
chars = ""
|
70
|
+
chars += getc() until chars.length == bytes
|
71
|
+
return chars
|
72
|
+
end
|
73
|
+
|
74
|
+
def inspect
|
75
|
+
"<Digispark:#{@device.product}:@#{@device.bus_number}->#{@device.device_address}>"
|
76
|
+
end
|
77
|
+
alias_method :to_s, :inspect
|
78
|
+
|
79
|
+
|
80
|
+
|
81
|
+
private
|
82
|
+
|
83
|
+
def io
|
84
|
+
unless @handle
|
85
|
+
@handle = @device.open
|
86
|
+
end
|
87
|
+
|
88
|
+
@handle
|
89
|
+
end
|
90
|
+
|
91
|
+
def control_transfer(opts = {}) #:nodoc:
|
92
|
+
io.control_transfer({
|
93
|
+
wIndex: 0,
|
94
|
+
wValue: 0,
|
95
|
+
bmRequestType: usb_request_type(opts),
|
96
|
+
timeout: Timeout
|
97
|
+
}.merge opts)
|
98
|
+
rescue LIBUSB::ERROR_TIMEOUT, LIBUSB::ERROR_IO
|
99
|
+
raise ErrorCrashed
|
100
|
+
end
|
101
|
+
|
102
|
+
# calculate usb request type
|
103
|
+
def usb_request_type opts #:nodoc:
|
104
|
+
value = LIBUSB::REQUEST_TYPE_CLASS | LIBUSB::RECIPIENT_DEVICE
|
105
|
+
value |= LIBUSB::ENDPOINT_OUT if opts.has_key? :dataOut
|
106
|
+
value |= LIBUSB::ENDPOINT_IN if opts.has_key? :dataIn
|
107
|
+
return value
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
class DigiUSB::ErrorCrashed < StandardError
|
112
|
+
def initialize
|
113
|
+
super("Digispark has crashed, most likely due to not running DigiUSB.refresh() often enough in device program #{$!.class.name}")
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
|
data/license.txt
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Do whatever you like with it!
|
data/readme.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
DigiUSB is a little rubygem for talking to Digisparks using the DigiUSB library provided by Digistump. It works a little bit like a digi-serial port - you can send digi-bytes to it and read digi-bytes out, and includes some common digi-methods like gets, puts, print, and write, so you can use it a bit like an IO. DigiUSB also comes with a little terminal called digiterm, which you can use to sort of telnet in to your sparks!
|
2
|
+
|
3
|
+
Sometimes it's lonely on the internet so I made a virtual friend as an example. You can find it in the examples folder - open jake.ino up in the digispark version of the arduino software and upload it in the usual way. Once that's done pop open your terminal and enter 'digiterm'
|
4
|
+
|
5
|
+
Type in lines like these to play with your new best friend!:->
|
6
|
+
|
7
|
+
Jake! Jake! Good Morning! Whatcha' doin' buddy?
|
8
|
+
What are you meditating about, dude?
|
9
|
+
Haha! Beep! Boop! Boooop! Beep! Boop!
|
10
|
+
Huh! I like it!
|
11
|
+
Weeeeoooooooo!
|
12
|
+
Woooooah! Algebraic!
|
13
|
+
|
14
|
+
Eventually I found myself too busy to play with Jake but I didn't want him to get lonely, so I made a robot to play with him. You can setup your own friend for Jake too! Just create a cron job or alarm or whatever on your computer to run finn.rb from the examples folder however often you want. I chose once per second. You might want to opt for a more frequent interval!
|
15
|
+
|
16
|
+
I hope this all makes sense and is useful to someone.
|
17
|
+
|
18
|
+
As usual, I'm sorry I killed your cat. It was an accident, but I wont accept any liability for that or anything else digiusb might do to you or your beloved friends. What were you doing keeping all those knives in the catroom anyway?!
|
19
|
+
|
20
|
+
—
|
21
|
+
Bluebie
|
metadata
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: digiusb
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Bluebie
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-12-21 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: libusb
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.2.0
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.2.0
|
30
|
+
description: ! "A tiny library for talking to digispark (a small arduino clone) over
|
31
|
+
usb a bit like talking\n to a real arduino through a serial port! This library
|
32
|
+
works with the DigiUSB library built in to Digistump's\n version of the Arduino
|
33
|
+
software. Also includes a tiny terminal tool, kinda like telnet for digisparks"
|
34
|
+
email: a@creativepony.com
|
35
|
+
executables:
|
36
|
+
- digiterm
|
37
|
+
extensions: []
|
38
|
+
extra_rdoc_files: []
|
39
|
+
files:
|
40
|
+
- lib/digiusb.rb
|
41
|
+
- readme.txt
|
42
|
+
- license.txt
|
43
|
+
- examples/finn.rb
|
44
|
+
- !binary |-
|
45
|
+
YmluL2RpZ2l0ZXJt
|
46
|
+
homepage: http://github.com/Bluebie/digiusb.rb
|
47
|
+
licenses: []
|
48
|
+
post_install_message:
|
49
|
+
rdoc_options:
|
50
|
+
- --main
|
51
|
+
- lib/digiusb.rb
|
52
|
+
require_paths:
|
53
|
+
- lib
|
54
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
55
|
+
none: false
|
56
|
+
requirements:
|
57
|
+
- - ! '>='
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '0'
|
60
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
requirements: []
|
67
|
+
rubyforge_project:
|
68
|
+
rubygems_version: 1.8.24
|
69
|
+
signing_key:
|
70
|
+
specification_version: 3
|
71
|
+
summary: a tiny library for talking to digisparks
|
72
|
+
test_files: []
|
73
|
+
has_rdoc:
|