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
91 pub :: (v t Upd) -> v t Expr | type t
93 (>>=.) infixr 0 :: (v t p) ((v t Expr) -> (v u q)) -> (v u Stmt) | type t & type u
94 (:.) infixr 0 :: (v t p) (v u q) -> v u Stmt | type t & type u
96 (>>*.) infixl 1 :: (v t p) ((v t Expr) -> [Step v u]) -> v u Stmt | type t & type u
97 :: Step v t = E.p.q: Cond (v Bool q) (v t p) | E.p: Ever (v t p)
99 (=.) infixr 2 :: (v t Upd) (v t p) -> v t Expr | type t & isExpr p
101 fun :: ((t->v s Expr)->In (t->v s p) (Main (v u q))) -> Main (v u q) | type s
102 class mtask v a where
103 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
105 lag :: (v delay r) (v t p) -> v MTask Expr | type t & long v delay
106 class setDelay v where
107 setDelay :: (v Long p) (v MTask Expr) -> (v MTask Expr) | isExpr p
108 class mtasks v a b where
109 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
111 output :: (v t p) -> v () Expr | type t & isExpr p
112 class noOp v where noOp :: v t p
114 class pinMode v where
115 pinmode :: p PinMode -> v () Expr | pin p
116 class digitalIO v where
117 digitalRead :: p -> v Bool Expr | pin, readPinD p
118 digitalWrite :: p (v Bool q) -> v Bool Expr | pin, writePinD p
119 class analogIO v where
120 analogRead :: AnalogPin -> v Int Expr
121 analogWrite :: AnalogPin (v Int p) -> v Int Expr
123 dIO :: p -> v Bool Upd | pin, readPinD p
125 aIO :: AnalogPin -> v Int Upd
127 delay :: (v Long p) -> (v Long Expr)
128 millis :: (v Long Expr)
130 class pio p t where pio :: p -> v t Upd | aIO v & dIO v
131 instance pio AnalogPin Int
132 instance pio AnalogPin Bool
133 instance pio DigitalPin Bool
135 int :: (v Int p) -> (v Int p)
136 bool :: (v Bool p) -> (v Bool p)
137 char :: (v Char p) -> (v Char p)
139 class type t | showType, dyn, toCode, ==, type2string, varName t
140 class type2string t :: t -> String
141 instance type2string Int
142 instance type2string Long
143 instance type2string Real
144 instance type2string Bool
145 instance type2string Char
146 instance type2string MTask
147 instance type2string DigitalPin
148 instance type2string AnalogPin
149 instance type2string String
150 instance type2string ()
151 class varName a :: a -> String
153 instance varName Long
154 instance varName Bool
155 instance varName Char
156 instance varName Real
159 class dsl t | arith, boolExpr, sds, assign, seq t
163 class showType2 t :: SV t
164 instance showType2 ()
165 instance showType2 Int
166 instance showType2 Char
167 instance showType2 Bool
170 class showType t | showType2 /*, type*/ t :: (Code t p)
172 instance showType Int
173 instance showType Long
174 instance showType Char
175 instance showType Bool
178 class typeSelector t | showType2, type t :: (Code t p)
179 instance typeSelector Int
180 instance typeSelector Char
181 instance typeSelector Bool
182 instance typeSelector a
184 :: In a b = In infix 0 a b
186 read` :: Int (ReadWrite a) State` -> (a,State`) | dyn a
188 // ----- long ----- //
190 :: Long = L Int // 32 bit on Arduino
199 class long v t :: (v t p) -> v Long Expr | isExpr p
200 instance long Code Int
201 instance long Code Long
202 instance long Eval Int
203 instance long Eval Long
205 // ----- tools ----- //
207 derive consName DigitalPin, AnalogPin, PinMode
209 instance == DigitalPin
210 instance == AnalogPin
212 derive consIndex DigitalPin, AnalogPin
214 tab =: toString (repeatn tabSize ' ')