Hi all. I have a FXT009 with 7.52.0.201306260837 loaded.
I have now created a state machine based application that connects the bearer, then creates a TCPServer which listens on port 8080, then once a connection is received it create a tunnel between the socket and UART 1. I can get that to work reliably etc…
But… now I want to enable low power mode and to do that I need to close UART1 so it enters low power mode. I am using FCM for data flow management on the UART. However I am having problems reliably opening and close the UART. Could you please describe what I need to do to make it work?
What I currently do to open and then close the UART is listed in the below code. I would appreciate your comments.
Init and Shutdown are called when the TCP socket is connected to and closed respectively.
void serialFcmInit(void)
{
s8 status = -1;
// setIPR();
if (serial_state.serial1FcmHandle != -1 && serial_state.serialState == SERIAL_DISCONNECTING)
{
//if we get here, then we assume the previous disconnect did not complete, so continue as if serial port is closed.
applog("UART: Serial1 already defined as =%d", serial_state.serial1FcmHandle);
serial_state.serial1FcmHandle = -1;
serial_state.serialState = SERIAL_CLOSED;
}
if (serial_state.serialState == SERIAL_CONNECTED && serial_state.serial1FcmHandle != -1)
{
//applog("UART: Already connected. Not initialising FCM");
}
else if (serial_state.serialState == SERIAL_CLOSED && serial_state.serial1FcmHandle == -1)
{
applog("UART: Serial Init");
serial_state.serialState = SERIAL_CONNECTING;
ringBuf1Reset();
status = adl_fcmSubscribe(ADL_PORT_UART1, (adl_fcmCtrlHdlr_f)serial1FcmCtrlHandler, (adl_fcmDataHdlr_f)serial1FcmDataHandler);
if(status >= 0)
{
serial_state.serial1FcmHandle = status;
applog("UART: serial1=%d", serial_state.serial1FcmHandle);
}
else
applog("UART: fcmSubscribe failed. Error: %d", status);
}
else if (serial_state.serialState == SERIAL_CONNECTING && serial_state.serial1FcmHandle != -1)
{
applog("UART: Waiting for connection. %d", serial_state.serialState);
}
else
applog("UART: FCMInit - unhandled scenario Handle: %d Status:%d", serial_state.serial1FcmHandle, serial_state.serialState);
//comTimerStart();
}
void serialFcmShutdown()
{
s8 status = -1;
if (serial_state.serial1FcmHandle != -1 && serial_state.serialState == SERIAL_CONNECTED)
{
applog("UART 1: Serial shutdown");
ringBuf1Reset();
serial_state.serialState = SERIAL_DISCONNECTING;
status = adl_fcmSwitchV24State(serial_state.serial1FcmHandle, ADL_FCM_V24_STATE_AT);
if(status == OK)
{
serial_state.serial1FcmHandle = status;
applog("UART 1: adl_fcmSwitchV24State changed to AT");
}
else
{
applog("UART 1: adl_fcmSwitchV24State change to AT. Error: %d", status);
//try force close on the rest.
adl_fcmReleaseCredits( serial_state.serial1FcmHandle, 0XFF );
status = adl_fcmUnsubscribe(serial_state.serial1FcmHandle);
if(status == OK)
{
serial_state.serial1FcmHandle = status;
applog("UART 1: adl_fcmUnsubscribed");
}
else
applog("UART 1: adl_fcmUnsubscribed failed. Error: %d", status);
serial_state.serial1FcmHandle = -1;
serial_state.serialState = SERIAL_CLOSED;
}
}
else
applog("UART: FCM Shutdown - unhandled scenario Handle: %d Status:%d", serial_state.serial1FcmHandle, serial_state.serialState);
comTimerStop();
}
//And then the handler does a little extra as well
bool serial1FcmCtrlHandler(adl_fcmEvent_e event)
{
s8 status = -1;
applog("SOCKET: serial1FcmCtrlHandler %d", event);
switch(event)
{
case ADL_FCM_EVENT_FLOW_OPENNED:
/* Switching V24 state from AT to Data. */
status = adl_fcmSwitchV24State(serial_state.serial1FcmHandle, ADL_FCM_V24_STATE_DATA);
if(status == OK)
{
serial_state.serial1FcmHandle = status;
applog("UART: Serial 1 FCM Opened -> Switching V24 state from AT to Data");
}
else
applog("UART: Serial 1 FCM Opened -> Switching V24 state from AT to Data FAILED. Error: %d", status);
break;
case ADL_FCM_EVENT_FLOW_CLOSED:
applog("UART: ADL_FCM_EVENT_FLOW_CLOSED.");
serial_state.serial1FcmHandle = -1;
serial_state.serialState = SERIAL_CLOSED;
break;
case ADL_FCM_EVENT_V24_DATA_MODE:
/* sending data to the external application via V24 serial link */
applog("UART: Flow in Data Mode");
serial_state.serialState = SERIAL_CONNECTED;
break;
case ADL_FCM_EVENT_V24_AT_MODE:
serial_state.serialState = SERIAL_DISCONNECTED;
applog("UART: ADL_FCM_EVENT_V24_AT_MODE");
adl_fcmReleaseCredits( serial_state.serial1FcmHandle, 0XFF );
status = adl_fcmUnsubscribe(serial_state.serial1FcmHandle);
if(status == OK)
{
serial_state.serial1FcmHandle = status;
applog("UART 1: adl_fcmUnsubscribed");
}
else
applog("UART 1: adl_fcmUnsubscribed failed. Error: %d", status);
//serial_state.serial1FcmHandle = -1;
break;
case ADL_FCM_EVENT_MEM_RELEASE:
applog("UART: ADL_FCM_EVENT_MEM_RELEASE");
break;
case ADL_FCM_EVENT_RESUME:
applog("UART: ADL_FCM_EVENT_RESUME");
break;
case ADL_FCM_EVENT_V24_AT_MODE_EXT:
applog("UART: ADL_FCM_EVENT_V24_AT_MODE_EXT");
break;
case ADL_FCM_EVENT_V24_AT_MODE_FROM_CALL:
applog("UART: ADL_FCM_EVENT_V24_AT_MODE_FROM_CALL");
break;
case ADL_FCM_EVENT_V24_DATA_MODE_EXT:
applog("UART: ADL_FCM_EVENT_V24_DATA_MODE_EXT");
break;
case ADL_FCM_EVENT_V24_DATA_MODE_FROM_CALL:
applog("UART: ADL_FCM_EVENT_V24_DATA_MODE_FROM_CALL");
break;
case ADL_FCM_EVENT_V24_TX_DATA_FLUSHED:
applog("UART: ADL_FCM_EVENT_V24_TX_DATA_FLUSHED");
break;
}
return TRUE;
}