class MultiMovingsign::PageRenderer

Renders a page definition (Hash/YAML) into something that is easily displayable by the MovingsignApi (page solution)

Constants

DEFAULT_CHARACTER_WIDTH

Private Class Methods

calculate_width(string) click to toggle source
# File lib/multi_movingsign/page_renderer.rb, line 55
def self.calculate_width(string)
  string.length * DEFAULT_CHARACTER_WIDTH
end

Public Instance Methods

render(page, options = {}) click to toggle source

@param page [Hash] page definition as a Hash @param options [Hash] options for the rendering operation @option options [Integer] :count the number of signs to render to (default: 1)

@return [Hash] a page solution hash

# File lib/multi_movingsign/page_renderer.rb, line 11
def render(page, options = {})
  # Vocabulary - Terms used here
  #
  # Sign
  #     A single LED sign, stacked vertically with other LED signs...together forming a screen
  # Screen
  #     N LED signs stacked vertically.  Together they can display a screen of information at a time
  # Page Definition
  #     A page of information to be broken up and displayed on available signs, consisting of a title and n Line Definitions.
  # Line Definition
  #     A line of information from the page definition.  NOTE: a single line might turn into multiple screens of information
  # Line Segment
  #     A piece of a line definition, displayed on it's own sign, seprate from previous line segments of the same line.
  #

  signs_available = (options[:count] || 1)
  page_title = page['title']
  line_definitions = page['lines']
  pin_title = signs_available > 1

  page_definition = PageDefinition.from_hash page
  page_segments = page_definition.calculate_segments(signs_available)
  screens = page_segments.map { |s| s.calculate_screens(signs_available, screen_width) }.flatten

  ## Preview Solution
  #screens.each do |screen|
  #  puts "----"
  #  (0..(signs_available-1)).each do |i|
  #    puts screen.line(i)
  #  end
  #end
  #puts "----"

  signs = (0..(signs_available-1)).map { |sign_index| {'content' => screens.map { |s| s.line(sign_index) }.join("\n")} }

  {'signs' => signs, 'lines' => screens.length}
end

Private Instance Methods

screen_width() click to toggle source
# File lib/multi_movingsign/page_renderer.rb, line 51
def screen_width
  80
end