Stream not closing


#1

I have an application that sets up UART1 and GSM streams for FCM handling when a call comes in. If I don’t answer the call (cancel the atd before ‘CONNECT’) then the streams all close down properly and I can make another call.

If, however, I allow the session to connect the stream for the UART does not close, any ideas why?

Here’s a cut-down version of the code:

s8 CallEventHandler (u16 Event, u32 CallID)
{
	s8 ReturnValue=ADL_CALL_FORWARD;
	
	switch (Event)
	{
		case ADL_CALL_EVENT_RING_DATA:
			if (adl_fcmIsAvailable(ADL_PORT_UART1)==TRUE)
			{
				//Listen for local comms events
				UART_FlowControlHandle=adl_fcmSubscribe (ADL_PORT_UART1, (adl_fcmCtrlHdlr_f)UART_FCMControlHandler, (adl_fcmDataHdlr_f)UART_FCMDataHandler);
				if (UART_FlowControlHandle<0)
				{
					OutputTraceAndNumber (1, "Failed to subscribe to UART flow control, response : ", UART_FlowControlHandle);
				}

				//Listen for GSM comms events
				GSM_FlowControlHandle=adl_fcmSubscribe (ADL_PORT_GSM_BASE, (adl_fcmCtrlHdlr_f)GSM_FCMControlHandler, (adl_fcmDataHdlr_f)GSM_FCMDataHandler);
				if (GSM_FlowControlHandle<0)
				{
					OutputTraceAndNumber (1, "Failed to subscribe to GSM flow control, response : ", GSM_FlowControlHandle);
				}

				OutputTrace (1, "UART switched to data mode");
				
				OutputTrace (1, "Incoming data call, answering call ...");
				//This answers the call
				ReturnValue=ADL_CALL_NO_FORWARD_ATA;
			}
			else
			{
				OutputTrace (1, "Ignoring incoming call, UART unavailable");
			}
			break;
		case ADL_CALL_EVENT_ANSWER_OK:
			//Call set up after a ADL_CALL_NO_FORWARD_ATA
			OutputTraceAndNumber (1, "Answered OK, speed : ", CallID);

			//Switch the UART to data mode
			adl_fcmSwitchV24State (UART_FlowControlHandle, ADL_FCM_V24_STATE_DATA);

			break;
	}

	return ReturnValue;
}
//---------------------------------------------------------------------------------
void Hangup()
{
	//Switch back to 'AT mode'
	adl_fcmSwitchV24State (UART_FlowControlHandle, ADL_FCM_V24_STATE_AT);
	OutputTrace (1, "UART returned to 'AT' mode");

	//Release the flow control handle for UART
	adl_fcmUnsubscribe (UART_FlowControlHandle);
	OutputTrace (1, "UART stream unsubscribed");

	//Release the flow control handle for GSM
	adl_fcmUnsubscribe (GSM_FlowControlHandle);
	OutputTrace (1, "GSM stream unsubscribed");
}
//---------------------------------------------------------------------------------
bool GSM_FCMControlHandler (adl_fcmEvent_e Event)
{
	switch (Event)
	{
		case ADL_FCM_EVENT_FLOW_CLOSED:
			OutputTrace (1, "GSM stream closed");
			Hangup();
			break;
	}

	return TRUE;
}
//---------------------------------------------------------------------------------
bool GSM_FCMDataHandler (u16 DataLength, u8 *Data)
{
	OutputTraceAndNumber (2, "GSM:", DataLength);
	return TRUE;
}
//---------------------------------------------------------------------------------
bool UART_FCMDataHandler (u16 DataLength, u8 *Data)
{
	adl_fcmSendData (GSM_FlowControlHandle, Data, DataLength);
	return TRUE;
}
//---------------------------------------------------------------------------------

Debug :

//Incoming call
Trace L3RR 1 Unable to find the string of the remote trace in the file (ID = 875186)
Trace IP 1 06/01/2000,19:14:44 UART switched to data mode
Trace IP 1 06/01/2000,19:14:44 Incoming data call, answering call …
Trace IP 1 06/01/2000,19:14:44 UART stream opened
Trace IP 1 06/01/2000,19:14:44 GSM stream opened
Trace 1 Unable to find the string of the remote trace in the file (ID = 878588)
Trace MMT 1 Unable to find the string of the remote trace in the file (ID = 872087)

//Hung the call
Trace IP 1 06/01/2000,19:14:45 GSM stream closed
Trace IP 1 06/01/2000,19:14:45 UART returned to ‘AT’ mode
Trace IP 1 06/01/2000,19:14:45 UART stream unsubscribed
Trace IP 1 06/01/2000,19:14:45 GSM stream unsubscribed
Trace IP 1 06/01/2000,19:14:45 No carrier
Trace IP 1 06/01/2000,19:14:45 Released ID
Trace IP 1 06/01/2000,19:14:45 UART stream closed

//Another incoming call
Trace L3RR 1 Unable to find the string of the remote trace in the file (ID = 875186)
Trace IP 1 06/01/2000,19:14:54 UART switched to data mode
Trace IP 1 06/01/2000,19:14:54 Incoming data call, answering call …
Trace IP 1 06/01/2000,19:14:55 UART stream opened
Trace IP 1 06/01/2000,19:14:55 GSM stream opened
Trace 1 Unable to find the string of the remote trace in the file (ID = 878588)
Trace 1 Unable to find the string of the remote trace in the file (ID = 877977)

//This time we connect
Trace IP 1 06/01/2000,19:15:07 Answered OK, speed : 9600
Trace IP 1 06/01/2000,19:15:07 UART in V24 data mode
//Send +++ then an ATH
Trace IP 2 06/01/2000,19:15:09 GSM:1
Trace IP 2 06/01/2000,19:15:10 GSM:1
Trace IP 2 06/01/2000,19:15:10 GSM:1
Trace MMT 1 Unable to find the string of the remote trace in the file (ID = 872087)
Trace IP 1 06/01/2000,19:15:11 GSM stream closed
Trace IP 1 06/01/2000,19:15:11 UART returned to ‘AT’ mode
Trace IP 1 06/01/2000,19:15:12 UART stream unsubscribed
Trace IP 1 06/01/2000,19:15:12 GSM stream unsubscribed
Trace IP 1 06/01/2000,19:15:12 No carrier
Trace IP 1 06/01/2000,19:15:12 Released ID
Trace IP 1 06/01/2000,19:15:12 UART in V24 AT mode

//No UART closure!! The ADL_FCM_EVENT_FLOW_CLOSED isn’t called


#2

Hello.

I think I have the same behavior in RTE (debug) mode, but it works fine in target mode. Last time I tested it in OAT3.01.

I don’t know if it’s a known problem.
I’ve tried everything I could think of, but couldn’t find a solution other than to get used to it.

Milan


#3

Right, I better try and make this thing work in target mode then!