lorraine 0.0.5 → 0.0.6

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.
@@ -15,7 +15,7 @@ module Lorraine
15
15
  end
16
16
 
17
17
  desc "server <command>", "install one of the available apps"
18
- method_option :port, type: :numeric, aliases: "-p", desc: "Port this server will be at.", default: 1964
18
+ method_option :port, type: :numeric, aliases: "-p", desc: "Port this server will be at.", default: 3010
19
19
  def server(command)
20
20
  puts "command: #{command}, options: #{options}"
21
21
  if command.to_sym == :start
@@ -26,47 +26,39 @@ module Lorraine
26
26
  desc "set <pixel> <r> <g> <b>", "light up a pixel. rgb values from 0.0 - 1.0"
27
27
  method_option :remote, type: :boolean, aliases: "-r", desc: "Set the pixel over the network.", default: false
28
28
  method_option :hostname, type: :string, aliases: "-h", desc: "Network hostname.", default: "localhost"
29
- method_option :port, type: :numeric, aliases: "-h", desc: "Network port.", default: 1964
29
+ method_option :port, type: :numeric, aliases: "-h", desc: "Network port.", default: 3010
30
30
  def set(pixel, r, g, b)
31
+ c = open_connection(options)
31
32
  m = message_from_console_array [pixel, r, g, b]
32
- if options[:remote]
33
- Lorraine::Client.send_message(m, options[:hostname], options[:port])
34
- else
35
- c = Lorraine::Connection.new
36
- puts "Waiting 5 seconds..."
37
- sleep 5
38
- c.write_message(m)
39
- c.write_message Lorraine::Message.new(:refresh)
40
- end
33
+ c.write_message m
34
+ c.write_message Lorraine::Message.new(:refresh)
41
35
  end
42
36
 
43
37
  map "i" => :interactive
44
38
  desc "interactive", "Interact directly with the connection"
45
39
  method_option :remote, type: :boolean, aliases: "-r", desc: "Interact over the network.", default: false
46
40
  method_option :hostname, type: :string, aliases: "-h", desc: "Network hostname.", default: "localhost"
47
- method_option :port, type: :numeric, aliases: "-h", desc: "Network port.", default: 1964
41
+ method_option :port, type: :numeric, aliases: "-h", desc: "Network port.", default: 3010
48
42
  def interactive
49
- c = nil
50
- if options[:remote]
51
- say "Let's do this through the ether...", :blue
52
- else
53
- say "Opening a connection to the LED monstrosity...", :yellow
54
- c = Lorraine::Connection.new
55
- sleep 5
56
- say "... opened.", :green
57
- end
43
+ c = open_connection(options)
58
44
  while true
59
45
  response = ask(">> ")
60
46
  if response == "exit"
61
47
  break
62
- else
63
- m = message_from_console_array(response.split(" "))
64
- if options[:remote]
65
- Lorraine::Client.send_message(m, options[:hostname], options[:port])
48
+ elsif response.include?("effect")
49
+ if response.include?("off")
50
+ c.write_message Lorraine::Message.new(:effect, 0)
66
51
  else
67
- c.write_message m
68
- c.write_message Lorraine::Message.new(:refresh)
52
+ c.write_message Lorraine::Message.new(:effect, response.split(" ")[1].to_i)
69
53
  end
54
+ elsif response == "defcon"
55
+ defcon = Lorraine::Image.new(5, 1)
56
+ defcon.rgb_pixels = [[1, 0, 0], [1, 0.2, 0], [1, 1, 0], [0, 0, 1], [0, 1, 0]]
57
+ c.display_image defcon
58
+ else
59
+ m = message_from_console_array(response.split(" "))
60
+ c.write_message m
61
+ c.write_message Lorraine::Message.new(:refresh)
70
62
  end
71
63
  end
72
64
  end
@@ -81,6 +73,22 @@ module Lorraine
81
73
  end
82
74
 
83
75
  private
76
+
77
+ def open_connection(options)
78
+ c = nil
79
+ if options[:remote]
80
+ say "Opening a connection through the matrix...", :green
81
+ c = Lorraine::NetworkConnection.new
82
+ c.port = options[:port]
83
+ c.hostname = options[:hostname]
84
+ else
85
+ say "Opening a connection to the LED monstrosity...", :yellow
86
+ c = Lorraine::SerialConnection.new
87
+ sleep 5
88
+ say "... and now it's open!", :green
89
+ end
90
+ c
91
+ end
84
92
 
85
93
  def message_from_console_array(arr)
86
94
  Lorraine::Message.new :set_pixel, arr[0].to_i, (arr[1].to_f * 4095).to_i, (arr[2].to_f * 4095).to_i, (arr[3].to_f * 4095).to_i
@@ -2,41 +2,11 @@ module Lorraine
2
2
 
3
3
  class Connection
4
4
 
5
- require "serialport"
6
-
7
- attr_accessor :port
8
-
9
- def initialize(port = Lorraine::Connection.first_available_port)
10
-
11
- #simplest ruby program to read from arduino serial,
12
- #using the SerialPort gem
13
- #(http://rubygems.org/gems/serialport)
14
-
15
-
16
- #params for serial port
17
- port_str = port # may be different for you
18
- baud_rate = 115200
19
- # data_bits = 8
20
- # stop_bits = 1
21
- # parity = SerialPort::NONE
22
-
23
- self.port = SerialPort.new port_str, baud_rate#, data_bits, stop_bits, parity
24
-
25
- end
26
-
27
- def self.first_available_port
28
- p = Dir.glob("/dev/tty.usb*").first
29
- raise "No available ports." unless p
30
- p
5
+ def initialize
31
6
  end
32
-
33
- def write_binary_string(binary_string)
34
- self.port.write binary_string
35
- end
36
-
7
+
37
8
  def write_message(msg)
38
- puts "Writing message: #{msg}"
39
- write_binary_string msg.to_binary
9
+ puts "Writing message unimplemented."
40
10
  end
41
11
 
42
12
  def display_pixels(pixel_array)
@@ -66,16 +36,10 @@ module Lorraine
66
36
  end
67
37
  end
68
38
 
69
- def read_line
70
- m = self.port.gets
71
- puts "Lorraine::Connection Message: #{m}"
72
- m
73
- end
74
-
75
39
  def sever!
76
- self.port.close # see note 1
40
+
77
41
  end
78
-
42
+
79
43
  end
80
44
 
81
45
  end
@@ -34,7 +34,7 @@ module Lorraine
34
34
  attr_accessor :command
35
35
  attr_accessor :pixel
36
36
 
37
- COMMAND_IDS = {set_pixel: 1, refresh: 2}
37
+ COMMAND_IDS = {set_pixel: 1, refresh: 2, effect: 3}
38
38
 
39
39
  def command_id
40
40
  COMMAND_IDS[self.command]
@@ -0,0 +1,22 @@
1
+ module Lorraine
2
+
3
+ class NetworkConnection < Lorraine::Connection
4
+
5
+ attr_writer :hostname
6
+ def hostname
7
+ @hostname || "localhost"
8
+ end
9
+
10
+ attr_writer :port
11
+ def port
12
+ @port || "3010"
13
+ end
14
+
15
+ def write_message(msg)
16
+ Lorraine::Client.send_message(msg, self.hostname, self.port)
17
+ puts "Writing network message: #{msg}"
18
+ end
19
+
20
+ end
21
+
22
+ end
@@ -0,0 +1,56 @@
1
+ module Lorraine
2
+
3
+ class SerialConnection < Lorraine::Connection
4
+
5
+ require "serialport"
6
+
7
+ attr_accessor :port
8
+
9
+ def initialize
10
+ super
11
+
12
+ #simplest ruby program to read from arduino serial,
13
+ #using the SerialPort gem
14
+ #(http://rubygems.org/gems/serialport)
15
+
16
+
17
+ #params for serial port
18
+ # port_str = port # may be different for you
19
+ baud_rate = 115200
20
+ # data_bits = 8
21
+ # stop_bits = 1
22
+ # parity = SerialPort::NONE
23
+
24
+ self.port = SerialPort.new Lorraine::SerialConnection.first_available_port, baud_rate#, data_bits, stop_bits, parity
25
+
26
+ end
27
+
28
+ def self.first_available_port
29
+ p = Dir.glob("/dev/tty.usb*").first
30
+ raise "No available ports." unless p
31
+ p
32
+ end
33
+
34
+ def write_binary_string(binary_string)
35
+ self.port.write binary_string
36
+ end
37
+
38
+ def write_message(msg)
39
+ puts "Writing serial message: #{msg}"
40
+ write_binary_string msg.to_binary
41
+ end
42
+
43
+ def read_line
44
+ m = self.port.gets
45
+ puts "Lorraine::SerialConnection Message: #{m}"
46
+ m
47
+ end
48
+
49
+ def sever!
50
+ super
51
+ self.port.close
52
+ end
53
+
54
+ end
55
+
56
+ end
@@ -6,17 +6,32 @@ module Lorraine
6
6
  require 'thin'
7
7
 
8
8
  def self.start(port)
9
- serial_connection = Lorraine::Connection.new
9
+ begin
10
+ serial_connection = Lorraine::SerialConnection.new
11
+ rescue
12
+ "Failed to start serial connection."
13
+ end
10
14
  Thin::Server.start('0.0.0.0', port) do
15
+
16
+ map "/admin" do
17
+ files = File.expand_path(File.join(__FILE__, "..", "..", "..", "web"))
18
+ puts "serving files from #{files}"
19
+ run Rack::File.new(files)
20
+ end
21
+
11
22
  Faye::WebSocket.load_adapter('thin')
12
23
  faye_server = Faye::RackAdapter.new(:mount => '/faye', :timeout => 45)
13
24
  faye_server.bind(:publish) do |client_id, channel, data|
14
- # Process incoming things
15
- puts "Received message data: #{data}"
16
- m = Lorraine::Message.from_packet(data)
17
- puts "Interpereted as: #{m}"
18
- serial_connection.write_message(m)
19
- serial_connection.write_message Lorraine::Message.new(:refresh)
25
+ begin
26
+ # Process incoming things
27
+ puts "Received message data: #{data}"
28
+ m = Lorraine::Message.from_packet(data)
29
+ puts "Interpereted as: #{m}"
30
+ serial_connection.write_message(m)
31
+ # serial_connection.write_message Lorraine::Message.new(:refresh)
32
+ rescue
33
+ puts "Failed to read data."
34
+ end
20
35
  end
21
36
  run faye_server
22
37
  end
@@ -29,7 +44,7 @@ module Lorraine
29
44
  require 'json'
30
45
  require 'httpclient'
31
46
 
32
- def self.send_message(message, address = "localhost", port = "1964")
47
+ def self.send_message(message, address = "localhost", port = "3010")
33
48
 
34
49
  faye_json = {channel: "/illuminate", data: message.packet}.to_json
35
50
 
@@ -1,3 +1,3 @@
1
1
  module Lorraine
2
- VERSION = "0.0.5"
2
+ VERSION = "0.0.6"
3
3
  end
data/lib/lorraine.rb CHANGED
@@ -1,6 +1,8 @@
1
1
  require "lorraine/version"
2
2
  require "lorraine/message"
3
3
  require "lorraine/connection"
4
+ require "lorraine/serial_connection"
5
+ require "lorraine/network_connection"
4
6
  require "lorraine/image"
5
7
  require "lorraine/server"
6
8
  require_relative "../vendor/colorist/colorist"
data/web/index.html ADDED
@@ -0,0 +1,15 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Lorraine - on the nets</title>
5
+ <link href="lorraine.css" media="screen" rel="stylesheet" type="text/css" />
6
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js" type="text/javascript"></script>
7
+ <script src="/faye.js" type="text/javascript"></script>
8
+ <script src="lorraine.js" type="text/javascript"></script>
9
+ <script src="vendor/jscolor/jscolor.js" type="text/javascript"></script>
10
+ </head>
11
+ <body>
12
+ <h1>Hey Howdy Hey</h1>
13
+ Color: <input class="color {onImmediateChange:'colorChanged(this);'}" value="66ff00">
14
+ </body>
15
+ </html>
data/web/lorraine.css ADDED
File without changes
data/web/lorraine.js ADDED
@@ -0,0 +1,55 @@
1
+ $(function(){
2
+
3
+ // Find the host
4
+ //var pathArray = window.location.pathname.split( '/' );
5
+ var host = getBaseURL() //pathArray[0]; // + "/";
6
+
7
+ // alert(host);
8
+
9
+ window.faye_client = new Faye.Client(host + "faye");
10
+
11
+ window.faye_client.subscribe('/messages', function(message) {
12
+ alert('Got a message: ' + message.text);
13
+ });
14
+
15
+ });
16
+
17
+ function illuminatePixel(pixel, r, g, b) {
18
+ window.faye_client.publish('/illuminate', [1, pixel, r * 4095, g * 4095, b * 4095]);
19
+ }
20
+
21
+ function illuminateAll(r, g, b) {
22
+ illuminatePixel(0, r, g, b);
23
+ illuminatePixel(1, r, g, b);
24
+ illuminatePixel(2, r, g, b);
25
+ illuminatePixel(3, r, g, b);
26
+ illuminatePixel(4, r, g, b);
27
+ }
28
+
29
+
30
+ function colorChanged(color) {
31
+ illuminateAll(color.rgb[0], color.rgb[1], color.rgb[2])
32
+ }
33
+
34
+
35
+ function getBaseURL() {
36
+ var url = location.href; // entire url including querystring - also: window.location.href;
37
+ var baseURL = url.substring(0, url.indexOf('/', 14));
38
+
39
+
40
+ if (baseURL.indexOf('http://localhost') != -1) {
41
+ // Base Url for localhost
42
+ var url = location.href; // window.location.href;
43
+ var pathname = location.pathname; // window.location.pathname;
44
+ var index1 = url.indexOf(pathname);
45
+ var index2 = url.indexOf("/", index1 + 1);
46
+ var baseLocalUrl = url.substr(0, index2);
47
+
48
+ return baseLocalUrl + "/";
49
+ }
50
+ else {
51
+ // Root Url for domain name
52
+ return baseURL + "/";
53
+ }
54
+
55
+ }
Binary file
Binary file
@@ -0,0 +1,12 @@
1
+ <html>
2
+ <head>
3
+ <title>jscolor demo</title>
4
+ </head>
5
+ <body>
6
+
7
+ <script type="text/javascript" src="jscolor.js"></script>
8
+
9
+ Click here: <input class="color" value="66ff00">
10
+
11
+ </body>
12
+ </html>
Binary file
Binary file