class CgminerApiClient::Miner

Attributes

host[RW]
port[RW]
timeout[RW]

Public Class Methods

new(host = nil, port = nil, timeout = nil) click to toggle source
# File lib/cgminer_api_client/miner.rb, line 11
def initialize(host = nil, port = nil, timeout = nil)
  @host    = host    ? host    : CgminerApiClient.default_host
  @port    = port    ? port    : CgminerApiClient.default_port
  @timeout = timeout ? timeout : CgminerApiClient.default_timeout
end

Public Instance Methods

available?(force_reload = false) click to toggle source
# File lib/cgminer_api_client/miner.rb, line 32
def available?(force_reload = false)
  @available = nil if force_reload

  @available ||= begin
    open_socket(@host, @port, @timeout).close
    true
  rescue
    false
  end
end
method_missing(name, *args) click to toggle source
# File lib/cgminer_api_client/miner.rb, line 43
def method_missing(name, *args)
  query(name, *args)
end
query(method, *params) click to toggle source
# File lib/cgminer_api_client/miner.rb, line 17
def query(method, *params)
  if available?
    request = {command: method}

    unless params.length == 0
      params = params.map { |p| p.to_s.gsub('\\', '\\\\').gsub(',', '\,') }
      request[:parameter] = params.join(',')
    end

    response = perform_request(request)
    data = sanitized(response)
    method.to_s.match('\+') ? data : data[method.to_sym]
  end
end

Private Instance Methods

check_status(data) click to toggle source
# File lib/cgminer_api_client/miner.rb, line 76
def check_status(data)
  status =   data['STATUS'][0]
  sc     = status['STATUS']
  c      = status['Code']
  msg    = status['Msg']

  case sc
    when 'S'
    when 'I'
      puts "Info from API [#{c}]: #{msg}"
    when 'W'
      puts "Warning from API [#{c}]: #{msg}"
    else
      raise "#{c}: #{msg}"
  end
end
perform_request(request) click to toggle source
# File lib/cgminer_api_client/miner.rb, line 49
def perform_request(request)
  begin
    s = open_socket(@host, @port, @timeout)
  rescue
    raise "Connection to #{@host}:#{@port} failed"
  end

  s.write(request.to_json)
  response = s.read.strip.chars.map { |c| c.ord >= 32 ? c : "\\u#{'%04x' % c.ord}" }.join
  s.close

  response.gsub! '}{', '}, {'
  response.gsub! '[,{', '[ {'

  data = JSON.parse(response)

  if request[:command].to_s.match('\+')
    data.each_pair do |command, response|
      check_status(response.first) if response.respond_to?(:first)
    end
  else
    check_status(data)
  end

  return data
end
sanitized(data) click to toggle source
# File lib/cgminer_api_client/miner.rb, line 93
def sanitized(data)
  if data.is_a?(Hash)
    data.inject({}) { |n, (k, v)| n[k.to_s.downcase.tr(' ', '_').to_sym] = sanitized(v); n }
  elsif data.is_a?(Array)
    data.map { |v| sanitized(v) }
  else
    data
  end
end