/*
*********************************************************************************************************
*                                                uC/OS-II
*                                          The Real-Time Kernel
*
*                        (c) Copyright 1992-1998, Jean J. Labrosse, Plantation, FL
*                                           All Rights Reserved
*
*                                                 V2.00
*
*                                               EXAMPLE #1
*********************************************************************************************************
*/

#include "includes.h"

/*
*********************************************************************************************************
*                                                  »ó¼ö
*********************************************************************************************************
*/

#define  TASK_STK_SIZE                 512       /* °¢ ŽºÅ©ÀÇ ½ºÅà ũ±â(WORD Ç׸ñ ´ÜÀ§)              */
#define  N_TASKS                        10       /* °°Àº Äڵ带 ÀÌ¿ëÇØ¼­ »ý¼ºÇÒ Å½ºÅ© ¼ö              */

/*
*********************************************************************************************************
*                                                  º¯¼ö
*********************************************************************************************************
*/

OS_STK           TaskStk[N_TASKS][TASK_STK_SIZE];     /* ŽºÅ© ½ºÅà                                   */
OS_STK           TaskStartStk[TASK_STK_SIZE];
char             TaskData[N_TASKS];                   /* °¢ ŽºÅ©¿¡ ³Ñ°ÜÁÙ Àü´ÞÀÎÀÚ                   */
OS_EVENT        *RandomSem;

/*
*********************************************************************************************************
*                                                ÇÔ¼ö ¿øÇü
*********************************************************************************************************
*/

void   Task(void *data);                              /* ŽºÅ© ÇÔ¼ö ¿øÇü                              */
void   TaskStart(void *data);                         /* ½ÃÀÛ Å½ºÅ© ÇÔ¼ö ¿øÇü                         */

/*$PAGE*/
/*
*********************************************************************************************************
*                                                ¸ÞÀÎ ÇÔ¼ö
*********************************************************************************************************
*/

void main (void)
{
    PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK);      /* È­¸é Áö¿ì±â                              */
    OSInit();                                              /* uC/OS-II ÃʱâÈ­                          */
    PC_DOSSaveReturn();                                    /* DOS ȯ°æ ÀúÀå                            */
    PC_VectSet(uCOS, OSCtxSw);                             /* uC/OS-II ¹®¸ÆÀüȯ º¤ÅÍ ¼³Á¤              */
    RandomSem = OSSemCreate(1);                            /* ·£´ý ³Ñ¹ö¿ë ¼¼¸¶Æ÷¾î                     */
    OSTaskCreate(TaskStart, (void *)0, (void *)&TaskStartStk[TASK_STK_SIZE - 1], 0);
    OSStart();                                             /* ¸ÖƼŽºÅ· ½ÃÀÛ                          */
}

/*$PAGE*/
/*
*********************************************************************************************************
*                                               ½ÃÀÛ Å½ºÅ©
*********************************************************************************************************
*/
void TaskStart (void *data)
{
    UBYTE  i;
    char   s[100];
    WORD   key;


    data = data;                                           /* ÄÄÆÄÀÏ·¯ °æ°í ¹æÁö                       */

    PC_DispStr(26,  0, "uC/OS-II, The Real-Time Kernel", DISP_FGND_WHITE + DISP_BGND_RED + DISP_BLINK);
    PC_DispStr(33,  1, "Jean J. Labrosse", DISP_FGND_WHITE);
    PC_DispStr(36,  3, "EXAMPLE #1", DISP_FGND_WHITE);

    OS_ENTER_CRITICAL();
    PC_VectSet(0x08, OSTickISR);                           /* uC/OS-II Ŭ·° ƽ ISR ¼³Ä¡                */
    PC_SetTickRate(OS_TICKS_PER_SEC);                      /* ƽ ÁÖ±â Àç¼³Á¤                           */
    OS_EXIT_CRITICAL();

    PC_DispStr(0, 22, "Determining  CPU's capacity ...", DISP_FGND_WHITE);
    OSStatInit();                                          /* uC/OS-II Åë°è¸ðµâ ÃʱâÈ­                 */
    PC_DispClrLine(22, DISP_FGND_WHITE + DISP_BGND_BLACK);

    for (i = 0; i < N_TASKS; i++) {                        /* °°Àº ŽºÅ© N_TASKS°³ »ý¼º               */
        TaskData[i] = '0' + i;                             /* °¢ ŽºÅ©·Î ¼­·Î ´Ù¸¥ ¹®ÀÚ¸¦ ³Ñ°ÜÁØ´Ù    */
        OSTaskCreate(Task, (void *)&TaskData[i], (void *)&TaskStk[i][TASK_STK_SIZE - 1], i + 1);
    }
    PC_DispStr( 0, 22, "#Tasks          : xxxxx  CPU Usage: xxx %", DISP_FGND_WHITE);
    PC_DispStr( 0, 23, "#Task switch/sec: xxxxx", DISP_FGND_WHITE);
    PC_DispStr(28, 24, "<-PRESS 'ESC' TO QUIT->", DISP_FGND_WHITE + DISP_BLINK);
    for (;;) {
        sprintf(s, "%5d", OSTaskCtr);                     /* ½ÇÇàµÇ´Â ŽºÅ© °³¼ö Ç¥½Ã                 */
        PC_DispStr(18, 22, s, DISP_FGND_BLUE + DISP_BGND_CYAN);
        sprintf(s, "%3d", OSCPUUsage);                    /* CPU »ç¿ëÀ² % ´ÜÀ§·Î Ç¥½Ã                  */
        PC_DispStr(36, 22, s, DISP_FGND_BLUE + DISP_BGND_CYAN);
        sprintf(s, "%5d", OSCtxSwCtr);                    /* 1ÃÊ´ç ¹ß»ýÇÑ ¹®¸ÆÀüȯ Ƚ¼ö Ç¥½Ã           */
        PC_DispStr(18, 23, s, DISP_FGND_BLUE + DISP_BGND_CYAN);
        OSCtxSwCtr = 0;

        sprintf(s, "V%3.2f", (float)OSVersion() * 0.01);   /* ¹öÀüÀ» Vx.yy Çü½ÄÀ¸·Î Ç¥½Ã               */
        PC_DispStr(75, 24, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);
        PC_GetDateTime(s);                                 /* ³¯Â¥¿Í ½Ã°£À» ¾ò¾î¼­ Ç¥½Ã                */
        PC_DispStr(0, 24, s, DISP_FGND_BLUE + DISP_BGND_CYAN);

        if (PC_GetKey(&key) == TRUE) {                     /* ۰¡ ´­·È´ÂÁö È®ÀÎ                       */
            if (key == 0x1B) {                             /* ¿¹, ESCAPE ŰÀÎÁö È®ÀÎ                   */
                PC_DOSReturn();                            /* DOS·Î º¹±Í                               */
            }
        }

        OSTimeDlyHMSM(0, 0, 1, 0);                         /* 1ÃÊ Áö¿¬                                 */
    }
}
/*$PAGE*/
/*
*********************************************************************************************************
*                                                  ŽºÅ©
*********************************************************************************************************
*/

void Task (void *data)
{
    UBYTE x;
    UBYTE y;
    UBYTE err;


    for (;;) {
        OSSemPend(RandomSem, 0, &err);           /* ·£´ý ³Ñ¹ö ÇÔ¼ö¸¦ »ç¿ëÇϱâ À§ÇØ ¼¼¸¶Æ÷¾î ȹµæ       */
        x = random(80);                          /* ŽºÅ© ¹øÈ£¸¦ Ç¥½ÃÇÒ X ÁÂÇ¥ °áÁ¤                   */
        y = random(16);                          /* ŽºÅ© ¹øÈ£¸¦ Ç¥½ÃÇÒ Y ÁÂÇ¥ °áÁ¤                   */
        OSSemPost(RandomSem);                    /* ¼¼¸¶Æ÷¾î ¹Ý³³                                      */
                                                 /* È­¸é¿¡ ŽºÅ© ¹øÈ£ Ç¥½Ã                            */
        PC_DispChar(x, y + 5, *(char *)data, DISP_FGND_LIGHT_GRAY);
        OSTimeDly(1);                            /* 1 Ŭ·° ƽ Áö¿¬                                     */
    }
}