#!/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 zombies $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; }