84c1e3f02253849013f025b78c8d315779b70727
[mTask.git] / mTaskInterpret.dcl
1 definition module mTaskInterpret
2
3 import mTask
4
5 from Data.Functor.Identity import :: Identity
6 from Control.Monad.State import :: State, :: StateT
7 from Control.Monad.RWST import :: RWST, :: RWS
8 from Data.Either import :: Either
9 from iTasks._Framework.Generic.Defaults import generic gDefault
10 from GenPrint import generic gPrint
11 from Generics.gCons import class gCons, generic conses, generic consName, generic consIndex, generic consNum
12
13 :: MTaskMSGRecv
14 = MTTaskAck Int
15 | MTTaskDelAck Int
16 | MTSDSAck Int
17 | MTSDSDelAck Int
18 | MTPub Int BCValue
19 | MTMessage String
20 | MTDevSpec MTaskDeviceSpec
21 | MTEmpty
22
23 :: MTaskMSGSend
24 = MTTask MTaskInterval String
25 | MTTaskDel Int
26 | MTSds Int String
27 | MTUpd Int String
28 | MTSpec
29
30 :: MTaskInterval
31 = OneShot
32 | OnInterval Int
33 | OnInterrupt Int
34
35 :: MTaskDeviceSpec =
36 {haveLed :: Bool
37 ,haveAio :: Bool
38 ,haveDio :: Bool
39 ,maxTask :: Int //Should be number of bytes reserved in total for shares, tasks and functions
40 ,maxSDS :: Int
41 }
42
43 :: BCValue = E.e: BCValue e & mTaskType e
44
45 instance toString MTaskInterval
46 instance toString MTaskMSGRecv
47 instance toString MTaskMSGSend
48 encode :: MTaskMSGSend -> String
49 decode :: String -> MTaskMSGRecv
50
51 :: BC
52 = BCNop
53 | BCLab Int
54 | BCPush BCValue
55 // | BCPush String
56 | BCPop
57 //SDS functions
58 | BCSdsStore Int
59 | BCSdsFetch Int
60 | BCSdsPublish Int
61 //Unary ops
62 | BCNot
63 //Binary Int ops
64 | BCAdd
65 | BCSub
66 | BCMul
67 | BCDiv
68 //Binary Bool ops
69 | BCAnd
70 | BCOr
71 | BCEq
72 | BCNeq
73 | BCLes
74 | BCGre
75 | BCLeq
76 | BCGeq
77 //Conditionals and jumping
78 | BCJmp Int
79 | BCJmpT Int
80 | BCJmpF Int
81 //UserLED
82 | BCLedOn
83 | BCLedOff
84 //Serial
85 | BCSerialAvail
86 | BCSerialPrint
87 | BCSerialPrintln
88 | BCSerialRead
89 | BCSerialParseInt
90 //Pins
91 | BCAnalogRead Pin
92 | BCAnalogWrite Pin
93 | BCDigitalRead Pin
94 | BCDigitalWrite Pin
95 | BCTest AnalogPin
96
97 derive gPrint BCValue, MTaskDeviceSpec
98 derive consIndex BCValue
99 derive consName BCValue
100 derive conses BCValue
101 derive consNum BCValue
102
103 derive class gCons Long, UserLED, Button, AnalogPin, DigitalPin, PinMode, Pin
104 derive class iTask UserLED, Long, Pin, Button, AnalogPin, DigitalPin, PinMode, MTaskDeviceSpec
105 derive gEditor BCValue
106 derive gText BCValue
107 derive JSONEncode BCValue
108 derive JSONDecode BCValue
109 derive gDefault BCValue
110 derive gEq BCValue
111
112 :: ByteCode a p = BC (RWS () [BC] BCState ())
113
114 :: BCShare = {
115 sdsi :: Int,
116 sdspub :: Bool,
117 sdsval :: BCValue
118 }
119
120 :: BCState = {
121 freshl :: [Int],
122 freshs :: [Int],
123 sdss :: [BCShare]
124 }
125 instance zero BCState
126
127 class toByteCode a :: a -> String
128 class fromByteCode a :: String -> a
129 class mTaskType a | toByteCode, fromByteCode, iTask, TC a
130
131 instance toByteCode Int, Bool, Char, Long, String, Button, UserLED, BCValue
132 instance fromByteCode Int, Bool, Char, Long, String, Button, UserLED, BCValue
133 instance toByteCode MTaskInterval
134 instance fromByteCode MTaskInterval, MTaskDeviceSpec
135
136 instance arith ByteCode
137 instance boolExpr ByteCode
138 instance analogIO ByteCode
139 instance digitalIO ByteCode
140 instance userLed ByteCode
141 instance If ByteCode Stmt Stmt Stmt
142 instance If ByteCode e Stmt Stmt
143 instance If ByteCode Stmt e Stmt
144 instance If ByteCode x y Stmt
145 instance IF ByteCode
146 instance noOp ByteCode
147
148 instance sds ByteCode
149 instance assign ByteCode
150 instance seq ByteCode
151 instance serial ByteCode
152
153 toMessages :: MTaskInterval (String, BCState) -> ([MTaskMSGSend], BCState)
154 toSDSUpdate :: Int Int -> [MTaskMSGSend]
155
156 toByteVal :: BC -> String
157 toReadableByteCode :: (ByteCode a b) BCState -> (String, BCState)
158 toRealByteCode :: (ByteCode a b) BCState -> (String, BCState)