X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=mTaskInterpret.icl;h=760281ce93c6dcc66369677ff35334e1f9683a2f;hb=4dff4046c87727f8b09558969f7c655b9e4de3c1;hp=789c58a26aa8b92ced297997f01e2d9504f3a8d9;hpb=c667554eb5dc359481a5f84b60649169f31e0f3d;p=mTask.git diff --git a/mTaskInterpret.icl b/mTaskInterpret.icl index 789c58a..760281c 100644 --- a/mTaskInterpret.icl +++ b/mTaskInterpret.icl @@ -19,11 +19,43 @@ import StdList from Data.Func import $ from Text import class Text(concat,join,toUpperCase), instance Text String +import Text.Encodings.Base64 + +encode :: MTaskMessage -> String +encode (MTSds i v) = "s" +++ to16bit i +++ v +encode (MTTask to data) = "t" +++ to16bit to +++ toString (size data) +++ data +encode (MTPub i v) = "u" +++ to16bit i +++ v +encode (MTUpd i v) = "u" +++ to16bit i +++ v + +decode :: String -> MTaskMessage +decode x = case x.[0] of + 'u' = MTUpd (toInt x.[1]) (x % (2,4)) + _ = abort ("Didn't understand message: " +++ x) + +safePrint :: String -> String +safePrint s = join " " [saf c\\c<-:s] + where + saf c = "\x" +++ toString (toInt c) + +derive gPrint MTaskMessage +instance toString MTaskMessage where + toString (MTSds i v) = "Sds id: " +++ toString i + +++ " value " +++ safePrint v + toString (MTTask to data) = "Task timeout: " +++ toString to + +++ " data " +++ safePrint data + toString (MTPub i v) = "Publish id: " +++ toString i + +++ " value " +++ safePrint v + toString (MTUpd i v) = "Update id: " +++ toString i + +++ " value " +++ safePrint v + toByteVal :: BC -> [Char] toByteVal b # bt = toChar $ consIndex{|*|} b + 1 = [bt:case b of (BCPush i) = i + (BCSdsStore i) = [toChar i] + (BCSdsFetch i) = [toChar i] + (BCSdsPublish i) = [toChar i] (BCAnalogRead i) = [toChar i] (BCAnalogWrite i) = [toChar i] (BCDigitalRead i) = [toChar i] @@ -65,7 +97,7 @@ instance toChar Pin where toChar (Digital p) = toChar $ consIndex{|*|} p + 1 toChar (Analog p) = toChar $ consIndex{|*|} p + 1 -derive gPrint BC, AnalogPin, Pin, DigitalPin, BCState +derive gPrint BC, AnalogPin, Pin, DigitalPin derive consIndex BC, Pin, Button derive consName BC, Pin, Button @@ -115,16 +147,25 @@ withSDS :: (Int -> (ByteCode b q)) -> ByteCode b q withSDS f = BC \s->let [fresh:fs] = s.freshs in runBC (f fresh) {s & freshs=fs} +setSDS :: Int v -> ByteCode b q | toByteCode v +setSDS ident val = BC \s->([], {s & sdss = [(ident, toByteCode val):s.sdss]}) + instance sds ByteCode where sds f = {main = withSDS \sds-> let (v In body) = f $ retrn [BCSdsFetch sds] - in retrn [BCPush $ toByteCode v,BCSdsStore sds] <++> unMain body + in setSDS sds v <++> unMain body } con f = undef +// pub _ = undef instance assign ByteCode where (=.) v e = e <++> fmp makeStore v +makePub [] = [] +makePub [x:xs] = case x of + BCSdsFetch i = [BCSdsPublish i:xs] + y = [y:xs] + makeStore [] = [] makeStore [x:xs] = case x of BCSdsFetch i = [BCSdsStore i:xs] @@ -142,44 +183,49 @@ instance serial ByteCode where serialParseInt = retrn [BCSerialParseInt] instance zero BCState where - zero = {freshl=[1..], freshs=[1..]} + zero = {freshl=[1..], freshs=[1..], sdss=[]} -toRealByteCode :: (ByteCode a Expr) -> String +makeSafe :: Char -> Char +makeSafe c = c//toChar $ toInt c + 31 + +toRealByteCode :: (ByteCode a b) -> (String, BCState) toRealByteCode x # (bc, st) = runBC x zero -= concat $ map (toString o toByteVal) bc += (concat $ map (toString o map makeSafe o toByteVal) bc, st) + +readable :: BC -> String +readable (BCPush d) = "BCPush " +++ concat (map safe d) + where + safe c + | isControl c = "\\d" +++ toString (toInt c) + = toString c +readable b = printToString b -toReadableByteCode :: (ByteCode a Expr) -> String +toReadableByteCode :: (ByteCode a b) -> (String, BCState) toReadableByteCode x # (bc, st) = runBC x zero -= join "\n" $ map printToString bc += (join "\n" $ map readable bc, st) //Start :: String //Start = toReadableByteCode bc // where // bc :: ByteCode Int Expr // bc = (lit 36 +. lit 42) +. lit 44 +toMessages :: Int (String, BCState) -> [MTaskMessage] +toMessages interval (bytes, {sdss}) = [MTSds i (toString b)\\(i,b)<-sdss] ++ [MTTask interval bytes] -Start :: String -Start = toReadableByteCode $ unMain bc -//Start = toRealByteCode $ unMain bc +Start = toMessages 500 $ toRealByteCode (unMain bc) +//Start = fst $ toReadableByteCode $ unMain bc where - bc :: Main (ByteCode Int Expr) - bc = sds \x=41 In - sds \y=1 In - {main = x =. x +. y} - -//to16bit :: Int -> String -//to16bit i = toString (toChar (i/265)) +++ toString (toChar (i rem 265)) -// -////Run test programma en pretty print -////Start :: String -////Start = "t" +++ to16bit (size b) +++ b -//Start :: Main (ByteCode Int Expr) -//Start = bc -// where -// bc = sds \x=43 In {main = If (x ==. lit 42) (analogRead A1) (analogRead A0)} -// b = toRealByteCode bc -//Start :: ByteCode Int Expr -//Start = If (lit True) (analogRead A1) (analogRead A0) -//Start = If ((lit 36) ==. (lit 42)) (noOp) (noOp) + bc = sds \x=5 In + sds \y=4 In + {main = If (y ==. lit 0) (pub x) (x =. x *. y :. y =. y -. lit 1)} + +pub :: (ByteCode a b) -> ByteCode a b +pub x = fmp makePub x + +to16bit :: Int -> String +to16bit i = toString (toChar (i/265)) +++ toString (toChar (i rem 265)) + +from16bit :: String -> Int +from16bit s = toInt s.[0] * 265 + toInt s.[1]