1
$\begingroup$

I would like to make a countdown timer, but cannot find a reliable method to make the DateList[] function reverse.

The not so robust code for the Digital Clock with the display of seconds follows:

digit[i_, xoffset_] := Module[{params},
   params = Part[segmentParams, segmentPieces[[i + 1]]];
   params = Map[# + {0, xoffset, 0, 0} &, params];
   Graphics[makeSegment /@ params]];

makeSegment[params_] := 
 Translate[
  Rotate[Polygon[{{0, 0}, {params[[4]], 0}, {params[[4]] + 1/4, 
  1/4}, {params[[4]], 1/2}, {0, 1/2}, {-1/4, 1/4}}], 
   params[[1]] Degree], {params[[2]], params[[3]]}]
segmentParams = {{0, 0, 1.2, 1}, {90,-.6, .6, .6}, {90,1,.6,.6}, {0, 0, 0, 1},
     {90,-.6,-.6,.6}, {90, 1,-.6,.6}, {0, 0,-1.2, 1}};
segmentPieces = {{1, 2, 3, 5, 6, 7}, {3, 6}, {1, 3, 4, 5, 7}, {1, 3, 4, 6, 7},
 {2, 3, 4, 6}, {1, 2, 4, 6, 7}, {1, 2, 4, 5, 6, 7}, {1, 3, 6}, 
 {1, 2, 3, 4, 5, 6, 7}, {1, 2, 3, 4, 6, 7}};
timer = Dynamic@Refresh[Show[{digit[Floor[DateList[][[6]]/10], 12], 
 digit[Mod[Floor@DateList[][[6]], 10], 15]}, ImageSize -> 26], UpdateInterval -> 1]

I say not so robust because after it's running, it has a tendency to stop. Not sure why yet, but none the less I would like to make it run backwards. I can use: RunScheduledTask to begin the timer and set an alarm but would like to show the time counting down.

$\endgroup$
4
  • 3
    $\begingroup$ migrated to theoretical physics -- ;-) $\endgroup$
    – Mr.Wizard
    Commented Jul 22, 2012 at 1:25
  • 1
    $\begingroup$ @Mr.Wizard I wonder if he meant "backwards into the future" ;-) $\endgroup$ Commented Jul 22, 2012 at 1:27
  • 2
    $\begingroup$ There is too much code here and stress on digital display. I am also not really sure what the author wants. So I just added a question which may (or may not) be helpful in this case. mathematica.stackexchange.com/questions/8595/… $\endgroup$ Commented Jul 22, 2012 at 2:25
  • 1
    $\begingroup$ @Mr.Wizard Comes in handy when you just need another minute ;-) thanks! $\endgroup$ Commented Jul 22, 2012 at 2:50

1 Answer 1

3
$\begingroup$

Replace your timer = .. by

tf = IntegerPart[AbsoluteTime[] + 60];

Dynamic@Refresh[
  Show[{digit[#[[-2]], 12], digit[#[[-1]], 15]}, ImageSize -> 26] &@
   IntegerDigits[1000 + tf - IntegerPart@AbsoluteTime[]],   UpdateInterval -> 1]

Edit

To force the countdown to stop after reaching zero, you could do something like:

tf = IntegerPart[AbsoluteTime[] + 10];
expired = False;
Dynamic@Refresh[
  If[(! expired ) && # != {1, 0, 0}, 
     Show[{digit[#[[-2]], 12], digit[#[[-1]], 15]}, ImageSize -> 26],
     (expired = True; digit[0, 12])] &@
              IntegerDigits[100 + tf - IntegerPart@AbsoluteTime[]], 
  UpdateInterval -> 1]
$\endgroup$
1
  • $\begingroup$ Great solution. Thank you $\endgroup$ Commented Jul 22, 2012 at 2:53

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.