Loading lib/mTask/mTask/Interpret/DSL.dcl +1 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ MT_REMOVE :== UInt8 ((2^8) - 1) :: BCInterpret a :== StateT BCState (WriterT [BCInstr] Identity) a tell` :: [BCInstr] -> BCInterpret a setRate :: Bool (TimingInterval (StateT BCState (WriterT [BCInstr] Identity))) -> BCInterpret a :: BCState = { bcs_mainexpr :: [BCInstr] Loading lib/mTask/mTask/Interpret/DSL.icl +16 −3 Original line number Diff line number Diff line Loading @@ -74,9 +74,18 @@ freshlabel = getState >>= \s=:{bcs_freshlabel=(JL i)}-> freshsds :: BCInterpret Int freshsds = gets \s->length s.bcs_sdses setRate :: Bool (TimingInterval (StateT BCState (WriterT [BCInstr] Identity))) -> BCInterpret a setRate rl Default = pure undef setRate rl (BeforeMs u) = tell` [BCPush $ fromString $ toByteCode{|*|} 0] >>| u >>| tell` [BCTuneRateMs] setRate rl (BeforeSec u) = tell` [BCPush $ fromString $ toByteCode{|*|} 0] >>| u >>| tell` [BCTuneRateSec] setRate rl (ExactMs t) = tell` if rl [BCMkTask BCRateLimit] [] >>| t >>| t >>| tell` [BCTuneRateMs] setRate rl (ExactSec t) = tell` if rl [BCMkTask BCRateLimit] [] >>| t >>| t >>| tell` [BCTuneRateSec] setRate rl (RangeMs u l) = tell` if rl [BCMkTask BCRateLimit] [] >>| u >>| l >>| tell` [BCTuneRateMs] setRate rl (RangeSec u l) = tell` if rl [BCMkTask BCRateLimit] [] >>| u >>| l >>| tell` [BCTuneRateSec] instance aio (StateT BCState (WriterT [BCInstr] Identity)) where readA p = p >>| tell` [BCMkTask BCReadA] readA` i p = p >>| tell` [BCMkTask BCReadA] >>| setRate True i writeA p v = p >>| v >>| tell` [BCMkTask BCWriteA] instance expr (StateT BCState (WriterT [BCInstr] Identity)) Loading Loading @@ -113,6 +122,7 @@ where instance dio v (StateT BCState (WriterT [BCInstr] Identity)) where readD` i p = p >>| tell` [BCMkTask BCReadD] >>| setRate True i readD p = p >>| tell` [BCMkTask BCReadD] writeD p v = p >>| v >>| tell` [BCMkTask BCWriteD] Loading @@ -126,7 +136,7 @@ where instance rpeat (StateT BCState (WriterT [BCInstr] Identity)) where rpeat m = m >>| tell` [BCMkTask BCRepeat] rpeatEvery i m = m >>| tell` [BCMkTask BCRepeat] >>| setRate False i instance rtrn (StateT BCState (WriterT [BCInstr] Identity)) where Loading @@ -141,7 +151,10 @@ where (t In e) = def sds in e.main } getSds f = f >>= \(Sds i)-> tell` [BCMkTask (BCSdsGet (fromInt i))] getSds` ti f = f >>= \(Sds i)-> tell` [BCMkTask (BCSdsGet (fromInt i))] >>| setRate True ti setSds f v = f >>= \(Sds i)->v >>| tell` ( map BCMkTask (bcstable $ toByteWidth $ unpack v) ++ [BCMkTask (BCSdsSet (fromInt i))]) Loading lib/mTask/mTask/Interpret/Device.icl +12 −7 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ import Data.List => qualified group import Data.Map => qualified union, difference, find, updateAt, get import Data.Map.GenJSON import Data.Tuple import Data.UInt import iTasks import mTask.Interpret.ByteCodeEncoding Loading Loading @@ -170,6 +171,10 @@ liftmTaskWithOptions opts task (MTDevice dev sdsupdates channels) , peripherals = hardware , shares = {i\\i<-shares} , instructions = BCIs {i\\i<-instructions} , status = MTUnevaluated , execution_min = UInt32 0 , execution_max = UInt32 0 , lastrun = UInt32 0 }) channels] //Wait for task ack >>- \_->watch taskView Loading lib/mTask/mTask/Interpret/Instructions.dcl +4 −0 Original line number Diff line number Diff line Loading @@ -59,6 +59,8 @@ instance toString JumpLabel | BCStepArg UInt16 UInt8 //Task node creation | BCMkTask BCTaskType //Task node refinement | BCTuneRateMs | BCTuneRateSec //Task value ops | BCIsStable | BCIsUnstable | BCIsNoValue | BCIsValue //Stack ops Loading Loading @@ -101,6 +103,8 @@ instance toString JumpLabel | BCSeqStable ArgWidth | BCSeqUnstable ArgWidth //Sds ops | BCSdsGet SdsId | BCSdsSet SdsId | BCSdsUpd SdsId JumpLabel // Rate limiter | BCRateLimit ////Peripherals //DHT | BCDHTTemp UInt8 | BCDHTHumid UInt8 Loading lib/mTask/mTask/Interpret/Message.dcl +20 −11 Original line number Diff line number Diff line Loading @@ -9,7 +9,7 @@ from iTasks.Internal.Generic.Visualization import generic gText, :: TextFormat from Data.GenEq import generic gEq from Text.GenJSON import generic JSONEncode, generic JSONDecode, :: JSONNode from Data.UInt import :: UInt8, :: UInt16 from Data.UInt import :: UInt8, :: UInt16, :: UInt32 from iTasks.WF.Definition import :: TaskValue from mTask.Interpret.Instructions import :: BCInstr, :: BCInstrs from mTask.Interpret.Specification import :: MTDeviceSpec Loading Loading @@ -40,9 +40,18 @@ from mTask.Interpret.VoidPointer import :: VoidPointer , shares :: {BCShareSpec} , peripherals :: {BCPeripheral} , instructions :: BCInstrs , status :: MTaskEvalStatus , execution_min :: UInt32 , execution_max :: UInt32 , lastrun :: UInt32 } :: MTaskValueState = MTNoValue | MTUnstable | MTStable | MTRemoved // MTEvaluated: task tree is evaluated and the previously calculated execution interval is still correct // MTPurged: task tree is evaluated, but the execution interval needs to be recalculated // MTUnevaluated: task tree contains unevaluated parts, the execution interval is [0,0] :: MTaskEvalStatus = MTEvaluated | MTPurged | MTUnevaluated :: MTMessageFro //* taskid = MTFTaskAck UInt8 Loading Loading @@ -75,8 +84,8 @@ from mTask.Interpret.VoidPointer import :: VoidPointer | MTERTSError | MTEUnexpectedDisconnect derive class iTask MTMessageFro, MTMessageTo, MTException, MTaskValueState derive gCSerialise MTMessageFro, MTMessageTo, MTException, TaskValue, MTaskValueState derive gCDeserialise MTMessageFro, MTMessageTo, MTException, TaskValue, MTaskValueState derive class iTask MTMessageFro, MTMessageTo, MTException, MTaskValueState, MTaskEvalStatus derive gCSerialise MTMessageFro, MTMessageTo, MTException, TaskValue, MTaskValueState, MTaskEvalStatus derive gCDeserialise MTMessageFro, MTMessageTo, MTException, TaskValue, MTaskValueState, MTaskEvalStatus instance toString MTException Loading
lib/mTask/mTask/Interpret/DSL.dcl +1 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ MT_REMOVE :== UInt8 ((2^8) - 1) :: BCInterpret a :== StateT BCState (WriterT [BCInstr] Identity) a tell` :: [BCInstr] -> BCInterpret a setRate :: Bool (TimingInterval (StateT BCState (WriterT [BCInstr] Identity))) -> BCInterpret a :: BCState = { bcs_mainexpr :: [BCInstr] Loading
lib/mTask/mTask/Interpret/DSL.icl +16 −3 Original line number Diff line number Diff line Loading @@ -74,9 +74,18 @@ freshlabel = getState >>= \s=:{bcs_freshlabel=(JL i)}-> freshsds :: BCInterpret Int freshsds = gets \s->length s.bcs_sdses setRate :: Bool (TimingInterval (StateT BCState (WriterT [BCInstr] Identity))) -> BCInterpret a setRate rl Default = pure undef setRate rl (BeforeMs u) = tell` [BCPush $ fromString $ toByteCode{|*|} 0] >>| u >>| tell` [BCTuneRateMs] setRate rl (BeforeSec u) = tell` [BCPush $ fromString $ toByteCode{|*|} 0] >>| u >>| tell` [BCTuneRateSec] setRate rl (ExactMs t) = tell` if rl [BCMkTask BCRateLimit] [] >>| t >>| t >>| tell` [BCTuneRateMs] setRate rl (ExactSec t) = tell` if rl [BCMkTask BCRateLimit] [] >>| t >>| t >>| tell` [BCTuneRateSec] setRate rl (RangeMs u l) = tell` if rl [BCMkTask BCRateLimit] [] >>| u >>| l >>| tell` [BCTuneRateMs] setRate rl (RangeSec u l) = tell` if rl [BCMkTask BCRateLimit] [] >>| u >>| l >>| tell` [BCTuneRateSec] instance aio (StateT BCState (WriterT [BCInstr] Identity)) where readA p = p >>| tell` [BCMkTask BCReadA] readA` i p = p >>| tell` [BCMkTask BCReadA] >>| setRate True i writeA p v = p >>| v >>| tell` [BCMkTask BCWriteA] instance expr (StateT BCState (WriterT [BCInstr] Identity)) Loading Loading @@ -113,6 +122,7 @@ where instance dio v (StateT BCState (WriterT [BCInstr] Identity)) where readD` i p = p >>| tell` [BCMkTask BCReadD] >>| setRate True i readD p = p >>| tell` [BCMkTask BCReadD] writeD p v = p >>| v >>| tell` [BCMkTask BCWriteD] Loading @@ -126,7 +136,7 @@ where instance rpeat (StateT BCState (WriterT [BCInstr] Identity)) where rpeat m = m >>| tell` [BCMkTask BCRepeat] rpeatEvery i m = m >>| tell` [BCMkTask BCRepeat] >>| setRate False i instance rtrn (StateT BCState (WriterT [BCInstr] Identity)) where Loading @@ -141,7 +151,10 @@ where (t In e) = def sds in e.main } getSds f = f >>= \(Sds i)-> tell` [BCMkTask (BCSdsGet (fromInt i))] getSds` ti f = f >>= \(Sds i)-> tell` [BCMkTask (BCSdsGet (fromInt i))] >>| setRate True ti setSds f v = f >>= \(Sds i)->v >>| tell` ( map BCMkTask (bcstable $ toByteWidth $ unpack v) ++ [BCMkTask (BCSdsSet (fromInt i))]) Loading
lib/mTask/mTask/Interpret/Device.icl +12 −7 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ import Data.List => qualified group import Data.Map => qualified union, difference, find, updateAt, get import Data.Map.GenJSON import Data.Tuple import Data.UInt import iTasks import mTask.Interpret.ByteCodeEncoding Loading Loading @@ -170,6 +171,10 @@ liftmTaskWithOptions opts task (MTDevice dev sdsupdates channels) , peripherals = hardware , shares = {i\\i<-shares} , instructions = BCIs {i\\i<-instructions} , status = MTUnevaluated , execution_min = UInt32 0 , execution_max = UInt32 0 , lastrun = UInt32 0 }) channels] //Wait for task ack >>- \_->watch taskView Loading
lib/mTask/mTask/Interpret/Instructions.dcl +4 −0 Original line number Diff line number Diff line Loading @@ -59,6 +59,8 @@ instance toString JumpLabel | BCStepArg UInt16 UInt8 //Task node creation | BCMkTask BCTaskType //Task node refinement | BCTuneRateMs | BCTuneRateSec //Task value ops | BCIsStable | BCIsUnstable | BCIsNoValue | BCIsValue //Stack ops Loading Loading @@ -101,6 +103,8 @@ instance toString JumpLabel | BCSeqStable ArgWidth | BCSeqUnstable ArgWidth //Sds ops | BCSdsGet SdsId | BCSdsSet SdsId | BCSdsUpd SdsId JumpLabel // Rate limiter | BCRateLimit ////Peripherals //DHT | BCDHTTemp UInt8 | BCDHTHumid UInt8 Loading
lib/mTask/mTask/Interpret/Message.dcl +20 −11 Original line number Diff line number Diff line Loading @@ -9,7 +9,7 @@ from iTasks.Internal.Generic.Visualization import generic gText, :: TextFormat from Data.GenEq import generic gEq from Text.GenJSON import generic JSONEncode, generic JSONDecode, :: JSONNode from Data.UInt import :: UInt8, :: UInt16 from Data.UInt import :: UInt8, :: UInt16, :: UInt32 from iTasks.WF.Definition import :: TaskValue from mTask.Interpret.Instructions import :: BCInstr, :: BCInstrs from mTask.Interpret.Specification import :: MTDeviceSpec Loading Loading @@ -40,9 +40,18 @@ from mTask.Interpret.VoidPointer import :: VoidPointer , shares :: {BCShareSpec} , peripherals :: {BCPeripheral} , instructions :: BCInstrs , status :: MTaskEvalStatus , execution_min :: UInt32 , execution_max :: UInt32 , lastrun :: UInt32 } :: MTaskValueState = MTNoValue | MTUnstable | MTStable | MTRemoved // MTEvaluated: task tree is evaluated and the previously calculated execution interval is still correct // MTPurged: task tree is evaluated, but the execution interval needs to be recalculated // MTUnevaluated: task tree contains unevaluated parts, the execution interval is [0,0] :: MTaskEvalStatus = MTEvaluated | MTPurged | MTUnevaluated :: MTMessageFro //* taskid = MTFTaskAck UInt8 Loading Loading @@ -75,8 +84,8 @@ from mTask.Interpret.VoidPointer import :: VoidPointer | MTERTSError | MTEUnexpectedDisconnect derive class iTask MTMessageFro, MTMessageTo, MTException, MTaskValueState derive gCSerialise MTMessageFro, MTMessageTo, MTException, TaskValue, MTaskValueState derive gCDeserialise MTMessageFro, MTMessageTo, MTException, TaskValue, MTaskValueState derive class iTask MTMessageFro, MTMessageTo, MTException, MTaskValueState, MTaskEvalStatus derive gCSerialise MTMessageFro, MTMessageTo, MTException, TaskValue, MTaskValueState, MTaskEvalStatus derive gCDeserialise MTMessageFro, MTMessageTo, MTException, TaskValue, MTaskValueState, MTaskEvalStatus instance toString MTException