2
0

simple_timer.pas 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. program simpletimer;
  2. uses exec, timer, amigados, amigalib;
  3. { manifest constants -- 'never will change' }
  4. const
  5. SECSPERMIN = (60);
  6. SECSPERHOUR = (60*60);
  7. SECSPERDAY = (60*60*24);
  8. var
  9. seconds : longint;
  10. tr : ptimerequest; { IO block for timer commands }
  11. oldtimeval : ttimeval; { timevals to store times }
  12. mytimeval : ttimeval;
  13. currentval : ttimeval;
  14. Function Create_Timer(theUnit : longint) : pTimeRequest;
  15. var
  16. Error : longint;
  17. TimerPort : pMsgPort;
  18. TimeReq : pTimeRequest;
  19. begin
  20. TimerPort := CreatePort(Nil, 0);
  21. if TimerPort = Nil then
  22. Create_Timer := Nil;
  23. TimeReq := pTimeRequest(CreateExtIO(TimerPort,sizeof(tTimeRequest)));
  24. if TimeReq = Nil then begin
  25. DeletePort(TimerPort);
  26. Create_Timer := Nil;
  27. end;
  28. Error := OpenDevice(TIMERNAME, theUnit, pIORequest(TimeReq), 0);
  29. if Error <> 0 then begin
  30. DeleteExtIO(pIORequest(TimeReq));
  31. DeletePort(TimerPort);
  32. Create_Timer := Nil;
  33. end;
  34. TimerBase := pointer(TimeReq^.tr_Node.io_Device);
  35. Create_Timer := pTimeRequest(TimeReq);
  36. end;
  37. Procedure Delete_Timer(WhichTimer : pTimeRequest);
  38. var
  39. WhichPort : pMsgPort;
  40. begin
  41. WhichPort := WhichTimer^.tr_Node.io_Message.mn_ReplyPort;
  42. if assigned(WhichTimer) then begin
  43. CloseDevice(pIORequest(WhichTimer));
  44. DeleteExtIO(pIORequest(WhichTimer));
  45. end;
  46. if assigned(WhichPort) then
  47. DeletePort(WhichPort);
  48. end;
  49. procedure wait_for_timer(tr : ptimerequest; tv : ptimeval);
  50. begin
  51. tr^.tr_node.io_Command := TR_ADDREQUEST; { add a new timer request }
  52. { structure assignment }
  53. tr^.tr_time.tv_secs := tv^.tv_secs;
  54. tr^.tr_time.tv_micro := tv^.tv_micro;
  55. { post request to the timer -- will go to sleep till done }
  56. DoIO(pIORequest(tr));
  57. end;
  58. { more precise timer than AmigaDOS Delay() }
  59. function time_delay(tv : ptimeval; theunit : longint): longint;
  60. var
  61. tr : ptimerequest;
  62. begin
  63. { get a pointer to an initialized timer request block }
  64. tr := create_timer(theunit);
  65. { any nonzero return says timedelay routine didn't work. }
  66. if tr = NIL then time_delay := -1;
  67. wait_for_timer(tr, tv);
  68. { deallocate temporary structures }
  69. delete_timer(tr);
  70. time_delay := 0;
  71. end;
  72. function set_new_time(secs : longint): longint;
  73. var
  74. tr : ptimerequest;
  75. begin
  76. tr := create_timer(UNIT_MICROHZ);
  77. { non zero return says error }
  78. if tr = nil then set_new_time := -1;
  79. tr^.tr_time.tv_secs := secs;
  80. tr^.tr_time.tv_micro := 0;
  81. tr^.tr_node.io_Command := TR_SETSYSTIME;
  82. DoIO(pIORequest(tr));
  83. delete_timer(tr);
  84. set_new_time := 0;
  85. end;
  86. function get_sys_time(tv : ptimeval): longint;
  87. var
  88. tr : ptimerequest;
  89. begin
  90. tr := create_timer( UNIT_MICROHZ );
  91. { non zero return says error }
  92. if tr = nil then get_sys_time := -1;
  93. tr^.tr_node.io_Command := TR_GETSYSTIME;
  94. DoIO(pIORequest(tr));
  95. { structure assignment }
  96. tv^ := tr^.tr_time;
  97. delete_timer(tr);
  98. get_sys_time := 0;
  99. end;
  100. procedure show_time(secs : longint);
  101. var
  102. days,hrs,mins : longint;
  103. begin
  104. { Compute days, hours, etc. }
  105. mins := secs div 60;
  106. hrs := mins div 60;
  107. days := hrs div 24;
  108. secs := secs mod 60;
  109. mins := mins mod 60;
  110. hrs := hrs mod 24;
  111. { Display the time }
  112. writeln('* Hour Minute Second (Days since Jan.1,1978)');
  113. writeln('* ', hrs, ': ',mins,': ', secs,' ( ',days, ' )');
  114. writeln;
  115. end;
  116. begin
  117. writeln('Timer test');
  118. { sleep for two seconds }
  119. currentval.tv_secs := 2;
  120. currentval.tv_micro := 0;
  121. time_delay(@currentval, UNIT_VBLANK);
  122. writeln('After 2 seconds delay');
  123. { sleep for four seconds }
  124. currentval.tv_secs := 4;
  125. currentval.tv_micro := 0;
  126. time_delay(@currentval, UNIT_VBLANK);
  127. writeln('After 4 seconds delay');
  128. { sleep for 500,000 micro-seconds = 1/2 second }
  129. currentval.tv_secs := 0;
  130. currentval.tv_micro := 500000;
  131. time_delay(@currentval, UNIT_MICROHZ);
  132. writeln('After 1/2 second delay');
  133. writeln('DOS Date command shows: ');
  134. Execute('date', 0, 0);
  135. { save what system thinks is the time....we'll advance it temporarily }
  136. get_sys_time(@oldtimeval);
  137. writeln('Original system time is:');
  138. show_time(oldtimeval.tv_secs );
  139. writeln('Setting a new system time');
  140. seconds := 1000 * SECSPERDAY + oldtimeval.tv_secs;
  141. set_new_time( seconds );
  142. { (if user executes the AmigaDOS DATE command now, he will}
  143. { see that the time has advanced something over 1000 days }
  144. write('DOS Date command now shows: ');
  145. Execute('date', 0, 0);
  146. get_sys_time(@mytimeval);
  147. writeln('Current system time is:');
  148. show_time(mytimeval.tv_secs);
  149. { Added the microseconds part to show that time keeps }
  150. { increasing even though you ask many times in a row }
  151. writeln('Now do three TR_GETSYSTIMEs in a row (notice how the microseconds increase)');
  152. writeln;
  153. get_sys_time(@mytimeval);
  154. writeln('First TR_GETSYSTIME ',mytimeval.tv_secs,'.', mytimeval.tv_micro);
  155. get_sys_time(@mytimeval);
  156. writeln('Second TR_GETSYSTIME ',mytimeval.tv_secs,'.', mytimeval.tv_micro);
  157. get_sys_time(@mytimeval);
  158. writeln('Third TR_GETSYSTIME ',mytimeval.tv_secs,'.', mytimeval.tv_micro);
  159. writeln;
  160. writeln('Resetting to former time');
  161. set_new_time(oldtimeval.tv_secs);
  162. get_sys_time(@mytimeval);
  163. writeln('Current system time is:');
  164. show_time(mytimeval.tv_secs);
  165. end.