﻿/*
 *  GPIO 入出力
 *
 *  OS: T-Kernel
 *
 */

#include <tk/tkernel.h>  /* T-Kernel ヘッダ */
#include <tm/tmonitor.h> /* tm_printf() など */
#include <tk/sysdef.h>   /* ハードウェア定義 */

/* オブジェクト ID 番号 */
LOCAL ID tidA;           /* タスク A の ID */

/* タスク A */
LOCAL void taskA(INT stacd, void *exinf)
{
    INT s;

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

    /* LED3 (PF3) に出力するように設定する */
    PIO_IE(F) &= ~(1 << 3);
    PIO_CR(F) |=  (1 << 3);

    for (;;) {
        /* GPIO 入力値を読み出す */
        s = (PIO_DATA(A) & (1 << 3)) != 0; /* SW3 (PA3) */

        /* GPIO に出力する */
        if (s) {
            /* 1 を出力する */
            PIO_DATA(F) |=  (1 << 3); /* LED3 (PF3) */
        } else {
            /* 0 を出力する */
            PIO_DATA(F) &= ~(1 << 3); /* LED3 (PF3) */
        }
        tm_printf((UB*)"SW3: %d, LED3: %d\n", s, s);

        /* 500 ミリ秒待つ (ディレイ) */
        /*??*/;
    }

    /* このタスクは終了しない */
}

/* 初期化処理 */
EXPORT INT usermain(void)
{
    T_CTSK ct;

    /* タスク A を生成する */
    ct.exinf = (void*)('t' | 's' << 8 | 'k' << 16 | 'A' << 24); /* 拡張情報 */
    ct.tskatr = TA_HLNG | TA_RNG0;  /* タスク属性 */
    ct.task = taskA;                /* タスク起動アドレス */
    ct.itskpri = 1;                 /* タスク起動時優先度 */
    ct.stksz = 1024;                /* スタックサイズ */
    tidA = /*??*/;         /* タスク A を生成 */
    if (tidA < E_OK) return tidA;   /* タスク生成失敗時 */

    t/*??*/;            /* タスク A を起動 */

    return E_OK;
}
