Attempt DAQ node serial reconnection when USB device is unreachable.

Commit
8c0cba6f11fc4728fe890d9eb7a58ae9011653d6
Author
Marius Peter <dev@marius-peter.com>
Author date
Committer
Marius Peter <dev@marius-peter.com>
Committer date
roles/daq-node/bin/fapg-daq-node
index e7c9c1a9..dfef666d 100755..100755
@@ -5,8 +5,9 @@
5 5 use strict;
6 6 use warnings;
7 7
8 Removed: use FindBin;
9 Removed: use lib "${FindBin::Bin}/../lib/perl5";
8 Added: use FindBin qw($Bin);
9 Added: use lib "$Bin/../../../lib/perl5";
10 Added: use lib "$Bin/../lib/perl5";
10 11
11 12 use FAPG::DAQ::EZO::USB qw(
12 13 open_ezo_usb
@@ -22,26 +23,79 @@
22 23
23 24 =cut
24 25
25 Removed: my $device = $ENV{EZO_SERIAL_DEVICE} // '/dev/ttyUSB0';
26 Removed: my $serial = open_ezo_usb( device => $device );
27 Removed: my $info = read_probe_info($serial);
26 Added: my $device = $ENV{EZO_SERIAL_DEVICE} // '/dev/ttyUSB0';
27 Added: my $read_interval = positive_number_from_env( READ_INTERVAL => 5 );
28 Added: my $retry_delay = positive_number_from_env( EZO_RECONNECT_INTERVAL => 5 );
28 29
29 Removed: print <<"EOF";
30 Added: my ( $serial, $info );
31 Added:
32 Added: while (1) {
33 Added: if ( !defined $serial || !defined $info ) {
34 Added: ( $serial, $info ) = eval { connect_probe($device) };
35 Added:
36 Added: if ($@) {
37 Added: warn "DAQ probe connection error: $@";
38 Added: close_serial($serial);
39 Added: ( $serial, $info ) = ();
40 Added: sleep $retry_delay;
41 Added: next;
42 Added: }
43 Added: }
44 Added:
45 Added: my $reading = eval { read_once( $serial, probe => $info->{probe} ) };
46 Added:
47 Added: if ($@) {
48 Added: warn "DAQ probe read error, reconnecting to $device: $@";
49 Added: close_serial($serial);
50 Added: ( $serial, $info ) = ();
51 Added: sleep $retry_delay;
52 Added: next;
53 Added: }
54 Added:
55 Added: say "$reading->{probe}: $reading->{value} $reading->{unit}";
56 Added:
57 Added: eval { publish_mqtt($reading) } or warn "MQTT publish error: $@";
58 Added:
59 Added: sleep $read_interval;
60 Added: }
61 Added:
62 Added: sub connect_probe {
63 Added: my ($device) = @_;
64 Added:
65 Added: my $serial = open_ezo_usb( device => $device );
66 Added: my $info = eval { read_probe_info($serial) };
67 Added:
68 Added: if ($@) {
69 Added: my $error = $@;
70 Added: close_serial($serial);
71 Added: die $error;
72 Added: }
73 Added:
74 Added: print <<"EOF";
30 75 Device $device
31 76 Probe $info->{probe}
32 77 Firmware $info->{firmware}
33 78 Unit $info->{unit}
34 79 EOF
35 80
36 Removed: while (1) {
37 Removed: eval {
38 Removed: my $reading = read_once( $serial, probe => $info->{probe} );
39 Removed: say "$reading->{probe}: $reading->{value} $reading->{unit}";
40 Removed: publish_mqtt($reading);
41 Removed: } or do {
42 Removed: warn "DAQ loop error: $@";
43 Removed: sleep 30;
44 Removed: next;
45 Removed: };
46 Removed: sleep 5;
81 Added: return ( $serial, $info );
82 Added: }
83 Added:
84 Added: sub close_serial {
85 Added: my ($serial) = @_;
86 Added:
87 Added: return if !defined $serial || !$serial->can('close');
88 Added:
89 Added: eval { $serial->close; 1 }
90 Added: or warn "DAQ serial close error: $@";
91 Added: }
92 Added:
93 Added: sub positive_number_from_env {
94 Added: my ( $name, $default ) = @_;
95 Added: my $value = $ENV{$name};
96 Added:
97 Added: return $default
98 Added: if !defined $value || $value !~ /\A(?:\d+(?:\.\d*)?|\.\d+)\z/ || $value <= 0;
99 Added:
100 Added: return 0 + $value;
47 101 }