X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=mTaskInterpret.icl;h=3f57e7d7b850e66d6c178d6fa46eea69b1b0a724;hb=a2b8b2a0de173f92092bf6cbbed23551e674ca3c;hp=c63c95dbf36b85c79dd2adc1a69b5cd50603ced0;hpb=55afb005ced3bba3813163596cdc7288a318a3c2;p=mTask.git diff --git a/mTaskInterpret.icl b/mTaskInterpret.icl index c63c95d..3f57e7d 100644 --- a/mTaskInterpret.icl +++ b/mTaskInterpret.icl @@ -1,11 +1,14 @@ implementation module mTaskInterpret //import iTasks -import gdynamic, gCons, GenEq, StdMisc, StdArray, GenBimap +import Generics.gCons + +import GenEq, StdMisc, StdArray, GenBimap import GenPrint import StdEnum import mTask +import StdInt import StdFile import StdString @@ -23,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" @@ -43,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 @@ -117,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 @@ -193,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 @@ -226,10 +244,9 @@ instance userLed ByteCode where instance zero BCState where zero = {freshl=[1..], freshs=[1..], sdss=[]} - -toRealByteCode :: (ByteCode a b) -> (String, BCState) -toRealByteCode x -# (bc, st) = runBC x zero +toRealByteCode :: (ByteCode a b) BCState -> (String, BCState) +toRealByteCode x s +# (bc, st) = runBC x s # (bc, gtmap) = computeGotos bc 1 = (concat $ map (toString o toByteVal) (map (implGotos gtmap) bc), st) @@ -257,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) +Start = toMessages (OnInterval 500) $ toRealByteCode (unMain bc) zero where bc = sds \x=5 In sds \y=4 In