X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=mTaskInterpret.icl;h=4c8e43e295d08a4e4fc3e5872d47c56d32ce3807;hb=93cabbcd5d18b7b45d6f43a6ff39f94cfcb95522;hp=789c58a26aa8b92ced297997f01e2d9504f3a8d9;hpb=a0182655c28502ffcadbe36de99d9a4e503e310e;p=mTask.git diff --git a/mTaskInterpret.icl b/mTaskInterpret.icl index 789c58a..4c8e43e 100644 --- a/mTaskInterpret.icl +++ b/mTaskInterpret.icl @@ -19,11 +19,16 @@ import StdList from Data.Func import $ from Text import class Text(concat,join,toUpperCase), instance Text String +import Text.Encodings.Base64 + 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 +70,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 +120,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,35 +156,54 @@ instance serial ByteCode where serialParseInt = retrn [BCSerialParseInt] instance zero BCState where - zero = {freshl=[1..], freshs=[1..]} + zero = {freshl=[1..], freshs=[1..], sdss=[]} + +makeSafe :: Char -> Char +makeSafe c = c//toChar $ toInt c + 31 -toRealByteCode :: (ByteCode a Expr) -> String +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) -toReadableByteCode :: (ByteCode a Expr) -> String +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 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 +getSDSBytes :: BCState -> String +getSDSBytes {sdss} = concat $ map sd sdss + where sd (i, v) = "s" +++ toString (toChar i) +++ toString v +++ "\n" -Start :: String -Start = toReadableByteCode $ unMain bc -//Start = toRealByteCode $ unMain bc +getTaskBytes :: Int String -> String +getTaskBytes i b = "t" +++ to16bit i +++ to16bit (size b) +++ b +// +Start = getSDSBytes (snd bc`) +++ getTaskBytes 400 (fst bc`) +//Start = fst $ toReadableByteCode $ unMain bc where - bc :: Main (ByteCode Int Expr) + bc` = toRealByteCode (unMain bc) + bc :: Main (ByteCode Int Stmt) bc = sds \x=41 In - sds \y=1 In - {main = x =. x +. y} + {main = x =. x +. lit 1 :. pub x} + +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)) +to16bit :: Int -> String +to16bit i = toString (toChar (i/265)) +++ toString (toChar (i rem 265)) // ////Run test programma en pretty print ////Start :: String