From 168ec978c6c42cb5b33b16a46b05f6a473ca027b Mon Sep 17 00:00:00 2001 From: Cuyler36 Date: Mon, 26 May 2025 07:41:01 -0400 Subject: [PATCH] libultra: settimer work, tough matches --- src/static/libultra/settimer.c | 46 ++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/static/libultra/settimer.c diff --git a/src/static/libultra/settimer.c b/src/static/libultra/settimer.c new file mode 100644 index 00000000..6911f5b6 --- /dev/null +++ b/src/static/libultra/settimer.c @@ -0,0 +1,46 @@ +#include "libultra/libultra.h" + +#include + +static void timer_handler(OSAlarm* alarm, OSContext* context); + +static void timer_handler(OSAlarm* volatile alarm, OSContext* context) { + OSTimer* volatile timer = (OSTimer* volatile)alarm; + BOOL enabled = OSDisableInterrupts(); + + if ((OSTime)timer->interval != 0) { + OSSetAlarm(&timer->alarm, (OSTime)timer->interval, timer_handler); + } else { + timer->next->prev = timer->prev; + timer->prev->next = timer->next; + timer->next = NULL; + timer->prev = NULL; + } + osSendMesg(timer->mq, timer->msg, OS_MESG_NOBLOCK); + + OSRestoreInterrupts(enabled); +} + +extern int osSetTimer(OSTimer* timer, OSTime countdown, OSTime interval, OSMessageQueue* volatile mq, volatile OSMessage msg) { + BOOL enable = OSDisableInterrupts(); + OSTimer* head; + + countdown = countdown == 0 ? interval : countdown; + OSCreateAlarm(&timer->alarm); + timer->mq = (OSMessageQueue*)mq; + timer->msg = msg; + timer->interval = interval; + timer->value = countdown; + head = __osTimerList->next; + timer->next = head; + timer->prev = head->prev; + head->prev->next = timer; + head->prev = timer; + + if (countdown != 0) { + OSSetAlarm(&timer->alarm, countdown, timer_handler); + } + + OSRestoreInterrupts(enable); + return 0; +}