class SerialportServer::Application

Attributes

args[R]
channel[R]
recvs[R]
serialport[R]

Public Class Methods

new(argv) click to toggle source
# File lib/serialport-server/application.rb, line 22
def initialize(argv)
  SerialportServer.application = self
  @args = ArgsParser.parse argv do
    arg :bps, 'bit per second', :default => 9600
    arg :bit, 'bit(7-9)', :default => 8
    arg :stopbit, 'stopbit', :default => 1
    arg :parity, 'parity bit', :default => 0
    arg :http_port, 'HTTP port', :alias => :hp, :default => 8783
    arg :websocket_port, 'WebSocket port', :alias => :wp, :default => 8784
    arg :socket_port, 'TCP Socket port', :alias => :sp, :default => 8785
    arg :version, 'show version', :alias => :v
    arg :help, 'show help', :alias => :h

    on :version do
      STDERR.puts "SerialportServer v#{SerialportServer::VERSION}"
      STDERR.puts "http://shokai.github.io/serialport-server"
      exit
    end
  end

  if !@args.first or @args.has_option? :help
    STDERR.puts @args.help
    if RUBY_PLATFORM =~ /mswin|mingw|cygwin|bccwin/
      STDERR.puts "e.g. #{app_name} COM1"
      STDERR.puts "     #{app_name} COM1 -hp 8783 -wp 8784 -sp 8785"
    else
      STDERR.puts "e.g. #{app_name} /dev/tty.your-device"
      STDERR.puts "     #{app_name} /dev/tty.your-device -hp 8783 -wp 8784 -sp 8785"
    end
    exit 1
  end

  begin
    @serialport = SerialPort.new(@args.first,
                                 @args[:bps].to_i,
                                 @args[:bit].to_i,
                                 @args[:stopbit].to_i,
                                 @args[:parity].to_i)
  rescue => e
    STDERR.puts 'cannot open serialport!!'
    STDERR.puts e.to_s
    exit 1
  end

  @recvs = Array.new
  @channel = EM::Channel.new
  @channel.subscribe do |data|
    now = Time.now.to_i*1000+(Time.now.usec/1000.0).round
    @recvs.unshift({:time => now, :data => data})
    while @recvs.size > 100 do
      @recvs.pop
    end
  end
end

Public Instance Methods

app_name() click to toggle source
# File lib/serialport-server/application.rb, line 16
def app_name
  'serialport-server'
end
start() click to toggle source
# File lib/serialport-server/application.rb, line 77
def start
  EM::run do
    EM::start_server("0.0.0.0", @args[:http_port].to_i, SerialportServer::HttpServer)
    puts "start HTTP server - port #{@args[:http_port].to_i}"

    EM::start_server('0.0.0.0', @args[:socket_port].to_i, SerialportServer::SocketServer)
    puts "start TCP Socket server - port #{@args[:socket_port].to_i}"

    EM::WebSocket.start(:host => '0.0.0.0', :port => @args[:websocket_port].to_i) do |ws|
      ws.onopen do
        sid = @channel.subscribe do |mes|
          ws.send mes.to_s
        end
        puts "* new websocket client <#{sid}> connected"
        ws.onmessage do |mes|
          puts "* websocket client <#{sid}> : #{mes}"
          @serialport.puts mes.strip
        end

        ws.onclose do
          @channel.unsubscribe sid
          puts "* websocket client <#{sid}> closed"
        end
      end
    end
    puts "start WebSocket server - port #{@args[:websocket_port].to_i}"

    EM::defer do
      loop do
        data = @serialport.gets.gsub(/[\r\n]/,'') rescue next
        data = data.to_i if data =~ /^\d+$/
        next if !data or data.to_s.empty?
        @channel.push data
        puts data
      end
    end

    EM::defer do
      loop do
        line = STDIN.gets.gsub(/[\r\n]/,'') rescue next
        next if !line or line.to_s.empty?
        @serialport.puts line rescue next
      end
    end

  end
end