definition module mTaskSimulation import mTask from Generics.gdynamic import :: Dyn, class dyn, generic toGenDynamic, generic fromGenDynamic from GenPrint import class PrintOutput, :: PrintState from Data.Maybe import :: Maybe from iTasks import class iTask, generic gEditor, generic gDefault, generic gText, generic JSONEncode, generic JSONDecode, :: Task, :: Editor, :: JSONNode, :: TextFormat :: Display a = Display a derive class iTask Display eval :: (Main (Eval t p)) -> [String] | toString t :: State` = { tasks :: [(Int, State`->State`)] , store :: [Dyn] , dpins :: [(DigitalPin, Bool)] , apins :: [(AnalogPin, Int)] , serial:: [String] , millis:: Int } //:: TaskSim :== (Int, State`->State`) :: Eval t p = E ((ReadWrite t) State` -> (t, State`)) toS2S :: (Eval t p) -> (State`->State`) unEval :: (Eval t p) -> ((ReadWrite t) State` -> (t, State`)) :: ReadWrite t = Rd | Wrt t | Updt (t->t) (>>==) infixl 1 :: (Eval a p) (a -> Eval b q) -> Eval b r //(>>== ) (E f) g = E \r s. let (a, s2) = f Rd s; (E h) = g a in h Rd s2 rtrn :: t -> Eval t p yield :: t (Eval s p) -> Eval t Expr //yield a (E f) = E (\r s.(\(_,t).(a,t)) (f r s)) instance arith Eval instance boolExpr Eval instance If Eval p q Expr instance IF Eval instance var2 Eval defEval2 :: t ((Eval t p)->Main (Eval u q)) -> (Main (Eval u q)) | dyn t instance sds Eval defEval :: ((Eval t p)->In t (Main (Eval u q))) -> (Main (Eval u q)) | dyn t instance fun Eval x | arg x instance mtask Eval x | arg x instance mtasks Eval x y | arg x & arg y instance setDelay Eval class toExpr v where toExpr :: (v t p) -> v t Expr instance toExpr Eval instance toExpr Code instance seq Eval instance assign Eval instance output Eval instance pinMode Eval instance digitalIO Eval instance analogIO Eval instance noOp Eval class arg x :: x -> Int instance arg () instance arg (Eval t p) | type t instance arg (Eval t p, Eval u q) | type t & type u instance arg (Eval t p, Eval u q, Eval v r) | type t & type u & type v instance arg (Eval t p, Eval u q, Eval v r, Eval w s) | type t & type u & type v instance + String readPinA :: AnalogPin [(AnalogPin, Int)] -> Int writePinA :: AnalogPin Int State` -> State` class readPinD p :: p [(DigitalPin,Bool)] [(AnalogPin,Int)] -> Bool instance readPinD DigitalPin instance readPinD AnalogPin class writePinD p :: p Bool State` -> State` instance writePinD DigitalPin instance writePinD AnalogPin // ----- Interactive Simulation ----- // simulate :: (Main (Eval a p)) -> Task () toView :: State` -> StateInterface mergeView :: State` StateInterface -> State` :: StateInterface = { serialOut :: Display [String] , analogPins :: [(AnalogPin, Int)] , digitalPins :: [(DigitalPin, Bool)] , var2iables :: [DisplayVar] , timer :: Int , taskCount :: Display Int } toDisplayVar :: Dyn -> DisplayVar fromDisplayVar :: DisplayVar Dyn -> Dyn :: DisplayVar = Variable String | INT Int | LONG Int | Servo Pin Int | LCD16x2 String String | DisplayVar [String] step` :: State` -> State` class stringQuotes t | type t :: (Code t p) -> Code t p instance stringQuotes String instance stringQuotes t derive toGenDynamic (), MTask, DigitalPin, AnalogPin, Pin, [], Long, UserLED //, Servo derive fromGenDynamic (), MTask, DigitalPin, AnalogPin, Pin, [], Long, UserLED //, Servo instance == ()