{-# LANGUAGE RecordWildCards #-}
module Hardware.KansasLava.VGA
       ( VGA(..), RawVGA(..)
       , encodeVGA
       ) where

import Language.KansasLava
import Language.KansasLava.Signal.Utils
import Data.Sized.Matrix as Matrix
import Data.Sized.Unsigned as Unsigned

data VGA clk r g b =
    VGA{ vgaR :: Signal clk (Enabled r)
       , vgaG :: Signal clk (Enabled g)
       , vgaB :: Signal clk (Enabled b)
       , vgaVSync, vgaHSync :: Signal clk Bool
       }

data RawVGA clk r g b =
    RawVGA{ vgaRawR :: Matrix r (Signal clk Bool)
          , vgaRawG :: Matrix g (Signal clk Bool)
          , vgaRawB :: Matrix b (Signal clk Bool)
          , vgaRawVSync, vgaRawHSync :: Signal clk Bool
          }

encodeVGA :: (Size r, Size g, Size b)
          => VGA clk (Unsigned r) (Unsigned g) (Unsigned b)
          -> RawVGA clk r g b
encodeVGA VGA{..} = RawVGA{..}
  where
    vgaRawR = toColors vgaR
    vgaRawG = toColors vgaG
    vgaRawB = toColors vgaB

    vgaRawVSync = vgaVSync
    vgaRawHSync = vgaHSync

    toColors c = fmap (isEnabled c .&&.) $ fromUnsigned (enabledVal c)