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