⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ext_svr.c

📁 RT9S12 target document
💻 C
📖 第 1 页 / 共 4 页
字号:
   }

   /* 
    * 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 + -