/*
*********************************************************************************************************
*                                                uC/OS-II
*                                          The Real-Time Kernel
*                                             TIME MANAGEMENT
*
*                        (c) Copyright 1992-1998, Jean J. Labrosse, Plantation, FL
*                                           All Rights Reserved
*
*                                                  V2.00
*
* File : OS_TIME.C
* By   : Jean J. Labrosse
*********************************************************************************************************
*/

#ifndef  OS_MASTER_FILE
#include "includes.h"
#endif

/*
*********************************************************************************************************
*                              'n'ƽ µ¿¾È ŽºÅ© Áö¿¬ (n : 0¿¡¼­ 65535 »çÀÌ)
*
* ¼³¸í       : ÀÌ ÇÔ¼ö´Â ÁöÁ¤ÇÑ ½Ã½ºÅÛ Æ½ ¸¸Å­ÀÇ ½Ã°£ÀÌ Èê·¯ ŸÀӾƿôÀÌ ¸¸·áµÉ ¶§±îÁö ÇöÀç ½ÇÇà ÁßÀÎ
*              ŽºÅ©¸¦ Áö¿¬½ÃŲ´Ù. ¹°·Ð À̰ÍÀº ÇöÀçÀÇ Å½ºÅ©°¡ ÀÏÁ¤ÇÑ ½Ã°£ÀÌ ¸¸·áÇÒ ¶§±îÁö Áö¿¬ÇÏ´Â
*              °Í°ú °°Àº µ¿ÀÛÀÌ´Ù. Áö¿¬ °ªÀ» 0À¸·Î ÁöÁ¤ÇÑ °æ¿ì ½Ã°£Áö¿¬Àº ÀϾÁö ¾Ê´Â´Ù.
*              0 ÀÌ¿ÜÀÇ °ªÀ» ÁöÁ¤ÇÏ¸é ¹®¸ÆÀüȯÀÌ ¹ß»ýÇÑ´Ù.
*
* Àü´ÞÀÎÀÚ   : ticks     ŽºÅ©°¡ Áö¿¬ÇϰíÀÚ Çϴ Ŭ·° ƽ ´ÜÀ§ÀÇ ½Ã°£ Áö¿¬ °ª.
*                        ÀÌ °ªÀ» 0À¸·Î ÁöÁ¤Çϸé ŽºÅ©´Â Áö¿¬µÇÁö ¾Ê´Â´Ù.
*
* ¸®Åϰª     : ¾øÀ½
*********************************************************************************************************
*/

void OSTimeDly (INT16U ticks)
{
    if (ticks > 0) {                                                      /* 0Àº Áö¿¬ÀÌ ¾øÀ½À» ÀǹÌ!   */
        OS_ENTER_CRITICAL();
        if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) {  /* ÇöÀç ŽºÅ© Áö¿¬          */
            OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
        }
        OSTCBCur->OSTCBDly = ticks;                                       /* TCB ƽ °ªÀ» ¼³Á¤ÇÑ´Ù      */
        OS_EXIT_CRITICAL();
        OSSched();                                                        /* ´ÙÀ½ ½ÇÇàÇÒ Å½ºÅ© °áÁ¤!  */
    }
}
/*$PAGE*/
/*
*********************************************************************************************************
*                                     ÁöÁ¤ÇÑ ½Ã°£ µ¿¾È ŽºÅ© Áö¿¬
*
* ¼³¸í       : ÀÌ ÇÔ¼ö´Â ÇöÀç ½ÇÇàµÇ°í Àִ ŽºÅ©ÀÇ ½ÇÇàÀ» ÀÏÁ¤ ½Ã°£ÀÌ ¸¸·áµÉ ¶§±îÁö Áö¿¬ÇϰíÀÚ
*              È£ÃâµÈ´Ù. ÀÌ ÇÔ¼ö´Â Ŭ·° ƽ °³¼ö ´ë½Å ½Ã°£, ºÐ, ÃÊ , ¹Ð¸® ÃÊ ´ÜÀ§·Î ½Ã°£À» ¼³Á¤ÇÒ ¼ö ÀÖ´Ù.
*
*
* Àü´ÞÀÎÀÚ   : hours     Áö¿¬ÇϰíÀÚ ÇÏ´Â ½Ã°£. 0ºÎÅÍ 255 »çÀÌÀÇ °ªÀ» °¡Áú ¼ö ÀÖ´Ù.
*              minutes   Áö¿¬ÇϰíÀÚ ÇÏ´Â ºÐ ´ÜÀ§ ½Ã°£. 0ºÎÅÍ 59 »çÀÌÀÇ °ªÀ» °¡Áú ¼ö ÀÖ´Ù.    
*              seconds   Áö¿¬ÇϰíÀÚ ÇÏ´Â ÃÊ ´ÜÀ§ ½Ã°£. 0ºÎÅÍ 59 »çÀÌÀÇ °ªÀ» °¡Áú ¼ö ÀÖ´Ù.
*              milli     Áö¿¬ÇϰíÀÚ ÇÏ´Â ¹Ð¸® ÃÊ ´ÜÀ§ ½Ã°£. 0ºÎÅÍ 999 »çÀÌÀÇ °ªÀ» °¡Áú ¼ö ÀÖ´Ù.
*
* ¸®Åϰª     : OS_NO_ERR
*              OS_TIME_INVALID_MINUTES
*              OS_TIME_INVALID_SECONDS
*              OS_TIME_INVALID_MS
*              OS_TIME_ZERO_DLY
*
* ³ëÆ®       : ¹Ð¸® ÃÊ ´ÜÀ§ÀÇ ½Ã°£Áö¿¬Àº ƽ ÁÖ±â¿Í °ü°è ÀÖ´Ù. ¿¹¸¦ µé¾î ƽ Çڵ鷯°¡ 100mS¸¶´Ù µ¿ÀÛ
*              ÇÏ´Â °æ¿ì 10mSÀÇ ½Ã°£Áö¿¬Àº ÀÌ·ïÁú ¼ö ¾ø´Ù. ÀÌ °æ¿ì Áö¿¬ °ªÀº 0ÀÇ Æ½ °ªÀ¸·Î °è»êµÈ´Ù.
*              ½ÇÁ¦ Áö¿¬ °ªÀº °¡Àå °¡±î¿î ƽ °ªÀ¸·Î °è»êµÈ´Ù.
*********************************************************************************************************
*/

INT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli)
{
    INT32U ticks;
    INT16U loops;


    if (hours > 0 || minutes > 0 || seconds > 0 || milli > 0) {
        if (minutes > 59) {
            return (OS_TIME_INVALID_MINUTES);    /* Àü´ÞÀÎÀÚ°¡ ÀûÁ¤ÇÑ ¹üÀ§ ³»¿¡ ÀÖ´ÂÁö È®ÀÎ            */
        }
        if (seconds > 59) {
            return (OS_TIME_INVALID_SECONDS);
        }
        if (milli > 999) {
            return (OS_TIME_INVALID_MILLI);
        }
                                                 /* Àü´ÞÀÎÀÚ¸¦ °¡Àå ±ÙÁ¢ÇÑ Æ½ °ªÀ¸·Î °è»êÇÑ´Ù ...      */
                                                 /* ... (±ÙÁ¢ÇÑ Æ½ °ªÀ¸·Î ¹Ý¿Ã¸² ÇÑ´Ù)                 */
        ticks = ((INT32U)hours * 3600L + (INT32U)minutes * 60L + (INT32U)seconds) * OS_TICKS_PER_SEC
              + OS_TICKS_PER_SEC * ((INT32U)milli + 500L / OS_TICKS_PER_SEC) / 1000L;
        loops = ticks / 65536L;                  /* °è»êÇÑ Æ½ °ªÀÌ 65536À» ³ÑÀ» °æ¿ì¸¦ ´ëºñÇÑ´Ù        */
        ticks = ticks % 65536L;                  /* 65536À¸·Î ³ª´« ³ª¸ÓÁö °ªÀ» °è»ê                    */
        OSTimeDly(ticks);
        while (loops > 0) {
            OSTimeDly(32768);
            OSTimeDly(32768);
            loops--;
        }
        return (OS_NO_ERR);
    } else {
        return (OS_TIME_ZERO_DLY);
    }
}
/*$PAGE*/
/*
*********************************************************************************************************
*                                         Áö¿¬µÈ ŽºÅ© Àç½ÇÇà
*
* ¼³¸í       : ÀÌ ÇÔ¼ö´Â OSTimeDly()³ª OSTimeDlyHMSM()¸¦ È£ÃâÇØ¼­ Áö¿¬½ÃŲ Å½ºÅ©¸¦ Àç½ÇÇàÇÑ´Ù.
*              ŸÀӾƿôÀ» °É¾î¼­ À̺¥Æ® ¹ß»ýÀ» ±â´Ù¸®´Â ŽºÅ©¸¦ Àç½ÇÇàÇϱâ À§ÇØ ÀÌÇÔ¼ö¸¦ »ç¿ëÇϸé
*              ¾ÈµÈ´Ù´Â Á¡À» À¯ÀÇÇ϶ó. ±×·¸°Ô ÇÒ °æ¿ì À̺¥Æ®¸¦ ±â´Ù¸®´Â ŽºÅ©´Â ŸÀӾƿôÀÌ ¹ß»ýÇÑ
*              °ÍÀ¸·Î »ý°¢ÇÒ °ÍÀÌ´Ù(ÀÌ·± È¿°ú¸¦ ÀǵµÇÑ °æ¿ì´Â »ó°ü ¾ø´Ù). ¶Ç 65536 ÀÌ»óÀÇ Æ½ °ª¿¡
*              ÇØ´çÇÏ´Â ½Ã°£À» ÁöÁ¤Çؼ­ OSTimeDlyHMSM()À» È£ÃâÇÑ Å½ºÅ©¸¦ Àç½ÇÇàÇϱâ À§ÇØ ÀÌ ÇÔ¼ö¸¦ 
*              È£ÃâÇÏ¸é ¾ÈµÈ´Ù. Áï, 100Hz·Î Ŭ·° ƽÀÌ ¹ß»ýÇÏ´Â °æ¿ì, OSTimeDlyHMSM(0, 10, 55, 350)³ª
*              ±× ÀÌ»óÀÇ ½Ã°£À» Áö¿¬Çϴ ŽºÅ©¸¦ Àç°³ÇÏ¸é ¾ÈµÈ´Ù´Â ¸»ÀÌ´Ù.
*
*                  (10 Minutes * 60 + 55 Seconds + 0.35) * 100 ticks/second.
*
* Àü´ÞÀÎÀÚ   : prio      Àç°³ÇÒ Å½ºÅ©ÀÇ ¿ì¼±¼øÀ§
*
* ¸®Åϰª     : OS_NO_ERR                 ŽºÅ©¸¦ Àç°³ÇßÀ½
*              OS_PRIO_INVALID           ÁöÁ¤ÇÑ ¿ì¼±¼øÀ§ °ªÀÌ ÃÖ´ë°ª(OS_LOWEST_PRIO)º¸´Ù Å©´Ù
*
*              OS_TIME_NOT_DLY           ŽºÅ©°¡ Áö¿¬ »óŰ¡ ¾Æ´Ô
*              OS_TASK_NOT_EXIST         ŽºÅ©°¡ Á¸ÀçÇÏÁö ¾ÊÀ½
*********************************************************************************************************
*/

INT8U OSTimeDlyResume (INT8U prio)
{
    OS_TCB *ptcb;


    if (prio >= OS_LOWEST_PRIO) {
        return (OS_PRIO_INVALID);
    }
    OS_ENTER_CRITICAL();
    ptcb = (OS_TCB *)OSTCBPrioTbl[prio];                   /* ŽºÅ©°¡ Á¸ÀçÇÏ´ÂÁö È®ÀÎ                 */
    if (ptcb != (OS_TCB *)0) {
        if (ptcb->OSTCBDly != 0) {                         /* Áö¿¬ÁßÀÎÁö È®ÀÎ                          */
            ptcb->OSTCBDly  = 0;                           /* Áö¿¬ Ä«¿îÆ® °ªÀ» Áö¿ò                    */
            if (!(ptcb->OSTCBStat & OS_STAT_SUSPEND)) {    /* ÀϽà Áß´Ü »óŰ¡ ¾Æ´ÑÁö  È®ÀÎ            */
                OSRdyGrp               |= ptcb->OSTCBBitY; /* ½ÇÇà Áغñ»óÅ·Π¸¸µë                     */
                OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
                OS_EXIT_CRITICAL();
                OSSched();                                 /* ÃÖ»óÀ§ ¿ì¼±¼øÀ§ÀÎ °æ¿ì ¹®¸ÆÀüȯ ¹ß»ý     */
            } else {
                OS_EXIT_CRITICAL();                        /* ŽºÅ©°¡ ÀϽà Áß´Ü »óÅÂÀÓ                */
            }
            return (OS_NO_ERR);
        } else {
            OS_EXIT_CRITICAL();
            return (OS_TIME_NOT_DLY);                      /* ŽºÅ©°¡ Áö¿¬»óŰ¡ ¾Æ´ÔÀ» ¾Ë¸²          */
        }
    } else {
        OS_EXIT_CRITICAL();
        return (OS_TASK_NOT_EXIST);                        /* ŽºÅ©°¡ Á¸ÀçÇÏÁö ¾ÊÀ½                   */
    }
}
/*$PAGE*/
/*
*********************************************************************************************************
*                                          ÇöÀç ½Ã½ºÅÛ ½Ã°£ È®ÀÎ
*
* ¼³¸í       : ÀÌ ÇÔ¼ö´Â Áö¼ÓÀûÀ¸·Î Ŭ·° ƽÀ» °»½ÅÇÏ´Â 32ºñÆ® ½Ã½ºÅÛ Å¸ÀÓ¿ë º¯¼öÀÇ °ªÀ» µ¹·ÁÁØ´Ù.
*
*
* Àü´ÞÀÎÀÚ   : ¾øÀ½
*
* ¸®Åϰª     : OSTimeÀÇ ÇöÀç °ª
*********************************************************************************************************
*/

INT32U OSTimeGet (void)
{
    INT32U ticks;


    OS_ENTER_CRITICAL();
    ticks = OSTime;
    OS_EXIT_CRITICAL();
    return (ticks);
}

/*
*********************************************************************************************************
*                                            ½Ã½ºÅÛ Å¬·° ¼³Á¤
*
* ¼³¸í       : ÀÌ ÇÔ¼ö´Â Áö¼ÓÀûÀ¸·Î ½Ã½ºÅÛ Å¬·° ƽÀ» °»½ÅÇÏ´Â 32ºñÆ® Ä«¿îÅÍ °ªÀ» ¼³Á¤ÇÑ´Ù
*
* Àü´ÞÀÎÀÚ   : ticks      OSTime¿¡ ¼³Á¤ÇϰíÀÚ ÇÏ´Â °ª
*
* ¸®Åϰª     : ¾øÀ½
*********************************************************************************************************
*/

void OSTimeSet (INT32U ticks)
{
    OS_ENTER_CRITICAL();
    OSTime = ticks;
    OS_EXIT_CRITICAL();
}