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

📄 smt.c

📁 GM5621原代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	{
		msgs("ERROR: Transaction was not opened due to Port 0x%X is invalid",W_Port);
		SMT_SendFailed(comm_use, EvOdd, GENERIC_ER);
		return;	
	}

	//define transaction ID
	for(W_Index =0; W_Index <=255; W_Index++)
	{
		B_LastId++ ;
		// check if transaction with this ID is not opened yet
		for( B_Count =0; B_Count <MAX_TRANSACTION_NUMBER; B_Count++ )
		{
			if((SMT_TransArray[B_Count].B_Status == TRANSACTION_OPENED) &&
			   (SMT_TransArray[B_Count].ID == B_LastId)) 
			 break;
		}
		// continue if ID used
		if(B_Count == MAX_TRANSACTION_NUMBER) 
			break;
	}

	if(W_Index > 255)
	{
		msgs("ERROR: Can not find ID for this transaction ",0);
		SMT_SendFailed(comm_use, EvOdd, GENERIC_ER);
		return; 
	}
	
   msgs("Open Transaction: Port = 0x%d ",W_Port);

   SMT_TransArray[CurrentTransNumber].ID       = B_LastId;
   SMT_TransArray[CurrentTransNumber].Port     = W_Port;
   SMT_TransArray[CurrentTransNumber].Bp_Buff  = NULL_PTR;
   SMT_TransArray[CurrentTransNumber].BuffSize = 0;
   SMT_TransArray[CurrentTransNumber].B_Status = TRANSACTION_OPENED;
   SMT_TransArray[CurrentTransNumber].W_Count  = 0;
   SMT_TransArray[CurrentTransNumber].B_CurCmd = IDLE_CMD;

   // Sending response:

   OutMsg.len    = 6;
   OutMsg.cmd    = CMD_SMTProtocol;
   OutMsg.BUF[0] = CM_TM_BIT | EvOdd;
   OutMsg.BUF[1] = TRANSACTION_OPENED;
   OutMsg.BUF[2] = SMT_TransArray[CurrentTransNumber].ID;

   gm_TimerStart(SMT_TransArray[CurrentTransNumber].B_TmrNum, SMT_TRANSACTION_TIMEOUT );
   msgs("Transaction OPENED, ID = 0x%x ",SMT_TransArray[CurrentTransNumber].ID);
   msgs("Transaction OPENED, NUM = 0x%x ",CurrentTransNumber);

   gm_CommsSendReply((gmt_MsgStruct far*)&OutMsg, comm_use);
}

//******************************************************************************
//
// FUNCTION     :   void SMT_CloseTransaction(BYTE msgpkt[], BYTE comm_use, BYTE EvOdd)
// USAGE        :   This function close transaction and send response to PC
//
// INPUT        :   BYTE msgpkt[] = msgpkt array from SMT message
//                  BYTE comm_use  = SERIAL_USE or DDC2BI_USE
//                  BYTE EvOdd = Even/Odd message count
// OUTPUT       :   None
//
//******************************************************************************
void SMT_CloseTransaction(BYTE msgpkt[], BYTE comm_use, BYTE EvOdd)
{
   BYTE TransID;
   BYTE CurrentTransNumber = 0xFF;
   BYTE B_Count;

   TransID = msgpkt[0];

   for(B_Count =0; B_Count <MAX_TRANSACTION_NUMBER; B_Count++)
   {
      if(SMT_TransArray[B_Count].ID == TransID)
      {
	  	   if(SMT_TransArray[B_Count].B_Status != TRANSACTION_CLOSED)
            CurrentTransNumber = B_Count;
         break;
      }
   }
   msgs("CloseTransaction(). Transaction table index = %d ",CurrentTransNumber);
   if(CurrentTransNumber == 0xFF)
   {
	   msgs("ERROR: Invalid Transaction ID - NOT FOUND TRANSACTION WITH THIS ID  = %x ",TransID);
      SMT_SendFailed(comm_use, EvOdd, TRANS_ID_ER);
      return;
   }

   if(SMT_TransArray[CurrentTransNumber].B_Status == TRANSACTION_CLOSED)// what if trasaction is in a BUSY state?
   {																	//WHY? may be just close trasaction without checking status?
      // Send Failed
      msgs("ERROR: Invalid Transaction ID ",0);
      SMT_SendFailed(comm_use, EvOdd, TRANS_ID_ER);
      return;
   }
   SMT_TransArray[CurrentTransNumber].Port     = 0;
   SMT_TransArray[CurrentTransNumber].Bp_Buff  = NULL_PTR;
   SMT_TransArray[CurrentTransNumber].BuffSize = 0;
   SMT_TransArray[CurrentTransNumber].B_Status = TRANSACTION_CLOSED;
   SMT_TransArray[CurrentTransNumber].W_Count  = 0;


   OutMsg.len     = 6;
   OutMsg.cmd     = CMD_SMTProtocol;
   OutMsg.BUF[0]  = CM_TM_BIT | EvOdd;
   OutMsg.BUF[1]  = TRANSACTION_CLOSED;
   OutMsg.BUF[2]  = SMT_TransArray[CurrentTransNumber].ID;

   msgs("Transaction 0x%x was closed.",OutMsg.BUF[2]);
   SMT_TransArray[CurrentTransNumber].ID = 0;

   gm_TimerStop(SMT_TransArray[CurrentTransNumber].B_TmrNum);

   gm_CommsSendReply((gmt_MsgStruct far*)&OutMsg, comm_use);
}

//******************************************************************************
//
// FUNCTION     :   void SMT_SendStatusSMT(BYTE msgpkt[], BYTE comm_use, BYTE EvOdd)
// USAGE        :   This function send status of transaction to PC
//
// INPUT        :   BYTE msgpkt[] = msgpkt array from SMT message
//                  BYTE comm_use  = SERIAL_USE or DDC2BI_USE
//                  BYTE EvOdd = Even/Odd message count
// OUTPUT       :   None
//
//******************************************************************************
void SMT_SendStatusSMT(BYTE msgpkt[], BYTE comm_use, BYTE EvOdd)
{
   BYTE TransID;
   BYTE CurrentTransNumber = 0xFF;
   BYTE B_Count;

   TransID = msgpkt[0];

   for(B_Count =0; B_Count <MAX_TRANSACTION_NUMBER; B_Count++)
   {
      if(SMT_TransArray[B_Count].ID == TransID)
      {
         CurrentTransNumber = B_Count;
         break;
      }
   }
   msgs("Transaction table index = = %d ",CurrentTransNumber);
   if(CurrentTransNumber == 0xFF)
   {
      msgs("ERROR: Invalid Transaction ID - NOT FOUND TRANSACTION WITH THIS ID  = %x ",TransID);
      SMT_SendFailed(comm_use, EvOdd, TRANS_ID_ER);
      return;
   }

   OutMsg.len    = 7;
   OutMsg.cmd    = CMD_SMTProtocol;
   OutMsg.BUF[0] = CM_TM_BIT | EvOdd;
   OutMsg.BUF[1] = GET_STATUS_CMD;
   OutMsg.BUF[2] = TransID;
   OutMsg.BUF[3] = SMT_TransArray[CurrentTransNumber].B_Status;

   gm_TimerStart(SMT_TransArray[CurrentTransNumber].B_TmrNum, SMT_TRANSACTION_TIMEOUT );

   gm_CommsSendReply((gmt_MsgStruct far*)&OutMsg, comm_use);
}

//******************************************************************************
//
// FUNCTION     :   void SMT_SendFailed(BYTE comm_use, BYTE EvOdd, BYTE B_Reason)
// USAGE        :   This function send response "Failed" to PC
//
// INPUT        :   BYTE comm_use  = SERIAL_USE or DDC2BI_USE
//                  BYTE EvOdd = Even/Odd message count
//                  BYTE B_Reason = The reason of fail
// OUTPUT       :   None
//
//******************************************************************************
void SMT_SendFailed(BYTE comm_use, BYTE EvOdd, BYTE B_Reason)
{

   OutMsg.len    = 6;
   OutMsg.cmd    = CMD_SMTProtocol;
   OutMsg.BUF[0] = CM_TM_BIT | EvOdd;
   OutMsg.BUF[1] = FAILED;
   OutMsg.BUF[2] = B_Reason;

   OldEvOdd = 0xFF;
   gm_CommsSendReply((gmt_MsgStruct far*)&OutMsg, comm_use);
}

//******************************************************************************
//
// FUNCTION     :   void SMT_SendReTransmit(BYTE TransID, BYTE comm_use, BYTE EvOdd, WORD W_Delay_ms)
// USAGE        :   This function send Re-Transmit command to PC
//
// INPUT        :   BYTE TransID = Transition ID
//                  BYTE comm_use  = SERIAL_USE or DDC2BI_USE
//                  BYTE EvOdd = Even/Odd message count
//                  WORD W_Delay_ms = Delay in ms 
// OUTPUT       :   None
//
//******************************************************************************
void SMT_SendReTransmit(BYTE TransID, BYTE comm_use, BYTE EvOdd, WORD W_Delay_ms)
{
	BYTE B_Count;
   comm_use = comm_use;
	
	for(B_Count =0; B_Count <MAX_TRANSACTION_NUMBER; B_Count++)
	{
	   if(SMT_TransArray[B_Count].ID == TransID)
	   {
		  break;
	   }
	}
   OutMsg.len    = 8;
   OutMsg.cmd    = CMD_SMTProtocol;
   OutMsg.BUF[0] = CM_TM_BIT | EvOdd;
   OutMsg.BUF[1] = RE_TRANSMIT_CMD;
   OutMsg.BUF[2] = TransID;
   OutMsg.BUF[3] = W_Delay_ms & 0xFF;
   OutMsg.BUF[4] = (W_Delay_ms >> 8) & 0xFF;
   gm_TimerStart(SMT_TransArray[B_Count].B_TmrNum, SMT_TRANSACTION_TIMEOUT );

   gm_CommsSendReply((gmt_MsgStruct far*)&OutMsg, comm_use);
}



//******************************************************************************
//
// FUNCTION     :   BYTE SMT_MessageHandler(MsgPacket_t *message, BYTE comm_use)
// USAGE        :   This function parse the SMT messages
//
// INPUT        :   MsgPacket_t *message = SMT message
//                  BYTE comm_use  = SERIAL_USE or DDC2BI_USE
// OUTPUT       :   0 = if no error, 1 = if error is found
//
//******************************************************************************

BYTE SMT_MessageHandler(MsgPacket_t * message, BYTE comm_use)
{
   BYTE EvOdd;
   BYTE B_Count;
   WORD W_PortID;
   WORD W_TblIndex;

	// delay for overwork VB script problem
//	gm_Delay10ms(10);
	//Initiate transaction context table SMT_TransArray if it is first transaction.
    //TODO: Initiator must be modified if more possible transaction statuses are added
	if((SMT_TransArray[0].B_Status!=TRANSACTION_CLOSED) && 
	   (SMT_TransArray[0].B_Status!=TRANSACTION_OPENED))
	{
		for(B_Count =0; B_Count <MAX_TRANSACTION_NUMBER; B_Count++)
		{
			SMT_TransArray[B_Count].ID = 0xFF;
			SMT_TransArray[B_Count].B_Status = TRANSACTION_CLOSED;
			SMT_TransArray[B_Count].B_TmrNum = SMT_TIMEOUT_0_TMR + B_Count;
		}
	}		

   if ((message->msgType & CM_TM_BIT))
   	if (message->control == OPEN_TRANSACTION_CMD)
      {
   		OldEvOdd = 0xFF;
      }

   EvOdd = message->msgType & EVEN_ODD_BIT;

   if((OldEvOdd == 0xFF) || (OldEvOdd != EvOdd))
   {
      OldEvOdd = EvOdd;
   }
   else
   {
      if(OldEvOdd == EvOdd)
      {
         SMT_SendFailed(comm_use, EvOdd, CORRUPT_MSG_ER);
         msgs("ERROR OF SMT: Even/Odd message count is wrong.",0);
         return 1;
      }
   }
// close expired transactions
	for(B_Count =0; B_Count <MAX_TRANSACTION_NUMBER; B_Count++)
	{
		if((SMT_TransArray[B_Count].B_Status != TRANSACTION_CLOSED) &&
		   (gm_TimerCheck(SMT_TransArray[B_Count].B_TmrNum) == gmd_TMR_TIMED_OUT))
		{
			SMT_TransArray[B_Count].B_Status = TRANSACTION_CLOSED;
			msgs("Transaction 0x%X is closed because of timeout ",SMT_TransArray[B_Count].ID);
		}
	}
//parse message
   if(message->msgType & CM_TM_BIT)      // Is it a Control Message ?
   {
      msgs("Message Control = %d ",message->control);
      switch(message->control)      // Yes
      {
         case OPEN_TRANSACTION_CMD:  // Open Transaction
            SMT_OpenTransaction(message->msgpkt, comm_use, EvOdd);
            break;
         case CLOSE_TRANSACTION_CMD: // Close Transaction
            SMT_CloseTransaction(message->msgpkt, comm_use, EvOdd);
			//sweng0328: Fix Media Processor bug
			gm_WriteRegByte(ACC_SNAP_SLOPE, 0x88);
			gm_WriteRegByte(ACC_TOTAL_PIXEL, 0x0D);
			
            break;
         case GET_STATUS_CMD:       // Get Status
            SMT_SendStatusSMT(message->msgpkt, comm_use, EvOdd);
            break;
         default:
		 	msgs("ERROR: Unknown Message Control Code = %d ",message->control);
            SMT_SendFailed(comm_use, EvOdd, CORRUPT_MSG_ER);
            return 1;
      };
   }
   else		// This is a Transport Message
   {
      //WORD W_CMD;
      BYTE B_Count;
      BYTE CurrentTransNumber = 0xFF;

      for(B_Count =0; B_Count <MAX_TRANSACTION_NUMBER; B_Count++)
      {
         if(SMT_TransArray[B_Count].ID == message->control)
         {
            CurrentTransNumber = B_Count;
            break;
         }
      }

      if(CurrentTransNumber == 0xFF)
      {
		   msgs("ERROR: Invalid Transaction ID - NOT FOUND TRANSACTION WITH THIS ID	= %x ",message->control);
         SMT_SendFailed(comm_use, EvOdd, TRANS_ID_ER);
         return 1;
      }
	  
      if(SMT_TransArray[CurrentTransNumber].B_Status != TRANSACTION_OPENED)
      {
         msgs("ERROR: Invalid Transaction ID. THIS TRANSACTION IS NOT OPENED. = %x ",message->control);
         SMT_SendFailed(comm_use, EvOdd, TRANS_ID_ER);
         return 1;
      }

      // Get port ID numnber
      W_PortID = SMT_TransArray[CurrentTransNumber].Port;

      // Call an apprpriate Port Handler depending on Port ID 
      for(W_TblIndex =0;;W_TblIndex++)
      {
         //look for port ID in the handlers LUT
         WORD W_TblPort = SMT_Port2HandlerTable[W_TblIndex].PortID;

         //End of LUT is reached?
         if(W_TblPort < MAX_SMTPORT)
         {
            // Is it desirted port?
            if(W_PortID == W_TblPort)
            {
               // Is the pointer to handler valid?
               if(SMT_Port2HandlerTable[W_TblIndex].Fp_SMT_MsgHandler != NULL_PTR)
               {
                  // execute the handler
                  msgs("Transport message to port 0x%X",W_PortID);
                  gm_TimerStart(SMT_TransArray[CurrentTransNumber].B_TmrNum, SMT_TRANSACTION_TIMEOUT);
                  SMT_Port2HandlerTable[W_TblIndex].Fp_SMT_MsgHandler(message, comm_use);
                  return 0;
               }
               else
                  break; // port is not supported
            }
            // continue
         }
         else 
            break; // end of table is reached
      }

      //treat situation when no port id is found in the hadlers LUT
      msgs("ERROR: Port 0x%X is not supported.",W_PortID);
      SMT_SendFailed(comm_use, EvOdd, GENERIC_ER);
      return 1;
   }

   return 0;
}

//******************************************************************************
//
// FUNCTION     :   BYTE SMT_GetBuffer(BYTE  B_TransactionID, BYTE far * Bp_Buff, WORD W_Size)
// USAGE        :   This function allocates memory for parsers
//
// INPUT        :   MsgPacket_t *message = SMT message
//                  BYTE comm_use = SERIAL_USE or DDC2BI_USE
//
// OUTPUT       :   0 = if no error and buffer is free, 1 = if no error and buffer has data from previous messages
//					0xFF if error;
//
//******************************************************************************
BYTE SMT_GetBuffer(BYTE  B_TransactionID,  BYTE far * far * Bp_Buff, WORD W_Size)
{
	BYTE B_Index;
	BYTE B_RetCode = NEXT_REQUEST;

	//check requested memory size
	if(W_Size <= SMT_MAX_BUF_SIZE)
	{
	//look for transaction ID
 		for(B_Index =0; B_Index <MAX_TRANSACTION_NUMBER; B_Index++)
		{
			if(SMT_TransArray[B_Index].ID == B_TransactionID)
			{
				if(SMT_TransArray[B_Index].Bp_Buff == NULL_PTR)
				{
					//pointer is null when it is a first transport message
					//write buffer pointer to transaction structure and return 0
					SMT_TransArray[B_Index].Bp_Buff = (BYTE far *)&SMT_TransArray[B_Index].Ba_Buff[0];
					SMT_TransArray[B_Index].BuffSize = W_Size;
					B_RetCode = FIRST_REQUEST;
				}
				*Bp_Buff = (BYTE far *)SMT_TransArray[B_Index].Bp_Buff;
				return B_RetCode;
 			}
		}
	}
	return NO_MEMORY;// memory allocating error
}

#endif //Debug
#endif //USE_SMT

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -