Esempio n. 1
0
bool_t osWaitForEvent(OsEvent *event, systime_t timeout)
{
   OS_ERR err;

   //Wait until the specified event is in the signaled
   //state or the timeout interval elapses
   if(timeout == 0)
   {
      //Non-blocking call
      OSFlagPend(event, 1, 0, OS_OPT_PEND_FLAG_SET_ANY |
         OS_OPT_PEND_FLAG_CONSUME | OS_OPT_PEND_NON_BLOCKING, NULL, &err);
   }
   else if(timeout == INFINITE_DELAY)
   {
      //Infinite timeout period
      OSFlagPend(event, 1, 0, OS_OPT_PEND_FLAG_SET_ANY |
         OS_OPT_PEND_FLAG_CONSUME | OS_OPT_PEND_BLOCKING, NULL, &err);
   }
   else
   {
      //Wait until the specified event becomes set
      OSFlagPend(event, 1, OS_MS_TO_SYSTICKS(timeout), OS_OPT_PEND_FLAG_SET_ANY |
         OS_OPT_PEND_FLAG_CONSUME | OS_OPT_PEND_BLOCKING, NULL, &err);
   }

   //Check whether the specified event is set
   if(err == OS_ERR_NONE)
      return TRUE;
   else
      return FALSE;
}
Esempio n. 2
0
File: bcr.c Progetto: ericzhc/pdale
/******************************************************
  Read serial for bcr data
*******************************************************/
void BCRUpdateTask() 
{
	INT8U err;

	erD_sndstr("In the BCRUpdateTask()\n\r");
	
	COM_BUFF_INFO RxBuff = GetTaskRxComBuff();
	int i;
	INT16U timeout;

	while(1)
	{
		timeout = 0;
		i = 0;
		memset(BCRValue, 0x00, MAX_BARCODE_LENGTH);
		while (err != OS_TIMEOUT) {
			OSFlagPend(comFlag, 
				RX_SERIAL_DATA_AVAILABLE, 
				OS_FLAG_WAIT_SET_ALL + OS_FLAG_CONSUME, 
				timeout,
				&err);
			if(err == OS_NO_ERR)
			{
				timeout = 3000;

				while ((*RxBuff.ptrCurrent != *RxBuff.ptrEnd) && (i<MAX_BARCODE_LENGTH)) 
				{
					printf("%d", i);
					*(RxBuff.ptrCurrent) = (*(RxBuff.ptrCurrent)+1) % (int)SERIAL_BUFF_SIZE;
					BCRValue[i] = RxBuff.Buffer[*(RxBuff.ptrCurrent)];
					i++;
				}
				
				BCRValue[i] = '\0';
			}	
		}
		OSFlagPost(bcFlag, 
			BAR_CODE_AVAILABLE,
			OS_FLAG_SET, 
			&err);
		OSFlagPend(bcFlag, 
			BAR_CODE_CONSUMED, 
			OS_FLAG_WAIT_SET_ALL + OS_FLAG_CONSUME, 
			0,
			&err);

		#if DEBUG
			printf("BCR Update Task\n\r");
		#endif
	}
}
Esempio n. 3
0
static  void  AppTask_2 (void *p_arg)
{
	INT8U  err;
	
   	(void)p_arg;

    APP_TRACE_INFO(("AppTask_2\n\r"));

	pSecureEventFlagGrp = OSFlagCreate(0x0, &err);

    /* Enable Crypto clock */        
    CLK->AHBCLK |= CLK_AHBCLK_CRPTCKEN_Msk;

	BSP_IntVectSet(BSP_INT_ID_CRYPTO, CRYPTO_IRQHandler);
	BSP_IntEn(BSP_INT_ID_CRYPTO);
	PRNG_ENABLE_INT();

	while (1)
	{
		PRNG_Open(PRNG_KEY_SIZE_256, 0, 0);
		bsp_printf("Start PRNG...\n");
		PRNG_Start();
		OSFlagPend(pSecureEventFlagGrp, 0x1, OS_FLAG_WAIT_SET_ANY, 0, &err);
		dump_PRNG();
        OSTimeDlyHMSM(0, 0, 0, 100);
    }
}
void mouseCalibWaitNextStep(int i)
{
	OSFlagPend(flagCalibStep,
				(0x01 << i),
				OS_FLAG_WAIT_SET_ALL,
				0,
				&OSLastError);
				
	LOG_TEST_OS_ERROR(OSLastError);
}
Esempio n. 5
0
static  void  AppTaskObj1 (void  *p_arg)
{
    OS_ERR       os_err;
    OS_MSG_SIZE  msg_size;


    (void)p_arg;

    while (DEF_TRUE) {

#if (OS_CFG_SEM_EN > 0u)
        OSSemPend(&AppTaskObjSem,
                   0,
                   OS_OPT_PEND_BLOCKING,
                   0,
                  &os_err);
#endif

#if (OS_CFG_MUTEX_EN > 0u)
        OSMutexPend(&AppTaskObjMutex,
                     0,
                     OS_OPT_PEND_BLOCKING,
                     0,
                    &os_err);

        OSMutexPost(&AppTaskObjMutex,
                     OS_OPT_POST_NONE,
                    &os_err);

#endif

#if (OS_CFG_Q_EN > 0u)
        OSQPend(&AppTaskObjQ,
                 0,
                 OS_OPT_PEND_BLOCKING,
                &msg_size,
                 0,
                &os_err);
#endif

#if (OS_CFG_FLAG_EN > 0u)
        OSFlagPend(&AppTaskObjFlag,
                    DEF_BIT_00,
                    0,
                    OS_OPT_PEND_FLAG_SET_ALL + OS_OPT_PEND_FLAG_CONSUME + OS_OPT_PEND_BLOCKING,
                    0,
                   &os_err);
#endif
        OSTimeDlyHMSM( 0u, 0u, 0u, 10u,
                       OS_OPT_TIME_HMSM_STRICT,
                      &os_err);
        APP_TRACE_INFO(("Object test task 1 running ....\n"));
    }
}
/*FUNCTION**********************************************************************
 *
 * Function Name : OSA_EventWait
 * Description   : This function checks the event's status, if it meets the wait
 * condition, return kStatus_OSA_Success, otherwise, timeout will be used for
 * wait. The parameter timeout indicates how long should wait in milliseconds.
 * Pass OSA_WAIT_FOREVER to wait indefinitely, pass 0 will return the value
 * kStatus_OSA_Timeout immediately if wait condition is not met. The event flags
 * will be cleared if the event is auto clear mode. Flags that wakeup waiting
 * task could be obtained from the parameter setFlags.
 * This function returns kStatus_OSA_Success if wait condition is met, returns
 * kStatus_OSA_Timeout if wait condition is not met within the specified
 * 'timeout', returns kStatus_OSA_Error if any errors occur during waiting.
 *
 *END**************************************************************************/
osa_status_t OSA_EventWait(event_t       *pEvent,
                        event_flags_t  flagsToWait,
                        bool           waitAll,
                        uint32_t       timeout,
                        event_flags_t *setFlags)
{
    OS_ERR err;
    OS_OPT opt;

    /* Prepare wait options base on wait type and clear type. */
    if (waitAll)
    {
        opt = OS_OPT_PEND_FLAG_SET_ALL;
    }
    else
    {
        opt = OS_OPT_PEND_FLAG_SET_ANY;
    }

    if (kEventAutoClear == pEvent->clearMode)
    {
        opt |= OS_OPT_PEND_FLAG_CONSUME;
    }

    if (0U == timeout)
    {
        opt |= OS_OPT_PEND_NON_BLOCKING;
    }
    else
    {
        timeout = wait_timeout_msec_to_tick(timeout);
        opt |= OS_OPT_PEND_BLOCKING;
    }

    *setFlags = OSFlagPend(&(pEvent->group), flagsToWait, timeout,
                           opt, (CPU_TS*)0, &err);

    if (OS_ERR_NONE == err)
    {
        return kStatus_OSA_Success;
    }
    else if ((OS_ERR_TIMEOUT          == err) ||
             (OS_ERR_PEND_WOULD_BLOCK == err))
    {
        return kStatus_OSA_Timeout;
    }
    else
    {
        return kStatus_OSA_Error;
    }
}
/*FUNCTION**********************************************************************
 *
 * Function Name : OSA_EventWait
 * Description   : This function checks the event's status, if it meets the wait
 * condition, return kStatus_OSA_Success, otherwise, timeout will be used for
 * wait. The parameter timeout indicates how long should wait in milliseconds.
 * Pass OSA_WAIT_FOREVER to wait indefinitely, pass 0 will return the value
 * kStatus_OSA_Timeout immediately if wait condition is not met. The event flags
 * will be cleared if the event is auto clear mode. Flags that wakeup waiting
 * task could be obtained from the parameter setFlags.
 * This function returns kStatus_OSA_Success if wait condition is met, returns
 * kStatus_OSA_Timeout if wait condition is not met within the specified
 * 'timeout', returns kStatus_OSA_Error if any errors occur during waiting.
 *
 *END**************************************************************************/
osa_status_t OSA_EventWait(event_t       *pEvent,
                        event_flags_t  flagsToWait,
                        bool           waitAll,
                        uint32_t       timeout,
                        event_flags_t *setFlags)
{
    INT8U err, opt;

    /* Prepare wait options base on wait type and clear type. */
    if (waitAll)
    {
        opt = OS_FLAG_WAIT_SET_ALL;
    }
    else
    {
        opt = OS_FLAG_WAIT_SET_ANY;
    }

    if (kEventAutoClear == pEvent->clearMode)
    {
        opt |= OS_FLAG_CONSUME;
    }

    /* If timeout is 0, try to wait. */
    if (0U == timeout)
    {
        *setFlags = OSFlagAccept (pEvent->pGroup, flagsToWait, opt, &err);
    }
    else
    {
        /* If timeout is not 0, convert it to tickes. */
        timeout = wait_timeout_msec_to_tick(timeout);
        *setFlags = OSFlagPend(pEvent->pGroup, flagsToWait, opt, timeout, &err);
    }

    if (OS_ERR_NONE == err)
    {
        return kStatus_OSA_Success;
    }
    else if ((OS_ERR_TIMEOUT      == err) ||
             (OS_ERR_FLAG_NOT_RDY == err))
    {
        return kStatus_OSA_Timeout;
    }
    else
    {
        return kStatus_OSA_Error;
    }
}
Esempio n. 8
0
static bool SIM90x_WaitPowerDown(uint32_t timeout)
{
    OS_ERR error;
    OS_FLAGS flags;

    timeout = SYS_MsToTick(timeout);

    flags = OSFlagPend( &SIM90X_Flags,
                        SIM90X_POWER_FLAG,
                        timeout,
                        OS_OPT_PEND_FLAG_CLR_AND,
                        (void*)0,
                        &error  );

    return (flags == SIM90X_POWER_FLAG);
}
Esempio n. 9
0
/**
 * This function is wait for modbus master request finish and return result.
 * Waiting result include request process success, request respond timeout,
 * receive data error and execute function error.You can use the above callback function.
 * @note If you are use OS, you can use OS's event mechanism. Otherwise you have to run
 * much user custom delay for waiting.
 *
 * @return request error code
 */
eMBMasterReqErrCode eMBMasterWaitRequestFinish( void ) {
  eMBMasterReqErrCode    eErrStatus = MB_MRE_NO_ERR;
  //rt_uint32_t recvedEvent;
    /* waiting for OS event */
	//rt_event_recv(&xMasterOsEvent,
	//		EV_MASTER_PROCESS_SUCESS | EV_MASTER_ERROR_RESPOND_TIMEOUT
	//				| EV_MASTER_ERROR_RECEIVE_DATA
	//				| EV_MASTER_ERROR_EXECUTE_FUNCTION,
	//		RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER,
	//		&recvedEvent);
	OS_FLAGS recvedEvent;
	uint8_t err=OS_ERR_NONE;
	
	recvedEvent=OSFlagPend(xMasterOsEvent,
	    EV_MASTER_PROCESS_SUCESS | 
	    EV_MASTER_ERROR_RESPOND_TIMEOUT | 
	    EV_MASTER_ERROR_RECEIVE_DATA	| 
	    EV_MASTER_ERROR_EXECUTE_FUNCTION,
			OS_FLAG_WAIT_SET_ANY|OS_FLAG_CONSUME, 
	    0,                      //Waiting for forever
	    &err );
	switch (recvedEvent)
	{
	case EV_MASTER_PROCESS_SUCESS:

		break;
	case EV_MASTER_ERROR_RESPOND_TIMEOUT:
	{
		eErrStatus = MB_MRE_TIMEDOUT;
		break;
	}
	case EV_MASTER_ERROR_RECEIVE_DATA:
	{
		eErrStatus = MB_MRE_REV_DATA;
		break;
	}
	case EV_MASTER_ERROR_EXECUTE_FUNCTION:
	{
		eErrStatus = MB_MRE_EXE_FUN;
		break;
	}
	}
    return eErrStatus;
}
Esempio n. 10
0
BOOL
xMBMasterPortEventGet( eMBMasterEventType * eEvent )
{
  //  rt_uint32_t recvedEvent;
    /* waiting forever OS event */
	//rt_event_recv(&xMasterOsEvent,
	//		EV_MASTER_READY | EV_MASTER_FRAME_RECEIVED | EV_MASTER_EXECUTE |
	//		EV_MASTER_FRAME_SENT | EV_MASTER_ERROR_PROCESS,
	//		RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER,
	//		&recvedEvent);
	/* the enum type couldn't convert to int type */
	
	OS_FLAGS recvedEvent;
	uint8_t err=OS_ERR_NONE;
	recvedEvent=OSFlagPend(xMasterOsEvent,
	    EV_MASTER_READY | 
	    EV_MASTER_FRAME_RECEIVED | 
	    EV_MASTER_EXECUTE	| 
	    EV_MASTER_FRAME_SENT|
	    EV_MASTER_ERROR_PROCESS,
			OS_FLAG_WAIT_SET_ANY|OS_FLAG_CONSUME, 
	    0,                      //Waiting for forever
	    &err );
	switch (recvedEvent)
	{
	case EV_MASTER_READY:
		*eEvent = EV_MASTER_READY;
		break;
	case EV_MASTER_FRAME_RECEIVED:
		*eEvent = EV_MASTER_FRAME_RECEIVED;
		break;
	case EV_MASTER_EXECUTE:
		*eEvent = EV_MASTER_EXECUTE;
		break;
	case EV_MASTER_FRAME_SENT:
		*eEvent = EV_MASTER_FRAME_SENT;
		break;
	case EV_MASTER_ERROR_PROCESS:
		*eEvent = EV_MASTER_ERROR_PROCESS;
		break;
	}
    return TRUE;
}
Esempio n. 11
0
int flag_event_wait(flag_event_t *event){
#if defined(OS_FREERTOS)
	EventBits_t uxBits;
	uxBits = xEventGroupWaitBits(*event,
			((uint32_t)1) << 0,
			pdTRUE,
			pdFALSE,
			portMAX_DELAY);
	if(uxBits & (((uint32_t)1) << 0))
		return 1;
	return 0;
#elif defined(OS_UCOS)
	OS_ERR err;
	OS_FLAGS flags;
	flags = OSFlagPend(event, 1, 0, OS_OPT_PEND_FLAG_SET_ANY, 0, &err);
	if((err == OS_ERR_NONE) && (flags & ((OS_FLAGS)1) == 1)) return 1;
	return 0;
#endif
}
Esempio n. 12
0
status_t DSPI_RTOS_Transfer(dspi_rtos_handle_t *handle, dspi_transfer_t *transfer)
{
    status_t status;
    OS_FLAGS ev;
    OS_ERR err;

    /* Lock resource mutex */
    OSSemPend(&handle->mutex, 0, OS_OPT_PEND_BLOCKING, NULL, &err);
    if (OS_ERR_NONE != err)
    {
        return kStatus_Fail;
    }

    ev = OSFlagPost(&handle->event, RTOS_DSPI_COMPLETE, OS_OPT_POST_FLAG_CLR, &err);
    assert((ev & RTOS_DSPI_COMPLETE) == 0);

    status = DSPI_MasterTransferNonBlocking(handle->base, &handle->drv_handle, transfer);
    if (status != kStatus_Success)
    {
        OSSemPost(&handle->mutex, OS_OPT_POST_1, &err);
        return status;
    }

    /* Wait for transfer to finish */
    ev = OSFlagPend(&handle->event, RTOS_DSPI_COMPLETE, 0, OS_OPT_PEND_FLAG_SET_ALL, NULL, &err);
    if (!(ev & RTOS_DSPI_COMPLETE))
    {
        OSSemPost(&handle->mutex, OS_OPT_POST_1, &err);
        return kStatus_Fail;
    }

    /* Unlock resource mutex */
    OSSemPost(&handle->mutex, OS_OPT_POST_1, &err);
    if (OS_ERR_NONE != err)
    {
        /* We could not post back the semaphore, exit with error */
        return kStatus_Fail;
    }

    /* Return status captured by callback function */
    return handle->async_status;
}
//-----------------------------------------------------------------------------------
//  After the transmission begin , wait event during the transmission
//-----------------------------------------------------------------------------------
LOCAL uint32 _WaitCardEvent (SDIO_CARD_PAL_HANDLE handle,uint32 EventId)
{
#if defined (UCOS_BSD_EVENT)
    INT8U err;
    OSFlagPend (handle->sdio_event, EventId, OS_FLAG_WAIT_SET_ALL|OS_FLAG_CONSUME, 1000, &err);

    if (OS_TIMEOUT == err)
    {
        s_CardErrCode |= BIT_31;
    }

#elif defined (CARD_SDIO_EVENT)
    {
        uint32 actualFlag;
        uint32 eRet;

				eRet = SCI_GetEvent (handle->sdio_event,EventId,SCI_AND_CLEAR,&actualFlag,3000);
        if (SCI_SUCCESS != eRet)
        {
            s_CardErrCode |= BIT_31;
            SDIO_CARD_PRINT(("SCM Wait event error!!! eRet = 0x%x",eRet));
        }
    }
#else

    //  CARD_PRINT(("SD20 Wait event before %x",EventId));
    if(EventId == (s_CardEvent&EventId))
    {
        return 0;
    }
    else
    {
	return 1;
    }

    //  CARD_PRINT(("SD20 Wait event end %x",s_CardEvent));
#endif
}
Esempio n. 14
0
int flag_event_timedwait(flag_event_t *event, const struct timespec *abs_timeout){
#if defined(OS_FREERTOS)
	EventBits_t uxBits;
	TickType_t timeout = abs_timeout->tv_sec * 1000 * portTICK_PERIOD_MS;
	timeout += abs_timeout->tv_nsec / 1000000 * portTICK_PERIOD_MS;
	uxBits = xEventGroupWaitBits(*event,
			((uint32_t)1) << 0,
			pdTRUE,
			pdFALSE,
			timeout);
	if(uxBits & (((uint32_t)1) << 0))
		return 1;
	return 0;
#elif defined(OS_UCOS)
	OS_ERR err;
	OS_FLAGS flags;
	OS_TICK timeout = abs_timeout->tv_sec * TICK_RATE_HZ;
	timeout += abs_timeout->tv_nsec / 1000000 * TICK_RATE_HZ / 1000;
	flags = OSFlagPend(event, 1, timeout, OS_OPT_PEND_FLAG_SET_ANY|OS_OPT_PEND_FLAG_CONSUME, 0, &err);
	if((err == OS_ERR_NONE) && (flags & ((OS_FLAGS)1) == 1)) return 1;
	return 0;
#endif
}
Esempio n. 15
0
//audio task
void AudioTask()
{
    OS_STATUS     os_status;
    UBYTE         os_err;
    AUDIO_STATUS  audio;
    USHORT        actualflagmask;
    GBOOL         audioStatus = GFALSE;
    U8            tsInput;
    U32           rx,wx;
    U32           offset;

    OSSemPend(driver_sync_sem, 0, &os_err);
    /* Do initialisation that requires the OS to be running or interrupts enabled*/
    /* None of the Core/Verifier or Application tasks are running */
    OSSemPost(driver_sync_sem);

    tsInput = GH_BM_getm_ReadEnable_HW_BUF_SEL();
    if(tsInput == GD_TSD_2)
        offset = GH_BM2_get_BufferSize(GD_TSD_AUDIO_PES);
    else
        offset = GH_BM1_get_BufferSize(GD_TSD_AUDIO_PES);

    while(1)
    {
        os_status = OSFlagPend(eventflagmask, eventflagtype, 0, &actualflagmask);

        //SYS_DEBUG_INFO(DEBL0_NSTR, (CSTR*)"8     actualflagmask ",actualflagmask,0,0);

        if((actualflagmask&AUDIO_FILE_PLAYED) == AUDIO_FILE_PLAYED)
        {
            OSFlagClear(eventflagmask, &actualflagmask);

            SYS_DEBUG_INFO(DEBL0_NSTR, (CSTR*)"8     actualflagmask1 ",actualflagmask,0,0);
            while(dataIndex < memDataSize)
            {
                OSTimeDly(50);
                GD_TSD_GetBufferPointer(GD_TSD_AUDIO_PES, tsInput, &rx, &wx);
                GHA_ResumeFeedData(memDataAddr, memDataSize, &dataIndex, &lastDataIndex, &pesLen, wx, rx-1);
                if(rx == 0)
                    wx =offset;
                else
                    wx =rx-1;
                if(tsInput == GD_TSD_2 )
                    GH_BM2_set_BufferWritePointer(GD_TSD_AUDIO_PES, wx);
                else
                    GH_BM1_set_BufferWritePointer(GD_TSD_AUDIO_PES, wx);
            }

            if(soundFileFlag == AUDIO_PLAYED)
            {
                //OSQPostToCore(HDI_PL_AUDIO_FILE_COMPLETED_XT, (void*)&loadcompleted, sizeof(HDI_PL_AUDIO_FILE_COMPLETED_XT));
                SYS_DEBUG_INFO(DEBL0_NSTR, (CSTR*)"8     loadcompleted.event_qualifier: ",loadcompleted.event_qualifier,0,0);
            }
            soundFileFlag = AUDIO_COMPLETED;

            GD_AUD_Stop();
            GD_AUD_Close();
            if(audioStatus == GTRUE)
            {
                HDIStartAudio();
                SYS_DEBUG_INFO(DEBL0_NSTR, (CSTR*)"  start audio",0,0,0);
            }
        }
        else if((actualflagmask&AUDIO_FILE_STOPPED) == AUDIO_FILE_STOPPED)
        {
            OSFlagClear(eventflagmask, &actualflagmask);
            SYS_DEBUG_INFO(DEBL0_NSTR, (CSTR*)"8     actualflagmask2 ",actualflagmask,0,0);
            SYS_DEBUG_INFO(DEBL0_NSTR, (CSTR*)"8     loadcompleted.event_qualifier: ",loadcompleted.event_qualifier,0,0);
        }
        else if((actualflagmask&AUDIO_STATUS_STARTED) == AUDIO_STATUS_STARTED)
        {
            OSFlagClear(eventflagmask, &actualflagmask);
            SYS_DEBUG_INFO(DEBL0_NSTR, (CSTR*)"8     actualflagmask3 ",actualflagmask,0,0);

            if(audioStatus == GFALSE)
            {
                audioStatus = GTRUE;
                aoparameter.change_mask |= 0x01;
                aoparameter.audio_state.state = AUDIO_RUNNING;

                audio.standard_id = MPEG;
                audio.parameters.mpeg_status.layer = aoparameter.audio_state.parameters.mpeg_status.layer;
                audio.parameters.mpeg_status.bitrate_index  = aoparameter.audio_state.parameters.mpeg_status.bitrate_index;
                audio.parameters.mpeg_status.sampling_frequency = aoparameter.audio_state.parameters.mpeg_status.sampling_frequency;
                audio.parameters.mpeg_status.mode = aoparameter.audio_state.parameters.mpeg_status.mode;
                audio.parameters.mpeg_status.emphasis = aoparameter.audio_state.parameters.mpeg_status.emphasis;

                OSTimeDly(30);
                HDIGetAudioStatus(&audio);

                SYS_DEBUG_INFO(DEBL0_NSTR, (CSTR*)"8     aoparameter.change_mask ",aoparameter.change_mask,0,0);

                if((aoparameter.audio_state.parameters.mpeg_status.layer!=audio.parameters.mpeg_status.layer)||
                    (aoparameter.audio_state.parameters.mpeg_status.bitrate_index!=audio.parameters.mpeg_status.bitrate_index)||
                    (aoparameter.audio_state.parameters.mpeg_status.sampling_frequency!=audio.parameters.mpeg_status.sampling_frequency)||
                    (aoparameter.audio_state.parameters.mpeg_status.mode!=audio.parameters.mpeg_status.mode)||
                    (aoparameter.audio_state.parameters.mpeg_status.emphasis!=audio.parameters.mpeg_status.emphasis))
                {
                    aoparameter.change_mask |= 0x04;
                    aoparameter.audio_state.parameters.mpeg_status.layer = audio.parameters.mpeg_status.layer;
                    aoparameter.audio_state.parameters.mpeg_status.bitrate_index = audio.parameters.mpeg_status.bitrate_index;
                    aoparameter.audio_state.parameters.mpeg_status.sampling_frequency = audio.parameters.mpeg_status.sampling_frequency;
                    aoparameter.audio_state.parameters.mpeg_status.mode = audio.parameters.mpeg_status.mode;
                    aoparameter.audio_state.parameters.mpeg_status.emphasis = audio.parameters.mpeg_status.emphasis;
                }

                //OSQPostToCore(HDI_EV_AUDIO_STATUS_CHANGED, (void*)&aoparameter, sizeof(HDI_PL_AUDIO_STATUS_CHANGED_XT));
            }
            aoparameter.change_mask = 0;
        }
        else if((actualflagmask&AUDIO_STATUS_STOPPED) == AUDIO_STATUS_STOPPED)
        {
            OSFlagClear(eventflagmask, &actualflagmask);
            SYS_DEBUG_INFO(DEBL0_NSTR, (CSTR*)"8     actualflagmask4 ",actualflagmask,0,0);

            if(audioStatus == GTRUE)
            {
                audioStatus = GFALSE;
                aoparameter.change_mask |= 0x01;
                aoparameter.audio_state.state = AUDIO_STOPPED;
                //OSQPostToCore(HDI_EV_AUDIO_STATUS_CHANGED, (void*)&aoparameter, sizeof(HDI_PL_AUDIO_STATUS_CHANGED_XT));
            }

            aoparameter.change_mask = 0;
        }
        else if((actualflagmask&AUDIO_TUNER_RECONNECTED) == AUDIO_TUNER_RECONNECTED)
        {
            OSFlagClear(eventflagmask, &actualflagmask);
            SYS_DEBUG_INFO(DEBL0_NSTR, (CSTR*)"8     actualflagmask5 ",actualflagmask,0,0);
            if(audioStatus == GTRUE)
            {
                audioStatus = GFALSE;
                aoparameter.change_mask |= 0x01;
                aoparameter.audio_state.state = AUDIO_STOPPED;
                //OSQPostToCore(HDI_EV_AUDIO_STATUS_CHANGED, (void*)&aoparameter, sizeof(HDI_PL_AUDIO_STATUS_CHANGED_XT));
            }
        }
        else if((actualflagmask&AUDIO_TUNER_REMOVED) == AUDIO_TUNER_REMOVED)
        {
            OSFlagClear(eventflagmask, &actualflagmask);
            SYS_DEBUG_INFO(DEBL0_NSTR, (CSTR*)"8     actualflagmask6 ",actualflagmask,0,0);

            if(audioStatus == GFALSE)
            {
                audioStatus = GTRUE;
                aoparameter.change_mask |= 0x01;
                aoparameter.audio_state.state = AUDIO_RUNNING;
                //OSQPostToCore(HDI_EV_AUDIO_STATUS_CHANGED, (void*)&aoparameter, sizeof(HDI_PL_AUDIO_STATUS_CHANGED_XT));
            }
        }
    }
}
Esempio n. 16
0
/*!
*
* @brief Alarm Task
*/
void alarm_task(void *arg)
{
    wave_t const *waveform = (wave_t *)NULL;
    uint8_t speaker_task_alive = 0;
    uint8_t create_speaker_task;
    OS_FLAGS flags;
    OS_ERR err;                

    (void)arg;

    speaker_config();

    for (;;)    
    {
        flags = OSFlagPend(&alarm_flags, 0xF, 0,
            OS_OPT_PEND_FLAG_SET_ANY | OS_OPT_PEND_FLAG_CONSUME |
            OS_OPT_PEND_BLOCKING, NULL, &err);
        assert(OS_ERR_NONE == err);

        create_speaker_task = 0;
                
        if ((flags & ALARM_HIGH) && (waveform != &alarm_high))
        {
            kill_speaker_if_alive(&speaker_task_alive);
 
            waveform = &alarm_high;
            create_speaker_task = 1;
        }
        else if ((flags & ALARM_MEDIUM) && (waveform != &alarm_medium))
        {
            kill_speaker_if_alive(&speaker_task_alive);

            waveform = &alarm_medium;
            create_speaker_task = 1;
        }
        else if ((flags & ALARM_LOW) && (waveform != &alarm_low))
        {
            kill_speaker_if_alive(&speaker_task_alive);
            
            waveform = &alarm_low;
            create_speaker_task = 1;
        }
        else if (flags & ALARM_NONE)
        {
            kill_speaker_if_alive(&speaker_task_alive);

            waveform = NULL;
            create_speaker_task = 0;
        }
                
        if (create_speaker_task)
        {
            OSTaskCreate(&speaker_tcb, "Speaker Task", speaker_task,
                (void *)waveform, SPEAKER_PRIO, &speaker_stack[0],
                TASK_STACK_SIZE / 10u, TASK_STACK_SIZE, 0u, 0u, 0, 0, &err);
            assert(OS_ERR_NONE == err);

            speaker_task_alive = 1;
        }
    }
}
Esempio n. 17
0
/*******************************************************************************
* 名    称: comm_para_flow
* 功    能: 参数流。根据IC卡的类型进行操作
* 入口参数: 
* 出口参数: 无
* 作   者: redmorningcn.
* 创建日期: 2017-05-26
* 修    改:
* 修改日期:
* 备    注: 任务创建函数需要在app.h文件中声明
*******************************************************************************/
void    comm_para_flow(StrDevOtr * sDtu,uint8 addrnum)
{
    OS_ERR          err;
    uint8       retrytimes = 0;
	uint8		Infolen = 0;
	uint8		*p = (uint8 *)&m_sModelCard;
    
    /***********************************************
    * 描述: 根据IC卡类型进行相应操作。卡类型在插入卡后,赋值
    * 	     如果未插卡,则认为是普通数据卡。
    */ 
    sDtu->Wr.Code	=	Ctrl.sRunPara.CardType;
	
    switch (Ctrl.sRunPara.CardType)  	
    {
        //设置密度
    case    DENSITY_CARD: 
        sDtu->Wr.Info.Density	=	Ctrl.SOilPara.Density;
        Infolen	=	sizeof(Ctrl.SOilPara.Density);
        break;
        
    case    HIGHT_CARD:  
        sDtu->Wr.Info.Hig	=	Ctrl.SOilPara.Hig;
        Infolen	=	sizeof(Ctrl.SOilPara.Hig);            
        break;
        
        //模型选择卡
    case    MODEL_SELECT_CARD:   
        sDtu->Wr.Info.ModelNum	=	Ctrl.SOilPara.ModelNum;
        Infolen	=	sizeof(Ctrl.SOilPara.ModelNum);
        break;
        
        //车型车号
    case    FIX_CARD: 
        sDtu->Wr.Info.sLocoId.Num	=	Ctrl.sProductInfo.sLocoId.Num;
        sDtu->Wr.Info.sLocoId.Type	=	Ctrl.sProductInfo.sLocoId.Type;
        
        Infolen	=	sizeof(	Ctrl.sProductInfo.sLocoId.Num) +
            sizeof( Ctrl.sProductInfo.sLocoId.Type	);
        break;
        
        //读数据指示
    case    DATA_CARD_DIS: 
        
        sDtu->Wr.Info.CardRecNum	=	Ctrl.sRec.StoreCnt;
        
        Infolen	=	sizeof(Ctrl.sRec.StoreCnt);
        
        sDtu->ConnCtrl[0].SendFramNum++;
        
        break;
        
    case    DATA_CARD_ERR: 
        
        sDtu->Wr.Info.Buf[0]	=	Ctrl.sRunPara.CardErrData;
        
        Infolen	=	sizeof(Ctrl.sRunPara.CardErrData);
        
        sDtu->ConnCtrl[0].SendFramNum++;
        
        break;
                
        //读数据指示结束
    case    DATA_CARD_FIN: 
        
        Infolen = 0;
        break; 
        
        /***********************************************
        * 描述: 设置油箱模型。
        *   IC 卡模块插入IC卡后,IC卡主动应答模型。  
        *   后续每200ms发送数据,序号从0开始累加。
        数据发送完成后,序号为0xffffffff。
        */    
    case    MODEL_CARD: {
        modelsendnum         = 0;
        p = (uint8 *)&m_sModelCard;		
        int     sendmodellen  = 0;  //已发送数据长度
        uint16   sendtimes = 0;
        
        OSFlagPendAbort(( OS_FLAG_GRP *)&Ctrl.Os.CommEvtFlagGrp,
                        ( OS_OPT       ) OS_OPT_PEND_ABORT_ALL,
                        ( OS_ERR      *)&err );
        
        while(sizeof(stcModelCard ) > 128 * modelsendnum ) {
            
            if((sizeof(stcModelCard ) - 128 * modelsendnum) > 128 ) {
                if(modelsendnum == 0)
                    p = (uint8 *)&m_sModelCard;		
                //数据序号
                memcpy((uint8 *)&sDtu->Wr.Info.Buf[0],(uint8 *)&modelsendnum,sizeof(modelsendnum));	
                //数据内容
                memcpy((uint8 *)&sDtu->Wr.Info.Buf[4],&p[sendmodellen],128);
                
                
                Infolen = sizeof(modelsendnum)+128;
            } else {		
                //发送结束信号
                modelsendnum = 0xffffffff;
                //数据序号
                memcpy((uint8 *)&sDtu->Wr.Info.Buf[0],(uint8 *)&modelsendnum,sizeof(modelsendnum));	
                //数据内容
                memcpy((uint8 *)&sDtu->Wr.Info.Buf[4],&p[sendmodellen],(sizeof(stcModelCard ) - sendmodellen));
                
                Infolen = sizeof(modelsendnum) + (sizeof(stcModelCard ) - sendmodellen);
                
                sendmodellen = sizeof(stcModelCard ) ;
                //更改卡类型。退出模型卡
                //modelsendnum = 0;
                Ctrl.sRunPara.CardType = DATA_CARD;
            }
            
            
            CSNC_SendData(sDtu->pch,                        //通讯控制块
                          SLAVE_ADDR_OTR,					//源地址
                          MASTE_ADDR_HOST,				    //目标地址
                          sDtu->ConnCtrl[0].SendFramNum,	//发送帧号
                          0,								//帧类型,默认为0,在数据区内明确		
                          (uint8 *)&sDtu->Wr,				//发送缓冲区
                          Infolen+sizeof(sDtu->Wr.Code)	//发送数据区长度
                              );
            
            //数据完成
            if(modelsendnum == 0xffffffff)
                return;            

            OS_FLAGS    flags = 
            OSFlagPend( ( OS_FLAG_GRP *)&Ctrl.Os.CommEvtFlagGrp,
                       ( OS_FLAGS     ) COMM_EVT_FLAG_OTR_RX,
                       ( OS_TICK      ) 250,
                       ( OS_OPT       ) OS_OPT_PEND_FLAG_SET_ANY,
                       ( CPU_TS      *) NULL,
                       ( OS_ERR      *)&err);
            
            
            /***********************************************
            * 描述: 如果串口有应答,则继续发送下一帧
            */
            if ( err == OS_ERR_NONE ) {                
                /***********************************************
                * 描述: 清除标志位
                */
                OSFlagPost( ( OS_FLAG_GRP  *)&Ctrl.Os.CommEvtFlagGrp,
                            ( OS_FLAGS      )COMM_EVT_FLAG_OTR_RX,
                            ( OS_OPT        )OS_OPT_POST_FLAG_CLR,
                            ( OS_ERR       *)&err);
               
                if( Ctrl.Otr.RxCtrl.FramNum == sDtu->ConnCtrl[0].SendFramNum  && 
                    Ctrl.Otr.Rd.modelcontrl.code == MODEL_CARD )  {
                    retrytimes      = 0;
                    modelsendnum++;
                    sendmodellen   += 128;
                } else {
                    retrytimes++;
                    if(retrytimes > 2) {
                        retrytimes      = 0;
                        modelsendnum++;
                        sendmodellen   += 128; 
                   } 
                }
            /***********************************************
            * 描述: 如果串口没有应答,则超时后发送下一帧
            */
            } else  {
                retrytimes++;
                if(retrytimes > 2) {
                    retrytimes      = 0;
                    modelsendnum++;
                    sendmodellen   += 128;

                }
            }
        }
        
        return;
        
    } break;
        /***********************************************
        * 描述: 数据卡(默认状态)。
        *   对
        *   后续每200ms发送数据,序号从0开始累加。
        数据发送完成后,序号为0xffffffff。
        */    		
        //数据卡
    case    DATA_CARD: 
        return;
        break;
        
        //其他类型数据,直接退出
    default:
        return;					   
        
    }
    
	CSNC_SendData(	sDtu->pch,						//通讯控制块
                  SLAVE_ADDR_OTR,					//源地址
                  MASTE_ADDR_HOST,				    //目标地址
                  sDtu->ConnCtrl[0].SendFramNum,	//发送帧号
                  0,								//帧类型,默认为0,在数据区内明确		
                  (uint8 *)&sDtu->Wr,				//发送缓冲区
                  Infolen+sizeof(sDtu->Wr.Code)	//发送数据区长度
                      );
}
Esempio n. 18
0
/*******************************************************************************
* Function Name  : MSD_ReadBlock
* Description    : Reads a block of data from the MSD.
* Input          : - pBuffer : pointer to the buffer that receives the data read
*                    from the MSD.
*                  - ReadAddr : MSD's internal address to read from.
*                  - NumByteToRead : number of bytes to read from the MSD.
* Output         : None
* Return         : The MSD Response: - MSD_RESPONSE_FAILURE: Sequence failed
*                                    - MSD_RESPONSE_NO_ERROR: Sequence succeed
*******************************************************************************/
u8 MSD_ReadBlock_DMA(u8 *pBuffer, u32 ReadAddr, u16 NumByteToRead)
{
    u8 rvalue = MSD_RESPONSE_FAILURE;
    DMA_InitTypeDef  DMA_InitStructure;
    char DuumyClock[512];
    //  INT8U err;
    memset(DuumyClock, 0xff, 512);
    //  debug("MSD_ReadBlock_DMA!\r\n");
    if(CardInfo.CardType != CARDTYPE_SDV2HC)
    {
        ReadAddr = ReadAddr << 9;
    }
    /* MSD chip select low */
    MSD_CS_LOW();
    DMA_DeInit(DMA1_Channel4);
    DMA_DeInit(DMA1_Channel5);
    DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&SPI2->DR;
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)pBuffer;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
    DMA_InitStructure.DMA_BufferSize = 512;
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
    DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    DMA_Init(DMA1_Channel4, &DMA_InitStructure);


    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)DuumyClock;  //512字节的dummy
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
    //DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
    DMA_InitStructure.DMA_Priority = DMA_Priority_Low;
    DMA_Init(DMA1_Channel5, &DMA_InitStructure);

    /* Enable DMA1 Channel4 Transfer Complete interrupt */
    DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);
    /* Enable DMA1 Channel5 Transfer Complete interrupt */
    DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE);

    SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE);
    SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, ENABLE);
    /* Send CMD17 (MSD_READ_SINGLE_BLOCK) to read one block */
    MSD_SendCmd(CMD17, ReadAddr, 0xFF);

    /* Check if the MSD acknowledged the read block command: R1 response (0x00: no errors) */
    if (!MSD_GetResponse(MSD_RESPONSE_NO_ERROR))
    {
        /* Now look for the data token to signify the start of the data */
        if (!MSD_GetResponse(MSD_START_DATA_SINGLE_BLOCK_READ))
        {

            DMA_Cmd(DMA1_Channel5, ENABLE);
            DMA_Cmd(DMA1_Channel4, ENABLE);
#ifdef DMA1_IRQ
            OSFlagPend(Sem_SD_DMA, (OS_FLAGS)3, OS_FLAG_WAIT_SET_ALL, 0, &err); //请求信号量集的第0和第1位且都置1。
            //debug("MSD_ReadBlock_DMA OSFlagPend err=%d \r\n",err);
            DMA_ClearFlag(DMA1_FLAG_TC4);
#else
            while(!DMA_GetFlagStatus(DMA1_FLAG_TC5));

            while(!DMA_GetFlagStatus(DMA1_FLAG_TC4));

            DMA_ClearFlag(DMA1_FLAG_TC4);
#endif
            /* Get CRC bytes (not really needed by us, but required by MSD) */
            MSD_ReadByte();
            MSD_ReadByte();
            /* Set response value to success */
            rvalue = MSD_RESPONSE_NO_ERROR;
        }
        else
        {
            //debug("\r\n erro:MSD_START_DATA_SINGLE_BLOCK_READ\r\n");
        }
    }
    else
    {
        //debug("\r\n error:MSD_RESPONSE_NO_ERROR\r\n");
    }

    DMA_Cmd(DMA1_Channel4, DISABLE);
    DMA_Cmd(DMA1_Channel5, DISABLE);
    /* MSD chip select high */
    MSD_CS_HIGH();
    /* Send dummy byte: 8 Clock pulses of delay */
    MSD_WriteByte(DUMMY_BYTE);

    /* Send stop data transmit command - CMD12 */
    _send_command(CMD12, 0, 0);
    /* Returns the reponse */
    return rvalue;
}
Esempio n. 19
0
/************************************************************************************
* Function Name  : MSD_WriteMultipleBlock_DMA(uint32_t sector, uc8 *buffer,u16 NumByteToWrite)
* Description    : None
* Input          : - sector:
*				   - buffer:
* Output         : None
* Return         : None
* Attention		 : None
************************************************************************************/
int MSD_WriteMultipleBlock_DMA(uint32_t sector, uc8 *buffer, u8 NbrOfSector, u16 NumByteToWrite)
{
    uint8 r1;
    //  uint16_t i=0;
    uint32_t retry;
    u8 value = 0;
    //  INT8U err;
    u8 rvalue = MSD_RESPONSE_FAILURE;
    DMA_InitTypeDef DMA_InitStructure;                                    //定义DMA初始化结构体

    /*begin:yangfei added 2012.11.29*/
    //    debug("MSD_WriteMultipleBlock_DMA\r\n");
    _card_enable();
    DMA_DeInit(DMA1_Channel5);
    DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&SPI2->DR;
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)buffer;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
    DMA_InitStructure.DMA_BufferSize = NumByteToWrite;
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
    DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    DMA_Init(DMA1_Channel5, &DMA_InitStructure);
    /* Enable DMA1 Channel5 Transfer Complete interrupt */
    DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE);
    SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE);
    /*end:yangfei added 2012.11.29*/
    //SPI_DMA_Send_Init(buffer,MSD_BLOCKSIZE);
    /* if ver = SD2.0 HC, sector need <<9 */
    if(CardInfo.CardType != CARDTYPE_SDV2HC)
    {
        sector = sector << 9;
    }
    if(CardInfo.CardType != CARDTYPE_MMC)
    {
        _send_command(ACMD23, NbrOfSector, 0);
    }
    /* Send CMD25 : Write multiple block command */
    MSD_SendCmd(CMD25, sector, 0xff);
    //_spi_read_write(DUMMY_BYTE);
    //_spi_read_write(DUMMY_BYTE);
    if (!MSD_GetResponse(MSD_RESPONSE_NO_ERROR))
    {
        _spi_read_write(DUMMY_BYTE);
        /* Start data write token: 0xFE */
        _spi_read_write(0xFC);

        /*begin:yangfei added 2012.11.28*/
        DMA_Cmd(DMA1_Channel5, ENABLE);

#ifdef DMA1_IRQ
        OSFlagPend(Sem_SD_DMA, (OS_FLAGS)1, OS_FLAG_WAIT_SET_ALL, 0, &err); //请求信号量集的第0位置1
        DMA_ClearFlag(DMA1_FLAG_TC5);
#else

        while(!DMA_GetFlagStatus(DMA1_FLAG_TC5))  ;
        DMA_ClearFlag(DMA1_FLAG_TC5);
#endif
        /* 2Bytes dummy CRC */
        _spi_read_write(DUMMY_BYTE);
        _spi_read_write(DUMMY_BYTE);

        value = MSD_GetDataResponse();

        if (value == MSD_DATA_OK)
        {
            rvalue = MSD_RESPONSE_NO_ERROR;
        }
        //	   debug("value=%x\r\n",value);
    }
    /* Send end of transmit token: 0xFD */
    r1 = _spi_read_write(0xFD);
    if(r1 == 0x00)
    {
        return 4;
    }
    /*begin:yangfei added 2012.12.07 for wait programm finished else write error*/
    /* Wait all the data programm finished */
    retry = 0;
    while(_spi_read_write(DUMMY_BYTE) == 0x00)
    {
        /* Timeout return */
        if(retry++ == 0x40000)
        {
            _card_disable();
            return 3;
        }
    }
    /* chip disable and dummy byte */
    _card_disable();
    _spi_read_write(DUMMY_BYTE);

    /*yangfei added*/
    DMA_Cmd(DMA1_Channel5, DISABLE);

    return rvalue;
}
Esempio n. 20
0
void UserTask(void* pdata)
{
	auto char key;
	auto int CurrentX;
	auto int CurrentY;
	auto int CurrentChoice;
	auto BOOLEAN done;
	auto int position;
	auto INT8U err;
	auto INT16U returnedflags;
	auto char num[2];

	while(1)
	{
		done = FALSE;
		CurrentX = 11;
		CurrentY = 27;
		CurrentChoice = 0;
		position = 0;
		returnedflags = 0;

		memset(PatternGuess, 0, sizeof(PatternGuess));
		DispStr(CurrentX,      CurrentY, Colors[CurrentChoice], " ");
		DispStr(CurrentX + 4,  CurrentY, BGBLACK, " ");
		DispStr(CurrentX + 8,  CurrentY, BGBLACK, " ");
		DispStr(CurrentX + 12, CurrentY, BGBLACK, " ");
		DispStr(CurrentX, CurrentY + 2, DEF_TEXT_COLOR, "+");

		// get a pattern from the user
		while(!done)
		{
			if(kbhit())
			{
		      key = getchar();
   		   switch(key)
      		{
					case 0x38:	// up
						CurrentChoice++;
						CurrentChoice %= COLEND;
						DispStr(CurrentX, CurrentY, Colors[CurrentChoice], " ");
						PatternGuess[position] = CurrentChoice;
						break;
					case 0x32:	// down
						CurrentChoice--;
						if(CurrentChoice < 0) CurrentChoice = COLEND - 1;
						CurrentChoice %= COLEND;
						DispStr(CurrentX, CurrentY, Colors[CurrentChoice], " ");
						PatternGuess[position] = CurrentChoice;
						break;
					case 0x34:  // left
						if(position > 0)
						{
							DispStr(CurrentX, CurrentY + 2, DEF_TEXT_COLOR, " ");
					   	position--;
							CurrentChoice = PatternGuess[position];
					   	CurrentX -= 4;
							DispStr(CurrentX, CurrentY, Colors[CurrentChoice], " ");
							DispStr(CurrentX, CurrentY + 2, DEF_TEXT_COLOR, "+");
						}
						break;
					case 0x36:  // right
						if(position < 3)
						{
							DispStr(CurrentX, CurrentY + 2, DEF_TEXT_COLOR, " ");
					   	position++;
							CurrentChoice = PatternGuess[position];
					   	CurrentX += 4;
							DispStr(CurrentX, CurrentY, Colors[CurrentChoice], " ");
					   	DispStr(CurrentX, CurrentY + 2, DEF_TEXT_COLOR, "+");
						}
						break;
					case 0x0d:
						done = TRUE;
						DispStr(CurrentX, CurrentY + 2, DEF_TEXT_COLOR, " ");
						break;
   		   }
   		}
   	}

   	// let the master task know which colors in what order were selected
		OSMutexPend(GuessMutex, 0, &err);
		if(err != OS_NO_ERR)
			exit(err);
		GuessDone = TRUE;
		OSMutexPost(GuessMutex);

   	// pend on flags from master task to let us know how many colors
   	// were selected in the correct location
		OSFlagPend(ColorFlags, FLAG_GUESS_DONE | FLAG_COLORS_DONE | FLAG_POSITIONS_DONE |
					  FLAG_PATTERN_DONE | FLAG_COLOR_MARKERS_DONE | FLAG_POSITION_MARKERS_DONE,
					  OS_FLAG_WAIT_SET_ALL + OS_FLAG_CONSUME, 0, &err);

		// Once all flags have been set by master task, CorrectLocations and
		// CorrectColors are valid.  If CorrectColors and CorrectLocations are both
		// 4, then correct pattern has been guessed.
		if(CorrectColors != 4 && CorrectLocations != 4)
		{
			sprintf(num, "%d", CorrectColors);
			DispStr(29, 30, FGWHITE BGBLACK, num);
			sprintf(num, "%d", CorrectLocations);
		   DispStr(29, 31, FGWHITE BGBLACK, num);
		 }
	}
}
ADI_OSAL_STATUS adi_osal_EventPend (ADI_OSAL_EVENT_HANDLE const hEventGroup,
                                    ADI_OSAL_EVENT_FLAGS        nRequestedEvents,
                                    ADI_OSAL_EVENT_FLAG_OPTION  eGetOption,
                                    ADI_OSAL_TICKS              nTimeoutInTicks,
                                    ADI_OSAL_EVENT_FLAGS        *pnReceivedEvents)
{
    INT8U           nErr;
    INT8U           nWaitOption = OS_FLAG_WAIT_SET_ALL;
    OS_FLAGS        nRetValue;
    ADI_OSAL_STATUS eRetStatus;
#pragma diag(push)
#pragma diag(suppress:misra_rule_11_4 : "typecasting is necessary to convert the handle type into a native uCOS pointer")
    OS_FLAG_GRP     *hEventNative = (OS_FLAG_GRP*) hEventGroup;
#pragma diag(pop)


#ifdef OSAL_DEBUG
    if ( (nTimeoutInTicks > ADI_OSAL_MAX_TIMEOUT) &&
         (nTimeoutInTicks != ADI_OSAL_TIMEOUT_FOREVER) )
    {
         return (ADI_OSAL_BAD_TIME);
    }

    if ((CALLED_FROM_AN_ISR) || (CALLED_IN_SCHED_LOCK_REGION))
    {
        return (ADI_OSAL_CALLER_ERROR);
    }

    if ( (eGetOption != ADI_OSAL_EVENT_FLAG_ANY) &&
         (eGetOption != ADI_OSAL_EVENT_FLAG_ALL) )
    {
        return (ADI_OSAL_BAD_OPTION);
    }

    if ((NULL == hEventGroup) || (ADI_OSAL_INVALID_EVENT_GROUP == hEventGroup))
    {
        return(ADI_OSAL_BAD_HANDLE);
    }
#endif /* OSAL_DEBUG */

    if(eGetOption == ADI_OSAL_EVENT_FLAG_ANY)
    {
        nWaitOption = OS_FLAG_WAIT_SET_ANY;
    }

    switch (nTimeoutInTicks)
    {
        case ADI_OSAL_TIMEOUT_NONE:
            nRetValue = OSFlagAccept(hEventNative, (OS_FLAGS) nRequestedEvents, nWaitOption, &nErr);
            break;
        case ADI_OSAL_TIMEOUT_FOREVER:
            nRetValue = OSFlagPend(hEventNative, (OS_FLAGS) nRequestedEvents, nWaitOption, 0u, &nErr);
            break;
        default:
#pragma diag(push)
#pragma diag(suppress:misra_rule_10_1_c : "we have checked that the timeout is 16-bit or less in debug so we can cast it without losing information")
            nRetValue = OSFlagPend(hEventNative, (OS_FLAGS) nRequestedEvents, nWaitOption, (INT16U) nTimeoutInTicks, &nErr);
            break;
#pragma diag(pop)
    }

    switch (nErr)
    {
        case OS_ERR_NONE:
            eRetStatus = ADI_OSAL_SUCCESS;
            break;

        case OS_ERR_TIMEOUT:
            eRetStatus = ADI_OSAL_TIMEOUT;
            break;

#ifdef OSAL_DEBUG
        case OS_ERR_EVENT_TYPE:                     /* FALLTHROUGH */
        case OS_ERR_FLAG_INVALID_PGRP:
            eRetStatus = ADI_OSAL_BAD_HANDLE;
            break;

        case OS_ERR_PEND_ISR:
            eRetStatus = ADI_OSAL_CALLER_ERROR;
            break;

        case OS_ERR_FLAG_WAIT_TYPE:
            eRetStatus = ADI_OSAL_BAD_OPTION;
            break;

#endif /* OSAL_DEBUG */

        default:
            eRetStatus = ADI_OSAL_FAILED;
            break;
    }

    /* uC/OS also sets its return value (nRetValue) to be 0 in case of error */
    *pnReceivedEvents = (uint32_t) nRetValue;

    return( eRetStatus );
}