Merge branch 'master' of gitlab.science:mlubbers/mTask
[mTask.git] / Utils / SDS.icl
index f1184a8..e23e767 100644 (file)
@@ -4,21 +4,67 @@ import iTasks
 import iTasks._Framework.Store
 import Devices.mTaskDevice
 import Shares.mTaskShare
+import Tasks.Examples
+import Data.List
+import qualified Data.Map as DM
 from Data.Func import $
+import Data.Tuple
 
-derive class iTask MTaskShare, BCState
+import StdDebug
 
 memoryShare :: String a -> Shared a | iTask a
-memoryShare s d = sdsFocus s $ memoryStore "" $ Just d
+memoryShare s d = sdsFocus s $ memoryStore s $ Just d
 
-deviceStore :: Shared [MTaskDevice]
-deviceStore = sharedStore "mTaskDevices" []
+deviceStoreNP :: Shared [MTaskDevice]
+deviceStoreNP = sdsFocus Nothing $ deviceStore
 
-sdsStore :: Shared [MTaskShare]
-sdsStore = memoryShare "mTaskShares" []
+import GenPrint, TTY
+derive gPrint MTaskDevice, Maybe, MTaskShare, MTaskResource, TaskId, MTaskTask, (,), TTYSettings, TCPSettings, DateTime, Parity, BaudRate, ByteSize, MaybeError, ()
+gPrint{|Dynamic|} _ st = gPrint{|*|} "**Dynamic**" st
 
-bcStateStore :: Shared BCState
-bcStateStore = memoryShare "mTaskBCState" zero
+deviceStore :: RWShared (Maybe (MTaskDevice, Int)) [MTaskDevice] [MTaskDevice]
+deviceStore = SDSSource {SDSSource 
+       | name = "deviceStore"
+       , 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
+       | 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 $> notifyPred mi, iw)
+       = case find ((==)dev) w of
+               Nothing = (Error $ exception "Device doesn't exist anymore", iw)
+               Just {deviceShares} = case find (\d->d.identifier == ident) deviceShares of
+                       Nothing = (Error $ exception $ "deviceStore: Share doesn't exist: " +++ toString ident, iw)
+                       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 $ notifyPred mi, iw)
+
+       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" []
+//realDeviceStore = memoryShare "mTaskDevices" []
 
 mTaskTaskStore :: Shared [String]
-mTaskTaskStore = memoryShare "mTaskTasks" ["count", "ledon", "ledoff"]
+mTaskTaskStore = memoryShare "mTaskTasks" $ 'DM'.keys allmTasks