working again, externalized some device helper functions and added share updating
[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 :: BCShare = {
84 sdsi :: Int,
85 sdspub :: Bool,
86 sdsval :: [Char]
87 }
88
89 :: BCState = {
90 freshl :: [Int],
91 freshs :: [Int],
92 sdss :: [BCShare]
93 }
94 instance zero BCState
95
96 class toByteCode a :: a -> [Char]
97 instance toByteCode Int
98 instance toByteCode Bool
99 instance toByteCode Char
100 instance toByteCode String
101 instance toByteCode Long
102 instance toByteCode Button
103 instance toByteCode UserLED
104 //instance toByteCode MTaskInterval
105
106 instance toChar Pin
107 instance arith ByteCode
108 instance boolExpr ByteCode
109 instance analogIO ByteCode
110 instance digitalIO ByteCode
111 instance userLed ByteCode
112 //instance If ByteCode Stmt Stmt Stmt
113 //instance If ByteCode e Stmt Stmt
114 //instance If ByteCode Stmt e Stmt
115 instance If ByteCode x y Stmt
116 instance IF ByteCode
117 instance noOp ByteCode
118
119 instance sds ByteCode
120 instance assign ByteCode
121 instance seq ByteCode
122 instance serial ByteCode
123
124 toMessages :: MTaskInterval (String, BCState) -> ([MTaskMSGSend], BCState)
125 toSDSUpdate :: Int Int -> [MTaskMSGSend]
126
127 toByteVal :: BC -> [Char]
128 toReadableByteCode :: (ByteCode a b) -> (String, BCState)
129 toRealByteCode :: (ByteCode a b) BCState -> (String, BCState)