announce.pl 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. # Local modules
  5. use Cwd qw(abs_path);
  6. use File::Basename qw(dirname);
  7. use lib dirname(abs_path($0));
  8. use DMX;
  9. # App config
  10. my $DATA_DIR = DMX::dataDir();
  11. my $STATE_SOCK = 'ANNOUNCE';
  12. my $OUTPUT_FILE = $DATA_DIR . $STATE_SOCK;
  13. my $PUSH_TIMEOUT = 20;
  14. my $PULL_TIMEOUT = $PUSH_TIMEOUT * 3;
  15. my $DELAY = $PULL_TIMEOUT / 2;
  16. # Debug
  17. my $DEBUG = 0;
  18. if ($ENV{'DEBUG'}) {
  19. $DEBUG = 1;
  20. }
  21. # State
  22. my %exists = ();
  23. my %last = ();
  24. my $pullLast = time();
  25. # Sockets
  26. DMX::stateSocket($STATE_SOCK);
  27. DMX::stateSubscribe($STATE_SOCK);
  28. # Loop forever
  29. while (1) {
  30. # Remember the last state, for comparison
  31. %last = %exists;
  32. # Wait for state updates
  33. my $cmdState = DMX::readState($DELAY, \%exists, undef(), undef());
  34. if (defined($cmdState)) {
  35. $pullLast = time();
  36. }
  37. # Die if we don't see regular updates
  38. if (time() - $pullLast > $PULL_TIMEOUT) {
  39. die('No update on state socket in past ' . $PULL_TIMEOUT . " seconds. Exiting...\n");
  40. }
  41. # Speak when BRIGHT changes
  42. if (exists($exists{'BRIGHT'}) && exists($last{'BRIGHT'}) && $exists{'BRIGHT'} ne $last{'BRIGHT'}) {
  43. if ($exists{'BRIGHT'}) {
  44. DMX::say('Lights - Full power');
  45. } else {
  46. DMX::say('Lights - Nominal power');
  47. }
  48. }
  49. # Speak when LIGHTS changes
  50. if (exists($exists{'LIGHTS'}) && exists($last{'LIGHTS'}) && $exists{'LIGHTS'} ne $last{'LIGHTS'}) {
  51. if ($exists{'LIGHTS'}) {
  52. DMX::say('Lights up');
  53. } else {
  54. DMX::say('Lights down');
  55. }
  56. }
  57. # Speak when NO_MOTION changes
  58. if (exists($exists{'NO_MOTION'}) && exists($last{'NO_MOTION'}) && $exists{'NO_MOTION'} ne $last{'NO_MOTION'}) {
  59. if ($exists{'NO_MOTION'}) {
  60. DMX::say('Motion detectors: Disabled');
  61. } else {
  62. DMX::say('Motion detectors: Enabled');
  63. }
  64. }
  65. }