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 iTasks._Framework.Generic
20 from iTasks._Framework.Task import :: Task
22 import gdynamic, gCons, GenEq, StdMisc, StdArray
24 import mTaskCode, mTaskSimulation, mTaskInterpret
25 import mTaskSerial, mTaskLCD
27 // =================== mTask ===================
30 // ----- dsl definition ----- //
33 = D0 | D1 | D2 | D3 | D4 | D5 |D6 | D7 | D8 | D9 | D10 | D11 | D12 | D13
34 :: AnalogPin = A0 | A1 | A2 | A3 | A4 | A5
35 :: PinMode = INPUT | OUTPUT | INPUT_PULLUP
36 :: Pin = Digital DigitalPin | Analog AnalogPin
38 class pin p | type, == p where
40 instance pin DigitalPin
41 instance pin AnalogPin
46 :: MTask = MTask Int // String
48 class isExpr a :: a -> Int
52 class isStmt a :: a -> Int
59 :: Main a = {main :: a}
61 unMain :: (Main x) -> x
64 lit :: t -> v t Expr | toCode t & toByteCode t
65 (+.) infixl 6 :: (v t p) (v t q) -> v t Expr | type, +, zero t & isExpr p & isExpr q //& toExpr2 p & toExpr2 q
66 (-.) infixl 6 :: (v t p) (v t q) -> v t Expr | type, -, zero t & isExpr p & isExpr q //& toExpr2 p & toExpr2 q
67 (*.) infixl 7 :: (v t p) (v t q) -> v t Expr | type, *, zero, one t & isExpr p & isExpr q //& toExpr2 p & toExpr2 q
68 (/.) infixl 7 :: (v t p) (v t q) -> v t Expr | type, / t & isExpr p & isExpr q //& toExpr2 p & toExpr2 q
69 class boolExpr v where
70 (&.) infixr 3 :: (v Bool p) (v Bool q) -> v Bool Expr | isExpr p & isExpr q //& toExpr2 p & toExpr2 q
71 (|.) infixr 2 :: (v Bool p) (v Bool q) -> v Bool Expr | isExpr p & isExpr q //& toExpr2 p & toExpr2 q
72 Not :: (v Bool p) -> v Bool Expr | isExpr p //& toExpr2 p
73 (==.) infix 4 :: (v a p) (v a q) -> v Bool Expr | ==, toCode a & isExpr p & isExpr q //& toExpr2 p & toExpr2 q
74 (!=.) infix 4 :: (v a p) (v a q) -> v Bool Expr | ==, toCode a & isExpr p & isExpr q //& toExpr2 p & toExpr2 q
75 (<.) infix 4 :: (v a p) (v a q) -> v Bool Expr | <, Ord, toCode a & isExpr p & isExpr q //& toExpr2 p & toExpr2 q
76 (>.) infix 4 :: (v a p) (v a q) -> v Bool Expr | <, Ord, 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 // using functional dependencies
80 class If v q r ~s where
81 If :: (v Bool p) (v t q) (v t r) -> v t s | isExpr p & type t
83 IF :: (v Bool p) (v t q) (v s r) -> v () Stmt | isExpr p
84 (?) infix 1 :: (v Bool p) (v t q) -> v () Stmt | isExpr p
86 var2 :: t ((v t Upd)->(Main (v c s))) -> (Main (v c s)) | type, toCode t
87 con2 :: t ((v t Expr) ->(Main (v c s))) -> (Main (v c s)) | type t
89 sds :: ((v t Upd)->In t (Main (v c s))) -> (Main (v c s)) | type, toByteCode, toCode t
90 con :: ((v t Expr) ->In t (Main (v c s))) -> (Main (v c s)) | type t
92 (>>=.) infixr 0 :: (v t p) ((v t Expr) -> (v u q)) -> (v u Stmt) | type t & type u
93 (:.) infixr 0 :: (v t p) (v u q) -> v u Stmt | type t & type u
95 (>>*.) infixl 1 :: (v t p) ((v t Expr) -> [Step v u]) -> v u Stmt | type t & type u
96 :: Step v t = E.p.q: Cond (v Bool q) (v t p) | E.p: Ever (v t p)
98 (=.) infixr 2 :: (v t Upd) (v t p) -> v t Expr | type t & isExpr p
100 fun :: ((t->v s Expr)->In (t->v s p) (Main (v u q))) -> Main (v u q) | type s
101 class mtask v a where
102 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
104 lag :: (v delay r) (v t p) -> v MTask Expr | type t & long v delay
105 class setDelay v where
106 setDelay :: (v Long p) (v MTask Expr) -> (v MTask Expr) | isExpr p
107 class mtasks v a b where
108 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
110 output :: (v t p) -> v () Expr | type t & isExpr p
111 class noOp v where noOp :: v t p
113 class pinMode v where
114 pinmode :: p PinMode -> v () Expr | pin p
115 class digitalIO v where
116 digitalRead :: p -> v Bool Expr | pin, readPinD p
117 digitalWrite :: p (v Bool q) -> v Bool Expr | pin, writePinD p
118 class analogIO v where
119 analogRead :: AnalogPin -> v Int Expr
120 analogWrite :: AnalogPin (v Int p) -> v Int Expr
122 dIO :: p -> v Bool Upd | pin, readPinD p
124 aIO :: AnalogPin -> v Int Upd
126 delay :: (v Long p) -> (v Long Expr)
127 millis :: (v Long Expr)
129 class pio p t where pio :: p -> v t Upd | aIO v & dIO v
130 instance pio AnalogPin Int
131 instance pio AnalogPin Bool
132 instance pio DigitalPin Bool
134 int :: (v Int p) -> (v Int p)
135 bool :: (v Bool p) -> (v Bool p)
136 char :: (v Char p) -> (v Char p)
138 class type t | showType, dyn, toCode, ==, type2string, varName t
139 class type2string t :: t -> String
140 instance type2string Int
141 instance type2string Long
142 instance type2string Real
143 instance type2string Bool
144 instance type2string Char
145 instance type2string MTask
146 instance type2string DigitalPin
147 instance type2string AnalogPin
148 instance type2string String
149 instance type2string ()
150 class varName a :: a -> String
152 instance varName Long
153 instance varName Bool
154 instance varName Char
155 instance varName Real
158 class dsl t | arith, boolExpr, sds, assign, seq t
162 class showType2 t :: SV t
163 instance showType2 ()
164 instance showType2 Int
165 instance showType2 Char
166 instance showType2 Bool
169 class showType t | showType2 /*, type*/ t :: (Code t p)
171 instance showType Int
172 instance showType Long
173 instance showType Char
174 instance showType Bool
177 class typeSelector t | showType2, type t :: (Code t p)
178 instance typeSelector Int
179 instance typeSelector Char
180 instance typeSelector Bool
181 instance typeSelector a
183 :: In a b = In infix 0 a b
185 read` :: Int (ReadWrite a) State` -> (a,State`) | dyn a
187 // ----- long ----- //
189 :: Long = L Int // 32 bit on Arduino
198 class long v t :: (v t p) -> v Long Expr | isExpr p
199 instance long Code Int
200 instance long Code Long
201 instance long Eval Int
202 instance long Eval Long
204 // ----- tools ----- //
206 derive consName DigitalPin, AnalogPin, PinMode
208 instance == DigitalPin
209 instance == AnalogPin
211 derive consIndex DigitalPin, AnalogPin
213 tab =: toString (repeatn tabSize ' ')