Ver Fonte

[Improve][Modularization][Module_OcppBackend]

2021.10.21 / Folus Wen

Actions:
1. Remove transaction id in queue when receive StopTransaction.

Files:
1. As follow commit history

Image version: D0.00.XX.XXXX.XX
Image checksum: XXXXXXXX

Hardware PWB P/N : XXXXXXX
Hardware Version : XXXXXXX
FolusWen há 3 anos atrás
pai
commit
629fcf5c70

+ 3 - 2
EVSE/Modularization/ocppfiles/MessageHandler.c

@@ -6529,7 +6529,7 @@ int sendMeterValuesRequest(int gun_index, ReadingContext dataType)
 	memset(&ShmOCPP16Data->MeterValues[gun_index], 0, sizeof(struct StructMeterValues));
 	//set value
 	ShmOCPP16Data->MeterValues[gun_index].ConnectorId = gun_index + 1; // gun start from 1~
-	ShmOCPP16Data->MeterValues[gun_index].TransactionId = (((strstr((char*)ShmOCPP16Data->StatusNotification[gun_index].Status, "Charging") != NULL) || (strstr((char*)ShmOCPP16Data->StatusNotification[gun_index].Status, "SuspendedEV") != NULL) || (strstr((char*)ShmOCPP16Data->StatusNotification[gun_index].Status, "SuspendedEVSE") != NULL) )?
+	ShmOCPP16Data->MeterValues[gun_index].TransactionId = (cpinitateMsg.bits[gun_index].isOnCharging?
 															ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId :
 															-1);
 
@@ -13946,13 +13946,14 @@ void handleStopTransactionnResponse(char *payload, int gun_index)
 	}
 	json_object_put(StopTransaction);
 
-
 	ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionConf = 1;
 	ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq = 0;
 
 	DEBUG_INFO("idTagInfo-expiryDate: %s\n", ShmOCPP16Data->StopTransaction[gun_index].ResponseIdTagInfo.ExpiryDate);
 	DEBUG_INFO("idTagInfo-parentIdTag: %s\n", ShmOCPP16Data->StopTransaction[gun_index].ResponseIdTagInfo.ParentIdTag);
 	DEBUG_INFO("idTagInfo-status: %s\n", ShmOCPP16Data->StopTransaction[gun_index].ResponseIdTagInfo.Status);
+
+	SetTransactionIdZero(queueOpInfo.stopTransactionId);
 }
 
 void handleLogStatusNotificationResponse(char *payload, int gun_index)

+ 31 - 32
EVSE/Modularization/ocppfiles/Module_OcppBackend.c

@@ -16,6 +16,8 @@ struct StartTime
 	unsigned int reConnect;
 }startTime;
 
+struct QueueOpInfo queueOpInfo;
+
 //==========================================
 // Function prototype
 //==========================================
@@ -23,11 +25,6 @@ void ReceivedMessage(void *in, size_t len);
 int SendBufLen=0;//(1024*4);//(1024*3);
 unsigned char SendBuffer[WEBSOCKET_BUFFER_SIZE]={0};
 static int ConnectionEstablished=0;
-static int TransactionMessageResend = 1;  // the number of retry to submit a transaction-related message when the Central System fails to process it.
-static int TransactionQueueNum = 0;
-static int OfflineTransactionQueueNum = 0;  // Number of offline transactions
-static int OfflineTransaction = 0;
-static int IsUsing = FALSE;
 int defaultWaitingTime = 10; //10 second
 
 char OcppPath[384]={0};
@@ -99,7 +96,7 @@ static char *sqlTransaction = "create table if not exists ocpp_transaction_recor
 //=================================
 int GetTransactionQueueNum(void)
 {
-	return TransactionQueueNum;
+	return queueOpInfo.TransactionQueueNum;
 }
 
 //==========================================
@@ -253,14 +250,14 @@ static int OCPP16Callback(struct lws *wsi, enum lws_callback_reasons reason, voi
 
 			if(queueNotEmpty == TRUE)
 			{
-				OfflineTransaction = 1; // 0: no packets in queue.     1: There are packets in queue.
+				queueOpInfo.OfflineTransaction = 1; // 0: no packets in queue.     1: There are packets in queue.
 			}
 
-			TransactionMessageResend = 1;
+			queueOpInfo.TransactionMessageResend = 1;
 
 			//get offline number
 			queue_operation(QUEUE_OPERATION_SHOWQUEUE,"","");
-			OfflineTransactionQueueNum =TransactionQueueNum ;
+			queueOpInfo.OfflineTransactionQueueNum = queueOpInfo.TransactionQueueNum ;
 			break;
 		case LWS_CALLBACK_CLIENT_CONNECTION_ERROR://1
 			DEBUG_ERROR("LWS_CALLBACK_CLIENT_CONNECTION_ERROR %s\n", (char *)in );
@@ -380,7 +377,6 @@ static int OCPP16Callback(struct lws *wsi, enum lws_callback_reasons reason, voi
 				DEBUG_INFO("Download new CA certification.\n", system("wget --no-check-certificate -O /root/cacert.pem http://curl.haxx.se/ca/cacert.pem &"));
 			}
 			break;
-			break;
 		default:
 			DEBUG_INFO("Reason = %d\n", reason);
 			break;
@@ -708,10 +704,10 @@ int addq(char *uuid, char *data)
 	fputs(data, outfile);
 	fputs("\n", outfile);
 	fclose (outfile);
-	TransactionQueueNum = TransactionQueueNum + 1;
-	if(OfflineTransaction == 1)  // 0: no offline Transaction      1: offline Transaction
+	queueOpInfo.TransactionQueueNum +=  1;
+	if(queueOpInfo.OfflineTransaction == 1)  // 0: no offline Transaction      1: offline Transaction
 	{
-		OfflineTransactionQueueNum = OfflineTransactionQueueNum + 1;
+		queueOpInfo.OfflineTransactionQueueNum += 1;
 	}
 	DEBUG_INFO("add queue end\n");
 	system("/bin/fsync -d /dev/mtdblock13;/bin/sync &");
@@ -802,8 +798,8 @@ int delq()
 
 			if(i==0)
 			{
-				TransactionQueueNum = TransactionQueueNum - 1;
-				TransactionMessageResend = 1;
+				queueOpInfo.TransactionQueueNum -= 1;
+				queueOpInfo.TransactionMessageResend = 1;
 				DEBUG_INFO("delete the item\n");
 			}
 
@@ -888,11 +884,11 @@ int showqueue()
 	  return FALSE;
 	}
 
-	TransactionQueueNum = 0;  // the number of packets in queue
+	queueOpInfo.TransactionQueueNum = 0;  // the number of packets in queue
 
 	while(fgets(line, sizeof line, fp) != NULL) {
 		//DEBUG_INFO("%s\n", line);
-		TransactionQueueNum = TransactionQueueNum + 1; //the number of packets in queue
+		queueOpInfo.TransactionQueueNum += 1; //the number of packets in queue
 	}
 
 	fclose(fp);
@@ -1148,7 +1144,8 @@ int sentqueue(){
 			DEBUG_INFO("Final transactionId       = %d\n", gettransactionId);
 			if(IsStopTransaction == TRUE)//if((IsStopTransaction == TRUE)&&(gettransactionId != 0))
 			{
-				SetTransactionIdZero(gettransactionId);
+				queueOpInfo.stopTransactionId = gettransactionId;
+				//SetTransactionIdZero(gettransactionId);
 			}
 		 }
 		 else
@@ -1193,35 +1190,35 @@ void* processTransactionQueue(void* data)
 					if((((time((time_t*)NULL) - startTimeQueue) > (TransactionMessageRetryIntervalGet()>10?TransactionMessageRetryIntervalGet():10))))
 						DEBUG_INFO("Queue timer(%d) over spec(%d).\n", (time((time_t*)NULL) - startTimeQueue), TransactionMessageRetryIntervalGet());
 
-					if((OfflineTransaction == 1) && (OfflineTransactionQueueNum != 0))  //OfflineTransaction   0: no offline Transaction     1: offline Transaction
+					if((queueOpInfo.OfflineTransaction == 1) && (queueOpInfo.OfflineTransactionQueueNum != 0))  //OfflineTransaction   0: no offline Transaction     1: offline Transaction
 					{
 						DEBUG_INFO("Sent message from queue request off-line first.\n");
 						req_SendQueue 	= 1; // 0: no packets to send    1: send the top packet in queue
 
-						OfflineTransactionQueueNum = OfflineTransactionQueueNum - 1;
+						queueOpInfo.OfflineTransactionQueueNum -= 1;
 
-						if(OfflineTransactionQueueNum == 0)
+						if(queueOpInfo.OfflineTransactionQueueNum == 0)
 						{
-							OfflineTransaction = 0;
+							queueOpInfo.OfflineTransaction = 0;
 						}
 					}
 					else
 					{
-						if(TransactionMessageResend <= TransactionMessageAttemptsGet()) //
+						if(queueOpInfo.TransactionMessageResend <= TransactionMessageAttemptsGet()) //
 						{
 							DEBUG_INFO("Sent message from queue request.\n");
-							DEBUG_INFO("TransactionMessageResend = %d\n",TransactionMessageResend);
+							DEBUG_INFO("TransactionMessageResend = %d\n", queueOpInfo.TransactionMessageResend);
 
 							req_SendQueue = 1;
 
-							TransactionMessageResend += 1;
+							queueOpInfo.TransactionMessageResend += 1;
 						}
 						else
 						{
-							DEBUG_INFO("Transaction message resend(%d) over spec(%d) message abandon.\n", TransactionMessageResend, TransactionMessageAttemptsGet());
+							DEBUG_INFO("Transaction message resend(%d) over spec(%d) message abandon.\n", queueOpInfo.TransactionMessageResend, TransactionMessageAttemptsGet());
 
 							queue_operation(QUEUE_OPERATION_DEL,"","");   //// delete item
-							TransactionMessageResend = 1;
+							queueOpInfo.TransactionMessageResend = 1;
 						}
 					}
 				}
@@ -1231,7 +1228,7 @@ void* processTransactionQueue(void* data)
 			{
 				if(queueNotEmpty == TRUE)
 				{
-					OfflineTransaction = 1;  // 0: no offline Transaction      1: offline Transaction
+					queueOpInfo.OfflineTransaction = 1;  // 0: no offline Transaction      1: offline Transaction
 				}
 			}
 
@@ -1309,7 +1306,7 @@ void CheckTransactionPacket(char *uuid)
 		{
 			DEBUG_INFO("Receive queue response match.\n");
 			queue_operation(QUEUE_OPERATION_DEL,"","");//delq(); ---> remove temporally
-			TransactionMessageResend = 1;
+			queueOpInfo.TransactionMessageResend = 1;
 		}
 		else
 			DEBUG_INFO("Receive queue response mismatch.\n");
@@ -1322,9 +1319,9 @@ int queue_operation(int type, char *frontUUID, char *frontData)
 
 	while(1)
 	{
-		if (!IsUsing )
+		if (!queueOpInfo.IsUsing )
 		{
-			IsUsing = TRUE;
+			queueOpInfo.IsUsing = TRUE;
 
 			if(type == QUEUE_OPERATION_SHOWQUEUE)   				// show items in queue
 			{
@@ -1351,7 +1348,7 @@ int queue_operation(int type, char *frontUUID, char *frontData)
 				}
 			}
 
-			IsUsing = FALSE;
+			queueOpInfo.IsUsing = FALSE;
 			break;
 		}
 		usleep(100000);
@@ -1404,6 +1401,8 @@ int main(void)
 {
 	char rmFileCmd[100]={0};
 	struct stat stats;
+	queueOpInfo.IsUsing = FALSE;
+	queueOpInfo.TransactionMessageResend = 1;
 
 	DEBUG_INFO("Module_OcppBackend task initialization...\n");
 	//lws_set_log_level(LLL_PARSER | LLL_HEADER | LLL_ERR | LLL_WARN | LLL_NOTICE | LLL_INFO | LLL_DEBUG | LLL_EXT | LLL_CLIENT | LLL_LATENCY  , NULL);

+ 11 - 0
EVSE/Modularization/ocppfiles/Module_OcppBackend.h

@@ -91,6 +91,16 @@ enum GUN_TYPE
 	GUN_TYPE_AC
 };
 
+struct QueueOpInfo
+{
+	int TransactionMessageResend;  		// the number of retry to submit a transaction-related message when the Central System fails to process it.
+	int TransactionQueueNum;
+	int OfflineTransactionQueueNum;  	// Number of offline transactions
+	int OfflineTransaction;
+	int IsUsing;
+	int stopTransactionId;
+};
+
 struct yuarel {
 	char *scheme; /* scheme, without ":" and "//" */
 	char *username; /* username, default: NULL */
@@ -147,6 +157,7 @@ extern char * strtrim( char * s );
 
 extern struct lws 					*wsi_client;
 extern struct lws_context 			*context;
+extern struct QueueOpInfo 			queueOpInfo;
 extern unsigned char 				SendBuffer[WEBSOCKET_BUFFER_SIZE];
 extern int 							SendBufLen;
 extern char 						OcppPath[384];

+ 2 - 1
EVSE/Modularization/ocppph/MessageHandler.c

@@ -6260,7 +6260,7 @@ int sendMeterValuesRequest(int gun_index, ReadingContext dataType)
 	memset(&ShmOCPP16DataPH->MeterValues[gun_index], 0, sizeof(struct StructMeterValues));
 	//set value
 	ShmOCPP16DataPH->MeterValues[gun_index].ConnectorId = gun_index + 1; // gun start from 1~
-	ShmOCPP16DataPH->MeterValues[gun_index].TransactionId = (((strstr((char*)ShmOCPP16DataPH->StatusNotification[gun_index].Status, "Charging") != NULL) || (strstr((char*)ShmOCPP16DataPH->StatusNotification[gun_index].Status, "SuspendedEV") != NULL) || (strstr((char*)ShmOCPP16DataPH->StatusNotification[gun_index].Status, "SuspendedEVSE") != NULL) )?
+	ShmOCPP16DataPH->MeterValues[gun_index].TransactionId = (cpinitateMsg.bits[gun_index].isOnCharging?
 															ShmOCPP16DataPH->StartTransaction[gun_index].ResponseTransactionId :
 															-1);
 
@@ -13686,6 +13686,7 @@ void handleStopTransactionnResponse(char *payload, int gun_index)
 	DEBUG_INFO("idTagInfo-expiryDate: %s\n", ShmOCPP16DataPH->StopTransaction[gun_index].ResponseIdTagInfo.ExpiryDate);
 	DEBUG_INFO("idTagInfo-parentIdTag: %s\n", ShmOCPP16DataPH->StopTransaction[gun_index].ResponseIdTagInfo.ParentIdTag);
 	DEBUG_INFO("idTagInfo-status: %s\n", ShmOCPP16DataPH->StopTransaction[gun_index].ResponseIdTagInfo.Status);
+	SetTransactionIdZero(queueOpInfo.stopTransactionId);
 }
 
 void handleLogStatusNotificationResponse(char *payload, int gun_index)

+ 31 - 31
EVSE/Modularization/ocppph/Module_OcppBackend.c

@@ -16,6 +16,8 @@ struct StartTime
 	unsigned int reConnect;
 }startTime;
 
+struct QueueOpInfo queueOpInfo;
+
 //==========================================
 // Function prototype
 //==========================================
@@ -23,11 +25,6 @@ void ReceivedMessage(void *in, size_t len);
 int SendBufLen=0;//(1024*4);//(1024*3);
 unsigned char SendBuffer[WEBSOCKET_BUFFER_SIZE]={0};
 static int ConnectionEstablished=0;
-static int TransactionMessageResend = 1;  // the number of retry to submit a transaction-related message when the Central System fails to process it.
-static int TransactionQueueNum = 0;
-static int OfflineTransactionQueueNum = 0;  // Number of offline transactions
-static int OfflineTransaction = 0;
-static int IsUsing = FALSE;
 int defaultWaitingTime = 10; //10 second
 
 char OcppPath[384]={0};
@@ -99,7 +96,7 @@ static char *sqlTransaction = "create table if not exists ocpp_transaction_recor
 //=================================
 int GetTransactionQueueNum(void)
 {
-	return TransactionQueueNum;
+	return queueOpInfo.TransactionQueueNum;
 }
 
 //==========================================
@@ -253,14 +250,14 @@ static int OCPP16Callback(struct lws *wsi, enum lws_callback_reasons reason, voi
 
 			if(queueNotEmpty == TRUE)
 			{
-				OfflineTransaction = 1; // 0: no packets in queue.     1: There are packets in queue.
+				queueOpInfo.OfflineTransaction = 1; // 0: no packets in queue.     1: There are packets in queue.
 			}
 
-			TransactionMessageResend = 1;
+			queueOpInfo.TransactionMessageResend = 1;
 
 			//get offline number
 			queue_operation(QUEUE_OPERATION_SHOWQUEUE,"","");
-			OfflineTransactionQueueNum =TransactionQueueNum ;
+			queueOpInfo.OfflineTransactionQueueNum = queueOpInfo.TransactionQueueNum ;
 			break;
 		case LWS_CALLBACK_CLIENT_CONNECTION_ERROR://1
 			DEBUG_ERROR("LWS_CALLBACK_CLIENT_CONNECTION_ERROR %s\n", (char *)in );
@@ -708,10 +705,10 @@ int addq(char *uuid, char *data)
 	fputs(data, outfile);
 	fputs("\n", outfile);
 	fclose (outfile);
-	TransactionQueueNum = TransactionQueueNum + 1;
-	if(OfflineTransaction == 1)  // 0: no offline Transaction      1: offline Transaction
+	queueOpInfo.TransactionQueueNum += 1;
+	if(queueOpInfo.OfflineTransaction == 1)  // 0: no offline Transaction      1: offline Transaction
 	{
-		OfflineTransactionQueueNum = OfflineTransactionQueueNum + 1;
+		queueOpInfo.OfflineTransactionQueueNum += 1;
 	}
 	DEBUG_INFO("add queue end\n");
 	system("/bin/fsync -d /dev/mtdblock13;/bin/sync &");
@@ -802,8 +799,8 @@ int delq()
 
 			if(i==0)
 			{
-				TransactionQueueNum = TransactionQueueNum - 1;
-				TransactionMessageResend = 1;
+				queueOpInfo.TransactionQueueNum -= 1;
+				queueOpInfo.TransactionMessageResend = 1;
 				DEBUG_INFO("delete the item\n");
 			}
 
@@ -888,11 +885,11 @@ int showqueue()
 	  return FALSE;
 	}
 
-	TransactionQueueNum = 0;  // the number of packets in queue
+	queueOpInfo.TransactionQueueNum = 0;  // the number of packets in queue
 
 	while(fgets(line, sizeof line, fp) != NULL) {
 		//DEBUG_INFO("%s\n", line);
-		TransactionQueueNum = TransactionQueueNum + 1; //the number of packets in queue
+		queueOpInfo.TransactionQueueNum += 1; //the number of packets in queue
 	}
 
 	fclose(fp);
@@ -1148,7 +1145,8 @@ int sentqueue(){
 			DEBUG_INFO("Final transactionId       = %d\n", gettransactionId);
 			if(IsStopTransaction == TRUE)//if((IsStopTransaction == TRUE)&&(gettransactionId != 0))
 			{
-				SetTransactionIdZero(gettransactionId);
+				queueOpInfo.stopTransactionId = gettransactionId;
+				//SetTransactionIdZero(gettransactionId);
 			}
 		 }
 		 else
@@ -1193,35 +1191,35 @@ void* processTransactionQueue(void* data)
 					if((((time((time_t*)NULL) - startTimeQueue) > (TransactionMessageRetryIntervalGet()>10?TransactionMessageRetryIntervalGet():10))))
 						DEBUG_INFO("Queue timer(%d) over spec(%d).\n", (time((time_t*)NULL) - startTimeQueue), TransactionMessageRetryIntervalGet());
 
-					if((OfflineTransaction == 1) && (OfflineTransactionQueueNum != 0))  //OfflineTransaction   0: no offline Transaction     1: offline Transaction
+					if((queueOpInfo.OfflineTransaction == 1) && (queueOpInfo.OfflineTransactionQueueNum != 0))  //OfflineTransaction   0: no offline Transaction     1: offline Transaction
 					{
 						DEBUG_INFO("Sent message from queue request off-line first.\n");
 						req_SendQueue 	= 1; // 0: no packets to send    1: send the top packet in queue
 
-						OfflineTransactionQueueNum = OfflineTransactionQueueNum - 1;
+						queueOpInfo.OfflineTransactionQueueNum -= 1;
 
-						if(OfflineTransactionQueueNum == 0)
+						if(queueOpInfo.OfflineTransactionQueueNum == 0)
 						{
-							OfflineTransaction = 0;
+							queueOpInfo.OfflineTransaction = 0;
 						}
 					}
 					else
 					{
-						if(TransactionMessageResend <= TransactionMessageAttemptsGet()) //
+						if(queueOpInfo.TransactionMessageResend <= TransactionMessageAttemptsGet()) //
 						{
 							DEBUG_INFO("Sent message from queue request.\n");
-							DEBUG_INFO("TransactionMessageResend = %d\n",TransactionMessageResend);
+							DEBUG_INFO("TransactionMessageResend = %d\n", queueOpInfo.TransactionMessageResend);
 
 							req_SendQueue = 1;
 
-							TransactionMessageResend += 1;
+							queueOpInfo.TransactionMessageResend += 1;
 						}
 						else
 						{
-							DEBUG_INFO("Transaction message resend(%d) over spec(%d) message abandon.\n", TransactionMessageResend, TransactionMessageAttemptsGet());
+							DEBUG_INFO("Transaction message resend(%d) over spec(%d) message abandon.\n", queueOpInfo.TransactionMessageResend, TransactionMessageAttemptsGet());
 
 							queue_operation(QUEUE_OPERATION_DEL,"","");   //// delete item
-							TransactionMessageResend = 1;
+							queueOpInfo.TransactionMessageResend = 1;
 						}
 					}
 				}
@@ -1231,7 +1229,7 @@ void* processTransactionQueue(void* data)
 			{
 				if(queueNotEmpty == TRUE)
 				{
-					OfflineTransaction = 1;  // 0: no offline Transaction      1: offline Transaction
+					queueOpInfo.OfflineTransaction = 1;  // 0: no offline Transaction      1: offline Transaction
 				}
 			}
 
@@ -1309,7 +1307,7 @@ void CheckTransactionPacket(char *uuid)
 		{
 			DEBUG_INFO("Receive queue response match.\n");
 			queue_operation(QUEUE_OPERATION_DEL,"","");//delq(); ---> remove temporally
-			TransactionMessageResend = 1;
+			queueOpInfo.TransactionMessageResend = 1;
 		}
 		else
 			DEBUG_INFO("Receive queue response mismatch.\n");
@@ -1322,9 +1320,9 @@ int queue_operation(int type, char *frontUUID, char *frontData)
 
 	while(1)
 	{
-		if (!IsUsing )
+		if (!queueOpInfo.IsUsing )
 		{
-			IsUsing = TRUE;
+			queueOpInfo.IsUsing = TRUE;
 
 			if(type == QUEUE_OPERATION_SHOWQUEUE)   				// show items in queue
 			{
@@ -1351,7 +1349,7 @@ int queue_operation(int type, char *frontUUID, char *frontData)
 				}
 			}
 
-			IsUsing = FALSE;
+			queueOpInfo.IsUsing = FALSE;
 			break;
 		}
 		usleep(100000);
@@ -1404,6 +1402,8 @@ int main(void)
 {
 	char rmFileCmd[100]={0};
 	struct stat stats;
+	queueOpInfo.IsUsing = FALSE;
+	queueOpInfo.TransactionMessageResend = 1;
 
 	DEBUG_INFO("Module_OcppBackend task initialization...\n");
 	//lws_set_log_level(LLL_PARSER | LLL_HEADER | LLL_ERR | LLL_WARN | LLL_NOTICE | LLL_INFO | LLL_DEBUG | LLL_EXT | LLL_CLIENT | LLL_LATENCY  , NULL);

+ 11 - 0
EVSE/Modularization/ocppph/Module_OcppBackend.h

@@ -91,6 +91,16 @@ enum GUN_TYPE
 	GUN_TYPE_AC
 };
 
+struct QueueOpInfo
+{
+	int TransactionMessageResend;           // the number of retry to submit a transaction-related message when the
+	int TransactionQueueNum;
+	int OfflineTransactionQueueNum;         // Number of offline transactions
+	int OfflineTransaction;
+	int IsUsing;
+	int stopTransactionId;
+};
+
 struct yuarel {
 	char *scheme; /* scheme, without ":" and "//" */
 	char *username; /* username, default: NULL */
@@ -147,6 +157,7 @@ extern char * strtrim( char * s );
 
 extern struct lws 					*wsi_client;
 extern struct lws_context 			*context;
+extern struct QueueOpInfo           queueOpInfo;
 extern unsigned char 				SendBuffer[WEBSOCKET_BUFFER_SIZE];
 extern int 							SendBufLen;
 extern char 						OcppPath[384];