dropEmpty (r,s,ss) = (filter ((=!=)MTEmpty) r,s,ss)
deleteDevice :: MTaskDevice -> Task ()
-deleteDevice d = upd (\(r,s,ss)->(r,s,True)) (channels d)
+deleteDevice d = sendMessages [MTShutdown] d
+ >>| wait "Waiting for the channels to empty" (\(r,s,ss)->isEmpty s) (channels d)
+ >>| upd (\(r,s,ss)->(r,s,True)) (channels d)
>>| maybe (treturn ()) (flip removeTask topLevelTasks) d.deviceTask
>>| upd (filter ((<>)d)) deviceStore
>>| cleanSharesDevice d.deviceName
from Data.Map import :: Map
import mTask
+faculty :: Int -> Main (ByteCode () Stmt)
+countTo5 :: Main (ByteCode () Stmt)
countAndLed :: Main (ByteCode () Stmt)
blink :: UserLED -> Main (ByteCode () Stmt)
count :: Main (ByteCode () Stmt)
import Devices.mTaskDevice
import iTasks._Framework.Serialization
+faculty :: Int -> Main (ByteCode () Stmt)
+faculty i = sds \y=i In sds \x=1 In {main =
+ IF (y <=. lit 1) (
+ pub x :. retrn
+ ) (
+ x =. x *. y :.
+ y =. y -. lit 1
+ )}
+
countTo5 :: Main (ByteCode () Stmt)
countTo5 = sds \x=0 In {main =
x =. x +. lit 1 :.
pub x :.
IF ( x >. lit 5) (
- retrn x
+ retrn
) (
noOp
)}
,("blinkShare", treturn blinkShare)
,("count", treturn count)
,("countTo5", treturn countTo5)
+ ,("faculty", enterInformation "Faculty" [] @ faculty)
]
}
makeTask :: String Int -> Task MTaskTask
-sendTaskToDevice :: String (Main (ByteCode () Stmt)) (MTaskDevice, MTaskInterval) -> Task ()
+sendTaskToDevice :: String (Main (ByteCode a Stmt)) (MTaskDevice, MTaskInterval) -> Task ()
import iTasks
import Devices.mTaskDevice
-
import iTasks._Framework.Serialization
derive class iTask MTaskTask, MTaskInterval, Main, ByteCode, Stmt, Expr, BC, BCState, RWST, Identity
makeTask name ident = get currentDateTime
@ \dt->{MTaskTask | name=name,ident=ident,dateAdded=dt}
-sendTaskToDevice :: String (Main (ByteCode () Stmt)) (MTaskDevice, MTaskInterval) -> Task ()
+sendTaskToDevice :: String (Main (ByteCode a Stmt)) (MTaskDevice, MTaskInterval) -> Task ()
sendTaskToDevice wta mTask (device, timeout) =
get bcStateStore @ toMessages timeout mTask
>>= \(msgs, st1)->set st1 bcStateStore
break;
#endif
case BCRETURN: trace("Return");
- t->value = (uint16_t) stack[sp-1];
debug("Task returned");
task_delete(t->taskid);
return;
(>>=.) infixr 0 :: (v t p) ((v t Expr) -> (v u q)) -> (v u Stmt) | type t & type u
(:.) infixr 0 :: (v t p) (v u q) -> v u Stmt | type t & type u
class retrn v where
- retrn :: (v t p) -> (v t Stmt) | type t
+ retrn :: v () Expr
class step` v where
(>>*.) infixl 1 :: (v t p) ((v t Expr) -> [Step v u]) -> v u Stmt | type t & type u
:: Step v t = E.p.q: Cond (v Bool q) (v t p) | E.p: Ever (v t p)
:: MTaskMSGSend
= MTTask MTaskInterval String
| MTTaskDel Int
+ | MTShutdown
| MTSds Int BCValue
| MTUpd Int BCValue
| MTSpec
encode (MTSds i v) = "s" +++ to16bit i +++ toByteCode v +++ "\n"
encode (MTUpd i v) = "u" +++ to16bit i +++ toByteCode v +++ "\n"
encode (MTSpec) = "c\n"
+encode (MTShutdown) = "h\n"
import StdDebug
decode :: String -> MTaskMSGRecv
toString (MTTaskDel i) = "Task delete request: " +++ toString i
toString (MTUpd i v) = "Update id: " +++ toString i
+++ " value " +++ safePrint v
+ toString (MTSpec) = "Spec request"
+ toString (MTShutdown) = "Shutdown request"
instance toString MTaskMSGRecv where
toString (MTTaskAck i mem) = "Task added with id: " +++ toString i
ledOff (BC l) = BC $ l >>| tell [BCLedOff]
instance retrn ByteCode where
- retrn (BC l) = tell` [BCReturn]
+ retrn = tell` [BCReturn]
instance zero BCState where
zero = {freshl=[1..], freshs=[1..], sdss=[]}