1 definition module mTask
4 Pieter Koopman pieter@cs.ru.nl
5 Final version for TFP2016
7 -2: assignment =. suited for digital and analog input and output
11 move task-loop ti setup()
19 import Generics.gdynamic
23 //import iTasks._Framework.Generic
24 //from iTasks._Framework.Task import :: Task
26 import GenEq, StdMisc, StdArray
28 import mTaskCode, mTaskSimulation, mTaskInterpret
29 import mTaskSerial, mTaskLCD
31 // =================== mTask ===================
34 // ----- dsl definition ----- //
37 = D0 | D1 | D2 | D3 | D4 | D5 |D6 | D7 | D8 | D9 | D10 | D11 | D12 | D13
38 :: AnalogPin = A0 | A1 | A2 | A3 | A4 | A5
39 :: UserLED = LED1 | LED2 | LED3
40 :: PinMode = INPUT | OUTPUT | INPUT_PULLUP
41 :: Pin = Digital DigitalPin | Analog AnalogPin
43 class pin p | type, == p where
45 instance pin DigitalPin
46 instance pin AnalogPin
51 :: MTask = MTask Int // String
53 class isExpr a :: a -> Int
57 class isStmt a :: a -> Int
64 :: Main a = {main :: a}
66 unMain :: (Main x) -> x
69 lit :: t -> v t Expr | toCode t & toByteCode t
70 (+.) infixl 6 :: (v t p) (v t q) -> v t Expr | type, +, zero t & isExpr p & isExpr q //& toExpr2 p & toExpr2 q
71 (-.) infixl 6 :: (v t p) (v t q) -> v t Expr | type, -, zero t & isExpr p & isExpr q //& toExpr2 p & toExpr2 q
72 (*.) infixl 7 :: (v t p) (v t q) -> v t Expr | type, *, zero, one t & isExpr p & isExpr q //& toExpr2 p & toExpr2 q
73 (/.) infixl 7 :: (v t p) (v t q) -> v t Expr | type, /, zero t & isExpr p & isExpr q //& toExpr2 p & toExpr2 q
74 class boolExpr v where
75 (&.) infixr 3 :: (v Bool p) (v Bool q) -> v Bool Expr | isExpr p & isExpr q //& toExpr2 p & toExpr2 q
76 (|.) infixr 2 :: (v Bool p) (v Bool q) -> v Bool Expr | isExpr p & isExpr q //& toExpr2 p & toExpr2 q
77 Not :: (v Bool p) -> v Bool Expr | isExpr p //& toExpr2 p
78 (==.) infix 4 :: (v a p) (v a q) -> v Bool Expr | ==, toCode a & isExpr p & isExpr q //& toExpr2 p & toExpr2 q
79 (!=.) infix 4 :: (v a p) (v a q) -> v Bool Expr | ==, 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 (>.) infix 4 :: (v a p) (v a q) -> v Bool Expr | <, Ord, toCode a & isExpr p & isExpr q //& toExpr2 p & toExpr2 q
82 (<=.) infix 4 :: (v a p) (v a q) -> v Bool Expr | <, Ord, toCode a & isExpr p & isExpr q //& toExpr2 p & toExpr2 q
83 (>=.) infix 4 :: (v a p) (v a q) -> v Bool Expr | <, Ord, toCode a & isExpr p & isExpr q //& toExpr2 p & toExpr2 q
84 // using functional dependencies
85 class If v q r ~s where
86 If :: (v Bool p) (v t q) (v t r) -> v t s | isExpr p & type t
88 IF :: (v Bool p) (v t q) (v s r) -> v () Stmt | isExpr p
89 (?) infix 1 :: (v Bool p) (v t q) -> v () Stmt | isExpr p
91 var2 :: t ((v t Upd)->(Main (v c s))) -> (Main (v c s)) | type, toCode t
92 con2 :: t ((v t Expr) ->(Main (v c s))) -> (Main (v c s)) | type t
94 sds :: ((v t Upd)->In t (Main (v c s))) -> (Main (v c s)) | type, mTaskType, toCode t
95 con :: ((v t Expr) ->In t (Main (v c s))) -> (Main (v c s)) | type t
96 pub :: (v t Upd) -> v t Expr | type t
98 (>>=.) infixr 0 :: (v t p) ((v t Expr) -> (v u q)) -> (v u Stmt) | type t & type u
99 (:.) infixr 0 :: (v t p) (v u q) -> v u Stmt | type t & type u
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)
104 (=.) infixr 2 :: (v t Upd) (v t p) -> v t Expr | type t & isExpr p
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
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
116 output :: (v t p) -> v () Expr | type t & isExpr p
117 class noOp v where noOp :: v t p
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
128 dIO :: p -> v Bool Upd | pin, readPinD p
130 aIO :: AnalogPin -> v Int Upd
132 delay :: (v Long p) -> (v Long Expr)
133 millis :: (v Long Expr)
135 class userLed v where
136 ledOn :: (v UserLED q) -> (v () Stmt)
137 ledOff :: (v UserLED q) -> (v () Stmt)
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
144 int :: (v Int p) -> (v Int p)
145 bool :: (v Bool p) -> (v Bool p)
146 char :: (v Char p) -> (v Char p)
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
163 instance varName Long
164 instance varName Bool
165 instance varName Char
166 instance varName Real
169 class dsl t | arith, boolExpr, sds, assign, seq t
173 class showType2 t :: SV t
174 instance showType2 ()
175 instance showType2 Int
176 instance showType2 Char
177 instance showType2 Bool
180 class showType t | showType2 /*, type*/ t :: (Code t p)
182 instance showType Int
183 instance showType Long
184 instance showType Char
185 instance showType Bool
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
194 :: In a b = In infix 0 a b
196 read` :: Int (ReadWrite a) State` -> (a,State`) | dyn a
198 // ----- long ----- //
200 :: Long = L Int // 32 bit on Arduino
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
215 // ----- tools ----- //
217 derive gPrint Pin, Button, UserLED, AnalogPin, DigitalPin, PinMode
218 derive class gCons Pin, Button, UserLED, AnalogPin, DigitalPin, PinMode
220 instance == DigitalPin
221 instance == AnalogPin
224 tab =: toString (repeatn tabSize ' ')