-------------------------------------------------------------------------------------------------
-- |
-- Module      :  System.Hardware.Arduino.Parts.SevenSegmentCodes
-- Copyright   :  (c) Levent Erkok
-- License     :  BSD3
-- Maintainer  :  erkokl@gmail.com
-- Stability   :  experimental
--
-- Character to 7-segment display conversion.
-------------------------------------------------------------------------------------------------

module System.Hardware.Arduino.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 :: Char -> Maybe Word8
char2SS = (forall a b. Eq a => a -> [(a, b)] -> Maybe b
`lookup` [(Char, Word8)]
tbl)
 where tbl :: [(Char, Word8)]
tbl = [ (Char
'"',  Word8
0x44), (Char
'\'', Word8
0x40), (Char
'(',  Word8
0x9C), (Char
')',  Word8
0xF0), (Char
'-',  Word8
0x02), (Char
'0',  Word8
0xFC), (Char
'1',  Word8
0x60), (Char
'2',  Word8
0xDA), (Char
'3',  Word8
0xF2), (Char
'4',  Word8
0x66), (Char
'5',  Word8
0xB6)
             , (Char
'6',  Word8
0xBE), (Char
'7',  Word8
0xE0), (Char
'8',  Word8
0xFE), (Char
'9',  Word8
0xF6), (Char
'=',  Word8
0x12), (Char
'?',  Word8
0xCA), (Char
'A',  Word8
0xEE), (Char
'B',  Word8
0x3E), (Char
'C',  Word8
0x9C), (Char
'D',  Word8
0x7A), (Char
'E',  Word8
0x9E)
             , (Char
'F',  Word8
0x8E), (Char
'G',  Word8
0xBC), (Char
'H',  Word8
0x6E), (Char
'I',  Word8
0x60), (Char
'J',  Word8
0x78), (Char
'L',  Word8
0x1C), (Char
'N',  Word8
0x2A), (Char
'O',  Word8
0xFC), (Char
'P',  Word8
0xCE), (Char
'R',  Word8
0x0A), (Char
'S',  Word8
0xB6)
             , (Char
'T',  Word8
0x1E), (Char
'U',  Word8
0x7C), (Char
'Y',  Word8
0x76), (Char
'[',  Word8
0x9C), (Char
']',  Word8
0xF0), (Char
'_',  Word8
0x10), (Char
'a',  Word8
0xFA), (Char
'b',  Word8
0x3E), (Char
'c',  Word8
0x1A), (Char
'd',  Word8
0x7A), (Char
'e',  Word8
0xDE)
             , (Char
'f',  Word8
0x8E), (Char
'g',  Word8
0xBC), (Char
'h',  Word8
0x2E), (Char
'i',  Word8
0x20), (Char
'j',  Word8
0x78), (Char
'l',  Word8
0x1C), (Char
'n',  Word8
0x2A), (Char
'o',  Word8
0x3A), (Char
'p',  Word8
0xCE), (Char
'q',  Word8
0xE7), (Char
'r',  Word8
0x0A)
             , (Char
's',  Word8
0xB6), (Char
't',  Word8
0x1E), (Char
'u',  Word8
0x38), (Char
'y',  Word8
0x76), (Char
' ',  Word8
0x00)
             ]