|
1 ######################################### |
|
2 # Helpers for communication via channels |
|
3 ######################################### |
|
4 |
|
5 module Comms |
|
6 |
|
7 __precompile__() |
|
8 |
|
9 ############## |
|
10 # Our exports |
|
11 ############## |
|
12 |
|
13 export process_channel, |
|
14 put_onlylatest! |
|
15 |
|
16 #################### |
|
17 # Channel iteration |
|
18 #################### |
|
19 |
|
20 function process_channel(fn, rc) |
|
21 while true |
|
22 d=take!(rc) |
|
23 # Take only the latest image to visualise |
|
24 while isready(rc) |
|
25 d=take!(rc) |
|
26 end |
|
27 # We're done if we were fed nothing |
|
28 if isnothing(d) |
|
29 break |
|
30 end |
|
31 try |
|
32 fn(d) |
|
33 catch ex |
|
34 error("Exception in process_channel handler. Terminating.\n$(ex)") |
|
35 throw(ex) |
|
36 end |
|
37 end |
|
38 end |
|
39 |
|
40 ############################################# |
|
41 # Ensure only latest data is in a Channel(1) |
|
42 ############################################# |
|
43 |
|
44 function put_onlylatest!(rc, d) |
|
45 while isready(rc) |
|
46 take!(rc) |
|
47 end |
|
48 put!(rc, d) |
|
49 end |
|
50 |
|
51 end # Module |