add device shares
[mTask.git] / Devices / mTaskDevice.icl
index a91a0b3..193c4d7 100644 (file)
@@ -15,6 +15,7 @@ import GenBimap
 import Devices.mTaskSerial
 import Devices.mTaskTCP
 import Data.Tuple
+import Data.List
 import iTasks._Framework.Store
 import iTasks.UI.Definition, iTasks.UI.Editor, iTasks.UI.Editor.Builtin, iTasks.UI.Editor.Common, iTasks.UI.Layout.Default, iTasks.UI.Layout.Common
 
@@ -86,23 +87,23 @@ connectDevice :: (MTaskDevice (Shared Channels) -> Task ()) MTaskDevice -> Task
 connectDevice procFun device = let ch = channels device
        in traceValue "connectDevice" >>| appendTopLevelTask 'DM'.newMap True
                (       procFun device ch -||- catchAll (getSynFun device.deviceData ch) errHdl)
-               >>= \tid->withDevices device (\d->{d&deviceTask=Just tid,deviceError=Nothing})
+               >>= \tid->upd (\d->{d&deviceTask=Just tid,deviceError=Nothing}) (deviceShare device)
                >>| upd (\(r,s,ss)->(r,s++[MTSpec],ss)) ch
        where
                errHdl e
                | not (trace_tn "error") = undef
-               = withDevices device (\d->{d & deviceTask=Nothing, deviceError=Just e}) @! ()
+               = upd (\d->{d & deviceTask=Nothing, deviceError=Just e}) (deviceShare device) @! ()
 
 manageDevices :: (MTaskDevice (Shared Channels) -> Task ()) -> Task ()
-manageDevices processFun = get deviceStoreNP >>= \ds->anyTask [
-               addDevice processFun <<@ Title "Add new device" @! ()]//:
-//                     [viewDevice processFun d <<@ Title d.deviceName\\d<-ds]]
+manageDevices processFun = whileUnchanged deviceStoreNP $ \ds->anyTask [
+               addDevice processFun <<@ Title "Add new device" @! ():
+                       [viewDevice processFun d <<@ Title d.deviceName\\d<-ds]]
        <<@ ArrangeWithTabs
        @! ()
 
 viewDevice :: (MTaskDevice (Shared Channels) -> Task ()) MTaskDevice -> Task ()
 viewDevice pf d = forever $ traceValue "viewDevice" >>| anyTask 
-               [viewInformation "Device settings" [] d @! ()
+               [viewInformation "Device settings" [ViewAs noShares] d @! ()
                /*,viewSharedInformation "Channels" [ViewAs dropEmpty] (channels d) @! ()*/
                ,forever $ 
                        enterChoice "Delete task on device" [ChooseFromGrid id] d.deviceTasks
@@ -113,6 +114,7 @@ viewDevice pf d = forever $ traceValue "viewDevice" >>| anyTask
                                if (isJust d.deviceTask) []
                                [OnAction (Action "Connect") (always $ connectDevice pf d @! ())]]
        where
+               noShares d = {d & deviceShares=[], deviceTasks=[]}
                dropEmpty (r,s,ss) = (filter ((=!=)MTEmpty) r,s,ss)
 
 deleteDevice :: MTaskDevice -> Task ()
@@ -134,14 +136,12 @@ sendMessagesIW msgs dev iworld
 realMessageSend :: [MTaskMSGSend] Channels -> Channels
 realMessageSend msgs (r,s,ss) = (r,msgs++s,ss)
 
-withDevices :: MTaskDevice (MTaskDevice -> MTaskDevice) -> Task [MTaskDevice]
-withDevices a trans = upd (map \b->if (b == a) (trans b) b) deviceStoreNP
-
-deviceTaskAcked :: MTaskDevice Int Int -> Task [MTaskDevice]
+deviceTaskAcked :: MTaskDevice Int Int -> Task MTaskDevice
 deviceTaskAcked dev i mem
-       = withDevices dev (\d->{d
-                       &deviceTasks=ackFirst d.deviceTasks
-                       ,deviceSpec=Just {fromJust d.deviceSpec & bytesMemory=mem}})
+       = upd (\d->{d
+                       & deviceTasks=ackFirst d.deviceTasks
+                       , deviceSpec=Just {fromJust d.deviceSpec & bytesMemory=mem}})
+               $ deviceShare dev
        where
                ackFirst :: [MTaskTask] -> [MTaskTask]
                ackFirst [] = []
@@ -151,10 +151,18 @@ deviceTaskAcked dev i mem
 deviceTaskDelete :: MTaskDevice MTaskTask -> Task ()
 deviceTaskDelete dev task = sendMessages [MTTaskDel task.ident] dev @! ()
 
-deviceTaskDeleteAcked :: MTaskDevice Int -> Task [MTaskDevice]
+deviceTaskDeleteAcked :: MTaskDevice Int -> Task MTaskDevice
 deviceTaskDeleteAcked d i = cleanSharesTask i d
-       >>| withDevices d deleteTask
+       >>| upd deleteTask (deviceShare d)
        where deleteTask d = {d & deviceTasks=[s\\s<-d.deviceTasks | i <> s.ident]}
 
-deviceAddSpec :: MTaskDevice MTaskDeviceSpec -> Task [MTaskDevice]
-deviceAddSpec d s = withDevices d $ \r->{MTaskDevice | r & deviceSpec=Just s}
+deviceAddSpec :: MTaskDevice MTaskDeviceSpec -> Task MTaskDevice
+deviceAddSpec d s = upd (\r->{MTaskDevice | r & deviceSpec=Just s}) $ deviceShare d
+
+deviceShare :: MTaskDevice -> Shared MTaskDevice
+deviceShare d = mapReadWriteError 
+       ( \ds->mb2error (exception "Device lost") $ find ((==)d) ds
+       , \w ds->case splitWith ((==)d) ds of
+               ([], _) = Error $ exception "Device lost"
+               ([_], ds) = Ok $ Just [w:ds]
+       ) $ sdsFocus (Just (d, -1)) deviceStore