class MTaskDuplex a where
synFun :: a (Shared Channels) -> Task ()
-withDevices :: MTaskDevice (MTaskDevice -> MTaskDevice) -> Task [MTaskDevice]
-//withDevices :: MTaskDevice (MTaskDevice -> MTaskDevice) -> Task ()
-
startupDevices :: Task [MTaskDevice]
connectDevice :: (MTaskDevice (Shared Channels) -> Task ()) MTaskDevice -> Task Channels
manageDevices :: (MTaskDevice (Shared Channels) -> Task ()) -> Task ()
deviceTaskDelete :: MTaskDevice MTaskTask -> Task ()
-deviceTaskAcked :: MTaskDevice Int Int -> Task [MTaskDevice]
-deviceTaskDeleteAcked :: MTaskDevice Int -> Task [MTaskDevice]
-deviceAddSpec :: MTaskDevice MTaskDeviceSpec -> Task [MTaskDevice]
+deviceTaskAcked :: MTaskDevice Int Int -> Task MTaskDevice
+deviceTaskDeleteAcked :: MTaskDevice Int -> Task MTaskDevice
+deviceAddSpec :: MTaskDevice MTaskDeviceSpec -> Task MTaskDevice
+
+deviceShare :: MTaskDevice -> Shared MTaskDevice
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
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 = whileUnchanged deviceStoreNP $ \ds->anyTask [
viewDevice :: (MTaskDevice (Shared Channels) -> Task ()) MTaskDevice -> Task ()
viewDevice pf d = forever $ traceValue "viewDevice" >>| anyTask
- [viewInformation "Device settings" [] d @! ()
- ,viewSharedInformation "Channels" [ViewAs dropEmpty] (channels d) @! ()
+ [viewInformation "Device settings" [ViewAs noShares] d @! ()
+ /*,viewSharedInformation "Channels" [ViewAs dropEmpty] (channels d) @! ()*/
,forever $
enterChoice "Delete task on device" [ChooseFromGrid id] d.deviceTasks
>>* [OnAction (Action "Delete") $ ifValue (\t->t.ident <> -1) (deviceTaskDelete d)]
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 ()
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 [] = []
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
import iTasks
import mTask
import Data.List
+import Data.Error
import Data.Tuple
+from Control.Monad import `b`
from Data.Func import $
from StdFunc import flip
deviceLens dev share = (mread, mwrite)
where
mread :: [MTaskDevice] -> MaybeError TaskException BCValue
- mread devs = case find ((==)dev) devs of
- Nothing = Error $ exception "Device doesn't exist anymore"
- Just {deviceShares} = case find ((==)share) deviceShares of
- Nothing = Error $ exception "Share doesn't exist anymore"
- Just share = Ok share.MTaskShare.value
+ mread devs = mb2error (exception "Device lost") (find ((==)dev) devs)
+ `b` \d->mb2error (exception "Share lost") (find ((==)share) d.deviceShares)
+ `b` \s->Ok s.MTaskShare.value
mwrite :: BCValue [MTaskDevice] -> MaybeError TaskException (Maybe [MTaskDevice])
mwrite val devs = case partition ((==)dev) devs of
}
makeTask :: String Int -> Task MTaskTask
-sendTaskToDevice :: String (Main (ByteCode a Stmt)) (MTaskDevice, MTaskInterval) -> Task [MTaskDevice]
+sendTaskToDevice :: String (Main (ByteCode a Stmt)) (MTaskDevice, MTaskInterval) -> Task MTaskTask
+
+liftmTask :: String (Main (ByteCode () Stmt)) (MTaskDevice, MTaskInterval) -> Task ()
import mTask
import iTasks
import Devices.mTaskDevice
+import Data.List
+from Data.Func import $
import iTasks._Framework.Serialization
import StdDebug
import StdMisc
-sendTaskToDevice :: String (Main (ByteCode a Stmt)) (MTaskDevice, MTaskInterval) -> Task [MTaskDevice]
+sendTaskToDevice :: String (Main (ByteCode a Stmt)) (MTaskDevice, MTaskInterval) -> Task MTaskTask
sendTaskToDevice wta mTask (device, timeout)
-| not (trace_tn "compiling task") = undef
# (msgs, newState=:{sdss}) = toMessages timeout mTask device.deviceState
-| not (trace_tn "Done compiling task") = undef
# shares = [makeShare wta "" sdsi sdsval\\{sdsi,sdsval}<-sdss, (MTSds sdsi` _)<-msgs | sdsi == sdsi`]
= updateShares device ((++) shares)
>>| sendMessages msgs device
>>| makeTask wta -1
- >>= withDevices device o addTaskUpState newState
+ >>= \t->upd (addTaskUpState newState t) (deviceShare device)
+ >>| wait "Waiting for task to be acked" (taskAcked t) (deviceShare device)
+ >>| treturn t
where
addTaskUpState :: BCState MTaskTask MTaskDevice -> MTaskDevice
addTaskUpState st task device = { MTaskDevice | device &
deviceState=st, deviceTasks=[task:device.deviceTasks]}
+ taskAcked t d = maybe True (\t->t.ident <> -1) $ find (eq t) d.deviceTasks
+ eq t1 t2 = t1.dateAdded == t2.dateAdded &&
+ t1.MTaskTask.name == t2.MTaskTask.name
-//liftmTask :: String (Main (ByteCode a Stmt)) (MTaskDevice, MTaskInterval) -> Task a
-//liftmTask wta mTask (device, timeout)
-// = sendTaskToDevice wta mTask (device, timeout)
-// >>| wait "waiting for task to return" $ sdsFocus
-// >>| treturn
+liftmTask :: String (Main (ByteCode () Stmt)) (MTaskDevice, MTaskInterval) -> Task ()
+liftmTask wta mTask c=:(dev, _)= sendTaskToDevice wta mTask c
+ >>= \t->wait "Waiting for mTask to return" (taskRemoved t) (deviceShare dev)
+ >>| viewInformation "Done!" [] ()
+where
+ taskRemoved t d = isNothing $ find (\t1->t1.ident==t.ident) d.deviceTasks
debug("Shutdown received");
mem_reset();
reset();
+ break;
case '\0':
debug("Server closed connection");
break;
#include <stdarg.h>
#ifdef LINUX
-#define NAPINS 128
-#define NDPINS 128
+#define APINS 128
+#define DPINS 128
#define STACKSIZE 1024
#define MEMSIZE 1024
#define HAVELED 1
-#define HAVEAIO 1
-#define HAVEDIO 1
extern int gargc;
extern char **gargv;
#elif defined STM
-#define NAPINS 128
-#define NDPINS 128
+#define APINS 128
+#define DPINS 128
#define STACKSIZE 1024
#define MEMSIZE 1024
#define HAVELED 1
-#define HAVEAIO 1
-#define HAVEDIO 1
#elif defined ARDUINO_ESP8266_NODEMCU
-#define NAPINS 128
-#define NDPINS 128
+#define APINS 128
+#define DPINS 128
#define STACKSIZE 1024
#define MEMSIZE 1024
#define HAVELED 0
-#define HAVEAIO 0
-#define HAVEDIO 0
#elif defined ARDUINO_AVR_UNO
-#define NAPINS 128
-#define NDPINS 128
+#define APINS 128
+#define DPINS 128
#define STACKSIZE 64
#define MEMSIZE 256
#define HAVELED 0
-#define HAVEAIO 0
-#define HAVEDIO 0
#else
//Add you device here
#endif
void write_byte(uint8_t b);
/* Analog and digital pins */
-#if HAVEDIO == 1
+#if DPINS > 0
void write_dpin(uint8_t i, bool b);
bool read_dpin(uint8_t i);
#endif
-#if HAVEAIO == 1
+#if APINS > 0
void write_apin(uint8_t i, uint8_t a);
uint8_t read_apin(uint8_t i);
#endif
void spec_send(void)
{
write_byte('c');
- write_byte(0 | (HAVELED << 0) | (HAVEAIO << 1) | (HAVEDIO << 2));
+ write_byte(0 | (HAVELED << 0) );//| (HAVEAIO << 1) | (HAVEDIO << 2));
write16(MEMSIZE);
write16(STACKSIZE);
- write_byte(NAPINS);
- write_byte(NDPINS);
+ write_byte(APINS);
+ write_byte(DPINS);
write_byte('\n');
write_byte('\n');
}
echo "Downloading and installing clean nightly" >&2
curl -sSL ftp://ftp.cs.ru.nl/pub/Clean/builds/linux-x64/clean-bundle-complete-linux-x64-latest.tgz \
- | tar --gunzip --strip-components=1 --extract --directory="$TARGET"
+ | tar --verbose --gunzip --strip-components=1 --extract --directory="$TARGET"
echo "export CLEAN_HOME=$TARGET; export PATH=$TARGET/bin:\$PATH;"
] world
demo :: Task ()
-demo = viewSharedInformation "Devices" [] deviceStoreNP
+demo = set 5 (sharedDynamicStore "Hoi" 5)
+ >>| viewSharedInformation "Devices" [] deviceStoreNP
>>* [OnValue $ ifValue pred (cont o hd)]
where
pred [] = False
>>= \bc->(enterChoice "Choose Device" [ChooseFromDropdown \t->t.deviceName] d
-&&- enterInformation "Timeout" []
) >>* [OnAction (Action "Send") (withValue $ Just o sendTaskToDevice task bc)]
+ >>| treturn []
]
process :: MTaskDevice (Shared Channels) -> Task ()