aboutsummaryrefslogtreecommitdiff
path: root/Documentation/watching.md
blob: 8735a46b4896dc872c9bcc1f2050d8277c2a5dbb (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# Watching Ports
As of version 2.2.0, flow can watch directories for new files. On most unix systems this can be used for watching for new serial ports in `/dev`.
Watching happens through a message-based, publish-subscribe protocol as explained in the sections below.

## Subscribe
A client actor may watch, i.e subscribe to notifications on, a directory by sending a `Watch` command to the serial manager.

Should an error be encountered whilst trying to obtain the watch, the manager will respond with a `CommandFailed` message.
Otherwise, the client may be considered "subscribed" to the directory and the serial manager will thenceforth notify
the client on new files.

```scala
IO(Serial) ! Watch(directory = "/dev", skipInitial = true)

def receive = {
  case CommandFailed(w: Watch, reason) =>
    println(s"Cannot obtain a watch on ${w.directory}: ${reason.getMessage}")
}

```

Note the second argument `skipInitial` of the watch command. This flag specifies if the client should not be notified of files already present
during the manager's reception of the watch command.

## Notifications
Whilst subscribed to a directory, a client actor is informed of any new files in said directory by receiving
`Connected` messages from the manager.

```scala
def receive = {
  case Connected(port) if port matches "/dev/ttyUSB.*" =>
    // do something with the available port, e.g.
    // IO(Serial) ! Open(port, settings)
}
```

## Unsubscribe
Unsubscribing from events on a directory happens by sending an `Unsubscribe` message to the serial manager.

```scala
IO(Serial) ! Unwatch(directory = "/dev")
```

Note that the manager has a deathwatch on every subscribed client. Hence should a client die, underlying resources will be freed.

# Requirements
Flow uses java's `WatchService`s under the hood, therefore a java runtime of at least 1.7 is required.