home *** CD-ROM | disk | FTP | other *** search
- /*
- TimerUtils.cpp
-
- Version History:
- 2.0 Nov 5 95 HTD
- Updated file for PowerPC compatibility and add StartTimerFPS(),
- a much easier method for starting the timer (pass the max speed
- in terms of <frames per second> instead of passing a constant).
-
- -------------------------------
-
- Usage:
- A typical way to use TimerUtils is as follows:
-
- StartTimer(kTimerRate30fps); // Or use StartTimerFPS
- do {
- if (TimerDoNow()) {
- // Do your thing...
- AnimateNextFrame();
-
- ResetTimer();
- }
- }
- StopTimer();
- */
-
- #include <Timer.h> // Required Time Manager interfaces
- #include "TimerUtils.h"
-
- // ---------------------------------------------------------------------------
-
- typedef struct {
- TMTask atmTask;
- long tmWakeUp;
- long tmReserved;
- long tmRefCon;
- } TimerInfo, *TimerInfoPtr, **TimerInfoHdl;
-
- // --------------------------------------------------------------------------
-
- static TimerInfo gTimerInfoTask;
-
- static volatile short sIterationDelay = 0; // In milliseconds
- static short sIterationDelaySave = 0;
- volatile Boolean gTimeNow = true;
- static TimerUPP sTimerProc = NULL;
-
- // --------------------------------------------------------------------------
- // --------------------------------------------------------------------------
-
- #ifdef powerc
- pascal void TimerTaskUpdater(TimerInfoPtr recPtr);
- #else
- pascal void TimerTaskUpdater();
- #endif
-
- void InstallTimerTask();
-
- #ifdef powerc
- // nothing
- #else
- pascal TimerInfoPtr GetTimerInfoTask() = { 0x2E89 };
- #endif
-
- // --------------------------------------------------------------------------
-
- // TaskUpdater.
- // Gets called once the delayed time is up. Just sets the global time
- // variable, gTimeNow to true, resets the time delay for the next
- // time task, and inserts itself into the time manager
- // queue again so it gets called repeatedly.
-
- #ifdef powerc
- pascal void TimerTaskUpdater(TimerInfoPtr recPtr) {
- #else
- pascal void TimerTaskUpdater() {
- long oldA5;
- TimerInfoPtr recPtr;
-
- recPtr = GetTimerInfoTask();
- oldA5 = SetA5(recPtr->tmRefCon);
- #endif
-
- // Core stuff right here...
- gTimeNow = true;
- PrimeTime((QElemPtr)recPtr, sIterationDelay);
-
- #ifdef powerc
- // nothing
- #else
- oldA5 = SetA5(oldA5);
- #endif
- } // END TimerTaskUpdater
-
- // --------------------------------------------------------------------------
-
- // InstallTimerTask.
- // Installs the time task into the time manager queue initially and sets
- // the delay time between called tasks.
-
- void InstallTimerTask() {
- if (sIterationDelay == kTimerRateOff) {
- gTimeNow = true; // will always remain true so routines will run as
- return; // fast as the machine can run. Do not call Timer Manager.
- }
-
- if (sTimerProc == NULL) {
- // Keep it static so if we're on PowerPC we only
- // allocate the RoutineDescriptor *once*
- sTimerProc = NewTimerProc(TimerTaskUpdater);
- }
- gTimerInfoTask.atmTask.tmAddr = sTimerProc;
-
- gTimerInfoTask.tmWakeUp = 0;
- gTimerInfoTask.tmReserved = 0;
- gTimerInfoTask.tmRefCon = SetCurrentA5();
-
- InsTime((QElemPtr)&gTimerInfoTask);
- PrimeTime((QElemPtr)&gTimerInfoTask, sIterationDelay);
- gTimeNow = false;
- } // END InstallTimerTask
-
- // ---------------------------------------------------------------------------
-
- void SetTimerRate(short timerRate) {
- sIterationDelay = timerRate;
- gTimeNow = true;
- } // END SetTimerRate
-
- short GetTimerRate() {
- return(sIterationDelay);
- } // END GetTimerRate
-
- void SaveTimerRate() {
- sIterationDelaySave = sIterationDelay;
- } // END SaveTimerRate
-
- void RestoreTimerRate() {
- sIterationDelay = sIterationDelaySave;
- } // END RestoreTimerRate
-
- // ---------------------------------------------------------------------------
-
- void StartTimer() {
- InstallTimerTask();
- } // END StartTimer
-
- void StartTimer(short timerRate) {
- SetTimerRate(timerRate);
- InstallTimerTask();
- } // END StartTimer
-
- void StartTimerFPS(short fps) {
- SetTimerRate(1000/fps);
- InstallTimerTask();
- } // END StartTimerFPS
-
- void ResetTimer() {
- if (sIterationDelay != kTimerRateOff)
- gTimeNow = false;
- } // END ResetTimer
-
- Boolean TimerDoNow() {
- return(gTimeNow);
- } // END TimerDoNow
-
- void StopTimer() {
- if (sIterationDelay == kTimerRateOff) return;
-
- RmvTime((QElemPtr)&gTimerInfoTask);
- gTimeNow = true; // Reset to true; this is default.
- } // END StopTimer