[Perl] DAQ system for the FAPG.
Attempt DAQ node serial reconnection when USB device is unreachable.
roles/daq-node/bin/fapg-daq-node
@@ -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
}