aboutsummaryrefslogtreecommitdiff
path: root/engines/lab/utils.cpp
diff options
context:
space:
mode:
authorStrangerke2015-12-12 19:38:00 +0100
committerWillem Jan Palenstijn2015-12-23 21:34:01 +0100
commit7bb45a8eaaf663cca9d0765d84b38967c3cc3275 (patch)
treee044d20af588b81a96776004bfc3bbb037086ed0 /engines/lab/utils.cpp
parent0c0b2da235bfbbc3a11ef9677137d5a77f5b35a2 (diff)
downloadscummvm-rg350-7bb45a8eaaf663cca9d0765d84b38967c3cc3275.tar.gz
scummvm-rg350-7bb45a8eaaf663cca9d0765d84b38967c3cc3275.tar.bz2
scummvm-rg350-7bb45a8eaaf663cca9d0765d84b38967c3cc3275.zip
LAB: Move timing functions to the utility class
Diffstat (limited to 'engines/lab/utils.cpp')
-rw-r--r--engines/lab/utils.cpp93
1 files changed, 92 insertions, 1 deletions
diff --git a/engines/lab/utils.cpp b/engines/lab/utils.cpp
index f9a6656174..1ac083790e 100644
--- a/engines/lab/utils.cpp
+++ b/engines/lab/utils.cpp
@@ -433,7 +433,7 @@ void Utils::setBytesPerRow(int num) {
uint16 Utils::getRandom(uint16 max) {
uint32 secs, micros;
- _vm->getTime(&secs, &micros);
+ getTime(&secs, &micros);
return ((micros + secs) % max);
}
@@ -442,4 +442,95 @@ void Utils::readBlock(void *Buffer, uint32 Size, byte **File) {
(*File) += Size;
}
+/**
+ * Waits for for Secs seconds and Micros microseconds to pass.
+ */
+void Utils::microDelay(uint32 secs, uint32 micros) {
+ uint32 waitSecs, waitMicros;
+ addCurTime(secs, micros, &waitSecs, &waitMicros);
+
+ while (1) {
+ getTime(&secs, &micros);
+
+ if ((secs > waitSecs) || ((secs == waitSecs) && (micros >= waitMicros)))
+ return;
+
+ g_system->delayMillis(10);
+ }
+}
+
+/**
+ * Gets the current system time.
+ */
+void Utils::getTime(uint32 *secs, uint32 *micros) {
+ uint32 t = g_system->getMillis();
+
+ *secs = t / 1000;
+ *micros = t % 1000;
+}
+
+/**
+ * Adds seconds and microseconds to current time to get a new time.
+ */
+void Utils::addCurTime(uint32 sec, uint32 micros, uint32 *timeSec, uint32 *timeMicros) {
+ getTime(timeSec, timeMicros);
+
+ (*timeSec) += sec;
+ (*timeMicros) += micros;
+
+ if (*timeMicros >= ONESECOND) {
+ (*timeSec)++;
+ (*timeMicros) -= ONESECOND;
+ }
+}
+
+/**
+ * Finds the difference between time1 and time2. If time1 is later than
+ * time2, returns 0.
+ */
+void Utils::anyTimeDiff(uint32 sec1, uint32 micros1, uint32 sec2, uint32 micros2, uint32 *diffSecs, uint32 *diffMicros) {
+ *diffSecs = 0;
+ *diffMicros = 0;
+
+ if (sec1 > sec2)
+ return;
+ else if ((sec1 == sec2) && (micros1 >= micros2))
+ return;
+
+ if (micros1 > micros2) {
+ *diffSecs = sec2 - sec1 - 1;
+ *diffMicros = (ONESECOND - micros1) + micros2;
+ } else {
+ *diffSecs = sec2 - sec1;
+ *diffMicros = micros2 - micros1;
+ }
+}
+
+/**
+ * Finds the difference between the current time, and a future time. Returns
+ * 0 if the future time is actually before the current time.
+ */
+void Utils::timeDiff(uint32 sec, uint32 micros, uint32 *diffSec, uint32 *diffMicros) {
+ uint32 curSec, curMicros;
+ getTime(&curSec, &curMicros);
+ anyTimeDiff(curSec, curMicros, sec, micros, diffSec, diffMicros);
+}
+
+/**
+ * Waits for a specified time to occur.
+ */
+void Utils::waitForTime(uint32 sec, uint32 micros) {
+ uint32 curSec, curMicros;
+ getTime(&curSec, &curMicros);
+
+ if (curSec > sec)
+ return;
+ else if ((curSec == sec) && (curMicros >= micros))
+ return;
+
+ if (curMicros > micros)
+ microDelay(sec - curSec - 1, (ONESECOND - curMicros) + micros - 1);
+ else
+ microDelay(sec - curSec, micros - curMicros - 1);
+}
} // End of namespace Lab