X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=mTaskInterpret.icl;h=3f57e7d7b850e66d6c178d6fa46eea69b1b0a724;hb=acd239b3f29e215ade0b63d5b26b6cf8e8ae0d63;hp=2c44484017529f042440435f10f12c6e2b780d22;hpb=7fec7868123d56d410e807042cb3e031ebda12b9;p=mTask.git diff --git a/mTaskInterpret.icl b/mTaskInterpret.icl index 2c44484..3f57e7d 100644 --- a/mTaskInterpret.icl +++ b/mTaskInterpret.icl @@ -8,6 +8,7 @@ import GenPrint import StdEnum import mTask +import StdInt import StdFile import StdString @@ -25,7 +26,12 @@ 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" @@ -46,6 +52,11 @@ 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 @@ -121,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 @@ -197,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 @@ -230,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 @@ -261,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