// time_playdate.c - Time module for Playdate #include "cell.h" #include "pd_api.h" // Global Playdate API pointers - defined in main_playdate.c extern const struct playdate_sys *pd_sys; /* ---------------------------------------------------------------- *\ Helpers \* ---------------------------------------------------------------- */ static inline double playdate_now(void) { if (pd_sys) { unsigned int ms = 0; unsigned int secs = pd_sys->getSecondsSinceEpoch(&ms); return (double)secs + ms / 1000.0; } return 0.0; } /* ---------------------------------------------------------------- *\ JS bindings \* ---------------------------------------------------------------- */ static JSValue js_time_now(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv) { return JS_NewFloat64(ctx, playdate_now()); } static JSValue js_time_computer_dst(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv) { // Playdate doesn't provide DST info directly return JS_NewBool(ctx, 0); } static JSValue js_time_computer_zone(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv) { #if TARGET_EXTENSION if (pd_sys) { int32_t offset = pd_sys->getTimezoneOffset(); // Playdate returns offset in seconds, convert to hours return JS_NewFloat64(ctx, (double)offset / 3600.0); } #endif return JS_NewFloat64(ctx, 0.0); } /* ---------------------------------------------------------------- *\ registration \* ---------------------------------------------------------------- */ static const JSCFunctionListEntry js_time_funcs[] = { JS_CFUNC_DEF("now", 0, js_time_now), JS_CFUNC_DEF("computer_dst", 0, js_time_computer_dst), JS_CFUNC_DEF("computer_zone", 0, js_time_computer_zone), }; JSValue js_time_use(JSContext *ctx) { JSValue obj = JS_NewObject(ctx); JS_SetPropertyFunctionList(ctx, obj, js_time_funcs, sizeof(js_time_funcs) / sizeof(js_time_funcs[0])); return obj; }