from Data.Func import $
import Data.Tuple
+import StdDebug
+
memoryShare :: String a -> Shared a | iTask a
memoryShare s d = sdsFocus s $ memoryStore s $ Just d
deviceStoreNP :: Shared [MTaskDevice]
deviceStoreNP = sdsFocus Nothing $ deviceStore
+import GenPrint, TTY
+derive gPrint MTaskDevice, Maybe, MTaskShare, MTaskResource, TaskId, MTaskTask, (,), TTYSettings, TCPSettings, DateTime, Parity, BaudRate, ByteSize, MaybeError, ()
+gPrint{|Dynamic|} _ st = gPrint{|*|} "**Dynamic**" st
+
deviceStore :: RWShared (Maybe (MTaskDevice, Int)) [MTaskDevice] [MTaskDevice]
deviceStore = SDSSource {SDSSource
| name = "deviceStore"
- , read = \_->read realDeviceStore
+ , read = realRead
, write= realWrite
}
where
+ realRead :: (Maybe (MTaskDevice,Int)) *IWorld -> (MaybeError TaskException [MTaskDevice], *IWorld)
+ realRead p iw = read realDeviceStore iw
+
+ realWrite :: (Maybe (MTaskDevice,Int)) [MTaskDevice] *IWorld -> (MaybeError TaskException (SDSNotifyPred (Maybe (MTaskDevice,Int))), *IWorld)
realWrite mi w iw
+ | not (trace_tn $ "write called with: " +++ printToString mi +++ " w " +++ printToString w) = undef
# (merr, iw) = write w realDeviceStore iw
- | isError merr || isNothing mi = (merr $> const True, iw)
+ | not (trace_tn $ "written to real store: " +++ printToString merr) = undef
+ | isError merr || isNothing mi = (merr $> notifyPred mi, iw)
# (Just (dev, ident)) = mi
- | ident == -1 = (merr $> const True, iw)
+ | ident == -1 = (merr $> notifyPred mi, iw)
= case find ((==)dev) w of
Nothing = (Error $ exception "Device doesn't exist anymore", iw)
- Just {deviceShares} = case find (\{identifier}->identifier == ident) deviceShares of
+ Just {deviceShares} = case find (\d->d.identifier == ident) deviceShares of
Nothing = (Error $ exception $ "deviceStore: Share doesn't exist: " +++ toString ident, iw)
- Just s = case sendMessagesIW [MTUpd ident s.MTaskShare.value] dev iw of
+ Just s
+ | not $ trace_tn "Really sending a message from a share update" = undef
+ = case sendMessagesIW [MTUpd ident s.MTaskShare.value] dev iw of
(Error e, iw) = (Error e, iw)
- (Ok _, iw) = (Ok $ lens mi, iw)
+ (Ok _, iw) = (Ok $ notifyPred mi, iw)
- lens Nothing (Just p) = False
- lens Nothing Nothing = True
- lens (Just (d1, i1)) (Just (d2, i2)) = d1 == d2 && (i2 == -1 || i1 == i2)
+ notifyPred :: (Maybe (MTaskDevice, Int)) (Maybe (MTaskDevice, Int)) -> Bool
+ // Global watcher looking at a global event
+ notifyPred Nothing Nothing = True
+ // Global watcher looking at a local event
+ notifyPred Nothing (Just _) = False
+ // Local watcher looking at a global event
+ notifyPred (Just _) Nothing = False
+ // Local device watcher looking at a local event
+ notifyPred (Just (d1, -1)) (Just (d2, _)) = d1 == d2
+ // Local share watcher looking at a local share event
+ notifyPred (Just (d1, i1)) (Just (d2, i2)) = d1 == d2 && i1 == i2
realDeviceStore :: Shared [MTaskDevice]
realDeviceStore = sharedStore "mTaskDevices" []
-
-bcStateStore :: Shared BCState
-bcStateStore = memoryShare "mTaskBCState" zero
+//realDeviceStore = memoryShare "mTaskDevices" []
mTaskTaskStore :: Shared [String]
mTaskTaskStore = memoryShare "mTaskTasks" $ 'DM'.keys allmTasks