some refactoring
authorDavid Blacka <david@blacka.com>
Sun, 23 Oct 2011 14:54:17 +0000 (10:54 -0400)
committerDavid Blacka <david@blacka.com>
Sun, 23 Oct 2011 14:54:17 +0000 (10:54 -0400)
lcd.rb

diff --git a/lcd.rb b/lcd.rb
index a60b9a5..2873b21 100755 (executable)
--- a/lcd.rb
+++ b/lcd.rb
@@ -31,39 +31,43 @@ class LCD
     digits
   end
 
+  def generate_display_row(digits, line)
+    row = ""
+    digits.each do |digit|
+      row << @@display_data[digit][line] << " "
+    end
+    row << "\n"
+  end
+
+  # Given a newline terminated row, scale it both horizontally and
+  # vertically
+  def scale_row(row)
+    result = ""
+    (0..row.length).each do |index|
+      # repeat the middle character of each digit @scale times.  At
+      # scale 1, each char is 3 wide, plus a single space separator
+      next unless row[index]
+      result << (index % 4 == 1 ? row[index] * @scale : row[index])
+    end
+
+    if row =~ /\|/
+      result *= @scale
+    end
+    result
+  end
+
+  # Given a number to display, print it out at scale
   def draw(number)
     # decompose our number into an array of digits
     digits = find_digits(number)
-    
+
+    # construct a series of rows that compose the display
     rows = []
     (0..4).each do |line|
-      row = ""
-      digits.each do |digit|
-        row << @@display_data[digit][line]
-        row << " "
-      end
-      row << "\n"
-      rows << row
-    end
-
-    rows.each do |row|
-      # first widen
-
-      # note, there is probably a better way, but what I want to do is
-      # repeat the character in the middle position of each scale == 1
-      # digit.
-      row2 = ""
-      (0..row.length).each do |index|
-        next unless row[index]
-        row2 << (row[index] * (@scale - 1)) if (index % 4) == 1
-        row2 << row[index]
-      end
-      
-      # then repeat
-      print row2 * (@scale - 1) if row2 =~ /\|/
-      print row2
+      rows << scale_row(generate_display_row(digits, line))
     end
 
+    print rows.join("")
   end
 end
 
@@ -83,6 +87,7 @@ if __FILE__ == $0
   optparse.parse!
 
   display = LCD.new(options[:scale])
-  number = ARGV.shift || 0
+  number  = ARGV.shift || 0
+
   display.draw(number)
 end