﻿/* RTP_sp_5-4 */
/*
 *  アラームハンドラによるLED消灯
 *
 *  OS: T-Kernel
 *
 */

#include <tk/tkernel.h> /* T-Kernel ヘッダ */
#include <tk/sysdef.h>  /* ハードウェア定義 */

/* オブジェクト ID 番号 */
LOCAL ID almA; /* アラームハンドラ A の ID */

/* アラームハンドラ A */
LOCAL void almhdrA(void *exinf)
{
    /* LED3 消灯 */
    PIO_DATA(F) |= (1 << 3);
}

/* 割込みハンドラ A */
LOCAL void inthdrA(UINT intno)
{
    /* LED3 点灯 */
    PIO_DATA(F) &= ~(1 << 3);

    /* 3 秒後にアラームハンドラ A を起動する */
    tk_sta_alm(almA, 3000);

    /* 割込みをクリアする */
    CLKCTRL_CGICRCG = intno;
    ClearInt(intno);
}

/* 初期化ルーチン */
LOCAL void init(void)
{
    /* LED3 に出力するように設定する */
    PIO_IE(F) &= ~(1 << 3);
    PIO_CR(F) |= (1 << 3);

    /* LED3 消灯 */
    PIO_DATA(F) |= (1 << 3);

    /* SW3 (PA3) から入力するように設定する */
    PIO_CR(A) &= ~(1 << 3);
    PIO_IE(A) |= (1 << 3);

    /* SW3 (INT3) の割込みのモード設定を行う : 立ち下がりエッジ(1→0) */
    CLKCTRL_CGIMCGA = (CLKCTRL_CGIMCGA & ~(7 << (8 * 3 + 4))) | (2 << (8 * 3 + 4));

    /* SW3 (INT3) の割込みを許可する */
    CLKCTRL_CGIMCGA |= (1 << (8 * 3));
    ClearInt(3);
    EnableInt(3, INTPRI_GROUP(5, 0));
}

/* 初期化処理 */
EXPORT INT usermain(void)
{
    ER     er;
    T_CALM ca;
    T_DINT di;

    /* アラームハンドラ A を生成する */
    ca.exinf = (void*)('a' | 'l' << 8 | 'm' << 16 | 'A' << 24); /* 拡張情報 */
    ca.almatr = TA_HLNG;              /* アラームハンドラ属性 */
    ca.almhdr = almhdrA;              /* アラームハンドラアドレス */
    almA = tk_cre_alm(&ca);           /* アラームハンドラ A を生成 */
    if (almA < E_OK) { er = almA; goto e2; } /* アラームハンドラ生成失敗時 */

    /* 割込みハンドラ A を定義する */
    di.intatr = TA_HLNG;              /* 割込みハンドラ属性 */
    di.inthdr = inthdrA;              /* 割込みハンドラアドレス */
    er = tk_def_int(3, &di);          /* 割込みハンドラ A を定義 */
    if (er < E_OK) goto e1;

    /* 初期化ルーチンを呼び出す */
    init();

    return E_OK;

e1: tk_del_alm(almA);
e2: return er;
}
