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