Merge branch 'master' of gitlab.science:mlubbers/mTask
[mTask.git] / mTask.dcl
1 definition module mTask
2
3 /*
4 Pieter Koopman pieter@cs.ru.nl
5 Final version for TFP2016
6
7 -2: assignment =. suited for digital and analog input and output
8 -3: ad hoc tasks
9
10 todo:
11 move task-loop ti setup()
12 adhoc tasks
13 task combinators
14 imporove setp: >>*.
15 */
16
17 //import iTasks
18 //
19 //import iTasks._Framework.Generic
20 //from iTasks._Framework.Task import :: Task
21 import StdClass
22 import GenEq, StdMisc, StdArray
23
24 import mTaskCode, mTaskSimulation, mTaskInterpret
25 //import mTaskCode, mTaskInterpret
26 import mTaskSerial, mTaskLCD
27
28 // =================== mTask ===================
29
30
31 // ----- dsl definition ----- //
32
33 :: DigitalPin
34 = D0 | D1 | D2 | D3 | D4 | D5 |D6 | D7 | D8 | D9 | D10 | D11 | D12 | D13
35 :: AnalogPin = A0 | A1 | A2 | A3 | A4 | A5
36 :: UserLED = LED1 | LED2 | LED3
37 :: PinMode = INPUT | OUTPUT | INPUT_PULLUP
38 :: Pin = Digital DigitalPin | Analog AnalogPin
39
40 class pin p | type, == p where
41 pin :: p -> Pin
42 instance pin DigitalPin
43 instance pin AnalogPin
44
45 :: Upd = Upd
46 :: Expr = Expr
47 :: Stmt = Stmt
48 :: MTask = MTask Int // String
49
50 class isExpr a :: a -> Int
51 instance isExpr Upd
52 instance isExpr Expr
53
54 class isStmt a :: a -> Int
55 instance isStmt Upd
56 instance isStmt Expr
57 instance isStmt Stmt
58
59 instance == MTask
60
61 :: Main a = {main :: a}
62
63 unMain :: (Main x) -> x
64
65 class arith v where
66 lit :: t -> v t Expr | toCode t & mTaskType t
67 (+.) infixl 6 :: (v t p) (v t q) -> v t Expr | type, +, zero t & isExpr p & isExpr q //& toExpr2 p & toExpr2 q
68 (-.) infixl 6 :: (v t p) (v t q) -> v t Expr | type, -, zero t & isExpr p & isExpr q //& toExpr2 p & toExpr2 q
69 (*.) infixl 7 :: (v t p) (v t q) -> v t Expr | type, *, zero, one t & isExpr p & isExpr q //& toExpr2 p & toExpr2 q
70 (/.) infixl 7 :: (v t p) (v t q) -> v t Expr | type, /, zero t & isExpr p & isExpr q //& toExpr2 p & toExpr2 q
71 class boolExpr v where
72 (&.) infixr 3 :: (v Bool p) (v Bool q) -> v Bool Expr | isExpr p & isExpr q //& toExpr2 p & toExpr2 q
73 (|.) infixr 2 :: (v Bool p) (v Bool q) -> v Bool Expr | isExpr p & isExpr q //& toExpr2 p & toExpr2 q
74 Not :: (v Bool p) -> v Bool Expr | isExpr p //& toExpr2 p
75 (==.) infix 4 :: (v a p) (v a q) -> v Bool Expr | ==, toCode a & isExpr p & isExpr q //& toExpr2 p & toExpr2 q
76 (!=.) infix 4 :: (v a p) (v a q) -> v Bool Expr | ==, toCode a & isExpr p & isExpr q //& toExpr2 p & toExpr2 q
77 (<.) infix 4 :: (v a p) (v a q) -> v Bool Expr | <, Ord, toCode a & isExpr p & isExpr q //& toExpr2 p & toExpr2 q
78 (>.) infix 4 :: (v a p) (v a q) -> v Bool Expr | <, Ord, toCode a & isExpr p & isExpr q //& toExpr2 p & toExpr2 q
79 (<=.) infix 4 :: (v a p) (v a q) -> v Bool Expr | <, Ord, toCode a & isExpr p & isExpr q //& toExpr2 p & toExpr2 q
80 (>=.) infix 4 :: (v a p) (v a q) -> v Bool Expr | <, Ord, toCode a & isExpr p & isExpr q //& toExpr2 p & toExpr2 q
81 // using functional dependencies
82 class If v q r ~s where
83 If :: (v Bool p) (v t q) (v t r) -> v t s | isExpr p & type t
84 class IF v where
85 IF :: (v Bool p) (v t q) (v s r) -> v () Stmt | isExpr p
86 (?) infix 1 :: (v Bool p) (v t q) -> v () Stmt | isExpr p
87 class var2 v where
88 var2 :: t ((v t Upd)->(Main (v c s))) -> (Main (v c s)) | type, toCode t
89 con2 :: t ((v t Expr) ->(Main (v c s))) -> (Main (v c s)) | type t
90 class sds v where
91 sds :: ((v t Upd)->In t (Main (v c s))) -> (Main (v c s)) | type, mTaskType, toCode t
92 con :: ((v t Expr) ->In t (Main (v c s))) -> (Main (v c s)) | type t
93 class sdspub v where
94 pub :: (v t Upd) -> v t Expr | type t
95 class seq v where
96 (>>=.) infixr 0 :: (v t p) ((v t Expr) -> (v u q)) -> (v u Stmt) | type t & type u
97 (:.) infixr 0 :: (v t p) (v u q) -> v u Stmt | type t & type u
98 class retrn v where
99 retrn :: v () Expr
100 class step` v where
101 (>>*.) infixl 1 :: (v t p) ((v t Expr) -> [Step v u]) -> v u Stmt | type t & type u
102 :: Step v t = E.p.q: Cond (v Bool q) (v t p) | E.p: Ever (v t p)
103 class assign v where
104 (=.) infixr 2 :: (v t Upd) (v t p) -> v t Expr | type t & isExpr p
105 class fun v t where
106 fun :: ((t->v s Expr)->In (t->v s p) (Main (v u q))) -> Main (v u q) | type s
107 class mtask v a where
108 task :: (((v delay r) a->v MTask Expr)->In (a->v u p) (Main (v t q))) -> Main (v t q) | type t & type u & isExpr r & long v delay
109 class lag v where
110 lag :: (v delay r) (v t p) -> v MTask Expr | type t & long v delay
111 class setDelay v where
112 setDelay :: (v Long p) (v MTask Expr) -> (v MTask Expr) | isExpr p
113 class mtasks v a b where
114 tasks :: (((v delay r1) a->v MTask Expr, (v delay r2) b->v MTask Expr)->In (a->v t p, b->v u p) (Main (v s q))) -> Main (v s q) | type s & isExpr r1 & isExpr r2 & long v delay
115 class output v where
116 output :: (v t p) -> v () Expr | type t & isExpr p
117 class noOp v where noOp :: v t p
118
119 class pinMode v where
120 pinmode :: p PinMode -> v () Expr | pin p
121 class digitalIO v where
122 digitalRead :: p -> v Bool Expr | pin, readPinD p
123 digitalWrite :: p (v Bool q) -> v Bool Expr | pin, writePinD p
124 class analogIO v where
125 analogRead :: AnalogPin -> v Int Expr
126 analogWrite :: AnalogPin (v Int p) -> v Int Expr
127 class dIO v where
128 dIO :: p -> v Bool Upd | pin, readPinD p
129 class aIO v where
130 aIO :: AnalogPin -> v Int Upd
131 class time v where
132 delay :: (v Long p) -> (v Long Expr)
133 millis :: (v Long Expr)
134
135 class userLed v where
136 ledOn :: (v UserLED q) -> (v () Stmt)
137 ledOff :: (v UserLED q) -> (v () Stmt)
138
139 class pio p t where pio :: p -> v t Upd | aIO v & dIO v
140 instance pio AnalogPin Int
141 instance pio AnalogPin Bool
142 instance pio DigitalPin Bool
143
144 int :: (v Int p) -> (v Int p)
145 bool :: (v Bool p) -> (v Bool p)
146 char :: (v Char p) -> (v Char p)
147
148 class type t | showType, dyn, toCode, ==, type2string, varName t
149 class type2string t :: t -> String
150 instance type2string Int
151 instance type2string Long
152 instance type2string Real
153 instance type2string Bool
154 instance type2string Char
155 instance type2string MTask
156 instance type2string DigitalPin
157 instance type2string AnalogPin
158 instance type2string UserLED
159 instance type2string String
160 instance type2string ()
161 class varName a :: a -> String
162 instance varName Int
163 instance varName Long
164 instance varName Bool
165 instance varName Char
166 instance varName Real
167 instance varName x
168
169 class dsl t | arith, boolExpr, sds, assign, seq t
170
171 :: SV t = SV String
172
173 class showType2 t :: SV t
174 instance showType2 ()
175 instance showType2 Int
176 instance showType2 Char
177 instance showType2 Bool
178 instance showType2 a
179
180 class showType t | showType2 /*, type*/ t :: (Code t p)
181 instance showType ()
182 instance showType Int
183 instance showType Long
184 instance showType Char
185 instance showType Bool
186 instance showType a
187
188 class typeSelector t | showType2, type t :: (Code t p)
189 instance typeSelector Int
190 instance typeSelector Char
191 instance typeSelector Bool
192 instance typeSelector a
193
194 :: In a b = In infix 0 a b
195
196 read` :: Int (ReadWrite a) State` -> (a,State`) | dyn a
197
198 // ----- long ----- //
199
200 :: Long = L Int // 32 bit on Arduino
201 instance + Long
202 instance - Long
203 instance * Long
204 instance / Long
205 instance == Long
206 instance one Long
207 instance zero Long
208
209 class long v t :: (v t p) -> v Long Expr | isExpr p
210 instance long Code Int
211 instance long Code Long
212 instance long Eval Int
213 instance long Eval Long
214
215 // ----- tools ----- //
216
217 instance == DigitalPin
218 instance == AnalogPin
219 instance == UserLED
220
221 tab =: toString (repeatn tabSize ' ')
222 tabSize :== 2
223
224 instance toString ()
225
226 a0 :== pio A0
227 a1 :== pio A1
228 a2 :== pio A2
229 a3 :== pio A3
230 a4 :== pio A4
231 a5 :== pio A5
232
233 d0 :== pio D0
234 d1 :== pio D1
235 d2 :== pio D2
236 d3 :== pio D3
237 d4 :== pio D4
238 d5 :== pio D5
239 d6 :== pio D6
240 d7 :== pio D7
241 d8 :== pio D8
242 d9 :== pio D9
243 d10 :== pio D10
244 d11 :== pio D11
245 d12 :== pio D12
246 d13 :== pio D13