module LcdDigit

Constants

BOTTOM
DIGITS

Digits are represented by simple bit masks. Each bit identifies whether a line should be displayed. The following ASCII graphic shows the mapping from bit position to the belonging line.

=6

5 4

=3

2 1

=0
SPECIAL_DIGITS
VERSION

Public Instance Methods

render(number, size = 2) click to toggle source

method: render @params:

=> number: Digit
=> size:   Integer (Default: 2)

@return: String

# File lib/lcd_digit.rb, line 27
def render(number, size = 2)
  number = number.to_s
  raise(ArgumentError, "Size has to be > 0") unless size > 0
  raise(ArgumentError, "Invalid number") unless number[/\A[\d.-]+\Z/]

  result = number.scan(/./).map do |digit|
            digit(SPECIAL_DIGITS[digit] || digit, size)
          end.transpose.map do |line|
            line.join(" ")
          end.join("\n")

  puts result
  "Cheers :)"
end

Private Instance Methods

digit(digit, size) click to toggle source

method: digit @params:

=> digit: Integer
=> size:  Integer

@return: String

# File lib/lcd_digit.rb, line 84
def digit(digit, size)
  digit = DIGITS[digit.to_i]
  horizontal(digit, size, TOP) +
  vertical(digit, size, TOP_LEFT, TOP_RIGHT) +
  horizontal(digit, size, MIDDLE) +
  vertical(digit, size, BOTTOM_LEFT, BOTTOM_RIGHT) +
  horizontal(digit, size, BOTTOM)
end
horizontal(digit, size, bit) click to toggle source

method: horizontal @params:

=> digit: Integer
=> size:  Integer
=> bit:   Integer

@return: String

# File lib/lcd_digit.rb, line 62
def horizontal(digit, size, bit)
  [" " + line(digit, bit, "-") * size + " "]
end
line(digit, bit, char = "|") click to toggle source

method: line @params:

=> digit: Integer
=> bit:   Integer
=> char:  String (Default: "|")

@return: String

# File lib/lcd_digit.rb, line 51
def line(digit, bit, char = "|")
  (digit & 1 << bit).zero? ? " " : char
end
vertical(digit, size, left_bit, right_bit) click to toggle source

method: vertical @params:

=> digit: Integer
=> size:  Integer
=> left_bit:   Integer
=> right_bit:   Integer

@return: String

# File lib/lcd_digit.rb, line 74
def vertical(digit, size, left_bit, right_bit)
  [line(digit, left_bit) + " " * size + line(digit, right_bit)] * size
end