here is my current code (which works). Don't know about mem leaks however...
#!/usr/bin/perl -w
use strict; # Amen
use threads;
use threads::shared;
#--------------------------------------------------
# Application includes
#--------------------------------------------------
use person;
#--------------------------------------------------
# Forward declarations
#--------------------------------------------------
sub doTemp1;
sub doTemp2;
sub doQuit;
#--------------------------------------------------
# Local variables
#--------------------------------------------------
our $intDelay : shared; # One-wire delay
our $blnRunning : shared; # Signal boolean
our $intThreadCount : shared; # Holds the number of threads active
our %hshSensors : shared; # Sensor hash
our $OWFS : shared; # Main application
our $OWFS_MOUNT : shared; # Mounting point
$SIG{HUP} = \&doQuit;
$SIG{INT} = \&doQuit;
$SIG{TERM} = \&doQuit;
$SIG{CHLD} = 'IGNORE'; # Ignore child processes to prevent zomb
+ies
$OWFS = "/opt/owfs/bin/owfs";
$OWFS_MOUNT = "/var/1-wire";
#--------------------------------------------------
# Start application
#--------------------------------------------------
$intDelay = 5;
$intThreadCount = 0;
$blnRunning = 1;
# Start polling
`echo 1 > $OWFS_MOUNT/simultaneous/voltage`;
`echo 1 > $OWFS_MOUNT/simultaneous/temperature`;
# Start thread for monitoring
threads->new(\&doTemp, "Temperature 1", "10.D76B5A010800", 30, 0.2, ""
+);
threads->new(\&doTemp, "Temperature 2", "10.FB865A010800", 25, 0.2, ""
+);
# Just something to keep the script rolling in the background
while (1) {
sleep 3600;
};
#--------------------------------------------------
# Thread sub
sub doTemp {
my ($strTitle, $strDevice, $dblNominal, $dblHysteris, $strStatus)
+= @_;
my ($dblCurrent, $dblHigh, $dblLow);
# Increment thread count
$intThreadCount++;
# Initialize values
$dblCurrent = 0;
$dblHigh = ($dblNominal + $dblHysteris);
$dblLow = ($dblNominal - $dblHysteris);
# Start main loop
while ($blnRunning) {
# Poll sensor
$dblCurrent = `cat /var/1-wire/uncached/$strDevice/temperature
+`;
$dblCurrent =~ s/^\s+//;
$dblCurrent =~ s/\s+$//;
if ($dblCurrent) {
if ($dblCurrent >= $dblHigh) {
$strStatus = "TOO HOT ($dblCurrent / $dblHigh)";
} elsif ($dblCurrent <= $dblLow) {
$strStatus = "TOO COLD ($dblCurrent / $dblLow)";
} else {
$strStatus = "WITHIN RANGE ($dblCurrent)";
}
# Dump data
print "-> ($intThreadCount) $strTitle: $strStatus\n";
}
sleep $intDelay;
}
# Decrement thread count
$intThreadCount--;
# Bail thread
print "-> Polling of $strTitle stopped.\n";
}
# Closes current server and bails out
sub doQuit() {
$blnRunning = 0;
# Close threads which are running
print "-> Waiting for destruction\n";
while ($intThreadCount > 0) {
sleep 1;
}
print "-> Server destroyed\n";
exit;
}
|