void mpu6050DMPIRQHandler(void) { INT8U err; OSSemSet(mpu6050Rdy, 0, &err); OSSemPost(mpu6050Rdy); }
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; }
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); }
/* ********************************************************************************************************* * 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!!! } }
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 ; } } }