/tags/v2-72/mh/code/common/timers.pl

# · Perl · 128 lines · 95 code · 13 blank · 20 comment · 27 complexity · 594a7234adfd8ca75116ac537f6fb67f MD5 · raw file

  1. # Category= Time
  2. #@ This modules provides basic timer functionality. After
  3. #@ activation, you can set various timers.
  4. # This code processes tk/web entered timer data
  5. # It also allows for limited voice command timers
  6. # Create Tk/Web widgets
  7. $timer_time = new Generic_Item;
  8. $timer_text = new Generic_Item;
  9. &tk_entry('Timer amount' => $timer_time, 'Timer Text' => $timer_text);
  10. # Create timers
  11. # - only set timer when time changes ... the web interface
  12. # will only set one field at a time :(
  13. #f (state_now $timer_time or state_now $timer_text) {
  14. if (state_now $timer_time) {
  15. my $timer_time = state $timer_time;
  16. my $timer_text = state $timer_text;
  17. my ($time, $unit) = $timer_time =~ /([\d\.]+) *(\S*)/;
  18. # Allow for unit shortcuts
  19. $unit = 'minute' unless $unit;
  20. $unit = 'second' if $unit =~ /^s/i;
  21. $unit = 'minute' if $unit =~ /^m/i;
  22. $unit = 'hour' if $unit =~ /^h/i;
  23. my $seconds = $time;
  24. $seconds *= 60 if $unit eq 'minute';
  25. $seconds *= 3600 if $unit eq 'hour';
  26. my $timer = new Timer;
  27. push @{$Persistent{timers}}, $timer;
  28. $timer->{text} = $timer_text;
  29. $timer->{time} = $time;
  30. $timer->{unit} = $unit;
  31. set $timer $seconds, "&expired_timer( '$time $unit', qq|$timer_text|)";
  32. speak "voice=male A $time $unit $timer_text timer has been set." ;
  33. print_log "$time $unit ($seconds seconds) $timer_text timer started";
  34. }
  35. sub expired_timer {
  36. my ($time, $text) = @_;
  37. play volume => 50, file => 'timer'; # Set in event_sounds.pl
  38. my $text2;
  39. if ($text) {
  40. $text2 = "Time to $text";
  41. }
  42. else {
  43. $text2 = 'Timer expired';
  44. }
  45. speak "voice=male pitch=10 rooms=all volume=100 Notice: $text2. The $time $text timer just expired";
  46. play volume => 50, file => 'timer'; # Set in event_sounds.pl
  47. }
  48. # Allow for limited voice command timers
  49. $v_minute_timer = new Voice_Cmd('Set a timer for [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,20,25,30,45,60,90,120] minutes');
  50. $v_minute_timer-> set_info('Set a minute timer. Time remaining will be periodically announced');
  51. if ($state = said $v_minute_timer) {
  52. speak "voice=male A timer has been set for $state minutes";
  53. set $timer_time "$state minuts";
  54. # set $timer_text 'minite';
  55. }
  56. # List all timers
  57. $v_list_timers = new Voice_Cmd('list all timers');
  58. $v_list_timers-> set_info('Summarize all timers');
  59. if ($state = said $v_list_timers) {
  60. if (@{$Persistent{timers}}) {
  61. for my $timer (@{$Persistent{timers}}) {
  62. my $time_left = seconds_remaining $timer;
  63. next unless $time_left;
  64. $time_left /= 60 if $timer->{unit} eq 'minute';
  65. $time_left /= 3600 if $timer->{unit} eq 'hour';
  66. $time_left = round $time_left, 1;
  67. if ($timer->{text}) {
  68. speak "voice=male $timer->{text} in " . &plural($time_left, $timer->{unit}) ;
  69. } else {
  70. speak "voice=male " . &plural($time_left, $timer->{unit}) . " left on the timer" ;
  71. }
  72. }
  73. }
  74. else {
  75. speak 'voice=male There are no active timers';
  76. }
  77. }
  78. # Speak periodic timer count-downs
  79. # - also delete expired timers
  80. my %timer_reminder_intervals = map {$_, 1} (1,2,3,4,5,10,20,30,60);
  81. if ($New_Second) {
  82. my $i = 0;
  83. for my $timer (@{$Persistent{timers}}) {
  84. my $time_left = seconds_remaining $timer;
  85. # Delete expired timers
  86. unless (defined $time_left) {
  87. splice @{$Persistent{timers}}, $i, 1;
  88. next;
  89. }
  90. $i++;
  91. $time_left = int $time_left;
  92. next if $time_left < 10;
  93. # print "db1 u=$timer->{unit} tl=$time_left\n";
  94. $time_left /= 60 if $timer->{unit} eq 'minute';
  95. $time_left /= 3600 if $timer->{unit} eq 'hour';
  96. my $pitch = int 10*(1 - $time_left/5);
  97. # $time_left = int $time_left;
  98. if ($timer_reminder_intervals{$time_left}) {
  99. if ($timer->{text}) {
  100. speak "voice=male pitch=$pitch $timer->{text} in " . &plural($time_left, $timer->{unit}) ;
  101. } else {
  102. speak "voice=male pitch=$pitch " . &plural($time_left, $timer->{unit}) . " left on the timer" ;
  103. }
  104. }
  105. }
  106. }
  107. # Cancel timers
  108. $v_timer_cancel = new Voice_Cmd 'Cancel all timers';
  109. if ($state = said $v_timer_cancel) {
  110. for my $timer (@{$Persistent{timers}}) {
  111. unset $timer;
  112. }
  113. undef @{$Persistent{timers}};
  114. speak "All timers have been canceled";
  115. }