Example #1
0
//==============================================================================
// 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 ;
	}
Example #2
0
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 );
}