state0 is zero now
[mTask.git] / mTaskSimulation.dcl
1 definition module mTaskSimulation
2
3 import mTask
4
5 instance zero State
6
7 eval :: (Main (Eval t p)) -> [String] | toString t
8 :: State =
9 { tasks :: [(Int, State->State)]
10 , store :: [Dyn]
11 , dpins :: [(DigitalPin, Bool)]
12 , apins :: [(AnalogPin, Int)]
13 , serial:: [String]
14 , millis:: Int
15 }
16
17 //:: TaskSim :== (Int, State->State)
18 :: Eval t p = E ((ReadWrite t) State -> (t, State))
19 toS2S :: (Eval t p) -> (State->State)
20
21 unEval :: (Eval t p) -> ((ReadWrite t) State -> (t, State))
22
23 :: ReadWrite t = Rd | Wrt t | Updt (t->t)
24
25 (>>==) infixl 1 :: (Eval a p) (a -> Eval b q) -> Eval b r
26 //(>>== ) (E f) g = E \r s. let (a, s2) = f Rd s; (E h) = g a in h Rd s2
27
28 rtrn :: t -> Eval t p
29
30 yield :: t (Eval s p) -> Eval t Expr
31 //yield a (E f) = E (\r s.(\(_,t).(a,t)) (f r s))
32
33 instance arith Eval
34 instance boolExpr Eval
35 instance If Eval p q Expr
36 instance IF Eval
37 instance var2 Eval
38
39 defEval2 :: t ((Eval t p)->Main (Eval u q)) -> (Main (Eval u q)) | dyn t
40 instance sds Eval
41
42 defEval :: ((Eval t p)->In t (Main (Eval u q))) -> (Main (Eval u q)) | dyn t
43 instance fun Eval x | arg x
44 instance mtask Eval x | arg x
45 instance mtasks Eval x y | arg x & arg y
46 instance setDelay Eval
47
48 class toExpr v where toExpr :: (v t p) -> v t Expr
49 instance toExpr Eval
50 instance toExpr Code
51 instance seq Eval
52 instance assign Eval
53 instance output Eval
54 instance pinMode Eval
55 instance digitalIO Eval
56 instance analogIO Eval
57 instance noOp Eval
58
59 class arg x :: x -> Int
60 instance arg ()
61 instance arg (Eval t p) | type t
62 instance arg (Eval t p, Eval u q) | type t & type u
63 instance arg (Eval t p, Eval u q, Eval v r) | type t & type u & type v
64 instance arg (Eval t p, Eval u q, Eval v r, Eval w s) | type t & type u & type v
65
66 instance + String
67
68 readPinA :: AnalogPin [(AnalogPin, Int)] -> Int
69 writePinA :: AnalogPin Int State -> State
70
71 class readPinD p :: p [(DigitalPin,Bool)] [(AnalogPin,Int)] -> Bool
72 instance readPinD DigitalPin
73 instance readPinD AnalogPin
74
75 class writePinD p :: p Bool State -> State
76 instance writePinD DigitalPin
77 instance writePinD AnalogPin
78
79 // ----- Interactive Simulation ----- //
80
81 derive class iTask DigitalPin, AnalogPin, Dyn, StateInterface, DisplayVar, Pin
82
83 simulate :: (Main (Eval a p)) -> Task ()
84 toView :: State -> StateInterface
85 mergeView :: State StateInterface -> State
86 :: StateInterface =
87 { serialOut :: Display [String]
88 , analogPins :: [(AnalogPin, Int)]
89 , digitalPins :: [(DigitalPin, Bool)]
90 , var2iables :: [DisplayVar]
91 , timer :: Int
92 , taskCount :: Display Int
93 }
94
95 toDisplayVar :: Dyn -> DisplayVar
96 fromDisplayVar :: DisplayVar Dyn -> Dyn
97 :: DisplayVar
98 = Variable String
99 | INT Int
100 | LONG Int
101 | Servo Pin Int
102 | LCD16x2 String String
103 | DisplayVar [String]
104
105 step` :: State -> State
106
107 class stringQuotes t | type t :: (Code t p) -> Code t p
108 instance stringQuotes String
109 instance stringQuotes t
110
111 derive toGenDynamic (), MTask, DigitalPin, AnalogPin, Pin, [], Long //, Servo
112 derive fromGenDynamic (), MTask, DigitalPin, AnalogPin, Pin, [], Long //, Servo
113 instance == ()