X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=mTaskInterpret.icl;h=3f57e7d7b850e66d6c178d6fa46eea69b1b0a724;hb=acd239b3f29e215ade0b63d5b26b6cf8e8ae0d63;hp=1cd7c7085e0f931cf507cd196005a090c0152afe;hpb=955c4eb992b45e48a1a3dad6418236431ddcd095;p=mTask.git diff --git a/mTaskInterpret.icl b/mTaskInterpret.icl index 1cd7c70..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 @@ -22,45 +25,69 @@ from Text import class Text(concat,join,toUpperCase), instance Text String import qualified Data.Map as DM import Text.Encodings.Base64 -encode :: MTaskMessage -> String +encode :: MTaskMSGSend -> String +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 (MTTask to data) = "t" +++ to16bit to +++ to16bit (size data) +++ data +++ "\n" -encode (MTPub i v) = "u" +++ to16bit i +++ v +++ "\n" encode (MTUpd i v) = "u" +++ to16bit i +++ v +++ "\n" -encode MTEmpty = "" -decode :: String -> MTaskMessage +decode :: String -> MTaskMSGRecv decode x | size x == 0 = MTEmpty = case x.[0] of + 't' = MTTaskAck (from16bit (x % (1,3))) + 'd' = MTTaskDelAck (from16bit (x % (1,3))) + 'm' = MTMessage x + 's' = MTSDSAck (from16bit (x % (1,3))) + 'a' = MTSDSDelAck (from16bit (x % (1,3))) + 'p' = MTPub (from16bit (x % (1,3))) (x % (3,5)) '\0' = MTEmpty - 'u' = MTUpd (from16bit (x % (1,3))) (x % (3,5)) - _ = abort ("Didn't understand message: " +++ join " " [toString (toInt c)\\c<-: x] +++ "\n") + '\n' = MTEmpty + _ = MTMessage x//abort ("Didn't understand message: " +++ join " " [toString (toInt c)\\c<-: x] +++ "\n") safePrint :== toString o toJSON -derive gPrint MTaskMessage -instance toString MTaskMessage where +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 (MTPub i v) = "Publish id: " +++ toString i - +++ " value " +++ safePrint v + toString (MTTaskDel i) = "Task delete request: " +++ toString i toString (MTUpd i v) = "Update id: " +++ toString i +++ " value " +++ safePrint v + +instance toString MTaskMSGRecv where + toString (MTTaskAck i) = "Task added with id: " +++ toString i + toString (MTTaskDelAck i) = "Task deleted with id: " +++ toString i + toString (MTSDSAck i) = "SDS added with id: " +++ toString i + toString (MTSDSDelAck i) = "SDS deleted with id: " +++ toString i + toString (MTPub i v) = "Publish id: " +++ toString i + +++ " value " +++ safePrint v + toString (MTMessage m) = m toString MTEmpty = "Empty message" bclength :: BC -> Int bclength (BCPush _) = 3 bclength (BCLab _) = 2 -bclength (BCSdsStore _) = 2 -bclength (BCSdsFetch _) = 2 -bclength (BCSdsPublish _) = 2 +bclength (BCSdsStore _) = 3 +bclength (BCSdsFetch _) = 3 +bclength (BCSdsPublish _) = 3 bclength (BCAnalogRead _) = 2 bclength (BCAnalogWrite _) = 2 bclength (BCDigitalRead _) = 2 bclength (BCDigitalWrite _) = 2 +bclength (BCLedOn _) = 2 +bclength (BCLedOff _) = 2 bclength (BCJmp i) = 2 bclength (BCJmpT i) = 2 bclength (BCJmpF i) = 2 @@ -68,17 +95,19 @@ bclength _ = 1 toByteVal :: BC -> [Char] toByteVal b -# bt = toChar $ consIndex{|*|} b + 1 +# bt = toChar $ consIndex{|*|} b = [bt:case b of (BCPush i) = i (BCLab i) = [toChar i] - (BCSdsStore i) = [toChar i] - (BCSdsFetch i) = [toChar i] - (BCSdsPublish i) = [toChar i] + (BCSdsStore i) = [c\\c<-:to16bit i] + (BCSdsFetch i) = [c\\c<-:to16bit i] + (BCSdsPublish i) = [c\\c<-:to16bit i] (BCAnalogRead i) = [toChar i] (BCAnalogWrite i) = [toChar i] (BCDigitalRead i) = [toChar i] (BCDigitalWrite i) = [toChar i] + (BCLedOn i) = i + (BCLedOff i) = i (BCJmp i) = [toChar i] (BCJmpT i) = [toChar i] (BCJmpF i) = [toChar i] @@ -103,21 +132,26 @@ 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 1] - toByteCode False = [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 + 1 - toChar (Analog p) = toChar $ consIndex{|*|} p + 1 + toChar (Digital p) = toChar $ consIndex{|*|} p + toChar (Analog p) = toChar $ consIndex{|*|} p derive gPrint BC, AnalogPin, Pin, DigitalPin -derive consIndex BC, Pin, Button +derive consIndex BC, Pin, Button, UserLED derive consName BC, Pin, Button instance arith ByteCode where @@ -146,10 +180,10 @@ instance digitalIO ByteCode where digitalRead p = retrn [BCDigitalRead $ pin p] digitalWrite p b = b <+-> [BCDigitalWrite $ pin p] -instance If ByteCode Stmt Stmt Stmt where If b t e = BCIfStmt b t e -instance If ByteCode e Stmt Stmt where If b t e = BCIfStmt b t e -instance If ByteCode Stmt e Stmt where If b t e = BCIfStmt b t e -instance If ByteCode x y Expr where If b t e = BCIfStmt b t e +//instance If ByteCode Stmt Stmt Stmt where If b t e = BCIfStmt b t e +//instance If ByteCode e Stmt Stmt where If b t e = BCIfStmt b t e +//instance If ByteCode Stmt e Stmt where If b t e = BCIfStmt b t e +instance If ByteCode x y Stmt where If b t e = BCIfStmt b t e instance IF ByteCode where IF b t e = BCIfStmt b t e (?) b t = BCIfStmt b t $ retrn [] @@ -158,7 +192,7 @@ BCIfStmt b t e = b <++> retrn [BCJmpF else] <++> t <++> retrn [BCJmp endif,BCLab else] <++> e <++> retrn [BCLab endif] -instance noOp ByteCode where noOp = mempty +instance noOp ByteCode where noOp = retrn [BCNop] withLabel :: (Int -> (ByteCode b q)) -> ByteCode b q withLabel f = BC \s->let [fresh:fs] = s.freshl @@ -178,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 @@ -204,13 +237,16 @@ instance serial ByteCode where serialRead = retrn [BCSerialRead] serialParseInt = retrn [BCSerialParseInt] +instance userLed ByteCode where + ledOn l = retrn [BCLedOn $ toByteCode l] + ledOff l = retrn [BCLedOff $ toByteCode l] + 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) @@ -238,24 +274,18 @@ toReadableByteCode x # (bc, gtmap) = computeGotos bc 0 = (join "\n" $ map readable (map (implGotos gtmap) 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] +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 = fst $ toReadableByteCode $ unMain bc +Start = toMessages (OnInterval 500) $ toRealByteCode (unMain bc) zero where 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/256)) +++ toString (toChar (i rem 256))