module OlympusCamera::CommandsParser

Public Instance Methods

append_queries_walk_node(queries, nodes, n = 1) click to toggle source
# File lib/olympus-camera/commands_parser.rb, line 62
def append_queries_walk_node(queries, nodes, n = 1)
  q = nodes.map do |node|
    commands = node["cmd#{n}"]
    commands_1 = node["cmd#{n + 1}"]
    name = node["name"]
    if commands
      if queries.length % 2 == 1 && !name
        queries = queries + [ANY]
      end
      appended = append_queries_walk_node(name ? queries + [name] : queries, commands, n)
      if commands_1
        # for
        # <param1 name="startmovietake">
        #  <cmd2 name="limitter"/>
        #  <cmd3 name="liveview">
        #   <param3 name="on"/>
        #  </cmd3>
        # </param1
        target = node.clone
        target.delete("cmd#{n}")
        target.delete("name")
        appended = (appended + append_queries_walk_node([], [target], n + 1)).flatten
      end
      appended
    elsif commands_1
      appended = append_queries_walk_node([], commands_1, n)
      queries + [name, ANY] + appended.flatten
    else
      params = node["param#{n}"]
      if params && name
        append_queries_walk_node(
          queries + [name], params, n + 1
        )
      elsif name
        if queries.length % 2 == 0
          queries + [name, ANY]
        else
          queries + [name]
        end
      elsif params
      else
        nil
      end
    end
  end.select { |a| a }
  tail_array(q)
end
get_pair_queries(root) click to toggle source
# File lib/olympus-camera/commands_parser.rb, line 55
def get_pair_queries(root)
  qs = append_queries_walk_node([], [root])
  qs.map { |q|
    Array.new((q.length / 2).floor).map { [q.shift, q.shift] }
  }
end
normalize_cgi_commands(cgi_commands) click to toggle source
# File lib/olympus-camera/commands_parser.rb, line 20
def normalize_cgi_commands(cgi_commands)
  commands = {}
  cgi_commands.each do |data|
    name = data["name"].to_sym
    http_method = data["http_method"] && data["http_method"][0]
    if http_method
      method = http_method["type"].to_sym
      queries = get_pair_queries(http_method)

      commands[name] = {
        method: method,
        queries: queries,
      }
    else
      # e-m1-mark2.xml: cancel_trimresize
      commands[name] = {
        method: :get,
        queries: [],
      }
    end
  end
  commands
end
parse(xml) click to toggle source
# File lib/olympus-camera/commands_parser.rb, line 8
def parse(xml)
  raw_commands = XmlSimple.xml_in xml
  api_version = raw_commands["version"][0]
  support_funcs = raw_commands["support"].map { |v| v["func"] }
  commands = normalize_cgi_commands raw_commands["cgi"]
  {
    api_version: api_version,
    support_funcs: support_funcs,
    commands: commands,
  }
end
tail_array(array, r = []) click to toggle source
# File lib/olympus-camera/commands_parser.rb, line 44
def tail_array(array, r = [])
  array.each { |a|
    if a[0] && a[0].kind_of?(Array)
      tail_array a, r
    else
      r << a
    end
  }
  r
end