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