Change timeout to ADT and start supporting interrupts
[mTask.git] / mTaskInterpret.icl
index 4876e93..3f57e7d 100644 (file)
@@ -8,6 +8,7 @@ import GenPrint
 import StdEnum
 import mTask
 
+import StdInt
 import StdFile
 import StdString
 
@@ -25,7 +26,13 @@ import qualified Data.Map as DM
 import Text.Encodings.Base64
 
 encode :: MTaskMSGSend -> String
-encode (MTTask to data) = "t" +++ to16bit to +++ to16bit (size data) +++ data +++ "\n"
+encode (MTTask to data) = "t" +++ tob +++ to16bit (size data) +++ data +++ "\n"
+       where 
+               tob = case to of
+                       OneShot = to16bit 0
+                       OnInterval i = to16bit i
+                       OnInterrupt _ = abort "Interrupts not implemented yet"
+encode (MTTaskDel i) = "d" +++ to16bit i +++ "\n"
 encode (MTSds i v) = "s" +++ to16bit i +++ v +++ "\n"
 encode (MTUpd i v) = "u" +++ to16bit i +++ v +++ "\n"
 
@@ -45,11 +52,17 @@ decode x
 
 safePrint :== toString o toJSON
 
+instance toString MTaskInterval where
+       toString OneShot = "One shot"
+       toString (OnInterrupt i) = "Interrupt: " +++ toString i
+       toString (OnInterval i) = "Every " +++ toString i +++ "ms"
+
 instance toString MTaskMSGSend where
        toString (MTSds i v) = "Sds id: " +++ toString i
                +++ " value " +++ safePrint v
        toString (MTTask to data) = "Task timeout: " +++ toString to
                +++ " data " +++ safePrint data
+       toString (MTTaskDel i) = "Task delete request: " +++ toString i
        toString (MTUpd i v) = "Update id: " +++ toString i
                +++ " value " +++ safePrint v
 
@@ -119,15 +132,19 @@ retrn = BC o tuple
 fmp :: ([BC] -> [BC]) (ByteCode a p) -> ByteCode a q
 fmp f b = BC \s->let (bc, s`) = runBC b s in (f bc, s`)
 
-instance toByteCode Bool where
-       toByteCode True = [toChar 0, toChar 1]
-       toByteCode False = [toChar 0, toChar 0]
+instance toByteCode Bool where toByteCode b = toByteCode $ if b 1 0
 instance toByteCode Int where toByteCode n = map toChar [n/256,n rem 256]
 instance toByteCode Long where toByteCode (L n) = toByteCode n
 instance toByteCode Char where toByteCode c = [c]
 instance toByteCode String where toByteCode s = undef
 instance toByteCode Button where toByteCode s = [toChar $ consIndex{|*|} s]
 instance toByteCode UserLED where toByteCode s = [toChar $ consIndex{|*|} s]
+instance toByteCode MTaskInterval where
+       toByteCode OneShot = toByteCode 0
+       //Intervals have the first bit 0 and the rest is a 15 bit unsigned int
+       toByteCode (OnInterval i) = map toChar [i/256 bitand 127, i rem 256]
+       //Intervals have the first bit 1 and the rest is a 15 bit unsigned int
+       toByteCode (OnInterrupt i) = map toChar [i/256 bitor 128, i rem 256]
 
 instance toChar Pin where
        toChar (Digital p) = toChar $ consIndex{|*|} p
@@ -195,7 +212,6 @@ instance sds ByteCode where
                }
        con f = undef
        pub x = fmp makePub x
-//     pub _ = undef
 
 instance assign ByteCode where
        (=.) v e = e <++> fmp makeStore v
@@ -228,7 +244,6 @@ instance userLed ByteCode where
 instance zero BCState where
        zero = {freshl=[1..], freshs=[1..], sdss=[]}
 
-
 toRealByteCode :: (ByteCode a b) BCState -> (String, BCState)
 toRealByteCode x s
 # (bc, st) = runBC x s
@@ -259,13 +274,13 @@ toReadableByteCode x
 # (bc, gtmap) = computeGotos bc 0
 = (join "\n" $ map readable (map (implGotos gtmap) bc), st)
 
-toMessages :: Int (String, BCState) -> ([MTaskMSGSend], BCState)
+toMessages :: MTaskInterval (String, BCState) -> ([MTaskMSGSend], BCState)
 toMessages interval (bytes, st=:{sdss}) = ([MTSds i (toString b)\\(i,b)<-sdss] ++ [MTTask interval bytes], st)
 
 toSDSUpdate :: Int Int -> [MTaskMSGSend]
 toSDSUpdate i v = [MTUpd i (to16bit v)]
 
-Start = toMessages 500 $ toRealByteCode (unMain bc) zero
+Start = toMessages (OnInterval 500) $ toRealByteCode (unMain bc) zero
        where
                bc = sds \x=5 In 
                        sds \y=4 In