Merge branch 'master' of gitlab.science.ru.nl:mlubbers/mTask
[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 // | E.e: BCPush e & toByteCode e
38 | BCPush String
39 | BCPop
40 //SDS functions
41 | BCSdsStore Int
42 | BCSdsFetch Int
43 | BCSdsPublish Int
44 //Unary ops
45 | BCNot
46 //Binary Int ops
47 | BCAdd
48 | BCSub
49 | BCMul
50 | BCDiv
51 //Binary Bool ops
52 | BCAnd
53 | BCOr
54 | BCEq
55 | BCNeq
56 | BCLes
57 | BCGre
58 | BCLeq
59 | BCGeq
60 //Conditionals and jumping
61 | BCJmp Int
62 | BCJmpT Int
63 | BCJmpF Int
64 //UserLED
65 | BCLedOn UserLED
66 | BCLedOff UserLED
67 //Serial
68 | BCSerialAvail
69 | BCSerialPrint
70 | BCSerialPrintln
71 | BCSerialRead
72 | BCSerialParseInt
73 //Pins
74 | BCAnalogRead Pin
75 | BCAnalogWrite Pin
76 | BCDigitalRead Pin
77 | BCDigitalWrite Pin
78 | BCTest AnalogPin
79
80 derive gPrint BC
81 derive class gCons BC
82
83 :: ByteCode a p = BC (BCState -> ([BC], BCState))
84 instance Semigroup (ByteCode a p)
85 instance Monoid (ByteCode a p)
86
87 :: BCShare = {
88 sdsi :: Int,
89 sdspub :: Bool,
90 sdsval :: String
91 }
92
93 :: BCState = {
94 freshl :: [Int],
95 freshs :: [Int],
96 sdss :: [BCShare]
97 }
98 instance zero BCState
99
100 class toByteCode a :: a -> String
101 class fromByteCode a :: String -> a
102 class mTaskType a | toByteCode, fromByteCode, zero a
103
104 instance toByteCode Int, Bool, Char, Long, String, Button, UserLED
105 instance fromByteCode Int, Bool, Char, Long, String, Button, UserLED
106 instance toByteCode MTaskInterval
107 instance fromByteCode MTaskInterval
108
109 instance toChar Pin
110 instance arith ByteCode
111 instance boolExpr ByteCode
112 instance analogIO ByteCode
113 instance digitalIO ByteCode
114 instance userLed ByteCode
115 instance If ByteCode Stmt Stmt Stmt
116 instance If ByteCode e Stmt Stmt
117 instance If ByteCode Stmt e Stmt
118 instance If ByteCode x y Stmt
119 instance IF ByteCode
120 instance noOp ByteCode
121
122 instance sds ByteCode
123 instance assign ByteCode
124 instance seq ByteCode
125 instance serial ByteCode
126
127 toMessages :: MTaskInterval (String, BCState) -> ([MTaskMSGSend], BCState)
128 toSDSUpdate :: Int Int -> [MTaskMSGSend]
129
130 toByteVal :: BC -> String
131 toReadableByteCode :: (ByteCode a b) -> (String, BCState)
132 toRealByteCode :: (ByteCode a b) BCState -> (String, BCState)