Change timeout to ADT and start supporting interrupts
[mTask.git] / mTaskInterpret.dcl
1 definition module mTaskInterpret
2
3 from Data.Functor.Identity import :: Identity
4 from Control.Monad.State import :: State, :: StateT
5 from Data.Monoid import class Semigroup, class Monoid
6 import mTask
7
8 :: MTaskMSGRecv
9 = MTTaskAck Int
10 | MTTaskDelAck Int
11 | MTSDSAck Int
12 | MTSDSDelAck Int
13 | MTPub Int String
14 | MTMessage String
15 | MTEmpty
16
17 :: MTaskMSGSend
18 = MTTask MTaskInterval String
19 | MTTaskDel Int
20 | MTSds Int String
21 | MTUpd Int String
22
23 :: MTaskInterval
24 = OneShot
25 | OnInterval Int
26 | OnInterrupt Int
27
28 instance toString MTaskInterval
29 instance toString MTaskMSGRecv
30 instance toString MTaskMSGSend
31 encode :: MTaskMSGSend -> String
32 decode :: String -> MTaskMSGRecv
33
34 :: BC
35 = BCNop
36 | BCLab Int
37 | BCPush [Char]
38 | BCPop
39 //SDS functions
40 | BCSdsStore Int
41 | BCSdsFetch Int
42 | BCSdsPublish Int
43 //Unary ops
44 | BCNot
45 //Binary Int ops
46 | BCAdd
47 | BCSub
48 | BCMul
49 | BCDiv
50 //Binary Bool ops
51 | BCAnd
52 | BCOr
53 | BCEq
54 | BCNeq
55 | BCLes
56 | BCGre
57 | BCLeq
58 | BCGeq
59 //Conditionals and jumping
60 | BCJmp Int
61 | BCJmpT Int
62 | BCJmpF Int
63 //UserLED
64 | BCLedOn [Char]
65 | BCLedOff [Char]
66 //Serial
67 | BCSerialAvail
68 | BCSerialPrint
69 | BCSerialPrintln
70 | BCSerialRead
71 | BCSerialParseInt
72 //Pins
73 | BCAnalogRead Pin
74 | BCAnalogWrite Pin
75 | BCDigitalRead Pin
76 | BCDigitalWrite Pin
77 | BCTest AnalogPin
78
79 :: ByteCode a p = BC (BCState -> ([BC], BCState))
80 instance Semigroup (ByteCode a p)
81 instance Monoid (ByteCode a p)
82
83 :: BCState = {
84 freshl :: [Int],
85 freshs :: [Int],
86 sdss :: [(Int, [Char])]
87 }
88 instance zero BCState
89
90 class toByteCode a :: a -> [Char]
91 instance toByteCode Int
92 instance toByteCode Bool
93 instance toByteCode Char
94 instance toByteCode String
95 instance toByteCode Long
96 instance toByteCode Button
97 instance toByteCode UserLED
98 //instance toByteCode MTaskInterval
99
100 instance toChar Pin
101 instance arith ByteCode
102 instance boolExpr ByteCode
103 instance analogIO ByteCode
104 instance digitalIO ByteCode
105 instance userLed ByteCode
106 //instance If ByteCode Stmt Stmt Stmt
107 //instance If ByteCode e Stmt Stmt
108 //instance If ByteCode Stmt e Stmt
109 instance If ByteCode x y Stmt
110 instance IF ByteCode
111 instance noOp ByteCode
112
113 instance sds ByteCode
114 instance assign ByteCode
115 instance seq ByteCode
116 instance serial ByteCode
117
118 toMessages :: MTaskInterval (String, BCState) -> ([MTaskMSGSend], BCState)
119 toSDSUpdate :: Int Int -> [MTaskMSGSend]
120
121 toByteVal :: BC -> [Char]
122 toReadableByteCode :: (ByteCode a b) -> (String, BCState)
123 toRealByteCode :: (ByteCode a b) BCState -> (String, BCState)