content: -------------------------------------------------------------------------------------------------
  -- |
  -- Module      :  System.Hardware.Haskino.Pars.SevenSegmentCodes
  --                Based on System.Hardware.Arduino
  -- Copyright   :  (c) University of Kansas
  --                System.Hardware.Arduino (c) Levent Erkok
  -- License     :  BSD3
  -- Stability   :  experimental
  --
  -- Character to 7-segment display conversion.
  -------------------------------------------------------------------------------------------------
  
  module System.Hardware.Haskino.Parts.SevenSegmentCodes(char2SS) where
  
  import Data.Word (Word8)
  
  -- | Convert a character to a bit-pattern, suitable for display on a seven-segment display. 
  -- Note that most characters are just not representable in a 7-segment display, in which
  -- case we map it to 'Nothing'. However, some substitutions are done, for instance '(' is
  -- displayed the same as '['.
  --
  -- The return value is a 'Word8', although only 7-bits are used; the least significant bit will
  -- always be 0. With the traditional coding, the bits correspond to segments ABCDEFG0, i.e.,
  -- most-significant-bit will be for segment A, next for segment B, and so on.
  char2SS :: Char -> Maybe Word8
  char2SS = (`lookup` tbl)
   where tbl = [ ('"',  0x44), ('\'', 0x40), ('(',  0x9C), (')',  0xF0), ('-',  0x02), ('0',  0xFC), ('1',  0x60), ('2',  0xDA), ('3',  0xF2), ('4',  0x66), ('5',  0xB6)
               , ('6',  0xBE), ('7',  0xE0), ('8',  0xFE), ('9',  0xF6), ('=',  0x12), ('?',  0xCA), ('A',  0xEE), ('B',  0x3E), ('C',  0x9C), ('D',  0x7A), ('E',  0x9E)
               , ('F',  0x8E), ('G',  0xBC), ('H',  0x6E), ('I',  0x60), ('J',  0x78), ('L',  0x1C), ('N',  0x2A), ('O',  0xFC), ('P',  0xCE), ('R',  0x0A), ('S',  0xB6)
               , ('T',  0x1E), ('U',  0x7C), ('Y',  0x76), ('[',  0x9C), (']',  0xF0), ('_',  0x10), ('a',  0xFA), ('b',  0x3E), ('c',  0x1A), ('d',  0x7A), ('e',  0xDE)
               , ('f',  0x8E), ('g',  0xBC), ('h',  0x2E), ('i',  0x20), ('j',  0x78), ('l',  0x1C), ('n',  0x2A), ('o',  0x3A), ('p',  0xCE), ('q',  0xE7), ('r',  0x0A)
               , ('s',  0xB6), ('t',  0x1E), ('u',  0x38), ('y',  0x76), (' ',  0x00)
               ]
  