TimeTypes

em.utils/TimeTypes.em
import em from '@$$emscript'
export const $U = em.$declare('MODULE')

export const hoursPerDay = 24
export const minutesPerHour = 60
export const secondsPerMinute = 60
export const secondsPerHour = minutesPerHour * secondsPerMinute
export const secondsPerDay = hoursPerDay * secondsPerHour
export const millisecondsPerSecond = 1000

export class RawTime extends $struct {
    secs: u32
    subs: u32
}

export class TimeParts extends $struct {
    days: u32
    hours: u32
    minutes: u32
    seconds: u32
    milliseconds: u32
}

export type Secs24p8 = u32

export function RawSubsToMsecs(subs: u32): u32 {
    return ((subs >> 16) * 1000) / 65536
}

export function Secs24p8_initMsecs(msecs: u32): Secs24p8 {
    return (msecs * 32) / 125
}

export function Secs24p8_ZERO(): Secs24p8 {
    return 0
}

export function RawTimeToTimeParts(rawTime: RawTime): TimeParts {
    let timeParts = TimeParts.$make()
    timeParts.days = rawTime.secs / secondsPerDay
    timeParts.hours = (rawTime.secs % secondsPerDay) / secondsPerHour
    timeParts.minutes = (rawTime.secs % secondsPerHour) / secondsPerMinute
    timeParts.seconds = rawTime.secs % secondsPerMinute
    timeParts.milliseconds = RawSubsToMsecs(rawTime.subs)
    return timeParts
}