1 implementation module Shares.mTaskShare
11 from Control.Monad import `b`
12 from Data.Func import $
13 from StdFunc import flip
15 derive class iTask MTaskShare
17 manageShares :: Task [MTaskDevice]
18 manageShares = whileUnchanged deviceStoreNP
20 [] = viewInformation "No devices yet" [] []
21 _ = allTasks (map manageSharesOnDevice devs)
23 manageSharesOnDevice :: MTaskDevice -> Task MTaskDevice
24 manageSharesOnDevice dev = (case dev.deviceShares of
25 [] = viewInformation dev.deviceName [] "No shares yet"
26 shs = enterChoice dev.deviceName [ChooseFromGrid id] shs @ const ""
29 updateShares :: MTaskDevice ([MTaskShare] -> [MTaskShare]) -> Task [MTaskShare]
30 updateShares dev tfun = upd (map upFun) (sdsFocus (Just (dev, -1)) deviceStore)
31 @ (\d->d.deviceShares) o fromJust o find ((==)dev)
33 upFun d = if (dev == d) ({d&deviceShares=tfun d.deviceShares}) d
35 //manageShares shares = withShared Nothing $ \cs->forever $
36 // (viewSharesGrid cs shares -|| updateShares shares <<@ ArrangeVertical)
39 //updateShares :: [MTaskShare] -> Task BCValue
40 //updateShares shares = anyTask (map updateS shares) <<@ ArrangeWithTabs
42 //updateS :: MTaskShare -> Task BCValue
43 //updateS sh = flip (<<@) (Title $ toString sh.identifier) $ forever $
44 // viewSharedInformation "Current value" [] (getSDSShare sh)
46 // updateSharedInformation "New value" [] (getSDSShare sh)
47 // >>= \nv->allTasks (map (withDevice treturn) sh.withDevice)
48 // >>= \devs->allTasks (map (sendMessages [MTUpd sh.identifier nv]) devs)
51 // <<@ ArrangeHorizontal
53 //viewSharesGrid :: (Shared (Maybe MTaskShare)) [MTaskShare] -> Task [BCValue]
54 //viewSharesGrid _ [] = viewInformation "No shares yet" [] []
55 //viewSharesGrid cs sh = (allTasks [watch (getSDSShare m)\\m<-sh] <<@ NoUserInterface)
56 // >&^ \st->flip (<<@) NoUserInterface $ whileUnchanged st $ \mshs->enterChoice "" [ChooseFromGrid id]
57 // [{MTaskShare|ss&value=s}\\s<-fromJust mshs & ss<-sh]
58 // >>* [OnValue (withValue $ \s->Just (set (Just s) cs))]
61 //viewShare :: MTaskShare -> Task BCValue
62 //viewShare m = viewSharedInformation "" [] (getSDSShare m)
63 // <<@ Title ("SDS: " +++ toString m.identifier)
65 makeShare :: String String Int BCValue -> MTaskShare
66 makeShare withTask human identifier value = {MTaskShare
68 ,identifier=identifier
73 import GenPrint, StdMisc, StdDebug, TTY
75 gPrint{|BCState|} x st = gPrint{|*|} "BCState..." st
77 derive gPrint MTaskDevice, MTaskShare, Maybe, MTaskResource, MTaskTask, TaskId, TTYSettings, TCPSettings, DateTime
78 derive gPrint Parity, BaudRate, ByteSize
80 cleanSharesTask :: Int MTaskDevice -> Task [MTaskShare]
81 cleanSharesTask taskid d = updateShares d id //TODO
82 //# shares = d.deviceShares
83 //| not (trace_tn $ printToString taskid) = undef
84 //| not (trace_tn $ printToString d.deviceTasks) = undef
85 //| not (trace_tn $ printToString $ getNames taskid d) = undef
86 //= upd (map $ up $ getNames taskid d) sdsStore
88 // getNames :: Int MTaskDevice -> [String]
89 // getNames i d = [t.MTaskTask.name\\t<-d.deviceTasks|t.ident==i]
91 // up :: [String] MTaskShare -> MTaskShare
92 // up ns s = {MTaskShare | s & withTask=[t\\t<-s.withTask|not (isMember t ns)]}
94 instance == MTaskShare where
95 (==) a b = a.identifier == b.identifier
97 shareShare :: MTaskDevice MTaskShare -> Shared BCValue
98 shareShare dev share = sdsFocus ()
99 $ mapReadWriteError (deviceLens dev share)
100 $ sdsFocus (Just (dev, share.identifier))
103 deviceLens dev share = (mread, mwrite)
105 mread :: [MTaskDevice] -> MaybeError TaskException BCValue
106 mread devs = mb2error (exception "Device lost") (find ((==)dev) devs)
107 `b` \d->mb2error (exception "Share lost") (find ((==)share) d.deviceShares)
108 `b` \s->Ok s.MTaskShare.value
110 mwrite :: BCValue [MTaskDevice] -> MaybeError TaskException (Maybe [MTaskDevice])
111 mwrite val devs = case partition ((==)dev) devs of
112 ([], _) = Error $ exception "Device doesn't exist anymore"
113 ([_,_:_], _) = Error $ exception "Multiple matching devices"
114 ([d=:{deviceShares}], devs) = case partition ((==)share) deviceShares of
115 ([], _) = Error $ exception "Share doesn't exist anymore"
116 ([_,_:_], _) = Error $ exception "Multiple matching shares"
117 ([s], shares) = Ok $ Just [{MTaskDevice | d &
118 deviceShares=[{MTaskShare | s & value=val}:shares]}:devs]
120 updateShareFromPublish :: MTaskDevice Int BCValue -> Task BCValue
121 updateShareFromPublish dev ident val = set val
122 $ mapReadWriteError (deviceLens dev dummy)
125 dummy = {MTaskShare|humanName="",value=BCValue 0,identifier=ident,withTask=[]}