//============================================================================== // RC-RX UART Receive Interrupt routine //------------------------------------------------------------------------------ void __attribute__((__interrupt__,__no_auto_psv__)) RCRXInterrupt(void) { uint Code; while (URXDA) { byte Byte = URXREG; // Read received byte if( Byte == _RCRX_Start ) Code = 1; // 1 - Start code else if (Byte == _RCRX_Stop ) Code = 2; // 2 - Stop code else Code = 0; // 0 - Data byte //--------------------------- // Advance state //--------------------------- _RCRX_RX_CurrentState = _RCRX_RX_StateControl[_RCRX_RX_CurrentState][Code]; //-------------------------------- // Perform Action on received byte //-------------------------------- switch (_RCRX_RX_CurrentState) { //------------------------------------------------------------- case 0: // 0: Scan to Start - No action... break; //------------------------------------------------------------- //------------------------------------------------------------- case 1: // 1: First Start byte during scan, wait for second... break; //------------------------------------------------------------- //------------------------------------------------------------- case 2: // 2: Second Start byte during scan, ready for frame data... break; //------------------------------------------------------------- //------------------------------------------------------------- case 3: // 3: Data byte received _RCRX_SaveByte(Byte); // Store data byte break; //------------------------------------------------------------- //------------------------------------------------------------- case 4: // 4: Potential "STOP"? break; //------------------------------------------------------------- //------------------------------------------------------------- case 5: // 5: Data after miscellaneous "STOP" _RCRX_SaveByte(_RCRX_Stop); // Store skipped STOP _RCRX_SaveByte(Byte); // Store data byte //--------------------------------------------------------- break; //------------------------------------------------------------- //------------------------------------------------------------- case 6: // 6: Frame terminated if ( _RCRX_RX_FrameIdx == _RCRX_FrameSize ) { // Valid frame... submit frame //---------------------------------------------------------- bytecopy( (byte*)_RCRX_RX_NewFrame, (byte*)_RCRX_RX_FrameBuf, _RCRX_FrameSize); //-------------------------------------- _RCRX_IsNewFrame = TRUE; _RCRX_IsConnected = TRUE; _RCRX_LastReadTS = TMRGetTS(); //---------------------------------------------------------- } //-------------------------------------------------------------- // Reset receiver //-------------------------------------------------------------- _RCRX_RX_CurrentState = 0; // Reset automaton _RCRX_RX_FrameIdx = 0; // Reset index in Receive buffer //-------------------------------------------------------------- break; //------------------------------------------------------------- } } //------------------------------------------------- URXIF = 0; // Clear UART RX interrupt flag //------------------------------------------------- return ; }
static bool_typ slv_update( slv_db_typ *pdb, db_data_typ *pdata, unsigned xport ) { db_entry_typ *pentry; dl_node_typ *pnode; trig_info_typ trig_pack; comm_clt_typ *pclt; if( (pentry = db_entry_find( pdb, pdata->var, pdata->type )) != NULL ) { bytecopy( pentry->size, (char *) pdata->value.user, (char *) pentry->data.value.user ); pentry->data.time = get_sec_clock(); trig_pack.msg_type = DB_TRIGGER; trig_pack.key = 0; trig_pack.var = pdata->var; trig_pack.type = pdata->type; pnode = pentry->ptrig_head->pfirst; while( pnode != NULL ) { switch (xport) { case COMM_QNX6_XPORT: { trig_comm_typ *ptrigcomm = (trig_comm_typ *) pnode->pitem; if( comm_async_trig( ptrigcomm->pclt, (void *) &(ptrigcomm->trig_event), sizeof( struct sigevent ) ) == FALSE ) { ptrigcomm = dl_rm_node( pentry->ptrig_head, &pnode ); comm_done( ptrigcomm->pclt ); FREE(ptrigcomm); if( pnode == NULL ) pnode = pentry->ptrig_head->pfirst; else pnode = pnode->pnext; } else pnode = pnode->pnext; break; } case COMM_QNX_XPORT: default: { pclt = (comm_clt_typ *) pnode->pitem; if( comm_async_trig( pclt, &trig_pack, sizeof( trig_info_typ ) ) == FALSE ) { pclt = dl_rm_node( pentry->ptrig_head, &pnode ); comm_done( pclt ); if( pnode == NULL ) pnode = pentry->ptrig_head->pfirst; else pnode = pnode->pnext; } else pnode = pnode->pnext; } } } return( TRUE ); } else return( FALSE ); }