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, / 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, toByteCode, 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 :: UserLED -> (v () Stmt)
137 ledOff :: UserLED -> (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 String
159 instance type2string ()
160 class varName a :: a -> String
162 instance varName Long
163 instance varName Bool
164 instance varName Char
165 instance varName Real
168 class dsl t | arith, boolExpr, sds, assign, seq t
172 class showType2 t :: SV t
173 instance showType2 ()
174 instance showType2 Int
175 instance showType2 Char
176 instance showType2 Bool
179 class showType t | showType2 /*, type*/ t :: (Code t p)
181 instance showType Int
182 instance showType Long
183 instance showType Char
184 instance showType Bool
187 class typeSelector t | showType2, type t :: (Code t p)
188 instance typeSelector Int
189 instance typeSelector Char
190 instance typeSelector Bool
191 instance typeSelector a
193 :: In a b = In infix 0 a b
195 read` :: Int (ReadWrite a) State` -> (a,State`) | dyn a
197 // ----- long ----- //
199 :: Long = L Int // 32 bit on Arduino
208 class long v t :: (v t p) -> v Long Expr | isExpr p
209 instance long Code Int
210 instance long Code Long
211 instance long Eval Int
212 instance long Eval Long
214 // ----- tools ----- //
216 derive gPrint Pin, Button, UserLED, AnalogPin, DigitalPin, PinMode
217 derive class gCons Pin, Button, UserLED, AnalogPin, DigitalPin, PinMode
219 instance == DigitalPin
220 instance == AnalogPin
222 tab =: toString (repeatn tabSize ' ')