Example #1
0
wint_t getKey(void)
{
    uint32_t end = SysUpTime() + 200;

    while (!_kbhit())
        if (SysUpTime() >= end)
            return 0;

    return ConReadKey();
}
Example #2
0
u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout)
{
	int wait;
	u64_t start, delta;

	if (timeout) 
		wait = timeout;
	else 
		wait = WAIT_FOREVER;

	start = SysUpTime();
	if (ker_msgQReceive(mbox->sys_mbox, (char*)msg, sizeof(void*), wait) <= 0) {
		return SYS_ARCH_TIMEOUT;
	}

	delta = SysUpTime() - start;
	do_div(delta, 1000000);
	return (u32_t)delta;
}
Example #3
0
u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout)
{
	int wait, ret;
	u64_t start, delta;
	
	if (timeout) 
		wait = timeout;
	else 
		wait = WAIT_FOREVER;

	start = SysUpTime();
	ret = ker_semCTake(sem->sys_sem, wait);

	if (ret == -1) {
		return SYS_ARCH_TIMEOUT;
	}
	if (ret == 0)
		return 0;

	delta = SysUpTime() - start;
	do_div(delta, 1000000);
	
	return (u32_t)delta;
}
Example #4
0
/*****************************************************************************
    name:    main
*****************************************************************************/
int main(void)
{
    char Fell, NewShape, NewX, NewY;
    unsigned Shape, X, Y;
    wint_t Key;
    mglrc_t *rc;


/* re-seed the random number generator */
    srand(SysUpTime());

    rc = mglCreateRc(NULL);
    if (rc == NULL)
        return EXIT_FAILURE;

NEW:
        screenInit();
        write_status(L"TETRIS by Alexei\n"
            L" Pazhitnov\n"
            L"Software by\n"
            L" Chris Giese\n"
            L"\x2018" L"1" L"\x2019" L" and " L"\x2018" L"2" L"\x2019" L" rotate\n"
            L"Arrow keys move\n"
            L"Esc or Q quits");
        goto FOO;

    while(1)
    {
        Fell = 0;
        NewShape = Shape;
        NewX = X;
        NewY = Y;
        Key = getKey();
        if (Key == 0)
        {
            NewY++;
            Fell = 1;
        }
        else
        {
            if(Key == 'q' || Key == 'Q' || Key == 27)
                break;
                //goto FIN;
            if (Key == '1' || Key == KEY_UP)
                NewShape = Shapes[Shape].Plus90;
            else if (Key == '2')
                NewShape = Shapes[Shape].Minus90;
            else if (Key == KEY_LEFT)
            {
                if (X > 0)
                    NewX = X - 1;
            }
            else if (Key == KEY_RIGHT)
            {
                if (X < SCN_WID - 1)
                    NewX = X + 1;
            }
            else if (Key == KEY_DOWN)
            {
                if (Y < SCN_HT - 1)
                    NewY = Y + 1;
            }

            Fell = 0;
        }
        /* if nothing has changed, skip the bottom half of this loop */
        if(NewX == X && NewY == Y && NewShape == Shape)
            continue;
        /* otherwise, erase old shape from the old pos'n */
        shapeErase(X, Y, Shape);

        /* hit anything? */
        if(shapeHit(NewX, NewY, NewShape) == 0)
        {
            /* no, update pos'n */
            X = NewX;
            Y = NewY;
            Shape=NewShape; 
        }
        /* yes -- did the piece hit something while falling on its own? */
        else if(Fell)
        {
            /* yes, draw it at the old pos'n... */
            shapeDraw(X, Y, Shape);

            /* ... and spawn new shape */
FOO:        Y = 3;
            X = SCN_WID / 2;
            Shape = rand() % _countof(Shapes);
            collapse();

            /* if newly spawned shape hits something, game over */
            if (shapeHit(X, Y, Shape))
            {
                write_status(L"GAME OVER");
                ConReadKey();
                goto NEW; 
            }
        }

        /* hit something because of user movement/rotate OR no hit: just redraw it */
        shapeDraw(X, Y, Shape);
        refresh();
    }
    
    mglDeleteRc(rc);
    return 0;
}
Example #5
0
void *RAMainLoop(void *arg)
{
    int     err = 0;
    int     iRet = 0;
    fd_set   rdset;
    ND_OPT_FMT_LINK_ST *pstMsg = NULL;
    unsigned char buff[MAX_BUFFER];
    int iRcvLen = -1;
    struct sockaddr_in6 stFrom;
    INTERFACE_RA_ST *p = (INTERFACE_RA_ST *)arg;
    struct timeval t;
/* start of AU4D02338 by d00107688 2010-01-21 网关设置为SLAAC方式获取IPv6的地址,连续发起多次RS后,未收到RA,后续再也不发送RS请求 */
    static long lTimeLft;          /* select剩余的时间 */
    long lTime;

    lTimeLft = SysUpTime();
/* end of AU4D02338 by d00107688 2010-01-21 网关设置为SLAAC方式获取IPv6的地址,连续发起多次RS后,未收到RA,后续再也不发送RS请求 */

	int len;
    
	loginfo(FUNC, "begin to loop......");

    fprintf(stderr, "RAMainLoop pid: %d\r\n\r\n\r\n", getpid());
    
    sleep(1);
 
    while (!exit_ok)
    {
        iRet = 0;
        if (p->iFlags & en_st_start)
        {
            iRet = 1;
        }

        if (!iRet)
        {
            loginfo(FUNC, "ra will not eff....... %0x\r\n\r\n", p->iFlags & en_st_start ? 1:0);
        }
        
        /* 决定要不要发送RS消息 */
       
/* start of AU4D02338 by d00107688 2010-01-21 网关设置为SLAAC方式获取IPv6的地址,连续发起多次RS后,未收到RA,后续再也不发送RS请求 */	    
#if 0
        if ( iRet
             && (MAX_RS_SEND_NUM > p->iRSNum)
             && (!(en_ra_rcv & p->iFlags)))
#else
        if (iRet && (!(en_ra_rcv & p->iFlags)))
#endif
        {
            len = SendRSPacket(p->iSockfd, p->iIfindex);
            /*BEGIN 2032203980  m00182044 2012-06-10 modify*/
			loginfo(FUNC, "send rs len = %d \n", len);
            /*END 2032203980  m00182044 2012-06-10 modify*/
            
            if (RS_NUM_MAX_VALUE < p->iRSNum)
            {
                p->iRSNum = 1;
            }

            if (0 == p->iRSNum)
            {
                t.tv_sec = 0;
            }
            else
            {
                t.tv_sec = (1 << p->iRSNum);
            }
            t.tv_usec = 0;

            p->iRSNum++;

            loginfo(FUNC, "the %d times to send, time: %0x\r\n", p->iRSNum, t.tv_sec);
        }
        else
        {
            t.tv_sec = PREFIX_UPDATE_TIME;
            t.tv_usec = 0;
        }

        if (!iRet)
        {
            t.tv_sec = PREFIX_UPDATE_TIME;
        }
/* end of AU4D02338 by d00107688 2010-01-21 网关设置为SLAAC方式获取IPv6的地址,连续发起多次RS后,未收到RA,后续再也不发送RS请求 */		
        
        FD_ZERO(&rdset);
        FD_SET(p->iSockfd, &rdset);
        err = select((p->iSockfd + 1), &rdset, NULL, NULL, &t);
        loginfo(FUNC, "select return err %d", err);
        if (0 > err)
        {
            loginfo(FUNC, "select error %s", strerror(errno));
            if (EINTR == err)
            {
                loginfo(FUNC, "because interrupt........");
            }
            continue;
        }
        else if (FD_ISSET(p->iSockfd, &rdset))
        {
            iRcvLen = RecvRAPacket(p->iSockfd, &stFrom, p->iIfindex,  
                                    buff, MAX_BUFFER, iRet);
            if ((!iRet) || (0 >= iRcvLen))
            {
                loginfo(FUNC, "receive msg error");
                continue;
            }
            
            pstMsg = BuildTLVList((void *)buff, stFrom, iRcvLen);
            if (!pstMsg)
            {
                loginfo(FUNC, "Build TLV list error");
                continue;
            }

#if 0
            DumpWholeTLVList(pstMsg);
#endif
            ProcessRAOption(pstMsg, &p->stRAData);  
            FreeTLVList(&pstMsg);
            UpdateRAInfo(p);

            p->iFlags |= en_ra_rcv;
        }

/* start of AU4D02338 by d00107688 2010-01-21 网关设置为SLAAC方式获取IPv6的地址,连续发起多次RS后,未收到RA,后续再也不发送RS请求 */
        if (iRet)
        {
            lTime = SysUpTime();
            
            /* 如果lTime < lTimeLft 那么表示溢出了 */
            if ((lTime < lTimeLft) 
                || (PREFIX_UPDATE_TIME <= (lTime - lTimeLft)))
            {
                UpdateRAInfo(p); 
                lTimeLft = SysUpTime();
            }
        }
/* end of AU4D02338 by d00107688 2010-01-21 网关设置为SLAAC方式获取IPv6的地址,连续发起多次RS后,未收到RA,后续再也不发送RS请求 */
    }

    DelInterfaceByIndex(p->iIfindex);

    pthread_exit(0);

    return (0);
}