Explorar o código

Consolide the output/update system

Zachary Kotlarek %!s(int64=13) %!d(string=hai) anos
pai
achega
309f120317
Modificáronse 6 ficheiros con 106 adicións e 118 borrados
  1. 50 5
      dmx/DMX.pm
  2. 11 18
      dmx/bias.pl
  3. 11 18
      dmx/fan.pl
  4. 12 41
      dmx/leds.pl
  5. 11 18
      dmx/overhead.pl
  6. 11 18
      dmx/rope.pl

+ 50 - 5
dmx/DMX.pm

@@ -1,6 +1,7 @@
 #!/usr/bin/perl
 #!/usr/bin/perl
 use strict;
 use strict;
 use warnings;
 use warnings;
+use File::Temp;
 use IO::Socket::UNIX;
 use IO::Socket::UNIX;
 
 
 # Package name
 # Package name
@@ -20,6 +21,11 @@ chomp($TEMP_DIR);
 my $DATA_DIR     = $TEMP_DIR . 'plexMonitor/';
 my $DATA_DIR     = $TEMP_DIR . 'plexMonitor/';
 my $DMX_SOCK     = $DATA_DIR . 'DMX.socket';
 my $DMX_SOCK     = $DATA_DIR . 'DMX.socket';
 my $SUB_SOCK     = $DATA_DIR . 'STATE.socket';
 my $SUB_SOCK     = $DATA_DIR . 'STATE.socket';
+my %CHANNEL_ADJ  = (
+	'13' => 1.00,
+	'14' => 1.14,
+	'15' => 1.19,
+);
 
 
 # State
 # State
 my $DMX_FH = undef();
 my $DMX_FH = undef();
@@ -121,14 +127,21 @@ sub dim($) {
 		die('Invalid command for socket: ' . join(', ', keys(%{$args})) . ': ' . join(', ', values(%{$args})) . "\n");
 		die('Invalid command for socket: ' . join(', ', keys(%{$args})) . ': ' . join(', ', values(%{$args})) . "\n");
 	}
 	}
 
 
-	# Keep us in-range
-	my $value = int($args->{'value'});
+	# Adjust for the color curve (for channels where we have such data)
+	my $value = $args->{'value'};
+	if ($CHANNEL_ADJ{$args->{'channel'}}) {
+		$value *= $CHANNEL_ADJ{$args->{'channel'}};
+	}
+
+	# 8-bit values
+	$value = int($value);
 	if ($value > 255) {
 	if ($value > 255) {
 		$value = 255;
 		$value = 255;
 	} elsif ($value < 0) {
 	} elsif ($value < 0) {
 		$value = 0;
 		$value = 0;
 	}
 	}
 
 
+	# We only deal in ints
 	my $time  = int($args->{'time'});
 	my $time  = int($args->{'time'});
 	my $delay = int($args->{'delay'});
 	my $delay = int($args->{'delay'});
 
 
@@ -145,14 +158,46 @@ sub printDataset($) {
 	my $sum = 0;
 	my $sum = 0;
 	foreach my $data (@{ $data_set }) {
 	foreach my $data (@{ $data_set }) {
 		$sum += $data->{'value'};
 		$sum += $data->{'value'};
-		my $delay = '';
+		my $str = $data->{'channel'} . ' => ' . int($data->{'value'}) . ' @ ' . $data->{'time'};
 		if ($data->{'delay'}) {
 		if ($data->{'delay'}) {
-			$delay = ' (Delay: ' . $data->{'delay'} . ')';
+			$str .= ' (Delay: ' . $data->{'delay'} . ')';
 		}
 		}
-		print STDERR "\t" . $data->{'channel'} . ' => ' . int($data->{'value'}) . ' @ ' . $data->{'time'} . $delay . "\n";
+		print STDERR "\t" . $str . "\n";
 	}
 	}
 	print STDERR "\tTotal: " . int($sum) . "\n";
 	print STDERR "\tTotal: " . int($sum) . "\n";
 }
 }
 
 
+sub applyDataset($$$) {
+	my ($data_set, $state, $file) = @_;
+	if (!defined($state)) {
+		$state = 'NULL';
+	}
+
+	# Debug
+	if ($DEBUG) {
+		print STDERR 'State: ' . $state . "\n";
+		printDataset($data_set);
+	}
+
+	# Send the dim command
+	my @values = ();
+	foreach my $data (@{ $data_set }) {
+		dim($data);
+		my $str = $data->{'channel'} . ' => ' . $data->{'value'} . ' @ ' . $data->{'time'};
+		if ($data->{'delay'}) {
+			$str .= ' (Delay: ' . $data->{'delay'} . ')';
+		}
+		push(@values, $str);
+	}
+
+	# Save the state and value to disk
+	if (length($file)) {
+		my ($fh, $tmp) = File::Temp::tempfile($file . '.XXXXXXXX', 'UNLINK' => 0);
+		print $fh 'State: ' . $state . "\n" . join("\n", @values) . "\n";
+		close($fh);
+		rename($tmp, $file);
+	}
+}
+
 # Always return true
 # Always return true
 1;
 1;

+ 11 - 18
dmx/bias.pl

@@ -2,7 +2,6 @@
 use strict;
 use strict;
 use warnings;
 use warnings;
 use IO::Select;
 use IO::Select;
-use File::Temp qw( tempfile );
 
 
 # Local modules
 # Local modules
 use Cwd qw(abs_path);
 use Cwd qw(abs_path);
@@ -30,7 +29,8 @@ my %DIM = (
 my $TEMP_DIR     = `getconf DARWIN_USER_TEMP_DIR`;
 my $TEMP_DIR     = `getconf DARWIN_USER_TEMP_DIR`;
 chomp($TEMP_DIR);
 chomp($TEMP_DIR);
 my $DATA_DIR     = $TEMP_DIR . 'plexMonitor/';
 my $DATA_DIR     = $TEMP_DIR . 'plexMonitor/';
-my $STATE_SOCK   = $DATA_DIR . 'ROPE.socket';
+my $OUTPUT_FILE  = $DATA_DIR . 'BIAS';
+my $STATE_SOCK   = $OUTPUT_FILE . '.socket';
 my $PUSH_TIMEOUT = 20;
 my $PUSH_TIMEOUT = 20;
 my $PULL_TIMEOUT = $PUSH_TIMEOUT * 3;
 my $PULL_TIMEOUT = $PUSH_TIMEOUT * 3;
 
 
@@ -107,25 +107,18 @@ while (1) {
 		die('No update on state socket in past ' . $PULL_TIMEOUT . " seconds. Exiting...\n");
 		die('No update on state socket in past ' . $PULL_TIMEOUT . " seconds. Exiting...\n");
 	}
 	}
 
 
-	# Update the fan state
-	if ($forceUpdate || $stateLast ne $state) {
+	# Force updates on any state change
+	if ($stateLast ne $state) {
 		if ($DEBUG) {
 		if ($DEBUG) {
-			print STDERR 'State: ' . $stateLast . ' => ' . $state . "\n";
-			DMX::printDataset($DIM{$state});
-		}
-
-		# Send the dim command
-		my @values = ();
-		foreach my $data (@{ $DIM{$state} }) {
-			DMX::dim($data);
-			push(@values, $data->{'channel'} . ' => ' . $data->{'value'} . ' @ ' . $data->{'time'});
+			print STDERR 'State change: ' . $stateLast . ' => ' . $state . "\n";
 		}
 		}
+		$forceUpdate = 1;
+	}
 
 
-		# Save the state and value to disk
-		my ($fh, $tmp) = tempfile($DATA_DIR . 'BIAS.XXXXXXXX', 'UNLINK' => 0);
-		print $fh 'State: ' . $state . "\n" . join("\n", @values) . "\n";
-		close($fh);
-		rename($tmp, $DATA_DIR . 'BIAS');
+	# Update the lighting
+	if ($forceUpdate) {
+		# Update
+		DMX::applyDataset($DIM{$state}, $state, $OUTPUT_FILE);
 
 
 		# Update the push time
 		# Update the push time
 		$pushLast = time();
 		$pushLast = time();

+ 11 - 18
dmx/fan.pl

@@ -2,7 +2,6 @@
 use strict;
 use strict;
 use warnings;
 use warnings;
 use IO::Select;
 use IO::Select;
-use File::Temp qw( tempfile );
 
 
 # Local modules
 # Local modules
 use Cwd qw(abs_path);
 use Cwd qw(abs_path);
@@ -24,7 +23,8 @@ my %DIM = (
 my $TEMP_DIR     = `getconf DARWIN_USER_TEMP_DIR`;
 my $TEMP_DIR     = `getconf DARWIN_USER_TEMP_DIR`;
 chomp($TEMP_DIR);
 chomp($TEMP_DIR);
 my $DATA_DIR     = $TEMP_DIR . 'plexMonitor/';
 my $DATA_DIR     = $TEMP_DIR . 'plexMonitor/';
-my $STATE_SOCK   = $DATA_DIR . 'ROPE.socket';
+my $OUTPUT_FILE  = $DATA_DIR . 'FAN';
+my $STATE_SOCK   = $OUTPUT_FILE . '.socket';
 my $PUSH_TIMEOUT = 20;
 my $PUSH_TIMEOUT = 20;
 my $PULL_TIMEOUT = $PUSH_TIMEOUT * 3;
 my $PULL_TIMEOUT = $PUSH_TIMEOUT * 3;
 
 
@@ -102,25 +102,18 @@ while (1) {
 		die('No update on state socket in past ' . $PULL_TIMEOUT . " seconds. Exiting...\n");
 		die('No update on state socket in past ' . $PULL_TIMEOUT . " seconds. Exiting...\n");
 	}
 	}
 
 
-	# Update the fan state
-	if ($forceUpdate || $stateLast ne $state) {
+	# Force updates on any state change
+	if ($stateLast ne $state) {
 		if ($DEBUG) {
 		if ($DEBUG) {
-			print STDERR 'State: ' . $stateLast . ' => ' . $state . "\n";
-			DMX::printDataset($DIM{$state});
-		}
-
-		# Send the dim command
-		my @values = ();
-		foreach my $data (@{ $DIM{$state} }) {
-			DMX::dim($data);
-			push(@values, $data->{'channel'} . ' => ' . $data->{'value'} . ' @ ' . $data->{'time'});
+			print STDERR 'State change: ' . $stateLast . ' => ' . $state . "\n";
 		}
 		}
+		$forceUpdate = 1;
+	}
 
 
-		# Save the state and value to disk
-		my ($fh, $tmp) = tempfile($DATA_DIR . 'FAN.XXXXXXXX', 'UNLINK' => 0);
-		print $fh 'State: ' . $state . "\n" . join("\n", @values) . "\n";
-		close($fh);
-		rename($tmp, $DATA_DIR . 'FAN');
+	# Update the fan
+	if ($forceUpdate) {
+		# Update
+		DMX::applyDataset($DIM{$state}, $state, $OUTPUT_FILE);
 
 
 		# Update the push time
 		# Update the push time
 		$pushLast = time();
 		$pushLast = time();

+ 12 - 41
dmx/leds.pl

@@ -3,7 +3,6 @@ use strict;
 use warnings;
 use warnings;
 use IO::Select;
 use IO::Select;
 use Math::Random;
 use Math::Random;
-use File::Temp qw( tempfile );
 use Time::HiRes qw( usleep );
 use Time::HiRes qw( usleep );
 
 
 # Local modules
 # Local modules
@@ -61,14 +60,10 @@ my %DIM            = (
 my $TEMP_DIR     = `getconf DARWIN_USER_TEMP_DIR`;
 my $TEMP_DIR     = `getconf DARWIN_USER_TEMP_DIR`;
 chomp($TEMP_DIR);
 chomp($TEMP_DIR);
 my $DATA_DIR     = $TEMP_DIR . 'plexMonitor/';
 my $DATA_DIR     = $TEMP_DIR . 'plexMonitor/';
-my $STATE_SOCK   = $DATA_DIR . 'LED.socket';
+my $OUTPUT_FILE  = $DATA_DIR . 'LED';
+my $STATE_SOCK   = $OUTPUT_FILE . '.socket';
 my $PUSH_TIMEOUT = 20;
 my $PUSH_TIMEOUT = 20;
 my $PULL_TIMEOUT = 60;
 my $PULL_TIMEOUT = 60;
-my %CHANNEL_ADJ  = (
-	'13' => 1.00,
-	'14' => 1.14,
-	'15' => 1.19,
-);
 
 
 # Reset the push timeout if the color timeout is longer
 # Reset the push timeout if the color timeout is longer
 if ($PUSH_TIMEOUT < $COLOR_TIMEOUT) {
 if ($PUSH_TIMEOUT < $COLOR_TIMEOUT) {
@@ -171,9 +166,6 @@ while (1) {
 		}
 		}
 	}
 	}
 	$state = $newState;
 	$state = $newState;
-	if ($DEBUG) {
-		print STDERR 'State: ' . $state . "\n";
-	}
 
 
 	# Color changes
 	# Color changes
 	if ($COLOR_VAR{$state} && time() - $colorChange > $COLOR_TIMEOUT) {
 	if ($COLOR_VAR{$state} && time() - $colorChange > $COLOR_TIMEOUT) {
@@ -228,49 +220,28 @@ while (1) {
 		# Reset the color change sequence, so we always spend 1 cycle at white
 		# Reset the color change sequence, so we always spend 1 cycle at white
 		@COLOR       = ();
 		@COLOR       = ();
 		$colorChange = time() + $COLOR_TIME_MIN;
 		$colorChange = time() + $COLOR_TIME_MIN;
+
+		# Debug
+		if ($DEBUG) {
+			print STDERR 'State change: ' . $stateLast . ' => ' . $state . "\n";
+		}
 	}
 	}
 
 
 	# Update the lighting
 	# Update the lighting
 	if ($forceUpdate) {
 	if ($forceUpdate) {
 
 
 		# Select a data set (color or standard)
 		# Select a data set (color or standard)
-		my @data_set = ();
+		my @data_set    = ();
+		my $local_state = $state;
 		if (scalar(@COLOR)) {
 		if (scalar(@COLOR)) {
 			@data_set = @COLOR;
 			@data_set = @COLOR;
+			$local_state .= ' (Color)';
 		} else {
 		} else {
 			@data_set = @{ $DIM{$state} };
 			@data_set = @{ $DIM{$state} };
 		}
 		}
 
 
-		# Debug
-		if ($DEBUG) {
-			print STDERR 'State: ' . $stateLast . ' => ' . $state . ' (Color: ' . scalar(@COLOR) . ")\n";
-			DMX::printDataset(\@data_set);
-		}
-
-		# Send the dim command
-		my @values = ();
-		foreach my $orig (@data_set) {
-
-			# Copy the dataset for local manipulation
-			my %data = ();
-			foreach my $key (keys(%{ $orig })) {
-				$data{$key} = $orig->{$key};
-			}
-
-			# Adjust the gamma curve (for channels where we have such data)
-			if ($CHANNEL_ADJ{$data{'channel'}}) {
-				$data{'value'} *= $CHANNEL_ADJ{$data{'channel'}};
-			}
-
-			DMX::dim(\%data);
-			push(@values, $data{'channel'} . ' => ' . $data{'value'} . ' @ ' . $data{'time'});
-		}
-
-		# Save the state and value to disk
-		my ($fh, $tmp) = tempfile($DATA_DIR . 'LED.XXXXXXXX', 'UNLINK' => 0);
-		print $fh 'State: ' . $state . "\n" . join("\n", @values) . "\n";
-		close($fh);
-		rename($tmp, $DATA_DIR . 'LED');
+		# Update
+		DMX::applyDataset(\@data_set, $local_state, $OUTPUT_FILE);
 
 
 		# Update the push time
 		# Update the push time
 		$pushLast = time();
 		$pushLast = time();

+ 11 - 18
dmx/overhead.pl

@@ -2,7 +2,6 @@
 use strict;
 use strict;
 use warnings;
 use warnings;
 use IO::Select;
 use IO::Select;
-use File::Temp qw( tempfile );
 
 
 # Local modules
 # Local modules
 use Cwd qw(abs_path);
 use Cwd qw(abs_path);
@@ -33,7 +32,8 @@ my %DIM = (
 my $TEMP_DIR     = `getconf DARWIN_USER_TEMP_DIR`;
 my $TEMP_DIR     = `getconf DARWIN_USER_TEMP_DIR`;
 chomp($TEMP_DIR);
 chomp($TEMP_DIR);
 my $DATA_DIR     = $TEMP_DIR . 'plexMonitor/';
 my $DATA_DIR     = $TEMP_DIR . 'plexMonitor/';
-my $STATE_SOCK   = $DATA_DIR . 'ROPE.socket';
+my $OUTPUT_FILE  = $DATA_DIR . 'OVERHEAD';
+my $STATE_SOCK   = $OUTPUT_FILE . '.socket';
 my $PUSH_TIMEOUT = 20;
 my $PUSH_TIMEOUT = 20;
 my $PULL_TIMEOUT = $PUSH_TIMEOUT * 3;
 my $PULL_TIMEOUT = $PUSH_TIMEOUT * 3;
 
 
@@ -119,25 +119,18 @@ while (1) {
 		die('No update on state socket in past ' . $PULL_TIMEOUT . " seconds. Exiting...\n");
 		die('No update on state socket in past ' . $PULL_TIMEOUT . " seconds. Exiting...\n");
 	}
 	}
 
 
-	# Update the fan state
-	if ($forceUpdate || $stateLast ne $state) {
+	# Force updates on any state change
+	if ($stateLast ne $state) {
 		if ($DEBUG) {
 		if ($DEBUG) {
-			print STDERR 'State: ' . $stateLast . ' => ' . $state . "\n";
-			DMX::printDataset($DIM{$state});
-		}
-
-		# Send the dim command
-		my @values = ();
-		foreach my $data (@{ $DIM{$state} }) {
-			DMX::dim($data);
-			push(@values, $data->{'channel'} . ' => ' . $data->{'value'} . ' @ ' . $data->{'time'});
+			print STDERR 'State change: ' . $stateLast . ' => ' . $state . "\n";
 		}
 		}
+		$forceUpdate = 1;
+	}
 
 
-		# Save the state and value to disk
-		my ($fh, $tmp) = tempfile($DATA_DIR . 'BIAS.XXXXXXXX', 'UNLINK' => 0);
-		print $fh 'State: ' . $state . "\n" . join("\n", @values) . "\n";
-		close($fh);
-		rename($tmp, $DATA_DIR . 'BIAS');
+	# Update the lighting
+	if ($forceUpdate) {
+		# Update
+		DMX::applyDataset($DIM{$state}, $state, $OUTPUT_FILE);
 
 
 		# Update the push time
 		# Update the push time
 		$pushLast = time();
 		$pushLast = time();

+ 11 - 18
dmx/rope.pl

@@ -2,7 +2,6 @@
 use strict;
 use strict;
 use warnings;
 use warnings;
 use IO::Select;
 use IO::Select;
-use File::Temp qw( tempfile );
 
 
 # Local modules
 # Local modules
 use Cwd qw(abs_path);
 use Cwd qw(abs_path);
@@ -61,7 +60,8 @@ my %DIM = (
 my $TEMP_DIR     = `getconf DARWIN_USER_TEMP_DIR`;
 my $TEMP_DIR     = `getconf DARWIN_USER_TEMP_DIR`;
 chomp($TEMP_DIR);
 chomp($TEMP_DIR);
 my $DATA_DIR     = $TEMP_DIR . 'plexMonitor/';
 my $DATA_DIR     = $TEMP_DIR . 'plexMonitor/';
-my $STATE_SOCK   = $DATA_DIR . 'ROPE.socket';
+my $OUTPUT_FILE  = $DATA_DIR . 'ROPE';
+my $STATE_SOCK   = $OUTPUT_FILE . '.socket';
 my $PUSH_TIMEOUT = 20;
 my $PUSH_TIMEOUT = 20;
 my $PULL_TIMEOUT = $PUSH_TIMEOUT * 3;
 my $PULL_TIMEOUT = $PUSH_TIMEOUT * 3;
 
 
@@ -147,25 +147,18 @@ while (1) {
 		die('No update on state socket in past ' . $PULL_TIMEOUT . " seconds. Exiting...\n");
 		die('No update on state socket in past ' . $PULL_TIMEOUT . " seconds. Exiting...\n");
 	}
 	}
 
 
-	# Update the lighting
-	if ($forceUpdate || $stateLast ne $state) {
+	# Force updates on any state change
+	if ($stateLast ne $state) {
 		if ($DEBUG) {
 		if ($DEBUG) {
-			print STDERR 'State: ' . $stateLast . ' => ' . $state . "\n";
-			DMX::printDataset($DIM{$state});
-		}
-
-		# Send the dim command
-		my @values = ();
-		foreach my $data (@{ $DIM{$state} }) {
-			DMX::dim($data);
-			push(@values, $data->{'channel'} . ' => ' . $data->{'value'} . ' @ ' . $data->{'time'});
+			print STDERR 'State change: ' . $stateLast . ' => ' . $state . "\n";
 		}
 		}
+		$forceUpdate = 1;
+	}
 
 
-		# Save the state and value to disk
-		my ($fh, $tmp) = tempfile($DATA_DIR . 'ROPE.XXXXXXXX', 'UNLINK' => 0);
-		print $fh 'State: ' . $state . "\n" . join("\n", @values) . "\n";
-		close($fh);
-		rename($tmp, $DATA_DIR . 'ROPE');
+	# Update the lighting
+	if ($forceUpdate) {
+		# Update
+		DMX::applyDataset($DIM{$state}, $state, $OUTPUT_FILE);
 
 
 		# Update the push time
 		# Update the push time
 		$pushLast = time();
 		$pushLast = time();