Idle

ti.mcu.cc23xx/Idle.em
import em from '@$$emscript'
export const $U = em.$declare('MODULE')

import * as Debug from '@em.lang/Debug.em'
import * as IntrVec from '@em.arch.arm/IntrVec.em'

export type SleepCB = cb_t<[]>

const sleep_enter_tab = $table<SleepCB>('ro')
const sleep_leave_tab = $table<SleepCB>('ro')

export namespace em$meta {

    export function addSleepEnter(cb: SleepCB) {
        sleep_enter_tab.$add(cb)
    }

    export function addSleepLeave(cb: SleepCB) {
        sleep_leave_tab.$add(cb)
    }
}

var cur_pause_only = false

export function em$startup() {
    em.$['%%b+']
    $R.PMCTL.VDDRCTL.$$ = $R.PMCTL_VDDRCTL_SELECT
    $R.EVTULL.WKUPMASK.$$ = $R.EVTULL_WKUPMASK_AON_IOC_COMB | $R.EVTULL_WKUPMASK_AON_RTC_COMB
}

function doSleep() {
    for (let i = 0; i < sleep_enter_tab.$len; i++) {
        const cb = sleep_enter_tab[i]
        cb()
    }
    em.$['%%b:'](2)
    em.$['%%b-']
    Debug.reset()
    $R.CKMD.LDOCTL.$$ = 0
    IntrVec.PRIMASK_set(1)
    e$`HapiEnterStandby(0)`
    Debug.startup()
    em.$['%%b+']
    for (let i = 0; i < sleep_leave_tab.$len; i++) {
        const cb = sleep_leave_tab[i]
        cb()
    }
    IntrVec.PRIMASK_set(0)
}

function doPause() {
    em.$['%%b:'](1)
    em.$['%%b-']
    IntrVec.PRIMASK_set(1)
    e$`asm volatile ("wfi")`
    em.$['%%b+']
    IntrVec.PRIMASK_set(0)
}

export function setPauseOnly(pause_only: bool_t) {
    cur_pause_only = pause_only
}

export function exec() {
    if (cur_pause_only) {
        doPause()
    }
    else {
        doSleep()
    }
}

export function wakeup() {

}