void mpu6050DMPIRQHandler(void)
{
	INT8U err;
	
	OSSemSet(mpu6050Rdy, 0, &err);
	OSSemPost(mpu6050Rdy);
}
Exemple #2
0
int uart1_send(u8_t *buff,u32_t size)
{
	int ret;
	if((size == 0) || (buff == 0))
		return -1;
	p_dbg("uart1 send start\n");
	clear_wait_event(u1_send.wait);
	OSSemSet((OS_EVENT*)u1_send.wait, 0, (INT8U*)&ret);
	u1_send.cnt = size;
 	DMA_TxConfiguration((uint32_t*)buff, size);
	
again:
	ret = wait_event_timeout(u1_send.wait, 2000);
	if(ret != 0)
		goto again;
	
	p_dbg("uart1 send end\n");

	if(u1_send.cnt)
		p_err("uart1_send err:%d,%d,%d\n",ret,u1_send.cnt,size);
	else
		p_dbg("uart1 send a  pkg:%d\n", size);
	
	return 0;
}
Exemple #3
0
void  *SerialOS_SemCreate (CPU_INT16U  cnt)
{
    OS_EVENT  *psem;
    INT8U      os_err;
    CPU_SR_ALLOC();


    CPU_CRITICAL_ENTER();
    if (OSEventObjIx < 1u) {
        CPU_CRITICAL_EXIT();
        return ((void *)0);
    }

    if (OSEventObjIx > SERIAL_OS_MAX_NBR_SEM) {
        CPU_CRITICAL_EXIT();
        return ((void *)0);
    }

                                                                /* -------------- GET OS EVENT FROM POOL -------------- */
    OSEventObjIx--;
    psem = OSEventObj[OSEventObjIx];
    CPU_CRITICAL_EXIT();

    OSSemSet(psem, cnt, &os_err);

    return ((void *)psem);
}
Exemple #4
0
/*
*********************************************************************************************************
*                                    App_TaskNoah_Ruler()
*
* Description : Process Comminucation between Ruler module and Audio Bridge.
*               Noah protocol layer related data parsing and processing.
*               This task wait for message event from App_TaskUART_Rx(). Check if the Noah layer data is 
*               valid in the message.  
*
* Argument(s) : p_arg   Argument passed to 'App_TaskNoah_Ruler()' by 'OSTaskCreate()'.
*
* Return(s)   : none.
*
* Note(s)     : (1) The first line of code is used to prevent a compiler warning because 'p_arg' is not
*                   used.  The compiler should not generate any code for this statement.
*********************************************************************************************************
*/
void App_TaskNoah_Ruler( void *p_arg )
{ 
    (void)p_arg;
    
    NOAH_CMD   *pPcCmd ;    
    CPU_INT08U *pCmdBuf ;
    CPU_INT08U  rxID ; 
    CPU_INT08U  PcCmdRxID_Ruler[4];
    CPU_INT08U  sum ;  
    CPU_INT08U  SessionDone;
    CPU_INT08U  err ;
    CPU_INT08U *pTaskMsgIN ;  
    CPU_INT08U *pMsg ;  
    
    pTaskMsgIN  = NULL;
    pMsg        = NULL;
    SessionDone = 0 ;    
   
      
    while( DEF_TRUE ) {          
             
        pTaskMsgIN  = (INT8U *)OSQPend( EVENT_MsgQ_RulerUART2Noah, 0, &err ); 
        
        if( pTaskMsgIN != NULL && OS_ERR_NONE == err )   {
           
            pCmdBuf = pTaskMsgIN; // char point to the data buffer
            pPcCmd  = (NOAH_CMD *)pCmdBuf ; //change to NOAH_CMD type
            rxID    = GET_FRAME_ID( pPcCmd->head ) ; //get frame ID, index       
            sum     = pPcCmd->checkSum; //get check sum data  
            
            LED_Toggle(LED_DS2);           
            APP_TRACE_DBG(("\r\n<<"));
            switch( GET_FRAME_TYPE( pPcCmd->head ) ) {// GET_FRAME_TYPE(pPcCmd->head)  get frame type 
                
                case FRAM_TYPE_DATA :  
                    
                    if( (sum == 0) || ( sum == CheckSum(0,pCmdBuf, pPcCmd->DataLen + 2)) ) {   
//                        APP_TRACE_INFO(("R[%d]:[0x%2x>0x%2x][",Global_Ruler_Index,PcCmdRxID_Ruler[Global_Ruler_Index],rxID));
//                        for(unsigned int i = 0; i<pPcCmd->DataLen; i++){   
//                            APP_TRACE_INFO((" %2X", *(unsigned char*)(pPcCmd->Data+i) )); 
//                        }
//                        APP_TRACE_INFO((" ]\r\n")); 
                        pcSendDateToBuf( EVENT_MsgQ_Noah2RulerUART, SET_FRAME_HEAD(rxID,FRAM_TYPE_ACK), NULL, 0, 0, NULL, 0 ) ;  // ACK                                               
                        if( (CPU_INT08U)(PcCmdRxID_Ruler[Global_Ruler_Index]+0x40) == rxID ) { // chweck if frameID repeat  
                            PcCmdRxID_Ruler[Global_Ruler_Index] = rxID ; //save this frameID 
                         
                            err = Noah_CMD_Parse_Ruler( pPcCmd, &SessionDone); // jump to CMD parse 
                            if( (err != OS_ERR_NONE) || (SessionDone == 1) ) {
                                SessionDone = 0;
                                Ruler_CMD_Result = err ;
                                OSTimeDly(2); //wait enough time for ACK to be sent
                                APP_TRACE_DBG((" Res[0x%2x]", Ruler_CMD_Result));
                                OSSemPost( Done_Sem_RulerUART );                                     
                            }
          
                        } else {                      
                            APP_TRACE_DBG(("PcCmdRxID_Ruler[%d] Err: expect 0x%X, get 0x%X",Global_Ruler_Index,PcCmdRxID_Ruler[Global_Ruler_Index]+0x40,rxID)); 
                        }
                        
                    } else {                
                        pcSendDateToBuf( EVENT_MsgQ_Noah2RulerUART, SET_FRAME_HEAD(rxID,FRAM_TYPE_NAK), NULL, 0, 0, NULL, 0 ) ;  // NAK   
                    
                    }                 
                break ;                
          
                    
                case FRAM_TYPE_ESTA :
                  
                    PcCmdRxID_Ruler[Global_Ruler_Index] = 0xC0 ; // ? why 0x40: make sure there can be many same setup frame
                    PcCmdTxID_Ruler[Global_Ruler_Index] = 0x00 ; //  
                    
                    OSSemPost( ACK_Sem_RulerUART );                 
                    OSSemPost( Done_Sem_RulerUART ); //end the resend pending--                     
                    OSTimeDly(1); //wait for the TX buffer is empty 
                    
                    //Reset all UART CMD related buffer and release mem 
                    do{  //reset mem used by  EVENT_MsgQ_RulerUART2Noah                    
                        pMsg   = (INT8U *)OSQAccept( EVENT_MsgQ_Noah2RulerUART, &err );
                        OSMemPut( pMEM_Part_MsgUART, pMsg ); 
                    } while ( pMsg != NULL && OS_ERR_NONE == err ) ; 
                    
                    do{  //reset mem used by  EVENT_MsgQ_RulerUART2Noah                  
                        pMsg   = (INT8U *)OSQAccept( EVENT_MsgQ_RulerUART2Noah, &err );
                        OSMemPut( pMEM_Part_MsgUART, pMsg ); 
                    } while ( pMsg != NULL && OS_ERR_NONE == err ) ; 
                       
                    Queue_Flush( pUART_Send_Buf[RULER_UART] ); //clear uart send&rec data queue
                    Queue_Flush( pUART_Rece_Buf[RULER_UART] );                      
         
                    SessionDone = 0;  //init  
                    OSSemSet( ACK_Sem_RulerUART, 0, &err ); // clear the sem
                    OSSemSet( Done_Sem_RulerUART, 0, &err );
                    test_counter4++;
                    APP_TRACE_DBG(("EST/ESTA"));   
                break ;         
                        
                case FRAM_TYPE_ACK :
                  
                    if( rxID == PcCmdTxID_Ruler[Global_Ruler_Index] ) {                       
                        OSSemPost( ACK_Sem_RulerUART );                        
                        test_counter2++;
                    } else {
                        APP_TRACE_INFO_T(("\r\nACK: Got %X, Expect %X\r\n",rxID,PcCmdTxID_Ruler[Global_Ruler_Index] )); 
                    }
                    APP_TRACE_DBG(("ACK")); 
                    test_counter3++;       
                break ;
                
                case FRAM_TYPE_NAK :
                    // dismiss NAK, there will be a resend if no ACK got
                    // OSSemPost( Done_Sem_RulerUART );
                    test_counter1++;
                    APP_TRACE_DBG(("NAK")); 
                break;
                
                         
                default :    
                break ;              
            } 
            
            //release mem
            OSMemPut( pMEM_Part_MsgUART, pTaskMsgIN );  
           
        }         
        
        ////OSTimeDly(2);   //use OSQPend(), no delay needed!!! 
        
    }        
    
    
}
Exemple #5
0
void  App_TaskUserIF (void *p_arg)
{
  
    CPU_INT32U  *msg;
    CPU_INT08U   err;
    CPU_INT32U   key_state; 
    CPU_INT08U   ruler_id;

    (void)p_arg;    
    
    OSTimeDly(500); //wait for other tasks be ready , and time for power stable for ruler  
    Head_Info(); //Send header 
    Ruler_Power_Switch(1);
    Init_Global_Var();    
    AB_POST();
    
#ifndef BOARD_TYPE_AB01  
    APP_TRACE_INFO_T(("WARNING: NOT AB01, NO MCU CRT UART SWITCH\r\n"));
#endif
   
    while ( DEF_TRUE ) {                                          /* Task body, always written as an infinite loop.           */   
               
        msg = (CPU_INT32U *)(OSMboxPend(App_UserIF_Mbox, 0, &err)); //pending, no timeout       
        if (msg != NULL) {          
            key_state = *msg ;
            APP_TRACE_INFO(("\r\n"));             
            switch( key_state & MSG_TYPE_MASK ) {                
                case MSG_TYPE_RESET : //reset send msg                
                    //PDM_Pattern_Gen(0); //gen cp2240 pattern
                    Head_Info();                                   
                break;
                    
                case MSG_TYPE_SWITCH ://Switch                
                    APP_TRACE_INFO_T(("Switch status updated:  SW[1..0] = [%d, %d]\r\n",\
                                     (key_state>>0)&(0x01),(key_state>>1)&(0x01) )); 
                    /**********************************************************************/
                    //To do something to do with Switch selection...                    
                    // Switch 'SW0' used to control DEBUG port:
                    //         0: ON :  UART1 used as debug port
                    //         1: OFF:  DBG UART used as debug port
                    if( (key_state>>(8 + 1)) & 0x01) {  //check if SW0 switch status changed  
                        OSTaskDel( APP_CFG_TASK_SHELL_PRIO ); 
                        OSSemSet (Bsp_Ser_Tx_Sem_lock, 1,  &err) ;
                        OSSemSet (Bsp_Ser_Rx_Sem_lock, 1,  &err) ;
                        Task_ReCreate_Shell();  
                        if( ((key_state>>1)& 0x01 ) == 0 ) { //debug to UART1  
                            Debug_COM_Sel = 1 ;
                            BSP_Ser_Init(115200);  
                        } else {                             //debug to DBG_UART                      
                            Debug_COM_Sel = 0 ;               
                            UART_Init(PC_UART, ISR_PC_UART, 115200 );    //To PC  ? Sem recreat issue
                        }
                    } 
//                    // Switch 'SW1' used to control Buzzer mute:
//                    //         0: ON :  Buzzer muted
//                    //         1: OFF:  Buzzer unmuted
//                    if( (key_state>>(8 + 0)) & 0x01) {  //check if SW1 switch status changed                         
//                        if( ((key_state>>0)& 0x01 ) == 0 ) { 
//                            BUZZER_MUTE =  1;   //mute buzzer                         
//                        } else {                                                 
//                            BUZZER_MUTE =  0;   //unmute buzzer
//                        }
//                    } 
                      // Switch 'SW1' used to control CODEC LOUT PGA Gain:
                      //         0: ON :  24dB attenuated signal for Phone MIC input
                      //         1: OFF:  Normal signal for ACQUA
                      if( (key_state>>(8 + 0)) & 0x01) {  //check if SW1 switch status changed                         
                          if( ((key_state>>0)& 0x01 ) == 0 ) {                                
                              err = CODEC_LOUT_Small_Gain_En( true ) ;  //enable 24dB attenuated signal for Phone Mic                                               
                          } else {                                                 
                              err = CODEC_LOUT_Small_Gain_En( false ) ; //normal signal, no attenuation                              
                          }
                          if( OS_ERR_NONE != err ) {
                              APP_TRACE_INFO_T(("ERR: Set CODEC_LOUT_Small_Gain_En err! [%d]\r\n",err));
                          }
                      } 
                break;
                
                case MSG_TYPE_PORT_DET :   
                    if( port_enable == false ) { 
                        //APP_TRACE_INFO(("Ruler port disabled !\r\n"));
                        break; 
                    }
                    APP_TRACE_INFO_T(("Ruler port status changed:  Port[3..0] = [%1d%1d%1d%1d] ",\
                                    (key_state>>0)&(0x01),(key_state>>1)&(0x01),(key_state>>2)&(0x01),(key_state>>3)&(0x01) )); 
                    
                    for( ruler_id = 0 ; ruler_id < 4 ; ruler_id++ ) {   
                        if( (key_state>>( 8 + 3 - ruler_id)) & 0x01) {  //check if Ruler Port[0] switch status changed                            
                            if( ( (key_state>>(3 - ruler_id)) & 0x01 ) == 0 ) { // ruler attached, setup ruler                              
                                //LED_Set( LED_P0 + ruler_id );
                                APP_TRACE_INFO_T(("Ruler[%d] Attached.\r\n", ruler_id ));                            
                                Global_Ruler_State[ruler_id] = RULER_STATE_ATTACHED; 
                                err = Init_Ruler( ruler_id ); 
                                if( OS_ERR_NONE != err ) {
                                    //LED_Clear( LED_P0 + ruler_id );
                                    continue;
                                }                         
                                err = Setup_Ruler( ruler_id ); 
                                if( OS_ERR_NONE != err ) {
                                    //LED_Clear( LED_P0 + ruler_id );
                                    continue;
                                }
////                                err = Ruler_Setup_Sync(  ruler_id );
////                                if( OS_ERR_NONE != err ) {
////                                    //LED_Clear( LED_P0 + ruler_id );
////                                    continue;
////                                }                                
                                err = Get_Ruler_Type( ruler_id ); 
                                if( OS_ERR_NONE != err ) {
                                    //LED_Clear( LED_P0 + ruler_id );
                                    continue;
                                }
                                err = Get_Ruler_Version( ruler_id ); 
                                if( OS_ERR_NONE != err ) {
                                    //LED_Clear( LED_P0 + ruler_id );
                                    continue;
                                }                                  
                                err = Ruler_POST( ruler_id ); 
                                if( OS_ERR_NONE != err ) {
                                    //LED_Clear( LED_P0 + ruler_id );
                                    continue;
                                }                     
                                Global_Ruler_State[ruler_id] = RULER_STATE_CONFIGURED ;                              
//                                mic_mask = Global_Mic_Mask[ruler_id];
//                                err = Update_Mic_Mask( ruler_id, mic_mask );
//                                if( OS_ERR_NONE != err ) {                              
//                                    continue;
//                                }   
//                                if( mic_mask ) {
//                                    Global_Ruler_State[ruler_id]= RULER_STATE_SELECTED;                                   
//                                } 
                                //OSTimeDly(500);
                                //simple_test_use();//test for Dr.Yang and use USBApp0815.exe
                                                                           
                            } else { // ruler detached
                                //LED_Clear( LED_P0 + ruler_id );
                                APP_TRACE_INFO_T(("Ruler[%d] Detached.\r\n", ruler_id )); 
                                Global_Ruler_State[ruler_id] = RULER_STATE_DETACHED ;
                                Global_Ruler_Type[ruler_id]  = 0 ;
                                Global_Mic_Mask[ruler_id]    = 0 ; 
                            } 
                

                        }                              
                }