packages feed

kansas-lava-cores-0.1.2: tests/RS232.hs

{-# LANGUAGE ScopedTypeVariables, TypeFamilies, FlexibleContexts #-}
module RS232 (tests) where

import Language.KansasLava
import Language.KansasLava.Test
import Hardware.KansasLava.FIFO (fifo)
import Hardware.KansasLava.RS232 (rs232in,rs232out)

import Data.Sized.Unsigned
import Data.Sized.Arith
import Data.Sized.Ix
import Data.Ratio
import System.Random
--import Data.Maybe 
import Debug.Trace
import Data.Word

tests :: TestSeq -> IO ()
tests test = do
        -- testing RS232s

        let clockRate = 50 * 1000
        
        let rs232Test :: Integer -> Rational -> StreamTest U8 U8
            rs232Test baud scale = StreamTest
                        { theStream = 
				  rs232out baud clockRate $$ 
				  forwardP noise $$
				  rs232in baud (floor (toRational clockRate * scale)) $$
				  enabledToAckBox $$
				  fifo (Witness :: Witness X16) low
                        , correctnessCondition = \ ins outs -> 
--                                 trace (show ("cc",length ins,length outs)) $
--                                 trace (show ("ins",map show (take 100 ins))) $
--                                 trace (show ("outs",map show (take 100 outs))) $
                                case () of
                                  () | outs /= take (length outs) ins -> return ("in/out differences: "  
											++ show ins ++ show outs)
                                  () | length outs < count -> return $ "to few transfers (" ++ show (length outs) ++ ")"
                                     | otherwise -> Nothing
			, theStreamTestCount  = count
			, theStreamTestCycles = floor ((fromIntegral clockRate / 4) * (1000 / fromIntegral baud))
                        , theStreamName = "rs232"
                        }
	    count = 20

            noise = id
--		  . fromS 
--		  . toS


        let t :: String -> Integer -> IO ()
            t str baud = sequence_
                [ testStream test (str ++ "/" ++ wib) (rs232Test baud scale)
                | (wib,scale) <- [ ("1",1), ("0.99",0.99), ("1.01",1.01) ]
                ]

        t "100"  100
        t "200"  200
        t "300"  300

	return ()