📄 ext_svr.c
字号:
}
/*
* At this point we know that we have a packet: process it.
*/
PRINT_DEBUG_MSG_LVL3(debugActionStrings[(uint_T)pktHdr.type]);
PRINT_DEBUG_MSG_NL3;
switch(pktHdr.type) {
#ifdef TXactiveControl
/* host driven flow control: log data -- fw-07-07 */
case EXT_DATA_UPLD_NOACK_REQUEST:
PRINT_DEBUG_MSG_LVL2("Got EXT_DATA_UPLD_NOACK_REQUEST packet.\n");
// enable transmission (for one data telegram only)
TXactive = TRUE;
break;
#endif
/* host tries to break deadlock by sending an empty packet -- fw-07-07 */
case EXT_BREAK_DEADLOCK:
//PRINT_DEBUG_MSG_LVL1("Got EXT_BREAK_DEADLOCK packet.\n");
/* do nothing - the mere arrival of this packet should have broken the deadlock already... */
break;
case EXT_GET_TIME:
{
time_T t=rteiGetT(ei);
SWITCH_DYNAMIC_DBG_LVL(1);
//PRINT_DEBUG_MSG_LVL1("Got EXT_GET_TIME packet.\n");
error=SendPktToHost(EXT_GET_TIME_RESPONSE, sizeof(time_T), (char_T*)&t);
if(error!=EXT_NO_ERROR) {
abort_LED(80);
goto EXIT_POINT;
}
break;
}
case EXT_ARM_TRIGGER:
{
//PRINT_DEBUG_MSG_LVL1("targetAction = EXT_ARM_TRIGGER\n\r");
error=ProcessArmTriggerPkt((int_T)pktHdr.size, numSampTimes);
if(error!=EXT_NO_ERROR) {
abort_LED(81);
goto EXIT_POINT;
}
//PRINT_DEBUG_MSG_LVL1("startModel = ");
//PRINT_DEBUG_MSG_LVL1_UDec(startModel);
//PRINT_DEBUG_MSG_NL1;
#ifdef TXactiveControl
/* enable log data upload -- fw-07-07 */
TXactive = TRUE;
#endif
break;
}
case EXT_SELECT_SIGNALS:
{
//PRINT_DEBUG_MSG_LVL1("targetAction = EXT_SELECT_SIGNALS\n\r");
error=ProcessSelectSignalsPkt(ei, numSampTimes, (int_T)pktHdr.size);
if(error!=EXT_NO_ERROR) {
abort_LED(82);
goto EXIT_POINT;
}
break;
}
case EXT_SELECT_TRIGGER:
{
//PRINT_DEBUG_MSG_LVL1("targetAction = EXT_SELECT_TRIGGER\n\r");
error=ProcessSelectTriggerPkt(ei, (int_T)pktHdr.size);
if(error!=EXT_NO_ERROR) {
abort_LED(83);
goto EXIT_POINT;
}
break;
}
case EXT_CONNECT:
{
//PRINT_DEBUG_MSG_LVL1("targetAction = EXT_CONNECT\n\r");
error=ProcessConnectPkt(ei);
if(error!=EXT_NO_ERROR) {
abort_LED(84);
goto EXIT_POINT;
}
//PRINT_DEBUG_MSG_LVL1("startModel = ");
//PRINT_DEBUG_MSG_LVL1_UDec(startModel);
//PRINT_DEBUG_MSG_NL1;
break;
}
case EXT_SETPARAM:
{
//PRINT_DEBUG_MSG_LVL1("targetAction = EXT_SETPARAM\n\r");
error=ProcessSetParamPkt(ei, (int_T)pktHdr.size);
if(error!=EXT_NO_ERROR) {
abort_LED(85);
goto EXIT_POINT;
}
//PRINT_DEBUG_MSG_LVL1("end of targetAction = EXT_SETPARAM\n\r");
break;
}
case EXT_GETPARAMS:
{
//PRINT_DEBUG_MSG_LVL1("targetAction = EXT_GETPARAMS\n\r");
error=ProcessGetParamsPkt(ei);
if(error!=EXT_NO_ERROR) {
abort_LED(86);
goto EXIT_POINT;
}
break;
}
case EXT_DISCONNECT_REQUEST:
{
//PRINT_DEBUG_MSG_LVL1("targetAction = EXT_DISCONNECT_REQUEST\n\r");
/*
* Note that from the target's point of view this is
* more a "notify" than a "request". The host needs to
* have this acknowledged before it can begin closing
* the connection.
*/
error=SendPktToHost(EXT_DISCONNECT_REQUEST_RESPONSE, 0, NULL);
if(error!=EXT_NO_ERROR) {
abort_LED(87);
goto EXIT_POINT;
}
DisconnectFromHost(true, numSampTimes);
#ifdef LCDUSE4ERRORS
writeLine("-> not connected", 1);
#endif
//PRINT_DEBUG_MSG_LVL1("startModel = ");
//PRINT_DEBUG_MSG_LVL1_UDec(startModel);
//PRINT_DEBUG_MSG_NL1;
break;
}
case EXT_DISCONNECT_REQUEST_NO_FINAL_UPLOAD:
{
//PRINT_DEBUG_MSG_LVL1("targetAction = EXT_DISCONNECT_REQUEST_NO_FINAL_UPLOAD\n\r");
/*
* The target receives this packet when the host is
* immediately terminating the extmode communication due
* to some error. The target should not send back a
* response or a final upload of data because the host is
* expecting neither. Because the target successfully
* received this packet, we assume the extmode communication
* is working well enough to be shutdown gracefully.
*/
DisconnectFromHost(false, numSampTimes);
#ifdef LCDUSE4ERRORS
writeLine("-> not connected", 1);
#endif
////PRINT_DEBUG_MSG_LVL1("startModel = ");
////PRINT_DEBUG_MSG_LVL1_UDec(startModel);
////PRINT_DEBUG_MSG_NL1;
break;
}
case EXT_MODEL_START:
////PRINT_DEBUG_MSG_LVL1("targetAction = EXT_MODEL_START\n\r");
#ifdef VXWORKS
{
extern SEM_ID startStopSem;
semGive(startStopSem);
}
#endif
startModel=TRUE;
error=SendPktToHost(EXT_MODEL_START_RESPONSE, 0, NULL);
if(error!=EXT_NO_ERROR) {
abort_LED(88);
goto EXIT_POINT;
}
////PRINT_DEBUG_MSG_LVL1("startModel = ");
////PRINT_DEBUG_MSG_LVL1_UDec(startModel);
//PRINT_DEBUG_MSG_NL1;
break;
case EXT_MODEL_STOP:
////PRINT_DEBUG_MSG_LVL1("targetAction = EXT_MODEL_STOP\n\r");
*stopReq=TRUE;
////PRINT_DEBUG_MSG_LVL1("startModel = ");
////PRINT_DEBUG_MSG_LVL1_UDec(startModel);
//PRINT_DEBUG_MSG_NL1;
break;
case EXT_MODEL_PAUSE:
////PRINT_DEBUG_MSG_LVL1("targetAction = EXT_MODEL_PAUSE\n\r");
modelStatus=TARGET_STATUS_PAUSED;
startModel=FALSE;
error=SendPktToHost(EXT_MODEL_PAUSE_RESPONSE, 0, NULL);
if(error!=EXT_NO_ERROR) {
abort_LED(89);
goto EXIT_POINT;
}
////PRINT_DEBUG_MSG_LVL1("modelStatus = ");
//PRINT_DEBUG_MSG_LVL1_Raw(debugStatusStrings[modelStatus]);
//PRINT_DEBUG_MSG_LVL1_Raw(", startModel = ");
//PRINT_DEBUG_MSG_LVL1_UDec(startModel);
//PRINT_DEBUG_MSG_NL1;
break;
case EXT_MODEL_STEP:
//PRINT_DEBUG_MSG_LVL1("targetAction = EXT_MODEL_STEP\n\r");
if((modelStatus==TARGET_STATUS_PAUSED)&&!startModel) {
startModel=TRUE;
}
error=SendPktToHost(EXT_MODEL_STEP_RESPONSE, 0, NULL);
if(error!=EXT_NO_ERROR) {
abort_LED(90);
goto EXIT_POINT;
}
//PRINT_DEBUG_MSG_LVL1("modelStatus = ");
//PRINT_DEBUG_MSG_LVL1_Raw(debugStatusStrings[modelStatus]);
//PRINT_DEBUG_MSG_LVL1_Raw(", startModel = ");
//PRINT_DEBUG_MSG_LVL1_UDec(startModel);
//PRINT_DEBUG_MSG_NL1;
break;
case EXT_MODEL_CONTINUE:
//PRINT_DEBUG_MSG_LVL1("targetAction = EXT_MODEL_CONTINUE\n\r");
if(modelStatus==TARGET_STATUS_PAUSED) {
modelStatus=TARGET_STATUS_RUNNING;
startModel=FALSE;
}
error=SendPktToHost(EXT_MODEL_CONTINUE_RESPONSE, 0, NULL);
if(error!=EXT_NO_ERROR) {
abort_LED(91);
goto EXIT_POINT;
}
//PRINT_DEBUG_MSG_LVL1("modelStatus = ");
//PRINT_DEBUG_MSG_LVL1_Raw(debugStatusStrings[modelStatus]);
//PRINT_DEBUG_MSG_LVL1_Raw(", startModel = ");
//PRINT_DEBUG_MSG_LVL1_UDec(startModel);
//PRINT_DEBUG_MSG_NL1;
break;
case EXT_CANCEL_LOGGING:
{
//PRINT_DEBUG_MSG_LVL1("targetAction = EXT_CANCEL_LOGGING\n\r");
error=ProcessCancelLoggingPkt((int_T)pktHdr.size);
if(error!=EXT_NO_ERROR) {
abort_LED(92);
goto EXIT_POINT;
}
//PRINT_DEBUG_MSG_LVL1("startModel = ");
//PRINT_DEBUG_MSG_LVL1_UDec(startModel);
//PRINT_DEBUG_MSG_NL1;
#ifdef TXactiveControl
/* enable log data upload -- fw-07-07 */
TXactive = TRUE;
#endif
break;
}
default:
abort_LED(93);
//fprintf(stderr,"received invalid packet.\n");
break;
} /* end switch */
EXIT_POINT:
if(error!=EXT_NO_ERROR) {
/* currently never reached... -- fw-07-07 */
abort_LED(94); // just in case... (debug test)
if(disconnectOnError) {
//fprintf(stderr,
// "Error occured in rt_PktServerWork.\n"
// "Disconnecting from host!\n");
/* An error in this function which causes disconnectOnError to be
* set to true is caused by a physical failure in the external mode
* connection. We assume this failure caused the host to disconnect.
* The target must be disconnected and returned to a state
* where it is running and can be re-connected to by the host.
*/
ForceDisconnectFromHost(numSampTimes);
} /* disconnectOnError*/
} /* error */
PRINT_DEBUG_MSG_LVL3("OUT, error status: ");
PRINT_DEBUG_MSG_LVL3_UDec(error);
PRINT_DEBUG_MSG_NL3;
} /* end rt_PktServerWork */
/* Function: ExtModeShutdown ==================================================
* Abstract:
* Called when target program terminates to enable cleanup of external
* mode for a given upInfo.
*/
PRIVATE void ExtModeShutdown(int32_T upInfoIdx, int_T numSampTimes) {
// local function name... debugging only
#if DEBUG_MSG_LVL > 0
const char *funct_name="ExtModeShutdown";
#endif
/*
* Make sure buffers are flushed so that the final points get to
* host (this is important for the case of the target reaching tfinal
* while data uploading is in progress).
*/
UploadPrepareForFinalFlush(upInfoIdx);
#ifdef TXactiveControl
/* enable log data upload -- fw-07-07 */
TXactive = TRUE;
#endif
UploadServerWork(upInfoIdx, numSampTimes);
UploadLogInfoTerm(upInfoIdx, numSampTimes);
if(pktBuf!=NULL) {
//PRINT_DEBUG_MSG_LVL1("Freeing memory of packet reception buffer\n\r");
free(pktBuf);
pktBuf=NULL;
/* enable soft-reset of the micro (re-init ALL static vars to their reset values... fw-07-07 */
pktBufSize=0;
}
} /* end ExtModeShutdown */
/* Function: rt_ExtModeShutdown ================================================
* Abstract:
* Called when target program terminates to enable cleanup of external
* mode.
*/
PUBLIC boolean_T rt_ExtModeShutdown(int_T numSampTimes) {
int i;
boolean_T error=EXT_NO_ERROR;
// local function name... debugging only
#if DEBUG_MSG_LVL > 0
const char *funct_name="rt_ExtModeShutdown";
#endif
for(i=0; i<NUM_UPINFOS; i++) {
ExtModeShutdown(i, numSampTimes);
}
if(connected) {
error=SendPktToHost(EXT_MODEL_SHUTDOWN, 0, NULL);
if(error!=EXT_NO_ERROR) {
abort_LED(95);
//fprintf(stderr,
// "\nError sending EXT_MODEL_SHUTDOWN packet to host.\n");
}
connected=FALSE;
commInitialized=FALSE;
modelStatus=TARGET_STATUS_WAITING_TO_START;
#ifdef LCDUSE4ERRORS
writeLine("-> not connected", 1);
#endif
//PRINT_DEBUG_MSG_LVL1("connected = FALSE\n\r");
//PRINT_DEBUG_MSG_LVL1("commInitialized = FALSE\n\r");
//PRINT_DEBUG_MSG_LVL1("modelStatus = TARGET_STATUS_WAITING_TO_START\n\r");
}
ExtShutDown(extUD);
ExtUserDataDestroy(extUD);
rtExtModeTestingRemoveBatMarker();
return(error);
} /* end rt_ExtModeShutdown */
/* Function: rt_UploadCheckTrigger =============================================
* Abstract:
* Wrapper function that calls UploadCheckTrigger once for each upInfo
*/
PUBLIC void rt_UploadCheckTrigger(int_T numSampTimes) {
int i;
for(i=0; i<NUM_UPINFOS; i++) {
UploadCheckTrigger(i, numSampTimes);
}
} /* end rt_UploadCheckTrigger */
/* Function: rt_UploadCheckEndTrigger ==========================================
* Abstract:
* Wrapper function that calls UploadCheckTrigger once for each upInfo
*/
PUBLIC void rt_UploadCheckEndTrigger(void) {
int i;
for(i=0; i<NUM_UPINFOS; i++) {
UploadCheckEndTrigger(i);
}
} /* end rt_UploadCheckEndTrigger */
/* Function: rt_UploadBufAddTimePoint ==========================================
* Abstract:
* Wrappter functio that calls UploadBufAddTimePoint once for each upInfo
*/
PUBLIC void rt_UploadBufAddTimePoint(int_T tid, real_T taskTime) {
int i;
#ifdef TXactiveControl
/* only buffer data if the host is ready to receive data... -- fw-07-07 */
if(TXactive) {
#endif
for(i=0; i<NUM_UPINFOS; i++) {
UploadBufAddTimePoint(tid, taskTime, i);
}
#ifdef TXactiveControl
}
#endif
} /* end rt_UploadBufAddTimePoint */
/* [EOF] ext_svr.c */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -