Forráskód Böngészése

2019-12-26 /Kathy Yeh
Actions: [Module_OcppBackend]1. modify OcppBackend Files and delete unused files

Kathy_Yeh 5 éve
szülő
commit
9b07f37823

+ 1 - 1
EVSE/Modularization/Makefile

@@ -45,7 +45,7 @@ WebServiceLib:
 
 OcppBackend:
 	rm -f OcppBackend; 
-	$(CC) ./ocppfiles/Module_OcppBackend.c ./ocppfiles/MessageHandler.c ./ocppfiles/JsonParser.c ./ocppfiles/SystemLogMessage.c ./ocppfiles/TransactionQueue.c ./ocppfiles/lib.c ./ocppfiles/HashTable.c ./ocppfiles/hashmap.c ./ocppfiles/array.c -I ../GPL/libwebsockets-v2.1-stable/release/include -I ../GPL/json-c-json-c-0.13.1-20180305/release/include/json-c -L ../GPL/libwebsockets-v2.1-stable/release/lib -L ../GPL/openssl-1.0.2g/release/lib -L ../GPL/json-c-json-c-0.13.1-20180305/release/lib -lwebsockets -ljson-c -lsqlite3 -lpthread -lc -o OcppBackend
+	$(CC) ./ocppfiles/Module_OcppBackend.c ./ocppfiles/MessageHandler.c ./ocppfiles/JsonParser.c ./ocppfiles/SystemLogMessage.c ./ocppfiles/hashmap.c -I ../GPL/libwebsockets-v2.1-stable/release/include -L ../GPL/libwebsockets-v2.1-stable/release/lib -L ../GPL/openssl-1.0.2g/release/lib -lwebsockets -lsqlite3 -lpthread -lc -o OcppBackend
 	cp -f OcppBackend ../rootfs/root/
 
 Phihong_PsuCommObj:

+ 0 - 112
EVSE/Modularization/ocppfiles/HashTable.c

@@ -1,112 +0,0 @@
-#include "HashTable.h"
-
-void HashTableTest() {
-  printf("\n=======HashTableTest()==========\n");
-  char *names[] = { "John", "Mary", "George", "Mickey", "Snoopy", "Bob", "Jack" };
-  char *ids[]    = { "1",    "2",    "3",      "4",      "5",      "6",   "7" };
-  HashTable* table = HashTableNew(3);
-  int i;
-  for (i=0; i<5; i++)
-    HashTablePut(table, names[i], ids[i]);
-//  for (i=0; i<7; i++)
-//    printf("id=%s\n", HashTableGet(table, names[i]));
-//  HashTableEach(table, strPrintln);
-  HashTableFree(table);
-}
-
-int hash(char *key, int range) {
-  int i, hashCode=0;
-  for (i=0; i<strlen(key); i++) {
-    BYTE value = (BYTE) key[i];
-    hashCode += value;
-    hashCode %= range;
-  }
-  return hashCode;
-}
-
-Entry* EntryNew(char *key, void *data) {
-  Entry* e = ObjNew(Entry, 1);
-  e->key = key;
-  e->data = data;
-  return e;
-}
-
-void EntryFree(Entry *e) {
-  ObjFree(e);
-}
-
-int EntryCompare(Entry *e1, Entry *e2) {
-  return strcmp(e1->key, e2->key);
-}
-
-HashTable* HashTableNew(int size) {
-  Array *table = ArrayNew(size);
-  int i;
-  for (i=0; i<table->size; i++)
-    ArrayAdd(table, ArrayNew(1));
-  return table;
-}
-
-void HashTableFree(HashTable *table) {
-  int ti, hi;
-  for (ti=0; ti<table->size; ti++) {
-    Array *hitArray = table->item[ti];
-    ArrayFree(hitArray, (FuncPtr1) EntryFree);
-  }
-  ArrayFree(table, NULL);
-}
-
-Entry keyEntry;
-// 尋找雜湊表中 key 所對應的元素並傳回
-void *HashTableGet(HashTable *table, char *key) { 
-  int slot = hash(key, table->size);            // 取得雜湊值 (列號) 
-  Array *hitArray = (Array*) table->item[slot]; // 取得該列
-  // 找出該列中是否有包含 key 的配對
-  keyEntry.key = key;
-  int keyIdx = ArrayFind(hitArray, &keyEntry, EntryCompare);
-  if (keyIdx >= 0) { // 若有,則傳回該配對的資料元素 
-    Entry *e = hitArray->item[keyIdx];
-    return e->data;
-  }
-  return NULL; // 否則傳回 NULL 
-}
-
-// 將 (key, data) 配對放入雜湊表中 
-void HashTablePut(HashTable *table, char *key, void *data) {
-  Entry *e;
-  int slot = hash(key, table->size);            // 取得雜湊值 (列號) 
-  Array *hitArray = (Array*) table->item[slot]; // 取得該列
-  keyEntry.key = key;
-  int keyIdx = ArrayFind(hitArray, &keyEntry, EntryCompare);
-  if (keyIdx >= 0) { // 若有,則傳回該配對的資料元素 
-    e = hitArray->item[keyIdx];
-    e->data = data;
-  } else {
-    e= EntryNew(key, data);// 建立配對 
-    ArrayAdd(hitArray, e); // 放入對應的列中 
-  }
-}
-
-void HashTableEach(HashTable *table, FuncPtr1 f) {
-  int i, j;
-  for (i=0; i<table->count; i++) {
-    Array *hits = table->item[i];
-    for (j=0; j<hits->count; j++) {
-      Entry *e = hits->item[j];
-      f(e->data);
-    }
-  }
-}
-
-Array* HashTableToArray(HashTable *table) {
-  Array *array = ArrayNew(table->count);
-  int i, j;
-  for (i=0; i<table->count; i++) {
-    Array *hits = table->item[i];
-    for (j=0; j<hits->count; j++) {
-      Entry *e = hits->item[j];
-      ArrayAdd(array, e->data);
-    }
-  }
-  return array;
-}

+ 0 - 27
EVSE/Modularization/ocppfiles/HashTable.h

@@ -1,27 +0,0 @@
-#ifndef HASHTABLE_H
-#define HASHTABLE_H
-
-//#include "Array.h"   remove temporally
-#include "array.h"
-
-typedef struct {
-  char *key;
-  void *data;
-} Entry;
-
-Entry* EntryNew(char *key, void *data);
-int EntryCompare(Entry *e1, Entry *e2);
-
-int hash(char *key, int range);
-
-#define HashTable Array
-
-HashTable* HashTableNew(int size);
-void HashTableFree(HashTable *table);
-void HashTablePut(HashTable *table, char *key, void *data);
-void *HashTableGet(HashTable *table, char *key);
-void HashTableEach(HashTable *table, FuncPtr1 f);
-Array* HashTableToArray(HashTable *table);
-void HashTableTest();
-
-#endif

+ 279 - 315
EVSE/Modularization/ocppfiles/JsonParser.c

@@ -4,21 +4,16 @@
 #include	<string.h>
 #include	<assert.h>
 #include	"hashmap.h"
-#include	"HashTable.h"
+//#include	"HashTable.h"
 //#include	"json-c/arraylist.h"
 //#include	"json-c/json_tokener.h"
-#include	"arraylist.h"
-#include	"json_tokener.h"
 
 //#include "json.h"
 //#include	"./lib/Headers/json-c/JsonParser.h"
-#include	"JsonParser.h"
 //#include "parse_flags.h"
 //#include	"./lib/Headers/json-c/linkhash.h"
-#include	"linkhash.h"
 #include	"MessageHandler.h"
 
-//#include	"TransactionQueue.h"
 
 #define MESSAGE_TYPE_CALL			2
 #define MESSAGE_TYPE_CALLRESULT		3
@@ -27,22 +22,13 @@
 #define PASS						1
 #define FAIL						-1
 
-#if 0
-void handleAuthorizeResponse(char *payload);
-void handleBootNotificationResponse(char *payload);
-void handleDataTransferResponse(char *payload);
-void handleDiagnosticsStatusNotificationResponse(char *payload);
-#endif
 
-extern HashTable                   *tableHandleRequest;
-extern HashTable  				   *tableHandleresponse;
-extern HashTable				   *tableHandleError ;
-
-extern map_t hashMap;
-extern data_struct_t* mapItem;
-extern struct node Node;
-extern void split(char **arr, char *str, const char *del);
 
+//extern map_t hashMap;
+//extern data_struct_t* mapItem;  --- remove temporally
+//extern data_struct_t mapItem[0];
+//extern struct node Node;
+//extern void split(char **arr, char *str, const char *del);
 
 void CallErrorHandler(char *id, char *errorCode, char *errorDescription,char *payload);
 int CallHandler(char *uuid, char *str1,char *payload);
@@ -53,8 +39,20 @@ typedef void (*FunCallErrorPtr)(char *id, char *errorCode, char *errorDescriptio
 typedef void (*FunPtr)(char *payload, int gun_index); // 先宣告函式指標
 typedef int (*FunCallPtr)(char *uuid, char *payload); // 先宣告函式指標
 
+typedef enum boolean { FALSE, TRUE } BOOL;
+
+
+static char *requestNames[] = { "CancelReservation", "ChangeAvailability", "ChangeConfiguration", "ClearCache", \
+								"ClearChargingProfile", "DataTransfer", "GetCompositeSchedule", "GetConfiguration", \
+								"GetDiagnostics", "GetLocalListVersion", "RemoteStartTransaction", "RemoteStopTransaction", \
+								"ReserveNow", "Reset", "SendLocalList", "SetChargingProfile", "TriggerMessage", "UnlockConnector", "UpdateFirmware" };
+static char *responseNames[] = { "Authorize", "BootNotification", "DataTransfer", \
+								"DiagnosticsStatusNotification", \
+								"FirmwareStatusNotification", \
+								"Heartbeat", "MeterValues", "StartTransaction", "StatusNotification", \
+								"StopTransaction" };
 
-FunPtr funs[] = { 	handleAuthorizeResponse, handleBootNotificationResponse, handleDataTransferResponse,   \
+static FunPtr funs[] = { handleAuthorizeResponse, handleBootNotificationResponse, handleDataTransferResponse,   \
 					handleDiagnosticsStatusNotificationResponse, \
 					handleFirmwareStatusNotificationResponse, \
 					handleHeartbeatResponse, handleMeterValuesResponse, \
@@ -62,241 +60,14 @@ FunPtr funs[] = { 	handleAuthorizeResponse, handleBootNotificationResponse, hand
 					handleStatusNotificationResponse, \
 					handleStopTransactionnResponse }; // 將函式集中在陣列中。
 
-FunCallPtr funcalls[] = { 	handleCancelReservationRequest, handleChangeAvailabilityRequest, handleChangeConfigurationRequest,handleClearCacheRequest, \
-							handleClearChargingProfileRequest, handleDataTransferRequest, handleGetCompositeScheduleRequest, handleGetConfigurationRequest, \
-							handleGetDiagnosticsRequest, handleGetLocalListVersionRequest, handleRemoteStartRequest, handleRemoteStopTransactionRequest, \
-							handleReserveNowTransactionRequest, handleResetRequest, handleSendLocalListRequest, handleSetChargingProfileRequest, \
-							handleTriggerMessageRequest, handleUnlockConnectorRequest, handleUpdateFirmwareRequest }; // 將函式集中在陣列中。
-
-
-FunCallErrorPtr funcallerror[] = {	handleError	};
-
-/*printing the value corresponding to boolean, double, integer and strings*/
-void print_json_value(json_object *jobj){
-  enum json_type type;
-
-  type = json_object_get_type(jobj); /*Getting the type of the json object*/
-  printf("type: %d",type);
-  switch (type) {
-  	  case json_type_null: break;
-  	  case json_type_boolean: printf("json_type_boolean\n");
-                         printf("value: %s\n", json_object_get_boolean(jobj)? "true": "false");
-                         break;
-  	  case json_type_double: printf("json_type_double\n");
-                        printf("          value: %lf\n", json_object_get_double(jobj));
-                         break;
-  	  case json_type_int: printf("json_type_int\n");
-                        printf("          value: %d\n", json_object_get_int(jobj));
-                         break;
-  	  case json_type_string: printf("json_type_string\n");
-                         printf("          value: %s\n", json_object_get_string(jobj));
-                         break;
-  	  case json_type_object:
-  	  case json_type_array:
-  		  	  	  	  	  break;
-
-  }
-
-}
+static FunCallPtr funcalls[] = { handleCancelReservationRequest, handleChangeAvailabilityRequest, handleChangeConfigurationRequest,handleClearCacheRequest, \
+					handleClearChargingProfileRequest, handleDataTransferRequest, handleGetCompositeScheduleRequest, handleGetConfigurationRequest, \
+					handleGetDiagnosticsRequest, handleGetLocalListVersionRequest, handleRemoteStartRequest, handleRemoteStopTransactionRequest, \
+					handleReserveNowTransactionRequest, handleResetRequest, handleSendLocalListRequest, handleSetChargingProfileRequest, \
+					handleTriggerMessageRequest, handleUnlockConnectorRequest, handleUpdateFirmwareRequest }; // 將函式集中在陣列中。
 
-void json_parse_array( json_object *jobj, char *key) {
-  void json_parse(json_object * jobj); /*Forward Declaration*/
-  enum json_type type;
-
-  json_object *jarray = jobj; /*Simply get the array*/
-  if(key) {
-    jarray = json_object_object_get(jobj, key); /*Getting the array if it is a key value pair*/
-  }
-
-  int arraylen = json_object_array_length(jarray); /*Getting the length of the array*/
-  printf("Array Length: %d\n",arraylen);
-  int i;
-  json_object * jvalue;
-
-  for (i=0; i< arraylen; i++){
-    jvalue = json_object_array_get_idx(jarray, i); /*Getting the array element at position i*/
-    type = json_object_get_type(jvalue);
-    if (type == json_type_array) {
-      json_parse_array(jvalue, NULL);
-    }
-    else if (type != json_type_object) {
-      printf("value[%d]: ",i);
-      print_json_value(jvalue);
-    }
-    else {
-      json_parse(jvalue);
-    }
-  }
-}
 
-/*Parsing the json object*/
-void json_parse(json_object * jobj) {
-  enum json_type type;
-  struct array_list *json_list;
-  int MsgType;
-  char UniqueId[37],Action[33],Payload[10241],ErrorCode[129],ErrorDescription[513];
-  char *arr[2]= {};
-  int gun_index = 0;
-  const char *del = ",";
-  char *substr = NULL;
-  int count = 0;
-  int i = 0;
-  char key_value[VALUE_MAX_LENGTH];
-
-  //parsing received message and do something
-  memset(key_value, 0, sizeof key_value);
-  memset(UniqueId, 0, sizeof UniqueId);
-  memset(Action, 0, sizeof Action);
-  memset(Payload, 0, sizeof Payload);
-  memset(ErrorCode, 0, sizeof ErrorCode);
-  memset(ErrorDescription, 0, sizeof ErrorDescription);
-
-  if(json_object_get_type(jobj) == json_type_array)
-  {
-
-	   /* Get array of tests */
-	   json_list = json_object_get_array(jobj);
-	   	/* Get test */
-	  	struct json_object *jsonObject = (struct json_object *) array_list_get_idx(json_list, 0);
-	  	sprintf(UniqueId,"%s", json_object_get_string(json_object_array_get_idx(jobj, 1)));
-		printf("UniqueId %s\n", UniqueId);
-#if 1
-	  	// check Transaction-related messages
-	  	CheckTransactionPacket(UniqueId);
-#endif
-	  	MsgType = json_object_get_int(jsonObject);
-	   	switch (MsgType)
-	   	{
-	   		case MESSAGE_TYPE_CALL:
-	   			printf("MESSAGE_TYPE_CALL\n");
-	   			sprintf(Action, "%s", json_object_get_string(json_object_array_get_idx(jobj, 2)));
-	   			sprintf(Payload, "%s", json_object_get_string(json_object_array_get_idx(jobj, 3)));
-
-	   			CallHandler(UniqueId,Action,Payload);
-	   			break;
-
-	   		case MESSAGE_TYPE_CALLRESULT:
-
-	   			printf("MESSAGE_TYPE_CALLRESULT\n");
-	   			sprintf(Payload, "%s", json_object_get_string(json_object_array_get_idx(jobj, 2)));
-	   			#ifdef SystemLogMessage
-	   			//DEBUG_INFO("Message type: CallResult\n");
-	   			//DEBUG_INFO("Message: %s\n", (char *)in);
-	   			#endif
-
-	   			if(hashmap_operation(1,hashMap, UniqueId, mapItem, key_value/*(void**)(&mapItem)*/) ==  MAP_OK/*hashmap_get(hashMap, UniqueId, (void**)(&mapItem)) == MAP_OK*/)
-	   			{
-	   				printf("\test 1\n");
-	   				hashmap_operation(2,hashMap, UniqueId, mapItem, key_value/*(void**)(&mapItem)*/);//hashmap_remove(hashMap, UniqueId);
-	   				printf("\test 2\n");
-
-	   				//split(arr, mapItem->key_value, del);
-
-	   				char * const testdup  = strdup(key_value/*mapItem->key_value*/);
-
-	   					 printf("original string: %s (@%p)\n", testdup, testdup);
-
-
-	   					substr = strtok(testdup, del);
-	   					while (substr != NULL) {
-	   					    	   arr[count] = substr;
-	   					    	   printf(" arr string: %s (@%p)\n", arr[count], substr);
-	   					           printf("#%d sub string: %s (@%p)\n", count++, substr, substr);
-
-	   					           substr = strtok(NULL, del);
-	   					}
-
-                    i=0;
-	   				sprintf(Action, "%s", *(arr+i++));
-	   				printf("Action=%s\n",Action);
-
-	   				gun_index = atoi(*(arr+i++));
-	   				printf("gun_index=%d\n",gun_index);
-
-	   				#ifdef Debug
-	   				DEBUG_INFO("<<<<<%s response\n", Action);
-	   				DEBUG_INFO("Payload: %s\n", Payload);
-	   				#endif
-	   				CallResultHandler(Action, Payload, gun_index);
-
-	   				#ifdef Debug
-	   				DEBUG_INFO("After pull hash length: %d\n", hashmap_length(hashMap));
-	   				#endif
-
-	   				free(testdup);
-	   			}
-
-	   			break;
-
-	   		case MESSAGE_TYPE_CALLERROR:
-	   			printf("MESSAGE_TYPE_CALLERROR\n");
-	   			sprintf(ErrorCode, "%s", json_object_get_string(json_object_array_get_idx(jobj, 2)));
-	   			sprintf(ErrorDescription, "%s", json_object_get_string(json_object_array_get_idx(jobj, 3)));
-	   			#ifdef SystemLogMessage
-	   			//DEBUG_INFO("Message type: CallError\n");
-	   		    //DEBUG_INFO("Message: %s\n", (char *)in);
-	   			#endif
-
-	   			if(hashmap_operation(1,hashMap, UniqueId, mapItem, key_value/*(void**)(&mapItem)*/) ==  MAP_OK/*hashmap_get(hashMap, UniqueId, (void**)(&mapItem)) == MAP_OK*/)
-	   			{
-	   				hashmap_operation(2,hashMap, UniqueId, mapItem, key_value/*(void**)(&mapItem)*/);//hashmap_remove(hashMap, UniqueId);
-
-	   				sprintf(Action, "%s", key_value/*mapItem->key_value*/);
-	   				#ifdef Debug
-	   				DEBUG_INFO("<<<<<%s response\n", Action);
-	   				DEBUG_INFO("ErrorCode: %s\n", ErrorCode);
-	   				DEBUG_INFO("ErrorDescription: %s\n", ErrorDescription);
-	   				#endif
-	   				/*
-	   				 * TODO Handle server error response
-	   				 */
-	   				CallErrorHandler(UniqueId,ErrorCode, ErrorDescription, "");
-
-
-
-	   				#ifdef Debug
-	   			    DEBUG_INFO("After pull hash length: %d\n", hashmap_length(hashMap));
-	   				#endif
-	   			}
-
-	   			break;
-
-	   		default:
-
-	   			break;
-	   	}
-
-	   	// json_parse_array(jobj, NULL); -- remove temporally
-   }
-#if 0
-   else
-   {
-	   json_object_object_foreach(jobj, key, val) { /*Passing through every array element*/
-	   printf("key: \%s:\n", key);
-	   type = json_object_get_type(val);
-	   printf("type: %d",type);
-	   switch (type) {
-	   case json_type_null: break;
-	   case json_type_boolean:
-	   case json_type_double:
-	   case json_type_int:
-	   case json_type_string: print_json_value(val);
-                           break; 
-	   case json_type_object: printf("json_type_object\n");
-                           jobj = json_object_object_get(jobj, key);
-                           json_parse(jobj); 
-                           break;
-	   case json_type_array: printf("type: json_type_array, ");
-                          json_parse_array(jobj, key);
-                          break;
-	   	   }
-	   }
-   }
-#endif
-
-  //free json object
-  //	json_object_put(json_list); -- remove temporally
-} 
+static FunCallErrorPtr funcallerror[] = {	handleError	};
 
 //==========================================
 
@@ -308,23 +79,221 @@ void ReceivedMessage(void *in, size_t len)
 {
 	printf("ReceivedMessage\n");
 	char tempin[1024*4];
+	int MsgType = 0;
+	char UniqueId[37],Action[33],Payload[10241],ErrorCode[129],ErrorDescription[513];
+	char *arr[2]= {};
+	int gun_index = 0;
+	const char *del = ",";
+	char *substr = NULL;
+	int count = 0;
+	int i = 0;
+	int c = 0;
+	//int templen = 0;
+	char key_value[VALUE_MAX_LENGTH];
+
+	//parsing received message and do something
+	memset(key_value, 0, sizeof key_value);
+	memset(UniqueId, 0, sizeof UniqueId);
+	memset(Action, 0, sizeof Action);
+	memset(Payload, 0, sizeof Payload);
+	memset(ErrorCode, 0, sizeof ErrorCode);
+	memset(ErrorDescription, 0, sizeof ErrorDescription);
+
 	memset(tempin, 0, 1024*4);
 	strcpy(tempin, (const char *)in);
 	memset( (void *)in, 0, sizeof(char)*len );
 
-	json_object * jobj = json_tokener_parse((const char *)tempin); //json_tokener_parse((const char *)in);  //json_tokener_parse(msg); //json_tokener_parse((char *)in);
+	//char *str = "[ ]";
+	if(strcmp((const char *)tempin,"[ ]") == 0)
+	{
+		printf("jobj is empty arrary. \n");
+	    return;
+	}
 
-	if(jobj != NULL)
+	if(tempin[0] != '\0')//if(jobj != NULL)
 	{
-		printf("new_obj.to_string()=%s\n", json_object_to_json_string(jobj));
+		MsgType = tempin[1] - '0';
+		printf("MsgType=%d\n",MsgType);
+		c = 0;
+
+		if((MsgType != 2) && (MsgType != 3) && (MsgType != 4) )
+		{
+			return;
+		}
+
+		while ((tempin[4+c] != '\"') && (tempin[4+c] != '\0'))
+		{
+			UniqueId[c] = tempin[4+c];
+			//printf("i=%d UniqueId[c]=%c\n",c, UniqueId[c]);
+			c++;
+		}
+		UniqueId[c] = '\0';
+		printf("UniqueId=%s\n",UniqueId);
+
+		if(UniqueId[0] == '\0')
+		{
+			return;
+		}
+
+		#if 1
+		// check Transaction-related messages
+		CheckTransactionPacket(UniqueId);
+		#endif
+
+		switch (MsgType)
+		{
+			case MESSAGE_TYPE_CALL:
+				printf("MESSAGE_TYPE_CALL\n");
+
+				c = 0;
+				while (tempin[4+4+strlen(UniqueId)-1+c] != '\"')
+				{
+					Action[c] = tempin[4+4+strlen(UniqueId)-1+c];
+					//printf("i=%d Action[c]=%c\n",c, Action[c]);
+					c++;
+				}
+				Action[c] = '\0';
+
+				printf("Action=%s\n",Action);
+
+				c = 0;
+				int templen= 4+4+3+strlen(UniqueId)-1+strlen(Action)-1;
+				while ((c+ templen) < (strlen(tempin)-1))
+				{
+					Payload[c] = tempin[templen + c];
+					//printf("i=%d Payload[c]=%c\n",c, Payload[c]);
+					c++;
+				}
+				Payload[c] = '\0';
+
+				printf("Payload=%s\n",Payload);
+
+			   	CallHandler(UniqueId,Action,Payload);
+			   	break;
+
+			case MESSAGE_TYPE_CALLRESULT:
+
+			   	printf("MESSAGE_TYPE_CALLRESULT\n");
+
+			   	c = 0;
+			   	templen= 4+3+strlen(UniqueId)-1;
+			   	while ((c+ templen) < (strlen(tempin)-1))
+			   	{
+			   		Payload[c] = tempin[templen + c];
+			   		//printf("i=%d sstr=%c\n",c, Payload[c]);
+			   		c++;
+			   	}
+			   	Payload[c] = '\0';
+
+			   	printf("Payload=%s\n",Payload);
+
+			   	if(hashmap_operation(1, UniqueId, key_value) == TRUE)//if(hashmap_operation(1,NULL/*hashMap*/, UniqueId, mapItem, key_value/*(void**)(&mapItem)*/) ==  MAP_OK/*hashmap_get(hashMap, UniqueId, (void**)(&mapItem)) == MAP_OK*/)
+			   	{
+			   		hashmap_operation(2, UniqueId, key_value);//hashmap_operation(2,NULL/*hashMap*/, UniqueId, mapItem, key_value/*(void**)(&mapItem)*/);//hashmap_remove(hashMap, UniqueId);
+			   		char * const testdup  = strdup(key_value/*mapItem->key_value*/);
+
+			   		printf("original string: %s (@%p)\n", testdup, testdup);
+
+			   		substr = strtok(testdup, del);
+			   		while (substr != NULL) {
+			   				arr[count] = substr;
+			   			//	printf(" arr string: %s (@%p)\n", arr[count], substr);
+			   			//	printf("#%d sub string: %s (@%p)\n", count++, substr, substr);
+			   				count++;
+			   				substr = strtok(NULL, del);
+			   		}
+
+		            i=0;
+			   		sprintf(Action, "%s", *(arr+i++));
+			   		printf("Action=%s\n",Action);
+
+			   		gun_index = atoi(*(arr+i++));
+			   		printf("gun_index=%d\n",gun_index);
+
+			   		#ifdef Debug
+			   		DEBUG_INFO("<<<<<%s response\n", Action);
+			   		DEBUG_INFO("Payload: %s\n", Payload);
+			   		#endif
+			   		CallResultHandler(Action, Payload, gun_index);
+
+			   		#ifdef Debug
+			   		DEBUG_INFO("After pull hash length: %d\n", hashmap_length(hashMap));
+			   		#endif
+
+			   		free(testdup);
+			   	}
+
+			   	break;
+
+			   case MESSAGE_TYPE_CALLERROR:
+				   printf("MESSAGE_TYPE_CALLERROR\n");
+
+				   c = 0;
+				   while (tempin[4+4+strlen(UniqueId)-1+c] != '\"')
+				   {
+					   ErrorCode[c] = tempin[4+4+strlen(UniqueId)-1+c] ;
+					  // printf("i=%d sstr=%c\n",c, ErrorCode[c]);
+					   c++;
+				   }
+				   ErrorCode[c] = '\0';
 
-		printf("1\n");
+				   printf("ErrorCode=%s\n",ErrorCode);
 
-		//parse json object
-		json_parse(jobj);
+				   c = 0;
+				   while (tempin[4+4+4+strlen(UniqueId)-1+strlen(ErrorCode)-1+c] != '\"')
+				   {
+					   ErrorDescription[c] = tempin[4+4+4+strlen(UniqueId)-1+strlen(ErrorCode)-1+c];
+					   //printf("i=%d sstr=%c\n",c, ErrorDescription[c]);
+					   c++;
+				   }
+				   ErrorDescription[c] = '\0';
+
+				   printf("ErrorDescription=%s\n",ErrorDescription);
+
+
+				   c = 0;
+				   templen= 4+4+4+3+strlen(UniqueId)-1+strlen(ErrorCode)-1+strlen(ErrorDescription)-1;
+				   while ((c+ templen) < (strlen(tempin)-1))
+				   {
+					   Payload[c] = tempin[templen + c];
+					  // printf("i=%d sstr=%c\n",c, Payload[c]);
+					   c++;
+				   }
+				   Payload[c] = '\0';
+
+				   printf("Payload=%s\n",Payload);
+
+
+
+				   if(hashmap_operation(1, UniqueId, key_value) == TRUE)//if(hashmap_operation(1,NULL/*hashMap*/, UniqueId, mapItem, key_value/*(void**)(&mapItem)*/) ==  MAP_OK/*hashmap_get(hashMap, UniqueId, (void**)(&mapItem)) == MAP_OK*/)
+			   		{
+					   hashmap_operation(2, UniqueId, key_value);//hashmap_operation(2,NULL/*hashMap*/, UniqueId, mapItem, key_value/*(void**)(&mapItem)*/);//hashmap_remove(hashMap, UniqueId);
+
+			   			sprintf(Action, "%s", key_value/*mapItem->key_value*/);
+			   			#ifdef Debug
+			   			DEBUG_INFO("<<<<<%s response\n", Action);
+			   			DEBUG_INFO("ErrorCode: %s\n", ErrorCode);
+			   			DEBUG_INFO("ErrorDescription: %s\n", ErrorDescription);
+			   			#endif
+			   				/*
+			   				 * TODO Handle server error response
+			   				 */
+			   			CallErrorHandler(UniqueId,ErrorCode, ErrorDescription, "");
+
+
+
+			   			#ifdef Debug
+			   			DEBUG_INFO("After pull hash length: %d\n", hashmap_length(hashMap));
+			   			#endif
+			   		}
+
+			   		break;
+
+			   	default:
+
+			   		break;
+			   	}
 
-		//free json object
-		json_object_put(jobj);
 
 	}
 	else
@@ -332,81 +301,80 @@ void ReceivedMessage(void *in, size_t len)
 		printf("jobj is null. cant parse messgae. \n");
 	}
 
-	//json_object_put(jobj);
-
 }
 
-void ClientCoreProfile(HashTable* HandleRequest, HashTable* Handleresponse)
+int CallHandler(char *uuid, char *str1,char *payload)
 {
-	char *requestNames[] = { 	"CancelReservation", "ChangeAvailability", "ChangeConfiguration", "ClearCache", \
-								"ClearChargingProfile", "DataTransfer", "GetCompositeSchedule", "GetConfiguration", \
-								"GetDiagnostics", "GetLocalListVersion", "RemoteStartTransaction", "RemoteStopTransaction", \
-								"ReserveNow", "Reset", "SendLocalList", "SetChargingProfile", "TriggerMessage", "UnlockConnector", "UpdateFirmware" };
-	char *responseNames[] = { 	"Authorize", "BootNotification", "DataTransfer", \
-								"DiagnosticsStatusNotification", \
-								"FirmwareStatusNotification", \
-								"Heartbeat", "MeterValues", "StartTransaction", "StatusNotification", \
-								"StopTransaction" };
-	int i;
+	static int CallHandlerNumber = 0;
+    static int CallHandlerIndex = 0;
+    int (*callfptr)(char *uuid,char *payload);
+    printf("enter CallHandler\n");
+	CallHandlerNumber = sizeof(requestNames)/sizeof(requestNames[0]);
+	for(int i= 0; i < CallHandlerNumber ; i ++ )
+	{
+		if(strcmp(requestNames[i],str1) == 0)
+		{
+			CallHandlerIndex = i ;
+			break;
+		}
 
-	//Handle Server Request
-	for (i=0; i<19; i++)
-		HashTablePut(HandleRequest, requestNames[i], funcalls[i]);
+	}
 
-	//Handle Server Response
-	for (i=0; i<10; i++)
-		HashTablePut(Handleresponse, responseNames[i], funs[i]);
-}
+	callfptr = NULL;
+	callfptr = funcalls[CallHandlerIndex];
 
-int CallHandler(char *uuid, char *str1,char *payload)
-{
-	 int (*callfptr)(char *uuid,char *payload);
-	 callfptr = NULL;
-	 callfptr = HashTableGet(tableHandleRequest, str1);
-     printf("CallHandler \n");
-     printf("action: %s\n", str1);
-
-    if(callfptr == NULL)
-    {
-    	printf("callfptr is null\n");
-    }
-
-	 if ( callfptr )
-	 {
-		 printf("\test 3\n");
-		 return callfptr(uuid, payload);
-		 printf("\test 4\n");
-	 }
-
-	 callfptr = NULL;
+	if(callfptr == NULL)
+	{
+		printf("callfptr is null\n");
+	}
+
+	if ( callfptr )
+	{
+		printf("exec CallHandler ... \n");
+		callfptr(uuid, payload);
+		callfptr = NULL;
+		return PASS;
+	}
+
+	callfptr = NULL;
 	 return FAIL;
 }
 
 
 void CallResultHandler(char *str1, char *payload, int gun_index)
 {
+	static int CallResultHandlerNumber = 0;
+	static int CallResultHandlerIndex = 0;
 	void (*callResultfptr)(char *payload, int gun_index );
+	printf("enter CallResultHandler\n");
+	CallResultHandlerNumber = sizeof(responseNames)/sizeof(responseNames[0]);
+	for(int i= 0; i < CallResultHandlerNumber ; i ++ )
+	{
+		if(strcmp(responseNames[i],str1) == 0)
+		{
+			CallResultHandlerIndex = i ;
+			break;
+		}
+
+	}
+	printf("CallResultHandlerIndex=%d\n",CallResultHandlerIndex);
+
 	callResultfptr = NULL;
-	callResultfptr = HashTableGet(tableHandleresponse, str1);
+	callResultfptr = funs[CallResultHandlerIndex];
 
-	printf("CallResultHandler \n");
 
 	if(callResultfptr == NULL)
 	{
-	   printf("callResultfptr is null\n");
+		printf("callResultfptr is null\n");
 	}
 
-
-
 	if ( callResultfptr )
 	{
-		printf("\test 3\n");
+		printf("exec CallResultHandler\n");
 		callResultfptr(payload, gun_index);
-		printf("\test 4\n");
 	}
 
 	callResultfptr = NULL;
-
 }
 
 
@@ -423,16 +391,12 @@ void CallErrorHandler(char *id, char *errorCode, char *errorDescription,char *pa
 		printf("callErrorfptr is null\n");
 	}
 
-
-
 	if ( callErrorfptr )
 	{
 		printf("callErrorfptr is not null\n");
 
 		callErrorfptr(id, errorCode, errorDescription, payload);
-
 	}
 
 	callErrorfptr = NULL;
 }
-

+ 12556 - 9253
EVSE/Modularization/ocppfiles/MessageHandler.c

@@ -1,9253 +1,12556 @@
-#define _XOPEN_SOURCE 700
-#include 	<sys/types.h>
-#include 	<sys/ipc.h>
-#include 	<sys/shm.h>
-#include    <sys/stat.h>
-#include 	<sys/time.h>   // gettimeofday sleep usleep
-#include    <fcntl.h>
-#include	<stddef.h>
-#include 	<stdio.h>
-#include	<string.h>
-#ifdef _WIN32
-#include 	<Windows.h>
-#else
-#include 	<unistd.h>
-#endif
-
-#include 	<stdarg.h>
-#include 	<ctype.h>
-#include	<json.h>               
-#include 	<json_config.h>        
-#include 	<json_object.h>        
-#include 	<json_tokener.h>      
-//#include	<json-c/json.h>               remove temporally
-//#include 	<json-c/json_config.h>        remove temporally
-//#include 	<json-c/json_object.h>        remove temporally
-//#include 	<json-c/json_tokener.h>       remove temporally
-#include 	<libwebsockets.h>
-#include 	<lws_config.h>
-//#include    "./json-c/JsonParser.h" remove temporally
-#include    "JsonParser.h"
-#include	"hashmap.h"
-#include	"ShareMemory.h"
-#include	"TransactionQueue.h"
-#include    "SystemLogMessage.h"
-#include	"../../Projects/define.h"
-#include 	"ShareMemory.h"
-#include	"SystemLogMessage.h"
-//#include 	"config.h"
-#include 	<sys/socket.h>
-#include 	<netinet/in.h>
-#include 	<stdlib.h>
-/*for sendfile()*/
-#include	<sys/sendfile.h>
- /*for O_RDONLY*/
-#include	<fcntl.h>
-#include	"sqlite3.h"
-#include 	<arpa/inet.h>
-#define _GNU_SOURCE
-#include 	<time.h>
-#include  	"MessageHandler.h"
-#include    <assert.h>
-#include 	<pthread.h>
-
-
-
-
-#define PASS				1
-#define FAIL				-1
-
-#define FALSE 0
-#define TRUE 1       		// Option 1
-
-
-#define ChargingProfile_0_JSON			"chargingprofile_0.json"
-#define ChargingProfile_1_JSON			"chargingprofile_1.json"
-#define ChargingProfile_2_JSON			"chargingprofile_2.json"
-#define AuthorizationCache_JSON			"AuthorizationCache.json"
-#define LocalAuthorizationList_JSON		"LocalAuthorizationList.json"
-
-
-struct SysConfigAndInfo			*ShmSysConfigAndInfo;
-struct StatusCodeData 			*ShmStatusCodeData;
-struct PsuData 					*ShmPsuData ;
-struct OCPP16Data 				*ShmOCPP16Data;
-
-
-/* 		define Macro				 */
-#define SystemLogMessage
-
-/* 		OCPP Message Type			*/
-#define MESSAGE_TYPE_CALL			2
-#define MESSAGE_TYPE_CALLRESULT		3
-#define MESSAGE_TYPE_CALLERROR		4
-
-/*     */
-#define server_cycle_Status		120
-#define MACROSTR(k) #k
-
-extern struct lws 					*wsi_client;
-extern struct lws_context 			*context;
-extern unsigned char *SendBuffer;
-extern int SendBufLen;
-//char guid[37];
-char queuedata[2000];
-static char unknownkey[10][20];
-static int UnknownKeynum = 0;
-static int localversion=0;
-static char idTagAuthorization[32]={};
-char OcppPath[100]={};
-char OcppProtocol[10],OcppHost[50], OcppTempPath[50];
-int OcppPort=0;
-extern map_t hashMap;
-extern data_struct_t* mapItem;
-
-extern char *random_uuid( char buf[37] );
-extern void split(char **arr, char *str, const char *del);
-extern pthread_mutex_t mutex1;
-
-int updateSetting(char *key, char *value);
-int setKeyValue(char *key, char *value);
-int server_sign = FALSE;
-int server_pending = FALSE;
-int authenrequest = FALSE;
-int PRE_SYS_MODE[CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY];
-int BootNotificationInterval = 0;
-
-//number of  Retry times
-int authorizeRetryTimes = 0;
-int isUpdateRequest = FALSE;
-int statusModeChage = FALSE;
-int HeartBeatWaitTime = 10;
-
-
-
-
-
-//Test Variables
-int teststatus =100; //0: enter test ; 100: test
-int testCount= 5;
-int testCountInc = 0;
-
-int UserPlugGun = 0; // user plug gun or not
-
-
-pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
-
-extern struct Charger_Info Charger;
-extern sqlite3 *db;
-
-struct ClientTime
-{
-	unsigned int Heartbeat;
-	unsigned int StatusNotification[CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY];
-	unsigned int StartTransaction;
-	unsigned int StopTransaction;
-	unsigned int MeterValues[CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY];
-
-}clientTime;
-
-typedef union
-{
-	//Operations Initiated by Central System
-	unsigned char CsMsgValue[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
-	struct
-	{
-	//CsMsgValue[0]
-	unsigned char StatusNotificationReq :1;	//bit 0,
-	unsigned char StatusNotificationConf :1;	//bit 0,
-	unsigned char :6;	//bit 2~7
-	}bits[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
-}CpinitiateMsg;
-
-CpinitiateMsg cpinitateMsg;
-
-//==========================================
-// Init all Enumeration & Mapping String
-//==========================================
-/*ChargePointErrorCode*/
-typedef enum {
-	ConnectorLockFailure,
-	EVCommunicationError,
-	GroundFailure,
-	HighTemperature,
-	InternalError,
-	LocalListConflict,
-	NoError,
-	OtherError,
-	OverCurrentFailure,
-	OverVoltage,
-	PowerMeterFailure,
-	PowerSwitchFailure,
-	ReaderFailure,
-	ResetFailure,
-	UnderVoltage,
-	WeakSignal
-} ChargePointErrorCode;
-
-static char *ChargePointErrorCodeStr[] = {
-    MACROSTR(ConnectorLockFailure),
-    MACROSTR(EVCommunicationError),
-	MACROSTR(GroundFailure),
-	MACROSTR(HighTemperature),
-	MACROSTR(InternalError),
-	MACROSTR(LocalListConflict),
-	MACROSTR(NoError),
-	MACROSTR(OtherError),
-	MACROSTR(OverCurrentFailure),
-	MACROSTR(OverVoltage),
-	MACROSTR(PowerMeterFailure),
-	MACROSTR(PowerSwitchFailure),
-	MACROSTR(ReaderFailure),
-	MACROSTR(ResetFailure),
-	MACROSTR(UnderVoltage),
-	MACROSTR(WeakSignal)
-};
-
-/*ChargePointStatus*/
-typedef enum {
-	Available,
-	Preparing,
-	Charging,
-	SuspendedEVSE,
-	SuspendedEV,
-	Finishing,
-	Reserved,
-	Unavailable,
-	Faulted
-}  ChargePointStatus;
-
-static char * ChargePointStatusStr[] = {
-    MACROSTR(Available),
-    MACROSTR(Preparing),
-	MACROSTR(Charging),
-	MACROSTR(SuspendedEVSE),
-	MACROSTR(SuspendedEV),
-	MACROSTR(Finishing),
-	MACROSTR(Reserved),
-	MACROSTR(Unavailable),
-	MACROSTR(Faulted)
-};
-
-/*AvailabilityType*/
-typedef enum {
-	RegistrationStatus_Accepted,
-	RegistrationStatus_Pending,
-	RegistrationStatus_Rejected
-} RegistrationStatus;
-
-static char *RegistrationStatusStr[] = {
-    MACROSTR(Accepted),
-    MACROSTR(Pending),
-	MACROSTR(Rejected)
-};
-
-/*AvailabilityType*/
-typedef enum {
-	Inoperative,
-	Operative
-} AvailabilityType;
-
-static char *AvailabilityTypeStr[] = {
-    MACROSTR(Inoperative),
-    MACROSTR(Operative)
-};
-
-/*AvailabilityStatus*/
-typedef enum {
-	Accepted,
-	Rejected,
-	Scheduled
-}  AvailabilityStatus;
-
-static char *AvailabilityStatusStr[] = {
-    MACROSTR(Accepted),
-    MACROSTR(Rejected),
-	MACROSTR(Scheduled)
-};
-
-/*ConfigurationStatus*/
-typedef enum {
-	ConfigurationStatus_Accepted,
-	ConfigurationStatus_Rejected,
-	RebootRequired,
-	NotSupported
-}  ConfigurationStatus;
-
-static char *ConfigurationStatusStr[] = {
-    MACROSTR(Accepted),
-    MACROSTR(Rejected),
-	MACROSTR(RebootRequired),
-	MACROSTR(NotSupported)
-};
-
-/*ClearCacheStatus*/
-typedef enum {
-	ClearCacheStatus_Accepted,
-	ClearCacheStatus_Rejected
-}  ClearCacheStatus;
-
-static char *ClearCacheStatusStr[] = {
-    MACROSTR(Accepted),
-    MACROSTR(Rejected)
-};
-
-/*ChargingProfilePurposeType*/
-typedef enum {
-	ChargePointMaxProfile,
-	TxDefaultProfile,
-	TxProfile
-}  ChargingProfilePurposeType;
-
-static char *ChargingProfilePurposeTypeStr[] = {
-    MACROSTR(ChargePointMaxProfile),
-    MACROSTR(TxDefaultProfile),
-	MACROSTR(TxProfile)
-};
-
-/*ChargingProfileStatus*/
-typedef enum {
-	ChargingProfileStatus_Accepted,
-	ChargingProfileStatus_Rejected,
-	ChargingProfileStatus_NotSupported
-}  ChargingProfileStatus;
-
-static char *ChargingProfileStatusStr[] = {
-    MACROSTR(Accepted),
-    MACROSTR(Rejected),
-	MACROSTR(NotSupported)
-};
-
-/*ClearChargingProfileStatus*/
-typedef enum {
-	ClearChargingProfileStatus_Accepted,
-	ClearChargingProfileStatus_Unknown
-}  ClearChargingProfileStatus;
-
-static char *ClearChargingProfileStatusStr[] = {
-    MACROSTR(Accepted),
-    MACROSTR(Unknown)
-};
-
-/*GetCompositeScheduleStatus*/
-typedef enum {
-	GetCompositeScheduleStatus_Accepted,
-	GetCompositeScheduleStatus_Rejected
-}  GetCompositeScheduleStatus;
-
-
-static char *GetCompositeScheduleStatusStr[] = {
-    MACROSTR(Accepted),
-    MACROSTR(Rejected)
-};
-
-/*ChargingRateUnitType*/
-typedef enum {
-	ChargingRateUnitType_W,
-	ChargingRateUnitType_A
-}  ChargingRateUnitType;
-
-
-static char *ChargingRateUnitTypeStr[] = {
-    MACROSTR(W),
-    MACROSTR(A)
-};
-
-/*AuthorizationStatus*/
-typedef enum {
-	AuthorizationStatus_Accepted ,
-	AuthorizationStatus_Blocked ,
-	AuthorizationStatus_Expired ,
-	AuthorizationStatus_Invalid ,
-	AuthorizationStatus_ConcurrentTx
-}  AuthorizationStatus;
-
-
-static char *AuthorizationStatusStr[] = {
-    MACROSTR(Accepted),
-    MACROSTR(Blocked),
-	MACROSTR(Expired),
-	MACROSTR(Invalid),
-	MACROSTR(ConcurrentTx)
-};
-
-/*UpdateType*/
-typedef enum {
-	Differential  ,
-	Full
-}  UpdateType;
-
-static char *UpdateTypeStr[] = {
-    MACROSTR(Differential),
-    MACROSTR(Full)
-};
-
-/*UpdateStatus*/
-typedef enum {
-	UpdateStatus_Accepted   ,
-	UpdateStatus_Failed ,
-	UpdateStatus_NotSupported ,
-	UpdateStatus_VersionMismatch
-}  UpdateStatus;
-
-static char *UpdateStatusStr[] = {
-    MACROSTR(Accepted),
-    MACROSTR(Failed),
-	MACROSTR(NotSupported),
-	MACROSTR(VersionMismatch)
-};
-
-/*RemoteStartStopStatus*/
-typedef enum {
-	RemoteStartStopStatus_Accepted,
-	RemoteStartStopStatus_Rejected
-
-}  RemoteStartStopStatus;
-
-
-static char *RemoteStartStopStatusStr[] = {
-    MACROSTR(Accepted),
-    MACROSTR(Rejected)
-
-};
-
-/*ReservationStatus*/
-typedef enum {
-	ReservationStatus_Accepted,
-	ReservationStatus_Faulted,
-	ReservationStatus_Occupied,
-	ReservationStatus_Rejected,
-	ReservationStatus_Unavailable
-
-}  ReservationStatus;
-
-static char *ReservationStatusStr[] = {
-    MACROSTR(Accepted),
-    MACROSTR(Faulted),
-	MACROSTR(Occupied),
-	MACROSTR(Rejected),
-	MACROSTR(Unavailable)
-};
-
-/*ResetType*/
-typedef enum {
-	Hard,
-	Soft
-}  ResetType;
-
-
-static char *ResetTypeStr[] = {
-    MACROSTR(Hard),
-    MACROSTR(Soft)
-};
-
-
-/*ResetStatus*/
-typedef enum {
-	ResetStatus_Accepted,
-	ResetStatus_Rejected
-}  ResetStatus;
-
-
-static char *ResetStatusStr[] = {
-    MACROSTR(Accepted),
-    MACROSTR(Rejected)
-};
-
-/*DiagnosticsStatus*/
-typedef enum {
-	DiagnosticsStatus_Idle,
-	DiagnosticsStatus_Uploaded,
-	DiagnosticsStatus_UploadFailed,
-	DiagnosticsStatus_Uploading
-}  DiagnosticsStatus;
-
-
-static char * DiagnosticsStatusStr[] = {
-    MACROSTR(Idle),
-    MACROSTR(Uploaded),
-	MACROSTR(UploadFailed),
-	MACROSTR(Uploading)
-};
-
-/*FirmwareStatus*/
-typedef enum {
-	FirmwareStatus_Downloaded,
-	FirmwareStatus_DownloadFailed,
-	FirmwareStatus_Downloading,
-	FirmwareStatus_Idle,
-	FirmwareStatus_InstallationFailed,
-	FirmwareStatus_Installing,
-	FirmwareStatus_Installed
-}  FirmwareStatus;
-
-
-static char * FirmwareStatusStr[] = {
-    MACROSTR(Downloaded),
-    MACROSTR(DownloadFailed),
-	MACROSTR(Downloading),
-	MACROSTR(Idle),
-	MACROSTR(InstallationFailed),
-	MACROSTR(Installing),
-	MACROSTR(Installed)
-};
-
-
-/*MessageTrigger*/
-typedef enum {
-	BootNotification,
-	DiagnosticsStatusNotification,
-	FirmwareStatusNotification,
-	Heartbeat,
-	MeterValues,
-	StatusNotification
-}   MessageTrigger;
-
-
-static char * MessageTriggerStr[] = {
-    MACROSTR(BootNotification),
-    MACROSTR(DiagnosticsStatusNotification),
-	MACROSTR(FirmwareStatusNotification),
-	MACROSTR(Heartbeat),
-	MACROSTR(MeterValues),
-	MACROSTR(StatusNotification)
-};
-
-
-/*TriggerMessageStatus*/
-typedef enum {
-	TriggerMessageStatus_Accepted ,
-	TriggerMessageStatus_Rejected ,
-	TriggerMessageStatus_NotImplemented
-}   TriggerMessageStatus;
-
-
-static char * TriggerMessageStatusStr[] = {
-    MACROSTR(Accepted),
-    MACROSTR(Rejected),
-	MACROSTR(NotImplemented)
-};
-
-
-/*UnlockStatus*/
-typedef enum {
-	Unlocked,
-	UnlockFailed,
-	UnlockStatus_NotSupported
-}   UnlockStatus;
-
-
-static char * UnlockStatusStr[] = {
-    MACROSTR(Unlocked),
-    MACROSTR(UnlockFailed),
-	MACROSTR(NotSupported)
-};
-
-/*StopTransactionReason*/
-typedef enum {
-	EmergencyStop,
-	EVDisconnected,
-	HardReset,
-	Local,
-	Other,
-	PowerLoss,
-	Reboot,
-	Remote,
-	SoftReset,
-	UnlockCommand,
-	DeAuthorized
-}   StopTransactionReason;
-
-static char * StopTransactionReasonStr[] = {
-    MACROSTR(EmergencyStop),
-    MACROSTR(EVDisconnected),
-	MACROSTR(HardReset),
-	MACROSTR(Local),
-	MACROSTR(Other),
-	MACROSTR(PowerLoss),
-	MACROSTR(Reboot),
-	MACROSTR(Remote),
-	MACROSTR(SoftReset),
-	MACROSTR(UnlockCommand),
-	MACROSTR(DeAuthorized)
-};
-
-/*CancelReservationStatus*/
-typedef enum {
-	CancelReservationStatus_Accepted,
-	CancelReservationStatus_Rejected
-}   CancelReservationStatus;
-
-static char * CancelReservationStatusStr[] = {
-    MACROSTR(Accepted),
-	MACROSTR(Rejected)
-};
-
-/*ReadingContext*/
-typedef enum {
-	ReadingContext_Interruption_Begin,
-	ReadingContext_Interruption_End,
-	ReadingContext_Other,
-	ReadingContext_Sample_Clock,
-	ReadingContext_Sample_Periodic ,
-	ReadingContext_Transaction_Begin ,
-	ReadingContext_Transaction_End,
-	ReadingContext_Trigger
-}  ReadingContext;
-
-
-static char * ReadingContextStr[] = {
-    MACROSTR(Interruption.Begin),
-	MACROSTR(Interruption.End),
-	MACROSTR(Other),
-	MACROSTR(Sample.Clock),
-	MACROSTR(Sample.Periodic),
-	MACROSTR(Transaction.Begin),
-	MACROSTR(Transaction.End),
-	MACROSTR(Trigger)
-};
-
-
-/*ValueFormat*/
-typedef enum {
-	Raw,
-	SignedData
-}  ValueFormat;
-
-
-static char * ValueFormatStr[] = {
-    MACROSTR(Raw),
-	MACROSTR(SignedData)
-};
-
-
-/*Measurand*/
-typedef enum {
-	Current_Export ,
-	Current_Import,
-	Current_Offered,
-	Energy_Active_Export_Register,
-	Energy_Active_Import_Register,
-	Energy_Reactive_Export_Register,
-	Energy_Reactive_Import_Register,
-	Energy_Active_Export_Interval,
-	Energy_Active_Import_Interval,
-	Energy_Reactive_Export_Interval,
-	Energy_Reactive_Import_Interval,
-	Frequency,
-	Power_Active_Export ,
-	Power_Active_Import,
-	Power_Factor,
-	Power_Offered,
-	Power_Reactive_Export,
-	Power_Reactive_Import,
-	RPM,
-	SoC,
-	Temperature ,
-	Voltage
-}  Measurand;
-
-
-static char * MeasurandStr[] = {
-    MACROSTR(Current.Export),
-	MACROSTR(Current.Import),
-	MACROSTR(Current.Offered),
-	MACROSTR(Energy.Active.Export.Register),
-	MACROSTR(Energy.Active.Import.Register),
-	MACROSTR(Energy.Reactive.Export.Register),
-	MACROSTR(Energy.Reactive.Import.Register),
-	MACROSTR(Energy.Active.Export.Interval),
-	MACROSTR(Energy.Active.Import.Interval),
-	MACROSTR(Energy.Reactive.Export.Interval),
-	MACROSTR(Energy.Reactive.Import.Interval),
-	MACROSTR(Frequency),
-	MACROSTR(Power.Active.Export),
-	MACROSTR(Power.Active.Import),
-	MACROSTR(Power.Factor),
-	MACROSTR(Power.Offered),
-	MACROSTR(Power.Reactive.ExportMACROSTR),
-	MACROSTR(Power.Reactive.Import),
-	MACROSTR(RPM),
-	MACROSTR(SoC),
-	MACROSTR(Temperature),
-	MACROSTR(Voltage)
-};
-
-
-/*Location*/
-typedef enum {
-	Location_Body,
-	Location_Cable,
-	Location_EV,
-	Location_Inlet ,
-	Location_Outlet
-}  Location;
-
-
-static char * LocationStr[] = {
-    MACROSTR(Body),
-	MACROSTR(Cable),
-	MACROSTR(EV),
-	MACROSTR(Inlet),
-	MACROSTR(Outlet)
-};
-
-
-/*Phase*/
-typedef enum {
-	L1,
-	L2,
-	L3,
-	N,
-	L1_N,
-	L2_N,
-	L3_N,
-	L1_L2,
-	L2_L3,
-	L3_L1
-}  Phase;
-
-
-static char * PhaseStr[] = {
-    MACROSTR(L1),
-	MACROSTR(L2),
-	MACROSTR(L3),
-	MACROSTR(N),
-	MACROSTR(L1-N),
-	MACROSTR(L2-N),
-	MACROSTR(L3-N),
-	MACROSTR(L1-L2),
-	MACROSTR(L2-L3),
-	MACROSTR(L3-L1)
-};
-
-
-/*UnitOfMeasure*/
-typedef enum {
-	UnitOfMeasure_Wh,
-	UnitOfMeasure_kWh ,
-	UnitOfMeasure_varh ,
-	UnitOfMeasure_kvarh ,
-	UnitOfMeasure_W ,
-	UnitOfMeasure_kW ,
-	UnitOfMeasure_VA ,
-	UnitOfMeasure_kVA ,
-	UnitOfMeasure_var ,
-	UnitOfMeasure_kvar ,
-	UnitOfMeasure_A ,
-	UnitOfMeasure_V ,
-	UnitOfMeasure_Celsius ,
-	UnitOfMeasure_Fahrenheit ,
-	UnitOfMeasure_K ,
-	UnitOfMeasure_Percent
-
-}  UnitOfMeasure;
-
-
-static char * UnitOfMeasureStr[] = {
-	MACROSTR(Wh),
-	MACROSTR(kWh),
-	MACROSTR(varh),
-	MACROSTR(kvarh),
-	MACROSTR(W),
-	MACROSTR(kW),
-	MACROSTR(VA),
-	MACROSTR(kVA),
-	MACROSTR(var),
-	MACROSTR(kvar),
-	MACROSTR(A),
-	MACROSTR(V),
-	MACROSTR(Celsius),
-	MACROSTR(Fahrenheit),
-	MACROSTR(K),
-	MACROSTR(Percent)
-};
-
-
-/*Configuration enum*/
-enum CoreProfile {
-	 AllowOfflineTxForUnknownId=0,
-	 AuthorizationCacheEnabled,
-	 AuthorizeRemoteTxRequests,
-	 BlinkRepeat,
-	 ClockAlignedDataInterval,
-	 ConnectionTimeOut,
-	 GetConfigurationMaxKeys,
-	 HeartbeatInterval,
-	 LightIntensity,
-	 LocalAuthorizeOffline,
-	 LocalPreAuthorize,
-	 MaxEnergyOnInvalidId,
-	 MeterValuesAlignedData,
-	 MeterValuesAlignedDataMaxLength,
-	 MeterValuesSampledData,
-	 MeterValuesSampledDataMaxLength,
-	 MeterValueSampleInterval,
-	 MinimumStatusDuration,
-	 NumberOfConnectors,
-	 ResetRetries,
-	 ConnectorPhaseRotation,
-	 ConnectorPhaseRotationMaxLength,
-	 StopTransactionOnEVSideDisconnect,
-	 StopTransactionOnInvalidId,
-	 StopTxnAlignedData,
-	 StopTxnAlignedDataMaxLength,
-	 StopTxnSampledData,
-	 StopTxnSampledDataMaxLength,
-	 SupportedFeatureProfiles,
-	 SupportedFeatureProfilesMaxLength,
-	 TransactionMessageAttempts,
-	 TransactionMessageRetryInterval,
-	 UnlockConnectorOnEVSideDisconnect,
-	 WebSocketPingInterval,
-	 _CoreProfile_CNT
-};
-
-enum LocalAuthListManagementProfile{
-	LocalAuthListEnabled=0,
-	LocalAuthListMaxLength,
-	SendLocalListMaxLength,
-	_LocalAuthListManagementProfile_CNT
-};
-
-enum ReservationProfile{
-	ReserveConnectorZeroSupported
-};
-
-enum SmartChargingProfile{
-	ChargeProfileMaxStackLevel,
-	ChargingScheduleAllowedChargingRateUnit,
-	ChargingScheduleMaxPeriods,
-	ConnectorSwitch3to1PhaseSupported,
-	MaxChargingProfilesInstalled
-};
-
-enum ChargerSystemStatus{
-	ChargerSystemStatus_Booting,
-	ChargerSystemStatus_Idle,
-	ChargerSystemStatus_Authorizing,
-	ChargerSystemStatus_Preparing,
-	ChargerSystemStatus_Charging,
-	ChargerSystemStatus_Terminating,
-	ChargerSystemStatus_Alarm,
-	ChargerSystemStatus_Fault
-};
-
-enum GetConfigurationKey {
-	GetConfiguration_AllowOfflineTxForUnknownId=0,
-	GetConfiguration_AuthorizationCacheEnabled,
-	GetConfiguration_AuthorizeRemoteTxRequests,
-	GetConfiguration_BlinkRepeat,
-	GetConfiguration_ClockAlignedDataInterval,
-	GetConfiguration_ConnectionTimeOut,
-	GetConfiguration_GetConfigurationMaxKeys,
-	GetConfiguration_HeartbeatInterval,
-	GetConfiguration_LightIntensity,
-	GetConfiguration_LocalAuthorizeOffline,
-	GetConfiguration_LocalPreAuthorize,
-	GetConfiguration_MaxEnergyOnInvalidId,
-	GetConfiguration_MeterValuesAlignedData,
-	GetConfiguration_MeterValuesAlignedDataMaxLength,
-	GetConfiguration_MeterValuesSampledData,
-	GetConfiguration_MeterValuesSampledDataMaxLength,
-	GetConfiguration_MeterValueSampleInterval,
-	GetConfiguration_MinimumStatusDuration,
-	GetConfiguration_NumberOfConnectors,
-	GetConfiguration_ResetRetries,
-	GetConfiguration_ConnectorPhaseRotation,
-	GetConfiguration_ConnectorPhaseRotationMaxLength,
-	GetConfiguration_StopTransactionOnEVSideDisconnect,
-	GetConfiguration_StopTransactionOnInvalidId,
-	GetConfiguration_StopTxnAlignedData,
-	GetConfiguration_StopTxnAlignedDataMaxLength,
-	GetConfiguration_StopTxnSampledData,
-	GetConfiguration_StopTxnSampledDataMaxLength,
-	GetConfiguration_SupportedFeatureProfiles,
-	GetConfiguration_SupportedFeatureProfilesMaxLength,
-	GetConfiguration_TransactionMessageAttempts,
-	GetConfiguration_TransactionMessageRetryInterval,
-	GetConfiguration_UnlockConnectorOnEVSideDisconnect,
-	GetConfiguration_WebSocketPingInterval,
-	GetConfiguration_LocalAuthListEnabled,
-	GetConfiguration_LocalAuthListMaxLength,
-	GetConfiguration_SendLocalListMaxLength,
-	GetConfiguration_ReserveConnectorZeroSupported,
-	GetConfiguration_ChargeProfileMaxStackLevel,
-	GetConfiguration_ChargingScheduleAllowedChargingRateUnit,
-	GetConfiguration_ChargingScheduleMaxPeriods,
-	GetConfiguration_ConnectorSwitch3to1PhaseSupported,
-	GetConfiguration_MaxChargingProfilesInstalled,
-};
-
-//==========================================
-// Init all share memory
-//==========================================
-
-int InitShareMemory()
-{
-	int result = PASS;
-	int MeterSMId;
-
-	printf("1\n");
-
-	//creat ShmSysConfigAndInfo
-	if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo),  0777)) < 0)
-    {
-		#ifdef SystemLogMessage
-		DEBUG_ERROR("shmget ShmSysConfigAndInfo NG\n");
-		#endif
-		result = FAIL;
-	}
-    else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
-    {
-    	#ifdef SystemLogMessage
-    	DEBUG_ERROR("shmat ShmSysConfigAndInfo NG\n");
-		#endif
-    	result = FAIL;
-   	 }
-    else
-    {}
-	printf("2\n");
-   	//creat ShmStatusCodeData
-   	if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData),  0777)) < 0)
-    {
-		#ifdef SystemLogMessage
-   		DEBUG_ERROR("shmget ShmStatusCodeData NG\n");
-		#endif
-   		result = FAIL;
-	}
-    else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
-    {
-    	#ifdef SystemLogMessage
-    	DEBUG_ERROR("shmat ShmStatusCodeData NG\n");
-		#endif
-    	result = FAIL;
-   	}
-    else
-    {}
-   	printf("3\n");
-
-
-	//creat ShmPsuData
-   	if ((MeterSMId = shmget(ShmPsuKey, sizeof(struct PsuData), 0777)) < 0)
-    {
-		#ifdef SystemLogMessage
-   		DEBUG_ERROR("shmget ShmPsuData NG\n");
-		#endif
-   		result = FAIL;
-	}
-    else if ((ShmPsuData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
-    {
-    	#ifdef SystemLogMessage
-    	DEBUG_ERROR("shmat ShmPsuData NG\n");
-		#endif
-    	result = FAIL;
-   	}
-    else
-    {}
-
-
-   	printf("4\n");
-
-   	//creat ShmOCPP16Data
-   	if ((MeterSMId = shmget(ShmOcppModuleKey, sizeof(struct OCPP16Data),  0777)) < 0)
-	{
-		#ifdef SystemLogMessage
-		DEBUG_ERROR("shmget ShmOCPP16Data NG");
-		#endif
-		result = FAIL;
-	}
-	else if ((ShmOCPP16Data = shmat(MeterSMId, NULL, 0)) == (void *) -1)
-	{
-		#ifdef SystemLogMessage
-		DEBUG_ERROR("shmat ShmOCPP16Data NG");
-		#endif
-		result = FAIL;
-	}
-	else
-	{}
-
-   	printf("5\n");
-	//memset(ShmOCPP16Data,0,sizeof(struct OCPP16Data));
-
-    /****************************** For TEST ************************************************/
-	//strcpy(ShmOCPP16Data->OcppServerURL,"172.17.40.13");
-	//strcpy(ShmOCPP16Data->ChargeBoxId,"RDTEST103");
-
-
-
-	//inital settings
-#if 0 // For Test
-	sprintf(ShmOCPP16Data->BootNotification.CbSN, "");
-	sprintf(ShmOCPP16Data->BootNotification.CpModel, "EA873E3EF8P1");
-	sprintf(ShmOCPP16Data->BootNotification.CpSN, "RDTEST103");
-	sprintf(ShmOCPP16Data->BootNotification.CpVendor, "Phihong Technology");
-	sprintf(ShmOCPP16Data->BootNotification.CpFwVersion, "D0.13.50.0087.PH");
-	sprintf(ShmOCPP16Data->BootNotification.CpIccid, "");
-	sprintf(ShmOCPP16Data->BootNotification.CpImsi,"");
-	sprintf(ShmOCPP16Data->BootNotification.CpMeterSerialNumber,"N/A");
-	sprintf(ShmOCPP16Data->BootNotification.CpMeterType,"AC");
-
-
-	memset(ShmOCPP16Data->StatusNotification,0,sizeof(struct StructStatusNotification)*(CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY));
-	for(int gun_index=0; gun_index < (CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY); gun_index++ )
-	{
-		cpinitateMsg.bits[gun_index].StatusNotificationReq = 0;
-		cpinitateMsg.bits[gun_index].StatusNotificationConf = 0;
-
-
-		//allocate memory
-		if(ShmOCPP16Data->StopTransaction[gun_index].TransactionData == NULL)
-		{
-			ShmOCPP16Data->StopTransaction[gun_index].TransactionData  = (struct StructMeterValue *)malloc(sizeof(struct StructMeterValue));
-
-		}
-
-		if(ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue == NULL)
-		{
-			ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue = (struct StructSampledValue *)malloc(sizeof(struct StructSampledValue)*5);
-
-		}
-
-
-		ShmOCPP16Data->StatusNotification[gun_index].ConnectorId = (gun_index + 1);
-		strcpy(ShmOCPP16Data->StatusNotification[gun_index].ErrorCode, "NoError");
-		strcpy(ShmOCPP16Data->StatusNotification[gun_index].Info, "N/A");
-		strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, "Available");
-		strcpy(ShmOCPP16Data->StatusNotification[gun_index].Timestamp, "2019-05-04T18:15:33Z");
-		strcpy(ShmOCPP16Data->StatusNotification[gun_index].VendorId, "PhihongTechnology");
-		strcpy(ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode, "000000");
-
-		clientTime.MeterValues[gun_index] = time((time_t*)NULL);
-	}
-	printf("6\n");
-//	strcpy(ShmOCPP16Data->Authorize.IdTag,"PaHdImHiOnNG");
-//	ShmOCPP16Data->CpMsg.bits[0].StartTransactionReq = 1;
-
-
-	//Authorize
-	//memset(ShmSysConfigAndInfo, 0, sizeof(struct SysConfigAndInfo));
-	//strcpy(ShmSysConfigAndInfo->SysConfig.UserId, "B014EA9C");
-
-
-	//gun index
-#if 0
-	ShmSysConfigAndInfo->SysInfo.ChademoChargingData[0].Index = 0;
-	ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].Index = 1;
-	ShmSysConfigAndInfo->SysInfo.GbChargingData[0].Index = 2;
-#endif
-
-	//Chademo
-	ShmSysConfigAndInfo->SysInfo.ChademoChargingData[0].SystemStatus =1; //idle
-	ShmSysConfigAndInfo->SysInfo.ChademoChargingData[0].PreviousSystemStatus = 1;
-	cpinitateMsg.bits[0].StatusNotificationReq = 1;
-#endif
-	printf("7\n");
-	// Charger PRE_SYS_MODE
-	memset(PRE_SYS_MODE, 0, sizeof(PRE_SYS_MODE));
-
-	memset( (void *)unknownkey, 0, sizeof(char)*10*20 );
-
-	clientTime.Heartbeat=time((time_t*)NULL);
-
-	for(int gun_index=0;gun_index < (CHAdeMO_QUANTITY/*+ CCS_QUANTITY + GB_QUANTITY*/) ;gun_index++)
-	{
-		clientTime.StatusNotification[gun_index] = time((time_t*)NULL);
-		clientTime.MeterValues[gun_index] = time((time_t*)NULL);
-	}
-
-
-	printf("8\n");
-	HeartBeatWaitTime = 10;
-
-	ShmOCPP16Data->GetConfiguration.ResponseUnknownKey = NULL;
-	ShmOCPP16Data->SendLocalList.LocalAuthorizationList = NULL;
-
-
-	//memset(unknownkey, 0, 10);
-    return result;
-}
-
-
-int ProcessShareMemory()
-{
-	if(InitShareMemory() == FAIL)
-	{
-		#ifdef SystemLogMessage
-		DEBUG_ERROR("InitShareMemory NG\n");
-		#endif
-		if(ShmStatusCodeData!=NULL)
-		{
-			ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=1;
-		}
-		sleep(5);
-		return FAIL;
-	}
-	return PASS;
-}
-
-void CheckSystemValue(void)
-{
-	printf("CheckSystemValue \n");
-	int meterValueSend=0;
-	int IdleModeCnt = 0;
-
-	if((server_sign == TRUE) && (difftime(time((time_t*)NULL), clientTime.Heartbeat) >= HeartBeatWaitTime)/*((time((time_t*)NULL)-clientTime.Heartbeat)>= ShmOCPP16Data->BootNotification.ResponseHeartbeatInterval)*/)
-	{
-		//parameter for test
-		sendHeartbeatRequest(0);
-
-		//==============================================
-		// Reset Waiting Time
-		//==============================================
-		clientTime.Heartbeat=time((time_t*)NULL);
-
-	}
-
-	//==============================================
-	// Update request
-	//==============================================
-	if(isUpdateRequest == TRUE )
-	{
-		for(int gun_index=0;gun_index < (CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY) ;gun_index++)
-		{
-			//check SystemStatus // 0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault
-			for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-			{
-				if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 1)) //S_IDLE
-				{
-					IdleModeCnt = IdleModeCnt + 1;
-				}
-			}
-
-			for (int index = 0; index < CCS_QUANTITY; index++)
-			{
-				if ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 1)) //S_IDLE
-				{
-					IdleModeCnt = IdleModeCnt + 1;
-				}
-			}
-
-			for (int index = 0; index < GB_QUANTITY; index++)
-			{
-				if ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 1)) //S_IDLE
-				{
-					IdleModeCnt = IdleModeCnt + 1;
-				}
-			}
-
-		}
-
-
-		if(IdleModeCnt == (CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY ))
-		{
-			sendFirmwareStatusNotificationRequest(FirmwareStatusStr[FirmwareStatus_Installed]);
-			isUpdateRequest = FALSE;
-		    ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq = 1; // trigger firmware upgrade
-		}
-
-	}
-
-	printf("gun no %d\n",(CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY));
-	for(int gun_index=0;gun_index < (CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY ) ;gun_index++)
-	{
-
-	if((server_sign == TRUE) && (ShmOCPP16Data->SpMsg.bits.AuthorizeReq == 1)&&(authorizeRetryTimes < 3)/*authenrequest == FALSE*/)
-	{
-		sendAuthorizeRequest(0);
-
-		authorizeRetryTimes = authorizeRetryTimes + 1;
-		/* authenrequest = TRUE; */
-		if(authorizeRetryTimes < 3)
-		ShmOCPP16Data->SpMsg.bits.AuthorizeReq = 0;
-
-#if 0
-		//Test Variables
-		UserPlugGun = 1;
-		teststatus = 0;
-#endif
-	}
-	else if((server_sign == TRUE) && (ShmOCPP16Data->SpMsg.bits.AuthorizeReq == 1)&&(authorizeRetryTimes >= 3))
-	{
-		authorizeRetryTimes = 0;
-		ShmOCPP16Data->OcppConnStatus = 0;  // ocpp offline
-	}
-
-
-#if 1
-		//==============================================
-		// Charger start transaction
-		//==============================================
-		if((server_sign == TRUE) && (ShmOCPP16Data->CpMsg.bits[gun_index].StartTransactionReq == 1))
-		{
-#if 0 // for test
-			 if(teststatus == 0)
-			 {
-#endif
-				 sendStartTransactionRequest(gun_index);
-				 ShmOCPP16Data->CpMsg.bits[gun_index].StartTransactionReq =0;
-
-				 clientTime.StartTransaction = time((time_t*)NULL);
-#if 0// for test
-				 teststatus = 1; // finish startTransaction
-			 }
-#endif
-
-	    }
-
-		//==============================================
-		// Charger stop transaction
-		//==============================================
-
-		if((server_sign == TRUE) && ((ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq == 1)))
-		{
-#if 0 // for test
-			if(teststatus == 2)
-		   {
-#endif
-			  sendStopTransactionRequest(gun_index);
-			  ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq =0;
-			  clientTime.StopTransaction = time((time_t*)NULL);
-#if 0// for test
-			  teststatus = 100;
-
-		   }
-#endif
-
-		}
-
-
-		//==============================================
-		// Charger status report
-		//==============================================
-		/* Check Mode Change */
-		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)
-			{
-				printf("Chademo Mode status:\n");
-					//printf("ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus: %c\n",ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus);
-					//printf("ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PreviousSystemStatus: %c\n",ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PreviousSystemStatus);
-
-				if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PreviousSystemStatus/*PRE_SYS_MODE[gun_index]*/ )
-				{
-					printf("Chademo Mode Change\n");
-					PRE_SYS_MODE[gun_index] = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus;
-					ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PreviousSystemStatus = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus;
-					cpinitateMsg.bits[gun_index].StatusNotificationReq = 1;
-					statusModeChage = TRUE;
-
-				}
-
-			}
-		}
-
-		for (int index = 0; index < CCS_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)
-			{
-				if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PreviousSystemStatus/*PRE_SYS_MODE[gun_index]*/ )
-				{
-					printf("Ccs Mode Change\n");
-					PRE_SYS_MODE[gun_index] = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus;
-					ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PreviousSystemStatus = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus;
-					cpinitateMsg.bits[gun_index].StatusNotificationReq = 1;
-					statusModeChage = TRUE;
-				}
-
-			}
-		}
-
-		for (int index = 0; index < GB_QUANTITY; index++)
-		{
-			if ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)/*&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == '4')*/)
-			{
-				if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PreviousSystemStatus/*PRE_SYS_MODE[gun_index]*/ )
-				{
-					printf("Gb Mode Change\n");
-					PRE_SYS_MODE[gun_index] = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus;
-					ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PreviousSystemStatus = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus;
-					cpinitateMsg.bits[gun_index].StatusNotificationReq = 1;
-					statusModeChage = TRUE;
-				}
-
-			}
-		}
-
-
-		if((server_sign == TRUE) && ((statusModeChage == TRUE)||((time((time_t*)NULL)-clientTime.StatusNotification[gun_index]) > server_cycle_Status)|| ((cpinitateMsg.bits[gun_index].StatusNotificationReq == 1)&&((time((time_t*)NULL)-clientTime.StatusNotification[gun_index]) > 30))))
-		{
-			sendStatusNotificationRequest(gun_index);
-			clientTime.StatusNotification[gun_index] = time((time_t*)NULL);
-			cpinitateMsg.bits[gun_index].StatusNotificationReq = 0;
-			statusModeChage = FALSE;
-	     }
-
-		printf("(time((time_t*)NULL) - clientTime.MeterValues[gun_index])=%d\n",(time((time_t*)NULL) - clientTime.MeterValues[gun_index]));
-		printf("atoi(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemData))=%d\n",atoi(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemData)/1000);
-		printf("ShmSysConfigAndInfo->SysInfo.ChademoChargingData[0].SystemStatus = %d \n",(int)(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[0].SystemStatus));
-		printf("gun_index=%d\n",gun_index);
-		//==============================================
-		// Meter report
-		//==============================================
-		if((server_sign == TRUE) &&  ((time((time_t*)NULL) - clientTime.MeterValues[gun_index])> atoi(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemData)/1000 ) )
-		{
-			//check Transaction active
-			for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-			{
-				// 0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault
-				if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 8))
-				{
-					meterValueSend =1;
-				}
-			}
-
-			for (int index = 0; index < CCS_QUANTITY; index++)
-			{
-				// 0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault
-				if ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 8))
-				{
-					meterValueSend =1;
-				}
-			}
-
-			for (int index = 0; index < GB_QUANTITY; index++)
-			{
-				// 0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault
-				if ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 8))
-				{
-					meterValueSend =1;
-				}
-			}
-
-            printf("sendMeterValuesRequest \n");
-	//		if(meterValueSend == 1)
-#if 0 // for test
-            if((teststatus == 1) && (testCountInc <= testCount))
-			{
-#endif
-            	sleep(1); //?��?1�
-            	if(meterValueSend == 1)
-				sendMeterValuesRequest(gun_index);
-#if 0  //for test
-				testCountInc  = testCountInc + 1;
-				printf("testCountInc=%d\n",testCountInc);
-
-			}
-            else if((meterValueSend == 1) && (testCountInc > testCount))
-            {
-            	teststatus = 2;
-            	meterValueSend = 0;
-            	testCountInc = 0;
-            	ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq = 1;
-            }
-#endif
-			clientTime.MeterValues[gun_index] = time((time_t*)NULL);
-		}
-
-
-
-#endif
-
-		//==============================================
-		// Check Connector reserved
-		//==============================================
-
-
-		/*
-		enum _SYSTEM_STATUS
-		{
-			S_BOOTING = 0,
-			S_IDLE,                      =1
-			S_AUTHORIZING,               =2
-			S_REASSIGN_CHECK,            =3
-			S_REASSIGN,                  =4
-			S_PRECHARGE,                 =5
-			S_PREPARING_FOR_EV,          =6
-			S_PREPARING_FOR_EVSE,        =7
-			S_CHARGING,                  =8
-			S_TERMINATING,               =9
-			S_COMPLETE,                  =10
-			S_ALARM,                     =11
-			S_FAULT                      =12
-		};
-
-		*/
-
-		printf("ShmOCPP16Data->ReserveNow[gun_index].ExpiryDate=%s\n",ShmOCPP16Data->ReserveNow[gun_index].ExpiryDate);
-		if((server_sign == TRUE) && (strcmp(ShmOCPP16Data->ReserveNow[gun_index].ExpiryDate, "") != 0) )
-		{
-			double diff_t;
-			struct tm tp;
-			// current time
-			time_t t = time(NULL);
-			sprintf((char *)ShmOCPP16Data->ReserveNow[gun_index].ExpiryDate, "%s", "2018-09-20T02:56:54.973Z");
-			printf("ExpiryDate : %s\n", (char *)ShmOCPP16Data->ReserveNow[gun_index].ExpiryDate);
-			strptime((char *)ShmOCPP16Data->ReserveNow[gun_index].ExpiryDate, "%Y-%m-%dT%H:%M:%S", &tp);
-			printf("handle  check value 1\n");
-			tp.tm_isdst = -1;
-			printf("handle  check value 2\n");
-			time_t utc = mktime(&tp);
-			printf("handle  check value 3\n");
-			struct tm e0 = { .tm_year = tp.tm_year, .tm_mday = tp.tm_mday, .tm_mon = tp.tm_mon, .tm_hour = tp.tm_hour, .tm_isdst = -1 };
-			time_t pseudo = mktime(&e0);
-			struct tm e1 = *gmtime(&pseudo);
-			e0.tm_sec += utc - diff_tm(&e1, &e0);
-			time_t local = e0.tm_sec;
-			// ?�到��??�起始�???- chargingScedule起�??��?
-			diff_t = difftime(t, local);
-
-			if(diff_t < 0)
-			{
-				printf("reserve expired !!!   \n");
-				ShmOCPP16Data->CsMsg.bits[gun_index].CancelReservationReq = 1;
-			}
-			else if((ShmOCPP16Data->CpMsg.bits[gun_index].StartTransactionConf == 1) &&
-					(ShmOCPP16Data->StartTransaction[gun_index].ReservationId == ShmOCPP16Data->ReserveNow[gun_index].ReservationId)&&
-					(strcmp(ShmOCPP16Data->StartTransaction[gun_index].IdTag, ShmOCPP16Data->ReserveNow[gun_index].IdTag) ==0))
-			{
-				ShmOCPP16Data->CsMsg.bits[gun_index].CancelReservationReq = 1;
-			}
-			else
-			{
-
-				//check Transaction active
-				for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-				{
-					//0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault, 8: Reserved, 9: maintain
-					if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index) &&(1/*?�ç??—æ?*//*ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != '8'*/))
-					{
-						//if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == '6') || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == '7') || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == '9') )
-						if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 11) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 12) ) // S_ALARM, S_FAULT
-						{
-							ShmOCPP16Data->CsMsg.bits[gun_index].CancelReservationReq = 1;
-
-						}
-
-					}
-				}
-
-				for (int index = 0; index < CCS_QUANTITY; index++)
-				{
-					//0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault, 8: Reserved, 9: maintain
-					if ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)&&(1/*?�ç??—æ?*//*ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != '8'*/))
-					{
-
-						//if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == '6') || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == '7') || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == '9') )
-						if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 11) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 12) ) // S_ALARM, S_FAULT
-						{
-							ShmOCPP16Data->CsMsg.bits[gun_index].CancelReservationReq = 1;
-
-						}
-
-					}
-				}
-
-				for (int index = 0; index < GB_QUANTITY; index++)
-				{
-					//0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault, 8: Reserved, 9: maintain
-					if ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)&&(1/*?�ç??—æ?*//*ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != '8'*/) )
-					{
-
-						//if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == '6') || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == '7') || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == '9') )
-						if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 11) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 12) ) // S_ALARM, S_FAULT
-						{
-							ShmOCPP16Data->CsMsg.bits[gun_index].CancelReservationReq = 1;
-
-						}
-
-					}
-				}
-			}
-		}
-
-
-		// csu trigger FirmwareStatusNotificationReq
-		if((server_sign == TRUE) && (ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationReq == 1))
-		{
-			sendFirmwareStatusNotificationRequest(ShmOCPP16Data->FirmwareStatusNotification.Status);
-		}
-
-		if((server_sign == TRUE) && (ShmOCPP16Data->CsMsg.bits[gun_index].CancelReservationConf == 1))
-		{
-			//sendCancelReservationConfirmation(uuid, comfirmstr);
-			sendCancelReservationConfirmation(ShmOCPP16Data->CancelReservation[gun_index].guid, ShmOCPP16Data->CancelReservation[gun_index].ResponseStatus);
-
-		}
-
-
-		if((server_sign == TRUE) && (ShmOCPP16Data->CsMsg.bits[gun_index].ChangeAvailabilityConf == 1))
-		{
-			//sendChangeAvailabilityConfirmation(,(char *)ShmOCPP16Data->ChangeAvailability[gun_index].ResponseStatus);
-		}
-
-		if((server_sign == TRUE) && (ShmOCPP16Data->CsMsg.bits[gun_index].UnlockConnectorConf == 1))
-		{
-			sendUnlockConnectorConfirmation(ShmOCPP16Data->UnlockConnector[gun_index].guid, ShmOCPP16Data->UnlockConnector[gun_index].ResponseStatus);
-		}
-
-		if((server_sign == TRUE) &&(ShmOCPP16Data->CsMsg.bits[gun_index].ReserveNowConf == 1))
-		{
-			sendReserveNowTransactionConfirmation(ShmOCPP16Data->ReserveNow[gun_index].guid, ShmOCPP16Data->ReserveNow[gun_index].ResponseStatus);
-		}
-
-		if((server_sign == TRUE) &&(ShmOCPP16Data->MsMsg.bits.ResetConf == 1))
-		{
-			sendResetConfirmation(ShmOCPP16Data->Reset.guid, ShmOCPP16Data->Reset.ResponseStatus);
-		}
-
-	}
-
-
-}
-
-//==========================================
-// send request routine
-//==========================================
-int sendAuthorizeRequest(int gun_index)
-{
-	printf("sendAuthorizeRequest \n");
-	int result = FAIL;
-	int i = 0;
-	char *str =	NULL;
-	char *arr[1];
-	const char *del = ",";
-	char *senstr = NULL;
-	char *temp = NULL;
-	struct json_object *message, *payload;
-	char guid[37];
-	message = json_object_new_array();
-	payload = json_object_new_object();
-
-	//initailize  struct Authorize
-	memset(&(ShmOCPP16Data->Authorize), 0 , sizeof(struct StructAuthorize));
-
-	//get data from shared memory
-	strcpy(ShmOCPP16Data->Authorize.IdTag, ShmSysConfigAndInfo->SysConfig.UserId);
-	//json_object_object_add(payload, "idTag", json_object_new_string((const char *)request.IdTag));
-	json_object_object_add(payload, "idTag", json_object_new_string((const char *)ShmOCPP16Data->Authorize.IdTag));
-	json_object_array_add(message, json_object_new_int(MESSAGE_TYPE_CALL));
-	random_uuid(guid);
-	json_object_array_add(message, json_object_new_string(guid));
-	json_object_array_add(message, json_object_new_string("Authorize"));
-	json_object_array_add(message, payload);
-
-	Send(message);
-	// Put request guid to hash map
-    if(mapItem == NULL)
-    {
-    	mapItem = malloc(sizeof(data_struct_t));
-    	printf("mapItem is null\n");
-    }
-
-    sprintf(mapItem->key_string, "%s", guid);
-	sprintf(mapItem->key_value, "Authorize,%d", gun_index);//sprintf(mapItem->key_value, senstr);//sprintf(mapItem->key_value, "Authorize");
-
-	printf("Authorize mapItem->key_string=%s\n",mapItem->key_string);
-	printf("Authorize mapItem->key_value=%s\n",mapItem->key_value);
-	if(hashmap_operation(0,hashMap, mapItem->key_string, mapItem->key_value/*mapItem*/, (void**)(&mapItem)) ==  MAP_OK/*hashmap_put(hashMap, mapItem->key_string, mapItem) == MAP_OK*/)
-	{
-		result = PASS;
-		printf("Authorize mapItem pass\n");
-	}
-
-	#ifdef SystemLogMessage
-	DEBUG_INFO(">>>>>Authorize request\n");
-	DEBUG_INFO("Message: %s\n", SendBuffer);
-	DEBUG_INFO("After push hash length: %d\n", hashmap_length(hashMap));
-	#endif
-
-	ShmOCPP16Data->SpMsg.bits.AuthorizeReq = 0;
-	json_object_put(message); // Delete the json object
-
-	//for test
-	//ShmSysConfigAndInfo->SysInfo.ChademoChargingData[0].SystemStatus ='3'; //preparing
-	//ShmOCPP16Data->CpMsg.bits[0].StartTransactionReq = 1;
-
-	return result;
-}
-
-int sendBootNotificationRequest(void)
-{
-	int result = FAIL;
-	int i = 0;
-	struct json_object *message, *payload;
-    int count = 0;
-    int gun_index = 0;
-    char guid[37];
-
-	message = json_object_new_array();
-	payload = json_object_new_object();
-
-	// Fill BootNotification fields
-	strcpy(ShmOCPP16Data->BootNotification.CbSN,(const char *)ShmOCPP16Data->ChargeBoxId);
-	strcpy(ShmOCPP16Data->BootNotification.CpModel,(const char *)ShmSysConfigAndInfo->SysConfig.ModelName);
-	strcpy(ShmOCPP16Data->BootNotification.CpSN,(const char *)ShmSysConfigAndInfo->SysConfig.SerialNumber);
-	strcpy(ShmOCPP16Data->BootNotification.CpVendor,(const char *)ShmSysConfigAndInfo->SysConfig.chargePointVendor);
-
-	json_object_object_add(payload, "chargeBoxSerialNumber",  json_object_new_string((const char *)ShmOCPP16Data->ChargeBoxId));
-	json_object_object_add(payload, "chargePointModel",  json_object_new_string((const char *)ShmSysConfigAndInfo->SysConfig.ModelName));
-	json_object_object_add(payload, "chargePointSerialNumber", json_object_new_string((const char *)ShmSysConfigAndInfo->SysConfig.SerialNumber));
-	json_object_object_add(payload, "chargePointVendor",  json_object_new_string((const char *)ShmSysConfigAndInfo->SysConfig.chargePointVendor));
-	json_object_object_add(payload, "firmwareVersion", json_object_new_string((const char *)ShmOCPP16Data->BootNotification.CpFwVersion));
-	json_object_object_add(payload, "iccid", json_object_new_string((const char *)ShmOCPP16Data->BootNotification.CpIccid));
-	json_object_object_add(payload, "imsi",  json_object_new_string((const char *)ShmOCPP16Data->BootNotification.CpImsi));
-	json_object_object_add(payload, "meterSerialNumber",  json_object_new_string((const char *)ShmOCPP16Data->BootNotification.CpMeterSerialNumber));
-	json_object_object_add(payload, "meterType",  json_object_new_string((const char *)ShmOCPP16Data->BootNotification.CpMeterType));
-
-
-	json_object_array_add(message, json_object_new_int(MESSAGE_TYPE_CALL));
-
-	random_uuid(guid);
-	json_object_array_add(message, json_object_new_string(guid));
-	json_object_array_add(message, json_object_new_string("BootNotification"));
-	json_object_array_add(message, payload);
-
-
-	Send(message);
-	// Put request guid to hash map
-	sprintf(mapItem->key_string, "%s", guid);
-	sprintf(mapItem->key_value, "BootNotification,0");
-	printf("BootNotification mapItem->key_string=%s\n",mapItem->key_string);
-	printf("BootNotification mapItem->key_value=%s\n",mapItem->key_value);
-	if(hashmap_operation(0,hashMap, mapItem->key_string, mapItem->key_value/*mapItem*/, (void**)(&mapItem)) ==  MAP_OK/*hashmap_put(hashMap, mapItem->key_string, mapItem) == MAP_OK*/)
-	{
-		result = PASS;
-	}
-
-	printf("8-2\n");
-
-	memset(queuedata, 0, strlen(queuedata));
-	strcpy(queuedata,(char*)json_object_to_json_string(message));
-	//addq(guid, queuedata);
-
-
-	#ifdef SystemLogMessage
-	DEBUG_INFO(">>>>>BootNotification request\n");
-	DEBUG_INFO("Message: %s\n", SendBuffer);
-	DEBUG_INFO("After push hash length: %d\n", hashmap_length(hashMap));
-	#endif
-
-    json_object_put(message); // Delete the json object
-    //ShmOCPP16Data->SpMsg.bits.BootNotificationReq = 1;
-
-	return result;
-}
-
-int sendDataTransferRequest(int gun_index)
-{
-	int result = FAIL;
-	struct json_object *message, *payload, *data;
-	char *senstr = NULL;
-	char *temp = NULL;
-	const char *del = ",";
-	char guid[37];
-	message = json_object_new_array();
-	payload = json_object_new_object();
-	data = json_object_new_object();
-	json_object_object_add(payload, "vendorId", json_object_new_string("PhihongTechnology"));
-	json_object_object_add(payload, "messageId", json_object_new_string("TestingMessage"));
-	json_object_object_add(data, "data-1", json_object_new_string("data1 content"));
-	json_object_object_add(data, "data-2", json_object_new_string("data2 content"));
-	json_object_object_add(payload, "data", json_object_new_string(json_object_get_string(data)));
-
-	json_object_array_add(message, json_object_new_int(MESSAGE_TYPE_CALL));
-	random_uuid(guid);
-	json_object_array_add(message, json_object_new_string(guid));
-	json_object_array_add(message, json_object_new_string("DataTransfer"));
-	json_object_array_add(message, payload);
-
-	Send(message);
-
-	// Put request guid to hash map
-	if(mapItem == NULL)
-	{
-		mapItem = malloc(sizeof(data_struct_t));
-		printf("mapItem is null\n");
-	}
-
-	if(guid == NULL || mapItem->key_string == NULL)
-	{
-		printf("guid is NULL \n");
-	}
-
-	if(mapItem->key_string == NULL)
-	{
-		printf("mapItem->key_string is NULL\n");
-	}
-
-	sprintf(mapItem->key_string, "%s", guid);
-	sprintf(mapItem->key_value, "DataTransfer,%d", (gun_index + 1));
-	printf("DataTransfer mapItem->key_string=%s\n", mapItem->key_string);
-	printf("DataTransfer mapItem->key_value=%s\n", mapItem->key_value);
-
-	if(hashmap_operation(0,hashMap, mapItem->key_string, mapItem->key_value/*mapItem*/, (void**)(&mapItem)) ==  MAP_OK/*hashmap_put(hashMap, mapItem->key_string, mapItem) == MAP_OK*/)
-	{
-		result = PASS;
-		printf("DataTransfer mapItem pass\n");
-	}
-
-	#ifdef SystemLogMessage
-	DEBUG_INFO(">>>>>DataTransfer request\n");
-	DEBUG_INFO("Message: %s\n", SendBuffer);
-	DEBUG_INFO("After push hash length: %d\n", hashmap_length(hashMap));
-	#endif
-
-	json_object_put(message); // Delete the json object
-
-	return result;
-}
-
-int sendDiagnosticsStatusNotificationRequest(char *status)
-{
-	int result = FAIL;
-	char *str =	NULL;
-	struct json_object *message, *payload;
-	char guid[37];
-	message = json_object_new_array();
-	payload = json_object_new_object();
-	printf("sendDiagnosticsStatusNotificationRequest \n");
-
-	printf("DiagnosticsStatusNotification-1\n");
-	printf("DiagnosticsStatusNotification.Status=%s\n", status);
-	sprintf(ShmOCPP16Data->DiagnosticsStatusNotification.Status,"%s",(const char *)status);
-	printf("DiagnosticsStatusNotification.Status=%s\n", str);
-	json_object_object_add(payload, "status", json_object_new_string((const char *)status));
-	printf("DiagnosticsStatusNotification-2\n");
-
-	json_object_array_add(message, json_object_new_int(MESSAGE_TYPE_CALL));
-	random_uuid(guid);
-	json_object_array_add(message, json_object_new_string(guid));
-	json_object_array_add(message, json_object_new_string("DiagnosticsStatusNotification"));
-	json_object_array_add(message, payload);
-
-	Send(message);
-
-	if(mapItem == NULL)
-	{
-		mapItem = malloc(sizeof(data_struct_t));
-		printf("mapItem is null\n");
-	}
-
-	if(guid == NULL || mapItem->key_string == NULL)
-	{
-		printf("guid is NULL \n");
-	}
-
-	if(mapItem->key_string == NULL)
-	{
-		printf("mapItem->key_string is NULL\n");
-	}
-
-	// Put request guid to hash map
-	sprintf(mapItem->key_string, "%s", guid);
-	sprintf(mapItem->key_value, "DiagnosticsStatusNotification,%d", 0);
-	printf("DiagnosticsStatusNotification mapItem->key_string=%s\n", mapItem->key_string);
-	printf("DiagnosticsStatusNotification mapItem->key_value=%s\n", mapItem->key_value);
-	if(hashmap_operation(0,hashMap, mapItem->key_string, mapItem->key_value/*mapItem*/, (void**)(&mapItem)) ==  MAP_OK/*hashmap_put(hashMap, mapItem->key_string, mapItem) == MAP_OK*/)
-	{
-		result = PASS;
-		printf("DiagnosticsStatusNotification mapItem pass\n");
-	}
-
-	#ifdef SystemLogMessage
-	DEBUG_INFO(">>>>>DiagnosticsStatusNotification request\n");
-	DEBUG_INFO("Message: %s\n", SendBuffer);
-	DEBUG_INFO("After push hash length: %d\n", hashmap_length(hashMap));
-	#endif
-
-	json_object_put(message); // Delete the json object
-	ShmOCPP16Data->SpMsg.bits.DiagnosticsStatusNotificationReq = 1;
-	ShmOCPP16Data->SpMsg.bits.DiagnosticsStatusNotificationConf = 0;
-	return result;
-}
-
-int sendFirmwareStatusNotificationRequest(char *status)
-{
-	int result = FAIL;
-	char *str =	NULL;
-	struct json_object *message, *payload;
-	char guid[37];
-	message = json_object_new_array();
-	payload = json_object_new_object();
-
-	sprintf(ShmOCPP16Data->FirmwareStatusNotification.Status, "%s", (const char *)status);
-	json_object_object_add(payload, "status", json_object_new_string((const char *)status));
-
-	json_object_array_add(message, json_object_new_int(MESSAGE_TYPE_CALL));
-	random_uuid(guid);
-	json_object_array_add(message, json_object_new_string(guid));
-	json_object_array_add(message, json_object_new_string("FirmwareStatusNotification"));
-	json_object_array_add(message, payload);
-
-
-	Send(message);
-
-	if(mapItem == NULL)
-	{
-		mapItem = malloc(sizeof(data_struct_t));
-		printf("mapItem is null\n");
-	}
-
-	if(guid == NULL || mapItem->key_string == NULL)
-	{
-		printf("guid is NULL \n");
-	}
-
-	if(mapItem->key_string == NULL)
-	{
-		printf("mapItem->key_string is NULL\n");
-	}
-
-
-	// Put request guid to hash map
-	sprintf(mapItem->key_string, "%s", guid);
-	sprintf(mapItem->key_value, "FirmwareStatusNotification,%d", 0);
-	printf("FirmwareStatusNotification mapItem->key_string=%s\n", mapItem->key_string);
-	printf("FirmwareStatusNotification mapItem->key_value=%s\n", mapItem->key_value);
-	if(hashmap_operation(0,hashMap, mapItem->key_string, mapItem->key_value/*mapItem*/, (void**)(&mapItem)) ==  MAP_OK/*hashmap_put(hashMap, mapItem->key_string, mapItem) == MAP_OK*/)
-	{
-		result = PASS;
-		printf("FirmwareStatusNotification mapItem pass\n");
-	}
-
-	#ifdef SystemLogMessage
-	DEBUG_INFO(">>>>>FirmwareStatusNotification request\n");
-	DEBUG_INFO("Message: %s\n", SendBuffer);
-	DEBUG_INFO("After push hash length: %d\n", hashmap_length(hashMap));
-	#endif
-
-	json_object_put(message); // Delete the json object
-	ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationReq = 1;
-	ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationConf = 0;
-	return result;
-}
-
-int sendHeartbeatRequest(int gun_index)
-{
-	int result = FAIL;
-	struct json_object *message, *payload;
-	char *senstr = NULL;
-	char *temp = NULL;
-	const char *del = ",";
-	char guid[37];
-	message = json_object_new_array();
-	payload = json_object_new_object();
-
-
-	json_object_array_add(message, json_object_new_int(MESSAGE_TYPE_CALL));
-	random_uuid(guid);
-	json_object_array_add(message, json_object_new_string(guid));
-	json_object_array_add(message, json_object_new_string("Heartbeat"));
-	json_object_array_add(message, payload);
-
-	Send(message);
-
-	if(mapItem == NULL)
-	{
-		mapItem = malloc(sizeof(data_struct_t));
-		printf("mapItem is null\n");
-	}
-
-	if(guid == NULL || mapItem->key_string == NULL)
-	{
-		printf("guid is NULL \n");
-	}
-
-	if(mapItem->key_string == NULL)
-	{
-		printf("mapItem->key_string is NULL\n");
-	}
-
-	sprintf(mapItem->key_string, "%s", guid);
-	sprintf(mapItem->key_value, "Heartbeat,%d", 0);
-
-	printf("Heartbeat mapItem->key_string=%s\n", mapItem->key_string);
-	printf("Heartbeat mapItem->key_value=%s\n", mapItem->key_value);
-	if(hashmap_operation(0,hashMap, mapItem->key_string, mapItem->key_value/*mapItem*/, (void**)(&mapItem)) ==  MAP_OK/*hashmap_put(hashMap, mapItem->key_string, mapItem) == MAP_OK*/)
-	{
-		result = PASS;
-		printf("Heartbeat mapItem\n");
-	}
-
-
-	#ifdef SystemLogMessage
-	DEBUG_INFO(">>>>>Heartbeat request\n");
-	DEBUG_INFO("Message: %s\n", SendBuffer);
-	DEBUG_INFO("After push hash length: %d\n", hashmap_length(hashMap));
-	#endif
-
-	json_object_put(message);
-
-	return result;
-}
-
-int sendStartTransactionRequest(int gun_index)
-{
-	int result = FAIL;
-	struct json_object *message, *payload;
-	char *senstr = NULL;
-	char *temp = NULL;
-	const char *del = ",";
-	char guid[37];
-	struct timeval tmnow;
-	struct tm *tm;
-	char buf[30], usec_buf[6];
-
-	message = json_object_new_array();
-	payload = json_object_new_object();
-
-	gettimeofday(&tmnow, NULL);
-
-	time_t t;
-	t = time(NULL);
-	/*UTC time and date*/
-	tm = gmtime(&t);
-	strftime(buf,30,"%Y-%m-%dT%H:%M:%S", tm);
-	strcat(buf,".");
-	sprintf(usec_buf,"%dZ",(int)tmnow.tv_usec);
-	strcat(buf,usec_buf);
-	printf("%s",buf);
-
-    // set value
-	ShmOCPP16Data->StartTransaction[gun_index].ConnectorId = gun_index +1 ; // gun start from 1~
-	strcpy(ShmOCPP16Data->StartTransaction[gun_index].Timestamp, buf);
-	strcpy(ShmOCPP16Data->StartTransaction[gun_index].IdTag, ShmSysConfigAndInfo->SysConfig.UserId);
-
-
-	for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-	{
-		printf("ShmSysConfigAndInfo->SysInfo.ChademoChargingData[%d].Index=%d\n",index, ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index );
-		if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)
-		{
-			printf("Chademo : 0\n");
-#if 1 // for test
-			ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedEnergy =100.0;
-#endif
-			ShmOCPP16Data->StartTransaction[gun_index].MeterStart = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedEnergy;
-		}
-	}
-
-	for (int index = 0; index < CCS_QUANTITY; index++)
-	{
-		printf("ShmSysConfigAndInfo->SysInfo.CcsChargingData[%d].Index=%d\n",index, ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index );
-		if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)
-		{
-			printf("Ccs : 0\n");
-#if 1 // fo test
-			ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy = 100.0;
-#endif
-			ShmOCPP16Data->StartTransaction[gun_index].MeterStart = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy;
-		}
-	}
-
-	for (int index = 0; index < GB_QUANTITY; index++)
-	{
-		printf("ShmSysConfigAndInfo->SysInfo.GbChargingData[%d].Index=%d\n",index, ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index );
-		if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)
-		{
-			printf("Gb : 0\n");
-#if 1 // fo test
-			ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy = 100.0;
-#endif
-			ShmOCPP16Data->StartTransaction[gun_index].MeterStart = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy;
-		}
-	}
-
-
-
-	//ShmOCPP16Data->StartTransaction[gun_index].MeterStart = 100;
-
-	json_object_object_add(payload, "connectorId", json_object_new_int(ShmOCPP16Data->StartTransaction[gun_index].ConnectorId));
-	json_object_object_add(payload, "idTag", json_object_new_string((const char *)ShmOCPP16Data->StartTransaction[gun_index].IdTag));
-	json_object_object_add(payload, "meterStart", json_object_new_int(ShmOCPP16Data->StartTransaction[gun_index].MeterStart));
-	json_object_object_add(payload, "reservationId", json_object_new_int(ShmOCPP16Data->StartTransaction[gun_index].ReservationId));
-	json_object_object_add(payload, "timestamp", json_object_new_string((const char *)ShmOCPP16Data->StartTransaction[gun_index].Timestamp));
-	printf("test  s 1\n");
-	json_object_array_add(message, json_object_new_int(MESSAGE_TYPE_CALL));
-	random_uuid(guid);
-	json_object_array_add(message, json_object_new_string(guid));
-	json_object_array_add(message, json_object_new_string("StartTransaction"));
-	json_object_array_add(message, payload);
-
-	Send(message);
-	//usleep(500); // 等�??��?微�?
-	printf("test  s 2\n");
-
-	if(mapItem == NULL)
-	{
-	    	mapItem = malloc(sizeof(data_struct_t));
-	    	printf("mapItem is null\n");
-	}
-
-	if(guid == NULL || mapItem->key_string == NULL)
-	{
-		printf("guid is NULL \n");
-	}
-
-	if(mapItem->key_string == NULL)
-	{
-		printf("mapItem->key_string is NULL\n");
-	}
-	// Put request guid to hash map
-	sprintf(mapItem->key_string, "%s", guid);
-	printf("test  s 2-0-1\n");
-
-	sprintf(mapItem->key_value, "StartTransaction,%d", (gun_index));
-	printf("test  s 2-0-2\n");
-	printf("StartTransaction mapItem->key_string=%s\n",mapItem->key_string);
-	printf("StartTransaction mapItem->key_value=%s\n",mapItem->key_value);
-
-
-	if(hashmap_operation(0,hashMap, mapItem->key_string, mapItem->key_value/*mapItem*/, (void**)(&mapItem)) ==  MAP_OK/*hashmap_put(hashMap, mapItem->key_string, mapItem) == MAP_OK*/)
-	{
-		printf("test  s 2-1\n");
-		result = PASS;
-	}
-	printf("test  s 3\n");
-
-	strcpy(queuedata, (char*)json_object_to_json_string(message));
-	queue_operation(4, guid, queuedata );//addq(guid, queuedata); ---> remove temporally
-	#ifdef SystemLogMessage
-	DEBUG_INFO(">>>>>StartTransaction request\n");
-	DEBUG_INFO("Message: %s\n", SendBuffer);
-	DEBUG_INFO("After push hash length: %d\n", hashmap_length(hashMap));
-	#endif
-
-	json_object_put(message);
-
-	return result;
-}
-
-int sendStatusNotificationRequest(int gun_index)
-{
-	int result = FAIL;
-	struct json_object *message, *payload;
-	char *senstr = NULL;
-	char *temp = NULL;
-	const char *del = ",";
-	char guid[37];
-	int currentStatus = 0;
-	struct timeval tmnow;
-	struct tm *tm;
-	char buf[30], usec_buf[6];
-
-	message = json_object_new_array();
-	payload = json_object_new_object();
-
-	gettimeofday(&tmnow, NULL);
-
-	time_t t;
-	t = time(NULL);
-	/*UTC time and date*/
-	tm = gmtime(&t);
-	strftime(buf,30,"%Y-%m-%dT%H:%M:%S", tm);
-	strcat(buf,".");
-	sprintf(usec_buf,"%dZ",(int)tmnow.tv_usec);
-	strcat(buf,usec_buf);
-	printf("%s",buf);
-
-	ShmOCPP16Data->StatusNotification[gun_index].ConnectorId = (gun_index + 1);
-
-	strcpy(ShmOCPP16Data->StatusNotification[gun_index].ErrorCode, "NoError");
-
-	// it's option
-	strcpy(ShmOCPP16Data->StatusNotification[gun_index].Info, "");
-
-	/*
-	 enum _SYSTEM_STATUS
-{
-S_BOOTING               = 0,
-S_IDLE,                 = 1
-S_AUTHORIZING,          =2
-S_REASSIGN_CHECK,       =3
-S_REASSIGN,             =4
-S_PRECHARGE,            =5
-S_PREPARING_FOR_EV,     =6
-S_PREPARING_FOR_EVSE,   =7
-S_CHARGING,             =8
-S_TERMINATING,          =9
-S_COMPLETE,             =10
-S_ALARM,                =11
-S_FAULT                 =12
-}
-
-    */
-
-
-
-	//check Transaction active
-	for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-	{
-		if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 1)) //S_IDLE
-		{
-			strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, "Available");
-			currentStatus = 0; //OCPP Status
-		}
-		else if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 5)) //S_PRECHARGE
-		{
-			strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, "Preparing");
-			currentStatus = 1; //OCPP Status
-		}
-		else if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 8)) //S_CHARGING
-		{
-			strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, "Charging");
-			currentStatus = 2; //OCPP Status
-		}
-		else if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 10)) //S_COMPLETE
-		{
-			strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, "Finishing");
-			currentStatus = 5; //OCPP Status
-		}
-	}
-
-	for (int index = 0; index < CCS_QUANTITY; index++)
-	{
-		if ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 1)) //S_IDLE
-		{
-			strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, "Available");
-			currentStatus = 0; //OCPP Status
-		}
-		else if ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 5)) //S_PRECHARGE
-		{
-			strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, "Preparing");
-			currentStatus = 1; //OCPP Status
-		}
-		else if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 8)) //S_CHARGING
-		{
-			strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, "Charging");
-			currentStatus = 2; //OCPP Status
-		}
-		else if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 10)) //S_COMPLETE
-		{
-				strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, "Finishing");
-				currentStatus = 5; //OCPP Status
-		}
-	}
-
-	for (int index = 0; index < GB_QUANTITY; index++)
-	{
-		if ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index) &&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 1)) //S_IDLE
-		{
-			strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, "Available");
-			currentStatus = 0; //OCPP Status
-		}
-		else if ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index) &&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 5)) //S_PRECHARGE
-		{
-			strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, "Preparing");
-			currentStatus = 1; //OCPP Status
-		}
-		else if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 8)) //S_CHARGING
-		{
-			strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, "Charging");
-			currentStatus = 2; //OCPP Status
-		}
-		else if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 8)) //S_COMPLETE
-		{
-				strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, "Finishing");
-				currentStatus = 5; //OCPP Status
-		}
-	}
-
-
-	//it's option
-	strcpy(ShmOCPP16Data->StatusNotification[gun_index].Timestamp, buf);
-	strcpy(ShmOCPP16Data->StatusNotification[gun_index].VendorId, "PhihongTechnology");
-	strcpy(ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode, "000000");
-	strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, ChargePointStatusStr[currentStatus]);
-
-	json_object_object_add(payload, "connectorId", json_object_new_int(ShmOCPP16Data->StatusNotification[gun_index].ConnectorId));
-	json_object_object_add(payload, "errorCode", json_object_new_string((const char *)(&ShmOCPP16Data->StatusNotification[gun_index].ErrorCode)));
-	json_object_object_add(payload, "info", json_object_new_string((const char *)ShmOCPP16Data->StatusNotification[gun_index].Info));
-	json_object_object_add(payload, "status", json_object_new_string((const char *)ShmOCPP16Data->StatusNotification[gun_index].Status));
-	json_object_object_add(payload, "timestamp", json_object_new_string((const char *)ShmOCPP16Data->StatusNotification[gun_index].Timestamp));
-	json_object_object_add(payload, "vendorId", json_object_new_string((const char *)ShmOCPP16Data->StatusNotification[gun_index].VendorId));
-	json_object_object_add(payload, "vendorErrorCode", json_object_new_string((const char *)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode));
-
-	json_object_array_add(message, json_object_new_int(MESSAGE_TYPE_CALL));
-	random_uuid(guid);
-	json_object_array_add(message, json_object_new_string(guid));
-	json_object_array_add(message, json_object_new_string("StatusNotification"));
-	json_object_array_add(message, payload);
-
-	Send(message);
-	//usleep(500); // 等�??��?微�?
-	// Put request guid to hash map
-	if(mapItem == NULL)
-	{
-		mapItem = malloc(sizeof(data_struct_t));
-		printf("mapItem is null\n");
-	}
-
-
-	sprintf(mapItem->key_string, "%s", guid);
-	sprintf(mapItem->key_value, "StatusNotification,%d", (gun_index));
-	//sprintf(mapItem->key_value, "StatusNotification,%d", gun_index + 1);
-
-	printf("statusNotification mapItem->key_string=%s\n",mapItem->key_string);
-	printf("statusNotification mapItem->key_value=%s\n",mapItem->key_value);
-	if(hashmap_operation(0,hashMap, mapItem->key_string, mapItem->key_value/*mapItem*/, (void**)(&mapItem)) ==  MAP_OK/*hashmap_put(hashMap, mapItem->key_string, mapItem) == MAP_OK*/)
-	{
-		printf("statusNotification mapitem pass");
-		result = PASS;
-	}
-
-	#ifdef SystemLogMessage
-	DEBUG_INFO(">>>>>StatusNotification request\n");
-	DEBUG_INFO("Message: %s\n", SendBuffer);
-	DEBUG_INFO("After push hash length: %d\n", hashmap_length(hashMap));
-	#endif
-
-	json_object_put(message);
-
-	cpinitateMsg.bits[gun_index].StatusNotificationReq = 0;
-
-
-	//for test
-#if 0
-	// 0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault
-	if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[0].SystemStatus =='1' )
-	{
-		//ShmOCPP16Data->SpMsg.bits.AuthorizeReq = 1;
-	}
-
-	if(UserPlugGun == 0 && ShmSysConfigAndInfo->SysInfo.ChademoChargingData[0].SystemStatus == '3')
-	{
-		ShmSysConfigAndInfo->SysInfo.ChademoChargingData[0].SystemStatus = '1';
-	}
-#endif
-
-	return result;
-}
-
-int sendStopTransactionRequest(int gun_index)
-{
-	int result = FAIL;
-	struct json_object *message, *payload, *transactionDataArray, *transactionData, *sampledArray, *sampledValue;
-	char *senstr = NULL;
-	char *temp = NULL;
-	const char *del = ",";
-	char guid[37];
-	int idx_sample=0;
-	message = json_object_new_array();
-	payload = json_object_new_object();
-	transactionDataArray = json_object_new_array();
-	sampledArray = json_object_new_array();
-
-	printf("sendStopTransactionRequest \n");
-
-	strcpy(ShmOCPP16Data->StopTransaction[gun_index].IdTag, ShmOCPP16Data->Authorize.IdTag);
-
-	//ENERGY_ACTIVE_IMPORT_REGISTER
-	for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-	{
-		if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)
-		{
-			//for test
-			//ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedEnergy =100.0;
-
-			ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedEnergy;
-				//sprintf(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%s" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedEnergy );
-		}
-	}
-
-	for (int index = 0; index < CCS_QUANTITY; index++)
-	{
-		if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)
-		{
-			//for test
-			//ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy = 100.0;
-
-			ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy;
-				//sprintf(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%s" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy );
-		}
-	}
-
-	for (int index = 0; index < GB_QUANTITY; index++)
-	{
-		if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)
-		{
-			// for test
-			//ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy = 100.0;
-
-			ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy;
-				//sprintf(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy);
-		}
-	}
-
-
-	//Stop Transaction Time
-	struct timeval tmnow;
-	struct tm *tm;
-	char buf[30], usec_buf[6];
-	gettimeofday(&tmnow, NULL);
-
-	time_t t;
-	t = time(NULL);
-	/*UTC time and date*/
-	tm = gmtime(&t);
-	strftime(buf,30,"%Y-%m-%dT%H:%M:%S", tm);
-	strcat(buf,".");
-	sprintf(usec_buf,"%dZ",(int)tmnow.tv_usec);
-	strcat(buf,usec_buf);
-	printf("%s",buf);
-
-	//strcpy(ShmOCPP16Data->StopTransaction[gun_index].Timestamp,"2019-05-04T18:15:33Z");
-	strcpy(ShmOCPP16Data->StopTransaction[gun_index].Timestamp,buf);
-	ShmOCPP16Data->StopTransaction[gun_index].TransactionId = ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId;
-	strcpy(ShmOCPP16Data->StopTransaction[gun_index].StopReason, StopTransactionReasonStr[Local]); //
-
-	json_object_object_add(payload, "idTag", json_object_new_string((const char *)ShmOCPP16Data->StopTransaction[gun_index].IdTag));
-    json_object_object_add(payload, "meterStop", json_object_new_int(ShmOCPP16Data->StopTransaction[gun_index].MeterStop));
-	json_object_object_add(payload, "timestamp", json_object_new_string((const char *)ShmOCPP16Data->StopTransaction[gun_index].Timestamp));
-	json_object_object_add(payload, "transactionId", json_object_new_int(ShmOCPP16Data->StopTransaction[gun_index].TransactionId));
-	json_object_object_add(payload, "reason", json_object_new_string((const char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason));
-
-
-
-	printf("sendStopTransactionRequest 1\n");
-	ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue = (struct StructSampledValue *)malloc(sizeof(struct StructSampledValue)*3);
-
-	for(int idx_transaction=0;idx_transaction<1;idx_transaction++)
-	{
-		transactionData = json_object_new_object();
-		//json_object_object_add(transactionData, "timestamp", json_object_new_string("2019-05-04T18:15:33Z"));
-
-		strcpy(ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].TimeStamp, buf/*"2019-05-04T18:15:33Z"*/);
-
-		json_object_object_add(transactionData, "timestamp", json_object_new_string((const char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].TimeStamp));
-
-
-
-		//for(int idx_sample=0;idx_sample<1;idx_sample++)
-		{
-			sampledValue = json_object_new_object();
-			printf("sendStopTransactionRequest -2\n");
-
-			//Transaction_Begin
-			idx_sample=0;
-			printf("ShmOCPP16Data->StartTransaction[gun_index].MeterStart=%d\n",ShmOCPP16Data->StartTransaction[gun_index].MeterStart);
-			printf("ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Value=%s\n",ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Value);
-			sprintf(ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Value, "%.1f",(float)(ShmOCPP16Data->StartTransaction[gun_index].MeterStart));
-			printf("sendStopTransactionRequest -2-1\n");
-			strcpy(ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Context,ReadingContextStr[ReadingContext_Transaction_Begin]);
-			strcpy(ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Format,ValueFormatStr[Raw]);
-			strcpy(ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Measurand,MeasurandStr[Energy_Reactive_Export_Register]);
-			strcpy(ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Phase,PhaseStr[L1_N]);
-			strcpy(ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Location,LocationStr[Location_Outlet]);
-			strcpy(ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Unit,UnitOfMeasureStr[UnitOfMeasure_Wh/*UnitOfMeasure_kWh*/]);
-
-			printf("sendStopTransactionRequest -2-0\n");
-			json_object_object_add(sampledValue, "value", json_object_new_string((const char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Value));
-			json_object_object_add(sampledValue, "context", json_object_new_string((const char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Context));
-			json_object_object_add(sampledValue, "format", json_object_new_string((const char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Format));
-		    json_object_object_add(sampledValue, "measurand", json_object_new_string((const char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Measurand));
-			json_object_object_add(sampledValue, "phase", json_object_new_string((const char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Phase));
-			json_object_object_add(sampledValue, "location", json_object_new_string((const char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Location));
-			json_object_object_add(sampledValue, "unit", json_object_new_string((const char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Unit));
-
-			json_object_array_add(sampledArray, sampledValue);
-
-			//Transaction_End
-			idx_sample=1;
-			//sampledValue = NULL;
-			sampledValue = json_object_new_object();
-			//ENERGY_ACTIVE_IMPORT_REGISTER
-			for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)
-				{
-					// for test
-					//ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingPower = 100.0;
-					sprintf(ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedEnergy );
-				}
-			}
-
-			for (int index = 0; index < CCS_QUANTITY; index++)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)
-				{
-					// for test
-					//ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingPower = 100.0;
-					sprintf(ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy );
-				}
-			}
-
-			for (int index = 0; index < GB_QUANTITY; index++)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)
-				{
-					// for test
-					//ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingPower = 100.0;
-					sprintf(ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy );
-				}
-			}
-
-
-
-			//sprintf(ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Value, "%s",ShmOCPP16Data->StartTransaction[gun_index].MeterStart);
-			printf("sendStopTransactionRequest -2-1\n");
-			strcpy(ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Context,ReadingContextStr[ReadingContext_Transaction_End]);
-			strcpy(ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Format,ValueFormatStr[Raw]);
-			strcpy(ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Measurand,MeasurandStr[Energy_Reactive_Export_Register]);
-			strcpy(ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Phase,PhaseStr[L1_N]);
-			strcpy(ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Location,LocationStr[Location_Outlet]);
-			strcpy(ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Unit,UnitOfMeasureStr[UnitOfMeasure_Wh/*UnitOfMeasure_kWh*/]);
-
-			printf("sendStopTransactionRequest -2-0\n");
-			json_object_object_add(sampledValue, "value", json_object_new_string((const char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Value));
-			json_object_object_add(sampledValue, "context", json_object_new_string((const char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Context));
-			json_object_object_add(sampledValue, "format", json_object_new_string((const char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Format));
-			json_object_object_add(sampledValue, "measurand", json_object_new_string((const char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Measurand));
-			json_object_object_add(sampledValue, "phase", json_object_new_string((const char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Phase));
-			json_object_object_add(sampledValue, "location", json_object_new_string((const char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Location));
-			json_object_object_add(sampledValue, "unit", json_object_new_string((const char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Unit));
-
-			json_object_array_add(sampledArray, sampledValue);
-		}
-		printf("sendStopTransactionRequest -2-1\n");
-		json_object_object_add(transactionData, "sampledValue", sampledArray);
-		json_object_array_add(transactionDataArray, transactionData);
-	}
-
-	printf("sendStopTransactionRequest -3\n");
-	json_object_object_add(payload, "transactionData", transactionDataArray);
-
-	json_object_array_add(message, json_object_new_int(MESSAGE_TYPE_CALL));
-	random_uuid(guid);
-	json_object_array_add(message, json_object_new_string(guid));
-	json_object_array_add(message, json_object_new_string("StopTransaction"));
-	json_object_array_add(message, payload);
-
-	Send(message);
-
-
-	if(mapItem == NULL)
-	{
-		mapItem = malloc(sizeof(data_struct_t));
-		printf("mapItem is null\n");
-	}
-
-	// Put request guid to hash map
-	sprintf(mapItem->key_string, "%s", guid);
-	sprintf(mapItem->key_value, "StopTransaction,%d", (gun_index));
-	printf("StopTransaction mapItem->key_string=%s\n",mapItem->key_string);
-	printf("StopTransaction mapItem->key_value=%s\n",mapItem->key_value);
-	//sprintf(mapItem->key_value, senstr);//sprintf(mapItem->key_value, "StopTransaction");
-	if(hashmap_operation(0,hashMap, mapItem->key_string, mapItem->key_value/*mapItem*/, (void**)(&mapItem)) ==  MAP_OK/*hashmap_put(hashMap, mapItem->key_string, mapItem) == MAP_OK*/)
-	{
-		result = PASS;
-		printf("StopTransaction mapitem pass");
-	}
-
-
-	strcpy(queuedata, (char*)json_object_to_json_string(message));
-	queue_operation(4, guid, queuedata );//addq(guid, queuedata); ---> remove temporally
-
-	//addq(guid, (char*)json_object_to_json_string(message));
-	#ifdef SystemLogMessage
-	DEBUG_INFO(">>>>>StopTransaction request\n");
-	DEBUG_INFO("Message: %s\n", SendBuffer);
-	DEBUG_INFO("After push hash length: %d\n", hashmap_length(hashMap));
-	#endif
-
-	json_object_put(message);
-
-	//for test
-	ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq = 0;
-
-	return result;
-}
-
-int sendMeterValuesRequest(int gun_index)
-{
-	int result = FAIL;
-	struct json_object *message, *payload, *meterValueDataArray, *transactionData, *sampledArray, *sampledValue;
-	char *senstr = NULL;
-	char *temp = NULL;
-	const char *del = ",";
-	char guid[37];
-	int idx_sample=0;
-
-	message = json_object_new_array();
-	payload = json_object_new_object();
-	meterValueDataArray = json_object_new_array();
-	sampledArray = json_object_new_array();
-
-	//set value
-	ShmOCPP16Data->MeterValues[gun_index].ConnectorId = gun_index + 1; // gun start from 1~
-	//ShmOCPP16Data->MeterValues[gun_index].TransactionId = 93507754;
-	ShmOCPP16Data->MeterValues[gun_index].TransactionId = ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId;
-
-	json_object_object_add(payload, "connectorId", json_object_new_int(ShmOCPP16Data->MeterValues[gun_index].ConnectorId));
-	json_object_object_add(payload, "transactionId", json_object_new_int(ShmOCPP16Data->MeterValues[gun_index].TransactionId));
-
-	printf("enter sendMeterValuesRequest -2\n");
-
-	for(int idx_transaction=0;idx_transaction<1;idx_transaction++)
-	{
-		transactionData = json_object_new_object();
-		//allocate memory space
-		ShmOCPP16Data->MeterValues[gun_index].MeterValue = (struct StructMeterValue *)malloc(sizeof(struct StructMeterValue));
-
-		//UTC Date time
-		struct timeval tmnow;
-		struct tm *tm;
-		char buf[30], usec_buf[6];
-		gettimeofday(&tmnow, NULL);
-
-		time_t t;
-		t = time(NULL);
-		/*UTC time and date*/
-		tm = gmtime(&t);
-		strftime(buf,30,"%Y-%m-%dT%H:%M:%S", tm);
-		strcat(buf,".");
-		sprintf(usec_buf,"%dZ",(int)tmnow.tv_usec);
-		strcat(buf,usec_buf);
-		printf("%s",buf);
-
-		strcpy(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].TimeStamp, buf);
-		json_object_object_add(transactionData, "timestamp", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].TimeStamp));
-
-		//allocate memory space
-		ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue = (struct StructSampledValue *)malloc(sizeof(struct StructSampledValue)*6);
-
-
-		//for(int idx_sample=0;idx_sample<1;idx_sample++)
-		//{
-
-
-		idx_sample=0;
-		//sampledValue = NULL;
-		sampledValue = json_object_new_object();
-		/********************************(1)Current.Export************************************************/
-		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)
-			{
-				//ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingCurrent = 60.0;
-				sprintf(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingCurrent );
-			}
-		}
-
-		for (int index = 0; index < CCS_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)
-			{
-				//ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingCurrent = 60.0;
-				sprintf(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingCurrent );
-			}
-		}
-
-		for (int index = 0; index < GB_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)
-			{
-				//ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingCurrent = 60.0;
-				sprintf(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingCurrent );
-			}
-		}
-
-		strcpy(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Context, ReadingContextStr[ReadingContext_Sample_Periodic]);
-		strcpy(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Format, ValueFormatStr[Raw]);
-		strcpy(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Measurand, MeasurandStr[Current_Export]);
-		strcpy(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Phase, PhaseStr[L1_N]);
-		strcpy(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Location, LocationStr[Location_Outlet]);
-		strcpy(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Unit,UnitOfMeasureStr[UnitOfMeasure_A]);
-
-		printf("meter error 17\n");
-		json_object_object_add(sampledValue, "value", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value));
-		printf("meter error 18\n");
-		json_object_object_add(sampledValue, "context", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Context));
-		printf("meter error 19\n");
-		json_object_object_add(sampledValue, "format", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Format));
-		printf("meter error 20\n");
-		json_object_object_add(sampledValue, "measurand", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Measurand));
-		printf("meter error 21\n");
-		json_object_object_add(sampledValue, "phase", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Phase));
-		printf("meter error 22\n");
-		json_object_object_add(sampledValue, "location", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Location));
-		printf("meter error 23\n");
-		json_object_object_add(sampledValue, "unit", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Unit));
-		printf("meter error 24\n");
-		json_object_array_add(sampledArray, sampledValue);
-		printf("meter error 25\n");
-
-#if 1  //DC
-
-		idx_sample=1;
-		sampledValue = json_object_new_object();
-		/****************************************************(2)Energy.Active.Export.Register*********************************************/
-		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-		{
-			printf("ShmSysConfigAndInfo->SysInfo.ChademoChargingData[%d].Index=%d\n",index, ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index );
-			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)
-			{
-				printf("Chademo : 0\n");
-				//ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedEnergy =100.0;
-				sprintf(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedEnergy );
-			}
-		}
-
-		for (int index = 0; index < CCS_QUANTITY; index++)
-		{
-			printf("ShmSysConfigAndInfo->SysInfo.CcsChargingData[%d].Index=%d\n",index, ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index );
-			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)
-			{
-				printf("Ccs : 0\n");
-				//ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy = 100.0;
-				sprintf(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy );
-			}
-		}
-
-		for (int index = 0; index < GB_QUANTITY; index++)
-		{
-			printf("ShmSysConfigAndInfo->SysInfo.GbChargingData[%d].Index=%d\n",index, ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index );
-			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)
-			{
-				printf("Gb : 0\n");
-				//ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy = 100.0;
-				sprintf(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy);
-			}
-		}
-
-		strcpy(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Context, ReadingContextStr[ReadingContext_Sample_Periodic]);
-		strcpy(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Format, ValueFormatStr[Raw]);
-		strcpy(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Measurand, MeasurandStr[Energy_Active_Export_Register]);
-		//   strcpy(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Phase, PhaseStr[L1]);
-		strcpy(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Location, LocationStr[Location_Outlet]);
-		strcpy(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Unit,UnitOfMeasureStr[UnitOfMeasure_Wh]);
-
-
-    	printf("meter error 1\n");
-    	json_object_object_add(sampledValue, "value", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value));
-    	printf("meter error 2\n");
-    	json_object_object_add(sampledValue, "context", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Context));
-    	printf("meter error 3\n");
-    	json_object_object_add(sampledValue, "format", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Format));
-    	printf("meter error 4\n");
-    	json_object_object_add(sampledValue, "measurand", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Measurand));
-    	//	json_object_object_add(sampledValue, "phase", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Phase));
-    	printf("meter error 5\n");
-    	json_object_object_add(sampledValue, "location", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Location));
-    	printf("meter error 6\n");
-    	json_object_object_add(sampledValue, "unit", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Unit));
-    	printf("meter error 7\n");
-    	json_object_array_add(sampledArray, sampledValue);
-    	printf("meter error 8\n");
-
-
-    	idx_sample=2;
-    	sampledValue = json_object_new_object();
-    	/****************************************************(3)Energy.Active.Export.Interval*********************************************/
-    	for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-    	{
-    		printf("ShmSysConfigAndInfo->SysInfo.ChademoChargingData[%d].Index=%d\n",index, ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index );
-    		if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)
-    		{
-    			printf("Chademo : 0\n");
-    			//ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedEnergy =100.0;
-    			sprintf(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedEnergy );
-    		}
-    	}
-
-    	for (int index = 0; index < CCS_QUANTITY; index++)
-    	{
-    		printf("ShmSysConfigAndInfo->SysInfo.CcsChargingData[%d].Index=%d\n",index, ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index );
-    		if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)
-    		{
-    			printf("Ccs : 0\n");
-    			//ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy = 100.0;
-    			sprintf(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy );
-    		}
-    	}
-
-    	for (int index = 0; index < GB_QUANTITY; index++)
-    	{
-    		printf("ShmSysConfigAndInfo->SysInfo.GbChargingData[%d].Index=%d\n",index, ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index );
-    		if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)
-    		{
-    			printf("Gb : 0\n");
-    			//ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy = 100.0;
-    			sprintf(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy);
-    		}
-    	}
-
-    	strcpy(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Context, ReadingContextStr[ReadingContext_Sample_Periodic]);
-    	strcpy(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Format, ValueFormatStr[Raw]);
-    	strcpy(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Measurand, MeasurandStr[Energy_Active_Export_Interval]);
-    	//   strcpy(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Phase, PhaseStr[L1]);
-    	strcpy(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Location, LocationStr[Location_Outlet]);
-    	strcpy(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Unit,UnitOfMeasureStr[UnitOfMeasure_Wh]);
-
-
-    	printf("meter error 1\n");
-    	json_object_object_add(sampledValue, "value", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value));
-    	printf("meter error 2\n");
-    	json_object_object_add(sampledValue, "context", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Context));
-    	printf("meter error 3\n");
-    	json_object_object_add(sampledValue, "format", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Format));
-    	printf("meter error 4\n");
-    	json_object_object_add(sampledValue, "measurand", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Measurand));
-    	//	json_object_object_add(sampledValue, "phase", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Phase));
-    	printf("meter error 5\n");
-    	json_object_object_add(sampledValue, "location", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Location));
-    	printf("meter error 6\n");
-    	json_object_object_add(sampledValue, "unit", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Unit));
-    	printf("meter error 7\n");
-    	json_object_array_add(sampledArray, sampledValue);
-    	printf("meter error 8\n");
-
-    	idx_sample=3;
-		//sampledValue = NULL;
-		sampledValue = json_object_new_object();
-		/********************************(4)Power.Active.Export************************************************/
-		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)
-			{
-				//ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingPower = 100.0;
-				sprintf(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%f" , ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingPower);
-			}
-		}
-
-		for (int index = 0; index < CCS_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)
-			{
-				//ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingPower = 100.0;
-				sprintf(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%f" , ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingPower);
-			}
-		}
-
-		for (int index = 0; index < GB_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)
-			{
-				ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingPower = 100.0;
-				sprintf(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%f" , ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingPower);
-			}
-		}
-
-		strcpy(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Context, ReadingContextStr[ReadingContext_Sample_Periodic]);
-		strcpy(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Format, ValueFormatStr[Raw]);
-		strcpy(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Measurand, MeasurandStr[Power_Active_Export]);
-		strcpy(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Phase, PhaseStr[L1_N]);
-		strcpy(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Location, LocationStr[Location_Outlet]);
-		strcpy(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Unit,UnitOfMeasureStr[UnitOfMeasure_A]);
-
-		printf("meter error 35\n");
-		json_object_object_add(sampledValue, "value", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value));
-		printf("meter error 36\n");
-		json_object_object_add(sampledValue, "context", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Context));
-		printf("meter error 37\n");
-		json_object_object_add(sampledValue, "format", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Format));
-		printf("meter error 38\n");
-		json_object_object_add(sampledValue, "measurand", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Measurand));
-		printf("meter error 39\n");
-		json_object_object_add(sampledValue, "phase", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Phase));
-		printf("meter error 40\n");
-		json_object_object_add(sampledValue, "location", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Location));
-		printf("meter error 41\n");
-		json_object_object_add(sampledValue, "unit", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Unit));
-		printf("meter error 42\n");
-		json_object_array_add(sampledArray, sampledValue);
-		printf("meter error 43\n");
-
-#endif
-
-		idx_sample=4;
-		//sampledValue = NULL;
-		sampledValue = json_object_new_object();
-		/***********************************************(5)VOLTAGE******************************************************/
-		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)
-			{
-				//ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingVoltage = 80.0;
-				sprintf(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingVoltage );
-			}
-		}
-
-		for (int index = 0; index < CCS_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)
-			{
-				//ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingVoltage = 80.0;
-				sprintf(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingVoltage );
-			}
-		}
-
-		for (int index = 0; index < GB_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)
-			{
-				//ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingVoltage = 80.0;
-				sprintf(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingVoltage );
-			}
-		}
-
-		strcpy(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Context, ReadingContextStr[ReadingContext_Sample_Periodic]);
-		strcpy(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Format, ValueFormatStr[Raw]);
-		strcpy(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Measurand, MeasurandStr[Voltage]);
-		strcpy(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Phase, PhaseStr[L1_N]);
-		strcpy(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Location, LocationStr[Location_Outlet]);
-		strcpy(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Unit,UnitOfMeasureStr[UnitOfMeasure_V]);
-
-		printf("meter error 9\n");
-		json_object_object_add(sampledValue, "value", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value));
-		printf("meter error 10\n");
-		json_object_object_add(sampledValue, "context", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Context));
-		printf("meter error 11\n");
-		json_object_object_add(sampledValue, "format", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Format));
-		printf("meter error 12\n");
-		json_object_object_add(sampledValue, "measurand", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Measurand));
-		printf("meter error 13\n");
-		json_object_object_add(sampledValue, "phase", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Phase));
-		printf("meter error 14\n");
-		json_object_object_add(sampledValue, "location", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Location));
-		printf("meter error 15\n");
-		json_object_object_add(sampledValue, "unit", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Unit));
-		printf("meter error 16\n");
-		json_object_array_add(sampledArray, sampledValue);
-
-		if(strcmp(ShmSysConfigAndInfo->SysConfig.ModelName ,"DC") == 0)
-		{
-			idx_sample=5;
-			//sampledValue = NULL;
-			sampledValue = json_object_new_object();
-			/***********************************************(6)SOC******************************************************/
-			for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)
-				{
-					//ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].EvBatterySoc = 50;
-					sprintf(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].EvBatterySoc );
-				}
-			}
-
-			for (int index = 0; index < CCS_QUANTITY; index++)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)
-				{
-					//ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].EvBatterySoc = 50;
-					sprintf(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].EvBatterySoc );
-				}
-			}
-
-			for (int index = 0; index < GB_QUANTITY; index++)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)
-				{
-					//ShmSysConfigAndInfo->SysInfo.GbChargingData[index].EvBatterySoc = 50;
-					sprintf(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].EvBatterySoc );
-				}
-			}
-
-			strcpy(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Context, ReadingContextStr[ReadingContext_Sample_Periodic]);
-			strcpy(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Format, ValueFormatStr[Raw]);
-			strcpy(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Measurand, MeasurandStr[SoC]);
-			strcpy(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Phase, PhaseStr[L1_N]);
-			strcpy(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Location, LocationStr[Location_Outlet]);
-			strcpy(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Unit,UnitOfMeasureStr[UnitOfMeasure_Percent]);
-
-			printf("meter error 9\n");
-			json_object_object_add(sampledValue, "value", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value));
-			printf("meter error 10\n");
-			json_object_object_add(sampledValue, "context", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Context));
-			printf("meter error 11\n");
-			json_object_object_add(sampledValue, "format", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Format));
-			printf("meter error 12\n");
-			json_object_object_add(sampledValue, "measurand", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Measurand));
-			printf("meter error 13\n");
-			json_object_object_add(sampledValue, "phase", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Phase));
-			printf("meter error 14\n");
-			json_object_object_add(sampledValue, "location", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Location));
-			printf("meter error 15\n");
-			json_object_object_add(sampledValue, "unit", json_object_new_string((const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Unit));
-			printf("meter error 16\n");
-			json_object_array_add(sampledArray, sampledValue);
-
-		}
-
-		//}
-		json_object_object_add(transactionData, "sampledValue", sampledArray);
-		json_object_array_add(meterValueDataArray, transactionData);
-	}
-	json_object_object_add(payload, "meterValue", meterValueDataArray);
-
-	json_object_array_add(message, json_object_new_int(MESSAGE_TYPE_CALL));
-	random_uuid(guid);
-	json_object_array_add(message, json_object_new_string(guid));
-	json_object_array_add(message, json_object_new_string("MeterValues"));
-	json_object_array_add(message, payload);
-
-	printf("enter sendMeterValuesRequest -3\n");
-	printf("before send message=%s\n",json_object_to_json_string(message));
-	Send(message);
-
-	if(mapItem == NULL)
-	 {
-		mapItem = malloc(sizeof(data_struct_t));
-		printf("mapItem is null\n");
-	}
-
-	if(guid == NULL || mapItem->key_string == NULL)
-	{
-		printf("guid is NULL \n");
-	}
-
-	if(mapItem->key_string == NULL)
-	{
-		printf("mapItem->key_string is NULL\n");
-	}
-
-	printf("enter sendMeterValuesRequest -4\n");
-	// Put request guid to hash map
-	sprintf(mapItem->key_string, "%s", guid);
-	sprintf(mapItem->key_value, "MeterValues,%d", (gun_index));
-	//sprintf(mapItem->key_value, senstr);//sprintf(mapItem->key_value, "StopTransaction");
-	if(hashmap_operation(0,hashMap, mapItem->key_string, mapItem->key_value/*mapItem*/, (void**)(&mapItem)) ==  MAP_OK/*hashmap_put(hashMap, mapItem->key_string, mapItem) == MAP_OK*/)
-	{
-		result = PASS;
-		printf("MeterValues mapitem pass");
-	}
-
-
-	strcpy(queuedata, (char*)json_object_to_json_string(message));
-	queue_operation(4, guid, queuedata );//addq(guid, queuedata);  ---> remove temporally
-	printf("enter sendMeterValuesRequest -5\n");
-
-	//addq(guid, (char*)json_object_to_json_string(message));
-	#ifdef SystemLogMessage
-	DEBUG_INFO(">>>>>MeerValues request\n");
-	DEBUG_INFO("Message: %s\n", SendBuffer);
-	DEBUG_INFO("After push hash length: %d\n", hashmap_length(hashMap));
-	#endif
-
-	json_object_put(message);
-	return result;
-
-}
-
-
-//==========================================
-// send confirm routine
-//==========================================
-int sendCancelReservationConfirmation(char *uuid,char *payload)
-{
-	int result = FAIL;
-
-	struct json_object *message, *comfirmpayload;
-	char guid[37];
-
-	printf("handle CancelReservationRequest\n");
-	message = json_object_new_array();
-	comfirmpayload = json_object_new_object();
-	json_object_object_add(comfirmpayload, "status", json_object_new_string((const char *)payload));
-
-
-	json_object_array_add(message, json_object_new_int(MESSAGE_TYPE_CALLRESULT));
-
-	json_object_array_add(message, json_object_new_string(uuid));
-
-	json_object_array_add(message, comfirmpayload);
-
-
-	Send(message);
-
-	json_object_put(message);
-
-
-	return result;
-}
-
-int sendChangeAvailabilityConfirmation(char *uuid,char *payload)
-{
-	int result = FAIL;
-
-	struct json_object *message, *comfirmpayload;
-	char guid[37];
-
-	printf("handle sendChangeAvailabilityConfirmation\n");
-	message = json_object_new_array();
-	comfirmpayload = json_object_new_object();
-	json_object_object_add(comfirmpayload, "status", json_object_new_string((const char *)payload));
-
-
-	json_object_array_add(message, json_object_new_int(MESSAGE_TYPE_CALLRESULT));
-
-	json_object_array_add(message, json_object_new_string(uuid));
-
-	json_object_array_add(message, comfirmpayload);
-
-
-	Send(message);
-
-	json_object_put(message);
-
-	return result;
-}
-
-int sendChangeConfigurationConfirmation(char *uuid,char *payload)
-{
-	int result = FAIL;
-
-	struct json_object *message, *comfirmpayload;
-	char guid[37];
-
-	printf("handle sendChangeConfigurationConfirmation\n");
-	message = json_object_new_array();
-	comfirmpayload = json_object_new_object();
-	json_object_object_add(comfirmpayload, "status", json_object_new_string((const char *)payload));
-
-
-	json_object_array_add(message, json_object_new_int(MESSAGE_TYPE_CALLRESULT));
-
-	json_object_array_add(message, json_object_new_string(uuid));
-
-    json_object_array_add(message, comfirmpayload);
-
-    printf("handle sendChangeConfigurationConfirmation -1\n");
-	Send(message);
-	printf("handle sendChangeConfigurationConfirmation- 2\n");
-	json_object_put(message);
-
-	return result;
-}
-
-int sendClearCacheConfirmation(char *uuid,char *payload)
-{
-	int result = FAIL;
-
-	struct json_object *message, *comfirmpayload;
-	char guid[37];
-
-	printf("sendClearCacheConfirmation\n");
-	message = json_object_new_array();
-	comfirmpayload = json_object_new_object();
-	json_object_object_add(comfirmpayload, "status", json_object_new_string((const char *)payload));
-
-
-	json_object_array_add(message, json_object_new_int(MESSAGE_TYPE_CALLRESULT));
-
-	json_object_array_add(message, json_object_new_string(uuid));
-
-    json_object_array_add(message, comfirmpayload);
-
-	Send(message);
-	json_object_put(message);
-
-	return result;
-}
-
-int sendClearChargingProfileConfirmation(char *uuid,char *payload)
-{
-	int result = FAIL;
-
-	struct json_object *message, *comfirmpayload;
-	char guid[37];
-
-	printf("sendClearChargingProfileConfirmation\n");
-	message = json_object_new_array();
-	comfirmpayload = json_object_new_object();
-	json_object_object_add(comfirmpayload, "status", json_object_new_string((const char *)payload));
-
-
-	json_object_array_add(message, json_object_new_int(MESSAGE_TYPE_CALLRESULT));
-
-	json_object_array_add(message, json_object_new_string(uuid));
-
-    json_object_array_add(message, comfirmpayload);
-
-
-	Send(message);
-
-	json_object_put(message);
-
-
-	return result;
-}
-
-int sendDataTransferConfirmation(char *uuid,char *payload)
-{
-	int result = FAIL;
-
-	struct json_object *obj;
-	char guid[37];
-	obj = json_tokener_parse(payload);
-	printf("handle   DataTransferRequest\n");
-
-	return result;
-}
-
-int sendGetCompositeScheduleConfirmation(char *uuid,char *payload, int connectorIdInt,int nPeriod)
-{
-	int result = FAIL;
-
-
-	struct json_object *message, *comfirmpayload, *chargingSchedule, *sampledArray, *sampledValue;
-
-	printf("handle sendGetCompositeScheduleConfirmation\n");
-	message = json_object_new_array();
-
-	comfirmpayload = json_object_new_object();
-	chargingSchedule  = json_object_new_object();
-
-	json_object_object_add(comfirmpayload, "status", json_object_new_string((const char *)payload));
-	json_object_object_add(comfirmpayload, "connectorId ", json_object_new_int(connectorIdInt));
-	json_object_object_add(comfirmpayload, "scheduleStart", json_object_new_string((const char *)ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.StartSchedule));
-
-
-	json_object_object_add(chargingSchedule, "duration", json_object_new_int(ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.Duration) );
-	json_object_object_add(chargingSchedule, "startSchedule", json_object_new_string((const char *)ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.StartSchedule) );
-	json_object_object_add(chargingSchedule, "chargingRateUnit", json_object_new_string((const char *)ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingRateUnit) );
-
-
-	sampledArray = json_object_new_array();
-	int len = nPeriod;//sizeof(ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod)/sizeof(ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[0]);
-
-	printf("sendGetCompositeScheduleConfirmation nPeriod =%d\n", len);
-	for(int idx_sample=0;idx_sample< len;idx_sample++)
-	{
-		sampledValue = json_object_new_object();
-
-		json_object_object_add(sampledValue, "startPeriod", json_object_new_int(ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[0].StartPeriod));
-		json_object_object_add(sampledValue, "limit", json_object_new_double((double)ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[0].Limit));
-		json_object_object_add(sampledValue, "numberPhases", json_object_new_int(ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[0].NumberPhases));
-
-		json_object_array_add(sampledArray, sampledValue);
-	}
-
-	json_object_object_add(chargingSchedule, "chargingSchedulePeriod", sampledArray);
-
-	json_object_object_add(chargingSchedule, "minChargingRate ", json_object_new_double((double)ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.MinChargingRate) );
-
-
-	json_object_object_add(comfirmpayload, "chargingSchedule", chargingSchedule );
-
-	json_object_array_add(message, json_object_new_int(MESSAGE_TYPE_CALLRESULT));
-
-	json_object_array_add(message, json_object_new_string(uuid));
-
-    json_object_array_add(message, comfirmpayload);
-
-
-	Send(message);
-
-	json_object_put(message);
-	return result;
-}
-
-int sendGetConfigurationConfirmation(char *uuid)
-{
-	int result = FAIL;
-	int MaxKeySupported = 0;
-	int sentConfigurationNumber= 0;
-	struct json_object *message = NULL, *comfirmpayload =NULL, *configurationKeyArray=NULL, *unknownKeyArray=NULL, *sampledValue=NULL;
-
-	printf("handle sendGetConfigurationConfirmation\n");
-	message = json_object_new_array();
-
-    comfirmpayload = json_object_new_object();
-
-
-    configurationKeyArray = json_object_new_array();
-
-    MaxKeySupported = atoi(ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemData);
-    printf("MaxKeySupported=%d\n",MaxKeySupported);
-//	int configurationKeyArraylen = sizeof(ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey)/sizeof(ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[0]);
-
-//	printf("configurationKeyArraylen =%d\n", configurationKeyArraylen);
-
-    FILE *fp = fopen ("configuration.json", "w+"); /* open file for writing */
-    if (!fp) {  /* validate file is open, or throw error */
-          fprintf (stderr, "jsonout() error: file open failed '%s'.\n",
-        		  "configuration.json");
-          return;
-      }
-
-    fprintf (fp, "{ \"configurationKey\" : [");    /* print header to file */
-    //configuration key
-	for(int idx_sample=0;idx_sample< MaxKeySupported/*43*/;idx_sample++)
-	{
-		if(strcmp(ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[idx_sample].Key, "")!= 0)
-		{
-
-			printf("test test enter add configurationKey\n");
-		    sampledValue = json_object_new_object();
-
-			printf("ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[idx_sample].Key=%s\n",ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[idx_sample].Key);
-			printf("ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[idx_sample].ReadOnly=%d\n", atoi(ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[idx_sample].ReadOnly));
-			printf("ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[idx_sample].Value=%s\n",ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[idx_sample].Value);
-
-
-
-			json_object_object_add(sampledValue, "key", json_object_new_string((const char *)(ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[idx_sample].Key)));
-			printf("error 1\n");
-			json_object_object_add(sampledValue, "readonly", json_object_new_boolean(atoi(ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[idx_sample].ReadOnly)));
-			printf("error 2\n");
-			json_object_object_add(sampledValue, "value", json_object_new_string((const char *)(ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[idx_sample].Value)));
-			printf("error 3\n");
-			printf("sampledValue=%s\n",json_object_get_string(sampledValue));
-			//json_object_array_add(configurationKeyArray, sampledValue);
-			printf("idx_sample=%d\n",idx_sample);
-
-			if (sentConfigurationNumber == 0)
-				fprintf (fp, " %s", json_object_get_string(sampledValue));
-			else
-			    fprintf (fp, ", %s", json_object_get_string(sampledValue));
-
-			printf("error 4\n");
-			json_object_put(sampledValue);
-			sentConfigurationNumber = sentConfigurationNumber + 1;
-		}
-
-	}
-
-	fprintf (fp, " ] }\n");     /* print closing tag */
-	fclose (fp);
-	printf("configurationKeyArray=%s\n",json_object_get_string(configurationKeyArray));
-	//json_object_object_add(comfirmpayload, "configurationKey", configurationKeyArray );
-	//get json object from file
-	comfirmpayload = json_object_from_file("configuration.json");
-	printf("comfirmpayload=%s\n",json_object_get_string(comfirmpayload));
-	printf("error 5\n");
-
-	unknownKeyArray = json_object_new_array();
-	printf("error 6\n");
-	//sampledValue = NULL;
-
-	//unkown key
-	for(int idx_sample=0;idx_sample< UnknownKeynum ;idx_sample++)
-	{
-		// json_object *jstring1 = json_object_new_string((const char *)((ShmOCPP16Data->GetConfiguration.ResponseUnknownKey + idx_sample)->Item));
-		printf("unkown key:%s\n", ShmOCPP16Data->GetConfiguration.ResponseUnknownKey[idx_sample].Item);
-		json_object *jstring1 = json_object_new_string((const char *)(ShmOCPP16Data->GetConfiguration.ResponseUnknownKey[idx_sample].Item));
-
-		json_object_array_add(unknownKeyArray, jstring1);
-	}
-	printf("error 7\n");
-	if(UnknownKeynum != 0)
-	json_object_object_add(comfirmpayload, "unknownKey ", unknownKeyArray );
-
-	json_object_array_add(message, json_object_new_int(MESSAGE_TYPE_CALLRESULT));
-
-	json_object_array_add(message, json_object_new_string(uuid));
-
-	json_object_array_add(message, comfirmpayload);
-	printf("error 8\n");
-	Send(message);
-	//if(UnknownKeynum == 0)
-	//	json_object_put(unknownKeyArray);
-
-	//json_object_put(configurationKeyArray);
-
-	json_object_put(message);
-	system("rm -f configuration.json");
-
-
-	printf("error 9\n");
-
-	return result;
-}
-
-int sendGetDiagnosticsConfirmation(char *uuid,char *payload)
-{
-	int result = FAIL;
-
-	printf("handle     GetDiagnosticsRequest\n");
-
-	struct json_object *message, *comfirmpayload;
-
-	printf("handle sendChangeConfigurationConfirmation\n");
-	message = json_object_new_array();
-	comfirmpayload = json_object_new_object();
-	json_object_object_add(comfirmpayload, "fileName", json_object_new_string((const char *)payload));
-
-
-	json_object_array_add(message, json_object_new_int(MESSAGE_TYPE_CALLRESULT));
-
-	json_object_array_add(message, json_object_new_string(uuid));
-
-	json_object_array_add(message, comfirmpayload);
-
-	Send(message);
-    json_object_put(message);
-
-	return result;
-}
-
-int sendGetLocalListVersionConfirmation(char *uuid,char *payload)
-{
-	int result = FAIL;
-	printf("handle    GetLocalListVersionRequest\n");
-	struct json_object *message, *comfirmpayload;
-
-	message = json_object_new_array();
-	comfirmpayload = json_object_new_object();
-	json_object_object_add(comfirmpayload, "listVersion", json_object_new_int(ShmOCPP16Data->GetLocalListVersion.ResponseListVersion));
-
-
-	json_object_array_add(message, json_object_new_int(MESSAGE_TYPE_CALLRESULT));
-
-	json_object_array_add(message, json_object_new_string(uuid));
-
-	json_object_array_add(message, comfirmpayload);
-
-	Send(message);
-
-	json_object_put(message);
-
-
-	return result;
-}
-
-int sendRemoteStartConfirmation(char *uuid,char *payload)
-{
-	int result = FAIL;
-	printf("handleRemoteStartRequest\n");
-	struct json_object *message, *comfirmpayload;
-
-	message = json_object_new_array();
-	comfirmpayload = json_object_new_object();
-	json_object_object_add(comfirmpayload, "status", json_object_new_string(payload));
-
-	json_object_array_add(message, json_object_new_int(MESSAGE_TYPE_CALLRESULT));
-
-	json_object_array_add(message, json_object_new_string(uuid));
-
-	json_object_array_add(message, comfirmpayload);
-
-
-	Send(message);
-	json_object_put(message);
-
-	return result;
-}
-
-int sendRemoteStopTransactionConfirmation(char *uuid,char *payload)
-{
-	int result = FAIL;
-
-	struct json_object *message, *comfirmpayload;
-	printf("handleRemoteStopTransactionRequest\n");
-	message = json_object_new_array();
-	comfirmpayload = json_object_new_object();
-	json_object_object_add(comfirmpayload, "status", json_object_new_string(payload));
-
-
-	json_object_array_add(message, json_object_new_int(MESSAGE_TYPE_CALLRESULT));
-
-	json_object_array_add(message, json_object_new_string(uuid));
-
-	json_object_array_add(message, comfirmpayload);
-
-
-	Send(message);
-
-	json_object_put(message);
-
-	return result;
-}
-
-int sendReserveNowTransactionConfirmation(char *uuid,char *payload)
-{
-	int result = FAIL;
-
-	struct json_object *message, *comfirmpayload;
-	printf("sendReserveNowTransactionConfirmation\n");
-	message = json_object_new_array();
-	comfirmpayload = json_object_new_object();
-
-	json_object_object_add(comfirmpayload, "status", json_object_new_string(payload));
-
-
-	json_object_array_add(message, json_object_new_int(MESSAGE_TYPE_CALLRESULT));
-
-	json_object_array_add(message, json_object_new_string(uuid));
-
-	json_object_array_add(message, comfirmpayload);
-
-
-	Send(message);
-	json_object_put(message);
-
-	return result;
-}
-
-int sendResetConfirmation(char *uuid,char *payload)
-{
-	int result = FAIL;
-
-	struct json_object *message, *comfirmpayload;
-	printf("sendResetConfirmation\n");
-	message = json_object_new_array();
-	comfirmpayload = json_object_new_object();
-	json_object_object_add(comfirmpayload, "status", json_object_new_string((const char *)payload));
-
-
-	json_object_array_add(message, json_object_new_int(MESSAGE_TYPE_CALLRESULT));
-
-	json_object_array_add(message, json_object_new_string(uuid));
-
-	json_object_array_add(message, comfirmpayload);
-
-
-	Send(message);
-
-	json_object_put(message);
-
-	return result;
-}
-
-int sendSendLocalListConfirmation(char *uuid,char *payload)
-{
-	int result = FAIL;
-	struct json_object *message, *comfirmpayload;
-
-	printf("handle sendSendLocalListConfirmation\n");
-	message = json_object_new_array();
-	comfirmpayload = json_object_new_object();
-	json_object_object_add(comfirmpayload, "status", json_object_new_string((const char *)payload));
-
-
-	json_object_array_add(message, json_object_new_int(MESSAGE_TYPE_CALLRESULT));
-
-	json_object_array_add(message, json_object_new_string(uuid));
-
-	json_object_array_add(message, comfirmpayload);
-
-	Send(message);
-
-	json_object_put(message);
-
-	return result;
-}
-
-int sendSetChargingProfileConfirmation(char *uuid,char *payload)
-{
-	int result = FAIL;
-
-	printf("handleSetChargingProfileRequest\n");
-	struct json_object *message, *comfirmpayload;
-
-	message = json_object_new_array();
-	comfirmpayload = json_object_new_object();
-	json_object_object_add(comfirmpayload, "status", json_object_new_string((const char *)payload));
-
-
-	json_object_array_add(message, json_object_new_int(MESSAGE_TYPE_CALLRESULT));
-
-	json_object_array_add(message, json_object_new_string(uuid));
-
-	json_object_array_add(message, comfirmpayload);
-
-	Send(message);
-
-	json_object_put(message);
-
-	return result;
-}
-
-int sendTriggerMessageConfirmation(char *uuid,char *payload)
-{
-	int result = FAIL;
-
-	printf("sendTriggerMessageConfirmation\n");
-	struct json_object *message, *comfirmpayload;
-
-	message = json_object_new_array();
-	comfirmpayload = json_object_new_object();
-	json_object_object_add(comfirmpayload, "status", json_object_new_string((const char *)payload));
-
-
-	json_object_array_add(message, json_object_new_int(MESSAGE_TYPE_CALLRESULT));
-
-	json_object_array_add(message, json_object_new_string(uuid));
-
-	json_object_array_add(message, comfirmpayload);
-
-
-	Send(message);
-
-	json_object_put(message);
-	return result;
-}
-
-int sendUnlockConnectorConfirmation(char *uuid,char *payload)
-{
-	int result = FAIL;
-
-	printf("sendUnlockConnectorConfirmation\n");
-	struct json_object *message, *comfirmpayload;
-
-	message = json_object_new_array();
-	comfirmpayload = json_object_new_object();
-	json_object_object_add(comfirmpayload, "status", json_object_new_string((const char *)payload));
-
-
-	json_object_array_add(message, json_object_new_int(MESSAGE_TYPE_CALLRESULT));
-
-	json_object_array_add(message, json_object_new_string(uuid));
-
-	json_object_array_add(message, comfirmpayload);
-
-	Send(message);
-
-    json_object_put(message);
-
-	return result;
-}
-
-int sendUpdateFirmwareConfirmation(char *uuid)
-{
-	int result = FAIL;
-
-	printf("sendUpdateFirmwareConfirmation\n");
-	struct json_object *message, *comfirmpayload;
-
-	message = json_object_new_array();
-	comfirmpayload = json_object_new_object();
-
-
-	json_object_array_add(message, json_object_new_int(MESSAGE_TYPE_CALLRESULT));
-
-	json_object_array_add(message, json_object_new_string(uuid));
-
-	json_object_array_add(message, comfirmpayload);
-
-
-	Send(message);
-
-	json_object_put(message);
-
-	return result;
-}
-
-
-//==========================================
-// send CallError routine
-//==========================================
-void SendCallError(char *uniqueId, char *action, char *errorCode, char *errorDescription)
-{
-
-
-	#ifdef SystemLogMessage
-	DEBUG_INFO("An error occurred. Sending this information: uniqueId {}: action: {}, errorCore: {}, errorDescription: {}\n",
-            uniqueId, action, errorCode, errorDescription);
-	#endif
-
-	printf("SendCallError\n");
-	struct json_object *message/*, *comfirmpayload*/;
-
-	message = json_object_new_array();
-	//comfirmpayload = json_object_new_object();
-
-
-	json_object_array_add(message, json_object_new_int(MESSAGE_TYPE_CALLERROR));
-
-	json_object_array_add(message, json_object_new_string(uniqueId));
-	json_object_array_add(message, json_object_new_string(errorCode));
-	json_object_array_add(message, json_object_new_string(errorDescription));
-
-	json_object_array_add(message, json_object_new_string("{}"));
-
-
-	Send(message);
-
-	json_object_put(message);
-
-}
-
-
-//==========================================
-// Handle server request routine  Start
-//==========================================
-#define GUN_NUM     1
-int handleCancelReservationRequest(char *uuid, char *payload)
-{
-	int result = FAIL;
-    int gunNO = 0;
-	struct json_object *obj, *reservationId;
-	int reservationIdInt =0;
-	char comfirmstr[20];
-	obj = json_tokener_parse(payload);
-	printf("handle CancelReservationRequest\n");
-
-	ShmOCPP16Data->CsMsg.bits[gunNO].CancelReservationReq = 1;
-
-	reservationId = json_object_object_get(obj, "reservationId");
-	reservationIdInt = json_object_get_int(reservationId);
-
-	memset(comfirmstr, 0, sizeof comfirmstr);
-	sprintf(comfirmstr, "%s", CancelReservationStatusStr[CancelReservationStatus_Rejected]);
-
-	 //0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault, 8: Reserved, 9: maintain
-	 //check Transaction active
-	 for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-	 {
-		 if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId == reservationIdInt)
-		 {
-			 sprintf(comfirmstr, "%s", CancelReservationStatusStr[CancelReservationStatus_Accepted] );
-			 sprintf((char *)ShmOCPP16Data->CancelReservation[ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index].ResponseStatus, "%s", comfirmstr );
-			 gunNO = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index;
-			 ShmOCPP16Data->CsMsg.bits[gunNO].CancelReservationReq = 1;
-		 }
-	  }
-
-	  for (int index = 0; index < CCS_QUANTITY; index++)
-	  {
-		  if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ReservationId == reservationIdInt)
-		  {
-			  sprintf(comfirmstr, "%s", CancelReservationStatusStr[CancelReservationStatus_Accepted] );
-			  sprintf((char *)ShmOCPP16Data->CancelReservation[ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index].ResponseStatus, "%s", comfirmstr );
-			  gunNO = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index;
-			  ShmOCPP16Data->CsMsg.bits[gunNO].CancelReservationReq = 1;
-		  }
-	  }
-
-	  for (int index = 0; index < GB_QUANTITY; index++)
-	  {
-		  if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ReservationId == reservationIdInt)
-		  {
-			  sprintf(comfirmstr, "%s", CancelReservationStatusStr[CancelReservationStatus_Accepted] );
-			  sprintf((char *)ShmOCPP16Data->CancelReservation[ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index].ResponseStatus, "%s", comfirmstr );
-			  gunNO = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index;
-
-			  ShmOCPP16Data->CsMsg.bits[gunNO].CancelReservationReq = 1;
-		  }
-	  }
-
-	  // Fill in ocpp packet uuid
-	  strcpy(ShmOCPP16Data->CancelReservation[gunNO].guid, uuid);
-	  json_object_put(obj);
-#if 0 // CSU Will do it.
-	sendCancelReservationConfirmation(uuid, comfirmstr);
-	ShmOCPP16Data->CsMsg.bits[gunNO].CancelReservationConf = 1;
-#endif
-	return result;
-}
-
-int handleChangeAvailabilityRequest(char *uuid, char *payload)
-{
-	int result = FAIL;
-    int gunIndex = 0;
-	struct json_object *obj, *connectorId, *type;
-	char comfirmstr[20];
-	int specificId = FALSE;
-
-	obj = json_tokener_parse(payload);
-	printf("handle ChangeAvailabilityRequest\n");
-
-	connectorId = json_object_object_get(obj, "connectorId");
-	type = json_object_object_get(obj, "type");
-
-	gunIndex = json_object_get_int(connectorId);
-	ShmOCPP16Data->ChangeAvailability[gunIndex - 1].ConnectorId= gunIndex;
-	sprintf((char *)ShmOCPP16Data->ChangeAvailability[gunIndex - 1].Type, "%s", json_object_get_string(type)  );
-
-
-	memset(comfirmstr, 0, sizeof comfirmstr);
-	sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
-	ShmOCPP16Data->CsMsg.bits[gunIndex - 1].ChangeAvailabilityReq = 1;
-
-	if((gunIndex  == 0) || ((gunIndex - 1) < (CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY)))
-	{
-		specificId = TRUE;
-	}
-
-	if(specificId == FALSE)
-		goto end;
-	/*
-	enum _SYSTEM_STATUS
-	{
-	S_BOOTING               = 0,
-	S_IDLE,                 = 1
-	S_AUTHORIZING,          =2
-	S_REASSIGN_CHECK,       =3
-	S_REASSIGN,             =4
-	S_PRECHARGE,            =5
-	S_PREPARING_FOR_EV,     =6
-	S_PREPARING_FOR_EVSE,   =7
-	S_CHARGING,             =8
-	S_TERMINATING,          =9
-	S_COMPLETE,             =10
-	S_ALARM,                =11
-	S_FAULT                 =12
-	}
- 	 */
-	if(strcmp((const char *)ShmOCPP16Data->ChangeAvailability[gunIndex - 1].Type, AvailabilityTypeStr[Inoperative]) == 0)
-	{
-
-		//0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault, 8: Reserved, 9: maintain
-	    //check Transaction active
-	    for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-	    {
-	    	if ((gunIndex  == 0) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == (gunIndex - 1)))
-	    	{
-
-	    		if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 5) // S_PRECHARGE
-	    		{
-	    			sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
-	    		}
-	    		else if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 8)  // S_CHARGING
-	    		{
-	    			sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
-	    		}
-	    		else
-	    		{
-	    			sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
-	    		}
-
-	    		goto end;
-	    	}
-	    }
-
-	    for (int index = 0; index < CCS_QUANTITY; index++)
-	    {
-	    	if ((gunIndex  == 0)|| (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == (gunIndex - 1)))
-	    	{
-	    		if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 5)// S_PRECHARGE
-	    		{
-	    			sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
-	    		}
-	    		else if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 8) // S_CHARGING
-	    		{
-	    			sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
-	    		}
-	    		else
-	    		{
-	    			sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
-	    		}
-
-
-	    		goto end;
-	    	}
-	    }
-
-	    for (int index = 0; index < GB_QUANTITY; index++)
-	    {
-	    	if ((gunIndex  == 0)||(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == (gunIndex - 1)))
-	    	{
-	    		if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 5) // S_PRECHARGE
-	    		{
-	    			sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
-	    		}
-	    		else if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 8) // S_CHARGING
-	    		{
-	    			sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
-	    		}
-	    		else
-	    		{
-		    		sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
-	    		}
-
-	    		goto end;
-	    	}
-	    }
-
-	}
-
-
-	if(strcmp((const char *)ShmOCPP16Data->ChangeAvailability[gunIndex - 1].Type, AvailabilityTypeStr[Operative]) == 0)
-	{
-
-	    //0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault, 8: Reserved, 9: maintain
-	    //check Transaction active
-	    for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-	    {
-	    	if (((gunIndex  == 0)|| (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == (gunIndex - 1))) &&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != 12))  //S_FAULT
-	    	{
-	    		ShmOCPP16Data->CsMsg.bits[gunIndex - 1].ChangeAvailabilityReq = 1;
-	    		sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
-	    		goto end;
-	    	}
-	    }
-
-	    for (int index = 0; index < CCS_QUANTITY; index++)
-	    {
-	    	if (((gunIndex  == 0)|| (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == (gunIndex - 1)))&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != 12)) //S_FAULT
-	    	{
-	    		ShmOCPP16Data->CsMsg.bits[gunIndex - 1].ChangeAvailabilityReq = 1;
-	    		sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
-	    		goto end;
-	    	}
-	    }
-
-	    for (int index = 0; index < GB_QUANTITY; index++)
-	    {
-	    	if (((gunIndex  == 0)||(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == (gunIndex - 1)))&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != 12)) //S_FAULT
-	    	{
-	    		ShmOCPP16Data->CsMsg.bits[gunIndex - 1].ChangeAvailabilityReq = 1;
-	    		sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
-	    		goto end;
-	    	}
-	    }
-
-	    //sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
-	}
-
-	end:
-	json_object_put(obj);
-	sprintf((char *)ShmOCPP16Data->ChangeAvailability[gunIndex - 1].ResponseStatus, "%s", comfirmstr );
-	sendChangeAvailabilityConfirmation(uuid, comfirmstr);
-
-	//ShmOCPP16Data->CsMsg.bits[gunIndex - 1].ChangeAvailabilityConf = 1;
-
-	return result;
-}
-
-int handleChangeConfigurationRequest(char *uuid, char *payload)
-{
-
-	int result = FAIL;
-	char comfirmstr[20];
-
-	printf("handle ChangeConfigurationRequest\n");
-
-	struct json_object *obj, *key, *value;
-	char *keystr, *valuestr;
-
-	obj = json_tokener_parse(payload);
-
-	key = json_object_object_get(obj, "key");
-	value = json_object_object_get(obj, "value");
-
-	keystr= json_object_get_string(key);
-	valuestr = json_object_get_string(value);
-
-    if((uuid==NULL) || (payload ==NULL) )
-    {
-    	sprintf(comfirmstr, "%s", ConfigurationStatusStr[ConfigurationStatus_Rejected] );
-
-    }
-    else
-    {
-    	int status = setKeyValue(keystr, valuestr);
-
-    	switch(status)
-    	{
-    		case ConfigurationStatus_Accepted:
-    			sprintf(comfirmstr, "%s", ConfigurationStatusStr[ConfigurationStatus_Accepted]);
-    			ShmOCPP16Data->MsMsg.bits.ChangeConfigurationReq = 1;
-
-    		break;
-
-    		case ConfigurationStatus_Rejected:
-    			sprintf(comfirmstr, "%s", ConfigurationStatusStr[ConfigurationStatus_Rejected] );
-    		break;
-
-    		case RebootRequired:
-    			sprintf(comfirmstr, "%s", ConfigurationStatusStr[RebootRequired]);
-    		break;
-
-    		case NotSupported:
-    			sprintf(comfirmstr, "%s", ConfigurationStatusStr[NotSupported] );
-    			break;
-
-    		default:
-    		break;
-    	}
-    }
-
-    if(errno >=1)
-    {
-    	sprintf(comfirmstr, "%s", ConfigurationStatusStr[ConfigurationStatus_Rejected] );
-    	fprintf(stderr,"%d %s\\n",errno,strerror(errno));
-    }
-
-    //confirmation.setStatus(ConfigurationStatus.Rejected);
-    json_object_put(obj);
-	sendChangeConfigurationConfirmation(uuid, comfirmstr);
-	ShmOCPP16Data->MsMsg.bits.ChangeConfigurationConf = 1;
-
-
-	return result;
-}
-
-int handleClearCacheRequest(char *uuid, char *payload)
-{
-	int result = FAIL;
-	char comfirmstr[20];
-	int fd;
-    printf("handle  ClearCacheRequest\n");
-
-    /* ?��?一个�?�*/
-    fd = open(AuthorizationCache_JSON,O_RDWR);
-    if(fd < 0)
-    {
-        printf("open AuthorizationCache file failed\n");
-        sprintf(comfirmstr, "%s", ClearCacheStatusStr[ClearCacheStatus_Rejected] );
-    }
-    else
-    {
-        printf("open AuthorizationCache file successful\n");
-
-        /* 清空?�件 */
-        ftruncate(fd,0);
-
-        /* ?�新设置?�件?�移??*/
-        lseek(fd,0,SEEK_SET);
-
-        close(fd);
-        sprintf(comfirmstr, "%s", ClearCacheStatusStr[ClearCacheStatus_Accepted] );
-        //ShmOCPP16Data->MsMsg.bits.ClearCacheReq = 1;	//OCPP handle byself
-    }
-
-    sendClearCacheConfirmation(uuid, comfirmstr);
-    //ShmOCPP16Data->MsMsg.bits.ClearCacheConf = 1;		//OCPP handle byself
-	return result;
-}
-
-int handleClearChargingProfileRequest(char *uuid, char *payload)
-{
-	int result = FAIL;
-	struct json_object *obj, *connectorId, *csChargingProfiles, *chargingProfileId, *stackLevel, *chargingProfilePurpose;
-	int connectorIdInt, chargingProfileIdInt, stackLevelInt;
-	const char*chargingProfilePurposeStr;
-
-	struct json_object *tempobj, *tempconnectorId, *tempcsChargingProfiles, *tempchargingProfileId, *tempstackLevel, *tempchargingProfilePurpose;
-	int tempconnectorIdInt, tempchargingProfileIdInt, tempstackLevelInt;
-	char *tempchargingProfilePurposeStr;
-
-	char fname[200];
-
-	json_object *test_obj = NULL;
-	json_object *tmp_obj = NULL;
-	struct array_list *json_list;
-	struct json_object *jsonitem;
-	char comfirmstr[20];
-	size_t n_friends;
-	int clearflag = FALSE;
-
-	FILE *fptr1, *fptr2;
-	char temp[] = "temp.json";
-	struct json_object *newHeatMap = json_object_new_array();
-
-
-	obj = json_tokener_parse(payload);
-	printf("handle  ClearChargingProfileRequest\n");
-
-	connectorId = json_object_object_get(obj, "connectorId");
-	chargingProfileId = json_object_object_get(obj, "id");
-	stackLevel = json_object_object_get(obj, "stackLevel");
-	chargingProfilePurpose = json_object_object_get(obj, "chargingProfilePurpose");
-
-	printf("handle  ClearChargingProfileRequest error 1\n");
-	if(connectorId != NULL)
-	connectorIdInt = json_object_get_int(connectorId);
-
-	if(chargingProfileId != NULL)
-	chargingProfileIdInt = json_object_get_int(chargingProfileId);
-
-	if(stackLevel != NULL)
-	stackLevelInt = json_object_get_int(stackLevel);
-
-	if(chargingProfilePurpose != NULL)
-	chargingProfilePurposeStr = json_object_get_string(chargingProfilePurpose);
-
-	if(connectorId != NULL)
-	{
-		switch(connectorIdInt)
-		{
-			case 0:
-				strcpy(fname, ChargingProfile_0_JSON );
-				break;
-
-			case 1:
-				strcpy(fname, ChargingProfile_1_JSON );
-				break;
-
-			case 2:
-				strcpy(fname, ChargingProfile_2_JSON );
-				break;
-
-			default:
-				strcpy(fname, ChargingProfile_0_JSON );
-				break;
-		}
-
-	}
-	else
-	{
-		strcpy(fname, ChargingProfile_0_JSON );
-
-	}
-
-	fptr1 = fopen(fname, "r");
-	if (!fptr1)
-	{
-		//file not exist
-		printf("Unable to open the input file!!\n");
-		fptr1 = fopen(fname, "w+");
-
-	}
-	fclose(fptr1);
-
-
-	if(connectorId != NULL && (connectorIdInt != 0) && ( (connectorIdInt-1) > (CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY) ) )
-	{
-
-		sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Unknown] );
-		goto end;
-	}
-
-
-	//get json object from file
-	test_obj = json_object_from_file(fname);
-
-	if(json_object_get_type(test_obj) == json_type_array)
-	{
-
-		//
-		if(connectorId == NULL || connectorIdInt == 0 )
-		{
-			//clear the whole contents of a file in C
-			fclose(fopen(ChargingProfile_0_JSON, "w"));
-			fclose(fopen(ChargingProfile_1_JSON, "w"));
-			fclose(fopen(ChargingProfile_2_JSON, "w"));
-
-		}
-		else
-		{
-			n_friends = json_object_array_length(test_obj);
-			printf("Found %lu friends\n",n_friends);
-
-			for(int i=0;i<n_friends;i++)
-			{
-				jsonitem = json_object_array_get_idx(test_obj, i);
-				printf("%lu. %s\n",i+1,json_object_get_string(jsonitem));
-
-
-				tempconnectorId = json_object_object_get(jsonitem, "connectorId");
-				tempcsChargingProfiles = json_object_object_get(jsonitem, "csChargingProfiles");
-
-				tempchargingProfileId = json_object_object_get(tempcsChargingProfiles, "chargingProfileId");
-				tempstackLevel = json_object_object_get(tempcsChargingProfiles, "stackLevel");
-				tempchargingProfilePurpose = json_object_object_get(tempcsChargingProfiles, "chargingProfilePurpose");
-
-				tempconnectorIdInt = json_object_get_int(tempconnectorId);
-				tempchargingProfileIdInt = json_object_get_int(tempchargingProfileId);
-				tempstackLevelInt = json_object_get_int(tempstackLevel);
-				tempchargingProfilePurposeStr = (char *)json_object_get_string(tempchargingProfilePurpose);
-
-
-				if(chargingProfileId != NULL)
-				{
-					if(tempchargingProfileIdInt == chargingProfileIdInt)
-					{
-						sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Accepted] );
-						clearflag = TRUE;
-						continue;
-					}
-					else
-					{
-						json_object_array_add(newHeatMap, jsonitem);
-					}
-				}
-				else
-				{
-					if((tempconnectorIdInt == connectorIdInt) && ((tempchargingProfileIdInt == chargingProfileIdInt) || (tempstackLevelInt == stackLevelInt) && (strcmp(tempchargingProfilePurposeStr, chargingProfilePurposeStr) == 0)))
-					{
-						sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Accepted] );
-						clearflag = TRUE;
-						continue;
-					}
-					else
-					{
-						json_object_array_add(newHeatMap, jsonitem);
-					}
-
-
-				}
-
-
-			}
-
-
-
-			if(clearflag == FALSE)
-			{
-				sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Unknown] );
-				goto end;
-			}
-
-
-
-		}
-
-		FILE *fp;
-		fp=fopen(temp,"w");
-		fclose(fp);
-
-
-		remove(fname);
-		rename(temp, fname);
-
-		json_object_to_file(fname, newHeatMap);
-
-
-	}
-	else
-	{
-		sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Unknown] );
-
-	}
-
-	end:
-	json_object_put(obj);
-	json_object_put(test_obj);
-	sendClearChargingProfileConfirmation(uuid, comfirmstr);
-
-	return result;
-}
-
-int handleDataTransferRequest(char *uuid, char *payload)
-{
-	int result = FAIL;
-
-	struct json_object *obj;
-	obj = json_tokener_parse(payload);
-	printf("handle   DataTransferRequest\n");
-
-	return result;
-}
-
-
-long long diff_tm(struct tm *a, struct tm *b) {
- return a->tm_sec - b->tm_sec
-      + 60LL * (a->tm_min - b->tm_min)
-      + 3600LL * (a->tm_hour - b->tm_hour)
-      + 86400LL * (a->tm_yday - b->tm_yday)
-      + (a->tm_year - 70) * 31536000LL
-      - (a->tm_year - 69) / 4 * 86400LL
-      + (a->tm_year - 1) / 100 * 86400LL
-      - (a->tm_year + 299) / 400 * 86400LL
-      - (b->tm_year - 70) * 31536000LL
-      + (b->tm_year - 69) / 4 * 86400LL
-      - (b->tm_year - 1) / 100 * 86400LL
-      + (b->tm_year + 299) /400 * 86400LL;
-}
-
-
-
-
-int handleGetCompositeScheduleRequest(char *uuid, char *payload)
-{
-	int result = FAIL;
-	struct json_object *obj, *connectorId, *duration, *chargingRateUnit;
-	int connectorIdInt, durationInt;
-	const char*chargingRateUnitStr;
-
-	struct json_object *tempobj, *tempconnectorId, *tempcsChargingProfiles, *tempvalidFrom,*tempChargingSchedule, *tempstartSchedule, *tempchargingSchedulePeriod, *tempminChargingRate;
-	int tempconnectorIdInt, tempdurationInt;
-	float tempminChargingRateFloat = 0.0;
-	char *tempvalidFromStr,*tempchargingRateUnitStr, *tempstartScheduleStr;
-
-	char fname[200];
-
-	json_object *test_obj = NULL;
-	json_object *tmp_obj = NULL;
-	struct array_list *json_list;
-	struct json_object *jsonitem;
-	char comfirmstr[20];
-	size_t n_friends;
-	float totallimit =0.0;
-	float MinChargingRate =0.0;
-	int clearflag = FALSE;
-	int n_periods = 0;
-	int nPeriod = 0;
-
-	FILE *fptr1, *fptr2;
-	char temp[] = "temp.json";
-	struct json_object *newHeatMap = json_object_new_array();
-
-	printf("handle   GetCompositeScheduleRequest\n");
-	obj = json_tokener_parse(payload);
-
-	connectorId = json_object_object_get(obj, "connectorId");
-	duration  = json_object_object_get(obj, "duration");
-	chargingRateUnit  = json_object_object_get(obj, "chargingRateUnit");
-
-	connectorIdInt = json_object_get_int(connectorId);
-	durationInt = json_object_get_int(duration);
-	if(chargingRateUnit != NULL)
-	chargingRateUnitStr = json_object_get_string(chargingRateUnit);
-
-	// current time
-	time_t t = time(NULL);
-
-	memset(ShmOCPP16Data->GetCompositeSchedule, 0, sizeof(struct StructChargingSchedulePeriod)* (CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY) );
-
-	if(connectorIdInt==0) // connectorId is 0
-	{
-		strcpy(fname, ChargingProfile_0_JSON );
-		test_obj = NULL;
-		test_obj = json_object_from_file(fname);
-		n_friends = 0;
-		n_friends = json_object_array_length(test_obj);
-		printf("Found %lu friends\n",n_friends);
-
-		for(int i=0;i<n_friends;i++)
-		{
-			printf("handle   GetCompositeScheduleRequest -1\n");
-			jsonitem = json_object_array_get_idx(test_obj, i);
-			printf("%lu. %s\n",i+1,json_object_get_string(jsonitem));
-
-
-			printf("handle   GetCompositeScheduleRequest -2\n");
-			tempconnectorId = json_object_object_get(jsonitem, "connectorId");
-			tempcsChargingProfiles = json_object_object_get(jsonitem, "csChargingProfiles");
-
-			tempvalidFrom  = json_object_object_get(tempcsChargingProfiles, "validFrom");
-			tempChargingSchedule = json_object_object_get(tempcsChargingProfiles, "chargingSchedule");
-			printf("handle   GetCompositeScheduleRequest -3\n");
-			tempstartSchedule = json_object_object_get(tempChargingSchedule, "startSchedule");
-			tempminChargingRate  = json_object_object_get(tempstartSchedule, "minChargingRate");
-			printf("handle   GetCompositeScheduleRequest -4n");
-
-			tempminChargingRateFloat = (float)json_object_get_double(tempminChargingRate);
-			tempchargingSchedulePeriod = json_object_object_get(tempChargingSchedule, "chargingSchedulePeriod");
-
-
-
-			tempstartScheduleStr = (char *)json_object_get_string(tempstartSchedule);
-			printf("handle   GetCompositeScheduleRequest -5\n");
-			tempvalidFromStr = (char *)json_object_get_string(tempvalidFrom);
-			double diff_t;
-			struct tm tp;
-			printf("tempstartScheduleStr 1 : %s\n", tempstartScheduleStr);
-			printf("handle   GetCompositeScheduleRequest -6\n");
-			printf("tempstartScheduleStr 2 : %s\n", tempstartScheduleStr);
-			strptime(tempstartScheduleStr, "%Y-%m-%dT%H:%M:%S", &tp);
-			printf("handle   GetCompositeScheduleRequest -6 -1\n");
-			tp.tm_isdst = -1;
-			printf("handle   GetCompositeScheduleRequest -6 -2\n");
-			time_t utc = mktime(&tp);
-			printf("handle   GetCompositeScheduleRequest -7\n");
-			struct tm e0 = { .tm_year = tp.tm_year, .tm_mday = tp.tm_mday, .tm_mon = tp.tm_mon, .tm_hour = tp.tm_hour, .tm_isdst = -1 };
-			time_t pseudo = mktime(&e0);
-			struct tm e1 = *gmtime(&pseudo);
-			e0.tm_sec += utc - diff_tm(&e1, &e0);
-			time_t local = e0.tm_sec;
-			printf("handle   GetCompositeScheduleRequest -8\n");
-			// ?�到��??�起始�???- chargingScedule起�??��?
-			diff_t = difftime(t, local);
-
-			n_periods = json_object_array_length(tempchargingSchedulePeriod);
-
-			printf("handle   GetCompositeScheduleRequest -9\n");
-			for(int i=0;i<n_periods;i++)
-			{
-				struct json_object *tempstartPeriod, *templimit, *tempnumberPhases;
-
-				jsonitem = json_object_array_get_idx(tempchargingSchedulePeriod, i);
-				printf("%lu. %s\n",i+1,json_object_get_string(jsonitem));
-
-
-				tempstartPeriod = json_object_object_get(jsonitem, "startPeriod");
-				templimit = json_object_object_get(jsonitem, "limit");
-				tempnumberPhases = json_object_object_get(jsonitem, "numberPhases");
-
-				int tempstartPeriodInt = json_object_get_int(tempstartPeriod);
-
-				if(diff_t >= 0)
-				{
-					diff_t = ((diff_t - tempstartPeriodInt) <=0) ? 0 : (diff_t - tempstartPeriodInt);
-					printf("diff_t=%d\n",diff_t);
-				}
-
-
-
-				float  temp = (float)json_object_get_double(templimit);
-				if(diff_t == 0)
-				{
-					//loat temp = (float)json_object_get_double(templimit);
-
-				    if(totallimit <  temp)
-				    {
-
-				    	totallimit = temp;
-				    	printf("totallimit=%d\n",totallimit);
-				    }
-				}
-
-
-
-			}
-
-			if(MinChargingRate < tempminChargingRateFloat)
-			MinChargingRate = tempminChargingRateFloat;
-		}
-
-		printf("handle   GetCompositeScheduleRequest -10\n");
-
-		/* Define temporary variables */
-		struct tm *gtime;
-		time_t now;
-        char buf[28];
-		/* Read the current system time */
-        printf("handle   GetCompositeScheduleRequest -11\n");
-		time(&now);
-		printf("handle   GetCompositeScheduleRequest -12\n");
-		/* Convert the system time to GMT (now UTC) */
-		gtime = gmtime(&now);
-		printf("handle   GetCompositeScheduleRequest -13\n");
-		strftime(buf, 28, "%Y-%m-%dT%H:%M:%SZ", gtime);
-		printf("handle   GetCompositeScheduleRequest -14\n");
-
-
-		// make .conf
-		strcpy((char *)ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.StartSchedule,buf);
-
-		ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod =  (struct StructChargingSchedulePeriod *) malloc(sizeof(struct StructChargingSchedulePeriod)* n_periods);
-
-
-		memset(ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod, 0, sizeof(struct StructChargingSchedulePeriod)* n_periods);
-
-		nPeriod = 1;
-
-		ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[0].Limit = 100.0;//totallimit;
-		printf("(1)ChargingSchedulePeriod[0].Limit =%d\n",ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[0].Limit);
-		ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[0].NumberPhases = 3.0;
-		printf("(2)NumberPhases =%f\n",ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[0].NumberPhases);
-		ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[0].StartPeriod = 0;
-
-		ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.Duration = durationInt;
-		sleep(10);
-		printf("1.totallimit =%d\n",totallimit);
-		printf("2. totallimit =%d\n",ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[0].Limit);
-		printf("NumberPhases =%f\n",ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[0].NumberPhases);
-		printf("StartPeriod = %d\n",ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[0].StartPeriod);
-		printf("durationInt = %d\n",ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.Duration);
-		printf("handle   GetCompositeScheduleRequest -14 -1\n");
-		if(chargingRateUnitStr != NULL)
-		{
-			strcpy((char *)ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingRateUnit, chargingRateUnitStr );
-		}
-		else
-		{
-			strcpy((char *)ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingRateUnit, "" );
-		}
-		ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.MinChargingRate = MinChargingRate;
-		sprintf(comfirmstr, "%s", GetCompositeScheduleStatusStr[GetCompositeScheduleStatus_Accepted] );
-
-		printf("handle   GetCompositeScheduleRequest -15\n");
-
-	}
-	else if ((connectorIdInt > 0)&&((connectorIdInt -1) < (CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY))  )
-	{
-		//connectorId is specific Id
-		switch(connectorIdInt)
-		{
-			case 0:
-					strcpy(fname, ChargingProfile_0_JSON );
-					break;
-
-			case 1:
-					strcpy(fname, ChargingProfile_1_JSON );
-					break;
-
-			case 2:
-					strcpy(fname, ChargingProfile_2_JSON );
-					break;
-
-			default:
-					strcpy(fname, ChargingProfile_0_JSON );
-					break;
-		}
-
-		//get json object from file
-	    test_obj = json_object_from_file(fname);
-
-		n_friends = 0;
-	    n_friends = json_object_array_length(test_obj);
-		printf("Found %lu friends\n",n_friends);
-
-		for(int i=0;i<n_friends;i++)
-		{
-            printf("GetCompositeScheduleRequest -1\n");
-			jsonitem = json_object_array_get_idx(test_obj, i);
-			printf("%lu. %s\n",i+1,json_object_get_string(jsonitem));
-
-
-			tempconnectorId = json_object_object_get(jsonitem, "connectorId");
-			tempcsChargingProfiles = json_object_object_get(jsonitem, "csChargingProfiles");
-
-			tempvalidFrom  = json_object_object_get(tempcsChargingProfiles, "validFrom");
-			tempChargingSchedule = json_object_object_get(tempcsChargingProfiles, "ChargingSchedule");
-
-			tempstartSchedule = json_object_object_get(tempChargingSchedule, "startSchedule");
-			tempminChargingRate  = json_object_object_get(tempChargingSchedule, "minChargingRate");
-			tempminChargingRateFloat = (float)json_object_get_double(tempminChargingRate);
-			tempchargingSchedulePeriod = json_object_object_get(tempChargingSchedule, "chargingSchedulePeriod");
-			tempstartScheduleStr =(char *) json_object_get_string(tempstartSchedule);
-			printf("GetCompositeScheduleRequest -2\n");
-			tempvalidFromStr = (char *)json_object_get_string(tempvalidFrom);
-		    double diff_t;
-			struct tm tp;
-			strptime(tempstartScheduleStr, "%Y-%m-%dT%H:%M:%S", &tp);
-			tp.tm_isdst = -1;
-			time_t utc = mktime(&tp);
-
-			struct tm e0 = { .tm_year = tp.tm_year, .tm_mday = tp.tm_mday, .tm_mon = tp.tm_mon, .tm_hour = tp.tm_hour, .tm_isdst = -1 };
-			time_t pseudo = mktime(&e0);
-			struct tm e1 = *gmtime(&pseudo);
-			e0.tm_sec += utc - diff_tm(&e1, &e0);
-			time_t local = e0.tm_sec;
-
-			// ?�到��??�起始�???- chargingScedule起�??��?
-			diff_t = difftime(t, local);
-
-			n_periods = json_object_array_length(tempchargingSchedulePeriod);
-			nPeriod = n_periods;
-			printf("GetCompositeScheduleRequest -3\n");
-			ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod =  (struct StructChargingSchedulePeriod *) malloc(sizeof(struct StructChargingSchedulePeriod)* nPeriod);
-
-			for(int i=0;i<n_periods;i++)
-			{
-				struct json_object *tempstartPeriod, *templimit, *tempnumberPhases;
-				printf("GetCompositeScheduleRequest -4\n");
-				jsonitem = json_object_array_get_idx(tempchargingSchedulePeriod, i);
-				printf("%lu. %s\n",i+1,json_object_get_string(jsonitem));
-
-
-				tempstartPeriod = json_object_object_get(jsonitem, "startPeriod");
-				templimit = json_object_object_get(jsonitem, "limit");
-				tempnumberPhases = json_object_object_get(jsonitem, "numberPhases");
-
-				int tempstartPeriodInt = json_object_get_int(tempstartPeriod);
-
-
-				ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[i].Limit = json_object_get_int(templimit);
-				ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[i].NumberPhases = (float)json_object_get_double(templimit);
-				ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[i].StartPeriod = json_object_get_int(tempstartPeriod);
-
-				if(diff_t >= 0)
-					diff_t = ((diff_t - tempstartPeriodInt) <=0) ? 0 : (diff_t - tempstartPeriodInt);
-
-				if(diff_t < 0)
-				{
-					float temp = (float)json_object_get_double(templimit);
-
-					if(totallimit <  temp)
-					{
-
-
-						totallimit = temp;
-					}
-				}
-
-
-			}
-
-			if(MinChargingRate < tempminChargingRateFloat)
-				MinChargingRate = tempminChargingRateFloat;
-		}
-
-		/* Define temporary variables */
-		struct tm *gtime;
-		time_t now;
-	    char buf[28];
-		/* Read the current system time */
-		time(&now);
-
-
-		/* Convert the system time to GMT (now UTC) */
-		gtime = gmtime(&now);
-
-		strftime(buf, 28, "%Y-%m-%dT%H:%M:%SZ", gtime);
-
-		// make .conf
-
-		strcpy((char *)ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.StartSchedule,buf);
-
-		ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.Duration = durationInt;
-		if(chargingRateUnitStr != NULL)
-		{
-			strcpy((char *)ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingRateUnit, chargingRateUnitStr );
-		}
-		else
-		{
-			strcpy((char *)ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingRateUnit, "" );
-		}
-		ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.MinChargingRate = MinChargingRate;
-		sprintf(comfirmstr, "%s", GetCompositeScheduleStatusStr[GetCompositeScheduleStatus_Accepted] );
-
-	}
-	else
-	{
-
-		sprintf(comfirmstr, "%s", GetCompositeScheduleStatusStr[GetCompositeScheduleStatus_Accepted] );
-	}
-
-	json_object_put(obj);
-	sendGetCompositeScheduleConfirmation(uuid,comfirmstr, connectorIdInt, nPeriod);
-
-	return result;
-}
-
-int handleGetConfigurationRequest(char *uuid, char *payload)
-{
-	int result = FAIL;
-
-	struct json_object *obj=NULL, *key=NULL, *test_obj=NULL;// *jsonitem;
-	struct json_object *jsonitem;
-	int MaxKeySupported = 0;
-	int n_keys = 0;
-	obj = json_tokener_parse(payload);
-	printf("handle   GetConfigurationRequest\n");
-
-	key  = json_object_object_get(obj, "key");
-
-	if(key != NULL)
-		n_keys = json_object_array_length(key);
-
-	UnknownKeynum = 0;
-	memset( (void *)unknownkey, 0, sizeof(int)*10*20 );
-
-	MaxKeySupported = atoi(ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemData);
-	if(ShmOCPP16Data->GetConfiguration.Key ==  NULL)
-	{
-		 ShmOCPP16Data->GetConfiguration.Key = (struct StructConfigurationKeyItems *)malloc(sizeof(struct StructConfigurationKeyItems)*MaxKeySupported);
-		 memset(ShmOCPP16Data->GetConfiguration.Key, 0 ,sizeof(struct StructConfigurationKeyItems)*MaxKeySupported);
-		 printf("memset 0 for GetConfiguration table \n");
-	}
-	else
-	{
-		memset(ShmOCPP16Data->GetConfiguration.Key, 0 ,sizeof(struct StructConfigurationKeyItems)*MaxKeySupported);
-	}
-
-	if(ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey ==  NULL)
-	{
-		ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey = (struct StructConfigurationKey *)malloc(sizeof(struct StructConfigurationKey)*MaxKeySupported);
-		memset(ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey, 0, sizeof(struct StructConfigurationKey)*MaxKeySupported);
-	}
-	else
-	{
-		memset(ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey, 0, sizeof(struct StructConfigurationKey)*MaxKeySupported);
-	}
-
-	if(n_keys != 0)
-	{
-		printf("key sent num=%d\n",n_keys);
-		for(int i=0;i<n_keys;i++)
-		{
-			jsonitem = json_object_array_get_idx(key, i);
-			getKeyValue((char *)json_object_get_string(jsonitem));
-		}
-	}
-	else
-	{
-		printf("no key sent, get all configuration\n");
-		getKeyValue("");
-	}
-
-	processUnkownKey();
-
-	printf("test test 5\n");
-	//ShmOCPP16Data->MsMsg.bits.GetConfigurationReq = 1;
-
-	json_object_put(obj);
-	printf("test test 6\n");
-	sendGetConfigurationConfirmation(uuid);
-	printf("test test 7\n");
-	//ShmOCPP16Data->MsMsg.bits.GetConfigurationConf = 1;
-
-
-	return result;
-}
-
-int handleGetDiagnosticsRequest(char *uuid, char *payload)
-{
-	int result = FAIL;
-	void *ret; // �執行�??��???
-	pthread_t t; // �? pthread 變數
-	pthread_create(&t, NULL, GetDiagnosticsProcess, payload); // 建�?�執行�?
-    pthread_join(t, &ret);
-  //  ShmOCPP16Data->MsMsg.bits.GetDiagnosticsReq = 1;
-	//sendGetDiagnosticsConfirmation(uuid,fname);
-    sendGetDiagnosticsConfirmation(uuid,(char*) ret);
-  //  ShmOCPP16Data->MsMsg.bits.GetDiagnosticsConf = 1;
-
-
-	return result;
-}
-
-
-void* GetDiagnosticsProcess(void* data)
-{
-	struct json_object *obj, *location , *retries, *retryInterval , *startTime , *stopTime;
-	int retriesInt=0, retryIntervalInt=0;
-	const char *locationstr, *startTimestr, *stopTimestr ;
-
-	char protocol[10], user[50],password[50],host[50], path[50], ftppath[60],host1[50],path1[50];
-	int port=0;
-	char fname[50]="";//="00000_2019-06-09_160902_CSULog.zip";
-
-	char *str = (char*) data; // ?��?輸入資�?
-	int isSuccess = FALSE;
-	char ftpbuf[200];
-	char temp[100];
-	char * pch;
-
-
-	obj = json_tokener_parse(str);
-	printf("handle     GetDiagnosticsRequest\n");
-
-
-	location = json_object_object_get(obj, "location");
-	retries  = json_object_object_get(obj, "retries");
-	retryInterval  = json_object_object_get(obj, "retryInterval");
-	startTime  = json_object_object_get(obj, "startTime");
-	stopTime   = json_object_object_get(obj, "stopTime");
-
-	locationstr = json_object_get_string(location);
-
-	if(retries != NULL)
-	retriesInt = json_object_get_int(retries);
-
-	if(retryInterval != NULL)
-	retryIntervalInt = json_object_get_int(retryInterval);
-
-	if(startTime != NULL)
-	startTimestr = json_object_get_string(startTime);
-
-	if(stopTime != NULL)
-	stopTimestr = json_object_get_string(stopTime);
-
-	printf("handle     GetDiagnosticsRequest -1\n");
-
-	memset(protocol, 0, sizeof(protocol));
-	memset(user, 0, sizeof(user) );
-	memset(password, 0, sizeof(password));
-	memset(host, 0, sizeof(host));
-
-	memset(path, 0, sizeof(path));
-	memset(ftppath, 0, sizeof(ftppath));
-	memset(host1, 0, sizeof(host1));
-	memset(path1, 0, sizeof(path1));
-	/*location: ftp://user:password@host:port/path*/
-	//sscanf(locationstr,"%[^:]:%*2[/]%[^:]:%[^@]@%[^:]%d[^/]/%[a-zA-Z0-9._/-]",
-
-	//       protocol, user, password, host, &port, path);
-	//zip files in /Storage
-	system("exec /root/logPackTools 'log' 6");
-
-	time_t rawtime;
-	struct tm * timeinfo;
-	//char buffer [128];
-	time (&rawtime);
-	//printf("%ld\n", rawtime);
-	timeinfo = localtime (&rawtime);
-	strftime (fname,sizeof(fname),"/mnt/%4Y_%2m.zip",timeinfo);
-	if((access(fname,F_OK))!=-1)
-	{
-		printf("?‡ä»¶ test.c exist.\n");
-	}
-	else
-	{
-		printf("test.c not exist!\n");
-		goto end;
-
-	}
-
-	pch=strchr(locationstr,'@');
-
-	if(pch==NULL)
-	{
-		sscanf(locationstr,
-			         "%[^:]:%*2[/]%[^:]:%i/%[a-zA-Z0-9._/-]",
-			         protocol, host, &port, path);
-		strcpy(user,"anonymous");
-		strcpy(password,"");
-	}
-	else
-	{
-		printf("pch=%s\n", pch);
-		sscanf(locationstr,"%[^:]:%*2[/]%[^:]:%[^@]@%[^:]:%i/%199[^\n]",
-				   protocol, user, password, host, &port, path);
-	}
-
-  	sscanf(host,"%[^/]%s",host1, path1);
-	sprintf(ftppath,"%s", path1);
-
-	printf("protocol =%s\n",protocol);
-	printf("user =%s\n",user);
-	printf("password =%s\n",password);
-	printf("host1 =%s\n",host1);
-	printf("port =%d\n",port);
-	printf("path1 =%s\n",path1);
-	printf("ftppath=%s\n",ftppath);
-
-	int ftppathlen=strlen(ftppath);
-	int i=1;
-	char filenametemp[50];
-	while(i < ftppathlen)
-	{
-	   printf("ftppath[ftppathlen-i]:%c\n",ftppath[ftppathlen-i]);
-	   int len=ftppathlen-i;
-	   if(ftppath[len]== 47) // '/' ascll code: 47
-	   {
-	     printf("all right\n");
-	     break;
-	   }
-
-	   printf("test substr\n");
-	   i=i+1;
-
-	}
-
-	memset(filenametemp, 0, sizeof(filenametemp));
-	strncpy(filenametemp, ftppath+(ftppathlen-i+1), i+1);
-	filenametemp[i+1] = 0;
-	printf("filenametemp:%s\n", filenametemp);
-
-
-
-	sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatus_Uploading]);
-	    //httpDownLoadFile(host, ftppath, fname);
-	memset(ftpbuf, 0, sizeof(ftpbuf));
-
-    if(port == 0)
-    	port = 21;
-	//isSuccess = httpDownLoadFile(host1, ftppath, filenametemp, "http://evsocket.phihong.com.tw/UploadFiles/SW/C81FBD4A740F69286B276C68B5074373.jar");
-
-
-    do{
-    	 isSuccess = ftpFile(/*"test.evsocket.phihong.com.cn","phihong","y42j/4cj84",21,"/",fname*/host1, user, password, port, ftppath, fname);
-    	 sleep(retryIntervalInt);
-    }while((!isSuccess)&&(retriesInt > 0 && retriesInt --));
-
-	if(!isSuccess)
-	{
-	   //BulldogUtil.sleepMs(interval*1000);
-	   printf("Update firmware request and download file fail.\n");
-	   sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatus_UploadFailed]);
-	}
-	else
-	{
-		sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatus_Uploaded]);
-		isUpdateRequest = TRUE;
-	}
-
-end:
-	json_object_put(obj);
-	pthread_exit((void *) fname); // ?��?�執行�?
-
-}
-
-
-
-
-int handleGetLocalListVersionRequest(char *uuid, char *payload)
-{
-	int result = FAIL;
-	printf("handle    GetLocalListVersionRequest\n");
-
-	if(strcmp(ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "FALSE") == 0)
-	{
-		localversion = -1;
-	}
-	else
-	{
-		OCPP_getListVerion();
-	}
-
-
-	//from db.OCPP_getListVerion
-	printf("handle    GetLocalListVersionRequest -1\n");
-
-	ShmOCPP16Data->GetLocalListVersion.ResponseListVersion = localversion;
-	printf("handle    GetLocalListVersionRequest -2\n");
-	//ShmOCPP16Data->MsMsg.bits.GetLocalListVersionReq = 1;
-	sendGetLocalListVersionConfirmation(uuid,"");
-	//ShmOCPP16Data->MsMsg.bits.GetLocalListVersionConf = 1;
-
-	return result;
-}
-
-int handleRemoteStartRequest(char *uuid, char *payload)
-{
-	int result = FAIL;
-
-	struct json_object *obj, *connectorId, *idTag, *chargingProfile,
-			*chargingProfileId, *transactionId, *stackLevel,
-			*chargingProfilePurpose, *chargingProfileKind,
-			*recurrencyKind, *validFrom, *validTo, *chargingSchedule,
-			*duration, *startSchedule, *chargingRateUnit, *chargingSchedulePeriod,
-			*minChargingRate,*limit, *startPeriod, *numberPhases;
-	int connectorIdInt=0, chargingProfileIdInt=0, transactionIdInt=0, stackLevelInt=0,
-		durationInt=0, startPeriodInt =0, numberPhasesInt=0;
-	char *idTagstr, *chargingProfilePurposestr, *chargingProfileKindstr, *recurrencyKindstr,
-		*validFromstr, *validTostr, *startSchedulestr, *chargingRateUnitstr, *chargingSchedulePeriodstr;
-	float minChargingRateflaot=0.0, limitflaot=0.0;
-	char comfirmstr[20];
-
-	if(server_pending == TRUE)
-	{
-
-		return 0;
-	}
-
-	obj = json_tokener_parse(payload);
-	printf("handleRemoteStartRequest\n");
-
-	connectorId = json_object_object_get(obj, "connectorId");
-	idTag  = json_object_object_get(obj, "idTag");
-	chargingProfile   = json_object_object_get(obj, "chargingProfile");
-
-	if(connectorId != NULL)
-	{
-		connectorIdInt = json_object_get_int(connectorId);
-	}
-	else
-	{
-		strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
-		goto end;
-	}
-
-
-	idTagstr = (char *)json_object_get_string(idTag);
-
-	if(chargingProfile != NULL)
-	{
-		chargingProfileId = json_object_object_get(chargingProfile, "chargingProfileId");
-		transactionId = json_object_object_get(chargingProfile, "transactionId");
-		stackLevel = json_object_object_get(chargingProfile, "stackLevel");
-		chargingProfilePurpose = json_object_object_get(chargingProfile, "chargingProfilePurpose");
-		chargingProfileKind = json_object_object_get(chargingProfile, "chargingProfileKind");
-		recurrencyKind = json_object_object_get(chargingProfile, "recurrencyKind");
-		validFrom  = json_object_object_get(chargingProfile, "validFrom");
-		validTo  = json_object_object_get(chargingProfile, "validTo");
-		chargingSchedule   = json_object_object_get(chargingProfile, "chargingSchedule");
-
-		chargingProfileIdInt = json_object_get_int(chargingProfileId);
-
-		if(transactionId != NULL) // OPTION
-		transactionIdInt = json_object_get_int(transactionId);
-
-		stackLevelInt = json_object_get_int(stackLevel);
-		chargingProfilePurposestr =(char *)json_object_get_string(chargingProfilePurpose);
-		chargingProfileKindstr = (char *)json_object_get_string(chargingProfileKind);
-
-		if(recurrencyKind != NULL) //OPTION
-		recurrencyKindstr = (char *)json_object_get_string(recurrencyKind);
-
-		if(validFrom != NULL) // OPTION
-		validFromstr =  (char *)json_object_get_string(validFrom);
-
-		if(validTo != NULL) //OPTION
-		validTostr =  (char *)json_object_get_string(validTo);
-
-
-		duration  = json_object_object_get(chargingSchedule, "duration");
-		startSchedule  = json_object_object_get(chargingSchedule, "startSchedule");
-		chargingRateUnit  = json_object_object_get(chargingSchedule, "chargingRateUnit");
-		chargingSchedulePeriod  = json_object_object_get(chargingSchedule, "chargingSchedulePeriod");
-		minChargingRate  = json_object_object_get(chargingSchedule, "minChargingRate");
-
-		if(duration != NULL) //OPTION
-		durationInt = json_object_get_int(duration);
-
-		if(startSchedule != NULL) //OPTION
-		startSchedulestr = (char *)json_object_get_string(startSchedule);
-
-		chargingRateUnitstr = (char *)json_object_get_string(chargingRateUnit);
-		chargingSchedulePeriodstr = (char *)json_object_get_string(chargingSchedulePeriod);
-
-		if(minChargingRate != NULL) //OPTION
-		minChargingRateflaot = (float)json_object_get_double(minChargingRate);
-
-		limit = json_object_object_get(chargingSchedulePeriod, "limit");
-		startPeriod = json_object_object_get(chargingSchedulePeriod, "startPeriod");
-		numberPhases  = json_object_object_get(chargingSchedulePeriod, "numberPhases");
-
-		startPeriodInt = json_object_get_int(startPeriod);
-		limitflaot = (float)json_object_get_double(limit);
-
-		if(numberPhases != NULL)
-		numberPhasesInt = json_object_get_int(numberPhases);
-
-	}
-
-
-
-	/*
-
-	enum _SYSTEM_STATUS
-	{
-	S_BOOTING               = 0,
-	S_IDLE,                 = 1
-	S_AUTHORIZING,          =2
-	S_REASSIGN_CHECK,       =3
-	S_REASSIGN,             =4
-	S_PRECHARGE,            =5
-	S_PREPARING_FOR_EV,     =6
-	S_PREPARING_FOR_EVSE,   =7
-	S_CHARGING,             =8
-	S_TERMINATING,          =9
-	S_COMPLETE,             =10
-	S_ALARM,                =11
-	S_FAULT                 =12
-	}
-	 */
-	if((connectorId != NULL)&&(connectorIdInt > 0) && ((connectorIdInt -1) <= (CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY)))
-	{
-		sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].IdTag, "%s" , idTagstr);
-		ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.TransactionId = transactionIdInt;
-	    //0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault  8: Reserved
-
-		//check Transaction active
-		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == (connectorIdInt -1))
-			{
-
-				if((1/*?�ç??—æ?*//*ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == '8'*/)&&(strcmp(ShmSysConfigAndInfo->SysConfig.UserId, idTagstr) == 0))
-				{
-
-					//ShmSysConfigAndInfo->SysInfo.ChademoChargingData[connectorIdInt-1].SystemStatus = 8; //S_CHARGING
-					//ShmOCPP16Data->CsMsg.bits[connectorIdInt -1].RemoteStartTransactionReq = 1;
-
-				}
-				else
-				{
-					if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != 1)   //S_IDLE
-					{
-						strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
-						goto end;
-					}
-
-				}
-
-			}
-		}
-
-		for (int index = 0; index < CCS_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == (connectorIdInt -1))
-			{
-				if((1/*?�ç??—æ?*//*ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == '8'*/)&&(strcmp(ShmSysConfigAndInfo->SysConfig.UserId, idTagstr) == 0))
-				{
-
-					//ShmSysConfigAndInfo->SysInfo.CcsChargingData[connectorIdInt-1].SystemStatus = 8; //S_CHARGING
-					//ShmOCPP16Data->CsMsg.bits[connectorIdInt -1].RemoteStartTransactionReq = 1;
-
-				}
-				else
-				{
-					if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != 1) //S_IDLE
-					{
-						strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
-						goto end;
-					}
-
-				}
-
-			}
-		}
-
-		for (int index = 0; index < GB_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == (connectorIdInt -1))
-			{
-				if((1/*?�ç??—æ?*//*ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == '8'*/)&&(strcmp(ShmSysConfigAndInfo->SysConfig.UserId, idTagstr) == 0))
-				{
-
-					//ShmSysConfigAndInfo->SysInfo.GbChargingData[connectorIdInt-1].SystemStatus = 8;  //S_CHARGING
-					//ShmOCPP16Data->CsMsg.bits[connectorIdInt -1].RemoteStartTransactionReq = 1;
-
-				}
-				else
-				{
-					if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != 1) //S_IDLE
-					{
-						strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
-						goto end;
-					}
-
-				}
-
-			}
-		}
-
-
-		if(chargingProfile != NULL)
-		{
-			//ChargingProfile
-			ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingProfileId = chargingProfileIdInt;
-			sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingProfileKind, "%s" ,chargingProfileKindstr);
-			sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingProfilePurpose, "%s" ,chargingProfilePurposestr);
-
-			if(recurrencyKind != NULL) //OPTION
-			sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.RecurrencyKind, "%s" ,recurrencyKindstr);
-
-			ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.StackLevel = stackLevelInt;
-
-			if(transactionId != NULL) // OPTION
-			ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.TransactionId = transactionIdInt;
-
-			if(validFrom != NULL) // OPTION
-			sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ValidFrom, "%s" ,validFromstr);
-
-			if(validTo != NULL) //OPTION
-			sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ValidTo, "%s" ,validTostr);
-
-			//ChargingSchedule
-			sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingSchedule.ChargingRateUnit, "%s" ,chargingRateUnitstr);
-
-			if(duration != NULL) //OPTION
-			ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingSchedule.Duration = durationInt;
-
-			if(minChargingRate != NULL) //OPTION
-			ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingSchedule.MinChargingRate = minChargingRateflaot;
-
-			if(startSchedule != NULL) //OPTION
-			sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingSchedule.StartSchedule, "%s" ,startSchedulestr);
-
-			//ChargingSchedulePeriod
-			ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod->Limit = limitflaot ;
-
-			if(numberPhases != NULL)
-			ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod->NumberPhases = numberPhasesInt;
-
-			ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod->StartPeriod = startPeriodInt;
-
-			if(strcmp(chargingProfilePurposestr, ChargingProfilePurposeTypeStr[TxProfile]) == 0)
-			{
-				ShmOCPP16Data->CsMsg.bits[connectorIdInt -1].RemoteStartTransactionReq = 1;
-				strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Accepted]);
-			}
-			else
-			{
-				strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
-			}
-
-		}
-		else
-		{
-			ShmOCPP16Data->CsMsg.bits[connectorIdInt -1].RemoteStartTransactionReq = 1;
-			strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Accepted]);
-		}
-	 }
-	 else
-	 {
-		 strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
-		 //sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ResponseStatus, "%s" ,comfirmstr);
-	 }
-
-end:
-	if(connectorId != NULL)
-	ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ConnectorId = connectorIdInt;
-
-	strcpy(ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].IdTag, idTagstr);
-	sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ResponseStatus, "%s" ,comfirmstr);
-	json_object_put(obj);
-
-	//OCPP send RemoteStartConfirmation by first.
-	sendRemoteStartConfirmation(uuid, comfirmstr);
-	//ShmOCPP16Data->CsMsg.bits[connectorIdInt -1].RemoteStartTransactionConf = 1;
-
-	return result;
-}
-
-int handleRemoteStopTransactionRequest(char *uuid, char *payload)
-{
-	int result = FAIL;
-	int match = FALSE;
-	int GunNO = 0;
-	struct json_object *obj, *transactionId;
-	int transactionIdInt=0;
-	char comfirmstr[20];
-
-	printf("handleRemoteStopTransactionRequest\n");
-
-	if(server_pending == TRUE)
-	{
-
-		return 0;
-	}
-
-	obj = json_tokener_parse(payload);
-
-	transactionId = json_object_object_get(obj, "transactionId");
-	transactionIdInt = json_object_get_int(transactionId);
-
-	if(transactionId != NULL)
-	{
-
-		for(int gun_index=0;gun_index< (CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY);gun_index++)
-	    {
-			if(ShmOCPP16Data->RemoteStartTransaction[gun_index].ChargingProfile.TransactionId == transactionIdInt)
-	        {
-				//check Transaction active
-				for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-				{
-					if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)
-					{
-
-						if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 8) // S_CHARGING
-						{
-							match = TRUE;
-							GunNO = gun_index;
-						}
-
-
-					}
-				}
-
-				for (int index = 0; index < CCS_QUANTITY; index++)
-				{
-					if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)
-					{
-						if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 8) // S_CHARGING
-						{
-							match = TRUE;
-							GunNO = gun_index;
-						}
-
-					}
-				}
-
-				for (int index = 0; index < GB_QUANTITY; index++)
-				{
-					if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)
-					{
-						if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 8) // S_CHARGING
-						{
-							match = TRUE;
-							GunNO = gun_index;
-						}
-
-					}
-				}
-
-	        }
-
-
-	    }
-
-		if(	match == TRUE)
-		{
-			ShmOCPP16Data->CsMsg.bits[GunNO].RemoteStopTransactionReq = 1; // inform csu of StopTransaction
-			strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Accepted]);
-			sprintf((char *)ShmOCPP16Data->RemoteStopTransaction[GunNO].ResponseStatus, "%s" ,comfirmstr);
-		}
-		else
-		{
-			strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
-		}
-
-
-	  }
-
-	json_object_put(obj);
-
-	sendRemoteStopTransactionConfirmation(uuid, comfirmstr);
-	//ShmOCPP16Data->CsMsg.bits[GunNO].RemoteStopTransactionConf = 1;
-
-	return result;
-}
-
-int handleReserveNowTransactionRequest(char *uuid, char *payload)
-{
-	int result = FAIL;
-
-	struct json_object *obj, *connectorId, *expiryDate, *idTag, *parentIdTag, *reservationId;
-	int connectorIdInt=0, reservationIdInt=0;
-	char *expiryDatestr, *idTagstr, *parentIdTagstr;
-	char comfirmstr[20];
-	obj = json_tokener_parse(payload);
-	printf("handleReserveNowRequest\n");
-
-	connectorId = json_object_object_get(obj, "connectorId");
-	expiryDate  = json_object_object_get(obj, "expiryDate");
-	idTag  = json_object_object_get(obj, "idTag");
-	parentIdTag   = json_object_object_get(obj, "parentIdTag");
-	reservationId  = json_object_object_get(obj, "reservationId");
-
-	connectorIdInt = json_object_get_int(connectorId);
-	expiryDatestr = (char *)json_object_get_string(expiryDate);
-	idTagstr = (char *)json_object_get_string(idTag);
-
-	if(parentIdTag != NULL) // option flag
-	parentIdTagstr = (char *)json_object_get_string(parentIdTag);
-	reservationIdInt = json_object_get_int(reservationId);
-
-	strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
-
-	/*
-	enum _SYSTEM_STATUS
-	{
-		S_BOOTING               = 0,
-		S_IDLE,                 = 1
-		S_AUTHORIZING,          =2
-		S_REASSIGN_CHECK,       =3
-		S_REASSIGN,             =4
-		S_PRECHARGE,            =5
-		S_PREPARING_FOR_EV,     =6
-		S_PREPARING_FOR_EVSE,   =7
-		S_CHARGING,             =8
-		S_TERMINATING,          =9
-		S_COMPLETE,             =10
-		S_ALARM,                =11
-		S_FAULT                 =12
-	}
-
-	*/
-	if((connectorIdInt > 0) && ((connectorIdInt -1) <= (CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY)))
-	{
-		//0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault
-		//check Transaction active
-		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == (connectorIdInt -1))
-			{
-
-				if(reservationIdInt != ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId)
-				{
-					//SystemStatus:   0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault, 8: Reserved, 9: maintain
-					if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != 12) //S_FAULT
-					{
-						if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 1) //S_IDLE
-						{
-							ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
-							strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
-						}
-						else if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 11) //S_ALARM  //else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 11) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == '9'))
-						{
-							strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Unavailable]);
-
-						}
-						else
-						{
-							strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
-						}
-					}
-					else if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 12) //S_FAULT
-					{
-						strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
-					}
-				}
-				else
-				{
-					//replace reservation
-					ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
-					strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
-
-				}
-
-			}
-		}
-
-		for (int index = 0; index < CCS_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == (connectorIdInt -1))
-			{
-
-				if(reservationIdInt != ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ReservationId)
-				{
-					//SystemStatus:   0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault, 8: Reserved, 9: maintain
-					if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != 12) //S_FAULT
-					{
-
-						if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 1) //S_IDLE
-						{
-							ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
-							strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
-						}
-						else if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 11) //S_ALARM  //else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == '6') || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == '9'))
-						{
-							strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Unavailable]);
-						}
-						else
-						{
-							strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
-
-						}
-					}
-					else if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus ==12) //S_FAULT
-					{
-						strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
-					}
-				}
-				else
-				{
-					//replace reservation
-					ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
-					strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
-
-				}
-
-			}
-		}
-
-		for (int index = 0; index < GB_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == (connectorIdInt - 1))
-			{
-
-				if(reservationIdInt != ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ReservationId)
-				{
-					//SystemStatus:   0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault, 8: Reserved, 9: maintain
-					if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != 12) //S_FAULT
-					{
-
-						if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 1) //S_IDLE
-						{
-							ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
-							strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
-						}
-						else if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 11) //S_ALARM //else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == '6') || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == '9'))
-						{
-							strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Unavailable]);
-						}
-						else
-						{
-							strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
-						}
-					}
-					else if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus ==12) //S_FAULT
-					{
-						strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
-					}
-				}
-				else
-				{
-					//replace reservation
-					ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
-					strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
-
-				}
-
-			}
-		}
-
-		sprintf((char *)ShmOCPP16Data->ReserveNow[connectorIdInt-1].ResponseStatus, "%s" ,comfirmstr);
-	}
-	else
-	{
-		strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
-		sprintf((char *)ShmOCPP16Data->ReserveNow[connectorIdInt-1].ResponseStatus, "%s" ,comfirmstr);
-	}
-
-	if(strcmp(comfirmstr,"Accepted") == 0)
-	{
-		ShmOCPP16Data->ReserveNow[connectorIdInt-1].ConnectorId = connectorIdInt;
-		sprintf((char *)ShmOCPP16Data->ReserveNow[connectorIdInt-1].ExpiryDate, "%s" , expiryDatestr);
-		sprintf((char *)ShmOCPP16Data->ReserveNow[connectorIdInt-1].IdTag, "%s" , idTagstr);
-		sprintf((char *)ShmOCPP16Data->ReserveNow[connectorIdInt-1].ParentIdTag, "%s" , parentIdTagstr);
-		ShmOCPP16Data->ReserveNow[connectorIdInt-1].ReservationId = reservationIdInt;
-	    strcpy(ShmOCPP16Data->ReserveNow[connectorIdInt-1].guid, uuid);
-	    json_object_put(obj);
-	    result = TRUE;
-	    return result;
-
-	}
-
-	json_object_put(obj);
-
-	sendReserveNowTransactionConfirmation(uuid,comfirmstr);
-	//ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowConf = 1;
-
-	return result;
-}
-
-int handleResetRequest(char *uuid, char *payload)
-{
-	int result = FAIL;
-
-	struct json_object *obj, *type;
-	char *typestr;
-	char comfirmstr[20];
-	obj = json_tokener_parse(payload);
-	printf("handleResetRequest\n");
-
-	type = json_object_object_get(obj, "type");
-	typestr = (char *)json_object_get_string(type);
-	sprintf((char *)ShmOCPP16Data->Reset.Type, "%s" ,typestr);
-	//strcpy(ShmOCPP16Data->Reset.Type, typestr);
-
-	if(strcmp(typestr, ResetTypeStr[Hard])==0)
-	{
-	       //check Transaction active
-	       for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-	       {
-	        	if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 8)
-	        	{
-	        		//0: unplug, 1: Plug-in
-	        		//ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ConnectorPlugIn = 0;
-	            }
-	        }
-
-	        for (int index = 0; index < CCS_QUANTITY; index++)
-	        {
-	        	if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 8)
-	        	{
-	        		//0: unplug, 1: Plug-in
-	        		//ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ConnectorPlugIn = 0;
-	        	}
-	        }
-
-	        for (int index = 0; index < GB_QUANTITY; index++)
-	        {
-	        	if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 8)
-	        	{
-	        		//0: unplug, 1: Plug-in
-	        	    //ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ConnectorPlugIn = 0;
-	        	}
-	        }
-
-
-	    ShmOCPP16Data->MsMsg.bits.ResetReq = 1;
-	    strcpy(ShmOCPP16Data->Reset.guid, uuid);
-	    json_object_put(obj);
-	    result = TRUE;
-	    return result;
-
-	//	strcpy(comfirmstr, ResetStatusStr[ResetStatus_Accepted]);
-	//	sprintf((char *)ShmOCPP16Data->Reset.ResponseStatus, "%s" ,comfirmstr);
-
-	 }
-	 else if(strcmp(typestr, ResetTypeStr[Soft])==0)
-	 {
-	     //check Transaction active
-	     for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-	     {
-	        if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 8)
-	        {
-	        	//0: unplug, 1: Plug-in
-	        	//ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ConnectorPlugIn = 0;
-	        }
-	     }
-
-	     for (int index = 0; index < CCS_QUANTITY; index++)
-	     {
-	        if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 8)
-	        {
-	        	//0: unplug, 1: Plug-in
-	        	//ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ConnectorPlugIn = 0;
-	        }
-	     }
-
-	     for (int index = 0; index < GB_QUANTITY; index++)
-	     {
-	        if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 8)
-	        {
-	        	//0: unplug, 1: Plug-in
-	        	//ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ConnectorPlugIn = 0;
-	        }
-	     }
-
-	     ShmOCPP16Data->MsMsg.bits.ResetReq = 1;
-	     strcpy(ShmOCPP16Data->Reset.guid, uuid);
-	     json_object_put(obj);
-	     result = TRUE;
-	     return result;
-		// strcpy(comfirmstr, ResetStatusStr[ResetStatus_Accepted]);
-		// sprintf((char *)ShmOCPP16Data->Reset.ResponseStatus, "%s" ,comfirmstr);
-	 }
-	 else
-	 {
-		 strcpy(comfirmstr, ResetStatusStr[ResetStatus_Rejected]);
-		 sprintf((char *)ShmOCPP16Data->Reset.ResponseStatus, "%s" ,comfirmstr);
-		 goto errorend;
-	 }
-
-errorend:
-	json_object_put(obj);
-	sendResetConfirmation(uuid, comfirmstr);
-	//ShmOCPP16Data->MsMsg.bits.ResetConf = 1;
-
-	return result;
-}
-
-int handleSendLocalListRequest(char *uuid, char *payload)
-{
-	int result = FAIL;
-
-	struct json_object *obj, *listVersion , *localAuthorizationList, *updateType, *jsonitem, *idTag, *idTagInfo ,
-	                   *expiryDate, *parentIdTag, *status;
-	int listVersionInt;
-	char *updateTypestr, *idTagstr, *expiryDatestr, *parentIdTagstr, *statusstr;
-	char comfirmstr[20];
-	int n_localAuthorizations = 0;
-
-	obj = json_tokener_parse(payload);
-	printf("handleSendLocalListRequest\n");
-
-	listVersion  = json_object_object_get(obj, "listVersion");
-	localAuthorizationList   = json_object_object_get(obj, "localAuthorizationList");
-	updateType   = json_object_object_get(obj, "updateType");
-
-	listVersionInt = json_object_get_int(listVersion);
-	ShmOCPP16Data->SendLocalList.ListVersion = listVersionInt;
-
-	updateTypestr = (char *)json_object_get_string(updateType);
-	sprintf((char *)ShmOCPP16Data->SendLocalList.UpdateType, "%s",  updateTypestr);
-
-	printf("handleSendLocalListRequest -1\n");
-
-	if(localAuthorizationList != NULL)
-	n_localAuthorizations = json_object_array_length(localAuthorizationList);
-
-	printf("n_localAuthorizations=%d\n",n_localAuthorizations);
-
-	if(ShmOCPP16Data->SendLocalList.LocalAuthorizationList != NULL)
-		free(ShmOCPP16Data->SendLocalList.LocalAuthorizationList);
-
-	ShmOCPP16Data->SendLocalList.LocalAuthorizationList = (struct StructLocalAuthorizationList *)malloc(sizeof(struct StructLocalAuthorizationList)*n_localAuthorizations);
-	memset(ShmOCPP16Data->SendLocalList.LocalAuthorizationList, 0 ,sizeof(ShmOCPP16Data->SendLocalList.LocalAuthorizationList));
-
-	//ShmOCPP16Data->MsMsg.bits.SendLocalListReq = 1;
-	if(strcmp(updateTypestr, UpdateTypeStr[Full]) == 0)
-	{
-		//Local list full update
-		printf("Local list full update.\n");
-		OCPP_cleanLocalList();
-
-	}
-	else if(strcmp(updateTypestr, UpdateTypeStr[Differential]) == 0)
-	{
-		//Local list different update
-		printf("Local list different update.\n");
-		if(localAuthorizationList == NULL)
-		{
-			strcpy(comfirmstr, UpdateStatusStr[UpdateStatus_Accepted]);
-			goto end;
-		}
-
-		OCPP_getListVerion();
-
-		if(listVersionInt <= localversion )
-		{
-			strcpy(comfirmstr, UpdateStatusStr[UpdateStatus_VersionMismatch]);
-			goto end;
-		}
-	}
-	else
-	{
-		strcpy(comfirmstr, UpdateStatusStr[UpdateStatus_NotSupported]);
-		goto end;
-	}
-
-	for(int i=0;i<n_localAuthorizations;i++)
-	{
-		printf("handleSendLocalListRequest -2\n");
-		jsonitem = json_object_array_get_idx(localAuthorizationList, i);
-		printf("handleSendLocalListRequest -2 -0\n");
-		idTag  = json_object_object_get(jsonitem, "IdToken"/*"idTag"*/);
-		printf("handleSendLocalListRequest -2 -0 -0\n");
-		idTagInfo   = json_object_object_get(jsonitem, "idTagInfo");
-		printf("handleSendLocalListRequest -2 -0 -0 -0\n");
-
-		if(idTagInfo != NULL)
-		{
-			expiryDate  = json_object_object_get(idTagInfo, "expiryDate");
-			printf("handleSendLocalListRequest -2 -0 -0 -0 -0\n");
-			parentIdTag  = json_object_object_get(idTagInfo, "parentIdTag");
-			printf("handleSendLocalListRequest -2 -0 -0 -0 -0 -0\n");
-			status  = json_object_object_get(idTagInfo, "status");
-		}
-
-
-		if(idTag != NULL)
-		idTagstr = (char *)json_object_get_string(idTag);
-		printf("idTagstr=%s\n",idTagstr);
-
-		if(expiryDate != NULL)
-		expiryDatestr = (char *)json_object_get_string(expiryDate);
-		printf("expiryDatestr=%s\n",expiryDatestr);
-
-		if(parentIdTag != NULL)
-		parentIdTagstr = (char *)json_object_get_string(parentIdTag);
-		printf("parentIdTagstr=%s\n",parentIdTagstr);
-
-		statusstr = (char *)json_object_get_string(status);
-		printf("statusstr=%s\n",statusstr);
-
-		printf("handleSendLocalListRequest -2 -1\n");
-
-		OCPP_getIdTag(idTagstr);
-
-		if(strcmp(updateTypestr, UpdateTypeStr[Full]) == 0)
-		{
-			//Local list full update
-			printf("Local list full update.\n");
-			// update list
-			OCPP_addLocalList_1(listVersionInt, idTagstr, parentIdTagstr, expiryDatestr, statusstr);
-
-		}
-		else if(strcmp(updateTypestr, UpdateTypeStr[Differential]) == 0)
-		{
-			if((strcmp(idTagstr, idTagAuthorization) == 0) && (parentIdTag != NULL))
-			{
-				OCPP_addLocalList_1(listVersionInt, idTagstr, parentIdTagstr, expiryDatestr, statusstr);
-
-			}
-			else if((strcmp(idTagstr, idTagAuthorization) == 0) && (parentIdTag == NULL))
-			{
-				OCPP_deleteIdTag(idTagstr);
-			}
-			else if((strcmp(idTagstr, idTagAuthorization) != 0) && (parentIdTag != NULL))
-			{
-				OCPP_addLocalList_1(listVersionInt, idTagstr, parentIdTagstr, expiryDatestr, statusstr);
-
-			}
-
-		}
-
-		strcpy((char *)ShmOCPP16Data->SendLocalList.LocalAuthorizationList[i].IdTag, idTagstr);
-		printf("handleSendLocalListRequest -2 -1 -1\n");
-		strcpy((char *)ShmOCPP16Data->SendLocalList.LocalAuthorizationList[i].IdTagInfo.ExpiryDate, expiryDatestr);
-		strcpy((char *)ShmOCPP16Data->SendLocalList.LocalAuthorizationList[i].IdTagInfo.ParentIdTag, parentIdTagstr);
-		strcpy((char *)ShmOCPP16Data->SendLocalList.LocalAuthorizationList[i].IdTagInfo.Status, statusstr);
-
-		printf("handleSendLocalListRequest -3\n");
-	}
-
-	printf("handleSendLocalListRequest -4\n");
-	strcpy(comfirmstr, UpdateStatusStr[UpdateStatus_Accepted]);
-
-end:
-	json_object_put(obj);
-	sendSendLocalListConfirmation(uuid, comfirmstr);
-	//ShmOCPP16Data->MsMsg.bits.SendLocalListConf = 1;
-	printf("handleSendLocalListRequest -5\n");
-
-	return result;
-}
-
-#define MAX 2000
-
-int handleSetChargingProfileRequest(char *uuid, char *payload)
-{
-	int result = FAIL;
-	struct json_object *obj, *connectorId, *csChargingProfiles, *chargingProfileId, *stackLevel, *chargingProfilePurpose;
-	struct json_object *tempobj, *tempconnectorId, *tempcsChargingProfiles, *tempchargingProfileId, *tempstackLevel, *tempchargingProfilePurpose;
-	int connectorIdInt, chargingProfileIdInt, stackLevelInt;
-	int tempconnectorIdInt, tempchargingProfileIdInt, tempstackLevelInt;
-	const char*chargingProfilePurposeStr;
-	char *tempchargingProfilePurposeStr;
-	int updateflag = FALSE;
-	char comfirmstr[20];
-	int meet= FALSE;
-
-
-	printf("handleSetChargingProfileRequest\n");
-
-	obj = json_tokener_parse(payload);
-
-	connectorId = json_object_object_get(obj, "connectorId");
-	csChargingProfiles = json_object_object_get(obj, "csChargingProfiles");
-
-	chargingProfileId = json_object_object_get(csChargingProfiles, "chargingProfileId");
-	stackLevel = json_object_object_get(csChargingProfiles, "stackLevel");
-	chargingProfilePurpose = json_object_object_get(csChargingProfiles, "chargingProfilePurpose");
-
-	connectorIdInt = json_object_get_int(connectorId);
-	chargingProfileIdInt = json_object_get_int(chargingProfileId);
-	stackLevelInt = json_object_get_int(stackLevel);
-	chargingProfilePurposeStr = json_object_get_string(chargingProfilePurpose);
-
-
-#if 1 // get json object from file
-
-	FILE *fptr1, *fptr2;
-	int lno, linectr = 0;
-	int modifyflag = FALSE;
-	char str[MAX],fname[MAX];
-	char newln[MAX], temp[] = "temp.json";
-	struct json_object *newHeatMap = json_object_new_array();
-
-	printf("\n\n Replace a specific line in a text file with a new text :\n");
-	printf("-------------------------------------------------------------\n");
-	printf(" Input the file name to be opened : ");
-	//fgets(fname, MAX, stdin);
-	//fname[strlen(fname) - 1] = '\0';
-
-	switch(connectorIdInt)
-	{
-		case 0:
-			strcpy(fname, ChargingProfile_0_JSON );
-			break;
-
-		case 1:
-			strcpy(fname, ChargingProfile_1_JSON );
-			break;
-
-		case 2:
-			strcpy(fname, ChargingProfile_2_JSON );
-			break;
-
-		default:
-			strcpy(fname, ChargingProfile_0_JSON );
-			break;
-	}
-
-
-	fptr1 = fopen(fname, "r");
-	if (!fptr1)
-	{
-			//file not exist
-			printf("Unable to open the input file!!\n");
-			fptr1 = fopen(fname, "w+");
-
-	}
-	fclose(fptr1);
-
-	json_object *test_obj = NULL;
-	json_object *tmp_obj = NULL;
-	struct array_list *json_list;
-	struct json_object *jsonitem;
-	size_t n_friends;
-
-	printf("set chargingProfile 1\n");
-	//get json object from file
-	test_obj = json_object_from_file(fname);
-	if(test_obj ==NULL)
-	{
-
-		printf("set chargingProfile: test_obj is Null!!!\n");
-		//assert(test_obj != NULL);
-
-	}
-	tempchargingProfilePurposeStr = NULL;
-	printf("set chargingProfile 1-1\n");
-	if(strcmp(chargingProfilePurposeStr, ChargingProfilePurposeTypeStr[ChargePointMaxProfile]) == 0)
-	{
-		printf("set chargingProfile 1-2\n");
-		if(connectorIdInt != 0)
-		{
-				sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Rejected] );
-				goto end;
-		}
-
-
-	}
-	else if(strcmp(chargingProfilePurposeStr, ChargingProfilePurposeTypeStr[TxDefaultProfile]) == 0)
-	{
-		printf("set chargingProfile 1-3\n");
-		if((connectorIdInt != 0) && (connectorIdInt > (CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY)))
-		{
-				sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Rejected] );
-				goto end;
-		}
-
-	}
-	else if(strcmp(chargingProfilePurposeStr, ChargingProfilePurposeTypeStr[TxProfile]) == 0)
-	{
-		printf("set chargingProfile 1-4\n");
-
-		//check Transaction active
-		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == connectorIdInt)
-			{
-
-				if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == '4')
-				{
-					meet = TRUE;
-				}
-
-			}
-		}
-
-		for (int index = 0; index < CCS_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == connectorIdInt)
-			{
-				if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == '4')
-				{
-					meet = TRUE;
-				}
-
-			}
-		}
-
-		for (int index = 0; index < GB_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == connectorIdInt)
-			{
-				if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == '4')
-				{
-					meet = TRUE;
-				}
-
-			}
-		}
-
-		if(meet == FALSE)
-		{
-			sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Rejected] );
-			goto end;
-		}
-
-		if((connectorIdInt != 0) && (connectorIdInt > (CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY)))
-		{
-				sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Rejected] );
-				goto end;
-		}
-
-
-	}
-
-	printf("set chargingProfile 2\n");
-
-	if((test_obj != NULL) &&(json_object_get_type(test_obj) == json_type_array))
-	{
-
-		/* Get array of tests */
-		json_list = json_object_get_array(test_obj);
-
-		n_friends = json_object_array_length(test_obj);
-		printf("Found %lu friends\n",n_friends);
-
-		for(int i=0;i<n_friends;i++)
-		{
-			jsonitem = json_object_array_get_idx(test_obj, i);
-			printf("%lu. %s\n",i+1,json_object_get_string(jsonitem));
-
-
-			tempconnectorId = json_object_object_get(jsonitem, "connectorId");
-			tempcsChargingProfiles = json_object_object_get(jsonitem, "csChargingProfiles");
-
-			tempchargingProfileId = json_object_object_get(tempcsChargingProfiles, "chargingProfileId");
-			tempstackLevel = json_object_object_get(tempcsChargingProfiles, "stackLevel");
-			tempchargingProfilePurpose = json_object_object_get(tempcsChargingProfiles, "chargingProfilePurpose");
-
-			tempconnectorIdInt = json_object_get_int(tempconnectorId);
-			tempchargingProfileIdInt = json_object_get_int(tempchargingProfileId);
-			tempstackLevelInt = json_object_get_int(tempstackLevel);
-			tempchargingProfilePurposeStr =(char *)json_object_get_string(tempchargingProfilePurpose);
-
-			printf("s t 1\n");
-
-			if((tempconnectorIdInt == connectorIdInt) && ((tempchargingProfileIdInt == chargingProfileIdInt) || (tempstackLevelInt == stackLevelInt) && (strcmp(tempchargingProfilePurposeStr, chargingProfilePurposeStr) == 0)))
-			{
-			    		   //fprintf(fptr2, "%s", str);
-			    		  //fprintf(fptr2, "%s", newln);
-			    		  //modifyflag = TRUE;
-				//tmp_obj = json_object_new_string(payload);
-				//json_object_array_add(newHeatMap, tmp_obj);
-				printf("s t 2\n");
-				json_object_array_add(newHeatMap, obj);
-				printf("s t 3\n");
-				//updateflag = TRUE;
-				printf("update set chargingProfile to file\n");
-
-			}
-			else
-			{
-			    		  // fprintf(fptr2, "%s", newln);
-			    		  //fprintf(fptr2, "%s", str);
-				json_object_array_add(newHeatMap, jsonitem);
-				printf("add set chargingProfile to file\n");
-			}
-
-
-		}
-
-#if 0
-		if(updateflag == FALSE)
-		{
-			tmp_obj = json_object_new_string(payload);
-			json_object_array_add(newHeatMap, tmp_obj);
-			updateflag = TRUE;
-		}
-#endif
-
-		remove(fname);
-	    rename(temp, fname);
-
-		json_object_to_file(fname, newHeatMap);
-		json_object_put ( newHeatMap );
-
-
-		result = TRUE;
-
-#if 0
-		if(errno >=1)
-		{
-			printf("has errno \n");
-			sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Rejected] );
-		}
-		else
-#endif
-		{
-			printf("has no error \n");
-			sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Accepted] );
-
-		}
-
-	}
-	else
-	{
-
-		printf("set chargingProfile 3\n");
-		//write the base object to write.json
-		json_object_array_add(newHeatMap, obj);
-		json_object_to_file(fname, newHeatMap);
-		//sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Rejected] );
-		sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Accepted] );
-		json_object_put ( newHeatMap );
-
-		printf("set chargingProfile 4\n");
-
-	}
-
-	end:
-	printf("set chargingProfile 1-5\n");
-	sendSetChargingProfileConfirmation(uuid, comfirmstr);
-	return result;
-
-
-#endif
-
-#if 0 // file style handleing
-	FILE *fptr1, *fptr2;
-	int lno, linectr = 0;
-	int modifyflag = FALSE;
-	char str[MAX],fname[MAX];
-	char newln[MAX], temp[] = "./mnt/temp.json";
-
-	printf("\n\n Replace a specific line in a text file with a new text :\n");
-	printf("-------------------------------------------------------------\n");
-	printf(" Input the file name to be opened : ");
-	//fgets(fname, MAX, stdin);
-	//fname[strlen(fname) - 1] = '\0';
-
-	switch(connectorIdInt)
-	{
-		case 0:
-		strcpy(fname, ChargingProfile_0_JSON );
-		break;
-
-		case 1:
-		strcpy(fname, ChargingProfile_1_JSON );
-		break;
-
-		case 2:
-		strcpy(fname, ChargingProfile_2_JSON );
-		break;
-
-		default:
-		strcpy(fname, ChargingProfile_0_JSON );
-		break;
-	}
-
-
-	fptr1 = fopen(fname, "r");
-	if (!fptr1)
-	{
-		//file not exist
-		printf("Unable to open the input file!!\n");
-		fptr1 = fopen(fname, "wb");
-		fwrite(newln , 1 , sizeof(newln) , fptr1 );
-
-		fclose(fptr1);
-		json_object_put(obj);
-		json_object_put(tempobj);
-
-	    return result;
-	}
-
-
-	fptr2 = fopen(temp, "w");
-	if (!fptr2)
-	{
-		printf("Unable to open a temporary file to write!!\n");
-	    fclose(fptr1);
-	    return 0;
-	}
-
-	/* get the new line from the user */
-	printf(" Input the content of the new line : ");
-	//fgets(newln, MAX, stdin);
-	memcpy(newln,payload,strlen(payload));
-	/* get the line number to delete the specific line */
-	printf(" Input the line no you want to replace : ");
-    //scanf("%d", &lno);
-	//lno++;
-
-	// copy all contents to the temporary file other except specific line
-	while (!feof(fptr1))
-	{
-	       strcpy(str, "\0");
-	       fgets(str, MAX, fptr1);
-	       if (!feof(fptr1))
-	       {
-	          // linectr++;
-	          // if (linectr != lno)
-	    	   tempobj = json_tokener_parse(str);
-
-	    	   tempconnectorId = json_object_object_get(tempobj, "connectorId");
-	    	   tempcsChargingProfiles = json_object_object_get(tempobj, "csChargingProfiles");
-
-	    	   tempchargingProfileId = json_object_object_get(tempcsChargingProfiles, "chargingProfileId");
-	    	   tempstackLevel = json_object_object_get(tempcsChargingProfiles, "stackLevel");
-	    	   tempchargingProfilePurpose = json_object_object_get(tempcsChargingProfiles, "chargingProfilePurpose");
-
-	    	   tempconnectorIdInt = json_object_get_int(connectorId);
-	    	   tempchargingProfileIdInt = json_object_get_int(chargingProfileIdInt);
-	    	   tempstackLevelInt = json_object_get_int(stackLevel);
-	    	   tempchargingProfilePurposeStr = json_object_get_string(chargingProfilePurpose);
-
-	    	   if((tempconnectorId == connectorId) && ((tempchargingProfileIdInt == chargingProfileIdInt) || (tempstackLevelInt == stackLevelInt) && (strcmp(tempchargingProfilePurposeStr, chargingProfilePurposeStr) == 0)))
-	           {
-	               //fprintf(fptr2, "%s", str);
-	    		   fprintf(fptr2, "%s", newln);
-	               modifyflag = TRUE;
-	           }
-	           else
-	           {
-	              // fprintf(fptr2, "%s", newln);
-	        	   fprintf(fptr2, "%s", str);
-	           }
-	       }
-	 }
-
-	 if(modifyflag == FALSE)
-	 {
-
-		 fwrite(newln , 1 , sizeof(newln) , fptr2 );
-	 }
-
-	 result = TRUE;
-
-	 fclose(fptr1);
-	 fclose(fptr2);
-	 remove(fname);
-	 rename(temp, fname);
-	 printf(" Replacement did successfully..!! \n");
-#endif
-	 json_object_put(obj);
-	 json_object_put(tempobj);
-
-	return result;
-}
-
-int handleTriggerMessageRequest(char *uuid, char *payload)
-{
-	int result = FAIL;
-
-	struct json_object *obj, *requestedMessage, *connectorId;
-	int connectorIdInt =0;
-	char *requestedMessagestr;
-	char comfirmstr[20];
-	obj = json_tokener_parse(payload);
-	printf("handleTriggerMessageRequest\n");
-
-	requestedMessage = json_object_object_get(obj, "requestedMessage");
-	connectorId  = json_object_object_get(obj, "connectorId");
-
-	requestedMessagestr = (char *)json_object_get_string(requestedMessage);
-
-	if(connectorId != NULL && connectorId > 0)
-	{
-		connectorIdInt = json_object_get_int(connectorId);
-		sprintf((char *)ShmOCPP16Data->TriggerMessage[connectorIdInt -1].RequestedMessage, "%s" ,requestedMessagestr);
-		ShmOCPP16Data->TriggerMessage[connectorIdInt -1].ConnectorId = connectorIdInt;
-		ShmOCPP16Data->CsMsg.bits[connectorIdInt -1].TriggerMessageReq = 1;
-	}
-	else if(connectorId != NULL && connectorId <= 0)
-	{
-		sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Rejected] );
-		goto end;
-	}
-
-	if( strcmp(requestedMessagestr, MessageTriggerStr[FirmwareStatusNotification]) == 0)
-	{
-		sendFirmwareStatusNotificationRequest(FirmwareStatusStr[FirmwareStatus_Downloaded]);
-		sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
-
-	}
-	else if(strcmp(requestedMessagestr, MessageTriggerStr[DiagnosticsStatusNotification]) == 0 )
-	{
-		printf("DiagnosticsStatusStr[DiagnosticsStatus_Idle] =%s\n",DiagnosticsStatusStr[DiagnosticsStatus_Idle]);
-		sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatus_Idle]);
-		sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
-
-	}
-	else if(strcmp(requestedMessagestr, MessageTriggerStr[BootNotification]) == 0 )
-	{
-		sendBootNotificationRequest();
-		sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
-
-	}
-	else if(strcmp(requestedMessagestr, MessageTriggerStr[Heartbeat]) == 0 )
-	{
-		sendHeartbeatRequest(connectorIdInt);
-		sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
-	}
-	else if (strcmp(requestedMessagestr, MessageTriggerStr[MeterValues]) == 0 )
-	{
-		if(connectorId != NULL)
-		{
-			if((connectorIdInt > 0) && ((connectorIdInt -1) < (CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY)))
-			{
-				sendMeterValuesRequest(connectorIdInt -1);
-				sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
-			}
-			else
-			{
-				sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Rejected] );
-			}
-
-		}
-		else
-		{
-			for(int idx=0;idx<(CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY);idx++)
-				sendMeterValuesRequest(idx);
-
-			sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
-		}
-
-	}
-	else if(strcmp(requestedMessagestr, MessageTriggerStr[StatusNotification]) == 0 )
-	{
-		if(connectorId != NULL)
-		{
-			if((connectorIdInt > 0) && ((connectorIdInt -1) < (CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY)))
-			{
-				sendStatusNotificationRequest(connectorIdInt -1);
-				sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
-			}
-			else
-			{
-				sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Rejected] );
-			}
-
-		}
-		else
-		{
-			for(int idx=0;idx<(CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY);idx++)
-				sendStatusNotificationRequest(idx);
-
-			sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
-		}
-
-	}
-	else
-	{
-		sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_NotImplemented] );
-	}
-
-end:
-	json_object_put(obj);
-	sendTriggerMessageConfirmation(uuid,comfirmstr);
-	//if(connectorId != NULL)
-	//ShmOCPP16Data->CsMsg.bits[connectorIdInt -1].TriggerMessageConf = 1;
-
-	return result;
-}
-
-int handleUnlockConnectorRequest(char *uuid, char *payload)
-{
-	int result = FAIL;
-
-	struct json_object *obj, *connectorId;
-	int connectorIdInt =0;
-	char comfirmstr[20];
-
-	obj = json_tokener_parse(payload);
-	printf("handleUnlockConnectorRequest\n");
-
-	connectorId  = json_object_object_get(obj, "connectorId");
-	connectorIdInt = json_object_get_int(connectorId);
-
-	if(CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY == 0)
-	{
-		sprintf(comfirmstr, "%s", UnlockStatusStr[UnlockStatus_NotSupported] );
-		goto end;
-	}
-	else if((connectorIdInt > CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY) || (connectorIdInt <= 0))
-	{
-		//sprintf(comfirmstr, "%s", UnlockStatusStr[UnlockStatus_NotSupported] );
-		sprintf(comfirmstr, "%s", UnlockStatusStr[UnlockFailed] );
-		goto end;
-	}
-	else
-	{
-	  //check Transaction active
-		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-		{
-		     if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == connectorIdInt ) &&  (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == '4') )
-		     {
-		    	 //stop Transaction
-		    	 //ShmOCPP16Data->CpMsg.bits[connectorIdInt-1].StopTransactionReq = 1;
-		    	 ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].UnlockConnectorReq = 1;
-
-		     }
-		}
-
-		for (int index = 0; index < CCS_QUANTITY; index++)
-		{
-		     if ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == connectorIdInt ) &&  (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == '4'))
-		     {
-		    	 //stop Transaction
-		    	 //ShmOCPP16Data->CpMsg.bits[connectorIdInt-1].StopTransactionReq = 1;
-		    	 ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].UnlockConnectorReq = 1;
-
-		     }
-		}
-
-		for (int index = 0; index < GB_QUANTITY; index++)
-		{
-		     if ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == connectorIdInt ) &&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == '4'))
-		     {
-		    	 //stop Transaction
-		    	 //ShmOCPP16Data->CpMsg.bits[connectorIdInt-1].StopTransactionReq = 1;
-		    	 ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].UnlockConnectorReq = 1;
-
-		     }
-		}
-
-
-
-		ShmOCPP16Data->UnlockConnector[connectorIdInt-1].ConnectorId = connectorIdInt;
-		strcpy(ShmOCPP16Data->UnlockConnector[connectorIdInt-1].guid, uuid);
-	//	sprintf(comfirmstr, "%s",  UnlockStatusStr[Unlocked] );
-		json_object_put(obj);
-		result = TRUE;
-		return result;
-
-	}
-
-end:
-	json_object_put(obj);
-	sendUnlockConnectorConfirmation(uuid, comfirmstr);
-	return result;
-}
-
-int handleUpdateFirmwareRequest(char *uuid, char *payload)
-{
-	int result = FAIL;
-	pthread_t t;
-
-
-	pthread_create(&t, NULL, UpdateFirmwareProcess, payload); // 建�?�執行�?
-	pthread_join(t, NULL); // 等�?�執行�??��?完�?
-
-	sendUpdateFirmwareConfirmation(uuid);
-	ShmOCPP16Data->MsMsg.bits.UpdateFirmwareConf =1;
-	//ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq = 1;
-	return result;
-}
-
-void UpdateFirmwareProcess(void* data)
-{
-	struct json_object *obj, *location, *retries, *retrieveDate, *retryInterval;
-	int retriesInt =0, retryIntervalInt=0;
-	char protocol[10], user[50],password[50],host[50], path[50], ftppath[60],host1[50],path1[20];
-	int port=0;
-	char *locationstr, *retrieveDatestr;
-	//char fname[50]="00000_2018-09-07 160902_CSULog.zip";
-	char comfirmstr[20];
-	int isSuccess = 0;
-	char ftpbuf[200];
-	char temp[100];
-	char * pch;
-
-	char *str = (char*) data; // ?��?輸入資�?
-
-	obj = json_tokener_parse(str);
-	printf("handleUpdateFirmwareRequest\n");
-
-	location  = json_object_object_get(obj, "location");
-	retries    = json_object_object_get(obj, "retries");
-	retrieveDate  = json_object_object_get(obj, "retrieveDate");
-	retryInterval   = json_object_object_get(obj, "retrieveDate");
-
-	locationstr = (char *)json_object_get_string(location);
-
-	if(retries != NULL)
-	retriesInt = json_object_get_int(retries);
-
-	retrieveDatestr = (char *)json_object_get_string(retrieveDate);
-
-	if(retryInterval != NULL)
-	retryIntervalInt = json_object_get_int(retryInterval);
-
-	memset(ftppath, 0, sizeof(ftppath));
-	memset(path, 0, sizeof(path));
-
-	if(strncmp(locationstr,"http", 4) == 0)
-	{
-		sscanf(locationstr,"%[^:]:%*2[/]%[^/]/%199[^\n]",
-		    	    			         protocol, host, path);
-
-		    	//sscanf(locationstr,"%[^:]:%*2[/]%[^:]:%[^@]@%[^/]%199[^\n]",
-		    	    	//	         protocol, user, password, host, path);
-		sprintf(ftppath,"/%s", path);
-
-		printf("protocol =%s\n",protocol);
-
-		printf("host =%s\n",host);
-
-		printf("path =%s\n",path);
-		printf("ftppath=%s\n",ftppath);
-		int ftppathlen=strlen(ftppath);
-		int i=1;
-		char filenametemp[50];
-		while(i < ftppathlen)
-		{
-		   printf("ftppath[ftppathlen-i]:%c\n",ftppath[ftppathlen-i]);
-		   int len=ftppathlen-i;
-		   if(ftppath[len]== 47) // '/' ascll code: 47
-		    {
-		       printf("compare all right\n");
-		       break;
-		    }
-
-		    printf("test substr\n");
-		    i=i+1;
-
-		}
-
-		memset(filenametemp, 0, sizeof(filenametemp));
-		strncpy(filenametemp, ftppath+(ftppathlen-i+1), i+1);
-		filenametemp[i+1] = 0;
-		printf("filenametemp:%s\n", filenametemp);
-
-		sendFirmwareStatusNotificationRequest(FirmwareStatusStr[FirmwareStatus_Downloading]);
-
-
-		 do{
-			 isSuccess = httpDownLoadFile(host, ftppath, filenametemp, locationstr);
-		    	 sleep(retryIntervalInt);
-		    }while((!isSuccess)&&(retriesInt > 0 && retriesInt --));
-
-		isSuccess = httpDownLoadFile(host, ftppath, filenametemp, locationstr);
-
-		if(!isSuccess)
-		{
-		    //BulldogUtil.sleepMs(interval*1000);
-		    printf("Update firmware request and download file fail.\n");
-			sendFirmwareStatusNotificationRequest(FirmwareStatusStr[FirmwareStatus_DownloadFailed]);
-		}
-		else
-		{
-			ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq = 1;
-			sendFirmwareStatusNotificationRequest(FirmwareStatusStr[FirmwareStatus_Downloaded]);
-			isUpdateRequest = TRUE;
-		}
-
-	}
-    else // ftp
-	{
-    	memset(ftpbuf, 0, sizeof(ftpbuf));
-    	memset(temp, 0, sizeof(temp));
-    	strcpy(ftpbuf, locationstr/*"ftp://ipc_ui:pht2016@ftp.phihong.com.tw/DC/log/DemoDC1_2018-07-13_185011_PSULog.zip"*/ );
-    	int ftppathlen=strlen(ftpbuf);
-    	int i=1;
-    	char filenametemp[50];
-    	while(i < ftppathlen)
-    	{
-    		printf("ftppath[ftppathlen-i]:%c\n",ftpbuf[ftppathlen-i]);
-    		int len=ftppathlen-i;
-    		if(ftpbuf[len]== 47) // '/' ascll code: 47
-    		{
-    			printf("all right\n");
-    			break;
-    		}
-
-    		printf("test substr\n");
-    		i=i+1;
-
-    	}
-
-    	memset(filenametemp, 0, sizeof(filenametemp));
-    	strncpy(filenametemp, ftpbuf+(ftppathlen-i+1), i+1);
-    	filenametemp[i+1] = 0;
-    	printf("filenametemp:%s\n", filenametemp);
-    	strncpy(temp, ftpbuf, ftppathlen-i+1);
-
-    	pch=strchr(temp,'@');
-    	if(pch==NULL)
-    	{
-    		sscanf(temp,"%[^:]:%*2[/]%[^:]:%i/%[a-zA-Z0-9._/-]",
-    				         protocol, host, &port, path);
-    		strcpy(user,"anonymous");
-    		strcpy(password,"");
-    	}
-    	else
-    	{
-    		printf("pch=%s\n", pch);
-    		sscanf(temp,"%[^:]:%*2[/]%[^:]:%[^@]@%[^:]:%i/%199[^\n]",
-    				protocol, user, password, host, &port, path);
-    	}
-
-    	sscanf(host,"%[^/]%s",host1, path1);
-    	sprintf(ftppath,"%s", path1);
-
-    	printf("protocol =%s\n",protocol);
-    	printf("user =%s\n",user);
-    	printf("password =%s\n",password);
-    	printf("host1 =%s\n",host1);
-    	printf("port =%d\n",port);
-    	printf("path1 =%s\n",path1);
-    	printf("ftppath=%s\n",ftppath);
-
-		//ftpFile(host, user, password, port, ftppath, fname);
-		//download firmware pthred
-    	if(port == 0)
-    		port = 21;
-
-		sendFirmwareStatusNotificationRequest(FirmwareStatusStr[FirmwareStatus_Downloading]);
-
-		do{
-			 isSuccess = ftpDownLoadFile(host1, user, password, port, ftppath, filenametemp);
-			 sleep(retryIntervalInt);
-		}while((!isSuccess)&&(retriesInt > 0 && retriesInt --));
-
-
-
-
-		if(!isSuccess)
-		{
-	        //BulldogUtil.sleepMs(interval*1000);
-	        printf("Update firmware request and download file fail.\n");
-			sendFirmwareStatusNotificationRequest(FirmwareStatusStr[FirmwareStatus_DownloadFailed]);
-		}
-		else
-		{
-			ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq = 1;
-			sendFirmwareStatusNotificationRequest(FirmwareStatusStr[FirmwareStatus_Downloaded]);
-			isUpdateRequest = TRUE;
-		}
-
-	}
-
-	json_object_put(obj);
-	pthread_exit(NULL); // ?��?�執行�?
-
-}
-
-//==========================================
-// Handle server response routine
-//==========================================
-void handleAuthorizeResponse(char *payload, int gun_index)
-{
-	struct json_object *obj, *message, *context;
-	struct json_object *root_obj, *temp_obj, *jsonitem, *expiryDateitem, *parentIdTagitem, *statusitem;
-	char* filename = AuthorizationCache_JSON;
-	char* buffer = NULL;
-	FILE *pFile;
-	char temp[400];
-	obj = json_tokener_parse(payload);
-	printf("handleAuthorizeResponse\n");
-
-	#ifdef SystemLogMessage
-	if(json_object_object_get(json_object_object_get(obj, "idTagInfo"), "expiryDate") != NULL)
-	DEBUG_INFO("expiryDate: %s\n", json_object_get_string(json_object_object_get(json_object_object_get(obj, "idTagInfo"), "expiryDate")));
-
-	if(json_object_object_get(json_object_object_get(obj, "idTagInfo"), "parentIdTag") != NULL)
-	DEBUG_INFO("parentIdTag: %s\n", json_object_get_string(json_object_object_get(json_object_object_get(obj, "idTagInfo"), "parentIdTag")));
-	DEBUG_INFO("status: %s\n", json_object_get_string(json_object_object_get(json_object_object_get(obj, "idTagInfo"), "status")));
-	#endif
-
-	printf("handleAuthorizeResponse -1\n");
-	if(json_object_object_get(json_object_object_get(obj, "idTagInfo"), "expiryDate") != NULL)
-	strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ExpiryDate, (char *)json_object_get_string(json_object_object_get(json_object_object_get(obj, "idTagInfo"), "expiryDate")));
-	printf("handleAuthorizeResponse -1-0\n");
-	if(json_object_object_get(json_object_object_get(obj, "idTagInfo"), "parentIdTag") != NULL)
-	strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag, (char *)json_object_get_string(json_object_object_get(json_object_object_get(obj, "idTagInfo"), "parentIdTag")));
-	strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status, (char *)json_object_get_string(json_object_object_get(json_object_object_get(obj, "idTagInfo"), "status")));
-	printf("handleAuthorizeResponse -2\n");
-
-    printf("authen reponce 1\n");
-	//Update idTag information to authorization cache if supproted
-	if((strcmp(ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemData, "TRUE") == 0) &&  (ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag != NULL) && (ShmOCPP16Data->Authorize.ResponseIdTagInfo.ExpiryDate != NULL) )
-	{
-		 printf("authen reponce 2\n");
-		if((access(filename,F_OK))!=-1)
-		{
-			printf("authen reponce 3\n");
-			printf("AuthorizationCache exist.\n");
-		}
-		else
-		{
-			printf("authen reponce 4\n");
-			printf("AuthorizationCache not exist\n");
-			FILE *log = fopen(filename, "w+");
-			printf("authen reponce 4 -1\n");
-			//fprintf( log , "" ); --- remove temporally
-			printf("authen reponce 4 -2\n");
-			if(log == NULL)
-			{
-			   printf("log is NULL\n");
-			   goto out;
-			}
-			else
-			{
-			   fclose(log);
-			}
-		}
-		printf("authen reponce 5\n");
-
-		get_file_contents(filename, &buffer);
-		printf("%s",buffer);
-		root_obj = json_tokener_parse(buffer);
-		if(root_obj == NULL)
-		{
-			message = json_object_new_array();
-			context = json_object_new_object();
-			if(ShmOCPP16Data->Authorize.ResponseIdTagInfo.ExpiryDate != NULL)
-			{
-				json_object_object_add(context, "expiryDate", json_object_new_string(ShmOCPP16Data->Authorize.ResponseIdTagInfo.ExpiryDate));
-			}
-			else
-			{
-				json_object_object_add(context, "expiryDate", json_object_new_string(""));
-			}
-
-
-			if(ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag != NULL)
-			{
-				json_object_object_add(context, "parentIdTag",json_object_new_string(ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag));
-			}
-			else
-			{
-				//write Authorize IdTag
-				json_object_object_add(context, "parentIdTag",json_object_new_string(ShmOCPP16Data->Authorize.IdTag));
-			}
-
-
-			json_object_object_add(context, "status", json_object_new_string(ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status));
-
-			json_object_array_add(message, context);
-			memset(temp,0,sizeof temp);
-			sprintf(temp, "%s", json_object_to_json_string(message));
-
-			pFile = fopen( filename,"w" );
-
-		    if( NULL == pFile ){
-				printf( "open failure" );
-
-		    }else{
-				fwrite(temp,1,sizeof(temp),pFile);
-				fclose(pFile);
-		    }
-
-		    json_object_put(message); // Delete the json object
-
-		}
-		else
-		{
-			struct json_object *newHeatMap = json_object_new_array();
-			int n_items = json_object_array_length(root_obj);
-
-		    for(int i=0;i<n_items;i++)
-			{
-		    	int responseIdTagInfoAsZero= 0;
-				jsonitem = json_object_array_get_idx(root_obj, i);
-				printf("%lu. %s\n",i+1,json_object_get_string(jsonitem));
-
-				expiryDateitem = json_object_object_get(jsonitem, "expiryDate");
-				parentIdTagitem = json_object_object_get(jsonitem, "parentIdTag");
-				statusitem = json_object_object_get(jsonitem, "status");
-
-				printf("parentIdTagitem=%s\n",json_object_get_string(parentIdTagitem));
-
-				//printf message
-				if((ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag == NULL) || strcmp(ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag, "") == 0)
-				{
-					printf("ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag is NULL\n");
-					responseIdTagInfoAsZero = 1;
-				}
-				else
-				{
-					printf("ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag=%s\n",ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag);
-				}
-
-			   if((responseIdTagInfoAsZero == 0)&&(strcmp(json_object_get_string(parentIdTagitem), ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag) == 0))
-			   {
-				   //modify item
-				   temp_obj = json_object_new_object();
-				   if(ShmOCPP16Data->Authorize.ResponseIdTagInfo.ExpiryDate != NULL)
-				   {
-					   json_object_object_add(temp_obj, "expiryDate", json_object_new_string(ShmOCPP16Data->Authorize.ResponseIdTagInfo.ExpiryDate));
-				   }
-				   else
-				   {
-					   json_object_object_add(temp_obj, "expiryDate", json_object_new_string(""));
-				   }
-
-
-				   if(ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag != NULL)
-				   {
-					   json_object_object_add(temp_obj, "parentIdTag", json_object_new_string(ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag));
-
-				   }
-				   else
-				   {
-					   json_object_object_add(temp_obj, "parentIdTag", json_object_new_string(json_object_get_string(parentIdTagitem)));
-
-				   }
-
-
-				   json_object_object_add(temp_obj, "status", json_object_new_string(ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status));
-				   json_object_array_add(newHeatMap, temp_obj);
-
-			   }
-			   else
-			   {
-				   //wrie original item
-				   json_object_array_add(newHeatMap, jsonitem);
-				   printf("authen reponce 5-1\n");
-			   }
-
-			}
-
-		    //(1)write to temp file (2)remove original file (3) rename filename  of temp file
-		    char temp[] = "temp.json";
-
-		    FILE *fp;
-		    fp=fopen(temp,"w");
-		    fclose(fp);
-
-		    remove(filename);
-		    rename(temp, filename);
-
-		    json_object_to_file(filename, newHeatMap);
-			printf("authen reponce 5-2\n");
-		    json_object_put(newHeatMap); // Delete the json object
-		    printf("authen reponce 5-3\n");
-
-		}
-
-		 printf("authen reponce 5-4\n");
-		 free(buffer);
-		 printf("authen reponce 5-5\n");
-		// json_object_put(root_obj); // Delete the json object
-		 printf("authen reponce 5-6\n");
-
-	}
-
-	out:
-	json_object_put(obj);
-	ShmOCPP16Data->SpMsg.bits.AuthorizeReq = 0;
-	ShmOCPP16Data->SpMsg.bits.AuthorizeConf = 1; // inform csu
-	authorizeRetryTimes = 0;
-
-	//for test
-#if 0
-	ShmOCPP16Data->CpMsg.bits[0].StartTransactionReq = 1;
-	ShmOCPP16Data->CpMsg.bits[0].StartTransactionConf = 1;
-	ShmSysConfigAndInfo->SysInfo.ChademoChargingData[0].SystemStatus ='3'; //preparing
-	teststatus = 0; //for  startTransaction
-#endif
-}
-
-void handleBootNotificationResponse(char *payload, int gun_index)
-{
-	struct json_object *obj;
-	char *status;
-	obj = json_tokener_parse(payload);
-
-	printf("handleBootNotificationResponse\n");
-	#ifdef SystemLogMessage
-	DEBUG_INFO("currentTime: %s\n", json_object_get_string(json_object_object_get(obj, "currentTime")));
-	DEBUG_INFO("interval: %d\n", json_object_get_int(json_object_object_get(obj, "interval")));
-	DEBUG_INFO("status: %s\n", json_object_get_string(json_object_object_get(obj, "status")));
-	#endif
-
-	//write back to ShmOCPP16Data->BootNotification
-	strcpy((char *)ShmOCPP16Data->BootNotification.ResponseCurrentTime,(char *)json_object_get_string(json_object_object_get(obj, "currentTime")));
-	ShmOCPP16Data->BootNotification.ResponseHeartbeatInterval = json_object_get_int(json_object_object_get(obj, "interval"));
-	strcpy((char *)ShmOCPP16Data->BootNotification.ResponseStatus, (char *)json_object_get_string(json_object_object_get(obj, "status")));
-
-	status = json_object_get_string(json_object_object_get(obj, "status"));
-
-
-	BootNotificationInterval = ShmOCPP16Data->BootNotification.ResponseHeartbeatInterval;
-	HeartBeatWaitTime = BootNotificationInterval;
-
-    printf("test 1\n");
-	if((strcmp(status, RegistrationStatusStr[RegistrationStatus_Accepted]) == 0 )/* ||
-		(strcmp(status, RegistrationStatusStr[RegistrationStatus_Pending]) == 0) ||
-		(strcmp(status, RegistrationStatusStr[RegistrationStatus_Rejected]) == 0)*/)
-	{
-		server_sign = TRUE;
-		server_pending =FALSE;
-
-	}
-	else if(strcmp(status, RegistrationStatusStr[RegistrationStatus_Pending]) == 0)
-	{
-		server_pending = TRUE;
-	}
-
-
-	double diff_t;
-	struct tm tp;
-	char buf[28];
-	char timebuf[50];
-	strptime(ShmOCPP16Data->BootNotification.ResponseCurrentTime, "%Y-%m-%dT%H:%M:%S", &tp);
-	tp.tm_isdst = -1;
-	time_t utc = mktime(&tp);
-
-	strftime(buf, 28, "%Y-%m-%d %H:%M:%S", &tp);
-	memset(timebuf, 0, sizeof timebuf);
-	sprintf(timebuf,"date -s '%s'",buf);
-	printf("timebuf=%s\n",timebuf);
-	system(timebuf);
-
-	//==============================================
-	// RTC sync
-	//==============================================
-	system("/sbin/hwclock -w --systohc");
-
-	printf("test 2\n");
-	json_object_put(obj); // Delete the json object
-
-	printf("test 3\n");
-
-	ShmOCPP16Data->OcppConnStatus = 1; ////0: disconnected, 1: connected
-
-	ShmOCPP16Data->SpMsg.bits.BootNotificationConf = 1;
-
-}
-
-void handleDataTransferResponse(char *payload, int gun_index)
-{
-	struct json_object *obj;
-	obj = json_tokener_parse(payload);
-
-	#ifdef SystemLogMessage
-	DEBUG_INFO("data: %s\n", json_object_get_string(json_object_object_get(obj, "data")));
-	#endif
-}
-
-void handleDiagnosticsStatusNotificationResponse(char *payload, int gun_index)
-{
-	struct json_object *obj;
-	obj = json_tokener_parse(payload);
-//	ShmOCPP16Data->SpMsg.bits.DiagnosticsStatusNotificationReq = 0;
-//	ShmOCPP16Data->SpMsg.bits.DiagnosticsStatusNotificationConf = 1;
-	//No fields are defined.
-}
-
-void handleFirmwareStatusNotificationResponse(char *payload, int gun_index)
-{
-	struct json_object *obj;
-	obj = json_tokener_parse(payload);
-	ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationReq = 0;
-	ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationConf = 1;
-
-	//No fields are defined.
-}
-
-void handleHeartbeatResponse(char *payload, int gun_index)
-{
-	struct json_object *obj;
-	obj = json_tokener_parse(payload);
-	printf("handleHeartbeatResponse\n");
-
-	#ifdef SystemLogMessage
-	DEBUG_INFO("currentTime: %s\n", json_object_get_string(json_object_object_get(obj, "currentTime")));
-	#endif
-
-	strcpy((char *)ShmOCPP16Data->Heartbeat.ResponseCurrentTime,(char *)json_object_get_string(json_object_object_get(obj, "currentTime")));
-
-	double diff_t;
-	struct tm tp;
-	char buf[28];
-	char timebuf[50];
-	strptime(ShmOCPP16Data->Heartbeat.ResponseCurrentTime, "%Y-%m-%dT%H:%M:%S", &tp);
-	tp.tm_isdst = -1;
-	time_t utc = mktime(&tp);
-
-	strftime(buf, 28, "%Y-%m-%d %H:%M:%S", &tp);
-	memset(timebuf, 0, sizeof timebuf);
-	sprintf(timebuf,"date -s '%s'",buf);
-	printf("timebuf=%s\n",timebuf);
-	system(timebuf);
-
-	//==============================================
-	// RTC sync
-	//==============================================
-	system("/sbin/hwclock -w --systohc");
-
-	json_object_put(obj); // Delete the json object
-
-
-}
-
-void handleMeterValuesResponse(char *payload, int gun_index)
-{
-	struct json_object *obj;
-	obj = json_tokener_parse(payload);
-
-	//No fields are defined.
-}
-
-void handleStartTransactionResponse(char *payload, int gun_index)
-{
-	struct json_object *obj;
-	obj = json_tokener_parse(payload);
-
-//	gun_index = gun_index-1;
-	#ifdef SystemLogMessage
-	DEBUG_INFO("idTagInfo-expiryDate: %s\n", json_object_get_string(json_object_object_get(json_object_object_get(obj, "idTagInfo"), "expiryDate")));
-	DEBUG_INFO("idTagInfo-parentIdTag: %s\n", json_object_get_string(json_object_object_get(json_object_object_get(obj, "idTagInfo"), "parentIdTag")));
-	DEBUG_INFO("idTagInfo-status: %s\n", json_object_get_string(json_object_object_get(json_object_object_get(obj, "idTagInfo"), "status")));
-	DEBUG_INFO("transactionId: %d\n", json_object_get_int(json_object_object_get(obj, "transactionId")));
-	#endif
-
-	printf("handleStartTransactionResponse\n");
-
-	if(json_object_object_get(json_object_object_get(obj, "idTagInfo"), "expiryDate") != NULL) // expiryDate is option
-	sprintf((char *)ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.ExpiryDate, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "idTagInfo"), "expiryDate")));
-	printf("handleStartTransactionResponse 01\n");
-
-	if(json_object_object_get(json_object_object_get(obj, "idTagInfo"), "parentIdTag") != NULL) // parentIdTag is option
-	sprintf((char *)ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.ParentIdTag, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "idTagInfo"), "parentIdTag")));
-
-	printf("handleStartTransactionResponse 02\n");
-	sprintf((char *)ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.Status, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "idTagInfo"), "status")));
-	//ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId  = json_object_get_int(json_object_object_get(obj, "transactionId"));
-	ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId = json_object_get_int(json_object_object_get(obj, "transactionId"));
-	printf("handleStartTransactionResponse 03\n");
-	int transactionIdInt = json_object_get_int(json_object_object_get(obj, "transactionId"));
-
-	printf("handleStartTransactionResponse 1\n");
-
-	printf("handleStartTransactionResponse 2\n");
-	ShmOCPP16Data->CpMsg.bits[gun_index].StartTransactionConf = 1;
-	ShmOCPP16Data->CpMsg.bits[gun_index].StartTransactionReq = 0;
-
-
-	//for test
-#if 0
-	cpinitateMsg.bits[gun_index].StatusNotificationReq = 1;
-	ShmOCPP16Data->SpMsg.bits.AuthorizeReq = 0;
-#endif
-	if(strcmp(ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.Status, "Accepted") == 0)
-	{
-#if 0
-		//check Transaction active
-		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)
-			{
-				ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus = '4';
-			}
-		}
-
-		for (int index = 0; index < CCS_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)
-			{
-				ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus = '4';
-			}
-		}
-
-		for (int index = 0; index < GB_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)
-			{
-				ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus = '4';
-			}
-	    }
-#endif
-		//add Charging Record
-		SettingChargingRecord(gun_index, transactionIdInt);
-
-	}
-}
-
-void handleStatusNotificationResponse(char *payload, int gun_index)
-{
-	struct json_object *obj;
-	obj = json_tokener_parse(payload);
-
-	printf("handleStatusNotificationResponse\n");
-
-	cpinitateMsg.bits[gun_index].StatusNotificationReq = 0;
-	cpinitateMsg.bits[gun_index].StatusNotificationConf = 1;
-
-	//for test
-#if 0
-	if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[gun_index].SystemStatus =='1') // Idle
-	{
-		ShmSysConfigAndInfo->SysInfo.ChademoChargingData[gun_index].SystemStatus ='3'; //preparing
-		cpinitateMsg.bits[gun_index].StatusNotificationReq = 1;
-	}
-	else if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[gun_index].SystemStatus =='3')//preparing
-	{
-		printf("preparing UserPlugGun=%d\n",UserPlugGun);
-		if(UserPlugGun == 1)
-		{
-			ShmSysConfigAndInfo->SysInfo.ChademoChargingData[gun_index].SystemStatus ='1';
-			cpinitateMsg.bits[gun_index].StatusNotificationReq = 1;
-			UserPlugGun = 0;
-		}
-		else
-		{
-			ShmOCPP16Data->SpMsg.bits.AuthorizeReq = 1;
-
-		}
-
-	}
-#endif
-	//No fields are defined.
-}
-
-void handleStopTransactionnResponse(char *payload, int gun_index)
-{
-	struct json_object *obj;
-	obj = json_tokener_parse(payload);
-    printf("handleStopTransactionnResponse\n");
-   // gun_index = gun_index - 1;
-	if(json_object_object_get(obj, "idTagInfo") != NULL) // option
-	{
-
-		if(json_object_object_get(json_object_object_get(obj, "idTagInfo"), "expiryDate") != NULL) // option
-		sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].ResponseIdTagInfo.ExpiryDate, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "idTagInfo"), "expiryDate")));
-
-		if(json_object_object_get(json_object_object_get(obj, "idTagInfo"), "parentIdTag") != NULL) // option
-		sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].ResponseIdTagInfo.ParentIdTag, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "idTagInfo"), "parentIdTag")));
-
-		sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].ResponseIdTagInfo.Status, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "idTagInfo"), "status")));
-
-
-#ifdef SystemLogMessage
-DEBUG_INFO("idTagInfo-expiryDate: %s\n", json_object_get_string(json_object_object_get(json_object_object_get(obj, "idTagInfo"), "expiryDate")));
-DEBUG_INFO("idTagInfo-parentIdTag: %s\n", json_object_get_string(json_object_object_get(json_object_object_get(obj, "idTagInfo"), "parentIdTag")));
-DEBUG_INFO("idTagInfo-status: %s\n", json_object_get_string(json_object_object_get(json_object_object_get(obj, "idTagInfo"), "status")));
-#endif
-
-	}
-
-	ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionConf = 1;
-	ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq = 0;
-	json_object_put(obj); // Delete the json object
-
-	//for test
-	//UserPlugGun = 0;
-#if 0
-	if(strcmp(ShmOCPP16Data->StopTransaction[gun_index].ResponseIdTagInfo.Status, "Accepted") == 0)
-	{
-		//check Transaction active
-		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)
-			{
-				ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus = '3'; //3: preparing
-
-			}
-		}
-
-		for (int index = 0; index < CCS_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)
-			{
-				ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus = '3'; //3: preparing
-
-			}
-		}
-
-		for (int index = 0; index < GB_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)
-			{
-				ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus = '3'; //3: preparing
-
-			}
-		}
-
-		cpinitateMsg.bits[gun_index].StatusNotificationReq = 1;
-		//ShmOCPP16Data->SpMsg.bits.AuthorizeReq = 1;
-
-	}
-#endif
-
-
-}
-
-//==========================================
-// Handle Error routine
-//==========================================
-void handleError(char *id, char *errorCode, char *errorDescription,char *payload)
-{
-	printf("handleError 1\n");
-	struct json_object *obj;
-	obj = json_tokener_parse(payload);
-	printf("handleError 2\n");
-	#ifdef SystemLogMessage
-	DEBUG_INFO("errorCode: %s\n", errorCode);
-
-	DEBUG_INFO("errorDescription: %s\n", errorDescription);
-	if(obj != NULL)
-	DEBUG_INFO("errorDetails: %s\n", payload);
-	#endif
-}
-
-
-
-//===============================================
-// Common routine
-//===============================================
-int initialConfigurationTable(void)
-{
-	printf("initialConfigurationTable  \n");
-	memset(&(ShmOCPP16Data->ConfigurationTable), 0, sizeof(struct OCPP16ConfigurationTable) );
-	/*Core Profile*/
-	//AllowOfflineTxForUnknownId
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemAccessibility = 1;
-	printf("AllowoddlineTXForUnknownId type: %d  \n", ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemAccessibility);
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemName, "AllowOfflineTxForUnknownId");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemData, "TRUE" );
-	printf("initialConfigurationTable -1  \n");
-	//AuthorizationCacheEnabled
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemAccessibility = 1;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemName, "AuthorizationCacheEnabled");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemData, "FALSE" );
-
-
-	//AuthorizeRemoteTxRequests
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemName, "AuthorizeRemoteTxRequests");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemData, "TRUE" );
-
-
-	//BlinkRepeat
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemAccessibility = 1;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemName, "BlinkRepeat");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemData, "0" );
-
-	//ClockAlignedDataInterval
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemAccessibility = 1;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemName, "ClockAlignedDataInterval");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemData, "0" );
-
-	//ConnectionTimeOut
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemAccessibility = 1;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemName, "ConnectionTimeOut");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemData, "60" );
-
-	//GetConfigurationMaxKeys
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemAccessibility =0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemName, "GetConfigurationMaxKeys");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemData, "43" );
-
-	// HeartbeatInterval
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemAccessibility = 1;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemName, "HeartbeatInterval");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemData, "10" );
-
-	// LightIntensity
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemAccessibility = 1;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemName, "LightIntensity");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemData, "0" );
-
-	// LocalAuthorizeOffline
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemName, "LocalAuthorizeOffline");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData, "TRUE" );
-
-	// LocalPreAuthorize
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemName, "LocalPreAuthorize");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemData, "FALSE" );
-
-	// MaxEnergyOnInvalidId
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemAccessibility = 1;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemName, "MaxEnergyOnInvalidId");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemData, "0" );
-
-	// MeterValuesAlignedData
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemAccessibility = 1;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemName, "MeterValuesAlignedData");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemData, "V,A,KW,KWh" );
-
-	// MeterValuesAlignedDataMaxLength
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemName, "MeterValuesAlignedDataMaxLength");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemData, "4" );
-
-	// MeterValuesSampledData
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemAccessibility = 1;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemName, "MeterValuesSampledData");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemData, "V,A,KW,KWh" );
-
-	// MeterValuesSampledDataMaxLength
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemName, "MeterValuesSampledDataMaxLength");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemData, "4" );
-
-	// MeterValueSampleInterval
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemAccessibility = 1;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemName, "MeterValueSampleInterval");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemData, "10" );
-
-
-	// MinimumStatusDuration
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemAccessibility = 1;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemName, "MinimumStatusDuration");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemData, "0" );
-
-	// NumberOfConnectors
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemName, "NumberOfConnectors");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemData, "3" );
-
-	// ResetRetries
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemAccessibility = 1;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemName, "ResetRetries");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemData, "3" );
-
-	// ConnectorPhaseRotation
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemAccessibility = 1;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemName, "ConnectorPhaseRotation");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "Unknown" );
-
-	// ConnectorPhaseRotationMaxLength
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemName, "ConnectorPhaseRotationMaxLength");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemData, "1" );
-
-	// StopTransactionOnEVSideDisconnect
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemName, "StopTransactionOnEVSideDisconnect");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemData, "TRUE" );
-
-	// StopTransactionOnInvalidId
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemAccessibility = 1;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemName, "StopTransactionOnInvalidId");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemData, "FALSE" );
-
-	// StopTxnAlignedData
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemAccessibility = 1;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemName, "StopTxnAlignedData");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemData, "Energy.Active.Import.Register" );
-
-	// StopTxnAlignedDataMaxLength
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemName, "StopTxnAlignedDataMaxLength");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemData, "0" );
-
-	// StopTxnSampledData
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemAccessibility = 1;
-
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemName, "StopTxnSampledData");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemData, "Energy.Active.Import.Register" );
-
-	// StopTxnSampledDataMaxLength
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemName, "StopTxnSampledDataMaxLength");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData, "0" );
-
-	// SupportedFeatureProfiles
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemName, "SupportedFeatureProfiles");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemData, "Core,FirmwareManagement,LocalAuthListManagement,Reservation,SmartCharging,RemoteTrigger" );
-
-	// SupportedFeatureProfilesMaxLength
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemName, "SupportedFeatureProfilesMaxLength");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemData, "6" );
-
-	// TransactionMessageAttempts
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemAccessibility = 1;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemName, "TransactionMessageAttempts");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemData, "3" );
-
-	// TransactionMessageRetryInterval
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemAccessibility = 1;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemName, "TransactionMessageRetryInterval");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemData, "60" );
-
-	// UnlockConnectorOnEVSideDisconnect
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemName, "UnlockConnectorOnEVSideDisconnect");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemData, "TRUE" );
-
-	// WebSocketPingInterval
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemAccessibility = 1;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemName, "WebSocketPingInterval");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemData, "30" );
-
-
-	/* Local Auth List Management Profile*/
-	//LocalAuthListEnabled
-	ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemAccessibility = 1;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemName, "LocalAuthListEnabled");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "TRUE" );
-
-	//LocalAuthListMaxLength
-	ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemName, "LocalAuthListMaxLength");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemData, "500" );
-
-	//SendLocalListMaxLength
-	ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemName, "SendLocalListMaxLength");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemData, "500" );
-
-	//ReserveConnectorZeroSupported
-	ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemName, "ReserveConnectorZeroSupported");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemData, "FALSE" );
-
-
-	/*  Smart Charging Profile */
-	//ChargeProfileMaxStackLevel
-	ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemName, "ChargeProfileMaxStackLevel");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemData, "3" );
-
-	// ChargingScheduleAllowedChargingRateUnit
-	ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemName, "ChargingScheduleAllowedChargingRateUnit");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemData, "Current" );
-
-	// ChargingScheduleMaxPeriods
-	ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemName, "ChargingScheduleMaxPeriods");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemData, "10" );
-
-	// ConnectorSwitch3to1PhaseSupported
-	ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemName, "ConnectorSwitch3to1PhaseSupported");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemData, "TRUE" );
-
-	// MaxChargingProfilesInstalled
-	ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemName, "MaxChargingProfilesInstalled");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemData, "9" );
-
-#if 0
-	//write Configuration to flash
-	unsigned int i,Chk;
-	unsigned char *ptr;
-	int fd,wrd;
-
-	// Save factory default setting value to flash backup setting block
-	fd = open("/Storage/OCPP/OCPPConfiguration.txt", O_RDWR);
-	if (fd < 0)
-	{
-		#ifdef SystemLogMessage
-		DEBUG_ERROR("open /Storage/OCPP/OCPPConfiguration.txt NG");
-		#endif
-		free(ptr);
-		return 0;
-	}
-	wrd=write(fd, &ShmOCPP16Data->ConfigurationTable, sizeof(struct OCPP16ConfigurationTable));
-	close(fd);
-	if(wrd!=(sizeof(struct SysConfigData)))
-	{
-		#ifdef SystemLogMessage
-		DEBUG_ERROR("write /Storage/OCPP/OCPPConfiguration.txt NG");
-		#endif
-		free(ptr);
-		return 0;
-	}
-#endif
-	return 0;
-}
-
-
-
-void getKeyValue(char *keyReq)
-{
-	 int isEmpty = FALSE;
-	 int isKnowKey = FALSE;
-	 int unKnowIndex = 0;
-
-	 printf("enter getKeyValue \n");
-	 printf("keyReq= %s\n", keyReq);
-
-	 if((keyReq == NULL) || (strlen(keyReq) == 0))
-	     isEmpty = TRUE;
-
-	 printf("getkey_1\n");
-
-	 if(isEmpty || strcmp(keyReq, "AllowOfflineTxForUnknownId") == 0)
-	 {
-		printf("getkey_1_0_0\n");
-	             		//debug.logout("Request key: " + (isEmpty?"AllowOfflineTxForUnknownId":keyReq[iReq]));
-		strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_AllowOfflineTxForUnknownId].Item, "AllowOfflineTxForUnknownId");
-		printf("getkey_1_0\n");
-
-		strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AllowOfflineTxForUnknownId].Key, "AllowOfflineTxForUnknownId");
-		printf("getkey_1_1\n");
-		if(ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemAccessibility == 1)
-		{
-			strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AllowOfflineTxForUnknownId].ReadOnly, "0"/*"FALSE"*/);
-		}
-		else
-		{
-			strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AllowOfflineTxForUnknownId].ReadOnly, "1"/*"TRUE"*/);
-		}
-
-		printf("getkey_1_2\n");
-		strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AllowOfflineTxForUnknownId].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemData );
-		isKnowKey = TRUE;
-	 }
-	 printf("getkey_2\n");
-
-	 if(isEmpty || strcmp(keyReq, "AuthorizationCacheEnabled") == 0 )
-	 {
-
-		strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_AuthorizationCacheEnabled].Item, "AuthorizationCacheEnabled");
-		strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AuthorizationCacheEnabled].Key, "AuthorizationCacheEnabled");
-
-		if(ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemAccessibility == 1)
-		{
-			strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AuthorizationCacheEnabled].ReadOnly, "0"/*"FALSE"*/);
-		}
-		else
-		{
-			strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AuthorizationCacheEnabled].ReadOnly, "1"/*"TRUE"*/);
-		}
-
-		strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AuthorizationCacheEnabled].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemData );
-		isKnowKey = TRUE;
-		printf("AuthorizationCacheEnabled\n");
-	 }
-
-	 if(isEmpty || strcmp(keyReq, "AuthorizeRemoteTxRequests") == 0 )
-	 {
-		strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_AuthorizeRemoteTxRequests].Item, "AuthorizeRemoteTxRequests");
-		strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AuthorizeRemoteTxRequests].Key, "AuthorizeRemoteTxRequests");
-
-		if(ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemAccessibility == 1)
-		{
-			strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AuthorizeRemoteTxRequests].ReadOnly, "0"/*"FALSE"*/);
-		}
-		else
-		{
-			strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AuthorizeRemoteTxRequests].ReadOnly, "1"/*"TRUE"*/);
-		}
-
-		strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AuthorizeRemoteTxRequests].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemData );
-		isKnowKey = TRUE;
-		printf("AuthorizeRemoteTxRequests\n");
-	 }
-
-	  if(isEmpty || strcmp(keyReq, "BlinkRepeat") == 0 )
-	  {
-		  strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_BlinkRepeat].Item, "BlinkRepeat");
-		  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_BlinkRepeat].Key, "BlinkRepeat");
-
-		  if(ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemAccessibility == 1)
-		  {
-			  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_BlinkRepeat].ReadOnly, "0"/*"FALSE"*/);
-		  }
-		  else
-		  {
-			  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_BlinkRepeat].ReadOnly, "1"/*"TRUE"*/);
-		  }
-
-		  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_BlinkRepeat].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemData );
-		  isKnowKey = TRUE;
-		  printf("BlinkRepeat\n");
-	  }
-
-	   if(isEmpty ||  strcmp(keyReq, "ClockAlignedDataInterval") == 0 )
-	   {
-		   strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ClockAlignedDataInterval].Item, "ClockAlignedDataInterval");
-		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ClockAlignedDataInterval].Key, "ClockAlignedDataInterval");
-
-		   if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemAccessibility == 1)
-		   {
-			   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ClockAlignedDataInterval].ReadOnly, "0"/*"FALSE"*/);
-		   }
-		   else
-		   {
-			   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ClockAlignedDataInterval].ReadOnly, "1"/*"TRUE"*/);
-		   }
-
-
-		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ClockAlignedDataInterval].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemData );
-		   isKnowKey = TRUE;
-		   printf("ClockAlignedDataInterval\n");
-	   }
-
-	   if(isEmpty ||   strcmp(keyReq, "ConnectionTimeOut") == 0 )
-	   {
-		   strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ConnectionTimeOut].Item, "ConnectionTimeOut");
-		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectionTimeOut].Key, "ConnectionTimeOut");
-
-		   if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemAccessibility == 1)
-		   {
-			   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectionTimeOut].ReadOnly, "0"/*"FALSE"*/);
-		   }
-		   else
-		   {
-			   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectionTimeOut].ReadOnly, "1"/*"TRUE"*/);
-		   }
-
-
-		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectionTimeOut].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemData );
-		   isKnowKey = TRUE;
-		   printf("ConnectionTimeOut\n");
-	   }
-
-	   if(isEmpty ||  strcmp(keyReq, "GetConfigurationMaxKeys") == 0 )
-	   {
-
-		   strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_GetConfigurationMaxKeys].Item, "GetConfigurationMaxKeys");
-		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_GetConfigurationMaxKeys].Key, "GetConfigurationMaxKeys");
-
-		   if(ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemAccessibility == 1)
-		   {
-			   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_GetConfigurationMaxKeys].ReadOnly, "0"/*"FALSE"*/);
-		   }
-		   else
-		   {
-			   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_GetConfigurationMaxKeys].ReadOnly, "1"/*"TRUE"*/);
-		   }
-
-		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_GetConfigurationMaxKeys].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemData );
-		   isKnowKey = TRUE;
-		   printf("GetConfigurationMaxKeys\n");
-	   }
-
-	   if(isEmpty ||  strcmp(keyReq, "HeartbeatInterval") == 0 )
-	   {
-
-		   strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_HeartbeatInterval].Item, "HeartbeatInterval");
-		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_HeartbeatInterval].Key, "HeartbeatInterval");
-
-		   if(ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemAccessibility == 1)
-		   {
-			   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_HeartbeatInterval].ReadOnly, "0"/*"FALSE"*/);
-		   }
-		   else
-		   {
-			   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_HeartbeatInterval].ReadOnly, "1"/*"TRUE"*/);
-		   }
-
-		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_HeartbeatInterval].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemData );
-		   isKnowKey = TRUE;
-		   printf("HeartbeatInterval\n");
-	   }
-
-	   if(isEmpty ||  strcmp(keyReq, "LightIntensity") == 0 )
-	   {
-		   strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_LightIntensity].Item, "LightIntensity");
-		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LightIntensity].Key, "LightIntensity");
-
-		   if(ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemAccessibility == 1)
-		   {
-			   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LightIntensity].ReadOnly, "0"/*"FALSE"*/);
-		   }
-		   else
-		   {
-			   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LightIntensity].ReadOnly, "1"/*"TRUE"*/);
-		   }
-
-		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LightIntensity].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemData );
-		   isKnowKey = TRUE;
-		   printf("LightIntensity\n");
-	   }
-
-	   if(isEmpty ||  strcmp(keyReq, "LocalAuthorizeOffline") == 0 )
-	   {
-
-		   strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_LocalAuthorizeOffline].Item, "LocalAuthorizeOffline");
-		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthorizeOffline].Key, "LocalAuthorizeOffline");
-
-		   if(ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemAccessibility == 1)
-		   {
-			   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthorizeOffline].ReadOnly, "0"/*"FALSE"*/);
-		   }
-		   else
-		   {
-			   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthorizeOffline].ReadOnly, "1"/*"TRUE"*/);
-		   }
-
-		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthorizeOffline].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData );
-		   isKnowKey = TRUE;
-		   printf("LocalAuthorizeOffline\n");
-	   }
-
-	   if(isEmpty || strcmp(keyReq, "LocalPreAuthorize") == 0 )
-	   {
-
-		   strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_LocalPreAuthorize].Item, "LocalPreAuthorize");
-		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalPreAuthorize].Key, "LocalPreAuthorize");
-
-		   if(ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemAccessibility == 1)
-		   {
-			   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalPreAuthorize].ReadOnly, "0"/*"FALSE"*/);
-		   }
-		   else
-		   {
-			   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalPreAuthorize].ReadOnly, "1"/*"TRUE"*/);
-		   }
-
-		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalPreAuthorize].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemData );
-		   isKnowKey = TRUE;
-		   printf("LocalPreAuthorize\n");
-	    }
-
-	    if(isEmpty ||  strcmp(keyReq, "MaxEnergyOnInvalidId") == 0 )
-	    {
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_MaxEnergyOnInvalidId].Item, "MaxEnergyOnInvalidId");
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MaxEnergyOnInvalidId].Key, "MaxEnergyOnInvalidId");
-
-	    	 if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemAccessibility == 1)
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MaxEnergyOnInvalidId].ReadOnly, "0"/*"FALSE"*/);
-	    	 }
-	    	 else
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MaxEnergyOnInvalidId].ReadOnly, "1"/*"TRUE"*/);
-	    	 }
-
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MaxEnergyOnInvalidId].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemData );
-	    	 isKnowKey = TRUE;
-	    	 printf("MaxEnergyOnInvalidId\n");
-	    }
-
-	    if(isEmpty ||  strcmp(keyReq, "MeterValuesAlignedData") == 0 )
-	    {
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_MeterValuesAlignedData].Item, "MeterValuesAlignedData");
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesAlignedData].Key, "MeterValuesAlignedData");
-
-	    	 if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemAccessibility == 1)
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesAlignedData].ReadOnly, "0"/*"FALSE"*/);
-	    	 }
-	    	 else
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesAlignedData].ReadOnly, "1"/*"TRUE"*/);
-	    	 }
-
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesAlignedData].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemData );
-	    	 isKnowKey = TRUE;
-	    	 printf("MeterValuesAlignedData\n");
-	    }
-
-	     if(isEmpty ||  strcmp(keyReq, "MeterValuesAlignedDataMaxLength") == 0 )
-	     {
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_MeterValuesAlignedDataMaxLength].Item, "MeterValuesAlignedDataMaxLength");
-	         strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesAlignedDataMaxLength].Key, "MeterValuesAlignedDataMaxLength");
-
-	         if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemAccessibility == 1)
-	         {
-	        	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesAlignedDataMaxLength].ReadOnly, "0"/*"FALSE"*/);
-	         }
-	         else
-	         {
-	        	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesAlignedDataMaxLength].ReadOnly, "1"/*"TRUE"*/);
-	         }
-
-	         strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesAlignedDataMaxLength].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemData );
-	         isKnowKey = TRUE;
-	         printf("MeterValuesAlignedDataMaxLength\n");
-	      }
-
-	     if(isEmpty ||  strcmp(keyReq, "MeterValuesSampledData") == 0 )
-	     {
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_MeterValuesSampledData].Item, "MeterValuesSampledData");
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesSampledData].Key, "MeterValuesSampledData");
-
-	    	 if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemAccessibility == 1)
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesSampledData].ReadOnly, "0"/*"FALSE"*/);
-	    	 }
-	    	 else
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesSampledData].ReadOnly, "1"/*"TRUE"*/);
-	    	 }
-
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesSampledData].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemData );
-	    	 isKnowKey = TRUE;
-	    	 printf("MeterValuesSampledData\n");
-	     }
-
-	    if(isEmpty ||   strcmp(keyReq, "MeterValuesSampledDataMaxLength") == 0 )
-	    {
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_MeterValuesSampledDataMaxLength].Item, "MeterValuesSampledDataMaxLength");
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesSampledDataMaxLength].Key, "MeterValuesSampledDataMaxLength");
-
-	    	 if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemAccessibility == 1)
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesSampledDataMaxLength].ReadOnly, "0"/*"FALSE"*/);
-	    	 }
-	    	 else
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesSampledDataMaxLength].ReadOnly, "1"/*"TRUE"*/);
-	    	 }
-	         strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesSampledDataMaxLength].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemData );
-	         isKnowKey = TRUE;
-	         printf("MeterValuesSampledDataMaxLength\n");
-	    }
-
-	   if(isEmpty ||  strcmp(keyReq, "MeterValueSampleInterval") == 0 )
-	   {
-		   strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_MeterValueSampleInterval].Item, "MeterValueSampleInterval");
-		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValueSampleInterval].Key, "MeterValueSampleInterval");
-
-		   if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemAccessibility == 1)
-		   {
-			   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValueSampleInterval].ReadOnly, "0"/*"FALSE"*/);
-		   }
-		   else
-		   {
-			   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValueSampleInterval].ReadOnly, "1"/*"TRUE"*/);
-		   }
-
-		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValueSampleInterval].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemData );
-		   isKnowKey = TRUE;
-		   printf("MeterValueSampleInterval\n");
-	    }
-
-	   if(isEmpty || strcmp(keyReq, "MinimumStatusDuration") == 0 )
-	   {
-		   strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_MinimumStatusDuration].Item, "MinimumStatusDuration");
-		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MinimumStatusDuration].Key, "MinimumStatusDuration");
-
-		   if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemAccessibility == 1)
-		   {
-			   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MinimumStatusDuration].ReadOnly, "0"/*"FALSE"*/);
-		   }
-		   else
-		   {
-			   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MinimumStatusDuration].ReadOnly, "1"/*"TRUE"*/);
-		   }
-
-		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MinimumStatusDuration].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[17].ItemData );
-		   isKnowKey = TRUE;
-		   printf("MinimumStatusDuration\n");
-	    }
-
-	    if(isEmpty || strcmp(keyReq, "NumberOfConnectors") == 0 )
-	    {
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_NumberOfConnectors].Item, "NumberOfConnectors");
-	         strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_NumberOfConnectors].Key, "NumberOfConnectors");
-
-	         if(ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemAccessibility == 1)
-	         {
-	        	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_NumberOfConnectors].ReadOnly, "0"/*"FALSE"*/);
-	         }
-	         else
-	         {
-	        	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_NumberOfConnectors].ReadOnly, "1"/*"TRUE"*/);
-	         }
-
-	         strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_NumberOfConnectors].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemData );
-	         isKnowKey = TRUE;
-	         printf("NumberOfConnectors\n");
-	    }
-
-	    if(isEmpty || strcmp(keyReq, "ResetRetries") == 0 )
-	    {
-	    	strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ResetRetries].Item, "ResetRetries");
-	        strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ResetRetries].Key, "ResetRetries");
-
-	        if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemAccessibility == 1)
-	        {
-	        	strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ResetRetries].ReadOnly, "0"/*"FALSE"*/);
-	        }
-	        else
-	        {
-	        	strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ResetRetries].ReadOnly, "1"/*"TRUE"*/);
-	        }
-
-	        strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ResetRetries].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemData );
-	        isKnowKey = TRUE;
-	        printf("ResetRetries\n");
-	    }
-
-	    if(isEmpty || strcmp(keyReq, "ConnectorPhaseRotation") == 0 )
-	    {
-	    	strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ConnectorPhaseRotation].Item, "ConnectorPhaseRotation");
-	        strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorPhaseRotation].Key, "ConnectorPhaseRotation");
-
-	        if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemAccessibility == 1)
-	        {
-	        	strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorPhaseRotation].ReadOnly, "0"/*"FALSE"*/);
-	        }
-	        else
-	        {
-	        	strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorPhaseRotation].ReadOnly, "1"/*"TRUE"*/);
-	        }
-
-	        strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorPhaseRotation].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData );
-	        isKnowKey = TRUE;
-	        printf("ConnectorPhaseRotation\n");
-	     }
-
-	     if(isEmpty ||  strcmp(keyReq, "ConnectorPhaseRotationMaxLength") == 0 )
-	     {
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ConnectorPhaseRotationMaxLength].Item, "ConnectorPhaseRotationMaxLength");
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorPhaseRotationMaxLength].Key, "ConnectorPhaseRotationMaxLength");
-
-	    	 if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemAccessibility == 1)
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorPhaseRotationMaxLength].ReadOnly, "0"/*"FALSE"*/);
-	    	 }
-	    	 else
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorPhaseRotationMaxLength].ReadOnly, "1"/*"TRUE"*/);
-	    	 }
-
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorPhaseRotationMaxLength].Value,(const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemData );
-	    	 isKnowKey = TRUE;
-	    	 printf("ConnectorPhaseRotationMaxLength\n");
-	     }
-
-	      if(isEmpty ||  strcmp(keyReq, "StopTransactionOnEVSideDisconnect") == 0 )
-	      {
-	    	  strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_StopTransactionOnEVSideDisconnect].Item, "StopTransactionOnEVSideDisconnect");
-	    	  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTransactionOnEVSideDisconnect].Key, "StopTransactionOnEVSideDisconnect");
-
-	    	  if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemAccessibility == 1)
-	    	  {
-	    		  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTransactionOnEVSideDisconnect].ReadOnly, "0"/*"FALSE"*/);
-	    	  }
-	    	  else
-	    	  {
-	    		  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTransactionOnEVSideDisconnect].ReadOnly, "1"/*"TRUE"*/);
-	    	  }
-
-	    	  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTransactionOnEVSideDisconnect].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemData );
-	    	  isKnowKey = TRUE;
-	    	  printf("StopTransactionOnEVSideDisconnect\n");
-	      }
-
-	      if(isEmpty || strcmp(keyReq, "StopTransactionOnInvalidId") == 0 )
-	      {
-	    	  strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_StopTransactionOnInvalidId].Item, "StopTransactionOnInvalidId");
-	    	  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTransactionOnInvalidId].Key, "StopTransactionOnInvalidId");
-
-	    	  if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemAccessibility == 1)
-	    	  {
-	    		  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTransactionOnInvalidId].ReadOnly, "0"/*"FALSE"*/);
-	    	  }
-	    	  else
-	    	  {
-	    		  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTransactionOnInvalidId].ReadOnly, "1"/*"TRUE"*/);
-	    	  }
-
-	    	  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTransactionOnInvalidId].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemData );
-	    	  isKnowKey = TRUE;
-	    	  printf("StopTransactionOnInvalidId\n");
-	      }
-
-	     if(isEmpty ||  strcmp(keyReq, "StopTxnAlignedData") == 0 )
-	     {
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_StopTxnAlignedData].Item, "StopTxnAlignedData");
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnAlignedData].Key, "StopTxnAlignedData");
-
-	    	 if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemAccessibility  == 1)
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnAlignedData].ReadOnly, "0"/*"FALSE"*/);
-	    	 }
-	    	 else
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnAlignedData].ReadOnly, "1"/*"TRUE"*/);
-	    	 }
-
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnAlignedData].Value,(const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemData );
-	    	 isKnowKey = TRUE;
-	    	 printf("StopTxnAlignedData\n");
-	     }
-
-	     if(isEmpty ||  strcmp(keyReq, "StopTxnAlignedDataMaxLength") == 0 )
-	     {
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_StopTxnAlignedDataMaxLength].Item, "StopTxnAlignedDataMaxLength");
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnAlignedDataMaxLength].Key, "StopTxnAlignedDataMaxLength");
-
-	    	 if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemAccessibility == 1)
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnAlignedDataMaxLength].ReadOnly, "0"/*"FALSE"*/);
-	    	 }
-	    	 else
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnAlignedDataMaxLength].ReadOnly, "1"/*"TRUE"*/);
-	    	 }
-
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnAlignedDataMaxLength].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemData );
-	    	 isKnowKey = TRUE;
-	    	 printf("StopTxnAlignedDataMaxLength\n");
-	      }
-
-	     if(isEmpty ||  strcmp(keyReq, "StopTxnSampledData") == 0 )
-	     {
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_StopTxnSampledData].Item, "StopTxnSampledData");
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnSampledData].Key, "StopTxnSampledData");
-
-	    	 if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemAccessibility == 1)
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnSampledData].ReadOnly, "0"/*"FALSE"*/);
-	    	 }
-	    	 else
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnSampledData].ReadOnly, "1"/*"TRUE"*/);
-	    	 }
-
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnSampledData].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemData );
-	    	 isKnowKey = TRUE;
-	    	 printf("StopTxnSampledData\n");
-	     }
-
-	     if(isEmpty ||  strcmp(keyReq, "StopTxnSampledDataMaxLength") == 0 )
-	     {
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_StopTxnSampledDataMaxLength].Item, "StopTxnSampledDataMaxLength");
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnSampledDataMaxLength].Key, "StopTxnSampledDataMaxLength");
-
-	    	 if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemAccessibility == 1)
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnSampledDataMaxLength].ReadOnly, "0"/*"FALSE"*/);
-	    	 }
-	    	 else
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnSampledDataMaxLength].ReadOnly, "1"/*"TRUE"*/);
-	    	 }
-
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnSampledDataMaxLength].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData );
-	    	 isKnowKey = TRUE;
-	    	 printf("StopTxnSampledDataMaxLength\n");
-	     }
-
-	     if(isEmpty ||  strcmp(keyReq, "SupportedFeatureProfiles") == 0 )
-	     {
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_SupportedFeatureProfiles].Item, "SupportedFeatureProfiles");
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SupportedFeatureProfiles].Key, "SupportedFeatureProfiles");
-
-	    	 if(ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemAccessibility == 1)
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SupportedFeatureProfiles].ReadOnly, "0"/*"FALSE"*/);
-	    	 }
-	    	 else
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SupportedFeatureProfiles].ReadOnly, "1"/*"TRUE"*/);
-	    	 }
-
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SupportedFeatureProfiles].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemData );
-	    	 isKnowKey = TRUE;
-	    	 printf("SupportedFeatureProfiles\n");
-	     }
-
-	     if(isEmpty ||  strcmp(keyReq, "SupportedFeatureProfilesMaxLength") == 0 )
-	     {
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_SupportedFeatureProfilesMaxLength].Item, "SupportedFeatureProfilesMaxLength");
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SupportedFeatureProfilesMaxLength].Key, "SupportedFeatureProfilesMaxLength");
-
-	    	 if(ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemAccessibility == 1)
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SupportedFeatureProfilesMaxLength].ReadOnly, "0"/*"FALSE"*/);
-	    	 }
-	    	 else
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SupportedFeatureProfilesMaxLength].ReadOnly, "1"/*"TRUE"*/);
-	    	 }
-
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SupportedFeatureProfilesMaxLength].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemData );
-	    	 isKnowKey = TRUE;
-	    	 printf("SupportedFeatureProfilesMaxLength\n");
-	     }
-
-	     if(isEmpty ||  strcmp(keyReq, "TransactionMessageAttempts") == 0 )
-	     {
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_TransactionMessageAttempts].Item, "TransactionMessageAttempts");
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_TransactionMessageAttempts].Key, "TransactionMessageAttempts");
-
-	    	 if(ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemAccessibility == 1)
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_TransactionMessageAttempts].ReadOnly, "0"/*"FALSE"*/);
-	    	 }
-	    	 else
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_TransactionMessageAttempts].ReadOnly, "1"/*"TRUE"*/);
-	    	 }
-
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_TransactionMessageAttempts].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemData );
-	    	 isKnowKey = TRUE;
-	    	 printf("TransactionMessageAttempts\n");
-	      }
-
-	     if(isEmpty ||  strcmp(keyReq, "TransactionMessageRetryInterval") == 0 )
-	     {
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_TransactionMessageRetryInterval].Item, "TransactionMessageRetryInterval");
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_TransactionMessageRetryInterval].Key, "TransactionMessageRetryInterval");
-
-	    	 if(ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemAccessibility == 1)
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_TransactionMessageRetryInterval].ReadOnly, "0"/*"FALSE"*/);
-	    	 }
-	    	 else
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_TransactionMessageRetryInterval].ReadOnly, "1"/*"TRUE"*/);
-	    	 }
-
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_TransactionMessageRetryInterval].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemData );
-	    	 isKnowKey = TRUE;
-	    	 printf("TransactionMessageRetryInterval\n");
-	     }
-
-	      if(isEmpty ||  strcmp(keyReq, "UnlockConnectorOnEVSideDisconnect") == 0 )
-	      {
-	    	  strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_UnlockConnectorOnEVSideDisconnect].Item, "UnlockConnectorOnEVSideDisconnect");
-	    	  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_UnlockConnectorOnEVSideDisconnect].Key, "UnlockConnectorOnEVSideDisconnect");
-
-	    	  if(ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemAccessibility == 1)
-	    	  {
-	    		  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_UnlockConnectorOnEVSideDisconnect].ReadOnly, "0"/*"FALSE"*/);
-	    	  }
-	    	  else
-	    	  {
-	    		  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_UnlockConnectorOnEVSideDisconnect].ReadOnly, "1"/*"TRUE"*/);
-	    	  }
-
-	    	  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_UnlockConnectorOnEVSideDisconnect].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemData );
-	    	  isKnowKey = TRUE;
-	    	  printf("UnlockConnectorOnEVSideDisconnect\n");
-	       }
-
-	       if(isEmpty ||  strcmp(keyReq, "WebSocketPingInterval") == 0 )
-	       {
-	    	   strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_WebSocketPingInterval].Item, "WebSocketPingInterval");
-	    	   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_WebSocketPingInterval].Key, "WebSocketPingInterval");
-
-	    	   if(ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemAccessibility == 1)
-	    	   {
-	    		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_WebSocketPingInterval].ReadOnly, "0"/*"FALSE"*/);
-	    	   }
-	    	   else
-	    	   {
-	    		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_WebSocketPingInterval].ReadOnly, "1"/*"TRUE"*/);
-	    	   }
-
-	    	   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_WebSocketPingInterval].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemData );
-	    	   isKnowKey = TRUE;
-	    	   printf("WebSocketPingInterval\n");
-	       }
-
-	      if(isEmpty ||  strcmp(keyReq, "LocalAuthListEnabled") == 0 )
-	      {
-	    	   strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_LocalAuthListEnabled].Item, "LocalAuthListEnabled");
-	    	   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthListEnabled].Key, "LocalAuthListEnabled");
-
-	    	   if(ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemAccessibility == 1)
-	    	   {
-	    		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthListEnabled].ReadOnly, "0"/*"FALSE"*/);
-	    	   }
-	    	   else
-	    	   {
-	    		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthListEnabled].ReadOnly, "1"/*"TRUE"*/);
-	    	   }
-
-	    	   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthListEnabled].Value, (const char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData );
-	    	   isKnowKey = TRUE;
-	    	   printf("LocalAuthListEnabled\n");
-	      }
-
-	     if(isEmpty ||  strcmp(keyReq, "LocalAuthListMaxLength") == 0 )
-	     {
-	    	  strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_LocalAuthListMaxLength].Item, "LocalAuthListMaxLength");
-	    	  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthListMaxLength].Key, "LocalAuthListMaxLength");
-
-	    	  if(ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemAccessibility == 1)
-	    	  {
-	    		  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthListMaxLength].ReadOnly, "0"/*"FALSE"*/);
-	    	  }
-	    	  else
-	    	  {
-	    		  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthListMaxLength].ReadOnly, "1"/*"TRUE"*/);
-	    	  }
-
-	    	  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthListMaxLength].Value, (const char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemData );
-	    	  isKnowKey = TRUE;
-	    	  printf("LocalAuthListMaxLength\n");
-	     }
-
-	     if(isEmpty ||  strcmp(keyReq, "SendLocalListMaxLength") == 0 )
-	     {
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_SendLocalListMaxLength].Item, "SendLocalListMaxLength");
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SendLocalListMaxLength].Key, "SendLocalListMaxLength");
-
-	    	 if(ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemAccessibility == 1)
-	    	 {
-	    	  	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SendLocalListMaxLength].ReadOnly, "0"/*"FALSE"*/);
-	    	 }
-	    	 else
-	    	 {
-	    	  	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SendLocalListMaxLength].ReadOnly, "1"/*"TRUE"*/);
-	    	 }
-
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SendLocalListMaxLength].Value, (const char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemData );
-	    	 isKnowKey = TRUE;
-	    	 printf("SendLocalListMaxLength\n");
-	     }
-
-	     if(isEmpty ||  strcmp(keyReq, "ReserveConnectorZeroSupported") == 0 )
-	     {
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ReserveConnectorZeroSupported].Item, "ReserveConnectorZeroSupported");
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ReserveConnectorZeroSupported].Key, "ReserveConnectorZeroSupported");
-
-	    	 if(ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemAccessibility == 1)
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ReserveConnectorZeroSupported].ReadOnly, "0"/*"FALSE"*/);
-	    	 }
-	    	 else
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ReserveConnectorZeroSupported].ReadOnly, "1"/*"TRUE"*/);
-	    	 }
-
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ReserveConnectorZeroSupported].Value,(const char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemData);
-	    	 isKnowKey = TRUE;
-	    	 printf("ReserveConnectorZeroSupported\n");
-	     }
-
-	     if(isEmpty ||  strcmp(keyReq, "ChargeProfileMaxStackLevel") == 0 )
-	     {
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ChargeProfileMaxStackLevel].Item, "ChargeProfileMaxStackLevel");
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargeProfileMaxStackLevel].Key, "ChargeProfileMaxStackLevel");
-
-	    	 if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemAccessibility == 1)
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargeProfileMaxStackLevel].ReadOnly, "0"/*"FALSE"*/);
-	    	 }
-	    	 else
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargeProfileMaxStackLevel].ReadOnly, "1"/*"TRUE"*/);
-	    	 }
-
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargeProfileMaxStackLevel].Value, (const char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemData);
-	    	 isKnowKey = TRUE;
-	    	 printf("ChargeProfileMaxStackLevel\n");
-	     }
-
-	     if(isEmpty ||  strcmp(keyReq, "ChargingScheduleAllowedChargingRateUnit") == 0 )
-	     {
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ChargingScheduleAllowedChargingRateUnit].Item, "ChargingScheduleAllowedChargingRateUnit");
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargingScheduleAllowedChargingRateUnit].Key, "ChargingScheduleAllowedChargingRateUnit");
-
-	    	 if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemAccessibility == 1)
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargingScheduleAllowedChargingRateUnit].ReadOnly, "0"/*"FALSE"*/);
-	    	 }
-	    	 else
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargingScheduleAllowedChargingRateUnit].ReadOnly, "1"/*"TRUE"*/);
-	    	 }
-
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargingScheduleAllowedChargingRateUnit].Value, (const char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemData);
-	    	 isKnowKey = TRUE;
-	    	 printf("ChargingScheduleAllowedChargingRateUnit\n");
-	     }
-
-	     if(isEmpty ||  strcmp(keyReq, "ChargingScheduleMaxPeriods") == 0 )
-	     {
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ChargingScheduleMaxPeriods].Item, "ChargingScheduleMaxPeriods");
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargingScheduleMaxPeriods].Key, "ChargingScheduleMaxPeriods");
-
-	    	 if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemAccessibility == 1)
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargingScheduleMaxPeriods].ReadOnly, "0"/*"FALSE"*/);
-	    	 }
-	    	 else
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargingScheduleMaxPeriods].ReadOnly, "1"/*"TRUE"*/);
-	    	 }
-
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargingScheduleMaxPeriods].Value, (const char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemData);
-	    	 isKnowKey = TRUE;
-	    	 printf("ChargingScheduleMaxPeriods\n");
-	     }
-
-	     if(isEmpty ||  strcmp(keyReq, "ConnectorSwitch3to1PhaseSupported") == 0 )
-	     {
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ConnectorSwitch3to1PhaseSupported].Item, "ConnectorSwitch3to1PhaseSupported");
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorSwitch3to1PhaseSupported].Key, "ConnectorSwitch3to1PhaseSupported");
-
-	    	 if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemAccessibility == 1)
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorSwitch3to1PhaseSupported].ReadOnly, "0"/*"FALSE"*/);
-	    	 }
-	    	 else
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorSwitch3to1PhaseSupported].ReadOnly, "1"/*"TRUE"*/);
-	    	 }
-
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorSwitch3to1PhaseSupported].Value, (const char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemData);
-	    	 isKnowKey = TRUE;
-	    	 printf("ConnectorSwitch3to1PhaseSupported\n");
-	     }
-
-	     if(isEmpty ||  strcmp(keyReq, "MaxChargingProfilesInstalled") == 0 )
-	     {
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_MaxChargingProfilesInstalled].Item, "MaxChargingProfilesInstalled");
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MaxChargingProfilesInstalled].Key, "MaxChargingProfilesInstalled");
-
-	    	 if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemAccessibility == 1)
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MaxChargingProfilesInstalled].ReadOnly, "0"/*"FLASE"*/);
-	    	 }
-	    	 else
-	    	 {
-	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MaxChargingProfilesInstalled].ReadOnly, "1"/*"TRUE"*/);
-	    	 }
-
-	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MaxChargingProfilesInstalled].Value, (const char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemData);
-	    	 isKnowKey = TRUE;
-	    	 printf("MaxChargingProfilesInstalled\n");
-	     }
-
-	     //=========================================================
-
-	     if(!isEmpty && !isKnowKey)
-	     {
-	    	 printf("unKnowIndex =%d\n", UnknownKeynum);
-	    	 strcpy(unknownkey[UnknownKeynum], keyReq);
-			 UnknownKeynum = UnknownKeynum + 1;
-	     }
-
-
-}
-
-void processUnkownKey(void)
-{
-
-	if(ShmOCPP16Data->GetConfiguration.ResponseUnknownKey != NULL)
-		free(ShmOCPP16Data->GetConfiguration.ResponseUnknownKey);
-
-	ShmOCPP16Data->GetConfiguration.ResponseUnknownKey = (struct StructConfigurationKeyItems *)malloc(sizeof(struct StructConfigurationKeyItems)*UnknownKeynum);
-
-	memset(ShmOCPP16Data->GetConfiguration.ResponseUnknownKey, 0 , sizeof(struct StructConfigurationKeyItems)* UnknownKeynum);
-
-	printf("processUnkownKey UnknownKeynum =%d\n",UnknownKeynum);
-	for(int index=0; index < UnknownKeynum; index++)
-	{
-		printf("ShmOCPP16Data->GetConfiguration.ResponseUnknownKey[%d].Item[0]=%c\n",index,ShmOCPP16Data->GetConfiguration.ResponseUnknownKey[index].Item[0]);
-		if(ShmOCPP16Data->GetConfiguration.ResponseUnknownKey[index].Item[0] == 0)
-		{
-			strcpy((char *)(ShmOCPP16Data->GetConfiguration.ResponseUnknownKey[index].Item), unknownkey[index]);
-		    printf("getkeyValue: %s\n", ShmOCPP16Data->GetConfiguration.ResponseUnknownKey[index].Item);
-		}
-
-	}
-
-}
-
- int  setKeyValue(char *key, char *value)
-{
-	int isSuccess = NotSupported;
-
-	printf("setKeyValue : key : %s\n", key);
-
-    if(strcmp(key, "AllowOfflineTxForUnknownId") == 0)
-    {
-        //Charger.AllowOfflineTxForUnknownId = (value.toLowerCase().equals("true")?true:false);
-    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemAccessibility == 1)
-    	{
-    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemData, "%d", (strcmp(value, "true")==0) ?TRUE:FALSE );
-    		isSuccess = ConfigurationStatus_Accepted;
-    	}
-    	else
-    	{
-    		isSuccess = ConfigurationStatus_Rejected;
-    	}
-     }
-
-    if(strcmp(key, "AuthorizationCacheEnabled") == 0)
-    {
-        //Charger.AuthorizationCacheEnabled = (value.toLowerCase().equals("true")?true:false);
-    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemAccessibility == 1)
-    	{
-    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemData, "%d", (strcmp(value, "true")==0) ?TRUE:FALSE );
-    		isSuccess = ConfigurationStatus_Accepted;
-
-    		//updateSetting("AuthorizationCacheEnabled", (Charger.AuthorizationCacheEnabled?"1":"0"));
-    		updateSetting("AuthorizationCacheEnabled",(char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[1].ItemData);
-    	}
-    	else
-    	{
-    		isSuccess = ConfigurationStatus_Rejected;
-    	}
-
-    }
-
-    if(strcmp(key, "AuthorizeRemoteTxRequests") == 0)
-    {
-    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemAccessibility == 1)
-    	{
-    		//Charger.AuthorizeRemoteTxRequests = (value.toLowerCase().equals("true")?true:false);
-    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemData, "%d", (strcmp(value, "true")==0) ?TRUE:FALSE );
-    		isSuccess = ConfigurationStatus_Accepted;
-    	}
-    	else
-    	{
-    	    isSuccess = ConfigurationStatus_Rejected;
-    	}
-
-    }
-
-    if(strcmp(key, "BlinkRepeat") == 0)
-    {
-    		//Charger.BlinkRepeat = Integer.parseInt(value);
-    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemAccessibility == 1)
-    	{
-    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemData, "%d", atoi(value) );
-    	    isSuccess = ConfigurationStatus_Accepted;
-    	}
-    	else
-    	{
-    	    isSuccess = ConfigurationStatus_Rejected;
-    	}
-    }
-
-    if(strcmp(key, "ClockAlignedDataInterval") == 0)
-    {
-    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemAccessibility == 1)
-    	{
-    		//Charger.ClockAlignedDataInterval = Integer.parseInt(value)*1000;
-    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemData, "%d", atoi(value)*1000 );
-    		isSuccess = ConfigurationStatus_Accepted;
-    	}
-    	else
-    	{
-    	    isSuccess = ConfigurationStatus_Rejected;
-    	}
-
-    }
-
-    if(strcmp(key, "ConnectionTimeOut") == 0 )
-    {
-    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemAccessibility == 1)
-    	{
-    		//Charger.ConnectionTimeOut = Integer.parseInt(value)*1000;
-    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemData, "%d", atoi(value)*1000 );
-    		isSuccess = ConfigurationStatus_Accepted;
-    	}
-    	else
-        {
-        	isSuccess = ConfigurationStatus_Rejected;
-        }
-
-    }
-
-    if(strcmp(key, "HeartbeatInterval") == 0)
-    {
-    	printf("HeartbeatInterval ItemAccessibility: %d\n", ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemAccessibility);
-    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemAccessibility == 1)
-    	{
-    		//Charger.HeartbeatInterval = Integer.parseInt(value)*1000;
-    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemData, "%d", atoi(value)/*atoi(value)*1000*/ );
-    		HeartBeatWaitTime = atoi(value);
-    		printf("set HeartbeatInterval value \n");
-    		isSuccess = ConfigurationStatus_Accepted;
-    	}
-    	else
-    	{
-    	    isSuccess = ConfigurationStatus_Rejected;
-    	}
-
-    }
-
-    if(strcmp(key, "LightIntensity") == 0)
-    {
-    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemAccessibility == 1)
-    	{
-    		//Charger.LightIntensity = Integer.parseInt(value);
-    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemData, "%d", atoi(value) );
-    		isSuccess = ConfigurationStatus_Accepted;
-    	}
-    	else
-    	{
-    		isSuccess = ConfigurationStatus_Rejected;
-    	}
-    }
-
-    if(strcmp(key, "LocalAuthorizeOffline") == 0)
-    {
-    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemAccessibility == 1)
-    	{
-
-    		//Charger.LocalAuthorizeOffline = (value.toLowerCase().equals("true")?true:false);
-    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData, "%d", (strcmp(value, "true")==0) ?TRUE:FALSE );
-    		isSuccess = ConfigurationStatus_Accepted;
-
-    		updateSetting("LocalAuthorizeOffline", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData);
-    	}
-    	else
-    	{
-    	    isSuccess = ConfigurationStatus_Rejected;
-    	}
-
-    }
-
-    if(strcmp(key, "LocalPreAuthorize") == 0)
-    {
-    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemAccessibility == 1)
-    	{
-    		//Charger.LocalPreAuthorize = (value.toLowerCase().equals("true")?true:false);
-    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemData, "%d", (strcmp(value, "true")==0) ?TRUE:FALSE );
-    		isSuccess = ConfigurationStatus_Accepted;
-    	}
-    	else
-        {
-        	isSuccess = ConfigurationStatus_Rejected;
-        }
-
-    }
-
-    if(strcmp(key, "MaxEnergyOnInvalidId") == 0)
-    {
-    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemAccessibility == 1)
-    	{
-
-    		//Charger.MaxEnergyOnInvalidId = Integer.parseInt(value);
-    	    sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemData, "%d", atoi(value) );
-    		isSuccess = ConfigurationStatus_Accepted;
-    	}
-    	else
-    	{
-    	    isSuccess = ConfigurationStatus_Rejected;
-    	}
-
-    }
-
-    if(strcmp(key, "MeterValuesAlignedData") == 0)
-    {
-    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemAccessibility == 1)
-    	{
-    		//Charger.MeterValuesAlignedData = value.toLowerCase();
-    		int valueLength = strlen(value);
-    		for(int i = 0; value[i]; i++){
-    		    value[i] = tolower(value[i]);
-    		}
-    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemData, "%s", value );
-    		isSuccess = ConfigurationStatus_Accepted;
-    	}
-    	else
-    	{
-    	   isSuccess = ConfigurationStatus_Rejected;
-    	}
-
-    }
-
-    if(strcmp(key, "MeterValuesSampledData") == 0 )
-    {
-    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemAccessibility == 1)
-    	{
-    		//Charger.MeterValuesSampledData = value.toLowerCase();
-    		int valueLength = strlen(value);
-    		for(int i = 0; value[i]; i++){
-    		    	value[i] = tolower(value[i]);
-    		}
-    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemData, "%s", value );
-    		isSuccess = ConfigurationStatus_Accepted;
-    	}
-    	else
-    	{
-    	    isSuccess = ConfigurationStatus_Rejected;
-    	}
-
-    }
-
-    if(strcmp(key, "MeterValueSampleInterval") == 0)
-    {
-    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemAccessibility == 1)
-    	{
-    		//Charger.MeterValueSampleInterval = Integer.parseInt(value)*1000;
-    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemData, "%d", atoi(value)*1000 );
-    		isSuccess = ConfigurationStatus_Accepted;
-    	}
-    	else
-    	{
-    	    isSuccess = ConfigurationStatus_Rejected;
-    	}
-
-    }
-
-    if(strcmp(key, "MinimumStatusDuration") == 0)
-    {
-    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemAccessibility == 1)
-    	{
-    		//Charger.MinimumStatusDuration = Integer.parseInt(value);
-    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemData, "%d", atoi(value) );
-    		isSuccess = ConfigurationStatus_Accepted;
-    	}
-    	else
-        {
-        	isSuccess = ConfigurationStatus_Rejected;
-        }
-
-    }
-
-    if(strcmp(key, "ResetRetries") == 0)
-    {
-    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemAccessibility == 1)
-    	{
-    		//Charger.ResetRetries = Integer.parseInt(value);
-    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemData, "%d", atoi(value) );
-    		isSuccess = ConfigurationStatus_Accepted;
-    	}
-    	else
-    	{
-    	    isSuccess = ConfigurationStatus_Rejected;
-    	}
-
-   }
-
-   if(strcmp(key, "ConnectorPhaseRotation") == 0)
-   {
-	   if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemAccessibility == 1)
-	   {
-		   //Charger.ConnectorPhaseRotation = value.toLowerCase();
-		   int valueLength = strlen(value);
-		   for(int i = 0; value[i]; i++){
-		       		    	value[i] = tolower(value[i]);
-		   }
-		   sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", value );
-		   isSuccess = ConfigurationStatus_Accepted;
-	   }
-	   else
-	   {
-	       isSuccess = ConfigurationStatus_Rejected;
-	   }
-
-   }
-
-   if(strcmp(key, "StopTransactionOnEVSideDisconnect") == 0)
-   {
-	   if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemAccessibility == 1)
-	   {
-		   //Charger.StopTransactionOnEVSideDisconnect = (value.toLowerCase().equals("true")?true:false);
-		   sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemData, "%d", (strcmp(value, "true")==0) ?TRUE:FALSE );
-		   isSuccess = ConfigurationStatus_Accepted;
-	   }
-	   else
-	   {
-	       isSuccess = ConfigurationStatus_Rejected;
-	   }
-
-   }
-
-    if(strcmp(key, "StopTransactionOnInvalidId") == 0)
-    {
-    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemAccessibility == 1)
-    	{
-    		//Charger.StopTransactionOnInvalidId = (value.toLowerCase().equals("true")?true:false);
-    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemData, "%d", (strcmp(value, "true")==0) ?TRUE:FALSE );
-    		isSuccess = ConfigurationStatus_Accepted;
-    	}
-        else
-        {
-    		isSuccess = ConfigurationStatus_Rejected;
-        }
-    }
-
-    if(strcmp(key, "StopTxnAlignedData") == 0)
-    {
-    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemAccessibility == 1)
-    	{
-
-    		//Charger.StopTxnAlignedData = value.toLowerCase();
-    		int valueLength = strlen(value);
-    	    for(int i = 0; value[i]; i++){
-    	    	value[i] = tolower(value[i]);
-    	    }
-    	    sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemData, "%s", value );
-    		isSuccess = ConfigurationStatus_Accepted;
-    	}
-    	else
-    	{
-    	    isSuccess = ConfigurationStatus_Rejected;
-    	}
-    }
-
-    if(strcmp(key, "StopTxnSampledData") == 0)
-    {
-    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemAccessibility == 1)
-    	{
-    		//Charger.StopTxnSampledData = value.toLowerCase();
-    		int valueLength = strlen(value);
-    		for(int i = 0; value[i]; i++){
-    		    value[i] = tolower(value[i]);
-    		}
-    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemData, "%s", value );
-    		isSuccess = ConfigurationStatus_Accepted;
-    	}
-    	else
-    	{
-    	    isSuccess = ConfigurationStatus_Rejected;
-    	}
-
-    }
-
-    if(strcmp(key, "TransactionMessageAttempts") == 0)
-    {
-    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemAccessibility == 1)
-    	{
-
-    		//Charger.TransactionMessageAttempts = Integer.parseInt(value);
-    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemData, "%d", atoi(value) );
-    		isSuccess = ConfigurationStatus_Accepted;
-    	}
-    	else
-    	{
-    	    isSuccess = ConfigurationStatus_Rejected;
-    	}
-    }
-
-    if(strcmp(key, "TransactionMessageRetryInterval") == 0)
-    {
-    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemAccessibility == 1)
-    	{
-    		//Charger.TransactionMessageRetryInterval = Integer.parseInt(value)*1000;
-    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemData, "%d", atoi(value)*1000 );
-    		isSuccess = ConfigurationStatus_Accepted;
-    	}
-    	else
-    	{
-    	    isSuccess = ConfigurationStatus_Rejected;
-    	}
-
-    }
-
-    if(strcmp(key, "UnlockConnectorOnEVSideDisconnect") == 0)
-    {
-    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemAccessibility == 1)
-    	{
-    		//Charger.UnlockConnectorOnEVSideDisconnect = (value.toLowerCase().equals("true")?true:false);
-    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemData, "%d", (strcmp(value, "true")==0) ?TRUE:FALSE );
-    		isSuccess = ConfigurationStatus_Accepted;
-    	}
-    	else
-        {
-        	isSuccess = ConfigurationStatus_Rejected;
-        }
-
-    }
-
-    if(strcmp(key, "WebSocketPingInterval") == 0)
-    {
-    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemAccessibility == 1)
-    	{
-
-    		//Charger.WebSocketPingInterval = Integer.parseInt(value)*1000;
-    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemData, "%d", atoi(value)*1000 );
-    		isSuccess = ConfigurationStatus_Accepted;
-    	}
-    	else
-    	{
-    	    isSuccess = ConfigurationStatus_Rejected;
-    	}
-    }
-
-    if(strcmp(key, "LocalAuthListEnabled") == 0)
-    {
-    	if(ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemAccessibility == 1)
-    	{
-    		//Charger.LocalAuthListEnabled = (value.toLowerCase().equals("true")?true:false);
-    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "%d", (strcmp(value, "true")==0) ?TRUE:FALSE );
-    		isSuccess = ConfigurationStatus_Accepted;
-
-    		updateSetting("LocalAuthListEnabled", (char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData);
-    	}
-    	else
-        {
-        	isSuccess = ConfigurationStatus_Rejected;
-        }
-
-    }
-
-    return isSuccess;
-}
-
-int updateSetting(char *key, char *value)
-{
-    int isSuccess = FALSE;
-    json_object *json_obj = NULL;
-    json_object *tmp_obj = NULL;
-
-    //new a base object
-    json_obj = json_object_new_object();
-    tmp_obj = json_object_new_string(value);
-    json_object_object_add(json_obj, key, tmp_obj);
-
-    json_object_to_file("/var/www/settings", json_obj);
-
-
-	isSuccess = TRUE;
-
-	return isSuccess;
-}
-
-json_object * getJSONfromFile(char *filename)
-{
-    FILE *fptr;
-    char str[] = "{}";
-    json_object * obj ;
-
-    fptr = fopen(filename, "rw+");
-    if(fptr == NULL) //if file does not exist, create it
-    {
-
-    	fptr = fopen(filename, "w");
-    	fwrite(str , 1 , sizeof(str) , fptr );
-    }
-    fclose(fptr);
-
-    //obj = new JSONObject(new JSONTokener((new URI("file:///" + filename)).toURL().openStream()));
-    obj = json_object_from_file(filename);
-
-    return obj;
-}
-
-
-#define SA struct sockaddr
-#define MAXBUF 1024
-static char m_send_buffer[1024];
-static char m_recv_buffer[1024];
-
-static int  m_socket_data;
-static int  sockfd;
-
-
-int ReadHttpStatus(int sock){
-    char c;
-    char buff[1024]="",*ptr=buff+1;
-    int bytes_received, status;
-    printf("Begin Response ..\n");
-    while(bytes_received = recv(sock, ptr, 1, 0)){
-        if(bytes_received==-1){
-            perror("ReadHttpStatus");
-            exit(1);
-        }
-
-        if((ptr[-1]=='\r')  && (*ptr=='\n' )) break;
-        ptr++;
-    }
-    *ptr=0;
-    ptr=buff+1;
-
-    sscanf(ptr,"%*s %d ", &status);
-
-    printf("%s\n",ptr);
-    printf("status=%d\n",status);
-    printf("End Response ..\n");
-    return (bytes_received>0)?status:0;
-
-}
-
-//the only filed that it parsed is 'Content-Length'
-int ParseHeader(int sock){
-    char c;
-    char buff[1024]="",*ptr=buff+4;
-    int bytes_received, status;
-    printf("Begin HEADER ..\n");
-    while(bytes_received = recv(sock, ptr, 1, 0)){
-        if(bytes_received==-1){
-            perror("Parse Header");
-            exit(1);
-        }
-
-        if(
-            (ptr[-3]=='\r')  && (ptr[-2]=='\n' ) &&
-            (ptr[-1]=='\r')  && (*ptr=='\n' )
-        ) break;
-        ptr++;
-    }
-
-    *ptr=0;
-    ptr=buff+4;
-    //printf("%s",ptr);
-
-    if(bytes_received){
-        ptr=strstr(ptr,"Content-Length:");
-        if(ptr){
-            sscanf(ptr,"%*s %d",&bytes_received);
-
-        }else
-            bytes_received=-1; //unknown size
-
-       printf("Content-Length: %d\n",bytes_received);
-    }
-    printf("End HEADER ..\n");
-    return  bytes_received ;
-
-}
-
-int httpDownLoadFile(char *location, char *path, char *filename,char *url)
-{
-	//char domain[] = "sstatic.net", path[]="stackexchange/img/logos/so/so-logo-med.png";
-
-	int sock, bytes_received;
-	char send_data[1024],recv_data[1024], *p;
-	struct sockaddr_in server_addr;
-	struct hostent *he;
-	char ftpbuf[200];
-	int systemresult;
-	char temp[100];
-
-
-	memset(ftpbuf, 0, sizeof(ftpbuf));
-	sprintf(ftpbuf, "wget --tries=3 -o %s -cb %s ",filename, url);
-			//sprintf(ftpbuf, "ftpput -u %s -p %s %s -P %d %s%s %s",user,password,IPbuffer,21,filename,filename,path);
-	systemresult = system(ftpbuf);
-
-	printf("systemresult=%d\n",systemresult);
-	if(systemresult != 0)
-	{
-		printf("ftpget error!\n");
-		return FALSE;
-	}
-
-	return TRUE;
-}
-
-int ftpDownLoadFile(char *location, char *user, char *password, int port, char *path, char *filename)
-{
-	 //int sockfd;
-	static int ret= 0;
-	int reclen=0, off;
-	int n, fileSize;
-	char fname[40];
-	char fileSizeBuffer[256];
-	int len;
-	int k, size, status;
-	struct sockaddr_in servaddr,cliaddr;
-	struct sockaddr_in servaddr_data;
-	struct hostent* server;
-	char bufferTemp[500000];
-	char *IPbuffer;
-	char ftpbuf[200];
-	int systemresult;
-	char temp[100];
-
-	server = gethostbyname(location);
-	// To convert an Internet network
-	// address into ASCII string
-	IPbuffer = inet_ntoa(*((struct in_addr*)
-				 	 server->h_addr_list[0]));
-
-	memset(ftpbuf, 0, sizeof(ftpbuf));
-	sprintf(ftpbuf, "ftpget -u %s -p %s %s -P %d %s %s%s",user,password,IPbuffer,port/*21*/,filename,path,filename);
-		//sprintf(ftpbuf, "ftpput -u %s -p %s %s -P %d %s%s %s",user,password,IPbuffer,21,filename,filename,path);
-	systemresult = system(ftpbuf);
-
-	printf("systemresult=%d\n",systemresult);
-	if(systemresult != 0)
-	{
-		printf("ftpget error!\n");
-		return FALSE;
-	}
-
-	return TRUE;
-
-}
-
-int ftpFile(char *location, char *user, char *password, int port, char *path, char *filename)
-{
-	 //int sockfd;
-	 static int ret= 0;
-	 int reclen=0, off;
-	 int n, fileSize;
-	 char fname[40];
-	 char fileSizeBuffer[256];
-	 int len;
-	 int k, size, status;
-	 struct sockaddr_in servaddr,cliaddr;
-	 struct sockaddr_in servaddr_data;
-	 struct hostent* server;
-	 char *IPbuffer;
-	 char ftpbuf[200];
-	 int systemresult;
-
-	 printf("ftpFile -1\n");
-	  // To retrieve host information
-	 server = gethostbyname(location);
-	 // To convert an Internet network
-	 // address into ASCII string
-	 IPbuffer = inet_ntoa(*((struct in_addr*)
-			 	 server->h_addr_list[0]));
-
-	memset(ftpbuf, 0, sizeof(ftpbuf));
-
-	/* format : ftpput -u  username -p passwd IP  target  source*/
-	sprintf(ftpbuf, "ftpput -u %s -p %s %s -P %d %s%s %s",user,password,IPbuffer,port/*21*/,path,filename,filename);
-	//sprintf(ftpbuf, "ftpput -u %s -p %s %s -P %d %s%s %s",user,password,IPbuffer,21,filename,filename,path);
-	systemresult = system(ftpbuf);
-
-	printf("systemresult=%d\n",systemresult);
-	if(systemresult != 0)
-	{
-		printf("ftpput error!\n");
-		return FALSE;
-	}
-
-	return TRUE;
-
-}
-
-
-int SettingChargingRecord(int target, int transactionId)
-{
-	 for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-	 {
-		 if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == target)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == '4'))
-		 {
-			 addBuff(target, transactionId, 0);
-			 return TRUE;
-		 }
-	 }
-
-	 for (int index = 0; index < CCS_QUANTITY; index++)
-	 {
-		 if ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == target)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == '4'))
-		 {
-			 addBuff(target, transactionId, 0);
-			 return TRUE;
-		 }
-	 }
-
-	 for (int index = 0; index < GB_QUANTITY; index++)
-	 {
-		 if ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == target)&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == '4'))
-		 {
-			 addBuff(target, transactionId, 0);
-			 return TRUE;
-		 }
-	 }
- return FALSE;
-}
-
-
-int addBuff(int gun_idx, int user_id, int cmd_sn)
-{
-	int isSuccess = FALSE;
-	char *query = NULL;
-    sqlite3_stmt *stmt;
-    int rc;             // return code
-    char str[20];
-
-    sprintf(str,"%d",user_id);
-    sqlite3_prepare_v2(db, "insert into log_buffer (user_id, cmd_sn, charger_id, gun_type, gun_no, rfid_no, stime, etime, time_len, s_soc, e_soc, stop_reason, power, meter_before, meter_after, charge_price, reserve, surplus_before, surplus_after, service_price, is_pay ,charge_strategy, charge_parameter, vin, vehicle_no, start_method, card_type, is_upload, guid, is_buf2OK) values (?1,?2,?3,?4,?5,?6,?7,?8,?9,?10,?11,?12,?13,?14,?15,?16,?17,?18,?19,?20,?21,?22,?23,?24,?25,?26,?27,?28,?29,?30);", -1, &stmt, NULL);       /* 1 */
-
-    sqlite3_bind_text(stmt, 1, str, -1, SQLITE_STATIC);      /* 2 */
-
-
-    rc = sqlite3_step(stmt);			   /* 3 */
-    if (rc != SQLITE_DONE) {
-    	printf("ERROR inserting data: %s\n", sqlite3_errmsg(db));
-    	goto out;
-    }
-
-    sqlite3_finalize(stmt);
-    free(query);
-
-out:
-    /*
-     * close SQLite database
-     */
-    sqlite3_close(db);
-    printf("database closed.\n");
-
-    return isSuccess;
-}
-
-/**
- * Place the contents of the specified file into a memory buffer
- *
- * @param[in] filename The path and name of the file to read
- * @param[out] filebuffer A pointer to the contents in memory
- * @return status 0 success, 1 on failure
- */
-int get_file_contents(const char* filename, char** outbuffer) {
-	FILE* file = NULL;
-	long filesize;
-	const int blocksize = 1;
-	size_t readsize;
-	char* filebuffer;
-
-	// Open the file
-	file = fopen(filename, "r");
-	if (NULL == file)
-	{
-		printf("'%s' not opened\n", filename);
-		exit(EXIT_FAILURE);
-	}
-
-	// Determine the file size
-	fseek(file, 0, SEEK_END);
-	filesize = ftell(file);
-	rewind (file);
-
-	// Allocate memory for the file contents
-	filebuffer = (char*) malloc(sizeof(char) * filesize);
-	*outbuffer = filebuffer;
-	if (filebuffer == NULL)
-	{
-		fputs ("malloc out-of-memory", stderr);
-		exit(EXIT_FAILURE);
-	}
-
-	// Read in the file
-	readsize = fread(filebuffer, blocksize, filesize, file);
-	if (readsize != filesize)
-	{
-		fputs ("didn't read file completely",stderr);
-		exit(EXIT_FAILURE);
-	}
-
-	// Clean exit
-	fclose(file);
-	return EXIT_SUCCESS;
-}
-
-//Command Port, Receive Answer
-static int ftp_recv_respond(int m_socket_cmd, char *resp, int len)
-{
-	int ret;
-	int off;
-	len -= 1;
-	for(off=0; off<len; off+=ret)
-	{
-		ret = recv(m_socket_cmd, &resp[off], 1 ,0);
-	//	ret = socket_recv(m_socket_cmd, &resp[off], 1);
-		if(ret < 0)
-		{
-			printf("recv respond error(ret=%d)!\r\n", ret);
-			return 0;
-		}
-		if(resp[off] == '\n')
-		{
-			break;
-		}
-	}
-	resp[off+1] = 0;
-	printf("respond:%s", resp);
-	return atoi(resp);
-}
-
-static int selectSqlCount = 0;
-void getMemory(char** s, int num)
-{
-    *s = (char*)malloc(sizeof(char) * num);
-    printf("s = %p\n", s);
-    printf("*s = %p\n", *s);
-}
-static int callback(void *data, int argc, char **argv, char **azColName){
-   int i;
-   printf("%s: ", (const char*)data);
-   selectSqlCount = argc;
-   for(i = 0; i<argc; i++){
-      printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
-   }
-
-   printf("\n");
-   return 0;
-}
-
-static int versioncallback(void *data, int argc, char **argv, char **azColName){
-   int i;
-   //printf("%s:\n", (const char*)data);
-   localversion = argv[5] ? atoi(argv[5]) : 0;
-   printf("localversion=%d\n", localversion);
-   return 0;
-}
-
-static int IdTagcallback(void *data, int argc, char **argv, char **azColName){
-   int i;
-   //printf("%s:\n", (const char*)data);
-   sprintf(idTagAuthorization,"%s", argv[1] ? argv[1] : "NULL");
-   printf("IdTag=%s\n", idTagAuthorization);
-   return 0;
-}
-
-static int deleteIdTagcallback(void *data, int argc, char **argv, char **azColName){
-   int i;
-   //printf("%s:\n", (const char*)data);
-#if 1
-   for(i=0; i<argc; i++){
-      printf("%s = %s", azColName[i], argv[i] ? argv[i] : "NULL");
-   }
-   printf("");
-#endif
-//   localversion = argv[5] ? atoi(argv[5]) : 0;
-//   printf("localversion=%d\n", localversion);
-   return 0;
-}
-
-void OCPP_getListVerion()
-{
-    int ver = 0;
-    int isSuccess = FALSE;
-    int rc = 0;
-   // const char* data = "Callback function called";
-    char sql[100];
-    char zErrMsg[100];
-
-    memset(sql, 0, 100);
-    memset(zErrMsg, 0, 100);
-    strcpy(sql, "select * from ocpp_auth_local order by idx desc");
-
-    /* Execute SQL statement */
-    printf("OCPP_getListVerion -1\n");
-    rc = sqlite3_exec(db, sql, versioncallback, 0, &zErrMsg);
-    printf("OCPP_getListVerion -2\n");
-    printf("rc=%d\n",rc);
-    if( rc != SQLITE_OK ){
-    	printf("SQL error: %s", zErrMsg);
-          //sqlite3_free(zErrMsg);
-    }else{
-    	printf("Operation done successfully");
-    }
-    printf("OCPP_getListVerion -3\n");
-
-   //return ver;
-}
-
-void OCPP_getIdTag(char *idTag)
-{
-    int ver = 0;
-    int isSuccess = FALSE;
-    int rc = 0;
-   // const char* data = "Callback function called";
-    char sql[100];
-    char zErrMsg[100];
-
-    memset(sql, 0, 100);
-    memset(zErrMsg, 0, 100);
-
-    sprintf(sql,"select * from ocpp_auth_local where idtag='%s'", idTag);
-
-    /* Execute SQL statement */
-    printf("OCPP_getIdTag -1\n");
-    rc = sqlite3_exec(db, sql, versioncallback, 0, &zErrMsg);
-    printf("OCPP_getIdTag -2\n");
-    printf("rc=%d\n",rc);
-    if( rc != SQLITE_OK ){
-    	printf("SQL error: %s", zErrMsg);
-          //sqlite3_free(zErrMsg);
-    }else{
-    	printf("Operation done successfully");
-    }
-    printf("OCPP_getIdTag -3\n");
-
-   //return ver;
-}
-
-int OCPP_cleanLocalList()
-{
-  char * sqlcleanLocalList = "delete from ocpp_auth_local";
-  char *errMsg = 0;
-  int rc =sqlite3_exec(db, sqlcleanLocalList, 0, 0, &errMsg);
-  if (SQLITE_OK != rc)
-  {
-	  printf("%s\n",errMsg);
-	  return FALSE;
-  }
-  else
-  {
-	  printf("delete ocpp_auth_local table successfully\n");
-  }
-
-  return TRUE;
-
-}
-
-int OCPP_addLocalList_1(int version, char *idTag, char *parentTage, char *expiryDate, char *status)
-{
-	 int isSuccess = FALSE;
-	 int ret = 0;
-	 const char* data = "Callback function called";
-	 char sql[200];
-	 char zErrMsg[100];
-	   // char* sql = NULL;
-	   // char* zErrMsg = NULL;
-
-	  //  sql = (char*)malloc(sizeof(char)*200); // getMemory(&sql, 200);
-	  //  zErrMsg = (char*)malloc(sizeof(char)*100);      // getMemory(&zErrMsg, 100);
-	 memset(sql, 0, 200);
-	 memset(zErrMsg, 0, 100);
-
-	 sprintf(sql,"insert or replace into ocpp_auth_local (idtag, parent_idtag, expir_date, status, version) " "VALUES ('%s', '%s', '%s', '%s', %d ); ""SELECT * from ocpp_auth_local", idTag, parentTage, expiryDate, status, version);
-
-	 printf("sql:%s\n", sql);
-	 printf("OCPP_addLocalList -5\n");
-	 /* Execute SQL statement */
-	 //zErrMsg  = 0;
-	 ret = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
-	 printf("OCPP_addLocalList -6\n");
-	 if( ret != SQLITE_OK ){
-	    printf("SQL error: %s\n", zErrMsg);
-	     	//  free(zErrMsg);
-	     	//  free(sql);
-	   return isSuccess;
-	 }
-
-	 printf("successfully Insert records created\n");
-	 isSuccess = TRUE;
-	 return isSuccess;
-}
-
-void OCPP_deleteIdTag(char *idTag)
-{
-	int ver = 0;
-	int isSuccess = FALSE;
-	int rc = 0;
-	char sql[100];
-	char zErrMsg[100];
-
-	memset(sql, 0, 100);
-	memset(zErrMsg, 0, 100);
-	sprintf(sql,"DELETE from ocpp_auth_local where idtag='%s'; SELECT * from ocpp_auth_local;", idTag);
-
-	/* Execute SQL statement */
-	printf("OCPP_getIdTag -1\n");
-	rc = sqlite3_exec(db, sql, deleteIdTagcallback, 0, &zErrMsg);
-	printf("OCPP_getIdTag -2\n");
-	printf("rc=%d\n",rc);
-	if( rc != SQLITE_OK ){
-		printf("SQL error: %s", zErrMsg);
-	          //sqlite3_free(zErrMsg);
-	}else{
-		printf("Operation done successfully");
-	}
-	printf("OCPP_getIdTag -3\n");
-}
-
- int OCPP_addLocalList(int version, char *idTag, char *parentTage, char *expiryDate, char *status)
- {
-    int isSuccess = FALSE;
-    int ret = 0;
-    const char* data = "Callback function called";
-    char sql[200];
-    char zErrMsg[100];
-
-    memset(sql, 0, 200);
-    memset(zErrMsg, 0, 100);
-    /* selectFromTable */
-   // sql = select * from ocpp_auth_local where starring='Jodie Foster';
-    printf("OCPP_addLocalList -1\n");
-    sprintf(sql,"select * from ocpp_auth_local where idtag='%s'", idTag);
-
-    printf("OCPP_addLocalList -2\n");
-    /* Execute SQL statement */
-    selectSqlCount = 0;
-    ret = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
-    printf("OCPP_addLocalList -3\n");
-    if( ret != SQLITE_OK ){
-           printf("Error SQL: %s\n", zErrMsg);
-    }
-
-    printf("successfully select operation done\n");
-
-    memset(sql, 0, 200);
-    memset(zErrMsg, 0, 100);
-
-    if(selectSqlCount  == 0)
-    {
-    	printf("OCPP_addLocalList -4\n");
-    	//Insert
-    	//sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "      "VALUES (1, ?�Paul?? 32, ?�California?? 20000.00 ); ";
-    	sprintf(sql,"INSERT INTO ocpp_auth_local (idtag, parent_idtag, expir_date, status, version) " "VALUES ('%s', '%s', '%s', '%s', %d ); ", idTag, parentTage, expiryDate, status, version);
-
-    	printf("sql:%s\n", sql);
-    	printf("OCPP_addLocalList -5\n");
-    	/* Execute SQL statement */
-    	//zErrMsg  = 0;
-    	ret = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
-    	printf("OCPP_addLocalList -6\n");
-    	if( ret != SQLITE_OK ){
-    	  printf("SQL error: %s\n", zErrMsg);
-    	  return isSuccess;
-    	}
-
-    	printf("successfully Insert records created\n");
-    	isSuccess = TRUE;
-
-    }
-    else
-    {
-    	printf("OCPP_addLocalList -7\n");
-    	//Update
-    	/* Create merged SQL statement */
-    	sprintf(sql, "UPDATE ocpp_auth_local set parent_idtag = '%s', expir_date = '%s',  status ='%s', version =%d where idtag='%s'; "     "SELECT * from ocpp_auth_local", parentTage, expiryDate, status, version, idTag);
-
-    	printf("OCPP_addLocalList -8\n");
-    	/* Execute SQL statement */
-    	ret = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
-    	printf("OCPP_addLocalList -9\n");
-    	if( ret != SQLITE_OK ){
-    		printf("SQL error: %s\n", zErrMsg);
-    		//sqlite3_free(zErrMsg);
-    		//sqlite3_free(sql);
-    	   return isSuccess;
-    	}
-
-    	printf("Successfully operation done \n");
-    	isSuccess = TRUE;
-    }
-
-    return isSuccess;
-
- }
-
-char *GetOcppServerURL()
-{
-
-	memset(OcppProtocol, 0, sizeof(OcppProtocol));
-	memset(OcppHost, 0, sizeof(OcppHost));
-	memset(OcppTempPath, 0, sizeof(OcppTempPath));
-	sscanf(ShmOCPP16Data->OcppServerURL,
-				"%[^:]:%*2[/]%[^:]:%i/%[a-zA-Z0-9._/-]",
-				OcppProtocol, OcppHost, &OcppPort, OcppTempPath);
-	printf("OcppProtocol =%s\n",OcppProtocol);
-	printf("OcppHost =%s\n",OcppHost);
-	printf("OcppPort =%d\n",OcppPort);
-	printf("OcppTempPath =%s\n",OcppTempPath);
-
-	return OcppHost;
-}
-
-char *GetOcppPath()
-{
-
-	if(OcppTempPath == NULL)
-	{
-		sprintf(OcppPath,"/%s",OcppTempPath,ShmOCPP16Data->ChargeBoxId);
-	}
-	else
-	{
-		sprintf(OcppPath,"/%s%s",OcppTempPath,ShmOCPP16Data->ChargeBoxId);
-	}
-
-	printf("OcppPath=%s\n",OcppPath);
-	return OcppPath;
-}
-
-int GetOcppPort()
-{
-	return OcppPort;
-}
-
-void Send(struct json_object *message)
-{
-	printf("Send -1 \n");
-	printf("message=%s\n",json_object_to_json_string(message));
-	LWS_Send(json_object_to_json_string(message));
-}
-
-void LWS_Send(char * str)
-{
-	pthread_mutex_lock(&lock);
-	printf("LWS_Send -1-1 \n");
-	printf("message=%s\n",str);
-	memset(SendBuffer,0,SendBufLen);
-	sprintf((char *)SendBuffer, "%s", str);
-	printf("LWS_Send -2 \n");
-	pthread_mutex_unlock(&lock);
-	lws_callback_on_writable(wsi_client);
-	lws_service(context, 10000);//timeout_ms
-	//usleep(10000); // 等�??��?微�?
-	printf("Send message\n");
-
-}
-
-
-
+#define _XOPEN_SOURCE 700
+#include 	<sys/types.h>
+#include 	<sys/ipc.h>
+#include 	<sys/shm.h>
+#include    <sys/stat.h>
+#include 	<sys/time.h>   // gettimeofday sleep usleep
+#include    <fcntl.h>
+#include	<stddef.h>
+#include 	<stdio.h>
+#include	<string.h>
+#ifdef _WIN32
+#include 	<Windows.h>
+#else
+#include 	<unistd.h>
+#endif
+
+#include 	<stdarg.h>
+#include 	<ctype.h>
+
+#include 	"libwebsockets.h"
+#include 	<lws_config.h>
+//#include    "./json-c/JsonParser.h"
+#include	"hashmap.h"
+#include	"ShareMemory.h"
+#include	"TransactionQueue.h"
+#include    "SystemLogMessage.h"
+#include	"../../Projects/define.h"
+#include 	"ShareMemory.h"
+#include	"SystemLogMessage.h"
+//#include 	"config.h"
+#include 	<sys/socket.h>
+#include 	<netinet/in.h>
+#include 	<stdlib.h>
+/*for sendfile()*/
+#include	<sys/sendfile.h>
+ /*for O_RDONLY*/
+#include	<fcntl.h>
+#include	"sqlite3.h"
+#include 	<arpa/inet.h>
+//#define _GNU_SOURCE
+#include 	<time.h>
+#include  	"MessageHandler.h"
+#include    <assert.h>
+#include 	<pthread.h>
+#include 	<mcheck.h>
+
+
+
+
+#define PASS				1
+#define FAIL				-1
+
+#define FALSE 0
+#define TRUE 1       		// Option 1
+
+//ChargePointMaxProfile
+#define ChargePointMaxProfile_JSON     "../Storage/OCPP/ChargePointMaxProfile.json"
+
+//TxDefaultProfile
+#define TxDefaultProfile_0_JSON			"../Storage/OCPP/TxDefaultProfile_0.json"
+#define TxDefaultProfile_1_JSON			"../Storage/OCPP/TxDefaultProfile_1.json"
+#define TxDefaultProfile_2_JSON			"../Storage/OCPP/TxDefaultProfile_2.json"
+
+//TxProfile
+#define TxProfile_1_JSON			"../Storage/OCPP/TxProfile_1.json"
+#define TxProfile_2_JSON			"../Storage/OCPP/TxProfile_2.json"
+
+#define ChargingProfile_0_JSON			"../Storage/OCPP/chargingprofile_0.json"
+#define ChargingProfile_1_JSON			"../Storage/OCPP/chargingprofile_1.json"
+#define ChargingProfile_2_JSON			"../Storage/OCPP/chargingprofile_2.json"
+#define AuthorizationCache_JSON			"../Storage/OCPP/AuthorizationCache.json"
+#define LocalAuthorizationList_JSON		"../Storage/OCPP/LocalAuthorizationList.json"
+
+
+struct SysConfigAndInfo			*ShmSysConfigAndInfo;
+struct StatusCodeData 			*ShmStatusCodeData;
+struct PsuData 					*ShmPsuData ;
+struct OCPP16Data 				*ShmOCPP16Data;
+
+
+/* 		define Macro				 */
+#define SystemLogMessage
+
+/* 		OCPP Message Type			*/
+#define MESSAGE_TYPE_CALL			2
+#define MESSAGE_TYPE_CALLRESULT		3
+#define MESSAGE_TYPE_CALLERROR		4
+
+/*     */
+#define server_cycle_Status		120
+#define MACROSTR(k) #k
+
+//ConfigurationMaxKeys
+#define GetConfigurationMaxKeysNUM 43
+
+
+//char guid[37];
+pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
+char queuedata[2000]={0};
+//===============================
+// Configuration: unknownkey
+//===============================
+static char unknownkey[10][20]={0};
+static int UnknownKeynum = 0;
+
+//===============================
+// Gun Total  Numbers
+//===============================
+//#define  gunTotalNumber (strstr(ShmSysConfigAndInfo->SysConfig.ModelName ,"DC") != NULL) ? (CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY): AC_QUANTITY
+static int gunTotalNumber=0;
+
+static int localversion=0;
+static char idTagAuthorization[32]={0};
+char OcppPath[160]={};
+char OcppProtocol[10]={0},OcppHost[50]={0}, OcppTempPath[50]={0};
+int OcppPort=0;
+int server_sign = FALSE;
+int server_pending = FALSE;
+int authenrequest = FALSE;
+int PRE_SYS_MODE[CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY];
+int BootNotificationInterval = 0;
+static int SystemInitial = CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY;	// System Boot UP
+int authorizeRetryTimes = 0;  //number of  Retry times
+int isUpdateRequest = FALSE;
+int statusModeChage[CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY] = {FALSE};
+static int HeartBeatWaitTime = 10;
+static int GunStatusInterval = 10;
+static int FirstHeartBeat = 0;
+static int FirmwareStatusNotificationStatus = 3;  // Idle
+static int DiagnosticsStatusNotificationStatus = 0; // Idle
+static struct OCPPAuthLocalElemet
+{
+	int listVersionInt;
+	char idTagstr[20];
+	char parentIdTag[20];
+	char expiryDate[30];
+	char idTagstatus[16];
+}idTagQuery;
+
+
+
+extern struct lws 					*wsi_client;
+extern struct lws_context 			*context;
+#if 0
+extern unsigned char *SendBuffer;
+#endif
+extern unsigned char SendBuffer[4096];
+extern int SendBufLen;
+//extern map_t hashMap;
+//extern data_struct_t* mapItem;  --- remove for temporally
+//extern data_struct_t mapItem[0];
+
+extern char *random_uuid( char buf[37] );
+extern void split(char **arr, char *str, const char *del);
+extern pthread_mutex_t mutex1;
+extern struct Charger_Info Charger;
+extern sqlite3 *db;
+
+
+int updateSetting(char *key, char *value);
+int setKeyValue(char *key, char *value);
+void OCPP_get_TableAuthlocalAllData(void);
+void processUnkownKey(void);
+
+//static char *querysql = "SELECT * FROM ocpp_auth_local;";
+
+
+struct ClientTime
+{
+	unsigned int Heartbeat;
+	unsigned int StatusNotification[CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY];
+	unsigned int StartTransaction;
+	unsigned int StopTransaction;
+	unsigned int MeterValues[CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY];
+
+}clientTime;
+
+typedef union
+{
+	//Operations Initiated by Central System
+	unsigned char CsMsgValue[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
+	struct
+	{
+	//CsMsgValue[0]
+	unsigned char StatusNotificationReq :1;	//bit 0,
+	unsigned char StatusNotificationConf :1;	//bit 0,
+	unsigned char :6;	//bit 2~7
+	}bits[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
+}CpinitiateMsg;
+
+CpinitiateMsg cpinitateMsg;
+
+//==========================================
+// Init all Enumeration & Mapping String
+//==========================================
+/*ChargePointErrorCode*/
+typedef enum {
+	ConnectorLockFailure,
+	EVCommunicationError,
+	GroundFailure,
+	HighTemperature,
+	InternalError,
+	LocalListConflict,
+	NoError,
+	OtherError,
+	OverCurrentFailure,
+	OverVoltage,
+	PowerMeterFailure,
+	PowerSwitchFailure,
+	ReaderFailure,
+	ResetFailure,
+	UnderVoltage,
+	WeakSignal
+} ChargePointErrorCode;
+
+#if 0
+static char *ChargePointErrorCodeStr[] = {
+    MACROSTR(ConnectorLockFailure),
+    MACROSTR(EVCommunicationError),
+	MACROSTR(GroundFailure),
+	MACROSTR(HighTemperature),
+	MACROSTR(InternalError),
+	MACROSTR(LocalListConflict),
+	MACROSTR(NoError),
+	MACROSTR(OtherError),
+	MACROSTR(OverCurrentFailure),
+	MACROSTR(OverVoltage),
+	MACROSTR(PowerMeterFailure),
+	MACROSTR(PowerSwitchFailure),
+	MACROSTR(ReaderFailure),
+	MACROSTR(ResetFailure),
+	MACROSTR(UnderVoltage),
+	MACROSTR(WeakSignal)
+};
+#endif
+
+/*ChargePointStatus*/
+typedef enum {
+	Available =0,
+	Preparing,
+	Charging,
+	SuspendedEVSE,
+	SuspendedEV,
+	Finishing,
+	Reserved,
+	Unavailable,
+	Faulted
+}  ChargePointStatus;
+
+static char * ChargePointStatusStr[] = {
+    MACROSTR(Available),
+    MACROSTR(Preparing),
+	MACROSTR(Charging),
+	MACROSTR(SuspendedEVSE),
+	MACROSTR(SuspendedEV),
+	MACROSTR(Finishing),
+	MACROSTR(Reserved),
+	MACROSTR(Unavailable),
+	MACROSTR(Faulted)
+};
+
+/*AvailabilityType*/
+typedef enum {
+	RegistrationStatus_Accepted,
+	RegistrationStatus_Pending,
+	RegistrationStatus_Rejected
+} RegistrationStatus;
+
+static char *RegistrationStatusStr[] = {
+    MACROSTR(Accepted),
+    MACROSTR(Pending),
+	MACROSTR(Rejected)
+};
+
+/*AvailabilityType*/
+typedef enum {
+	Inoperative,
+	Operative
+} AvailabilityType;
+
+static char *AvailabilityTypeStr[] = {
+    MACROSTR(Inoperative),
+    MACROSTR(Operative)
+};
+
+/*AvailabilityStatus*/
+typedef enum {
+	Accepted,
+	Rejected,
+	Scheduled
+}  AvailabilityStatus;
+
+static char *AvailabilityStatusStr[] = {
+    MACROSTR(Accepted),
+    MACROSTR(Rejected),
+	MACROSTR(Scheduled)
+};
+
+/*ConfigurationStatus*/
+typedef enum {
+	ConfigurationStatus_Accepted,
+	ConfigurationStatus_Rejected,
+	RebootRequired,
+	NotSupported
+}  ConfigurationStatus;
+
+static char *ConfigurationStatusStr[] = {
+    MACROSTR(Accepted),
+    MACROSTR(Rejected),
+	MACROSTR(RebootRequired),
+	MACROSTR(NotSupported)
+};
+
+/*ClearCacheStatus*/
+typedef enum {
+	ClearCacheStatus_Accepted,
+	ClearCacheStatus_Rejected
+}  ClearCacheStatus;
+
+static char *ClearCacheStatusStr[] = {
+    MACROSTR(Accepted),
+    MACROSTR(Rejected)
+};
+
+/*ChargingProfilePurposeType*/
+typedef enum {
+	ChargePointMaxProfile,
+	TxDefaultProfile,
+	TxProfile
+}  ChargingProfilePurposeType;
+
+static char *ChargingProfilePurposeTypeStr[] = {
+    MACROSTR(ChargePointMaxProfile),
+    MACROSTR(TxDefaultProfile),
+	MACROSTR(TxProfile)
+};
+
+/*ChargingProfileStatus*/
+typedef enum {
+	ChargingProfileStatus_Accepted,
+	ChargingProfileStatus_Rejected,
+	ChargingProfileStatus_NotSupported
+}  ChargingProfileStatus;
+
+static char *ChargingProfileStatusStr[] = {
+    MACROSTR(Accepted),
+    MACROSTR(Rejected),
+	MACROSTR(NotSupported)
+};
+
+/*ClearChargingProfileStatus*/
+typedef enum {
+	ClearChargingProfileStatus_Accepted,
+	ClearChargingProfileStatus_Unknown
+}  ClearChargingProfileStatus;
+
+static char *ClearChargingProfileStatusStr[] = {
+    MACROSTR(Accepted),
+    MACROSTR(Unknown)
+};
+
+/*GetCompositeScheduleStatus*/
+typedef enum {
+	GetCompositeScheduleStatus_Accepted,
+	GetCompositeScheduleStatus_Rejected
+}  GetCompositeScheduleStatus;
+
+
+static char *GetCompositeScheduleStatusStr[] = {
+    MACROSTR(Accepted),
+    MACROSTR(Rejected)
+};
+
+/*ChargingRateUnitType*/
+typedef enum {
+	ChargingRateUnitType_W,
+	ChargingRateUnitType_A
+}  ChargingRateUnitType;
+
+/*AuthorizationStatus*/
+typedef enum {
+	AuthorizationStatus_Accepted ,
+	AuthorizationStatus_Blocked ,
+	AuthorizationStatus_Expired ,
+	AuthorizationStatus_Invalid ,
+	AuthorizationStatus_ConcurrentTx
+}  AuthorizationStatus;
+
+/*UpdateType*/
+typedef enum {
+	Differential  ,
+	Full
+}  UpdateType;
+
+static char *UpdateTypeStr[] = {
+    MACROSTR(Differential),
+    MACROSTR(Full)
+};
+
+/*UpdateStatus*/
+typedef enum {
+	UpdateStatus_Accepted   ,
+	UpdateStatus_Failed ,
+	UpdateStatus_NotSupported ,
+	UpdateStatus_VersionMismatch
+}  UpdateStatus;
+
+static char *UpdateStatusStr[] = {
+    MACROSTR(Accepted),
+    MACROSTR(Failed),
+	MACROSTR(NotSupported),
+	MACROSTR(VersionMismatch)
+};
+
+/*RemoteStartStopStatus*/
+typedef enum {
+	RemoteStartStopStatus_Accepted,
+	RemoteStartStopStatus_Rejected
+
+}  RemoteStartStopStatus;
+
+
+static char *RemoteStartStopStatusStr[] = {
+    MACROSTR(Accepted),
+    MACROSTR(Rejected)
+
+};
+
+/*ReservationStatus*/
+typedef enum {
+	ReservationStatus_Accepted,
+	ReservationStatus_Faulted,
+	ReservationStatus_Occupied,
+	ReservationStatus_Rejected,
+	ReservationStatus_Unavailable
+
+}  ReservationStatus;
+
+static char *ReservationStatusStr[] = {
+    MACROSTR(Accepted),
+    MACROSTR(Faulted),
+	MACROSTR(Occupied),
+	MACROSTR(Rejected),
+	MACROSTR(Unavailable)
+};
+
+/*ResetType*/
+typedef enum {
+	Hard,
+	Soft
+}  ResetType;
+
+
+static char *ResetTypeStr[] = {
+    MACROSTR(Hard),
+    MACROSTR(Soft)
+};
+
+
+/*ResetStatus*/
+typedef enum {
+	ResetStatus_Accepted,
+	ResetStatus_Rejected
+}  ResetStatus;
+
+
+static char *ResetStatusStr[] = {
+    MACROSTR(Accepted),
+    MACROSTR(Rejected)
+};
+
+/*DiagnosticsStatus*/
+typedef enum {
+	DiagnosticsStatus_Idle,
+	DiagnosticsStatus_Uploaded,
+	DiagnosticsStatus_UploadFailed,
+	DiagnosticsStatus_Uploading
+}  DiagnosticsStatus;
+
+
+static char * DiagnosticsStatusStr[] = {
+    MACROSTR(Idle),
+    MACROSTR(Uploaded),
+	MACROSTR(UploadFailed),
+	MACROSTR(Uploading)
+};
+
+/*FirmwareStatus*/
+typedef enum {
+	FirmwareStatus_Downloaded,
+	FirmwareStatus_DownloadFailed,
+	FirmwareStatus_Downloading,
+	FirmwareStatus_Idle,
+	FirmwareStatus_InstallationFailed,
+	FirmwareStatus_Installing,
+	FirmwareStatus_Installed
+}  FirmwareStatus;
+
+
+static char * FirmwareStatusStr[] = {
+    MACROSTR(Downloaded),
+    MACROSTR(DownloadFailed),
+	MACROSTR(Downloading),
+	MACROSTR(Idle),
+	MACROSTR(InstallationFailed),
+	MACROSTR(Installing),
+	MACROSTR(Installed)
+};
+
+
+/*MessageTrigger*/
+typedef enum {
+	BootNotification,
+	DiagnosticsStatusNotification,
+	FirmwareStatusNotification,
+	Heartbeat,
+	MeterValues,
+	StatusNotification
+}   MessageTrigger;
+
+
+static char * MessageTriggerStr[] = {
+    MACROSTR(BootNotification),
+    MACROSTR(DiagnosticsStatusNotification),
+	MACROSTR(FirmwareStatusNotification),
+	MACROSTR(Heartbeat),
+	MACROSTR(MeterValues),
+	MACROSTR(StatusNotification)
+};
+
+
+/*TriggerMessageStatus*/
+typedef enum {
+	TriggerMessageStatus_Accepted ,
+	TriggerMessageStatus_Rejected ,
+	TriggerMessageStatus_NotImplemented
+}   TriggerMessageStatus;
+
+
+static char * TriggerMessageStatusStr[] = {
+    MACROSTR(Accepted),
+    MACROSTR(Rejected),
+	MACROSTR(NotImplemented)
+};
+
+
+/*UnlockStatus*/
+typedef enum {
+	Unlocked,
+	UnlockFailed,
+	UnlockStatus_NotSupported
+}   UnlockStatus;
+
+
+static char * UnlockStatusStr[] = {
+    MACROSTR(Unlocked),
+    MACROSTR(UnlockFailed),
+	MACROSTR(NotSupported)
+};
+
+/*StopTransactionReason*/
+typedef enum {
+	EmergencyStop,
+	EVDisconnected,
+	HardReset,
+	Local,
+	Other,
+	PowerLoss,
+	Reboot,
+	Remote,
+	SoftReset,
+	UnlockCommand,
+	DeAuthorized
+}   StopTransactionReason;
+
+static char * StopTransactionReasonStr[] = {
+    MACROSTR(EmergencyStop),
+    MACROSTR(EVDisconnected),
+	MACROSTR(HardReset),
+	MACROSTR(Local),
+	MACROSTR(Other),
+	MACROSTR(PowerLoss),
+	MACROSTR(Reboot),
+	MACROSTR(Remote),
+	MACROSTR(SoftReset),
+	MACROSTR(UnlockCommand),
+	MACROSTR(DeAuthorized)
+};
+
+/*CancelReservationStatus*/
+typedef enum {
+	CancelReservationStatus_Accepted,
+	CancelReservationStatus_Rejected
+}   CancelReservationStatus;
+
+static char * CancelReservationStatusStr[] = {
+    MACROSTR(Accepted),
+	MACROSTR(Rejected)
+};
+
+/*ReadingContext*/
+typedef enum {
+	ReadingContext_Interruption_Begin,
+	ReadingContext_Interruption_End,
+	ReadingContext_Other,
+	ReadingContext_Sample_Clock,
+	ReadingContext_Sample_Periodic ,
+	ReadingContext_Transaction_Begin ,
+	ReadingContext_Transaction_End,
+	ReadingContext_Trigger
+}  ReadingContext;
+
+
+static char * ReadingContextStr[] = {
+    MACROSTR(Interruption.Begin),
+	MACROSTR(Interruption.End),
+	MACROSTR(Other),
+	MACROSTR(Sample.Clock),
+	MACROSTR(Sample.Periodic),
+	MACROSTR(Transaction.Begin),
+	MACROSTR(Transaction.End),
+	MACROSTR(Trigger)
+};
+
+
+/*ValueFormat*/
+typedef enum {
+	Raw,
+	SignedData
+}  ValueFormat;
+
+
+static char * ValueFormatStr[] = {
+    MACROSTR(Raw),
+	MACROSTR(SignedData)
+};
+
+
+/*Measurand*/
+typedef enum {
+	Current_Export ,
+	Current_Import,
+	Current_Offered,
+	Energy_Active_Export_Register,
+	Energy_Active_Import_Register,
+	Energy_Reactive_Export_Register,
+	Energy_Reactive_Import_Register,
+	Energy_Active_Export_Interval,
+	Energy_Active_Import_Interval,
+	Energy_Reactive_Export_Interval,
+	Energy_Reactive_Import_Interval,
+	Frequency,
+	Power_Active_Export ,
+	Power_Active_Import,
+	Power_Factor,
+	Power_Offered,
+	Power_Reactive_Export,
+	Power_Reactive_Import,
+	RPM,
+	SoC,
+	Temperature ,
+	Voltage
+}  Measurand;
+
+
+static char * MeasurandStr[] = {
+    MACROSTR(Current.Export),
+	MACROSTR(Current.Import),
+	MACROSTR(Current.Offered),
+	MACROSTR(Energy.Active.Export.Register),
+	MACROSTR(Energy.Active.Import.Register),
+	MACROSTR(Energy.Reactive.Export.Register),
+	MACROSTR(Energy.Reactive.Import.Register),
+	MACROSTR(Energy.Active.Export.Interval),
+	MACROSTR(Energy.Active.Import.Interval),
+	MACROSTR(Energy.Reactive.Export.Interval),
+	MACROSTR(Energy.Reactive.Import.Interval),
+	MACROSTR(Frequency),
+	MACROSTR(Power.Active.Export),
+	MACROSTR(Power.Active.Import),
+	MACROSTR(Power.Factor),
+	MACROSTR(Power.Offered),
+	MACROSTR(Power.Reactive.ExportMACROSTR),
+	MACROSTR(Power.Reactive.Import),
+	MACROSTR(RPM),
+	MACROSTR(SoC),
+	MACROSTR(Temperature),
+	MACROSTR(Voltage)
+};
+
+
+/*Location*/
+typedef enum {
+	Location_Body,
+	Location_Cable,
+	Location_EV,
+	Location_Inlet ,
+	Location_Outlet
+}  Location;
+
+
+static char * LocationStr[] = {
+    MACROSTR(Body),
+	MACROSTR(Cable),
+	MACROSTR(EV),
+	MACROSTR(Inlet),
+	MACROSTR(Outlet)
+};
+
+
+/*Phase*/
+typedef enum {
+	L1,
+	L2,
+	L3,
+	N,
+	L1_N,
+	L2_N,
+	L3_N,
+	L1_L2,
+	L2_L3,
+	L3_L1
+}  Phase;
+
+
+static char * PhaseStr[] = {
+    MACROSTR(L1),
+	MACROSTR(L2),
+	MACROSTR(L3),
+	MACROSTR(N),
+	MACROSTR(L1-N),
+	MACROSTR(L2-N),
+	MACROSTR(L3-N),
+	MACROSTR(L1-L2),
+	MACROSTR(L2-L3),
+	MACROSTR(L3-L1)
+};
+
+
+/*UnitOfMeasure*/
+typedef enum {
+	UnitOfMeasure_Wh,
+	UnitOfMeasure_kWh ,
+	UnitOfMeasure_varh ,
+	UnitOfMeasure_kvarh ,
+	UnitOfMeasure_W ,
+	UnitOfMeasure_kW ,
+	UnitOfMeasure_VA ,
+	UnitOfMeasure_kVA ,
+	UnitOfMeasure_var ,
+	UnitOfMeasure_kvar ,
+	UnitOfMeasure_A ,
+	UnitOfMeasure_V ,
+	UnitOfMeasure_Celsius ,
+	UnitOfMeasure_Fahrenheit ,
+	UnitOfMeasure_K ,
+	UnitOfMeasure_Percent
+
+}  UnitOfMeasure;
+
+
+static char * UnitOfMeasureStr[] = {
+	MACROSTR(Wh),
+	MACROSTR(kWh),
+	MACROSTR(varh),
+	MACROSTR(kvarh),
+	MACROSTR(W),
+	MACROSTR(kW),
+	MACROSTR(VA),
+	MACROSTR(kVA),
+	MACROSTR(var),
+	MACROSTR(kvar),
+	MACROSTR(A),
+	MACROSTR(V),
+	MACROSTR(Celsius),
+	MACROSTR(Fahrenheit),
+	MACROSTR(K),
+	MACROSTR(Percent)
+};
+
+
+/*Configuration enum*/
+enum CoreProfile {
+	 AllowOfflineTxForUnknownId=0,
+	 AuthorizationCacheEnabled,
+	 AuthorizeRemoteTxRequests,
+	 BlinkRepeat,
+	 ClockAlignedDataInterval,
+	 ConnectionTimeOut,
+	 GetConfigurationMaxKeys,
+	 HeartbeatInterval,
+	 LightIntensity,
+	 LocalAuthorizeOffline,
+	 LocalPreAuthorize,
+	 MaxEnergyOnInvalidId,
+	 MeterValuesAlignedData,
+	 MeterValuesAlignedDataMaxLength,
+	 MeterValuesSampledData,
+	 MeterValuesSampledDataMaxLength,
+	 MeterValueSampleInterval,
+	 MinimumStatusDuration,
+	 NumberOfConnectors,
+	 ResetRetries,
+	 ConnectorPhaseRotation,
+	 ConnectorPhaseRotationMaxLength,
+	 StopTransactionOnEVSideDisconnect,
+	 StopTransactionOnInvalidId,
+	 StopTxnAlignedData,
+	 StopTxnAlignedDataMaxLength,
+	 StopTxnSampledData,
+	 StopTxnSampledDataMaxLength,
+	 SupportedFeatureProfiles,
+	 SupportedFeatureProfilesMaxLength,
+	 TransactionMessageAttempts,
+	 TransactionMessageRetryInterval,
+	 UnlockConnectorOnEVSideDisconnect,
+	 WebSocketPingInterval,
+	 _CoreProfile_CNT
+};
+
+enum LocalAuthListManagementProfile{
+	LocalAuthListEnabled=0,
+	LocalAuthListMaxLength,
+	SendLocalListMaxLength,
+	_LocalAuthListManagementProfile_CNT
+};
+
+enum ReservationProfile{
+	ReserveConnectorZeroSupported
+};
+
+enum SmartChargingProfile{
+	ChargeProfileMaxStackLevel,
+	ChargingScheduleAllowedChargingRateUnit,
+	ChargingScheduleMaxPeriods,
+	ConnectorSwitch3to1PhaseSupported,
+	MaxChargingProfilesInstalled
+};
+
+enum ChargerSystemStatus{
+	ChargerSystemStatus_Booting,
+	ChargerSystemStatus_Idle,
+	ChargerSystemStatus_Authorizing,
+	ChargerSystemStatus_Preparing,
+	ChargerSystemStatus_Charging,
+	ChargerSystemStatus_Terminating,
+	ChargerSystemStatus_Alarm,
+	ChargerSystemStatus_Fault
+};
+
+enum GetConfigurationKey {
+	GetConfiguration_AllowOfflineTxForUnknownId=0,
+	GetConfiguration_AuthorizationCacheEnabled,
+	GetConfiguration_AuthorizeRemoteTxRequests,
+	GetConfiguration_BlinkRepeat,
+	GetConfiguration_ClockAlignedDataInterval,
+	GetConfiguration_ConnectionTimeOut,
+	GetConfiguration_GetConfigurationMaxKeys,
+	GetConfiguration_HeartbeatInterval,
+	GetConfiguration_LightIntensity,
+	GetConfiguration_LocalAuthorizeOffline,
+	GetConfiguration_LocalPreAuthorize,
+	GetConfiguration_MaxEnergyOnInvalidId,
+	GetConfiguration_MeterValuesAlignedData,
+	GetConfiguration_MeterValuesAlignedDataMaxLength,
+	GetConfiguration_MeterValuesSampledData,
+	GetConfiguration_MeterValuesSampledDataMaxLength,
+	GetConfiguration_MeterValueSampleInterval,
+	GetConfiguration_MinimumStatusDuration,
+	GetConfiguration_NumberOfConnectors,
+	GetConfiguration_ResetRetries,
+	GetConfiguration_ConnectorPhaseRotation,
+	GetConfiguration_ConnectorPhaseRotationMaxLength,
+	GetConfiguration_StopTransactionOnEVSideDisconnect,
+	GetConfiguration_StopTransactionOnInvalidId,
+	GetConfiguration_StopTxnAlignedData,
+	GetConfiguration_StopTxnAlignedDataMaxLength,
+	GetConfiguration_StopTxnSampledData,
+	GetConfiguration_StopTxnSampledDataMaxLength,
+	GetConfiguration_SupportedFeatureProfiles,
+	GetConfiguration_SupportedFeatureProfilesMaxLength,
+	GetConfiguration_TransactionMessageAttempts,
+	GetConfiguration_TransactionMessageRetryInterval,
+	GetConfiguration_UnlockConnectorOnEVSideDisconnect,
+	GetConfiguration_WebSocketPingInterval,
+	GetConfiguration_LocalAuthListEnabled,
+	GetConfiguration_LocalAuthListMaxLength,
+	GetConfiguration_SendLocalListMaxLength,
+	GetConfiguration_ReserveConnectorZeroSupported,
+	GetConfiguration_ChargeProfileMaxStackLevel,
+	GetConfiguration_ChargingScheduleAllowedChargingRateUnit,
+	GetConfiguration_ChargingScheduleMaxPeriods,
+	GetConfiguration_ConnectorSwitch3to1PhaseSupported,
+	GetConfiguration_MaxChargingProfilesInstalled,
+};
+
+//GetConfiguration Array
+struct StructConfigurationKeyItems staticKeyArray[GetConfigurationMaxKeysNUM]={0};
+struct StructConfigurationKey staticResponseConfigurationKeyArray[GetConfigurationMaxKeysNUM]={0};
+struct StructConfigurationKeyItems staticResponseUnknownKey[10]={0};
+struct StructLocalAuthorizationList staticLocalAuthorizationList[500]={0};
+
+struct StructChargingSchedulePeriod staticCHAdeMOChargingSchedulePeriod[10]={0};
+struct StructChargingSchedulePeriod staticCCSChargingSchedulePeriod[10]={0};
+struct StructChargingSchedulePeriod staticGBChargingSchedulePeriod[10]={0};
+struct StructChargingSchedulePeriod staticACChargingSchedulePeriod[10]={0};
+
+struct StructChargingSchedulePeriod staticCHAdeMOCompositeChargingSchedulePeriod[10]={0};
+struct StructChargingSchedulePeriod staticCCSCompositeChargingSchedulePeriod[10]={0};
+struct StructChargingSchedulePeriod staticGBCompositeChargingSchedulePeriod[10]={0};
+struct StructChargingSchedulePeriod staticACCompositeChargingSchedulePeriod[10]={0};
+
+struct StructChargingSchedulePeriod staticCHAdeMORemoteStartTransactionChargingSchedulePeriod[10]={0};
+struct StructChargingSchedulePeriod staticCCSRemoteStartTransactionChargingSchedulePeriod[10]={0};
+struct StructChargingSchedulePeriod staticGBRemoteStartTransactionChargingSchedulePeriod[10]={0};
+struct StructChargingSchedulePeriod staticACRemoteStartTransactionChargingSchedulePeriod[10]={0};
+
+
+
+//==========================================
+// Init all share memory
+//==========================================
+
+int InitShareMemory()
+{
+	int result = PASS;
+	int MeterSMId;
+
+	//printf("1\n");
+
+	//creat ShmSysConfigAndInfo
+	if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo),  0777)) < 0)
+    {
+		#ifdef SystemLogMessage
+		DEBUG_ERROR("shmget ShmSysConfigAndInfo NG\n");
+		#endif
+		result = FAIL;
+	}
+    else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
+    {
+    	#ifdef SystemLogMessage
+    	DEBUG_ERROR("shmat ShmSysConfigAndInfo NG\n");
+		#endif
+    	result = FAIL;
+   	 }
+    else
+    {}
+	//printf("2\n");
+   	//creat ShmStatusCodeData
+   	if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData),  0777)) < 0)
+    {
+		#ifdef SystemLogMessage
+   		DEBUG_ERROR("shmget ShmStatusCodeData NG\n");
+		#endif
+   		result = FAIL;
+	}
+    else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
+    {
+    	#ifdef SystemLogMessage
+    	DEBUG_ERROR("shmat ShmStatusCodeData NG\n");
+		#endif
+    	result = FAIL;
+   	}
+    else
+    {}
+   	//printf("3\n");
+
+
+	//creat ShmPsuData
+   	if ((MeterSMId = shmget(ShmPsuKey, sizeof(struct PsuData), 0777)) < 0)
+    {
+		#ifdef SystemLogMessage
+   		DEBUG_ERROR("shmget ShmPsuData NG\n");
+		#endif
+   		result = FAIL;
+	}
+    else if ((ShmPsuData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
+    {
+    	#ifdef SystemLogMessage
+    	DEBUG_ERROR("shmat ShmPsuData NG\n");
+		#endif
+    	result = FAIL;
+   	}
+    else
+    {}
+
+
+   	//printf("4\n");
+
+   	//creat ShmOCPP16Data
+   	if ((MeterSMId = shmget(ShmOcppModuleKey, sizeof(struct OCPP16Data),  0777)) < 0)
+	{
+		#ifdef SystemLogMessage
+		DEBUG_ERROR("shmget ShmOCPP16Data NG");
+		#endif
+		result = FAIL;
+	}
+	else if ((ShmOCPP16Data = shmat(MeterSMId, NULL, 0)) == (void *) -1)
+	{
+		#ifdef SystemLogMessage
+		DEBUG_ERROR("shmat ShmOCPP16Data NG");
+		#endif
+		result = FAIL;
+	}
+	else
+	{}
+
+
+    /****************************** For TEST ************************************************/
+	//inital settings
+
+   	gunTotalNumber = (strstr((const char *)ShmSysConfigAndInfo->SysConfig.ModelName ,"DC") != NULL) ? (CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY): AC_QUANTITY;
+
+	memset(ShmOCPP16Data->StatusNotification,0,sizeof(struct StructStatusNotification)*gunTotalNumber/*(CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY)*/);
+
+	for(int gun_index=0; gun_index < gunTotalNumber/*(CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY)*/; gun_index++ )
+	{
+		cpinitateMsg.bits[gun_index].StatusNotificationReq = 0;
+		cpinitateMsg.bits[gun_index].StatusNotificationConf = 0;
+		clientTime.MeterValues[gun_index] = time((time_t*)NULL);
+
+	}
+
+	// Charger PRE_SYS_MODE
+	memset(PRE_SYS_MODE, 0, sizeof(PRE_SYS_MODE));
+
+	memset( (void *)unknownkey, 0, sizeof(unknownkey)/*sizeof(char)*10*20*/ );
+
+	clientTime.Heartbeat=time((time_t*)NULL);
+
+	for(int gun_index=0;gun_index < gunTotalNumber/*(CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY)*/ ;gun_index++)
+	{
+		clientTime.StatusNotification[gun_index] = time((time_t*)NULL);
+		clientTime.MeterValues[gun_index] = time((time_t*)NULL);
+		strcpy((char *)ShmOCPP16Data->StatusNotification[gun_index].ErrorCode, "NoError");
+	}
+
+
+	//HeartBeatWaitTime = 10;
+
+	ShmOCPP16Data->GetConfiguration.ResponseUnknownKey = NULL;
+	ShmOCPP16Data->SendLocalList.LocalAuthorizationList = NULL;
+
+	// GetConfiguration
+	ShmOCPP16Data->GetConfiguration.Key = staticKeyArray;
+	ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey = staticResponseConfigurationKeyArray;
+	ShmOCPP16Data->GetConfiguration.ResponseUnknownKey = staticResponseUnknownKey;
+	ShmOCPP16Data->SendLocalList.LocalAuthorizationList = staticLocalAuthorizationList;
+
+	ShmOCPP16Data->OcppConnStatus = 1;
+
+	if(strstr((const char *)ShmSysConfigAndInfo->SysConfig.ModelName ,"DC") != NULL)
+	{
+		ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod = staticCHAdeMOChargingSchedulePeriod;
+		ShmOCPP16Data->SetChargingProfile[1].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod = staticCCSChargingSchedulePeriod;
+		ShmOCPP16Data->SetChargingProfile[2].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod = staticGBChargingSchedulePeriod;
+
+		ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod = staticCHAdeMOCompositeChargingSchedulePeriod;
+		ShmOCPP16Data->GetCompositeSchedule[1].ResponseChargingSchedule.ChargingSchedulePeriod = staticCCSCompositeChargingSchedulePeriod;
+		ShmOCPP16Data->GetCompositeSchedule[2].ResponseChargingSchedule.ChargingSchedulePeriod = staticGBCompositeChargingSchedulePeriod;
+
+		ShmOCPP16Data->RemoteStartTransaction[0].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod = staticCHAdeMORemoteStartTransactionChargingSchedulePeriod;
+		ShmOCPP16Data->RemoteStartTransaction[1].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod = staticCCSRemoteStartTransactionChargingSchedulePeriod;
+		ShmOCPP16Data->RemoteStartTransaction[2].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod = staticGBRemoteStartTransactionChargingSchedulePeriod;
+		SystemInitial = CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY;
+		DEBUG_INFO("DC ...\n");
+	}
+	else
+	{
+
+		ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod = staticACChargingSchedulePeriod;
+		ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod = staticACCompositeChargingSchedulePeriod;
+		ShmOCPP16Data->RemoteStartTransaction[0].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod = staticACRemoteStartTransactionChargingSchedulePeriod;
+		SystemInitial = AC_QUANTITY;
+
+		DEBUG_INFO("AC ...\n");
+
+		DEBUG_INFO("gunTotalNumber=%d\n",gunTotalNumber);
+
+
+	}
+
+		//memset(unknownkey, 0, 10);
+    return result;
+}
+
+
+int ProcessShareMemory()
+{
+	if(InitShareMemory() == FAIL)
+	{
+		#ifdef SystemLogMessage
+		DEBUG_ERROR("InitShareMemory NG\n");
+		#endif
+		if(ShmStatusCodeData!=NULL)
+		{
+			ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=1;
+		}
+		sleep(5);
+		return FAIL;
+	}
+	return PASS;
+}
+
+void CheckSystemValue(void)
+{
+	printf("CheckSystemValue \n");
+	int meterValueSend[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY]={0};
+	int IdleModeCnt = 0;
+
+	//===============================
+	// send Heartbeat
+	//===============================
+	if((server_sign == TRUE) && (difftime(time((time_t*)NULL), clientTime.Heartbeat) >= HeartBeatWaitTime)/*((time((time_t*)NULL)-clientTime.Heartbeat)>= ShmOCPP16Data->BootNotification.ResponseHeartbeatInterval)*/)
+	{
+		//parameter for test
+		sendHeartbeatRequest(0);
+	    //==============================================
+		// Reset Waiting Time
+		//==============================================
+		clientTime.Heartbeat=time((time_t*)NULL);
+
+	}
+
+	//=====================================================
+	// Check InternetConn 0: disconnected, 1: connected
+	//====================================================
+	if(ShmSysConfigAndInfo->SysInfo.InternetConn == 0 )
+	{
+		ShmOCPP16Data->OcppConnStatus = 0;
+	}
+	else
+	{
+		ShmOCPP16Data->OcppConnStatus = 1;
+	}
+
+	//==============================================
+	// Update request
+	//==============================================
+	if(isUpdateRequest == TRUE )
+	{
+		if(strstr((const char *)ShmSysConfigAndInfo->SysConfig.ModelName ,"DC") != NULL)
+		{
+			for(int gun_index=0;gun_index < (CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY) ;gun_index++)
+			{
+				//check SystemStatus
+				/*************************DC*******************************/
+				for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+				{
+					if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 1)) //S_IDLE
+					{
+						IdleModeCnt = IdleModeCnt + 1;
+					}
+				}
+
+				for (int index = 0; index < CCS_QUANTITY; index++)
+				{
+					if ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 1)) //S_IDLE
+					{
+						IdleModeCnt = IdleModeCnt + 1;
+					}
+				}
+
+				for (int index = 0; index < GB_QUANTITY; index++)
+				{
+					if ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 1)) //S_IDLE
+					{
+						IdleModeCnt = IdleModeCnt + 1;
+					}
+				}
+
+			}
+
+
+			if(IdleModeCnt == (CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY ))
+			{
+				//sendFirmwareStatusNotificationRequest(FirmwareStatusStr[FirmwareStatus_Installing]);
+				isUpdateRequest = FALSE;
+				//ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq = 1; // trigger firmware upgrade
+			}
+
+		}
+		else
+		{
+			/*************************AC*******************************/
+			for (int index = 0; index < AC_QUANTITY; index++)
+			{
+				if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == 1) //S_IDLE
+				{
+					IdleModeCnt = IdleModeCnt + 1;
+				}
+			}
+
+			if(IdleModeCnt == AC_QUANTITY)
+			{
+				//sendFirmwareStatusNotificationRequest(FirmwareStatusStr[FirmwareStatus_Installing]);
+				isUpdateRequest = FALSE;
+				//ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq = 1; // trigger firmware upgrade
+			}
+		}
+
+
+	}
+
+
+	DEBUG_INFO("\n gunTotalNumber=%d\n",gunTotalNumber);
+
+	for(int gun_index=0;gun_index < gunTotalNumber /*(CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY )*/ ;gun_index++)
+	{
+
+		//===============================
+		// CSU Trigger Reset Conf
+		//===============================
+		if((server_sign == TRUE) &&(ShmOCPP16Data->MsMsg.bits.ResetConf == 1))
+		{
+			sendResetConfirmation((char *)ShmOCPP16Data->Reset.guid, (char *)ShmOCPP16Data->Reset.ResponseStatus);
+
+			if(strcmp((const char *)ShmOCPP16Data->Reset.Type, "Soft") == 0)
+			{
+				server_sign = FALSE;
+			}
+
+		}
+
+		//===============================
+		// CSU Trigger Authorize Request
+		//===============================
+		if((server_sign == TRUE) && (ShmOCPP16Data->SpMsg.bits.AuthorizeReq == 1)&&(authorizeRetryTimes < 3)/*authenrequest == FALSE*/)
+		{
+			if(strcmp((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemData, "TRUE") == 0)// [If AuthorizeRemoteTxRequests = true
+			{
+				sendAuthorizeRequest(0);
+
+				authorizeRetryTimes = authorizeRetryTimes + 1;
+				/* authenrequest = TRUE; */
+				if(authorizeRetryTimes < 3)
+				ShmOCPP16Data->SpMsg.bits.AuthorizeReq = 0;
+			}
+
+		}
+		else if((server_sign == TRUE) && (ShmOCPP16Data->SpMsg.bits.AuthorizeReq == 1)&&(authorizeRetryTimes >= 3))
+		{
+			authorizeRetryTimes = 0;
+			ShmOCPP16Data->OcppConnStatus = 0;  // ocpp offline
+		}
+
+		//==============================================
+		// Charger start transaction
+		//==============================================
+		if((server_sign == TRUE) && (ShmOCPP16Data->CpMsg.bits[gun_index].StartTransactionReq == 1))
+		{
+			sendStartTransactionRequest(gun_index);
+			ShmOCPP16Data->CpMsg.bits[gun_index].StartTransactionReq =0;
+			clientTime.StartTransaction = time((time_t*)NULL);
+			clientTime.MeterValues[gun_index] = time((time_t*)NULL);
+		 }
+
+		//==============================================
+		// Charger stop transaction
+		//==============================================
+		if((server_sign == TRUE) && ((ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq == 1)))
+		{
+			sendStopTransactionRequest(gun_index);
+			ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq =0;
+			clientTime.StopTransaction = time((time_t*)NULL);
+		}
+
+		//==============================================
+		// Charger status report
+		//==============================================
+		/* Check Mode Change */
+		if(strstr((const char *)ShmSysConfigAndInfo->SysConfig.ModelName ,"DC") != NULL)
+		{
+			for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)
+				{
+					if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PreviousSystemStatus/*PRE_SYS_MODE[gun_index]*/ )
+					{
+						PRE_SYS_MODE[gun_index] = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus;
+						ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PreviousSystemStatus = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus;
+						cpinitateMsg.bits[gun_index].StatusNotificationReq = 1;
+						statusModeChage[gun_index] = TRUE;
+
+					}
+
+				}
+			}
+
+			for (int index = 0; index < CCS_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)
+				{
+					if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PreviousSystemStatus/*PRE_SYS_MODE[gun_index]*/ )
+					{
+						PRE_SYS_MODE[gun_index] = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus;
+						ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PreviousSystemStatus = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus;
+						cpinitateMsg.bits[gun_index].StatusNotificationReq = 1;
+						statusModeChage[gun_index] = TRUE;
+					}
+
+				}
+			}
+
+			for (int index = 0; index < GB_QUANTITY; index++)
+			{
+				if ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)/*&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == '4')*/)
+				{
+					if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PreviousSystemStatus/*PRE_SYS_MODE[gun_index]*/ )
+					{
+						PRE_SYS_MODE[gun_index] = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus;
+						ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PreviousSystemStatus = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus;
+						cpinitateMsg.bits[gun_index].StatusNotificationReq = 1;
+						statusModeChage[gun_index] = TRUE;
+					}
+
+				}
+			}
+
+		}
+		else //AC
+		{
+			for (int index = 0; index < AC_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == gun_index)
+				{
+					if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PreviousSystemStatus/*PRE_SYS_MODE[gun_index]*/ )
+					{
+						PRE_SYS_MODE[gun_index] = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus;
+						ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PreviousSystemStatus = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus;
+						cpinitateMsg.bits[gun_index].StatusNotificationReq = 1;
+						statusModeChage[gun_index] = TRUE;
+					}
+
+				}
+			}// END OF FOR
+
+		}// END OF ELSE
+
+
+
+		if((SystemInitial != 0)||
+		   ((server_sign == TRUE) && ((statusModeChage[gun_index] == TRUE) ||
+	       ((time((time_t*)NULL)-clientTime.StatusNotification[gun_index]) > (server_cycle_Status + (GunStatusInterval*gun_index)))
+					|| ((cpinitateMsg.bits[gun_index].StatusNotificationReq == 1)&&((time((time_t*)NULL)-clientTime.StatusNotification[gun_index]) > 30)))))
+		{
+			if(SystemInitial != 0)
+			SystemInitial = SystemInitial -1;
+
+			//GunStatusInterval= GunStatusInterval* gun_index;
+			sendStatusNotificationRequest(gun_index);
+			clientTime.StatusNotification[gun_index] = time((time_t*)NULL);
+			//cpinitateMsg.bits[gun_index].StatusNotificationReq = 0;
+			statusModeChage[gun_index] = FALSE;
+			//sleep(30); // sleep for 30 seconds
+		}
+
+	printf("ShmSysConfigAndInfo->SysInfo.AcChargingData[0].SystemStatus = %d \n",(int)(ShmSysConfigAndInfo->SysInfo.AcChargingData[0].SystemStatus));
+//	printf("ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].SystemStatus = %d \n",(int)(ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].SystemStatus));
+	//==============================================
+	// Meter report
+	//==============================================
+		if((server_sign == TRUE) &&  ((time((time_t*)NULL) - clientTime.MeterValues[gun_index])> (atoi((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemData)- 1 ) ) )
+		{
+			//check Transaction active
+			if(strstr((const char *)ShmSysConfigAndInfo->SysConfig.ModelName ,"DC") != NULL)
+			{
+				for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+				{
+					// 0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault
+					if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 8))
+					{
+						meterValueSend[gun_index] =1;
+					}
+				}
+
+				for (int index = 0; index < CCS_QUANTITY; index++)
+				{
+					// 0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault
+					if ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 8))
+					{
+						meterValueSend[gun_index] =1;
+					}
+				}
+
+				for (int index = 0; index < GB_QUANTITY; index++)
+				{
+					// 0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault
+					if ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 8))
+					{
+						meterValueSend[gun_index] =1;
+					}
+				}
+			}
+			else
+			{
+				for (int index = 0; index < AC_QUANTITY; index++)
+				{
+					// 0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault
+					if ((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == 8))
+					{
+						meterValueSend[gun_index] =1;
+					}
+				}
+
+
+			}//END OF ELSE
+
+
+		//	sleep(1);
+			clientTime.MeterValues[gun_index] = time((time_t*)NULL);
+
+			if(meterValueSend[gun_index] == 1)
+				sendMeterValuesRequest(gun_index);
+
+
+		}
+
+	//==============================================
+	// Check Connector reserved
+	//==============================================
+
+	/*
+		enum _SYSTEM_STATUS
+		{
+			S_BOOTING = 0,
+			S_IDLE,                      =1
+			S_AUTHORIZING,               =2
+			S_REASSIGN_CHECK,            =3
+			S_REASSIGN,                  =4
+			S_PRECHARGE,                 =5
+			S_PREPARING_FOR_EV,          =6
+			S_PREPARING_FOR_EVSE,        =7
+			S_CHARGING,                  =8
+			S_TERMINATING,               =9
+			S_COMPLETE,                  =10
+			S_ALARM,                     =11
+			S_FAULT                      =12
+		};
+
+	*/
+		//===============================
+		// Check if Reserve is expired
+		//===============================
+		if((server_sign == TRUE) && (ShmOCPP16Data->ReserveNow[gun_index].ExpiryDate[0] != 0) )
+		{
+			double diff_t;
+			struct tm tp;
+			// current time
+			time_t t = time(NULL);
+		//	sprintf((char *)ShmOCPP16Data->ReserveNow[gun_index].ExpiryDate, "%s", "2018-09-20T02:56:54.973Z");
+			strptime((char *)ShmOCPP16Data->ReserveNow[gun_index].ExpiryDate, "%Y-%m-%dT%H:%M:%S", &tp);
+			tp.tm_isdst = -1;
+			time_t utc = mktime(&tp);
+#if 0
+			struct tm e0 = { .tm_year = tp.tm_year, .tm_mday = tp.tm_mday, .tm_mon = tp.tm_mon, .tm_hour = tp.tm_hour, .tm_isdst = -1 };
+			time_t pseudo = mktime(&e0);
+			struct tm e1 = *gmtime(&pseudo);
+			e0.tm_sec += utc - diff_tm(&e1, &e0);
+			time_t local = e0.tm_sec;
+			// ?�到��??�起始�???- chargingScedule起�??��?
+			diff_t = difftime(t, local);
+#endif
+			diff_t = difftime(utc, t);
+			//DEBUG_INFO("diff_t=%f\n",diff_t);
+			if(diff_t <= 0)
+			{
+				DEBUG_INFO("reserve expired !!!   \n");
+				memset(ShmOCPP16Data->ReserveNow[gun_index].ExpiryDate,0,sizeof(ShmOCPP16Data->ReserveNow[gun_index].ExpiryDate));
+				ShmOCPP16Data->CsMsg.bits[gun_index].CancelReservationReq = 1;
+			}
+			else if((ShmOCPP16Data->CpMsg.bits[gun_index].StartTransactionConf == 1) &&
+						(ShmOCPP16Data->StartTransaction[gun_index].ReservationId == ShmOCPP16Data->ReserveNow[gun_index].ReservationId)&&
+						(strcmp((const char *)ShmOCPP16Data->StartTransaction[gun_index].IdTag,(const char *)ShmOCPP16Data->ReserveNow[gun_index].IdTag) ==0))
+			{
+				ShmOCPP16Data->CsMsg.bits[gun_index].CancelReservationReq = 1;
+			}
+			else
+			{
+				//check Transaction active
+
+				if(strstr((const char *)ShmSysConfigAndInfo->SysConfig.ModelName ,"DC") != NULL)
+				{
+					for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+					{
+						//0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault, 8: Reserved, 9: maintain
+						if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index) &&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId !=0))
+						{
+							//if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == '6') || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == '7') || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == '9') )
+							if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 11) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 12) ) // S_ALARM, S_FAULT
+							{
+								ShmOCPP16Data->CsMsg.bits[gun_index].CancelReservationReq = 1;
+
+							}
+
+						}
+					}
+
+					for (int index = 0; index < CCS_QUANTITY; index++)
+					{
+						//0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault, 8: Reserved, 9: maintain
+						if ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ReservationId !=0))
+						{
+							//if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == '6') || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == '7') || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == '9') )
+							if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 11) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 12) ) // S_ALARM, S_FAULT
+							{
+								ShmOCPP16Data->CsMsg.bits[gun_index].CancelReservationReq = 1;
+
+							}
+
+						}
+					}
+
+					for (int index = 0; index < GB_QUANTITY; index++)
+					{
+						//0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault, 8: Reserved, 9: maintain
+						if ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ReservationId !=0) )
+						{
+							//if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == '6') || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == '7') || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == '9') )
+							if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 11) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 12) ) // S_ALARM, S_FAULT
+							{
+								ShmOCPP16Data->CsMsg.bits[gun_index].CancelReservationReq = 1;
+
+							}
+
+						}
+					}
+
+
+				}
+				else //AC
+				{
+					for (int index = 0; index < AC_QUANTITY; index++)
+					{
+						//0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault, 8: Reserved, 9: maintain
+						if ((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == gun_index) &&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].ReservationId !=0))
+						{
+							//if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == '6') || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == '7') || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == '9') )
+							if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == 11) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == 12) ) // S_ALARM, S_FAULT
+							{
+								ShmOCPP16Data->CsMsg.bits[gun_index].CancelReservationReq = 1;
+
+							}
+
+						}
+					}
+
+				}// END OF ELSE
+
+			  }// END OF check Transaction active
+			}//END OF Check if Reserve is expired
+
+			//==========================================
+			// csu trigger FirmwareStatusNotificationReq
+			//==========================================
+			if((server_sign == TRUE) && (ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationReq == 1))
+			{
+				sendFirmwareStatusNotificationRequest((char *)ShmOCPP16Data->FirmwareStatusNotification.Status);
+			}
+
+			//==========================================
+			// csu trigger CancelReservationConf
+			//==========================================
+			if((server_sign == TRUE) && (ShmOCPP16Data->CsMsg.bits[gun_index].CancelReservationConf == 1))
+			{
+				//sendCancelReservationConfirmation(uuid, comfirmstr);
+				sendCancelReservationConfirmation((char *)ShmOCPP16Data->CancelReservation[gun_index].guid,(char *)ShmOCPP16Data->CancelReservation[gun_index].ResponseStatus);
+
+			}
+
+			//==========================================
+			// csu trigger ChangeAvailabilityConf
+			//==========================================
+			if((server_sign == TRUE) && (ShmOCPP16Data->CsMsg.bits[gun_index].ChangeAvailabilityConf == 1))
+			{
+				//sendChangeAvailabilityConfirmation(,(char *)ShmOCPP16Data->ChangeAvailability[gun_index].ResponseStatus);
+			}
+
+			//==========================================
+			// csu trigger UnlockConnectorConf
+			//==========================================
+			if((server_sign == TRUE) && (ShmOCPP16Data->CsMsg.bits[gun_index].UnlockConnectorConf == 1))
+			{
+				sendUnlockConnectorConfirmation((char *)ShmOCPP16Data->UnlockConnector[gun_index].guid, (char *)ShmOCPP16Data->UnlockConnector[gun_index].ResponseStatus);
+				ShmOCPP16Data->CsMsg.bits[gun_index].UnlockConnectorConf = 0;
+			}
+
+			//==========================================
+			// csu trigger ReserveNowConf
+			//==========================================
+			if((server_sign == TRUE) &&(ShmOCPP16Data->CsMsg.bits[gun_index].ReserveNowConf == 1))
+			{
+				sendReserveNowTransactionConfirmation((char *)ShmOCPP16Data->ReserveNow[gun_index].guid, (char *)ShmOCPP16Data->ReserveNow[gun_index].ResponseStatus);
+				ShmOCPP16Data->CsMsg.bits[gun_index].ReserveNowConf = 0;
+			}
+
+	}
+
+
+
+
+
+}
+
+//==========================================
+// send request routine
+//==========================================
+int sendAuthorizeRequest(int gun_index)
+{
+
+	mtrace();
+	int result = FAIL;
+	char message[100]={0};
+	char guid[37];
+	char tempdata[65]={0};
+
+	DEBUG_ERROR("sendAuthorizeRequest \n");
+
+	//Local Authorize
+	if((strcmp((const char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "TRUE") == 0)&&(ShmOCPP16Data->OcppConnStatus ==0))
+	{
+		OCPP_getIdTag((char *)ShmSysConfigAndInfo->SysConfig.UserId);
+		if((strcmp(idTagQuery.idTagstr,"") == 0) || (strcmp(idTagQuery.idTagstatus,"Accepted") != 0) )
+		{
+			DEBUG_INFO("Local Authorization Fail !!!!\n");
+			strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ExpiryDate, "");
+			strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag, (const char *)ShmSysConfigAndInfo->SysConfig.UserId);
+			strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status, "Invalid");
+			ShmOCPP16Data->SpMsg.bits.AuthorizeReq = 0;
+			ShmOCPP16Data->SpMsg.bits.AuthorizeConf = 1; // inform csu
+			authorizeRetryTimes = 0;
+			return result;
+		}
+		else
+		{
+			DEBUG_INFO("Local Authorization Pass !!!!\n");
+			strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ExpiryDate, idTagQuery.expiryDate);
+			strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag, (const char *)ShmSysConfigAndInfo->SysConfig.UserId);
+			strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status, idTagQuery.idTagstatus);
+			result = PASS;
+			ShmOCPP16Data->SpMsg.bits.AuthorizeReq = 0;
+			ShmOCPP16Data->SpMsg.bits.AuthorizeConf = 1; // inform csu
+			authorizeRetryTimes = 0;
+			return result;
+		}
+	}
+
+	//initailize  struct Authorize
+	memset(&(ShmOCPP16Data->Authorize), 0 , sizeof(struct StructAuthorize));
+
+	//get data from shared memory
+	strcpy((char *)ShmOCPP16Data->Authorize.IdTag, (const char *)ShmSysConfigAndInfo->SysConfig.UserId);
+
+	random_uuid(guid);
+	sprintf(message,"[ %d, \"%s\", \"Authorize\", { \"idTag\": \"%s\" } ]",MESSAGE_TYPE_CALL, guid, ShmOCPP16Data->Authorize.IdTag);
+	LWS_Send(message);
+
+	// Put request guid to hash map
+    //memset(mapItem, 0, sizeof(data_struct_t));
+
+   // sprintf(mapItem[0].key_string, "%s", guid);
+	sprintf(tempdata, "Authorize,%d", gun_index);//sprintf(mapItem->key_value, senstr);//sprintf(mapItem->key_value, "Authorize");
+
+	if(hashmap_operation(0, guid, tempdata) == 1)//if(hashmap_operation(0,NULL/*hashMap*/, guid/*mapItem[0].key_string*/, mapItem/*mapItem[0].key_value*//*mapItem*/,tempdata/*(void**)(&mapItem)*/ /*(void**)(&mapItem)*/) ==  MAP_OK/*hashmap_put(hashMap, mapItem->key_string, mapItem) == MAP_OK*/)
+	{
+		result = PASS;
+		DEBUG_ERROR("Authorize mapItem pass\n");
+	}
+
+	#ifdef SystemLogMessage
+	DEBUG_INFO(">>>>>Authorize request\n");
+	DEBUG_INFO("Message: %s\n", SendBuffer);
+	//DEBUG_INFO("After push hash length: %d\n", hashmapForMessageLength()/*hashmap_length(hashMap)*/);
+	#endif
+
+	ShmOCPP16Data->SpMsg.bits.AuthorizeReq = 0;
+
+	return result;
+}
+
+int sendBootNotificationRequest(void)
+{
+	mtrace();
+	int result = FAIL;
+	//int i = 0;
+	//struct json_object *message, *payload;
+	char message[500]={0}, payload[700]={0};
+    //int count = 0;
+    //int gun_index = 0;
+    char guid[37]={0};
+    char tempdata[65]={0};
+    int IsGunCharging = FALSE;
+
+
+    //check Transaction active
+    if(strstr((const char *)ShmSysConfigAndInfo->SysConfig.ModelName ,"DC") != NULL)
+    {
+    	for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+    	{
+    	   if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 8) //S_CHARGING
+    	   {
+    		   IsGunCharging = TRUE;
+    	   }
+
+    	}
+
+    	for (int index = 0; index < CCS_QUANTITY; index++)
+    	{
+    	   if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 8) //S_CHARGING
+    	   {
+    		   IsGunCharging = TRUE;
+    	   }
+    	}
+
+    	for (int index = 0; index < GB_QUANTITY; index++)
+    	{
+    	   if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 8) //S_CHARGING
+    	   {
+    		   IsGunCharging = TRUE;
+    	   }
+    	}
+    }
+    else
+    {
+    	for (int index = 0; index < AC_QUANTITY; index++)
+        {
+    		if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == 8) //S_CHARGING
+        	{
+    			IsGunCharging = TRUE;
+        	}
+
+        }
+
+    }
+
+
+    if(IsGunCharging == TRUE)
+    {
+    	server_sign = TRUE;
+    	return result;
+    }
+
+
+
+	// Fill BootNotification fields
+	strcpy((char *)ShmOCPP16Data->BootNotification.CbSN,(const char *)ShmOCPP16Data->ChargeBoxId);
+	strcpy((char *)ShmOCPP16Data->BootNotification.CpModel,(const char *)ShmSysConfigAndInfo->SysConfig.ModelName);
+	strcpy((char *)ShmOCPP16Data->BootNotification.CpSN,(const char *)ShmSysConfigAndInfo->SysConfig.SerialNumber);
+	strcpy((char *)ShmOCPP16Data->BootNotification.CpVendor,(const char *)ShmSysConfigAndInfo->SysConfig.chargePointVendor);
+
+	sprintf(payload, "{ \"chargeBoxSerialNumber\": \"%s\", \"chargePointModel\": \"%s\", \"chargePointSerialNumber\": \"%s\", \"chargePointVendor\": \"%s\", \"firmwareVersion\": \"%s\", \"iccid\": \"%s\", \"imsi\": \"%s\", \"meterSerialNumber\": \"%s\", \"meterType\": \"%s\"} ",
+			ShmOCPP16Data->ChargeBoxId
+			,ShmSysConfigAndInfo->SysConfig.ModelName
+			,ShmSysConfigAndInfo->SysConfig.SerialNumber
+			,ShmSysConfigAndInfo->SysConfig.chargePointVendor
+			,ShmOCPP16Data->BootNotification.CpFwVersion
+			,ShmOCPP16Data->BootNotification.CpIccid
+			,ShmOCPP16Data->BootNotification.CpImsi
+			,ShmOCPP16Data->BootNotification.CpMeterSerialNumber
+			,ShmOCPP16Data->BootNotification.CpMeterType);
+	random_uuid(guid);
+
+	sprintf(message,"[ %d, \"%s\", \"%s\", %s ]",MESSAGE_TYPE_CALL, guid, "BootNotification", payload);
+	LWS_Send(message);
+  //  memset(mapItem, 0, sizeof(data_struct_t));
+	// Put request guid to hash map
+	//sprintf(mapItem[0].key_string, "%s", guid);
+	sprintf(tempdata, "BootNotification,0");
+//	printf("BootNotification mapItem->key_string=%s\n",mapItem[0].key_string);
+//	printf("BootNotification mapItem->key_value=%s\n",mapItem[0].key_value);
+	if(hashmap_operation(0, guid, tempdata) == 1)//if(hashmap_operation(0,NULL/*hashMap*/, guid,mapItem, tempdata/*(void**)(&mapItem)*//*(void**)(&mapItem)*/) ==  MAP_OK/*hashmap_put(hashMap, mapItem->key_string, mapItem) == MAP_OK*/)
+	{
+		result = PASS;
+	}
+
+	memset(queuedata, 0, strlen(queuedata));
+
+	strcpy(queuedata,message);
+	//addq(guid, queuedata);
+
+	#ifdef  SystemLogMessage
+	DEBUG_INFO(">>>>>BootNotification request\n");
+	DEBUG_INFO("Message: %s\n", SendBuffer);
+	//DEBUG_INFO("After push hash length: %d\n",hashmapForMessageLength()/*hashmap_length(hashMap)*/);
+	#endif
+
+    //ShmOCPP16Data->SpMsg.bits.BootNotificationReq = 1;
+
+	return result;
+}
+
+int sendDataTransferRequest(int gun_index)
+{
+	mtrace();
+	char message[1000]={0};
+	char guid[37]={0};
+	char tempdata[65]={0};
+	int result = FAIL;
+
+//[2,"696e8a35-f394-45e3-a0c7-7098b86f38a6","DataTransfer",{"vendorId":"Phihong","messageId":"FeePerKWH","data":"1"}]
+
+	random_uuid(guid);
+
+	sprintf(message,"[%d,\"%s\",\"DataTransfer\",{\"vendorId\":\"%s\",\"messageId\":\"%s\",\"data\":\"%s\"}]",
+			MESSAGE_TYPE_CALL,
+			guid,
+			ShmOCPP16Data->DataTransfer[gun_index].VendorId,
+			ShmOCPP16Data->DataTransfer[gun_index].MessageId,
+			ShmOCPP16Data->DataTransfer[gun_index].Data);
+
+	LWS_Send(message);
+
+	// Put request guid to hash map
+	//memset(mapItem, 0, sizeof(data_struct_t));
+
+	//sprintf(mapItem[0].key_string, "%s", guid);
+	sprintf(tempdata, "DataTransfer,%d", (gun_index + 1));
+
+	if(hashmap_operation(0, guid, tempdata) == 1)//if(hashmap_operation(0,NULL/*hashMap*/, mapItem[0].key_string, mapItem[0].key_value/*mapItem*/, (void**)(&mapItem)/*(void**)(&mapItem)*/) ==  MAP_OK/*hashmap_put(hashMap, mapItem->key_string, mapItem) == MAP_OK*/)
+	{
+		result = PASS;
+		DEBUG_ERROR("DataTransfer mapItem pass\n");
+	}
+
+	#ifdef SystemLogMessage
+	DEBUG_INFO(">>>>>DataTransfer request\n");
+	DEBUG_INFO("Message: %s\n", SendBuffer);
+	//DEBUG_INFO("After push hash length: %d\n", hashmapForMessageLength()/*hashmap_length(hashMap)*/);
+	#endif
+
+	return result;
+}
+
+int sendDiagnosticsStatusNotificationRequest(char *status)
+{
+	mtrace();
+	int result = FAIL;
+	char message[110]={0};
+	char guid[37]={0};
+	char tempdata[65]={0};
+
+	//[ 2, "9f7bced1-b8b1-40ec-b3bb-2e15630e3cdc", "DiagnosticsStatusNotification", { "status": "Idle" } ]
+
+	DEBUG_INFO("sendDiagnosticsStatusNotificationRequest \n");
+	sprintf((char *)ShmOCPP16Data->DiagnosticsStatusNotification.Status,"%s",(const char *)status);
+	random_uuid(guid);
+
+	sprintf(message,"[%d,\"%s\",\"DiagnosticsStatusNotification\",{\"status\":\"%s\"}]",MESSAGE_TYPE_CALL, guid,status);
+	LWS_Send(message);
+
+	//memset(mapItem, 0, sizeof(data_struct_t));
+
+	// Put request guid to hash map
+	//sprintf(mapItem[0].key_string, "%s", guid);
+	sprintf(tempdata, "DiagnosticsStatusNotification,%d", 0);
+
+	if(hashmap_operation(0, guid, tempdata) == 1)//if(hashmap_operation(0,NULL/*hashMap*/, mapItem[0].key_string, mapItem[0].key_value/*mapItem*/, (void**)(&mapItem)/*(void**)(&mapItem)*/) ==  MAP_OK/*hashmap_put(hashMap, mapItem->key_string, mapItem) == MAP_OK*/)
+	{
+		result = PASS;
+		printf("DiagnosticsStatusNotification mapItem pass\n");
+	}
+
+	#ifdef SystemLogMessage
+	DEBUG_INFO(">>>>>DiagnosticsStatusNotification request\n");
+	DEBUG_INFO("Message: %s\n", SendBuffer);
+	//DEBUG_INFO("After push hash length: %d\n", hashmapForMessageLength()/*hashmap_length(hashMap)*/);
+	#endif
+
+	ShmOCPP16Data->SpMsg.bits.DiagnosticsStatusNotificationReq = 0;
+	ShmOCPP16Data->SpMsg.bits.DiagnosticsStatusNotificationConf = 0;
+
+	//record status
+	if(strcmp(status,"Idle")==0)
+	{
+		DiagnosticsStatusNotificationStatus = 0;
+	}
+	else if(strcmp(status,"Uploaded")==0)
+	{
+		DiagnosticsStatusNotificationStatus = 1;
+	}
+	else if(strcmp(status,"UploadFailed")==0)
+	{
+		DiagnosticsStatusNotificationStatus = 2;
+	}
+	else if(strcmp(status,"Uploading")==0)
+	{
+		DiagnosticsStatusNotificationStatus = 3;
+	}
+
+	return result;
+}
+
+int sendFirmwareStatusNotificationRequest(char *status)
+{
+	mtrace();
+	int result = FAIL;
+	char message[110]={0};
+	char guid[37]={0};
+	char tempdata[65]={0};
+
+//	[ 2, "eb841424-ae56-42b0-8c84-d5296018c33c", "FirmwareStatusNotification", { "status": "Downloaded" } ]
+
+	DEBUG_INFO("sendFirmwareStatusNotificationRequest \n");
+	sprintf((char *)ShmOCPP16Data->FirmwareStatusNotification.Status, "%s", (const char *)status);
+	random_uuid(guid);
+
+	sprintf(message,"[%d,\"%s\",\"FirmwareStatusNotification\",{\"status\":\"%s\"}]",MESSAGE_TYPE_CALL, guid, status);
+	LWS_Send(message);
+
+	//memset(mapItem, 0, sizeof(data_struct_t));
+	// Put request guid to hash map
+	//sprintf(mapItem[0].key_string, "%s", guid);
+	sprintf(tempdata, "FirmwareStatusNotification,%d", 0);
+
+	if(hashmap_operation(0, guid, tempdata) == 1)//if(hashmap_operation(0,NULL/*hashMap*/, mapItem[0].key_string, mapItem[0].key_value/*mapItem*/, (void**)(&mapItem)/*(void**)(&mapItem)*/) ==  MAP_OK/*hashmap_put(hashMap, mapItem->key_string, mapItem) == MAP_OK*/)
+	{
+		result = PASS;
+		DEBUG_INFO("FirmwareStatusNotification mapItem pass\n");
+	}
+
+	#ifdef SystemLogMessage
+	DEBUG_INFO(">>>>>FirmwareStatusNotification request\n");
+	DEBUG_INFO("Message: %s\n", SendBuffer);
+	//DEBUG_INFO("After push hash length: %d\n", hashmapForMessageLength()/*hashmap_length(hashMap)*/);
+	#endif
+
+	ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationReq = 0;
+	ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationConf = 0;
+
+	//record status
+	if(strcmp(status,"Downloaded")==0)
+	{
+		 FirmwareStatusNotificationStatus = 0;
+	}
+	else if(strcmp(status,"DownloadFailed")==0)
+	{
+		FirmwareStatusNotificationStatus = 1;
+	}
+	else if(strcmp(status,"Downloading")==0)
+	{
+		FirmwareStatusNotificationStatus = 2;
+	}
+	else if(strcmp(status,"Idle")==0)
+	{
+		FirmwareStatusNotificationStatus = 3;
+	}
+	else if(strcmp(status,"InstallationFailed")==0)
+	{
+		FirmwareStatusNotificationStatus = 4;
+	}
+	else if(strcmp(status,"Installing")==0)
+	{
+		FirmwareStatusNotificationStatus = 5;
+	}
+	else if(strcmp(status,"Installed")==0)
+	{
+		FirmwareStatusNotificationStatus = 6;
+	}
+
+
+	return result;
+}
+
+int sendHeartbeatRequest(int gun_index)
+{
+	mtrace();
+	int result = FAIL;
+
+	char message[80]={0};
+	char guid[37]={0};
+	char tempdata[65]={0};
+
+	random_uuid(guid);
+
+	sprintf(message, "[%d,\"%s\",\"Heartbeat\",{ }]"
+					, MESSAGE_TYPE_CALL
+					, guid );
+
+	LWS_Send(message);
+
+	//memset(mapItem, 0, sizeof(data_struct_t));
+
+	//sprintf(mapItem[0].key_string, "%s", guid);
+	sprintf(tempdata, "Heartbeat,%d", 0);
+
+	if(hashmap_operation(0, guid, tempdata) == 1)//if(hashmap_operation(0,NULL/*hashMap*/, guid, mapItem, tempdata/*(void**)(&mapItem)*/) ==  MAP_OK/*hashmap_put(hashMap, mapItem->key_string, mapItem) == MAP_OK*/)
+	{
+		result = PASS;
+		DEBUG_ERROR("Heartbeat mapItem pass\n");
+	}
+
+	#ifdef SystemLogMessage
+	DEBUG_INFO(">>>>>Heartbeat request\n");
+	DEBUG_INFO("Message: %s\n", SendBuffer);
+	//DEBUG_INFO("After push hash length: %d\n", hashmapForMessageLength()/*hashmap_length(hashMap)*/);
+	#endif
+
+	return result;
+}
+
+int sendStartTransactionRequest(int gun_index)
+{
+	mtrace();
+	int result = FAIL;
+	char message[250]={0};
+	char guid[37]={0};
+	struct timeval tmnow;
+	struct tm *tm;
+	char buf[30];//, usec_buf[6];
+	char tempdata[65]={0};
+
+	DEBUG_ERROR("sendStartTransactionRequest...");
+	gettimeofday(&tmnow, NULL);
+
+	time_t t;
+	t = time(NULL);
+	/*UTC time and date*/
+	tm = gmtime(&t);
+	strftime(buf,30,"%Y-%m-%dT%H:%M:%SZ", tm);
+#if 0 // remove temporally
+	strftime(buf,30,"%Y-%m-%dT%H:%M:%S", tm);
+	strcat(buf,".");
+	sprintf(usec_buf,"%dZ",(int)tmnow.tv_usec);
+	strcat(buf,usec_buf);
+#endif
+	printf("Start Charging Time :%s",buf);
+
+    // set value
+	memset(&ShmOCPP16Data->StartTransaction[gun_index], 0, sizeof(ShmOCPP16Data->StartTransaction[gun_index])); // Clear StartTransaction Value
+	ShmOCPP16Data->StartTransaction[gun_index].ConnectorId = gun_index +1 ; // gun start from 1~
+	strcpy((char *)ShmOCPP16Data->StartTransaction[gun_index].Timestamp, buf);
+	strcpy((char *)ShmOCPP16Data->StartTransaction[gun_index].IdTag, (const char *)ShmSysConfigAndInfo->SysConfig.UserId);
+
+	if(strstr((const char *)ShmSysConfigAndInfo->SysConfig.ModelName ,"DC") != NULL)
+	{
+		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)
+			{
+				ShmOCPP16Data->StartTransaction[gun_index].MeterStart = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedEnergy;
+				ShmOCPP16Data->StartTransaction[gun_index].ReservationId = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId;
+			}
+		}
+
+		for (int index = 0; index < CCS_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)
+			{
+				ShmOCPP16Data->StartTransaction[gun_index].MeterStart = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy;
+				ShmOCPP16Data->StartTransaction[gun_index].ReservationId = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ReservationId;
+			}
+		}
+
+		for (int index = 0; index < GB_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)
+			{
+				ShmOCPP16Data->StartTransaction[gun_index].MeterStart = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy;
+				ShmOCPP16Data->StartTransaction[gun_index].ReservationId = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ReservationId;
+			}
+		}
+
+	}
+	else
+	{
+		for (int index = 0; index < AC_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == gun_index)
+			{
+				ShmOCPP16Data->StartTransaction[gun_index].MeterStart = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargedEnergy;
+				ShmOCPP16Data->StartTransaction[gun_index].ReservationId = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].ReservationId;
+			}
+		}
+
+	}//END OF ELSE
+
+
+	random_uuid(guid);
+
+	sprintf(message, "[%d,\"%s\",\"StartTransaction\",{\"connectorId\":%d,\"idTag\":\"%s\",\"meterStart\":%d,\"reservationId\":%d,\"timestamp\":\"%s\"}]"
+					, MESSAGE_TYPE_CALL
+					, guid
+					, ShmOCPP16Data->StartTransaction[gun_index].ConnectorId
+					, ShmOCPP16Data->StartTransaction[gun_index].IdTag
+					, ShmOCPP16Data->StartTransaction[gun_index].MeterStart
+					, ShmOCPP16Data->StartTransaction[gun_index].ReservationId
+					, ShmOCPP16Data->StartTransaction[gun_index].Timestamp );
+
+	LWS_Send(message);
+
+	//memset(mapItem, 0, sizeof(data_struct_t));
+	// Put request guid to hash map
+	//sprintf(mapItem[0].key_string, "%s", guid);
+	sprintf(tempdata, "StartTransaction,%d", (gun_index));
+
+	if(hashmap_operation(0, guid, tempdata) == 1)//if(hashmap_operation(0,NULL/*hashMap*/, mapItem[0].key_string, mapItem[0].key_value/*mapItem*/, (void**)(&mapItem)/*(void**)(&mapItem)*/) ==  MAP_OK/*hashmap_put(hashMap, mapItem->key_string, mapItem) == MAP_OK*/)
+	{
+		result = PASS;
+	}
+	strcpy(queuedata, message);
+
+	queue_operation(4, guid, queuedata );//addq(guid, queuedata); ---> remove temporally
+	#ifdef SystemLogMessage
+	DEBUG_INFO(">>>>>StartTransaction request\n");
+	DEBUG_INFO("Message: %s\n", SendBuffer);
+	//DEBUG_INFO("After push hash length: %d\n", hashmapForMessageLength()/*hashmap_length(hashMap)*/);
+	#endif
+
+	return result;
+}
+
+int sendStatusNotificationRequest(int gun_index)
+{
+	mtrace();
+	int result = FAIL;
+
+	char message[600]={0};
+	char guid[37];
+	int currentStatus = 0;
+	struct timeval tmnow;
+	struct tm *tm;
+	char buf[30];//, usec_buf[6];
+	char tempdata[65]={0};
+
+	gettimeofday(&tmnow, NULL);
+
+	time_t t;
+	t = time(NULL);
+	/*UTC time and date*/
+	tm = gmtime(&t);
+	strftime(buf,30,"%Y-%m-%dT%H:%M:%SZ", tm);
+#if 0 // remove temporally
+	strftime(buf,30,"%Y-%m-%dT%H:%M:%S", tm);
+	strcat(buf,".");
+	sprintf(usec_buf,"%dZ",(int)tmnow.tv_usec);
+	strcat(buf,usec_buf);
+#endif
+	printf("%s",buf);
+
+	ShmOCPP16Data->StatusNotification[gun_index].ConnectorId = (gun_index + 1);
+
+	//strcpy(ShmOCPP16Data->StatusNotification[gun_index].ErrorCode, "NoError"); --- CSU Setting
+
+	// it's option
+	strcpy((char *)ShmOCPP16Data->StatusNotification[gun_index].Info, "");
+
+	/*
+	 enum _SYSTEM_STATUS
+{
+S_BOOTING               = 0,
+S_IDLE,                 = 1
+S_AUTHORIZING,          =2
+S_REASSIGN_CHECK,       =3
+S_REASSIGN,             =4
+S_PRECHARGE,            =5
+S_PREPARING_FOR_EV,     =6
+S_PREPARING_FOR_EVSE,   =7
+S_CHARGING,             =8
+S_TERMINATING,          =9
+S_COMPLETE,             =10
+S_ALARM,                =11
+S_FAULT                 =12
+}
+
+    */
+
+	//check Transaction active
+	if(strstr((const char *)ShmSysConfigAndInfo->SysConfig.ModelName ,"DC") != NULL)
+	{
+		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+		{
+			//printf("gun_index=%d\n",gun_index);
+			//printf("ShmSysConfigAndInfo->SysInfo.ChademoChargingData[0].SystemStatus=%d\n",ShmSysConfigAndInfo->SysInfo.ChademoChargingData[0].SystemStatus);
+			if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 1)) //S_IDLE
+			{
+				//strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, "Available");
+				currentStatus = 0; //OCPP Status
+			}
+			else if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 5)) //S_PRECHARGE
+			{
+				//strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, "Preparing");
+				currentStatus = 1; //OCPP Status
+			}
+			else if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 8)) //S_CHARGING
+			{
+				//strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, "Charging");
+				currentStatus = 2; //OCPP Status
+			}
+			else if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 10)) //S_COMPLETE
+			{
+				//strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, "Finishing");
+				currentStatus = 5; //OCPP Status
+			}
+			else if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 11)) //S_ALARM   ---> SuspendedEV
+			{
+				//strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, ChargePointStatusStr[SuspendedEV]);
+				currentStatus = 4; //OCPP Status
+			}
+			else if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 9)) //S_TERMINATING   ---> Unavailable
+			{
+				//strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, ChargePointStatusStr[SuspendedEV]);
+				currentStatus = 7; //OCPP Status: Unavailable
+			}
+			else if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 12)) //S_FAULT   ---> Faulted
+			{
+				//strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, ChargePointStatusStr[SuspendedEV]);
+				currentStatus = 8; //OCPP Status: Faulted
+			}
+			else if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 13)) //    ---> Reserved
+			{
+				//strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, ChargePointStatusStr[SuspendedEV]);
+				currentStatus = 6; //OCPP Status: Reserved
+			}
+
+		}//end of for CHAdeMO_QUANTITY
+
+		for (int index = 0; index < CCS_QUANTITY; index++)
+		{
+			//printf("ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].SystemStatus=%d\n",ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].SystemStatus);
+			if ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 1)) //S_IDLE
+			{
+				//strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, "Available");
+				currentStatus = 0; //OCPP Status
+			}
+			else if ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 5)) //S_PRECHARGE
+			{
+				//strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, "Preparing");
+				currentStatus = 1; //OCPP Status
+			}
+			else if ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 8)) //S_CHARGING
+			{
+				//strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, "Charging");
+				currentStatus = 2; //OCPP Status
+			}
+			else if ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 10)) //S_COMPLETE
+			{
+				//strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, "Finishing");
+				currentStatus = 5; //OCPP Status
+			}
+			else if ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 11)) //S_ALARM   ---> SuspendedEV
+			{
+				//strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, ChargePointStatusStr[SuspendedEV]);
+				currentStatus = 4; //OCPP Status
+			}
+			else if ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 9)) //S_TERMINATING   ---> Unavailable
+			{
+				//strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, ChargePointStatusStr[SuspendedEV]);
+				currentStatus = 7; //OCPP Status
+			}
+			else if ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 12)) //S_FAULT   ---> Faulted
+			{
+				//strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, ChargePointStatusStr[SuspendedEV]);
+				currentStatus = 8; //OCPP Status
+			}
+			else if ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 13)) //   ---> Reserved
+			{
+				//strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, ChargePointStatusStr[SuspendedEV]);
+				currentStatus = 6; //OCPP Status
+			}
+
+		}
+
+		for (int index = 0; index < GB_QUANTITY; index++)
+		{
+			//printf("ShmSysConfigAndInfo->SysInfo.GbChargingData[0].SystemStatus=%d\n",ShmSysConfigAndInfo->SysInfo.GbChargingData[0].SystemStatus);
+			if ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index) &&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 1)) //S_IDLE
+			{
+				//strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, "Available");
+				currentStatus = 0; //OCPP Status
+			}
+			else if ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index) &&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 5)) //S_PRECHARGE
+			{
+				//strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, "Preparing");
+				currentStatus = 1; //OCPP Status
+			}
+			else if ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 8)) //S_CHARGING
+			{
+				//strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, "Charging");
+				currentStatus = 2; //OCPP Status
+			}
+			else if ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 8)) //S_COMPLETE
+			{
+				//	strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, "Finishing");
+				currentStatus = 5; //OCPP Status
+			}
+			else if ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 11)) //S_ALARM   ---> SuspendedEV
+			{
+				//strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, ChargePointStatusStr[SuspendedEV]);
+				currentStatus = 4; //OCPP Status
+			}
+			else if ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 9)) //S_TERMINATING   ---> Unavailable
+			{
+				//strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, ChargePointStatusStr[SuspendedEV]);
+				currentStatus = 7; //OCPP Status: Unavailable
+			}
+			else if ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 12)) //S_FAULT   ---> Faulted
+			{
+				//strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, ChargePointStatusStr[SuspendedEV]);
+				currentStatus = 8; //OCPP Status: Faulted
+			}
+			else if ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 13)) //   ---> Reserved
+			{
+				//strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, ChargePointStatusStr[SuspendedEV]);
+				currentStatus = 6; //OCPP Status: Faulted
+			}
+		}
+
+	}
+	else
+	{
+		for (int index = 0; index < AC_QUANTITY; index++)
+		{
+			//printf("gun_index=%d\n",gun_index);
+			//printf("ShmSysConfigAndInfo->SysInfo.ChademoChargingData[0].SystemStatus=%d\n",ShmSysConfigAndInfo->SysInfo.ChademoChargingData[0].SystemStatus);
+			if ((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == 1)) //S_IDLE
+			{
+				//strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, "Available");
+				currentStatus = 0; //OCPP Status
+			}
+			else if ((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == 5)) //S_PRECHARGE
+			{
+				//strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, "Preparing");
+				currentStatus = 1; //OCPP Status
+			}
+			else if ((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == 8)) //S_CHARGING
+			{
+				//strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, "Charging");
+				currentStatus = 2; //OCPP Status
+			}
+			else if ((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == 10)) //S_COMPLETE
+			{
+				//strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, "Finishing");
+				currentStatus = 5; //OCPP Status
+			}
+			else if ((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == 11)) //S_ALARM   ---> SuspendedEV
+			{
+				//strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, ChargePointStatusStr[SuspendedEV]);
+				currentStatus = 4; //OCPP Status
+			}
+			else if ((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == 9)) //S_TERMINATING   ---> Unavailable
+			{
+				//strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, ChargePointStatusStr[SuspendedEV]);
+				currentStatus = 7; //OCPP Status: Unavailable
+			}
+			else if ((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == 12)) //S_FAULT   ---> Faulted
+			{
+				//strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, ChargePointStatusStr[SuspendedEV]);
+				currentStatus = 8; //OCPP Status: Faulted
+			}
+			else if ((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == 13)) //    ---> Reserved
+			{
+				//strcpy(ShmOCPP16Data->StatusNotification[gun_index].Status, ChargePointStatusStr[SuspendedEV]);
+				currentStatus = 6; //OCPP Status: Reserved
+			}
+
+		}//end of for AC_QUANTITY
+
+
+	}//END OF ELSE
+
+
+	//it's option
+	strcpy((char *)ShmOCPP16Data->StatusNotification[gun_index].Timestamp, buf);
+	strcpy((char *)ShmOCPP16Data->StatusNotification[gun_index].VendorId, "PhihongTechnology");
+	strcpy((char *)ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode, "000000");
+	strcpy((char *)ShmOCPP16Data->StatusNotification[gun_index].Status, ChargePointStatusStr[currentStatus]);
+
+	random_uuid(guid);
+
+	sprintf(message, "[%d,\"%s\",\"StatusNotification\",{\"connectorId\":%d,\"errorCode\":\"%s\",\"info\":\"%s\",\"status\":\"%s\",\"timestamp\":\"%s\",\"vendorId\":\"%s\",\"vendorErrorCode\":\"%s\"}]"
+					, MESSAGE_TYPE_CALL
+					, guid
+					, ShmOCPP16Data->StatusNotification[gun_index].ConnectorId
+					, ShmOCPP16Data->StatusNotification[gun_index].ErrorCode
+					, ShmOCPP16Data->StatusNotification[gun_index].Info
+					, ShmOCPP16Data->StatusNotification[gun_index].Status
+					, ShmOCPP16Data->StatusNotification[gun_index].Timestamp
+					, ShmOCPP16Data->StatusNotification[gun_index].VendorId
+					, ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode);
+
+	LWS_Send(message);
+
+	// Put request guid to hash map
+	//memset(mapItem, 0, sizeof(data_struct_t));
+
+	//sprintf(mapItem[0].key_string, "%s", guid);
+	sprintf(tempdata, "StatusNotification,%d", (gun_index));
+	//sprintf(mapItem->key_value, "StatusNotification,%d", gun_index + 1);
+
+	if(hashmap_operation(0, guid, tempdata) == 1)//if(hashmap_operation(0,NULL/*hashMap*/, guid, mapItem, tempdata/*(void**)(&mapItem)*//*(void**)(&mapItem)*/) ==  MAP_OK/*hashmap_put(hashMap, mapItem->key_string, mapItem) == MAP_OK*/)
+	{
+		DEBUG_ERROR("statusNotification mapitem pass");
+		result = PASS;
+	}
+
+	#ifdef SystemLogMessage
+	DEBUG_INFO(">>>>>StatusNotification request\n");
+	DEBUG_INFO("Message: %s\n", SendBuffer);
+	//DEBUG_INFO("After push hash length: %d\n", hashmapForMessageLength()/*hashmap_length(hashMap)*/);
+	#endif
+
+	return result;
+}
+
+int sendStopTransactionRequest(int gun_index)
+{
+	mtrace();
+	int result = FAIL;
+	char message[700]={0};
+	char guid[37]={0};
+	char tempdata[65]={0};
+	int idx_sample=0;
+
+	DEBUG_ERROR("sendStopTransactionRequest \n");
+
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].IdTag, (const char *)ShmSysConfigAndInfo->SysConfig.UserId/*ShmOCPP16Data->Authorize.IdTag*/);
+
+	//ENERGY_ACTIVE_IMPORT_REGISTER
+	if(strstr((const char *)ShmSysConfigAndInfo->SysConfig.ModelName ,"DC") != NULL)
+	{
+		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)
+			{
+				ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedEnergy;
+				//Check Status
+				if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 11) // S_ALARM (Temporally for SuspendedEV )
+				{
+					strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, StopTransactionReasonStr[EVDisconnected]); //
+				}
+
+				//sprintf(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%s" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedEnergy );
+		    }
+		}// END OF CHAdeMO_QUANTITY
+
+		for (int index = 0; index < CCS_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)
+			{
+				//for test
+				//ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy = 100.0;
+
+				ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy;
+
+				//Check Status
+				if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 11) // S_ALARM (Temporally for SuspendedEV )
+				{
+					strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, StopTransactionReasonStr[EVDisconnected]); //
+				}
+				else
+				{
+					strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, StopTransactionReasonStr[Local]); //
+				}
+
+				//sprintf(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%s" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy );
+			}
+		}// END OF CCS_QUANTITY
+
+		for (int index = 0; index < GB_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)
+			{
+				// for test
+				//ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy = 100.0;
+
+				ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy;
+
+				//Check Status
+				if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 11) // S_ALARM (Temporally for SuspendedEV )
+				{
+					strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, StopTransactionReasonStr[EVDisconnected]); //
+				}
+				else
+				{
+					strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, StopTransactionReasonStr[Local]); //
+				}
+
+				//sprintf(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy);
+			}
+		}// END OF GB_QUANTITY
+
+	}
+	else
+	{
+		for (int index = 0; index < AC_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == gun_index)
+			{
+				ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargedEnergy;
+				//Check Status
+				if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == 11) // S_ALARM (Temporally for SuspendedEV )
+				{
+					strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, StopTransactionReasonStr[EVDisconnected]); //
+				}
+
+				//sprintf(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%s" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedEnergy );
+			}
+		}// END OF AC_QUANTITY
+
+
+	}//END OF ELSE
+
+
+	//printf("sendStopTransactionRequest 1\n");
+	//Stop Transaction Time
+	struct timeval tmnow;
+	struct tm *tm;
+	char buf[30];//, usec_buf[6];
+	gettimeofday(&tmnow, NULL);
+
+	time_t t;
+	t = time(NULL);
+	/*UTC time and date*/
+	tm = gmtime(&t);
+	strftime(buf,30,"%Y-%m-%dT%H:%M:%SZ", tm);
+#if 0 // remove temporally
+	strftime(buf,30,"%Y-%m-%dT%H:%M:%S", tm);
+	strcat(buf,".");
+	sprintf(usec_buf,"%dZ",(int)tmnow.tv_usec);
+	strcat(buf,usec_buf);
+#endif
+	printf("StopTransaction Time %s\n",buf);
+
+	//strcpy(ShmOCPP16Data->StopTransaction[gun_index].Timestamp,"2019-05-04T18:15:33Z");
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].Timestamp,buf);
+	ShmOCPP16Data->StopTransaction[gun_index].TransactionId = ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId;
+
+
+	random_uuid(guid);
+	sprintf(message,"[%d,\"%s\",\"StopTransaction\",{\"idTag\":\"%s\",\"meterStop\":%d,\"timestamp\":\"%s\",\"transactionId\":%d,\"reason\":\"%s\",\"transactionData\":"
+				,MESSAGE_TYPE_CALL
+				,guid
+				,ShmOCPP16Data->StopTransaction[gun_index].IdTag
+				,ShmOCPP16Data->StopTransaction[gun_index].MeterStop
+				,ShmOCPP16Data->StopTransaction[gun_index].Timestamp
+				,ShmOCPP16Data->StopTransaction[gun_index].TransactionId
+				,ShmOCPP16Data->StopTransaction[gun_index].StopReason);
+
+	//printf("sendStopTransactionRequest 2\n");
+	/***********************************transactionData******************************************************/
+	ShmOCPP16Data->StopTransaction[gun_index].TransactionData  = (struct StructMeterValue *)malloc(sizeof(struct StructMeterValue));
+	ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue = (struct StructSampledValue *)malloc(sizeof(struct StructSampledValue)*3);
+
+	for(int idx_transaction=0;idx_transaction<1;idx_transaction++)
+	{
+		//transactionData = json_object_new_object();
+		//json_object_object_add(transactionData, "timestamp", json_object_new_string("2019-05-04T18:15:33Z"));
+
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].TimeStamp, buf/*"2019-05-04T18:15:33Z"*/);
+		sprintf(message + strlen(message), "[{\"timestamp\":\"%s\",\"sampledValue\":[", (const char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].TimeStamp);
+
+		//Transaction_Begin
+		idx_sample=0;
+		sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Value, "%.1f",(float)(ShmOCPP16Data->StartTransaction[gun_index].MeterStart));
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Context,ReadingContextStr[ReadingContext_Transaction_Begin]);
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Format,ValueFormatStr[Raw]);
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Measurand,MeasurandStr[Energy_Reactive_Export_Register]);
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Phase,PhaseStr[L1_N]);
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Location,LocationStr[Location_Outlet]);
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Unit,UnitOfMeasureStr[UnitOfMeasure_Wh/*UnitOfMeasure_kWh*/]);
+
+		sprintf(message + strlen(message), "{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\" }",
+				ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Value,
+				ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Context,
+				ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Format,
+				ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Measurand,
+				ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Phase,
+				ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Location,
+				ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Unit
+				);
+
+		//Transaction_End
+		idx_sample=1;
+		if(strstr((const char *)ShmSysConfigAndInfo->SysConfig.ModelName ,"DC") != NULL)
+		{
+			for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)
+				{
+					sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedEnergy );
+				}
+			}
+
+			for (int index = 0; index < CCS_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)
+				{
+					sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy );
+				}
+			}
+
+			for (int index = 0; index < GB_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)
+				{
+					sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy );
+				}
+			}
+
+		}
+		else
+		{
+			for (int index = 0; index < AC_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == gun_index)
+				{
+					sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargedEnergy );
+				}
+			}
+
+		}// END FOR AC ELSE
+
+
+
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Context,ReadingContextStr[ReadingContext_Transaction_End]);
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Format,ValueFormatStr[Raw]);
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Measurand,MeasurandStr[Energy_Reactive_Export_Register]);
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Phase,PhaseStr[L1_N]);
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Location,LocationStr[Location_Outlet]);
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Unit,UnitOfMeasureStr[UnitOfMeasure_Wh/*UnitOfMeasure_kWh*/]);
+		sprintf(message + strlen(message), ",{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\" }",
+				ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Value,
+				ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Context,
+				ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Format,
+				ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Measurand,
+				ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Phase,
+				ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Location,
+				ShmOCPP16Data->StopTransaction[gun_index].TransactionData[idx_transaction].SampledValue[idx_sample].Unit
+				);
+
+
+		sprintf(message + strlen(message)," ] } ] } ]");
+
+		free(ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue);
+		free(ShmOCPP16Data->StopTransaction[gun_index].TransactionData);
+	}
+
+	LWS_Send(message);
+
+	//memset(mapItem, 0, sizeof(data_struct_t));
+
+	// Put request guid to hash map
+	//sprintf(mapItem[0].key_string, "%s", guid);
+	sprintf(tempdata, "StopTransaction,%d", (gun_index));
+	//sprintf(mapItem->key_value, senstr);//sprintf(mapItem->key_value, "StopTransaction");
+	if(hashmap_operation(0, guid, tempdata) == 1)//if(hashmap_operation(0,NULL/*hashMap*/, mapItem[0].key_string, mapItem[0].key_value/*mapItem*/, (void**)(&mapItem)/*(void**)(&mapItem)*/) ==  MAP_OK/*hashmap_put(hashMap, mapItem->key_string, mapItem) == MAP_OK*/)
+	{
+		result = PASS;
+		DEBUG_INFO("StopTransaction mapitem pass\n");
+	}
+
+	strcpy(queuedata, message);
+	queue_operation(4, guid, queuedata );//addq(guid, queuedata); ---> remove temporally
+
+	//addq(guid, (char*)json_object_to_json_string(message));
+	#ifdef SystemLogMessage
+	DEBUG_INFO(">>>>>StopTransaction request\n");
+	DEBUG_INFO("Message: %s\n", SendBuffer);
+	//DEBUG_INFO("After push hash length: %d\n", hashmapForMessageLength()/*hashmap_length(hashMap)*/);
+	#endif
+
+	//for test
+	ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq = 0;
+
+	return result;
+}
+
+int sendMeterValuesRequest(int gun_index)
+{
+	mtrace();
+	int result = FAIL;
+	char message[1500]={0};
+	char guid[37]={0};
+	int idx_sample=0;
+	//int length = 0;
+	char tempdata[65]={0};
+
+	DEBUG_ERROR("sendMeterValuesRequest ...\n");
+
+	if((ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId == 0)&&(ShmOCPP16Data->CsMsg.bits[gun_index].TriggerMessageReq == 0)) // no TransactionId
+		return result;
+
+	if(ShmOCPP16Data->CsMsg.bits[gun_index].TriggerMessageReq == 1)
+	{
+		ShmOCPP16Data->CsMsg.bits[gun_index].TriggerMessageReq = 0;
+	}
+
+	//set value
+	ShmOCPP16Data->MeterValues[gun_index].ConnectorId = gun_index + 1; // gun start from 1~
+	ShmOCPP16Data->MeterValues[gun_index].TransactionId = ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId;
+
+	random_uuid(guid);
+	sprintf(message,"[%d,\"%s\",\"MeterValues\",{\"connectorId\":%d,\"transactionId\":%d,\"meterValue\":"
+			,MESSAGE_TYPE_CALL
+			,guid
+			,ShmOCPP16Data->MeterValues[gun_index].ConnectorId
+			,ShmOCPP16Data->MeterValues[gun_index].TransactionId);
+			//,comfirmpayload);
+
+
+	for(int idx_transaction=0;idx_transaction<1;idx_transaction++)
+	{
+		//allocate memory space
+		ShmOCPP16Data->MeterValues[gun_index].MeterValue = (struct StructMeterValue *)malloc(sizeof(struct StructMeterValue));
+
+		//UTC Date time
+		struct timeval tmnow;
+		struct tm *tm;
+		char buf[30];//, usec_buf[6];
+		gettimeofday(&tmnow, NULL);
+
+		time_t t;
+		t = time(NULL);
+		/*UTC time and date*/
+		tm = gmtime(&t);
+		strftime(buf,30,"%Y-%m-%dT%H:%M:%SZ", tm);
+#if 0 // remove temporally
+		strftime(buf,30,"%Y-%m-%dT%H:%M:%S", tm);
+		strcat(buf,".");
+		sprintf(usec_buf,"%dZ",(int)tmnow.tv_usec);
+		strcat(buf,usec_buf);
+#endif
+	//	printf("%s",buf);
+
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].TimeStamp, buf);
+
+		//allocate memory space
+		ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue = (struct StructSampledValue *)malloc(sizeof(struct StructSampledValue)*6);
+		sprintf(message + strlen(message),"[{\"timestamp\":\"%s\",\"sampledValue\":[",(const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].TimeStamp);
+
+		idx_sample=0;
+		/********************************(1)Current.Export************************************************/
+		if(strstr((const char *)ShmSysConfigAndInfo->SysConfig.ModelName ,"DC") != NULL)
+		{
+			for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)
+				{
+					sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingCurrent );
+				}
+			}
+
+			for (int index = 0; index < CCS_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)
+				{
+					sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingCurrent );
+				}
+			}
+
+			for (int index = 0; index < GB_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)
+				{
+					sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingCurrent );
+				}
+			}
+
+		}
+		else
+		{
+			for (int index = 0; index < AC_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == gun_index)
+				{
+					sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingCurrent );
+				}
+			}
+
+		}// END FOR AC ELSE
+
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Context, ReadingContextStr[ReadingContext_Sample_Periodic]);
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Format, ValueFormatStr[Raw]);
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Measurand, MeasurandStr[Current_Export]);
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Phase, PhaseStr[L1_N]);
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Location, LocationStr[Location_Outlet]);
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Unit,UnitOfMeasureStr[UnitOfMeasure_A]);
+
+		sprintf(message + strlen(message),"{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},",
+				ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value,
+				ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Context,
+				ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Format,
+				ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Measurand,
+				ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Phase,
+				ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Location,
+				ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Unit
+		);
+
+		idx_sample=1;
+		/****************************************************(2)Energy.Active.Export.Register*********************************************/
+		if(strstr((const char *)ShmSysConfigAndInfo->SysConfig.ModelName ,"DC") != NULL)
+		{
+			for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)
+				{
+					sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedEnergy );
+				}
+			}
+
+			for (int index = 0; index < CCS_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)
+				{
+					sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy );
+				}
+			}
+
+			for (int index = 0; index < GB_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)
+				{
+					//ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy = 100.0;
+					sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy);
+				}
+			}
+
+		}
+		else
+		{
+			for (int index = 0; index < AC_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == gun_index)
+				{
+					sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargedEnergy );
+				}
+			}
+
+		}// END FOR AC ELSE
+
+
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Context, ReadingContextStr[ReadingContext_Sample_Periodic]);
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Format, ValueFormatStr[Raw]);
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Measurand, MeasurandStr[Energy_Active_Export_Register]);
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Phase, PhaseStr[L1]);
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Location, LocationStr[Location_Outlet]);
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Unit,UnitOfMeasureStr[UnitOfMeasure_kWh]);
+
+		sprintf(message + strlen(message),"{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},",
+				ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value,
+				ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Context,
+				ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Format,
+				ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Measurand,
+				ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Phase,
+				ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Location,
+				ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Unit
+		);
+
+
+    	idx_sample=2;
+    	/****************************************************(3)Energy.Active.Export.Interval*********************************************/
+    	if(strstr((const char *)ShmSysConfigAndInfo->SysConfig.ModelName ,"DC") != NULL)
+    	{
+    		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+    	    {
+    			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)
+    	    	{
+    	      		sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedEnergy );
+    	    	}
+    	    }
+
+    	    for (int index = 0; index < CCS_QUANTITY; index++)
+    	    {
+    	    	//	printf("ShmSysConfigAndInfo->SysInfo.CcsChargingData[%d].Index=%d\n",index, ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index );
+    	    	if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)
+    	    	{
+    	    		//ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy = 100.0;
+    	    		sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy );
+    	    	}
+    	    }
+
+    	    for (int index = 0; index < GB_QUANTITY; index++)
+    	    {
+    	        if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)
+    	    	{
+    	       		sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy);
+    	    	}
+    	    }
+    	}
+    	else
+    	{
+    		for (int index = 0; index < AC_QUANTITY; index++)
+    	    {
+    	    	if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == gun_index)
+    	    	{
+    	    	   sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargedEnergy );
+    	    	}
+    	    }
+
+    	}//END FOR AC ELSE
+
+
+    	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Context, ReadingContextStr[ReadingContext_Sample_Periodic]);
+    	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Format, ValueFormatStr[Raw]);
+    	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Measurand, MeasurandStr[Energy_Active_Export_Interval]);
+    	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Phase, PhaseStr[L1]);
+    	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Location, LocationStr[Location_Outlet]);
+    	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Unit,UnitOfMeasureStr[UnitOfMeasure_kWh]);
+
+    	sprintf(message + strlen(message),"{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},",
+    			ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value,
+    			ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Context,
+    			ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Format,
+    			ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Measurand,
+    			ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Phase,
+    			ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Location,
+    			ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Unit
+    	);
+
+    	idx_sample=3;
+		/********************************(4)Power.Active.Export************************************************/
+    	if(strstr((const char *)ShmSysConfigAndInfo->SysConfig.ModelName ,"DC") != NULL)
+    	{
+    		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+    		{
+    			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)
+    			{
+    				sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%.1f" , ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingPower);
+    			}
+    		}
+
+    		for (int index = 0; index < CCS_QUANTITY; index++)
+    		{
+    			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)
+    			{
+    				sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%.1f" , ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingPower);
+    			}
+    		}
+
+    		for (int index = 0; index < GB_QUANTITY; index++)
+    		{
+    			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)
+    			{
+    				//ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingPower = 100.0;
+    				sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%.1f" , ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingPower);
+    			}
+    		}
+    	}
+    	else
+    	{
+    		for (int index = 0; index < AC_QUANTITY; index++)
+    		{
+    		   if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == gun_index)
+    		   {
+    			   sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%.1f" , ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingPower);
+    		   }
+    		}
+
+    	}// END FOR AC ELSE
+
+
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Context, ReadingContextStr[ReadingContext_Sample_Periodic]);
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Format, ValueFormatStr[Raw]);
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Measurand, MeasurandStr[Power_Active_Export]);
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Phase, PhaseStr[L1_N]);
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Location, LocationStr[Location_Outlet]);
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Unit,UnitOfMeasureStr[UnitOfMeasure_kW]);
+
+		sprintf(message + strlen(message),"{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},",
+				ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value,
+				ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Context,
+				ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Format,
+				ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Measurand,
+				ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Phase,
+				ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Location,
+				ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Unit
+		);
+
+		idx_sample=4;
+		/***********************************************(5)VOLTAGE******************************************************/
+		if(strstr((const char *)ShmSysConfigAndInfo->SysConfig.ModelName ,"DC") != NULL)
+		{
+			for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)
+				{
+					sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingVoltage );
+				}
+			}
+
+			for (int index = 0; index < CCS_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)
+				{
+					sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingVoltage );
+				}
+			}
+
+			for (int index = 0; index < GB_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)
+				{
+					sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingVoltage );
+				}
+			}
+		}
+		else
+		{
+			for (int index = 0; index < AC_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == gun_index)
+				{
+					sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingVoltage );
+				}
+			}
+		}//END FOR AC ELSE
+
+
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Context, ReadingContextStr[ReadingContext_Sample_Periodic]);
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Format, ValueFormatStr[Raw]);
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Measurand, MeasurandStr[Voltage]);
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Phase, PhaseStr[L1_N]);
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Location, LocationStr[Location_Outlet]);
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Unit,UnitOfMeasureStr[UnitOfMeasure_V]);
+
+		sprintf(message + strlen(message),"{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"}",
+			ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value,
+			ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Context,
+			ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Format,
+			ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Measurand,
+			ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Phase,
+			ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Location,
+			ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Unit
+		);
+
+		if(strstr((const char *)ShmSysConfigAndInfo->SysConfig.ModelName ,"DC") != NULL)
+		{
+			idx_sample=5;
+			//sampledValue = NULL;
+			/***********************************************(6)SOC******************************************************/
+			if(strstr((const char *)ShmSysConfigAndInfo->SysConfig.ModelName ,"DC") != NULL)
+			{
+				for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+				{
+					if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)
+					{
+						sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].EvBatterySoc );
+					}
+				}
+
+				for (int index = 0; index < CCS_QUANTITY; index++)
+				{
+					if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)
+					{
+						sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].EvBatterySoc );
+					}
+				}
+
+				for (int index = 0; index < GB_QUANTITY; index++)
+				{
+					if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)
+					{
+						sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].EvBatterySoc );
+					}
+				}
+			}
+			else
+			{
+				for (int index = 0; index < AC_QUANTITY; index++)
+				{
+					if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)
+					{
+						sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].EvBatterySoc );
+					}
+				}
+
+			}//END FOR AC ELSE
+
+
+			strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Context, ReadingContextStr[ReadingContext_Sample_Periodic]);
+			strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Format, ValueFormatStr[Raw]);
+			strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Measurand, MeasurandStr[SoC]);
+			strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Phase, PhaseStr[L1_N]);
+			strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Location, LocationStr[Location_Outlet]);
+			strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Unit,UnitOfMeasureStr[UnitOfMeasure_Percent]);
+
+
+			sprintf(message + strlen(message),",{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"}",
+				ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Value,
+				ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Context,
+				ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Format,
+				ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Measurand,
+				ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Phase,
+				ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Location,
+				ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue[idx_sample].Unit
+			);
+
+		}
+
+		//}
+
+		sprintf(message + strlen(message)," ] } ] } ]");
+
+		free(ShmOCPP16Data->MeterValues[gun_index].MeterValue[idx_transaction].SampledValue);
+	}
+
+	LWS_Send(message);
+
+	//memset(mapItem, 0, sizeof(data_struct_t));
+
+	// Put request guid to hash map
+	//sprintf(mapItem[0].key_string, "%s", guid);
+	sprintf(tempdata, "MeterValues,%d", (gun_index));
+	if(hashmap_operation(0, guid, tempdata) == 1)//if(hashmap_operation(0,NULL/*hashMap*/, mapItem[0].key_string, mapItem[0].key_value/*mapItem*/, (void**)(&mapItem)/*(void**)(&mapItem)*/) ==  MAP_OK/*hashmap_put(hashMap, mapItem->key_string, mapItem) == MAP_OK*/)
+	{
+		result = PASS;
+		DEBUG_INFO("MeterValues mapitem pass\n");
+	}
+
+
+	strcpy(queuedata, message);
+	queue_operation(4, guid, queuedata );//addq(guid, queuedata);  ---> remove temporally
+
+	#ifdef SystemLogMessage
+	DEBUG_INFO(">>>>>MeerValues request\n");
+	DEBUG_INFO("Message: %s\n", SendBuffer);
+	//DEBUG_INFO("After push hash length: %d\n", hashmapForMessageLength()/*hashmap_length(hashMap)*/);
+	#endif
+
+	return result;
+
+}
+
+
+//==========================================
+// send confirm routine
+//==========================================
+int sendCancelReservationConfirmation(char *uuid,char *payload)
+{
+	mtrace();
+	int result = FAIL;
+	char message[100]={0};
+
+	DEBUG_ERROR("handle sendCancelReservationConfirmation\n");
+	sprintf(message,"[%d,\"%s\",{\"status\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT,uuid, payload);
+	LWS_Send(message);
+	result = TRUE;
+	ShmOCPP16Data->CsMsg.bits[0].CancelReservationConf = 0;
+	return result;
+}
+
+int sendChangeAvailabilityConfirmation(char *uuid,char *payload)
+{
+	mtrace();
+	int result = FAIL;
+	char message[100]={0};
+	DEBUG_ERROR("handle sendChangeAvailabilityConfirmation\n");
+	sprintf(message,"[%d,\"%s\",{\"status\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT,uuid, payload);
+	LWS_Send(message);
+	result = TRUE;
+
+	return result;
+}
+
+int sendChangeConfigurationConfirmation(char *uuid,char *payload)
+{
+	mtrace();
+	int result = FAIL;
+	char message[100]={0};
+
+	DEBUG_ERROR("handle sendChangeConfigurationConfirmation\n");
+	sprintf(message,"[%d,\"%s\",{\"status\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT,uuid, payload);
+	LWS_Send(message);
+	result = TRUE;
+
+	return result;
+}
+
+int sendClearCacheConfirmation(char *uuid,char *payload)
+{
+	mtrace();
+	int result = FAIL;
+    char message[500]={0};
+	//	int count = 0;
+	//	int gun_index = 0;
+	//	char guid[37];
+	//	[ 3, "1570592744204", { "status": "Accepted" } ]
+    DEBUG_ERROR("sendClearCacheConfirmation\n");
+    sprintf(message,"[ %d,\"%s\",{\"%s\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT, uuid, "status", payload);
+	LWS_Send(message);
+
+	return result;
+}
+
+int sendClearChargingProfileConfirmation(char *uuid,char *payload)
+{
+	mtrace();
+	int result = FAIL;
+
+	char message[500]={0};
+//	[ 3, "1571284268200", { "status": "Unknown" } ]
+	DEBUG_ERROR("sendClearChargingProfileConfirmation\n");
+	sprintf(message,"[ %d,\"%s\",{\"%s\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT, uuid, "status", payload);
+	LWS_Send(message);
+
+	return result;
+}
+
+int sendDataTransferConfirmation(char *uuid,char *payload)
+{
+	mtrace();
+	char statusStr[20]={0};
+	char dataStr[10]={0};
+	char sstr[20]={0};
+	int c = 0;
+	char *loc;
+	int result = FAIL;
+
+// [3,"792bc950-b279-49e3-ab8f-429e02a2f9a7",{"status":"Accepted","data":"True"}]
+
+	DEBUG_ERROR("sendDataTransferConfirmation ...\n");
+	/**********************status**************************/
+    loc = strstr(payload, "status");
+	memset(sstr ,0, sizeof(sstr) );
+	c = 0;
+	while (loc[3+strlen("status")+c] != '\"')
+	{
+		sstr[c] = loc[3+strlen("status")+c];
+		c++;
+	}
+	sstr[c] = '\0';
+	strcpy(statusStr, sstr);
+
+
+	/**********************data**************************/
+	loc = strstr(payload, "data");
+	memset(sstr ,0, sizeof(sstr) );
+	c = 0;
+	while (loc[3+strlen("data")+c] != '\"')
+	{
+		sstr[c] = loc[3+strlen("data")+c];
+		c++;
+	}
+	sstr[c] = '\0';
+	strcpy(dataStr, sstr);
+
+	return result;
+}
+
+int sendGetCompositeScheduleConfirmation(char *uuid,char *payload, int connectorIdInt,int nPeriod)
+{
+	mtrace();
+	int result = FAIL;
+	char message[1000]={0};
+	double diff_f = 0.0;
+	int diff_i = 0;
+	struct tm tp;
+
+	DEBUG_ERROR("handle sendGetCompositeScheduleConfirmation ...\n");
+
+
+  	strptime((const char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingSchedule.StartSchedule, "%Y-%m-%dT%H:%M:%S", &tp);
+	tp.tm_isdst = -1;
+	time_t utc = mktime(&tp);
+	time_t t = time(NULL);
+	diff_f = difftime(t, utc);
+	diff_i = (int)diff_f;
+	DEBUG_INFO("\n diff_f=%f \n",diff_f);
+
+
+#if 0 //remove temporally
+	sprintf(message,"[%d,\"%s\",{\"status\":\"%s\",\"connectorId\":%d,\"scheduleStart\":\"%s\",\"chargingSchedule\":{\"duration\":%d,\"startSchedule\":\"%s\",\"chargingRateUnit\":\"%s\",\"chargingSchedulePeriod\":[{\"startPeriod\":0,\"limit\":6.0,\"numberPhases\":3},{\"startPeriod\":40,\"limit\":10.0,\"numberPhases\":3},{\"startPeriod\":100,\"limit\":8.0,\"numberPhases\":3}"
+				,MESSAGE_TYPE_CALLRESULT
+				,uuid
+				,payload
+				,connectorIdInt
+				,ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.StartSchedule
+				,ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.Duration
+				,ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.StartSchedule
+				,ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingRateUnit);
+#endif
+
+	if(nPeriod == 0)
+	{
+		sprintf(message,"[%d,\"%s\",{\"status\":\"%s\",\"connectorId\":%d,\"scheduleStart\":\"%s\"}]"
+									,MESSAGE_TYPE_CALLRESULT
+									,uuid
+									,payload
+									,connectorIdInt
+									,ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.StartSchedule);
+	}
+	else
+	{
+		sprintf(message,"[%d,\"%s\",{\"status\":\"%s\",\"connectorId\":%d,\"scheduleStart\":\"%s\",\"chargingSchedule\":{\"duration\":%d,\"startSchedule\":\"%s\",\"chargingRateUnit\":\"%s\",\"chargingSchedulePeriod\":["
+							,MESSAGE_TYPE_CALLRESULT
+							,uuid
+							,payload
+							,connectorIdInt
+							,ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.StartSchedule
+							,ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.Duration
+							,ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.StartSchedule
+							,ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingRateUnit);
+
+
+			//int len = nPeriod;//sizeof(ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod)/sizeof(ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[0]);
+
+
+		#if 1 // remove temporally
+			int len = nPeriod;//sizeof(ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod)/sizeof(ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[0]);
+
+			for(int idx_sample=0;idx_sample< len;idx_sample++)
+			{
+
+				if (idx_sample == 0)
+				{
+					sprintf(message + strlen(message), "{\"startPeriod\":%d,\"limit\":%.1f,\"numberPhases\":%d}"
+							, ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[idx_sample].StartPeriod
+							, ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[idx_sample].Limit
+							, ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[idx_sample].NumberPhases );
+				}
+				else
+				{
+					sprintf(message + strlen(message), ",{\"startPeriod\":%d,\"limit\":%.1f,\"numberPhases\":%d}"
+							, (ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[idx_sample].StartPeriod - diff_i /*-1*/)
+							, ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[idx_sample].Limit
+							, ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[idx_sample].NumberPhases );
+				}
+
+			}
+		#endif
+
+
+		sprintf(message + strlen(message), "]}}]");
+
+
+	}
+
+	LWS_Send(message);
+
+	result = TRUE;
+	return result;
+}
+
+int sendGetConfigurationConfirmation(char *uuid)
+{
+	mtrace();
+	int result = FAIL;
+	int MaxKeySupported = 0;
+	int sentConfigurationNumber= 0;
+	int sentunConfigurationNumber= 0;
+	char message[4000]={0};
+
+	DEBUG_ERROR("handle sendGetConfigurationConfirmation ...\n");
+
+	MaxKeySupported = atoi((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemData);
+
+	sprintf(message,"[%d,\"%s\",{\"configurationKey\":[ "
+			,MESSAGE_TYPE_CALLRESULT
+			,uuid );
+
+	 //configuration key
+	for(int idx_sample=0;idx_sample< MaxKeySupported/*43*/;idx_sample++)
+	{
+		if(strcmp((const char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[idx_sample].Key, "")!= 0)
+		{
+			if (sentConfigurationNumber == 0)
+			{
+				sprintf(message + strlen(message), "{\"key\":\"%s\",\"readonly\": %s,\"value\":\"%s\"}"
+						, ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[idx_sample].Key
+						, atoi((const char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[idx_sample].ReadOnly) == 1 ? "true":"false"
+						, ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[idx_sample].Value );
+			}
+			else
+			{
+				sprintf(message + strlen(message), ", {\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}"
+						, ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[idx_sample].Key
+						, atoi((const char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[idx_sample].ReadOnly) == 1 ? "true":"false"
+						, ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[idx_sample].Value );
+			}
+
+			sentConfigurationNumber = sentConfigurationNumber + 1;
+		}
+
+	}
+
+
+	sprintf(message + strlen(message), "]");
+
+
+	if(UnknownKeynum != 0)
+	{
+		sprintf(message + strlen(message), ",\"unknownKey\":[");
+		//unkown key
+		for(int idx_sample=0;idx_sample< UnknownKeynum ;idx_sample++)
+		{
+			// json_object *jstring1 = json_object_new_string((const char *)((ShmOCPP16Data->GetConfiguration.ResponseUnknownKey + idx_sample)->Item));
+
+			DEBUG_INFO("unkown key:%s\n", ShmOCPP16Data->GetConfiguration.ResponseUnknownKey[idx_sample].Item);
+
+			if(sentunConfigurationNumber == 0)
+			{
+				sprintf(message + strlen(message), "\"%s\""
+						, ShmOCPP16Data->GetConfiguration.ResponseUnknownKey[idx_sample].Item );
+			}
+			else
+			{
+				sprintf(message + strlen(message), ",\"%s\""
+						, ShmOCPP16Data->GetConfiguration.ResponseUnknownKey[idx_sample].Item );
+			}
+			sentunConfigurationNumber = sentunConfigurationNumber + 1;
+
+		}
+
+		sprintf(message + strlen(message), "]");
+
+	}
+
+	sprintf(message + strlen(message), "} ]");
+
+	LWS_Send(message);
+
+#if 0
+	printf("error 1-0\n");
+	if(ShmOCPP16Data->GetConfiguration.ResponseUnknownKey != NULL)
+		free(ShmOCPP16Data->GetConfiguration.ResponseUnknownKey);
+#endif
+	return result;
+}
+
+int sendGetDiagnosticsConfirmation(char *uuid,char *payload)
+{
+	mtrace();
+	int result = FAIL;
+	char message[400]={0};
+
+	DEBUG_ERROR("handle sendGetDiagnosticsConfirmation ...\n");
+
+	if(strcmp(payload,"")==0)
+	{
+		sprintf(message,"[%d,\"%s\",{}]",MESSAGE_TYPE_CALLRESULT, uuid);
+	}
+	else
+	{
+		sprintf(message,"[%d,\"%s\",{\"%s\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT, uuid, "fileName", payload);
+	}
+
+	LWS_Send(message);
+
+	result = TRUE;
+
+	return result;
+}
+
+int sendGetLocalListVersionConfirmation(char *uuid,char *payload)
+{
+	mtrace();
+	int result = FAIL;
+	char message[80]={0};
+
+//[ 3, "4f0141fb-f3a0-4634-9179-b1379b514d3c", { "listVersion": 1 } ]
+	DEBUG_ERROR("handle    GetLocalListVersionRequest ...\n");
+	sprintf(message,"[%d,\"%s\",{\"listVersion\":%d}]",MESSAGE_TYPE_CALLRESULT, uuid, ShmOCPP16Data->GetLocalListVersion.ResponseListVersion);
+	LWS_Send(message);
+	result = TRUE;
+
+	return result;
+}
+
+int sendRemoteStartConfirmation(char *uuid,char *payload)
+{
+	mtrace();
+	int result = FAIL;
+	char message[80]={0};
+//[3,"26f6b7bc-a6e8-48a8-bdc5-a541bf8f9e27",{"status":"Accepted"}]
+	DEBUG_ERROR("handleRemoteStartRequest ...\n");
+	sprintf(message,"[%d,\"%s\",{\"status\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT, uuid, payload);
+	LWS_Send(message);
+	result = TRUE;
+
+	return result;
+}
+
+int sendRemoteStopTransactionConfirmation(char *uuid,char *payload)
+{
+	mtrace();
+	int result = FAIL;
+	char message[80]={0};
+//	[3,"287d837d-809e-41ea-8385-fdab7f72a01c",{"status":"Accepted"}]
+	DEBUG_ERROR("sendRemoteStopTransactionConfirmation ...\n");
+	sprintf(message,"[%d,\"%s\",{\"status\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT, uuid, payload);
+	LWS_Send(message);
+	result = TRUE;
+
+	return result;
+}
+
+int sendReserveNowTransactionConfirmation(char *uuid,char *payload)
+{
+	mtrace();
+	int result = FAIL;
+	char message[80]={0};
+//	[3,"287d837d-809e-41ea-8385-fdab7f72a01c",{"status":"Accepted"}]
+
+	DEBUG_ERROR("sendReserveNowTransactionConfirmation\n");
+	sprintf(message,"[%d,\"%s\",{\"status\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT, uuid, payload);
+	LWS_Send(message);
+	result = TRUE;
+
+	return result;
+}
+
+int sendResetConfirmation(char *uuid,char *payload)
+{
+	mtrace();
+	int result = FAIL;
+	//[ 3, "6f88d461-4d17-462c-a69b-1f7a8c5b12df", { "status": 0 } ]
+	char message[80]={0};
+
+	ShmOCPP16Data->MsMsg.bits.ResetConf = 0;
+
+	sprintf(message,"[%d,\"%s\",{\"status\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT, uuid, payload);
+	LWS_Send(message);
+	result = TRUE;
+
+	return result;
+}
+
+int sendSendLocalListConfirmation(char *uuid,char *payload)
+{
+	mtrace();
+	int result = FAIL;
+	char message[500]={0};
+//	[ 3, "1571284266109", { "status": "Accepted" } ]
+	sprintf(message,"[%d,\"%s\",{\"%s\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT, uuid, "status", payload);
+	LWS_Send(message);
+	result = TRUE;
+
+	return result;
+}
+
+int sendSetChargingProfileConfirmation(char *uuid,char *payload)
+{
+	mtrace();
+	int result = FAIL;
+//[3,"5748585f-8524-4fa6-9b4f-4a7eca750b90",{"status":"NotSupported"}]
+	char message[80]={0};
+
+	DEBUG_ERROR("handleSetChargingProfileRequest\n");
+	sprintf(message,"[%d,\"%s\",{\"status\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT, uuid, payload);
+	LWS_Send(message);
+	result = TRUE;
+
+	return result;
+}
+
+int sendTriggerMessageConfirmation(char *uuid,char *payload)
+{
+	mtrace();
+	int result = FAIL;
+	char message[80]={0};
+
+	DEBUG_ERROR("sendTriggerMessageConfirmation\n");
+	sprintf(message,"[%d,\"%s\",{\"status\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT, uuid, payload);
+	LWS_Send(message);
+	result = TRUE;
+
+	return result;
+}
+
+int sendUnlockConnectorConfirmation(char *uuid,char *payload)
+{
+	mtrace();
+	int result = FAIL;
+	char message[80]={0};
+
+//[ 3, "ba1cbd49-2a76-493a-8f76-fa23e7606532", { "status": "Unlocked" } ]
+	DEBUG_ERROR("sendUnlockConnectorConfirmation\n");
+	sprintf(message,"[%d,\"%s\",{\"status\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT, uuid, payload);
+	LWS_Send(message);
+	result = TRUE;
+
+	return result;
+}
+
+int sendUpdateFirmwareConfirmation(char *uuid)
+{
+	mtrace();
+	int result = FAIL;
+
+	char message[60]={0};
+
+	//[ 3, "ba1cbd49-2a76-493a-8f76-fa23e7606532", { "status": "Unlocked" } ]
+	DEBUG_ERROR("sendUpdateFirmwareConfirmation\n");
+	sprintf(message,"[%d,\"%s\",{}]",MESSAGE_TYPE_CALLRESULT, uuid);
+	LWS_Send(message);
+	result = TRUE;
+
+	return result;
+}
+
+
+//==========================================
+// send CallError routine
+//==========================================
+void SendCallError(char *uniqueId, char *action, char *errorCode, char *errorDescription)
+{
+	mtrace();
+	//int result = FAIL;
+
+	char message[220]={0};
+// [4,"f1c52ff5-e65d-4070-b7d4-6c70bc1e8970","PropertyConstraintViolation","Payload is syntactically correct but at least one field contains an invalid value",{}]
+
+#ifdef SystemLogMessage
+	DEBUG_INFO("An error occurred. Sending this information: uniqueId {}: action: {}, errorCore: {}, errorDescription: {}\n",
+            uniqueId, action, errorCode, errorDescription);
+#endif
+	sprintf(message,"[%d,\"%s\",\"%s\",\"%s\",{}]",MESSAGE_TYPE_CALLERROR, uniqueId, errorCode, errorDescription);
+	LWS_Send(message);
+	//result = TRUE;
+}
+
+
+//==========================================
+// Handle server request routine  Start
+//==========================================
+#define GUN_NUM     1
+int handleCancelReservationRequest(char *uuid, char *payload)
+{
+	mtrace();
+	int result = FAIL;
+    int gunNO = 0;
+	int reservationIdInt =0;
+	char comfirmstr[20];
+
+	int c = 0;
+    char *loc;
+    char sstr[100]={0};
+
+    DEBUG_INFO("handle CancelReservationRequest\n");
+
+	ShmOCPP16Data->CsMsg.bits[gunNO].CancelReservationReq = 1;
+
+	c = 0;
+	loc = strstr(payload, "reservationId");
+	memset(sstr ,0, sizeof(sstr) );
+	while (loc[strlen("reservationId")+2+c] != '}')
+	{
+		sstr[c] = loc[strlen("reservationId")+2+c];
+		//printf("i=%d sstr=%c\n",c, sstr[c]);
+		c++;
+	}
+	sstr[c] = '\0';
+	reservationIdInt = atoi(sstr);
+
+
+	memset(comfirmstr, 0, sizeof comfirmstr);
+	sprintf(comfirmstr, "%s", CancelReservationStatusStr[CancelReservationStatus_Rejected]);
+
+	 //0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault, 8: Reserved, 9: maintain
+	 //check Transaction active
+	 if(strstr((const char *)ShmSysConfigAndInfo->SysConfig.ModelName ,"DC") != NULL)
+	 {
+		 for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+		 {
+			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId == reservationIdInt)
+			{
+				sprintf(comfirmstr, "%s", CancelReservationStatusStr[CancelReservationStatus_Accepted] );
+				sprintf((char *)ShmOCPP16Data->CancelReservation[ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index].ResponseStatus, "%s", comfirmstr );
+				gunNO = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index;
+				ShmOCPP16Data->CsMsg.bits[gunNO].CancelReservationReq = 1;
+				goto end;
+			}
+		 }
+
+
+
+		for (int index = 0; index < CCS_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ReservationId == reservationIdInt)
+			{
+				sprintf(comfirmstr, "%s", CancelReservationStatusStr[CancelReservationStatus_Accepted] );
+				sprintf((char *)ShmOCPP16Data->CancelReservation[ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index].ResponseStatus, "%s", comfirmstr );
+				gunNO = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index;
+				ShmOCPP16Data->CsMsg.bits[gunNO].CancelReservationReq = 1;
+				goto end;
+			}
+		}
+
+
+		for (int index = 0; index < GB_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ReservationId == reservationIdInt)
+			{
+				sprintf(comfirmstr, "%s", CancelReservationStatusStr[CancelReservationStatus_Accepted] );
+				sprintf((char *)ShmOCPP16Data->CancelReservation[ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index].ResponseStatus, "%s", comfirmstr );
+				gunNO = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index;
+				ShmOCPP16Data->CsMsg.bits[gunNO].CancelReservationReq = 1;
+				goto end;
+			}
+		}
+
+
+	 }
+	 else
+	 {
+		 for (int index = 0; index < AC_QUANTITY; index++)
+		 {
+		 	if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].ReservationId == reservationIdInt)
+		 	{
+		 		sprintf(comfirmstr, "%s", CancelReservationStatusStr[CancelReservationStatus_Accepted] );
+		 		sprintf((char *)ShmOCPP16Data->CancelReservation[ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index].ResponseStatus, "%s", comfirmstr );
+		 		gunNO = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index;
+		 		ShmOCPP16Data->CsMsg.bits[gunNO].CancelReservationReq = 1;
+		 		goto end;
+		 	}
+		 }
+
+	 }// END FOR AC ELSE
+
+	  //The reservationId does NOT match the reservationId
+	  sendCancelReservationConfirmation(uuid, comfirmstr);
+
+end:
+	  // Fill in ocpp packet uuid
+	  strcpy((char *)ShmOCPP16Data->CancelReservation[gunNO].guid, uuid);
+
+	return result;
+}
+
+int handleChangeAvailabilityRequest(char *uuid, char *payload)
+{
+	mtrace();
+	int result = FAIL;
+    int gunIndex = 0;
+	char sstr[90]={0};
+	char typeStr[16]={0};
+	char comfirmstr[20];
+	int specificId = FALSE;
+
+	DEBUG_ERROR("handle ChangeAvailabilityRequest\n");
+
+	char *loc;
+	//int intervalInt = 0;
+	int c = 0;
+
+	/*** connectorId ****/
+	c = 0;
+	loc = strstr(payload, "connectorId");
+	memset(sstr ,0, sizeof(sstr) );
+	while ((loc != NULL) &&(loc[strlen("connectorId")+2+c] != ',') &&(loc[strlen("connectorId")+2+c] != '}')  )
+	{
+		sstr[c] = loc[strlen("connectorId")+2+c];
+		c++;
+	}
+	sstr[c] = '\0';
+	gunIndex = atoi(sstr);
+
+
+    /***type ****/
+    loc = strstr(payload, "type");
+	memset(sstr ,0, sizeof(sstr) );
+	c = 0;
+	while ((loc != NULL) &&(loc[3+strlen("type")+c] != '\"'))
+	{
+		sstr[c] = loc[3+strlen("type")+c];
+		c++;
+	}
+	sstr[c] = '\0';
+	strcpy(typeStr, sstr);
+
+
+	if(gunIndex != 0)
+	{
+		ShmOCPP16Data->ChangeAvailability[gunIndex - 1].ConnectorId= gunIndex;
+		sprintf((char *)ShmOCPP16Data->ChangeAvailability[gunIndex - 1].Type, "%s", typeStr);
+	}
+	else
+	{
+		ShmOCPP16Data->ChangeAvailability[0].ConnectorId= gunIndex;
+		sprintf((char *)ShmOCPP16Data->ChangeAvailability[0].Type, "%s", typeStr);
+	}
+
+
+	memset(comfirmstr, 0, sizeof comfirmstr);
+	sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
+
+
+	if((gunIndex  == 0) || ((gunIndex - 1) < gunTotalNumber/*(CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY)*/))
+	{
+		specificId = TRUE;
+	}
+
+	if(specificId == FALSE)
+		goto end;
+
+	if(gunIndex != 0)
+	{
+		ShmOCPP16Data->CsMsg.bits[gunIndex - 1].ChangeAvailabilityReq = 1;
+	}
+	else
+	{
+		for(int i=0; i < gunTotalNumber/*(CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY)*/; i++)
+			ShmOCPP16Data->CsMsg.bits[i].ChangeAvailabilityReq = 1;
+	}
+	/*
+	enum _SYSTEM_STATUS
+	{
+	S_BOOTING               = 0,
+	S_IDLE,                 = 1
+	S_AUTHORIZING,          =2
+	S_REASSIGN_CHECK,       =3
+	S_REASSIGN,             =4
+	S_PRECHARGE,            =5
+	S_PREPARING_FOR_EV,     =6
+	S_PREPARING_FOR_EVSE,   =7
+	S_CHARGING,             =8
+	S_TERMINATING,          =9
+	S_COMPLETE,             =10
+	S_ALARM,                =11
+	S_FAULT                 =12
+	}
+ 	 */
+	if(strcmp((const char *)typeStr, AvailabilityTypeStr[Inoperative]) == 0)
+	{
+	    //check Transaction active
+		if(strstr((const char *)ShmSysConfigAndInfo->SysConfig.ModelName ,"DC") != NULL)
+		{
+			for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+			{
+				if ((gunIndex  == 0) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == (gunIndex - 1)))
+				{
+					if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 5) // S_PRECHARGE
+				    {
+				    	sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
+				    }
+				    else if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 8)  // S_CHARGING
+				    {
+				    	sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
+				    }
+				    else
+				    {
+				    	sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
+				    }
+
+				    goto end;
+				}
+			}//END FOR CHAdeMO_QUANTITY
+
+			for (int index = 0; index < CCS_QUANTITY; index++)
+			{
+				if ((gunIndex  == 0)|| (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == (gunIndex - 1)))
+				{
+				    if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 5)// S_PRECHARGE
+				    {
+				    	sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
+				    }
+				    else if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 8) // S_CHARGING
+				    {
+				    	sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
+				    }
+				    else
+				    {
+				    	sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
+				    }
+
+				    goto end;
+				 }
+			}//END FOR CCS_QUANTITY
+
+			for (int index = 0; index < GB_QUANTITY; index++)
+			{
+				if ((gunIndex  == 0)||(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == (gunIndex - 1)))
+				{
+					if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 5) // S_PRECHARGE
+				    {
+				    	sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
+				    }
+				    else if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 8) // S_CHARGING
+				    {
+				    	sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
+				    }
+				    else
+				    {
+					    sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
+				    }
+
+				    goto end;
+				 }
+			}// END FOR GB_QUANTITY
+		}
+		else
+		{
+			for (int index = 0; index < AC_QUANTITY; index++)
+			{
+				if ((gunIndex  == 0) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == (gunIndex - 1)))
+				{
+					if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == 5) // S_PRECHARGE
+					{
+						sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
+					}
+					else if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == 8)  // S_CHARGING
+					{
+						sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
+					}
+					else
+					{
+						sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
+					}
+
+					goto end;
+				}
+			}//END FOR AC_QUANTITY
+		}// END FOR AC ELSE
+	}//END FOR AvailabilityTypeStr[Inoperative]
+
+
+	if(strcmp((const char *)typeStr, AvailabilityTypeStr[Operative]) == 0)
+	{
+	    //0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault, 8: Reserved, 9: maintain
+	    //check Transaction active
+
+		if(strstr((const char *)ShmSysConfigAndInfo->SysConfig.ModelName ,"DC") != NULL)
+		{
+			for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+			{
+				if (((gunIndex  == 0)|| (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == (gunIndex - 1))) &&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != 12))  //S_FAULT
+				{
+				   sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
+				   goto end;
+				}
+			}//END FOR CHAdeMO_QUANTITY
+
+			for (int index = 0; index < CCS_QUANTITY; index++)
+			{
+				if (((gunIndex  == 0)|| (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == (gunIndex - 1)))&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != 12)) //S_FAULT
+				{
+				   sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
+				   goto end;
+				}
+			}//END FOR CCS_QUANTITY
+
+			for (int index = 0; index < GB_QUANTITY; index++)
+			{
+				if (((gunIndex  == 0)||(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == (gunIndex - 1)))&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != 12)) //S_FAULT
+				{
+				   ShmOCPP16Data->CsMsg.bits[gunIndex - 1].ChangeAvailabilityReq = 1;
+				   sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
+				   goto end;
+				}
+			}// END FOR GB_QUANTITY
+
+				    //sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
+		}
+		else
+		{
+			for (int index = 0; index < AC_QUANTITY; index++)
+			{
+				if (((gunIndex  == 0)|| (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == (gunIndex - 1))) &&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != 12))  //S_FAULT
+				{
+					sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
+					goto end;
+				}
+			}//END FOR CHAdeMO_QUANTITY
+		}//END FOR AC ELSE
+	}//END FOR AvailabilityTypeStr[Operative]
+
+	end:
+
+	if(gunIndex != 0)
+	{
+		sprintf((char *)ShmOCPP16Data->ChangeAvailability[gunIndex - 1].ResponseStatus, "%s", comfirmstr );
+	}
+	else
+	{
+		sprintf((char *)ShmOCPP16Data->ChangeAvailability[0].ResponseStatus, "%s", comfirmstr );
+	}
+
+	sendChangeAvailabilityConfirmation(uuid, comfirmstr);
+
+	//ShmOCPP16Data->CsMsg.bits[gunIndex - 1].ChangeAvailabilityConf = 1;
+
+	return result;
+}
+
+int handleChangeConfigurationRequest(char *uuid, char *payload)
+{
+	mtrace();
+	int result = FAIL;
+	char sstr[100]={0};
+	char keystr[40]={0};
+	char valuestr[16]={0};
+	char *loc;
+	int c = 0;
+	char comfirmstr[20];
+
+	DEBUG_ERROR("handle ChangeConfigurationRequest\n");
+
+	/***key ****/
+	loc = strstr(payload, "key");
+	memset(sstr ,0, sizeof(sstr) );
+	c = 0;
+	while ((loc != NULL) &&(loc[3+strlen("key")+c] != '\"'))
+	{
+		sstr[c] = loc[3+strlen("key")+c];
+		c++;
+	}
+	sstr[c] = '\0';
+	strcpy(keystr, sstr);
+
+	/***value ****/
+	loc = strstr(payload, "value");
+	memset(sstr ,0, sizeof(sstr) );
+	c = 0;
+	while ((loc != NULL) &&(loc[3+strlen("value")+c] != '\"'))
+	{
+		sstr[c] = loc[3+strlen("value")+c];
+		c++;
+	}
+	sstr[c] = '\0';
+	strcpy(valuestr, sstr);
+
+    if((uuid==NULL) || (payload ==NULL) )
+    {
+#ifdef Debug
+			DEBUG_INFO("payload is null\n");
+#endif
+		sprintf(comfirmstr, "%s", ConfigurationStatusStr[ConfigurationStatus_Rejected] );
+
+    }
+    else
+    {
+    	int status = setKeyValue(keystr, valuestr);
+
+    	switch(status)
+    	{
+    		case ConfigurationStatus_Accepted:
+    			sprintf(comfirmstr, "%s", ConfigurationStatusStr[ConfigurationStatus_Accepted]);
+    			ShmOCPP16Data->MsMsg.bits.ChangeConfigurationReq = 1;
+
+    		break;
+
+    		case ConfigurationStatus_Rejected:
+    			sprintf(comfirmstr, "%s", ConfigurationStatusStr[ConfigurationStatus_Rejected] );
+    		break;
+
+    		case RebootRequired:
+    			sprintf(comfirmstr, "%s", ConfigurationStatusStr[RebootRequired]);
+    		break;
+
+    		case NotSupported:
+    			sprintf(comfirmstr, "%s", ConfigurationStatusStr[NotSupported] );
+    			break;
+
+    		default:
+    		break;
+    	}
+    }
+
+
+    //confirmation.setStatus(ConfigurationStatus.Rejected);
+    sendChangeConfigurationConfirmation(uuid, comfirmstr);
+	ShmOCPP16Data->MsMsg.bits.ChangeConfigurationConf = 1;
+
+
+	return result;
+}
+
+int handleClearCacheRequest(char *uuid, char *payload)
+{
+	mtrace();
+	int result = FAIL;
+	char comfirmstr[20];
+	int fd;
+    char rmFileCmd[100]={0};
+    struct stat stats;
+    DEBUG_ERROR("handle  ClearCacheRequest\n");
+    stat("../Storage/OCPP", &stats);
+
+    // Check for directory existence
+    if (S_ISDIR(stats.st_mode) == 1)
+    {
+    	DEBUG_ERROR("\n OCPP directory exist \n");
+    }
+    else
+    {
+    	DEBUG_ERROR("\n OCPP directory not exist, create dir \n");
+    	sprintf(rmFileCmd,"mkdir -p %s","../Storage/OCPP");
+    	system(rmFileCmd);
+    }
+
+    memset(&rmFileCmd, 0, sizeof rmFileCmd);
+
+    if((access(AuthorizationCache_JSON,F_OK))!=-1)
+    {
+    	DEBUG_ERROR("AuthorizationCache file exist.\n");
+    }
+    else
+    {
+    	DEBUG_ERROR("AuthorizationCache file not exist\n");
+    	FILE *log = fopen(AuthorizationCache_JSON, "w+");
+
+    	if(log == NULL)
+    	{
+    		DEBUG_ERROR("AuthorizationCache file is NULL\n");
+    		sprintf(comfirmstr, "%s", ClearCacheStatusStr[ClearCacheStatus_Rejected] );
+    		goto end;
+    	}
+    	else
+    	{
+    		fclose(log);
+    	}
+    }
+
+
+    fd = open(AuthorizationCache_JSON,O_RDWR);
+    if(fd < 0)
+    {
+    	DEBUG_ERROR("open AuthorizationCache file failed\n");
+        sprintf(comfirmstr, "%s", ClearCacheStatusStr[ClearCacheStatus_Rejected] );
+    }
+    else
+    {
+    	DEBUG_ERROR("open AuthorizationCache file successful\n");
+
+        /* 清空?�件 */
+        ftruncate(fd,0);
+
+        /* ?�新设置?�件?�移??*/
+        lseek(fd,0,SEEK_SET);
+
+        close(fd);
+        sprintf(comfirmstr, "%s", ClearCacheStatusStr[ClearCacheStatus_Accepted] );
+        //ShmOCPP16Data->MsMsg.bits.ClearCacheReq = 1;	//OCPP handle byself
+    }
+
+ end:
+    sendClearCacheConfirmation(uuid, comfirmstr);
+    //ShmOCPP16Data->MsMsg.bits.ClearCacheConf = 1;		//OCPP handle byself
+	return result;
+}
+
+int handleClearChargingProfileRequest(char *uuid, char *payload)
+{
+	mtrace();
+	int result = FAIL;
+	int resultRename;
+	int connectorIdInt, chargingProfileIdInt, stackLevelInt;
+	char chargingProfilePurposeStr[26]={0};
+	int tempconnectorIdInt, tempchargingProfileIdInt, tempstackLevelInt;
+	char tempchargingProfilePurposeStr[26]={0};
+	char sstr[160]={0};//sstr[200]={ 0 };
+	char str[100]={0};
+	int c = 0;
+	//int i = 0;
+	//char * pch;
+	char *loc;
+	char fname[200];
+	char comfirmstr[20]={0};
+	char word[1000]={0};
+	int clearflag = FALSE;
+	int chargingProfileIdIsNULL = FALSE;
+	int connectorIsNULL = FALSE;
+	FILE *fptr1, *fptr2;
+	char temp[] = "../Storage/OCPP/ClearChargingProfiletemp.json";
+    int n_chargingProfile=0;
+    char sLineWord[1060]={0};
+
+    DEBUG_ERROR("handle  ClearChargingProfileRequest\n");
+
+	connectorIdInt= chargingProfileIdInt= stackLevelInt =0;
+	/***id ****/
+	c = 0;
+	loc = strstr(payload, "id");
+	memset(sstr ,0, sizeof(sstr) );
+	if(loc == NULL)
+	{
+		chargingProfileIdIsNULL = TRUE;
+	}
+
+	while ((loc != NULL) &&(loc[strlen("id")+2+c] != ',') )
+	{
+		sstr[c] = loc[strlen("id")+2+c];
+		//printf("i=%d sstr=%c\n",c, sstr[c]);
+		c++;
+	}
+	sstr[c] = '\0';
+	chargingProfileIdInt = atoi(sstr);
+
+	/***connectorId ****/
+	c=0;
+	loc = strstr(payload, "connectorId");
+	memset(sstr ,0, sizeof(sstr) );
+
+	if(loc == NULL)
+	{
+		connectorIsNULL = TRUE;
+	}
+
+	while ((loc != NULL) &&(loc[strlen("connectorId")+2+c] != ','))
+	{
+		sstr[c] = loc[strlen("connectorId")+2+c];
+		//printf("i=%d sstr=%c\n",c, sstr[c]);
+		c++;
+	}
+
+	sstr[c] = '\0';
+    connectorIdInt = atoi(sstr);
+
+
+    /***chargingProfilePurpose ****/
+    loc = strstr(payload, "chargingProfilePurpose");
+	memset(sstr ,0, sizeof(sstr) );
+	c = 0;
+	while ((loc != NULL) &&(loc[3+strlen("chargingProfilePurpose")+c] != '\"'))
+	{
+		sstr[c] = loc[3+strlen("chargingProfilePurpose")+c];
+		c++;
+	}
+	sstr[c] = '\0';
+	strcpy(chargingProfilePurposeStr, sstr);
+
+
+	/***stackLevel ****/
+	c=0;
+	loc = strstr(payload, "stackLevel");
+	memset(sstr ,0, sizeof(sstr) );
+	while ((loc != NULL) &&((loc[strlen("stackLevel")+2+c] != '}') && (loc[strlen("stackLevel")+2+c] != ',')))
+	{
+		sstr[c] = loc[strlen("stackLevel")+2+c];
+		//printf("i=%d sstr=%c\n",c, sstr[c]);
+		c++;
+	}
+	sstr[c] = '\0';
+	stackLevelInt = atoi(sstr);
+
+	if(connectorIsNULL == FALSE)
+	{
+		switch(connectorIdInt)
+		{
+			case 0:
+				if(strcmp(chargingProfilePurposeStr,"ChargePointMaxProfile")==0)
+				{
+					strcpy(fname, ChargePointMaxProfile_JSON);
+				}
+				else
+				{
+					strcpy(fname, TxDefaultProfile_0_JSON);
+				}
+
+				break;
+
+			case 1:
+				if(strcmp(chargingProfilePurposeStr,"TxDefaultProfile")==0)
+				{
+					strcpy(fname, TxDefaultProfile_1_JSON);
+				}
+				else
+				{
+					strcpy(fname, TxProfile_1_JSON);
+				}
+				break;
+
+			case 2:
+				if(strcmp(chargingProfilePurposeStr,"TxDefaultProfile")==0)
+				{
+					strcpy(fname, TxDefaultProfile_2_JSON);
+				}
+				else
+				{
+					strcpy(fname, TxProfile_2_JSON);
+				}
+				break;
+
+			default:
+				strcpy(fname, ChargePointMaxProfile_JSON );
+				break;
+		}
+
+	}
+	else
+	{
+		strcpy(fname, ChargePointMaxProfile_JSON );
+
+	}
+
+	fptr1 = fopen(fname, "r");
+	if (!fptr1)
+	{
+		//file not exist
+		DEBUG_ERROR("Unable to open the input file!!\n");
+		fptr1 = fopen(fname, "w+");
+
+	}
+	fclose(fptr1);
+
+	if(connectorIsNULL == FALSE && (connectorIdInt != 0) && ( (connectorIdInt-1) > gunTotalNumber/*(CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY)*/ ) )
+	{
+		sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Unknown] );
+		goto end;
+	}
+
+
+	if((connectorIsNULL == FALSE) && (connectorIdInt == 0) )
+	{
+		//clear the whole contents of a file in C
+		fclose(fopen(ChargePointMaxProfile_JSON, "w"));
+		fclose(fopen(TxDefaultProfile_0_JSON, "w"));
+		fclose(fopen(TxDefaultProfile_1_JSON, "w"));
+		fclose(fopen(TxDefaultProfile_2_JSON, "w"));
+
+		fclose(fopen(TxProfile_1_JSON, "w"));
+		fclose(fopen(TxProfile_2_JSON, "w"));
+#if 0
+		fclose(fopen(ChargingProfile_0_JSON, "w"));
+		fclose(fopen(ChargingProfile_1_JSON, "w"));
+		fclose(fopen(ChargingProfile_2_JSON, "w"));
+#endif
+		sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Accepted] );
+	}
+	else
+	{
+		fptr1 = fopen(fname, "r");
+		fptr2 = fopen(temp, "w+");
+		while(fscanf(fptr1, "%s", word) != EOF)
+		{
+			DEBUG_INFO("word=%s\n",word);
+			if(strcmp(word, "chargingProfileId") == 0)
+			{
+				n_chargingProfile = n_chargingProfile + 1;
+				printf("Found\n");
+			}
+		}
+		rewind(fptr1);
+
+		//search Charging Profile Element
+        //int i= 0;
+		while ( fgets( sLineWord, sizeof sLineWord, fptr1 ) != NULL )
+		{
+
+			/*************************tempconnectorIdInt*********************************/
+			loc = strstr(sLineWord, "connectorId");
+			c = 0;
+			memset(sstr ,0, sizeof(sstr) );
+			while (loc[strlen("connectorId")+2+c] != ',')
+			{
+				sstr[c] = loc[strlen("connectorId")+2+c];
+				c++;
+			}
+			sstr[c] = '\0';
+			tempconnectorIdInt = atoi(sstr);
+
+			//chargingProfileId
+			c = 0;
+			loc = strstr(sLineWord, "chargingProfileId");
+			memset(sstr ,0, sizeof(sstr) );
+			while (loc[strlen("chargingProfileId")+2+c] != ',')
+			{
+				sstr[c] = loc[strlen("chargingProfileId")+2+c];
+				//printf("i=%d sstr=%c\n",c, sstr[c]);
+				c++;
+			}
+			sstr[c] = '\0';
+			tempchargingProfileIdInt = atoi(sstr);
+
+			//stackLevel
+			c = 0;
+			loc = strstr(sLineWord, "stackLevel");
+			memset(sstr ,0, sizeof(sstr) );
+			while (loc[strlen("stackLevel")+2+c] != ',')
+			{
+				sstr[c] = loc[strlen("stackLevel")+2+c];
+				//printf("i=%d sstr=%c\n",c, sstr[c]);
+				c++;
+			}
+			sstr[c] = '\0';
+			tempstackLevelInt = atoi(sstr);
+
+			c = 0;
+			loc = strstr(sLineWord, "chargingProfilePurpose");
+			memset(sstr ,0, sizeof(sstr) );
+			while (loc[3+strlen("chargingProfilePurpose")+c] != '\"')
+			{
+				sstr[c] = loc[3+strlen("chargingProfilePurpose")+c];
+				c++;
+			}
+			sstr[c] = '\0';
+			strcpy(tempchargingProfilePurposeStr, sstr);
+
+			if(chargingProfileIdIsNULL == FALSE)
+			{
+				DEBUG_INFO("\n OCPP clear 0 !!!\n");
+				if(tempchargingProfileIdInt == chargingProfileIdInt)
+				{
+					DEBUG_INFO("\n OCPP clear 0-1 !!!\n");
+					sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Accepted] );
+					clearflag = TRUE;
+					break;//continue;
+				}
+				else
+				{
+					DEBUG_INFO("\n OCPP clear 0-2 !!!\n");
+					//json_object_array_add(newHeatMap, jsonitem);
+					fprintf(fptr2, sLineWord);//writing data into file
+				}
+			}
+			else
+			{
+				if((connectorIsNULL == FALSE) && (connectorIdInt != 0) && ( connectorIdInt == tempconnectorIdInt) && (tempstackLevelInt == stackLevelInt))
+				{
+					sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Accepted] );
+					clearflag = TRUE;
+					break;//continue;
+				}
+				else if((connectorIsNULL == TRUE) && ((tempstackLevelInt == stackLevelInt) || (strcmp(tempchargingProfilePurposeStr, chargingProfilePurposeStr) == 0)))
+				{
+					sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Accepted] );
+					clearflag = TRUE;
+					break;//continue;
+				}
+				else
+				{
+					//json_object_array_add(newHeatMap, jsonitem);
+					fprintf(fptr2, sLineWord);//writing data into file
+				}
+
+			}
+
+			memset(sLineWord, 0, sizeof sLineWord);
+		}
+
+        if(clearflag == FALSE)
+        {
+        	sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Unknown] );
+        	goto end;
+        }
+
+        fclose(fptr1);
+        fclose(fptr2);
+
+		sprintf(str,"rm -f %s",fname);
+		system(str);
+
+		resultRename = rename(temp, fname);
+
+		if(resultRename == 0)
+		{
+			DEBUG_ERROR("File ChargingProfile renamed successfully");
+		}
+		else
+		{
+			DEBUG_ERROR("Error: unable to rename the ChargingProfile file");
+		}
+	}
+
+	end:
+	sendClearChargingProfileConfirmation(uuid, comfirmstr);
+
+	return result;
+}
+
+int handleDataTransferRequest(char *uuid, char *payload)
+{
+	mtrace();
+	int result = FAIL;
+	//Payload={"vendorId":"Phihong","messageId":"MSGID","data":"Data1"}
+	char tempvendorId[255]={0};
+	char tempmessageId[50]={0};
+	char tempdata[50]={0};
+	char sstr[160]={0};//sstr[200]={ 0 };
+	char message[80]={0};
+	int c = 0;
+	char *loc;
+
+	DEBUG_INFO("handle DataTransferRequest\n");
+
+	//===============================
+	// vendorId
+	//===============================
+	c = 0;
+	loc = strstr(payload, "vendorId");
+	while (loc[strlen("vendorId")+3+c] != '\"')
+	{
+		sstr[c] = loc[strlen("vendorId")+3+c];
+		//printf("i=%d sstr=%c\n",c, sstr[c]);
+		c++;
+	}
+	sstr[c] = '\0';
+	strcpy(tempvendorId,sstr);
+
+	//===============================
+	// messageId
+	//===============================
+	memset(sstr ,0, sizeof(sstr) );
+	c = 0;
+	loc = strstr(payload, "messageId");
+	while (loc[strlen("messageId")+3+c] != '\"')
+	{
+		sstr[c] = loc[strlen("messageId")+3+c];
+		//printf("i=%d sstr=%c\n",c, sstr[c]);
+		c++;
+	}
+	sstr[c] = '\0';
+	strcpy(tempmessageId,sstr);
+
+	//===============================
+	// data
+	//===============================
+	memset(sstr ,0, sizeof(sstr) );
+	c = 0;
+	loc = strstr(payload, "data");
+	printf("loc=%s\n",loc);
+
+	while (loc[strlen("data")+3+c] != '\"')
+	{
+		sstr[c] = loc[strlen("data")+3+c];
+		//printf("i=%d sstr=%c\n",c, sstr[c]);
+		c++;
+	}
+	sstr[c] = '\0';
+	strcpy(tempdata,sstr);
+
+	sprintf(message,"[%d,\"%s\",{\"status\":\"%s\",\"data\":\"vendorId-%s messageId-%s data-%s\"}]",MESSAGE_TYPE_CALLRESULT, uuid, "Rejected", tempvendorId, tempmessageId, tempdata );
+	LWS_Send(message);
+	return result;
+}
+
+#if 0
+long long diff_tm(struct tm *a, struct tm *b) {
+ return a->tm_sec - b->tm_sec
+      + 60LL * (a->tm_min - b->tm_min)
+      + 3600LL * (a->tm_hour - b->tm_hour)
+      + 86400LL * (a->tm_yday - b->tm_yday)
+      + (a->tm_year - 70) * 31536000LL
+      - (a->tm_year - 69) / 4 * 86400LL
+      + (a->tm_year - 1) / 100 * 86400LL
+      - (a->tm_year + 299) / 400 * 86400LL
+      - (b->tm_year - 70) * 31536000LL
+      + (b->tm_year - 69) / 4 * 86400LL
+      - (b->tm_year - 1) / 100 * 86400LL
+      + (b->tm_year + 299) /400 * 86400LL;
+}
+#endif
+
+
+int handleGetCompositeScheduleRequest(char *uuid, char *payload)
+{
+	mtrace();
+	int result = FAIL;
+	int connectorIdInt, durationInt;
+	char chargingRateUnitStr[4]={0};
+	//int tempconnectorIdInt,
+	int tempdurationInt;
+	float tempminChargingRateFloat = 0.0;
+    char tempvalidFromStr[30]={0},tempchargingRateUnitStr[4]={0}, tempstartScheduleStr[30]={0};
+    int tempStartPeriodInt=0;
+    float tempLimitInt=0.0;//0.1;
+    int tempNumberPhasesInt=0;
+    char fname[200];
+    char comfirmstr[20];
+    //float totallimit =0.0;
+    float MinChargingRate =0.0;
+	double diff_t;
+	struct tm tp;
+    //int clearflag = FALSE;
+    FILE *fptr1;//, *fptr2;
+    //char temp[] = "../Storage/OCPP/temp.json";
+	int c = 0;
+	//int i = 0;
+	char * pch;
+	char *loc;
+	char sstr[200]={ 0 };
+	int n_chargingProfile = 0;
+	int n_SchedulePeriods = 0;
+	char SchedulePeriodList[10][200]={0};
+	char sLineWord[800]={0};
+	//int n_periods = 0;
+	char word[1000]={0};
+	int confirmPeriods = 0;
+	struct StructProfile ChargePointMaxProfile;
+	struct StructProfile TxDefaultProfile;
+	struct StructProfile TxProfile;
+	struct StructProfile TxDefaultProfiletemp[2]={0};
+	int TxDefaultProfileFileIsNull=FALSE;
+	int ChargePointMaxProfileIsNull=FALSE;
+	int	TxProfileIsNull=FALSE;
+
+
+
+	memset(&ChargePointMaxProfile,0,sizeof(struct StructProfile));
+	memset(&TxDefaultProfile,0,sizeof(struct StructProfile));
+	memset(&TxProfile,0,sizeof(struct StructProfile));
+
+    c=0;
+    loc = strstr(payload, "connectorId");
+    memset(sstr ,0, sizeof(sstr) );
+   	while ((loc[strlen("connectorId")+2+c] != '}') && (loc[strlen("connectorId")+2+c] != ','))
+   	{
+   		sstr[c] = loc[strlen("connectorId")+2+c];
+   		//printf("i=%d sstr=%c\n",c, sstr[c]);
+   		c++;
+   	}
+   	sstr[c] = '\0';
+    connectorIdInt = atoi(sstr);
+
+    c=0;
+    loc = strstr(payload, "duration");
+    memset(sstr ,0, sizeof(sstr) );
+   	while ((loc[strlen("duration")+2+c] != '}') && (loc[strlen("duration")+2+c] != ','))
+   	{
+   		sstr[c] = loc[strlen("duration")+2+c];
+   		//printf("i=%d sstr=%c\n",c, sstr[c]);
+   		c++;
+   	}
+   	sstr[c] = '\0';
+   	durationInt = atoi(sstr);
+
+   	c = 0;
+    loc = strstr(payload, "chargingRateUnit");
+  	memset(sstr ,0, sizeof(sstr) );
+  	if(loc == NULL)
+  	{
+
+  	}
+  	else
+  	{
+  		while (loc[3+strlen("chargingRateUnit")+c] != '\"')
+  	  	{
+  			sstr[c] = loc[3+strlen("chargingRateUnit")+c];
+  	  		c++;
+  	  	}
+  	  	sstr[c] = '\0';
+  	  	strcpy(chargingRateUnitStr, sstr);
+  	}
+
+
+  	memset(ShmOCPP16Data->GetCompositeSchedule, 0, sizeof(struct StructChargingSchedulePeriod)*gunTotalNumber/*(CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY)*/ );
+
+  	if(connectorIdInt==0) // connectorId is 0
+  	{
+
+  		/******************************ChargePointMaxProfile*****************************************************/
+  		strcpy(fname, ChargePointMaxProfile_JSON );
+
+  		char word[30]={0};
+  		char sLineWord[1060]={0};
+  		int n_chargingProfile=0;
+
+  		ChargePointMaxProfileIsNull=TRUE;
+  		if((access(fname,F_OK))!=-1)
+  		{
+  			fptr1 = fopen(fname, "r");
+
+  			int c;
+  			c = fgetc(fptr1);
+  			DEBUG_INFO("c:%d\n",c);
+  			rewind(fptr1);
+
+  			if(c == EOF)
+  			{
+  				DEBUG_INFO("\n End of file ChargingProfile reached.");
+  			  	ChargePointMaxProfileIsNull=TRUE;
+  			  	fclose(fptr1);
+  			}
+  			else
+  			{
+  				ChargePointMaxProfileIsNull=FALSE;
+  				while(fscanf(fptr1, "%s", word) != EOF)
+  			  	{
+  			  		if(strcmp(word, "chargingProfileId") == 0)
+  			  		{
+  			  			n_chargingProfile = n_chargingProfile + 1;
+  			  			printf("Found\n");
+  			  		}
+  			  	}
+  			  	rewind(fptr1);
+
+  			  	//search Charging Profile Element
+  			  	int i= 0;
+  			  	while ( fgets( sLineWord, sizeof sLineWord, fptr1 ) != NULL ) {
+#if 0
+  			  	/***********connectorId****************/
+  			  	c = 0;
+  			  	loc = strstr(sLineWord, "connectorId");
+  			  	//	printf("loc=%s\n",loc);
+  			  	memset(sstr ,0, sizeof(sstr) );
+  			  	while (loc[strlen("connectorId")+2+c] != ',')
+  			  	{
+  			  		sstr[c] = loc[strlen("connectorId")+2+c];
+  			  		//printf("i=%d sstr=%c\n",c, sstr[c]);
+  			  		c++;
+  			  	}
+  			  	sstr[c] = '\0';
+  			  	tempconnectorIdInt = atoi(sstr);
+#endif
+  			  	/***********validFrom**************/
+  			  	c = 0;
+  			  	loc = strstr(sLineWord, "validFrom");
+  			  	//DEBUG_INFO("loc=%s\n",loc);
+  			  	memset(sstr ,0, sizeof(sstr) );
+
+  			  	if(loc != NULL)
+  			  	{
+  			  	  	while (loc[3+strlen("validFrom")+c] != '\"')
+  			  	  	{
+  			  	  		sstr[c] = loc[3+strlen("validFrom")+c];
+  			  	  		//printf("i=%d sstr=%c\n",c, sstr[c]);
+  			  	  		c++;
+  			  	  	}
+  			  	  	sstr[c] = '\0';
+  			  	  	DEBUG_INFO("validFrom=%s\n",sstr);
+  			  	  	strcpy(tempvalidFromStr,sstr);
+
+  			  	}
+  			  	else
+  			  	{
+  			  		strcpy(tempvalidFromStr,"");
+  			  	}
+
+
+  			  	/**********startSchedule**********/
+  			  	c = 0;
+  			  	loc = strstr(sLineWord, "startSchedule");
+  			  	//DEBUG_INFO("loc=%s\n",loc);
+  			  	memset(sstr ,0, sizeof(sstr) );
+  			  	while (loc[3+strlen("startSchedule")+c] != '\"')
+  			  	{
+  			  		sstr[c] = loc[3+strlen("startSchedule")+c];
+  			  		//printf("i=%d sstr=%c\n",c, sstr[c]);
+  			  		c++;
+  			  	}
+  			  	sstr[c] = '\0';
+  			  	strcpy(tempstartScheduleStr, sstr);
+
+
+  				/**********startSchedule**********/
+  				c = 0;
+  				loc = strstr(sLineWord, "chargingRateUnit");
+  				memset(sstr ,0, sizeof(sstr) );
+  				while (loc[3+strlen("chargingRateUnit")+c] != '\"')
+  				{
+  				  	 sstr[c] = loc[3+strlen("chargingRateUnit")+c];
+  				  	 c++;
+  				}
+  				sstr[c] = '\0';
+  				strcpy(tempchargingRateUnitStr, sstr);
+
+  			  	/**********minChargingRate*******/
+  			  	c = 0;
+  			  	loc = strstr(sLineWord, "minChargingRate");
+  			  	//printf("loc=%s\n",loc);
+  			  	if(loc != NULL)
+  			  	{
+  			  	  	memset(sstr ,0, sizeof(sstr) );
+  			  	  	while (loc[3+strlen("minChargingRate")+c] != '\"')
+  			  	  	{
+  			  	  		sstr[c] = loc[3+strlen("minChargingRate")+c];
+  			  	  		//printf("i=%d sstr=%c\n",c, sstr[c]);
+  			  	  		c++;
+  			  	  	}
+  			  	  	sstr[c] = '\0';
+  			  		tempminChargingRateFloat = atof(sstr);
+  			  	}
+  			  	else
+  			  	{
+  			  		tempminChargingRateFloat = 0.0;
+  			  	}
+
+
+  			  	//
+  			  	strptime(tempstartScheduleStr, "%Y-%m-%dT%H:%M:%S", &tp);
+  			  	tp.tm_isdst = -1;
+  			  	time_t utc = mktime(&tp);
+  			  	// current time
+  			  	time_t t = time(NULL);
+
+  			  	diff_t = difftime(t, utc);
+
+  			  	//parsing strings to words
+  			  	i = 0;
+  			  	loc = strstr(sLineWord, "chargingSchedulePeriod");
+  			  	loc = loc+3+strlen("chargingSchedulePeriod");
+  			  	pch = strtok(loc ,"{");
+  			  	while (pch != NULL)
+  			  	{
+  			  		strcpy(SchedulePeriodList[i], pch);
+  			  		//printf ("SchedulePeriodList[%d]:%s\n",i,SchedulePeriodList[i]);
+  			  		//printf ("%s\n",pch);
+  			  		pch = strtok (NULL, "{");
+  			  		i = i + 1;
+  			  	}
+  			  	n_SchedulePeriods = i;
+
+  			  	for(int i=0;i<n_SchedulePeriods;i++)
+  			  	{
+  			  		/*************startPeriod****************/
+  			  		c = 0;
+  			  		loc = strstr(SchedulePeriodList[i], "startPeriod");
+  			  		memset(sstr ,0, sizeof(sstr) );
+  			  		while (loc[strlen("startPeriod")+2+c] != ',')
+  			  		{
+  			  			sstr[c] = loc[strlen("startPeriod")+2+c];
+  			  			//printf("i=%d sstr=%c\n",c, sstr[c]);
+  			  			c++;
+  			  		}
+  			  		sstr[c] = '\0';
+  			  		tempStartPeriodInt = atoi(sstr);
+
+  			  		/*************limit****************/
+  			  		c = 0;
+  			  		loc = strstr(SchedulePeriodList[i], "limit");
+  			  		memset(sstr ,0, sizeof(sstr) );
+  			  		while (loc[strlen("limit")+2+c] != ',')
+  			  		{
+  			  			sstr[c] = loc[strlen("limit")+2+c];
+  			  			//printf("i=%d sstr=%c\n",c, sstr[c]);
+  			  			c++;
+  			  		}
+  			  		sstr[c] = '\0';
+  			  		tempLimitInt = atof(sstr);
+
+  			  		/*************numberPhases****************/
+  			  		c = 0;
+  			  		loc = strstr(SchedulePeriodList[i], "numberPhases");
+  			  		memset(sstr ,0, sizeof(sstr) );
+  			  		while (loc[strlen("numberPhases")+2+c] != ',')
+  			  		{
+  			  			sstr[c] = loc[strlen("numberPhases")+2+c];
+  			  			//printf("i=%d sstr=%c\n",c, sstr[c]);
+  			  			c++;
+  			  		}
+  			  		sstr[c] = '\0';
+  			  		tempNumberPhasesInt = atoi(sstr);
+
+  			    	ChargePointMaxProfile.Duration = durationInt;
+  			    	ChargePointMaxProfile.TotalPeriod = n_SchedulePeriods;
+  			    	ChargePointMaxProfile.Period[i].Limit = tempLimitInt;
+  			    	ChargePointMaxProfile.Period[i].NumberPhases = tempNumberPhasesInt;
+  			    	ChargePointMaxProfile.Period[i].StartPeriod = tempStartPeriodInt;
+
+  			  	  }
+
+  			  		if(MinChargingRate < tempminChargingRateFloat)
+  			  			MinChargingRate = tempminChargingRateFloat;
+  			  	}
+
+  			}// End of file ChargingProfile
+
+  		} //THE END OF ACCESS ChargePointMaxProfile
+
+
+
+  	  	/******************************TxDefaultProfile***********************************************/
+
+  		strcpy(fname, TxDefaultProfile_0_JSON);
+
+  		memset(word, 0, 30);
+  		memset(sLineWord, 0, 1060);
+  	  	//char word[30]={0};
+  	  	//char sLineWord[1060]={0};
+  	  	n_chargingProfile=0;
+  	  	TxDefaultProfileFileIsNull=TRUE;
+  	  	if((access(fname,F_OK))!=-1)
+  	  	{
+  	  		fptr1 = fopen(fname, "r");
+
+  	  		c = 0;
+  	  	  	c = fgetc(fptr1);
+  	  	  	DEBUG_INFO("c:%d\n",c);
+  	  	  	rewind(fptr1);
+
+  	  	  	if(c == EOF)
+  	  	  	{
+  	  	  		DEBUG_INFO("\n End of file ChargingProfile reached.");
+
+  	  	  	  	TxDefaultProfileFileIsNull=TRUE;
+  	  	  	  	fclose(fptr1);
+  	  	  	}
+  	  	  	else
+  	  	  	{
+  	  	  	  	TxDefaultProfileFileIsNull=FALSE;
+  	  	  	  	while(fscanf(fptr1, "%s", word) != EOF)
+  	  	  	  	{
+  	  	  	  		if(strcmp(word, "chargingProfileId") == 0)
+  	  	  	  		{
+  	  	  	  			n_chargingProfile = n_chargingProfile + 1;
+  	  	  	  			printf("Found\n");
+  	  	  	  		}
+  	  	  	  	}
+  	  	  	  	rewind(fptr1);
+
+  	  	  	  	//search Charging Profile Element
+  	  	  	  	int i= 0;
+  	  	  	  	while ( fgets( sLineWord, sizeof sLineWord, fptr1 ) != NULL ) {
+
+#if 0
+  	  	  	  	/***********connectorId****************/
+  	  	  	  	c = 0;
+  	  	  	  	loc = strstr(sLineWord, "connectorId");
+  	  	  	  	//	printf("loc=%s\n",loc);
+  	  	  	  	memset(sstr ,0, sizeof(sstr) );
+  	  	  	  	while (loc[strlen("connectorId")+2+c] != ',')
+  	  	  	  	{
+  	  	  	  		sstr[c] = loc[strlen("connectorId")+2+c];
+  	  	  	  		//printf("i=%d sstr=%c\n",c, sstr[c]);
+  	  	  	  		c++;
+  	  	  	  	}
+  	  	  	  	sstr[c] = '\0';
+  	  	  	  	DEBUG_INFO("connectorId=%d\n",atoi(sstr));
+  	  	  	  	tempconnectorIdInt = atoi(sstr);
+#endif
+
+  	  	  	  	/***********validFrom**************/
+  	  	  	  	c = 0;
+  	  	  	  	loc = strstr(sLineWord, "validFrom");
+  	  	  	  	//DEBUG_INFO("loc=%s\n",loc);
+  	  	  	  	memset(sstr ,0, sizeof(sstr) );
+
+  	  	  	  	if(loc != NULL)
+  	  	  	  	{
+  	  	  	  	  	while (loc[3+strlen("validFrom")+c] != '\"')
+  	  	  	  	  	{
+  	  	  	  	  		sstr[c] = loc[3+strlen("validFrom")+c];
+  	  	  	  	  		//printf("i=%d sstr=%c\n",c, sstr[c]);
+  	  	  	  	  		c++;
+  	  	  	  	  	}
+  	  	  	  	  	sstr[c] = '\0';
+  	  	  	  	  	DEBUG_INFO("validFrom=%s\n",sstr);
+  	  	  	  	  	strcpy(tempvalidFromStr,sstr);
+
+  	  	  	  	}
+  	  	  	  	else
+  	  	  	  	{
+  	  	  	  		strcpy(tempvalidFromStr,"");
+  	  	  	  	}
+
+
+  	  	  	  	/**********startSchedule**********/
+  	  	  	  	c = 0;
+  	  	  	  	loc = strstr(sLineWord, "startSchedule");
+  	  	  	  	//DEBUG_INFO("loc=%s\n",loc);
+  	  	  	  	memset(sstr ,0, sizeof(sstr) );
+  	  	  	  	while (loc[3+strlen("startSchedule")+c] != '\"')
+  	  	  	  	{
+  	  	  	  		sstr[c] = loc[3+strlen("startSchedule")+c];
+  	  	  	  		//printf("i=%d sstr=%c\n",c, sstr[c]);
+  	  	  	  		c++;
+  	  	  	  	}
+  	  	  	  	sstr[c] = '\0';
+  	  	  	  	strcpy(tempstartScheduleStr, sstr);
+
+
+  	  	  		DEBUG_INFO(" debug  3-1\n");
+  	  	  		/**********startSchedule**********/
+  	  	  		c = 0;
+  	  	  		loc = strstr(sLineWord, "chargingRateUnit");
+  	  	  		memset(sstr ,0, sizeof(sstr) );
+  	  	  		while (loc[3+strlen("chargingRateUnit")+c] != '\"')
+  	  	  		{
+  	  	  		  	sstr[c] = loc[3+strlen("chargingRateUnit")+c];
+  	  	  		  	c++;
+  	  	  		}
+  	  	  		sstr[c] = '\0';
+  	  	  		strcpy(tempchargingRateUnitStr, sstr);
+
+  	  	  	  	/**********minChargingRate*******/
+  	  	  	  	c = 0;
+  	  	  	  	loc = strstr(sLineWord, "minChargingRate");
+  	  	  	  	//printf("loc=%s\n",loc);
+  	  	  	  	if(loc != NULL)
+  	  	  	  	{
+  	  	  	  	  	memset(sstr ,0, sizeof(sstr) );
+  	  	  	  	  	while (loc[3+strlen("minChargingRate")+c] != '\"')
+  	  	  	  	  	{
+  	  	  	  	  		sstr[c] = loc[3+strlen("minChargingRate")+c];
+  	  	  	  	  		//printf("i=%d sstr=%c\n",c, sstr[c]);
+  	  	  	  	  		c++;
+  	  	  	  	  	}
+  	  	  	  	  	sstr[c] = '\0';
+  	  	  	  	  	tempminChargingRateFloat = atof(sstr);
+  	  	  	  	}
+  	  	  	  	else
+  	  	  	  	{
+  	  	  	  		tempminChargingRateFloat = 0.0;
+  	  	  	  	}
+
+
+  	  	  	  	//
+  	  	  	  	strptime(tempstartScheduleStr, "%Y-%m-%dT%H:%M:%S", &tp);
+  	  	  	  	tp.tm_isdst = -1;
+  	  	  	  	time_t utc = mktime(&tp);
+  	  	  	  	// current time
+  	  	  	  	time_t t = time(NULL);
+  	  	  	  	diff_t = difftime(t, utc);
+
+  	  	  	  	//parsing strings to words
+  	  	  	  	i = 0;
+  	  	  	  	loc = strstr(sLineWord, "chargingSchedulePeriod");
+  	  	  	  	loc = loc+3+strlen("chargingSchedulePeriod");
+  	  	  	  	pch = strtok(loc ,"{");
+  	  	  	  	while (pch != NULL)
+  	  	  	  	{
+  	  	  	  		strcpy(SchedulePeriodList[i], pch);
+  	  	  	  		//printf ("SchedulePeriodList[%d]:%s\n",i,SchedulePeriodList[i]);
+  	  	  	  		//printf ("%s\n",pch);
+  	  	  	  		pch = strtok (NULL, "{");
+  	  	  	  		i = i + 1;
+  	  	  	  	}
+  	  	  	  	n_SchedulePeriods = i;
+
+  	  	  	  	for(int i=0;i<n_SchedulePeriods;i++)
+  	  	  	  	{
+  	  	  	  	/*************startPeriod****************/
+  	  	  	  		c = 0;
+  	  	  	  		loc = strstr(SchedulePeriodList[i], "startPeriod");
+  	  	  	  		memset(sstr ,0, sizeof(sstr) );
+  	  	  	  		while (loc[strlen("startPeriod")+2+c] != ',')
+  	  	  	  		{
+  	  	  	  			sstr[c] = loc[strlen("startPeriod")+2+c];
+  	  	  	  			//printf("i=%d sstr=%c\n",c, sstr[c]);
+  	  	  	  			c++;
+  	  	  	  		}
+  	  	  	  		sstr[c] = '\0';
+  	  	  	  		tempStartPeriodInt = atoi(sstr);
+
+  	  	  	  		/*************limit****************/
+  	  	  	  		c = 0;
+  	  	  	  		loc = strstr(SchedulePeriodList[i], "limit");
+  	  	  	  		memset(sstr ,0, sizeof(sstr) );
+  	  	  	  		while (loc[strlen("limit")+2+c] != ',')
+  	  	  	  		{
+  	  	  	  			sstr[c] = loc[strlen("limit")+2+c];
+  	  	  	  			//printf("i=%d sstr=%c\n",c, sstr[c]);
+  	  	  	  			c++;
+  	  	  	  		}
+  	  	  	  		sstr[c] = '\0';
+  	  	  	  		tempLimitInt = atof(sstr);
+
+  	  	  	  		/*************numberPhases****************/
+  	  	  	  		c = 0;
+  	  	  	  		loc = strstr(SchedulePeriodList[i], "numberPhases");
+  	  	  	  		memset(sstr ,0, sizeof(sstr) );
+  	  	  	  		while (loc[strlen("numberPhases")+2+c] != ',')
+  	  	  	  		{
+  	  	  	  			sstr[c] = loc[strlen("numberPhases")+2+c];
+  	  	  	  			//printf("i=%d sstr=%c\n",c, sstr[c]);
+  	  	  	  			c++;
+  	  	  	  		}
+  	  	  	  		sstr[c] = '\0';
+  	  	  	  		tempNumberPhasesInt = atoi(sstr);
+
+  	  	  	    	TxDefaultProfile.Duration = durationInt;
+  	  	  	    	TxDefaultProfile.TotalPeriod = n_SchedulePeriods;
+  	  	  	    	TxDefaultProfile.Period[i].Limit = tempLimitInt;
+  	  	  	    	TxDefaultProfile.Period[i].NumberPhases = tempNumberPhasesInt;
+  	  	  	    	TxDefaultProfile.Period[i].StartPeriod = tempStartPeriodInt;
+
+  	  	  	  	  }
+
+  	  	  	  		if(MinChargingRate < tempminChargingRateFloat)
+  	  	  	  			MinChargingRate = tempminChargingRateFloat;
+  	  	  	  	}
+
+  	  	  	  }
+
+  	  		}// the end of ACCESS TxDefaultProfile
+
+
+
+
+  	  	  	 // Composite Schedule
+  	  	  	if((ChargePointMaxProfileIsNull==FALSE)&&(TxDefaultProfileFileIsNull==FALSE))
+  	  	  	{
+  	  	  		for(int index=0; index < TxDefaultProfile.TotalPeriod ; index++)
+  	  	  		{
+  	  	  			if(ChargePointMaxProfile.Period[0].Limit > TxDefaultProfile.Period[index].Limit)
+  	  	  			{
+  	  	  				ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[index].Limit = TxDefaultProfile.Period[index].Limit;
+  	  	  			}
+  	  	  			else
+  	  	  			{
+  	  	  				ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[index].Limit = ChargePointMaxProfile.Period[0].Limit;
+  	  	  			}
+
+  	  	  			ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[index].NumberPhases = TxDefaultProfile.Period[index].NumberPhases;  //for discussion
+  	  	  		  	ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[index].StartPeriod = TxDefaultProfile.Period[index].StartPeriod;
+  	  	  		  	ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.Duration = TxDefaultProfile.Duration;
+  	  	  		}
+
+  	  	  	}
+
+
+  			/* Define temporary variables */
+  			struct tm *gtime;
+  			time_t now;
+  	        char buf[28];
+  			/* Read the current system time */
+  			time(&now);
+  			/* Convert the system time to GMT (now UTC) */
+  			gtime = gmtime(&now);
+  			strftime(buf, 28, "%Y-%m-%dT%H:%M:%SZ", gtime);
+
+  			// make .conf
+  			strcpy((char *)ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.StartSchedule,buf);
+
+  			//MaxChargingProfilesInstalled is 10
+  		//	ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod =  (struct StructChargingSchedulePeriod *) malloc(sizeof(struct StructChargingSchedulePeriod)* 9);
+  			memset(ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod, 0, sizeof(struct StructChargingSchedulePeriod)* 9);
+
+  			//nPeriod = 1;
+
+  			if(chargingRateUnitStr[0] != 0)
+  			{
+  				strcpy((char *)ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingRateUnit, chargingRateUnitStr );
+  			}
+  			else
+  			{
+  				strcpy((char *)ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingRateUnit, "" );
+  			}
+  			ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.MinChargingRate = MinChargingRate;
+  			sprintf(comfirmstr, "%s", GetCompositeScheduleStatusStr[GetCompositeScheduleStatus_Accepted] );
+
+  			confirmPeriods = 1;
+  		}
+  		else if ((connectorIdInt > 0)&&((connectorIdInt -1) < gunTotalNumber/*(CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY)*/)  )
+  		{
+  			/*****************************ChargePointMaxProfile******************************************/
+  			strcpy(fname, ChargePointMaxProfile_JSON);
+  			ChargePointMaxProfileIsNull=TRUE;
+  			if((access(ChargePointMaxProfile_JSON,F_OK))!=-1)
+  			{
+  				fptr1 = fopen(fname, "r");
+
+  				int c;
+  				c = fgetc(fptr1);
+  				DEBUG_INFO("c:%d\n",c);
+  				rewind(fptr1);
+
+  				if(c == EOF)
+  				{
+  				  	DEBUG_INFO("\n End of file reached.");
+  				  ChargePointMaxProfileIsNull=TRUE;
+  				  	fclose(fptr1);
+
+  				}
+  				else
+  				{
+  					ChargePointMaxProfileIsNull=FALSE;
+  				  	while(fscanf(fptr1, "%s", word) != EOF)
+  				  	{
+  				  		if(strcmp(word, "chargingProfileId") == 0)
+  				  		{
+  				  			n_chargingProfile = n_chargingProfile + 1;
+  				  		}
+  				  	}
+  				  	rewind(fptr1);
+
+  				  	//search Charging Profile Element
+  				  	int i = 0;
+  				  	int j = 0;
+  				  	while ( fgets( sLineWord, sizeof sLineWord, fptr1 ) != NULL ) {
+
+#if 0
+  				  	/***********connectorId****************/
+  				  	c = 0;
+  				  	loc = strstr(sLineWord, "connectorId");
+  				  	memset(sstr ,0, sizeof(sstr) );
+  				  	while (loc[strlen("connectorId")+2+c] != ',')
+  				  	{
+  				  		sstr[c] = loc[strlen("connectorId")+2+c];
+  				  		//printf("i=%d sstr=%c\n",c, sstr[c]);
+  				  		c++;
+  				  	}
+  				  	sstr[c] = '\0';
+  				  	tempconnectorIdInt = atoi(sstr);
+#endif
+  				  	/***********validFrom**************/
+  				  	c = 0;
+  				  	loc = strstr(sLineWord, "validFrom");
+  				  	if(loc != NULL)
+  				  	{
+  				  		memset(sstr ,0, sizeof(sstr) );
+  				  		while (loc[3+strlen("validFrom")+c] != '\"')
+  				  		{
+  				  			sstr[c] = loc[3+strlen("validFrom")+c];
+  				  			c++;
+  				  		}
+  				  		sstr[c] = '\0';
+  				  		strcpy(tempvalidFromStr,sstr);
+  				  	}
+  				  	else
+  				  	{
+  				  		strcpy(tempvalidFromStr,"");
+  				  	}
+
+  				  	/***********validFrom**************/
+  				  	c = 0;
+  				  	loc = strstr(sLineWord, "duration");
+  				  	if(loc != NULL)
+  				  	{
+  				  		memset(sstr ,0, sizeof(sstr) );
+  				  		while (loc[2+strlen("duration")+c] != ',')
+  				  		{
+  				  			sstr[c] = loc[2+strlen("duration")+c];
+  				  			c++;
+  				  		}
+  				  		sstr[c] = '\0';
+  				  		tempdurationInt = atoi(sstr);
+  				  	}
+  				  	else
+  				  	{
+  				  		tempdurationInt = 0;
+  				  	}
+
+  				  	/**********startSchedule**********/
+  				  	c = 0;
+  				  	loc = strstr(sLineWord, "startSchedule");
+  				  	memset(sstr ,0, sizeof(sstr) );
+  				  	while (loc[3+strlen("startSchedule")+c] != '\"')
+  				  	{
+  				  		sstr[c] = loc[3+strlen("startSchedule")+c];
+  				  		c++;
+  				  	}
+  				  	sstr[c] = '\0';
+  				  	strcpy(tempstartScheduleStr, sstr);
+
+  				  	/**********startSchedule**********/
+  				  	c = 0;
+  				  	loc = strstr(sLineWord, "chargingRateUnit");
+  				  	memset(sstr ,0, sizeof(sstr) );
+  				  	while (loc[3+strlen("chargingRateUnit")+c] != '\"')
+  				  	{
+  				  		sstr[c] = loc[3+strlen("chargingRateUnit")+c];
+  				  		c++;
+  				  	}
+  				  	sstr[c] = '\0';
+  				  	strcpy(tempchargingRateUnitStr, sstr);
+
+  				  	/**********minChargingRate*******/
+  				  	c = 0;
+  				  	loc = strstr(sLineWord, "minChargingRate");
+  				  	if(loc != NULL)
+  				  	{
+  				  		memset(sstr ,0, sizeof(sstr) );
+  				  		while (loc[3+strlen("minChargingRate")+c] != '\"')
+  				  		{
+  				  			sstr[c] = loc[3+strlen("minChargingRate")+c];
+  				  			c++;
+  				  		}
+  				  		sstr[c] = '\0';
+  				  		tempminChargingRateFloat = atof(sstr);
+  				  	}
+  				  	else
+  				  	{
+  				  		tempminChargingRateFloat = 0.0;
+  				  	}
+
+  				  	//
+  				  	strptime(tempstartScheduleStr, "%Y-%m-%dT%H:%M:%S", &tp);
+  				  	tp.tm_isdst = -1;
+  				  	time_t utc = mktime(&tp);
+  				  	time_t t = time(NULL);
+  				  	diff_t = difftime(t, utc);
+
+  				  	DEBUG_INFO("diff_t=%f\n",diff_t);
+  				  	DEBUG_INFO(" debug  5 -1\n");
+  				  	//parsing strings to words
+  				  	i = 0;
+  				  	loc = strstr(sLineWord, "chargingSchedulePeriod");
+  				  	loc = loc+3+strlen("chargingSchedulePeriod");
+  				  	pch = strtok(loc ,"{");
+  				  	while (pch != NULL)
+  				  	{
+  				  		strcpy(SchedulePeriodList[i], pch);
+  				  		pch = strtok (NULL, "{");
+  				  		i = i + 1;
+  				  	}
+  				  	n_SchedulePeriods = i;
+
+  				  	for(int i=0;i<n_SchedulePeriods;i++)
+  				  	{
+  				  		/*************startPeriod****************/
+  				  		c = 0;
+  				  		loc = strstr(SchedulePeriodList[i], "startPeriod");
+  				  		memset(sstr ,0, sizeof(sstr) );
+  				  		while (loc[strlen("startPeriod")+2+c] != ',')
+  				  		{
+  				  			sstr[c] = loc[strlen("startPeriod")+2+c];
+  				  			//printf("i=%d sstr=%c\n",c, sstr[c]);
+  				  			c++;
+  				  		}
+  				  		sstr[c] = '\0';
+  				  		tempStartPeriodInt = atoi(sstr);
+
+  				  		/*************limit****************/
+  				  		c = 0;
+  				  		loc = strstr(SchedulePeriodList[i], "limit");
+  				  		memset(sstr ,0, sizeof(sstr) );
+  				  		while (loc[strlen("limit")+2+c] != ',')
+  				  		{
+  				  			sstr[c] = loc[strlen("limit")+2+c];
+  				  			//printf("i=%d sstr=%c\n",c, sstr[c]);
+  				  			c++;
+  				  		}
+  				  		sstr[c] = '\0';
+  				  		tempLimitInt = atof(sstr);
+
+  				  		/*************numberPhases****************/
+  				  		c = 0;
+  				  		loc = strstr(SchedulePeriodList[i], "numberPhases");
+  				  		memset(sstr ,0, sizeof(sstr) );
+  				  		while (loc[strlen("numberPhases")+2+c] != '}')
+  				  		{
+  				  			sstr[c] = loc[strlen("numberPhases")+2+c];
+  				  			//printf("i=%d sstr=%c\n",c, sstr[c]);
+  				  			c++;
+  				  		}
+  				  		sstr[c] = '\0';
+  				  		tempNumberPhasesInt = atoi(sstr);
+
+  				  		if(j == 0)
+  				  		{
+  				  			 ChargePointMaxProfile.Duration = tempdurationInt;
+  				  			 ChargePointMaxProfile.TotalPeriod = n_SchedulePeriods;
+  				  			 ChargePointMaxProfile.Period[i].Limit = tempLimitInt;
+  				  			 ChargePointMaxProfile.Period[i].NumberPhases = tempNumberPhasesInt;
+  				  			 ChargePointMaxProfile.Period[i].StartPeriod = tempStartPeriodInt;
+  				  		}
+
+  				  	}
+
+  				  	if(MinChargingRate < tempminChargingRateFloat)
+  				  	{
+  				  		MinChargingRate = tempminChargingRateFloat;
+  				  	}
+
+
+
+  				  	if(confirmPeriods < n_SchedulePeriods)
+  				  	{
+  				  		confirmPeriods = n_SchedulePeriods;
+  				  	}
+
+
+  				  		j = j + 1;
+  				  }
+
+  				  fclose(fptr1);
+
+  				}
+
+  			}// the end of access file ChargePointMaxProfile
+
+
+
+  			/****************************TxDefaultProfile************************************************/
+
+
+
+  			switch(connectorIdInt)
+  			{
+  			  	case 0:
+  			  		break;
+
+  			  	case 1:
+  			  		strcpy(fname, TxDefaultProfile_1_JSON );
+  			  		break;
+
+  			  	case 2:
+  			  		strcpy(fname, TxDefaultProfile_2_JSON );
+  			  		break;
+
+  			  	default:
+  			  		strcpy(fname, TxDefaultProfile_1_JSON );
+  			  		break;
+  			}
+
+  			TxDefaultProfileFileIsNull=TRUE;
+  			if((access(fname,F_OK))!=-1)
+  			{
+
+  	  			fptr1 = fopen(fname, "r");
+
+  	  			c = 0;
+  	  			c = fgetc(fptr1);
+  	  			DEBUG_INFO("c:%d\n",c);
+  	  			rewind(fptr1);
+
+  	  			if(c == EOF)
+  	  			{
+  	  				DEBUG_INFO("\n End of file reached.");
+  	  			TxDefaultProfileFileIsNull=TRUE;
+  	  			  	fclose(fptr1);
+
+  	  			}
+  	  			else
+  	  			{
+  	  				TxDefaultProfileFileIsNull=FALSE;
+
+  	  			  	while(fscanf(fptr1, "%s", word) != EOF)
+  	  			  	{
+  	  			  	  	if(strcmp(word, "chargingProfileId") == 0)
+  	  			  	  	{
+  	  			  	  		n_chargingProfile = n_chargingProfile + 1;
+  	  			  	  	}
+  	  			  	}
+  	  			  	rewind(fptr1);
+
+  	  			  	//search Charging Profile Element
+  	  			  	int i = 0;
+  	  			  	int j = 0;
+  	  			  	while ( fgets( sLineWord, sizeof sLineWord, fptr1 ) != NULL ) {
+#if 0
+  	  			  	/***********connectorId****************/
+  	  			  	c = 0;
+  	  			  	loc = strstr(sLineWord, "connectorId");
+  	  			  	memset(sstr ,0, sizeof(sstr) );
+  	  			  	while (loc[strlen("connectorId")+2+c] != ',')
+  	  			  	{
+  	  			  	  	sstr[c] = loc[strlen("connectorId")+2+c];
+  	  			  	  	//printf("i=%d sstr=%c\n",c, sstr[c]);
+  	  			  	  	c++;
+  	  			  	}
+  	  			  	sstr[c] = '\0';
+  	  			  	tempconnectorIdInt = atoi(sstr);
+#endif
+
+  	  			  	/***********validFrom**************/
+  	  			  	c = 0;
+  	  			  	loc = strstr(sLineWord, "validFrom");
+  	  			  	if(loc != NULL)
+  	  			  	{
+  	  			  	  	memset(sstr ,0, sizeof(sstr) );
+  	  			  	  	while (loc[3+strlen("validFrom")+c] != '\"')
+  	  			  	  	{
+  	  			  	  		sstr[c] = loc[3+strlen("validFrom")+c];
+  	  			  	  		c++;
+  	  			  	  	}
+  	  			  	  	sstr[c] = '\0';
+  	  			  	  	strcpy(tempvalidFromStr,sstr);
+  	  			  	}
+  	  			  	else
+  	  			  	{
+  	  			  	  strcpy(tempvalidFromStr,"");
+  	  			  	}
+
+  	  			    /***********validFrom**************/
+  	  			  	c = 0;
+  	  			    loc = strstr(sLineWord, "duration");
+  	  			  	if(loc != NULL)
+  	  			  	{
+  	  			  		memset(sstr ,0, sizeof(sstr) );
+  	  			  		while (loc[2+strlen("duration")+c] != ',')
+  	  			  		{
+  	  			  			sstr[c] = loc[2+strlen("duration")+c];
+  	  			  			c++;
+  	  			  		}
+  	  			  		sstr[c] = '\0';
+  	  			  		tempdurationInt = atoi(sstr);
+  	  			  	}
+  	  			  	else
+  	  			  	{
+  	  			  		tempdurationInt = 0;
+  	  			  	}
+
+  	  			  	/**********startSchedule**********/
+  	  			  	c = 0;
+  	  			  	loc = strstr(sLineWord, "startSchedule");
+  	  			  	memset(sstr ,0, sizeof(sstr) );
+  	  			  	while (loc[3+strlen("startSchedule")+c] != '\"')
+  	  			  	{
+  	  			  		sstr[c] = loc[3+strlen("startSchedule")+c];
+  	  			  	  	c++;
+  	  			  	}
+  	  			  	sstr[c] = '\0';
+  	  			  	strcpy(tempstartScheduleStr, sstr);
+
+  	  			  	/**********startSchedule**********/
+  	  			  	c = 0;
+  	  			  	loc = strstr(sLineWord, "chargingRateUnit");
+  	  			  	memset(sstr ,0, sizeof(sstr) );
+  	  			  	while (loc[3+strlen("chargingRateUnit")+c] != '\"')
+  	  			  	{
+  	  			  		sstr[c] = loc[3+strlen("chargingRateUnit")+c];
+  	  			  		c++;
+  	  			  	}
+  	  			  	sstr[c] = '\0';
+  	  			  	strcpy(tempchargingRateUnitStr, sstr);
+
+  	  			  	/**********minChargingRate*******/
+  	  			  	c = 0;
+  	  			  	loc = strstr(sLineWord, "minChargingRate");
+  	  			  	if(loc != NULL)
+  	  			  	{
+  	  			  		memset(sstr ,0, sizeof(sstr) );
+  	  			  		while (loc[3+strlen("minChargingRate")+c] != '\"')
+  	  			  	  	{
+  	  			  			sstr[c] = loc[3+strlen("minChargingRate")+c];
+  	  			  			c++;
+  	  			  	  	}
+  	  			  	  	sstr[c] = '\0';
+  	  			  	  	tempminChargingRateFloat = atof(sstr);
+  	  			  	}
+  	  			  	else
+  	  			  	{
+  	  			  	  	tempminChargingRateFloat = 0.0;
+  	  			  	}
+
+  	  			  	//
+  	  			  	strptime(tempstartScheduleStr, "%Y-%m-%dT%H:%M:%S", &tp);
+  	  			  	tp.tm_isdst = -1;
+  	  			  	time_t utc = mktime(&tp);
+  	  			  	time_t t = time(NULL);
+  	  			  	diff_t = difftime(t, utc);
+
+  	  			  	DEBUG_INFO("diff_t=%f\n",diff_t);
+  	  			  	DEBUG_INFO(" debug  5 -1\n");
+  	  			  	//parsing strings to words
+  	  			  	i = 0;
+  	  			  	loc = strstr(sLineWord, "chargingSchedulePeriod");
+  	  			  	loc = loc+3+strlen("chargingSchedulePeriod");
+  	  			  	pch = strtok(loc ,"{");
+  	  			  	while (pch != NULL)
+  	  			  	{
+  	  			  		strcpy(SchedulePeriodList[i], pch);
+  	  			  	  	pch = strtok (NULL, "{");
+  	  			  	  	i = i + 1;
+  	  			  	}
+  	  			  	n_SchedulePeriods = i;
+
+  	  			  	for(int i=0;i<n_SchedulePeriods;i++)
+  	  			  	{
+  	  			  	  	/*************startPeriod****************/
+  	  			  	  	c = 0;
+  	  			  	  	loc = strstr(SchedulePeriodList[i], "startPeriod");
+  	  			  	  	memset(sstr ,0, sizeof(sstr) );
+  	  			  	  	while (loc[strlen("startPeriod")+2+c] != ',')
+  	  			  	  	{
+  	  			  	  		sstr[c] = loc[strlen("startPeriod")+2+c];
+  	  			  	  		//printf("i=%d sstr=%c\n",c, sstr[c]);
+  	  			  	  		c++;
+  	  			  	  	}
+  	  			  	  	sstr[c] = '\0';
+  	  			  	  	tempStartPeriodInt = atoi(sstr);
+
+  	  			  	  	/*************limit****************/
+  	  			  	  	c = 0;
+  	  			  	  	loc = strstr(SchedulePeriodList[i], "limit");
+  	  			  	  	memset(sstr ,0, sizeof(sstr) );
+  	  			  	  	while (loc[strlen("limit")+2+c] != ',')
+  	  			  	  	{
+  	  			  	  		sstr[c] = loc[strlen("limit")+2+c];
+  	  			  	  		//printf("i=%d sstr=%c\n",c, sstr[c]);
+  	  			  	  		c++;
+  	  			  	  	}
+  	  			  	  	sstr[c] = '\0';
+  	  			  	  	tempLimitInt = atof(sstr);
+
+  	  			  	  	/*************numberPhases****************/
+  	  			  	  	c = 0;
+  	  			  	  	loc = strstr(SchedulePeriodList[i], "numberPhases");
+  	  			  	  	memset(sstr ,0, sizeof(sstr) );
+  	  			  	  	while (loc[strlen("numberPhases")+2+c] != '}')
+  	  			  	  	{
+  	  			  	  		sstr[c] = loc[strlen("numberPhases")+2+c];
+  	  			  	  		//printf("i=%d sstr=%c\n",c, sstr[c]);
+  	  			  	  		c++;
+  	  			  	  	}
+  	  			  	  	sstr[c] = '\0';
+  	  			  	  	tempNumberPhasesInt = atoi(sstr);
+
+  	  			  	  	if(j == 0)
+  	  			  	  	{
+  	  			  	  		TxDefaultProfile.Duration = tempdurationInt;
+  	  			  	  		TxDefaultProfile.TotalPeriod = n_SchedulePeriods;
+  	  			  	  		TxDefaultProfile.Period[i].Limit = tempLimitInt;
+  	  			  	  		TxDefaultProfile.Period[i].NumberPhases = tempNumberPhasesInt;
+  	  			  	  		TxDefaultProfile.Period[i].StartPeriod = tempStartPeriodInt;
+  	  			  	  	}
+  	  			  	  	else
+  	  			  	  	{
+  	  			  	  		//other stack level charging Profile
+  	  			  	  		TxDefaultProfiletemp[j-1].Period[i].Limit = tempLimitInt;
+  	  			  	  		TxDefaultProfiletemp[j-1].Period[i].NumberPhases = tempNumberPhasesInt;
+  	  			  	  		TxDefaultProfiletemp[j-1].Period[i].StartPeriod = tempStartPeriodInt;
+  	  			  	  		TxDefaultProfiletemp[j-1].Duration = tempdurationInt;
+  	  			  	  		TxDefaultProfiletemp[j-1].TotalPeriod = n_SchedulePeriods;
+
+  	  			  	  	}
+
+  	  			  	  }
+
+  	  			  	  	if(MinChargingRate < tempminChargingRateFloat)
+  	  			  	  		MinChargingRate = tempminChargingRateFloat;
+
+
+  	  			  	  	if(confirmPeriods < n_SchedulePeriods)
+  	  			  	  		confirmPeriods = n_SchedulePeriods;
+
+  	  			  	  	j = j + 1;
+  	  			  	}
+
+  	  			  	fclose(fptr1);
+
+  	  			  	//Stacking Charging Profiles
+
+  	  			  	for(int l=0; l <(j-1) ;l++)
+  	  			  	{
+  	  			  		for(int k=0; k < TxDefaultProfiletemp[l].TotalPeriod; k++)
+  	  			  		{
+  	  			  			if(TxDefaultProfiletemp[l].Period[k].StartPeriod > TxDefaultProfile.Duration)
+  	  			  		  	{
+  	  			  				if((k >0) && ((TxDefaultProfiletemp[l].Period[k-1].StartPeriod < TxDefaultProfile.Duration) &&(TxDefaultProfiletemp[l].Period[k-1].StartPeriod >= TxDefaultProfile.Period[TxDefaultProfile.TotalPeriod-1].StartPeriod )))
+  	  			  				{
+  	  			  					TxDefaultProfile.Period[TxDefaultProfile.TotalPeriod].Limit = TxDefaultProfiletemp[l].Period[k-1].Limit;
+  	  			  				  	TxDefaultProfile.Period[TxDefaultProfile.TotalPeriod].NumberPhases = TxDefaultProfiletemp[l].Period[k-1].NumberPhases;
+  	  			  				  	TxDefaultProfile.Period[TxDefaultProfile.TotalPeriod].StartPeriod = TxDefaultProfile.Duration;
+  	  			  				  	TxDefaultProfile.TotalPeriod = TxDefaultProfile.TotalPeriod + 1;
+  	  			  				  	TxDefaultProfile.Duration = TxDefaultProfiletemp[l].Duration;
+
+  	  			  				  	TxDefaultProfile.Period[TxDefaultProfile.TotalPeriod].Limit = TxDefaultProfiletemp[l].Period[k].Limit;
+  	  			  				  	TxDefaultProfile.Period[TxDefaultProfile.TotalPeriod].NumberPhases = TxDefaultProfiletemp[l].Period[k].NumberPhases;
+  	  			  				  	TxDefaultProfile.Period[TxDefaultProfile.TotalPeriod].StartPeriod = TxDefaultProfiletemp[l].Period[k].StartPeriod;
+  	  			  				  	TxDefaultProfile.TotalPeriod = TxDefaultProfile.TotalPeriod + 1;
+  	  			  				  	TxDefaultProfile.Duration = TxDefaultProfiletemp[l].Duration;
+
+
+  	  			  				}
+  	  			  				else
+  	  			  			  	{
+  	  			  			  	  	TxDefaultProfile.Period[TxDefaultProfile.TotalPeriod].Limit = TxDefaultProfiletemp[l].Period[k].Limit;
+  	  			  			  	  	TxDefaultProfile.Period[TxDefaultProfile.TotalPeriod].NumberPhases = TxDefaultProfiletemp[l].Period[k].NumberPhases;
+  	  			  			  	  	TxDefaultProfile.Period[TxDefaultProfile.TotalPeriod].StartPeriod = TxDefaultProfiletemp[l].Period[k].StartPeriod;
+  	  			  			  	  	TxDefaultProfile.TotalPeriod = TxDefaultProfile.TotalPeriod + 1;
+  	  			  			  	  	TxDefaultProfile.Duration = TxDefaultProfiletemp[l].Duration;
+
+  	  			  			  	 }
+
+
+  	  			  		  	}
+
+  	  			  		}
+
+  	  			  	}
+  	  			  	//end of Stacking Charging Profiles
+
+  	  			 }
+
+  			}// the end of ACCESS TxDefaultProfile
+
+
+
+  			/****************************TxProfile************************************************/
+  			switch(connectorIdInt)
+  			{
+  			  	case 0:
+  			  		break;
+
+  			  	case 1:
+  			  		strcpy(fname, TxProfile_1_JSON );
+  			  		break;
+
+  			  	case 2:
+  			  		strcpy(fname, TxProfile_2_JSON );
+  			  		break;
+
+  			  	default:
+  			  		strcpy(fname, TxProfile_1_JSON );
+  			  		break;
+  			}
+
+  			TxProfileIsNull=TRUE;
+  			if((access(fname,F_OK))!=-1)
+  			{
+  				fptr1 = fopen(fname, "r");
+  				c = 0;
+  				c = fgetc(fptr1);
+  				DEBUG_INFO("c:%d\n",c);
+  				rewind(fptr1);
+
+  				if(c == EOF)
+  				{
+  				  	DEBUG_INFO("\n End of file reached.");
+  				  	TxProfileIsNull=TRUE;
+  				  	fclose(fptr1);
+
+  				}
+  				else
+  				{
+  				  	TxProfileIsNull=FALSE;
+
+  				  	while(fscanf(fptr1, "%s", word) != EOF)
+  				  	{
+  				  	  	if(strcmp(word, "chargingProfileId") == 0)
+  				  	  	{
+  				  	  		n_chargingProfile = n_chargingProfile + 1;
+  				  	  	}
+  				  	}
+  				  	rewind(fptr1);
+
+  					//search Charging Profile Element
+  				  	int i= 0;
+  				  	while ( fgets( sLineWord, sizeof sLineWord, fptr1 ) != NULL ) {
+
+#if 0
+  				  	  	/***********connectorId****************/
+  				  	  	c = 0;
+  				  	  	loc = strstr(sLineWord, "connectorId");
+  				  	  	memset(sstr ,0, sizeof(sstr) );
+  				  	  	while (loc[strlen("connectorId")+2+c] != ',')
+  				  	  	{
+  				  	  		sstr[c] = loc[strlen("connectorId")+2+c];
+  				  	  		//printf("i=%d sstr=%c\n",c, sstr[c]);
+  				  	  		c++;
+  				  	  	}
+  				  	  	sstr[c] = '\0';
+  				  	  	tempconnectorIdInt = atoi(sstr);
+#endif
+
+  				  	  	/***********validFrom**************/
+  				  	  	c = 0;
+  				  	  	loc = strstr(sLineWord, "validFrom");
+  				  	  	if(loc != NULL)
+  				  	  	{
+  				  	  		memset(sstr ,0, sizeof(sstr) );
+  				  	  		while (loc[3+strlen("validFrom")+c] != '\"')
+  				  	  		{
+  				  	  			sstr[c] = loc[3+strlen("validFrom")+c];
+  				  	  			c++;
+  				  	  		}
+  				  	  		sstr[c] = '\0';
+  				  	  		strcpy(tempvalidFromStr,sstr);
+  				  	  	}
+  				  	  	else
+  				  	  	{
+  				  	  		strcpy(tempvalidFromStr,"");
+  				  	  	}
+
+  				  	  	/**********startSchedule**********/
+  				  	  	c = 0;
+  				  	  	loc = strstr(sLineWord, "startSchedule");
+  				  	  	memset(sstr ,0, sizeof(sstr) );
+  				  	  	while (loc[3+strlen("startSchedule")+c] != '\"')
+  				  	  	{
+  				  	  		sstr[c] = loc[3+strlen("startSchedule")+c];
+  				  	  		c++;
+  				  	  	}
+  				  	  	sstr[c] = '\0';
+  				  	  	strcpy(tempstartScheduleStr, sstr);
+
+  				  	  	/**********startSchedule**********/
+  				  	  	c = 0;
+  				  	  	loc = strstr(sLineWord, "chargingRateUnit");
+  				  	  	memset(sstr ,0, sizeof(sstr) );
+  				  	  	while (loc[3+strlen("chargingRateUnit")+c] != '\"')
+  				  	  	{
+  				  	  	 	sstr[c] = loc[3+strlen("chargingRateUnit")+c];
+  				  	  	 	c++;
+  				  	  	}
+  				  	  	sstr[c] = '\0';
+  				  	  	strcpy(tempchargingRateUnitStr, sstr);
+
+  				  	  	/**********minChargingRate*******/
+  				  	  	c = 0;
+  				  	  	loc = strstr(sLineWord, "minChargingRate");
+  				  	  	if(loc != NULL)
+  				  	  	{
+  				  	  		memset(sstr ,0, sizeof(sstr) );
+  				  	  		while (loc[3+strlen("minChargingRate")+c] != '\"')
+  				  	  		{
+  				  	  			sstr[c] = loc[3+strlen("minChargingRate")+c];
+  				  	  			c++;
+  				  	  		}
+  				  	  		sstr[c] = '\0';
+  				  	  		tempminChargingRateFloat = atof(sstr);
+  				  	  	}
+  				  	  	else
+  				  	  	{
+  				  	  		tempminChargingRateFloat = 0.0;
+  				  	  	}
+
+  				  	   	//
+  				  	  	strptime(tempstartScheduleStr, "%Y-%m-%dT%H:%M:%S", &tp);
+  				  	  	tp.tm_isdst = -1;
+  				  	  	time_t utc = mktime(&tp);
+  				  	  	time_t t = time(NULL);
+  				  	  	diff_t = difftime(t, utc);
+
+  				  	  	DEBUG_INFO("diff_t=%f\n",diff_t);
+  				  	  	//parsing strings to words
+  				  	  	i = 0;
+  				  	  	loc = strstr(sLineWord, "chargingSchedulePeriod");
+  				  	  	loc = loc+3+strlen("chargingSchedulePeriod");
+  				  	  	pch = strtok(loc ,"{");
+  				  	  	while (pch != NULL)
+  				  	  	{
+  				  	  		strcpy(SchedulePeriodList[i], pch);
+  				  	  		pch = strtok (NULL, "{");
+  				  	  		i = i + 1;
+  				  	  	}
+  				  	  	n_SchedulePeriods = i;
+
+  				  	  	for(int i=0;i<n_SchedulePeriods;i++)
+  				  	  	{
+  				  	  		/*************startPeriod****************/
+  				  	  		c = 0;
+  				  	  		loc = strstr(SchedulePeriodList[i], "startPeriod");
+  				  	  		memset(sstr ,0, sizeof(sstr) );
+  				  	  		while (loc[strlen("startPeriod")+2+c] != ',')
+  				  	  		{
+  				  	  			sstr[c] = loc[strlen("startPeriod")+2+c];
+  				  	  			 //printf("i=%d sstr=%c\n",c, sstr[c]);
+  				  	  			c++;
+  				  	  		}
+  				  	  		sstr[c] = '\0';
+  				  	  		tempStartPeriodInt = atoi(sstr);
+
+  				  	  		/*************limit****************/
+  				  	  		c = 0;
+  				  	  		loc = strstr(SchedulePeriodList[i], "limit");
+  				  	  		memset(sstr ,0, sizeof(sstr) );
+  				  	  		while (loc[strlen("limit")+2+c] != ',')
+  				  	  		{
+  				  	  			sstr[c] = loc[strlen("limit")+2+c];
+  				  	  			//printf("i=%d sstr=%c\n",c, sstr[c]);
+  				  	  			c++;
+  				  	  		}
+  				  	  		sstr[c] = '\0';
+  				  	  		tempLimitInt = atof(sstr);
+
+  				  	  		/*************numberPhases****************/
+  				  	  		c = 0;
+  				  	  		loc = strstr(SchedulePeriodList[i], "numberPhases");
+  				  	  		memset(sstr ,0, sizeof(sstr) );
+  				  	  		while (loc[strlen("numberPhases")+2+c] != '}')
+  				  	  		{
+  				  	  			sstr[c] = loc[strlen("numberPhases")+2+c];
+  				  	  			//printf("i=%d sstr=%c\n",c, sstr[c]);
+  				  	  			c++;
+  				  	  		}
+  				  	  		sstr[c] = '\0';
+  				  	  		tempNumberPhasesInt = atoi(sstr);
+
+
+  				  	  		TxProfile.Duration = durationInt;
+  				  	  		TxProfile.TotalPeriod = n_SchedulePeriods;
+  				  	  		TxProfile.Period[i].Limit = tempLimitInt;
+  				  	  		TxProfile.Period[i].NumberPhases = tempNumberPhasesInt;
+  				  	  		TxProfile.Period[i].StartPeriod = tempStartPeriodInt;
+  				  	  	}
+
+  				  	  	if(MinChargingRate < tempminChargingRateFloat)
+  				  	  		MinChargingRate = tempminChargingRateFloat;
+
+  				  	  	if(confirmPeriods < n_SchedulePeriods)
+  				  	  		confirmPeriods = n_SchedulePeriods;
+  				  	  	}
+
+  				  	  	fclose(fptr1);
+
+  				  	}
+
+  			}// the end of ACCESS TxProfile
+
+
+
+
+  			//CompositeSchedule
+  			int period=0;
+  			if((TxDefaultProfileFileIsNull==FALSE) && (ChargePointMaxProfileIsNull==FALSE) && (TxProfileIsNull==FALSE) )
+  			{
+  				for(int k=0; k < TxProfile.TotalPeriod;k++)
+  				{
+  					if(TxProfile.Period[k].Limit < ChargePointMaxProfile.Period[0].Limit)
+  					{
+  				  		ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[period].Limit = TxProfile.Period[k].Limit;
+  			  			ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[period].NumberPhases = TxProfile.Period[k].NumberPhases;
+  			  			ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[period].StartPeriod = TxProfile.Period[k].StartPeriod;
+  			  			period = period + 1;
+  					}
+  					else
+  					{
+  						if( (TxProfile.Period[k-1].Limit >= ChargePointMaxProfile.Period[0].Limit) && (TxProfile.Period[k].Limit >= ChargePointMaxProfile.Period[0].Limit))
+  						{
+
+  						}
+  						else
+  						{
+  							ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[period].Limit = ChargePointMaxProfile.Period[0].Limit;
+  							ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[period].NumberPhases = TxProfile.Period[k].NumberPhases;
+  							ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[period].StartPeriod = TxProfile.Period[k].StartPeriod;
+  							period = period + 1;
+  						}
+
+  					}
+  				}
+
+  				for(int l=0; l < TxDefaultProfile.TotalPeriod;l++)
+  				{
+  					if((TxDefaultProfile.Period[l].StartPeriod < durationInt)&&(TxDefaultProfile.Period[l].StartPeriod > ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[period-1].StartPeriod))
+  					{
+  						if(TxDefaultProfile.Period[l].Limit < ChargePointMaxProfile.Period[0].Limit)
+  						{
+  						  	ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[period].Limit = TxDefaultProfile.Period[l].Limit;
+  						}
+  						else
+  						{
+  							ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[period].Limit = ChargePointMaxProfile.Period[0].Limit;
+
+  						}
+  						ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[period].NumberPhases = TxDefaultProfile.Period[l].NumberPhases;
+  					  	ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[period].StartPeriod = TxDefaultProfile.Period[l].StartPeriod;
+
+  						period = period + 1;
+  				   }
+
+
+  			    }
+
+  				if((TxDefaultProfile.Duration < durationInt) && (ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[period-1].Limit) < ChargePointMaxProfile.Period[0].Limit)
+  				{
+  					ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[period].Limit = ChargePointMaxProfile.Period[0].Limit;
+  			  		ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[period].NumberPhases = ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[period-1].NumberPhases;
+  			  		ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[period].StartPeriod = TxDefaultProfile.Duration;
+  			  		period = period + 1;
+
+  				}
+
+  			}
+  			else if((TxDefaultProfileFileIsNull==FALSE) && (ChargePointMaxProfileIsNull==FALSE) && (TxProfileIsNull==TRUE) )
+  			{
+  				for(int l=0; l < TxDefaultProfile.TotalPeriod;l++)
+  				{
+  					if(TxProfile.Period[l].Limit < ChargePointMaxProfile.Period[0].Limit)
+  					{
+  					  	ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[l].Limit = TxDefaultProfile.Period[l].Limit;
+  					  	ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[l].NumberPhases = TxDefaultProfile.Period[l].NumberPhases;
+  					  	ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[l].StartPeriod = TxDefaultProfile.Period[l].StartPeriod;
+  					  	period = period + 1;
+  					}
+  					else
+  					{
+
+  	  				  	ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[l].Limit = ChargePointMaxProfile.Period[0].Limit;
+  	  				  	ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[l].NumberPhases = TxDefaultProfile.Period[l].NumberPhases;
+  	  				  	ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[l].StartPeriod = TxDefaultProfile.Period[l].StartPeriod;
+  	  				  	period = period + 1;
+  					}
+  				}
+
+  			}
+  			else if((TxDefaultProfileFileIsNull==FALSE) && (ChargePointMaxProfileIsNull==TRUE) && (TxProfileIsNull==TRUE) )
+  		  	{
+  		  		for(int l=0; l < TxDefaultProfile.TotalPeriod;l++)
+  		  		{
+  		  	  		ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[l].Limit = TxDefaultProfile.Period[l].Limit;
+  		  	  		ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[l].NumberPhases = TxDefaultProfile.Period[l].NumberPhases;
+  		  	  		ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingSchedulePeriod[l].StartPeriod = TxDefaultProfile.Period[l].StartPeriod;
+  		  	  		period = period + 1;
+  		  		}
+
+  		  	}
+
+  			confirmPeriods = period;
+  			//DEBUG_INFO("confirmPeriods=%d\n",confirmPeriods);
+
+  			/* Define temporary variables */
+  			struct tm *gtime;
+  			time_t now;
+  			char buf[28];
+  			/* Read the current system time */
+  			time(&now);
+  			/* Convert the system time to GMT (now UTC) */
+  			gtime = gmtime(&now);
+  			strftime(buf, 28, "%Y-%m-%dT%H:%M:%SZ", gtime);
+
+  			// make .conf
+  			strcpy((char *)ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.StartSchedule,buf);
+  			ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.Duration = durationInt;
+  			//DEBUG_INFO(" debug  11\n");
+  		//	if(chargingRateUnitStr[0] != 0)
+  		//	{
+  		//		strcpy((char *)ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingRateUnit, chargingRateUnitStr );
+  		//	}
+  		//	else
+  			{
+  				strcpy((char *)ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.ChargingRateUnit, tempchargingRateUnitStr );
+  			}
+  			ShmOCPP16Data->GetCompositeSchedule[0].ResponseChargingSchedule.MinChargingRate = MinChargingRate;
+  			sprintf(comfirmstr, "%s", GetCompositeScheduleStatusStr[GetCompositeScheduleStatus_Accepted] );
+  		}
+  		else
+  		{
+
+  			sprintf(comfirmstr, "%s", GetCompositeScheduleStatusStr[GetCompositeScheduleStatus_Accepted] );
+  		}
+
+	sendGetCompositeScheduleConfirmation(uuid,comfirmstr, connectorIdInt, confirmPeriods);
+
+	return result;
+}
+
+int handleGetConfigurationRequest(char *uuid, char *payload)
+{
+	mtrace();
+	int result = FAIL;
+//	struct json_object *obj=NULL, *key=NULL;// *jsonitem;
+	//struct json_object *jsonitem;
+	int MaxKeySupported = 0;
+	int n_keys = 0;
+	char requestKey[43][50]={0};
+	char search[]="[";
+	char sstr[500]={ 0 };
+	//int pos;
+	int l, c = 0;
+	int i = 0;
+	char *delim = "\",\"";
+	char * pch;
+	char *loc = strstr(payload, search);
+
+
+	/*********************  Parsing String ***********************************/
+
+	if(loc == NULL) {
+		DEBUG_INFO("no key match in Configuration \n");
+	}
+	else {
+		//pos = loc - payload;
+		l = strlen(loc)-4;
+		while (c < l)
+		{
+			sstr[c] = loc[c+2];
+			c++;
+		}
+		sstr[c] = '\0';
+
+		//parsing strings to words
+		pch = strtok(sstr,delim);
+	    if(pch == NULL)
+	    {
+	    	strcpy(requestKey[0], sstr);
+	    }
+	    else
+	    {
+	    	while (pch != NULL)
+	    	{
+	    		strcpy(requestKey[i], pch);
+	    	   	pch = strtok (NULL, delim);
+	    		i = i + 1;
+	    	}
+
+	    	n_keys = i;
+	    }
+
+
+	}
+
+	UnknownKeynum = 0;
+	memset( (void *)unknownkey, 0, sizeof(unknownkey)/*sizeof(char)*10*20*/ );
+
+	MaxKeySupported = GetConfigurationMaxKeysNUM;//atoi(ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemData);
+
+	memset(ShmOCPP16Data->GetConfiguration.Key, 0 ,sizeof(struct StructConfigurationKeyItems)*MaxKeySupported);
+	memset(ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey, 0, sizeof(struct StructConfigurationKey)*MaxKeySupported);
+
+	if(n_keys != 0)
+	{
+		for(int i=0;i<n_keys;i++)
+		{
+			getKeyValue(requestKey[i]);
+			//json_object_put(jsonitem);
+	   }
+	}
+	else
+	{
+		DEBUG_INFO("There is no key in Message, get all configuration\n");
+		getKeyValue("");
+	}
+
+	processUnkownKey();
+	sendGetConfigurationConfirmation(uuid);
+
+	return result;
+}
+
+int handleGetDiagnosticsRequest(char *uuid, char *payload)
+{
+	mtrace();
+	int result = FAIL;
+	//void *ret; //
+	char fnamePlusPath[50]="";
+	char fname[16]="";
+	pthread_t t; // pthread 變數
+	time_t rawtime;
+	struct tm * timeinfo;
+
+	//system("exec /root/Module_WebService 'log' 6"); // for OCTT TEST
+	system("exec /root/logPackTools 'log' 6");
+
+	//char buffer [128];
+	time (&rawtime);
+	//printf("%ld\n", rawtime);
+	timeinfo = localtime (&rawtime);
+	strftime (fnamePlusPath,sizeof(fnamePlusPath),"../mnt/%4Y-%2m.zip",timeinfo);
+	DEBUG_INFO("fnamePlusPath =%s\n",fnamePlusPath);
+	if((access(fnamePlusPath,F_OK))!=-1)
+	{
+		DEBUG_INFO("fnamePlusPath exist.\n");
+		strftime (fname,sizeof(fname),"%4Y-%2m.zip",timeinfo);
+	}
+	else
+	{
+		DEBUG_INFO("fnamePlusPath not exist!\n");
+	}
+
+
+	sendGetDiagnosticsConfirmation(uuid,fname/*(char*) ret*/);
+	pthread_create(&t, NULL, GetDiagnosticsProcess, payload); // 建�?�執行�?
+    pthread_join(t, NULL/*&ret*/);
+  //  ShmOCPP16Data->MsMsg.bits.GetDiagnosticsReq = 1;
+	//sendGetDiagnosticsConfirmation(uuid,fname);
+   // sendGetDiagnosticsConfirmation(uuid,(char*) ret);
+  //  ShmOCPP16Data->MsMsg.bits.GetDiagnosticsConf = 1;
+
+
+	return result;
+}
+
+
+void* GetDiagnosticsProcess(void* data)
+{
+	mtrace();
+	int retriesInt=0, retryIntervalInt=0;
+	char locationstr[100]={0}, startTimestr[30]={0}, stopTimestr[30]={0} ;
+	int retriesIsNULL,retryIntervalIsNULL, startTimeIsNULL, stopTimeIsNULL;
+	char protocol[10]={0}, user[50]={0},password[50]={0},host[50]={0}, path[50]={0}, ftppath[60]={0},host1[50]={0},path1[50]={0};
+	int port=0;
+	char fnamePlusPath[50]="";//="00000_2019-06-09_160902_CSULog.zip";
+	char fname[16]="";
+	char sstr[260]={ 0 };//sstr[200]={ 0 };
+	int c = 0;
+	char *loc;
+	int isSuccess = FALSE;
+	char ftpbuf[200]={0};
+	//char temp[100]={0};
+	char * pch;
+
+//	[2,"137d88c7-a403-4ead-bb2d-fc6ec90531c1","GetDiagnostics",{"location":"ftp://ipc_ui:pht2016@ftp.phihong.com.tw/DC/log/","retries":0,"retryInterval":0,"startTime":"0001-01-01T00:00:00.000Z","stopTime":"0001-01-01T00:00:00.000Z"}]
+	char *str = (char*) data; // ?��?輸入資�?
+
+	retriesIsNULL = retryIntervalIsNULL = startTimeIsNULL = stopTimeIsNULL = FALSE;
+
+	DEBUG_INFO("sendDiagnosticsStatusNotificationRequest 1\n");
+	sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatus_Uploading]);
+
+	/****************location*******************/
+	c = 0;
+	memset(sstr ,0, sizeof(sstr) );
+	loc = strstr(str, "location");
+	while (loc[3+strlen("location")+c] != '\"')
+	{
+		sstr[c] = loc[3+strlen("location")+c];
+		c++;
+	}
+	sstr[c] = '\0';
+	strcpy(locationstr,sstr);
+
+	if(strcmp(locationstr,"")==0)
+	{
+		DEBUG_INFO("location is <Empty>!\n");
+		sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatus_UploadFailed]);
+		goto end;
+
+	}
+
+	/****************retries*******************/
+	c = 0;
+	loc = strstr(str, "retries");
+	if(loc == NULL)
+	{
+		retriesIsNULL = TRUE;
+	}
+	else
+	{
+		while (loc[strlen("retries")+2+c] != ',')
+		{
+			sstr[c] = loc[strlen("retries")+2+c];
+			c++;
+		}
+		sstr[c] = '\0';
+		retriesInt = atoi(sstr);
+	}
+
+	if(retriesIsNULL == TRUE)
+	{
+		retriesInt = 0;
+	}
+
+	/****************retryInterval*******************/
+	c = 0;
+	loc = strstr(str, "retryInterval");
+	if(loc == NULL)
+	{
+		retryIntervalIsNULL = TRUE;
+	}
+	else
+	{
+		while (loc[strlen("retryInterval")+2+c] != ',')
+		{
+			sstr[c] = loc[strlen("retryInterval")+2+c];
+			c++;
+		}
+		sstr[c] = '\0';
+		retryIntervalInt = atoi(sstr);
+	}
+
+	/****************startTime*******************/
+	c = 0;
+	memset(sstr ,0, sizeof(sstr) );
+	loc = strstr(str, "startTime");
+	if(loc == NULL)
+	{
+		startTimeIsNULL = TRUE;
+	}
+	else
+	{
+		while (loc[3+strlen("startTime")+c] != '\"')
+		{
+			sstr[c] = loc[3+strlen("startTime")+c];
+			c++;
+		}
+		sstr[c] = '\0';
+		strcpy(startTimestr,sstr);
+	}
+
+
+	/****************stopTime*******************/
+	c = 0;
+	memset(sstr ,0, sizeof(sstr) );
+	loc = strstr(str, "stopTime");
+	if(loc == NULL)
+	{
+		stopTimeIsNULL = TRUE;
+	}
+	else
+	{
+		while (loc[3+strlen("stopTime")+c] != '\"')
+		{
+			sstr[c] = loc[3+strlen("stopTime")+c];
+			c++;
+		}
+		sstr[c] = '\0';
+		strcpy(stopTimestr,sstr);
+	}
+
+	memset(protocol, 0, sizeof(protocol));
+	memset(user, 0, sizeof(user) );
+	memset(password, 0, sizeof(password));
+	memset(host, 0, sizeof(host));
+
+	memset(path, 0, sizeof(path));
+	memset(ftppath, 0, sizeof(ftppath));
+	memset(host1, 0, sizeof(host1));
+	memset(path1, 0, sizeof(path1));
+	/*location: ftp://user:password@host:port/path*/
+	//sscanf(locationstr,"%[^:]:%*2[/]%[^:]:%[^@]@%[^:]%d[^/]/%[a-zA-Z0-9._/-]",
+
+	//       protocol, user, password, host, &port, path);
+#if 0 // remove for temporally
+	//zip files in /Storage
+	system("exec /root/logPackTools 'log' 6");
+
+#endif
+
+//	system("exec /root/Module_WebService 'log' 6");
+
+	time_t rawtime;
+	struct tm * timeinfo;
+	//char buffer [128];
+	time (&rawtime);
+	//printf("%ld\n", rawtime);
+	timeinfo = localtime (&rawtime);
+	strftime (fnamePlusPath,sizeof(fnamePlusPath),"../mnt/%4Y-%2m.zip",timeinfo);
+	strftime (fname,sizeof(fname),"%4Y-%2m.zip",timeinfo);
+	DEBUG_INFO("fnamePlusPath =%s\n",fnamePlusPath);
+	if((access(fnamePlusPath,F_OK))!=-1)
+	{
+		DEBUG_INFO("fnamePlusPath exist.\n");
+	}
+	else
+	{
+		DEBUG_INFO("fnamePlusPath not exist!\n");
+		goto end;
+
+	}
+
+	pch=strchr(locationstr,'@');
+
+	if(pch==NULL)
+	{
+		sscanf(locationstr,
+			         "%[^:]:%*2[/]%[^:]:%i/%[a-zA-Z0-9._/-]",
+			         protocol, host, &port, path);
+		strcpy(user,"anonymous");
+		strcpy(password,"");
+	}
+	else
+	{
+		DEBUG_INFO("pch=%s\n", pch);
+		sscanf(locationstr,"%[^:]:%*2[/]%[^:]:%[^@]@%[^:]:%i/%199[^\n]",
+				   protocol, user, password, host, &port, path);
+	}
+
+	if(strcmp(protocol,"ftp")!=0)
+	{
+		DEBUG_INFO("protocol is not ftp!\n");
+		sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatus_UploadFailed]);
+		goto end;
+
+	}
+
+  	sscanf(host,"%[^/]%s",host1, path1);
+	sprintf(ftppath,"%s", path1);
+
+	DEBUG_INFO("protocol =%s\n",protocol);
+	DEBUG_INFO("user =%s\n",user);
+	DEBUG_INFO("password =%s\n",password);
+	DEBUG_INFO("host1 =%s\n",host1);
+	DEBUG_INFO("port =%d\n",port);
+	DEBUG_INFO("path1 =%s\n",path1);
+	DEBUG_INFO("ftppath=%s\n",ftppath);
+
+	int ftppathlen=strlen(ftppath);
+	int i=1;
+	char filenametemp[50];
+	while(i < ftppathlen)
+	{
+	  int len=ftppathlen-i;
+	   if(ftppath[len]== 47) // '/' ascll code: 47
+	   {
+		   DEBUG_INFO("find '/' all right\n");
+	     break;
+	   }
+	   i=i+1;
+
+	}
+
+	memset(filenametemp, 0, sizeof(filenametemp));
+	strncpy(filenametemp, ftppath+(ftppathlen-i+1), i+1);
+	filenametemp[i+1] = 0;
+
+
+	    //httpDownLoadFile(host, ftppath, fname);
+	memset(ftpbuf, 0, sizeof(ftpbuf));
+
+    if(port == 0)
+    	port = 21;
+	//isSuccess = httpDownLoadFile(host1, ftppath, filenametemp, "http://evsocket.phihong.com.tw/UploadFiles/SW/C81FBD4A740F69286B276C68B5074373.jar");
+
+
+    do{
+    	 isSuccess = ftpFile(/*"test.evsocket.phihong.com.cn","phihong","y42j/4cj84",21,"/",fname*/host1, user, password, port, ftppath, fnamePlusPath, fname);
+    	 sleep(retryIntervalInt);
+    }while((!isSuccess)&&(retriesInt > 0 && retriesInt --));
+
+	if(!isSuccess)
+	{
+	   //BulldogUtil.sleepMs(interval*1000);
+		DEBUG_INFO("Diagnostics fail.\n");
+		sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatus_UploadFailed]);
+	}
+	else
+	{
+		DEBUG_INFO("sendDiagnosticsStatusNotificationRequest Uploaded\n");
+		sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatus_Uploaded]);
+		//isUpdateRequest = TRUE;
+	}
+
+end:
+//	json_object_put(obj);
+	DiagnosticsStatusNotificationStatus = 0; //Idle
+	pthread_exit(NULL/*(void *) fname*/); // ?��?�執行�?
+
+}
+
+
+
+
+int handleGetLocalListVersionRequest(char *uuid, char *payload)
+{
+	mtrace();
+	int result = FAIL;
+	DEBUG_INFO("handle GetLocalListVersionRequest\n");
+
+	if(strcmp((const char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "FALSE") == 0)
+	{
+		DEBUG_INFO("LocalAuthListEnabled is FALSE \n");
+		localversion = -1;
+	}
+	else
+	{
+		DEBUG_INFO("handle GetLocalListVersionRequest OCPP_getListVerion \n");
+		OCPP_getListVerion();
+	}
+
+
+	//from db.OCPP_getListVerion
+	ShmOCPP16Data->GetLocalListVersion.ResponseListVersion = localversion;
+	//ShmOCPP16Data->MsMsg.bits.GetLocalListVersionReq = 1;
+	sendGetLocalListVersionConfirmation(uuid,"");
+	//ShmOCPP16Data->MsMsg.bits.GetLocalListVersionConf = 1;
+
+	return result;
+}
+
+int handleRemoteStartRequest(char *uuid, char *payload)
+{
+	mtrace();
+	int result = FAIL;
+	int connectorIdInt=0, chargingProfileIdInt=0, transactionIdInt=0, stackLevelInt=0,
+		durationInt=0, startPeriodInt[10]={0}, numberPhasesInt[10]={0};
+	char idTagstr[20]={0}, chargingProfilePurposestr[30]={0}, chargingProfileKindstr[14]={0}, recurrencyKindstr[10]={0},
+		validFromstr[30]={0}, validTostr[30]={0}, startSchedulestr[30]={0}, chargingRateUnitstr[4]={0};
+	int connectorIdIsNULL,chargingProfileIsNULL,transactionIdIsNULL,recurrencyKindIsNULL,validFromIsNULL,validToIsNULL,durationIsNULL,startScheduleIsNULL,minChargingRateIsNULL,numberPhasesIsNULL;
+	float minChargingRateflaot=0.0, limitflaot[10]={0.0};
+	int chargingSchedulePeriodCount = 0;
+	char sstr[30]={ 0 };//sstr[200]={ 0 };
+	int c = 0;
+	char *loc;
+	char comfirmstr[20]={0};
+
+	DEBUG_INFO("handleRemoteStartRequest ...\n");
+	if(server_pending == TRUE)
+	{
+		return 0;
+	}
+
+	connectorIdIsNULL = chargingProfileIsNULL = transactionIdIsNULL = recurrencyKindIsNULL = validFromIsNULL = validToIsNULL = durationIsNULL = startScheduleIsNULL = minChargingRateIsNULL = numberPhasesIsNULL= FALSE;
+
+	/**********connectorId****************/
+	c = 0;
+	memset(sstr ,0, sizeof(sstr) );
+	loc = strstr(payload, "connectorId");
+	if(loc == NULL)
+	{
+		connectorIdIsNULL = TRUE;
+	}
+	else
+	{
+		while ((loc[strlen("connectorId")+2+c] != '}') && (loc[strlen("connectorId")+2+c] != ','))
+		{
+			sstr[c] = loc[strlen("connectorId")+2+c];
+			//printf("i=%d sstr=%c\n",c, sstr[c]);
+			c++;
+		}
+		sstr[c] = '\0';
+		connectorIdInt = atoi(sstr);
+	}
+
+
+	if(connectorIdIsNULL == TRUE)  // need to discussion
+	{
+		strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
+		goto end;
+	}
+
+	/****************idTag*******************/
+	c = 0;
+	memset(sstr ,0, sizeof(sstr) );
+	loc = strstr(payload, "idTag");
+	while (loc[3+strlen("idTag")+c] != '\"')
+	{
+		sstr[c] = loc[3+strlen("idTag")+c];
+		c++;
+	}
+	sstr[c] = '\0';
+	strcpy(idTagstr,sstr);
+
+
+
+	/****************chargingProfile*******************/
+	c = 0;
+	memset(sstr ,0, sizeof(sstr) );
+	loc = strstr(payload, "chargingProfile");
+	if(loc == NULL)
+	{
+		chargingProfileIsNULL = TRUE;
+	}
+	else
+	{
+		/****************chargingProfileId*******************/
+		c=0;
+		loc = strstr(payload, "chargingProfileId");
+		memset(sstr ,0, sizeof(sstr) );
+		while ((loc[strlen("chargingProfileId")+2+c] != '}') && (loc[strlen("chargingProfileId")+2+c] != ','))
+		{
+			sstr[c] = loc[strlen("chargingProfileId")+2+c];
+			//printf("i=%d sstr=%c\n",c, sstr[c]);
+			c++;
+		}
+		sstr[c] = '\0';
+		chargingProfileIdInt = atoi(sstr);
+
+		/****************transactionId*******************/
+
+		loc = strstr(payload, "transactionId");
+		if(loc == NULL)
+		{
+			transactionIdIsNULL = TRUE;
+		}
+		else
+		{
+			c=0;
+			memset(sstr ,0, sizeof(sstr) );
+			while ((loc[strlen("transactionId")+2+c] != '}') && (loc[strlen("transactionId")+2+c] != ','))
+			{
+				sstr[c] = loc[strlen("transactionId")+2+c];
+				//printf("i=%d sstr=%c\n",c, sstr[c]);
+				c++;
+			}
+			sstr[c] = '\0';
+			transactionIdInt = atoi(sstr);
+		}
+
+		/****************stackLevel*******************/
+		c=0;
+		loc = strstr(payload, "stackLevel");
+		memset(sstr ,0, sizeof(sstr) );
+		while ((loc[strlen("stackLevel")+2+c] != '}') && (loc[strlen("stackLevel")+2+c] != ','))
+		{
+			sstr[c] = loc[strlen("stackLevel")+2+c];
+			//printf("i=%d sstr=%c\n",c, sstr[c]);
+			c++;
+		}
+		sstr[c] = '\0';
+		stackLevelInt = atoi(sstr);
+
+		/****************chargingProfilePurpose*******************/
+		c = 0;
+		memset(sstr ,0, sizeof(sstr) );
+		loc = strstr(payload, "chargingProfilePurpose");
+		while (loc[3+strlen("chargingProfilePurpose")+c] != '\"')
+		{
+			sstr[c] = loc[3+strlen("chargingProfilePurpose")+c];
+			c++;
+		}
+		sstr[c] = '\0';
+		strcpy(chargingProfilePurposestr,sstr);
+
+		/****************chargingProfileKind*******************/
+		c = 0;
+		memset(sstr ,0, sizeof(sstr) );
+		loc = strstr(payload, "chargingProfileKind");
+		while (loc[3+strlen("chargingProfileKind")+c] != '\"')
+		{
+			sstr[c] = loc[3+strlen("chargingProfileKind")+c];
+			c++;
+		}
+		sstr[c] = '\0';
+		strcpy(chargingProfileKindstr,sstr);
+
+		/****************recurrencyKind*******************/
+		loc = strstr(payload, "recurrencyKind");
+		if(loc == NULL)
+		{
+			recurrencyKindIsNULL = TRUE;
+		}
+		else
+		{
+			c = 0;
+			memset(sstr ,0, sizeof(sstr) );
+			while (loc[3+strlen("recurrencyKind")+c] != '\"')
+			{
+				sstr[c] = loc[3+strlen("recurrencyKind")+c];
+				c++;
+			}
+			sstr[c] = '\0';
+			strcpy(recurrencyKindstr,sstr);
+		}
+
+		/****************validFrom*******************/
+		loc = strstr(payload, "validFrom");
+		if(loc == NULL)
+		{
+			validFromIsNULL = TRUE;
+		}
+		else
+		{
+			c = 0;
+			memset(sstr ,0, sizeof(sstr) );
+			while (loc[3+strlen("validFrom")+c] != '\"')
+			{
+				sstr[c] = loc[3+strlen("validFrom")+c];
+				c++;
+			}
+			sstr[c] = '\0';
+			strcpy(validFromstr,sstr);
+		}
+
+		/****************validTo*******************/
+		loc = strstr(payload, "validTo");
+		if(loc == NULL)
+		{
+			validToIsNULL = TRUE;
+		}
+		else
+		{
+			c = 0;
+			memset(sstr ,0, sizeof(sstr) );
+			while (loc[3+strlen("validTo")+c] != '\"')
+			{
+				sstr[c] = loc[3+strlen("validTo")+c];
+				c++;
+			}
+			sstr[c] = '\0';
+			strcpy(validTostr,sstr);
+		}
+
+		/****************chargingSchedule*******************/
+		loc = strstr(payload, "chargingSchedule");
+		if(loc != NULL)
+		{
+			/****************duration*******************/
+
+			loc = strstr(payload, "duration");
+
+			if(loc == NULL)
+			{
+				durationIsNULL = TRUE;
+			}
+			else
+			{
+				c=0;
+				memset(sstr ,0, sizeof(sstr) );
+				while ((loc[strlen("duration")+2+c] != '}') && (loc[strlen("duration")+2+c] != ','))
+				{
+					sstr[c] = loc[strlen("duration")+2+c];
+					//printf("i=%d sstr=%c\n",c, sstr[c]);
+					c++;
+				}
+				sstr[c] = '\0';
+				durationInt = atoi(sstr);
+
+			}
+
+			/****************startSchedule******************/
+
+			loc = strstr(payload, "startSchedule");
+			if(loc == NULL)
+			{
+				startScheduleIsNULL = TRUE;
+			}
+			else
+			{
+				c = 0;
+				memset(sstr ,0, sizeof(sstr) );
+				while (loc[3+strlen("startSchedule")+c] != '\"')
+				{
+					sstr[c] = loc[3+strlen("startSchedule")+c];
+					c++;
+				}
+				sstr[c] = '\0';
+				strcpy(startSchedulestr,sstr);
+			}
+
+			/****************chargingRateUnit*******************/
+			c = 0;
+			memset(sstr ,0, sizeof(sstr) );
+			loc = strstr(payload, "chargingRateUnit");
+			while (loc[3+strlen("chargingRateUnit")+c] != '\"')
+			{
+				sstr[c] = loc[3+strlen("chargingRateUnit")+c];
+				c++;
+			}
+			sstr[c] = '\0';
+			strcpy(chargingRateUnitstr,sstr);
+
+			/****************minChargingRate*******************/
+			loc = strstr(payload, "minChargingRate");
+			if(loc == NULL)
+			{
+				minChargingRateIsNULL = TRUE;
+			}
+			else
+			{
+				c=0;
+				memset(sstr ,0, sizeof(sstr) );
+				while ((loc[strlen("minChargingRate")+2+c] != '}') && (loc[strlen("minChargingRate")+2+c] != ','))
+				{
+					sstr[c] = loc[strlen("minChargingRate")+2+c];
+					//printf("i=%d sstr=%c\n",c, sstr[c]);
+					c++;
+				}
+				sstr[c] = '\0';
+				minChargingRateflaot = atof(sstr);
+			}
+
+			/****************chargingSchedulePeriod count*******************/
+			int what_len = strlen("startPeriod");
+
+			char *where = payload;
+
+
+			while ((where = strstr(where, "startPeriod"))) {
+				        where += what_len;
+				        chargingSchedulePeriodCount++;
+			}
+
+			where = payload;
+
+			for(int periodNums=0; periodNums < chargingSchedulePeriodCount; periodNums++)
+			{
+				/****************startPeriod*******************/
+				c=0;
+				loc = strstr(where, "startPeriod");
+				memset(sstr ,0, sizeof(sstr) );
+				while ((loc[strlen("startPeriod")+2+c] != '}') && (loc[strlen("startPeriod")+2+c] != ','))
+				{
+					sstr[c] = loc[strlen("startPeriod")+2+c];
+					//printf("i=%d sstr=%c\n",c, sstr[c]);
+					c++;
+				}
+				sstr[c] = '\0';
+				startPeriodInt[periodNums] = atoi(sstr);
+
+				/****************limit*******************/
+				c=0;
+				loc = strstr(where, "limit");
+				memset(sstr ,0, sizeof(sstr) );
+				while ((loc[strlen("limit")+2+c] != '}') && (loc[strlen("limit")+2+c] != ','))
+				{
+					sstr[c] = loc[strlen("limit")+2+c];
+					//printf("i=%d sstr=%c\n",c, sstr[c]);
+					c++;
+				}
+				sstr[c] = '\0';
+				limitflaot[periodNums] = atof(sstr);
+
+				/****************numberPhases*******************/
+				loc = strstr(where, "numberPhases");
+				if(loc == NULL)
+				{
+					numberPhasesIsNULL = TRUE;
+				}
+				else
+				{
+					c=0;
+					memset(sstr ,0, sizeof(sstr) );
+					while ((loc[strlen("numberPhases")+2+c] != '}') && (loc[strlen("numberPhases")+2+c] != ','))
+					{
+						sstr[c] = loc[strlen("numberPhases")+2+c];
+						//printf("i=%d sstr=%c\n",c, sstr[c]);
+						c++;
+					}
+					sstr[c] = '\0';
+					numberPhasesInt[periodNums] = atoi(sstr);
+				}
+
+				where = loc;
+
+			}
+		}
+
+	}
+
+	/*
+
+	enum _SYSTEM_STATUS
+	{
+	S_BOOTING               = 0,
+	S_IDLE,                 = 1
+	S_AUTHORIZING,          =2
+	S_REASSIGN_CHECK,       =3
+	S_REASSIGN,             =4
+	S_PRECHARGE,            =5
+	S_PREPARING_FOR_EV,     =6
+	S_PREPARING_FOR_EVSE,   =7
+	S_CHARGING,             =8
+	S_TERMINATING,          =9
+	S_COMPLETE,             =10
+	S_ALARM,                =11
+	S_FAULT                 =12
+	}
+	 */
+	if((connectorIdIsNULL == FALSE)&&(connectorIdInt > 0) && ((connectorIdInt -1) <= gunTotalNumber/*(CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY)*/))
+	{
+		sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].IdTag, "%s" , idTagstr);
+		ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.TransactionId = transactionIdInt;
+	    //0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault  8: Reserved
+
+		//check Transaction active
+		if(strstr((const char *)ShmSysConfigAndInfo->SysConfig.ModelName ,"DC") != NULL)
+		{
+			for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == (connectorIdInt -1))
+				{
+
+					if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId != 0)&&(strcmp((const char *)ShmSysConfigAndInfo->SysConfig.UserId, idTagstr) == 0))
+					{
+						//Reserved
+						DEBUG_INFO("Reserved now !!!The idTag matches the idTag of Reservation!!!\n");
+					}
+					else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId != 0)&&(strcmp((const char *)ShmSysConfigAndInfo->SysConfig.UserId, idTagstr) != 0))
+					{
+						//Reserved
+						DEBUG_INFO("Reserved now !!! The idTag does NOT match the idTag of Reservation!!! Reject it!!!\n");
+						strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
+						goto end;
+					}
+					else
+					{
+						if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != 1)				//S_IDLE
+								&& (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != 5 ) 	//S_PRECHARGE
+								&& (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != 6 ) 	//S_PREPARING_FOR_EV
+								&& (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != 7 ))   // S_PREPARING_FOR_EVSE
+						{
+							strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
+							goto end;
+						}
+
+					}//END FOR ELSE
+
+				}
+			}// END FOR CHAdeMO_QUANTITY
+
+			for (int index = 0; index < CCS_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == (connectorIdInt -1))
+				{
+					if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ReservationId != 0)&&(strcmp((const char *)ShmSysConfigAndInfo->SysConfig.UserId, idTagstr) == 0))
+					{
+						//Reserved
+						DEBUG_INFO("Reserved now !!!The idTag matches the idTag of Reservation!!!\n");
+					}
+					else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ReservationId != 0)&&(strcmp((const char *)ShmSysConfigAndInfo->SysConfig.UserId, idTagstr) != 0))
+					{
+						//Reserved
+						DEBUG_INFO("Reserved now !!! The idTag does NOT match the idTag of Reservation!!! Reject it!!!\n");
+						strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
+						goto end;
+					}
+					else
+					{
+						if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != 1)          //S_IDLE
+							&& (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != 5)   	//S_PRECHARGE
+							&& (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != 6)   	//S_PREPARING_FOR_EV
+							&& (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != 7)) 	// S_PREPARING_FOR_EVSE
+						{
+							strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
+							goto end;
+						}
+
+					}// END FOR ELSE
+				}
+			}// END FOR CCS_QUANTITY
+
+			for (int index = 0; index < GB_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == (connectorIdInt -1))
+				{
+					if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ReservationId != 0)&&(strcmp((const char *)ShmSysConfigAndInfo->SysConfig.UserId, idTagstr) == 0))
+					{
+						//Reserved
+						DEBUG_INFO("Reserved now !!!The idTag matches the idTag of Reservation!!!\n");
+					}
+					else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ReservationId != 0)&&(strcmp((const char *)ShmSysConfigAndInfo->SysConfig.UserId, idTagstr) != 0))
+					{
+						//Reserved
+						DEBUG_INFO("Reserved now !!! The idTag does NOT match the idTag of Reservation!!! Reject it!!!\n");
+						strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
+						goto end;
+					}
+					else
+					{
+						if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != 1)         	//S_IDLE
+							&& (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != 5)		//S_PRECHARGE
+							&& (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != 6)		//S_PREPARING_FOR_EV
+							&& (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != 7)) 		// S_PREPARING_FOR_EVSE
+						{
+							strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
+							goto end;
+						}
+
+					}// END FOR ELSE
+				}
+			} // END FOR GB_QUANTITY
+
+		}
+		else
+		{
+			for (int index = 0; index < AC_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == (connectorIdInt -1))
+				{
+
+					if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].ReservationId != 0)&&(strcmp((const char *)ShmSysConfigAndInfo->SysConfig.UserId, idTagstr) == 0))
+					{
+						//Reserved
+						DEBUG_INFO("Reserved now !!!The idTag matches the idTag of Reservation!!!\n");
+					}
+					else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].ReservationId != 0)&&(strcmp((const char *)ShmSysConfigAndInfo->SysConfig.UserId, idTagstr) != 0))
+					{
+						//Reserved
+						DEBUG_INFO("Reserved now !!! The idTag does NOT match the idTag of Reservation!!! Reject it!!!\n");
+						strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
+						goto end;
+					}
+					else
+					{
+						if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != 1)				//S_IDLE
+							&& (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != 5 ) 	//S_PRECHARGE
+							&& (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != 6 ) 	//S_PREPARING_FOR_EV
+							&& (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != 7 ))   // S_PREPARING_FOR_EVSE
+							{
+								strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
+								goto end;
+							}
+
+					}//END FOR ELSE
+				}
+			}// END FOR AC_QUANTITY
+		}
+
+		if(chargingProfileIsNULL == FALSE)
+		{
+			//ChargingProfile
+			ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingProfileId = chargingProfileIdInt;
+			sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingProfileKind, "%s" ,chargingProfileKindstr);
+			sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingProfilePurpose, "%s" ,chargingProfilePurposestr);
+
+			if(recurrencyKindIsNULL == FALSE) //OPTION
+			sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.RecurrencyKind, "%s" ,recurrencyKindstr);
+
+			ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.StackLevel = stackLevelInt;
+
+			if(transactionIdIsNULL == FALSE) // OPTION
+			ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.TransactionId = transactionIdInt;
+
+			if(validFromIsNULL == FALSE) // OPTION
+			sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ValidFrom, "%s" ,validFromstr);
+
+			if(validToIsNULL == FALSE) //OPTION
+			sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ValidTo, "%s" ,validTostr);
+
+			//ChargingSchedule
+			sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingSchedule.ChargingRateUnit, "%s" ,chargingRateUnitstr);
+
+			if(durationIsNULL == FALSE) //OPTION
+			ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingSchedule.Duration = durationInt;
+
+			if(minChargingRateIsNULL == FALSE) //OPTION
+			ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingSchedule.MinChargingRate = minChargingRateflaot;
+
+			if(startScheduleIsNULL == FALSE) //OPTION
+			sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingSchedule.StartSchedule, "%s" ,startSchedulestr);
+
+
+			for(int periodNums=0; periodNums < chargingSchedulePeriodCount; periodNums++)
+			{
+				//ChargingSchedulePeriod
+				ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod[periodNums].Limit = limitflaot[periodNums] ;
+
+				if(numberPhasesIsNULL == FALSE)
+				{
+					ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod[periodNums].NumberPhases = numberPhasesInt[periodNums];
+
+				}
+
+				ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod[periodNums].StartPeriod = startPeriodInt[periodNums];
+
+			}
+
+			if(strcmp(chargingProfilePurposestr, ChargingProfilePurposeTypeStr[TxProfile]) == 0)
+			{
+				ShmOCPP16Data->CsMsg.bits[connectorIdInt -1].RemoteStartTransactionReq = 1;
+				strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Accepted]);
+			}
+			else
+			{
+				strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
+			}
+
+		}
+		else
+		{
+			ShmOCPP16Data->CsMsg.bits[connectorIdInt -1].RemoteStartTransactionReq = 1;
+			strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Accepted]);
+		}
+	 }
+	 else
+	 {
+		 strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
+		 //sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ResponseStatus, "%s" ,comfirmstr);
+	 }
+
+end:
+	if(connectorIdIsNULL == FALSE)
+	ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ConnectorId = connectorIdInt;
+
+	strcpy((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].IdTag, idTagstr);
+	sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ResponseStatus, "%s" ,comfirmstr);
+	//json_object_put(obj); -- remove temporally
+
+	//OCPP send RemoteStartConfirmation by first.
+	sendRemoteStartConfirmation(uuid, comfirmstr);
+	//ShmOCPP16Data->CsMsg.bits[connectorIdInt -1].RemoteStartTransactionConf = 1;
+
+	return result;
+}
+
+int handleRemoteStopTransactionRequest(char *uuid, char *payload)
+{
+	mtrace();
+	int result = FAIL;
+	int match = FALSE;
+	int GunNO = 0;
+	int transactionIdInt=0;
+	int transactionIdIsNULL= FALSE;
+	char sstr[16]={ 0 };//sstr[200]={ 0 };
+	int c = 0;
+	char *loc;
+	char comfirmstr[20];
+
+//[2,"ff522854-0dea-436e-87ba-23a229269994","RemoteStopTransaction",{"transactionId":1373618380}]
+
+	DEBUG_INFO("handleRemoteStopTransactionRequest...\n");
+
+	if(server_pending == TRUE)
+	{
+
+		return 0;
+	}
+
+
+	c=0;
+	loc = strstr(payload, "transactionId");
+
+	if(loc == NULL)
+	{
+		transactionIdIsNULL= TRUE;
+	}
+	else
+	{
+		memset(sstr ,0, sizeof(sstr) );
+		while ((loc[strlen("transactionId")+2+c] != '}') && (loc[strlen("transactionId")+2+c] != ','))
+		{
+			sstr[c] = loc[strlen("transactionId")+2+c];
+			//printf("i=%d sstr=%c\n",c, sstr[c]);
+			c++;
+		}
+		sstr[c] = '\0';
+		transactionIdInt = atoi(sstr);
+	}
+
+	if(transactionIdIsNULL == FALSE)
+	{
+
+		for(int gun_index=0;gun_index < gunTotalNumber/*(CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY)*/;gun_index++)
+	    {
+			if(ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId == transactionIdInt)
+	        {
+				//check Transaction active
+
+				if(strstr((const char *)ShmSysConfigAndInfo->SysConfig.ModelName ,"DC") != NULL)
+				{
+					for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+					{
+						if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)
+						{
+							if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 8) // S_CHARGING
+							{
+								match = TRUE;
+								GunNO = gun_index;
+							}
+						}
+					}// END FOR CHAdeMO_QUANTITY
+
+					for (int index = 0; index < CCS_QUANTITY; index++)
+					{
+						if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)
+						{
+							if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 8) // S_CHARGING
+							{
+								match = TRUE;
+								GunNO = gun_index;
+							}
+
+						}
+					}// END FOR CCS_QUANTITY
+
+					for (int index = 0; index < GB_QUANTITY; index++)
+					{
+						if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)
+						{
+							if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 8) // S_CHARGING
+							{
+								match = TRUE;
+								GunNO = gun_index;
+							}
+
+						}
+					}// END FOR GB_QUANTITY
+				}
+				else
+				{
+					for (int index = 0; index < AC_QUANTITY; index++)
+					{
+						if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == gun_index)
+						{
+							if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == 8) // S_CHARGING
+							{
+								match = TRUE;
+								GunNO = gun_index;
+							}
+						}
+					}// END FOR CHAdeMO_QUANTITY
+				}// END FOR AC ELSE
+
+
+	        }// CHECK IF ResponseTransactionId == transactionIdInt
+
+	    }//END FOR
+
+		if(	match == TRUE)
+		{
+			ShmOCPP16Data->CsMsg.bits[GunNO].RemoteStopTransactionReq = 1; // inform csu of StopTransaction
+			strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Accepted]);
+			sprintf((char *)ShmOCPP16Data->RemoteStopTransaction[GunNO].ResponseStatus, "%s" ,comfirmstr);
+		}
+		else
+		{
+			strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
+		}
+
+
+	  }
+
+	sendRemoteStopTransactionConfirmation(uuid, comfirmstr);
+	return result;
+}
+
+int handleReserveNowTransactionRequest(char *uuid, char *payload)
+{
+	mtrace();
+	int result = FAIL;
+	int connectorIdInt=0, reservationIdInt=0;
+	char expiryDatestr[30]={0}, idTagstr[20]={0},parentIdTagstr[20]={0};
+	char comfirmstr[20]={0};
+	char sstr[180]={ 0 };
+	int c = 0;
+	char *loc;
+	//char *ptr;
+
+//[2,"1571898416054","ReserveNow",{"connectorId":1,"expiryDate":"2020-06-19T09:10:00.000Z","idTag":"B014EA9C","reservationId":1}]
+		/***(1)connectorId ****/
+	c=0;
+	loc = strstr(payload, "connectorId");
+	memset(sstr ,0, sizeof(sstr) );
+	while ((loc != NULL) &&(loc[strlen("connectorId")+2+c] != ','))
+	{
+		sstr[c] = loc[strlen("connectorId")+2+c];
+		//printf("i=%d sstr=%c\n",c, sstr[c]);
+		c++;
+	}
+	sstr[c] = '\0';
+	connectorIdInt = atoi(sstr);
+
+	/***(2)expiryDate ****/
+	loc = strstr(payload, "expiryDate");
+	memset(sstr ,0, sizeof(sstr) );
+	c = 0;
+	while ((loc != NULL) &&(loc[3+strlen("expiryDate")+c] != '\"'))
+	{
+		sstr[c] = loc[3+strlen("expiryDate")+c];
+		c++;
+	}
+	sstr[c] = '\0';
+	strcpy(expiryDatestr, sstr);
+
+	/***(3)idTag ****/
+	loc = strstr(payload, "idTag");
+	memset(sstr ,0, sizeof(sstr) );
+	c = 0;
+	while ((loc != NULL) &&(loc[3+strlen("idTag")+c] != '\"'))
+	{
+		sstr[c] = loc[3+strlen("idTag")+c];
+		c++;
+	}
+	sstr[c] = '\0';
+	strcpy(idTagstr, sstr);
+
+	/***(4)parentIdTag ****/
+	loc = strstr(payload, "parentIdTag");
+	memset(sstr ,0, sizeof(sstr) );
+	c = 0;
+	while ((loc != NULL) &&(loc[3+strlen("parentIdTag")+c] != '\"'))
+	{
+		sstr[c] = loc[3+strlen("parentIdTag")+c];
+		c++;
+	}
+	sstr[c] = '\0';
+	strcpy(parentIdTagstr, sstr);
+
+
+	/***(5)reservationId ****/
+	c=0;
+	loc = strstr(payload, "reservationId");
+	memset(sstr ,0, sizeof(sstr) );
+	while ((loc != NULL) &&((loc[strlen("reservationId")+2+c] != '}') && (loc[strlen("reservationId")+2+c] != ',')))
+	{
+			sstr[c] = loc[strlen("reservationId")+2+c];
+			//printf("i=%d sstr=%c\n",c, sstr[c]);
+			c++;
+	}
+	sstr[c] = '\0';
+	reservationIdInt = atoi(sstr);
+
+	strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
+
+	/*
+	enum _SYSTEM_STATUS
+	{
+		S_BOOTING               = 0,
+		S_IDLE,                 = 1
+		S_AUTHORIZING,          =2
+		S_REASSIGN_CHECK,       =3
+		S_REASSIGN,             =4
+		S_PRECHARGE,            =5
+		S_PREPARING_FOR_EV,     =6
+		S_PREPARING_FOR_EVSE,   =7
+		S_CHARGING,             =8
+		S_TERMINATING,          =9
+		S_COMPLETE,             =10
+		S_ALARM,                =11
+		S_FAULT                 =12
+	}
+
+	*/
+	if((connectorIdInt == 0) &&(strcmp((const char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemData, "FALSE") == 0)) //For OCTT Test case
+	{
+		strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
+		goto end;
+	}
+
+	if((connectorIdInt > 0) && ((connectorIdInt -1) <= gunTotalNumber/*(CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY)*/))
+	{
+		//check Transaction active
+		if(strstr((const char *)ShmSysConfigAndInfo->SysConfig.ModelName ,"DC") != NULL)
+		{
+			for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == (connectorIdInt -1))
+				{
+
+					if(reservationIdInt != ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId)
+					{
+						//SystemStatus:   0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault, 8: Reserved, 9: maintain
+						if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != 12) //S_FAULT
+						{
+							if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 1) //S_IDLE
+							{
+								ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
+								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
+							}
+							else if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 9) //S_TERMINATING  //else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 11) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == '9'))
+							{
+								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Unavailable]);
+
+							}
+							else if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 5) //S_PRECHARGE
+							{
+								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
+							}
+							else
+							{
+								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
+							}
+						}
+						else if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 12) //S_FAULT
+						{
+							strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
+						}
+					}
+					else
+					{
+						//replace reservation
+						ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
+						strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
+					}
+
+				}
+			} // END FOR CHAdeMO_QUANTITY
+
+			for (int index = 0; index < CCS_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == (connectorIdInt -1))
+				{
+
+					if(reservationIdInt != ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ReservationId)
+					{
+						//SystemStatus:   0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault, 8: Reserved, 9: maintain
+						if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != 12) //S_FAULT
+						{
+
+							if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 1) //S_IDLE
+							{
+								ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
+								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
+							}
+							else if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 9) //S_TERMINATING  //else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == '6') || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == '9'))
+							{
+								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Unavailable]);
+							}
+							else if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 5) //S_PRECHARGE
+							{
+								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
+							}
+							else
+							{
+								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
+							}
+						}
+						else if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus ==12) //S_FAULT
+						{
+							strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
+						}
+					}
+					else
+					{
+						//replace reservation
+						ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
+						strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
+
+					}
+
+				}
+			} // END FOR CCS_QUANTITY
+
+			for (int index = 0; index < GB_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == (connectorIdInt - 1))
+				{
+
+					if(reservationIdInt != ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ReservationId)
+					{
+						//SystemStatus:   0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault, 8: Reserved, 9: maintain
+						if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != 12) //S_FAULT
+						{
+
+							if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 1) //S_IDLE
+							{
+								ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
+								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
+							}
+							else if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 9) //S_TERMINATING //else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == '6') || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == '9'))
+							{
+								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Unavailable]);
+							}
+							else if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 5) //S_PRECHARGE
+							{
+								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
+							}
+							else
+							{
+								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
+							}
+						}
+						else if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus ==12) //S_FAULT
+						{
+							strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
+						}
+					}
+					else
+					{
+						//replace reservation
+						ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
+						strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
+					}
+
+				}
+			}// END FOR GB_QUANTITY
+
+		}
+		else
+		{
+			for (int index = 0; index < AC_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == (connectorIdInt -1))
+				{
+
+					if(reservationIdInt != ShmSysConfigAndInfo->SysInfo.AcChargingData[index].ReservationId)
+					{
+						//SystemStatus:   0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault, 8: Reserved, 9: maintain
+						if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != 12) //S_FAULT
+						{
+							if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == 1) //S_IDLE
+							{
+								ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
+								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
+							}
+							else if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == 9) //S_TERMINATING  //else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 11) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == '9'))
+							{
+								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Unavailable]);
+
+							}
+							else if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == 5) //S_PRECHARGE
+							{
+								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
+							}
+							else
+							{
+								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
+							}
+						}
+						else if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == 12) //S_FAULT
+						{
+							strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
+						}
+					}
+					else
+					{
+						//replace reservation
+						ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
+						strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
+					}
+
+				}
+			} // END FOR AC_QUANTITY
+		}//END FOR AC ELSE
+
+		sprintf((char *)ShmOCPP16Data->ReserveNow[connectorIdInt-1].ResponseStatus, "%s" ,comfirmstr);
+	}
+	else if(connectorIdInt == 0)
+	{
+
+	  if(strstr((const char *)ShmSysConfigAndInfo->SysConfig.ModelName ,"DC") != NULL)
+	  {
+			//check Transaction active
+			for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+			{
+				if(reservationIdInt != ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId)
+				{
+					if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 9) //S_TERMINATING  //else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 11) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == '9'))
+					{
+						strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Unavailable]);
+						goto end;
+					}
+					else if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 5) //S_PRECHARGE
+					{
+						strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
+						goto end;
+					}
+					else if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 12) //S_FAULT
+					{
+						strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
+						goto end;
+					}
+					else if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != 1) //S_IDLE
+					{
+						strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
+						goto end;
+					}
+				}
+
+			}// END FOR CHAdeMO_QUANTITY
+
+			for (int index = 0; index < CCS_QUANTITY; index++)
+			{
+			   if(reservationIdInt != ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ReservationId)
+			   {
+				   if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 9) //S_TERMINATING  //else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == '6') || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == '9'))
+				   {
+					   strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Unavailable]);
+				   }
+				   else if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 5) //S_PRECHARGE
+				   {
+					   strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
+				   }
+				   else if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus ==12) //S_FAULT
+				   {
+					   strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
+				   }
+				   else if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != 1) //S_IDLE
+				   {
+					   strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
+				   }
+			   }
+			} // END FOR CCS_QUANTITY
+
+			for (int index = 0; index < GB_QUANTITY; index++)
+			{
+				if(reservationIdInt != ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ReservationId)
+				{
+					if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 9) //S_TERMINATING //else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == '6') || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == '9'))
+					{
+						strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Unavailable]);
+					}
+					else if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 5) //S_PRECHARGE
+					{
+						strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
+					}
+					else if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus ==12) //S_FAULT
+					{
+						strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
+					}
+					else if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != 1) //S_IDLE
+					{
+						strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
+					}
+				}
+
+			} // END FOR GB_QUANTITY
+	  }
+	  else
+	  {
+		  for (int index = 0; index < AC_QUANTITY; index++)
+		  {
+		  	 if(reservationIdInt != ShmSysConfigAndInfo->SysInfo.AcChargingData[index].ReservationId)
+		  	 {
+		  		if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == 9) //S_TERMINATING  //else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 11) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == '9'))
+		  		{
+		  			strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Unavailable]);
+		  			goto end;
+		  		}
+		  		else if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == 5) //S_PRECHARGE
+		  		{
+		  			strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
+		  			goto end;
+		  		}
+		  		else if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == 12) //S_FAULT
+		  		{
+		  			strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
+		  			goto end;
+		  		}
+		  		else if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != 1) //S_IDLE
+		  		{
+		  			strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
+		  			goto end;
+		  		}
+		  	}
+
+		  }// END FOR AC_QUANTITY
+
+	  }
+
+	  //The connectorId is 0
+	  ShmOCPP16Data->CsMsg.bits[0].ReserveNowReq = 1;
+	  strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
+	  sprintf((char *)ShmOCPP16Data->ReserveNow[0].ResponseStatus, "%s" ,comfirmstr);
+	  ShmOCPP16Data->ReserveNow[0].ConnectorId = connectorIdInt;
+	  sprintf((char *)ShmOCPP16Data->ReserveNow[0].ExpiryDate, "%s" , expiryDatestr);
+	  sprintf((char *)ShmOCPP16Data->ReserveNow[0].IdTag, "%s" , idTagstr);
+	  sprintf((char *)ShmOCPP16Data->ReserveNow[0].ParentIdTag, "%s" , parentIdTagstr);
+	  ShmOCPP16Data->ReserveNow[0].ReservationId = reservationIdInt;
+	  strcpy((char *)ShmOCPP16Data->ReserveNow[0].guid, uuid);
+
+	  result = TRUE;
+	  return result;
+
+	}
+	else
+	{
+		strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
+		sprintf((char *)ShmOCPP16Data->ReserveNow[connectorIdInt-1].ResponseStatus, "%s" ,comfirmstr);
+	}
+
+	if(strcmp(comfirmstr,"Accepted") == 0)
+	{
+		ShmOCPP16Data->ReserveNow[connectorIdInt-1].ConnectorId = connectorIdInt;
+		sprintf((char *)ShmOCPP16Data->ReserveNow[connectorIdInt-1].ExpiryDate, "%s" , expiryDatestr);
+		sprintf((char *)ShmOCPP16Data->ReserveNow[connectorIdInt-1].IdTag, "%s" , idTagstr);
+		sprintf((char *)ShmOCPP16Data->ReserveNow[connectorIdInt-1].ParentIdTag, "%s" , parentIdTagstr);
+		ShmOCPP16Data->ReserveNow[connectorIdInt-1].ReservationId = reservationIdInt;
+	    strcpy((char *)ShmOCPP16Data->ReserveNow[connectorIdInt-1].guid, uuid);
+
+	    result = TRUE;
+	    return result;
+
+	}
+
+end:
+	sendReserveNowTransactionConfirmation(uuid,comfirmstr);
+	//ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowConf = 1;
+
+	return result;
+}
+
+int handleResetRequest(char *uuid, char *payload)
+{
+	mtrace();
+	int result = FAIL;
+
+	char sstr[10]={0};
+	char typestr[10]={0};
+	char comfirmstr[20]={0};
+	int c = 0;
+	char *loc;
+
+//[2,"6f88d461-4d17-462c-a69b-1f7a8c5b12df","Reset",{"type":"Hard"}]
+	DEBUG_INFO("handleResetRequest ...\n");
+
+	loc = strstr(payload, "type");
+	memset(sstr ,0, sizeof(sstr) );
+	c = 0;
+	while (loc[3+strlen("type")+c] != '\"')
+	{
+		sstr[c] = loc[3+strlen("type")+c];
+		c++;
+	}
+	sstr[c] = '\0';
+	strcpy(typestr,sstr);
+
+	sprintf((char *)ShmOCPP16Data->Reset.Type, "%s" ,typestr);
+	//strcpy(ShmOCPP16Data->Reset.Type, typestr);
+
+	if(strcmp(typestr, ResetTypeStr[Hard])==0)
+	{
+	   //check Transaction active
+		if(strstr((const char *)ShmSysConfigAndInfo->SysConfig.ModelName ,"DC") != NULL)
+		{
+			for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 8)
+				{
+				    //0: unplug, 1: Plug-in
+				   //ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ConnectorPlugIn = 0;
+				}
+			}
+
+			for (int index = 0; index < CCS_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 8)
+				{
+				    //0: unplug, 1: Plug-in
+				    //ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ConnectorPlugIn = 0;
+				}
+			}
+
+			for (int index = 0; index < GB_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 8)
+				{
+				    //0: unplug, 1: Plug-in
+				    //ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ConnectorPlugIn = 0;
+				}
+			}
+
+		}
+		else
+		{
+			for (int index = 0; index < AC_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == 8)
+				{
+					//0: unplug, 1: Plug-in
+					//ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ConnectorPlugIn = 0;
+				}
+			}
+
+		}// END FOR AC ELSE
+
+
+	    ShmOCPP16Data->MsMsg.bits.ResetReq = 1;
+	    strcpy((char *)ShmOCPP16Data->Reset.guid, uuid);
+	    result = TRUE;
+	    return result;
+	 }
+	 else if(strcmp(typestr, ResetTypeStr[Soft])==0)
+	 {
+	     //check Transaction active
+		 if(strstr((const char *)ShmSysConfigAndInfo->SysConfig.ModelName ,"DC") != NULL)
+		 {
+			 for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+			 {
+				 if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 8)
+				 {
+				    //0: unplug, 1: Plug-in
+				    //ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ConnectorPlugIn = 0;
+				 }
+			 }
+
+			for (int index = 0; index < CCS_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 8)
+				{
+				    //0: unplug, 1: Plug-in
+				    //ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ConnectorPlugIn = 0;
+				}
+			}
+
+			for (int index = 0; index < GB_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 8)
+				{
+				   //0: unplug, 1: Plug-in
+				   //ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ConnectorPlugIn = 0;
+				}
+			}
+
+		 }
+		 else
+		 {
+			 for (int index = 0; index < AC_QUANTITY; index++)
+			 {
+				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == 8)
+				{
+					//0: unplug, 1: Plug-in
+					//ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ConnectorPlugIn = 0;
+				}
+			}
+
+		 }// END FOR AC ELSE
+
+	     ShmOCPP16Data->MsMsg.bits.ResetReq = 1;
+	     strcpy((char *)ShmOCPP16Data->Reset.guid, uuid);
+	     result = TRUE;
+	     return result;
+	 }
+	 else
+	 {
+		 strcpy(comfirmstr, ResetStatusStr[ResetStatus_Rejected]);
+		 sprintf((char *)ShmOCPP16Data->Reset.ResponseStatus, "%s" ,comfirmstr);
+		 goto errorend;
+	 }
+
+errorend:
+	sendResetConfirmation(uuid, comfirmstr);
+	return result;
+}
+
+int handleSendLocalListRequest(char *uuid, char *payload)
+{
+	mtrace();
+	int result = FAIL;
+	int listVersionInt;
+	//char *updateTypestr, *idTagstr, *expiryDatestr, *parentIdTagstr, *statusstr;
+	char listsearch[]="listVersion";
+	char updateTypesearch[]="updateType";
+	char localAuthorizationListsearch[]="localAuthorizationList";
+	char sstr[60500]={ 0 };//sstr[200]={ 0 };
+	char CardList[500][160]={0};
+	char updateTypestr[15]={0};
+	char idTagstr[20]={0};
+	char parentIdTag[20]={0};
+	char expiryDate[30]={0};
+	char idTagstatus[16]={0};
+	int  c = 0;
+	int i = 0;
+	char *delim1 = "}";
+	char * pch;
+	char *loc;
+	//char *ptr;
+	char comfirmstr[20];
+	//int n_localAuthorizations = 0;
+	int checkState_Faulted = FALSE;
+
+	DEBUG_INFO("handleSendLocalListRequest\n");
+
+	if(strcmp((const char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "FALSE") == 0) //For OCTT Test case
+	{
+		strcpy(comfirmstr, UpdateStatusStr[UpdateStatus_NotSupported]);
+		goto end;
+	}
+
+
+	if(strstr((const char *)ShmSysConfigAndInfo->SysConfig.ModelName ,"DC") != NULL)
+	{
+		//check Charge Point state
+		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 12) //S_FAULT   ---> Faulted
+			{
+				checkState_Faulted = TRUE; //OCPP Status: Faulted
+			}
+
+		}
+
+		for (int index = 0; index < CCS_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 12) //S_FAULT   ---> Faulted
+			{
+				checkState_Faulted = TRUE; //OCPP Status
+			}
+
+		}
+
+		for (int index = 0; index < GB_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 12) //S_FAULT   ---> Faulted
+			{
+				checkState_Faulted = TRUE; //OCPP Status: Faulted
+			}
+		}
+	}
+	else
+	{
+		//check Charge Point state
+		for (int index = 0; index < AC_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == 12) //S_FAULT   ---> Faulted
+			{
+				checkState_Faulted = TRUE; //OCPP Status: Faulted
+			}
+		}
+
+	}// END FOR AC ELSE
+
+
+	if(checkState_Faulted == TRUE)
+	{
+		strcpy(comfirmstr, UpdateStatusStr[UpdateStatus_Failed]);
+		goto end;
+	}
+
+	//listVersion
+	c = 0;
+	loc = strstr(payload, listsearch);
+	while (loc[strlen("listVersion")+2+c] != ',')
+	{
+		sstr[c] = loc[strlen("listVersion")+2+c];
+		c++;
+	}
+	sstr[c] = '\0';
+	listVersionInt = atoi(sstr);
+	ShmOCPP16Data->SendLocalList.ListVersion = listVersionInt;
+
+	//updateType
+	loc = strstr(payload, updateTypesearch);
+	c = 0;
+	while (loc[3+strlen(updateTypesearch)+c] != '\"')
+	{
+		sstr[c] = loc[3+strlen(updateTypesearch)+c];
+		c++;
+	}
+	sstr[c] = '\0';
+	strcpy(updateTypestr, sstr);
+	sprintf((char *)ShmOCPP16Data->SendLocalList.UpdateType, "%s",  updateTypestr);
+
+	//localAuthorizationList
+	memset(sstr ,0, sizeof(sstr) );
+	loc = strstr(payload, localAuthorizationListsearch);
+	if(loc != NULL) // localAuthorizationList is not NULL
+	{
+		//Check UpdateType
+		if(strcmp(updateTypestr, UpdateTypeStr[Full]) == 0)
+		{
+			//Local list full update
+			printf("Local list full update.\n");
+			OCPP_cleanLocalList();
+
+		}
+		else if(strcmp(updateTypestr, UpdateTypeStr[Differential]) == 0)
+		{
+			//Local list different update
+			printf("Local list different update.\n");
+
+			OCPP_getListVerion();
+
+			if(listVersionInt < localversion )//if(listVersionInt <= localversion ) for OCTT Case ---remove temporally
+			{
+				strcpy(comfirmstr, UpdateStatusStr[UpdateStatus_VersionMismatch]);
+				goto end;
+			}
+		}
+		else
+		{
+			strcpy(comfirmstr, UpdateStatusStr[UpdateStatus_NotSupported]);
+			goto end;
+		}
+
+
+		c = 0;
+		while (loc[3+strlen(localAuthorizationListsearch)+c] != ']')
+		{
+			sstr[c] = loc[3+strlen(localAuthorizationListsearch)+c];
+			//printf("i=%d sstr=%c\n",c, sstr[c]);
+			c++;
+		}
+		sstr[c] = '\0';
+
+		//parsing strings to words
+		i = 0;
+		pch = strtok(sstr,delim1);
+		while (pch != NULL)
+		{
+			strcpy(CardList[i], pch);
+			pch = strtok (NULL, delim1);
+			i = i + 1;
+		}
+
+		//local Authorizations List Numbers
+		//n_localAuthorizations = i;
+		ShmOCPP16Data->SendLocalList.ListVersion = listVersionInt;
+
+		memset(ShmOCPP16Data->SendLocalList.LocalAuthorizationList, 0 , sizeof(struct StructLocalAuthorizationList)* 500);
+#if 0
+		if(ShmOCPP16Data->SendLocalList.LocalAuthorizationList != NULL)
+			free(ShmOCPP16Data->SendLocalList.LocalAuthorizationList);
+
+		ShmOCPP16Data->SendLocalList.LocalAuthorizationList = (struct StructLocalAuthorizationList *)malloc(sizeof(struct StructLocalAuthorizationList)*n_localAuthorizations);
+		memset(ShmOCPP16Data->SendLocalList.LocalAuthorizationList, 0 ,sizeof(ShmOCPP16Data->SendLocalList.LocalAuthorizationList));
+#endif
+
+		c= 0;
+		while(c < i)
+		{
+			//Search "IdToken"
+			memset(sstr ,0, sizeof(sstr) );
+			loc = strstr(CardList[c], "idTag");
+			int j = 0;
+			while (loc[3+strlen("idTag")+j] != '\"')
+			{
+				sstr[j] = loc[3+strlen("idTag")+j];
+				//printf("i=%d sstr=%c\n",c, sstr[j]);
+				j++;
+			}
+			sstr[j] = '\0';
+			strcpy(idTagstr, sstr);
+
+			//Search "expiryDate"
+			memset(sstr ,0, sizeof(sstr) );
+			loc = strstr(CardList[c], "expiryDate");
+			j = 0;
+			while (loc[3+strlen("expiryDate")+j] != '\"')
+			{
+				sstr[j] = loc[3+strlen("expiryDate")+j];
+				//printf("i=%d sstr=%c\n",c, sstr[j]);
+				j++;
+			}
+			sstr[j] = '\0';
+			strcpy(expiryDate, sstr);
+
+			//Search "parentIdTag"
+			memset(sstr ,0, sizeof(sstr) );
+			loc = strstr(CardList[c], "parentIdTag");
+			j = 0;
+			while (loc[3+strlen("parentIdTag")+j] != '\"')
+			{
+				sstr[j] = loc[3+strlen("parentIdTag")+j];
+				//printf("i=%d sstr=%c\n",c, sstr[j]);
+				j++;
+			}
+			sstr[j] = '\0';
+			strcpy(parentIdTag, sstr);
+
+			//Search "status"
+			memset(sstr ,0, sizeof(sstr) );
+			loc = strstr(CardList[c], "status");
+			j = 0;
+			while (loc[3+strlen("status")+j] != '\"')
+			{
+				sstr[j] = loc[3+strlen("status")+j];
+				//printf("i=%d sstr=%c\n",c, sstr[j]);
+				j++;
+			}
+			sstr[j] = '\0';
+			strcpy(idTagstatus, sstr);
+
+			OCPP_getIdTag(idTagstr);
+			//OCPP_getIdTag("test"); For Test
+			DEBUG_INFO("idTagAuthorization=%s\n",idTagAuthorization);
+
+			if(strcmp(updateTypestr, UpdateTypeStr[Full]) == 0)
+			{
+				//Local list full update
+				DEBUG_INFO("Local list full update.\n");
+				// update list
+				OCPP_addLocalList_1(listVersionInt, idTagstr, parentIdTag, expiryDate, idTagstatus);
+				OCPP_get_TableAuthlocalAllData();
+			}
+			else if(strcmp(updateTypestr, UpdateTypeStr[Differential]) == 0)
+			{
+				if((strcmp(idTagstr, idTagAuthorization) == 0) && (parentIdTag[0] != '\0'))
+				{
+					OCPP_addLocalList_1(listVersionInt, idTagstr, parentIdTag, expiryDate, idTagstatus);
+
+				}
+				else if((strcmp(idTagstr, idTagAuthorization) == 0) && (parentIdTag[0] == '\0'))
+				{
+					OCPP_deleteIdTag(idTagstr);
+				}
+				else if((strcmp(idTagstr, idTagAuthorization) != 0) && (parentIdTag[0] != '\0'))
+				{
+					OCPP_addLocalList_1(listVersionInt, idTagstr, parentIdTag, expiryDate, idTagstatus);
+
+				}
+
+			}
+
+			strcpy((char *)ShmOCPP16Data->SendLocalList.LocalAuthorizationList[c].IdTag, idTagstr);
+			strcpy((char *)ShmOCPP16Data->SendLocalList.LocalAuthorizationList[c].IdTagInfo.ExpiryDate, expiryDate);
+			strcpy((char *)ShmOCPP16Data->SendLocalList.LocalAuthorizationList[c].IdTagInfo.ParentIdTag, parentIdTag);
+			strcpy((char *)ShmOCPP16Data->SendLocalList.LocalAuthorizationList[c].IdTagInfo.Status, idTagstatus);
+
+			c++;
+		}
+	}
+	else
+	{
+		 if(strcmp(updateTypestr, UpdateTypeStr[Differential]) == 0)
+		{
+			 //Local list different update
+			DEBUG_INFO("Local list different update.\n");
+			strcpy(comfirmstr, UpdateStatusStr[UpdateStatus_Accepted]);
+			goto end;
+
+		}
+	}
+
+	strcpy(comfirmstr, UpdateStatusStr[UpdateStatus_Accepted]);
+
+
+end:
+
+	sendSendLocalListConfirmation(uuid, comfirmstr);
+	//ShmOCPP16Data->MsMsg.bits.SendLocalListConf = 1;
+
+#if 0
+	if(ShmOCPP16Data->SendLocalList.LocalAuthorizationList != NULL)
+		free(ShmOCPP16Data->SendLocalList.LocalAuthorizationList);
+#endif
+	return result;
+}
+
+
+/*
+	enum _SYSTEM_STATUS
+	{
+		S_BOOTING = 0,
+		S_IDLE,                      =1
+		S_AUTHORIZING,               =2
+		S_REASSIGN_CHECK,            =3
+		S_REASSIGN,                  =4
+		S_PRECHARGE,                 =5
+		S_PREPARING_FOR_EV,          =6
+		S_PREPARING_FOR_EVSE,        =7
+		S_CHARGING,                  =8
+		S_TERMINATING,               =9
+		S_COMPLETE,                  =10
+		S_ALARM,                     =11
+		S_FAULT                      =12
+	};
+
+*/
+
+#define MAX 200
+
+int handleSetChargingProfileRequest(char *uuid, char *payload)
+{
+	mtrace();
+	int result = FAIL;
+	int connectorIdInt=0, chargingProfileIdInt=0, transactionIdInt=0,stackLevelInt=0, durationInt=0, startPeriodInt[10]={0}, numberPhasesInt[10]={0};
+	int tempconnectorIdInt=0, tempchargingProfileIdInt=0, tempstackLevelInt=0;
+	char chargingProfilePurposeStr[30]={0};
+	char chargingProfileKindStr[16]={0};
+	char recurrencyKindStr[10]={0};
+	char validFromStr[30]={0}, validToStr[30]={0}, startScheduleStr[30]={0}, chargingRateUnitStr[6]={0};
+	float minChargingRateFloat = 0.0, limitflaot[10] = {0.0};
+	int chargingSchedulePeriodCount = 0;
+	//int updateflag = FALSE;
+	char comfirmstr[20]={0};
+	int meet= FALSE;
+	char sstr[10]={0};
+	int c = 0;
+	char *loc;
+	FILE *fptr1;//, *fptr2;
+	//int lno=0;//, linectr = 0;
+	//int modifyflag = FALSE;
+	char filename[MAX]={0};
+	char tempfile[] = "../Storage/OCPP/temp.json";
+	int  resultRename=0;
+	char rmFileCmd[50]={0};
+	char tempchargingProfilePurposeStr[30]={0};
+
+
+//[2,"d65bcbca-0b07-49c1-b679-e6c6ff9f5627","SetChargingProfile",{"connectorId":0,"csChargingProfiles":{"chargingProfileId":1,"transactionId":0,"stackLevel":0,"chargingProfilePurpose":"TxDefaultProfile","chargingProfileKind":"Absolute","recurrencyKind":"Daily","validFrom":"2019-07-01T02:39:55.000Z","validTo":"2019-07-04T02:39:55.000Z","chargingSchedule":{"duration":86400,"startSchedule":"2019-07-01T02:39:55.000Z","chargingRateUnit":"A","chargingSchedulePeriod":[{"startPeriod":0,"limit":20.0,"numberPhases":3},{"startPeriod":300,"limit":10.0,"numberPhases":3},{"startPeriod":600,"limit":20.0,"numberPhases":3},{"startPeriod":1200,"limit":10.0,"numberPhases":3},{"startPeriod":1800,"limit":20.0,"numberPhases":3},{"startPeriod":2400,"limit":10.0,"numberPhases":3},{"startPeriod":3000,"limit":20.0,"numberPhases":3}],"minChargingRate":20.1}}}]
+
+	DEBUG_INFO("handleSetChargingProfileRequest\n");
+
+	connectorIdInt = chargingProfileIdInt = transactionIdInt = stackLevelInt = 0;
+
+	/*********************connectorId***************************/
+	loc = strstr(payload, "connectorId");
+	c = 0;
+	memset(sstr ,0, sizeof(sstr) );
+	while (loc[strlen("connectorId")+2+c] != ',')
+	{
+		sstr[c] = loc[strlen("connectorId")+2+c];
+		c++;
+	}
+	sstr[c] = '\0';
+	connectorIdInt = atoi(sstr);
+
+	if(connectorIdInt == 0) //  an overall limit for the Charge Point.
+	{
+		ShmOCPP16Data->SetChargingProfile[0].ConnectorId = connectorIdInt;
+	}
+	else
+	{
+		ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ConnectorId = connectorIdInt;
+	}
+
+
+	DEBUG_INFO("handleSetChargingProfileRequest -1\n");
+	/*********************chargingProfileId***************************/
+	loc = strstr(payload, "chargingProfileId");
+	c = 0;
+	memset(sstr ,0, sizeof(sstr) );
+	while (loc[strlen("chargingProfileId")+2+c] != ',')
+	{
+		sstr[c] = loc[strlen("chargingProfileId")+2+c];
+		c++;
+	}
+	sstr[c] = '\0';
+	chargingProfileIdInt = atoi(sstr);
+
+	if(connectorIdInt == 0) //  an overall limit for the Charge Point.
+	{
+		ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingProfileId = chargingProfileIdInt;
+	}
+	else
+	{
+		ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingProfileId = chargingProfileIdInt;
+	}
+
+
+	DEBUG_INFO("handleSetChargingProfileRequest -2\n");
+	/*********************transactionId***************************/
+	loc = strstr(payload, "transactionId");
+
+	if(loc != NULL)
+	{
+		c = 0;
+		memset(sstr ,0, sizeof(sstr) );
+		while (loc[strlen("transactionId")+2+c] != ',')
+		{
+			sstr[c] = loc[strlen("transactionId")+2+c];
+			c++;
+		}
+		sstr[c] = '\0';
+		transactionIdInt = atoi(sstr);
+
+
+		if(connectorIdInt == 0) //  an overall limit for the Charge Point.
+		{
+			ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.TransactionId = transactionIdInt;
+		}
+		else
+		{
+			ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.TransactionId = transactionIdInt;
+		}
+
+	}
+
+	DEBUG_INFO("handleSetChargingProfileRequest -3\n");
+	/*********************stackLevel***************************/
+	loc = strstr(payload, "stackLevel");
+	c = 0;
+	memset(sstr ,0, sizeof(sstr) );
+	while (loc[strlen("stackLevel")+2+c] != ',')
+	{
+		sstr[c] = loc[strlen("stackLevel")+2+c];
+		c++;
+	}
+	sstr[c] = '\0';
+	stackLevelInt = atoi(sstr);
+
+	if(connectorIdInt == 0) //  an overall limit for the Charge Point.
+	{
+		ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.StackLevel = stackLevelInt;
+	}
+	else
+	{
+		ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.StackLevel = stackLevelInt;
+	}
+
+	DEBUG_INFO("handleSetChargingProfileRequest -4\n");
+	/*********************chargingProfilePurpose***************************/
+	loc = strstr(payload, "chargingProfilePurpose");
+	c = 0;
+	memset(sstr ,0, sizeof(sstr) );
+	while (loc[3+strlen("chargingProfilePurpose")+c] != '\"')
+	{
+		sstr[c] = loc[3+strlen("chargingProfilePurpose")+c];
+		//printf("i=%d sstr=%c\n",c, sstr[c]);
+		c++;
+	}
+	sstr[c] = '\0';
+	strcpy(chargingProfilePurposeStr,sstr);
+	DEBUG_INFO("chargingProfilePurposeStr=%s\n",chargingProfilePurposeStr);
+
+	if(connectorIdInt == 0) //  an overall limit for the Charge Point.
+	{
+		strcpy((char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingProfilePurpose, chargingProfilePurposeStr);
+	}
+	else
+	{
+		strcpy((char *)ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingProfilePurpose, chargingProfilePurposeStr);
+
+	}
+
+	DEBUG_INFO("handleSetChargingProfileRequest -6\n");
+	/*********************chargingProfileKind***************************/
+	loc = strstr(payload, "chargingProfileKind");
+	c = 0;
+	memset(sstr ,0, sizeof(sstr) );
+	while (loc[3+strlen("chargingProfileKind")+c] != '\"')
+	{
+		sstr[c] = loc[3+strlen("chargingProfileKind")+c];
+		//printf("i=%d sstr=%c\n",c, sstr[c]);
+		c++;
+	}
+	sstr[c] = '\0';
+	strcpy(chargingProfileKindStr,sstr);
+
+	if(connectorIdInt == 0) //  an overall limit for the Charge Point.
+	{
+		strcpy((char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingProfileKind, chargingProfileKindStr);
+	}
+	else
+	{
+		strcpy((char *)ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingProfileKind, chargingProfileKindStr);
+	}
+
+	DEBUG_INFO("handleSetChargingProfileRequest -7\n");
+	/*********************recurrencyKind***************************/
+	loc = strstr(payload, "recurrencyKind");
+	if(loc != NULL)
+	{
+
+		c = 0;
+		memset(sstr ,0, sizeof(sstr) );
+		while (loc[3+strlen("recurrencyKind")+c] != '\"')
+		{
+			sstr[c] = loc[3+strlen("recurrencyKind")+c];
+			//printf("i=%d sstr=%c\n",c, sstr[c]);
+			c++;
+		}
+		sstr[c] = '\0';
+		strcpy(recurrencyKindStr,sstr);
+
+		if(connectorIdInt == 0) //  an overall limit for the Charge Point.
+		{
+			strcpy((char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.RecurrencyKind, recurrencyKindStr);
+		}
+		else
+		{
+			strcpy((char *)ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.RecurrencyKind, recurrencyKindStr);
+		}
+
+	}
+
+	DEBUG_INFO("handleSetChargingProfileRequest -8\n");
+	/*********************validFrom***************************/
+	loc = strstr(payload, "validFrom");
+	if(loc != NULL)
+	{
+		c = 0;
+		memset(sstr ,0, sizeof(sstr) );
+		while (loc[3+strlen("validFrom")+c] != '\"')
+		{
+			sstr[c] = loc[3+strlen("validFrom")+c];
+			//printf("i=%d sstr=%c\n",c, sstr[c]);
+			c++;
+		}
+		sstr[c] = '\0';
+		strcpy(validFromStr,sstr);
+
+		if(connectorIdInt == 0) //  an overall limit for the Charge Point.
+		{
+			strcpy((char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ValidFrom, validFromStr);
+		}
+		else
+		{
+			strcpy((char *)ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ValidFrom, validFromStr);
+		}
+
+
+	}
+
+	DEBUG_INFO("handleSetChargingProfileRequest -9\n");
+	/*********************validTo***************************/
+	loc = strstr(payload, "validTo");
+	if(loc != NULL)
+	{
+		c = 0;
+		memset(sstr ,0, sizeof(sstr) );
+		while (loc[3+strlen("validTo")+c] != '\"')
+		{
+			sstr[c] = loc[3+strlen("validTo")+c];
+			//printf("i=%d sstr=%c\n",c, sstr[c]);
+			c++;
+		}
+		sstr[c] = '\0';
+		strcpy(validToStr,sstr);
+
+		if(connectorIdInt == 0) //  an overall limit for the Charge Point.
+		{
+			strcpy((char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ValidTo, validToStr);
+		}
+		else
+		{
+			strcpy((char *)ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ValidTo, validToStr);
+
+		}
+
+	}
+
+	DEBUG_INFO("handleSetChargingProfileRequest -10\n");
+	/*********************duration***************************/
+	loc = strstr(payload, "duration");
+	if(loc != NULL)
+	{
+		c = 0;
+		memset(sstr ,0, sizeof(sstr) );
+		while (loc[strlen("duration")+2+c] != ',')
+		{
+			sstr[c] = loc[strlen("duration")+2+c];
+			c++;
+		}
+		sstr[c] = '\0';
+		durationInt = atoi(sstr);
+
+		if(connectorIdInt == 0) //  an overall limit for the Charge Point.
+		{
+			ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingSchedule.Duration = durationInt;
+		}
+		else
+		{
+			ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingSchedule.Duration = durationInt;
+		}
+
+	}
+
+	DEBUG_INFO("handleSetChargingProfileRequest -11\n");
+	/*********************startSchedule***************************/
+	loc = strstr(payload, "startSchedule");
+	if(loc != NULL)
+	{
+		c = 0;
+		memset(sstr ,0, sizeof(sstr) );
+		while (loc[3+strlen("startSchedule")+c] != '\"')
+		{
+			sstr[c] = loc[3+strlen("startSchedule")+c];
+			//printf("i=%d sstr=%c\n",c, sstr[c]);
+			c++;
+		}
+		sstr[c] = '\0';
+		strcpy(startScheduleStr,sstr);
+
+		if(connectorIdInt == 0) //  an overall limit for the Charge Point.
+		{
+			strcpy((char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingSchedule.StartSchedule,startScheduleStr);
+
+		}
+		else
+		{
+			strcpy((char *)ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingSchedule.StartSchedule,startScheduleStr);
+		}
+
+	}
+
+
+	DEBUG_INFO("handleSetChargingProfileRequest -12\n");
+	/*********************chargingRateUnit***************************/
+	loc = strstr(payload, "chargingRateUnit");
+	if(loc != NULL)
+	{
+		c = 0;
+		memset(sstr ,0, sizeof(sstr) );
+		while (loc[3+strlen("chargingRateUnit")+c] != '\"')
+		{
+			sstr[c] = loc[3+strlen("chargingRateUnit")+c];
+			//printf("i=%d sstr=%c\n",c, sstr[c]);
+			c++;
+		}
+		sstr[c] = '\0';
+		strcpy(chargingRateUnitStr,sstr);
+
+		if(connectorIdInt == 0) //  an overall limit for the Charge Point.
+		{
+			strcpy((char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingSchedule.ChargingRateUnit,chargingRateUnitStr);
+		}
+		else
+		{
+			strcpy((char *)ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingSchedule.ChargingRateUnit,chargingRateUnitStr);
+
+		}
+
+	}
+
+	DEBUG_INFO("handleSetChargingProfileRequest -13\n");
+	/****************chargingSchedulePeriod count start*******************/
+	int what_len = strlen("startPeriod");
+
+	char *where = payload;
+
+	if (what_len)
+		while ((where = strstr(where, "startPeriod"))) {
+		where += what_len;
+		chargingSchedulePeriodCount++;
+	}
+
+	DEBUG_INFO("chargingSchedulePeriodCount=%d\n",chargingSchedulePeriodCount);
+	DEBUG_INFO("handleSetChargingProfileRequest -13 -1\n");
+	where = payload;
+	for(int periodNums=0; periodNums < chargingSchedulePeriodCount; periodNums++)
+	{
+		/****************startPeriod*******************/
+		c=0;
+		loc = strstr(where, "startPeriod");
+		memset(sstr ,0, sizeof(sstr) );
+		while ((loc[strlen("startPeriod")+2+c] != '}') && (loc[strlen("startPeriod")+2+c] != ','))
+		{
+			sstr[c] = loc[strlen("startPeriod")+2+c];
+			//printf("i=%d sstr=%c\n",c, sstr[c]);
+			c++;
+		}
+		sstr[c] = '\0';
+		startPeriodInt[periodNums] = atoi(sstr);
+		DEBUG_INFO("sstr=%d\n",atoi(sstr));
+		DEBUG_INFO("handleSetChargingProfileRequest -13 -1 -1\n");
+		if(connectorIdInt == 0) //  an overall limit for the Charge Point.
+		{
+			ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod[periodNums].StartPeriod = startPeriodInt[periodNums];
+
+		}
+		else
+		{
+			ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod[periodNums].StartPeriod = startPeriodInt[periodNums];
+		}
+		DEBUG_INFO("handleSetChargingProfileRequest -13 -2\n");
+		/****************limit*******************/
+		c=0;
+		loc = strstr(where, "limit");
+		memset(sstr ,0, sizeof(sstr) );
+		while ((loc[strlen("limit")+2+c] != '}') && (loc[strlen("limit")+2+c] != ','))
+		{
+			sstr[c] = loc[strlen("limit")+2+c];
+			//printf("i=%d sstr=%c\n",c, sstr[c]);
+			c++;
+		}
+		sstr[c] = '\0';
+		limitflaot[periodNums] = atof(sstr);
+
+		if(connectorIdInt == 0) //  an overall limit for the Charge Point.
+		{
+			ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod[periodNums].Limit = limitflaot[periodNums];
+
+		}
+		else
+		{
+			ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod[periodNums].Limit = limitflaot[periodNums];
+		}
+		DEBUG_INFO("handleSetChargingProfileRequest -13 -3\n");
+		/****************numberPhases*******************/
+		loc = strstr(where, "numberPhases");
+		if(loc != NULL)
+		{
+			c=0;
+			memset(sstr ,0, sizeof(sstr) );
+			while ((loc[strlen("numberPhases")+2+c] != '}') && (loc[strlen("numberPhases")+2+c] != ','))
+			{
+				sstr[c] = loc[strlen("numberPhases")+2+c];
+				//printf("i=%d sstr=%c\n",c, sstr[c]);
+				c++;
+			}
+			sstr[c] = '\0';
+			numberPhasesInt[periodNums] = atoi(sstr);
+
+			if(connectorIdInt == 0) //  an overall limit for the Charge Point.
+			{
+				ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod[periodNums].NumberPhases = numberPhasesInt[periodNums];
+			}
+			else
+			{
+				ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod[periodNums].NumberPhases = numberPhasesInt[periodNums];
+
+			}
+		}
+
+		where = loc;
+
+	}
+	DEBUG_INFO("handleSetChargingProfileRequest -14\n");
+	/****************chargingSchedulePeriod count end*******************/
+
+
+	/*********************minChargingRate***************************/
+	loc = strstr(payload, "minChargingRate");
+
+	if(loc != NULL)
+	{
+		c = 0;
+		memset(sstr ,0, sizeof(sstr) );
+		while ((loc[strlen("minChargingRate")+2+c] != ',')&&(loc[strlen("minChargingRate")+2+c] != '}'))
+		{
+			sstr[c] = loc[strlen("minChargingRate")+2+c];
+			c++;
+		}
+		sstr[c] = '\0';
+		minChargingRateFloat = atof(sstr);
+
+		if(connectorIdInt == 0) //  an overall limit for the Charge Point.
+		{
+			ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingSchedule.MinChargingRate = minChargingRateFloat;
+		}
+		else
+		{
+			ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingSchedule.MinChargingRate = minChargingRateFloat;
+		}
+
+	}
+
+	DEBUG_INFO("\n\n Replace a specific line in a text file with a new text :\n");
+	DEBUG_INFO("-------------------------------------------------------------\n");
+	DEBUG_INFO(" Input the file name to be opened : ");
+	//fgets(fname, MAX, stdin);
+	//fname[strlen(fname) - 1] = '\0';
+#if 0
+	switch(connectorIdInt)
+	{
+		case 0:
+			strcpy(filename, ChargingProfile_0_JSON );
+			break;
+
+		case 1:
+			strcpy(filename, ChargingProfile_1_JSON );
+			break;
+
+		case 2:
+			strcpy(filename, ChargingProfile_2_JSON );
+			break;
+
+		default:
+			strcpy(filename, ChargingProfile_0_JSON );
+			break;
+	}
+
+	fptr1 = fopen(filename, "r");
+	if (!fptr1)
+	{
+		//file not exist
+		DEBUG_INFO("Unable to open the input file!!\n");
+		fptr1 = fopen(filename, "w+");
+
+	}
+	fclose(fptr1);
+#endif
+
+	DEBUG_INFO("chargingProfilePurposeStr=%s\n",chargingProfilePurposeStr);
+	DEBUG_INFO(" ChargingProfilePurposeTypeStr[TxProfile]=%s\n", ChargingProfilePurposeTypeStr[TxProfile]);
+
+	if(strcmp(chargingProfilePurposeStr, ChargingProfilePurposeTypeStr[ChargePointMaxProfile]) == 0)
+	{
+		//printf("set chargingProfile 1-2\n");
+		DEBUG_INFO("chargingProfilePurposeStr is ChargePointMaxProfile !!! \n");
+		if(connectorIdInt != 0)
+		{
+			sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Rejected] );
+			goto end;
+		}
+
+		strcpy(filename, ChargePointMaxProfile_JSON );
+		fptr1 = fopen(filename, "r");
+		if (!fptr1)
+		{
+			//file not exist
+			DEBUG_INFO("Unable to open the input file!!\n");
+			fptr1 = fopen(filename, "w+");
+		}
+		fclose(fptr1);
+
+	}
+	else if(strcmp(chargingProfilePurposeStr, ChargingProfilePurposeTypeStr[TxDefaultProfile]) == 0)
+	{
+		//printf("set chargingProfile 1-3\n");
+		DEBUG_INFO("chargingProfilePurposeStr is TxDefaultProfile !!! \n");
+		if((connectorIdInt != 0) && (connectorIdInt > gunTotalNumber /*(CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY)*/))
+		{
+			sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Rejected] );
+			goto end;
+		}
+
+		switch(connectorIdInt)
+		{
+			case 0:
+				strcpy(filename, TxDefaultProfile_0_JSON );
+			break;
+
+			case 1:
+				strcpy(filename, TxDefaultProfile_1_JSON );
+			break;
+
+			case 2:
+				strcpy(filename, TxDefaultProfile_2_JSON );
+				break;
+
+			default:
+				strcpy(filename, TxDefaultProfile_0_JSON );
+				break;
+		}
+
+		fptr1 = fopen(filename, "r");
+		if (!fptr1)
+		{
+			//file not exist
+			DEBUG_INFO("Unable to open the input file!!\n");
+			fptr1 = fopen(filename, "w+");
+
+		}
+		fclose(fptr1);
+	}
+	else if(strcmp(chargingProfilePurposeStr, ChargingProfilePurposeTypeStr[TxProfile]) == 0)
+	{
+		//printf("set chargingProfile 1-4\n");
+		DEBUG_INFO("chargingProfilePurposeStr is TxProfile !!! \n");
+		//check Transaction active
+		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == (connectorIdInt -1))
+			{
+
+				if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 8) // S_CHARGING
+				{
+					if(transactionIdInt == ShmOCPP16Data->StartTransaction[connectorIdInt -1].ResponseTransactionId)
+					{
+						meet = TRUE;
+						break;
+					}
+
+				}
+
+			}
+		}
+
+		for (int index = 0; index < CCS_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == (connectorIdInt -1))
+			{
+				if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 8) // S_CHARGING
+				{
+					if(transactionIdInt == ShmOCPP16Data->StartTransaction[connectorIdInt -1].ResponseTransactionId)
+					{
+						meet = TRUE;
+						break;
+					}
+				}
+
+			}
+		}
+
+		for (int index = 0; index < GB_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == (connectorIdInt -1))
+			{
+				if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 8) // S_CHARGING
+				{
+					if(transactionIdInt == ShmOCPP16Data->StartTransaction[connectorIdInt -1].ResponseTransactionId)
+					{
+						meet = TRUE;
+						break;
+					}
+				}
+
+			}
+		}
+
+		if(meet == FALSE)
+		{
+			sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Rejected] );
+			goto end;
+		}
+
+		if((connectorIdInt != 0) && (connectorIdInt > gunTotalNumber /*(CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY)*/))
+		{
+			sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Rejected] );
+			goto end;
+		}
+
+
+		switch(connectorIdInt)
+		{
+			case 0:
+				break;
+
+			case 1:
+				strcpy(filename, TxProfile_1_JSON);
+				break;
+
+			case 2:
+				strcpy(filename, TxProfile_2_JSON);
+				break;
+
+			default:
+				strcpy(filename, TxProfile_1_JSON);
+				break;
+		}
+
+		fptr1 = fopen(filename, "r");
+		if (!fptr1)
+		{
+			//file not exist
+			DEBUG_INFO("Unable to open the input file!!\n");
+			fptr1 = fopen(filename, "w+");
+
+		}
+		fclose(fptr1);
+	}
+
+
+	/**********************************Write to File********************************************************/
+	FILE *infile;
+	FILE *outfile;
+
+	// open file for writing
+	infile = fopen (filename, "r");
+	outfile = fopen (tempfile, "w");
+
+
+	int d =0;
+	d = fgetc(infile);
+	DEBUG_INFO("d:%d\n",d);
+	rewind(infile);
+
+	if(d == EOF)
+	{
+		DEBUG_INFO("ChargingProfile content is  NULL\n");
+
+		fprintf(outfile,"[%s]\n",payload);
+		sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Accepted] );
+
+
+		fclose(infile);
+		fclose(outfile);
+
+
+		sprintf(rmFileCmd,"rm -f %s",filename);
+		system(rmFileCmd);
+
+		resultRename = rename(tempfile, filename);
+
+		if(resultRename == 0)
+		{
+			DEBUG_INFO("File chargingProfile renamed successfully");
+		}
+		else
+		{
+			DEBUG_INFO("Error: unable to rename the chargingProfile file");
+		}
+
+		//sprintf(rmFileCmd,"rm -f %s",tempfile);
+		//system(rmFileCmd);
+	}
+	else
+	{
+		char buf[1000]={0};
+
+		while (fgets(buf, sizeof(buf), infile) != NULL)
+		{
+			buf[strlen(buf) - 1] = '\0'; // eat the newline fgets() stores
+			/*************************tempconnectorIdInt*********************************/
+			loc = strstr(buf, "connectorId");
+			c = 0;
+			memset(sstr ,0, sizeof(sstr) );
+			while (loc[strlen("connectorId")+2+c] != ',')
+			{
+				sstr[c] = loc[strlen("connectorId")+2+c];
+				c++;
+			}
+			sstr[c] = '\0';
+			tempconnectorIdInt = atoi(sstr);
+
+
+			/*************************tempchargingProfileIdInt*********************************/
+			loc = strstr(buf, "chargingProfileId");
+			c = 0;
+			memset(sstr ,0, sizeof(sstr) );
+			while (loc[strlen("chargingProfileId")+2+c] != ',')
+			{
+				sstr[c] = loc[strlen("chargingProfileId")+2+c];
+				c++;
+			}
+			sstr[c] = '\0';
+			tempchargingProfileIdInt = atoi(sstr);
+
+
+			/*************************tempstackLevelInt*********************************/
+			loc = strstr(buf, "stackLevel");
+			c = 0;
+			memset(sstr ,0, sizeof(sstr) );
+			while (loc[strlen("stackLevel")+2+c] != ',')
+			{
+				sstr[c] = loc[strlen("stackLevel")+2+c];
+				c++;
+			}
+			sstr[c] = '\0';
+			tempstackLevelInt = atoi(sstr);
+
+
+			/*************************tempchargingProfilePurposeStr*********************************/
+			loc = strstr(payload, "chargingProfilePurpose");
+			c = 0;
+			memset(sstr ,0, sizeof(sstr) );
+			while ((loc[3+strlen("chargingProfilePurpose")+c] != ',')&&(loc[strlen("minChargingRate")+2+c] != ']'))
+			{
+				sstr[c] = loc[3+strlen("chargingProfilePurpose")+c];
+				//printf("i=%d sstr=%c\n",c, sstr[c]);
+				c++;
+			}
+			sstr[c] = '\0';
+			strcpy(tempchargingProfilePurposeStr,sstr);
+
+
+			if((tempconnectorIdInt == connectorIdInt) && (tempchargingProfileIdInt == chargingProfileIdInt))
+			{
+				if((tempstackLevelInt == stackLevelInt) && (strcmp(tempchargingProfilePurposeStr, chargingProfilePurposeStr) == 0))
+				{
+					DEBUG_INFO("update set chargingProfile to file -0\n");
+					fprintf(outfile,"[%s]\n",payload);
+				}
+				else
+				{
+					DEBUG_INFO("update set chargingProfile to file -1\n");
+					if(tempstackLevelInt < stackLevelInt)
+					{
+						DEBUG_INFO("update set chargingProfile to file -2\n");
+						fprintf(outfile,"[%s]\n",payload);
+						fprintf(outfile,"[%s]\n",buf);
+					}
+				}
+
+				DEBUG_INFO("update set chargingProfile to file\n");
+
+			}
+			else
+			{
+
+				if(tempchargingProfileIdInt < chargingProfileIdInt)
+				{
+					fprintf(outfile,"[%s]\n",payload);
+					fprintf(outfile,"[%s]\n",buf);
+				}
+				else if(tempstackLevelInt < stackLevelInt)
+				{
+					fprintf(outfile,"[%s]\n",payload);
+					fprintf(outfile,"[%s]\n",buf);
+				}
+				else
+				{
+					fprintf(outfile,"[%s]\n",buf);
+					fprintf(outfile,"[%s]\n",payload);
+				}
+
+				fprintf(outfile,"[%s]\n",buf);
+				DEBUG_INFO("add set chargingProfile to file\n");
+			}
+
+		} // end of while loop
+
+		fclose(infile);
+		fclose(outfile);
+
+		sprintf(rmFileCmd,"rm -f %s",filename);
+		system(rmFileCmd);
+
+		resultRename = rename(tempfile, filename);
+
+		if(resultRename == 0)
+		{
+			DEBUG_INFO("File chargingProfile renamed successfully");
+		}
+		else
+		{
+			DEBUG_INFO("Error: unable to rename the chargingProfile file");
+		}
+
+		result = TRUE;
+		sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Accepted] );
+	}
+
+
+end:
+	sendSetChargingProfileConfirmation(uuid, comfirmstr);
+	return result;
+
+	return result;
+}
+
+int handleTriggerMessageRequest(char *uuid, char *payload)
+{
+	mtrace();
+	int result = FAIL;
+	int connectorIdIsNULL = FALSE;
+	int connectorIdInt =0;
+	char sstr[40]={0};
+	char requestedMessagestr[40]={0};
+	char comfirmstr[20]={0};
+	int c = 0;
+	char *loc;
+
+	DEBUG_INFO("handleTriggerMessageRequest\n");
+	//[2,"266e23f4-27a4-41cf-84cb-aadf56b9523f","TriggerMessage",{"requestedMessage":"DiagnosticsStatusNotification","connectorId":1}]
+
+	c = 0;
+	loc = strstr(payload, "requestedMessage");
+	while (loc[3+strlen("requestedMessage")+c] != '\"')
+	{
+		sstr[c] = loc[3+strlen("requestedMessage")+c];
+		c++;
+	}
+	sstr[c] = '\0';
+	strcpy(requestedMessagestr, sstr);
+
+	c = 0;
+	loc = strstr(payload, "connectorId");
+	if(loc == NULL)
+	{
+		connectorIdIsNULL = TRUE;
+	}
+	else
+	{
+		memset(sstr ,0, sizeof(sstr) );
+		while ((loc[strlen("connectorId")+2+c] != ',')&&(loc[strlen("connectorId")+2+c] != '}'))
+		{
+			sstr[c] = loc[strlen("connectorId")+2+c];
+			//printf("i=%d sstr=%c\n",c, sstr[c]);
+			c++;
+		}
+		sstr[c] = '\0';
+		connectorIdInt = atoi(sstr);
+	}
+
+
+	if(connectorIdIsNULL == FALSE && ((connectorIdInt > 0)  && (connectorIdInt <= gunTotalNumber /*(CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY)*/ )))
+	{
+		//connectorIdInt = json_object_get_int(connectorId);
+		sprintf((char *)ShmOCPP16Data->TriggerMessage[connectorIdInt -1].RequestedMessage, "%s" ,requestedMessagestr);
+		ShmOCPP16Data->TriggerMessage[connectorIdInt -1].ConnectorId = connectorIdInt;
+		//ShmOCPP16Data->CsMsg.bits[connectorIdInt -1].TriggerMessageReq = 1;
+		sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
+		sendTriggerMessageConfirmation(uuid,comfirmstr);
+	}
+	else if(connectorIdIsNULL == FALSE && ((connectorIdInt <= 0)  || (connectorIdInt > gunTotalNumber /*(CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY)*/)  ))
+	{
+		sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Rejected] );
+		sendTriggerMessageConfirmation(uuid,comfirmstr);
+		return TRUE;
+	}
+
+
+	if((strcmp(requestedMessagestr, MessageTriggerStr[FirmwareStatusNotification]) != 0) &&
+		(strcmp(requestedMessagestr, MessageTriggerStr[DiagnosticsStatusNotification]) != 0) &&
+		(strcmp(requestedMessagestr, MessageTriggerStr[BootNotification]) != 0 ) &&
+		(strcmp(requestedMessagestr, MessageTriggerStr[Heartbeat]) != 0) &&
+		(strcmp(requestedMessagestr, MessageTriggerStr[MeterValues]) != 0) &&
+		(strcmp(requestedMessagestr, MessageTriggerStr[StatusNotification]) != 0 ))
+	{
+		sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_NotImplemented] );
+		sendTriggerMessageConfirmation(uuid,comfirmstr);
+		return TRUE;
+	}
+	else
+	{
+		sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
+		sendTriggerMessageConfirmation(uuid,comfirmstr);
+	}
+
+	if( strcmp(requestedMessagestr, MessageTriggerStr[FirmwareStatusNotification]) == 0)
+	{
+		sendFirmwareStatusNotificationRequest(FirmwareStatusStr[FirmwareStatusNotificationStatus]);
+		//sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
+
+	}
+	else if(strcmp(requestedMessagestr, MessageTriggerStr[DiagnosticsStatusNotification]) == 0 )
+	{
+		//printf("DiagnosticsStatusStr[DiagnosticsStatus_Idle] =%s\n",DiagnosticsStatusStr[DiagnosticsStatus_Idle]);
+		sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatusNotificationStatus]);
+		//sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
+
+	}
+	else if(strcmp(requestedMessagestr, MessageTriggerStr[BootNotification]) == 0 )
+	{
+		sendBootNotificationRequest();
+		//sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
+
+	}
+	else if(strcmp(requestedMessagestr, MessageTriggerStr[Heartbeat]) == 0 )
+	{
+		sendHeartbeatRequest(connectorIdInt);
+		//sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
+	}
+	else if (strcmp(requestedMessagestr, MessageTriggerStr[MeterValues]) == 0 )
+	{
+		if(connectorIdIsNULL == FALSE)
+		{
+			if((connectorIdInt > 0) && ((connectorIdInt -1) < gunTotalNumber/*(CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY)*/))
+			{
+				ShmOCPP16Data->CsMsg.bits[connectorIdInt -1].TriggerMessageReq = 1;
+				sendMeterValuesRequest(connectorIdInt -1);
+				//sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
+			}
+			//else
+			//{
+			//	sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Rejected] );
+			//}
+
+		}
+		else
+		{
+			for(int idx=0;idx< gunTotalNumber/*(CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY)*/;idx++)
+			{
+				ShmOCPP16Data->CsMsg.bits[idx].TriggerMessageReq = 1;
+				sendMeterValuesRequest(idx);
+
+			}
+
+
+			//sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
+		}
+
+	}
+	else if(strcmp(requestedMessagestr, MessageTriggerStr[StatusNotification]) == 0 )
+	{
+		if(connectorIdIsNULL == FALSE)
+		{
+			if((connectorIdInt > 0) && ((connectorIdInt -1) < gunTotalNumber/*(CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY)*/))
+			{
+				sendStatusNotificationRequest(connectorIdInt -1);
+				//sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
+			}
+		//	else
+		//	{
+		//		sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Rejected] );
+		//	}
+
+		}
+		else
+		{
+			for(int idx=0;idx< gunTotalNumber/*(CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY)*/;idx++)
+				sendStatusNotificationRequest(idx);
+
+			//sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
+		}
+
+	}
+//	else
+//	{
+//		sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_NotImplemented] );
+//	}
+
+//end:
+	//sendTriggerMessageConfirmation(uuid,comfirmstr);
+
+	return result;
+}
+
+int handleUnlockConnectorRequest(char *uuid, char *payload)
+{
+	mtrace();
+	int result = FAIL;
+	char sstr[6]={0};
+	int connectorIdInt =0;
+	char comfirmstr[20]={0};
+	int c = 0;
+	char *loc;
+
+//[2,"ba1cbd49-2a76-493a-8f76-fa23e7606532","UnlockConnector",{"connectorId":1}]
+	DEBUG_INFO("handleUnlockConnectorRequest ...\n");
+	c = 0;
+	loc = strstr(payload, "connectorId");
+	memset(sstr ,0, sizeof(sstr) );
+	while (loc[strlen("connectorId")+2+c] != '}')
+	{
+		sstr[c] = loc[strlen("connectorId")+2+c];
+		//printf("i=%d sstr=%c\n",c, sstr[c]);
+		c++;
+	}
+	sstr[c] = '\0';
+	connectorIdInt = atoi(sstr);
+	DEBUG_INFO("\n unlock connectorIdInt=%d\n",connectorIdInt);
+
+	if(/*CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY*/gunTotalNumber == 0)
+	{
+		sprintf(comfirmstr, "%s", UnlockStatusStr[UnlockStatus_NotSupported] );
+		goto end;
+	}
+	else if((connectorIdInt > gunTotalNumber/*CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY*/) || (connectorIdInt <= 0))
+	{
+		//sprintf(comfirmstr, "%s", UnlockStatusStr[UnlockStatus_NotSupported] );
+		sprintf(comfirmstr, "%s", UnlockStatusStr[UnlockStatus_NotSupported] );
+		goto end;
+	}
+	else
+	{
+	  //check Transaction active
+	  if(strstr((const char *)ShmSysConfigAndInfo->SysConfig.ModelName ,"DC") != NULL)
+	  {
+		  for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+		  {
+			  if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == (connectorIdInt-1) ) && ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 8) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 1) ))
+			  {
+		  		  ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].UnlockConnectorReq = 1;
+
+		  	  }
+		  }
+
+		  for (int index = 0; index < CCS_QUANTITY; index++)
+		  {
+			  if ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == (connectorIdInt-1) ) &&  ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 8) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 1) ))
+			  {
+		  		   //stop Transaction
+		  		   ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].UnlockConnectorReq = 1;
+			  }
+		  }
+
+		  for (int index = 0; index < GB_QUANTITY; index++)
+		  {
+			  if ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == (connectorIdInt-1) ) &&((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 8)||(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 1)))
+			  {
+		  		   //stop Transaction
+				  ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].UnlockConnectorReq = 1;
+			  }
+		  }
+	  }
+	  else
+	  {
+		  for (int index = 0; index < AC_QUANTITY; index++)
+		  {
+			  if ((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == (connectorIdInt-1) ) && ((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == 8) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == 1) ))
+			  {
+		 		  ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].UnlockConnectorReq = 1;
+
+			  }
+		  }
+
+
+	  }// END FOR AC ELSE
+
+
+
+
+
+		ShmOCPP16Data->UnlockConnector[connectorIdInt-1].ConnectorId = connectorIdInt;
+		strcpy((char *)ShmOCPP16Data->UnlockConnector[connectorIdInt-1].guid, uuid);
+		result = TRUE;
+		return result;
+
+	}
+
+end:
+	//json_object_put(obj);  --- remove temporally
+	sendUnlockConnectorConfirmation(uuid, comfirmstr);
+	return result;
+}
+
+int handleUpdateFirmwareRequest(char *uuid, char *payload)
+{
+	mtrace();
+	int result = FAIL;
+	pthread_t t;
+
+	sendUpdateFirmwareConfirmation(uuid);
+	pthread_create(&t, NULL, UpdateFirmwareProcess, payload);
+	pthread_join(t, NULL); // 等�?�執行�??��?完�?
+
+	//sendUpdateFirmwareConfirmation(uuid);
+	ShmOCPP16Data->MsMsg.bits.UpdateFirmwareConf =1;
+	//ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq = 1;
+	return result;
+}
+
+void *UpdateFirmwareProcess(void *data)
+{
+	mtrace();
+	int retriesInt =0, retryIntervalInt=0;
+	char protocol[10], user[50],password[50],host[50], path[50], ftppath[60],host1[50],path1[20];
+	int port=0;
+	char locationstr[160]={0}, retrieveDatestr[30]={0};
+	//char fname[50]="00000_2018-09-07 160902_CSULog.zip";
+	//char comfirmstr[20];
+	int isSuccess = 0;
+	char ftpbuf[200];
+	char temp[100];
+	char * pch;
+	int retriesISNULL=FALSE;
+	int retryInterval=FALSE;
+	int c = 0;
+	//int i = 0;
+	char *loc;
+	char sstr[300]={ 0 };
+	char *str = (char*) data; // ?��?輸入資�?
+	DEBUG_INFO("handleUpdateFirmwareRequest ...\n");
+
+	/***************location **************/
+	loc = strstr(str, "location");
+	memset(sstr ,0, sizeof(sstr) );
+	c = 0;
+	while (loc[3+strlen("location")+c] != '\"')
+	{
+		sstr[c] = loc[3+strlen("location")+c];
+		c++;
+	}
+	sstr[c] = '\0';
+	strcpy(locationstr, sstr);
+
+	/***************retries**************/
+	c = 0;
+	loc = strstr(str, "retries");
+	if(loc == NULL)
+	{
+		retriesISNULL=TRUE;
+	}
+	else
+	{
+		memset(sstr ,0, sizeof(sstr) );
+		while (loc[strlen("retries")+2+c] != ',')
+		{
+			sstr[c] = loc[strlen("retries")+2+c];
+			//printf("i=%d sstr=%c\n",c, sstr[c]);
+			c++;
+		}
+		sstr[c] = '\0';
+
+	}
+
+	if(retriesISNULL == FALSE)
+	{
+		retriesInt = atoi(sstr);
+	}
+
+	/***************retrieveDate  **************/
+	loc = strstr(str, "retrieveDate");
+	memset(sstr ,0, sizeof(sstr) );
+	c = 0;
+	while (loc[3+strlen("retrieveDate")+c] != '\"')
+	{
+		sstr[c] = loc[3+strlen("retrieveDate")+c];
+		c++;
+	}
+	sstr[c] = '\0';
+	strcpy(retrieveDatestr, sstr);
+
+	/***************retryInterval **************/
+	c = 0;
+	loc = strstr(str, "retryInterval");
+	memset(sstr ,0, sizeof(sstr) );
+	if(loc == NULL)
+	{
+		retryInterval=TRUE;
+	}
+	else
+	{
+		while (loc[strlen("retryInterval")+2+c] != ',')
+		{
+			sstr[c] = loc[strlen("retryInterval")+2+c];
+			//printf("i=%d sstr=%c\n",c, sstr[c]);
+			c++;
+		}
+		sstr[c] = '\0';
+	}
+
+	if(retryInterval==FALSE)
+	{
+		retryIntervalInt = atoi(sstr);
+	}
+
+	memset(ftppath, 0, sizeof(ftppath));
+	memset(path, 0, sizeof(path));
+
+	sendFirmwareStatusNotificationRequest(FirmwareStatusStr[FirmwareStatus_Downloading]);
+	ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq = 1;
+
+	if(strncmp(locationstr,"http", 4) == 0)
+	{
+		sscanf(locationstr,"%[^:]:%*2[/]%[^/]/%199[^\n]",
+		    	    			         protocol, host, path);
+
+		    	//sscanf(locationstr,"%[^:]:%*2[/]%[^:]:%[^@]@%[^/]%199[^\n]",
+		    	    	//	         protocol, user, password, host, path);
+		sprintf(ftppath,"/%s", path);
+
+		DEBUG_INFO("protocol =%s\n",protocol);
+
+		DEBUG_INFO("host =%s\n",host);
+
+		DEBUG_INFO("path =%s\n",path);
+		DEBUG_INFO("ftppath=%s\n",ftppath);
+		int ftppathlen=strlen(ftppath);
+		int i=1;
+		char filenametemp[50];
+		while(i < ftppathlen)
+		{
+		   int len=ftppathlen-i;
+		   if(ftppath[len]== 47) // '/' ascll code: 47
+		    {
+			   DEBUG_INFO("compare '/' all right\n");
+		       break;
+		    }
+		    i=i+1;
+		}
+
+		memset(filenametemp, 0, sizeof(filenametemp));
+		strncpy(filenametemp, ftppath+(ftppathlen-i+1), i+1);
+		filenametemp[i+1] = 0;
+		//sendFirmwareStatusNotificationRequest(FirmwareStatusStr[FirmwareStatus_Downloading]);
+
+
+		 do{
+			 isSuccess = httpDownLoadFile(host, ftppath, filenametemp, locationstr);
+		    	 sleep(retryIntervalInt);
+		    }while((isSuccess == 0)&&(retriesInt > 0 && retriesInt --));
+
+	//	isSuccess = httpDownLoadFile(host, ftppath, filenametemp, locationstr);
+
+		if(!isSuccess)
+		{
+		   	sendFirmwareStatusNotificationRequest(FirmwareStatusStr[FirmwareStatus_DownloadFailed]);
+		}
+		else
+		{
+			//ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq = 1;
+			sendFirmwareStatusNotificationRequest(FirmwareStatusStr[FirmwareStatus_Downloaded]);
+			isUpdateRequest = TRUE;
+		}
+
+	}
+    else if(strncmp(locationstr,"ftp", 3) == 0) // ftp
+	{
+    	memset(ftpbuf, 0, sizeof(ftpbuf));
+    	memset(temp, 0, sizeof(temp));
+    	DEBUG_INFO("locationstr=%s\n",locationstr);
+    	strcpy(ftpbuf, locationstr/*"ftp://ipc_ui:pht2016@ftp.phihong.com.tw/DC/log/DemoDC1_2018-07-13_185011_PSULog.zip"*/ );
+    	int ftppathlen=strlen(ftpbuf);
+    	int i=1;
+    	char filenametemp[50];
+    	while(i < ftppathlen)
+    	{
+    		int len=ftppathlen-i;
+    		if(ftpbuf[len]== 47) // '/' ascll code: 47
+    		{
+    			DEBUG_INFO(" compare '/' all right\n");
+    			break;
+    		}
+
+    		i=i+1;
+
+    	}
+
+    	memset(filenametemp, 0, sizeof(filenametemp));
+    	strncpy(filenametemp, ftpbuf+(ftppathlen-i+1), i+1);
+    	filenametemp[i+1] = 0;
+    	strncpy(temp, ftpbuf, ftppathlen-i+1);
+
+    	pch=strchr(temp,'@');
+    	if(pch==NULL)
+    	{
+    		sscanf(temp,"%[^:]:%*2[/]%[^:]:%i/%[a-zA-Z0-9._/-]",
+    				         protocol, host, &port, path);
+    		strcpy(user,"anonymous");
+    		strcpy(password,"");
+    	}
+    	else
+    	{
+    		sscanf(temp,"%[^:]:%*2[/]%[^:]:%[^@]@%[^:]:%i/%199[^\n]",
+    				protocol, user, password, host, &port, path);
+    	}
+
+    	sscanf(host,"%[^/]%s",host1, path1);
+    	sprintf(ftppath,"%s", path1);
+
+    	DEBUG_INFO("protocol =%s\n",protocol);
+    	DEBUG_INFO("user =%s\n",user);
+    	DEBUG_INFO("password =%s\n",password);
+    	DEBUG_INFO("host1 =%s\n",host1);
+    	DEBUG_INFO("port =%d\n",port);
+    	DEBUG_INFO("path1 =%s\n",path1);
+    	DEBUG_INFO("ftppath=%s\n",ftppath);
+
+		//ftpFile(host, user, password, port, ftppath, fname);
+		//download firmware pthred
+    	if(port == 0)
+    	{
+    		port = 21;
+    	}
+
+
+		//sendFirmwareStatusNotificationRequest(FirmwareStatusStr[FirmwareStatus_Downloading]);
+
+		do{
+			 isSuccess = ftpDownLoadFile(host1, user, password, port, ftppath, filenametemp, locationstr);
+			 sleep(retryIntervalInt);
+		}while((!isSuccess)&&(retriesInt > 0 && retriesInt --));
+
+
+		if(!isSuccess)
+		{
+	        //BulldogUtil.sleepMs(interval*1000);
+			DEBUG_INFO("Update firmware request and download file fail.\n");
+			sendFirmwareStatusNotificationRequest(FirmwareStatusStr[FirmwareStatus_DownloadFailed]);
+		}
+		else
+		{
+			//ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq = 1;
+			sendFirmwareStatusNotificationRequest(FirmwareStatusStr[FirmwareStatus_Downloaded]);
+			isUpdateRequest = TRUE;
+		}
+		ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq = 1;
+
+	}
+    else
+    {
+
+    	sendFirmwareStatusNotificationRequest(FirmwareStatusStr[FirmwareStatus_DownloadFailed]);
+    	//ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq = 1;
+
+    }
+
+	pthread_exit(NULL);
+
+}
+
+//==========================================
+// Handle server response routine
+//==========================================
+void handleAuthorizeResponse(char *payload, int gun_index)
+{
+	mtrace();
+	char expiryDatestr[30]={0};
+	char parentIdTagstr[20]={0};
+	char statusstr[20]={0};
+	char expiryDatestrtemp[30]={0};
+	char parentIdTagstrtemp[20]={0};
+	char statusstrtemp[20]={0};
+	int expiryDateISNULL=FALSE;
+	int parentIdTagISNULL=FALSE;
+	char sstr[160]={ 0 };
+	char* filename = AuthorizationCache_JSON;
+	char tempfile[] = "temp.json";
+	//char* buffer = NULL;
+	//FILE *pFile;
+	//char temp[400];
+	int c = 0;
+	char *loc;
+	int  resultRename=0;
+	int responseIdTagInfoAsZero= 0;
+	char rmFileCmd[50]={0};
+
+	DEBUG_INFO("handleAuthorizeResponse ...\n");
+
+	/***********expiryDate*************/
+	loc = strstr(payload, "expiryDate");
+	memset(sstr ,0, sizeof(sstr) );
+	c = 0;
+	if(loc == NULL)
+	{
+		expiryDateISNULL = TRUE;
+	}
+	else
+	{
+		while ((loc != NULL)&&(loc[3+strlen("expiryDate")+c] != '\"'))
+		{
+			sstr[c] = loc[3+strlen("expiryDate")+c];
+			c++;
+		}
+		sstr[c] = '\0';
+		strcpy(expiryDatestr, sstr);
+	}
+
+	/***********parentIdTag*************/
+	loc = strstr(payload, "parentIdTag");
+	memset(sstr ,0, sizeof(sstr) );
+	c = 0;
+	if(loc == NULL)
+	{
+		parentIdTagISNULL = TRUE;
+	}
+	else
+	{
+		while ((loc != NULL)&&(loc[3+strlen("parentIdTag")+c] != '\"'))
+		{
+			sstr[c] = loc[3+strlen("parentIdTag")+c];
+			c++;
+		}
+		sstr[c] = '\0';
+		strcpy(parentIdTagstr, sstr);
+	}
+
+	/***********status*************/
+	loc = strstr(payload, "status");
+	memset(sstr ,0, sizeof(sstr) );
+	c = 0;
+	while (loc[3+strlen("status")+c] != '\"')
+	{
+		sstr[c] = loc[3+strlen("status")+c];
+		c++;
+	}
+	sstr[c] = '\0';
+	strcpy(statusstr, sstr);
+
+#ifdef SystemLogMessage
+	if(expiryDateISNULL == FALSE)
+		DEBUG_INFO("expiryDate: %s\n", expiryDatestr);
+
+	if(parentIdTagISNULL == FALSE)
+		DEBUG_INFO("parentIdTag: %s\n", parentIdTagstr);
+
+	DEBUG_INFO("status: %s\n", statusstr);
+#endif
+
+	if(expiryDateISNULL == FALSE)
+		strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ExpiryDate, expiryDatestr);
+
+	if(parentIdTagISNULL == FALSE)
+		strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag, parentIdTagstr);
+
+	strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status, statusstr);
+
+//Update idTag information to authorization cache if supproted
+	if((strcmp((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemData, "true") == 0) &&  (ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag != NULL) && (ShmOCPP16Data->Authorize.ResponseIdTagInfo.ExpiryDate != NULL) )
+	{
+		if((access(filename,F_OK))!=-1)
+		{
+			DEBUG_INFO("AuthorizationCache exist.\n");
+		}
+		else
+		{
+			DEBUG_INFO("AuthorizationCache not exist\n");
+			FILE *log = fopen(filename, "w+");
+
+			if(log == NULL)
+			{
+				DEBUG_INFO("log is NULL\n");
+			   goto out;
+			}
+			else
+			{
+			   fclose(log);
+			}
+		}
+
+		FILE *infile;
+		FILE *outfile;
+		// open file for writing
+		infile = fopen (filename, "r");
+		outfile = fopen (tempfile, "w");
+
+		//DEBUG_INFO("feof(infile) =%d\n",feof(infile));
+		int c;
+		c = fgetc(infile);
+		DEBUG_INFO("c:%d\n",c);
+		rewind(infile);
+
+		if(c == EOF)
+		{
+			DEBUG_INFO("Orignal File is  NULL\n");
+			if(ShmOCPP16Data->Authorize.ResponseIdTagInfo.ExpiryDate != NULL)
+			{
+				strcpy(expiryDatestrtemp, (const char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ExpiryDate);
+
+			}
+			else
+			{
+				strcpy(expiryDatestrtemp, "");
+
+			}
+
+
+			if(ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag != NULL)
+			{
+				strcpy(parentIdTagstrtemp, (const char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag);
+			}
+			else
+			{
+				//write Authorize IdTag
+				strcpy(parentIdTagstrtemp, (const char *)ShmOCPP16Data->Authorize.IdTag);
+			}
+
+			strcpy(statusstrtemp, (const char *)ShmOCPP16Data->Authorize.IdTag);
+
+			fprintf(outfile,"[{\"idTagInfo\":{\"expiryDate\":\"%s\",\"parentIdTag\":\"%s\",\"status\":\"%s\"}}]\n", expiryDatestrtemp, parentIdTagstrtemp, statusstrtemp);
+			fclose(infile);
+			fclose(outfile);
+
+			sprintf(rmFileCmd,"rm -f %s",filename);
+			system(rmFileCmd);
+
+			resultRename = rename(tempfile, filename);
+
+			if(resultRename == 0)
+			{
+				DEBUG_INFO("File renamed successfully");
+			}
+			else
+			{
+				DEBUG_INFO("Error: unable to rename the file");
+			}
+
+		}
+		else
+		{
+			char buf[160]={0};
+
+
+			DEBUG_INFO("Orignal File is not NULL\n");
+			while (fgets(buf, sizeof(buf), infile) != NULL)
+			{
+				DEBUG_INFO("Orignal File is not NULL-1\n");
+			    buf[strlen(buf) - 1] = '\0'; // eat the newline fgets() stores
+
+			    memset(expiryDatestr, 0, sizeof(expiryDatestrtemp));
+			    memset(parentIdTagstr,0, sizeof(parentIdTagstrtemp));
+			    memset(statusstr, 0, sizeof(statusstrtemp));
+			    memset(expiryDatestrtemp, 0, sizeof(expiryDatestrtemp));
+			    memset(parentIdTagstrtemp, 0, sizeof(parentIdTagstrtemp));
+			    memset(statusstrtemp, 0, sizeof(statusstrtemp));
+
+			    /*********************expiryDate***************/
+			    loc = strstr(buf, "expiryDate");
+				memset(sstr ,0, sizeof(sstr) );
+				c = 0;
+				while (loc[3+strlen("expiryDate")+c] != '\"')
+				{
+					sstr[c] = loc[3+strlen("expiryDate")+c];
+					c++;
+				}
+				sstr[c] = '\0';
+				strcpy(expiryDatestr,sstr);
+
+
+				/*********************parentIdTag***************/
+				loc = strstr(buf, "parentIdTag");
+				memset(sstr ,0, sizeof(sstr) );
+				c = 0;
+				while (loc[3+strlen("parentIdTag")+c] != '\"')
+				{
+					sstr[c] = loc[3+strlen("parentIdTag")+c];
+					c++;
+				}
+				sstr[c] = '\0';
+				strcpy(parentIdTagstr,sstr);
+
+
+				/*********************status***************/
+				loc = strstr(buf, "status");
+				memset(sstr ,0, sizeof(sstr) );
+				c = 0;
+				while (loc[3+strlen("status")+c] != '\"')
+				{
+					sstr[c] = loc[3+strlen("status")+c];
+					c++;
+				}
+				sstr[c] = '\0';
+				strcpy(statusstr,sstr);
+
+
+				if((ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag == NULL) || strcmp((const char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag, "") == 0)
+				{
+					DEBUG_INFO("ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag is NULL\n");
+					responseIdTagInfoAsZero = 1;
+				}
+				else
+				{
+					DEBUG_INFO("ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag=%s\n",ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag);
+				}
+
+				if((responseIdTagInfoAsZero == 0)&&(strcmp(parentIdTagstr,(const char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag) == 0))
+				{
+					//modify item
+
+					if(ShmOCPP16Data->Authorize.ResponseIdTagInfo.ExpiryDate != NULL)
+					{
+						strcpy(expiryDatestrtemp,(const char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ExpiryDate);
+						//json_object_object_add(temp_obj, "expiryDate", json_object_new_string(ShmOCPP16Data->Authorize.ResponseIdTagInfo.ExpiryDate));
+					}
+					else
+					{
+						strcpy(expiryDatestrtemp, "");
+						//json_object_object_add(temp_obj, "expiryDate", json_object_new_string(""));
+					}
+
+
+					if(ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag != NULL)
+					{
+						strcpy(parentIdTagstrtemp,(const char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag);
+						//json_object_object_add(temp_obj, "parentIdTag", json_object_new_string(ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag));
+
+					}
+					else
+					{
+						strcpy(parentIdTagstrtemp, parentIdTagstr);
+					    //json_object_object_add(temp_obj, "parentIdTag", json_object_new_string(json_object_get_string(parentIdTagitem)));
+
+					}
+					strcpy(statusstrtemp,(const char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status);
+
+				}
+				else
+				{
+
+					//wrie original item
+					strcpy(expiryDatestrtemp, expiryDatestr);
+					strcpy(parentIdTagstrtemp, parentIdTagstr);
+					strcpy(statusstrtemp, statusstr);
+				}
+
+				fprintf(outfile,"[{\"idTagInfo\":{\"expiryDate\":\"%s\",\"parentIdTag\":\"%s\",\"status\":\"%s\"}}]\n", expiryDatestrtemp, parentIdTagstrtemp, statusstrtemp);
+
+			}
+
+			fclose(infile);
+			fclose(outfile);
+
+
+
+			sprintf(rmFileCmd,"rm -f %s",filename);
+			system(rmFileCmd);
+
+			resultRename = rename(tempfile, filename);
+
+			if(resultRename == 0)
+			{
+				DEBUG_INFO("File renamed successfully");
+			}
+			else
+			{
+				DEBUG_INFO("Error: unable to rename the file");
+			}
+		}
+	}
+
+	out:
+	ShmOCPP16Data->SpMsg.bits.AuthorizeReq = 0;
+	ShmOCPP16Data->SpMsg.bits.AuthorizeConf = 1; // inform csu
+	authorizeRetryTimes = 0;
+}
+
+void handleBootNotificationResponse(char *payload, int gun_index)
+{
+	mtrace();
+	char sstr[140]={ 0 };//sstr[200]={ 0 };
+	char statusStr[12]={0};
+	char currentTimeStr[30]={0};
+	char *loc;
+	int intervalInt = 0;
+	int c = 0;
+	//double diff_t;
+	struct tm tp;
+	char buf[28]={0};
+	char timebuf[50]={0};
+
+	DEBUG_INFO("handleBootNotificationResponse ...\n");
+
+	/*** interval ****/
+	c = 0;
+	loc = strstr(payload, "interval");
+	printf("loc=%s\n",loc);
+	memset(sstr ,0, sizeof(sstr) );
+
+	while ((loc != NULL) &&(loc[strlen("interval")+2+c] != ',') &&(loc[strlen("interval")+2+c] != '}')  )
+	{
+		sstr[c] = loc[strlen("interval")+2+c];
+		//printf("i=%d sstr=%c\n",c, sstr[c]);
+		c++;
+	}
+	sstr[c] = '\0';
+	DEBUG_INFO("id=%d\n",atoi(sstr));
+	intervalInt = atoi(sstr);
+
+
+    /***status ****/
+    loc = strstr(payload, "status");
+	memset(sstr ,0, sizeof(sstr) );
+	c = 0;
+	while ((loc != NULL) &&(loc[3+strlen("status")+c] != '\"'))
+	{
+		sstr[c] = loc[3+strlen("status")+c];
+		c++;
+	}
+	sstr[c] = '\0';
+	strcpy(statusStr, sstr);
+
+
+	/***currentTime ****/
+    loc = strstr(payload, "currentTime");
+	//printf("loc=%s\n",loc);
+	memset(sstr ,0, sizeof(sstr) );
+	c = 0;
+	while ((loc != NULL) &&(loc[3+strlen("currentTime")+c] != '\"'))
+	{
+		sstr[c] = loc[3+strlen("currentTime")+c];
+		c++;
+	}
+	sstr[c] = '\0';
+	strcpy(currentTimeStr, sstr);
+
+	BootNotificationInterval = ShmOCPP16Data->BootNotification.ResponseHeartbeatInterval = intervalInt;
+	HeartBeatWaitTime = BootNotificationInterval;
+
+
+#ifdef SystemLogMessage
+	DEBUG_INFO("currentTime: %s\n", currentTimeStr);
+	DEBUG_INFO("interval: %d\n", intervalInt);
+	DEBUG_INFO("status: %s\n", statusStr);
+#endif
+
+	//write back to ShmOCPP16Data->BootNotification
+	strcpy((char *)ShmOCPP16Data->BootNotification.ResponseCurrentTime, currentTimeStr);
+	ShmOCPP16Data->BootNotification.ResponseHeartbeatInterval = intervalInt;
+	strcpy((char *)ShmOCPP16Data->BootNotification.ResponseStatus, statusStr);
+
+   	if((strcmp(statusStr, RegistrationStatusStr[RegistrationStatus_Accepted]) == 0 )/* ||
+		(strcmp(status, RegistrationStatusStr[RegistrationStatus_Pending]) == 0) ||
+		(strcmp(status, RegistrationStatusStr[RegistrationStatus_Rejected]) == 0)*/)
+	{
+		server_sign = TRUE;
+		server_pending =FALSE;
+
+	}
+	else if(strcmp(statusStr, RegistrationStatusStr[RegistrationStatus_Pending]) == 0)
+	{
+		server_pending = TRUE;
+	}
+
+
+	strptime((const char *)ShmOCPP16Data->BootNotification.ResponseCurrentTime, "%Y-%m-%dT%H:%M:%S", &tp);
+	tp.tm_isdst = -1;
+	//time_t utc = mktime(&tp);
+
+	strftime(buf, 28, "%Y-%m-%d %H:%M:%S", &tp);
+	memset(timebuf, 0, sizeof timebuf);
+	sprintf(timebuf,"date -s '%s'",buf);
+	DEBUG_INFO("timebuf=%s\n",timebuf);
+	system(timebuf);
+
+	//==============================================
+	// RTC sync
+	//==============================================
+	system("/sbin/hwclock -w --systohc");
+
+	ShmOCPP16Data->OcppConnStatus = 1; ////0: disconnected, 1: connected
+	ShmOCPP16Data->SpMsg.bits.BootNotificationConf = 1;
+
+}
+
+void handleDataTransferResponse(char *payload, int gun_index)
+{
+	char sstr[160]={0};//sstr[200]={ 0 };
+	int c = 0;
+	char *loc;
+	DEBUG_INFO("handleDataTransferResponse ...\n");
+	loc = strstr(payload, "status");
+	printf("loc=%s\n",loc);
+	c = 0;
+	while (loc[3+strlen("status")+c] != '\"')
+	{
+		sstr[c] = loc[3+strlen("status")+c];
+		//printf("i=%d sstr=%c\n",c, sstr[c]);
+		c++;
+	}
+	sstr[c] = '\0';
+
+	DEBUG_INFO(" DataTransferResponse=%s\n", sstr);
+	#ifdef SystemLogMessage
+	DEBUG_INFO("data: %s\n", payload);
+	#endif
+}
+
+void handleDiagnosticsStatusNotificationResponse(char *payload, int gun_index)
+{
+	DEBUG_INFO("handleDiagnosticsStatusNotificationResponse ...\n");
+	//struct json_object *obj;
+//	obj = json_tokener_parse(payload);
+	ShmOCPP16Data->SpMsg.bits.DiagnosticsStatusNotificationReq = 0;
+	ShmOCPP16Data->SpMsg.bits.DiagnosticsStatusNotificationConf = 1;
+	//No fields are defined.
+}
+
+void handleFirmwareStatusNotificationResponse(char *payload, int gun_index)
+{
+	DEBUG_INFO("handleFirmwareStatusNotificationResponse ...\n");
+	//struct json_object *obj;
+//	obj = json_tokener_parse(payload);
+	ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationReq = 0;
+	ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationConf = 1;
+
+	//No fields are defined.
+}
+
+void handleHeartbeatResponse(char *payload, int gun_index)
+{
+	mtrace();
+	//double diff_t;
+	struct tm tp;
+	char buf[28]={0};
+	char timebuf[50]={0};
+	char sstr[30]={ 0 };
+	int c = 0;
+	char *loc;
+//[3,"9c2e3c41-ab34-409e-8902-f5f48b6de641",{"currentTime":"2018-09-06T02:22:57.171Z"}]
+
+	DEBUG_INFO("handleHeartbeatResponse ...\n");
+	c = 0;
+	loc = strstr(payload, "currentTime");
+	memset(sstr ,0, sizeof(sstr) );
+	while (loc[3+strlen("currentTime")+c] != '\"')
+	{
+		sstr[c] = loc[3+strlen("currentTime")+c];
+		c++;
+	}
+	sstr[c] = '\0';
+	strcpy((char *)ShmOCPP16Data->Heartbeat.ResponseCurrentTime,sstr);
+
+	#ifdef SystemLogMessage
+	DEBUG_INFO("currentTime: %s\n", ShmOCPP16Data->Heartbeat.ResponseCurrentTime);
+	#endif
+
+	strptime((const char *)ShmOCPP16Data->Heartbeat.ResponseCurrentTime, "%Y-%m-%dT%H:%M:%S", &tp);
+	tp.tm_isdst = -1;
+	//time_t utc = mktime(&tp);
+	strftime(buf, 28, "%Y-%m-%d %H:%M:%S", &tp);
+	memset(timebuf, 0, sizeof timebuf);
+	sprintf(timebuf,"date -s '%s'",buf);
+	system(timebuf);
+
+	//==============================================
+	// RTC sync
+	//==============================================
+	system("/sbin/hwclock -w --systohc");
+
+	if(FirstHeartBeat == 0)
+	{
+		FirstHeartBeat = 1;
+	}
+
+}
+
+void handleMeterValuesResponse(char *payload, int gun_index)
+{
+	mtrace();
+	//struct json_object *obj;
+	DEBUG_INFO("handleMeterValuesResponse ...\n");
+
+	//No fields are defined.
+}
+
+void handleStartTransactionResponse(char *payload, int gun_index)
+{
+	mtrace();
+	char sstr[30]={ 0 };
+	int c = 0;
+	char *loc;
+	int transactionIdInt = 0;
+//[3,"f7da35db-9d9b-4362-841f-26424be1064f",{"idTagInfo":{"expiryDate":"2020-06-19T01:10:00.000Z","parentIdTag":"1UF1YvGvmNbLF17sP6LY","status":"Accepted"},"transactionId":2146754131}]
+	DEBUG_INFO("handleStartTransactionResponse\n");
+
+	/****************expiryDate********************/
+
+	loc = strstr(payload, "expiryDate");
+	if(loc == NULL)
+	{
+		strcpy((char *)ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.ExpiryDate, "");
+	}
+	else
+	{
+		c = 0;
+		memset(sstr ,0, sizeof(sstr) );
+		while (loc[3+strlen("expiryDate")+c] != '\"')
+		{
+			sstr[c] = loc[3+strlen("expiryDate")+c];
+			c++;
+		}
+		sstr[c] = '\0';
+		sprintf((char *)ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.ExpiryDate, "%s", sstr);
+	}
+
+
+
+	/****************parentIdTag********************/
+
+	loc = strstr(payload, "parentIdTag");
+	if(loc == NULL)
+	{
+		strcpy((char *)ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.ParentIdTag, "");
+	}
+	else
+	{
+		c = 0;
+		memset(sstr ,0, sizeof(sstr) );
+		while (loc[3+strlen("parentIdTag")+c] != '\"')
+		{
+			sstr[c] = loc[3+strlen("parentIdTag")+c];
+			c++;
+		}
+		sstr[c] = '\0';
+		sprintf((char *)ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.ParentIdTag, "%s", sstr);
+	}
+
+
+	/****************status********************/
+
+	loc = strstr(payload, "status");
+	if(loc == NULL)
+	{
+		strcpy((char *)ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.Status, "");
+	}
+	else
+	{
+		c = 0;
+		memset(sstr ,0, sizeof(sstr) );
+		while (loc[3+strlen("status")+c] != '\"')
+		{
+			sstr[c] = loc[3+strlen("status")+c];
+			c++;
+		}
+		sstr[c] = '\0';
+		sprintf((char *)ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.Status, "%s", sstr);
+	}
+
+
+	/****************transactionId********************/
+	 c=0;
+	 loc = strstr(payload, "transactionId");
+	 memset(sstr ,0, sizeof(sstr) );
+	 while ((loc[strlen("transactionId")+2+c] != '}') && (loc[strlen("transactionId")+2+c] != ','))
+	 {
+		sstr[c] = loc[strlen("transactionId")+2+c];
+		c++;
+	}
+	sstr[c] = '\0';
+	ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId = atoi(sstr);
+	transactionIdInt = ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId;
+	ShmOCPP16Data->CpMsg.bits[gun_index].StartTransactionConf = 1;
+	ShmOCPP16Data->CpMsg.bits[gun_index].StartTransactionReq = 0;
+
+#ifdef SystemLogMessage
+DEBUG_INFO("idTagInfo-expiryDate: %s\n", ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.ExpiryDate);
+DEBUG_INFO("idTagInfo-parentIdTag: %s\n", ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.ParentIdTag);
+DEBUG_INFO("idTagInfo-status: %s\n", ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.Status);
+DEBUG_INFO("transactionId: %d\n", ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId);
+#endif
+
+	if(strcmp((const char *)ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.Status, "Accepted") == 0)
+	{
+		//add Charging Record
+		SettingChargingRecord(gun_index, transactionIdInt);
+
+	}
+}
+
+void handleStatusNotificationResponse(char *payload, int gun_index)
+{
+	mtrace();
+	printf("handleStatusNotificationResponse\n");
+
+	cpinitateMsg.bits[gun_index].StatusNotificationReq = 0;
+	cpinitateMsg.bits[gun_index].StatusNotificationConf = 1;
+
+}
+
+void handleStopTransactionnResponse(char *payload, int gun_index)
+{
+	mtrace();
+	char sstr[30]={ 0 };
+	int c = 0;
+	char *loc;
+	//[3,"e79c0728-dd4c-4038-a90e-bb0eb23e1ee0",{"idTagInfo":{"expiryDate":"2020-06-19T01:10:00.000Z","parentIdTag":"1UF1YvGvmNbLF17sP6LY","status":"Accepted"}}]
+
+	ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionConf = 1;
+	ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq = 0;
+
+	loc = strstr(payload, "idTagInfo");
+	/***********************idTagInfo************************/
+	if(loc != NULL)
+	{
+		/***********************expiryDate************************/
+		loc = strstr(payload, "expiryDate");
+
+		if(loc != NULL)
+		{
+			memset(sstr ,0, sizeof(sstr) );
+			c = 0;
+			while (loc[3+strlen("expiryDate")+c] != '\"')
+			{
+				sstr[c] = loc[3+strlen("expiryDate")+c];
+				c++;
+			}
+			sstr[c] = '\0';
+			sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].ResponseIdTagInfo.ExpiryDate, "%s", sstr);
+		}
+
+
+		/***********************parentIdTag************************/
+		loc = strstr(payload, "parentIdTag");
+
+		if(loc != NULL)
+		{
+			memset(sstr ,0, sizeof(sstr) );
+			c = 0;
+			while (loc[3+strlen("parentIdTag")+c] != '\"')
+			{
+				sstr[c] = loc[3+strlen("parentIdTag")+c];
+				c++;
+			}
+			sstr[c] = '\0';
+			sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].ResponseIdTagInfo.ParentIdTag, "%s", sstr);
+		}
+
+
+		/***********************status************************/
+		loc = strstr(payload, "status");
+		memset(sstr ,0, sizeof(sstr) );
+		c = 0;
+		while (loc[3+strlen("status")+c] != '\"')
+		{
+			sstr[c] = loc[3+strlen("status")+c];
+			c++;
+		}
+		sstr[c] = '\0';
+		sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].ResponseIdTagInfo.Status, "%s", sstr);
+
+	}
+#ifdef SystemLogMessage
+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);
+#endif
+
+}
+
+//==========================================
+// Handle Error routine
+//==========================================
+void handleError(char *id, char *errorCode, char *errorDescription,char *payload)
+{
+	mtrace();
+	#ifdef SystemLogMessage
+	DEBUG_INFO("errorCode: %s\n", errorCode);
+
+	DEBUG_INFO("errorDescription: %s\n", errorDescription);
+
+	DEBUG_INFO("errorDetails: %s\n", payload);
+	#endif
+
+}
+
+
+
+//===============================================
+// Common routine
+//===============================================
+int initialConfigurationTable(void)
+{
+	printf("initialConfigurationTable  \n");
+	memset(&(ShmOCPP16Data->ConfigurationTable), 0, sizeof(struct OCPP16ConfigurationTable) );
+	/*Core Profile*/
+	//AllowOfflineTxForUnknownId
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemAccessibility = 1;
+	printf("AllowoddlineTXForUnknownId type: %d  \n", ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemAccessibility);
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemName, "AllowOfflineTxForUnknownId");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemData, "TRUE" );
+
+	//AuthorizationCacheEnabled
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemAccessibility = 1;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemName, "AuthorizationCacheEnabled");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemData, "TRUE" /*"FALSE"*/ );
+
+
+	//AuthorizeRemoteTxRequests
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemAccessibility = 0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemName, "AuthorizeRemoteTxRequests");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemData, "TRUE" );
+
+
+	//BlinkRepeat
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemAccessibility = 1;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemName, "BlinkRepeat");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemData, "0" );
+
+	//ClockAlignedDataInterval
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemAccessibility = 1;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemName, "ClockAlignedDataInterval");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemData, "0" );
+
+	//ConnectionTimeOut
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemAccessibility = 1;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemName, "ConnectionTimeOut");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemData, "60" );
+
+	//GetConfigurationMaxKeys
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemAccessibility =0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemName, "GetConfigurationMaxKeys");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemData, "43" );
+
+	// HeartbeatInterval
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemAccessibility = 1;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemName, "HeartbeatInterval");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemData, "10" );
+
+	// LightIntensity
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemAccessibility = 1;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemName, "LightIntensity");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemData, "0" );
+
+	// LocalAuthorizeOffline
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemAccessibility = 1;//0;  --- for OCTT Test case
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemName, "LocalAuthorizeOffline");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData, "TRUE" );
+
+	// LocalPreAuthorize
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemAccessibility = 1; //0; --- for OCTT Test case
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemName, "LocalPreAuthorize");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemData, "FALSE" );
+
+	// MaxEnergyOnInvalidId
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemAccessibility = 1;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemName, "MaxEnergyOnInvalidId");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemData, "0" );
+
+	// MeterValuesAlignedData
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemAccessibility = 1;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemName, "MeterValuesAlignedData");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemData, "V,A,KW,KWh" );
+
+	// MeterValuesAlignedDataMaxLength
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemAccessibility = 0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemName, "MeterValuesAlignedDataMaxLength");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemData, "4" );
+
+	// MeterValuesSampledData
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemAccessibility = 1;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemName, "MeterValuesSampledData");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemData, "V,A,KW,KWh" );
+
+	// MeterValuesSampledDataMaxLength
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemAccessibility = 0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemName, "MeterValuesSampledDataMaxLength");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemData, "4" );
+
+	// MeterValueSampleInterval
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemAccessibility = 1;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemName, "MeterValueSampleInterval");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemData, "10" );
+
+
+	// MinimumStatusDuration
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemAccessibility = 1;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemName, "MinimumStatusDuration");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemData, "0" );
+
+	// NumberOfConnectors
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemAccessibility = 0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemName, "NumberOfConnectors");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemData, "3" );
+
+	// ResetRetries
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemAccessibility = 1;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemName, "ResetRetries");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemData, "3" );
+
+	// ConnectorPhaseRotation
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemAccessibility = 1;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemName, "ConnectorPhaseRotation");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "Unknown" );
+
+	// ConnectorPhaseRotationMaxLength
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemAccessibility = 0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemName, "ConnectorPhaseRotationMaxLength");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemData, "1" );
+
+	// StopTransactionOnEVSideDisconnect
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemAccessibility = 1;// 0; // --- for OCTT Test case
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemName, "StopTransactionOnEVSideDisconnect");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemData, "TRUE" );
+
+	// StopTransactionOnInvalidId
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemAccessibility = 1;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemName, "StopTransactionOnInvalidId");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemData, "FALSE" );
+
+	// StopTxnAlignedData
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemAccessibility = 1;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemName, "StopTxnAlignedData");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemData, "Energy.Active.Import.Register" );
+
+	// StopTxnAlignedDataMaxLength
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemAccessibility = 0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemName, "StopTxnAlignedDataMaxLength");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemData, "0" );
+
+	// StopTxnSampledData
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemAccessibility = 1;
+
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemName, "StopTxnSampledData");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemData, "Energy.Active.Import.Register" );
+
+	// StopTxnSampledDataMaxLength
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemAccessibility = 0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemName, "StopTxnSampledDataMaxLength");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData, "0" );
+
+	// SupportedFeatureProfiles
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemAccessibility = 0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemName, "SupportedFeatureProfiles");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemData, "Core,FirmwareManagement,LocalAuthListManagement,Reservation,SmartCharging,RemoteTrigger" );
+
+	// SupportedFeatureProfilesMaxLength
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemAccessibility = 0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemName, "SupportedFeatureProfilesMaxLength");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemData, "6" );
+
+	// TransactionMessageAttempts
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemAccessibility = 1;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemName, "TransactionMessageAttempts");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemData, "3" );
+
+	// TransactionMessageRetryInterval
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemAccessibility = 1;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemName, "TransactionMessageRetryInterval");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemData, "60" );
+
+	// UnlockConnectorOnEVSideDisconnect
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemAccessibility = 1;//0;  --- for OCTT Test case
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemName, "UnlockConnectorOnEVSideDisconnect");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemData, "TRUE" );
+
+	// WebSocketPingInterval
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemAccessibility = 1;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemName, "WebSocketPingInterval");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemData, "30" );
+
+
+	/* Local Auth List Management Profile*/
+#if 1
+	//For OCTT Test Case
+	ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemAccessibility = 1;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemName, "LocalAuthorizationListEnabled");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "TRUE" );
+#endif
+
+#if 0 // remove temporally
+	//LocalAuthListEnabled
+	ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemAccessibility = 1;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemName, "LocalAuthListEnabled");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "TRUE" );
+#endif
+
+	//LocalAuthListMaxLength
+	ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemAccessibility = 0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemName, "LocalAuthListMaxLength");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemData, "500" );
+
+	//SendLocalListMaxLength
+	ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemAccessibility = 0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemName, "SendLocalListMaxLength");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemData, "500" );
+
+	//ReserveConnectorZeroSupported
+	ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemAccessibility = 0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemName, "ReserveConnectorZeroSupported");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemData, "TRUE"/*"FALSE"*/ ); //For OCTT Test Case
+
+
+	/*  Smart Charging Profile */
+	//ChargeProfileMaxStackLevel
+	ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemAccessibility = 0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemName, "ChargeProfileMaxStackLevel");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemData, "3" );
+
+	// ChargingScheduleAllowedChargingRateUnit
+	ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemAccessibility = 0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemName, "ChargingScheduleAllowedChargingRateUnit");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemData, "Current" );
+
+	// ChargingScheduleMaxPeriods
+	ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemAccessibility = 0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemName, "ChargingScheduleMaxPeriods");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemData, "10" );
+
+	// ConnectorSwitch3to1PhaseSupported
+	ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemAccessibility = 0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemName, "ConnectorSwitch3to1PhaseSupported");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemData, "TRUE" );
+
+	// MaxChargingProfilesInstalled
+	ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemAccessibility = 0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemName, "MaxChargingProfilesInstalled");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemData, "9" );
+
+	return 0;
+}
+
+
+
+void getKeyValue(char *keyReq)
+{
+	 int isEmpty = FALSE;
+	 int isKnowKey = FALSE;
+	 //int unKnowIndex = 0;
+
+	 DEBUG_INFO("getKeyValue \n");
+
+	 if((keyReq == NULL) || (strlen(keyReq) == 0))
+	     isEmpty = TRUE;
+
+	 if(isEmpty || strcmp(keyReq, "AllowOfflineTxForUnknownId") == 0)
+	 {
+		strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_AllowOfflineTxForUnknownId].Item, "AllowOfflineTxForUnknownId");
+		strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AllowOfflineTxForUnknownId].Key, "AllowOfflineTxForUnknownId");
+		if(ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemAccessibility == 1)
+		{
+			strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AllowOfflineTxForUnknownId].ReadOnly, "0"/*"FALSE"*/);
+		}
+		else
+		{
+			strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AllowOfflineTxForUnknownId].ReadOnly, "1"/*"TRUE"*/);
+		}
+
+		strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AllowOfflineTxForUnknownId].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemData );
+		isKnowKey = TRUE;
+	 }
+
+	 if(isEmpty || strcmp(keyReq, "AuthorizationCacheEnabled") == 0 )
+	 {
+		strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_AuthorizationCacheEnabled].Item, "AuthorizationCacheEnabled");
+		strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AuthorizationCacheEnabled].Key, "AuthorizationCacheEnabled");
+		if(ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemAccessibility == 1)
+		{
+			strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AuthorizationCacheEnabled].ReadOnly, "0"/*"FALSE"*/);
+		}
+		else
+		{
+			strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AuthorizationCacheEnabled].ReadOnly, "1"/*"TRUE"*/);
+		}
+		strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AuthorizationCacheEnabled].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemData );
+		isKnowKey = TRUE;
+	 }
+
+	 if(isEmpty || strcmp(keyReq, "AuthorizeRemoteTxRequests") == 0 )
+	 {
+		strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_AuthorizeRemoteTxRequests].Item, "AuthorizeRemoteTxRequests");
+		strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AuthorizeRemoteTxRequests].Key, "AuthorizeRemoteTxRequests");
+
+		if(ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemAccessibility == 1)
+		{
+			strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AuthorizeRemoteTxRequests].ReadOnly, "0"/*"FALSE"*/);
+		}
+		else
+		{
+			strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AuthorizeRemoteTxRequests].ReadOnly, "1"/*"TRUE"*/);
+		}
+
+		strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AuthorizeRemoteTxRequests].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemData );
+		isKnowKey = TRUE;
+	 }
+
+	  if(isEmpty || strcmp(keyReq, "BlinkRepeat") == 0 )
+	  {
+		  strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_BlinkRepeat].Item, "BlinkRepeat");
+		  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_BlinkRepeat].Key, "BlinkRepeat");
+
+		  if(ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemAccessibility == 1)
+		  {
+			  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_BlinkRepeat].ReadOnly, "0"/*"FALSE"*/);
+		  }
+		  else
+		  {
+			  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_BlinkRepeat].ReadOnly, "1"/*"TRUE"*/);
+		  }
+
+		  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_BlinkRepeat].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemData );
+		  isKnowKey = TRUE;
+	  }
+
+	   if(isEmpty ||  strcmp(keyReq, "ClockAlignedDataInterval") == 0 )
+	   {
+		   strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ClockAlignedDataInterval].Item, "ClockAlignedDataInterval");
+		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ClockAlignedDataInterval].Key, "ClockAlignedDataInterval");
+
+		   if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemAccessibility == 1)
+		   {
+			   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ClockAlignedDataInterval].ReadOnly, "0"/*"FALSE"*/);
+		   }
+		   else
+		   {
+			   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ClockAlignedDataInterval].ReadOnly, "1"/*"TRUE"*/);
+		   }
+
+
+		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ClockAlignedDataInterval].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemData );
+		   isKnowKey = TRUE;
+	   }
+
+	   if(isEmpty ||   strcmp(keyReq, "ConnectionTimeOut") == 0 )
+	   {
+		   strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ConnectionTimeOut].Item, "ConnectionTimeOut");
+		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectionTimeOut].Key, "ConnectionTimeOut");
+
+		   if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemAccessibility == 1)
+		   {
+			   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectionTimeOut].ReadOnly, "0"/*"FALSE"*/);
+		   }
+		   else
+		   {
+			   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectionTimeOut].ReadOnly, "1"/*"TRUE"*/);
+		   }
+
+
+		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectionTimeOut].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemData );
+		   isKnowKey = TRUE;
+	   }
+
+	   if(isEmpty ||  strcmp(keyReq, "GetConfigurationMaxKeys") == 0 )
+	   {
+
+		   strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_GetConfigurationMaxKeys].Item, "GetConfigurationMaxKeys");
+		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_GetConfigurationMaxKeys].Key, "GetConfigurationMaxKeys");
+
+		   if(ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemAccessibility == 1)
+		   {
+			   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_GetConfigurationMaxKeys].ReadOnly, "0"/*"FALSE"*/);
+		   }
+		   else
+		   {
+			   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_GetConfigurationMaxKeys].ReadOnly, "1"/*"TRUE"*/);
+		   }
+
+		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_GetConfigurationMaxKeys].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemData );
+		   isKnowKey = TRUE;
+	   }
+
+	   if(isEmpty ||  strcmp(keyReq, "HeartbeatInterval") == 0 )
+	   {
+
+		   strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_HeartbeatInterval].Item, "HeartbeatInterval");
+		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_HeartbeatInterval].Key, "HeartbeatInterval");
+
+		   if(ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemAccessibility == 1)
+		   {
+			   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_HeartbeatInterval].ReadOnly, "0"/*"FALSE"*/);
+		   }
+		   else
+		   {
+			   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_HeartbeatInterval].ReadOnly, "1"/*"TRUE"*/);
+		   }
+
+		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_HeartbeatInterval].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemData );
+		   isKnowKey = TRUE;
+	   }
+
+	   if(isEmpty ||  strcmp(keyReq, "LightIntensity") == 0 )
+	   {
+		   strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_LightIntensity].Item, "LightIntensity");
+		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LightIntensity].Key, "LightIntensity");
+
+		   if(ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemAccessibility == 1)
+		   {
+			   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LightIntensity].ReadOnly, "0"/*"FALSE"*/);
+		   }
+		   else
+		   {
+			   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LightIntensity].ReadOnly, "1"/*"TRUE"*/);
+		   }
+
+		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LightIntensity].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemData );
+		   isKnowKey = TRUE;
+	   }
+
+	   if(isEmpty ||  strcmp(keyReq, "LocalAuthorizeOffline") == 0 )
+	   {
+
+		   strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_LocalAuthorizeOffline].Item, "LocalAuthorizeOffline");
+		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthorizeOffline].Key, "LocalAuthorizeOffline");
+
+		   if(ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemAccessibility == 1)
+		   {
+			   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthorizeOffline].ReadOnly, "0"/*"FALSE"*/);
+		   }
+		   else
+		   {
+			   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthorizeOffline].ReadOnly, "1"/*"TRUE"*/);
+		   }
+
+		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthorizeOffline].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData );
+		   isKnowKey = TRUE;
+	   }
+
+	   if(isEmpty || strcmp(keyReq, "LocalPreAuthorize") == 0 )
+	   {
+
+		   strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_LocalPreAuthorize].Item, "LocalPreAuthorize");
+		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalPreAuthorize].Key, "LocalPreAuthorize");
+
+		   if(ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemAccessibility == 1)
+		   {
+			   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalPreAuthorize].ReadOnly, "0"/*"FALSE"*/);
+		   }
+		   else
+		   {
+			   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalPreAuthorize].ReadOnly, "1"/*"TRUE"*/);
+		   }
+
+		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalPreAuthorize].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemData );
+		   isKnowKey = TRUE;
+	    }
+
+	    if(isEmpty ||  strcmp(keyReq, "MaxEnergyOnInvalidId") == 0 )
+	    {
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_MaxEnergyOnInvalidId].Item, "MaxEnergyOnInvalidId");
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MaxEnergyOnInvalidId].Key, "MaxEnergyOnInvalidId");
+
+	    	 if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemAccessibility == 1)
+	    	 {
+	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MaxEnergyOnInvalidId].ReadOnly, "0"/*"FALSE"*/);
+	    	 }
+	    	 else
+	    	 {
+	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MaxEnergyOnInvalidId].ReadOnly, "1"/*"TRUE"*/);
+	    	 }
+
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MaxEnergyOnInvalidId].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemData );
+	    	 isKnowKey = TRUE;
+	    }
+
+	    if(isEmpty ||  strcmp(keyReq, "MeterValuesAlignedData") == 0 )
+	    {
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_MeterValuesAlignedData].Item, "MeterValuesAlignedData");
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesAlignedData].Key, "MeterValuesAlignedData");
+
+	    	 if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemAccessibility == 1)
+	    	 {
+	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesAlignedData].ReadOnly, "0"/*"FALSE"*/);
+	    	 }
+	    	 else
+	    	 {
+	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesAlignedData].ReadOnly, "1"/*"TRUE"*/);
+	    	 }
+
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesAlignedData].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemData );
+	    	 isKnowKey = TRUE;
+	    }
+
+	     if(isEmpty ||  strcmp(keyReq, "MeterValuesAlignedDataMaxLength") == 0 )
+	     {
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_MeterValuesAlignedDataMaxLength].Item, "MeterValuesAlignedDataMaxLength");
+	         strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesAlignedDataMaxLength].Key, "MeterValuesAlignedDataMaxLength");
+
+	         if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemAccessibility == 1)
+	         {
+	        	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesAlignedDataMaxLength].ReadOnly, "0"/*"FALSE"*/);
+	         }
+	         else
+	         {
+	        	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesAlignedDataMaxLength].ReadOnly, "1"/*"TRUE"*/);
+	         }
+
+	         strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesAlignedDataMaxLength].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemData );
+	         isKnowKey = TRUE;
+	      }
+
+	     if(isEmpty ||  strcmp(keyReq, "MeterValuesSampledData") == 0 )
+	     {
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_MeterValuesSampledData].Item, "MeterValuesSampledData");
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesSampledData].Key, "MeterValuesSampledData");
+
+	    	 if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemAccessibility == 1)
+	    	 {
+	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesSampledData].ReadOnly, "0"/*"FALSE"*/);
+	    	 }
+	    	 else
+	    	 {
+	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesSampledData].ReadOnly, "1"/*"TRUE"*/);
+	    	 }
+
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesSampledData].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemData );
+	    	 isKnowKey = TRUE;
+	     }
+
+	    if(isEmpty ||   strcmp(keyReq, "MeterValuesSampledDataMaxLength") == 0 )
+	    {
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_MeterValuesSampledDataMaxLength].Item, "MeterValuesSampledDataMaxLength");
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesSampledDataMaxLength].Key, "MeterValuesSampledDataMaxLength");
+
+	    	 if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemAccessibility == 1)
+	    	 {
+	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesSampledDataMaxLength].ReadOnly, "0"/*"FALSE"*/);
+	    	 }
+	    	 else
+	    	 {
+	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesSampledDataMaxLength].ReadOnly, "1"/*"TRUE"*/);
+	    	 }
+	         strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesSampledDataMaxLength].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemData );
+	         isKnowKey = TRUE;
+	    }
+
+	   if(isEmpty ||  strcmp(keyReq, "MeterValueSampleInterval") == 0 )
+	   {
+		   strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_MeterValueSampleInterval].Item, "MeterValueSampleInterval");
+		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValueSampleInterval].Key, "MeterValueSampleInterval");
+
+		   if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemAccessibility == 1)
+		   {
+			   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValueSampleInterval].ReadOnly, "0"/*"FALSE"*/);
+		   }
+		   else
+		   {
+			   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValueSampleInterval].ReadOnly, "1"/*"TRUE"*/);
+		   }
+
+		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValueSampleInterval].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemData );
+		   isKnowKey = TRUE;
+	    }
+
+	   if(isEmpty || strcmp(keyReq, "MinimumStatusDuration") == 0 )
+	   {
+		   strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_MinimumStatusDuration].Item, "MinimumStatusDuration");
+		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MinimumStatusDuration].Key, "MinimumStatusDuration");
+
+		   if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemAccessibility == 1)
+		   {
+			   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MinimumStatusDuration].ReadOnly, "0"/*"FALSE"*/);
+		   }
+		   else
+		   {
+			   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MinimumStatusDuration].ReadOnly, "1"/*"TRUE"*/);
+		   }
+
+		   strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MinimumStatusDuration].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[17].ItemData );
+		   isKnowKey = TRUE;
+	    }
+
+	    if(isEmpty || strcmp(keyReq, "NumberOfConnectors") == 0 )
+	    {
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_NumberOfConnectors].Item, "NumberOfConnectors");
+	         strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_NumberOfConnectors].Key, "NumberOfConnectors");
+
+	         if(ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemAccessibility == 1)
+	         {
+	        	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_NumberOfConnectors].ReadOnly, "0"/*"FALSE"*/);
+	         }
+	         else
+	         {
+	        	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_NumberOfConnectors].ReadOnly, "1"/*"TRUE"*/);
+	         }
+
+	         strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_NumberOfConnectors].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemData );
+	         isKnowKey = TRUE;
+	    }
+
+	    if(isEmpty || strcmp(keyReq, "ResetRetries") == 0 )
+	    {
+	    	strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ResetRetries].Item, "ResetRetries");
+	        strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ResetRetries].Key, "ResetRetries");
+
+	        if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemAccessibility == 1)
+	        {
+	        	strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ResetRetries].ReadOnly, "0"/*"FALSE"*/);
+	        }
+	        else
+	        {
+	        	strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ResetRetries].ReadOnly, "1"/*"TRUE"*/);
+	        }
+
+	        strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ResetRetries].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemData );
+	        isKnowKey = TRUE;
+	    }
+
+	    if(isEmpty || strcmp(keyReq, "ConnectorPhaseRotation") == 0 )
+	    {
+	    	strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ConnectorPhaseRotation].Item, "ConnectorPhaseRotation");
+	        strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorPhaseRotation].Key, "ConnectorPhaseRotation");
+
+	        if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemAccessibility == 1)
+	        {
+	        	strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorPhaseRotation].ReadOnly, "0"/*"FALSE"*/);
+	        }
+	        else
+	        {
+	        	strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorPhaseRotation].ReadOnly, "1"/*"TRUE"*/);
+	        }
+
+	        strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorPhaseRotation].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData );
+	        isKnowKey = TRUE;
+
+	    }
+
+	    if(isEmpty ||  strcmp(keyReq, "ConnectorPhaseRotationMaxLength") == 0 )
+	    {
+	    	strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ConnectorPhaseRotationMaxLength].Item, "ConnectorPhaseRotationMaxLength");
+	    	strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorPhaseRotationMaxLength].Key, "ConnectorPhaseRotationMaxLength");
+
+	    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemAccessibility == 1)
+	    	{
+	    		strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorPhaseRotationMaxLength].ReadOnly, "0"/*"FALSE"*/);
+	    	}
+	    	else
+	    	{
+	    		strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorPhaseRotationMaxLength].ReadOnly, "1"/*"TRUE"*/);
+	    	}
+
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorPhaseRotationMaxLength].Value,(const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemData );
+	    	 isKnowKey = TRUE;
+	    }
+
+	    if(isEmpty ||  strcmp(keyReq, "StopTransactionOnEVSideDisconnect") == 0 )
+	    {
+	    	strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_StopTransactionOnEVSideDisconnect].Item, "StopTransactionOnEVSideDisconnect");
+	    	strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTransactionOnEVSideDisconnect].Key, "StopTransactionOnEVSideDisconnect");
+
+	    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemAccessibility == 1)
+	    	{
+	    		strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTransactionOnEVSideDisconnect].ReadOnly, "0"/*"FALSE"*/);
+	    	}
+	    	else
+	    	{
+	    		strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTransactionOnEVSideDisconnect].ReadOnly, "1"/*"TRUE"*/);
+	    	}
+
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTransactionOnEVSideDisconnect].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemData );
+	    	 isKnowKey = TRUE;
+	    }
+
+	    if(isEmpty || strcmp(keyReq, "StopTransactionOnInvalidId") == 0 )
+	    {
+	    	  strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_StopTransactionOnInvalidId].Item, "StopTransactionOnInvalidId");
+	    	  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTransactionOnInvalidId].Key, "StopTransactionOnInvalidId");
+
+	    	  if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemAccessibility == 1)
+	    	  {
+	    		  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTransactionOnInvalidId].ReadOnly, "0"/*"FALSE"*/);
+	    	  }
+	    	  else
+	    	  {
+	    		  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTransactionOnInvalidId].ReadOnly, "1"/*"TRUE"*/);
+	    	  }
+
+	    	  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTransactionOnInvalidId].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemData );
+	    	  isKnowKey = TRUE;
+	    }
+
+	    if(isEmpty ||  strcmp(keyReq, "StopTxnAlignedData") == 0 )
+	    {
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_StopTxnAlignedData].Item, "StopTxnAlignedData");
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnAlignedData].Key, "StopTxnAlignedData");
+
+	    	 if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemAccessibility  == 1)
+	    	 {
+	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnAlignedData].ReadOnly, "0"/*"FALSE"*/);
+	    	 }
+	    	 else
+	    	 {
+	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnAlignedData].ReadOnly, "1"/*"TRUE"*/);
+	    	 }
+
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnAlignedData].Value,(const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemData );
+	    	 isKnowKey = TRUE;
+	     }
+
+	     if(isEmpty ||  strcmp(keyReq, "StopTxnAlignedDataMaxLength") == 0 )
+	     {
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_StopTxnAlignedDataMaxLength].Item, "StopTxnAlignedDataMaxLength");
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnAlignedDataMaxLength].Key, "StopTxnAlignedDataMaxLength");
+
+	    	 if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemAccessibility == 1)
+	    	 {
+	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnAlignedDataMaxLength].ReadOnly, "0"/*"FALSE"*/);
+	    	 }
+	    	 else
+	    	 {
+	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnAlignedDataMaxLength].ReadOnly, "1"/*"TRUE"*/);
+	    	 }
+
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnAlignedDataMaxLength].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemData );
+	    	 isKnowKey = TRUE;
+	     }
+
+	     if(isEmpty ||  strcmp(keyReq, "StopTxnSampledData") == 0 )
+	     {
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_StopTxnSampledData].Item, "StopTxnSampledData");
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnSampledData].Key, "StopTxnSampledData");
+
+	    	 if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemAccessibility == 1)
+	    	 {
+	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnSampledData].ReadOnly, "0"/*"FALSE"*/);
+	    	 }
+	    	 else
+	    	 {
+	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnSampledData].ReadOnly, "1"/*"TRUE"*/);
+	    	 }
+
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnSampledData].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemData );
+	    	 isKnowKey = TRUE;
+	     }
+
+	     if(isEmpty ||  strcmp(keyReq, "StopTxnSampledDataMaxLength") == 0 )
+	     {
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_StopTxnSampledDataMaxLength].Item, "StopTxnSampledDataMaxLength");
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnSampledDataMaxLength].Key, "StopTxnSampledDataMaxLength");
+
+	    	 if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemAccessibility == 1)
+	    	 {
+	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnSampledDataMaxLength].ReadOnly, "0"/*"FALSE"*/);
+	    	 }
+	    	 else
+	    	 {
+	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnSampledDataMaxLength].ReadOnly, "1"/*"TRUE"*/);
+	    	 }
+
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnSampledDataMaxLength].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData );
+	    	 isKnowKey = TRUE;
+	     }
+
+	     if(isEmpty ||  strcmp(keyReq, "SupportedFeatureProfiles") == 0 )
+	     {
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_SupportedFeatureProfiles].Item, "SupportedFeatureProfiles");
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SupportedFeatureProfiles].Key, "SupportedFeatureProfiles");
+
+	    	 if(ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemAccessibility == 1)
+	    	 {
+	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SupportedFeatureProfiles].ReadOnly, "0"/*"FALSE"*/);
+	    	 }
+	    	 else
+	    	 {
+	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SupportedFeatureProfiles].ReadOnly, "1"/*"TRUE"*/);
+	    	 }
+
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SupportedFeatureProfiles].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemData );
+	    	 isKnowKey = TRUE;
+	     }
+
+	     if(isEmpty ||  strcmp(keyReq, "SupportedFeatureProfilesMaxLength") == 0 )
+	     {
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_SupportedFeatureProfilesMaxLength].Item, "SupportedFeatureProfilesMaxLength");
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SupportedFeatureProfilesMaxLength].Key, "SupportedFeatureProfilesMaxLength");
+
+	    	 if(ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemAccessibility == 1)
+	    	 {
+	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SupportedFeatureProfilesMaxLength].ReadOnly, "0"/*"FALSE"*/);
+	    	 }
+	    	 else
+	    	 {
+	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SupportedFeatureProfilesMaxLength].ReadOnly, "1"/*"TRUE"*/);
+	    	 }
+
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SupportedFeatureProfilesMaxLength].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemData );
+	    	 isKnowKey = TRUE;
+	     }
+
+	     if(isEmpty ||  strcmp(keyReq, "TransactionMessageAttempts") == 0 )
+	     {
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_TransactionMessageAttempts].Item, "TransactionMessageAttempts");
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_TransactionMessageAttempts].Key, "TransactionMessageAttempts");
+
+	    	 if(ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemAccessibility == 1)
+	    	 {
+	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_TransactionMessageAttempts].ReadOnly, "0"/*"FALSE"*/);
+	    	 }
+	    	 else
+	    	 {
+	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_TransactionMessageAttempts].ReadOnly, "1"/*"TRUE"*/);
+	    	 }
+
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_TransactionMessageAttempts].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemData );
+	    	 isKnowKey = TRUE;
+	     }
+
+	     if(isEmpty ||  strcmp(keyReq, "TransactionMessageRetryInterval") == 0 )
+	     {
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_TransactionMessageRetryInterval].Item, "TransactionMessageRetryInterval");
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_TransactionMessageRetryInterval].Key, "TransactionMessageRetryInterval");
+
+	    	 if(ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemAccessibility == 1)
+	    	 {
+	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_TransactionMessageRetryInterval].ReadOnly, "0"/*"FALSE"*/);
+	    	 }
+	    	 else
+	    	 {
+	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_TransactionMessageRetryInterval].ReadOnly, "1"/*"TRUE"*/);
+	    	 }
+
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_TransactionMessageRetryInterval].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemData );
+	    	 isKnowKey = TRUE;
+	     }
+
+	      if(isEmpty ||  strcmp(keyReq, "UnlockConnectorOnEVSideDisconnect") == 0 )
+	      {
+	    	  strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_UnlockConnectorOnEVSideDisconnect].Item, "UnlockConnectorOnEVSideDisconnect");
+	    	  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_UnlockConnectorOnEVSideDisconnect].Key, "UnlockConnectorOnEVSideDisconnect");
+
+	    	  if(ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemAccessibility == 1)
+	    	  {
+	    		  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_UnlockConnectorOnEVSideDisconnect].ReadOnly, "0"/*"FALSE"*/);
+	    	  }
+	    	  else
+	    	  {
+	    		  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_UnlockConnectorOnEVSideDisconnect].ReadOnly, "1"/*"TRUE"*/);
+	    	  }
+
+	    	  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_UnlockConnectorOnEVSideDisconnect].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemData );
+	    	  isKnowKey = TRUE;
+
+	      }
+
+	      if(isEmpty ||  strcmp(keyReq, "WebSocketPingInterval") == 0 )
+	      {
+	    	  strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_WebSocketPingInterval].Item, "WebSocketPingInterval");
+	    	  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_WebSocketPingInterval].Key, "WebSocketPingInterval");
+
+	    	  if(ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemAccessibility == 1)
+	    	  {
+	    		  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_WebSocketPingInterval].ReadOnly, "0"/*"FALSE"*/);
+	    	  }
+	    	  else
+	    	  {
+	    		  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_WebSocketPingInterval].ReadOnly, "1"/*"TRUE"*/);
+	    	  }
+
+	    	  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_WebSocketPingInterval].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemData );
+	    	  isKnowKey = TRUE;
+
+	      }
+
+#if 1
+	      //For OCTT Test Case
+	      if(isEmpty ||  strcmp(keyReq, "LocalAuthorizationListEnabled") == 0 )
+	      {
+	     	    	  strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_LocalAuthListEnabled].Item, "LocalAuthorizationListEnabled");
+	     	    	  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthListEnabled].Key, "LocalAuthorizationListEnabled");
+
+	     	    	  if(ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemAccessibility == 1)
+	     	    	  {
+	     	    		  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthListEnabled].ReadOnly, "0"/*"FALSE"*/);
+	     	    	  }
+	     	    	  else
+	     	    	  {
+	     	    		  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthListEnabled].ReadOnly, "1"/*"TRUE"*/);
+	     	    	  }
+
+	     	    	  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthListEnabled].Value, (const char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData );
+	     	    	  isKnowKey = TRUE;
+	      }
+#endif
+
+#if 0 // remove temporally
+	      if(isEmpty ||  strcmp(keyReq, "LocalAuthListEnabled") == 0 )
+	      {
+	    	  strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_LocalAuthListEnabled].Item, "LocalAuthListEnabled");
+	    	  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthListEnabled].Key, "LocalAuthListEnabled");
+
+	    	  if(ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemAccessibility == 1)
+	    	  {
+	    		  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthListEnabled].ReadOnly, "0"/*"FALSE"*/);
+	    	  }
+	    	  else
+	    	  {
+	    		  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthListEnabled].ReadOnly, "1"/*"TRUE"*/);
+	    	  }
+
+	    	  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthListEnabled].Value, (const char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData );
+	    	  isKnowKey = TRUE;
+	      }
+#endif
+
+	      if(isEmpty ||  strcmp(keyReq, "LocalAuthListMaxLength") == 0 )
+	      {
+	    	  strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_LocalAuthListMaxLength].Item, "LocalAuthListMaxLength");
+	    	  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthListMaxLength].Key, "LocalAuthListMaxLength");
+
+	    	  if(ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemAccessibility == 1)
+	    	  {
+	    		  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthListMaxLength].ReadOnly, "0"/*"FALSE"*/);
+	    	  }
+	    	  else
+	    	  {
+	    		  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthListMaxLength].ReadOnly, "1"/*"TRUE"*/);
+	    	  }
+
+	    	  strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthListMaxLength].Value, (const char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemData );
+	    	  isKnowKey = TRUE;
+	      }
+
+	      if(isEmpty ||  strcmp(keyReq, "SendLocalListMaxLength") == 0 )
+	      {
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_SendLocalListMaxLength].Item, "SendLocalListMaxLength");
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SendLocalListMaxLength].Key, "SendLocalListMaxLength");
+
+	    	 if(ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemAccessibility == 1)
+	    	 {
+	    	  	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SendLocalListMaxLength].ReadOnly, "0"/*"FALSE"*/);
+	    	 }
+	    	 else
+	    	 {
+	    	  	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SendLocalListMaxLength].ReadOnly, "1"/*"TRUE"*/);
+	    	 }
+
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SendLocalListMaxLength].Value, (const char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemData );
+	    	 isKnowKey = TRUE;
+	      }
+
+	      if(isEmpty ||  strcmp(keyReq, "ReserveConnectorZeroSupported") == 0 )
+	      {
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ReserveConnectorZeroSupported].Item, "ReserveConnectorZeroSupported");
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ReserveConnectorZeroSupported].Key, "ReserveConnectorZeroSupported");
+
+	    	 if(ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemAccessibility == 1)
+	    	 {
+	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ReserveConnectorZeroSupported].ReadOnly, "0"/*"FALSE"*/);
+	    	 }
+	    	 else
+	    	 {
+	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ReserveConnectorZeroSupported].ReadOnly, "1"/*"TRUE"*/);
+	    	 }
+
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ReserveConnectorZeroSupported].Value,(const char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemData);
+	    	 isKnowKey = TRUE;
+	      }
+
+	      if(isEmpty ||  strcmp(keyReq, "ChargeProfileMaxStackLevel") == 0 )
+	      {
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ChargeProfileMaxStackLevel].Item, "ChargeProfileMaxStackLevel");
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargeProfileMaxStackLevel].Key, "ChargeProfileMaxStackLevel");
+
+	    	 if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemAccessibility == 1)
+	    	 {
+	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargeProfileMaxStackLevel].ReadOnly, "0"/*"FALSE"*/);
+	    	 }
+	    	 else
+	    	 {
+	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargeProfileMaxStackLevel].ReadOnly, "1"/*"TRUE"*/);
+	    	 }
+
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargeProfileMaxStackLevel].Value, (const char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemData);
+	    	 isKnowKey = TRUE;
+	      }
+
+	      if(isEmpty ||  strcmp(keyReq, "ChargingScheduleAllowedChargingRateUnit") == 0 )
+	      {
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ChargingScheduleAllowedChargingRateUnit].Item, "ChargingScheduleAllowedChargingRateUnit");
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargingScheduleAllowedChargingRateUnit].Key, "ChargingScheduleAllowedChargingRateUnit");
+
+	    	 if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemAccessibility == 1)
+	    	 {
+	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargingScheduleAllowedChargingRateUnit].ReadOnly, "0"/*"FALSE"*/);
+	    	 }
+	    	 else
+	    	 {
+	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargingScheduleAllowedChargingRateUnit].ReadOnly, "1"/*"TRUE"*/);
+	    	 }
+
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargingScheduleAllowedChargingRateUnit].Value, (const char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemData);
+	    	 isKnowKey = TRUE;
+	      }
+
+	      if(isEmpty ||  strcmp(keyReq, "ChargingScheduleMaxPeriods") == 0 )
+	      {
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ChargingScheduleMaxPeriods].Item, "ChargingScheduleMaxPeriods");
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargingScheduleMaxPeriods].Key, "ChargingScheduleMaxPeriods");
+
+	    	 if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemAccessibility == 1)
+	    	 {
+	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargingScheduleMaxPeriods].ReadOnly, "0"/*"FALSE"*/);
+	    	 }
+	    	 else
+	    	 {
+	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargingScheduleMaxPeriods].ReadOnly, "1"/*"TRUE"*/);
+	    	 }
+
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargingScheduleMaxPeriods].Value, (const char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemData);
+	    	 isKnowKey = TRUE;
+	      }
+
+	      if(isEmpty ||  strcmp(keyReq, "ConnectorSwitch3to1PhaseSupported") == 0 )
+	      {
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ConnectorSwitch3to1PhaseSupported].Item, "ConnectorSwitch3to1PhaseSupported");
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorSwitch3to1PhaseSupported].Key, "ConnectorSwitch3to1PhaseSupported");
+
+	    	 if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemAccessibility == 1)
+	    	 {
+	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorSwitch3to1PhaseSupported].ReadOnly, "0"/*"FALSE"*/);
+	    	 }
+	    	 else
+	    	 {
+	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorSwitch3to1PhaseSupported].ReadOnly, "1"/*"TRUE"*/);
+	    	 }
+
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorSwitch3to1PhaseSupported].Value, (const char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemData);
+	    	 isKnowKey = TRUE;
+	      }
+
+	      if(isEmpty ||  strcmp(keyReq, "MaxChargingProfilesInstalled") == 0 )
+	      {
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_MaxChargingProfilesInstalled].Item, "MaxChargingProfilesInstalled");
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MaxChargingProfilesInstalled].Key, "MaxChargingProfilesInstalled");
+
+	    	 if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemAccessibility == 1)
+	    	 {
+	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MaxChargingProfilesInstalled].ReadOnly, "0"/*"FLASE"*/);
+	    	 }
+	    	 else
+	    	 {
+	    		 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MaxChargingProfilesInstalled].ReadOnly, "1"/*"TRUE"*/);
+	    	 }
+
+	    	 strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MaxChargingProfilesInstalled].Value, (const char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemData);
+	    	 isKnowKey = TRUE;
+	      }
+
+	     //=========================================================
+
+	      if(!isEmpty && !isKnowKey)
+	      {
+	    	 DEBUG_INFO("unKnowIndex =%d\n", UnknownKeynum);
+	    	 strcpy(unknownkey[UnknownKeynum], keyReq);
+			 UnknownKeynum = UnknownKeynum + 1;
+	      }
+
+
+}
+
+void processUnkownKey(void)
+{
+
+	DEBUG_INFO("processUnkownKey\n");
+	memset(ShmOCPP16Data->GetConfiguration.ResponseUnknownKey, 0 , sizeof(struct StructConfigurationKeyItems)* 10);
+
+	for(int index=0; index < UnknownKeynum; index++)
+	{
+		if(ShmOCPP16Data->GetConfiguration.ResponseUnknownKey[index].Item[0] == 0)
+		{
+			strcpy((char *)(ShmOCPP16Data->GetConfiguration.ResponseUnknownKey[index].Item), unknownkey[index]);
+		}
+	}
+
+}
+
+ int  setKeyValue(char *key, char *value)
+{
+	int isSuccess = NotSupported;
+	int check_ascii=0;
+
+#ifdef Debug
+	DEBUG_INFO(" setKeyValue key-value=%s  %s\n",key,value);
+#endif
+
+    if(strcmp(key, "AllowOfflineTxForUnknownId") == 0)
+    {
+        //Charger.AllowOfflineTxForUnknownId = (value.toLowerCase().equals("true")?true:false);
+    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemAccessibility == 1)
+    	{
+    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemData, "%s", (strcmp(value, "true")==0) ?"TRUE":"FALSE" );
+    		isSuccess = ConfigurationStatus_Accepted;
+    	}
+    	else
+    	{
+    		isSuccess = ConfigurationStatus_Rejected;
+    	}
+     }
+
+    if(strcmp(key, "AuthorizationCacheEnabled") == 0)
+    {
+        //Charger.AuthorizationCacheEnabled = (value.toLowerCase().equals("true")?true:false);
+    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemAccessibility == 1)
+    	{
+    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemData, "%s", value/*(strcmp(value, "true")==0) ?TRUE:FALSE*/ );
+    		isSuccess = ConfigurationStatus_Accepted;
+
+    		//updateSetting("AuthorizationCacheEnabled", (Charger.AuthorizationCacheEnabled?"1":"0"));
+    		updateSetting("AuthorizationCacheEnabled",(char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[1].ItemData);
+    	}
+    	else
+    	{
+    		isSuccess = ConfigurationStatus_Rejected;
+    	}
+
+    }
+
+    if(strcmp(key, "AuthorizeRemoteTxRequests") == 0)
+    {
+    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemAccessibility == 1)
+    	{
+    		//Charger.AuthorizeRemoteTxRequests = (value.toLowerCase().equals("true")?true:false);
+    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemData, "%s", (strcmp(value, "true")==0) ?"TRUE":"FALSE" );
+    		isSuccess = ConfigurationStatus_Accepted;
+    	}
+    	else
+    	{
+    	    isSuccess = ConfigurationStatus_Rejected;
+    	}
+
+    }
+
+    if(strcmp(key, "BlinkRepeat") == 0)
+    {
+    		//Charger.BlinkRepeat = Integer.parseInt(value);
+    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemAccessibility == 1)
+    	{
+    		check_ascii = value[0];
+    		if( (check_ascii < 48) || (check_ascii > 57) )
+    		{
+    			isSuccess = ConfigurationStatus_Rejected;
+    		}
+    		else
+    		{
+    			sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemData, "%d", atoi(value) );
+    			isSuccess = ConfigurationStatus_Accepted;
+    		}
+    	}
+    	else
+    	{
+    	    isSuccess = ConfigurationStatus_Rejected;
+    	}
+    }
+
+    if(strcmp(key, "ClockAlignedDataInterval") == 0)
+    {
+    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemAccessibility == 1)
+    	{
+    		check_ascii = value[0];
+    		if( (check_ascii < 48) || (check_ascii > 57) )
+    		{
+    		   isSuccess = ConfigurationStatus_Rejected;
+    		}
+    		else
+    		{
+    			//Charger.ClockAlignedDataInterval = Integer.parseInt(value)*1000;
+    			sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemData, "%d", atoi(value)*1000 );
+    			isSuccess = ConfigurationStatus_Accepted;
+    		}
+    	}
+    	else
+    	{
+    	    isSuccess = ConfigurationStatus_Rejected;
+    	}
+
+    }
+
+    if(strcmp(key, "ConnectionTimeOut") == 0 )
+    {
+    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemAccessibility == 1)
+    	{
+    		check_ascii = value[0];
+    		if( (check_ascii < 48) || (check_ascii > 57) )
+    		{
+    			isSuccess = ConfigurationStatus_Rejected;
+    		}
+    		else
+    		{
+    			//Charger.ConnectionTimeOut = Integer.parseInt(value)*1000;
+    			sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemData, "%d", atoi(value)*1000 );
+    			isSuccess = ConfigurationStatus_Accepted;
+    		}
+    	}
+    	else
+        {
+        	isSuccess = ConfigurationStatus_Rejected;
+        }
+
+    }
+
+    if(strcmp(key, "HeartbeatInterval") == 0)
+    {
+    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemAccessibility == 1)
+    	{
+    		check_ascii = value[0];
+    		if( (check_ascii < 48) || (check_ascii > 57) )
+    	    {
+    	    	isSuccess = ConfigurationStatus_Rejected;
+    	    }
+    		else
+    		{
+    			//Charger.HeartbeatInterval = Integer.parseInt(value)*1000;
+    			sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemData, "%d", atoi(value)/*atoi(value)*1000*/ );
+    			HeartBeatWaitTime = atoi(value);
+    			isSuccess = ConfigurationStatus_Accepted;
+    		}
+
+    	}
+    	else
+    	{
+    	    isSuccess = ConfigurationStatus_Rejected;
+    	}
+
+    }
+
+    if(strcmp(key, "LightIntensity") == 0)
+    {
+    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemAccessibility == 1)
+    	{
+    		check_ascii = value[0];
+    		if( (check_ascii < 48) || (check_ascii > 57) )
+    		{
+    			isSuccess = ConfigurationStatus_Rejected;
+    		}
+    		else
+    		{
+    			sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemData, "%d", atoi(value) );
+    		    isSuccess = ConfigurationStatus_Accepted;
+    		}
+    	}
+    	else
+    	{
+    		isSuccess = ConfigurationStatus_Rejected;
+    	}
+    }
+
+    if(strcmp(key, "LocalAuthorizeOffline") == 0)
+    {
+    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemAccessibility == 1)
+    	{
+    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData, "%s", (strcmp(value, "true")==0) ?"TRUE":"FALSE" );
+    		isSuccess = ConfigurationStatus_Accepted;
+    		updateSetting("LocalAuthorizeOffline", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData);
+    	}
+    	else
+    	{
+    	    isSuccess = ConfigurationStatus_Rejected;
+    	}
+
+    }
+
+    if(strcmp(key, "LocalPreAuthorize") == 0)
+    {
+    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemAccessibility == 1)
+    	{
+    	    sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemData, "%s", (strcmp(value, "true")==0) ?"TRUE":"FALSE" );
+    		isSuccess = ConfigurationStatus_Accepted;
+    	}
+    	else
+        {
+        	isSuccess = ConfigurationStatus_Rejected;
+        }
+
+    }
+
+    if(strcmp(key, "MaxEnergyOnInvalidId") == 0)
+    {
+    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemAccessibility == 1)
+    	{
+    		check_ascii = value[0];
+    		if( (check_ascii < 48) || (check_ascii > 57) )
+    		{
+    			isSuccess = ConfigurationStatus_Rejected;
+    		}
+    		else
+    		{
+    			 sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemData, "%d", atoi(value) );
+    			 isSuccess = ConfigurationStatus_Accepted;
+    		}
+    	}
+    	else
+    	{
+    	    isSuccess = ConfigurationStatus_Rejected;
+    	}
+
+    }
+
+    if(strcmp(key, "MeterValuesAlignedData") == 0)
+    {
+    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemAccessibility == 1)
+    	{
+    	 	//int valueLength = strlen(value);
+    		for(int i = 0; value[i]; i++){
+    		    value[i] = tolower(value[i]);
+    		}
+    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemData, "%s", value );
+    		isSuccess = ConfigurationStatus_Accepted;
+    	}
+    	else
+    	{
+    	   isSuccess = ConfigurationStatus_Rejected;
+    	}
+
+    }
+
+    if(strcmp(key, "MeterValuesSampledData") == 0 )
+    {
+    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemAccessibility == 1)
+    	{
+     		//int valueLength = strlen(value);
+    		for(int i = 0; value[i]; i++){
+    		    	value[i] = tolower(value[i]);
+    		}
+    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemData, "%s", value );
+    		isSuccess = ConfigurationStatus_Accepted;
+    	}
+    	else
+    	{
+    	    isSuccess = ConfigurationStatus_Rejected;
+    	}
+
+    }
+
+    if(strcmp(key, "MeterValueSampleInterval") == 0)
+    {
+    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemAccessibility == 1)
+    	{
+    		check_ascii = value[0];
+    		if( (check_ascii < 48) || (check_ascii > 57) )
+    		{
+    			isSuccess = ConfigurationStatus_Rejected;
+    		}
+    		else
+    		{
+    			//Charger.MeterValueSampleInterval = Integer.parseInt(value)*1000;
+    			sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemData, "%d", atoi(value));
+    			isSuccess = ConfigurationStatus_Accepted;
+    		}
+
+#ifdef Debug
+		DEBUG_INFO(" MeterValueSampleInterval is ConfigurationStatus_Accepted \n");
+#endif
+    	}
+    	else
+    	{
+    	    isSuccess = ConfigurationStatus_Rejected;
+#ifdef Debug
+		DEBUG_INFO(" MeterValueSampleInterval is ConfigurationStatus_Rejected \n");
+#endif
+    	}
+
+    }
+
+    if(strcmp(key, "MinimumStatusDuration") == 0)
+    {
+    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemAccessibility == 1)
+    	{
+    		check_ascii = value[0];
+    		if( (check_ascii < 48) || (check_ascii > 57) )
+    		{
+    		   isSuccess = ConfigurationStatus_Rejected;
+    		}
+    		else
+    		{
+    			//Charger.MinimumStatusDuration = Integer.parseInt(value);
+    			 sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemData, "%d", atoi(value) );
+    			 isSuccess = ConfigurationStatus_Accepted;
+    		}
+    	}
+    	else
+        {
+        	isSuccess = ConfigurationStatus_Rejected;
+        }
+
+    }
+
+    if(strcmp(key, "ResetRetries") == 0)
+    {
+    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemAccessibility == 1)
+    	{
+    		check_ascii = value[0];
+    		if( (check_ascii < 48) || (check_ascii > 57) )
+    		{
+    			isSuccess = ConfigurationStatus_Rejected;
+    		}
+    		else
+    		{
+    			//Charger.ResetRetries = Integer.parseInt(value);
+    			sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemData, "%d", atoi(value) );
+    			isSuccess = ConfigurationStatus_Accepted;
+    		}
+    	}
+    	else
+    	{
+    	    isSuccess = ConfigurationStatus_Rejected;
+    	}
+
+   }
+
+   if(strcmp(key, "ConnectorPhaseRotation") == 0)
+   {
+	   if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemAccessibility == 1)
+	   {
+		   //Charger.ConnectorPhaseRotation = value.toLowerCase();
+		   //int valueLength = strlen(value);
+		   for(int i = 0; value[i]; i++){
+		       value[i] = tolower(value[i]);
+		   }
+		   sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", value );
+		   isSuccess = ConfigurationStatus_Accepted;
+	   }
+	   else
+	   {
+	       isSuccess = ConfigurationStatus_Rejected;
+	   }
+
+   }
+
+   if(strcmp(key, "StopTransactionOnEVSideDisconnect") == 0)
+   {
+	   if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemAccessibility == 1)
+	   {
+		   //Charger.StopTransactionOnEVSideDisconnect = (value.toLowerCase().equals("true")?true:false);
+		   sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemData, "%s", (strcmp(value, "true")==0) ?"TRUE":"FALSE" );
+		   isSuccess = ConfigurationStatus_Accepted;
+	   }
+	   else
+	   {
+	       isSuccess = ConfigurationStatus_Rejected;
+	   }
+
+   }
+
+    if(strcmp(key, "StopTransactionOnInvalidId") == 0)
+    {
+    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemAccessibility == 1)
+    	{
+    		//Charger.StopTransactionOnInvalidId = (value.toLowerCase().equals("true")?true:false);
+    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemData, "%s", (strcmp(value, "true")==0) ?"TRUE":"FALSE" );
+    		isSuccess = ConfigurationStatus_Accepted;
+    	}
+        else
+        {
+    		isSuccess = ConfigurationStatus_Rejected;
+        }
+    }
+
+    if(strcmp(key, "StopTxnAlignedData") == 0)
+    {
+    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemAccessibility == 1)
+    	{
+
+    		//Charger.StopTxnAlignedData = value.toLowerCase();
+    		//int valueLength = strlen(value);
+    	    for(int i = 0; value[i]; i++){
+    	    	value[i] = tolower(value[i]);
+    	    }
+    	    sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemData, "%s", value );
+    		isSuccess = ConfigurationStatus_Accepted;
+    	}
+    	else
+    	{
+    	    isSuccess = ConfigurationStatus_Rejected;
+    	}
+    }
+
+    if(strcmp(key, "StopTxnSampledData") == 0)
+    {
+    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemAccessibility == 1)
+    	{
+    		//Charger.StopTxnSampledData = value.toLowerCase();
+    		//int valueLength = strlen(value);
+    		for(int i = 0; value[i]; i++){
+    		    value[i] = tolower(value[i]);
+    		}
+    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemData, "%s", value );
+    		isSuccess = ConfigurationStatus_Accepted;
+    	}
+    	else
+    	{
+    	    isSuccess = ConfigurationStatus_Rejected;
+    	}
+
+    }
+
+    if(strcmp(key, "TransactionMessageAttempts") == 0)
+    {
+    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemAccessibility == 1)
+    	{
+    		check_ascii = value[0];
+    		if( (check_ascii < 48) || (check_ascii > 57) )
+    		{
+    		   isSuccess = ConfigurationStatus_Rejected;
+    		}
+    		else
+    		{
+    			//Charger.TransactionMessageAttempts = Integer.parseInt(value);
+    			sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemData, "%d", atoi(value) );
+    			isSuccess = ConfigurationStatus_Accepted;
+    		}
+    	}
+    	else
+    	{
+    	    isSuccess = ConfigurationStatus_Rejected;
+    	}
+    }
+
+    if(strcmp(key, "TransactionMessageRetryInterval") == 0)
+    {
+    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemAccessibility == 1)
+    	{
+    		check_ascii = value[0];
+    		if( (check_ascii < 48) || (check_ascii > 57) )
+    		{
+    		    isSuccess = ConfigurationStatus_Rejected;
+    		}
+    		else
+    		{
+    			//Charger.TransactionMessageRetryInterval = Integer.parseInt(value)*1000;
+    			sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemData, "%d", atoi(value) );
+    			isSuccess = ConfigurationStatus_Accepted;
+    		}
+    	}
+    	else
+    	{
+    	    isSuccess = ConfigurationStatus_Rejected;
+    	}
+
+    }
+
+    if(strcmp(key, "UnlockConnectorOnEVSideDisconnect") == 0)
+    {
+    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemAccessibility == 1)
+    	{
+    		//Charger.UnlockConnectorOnEVSideDisconnect = (value.toLowerCase().equals("true")?true:false);
+    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemData, "%s", (strcmp(value, "true")==0) ?"TRUE":"FALSE" );
+    		isSuccess = ConfigurationStatus_Accepted;
+    	}
+    	else
+        {
+        	isSuccess = ConfigurationStatus_Rejected;
+        }
+
+    }
+
+    if(strcmp(key, "WebSocketPingInterval") == 0)
+    {
+    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemAccessibility == 1)
+    	{
+    		check_ascii = value[0];
+    		if( (check_ascii < 48) || (check_ascii > 57) )
+    		{
+    			isSuccess = ConfigurationStatus_Rejected;
+    		}
+    		else
+    		{
+
+        		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemData, "%d", atoi(value) );
+        		isSuccess = ConfigurationStatus_Accepted;
+    		}
+    	}
+    	else
+    	{
+    	    isSuccess = ConfigurationStatus_Rejected;
+    	}
+    }
+
+#if 1
+    //For OCPP Test Case
+    if(strcmp(key, "LocalAuthorizationListEnabled") == 0)
+    {
+        if(ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemAccessibility == 1)
+        {
+            sprintf((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "%s", (strcmp(value, "true")==0) ?"TRUE":"FALSE" );
+        	isSuccess = ConfigurationStatus_Accepted;
+        	//updateSetting("LocalAuthorizationListEnabled", (char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData);
+        }
+        else
+        {
+            isSuccess = ConfigurationStatus_Rejected;
+        }
+
+    }
+#endif
+
+#if 0 // rmove temporally
+    if(strcmp(key, "LocalAuthListEnabled") == 0)
+    {
+    	if(ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemAccessibility == 1)
+    	{
+        	sprintf((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "%s", (strcmp(value, "true")==0) ?"TRUE":"FALSE" );
+    		isSuccess = ConfigurationStatus_Accepted;
+    		updateSetting("LocalAuthListEnabled", (char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData);
+    	}
+    	else
+        {
+        	isSuccess = ConfigurationStatus_Rejected;
+        }
+
+    }
+#endif
+
+    return isSuccess;
+}
+
+int updateSetting(char *key, char *value)
+{
+	mtrace();
+    int isSuccess = FALSE;
+    char string[1000]={0}, buffer[1000]={0};
+    char strtemp[50]={0};
+    char sstr[50]={ 0 };//sstr[200]={ 0 };
+    int pos, c = 0;
+    char *loc;
+    int pos1=0;
+
+	FILE *f = fopen("/var/www/settings1", "r");
+	if(f == NULL)
+	{
+#ifdef Debug
+	DEBUG_ERROR("/var/www/settings1 does not exist!\n");
+#endif
+		return isSuccess;
+	}
+
+	fseek(f, 0, SEEK_END);
+	long fsize = ftell(f);
+	fseek(f, 0, SEEK_SET);  /* same as rewind(f); */
+
+
+	fread(string, 1, fsize, f);
+	fclose(f);
+	string[fsize] = 0;
+	loc = strstr(string, key/*"LocalAuthListEnabled"*/);
+
+	if(loc != NULL)
+	{
+		DEBUG_INFO("key exist!\n");
+		pos = loc - string-1;
+		f = fopen("/var/www/settings1", "w");
+
+		strncpy(buffer, string, pos);
+		fprintf(f, "%s", buffer);
+
+		memset(sstr ,0, sizeof(sstr) );
+		c = 0;
+		while (loc[3+strlen(key/*"LocalAuthListEnabled"*/)+c] != '\"')
+		{
+			sstr[c] = loc[3+strlen(key/*"LocalAuthListEnabled"*/)+c];
+			//printf("i=%d sstr=%c\n",c, sstr[c]);
+			c++;
+		}
+		sstr[c] = '\0';
+
+		pos1 =  fsize -pos -(3+strlen(key/*"LocalAuthListEnabled"*/)+c)-1;
+
+		sprintf(strtemp,"\"%s\":\"%s\"",key,value);
+
+		fprintf(f, "%s", strtemp /*"\"LocalAuthListEnabled\":\"fault\""*/);
+
+		memset(buffer ,0, sizeof(buffer) );
+
+		strncpy(buffer, loc+(3+strlen(key/*"LocalAuthListEnabled"*/)+c)+1, pos1);
+		//printf("buffer=%s",buffer);
+
+		fprintf(f, "%s", buffer);
+
+		fclose(f);
+
+	}
+	else
+	{
+		printf("key not exist!\n");
+		f = fopen("/var/www/settings1", "w+");
+		fputs(string, f);
+		fseek(f, -1, SEEK_CUR);
+		//fprintf(f, "%s", ",\"LocalAuthListEnabled\":\"true\"}");
+		sprintf(strtemp,",\"%s\":\"%s\"}",key,value);
+		fputs(strtemp/*",\"LocalAuthListEnabled\":\"true\"}"*/, f);
+		fclose(f);
+
+	}
+
+	isSuccess = TRUE;
+
+	return isSuccess;
+}
+
+#if 0
+json_object * getJSONfromFile(char *filename)
+{
+	mtrace();
+    FILE *fptr;
+    char str[] = "{}";
+    json_object * obj ;
+
+    fptr = fopen(filename, "rw+");
+    if(fptr == NULL) //if file does not exist, create it
+    {
+
+    	fptr = fopen(filename, "w");
+    	fwrite(str , 1 , sizeof(str) , fptr );
+    }
+    fclose(fptr);
+
+    //obj = new JSONObject(new JSONTokener((new URI("file:///" + filename)).toURL().openStream()));
+    obj = json_object_from_file(filename);
+
+    return obj;
+}
+#endif
+
+int TransactionMessageAttemptsGet(void)
+{
+	return atoi((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemData);
+}
+
+int FirstHeartBeatResponse(void)
+{
+	return FirstHeartBeat;
+}
+
+#define SA struct sockaddr
+#define MAXBUF 1024
+
+//static int  m_socket_data;
+//static int  sockfd;
+
+
+int ReadHttpStatus(int sock){
+    //char c;
+    char buff[1024]="",*ptr=buff+1;
+    int bytes_received, status;
+    DEBUG_INFO("Begin Response ..\n");
+    while((bytes_received = recv(sock, ptr, 1, 0))){
+        if(bytes_received==-1){
+            perror("ReadHttpStatus");
+            exit(1);
+        }
+
+        if((ptr[-1]=='\r')  && (*ptr=='\n' )) break;
+        ptr++;
+    }
+    *ptr=0;
+    ptr=buff+1;
+
+    sscanf(ptr,"%*s %d ", &status);
+
+    DEBUG_INFO("%s\n",ptr);
+    DEBUG_INFO("status=%d\n",status);
+    DEBUG_INFO("End Response ..\n");
+    return (bytes_received>0)?status:0;
+
+}
+
+//the only filed that it parsed is 'Content-Length'
+int ParseHeader(int sock){
+    //char c;
+    char buff[1024]="",*ptr=buff+4;
+    int bytes_received;
+    DEBUG_INFO("Begin HEADER ..\n");
+    while((bytes_received = recv(sock, ptr, 1, 0))){
+        if(bytes_received==-1){
+            perror("Parse Header");
+            exit(1);
+        }
+
+        if(
+            (ptr[-3]=='\r')  && (ptr[-2]=='\n' ) &&
+            (ptr[-1]=='\r')  && (*ptr=='\n' )
+        ) break;
+        ptr++;
+    }
+
+    *ptr=0;
+    ptr=buff+4;
+    //printf("%s",ptr);
+
+    if(bytes_received){
+        ptr=strstr(ptr,"Content-Length:");
+        if(ptr){
+            sscanf(ptr,"%*s %d",&bytes_received);
+
+        }else
+            bytes_received=-1; //unknown size
+
+        DEBUG_INFO("Content-Length: %d\n",bytes_received);
+    }
+    DEBUG_INFO("End HEADER ..\n");
+    return  bytes_received ;
+
+}
+
+int httpDownLoadFile(char *location, char *path, char *filename,char *url)
+{
+	//char domain[] = "sstatic.net", path[]="stackexchange/img/logos/so/so-logo-med.png";
+
+	//int sock;//, bytes_received;
+	char ftpbuf[200];
+	int systemresult;
+	//char temp[100];
+
+	DEBUG_INFO("filename=%s\n",filename);
+	DEBUG_INFO("url=%s\n",url);
+	memset(ftpbuf, 0, sizeof(ftpbuf));
+	sprintf(ftpbuf, "wget --tries=3 -O %s -c %s",filename, url);
+			//sprintf(ftpbuf, "ftpput -u %s -p %s %s -P %d %s%s %s",user,password,IPbuffer,21,filename,filename,path);
+	systemresult = system(ftpbuf);
+
+	DEBUG_INFO("systemresult=%d\n",systemresult);
+	if(systemresult != 0)
+	{
+		DEBUG_INFO("http DownLoad error!\n");
+		return FALSE;
+	}
+
+	return TRUE;
+}
+
+int ftpDownLoadFile(char *location, char *user, char *password, int port, char *path, char *filename,char *url)
+{
+
+	char ftpbuf[200];
+	int systemresult;
+	//char temp[100];
+#if 0
+	struct hostent* server;
+	char *IPbuffer;
+	server = gethostbyname(location);
+
+	// To convert an Internet network
+	// address into ASCII string
+	IPbuffer = inet_ntoa(*((struct in_addr*)
+				 	 server->h_addr_list[0]));
+#endif
+
+	memset(ftpbuf, 0, sizeof(ftpbuf));
+
+	sprintf(ftpbuf, "wget --tries=3 -O %s -c %s",filename, url);
+	//sprintf(ftpbuf, "ftpget -u %s -p %s %s -P %d %s %s%s",user,password,IPbuffer,port/*21*/,filename,path,filename); --- remove temporally
+	DEBUG_INFO("ftpbuf=%s\n",ftpbuf);
+		//sprintf(ftpbuf, "ftpput -u %s -p %s %s -P %d %s%s %s",user,password,IPbuffer,21,filename,filename,path);
+	systemresult = system(ftpbuf);
+
+	DEBUG_INFO("systemresult=%d\n",systemresult);
+	if(systemresult != 0)
+	{
+		printf("ftpget error!\n");
+		return FALSE;
+	}
+
+	return TRUE;
+
+}
+
+int ftpFile(char *location, char *user, char *password, int port, char *path, char *fnamePlusPath,char *filename)
+{
+	 struct hostent* server;
+	 char *IPbuffer;
+	 char ftpbuf[200];
+	 int systemresult;
+
+	  // To retrieve host information
+	 server = gethostbyname(location);
+	 // To convert an Internet network
+	 // address into ASCII string
+	 IPbuffer = inet_ntoa(*((struct in_addr*)
+			 	 server->h_addr_list[0]));
+
+	memset(ftpbuf, 0, sizeof(ftpbuf));
+
+	/* format : ftpput -u  username -p passwd IP  target  source*/
+	sprintf(ftpbuf, "ftpput -u %s -p %s %s -P %d %s%s %s",user,password,IPbuffer,port/*21*/,path,filename,fnamePlusPath);
+	DEBUG_INFO("ftpbuf=%s\n",ftpbuf);
+	//sprintf(ftpbuf, "ftpput -u %s -p %s %s -P %d %s%s %s",user,password,IPbuffer,21,filename,filename,path);
+	systemresult = system(ftpbuf);
+
+	DEBUG_INFO("systemresult=%d\n",systemresult);
+	if(systemresult != 0)
+	{
+		DEBUG_INFO("ftpput error!\n");
+		return FALSE;
+	}
+
+	return TRUE;
+
+}
+
+
+int SettingChargingRecord(int target, int transactionId)
+{
+	if(strstr((const char *)ShmSysConfigAndInfo->SysConfig.ModelName ,"DC") != NULL)
+	{
+		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+		{
+			if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == target)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 8))
+			{
+				addBuff(target, transactionId, 0);
+				return TRUE;
+			}
+		}
+
+		for (int index = 0; index < CCS_QUANTITY; index++)
+		{
+			if ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == target)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == 8))
+			{
+				addBuff(target, transactionId, 0);
+				return TRUE;
+			}
+		}
+
+		for (int index = 0; index < GB_QUANTITY; index++)
+		{
+			if ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == target)&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == 8))
+			{
+					 addBuff(target, transactionId, 0);
+					 return TRUE;
+			}
+		}
+
+	}
+	else
+	{
+		for (int index = 0; index < AC_QUANTITY; index++)
+		{
+			if ((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == target)&&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == 8))
+			{
+				addBuff(target, transactionId, 0);
+				return TRUE;
+			}
+		}
+	}
+
+
+ return FALSE;
+}
+
+
+int addBuff(int gun_idx, int user_id, int cmd_sn)
+{
+	int isSuccess = FALSE;
+	//char *query = NULL;
+    sqlite3_stmt *stmt;
+    int rc;             // return code
+    char str[20];
+
+    sprintf(str,"%d",user_id);
+    sqlite3_prepare_v2(db, "insert into log_buffer (user_id, cmd_sn, charger_id, gun_type, gun_no, rfid_no, stime, etime, time_len, s_soc, e_soc, stop_reason, power, meter_before, meter_after, charge_price, reserve, surplus_before, surplus_after, service_price, is_pay ,charge_strategy, charge_parameter, vin, vehicle_no, start_method, card_type, is_upload, guid, is_buf2OK) values (?1,?2,?3,?4,?5,?6,?7,?8,?9,?10,?11,?12,?13,?14,?15,?16,?17,?18,?19,?20,?21,?22,?23,?24,?25,?26,?27,?28,?29,?30);", -1, &stmt, NULL);       /* 1 */
+
+    sqlite3_bind_text(stmt, 1, str, -1, SQLITE_STATIC);      /* 2 */
+
+
+    rc = sqlite3_step(stmt);			   /* 3 */
+    if (rc != SQLITE_DONE) {
+    	printf("ERROR inserting data: %s\n", sqlite3_errmsg(db));
+    	goto out;
+    }
+
+    sqlite3_finalize(stmt);
+   // free(query);
+
+out:
+    /*
+     * close SQLite database
+     */
+    sqlite3_close(db);
+    printf("database closed.\n");
+
+    return isSuccess;
+}
+
+/**
+ * Place the contents of the specified file into a memory buffer
+ *
+ * @param[in] filename The path and name of the file to read
+ * @param[out] filebuffer A pointer to the contents in memory
+ * @return status 0 success, 1 on failure
+ */
+int get_file_contents(const char* filename, char** outbuffer) {
+	FILE* file = NULL;
+	long filesize;
+	const int blocksize = 1;
+	size_t readsize;
+	char* filebuffer;
+
+	// Open the file
+	file = fopen(filename, "r");
+	if (NULL == file)
+	{
+		printf("'%s' not opened\n", filename);
+		exit(EXIT_FAILURE);
+	}
+
+	// Determine the file size
+	fseek(file, 0, SEEK_END);
+	filesize = ftell(file);
+	rewind (file);
+
+	// Allocate memory for the file contents
+	filebuffer = (char*) malloc(sizeof(char) * filesize);
+	*outbuffer = filebuffer;
+	if (filebuffer == NULL)
+	{
+		fputs ("malloc out-of-memory", stderr);
+		exit(EXIT_FAILURE);
+	}
+
+	// Read in the file
+	readsize = fread(filebuffer, blocksize, filesize, file);
+	if (readsize != filesize)
+	{
+		fputs ("didn't read file completely",stderr);
+		exit(EXIT_FAILURE);
+	}
+
+	// Clean exit
+	fclose(file);
+	return EXIT_SUCCESS;
+}
+
+static int selectSqlCount = 0;
+static int callback(void *data, int argc, char **argv, char **azColName){
+   int i;
+   printf("%s: ", (const char*)data);
+   selectSqlCount = argc;
+   for(i = 0; i<argc; i++){
+      printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
+   }
+
+   printf("\n");
+   return 0;
+}
+
+static int versioncallback(void *data, int argc, char **argv, char **azColName){
+   //int i;
+   //printf("%s:\n", (const char*)data);
+   localversion = argv[5] ? atoi(argv[5]) : 0;
+   printf("localversion=%d\n", localversion);
+   return 0;
+}
+
+static int IdTagcallback(void *data, int argc, char **argv, char **azColName){
+   //int i;
+   //printf("%s:\n", (const char*)data);
+
+   //idTag
+   sprintf(idTagAuthorization,"%s", argv[1] ? argv[1] : "NULL");
+   sprintf(idTagQuery.idTagstr,"%s", argv[1] ? argv[1] : "NULL");
+
+   //parentIdTag
+   sprintf(idTagQuery.parentIdTag,"%s", argv[2] ? argv[2] : "NULL");
+
+   //expir_date
+   sprintf(idTagQuery.expiryDate,"%s", argv[3] ? argv[3] : "NULL");
+
+   //status
+   sprintf(idTagQuery.idTagstatus,"%s", argv[4] ? argv[4] : "NULL");
+
+   //version
+   idTagQuery.listVersionInt = atoi(argv[5]);
+
+   DEBUG_INFO("IdTag=%s\n", idTagAuthorization);
+
+   return 0;
+}
+
+static int deleteIdTagcallback(void *data, int argc, char **argv, char **azColName){
+   int i;
+   //printf("%s:\n", (const char*)data);
+#if 1
+   for(i=0; i<argc; i++){
+      printf("%s = %s", azColName[i], argv[i] ? argv[i] : "NULL");
+   }
+   //printf("");
+#endif
+//   localversion = argv[5] ? atoi(argv[5]) : 0;
+//   printf("localversion=%d\n", localversion);
+   return 0;
+}
+
+/** sqlite3_exec?„å?è°ƒã€?
+ *
+ *  ?‘控?¶å�°?“å�°?¥è¯¢?„ç??œã€?
+ *
+ *  @param in data 传递ç??žè??½æ•°?„æ•°?®ã€?
+ *  @param in n_columns sqlite3_exec?§è?结æ??†ä¸­?—ç??°é???
+ *  @param in col_values sqlite3_exec?§è?结æ??†ä¸­æ¯�ä??—ç??°æ�®??
+ *  @param in col_names sqlite3_exec?§è?结æ??†ä¸­æ¯�ä??—ç??�称??
+ *  @return ?¶æ€�ç???
+ */
+int sqlite3_exec_callback(void *data, int n_columns, char **col_values, char **col_names)
+{
+    for (int i = 0; i < n_columns; i++)
+    {
+    	DEBUG_INFO("%s/t", col_values[i]);
+    }
+    DEBUG_INFO("/n");
+
+    return 0;
+}
+
+void OCPP_getListVerion()
+{
+    int rc = 0;
+   // const char* data = "Callback function called";
+    char sql[100];
+    char zErrMsg[100];
+
+    memset(sql, 0, 100);
+    memset(zErrMsg, 0, 100);
+    strcpy(sql, "select * from ocpp_auth_local order by idx desc");
+
+    /* Execute SQL statement */
+    rc = sqlite3_exec(db, sql, versioncallback, 0, (char **)&zErrMsg);
+    printf("rc=%d\n",rc);
+    if( rc != SQLITE_OK ){
+    	printf("SQL error: %s", zErrMsg);
+          //sqlite3_free(zErrMsg);
+    }else{
+    	printf("Operation done successfully");
+    }
+}
+
+void OCPP_getIdTag(char *idTag)
+{
+    int rc = 0;
+   // const char* data = "Callback function called";
+    char sql[100];
+    char zErrMsg[100];
+
+    memset(sql, 0, 100);
+    memset(zErrMsg, 0, 100);
+    memset(idTagAuthorization, 0, sizeof(idTagAuthorization));
+    memset(&idTagQuery, 0, sizeof(idTagQuery));
+
+
+    sprintf(sql,"select * from ocpp_auth_local where idtag='%s'", idTag);
+
+    /* Execute SQL statement */
+    printf("OCPP_getIdTag -1\n");
+    rc = sqlite3_exec(db, sql, IdTagcallback, 0, (char **)&zErrMsg);
+    printf("OCPP_getIdTag -2\n");
+    printf("rc=%d\n",rc);
+    if( rc != SQLITE_OK ){
+    	printf("SQL error: %s", zErrMsg);
+          //sqlite3_free(zErrMsg);
+    }else{
+    	printf("Operation done successfully");
+    }
+    printf("OCPP_getIdTag -3\n");
+
+   //return ver;
+}
+
+
+void OCPP_get_TableAuthlocalAllData(void)
+{
+    int rc = 0;
+   // const char* data = "Callback function called";
+    char sql[100];
+    char zErrMsg[100];
+
+    memset(sql, 0, 100);
+    memset(zErrMsg, 0, 100);
+
+    sprintf(sql,"select * from ocpp_auth_local ");
+
+    /* Execute SQL statement */
+    printf("OCPP_get_TableAuthlocalAllData -1\n");
+    rc = sqlite3_exec(db, sql, &sqlite3_exec_callback, 0,(char **)&zErrMsg);
+  //  rc = sqlite3_exec(db, sql, IdTagcallback, 0, &zErrMsg);
+    printf("OCPP_get_TableAuthlocalAllData -2\n");
+    printf("rc=%d\n",rc);
+    if( rc != SQLITE_OK ){
+    	printf("SQL error: %s", zErrMsg);
+          //sqlite3_free(zErrMsg);
+    }else{
+    	printf("Operation done successfully");
+    }
+    printf("OCPP_get_TableAuthlocalAllData -3\n");
+
+   //return ver;
+}
+
+
+int OCPP_cleanLocalList()
+{
+  char * sqlcleanLocalList = "delete from ocpp_auth_local";
+  char *errMsg = 0;
+  int rc =sqlite3_exec(db, sqlcleanLocalList, 0, 0, &errMsg);
+  if (SQLITE_OK != rc)
+  {
+	  printf("%s\n",errMsg);
+	  return FALSE;
+  }
+  else
+  {
+	  printf("delete ocpp_auth_local table successfully\n");
+  }
+
+  return TRUE;
+
+}
+
+int OCPP_addLocalList_1(int version, char *idTag, char *parentTage, char *expiryDate, char *status)
+{
+	 int isSuccess = FALSE;
+	 int ret = 0;
+	 //const char* data = "Callback function called";
+	 char sql[200];
+	 char zErrMsg[100];
+
+	 memset(sql, 0, 200);
+	 memset(zErrMsg, 0, 100);
+
+	 sprintf(sql,"insert or replace into ocpp_auth_local (idtag, parent_idtag, expir_date, status, version) " "VALUES ('%s', '%s', '%s', '%s', %d ); ""SELECT * from ocpp_auth_local", idTag, parentTage, expiryDate, status, version);
+
+	 printf("sql:%s\n", sql);
+	 printf("OCPP_addLocalList -5\n");
+	 /* Execute SQL statement */
+	 //zErrMsg  = 0;
+	 ret = sqlite3_exec(db, sql, callback, 0, (char **)&zErrMsg);
+	 printf("OCPP_addLocalList -6\n");
+	 if( ret != SQLITE_OK ){
+	    printf("SQL error: %s\n", zErrMsg);
+	     	//  free(zErrMsg);
+	     	//  free(sql);
+	   return isSuccess;
+	 }
+
+	 printf("successfully Insert records created\n");
+	 isSuccess = TRUE;
+	 return isSuccess;
+}
+
+void OCPP_deleteIdTag(char *idTag)
+{
+	//int ver = 0;
+	//int isSuccess = FALSE;
+	int rc = 0;
+	char sql[100];
+	char zErrMsg[100];
+
+	memset(sql, 0, 100);
+	memset(zErrMsg, 0, 100);
+	sprintf(sql,"DELETE from ocpp_auth_local where idtag='%s'; SELECT * from ocpp_auth_local;", idTag);
+
+	/* Execute SQL statement */
+	printf("OCPP_getIdTag -1\n");
+	rc = sqlite3_exec(db, sql, deleteIdTagcallback, 0,(char **)&zErrMsg);
+	printf("OCPP_getIdTag -2\n");
+	printf("rc=%d\n",rc);
+	if( rc != SQLITE_OK ){
+		printf("SQL error: %s", zErrMsg);
+	          //sqlite3_free(zErrMsg);
+	}else{
+		printf("Operation done successfully");
+	}
+	printf("OCPP_getIdTag -3\n");
+}
+
+ int OCPP_addLocalList(int version, char *idTag, char *parentTage, char *expiryDate, char *status)
+ {
+    int isSuccess = FALSE;
+    int ret = 0;
+    const char* data = "Callback function called";
+    char sql[200];
+    char zErrMsg[100];
+
+    memset(sql, 0, 200);
+    memset(zErrMsg, 0, 100);
+    /* selectFromTable */
+   // sql = select * from ocpp_auth_local where starring='Jodie Foster';
+    sprintf(sql,"select * from ocpp_auth_local where idtag='%s'", idTag);
+
+    /* Execute SQL statement */
+    selectSqlCount = 0;
+    ret = sqlite3_exec(db, sql, callback, (void*)data,(char **)&zErrMsg);
+    if( ret != SQLITE_OK ){
+           printf("Error SQL: %s\n", zErrMsg);
+    }
+
+    printf("successfully select operation done\n");
+
+    memset(sql, 0, 200);
+    memset(zErrMsg, 0, 100);
+
+    if(selectSqlCount  == 0)
+    {
+       	//Insert
+    	//sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "      "VALUES (1, ?�Paul?? 32, ?�California?? 20000.00 ); ";
+    	sprintf(sql,"INSERT INTO ocpp_auth_local (idtag, parent_idtag, expir_date, status, version) " "VALUES ('%s', '%s', '%s', '%s', %d ); ", idTag, parentTage, expiryDate, status, version);
+
+    	printf("sql:%s\n", sql);
+       	/* Execute SQL statement */
+    	//zErrMsg  = 0;
+    	ret = sqlite3_exec(db, sql, callback, 0,(char **)&zErrMsg);
+     	if( ret != SQLITE_OK ){
+    	  printf("SQL error: %s\n", zErrMsg);
+    	  return isSuccess;
+    	}
+
+    	printf("successfully Insert records created\n");
+    	isSuccess = TRUE;
+
+    }
+    else
+    {
+     	//Update
+    	/* Create merged SQL statement */
+    	sprintf(sql, "UPDATE ocpp_auth_local set parent_idtag = '%s', expir_date = '%s',  status ='%s', version =%d where idtag='%s'; "     "SELECT * from ocpp_auth_local", parentTage, expiryDate, status, version, idTag);
+    	/* Execute SQL statement */
+    	ret = sqlite3_exec(db, sql, callback, (void*)data,(char **)&zErrMsg);
+    	if( ret != SQLITE_OK ){
+    		printf("SQL error: %s\n", zErrMsg);
+    		//sqlite3_free(zErrMsg);
+    		//sqlite3_free(sql);
+    	   return isSuccess;
+    	}
+
+    	printf("Successfully operation done \n");
+    	isSuccess = TRUE;
+    }
+
+    return isSuccess;
+
+ }
+
+char *GetOcppServerURL()
+{
+
+	memset(OcppProtocol, 0, sizeof(OcppProtocol));
+	memset(OcppHost, 0, sizeof(OcppHost));
+	memset(OcppTempPath, 0, sizeof(OcppTempPath));
+	sscanf((const char *)ShmOCPP16Data->OcppServerURL,
+				"%[^:]:%*2[/]%[^:]:%i/%[a-zA-Z0-9._/-]",
+				OcppProtocol, OcppHost, &OcppPort, OcppTempPath);
+	printf("OcppProtocol =%s\n",OcppProtocol);
+	printf("OcppHost =%s\n",OcppHost);
+	printf("OcppPort =%d\n",OcppPort);
+	printf("OcppTempPath =%s\n",OcppTempPath);
+
+	return OcppHost;
+}
+
+char *GetOcppPath()
+{
+
+	if(OcppTempPath == NULL)
+	{
+		sprintf(OcppPath,"/%s",ShmOCPP16Data->ChargeBoxId);
+	}
+	else
+	{
+		sprintf(OcppPath,"/%s%s",OcppTempPath,ShmOCPP16Data->ChargeBoxId);
+	}
+
+	printf("OcppPath=%s\n",OcppPath);
+	return OcppPath;
+}
+
+int GetOcppPort()
+{
+	return OcppPort;
+}
+
+#if 0
+void Send(struct json_object *message)
+{
+	printf("Send -1 \n");
+	printf("message=%s\n",json_object_to_json_string(message));
+	LWS_Send(json_object_to_json_string(message));
+}
+#endif
+
+void LWS_Send(char * str)
+{
+#if 1
+	if(ShmOCPP16Data->OcppConnStatus == 0)
+	{
+		DEBUG_INFO("\n offline  now !!!\n");
+		return;
+	}
+#endif
+	pthread_mutex_lock(&lock);
+	memset(SendBuffer,0,SendBufLen);
+	sprintf((char *)SendBuffer, "%s", str);
+	pthread_mutex_unlock(&lock);
+	lws_callback_on_writable(wsi_client);
+	lws_service(context, 10000);//timeout_ms
+	//usleep(10000); // 等�??��?微�?
+	DEBUG_INFO("Send message end\n");
+}
+
+
+
+

+ 18 - 25
EVSE/Modularization/ocppfiles/MessageHandler.h

@@ -1,27 +1,19 @@
 #ifndef MessageHandler_H
 #define MessageHandler_H
-#if 0
-typedef enum _DiagnosticsStatus
-{
-	Idle,
-	Uploaded,
-	UploadFailed,
-	Uploading
-}DiagnosticsStatus;
 
-typedef enum _FirmwareStatus
+struct StructPeriod
 {
-	Downloaded,
-	DownloadFailed,
-	Downloading,
-	FirmwareStatusIdle,
-	InstallationFailed,
-	Installing,
-	Installed
-}FirmwareStatus;
-#endif
-
+	int		StartPeriod;
+	float 	Limit;//0.1;
+	int		NumberPhases;
+};
 
+struct StructProfile
+{
+	int	Duration;
+	int TotalPeriod;
+	struct StructPeriod	Period[10];
+};
 
 //===============================================
 // Common routine
@@ -79,7 +71,7 @@ int handleChangeConfigurationRequest(char *uuid, char *payload);
 int handleClearCacheRequest(char *uuid, char *payload);
 int handleClearChargingProfileRequest(char *uuid, char *payload);
 int handleDataTransferRequest(char *uuid, char *payload);
-long long diff_tm(struct tm *a, struct tm *b);
+//long long diff_tm(struct tm *a, struct tm *b);
 int handleGetCompositeScheduleRequest(char *uuid, char *payload);
 int handleGetConfigurationRequest(char *uuid, char *payload);
 int handleGetDiagnosticsRequest(char *uuid, char *payload);
@@ -115,15 +107,16 @@ void handleError(char *id, char *errorCode, char *errorDescription,char *payload
  void getKeyValue(char *keyReq);
  int  setKeyValue(char *key, char *value);
  int updateSetting(char *key, char *value);
+#if 0
  json_object * getJSONfromFile(char *filename);
+#endif
  int httpDownLoadFile(char *location, char *path, char *filename,char *url);
- int ftpDownLoadFile(char *location, char *user, char *password, int port, char *path, char *filename);
- void UpdateFirmwareProcess(void* data);
+ int ftpDownLoadFile(char *location, char *user, char *password, int port, char *path, char *filename,char *url);
+ void *UpdateFirmwareProcess(void* data);
  void* GetDiagnosticsProcess(void* data);
- int ftpFile(char *location, char *user, char *password, int port, char *path, char *filename);
+ int ftpFile(char *location, char *user, char *password, int port, char *path, char *fnamePlusPath,char *filename);
  int get_file_contents(const char* filename, char** outbuffer);
- static int ftp_recv_respond(int m_socket_cmd, char *resp, int len);
- void Send(struct json_object *message);
+ //void Send(struct json_object *message);
  void LWS_Send(char * str);
 extern int queue_operation(int type, char *frontUUID, char *frontData);
 char *GetOcppServerURL();

+ 1414 - 937
EVSE/Modularization/ocppfiles/Module_OcppBackend.c

@@ -1,937 +1,1414 @@
-#include 	<sys/time.h>
-#include 	<sys/timeb.h>
-#include    	<sys/types.h>
-#include    	<sys/stat.h>
-#include 	<sys/ioctl.h>
-#include 	<sys/socket.h>
-#include 	<sys/ipc.h>
-#include 	<sys/shm.h>
-#include 	<sys/shm.h>
-#include 	<sys/mman.h>
-#include 	<linux/wireless.h>
-#include 	<linux/sockios.h>
-#include 	<linux/socket.h>
-#include 	<arpa/inet.h>
-#include 	<netinet/in.h>
-
-#include 	<unistd.h>
-#include 	<stdarg.h>
-#include    	<stdio.h>      
-#include    	<stdlib.h>     
-#include    	<unistd.h>     
-#include    	<fcntl.h>      
-#include    	<termios.h>    
-#include 	<errno.h>
-#include 	<string.h>
-#include	<time.h>
-#include	<ctype.h>
-#include 	<ifaddrs.h>
-#include 	<json_config.h> 
-#include 	<json_object.h> 
-#include 	<json_tokener.h> 
-#include 	<libwebsockets.h>
-#include 	<lws_config.h>
-#include    	"JsonParser.h"
-#include	"hashmap.h"
-#include 	"HashTable.h"
-#include    	"SystemLogMessage.h"
-#include 	"ShareMemory.h"
-#include 	<pthread.h>
-#include    	"MessageHandler.h"
-#include	"sqlite3.h"
-
-
-
-#define Debug
-//#define ARRAY_SIZE(A)		(sizeof(A) / sizeof(A[0]))
-#define PASS				1
-#define FAIL				-1
-
-//==========================================
-// Function prototype
-//==========================================
-void trim(char *s);
-int mystrcmp(char *p1,char *p2);
-void substr(char *dest, const char* src, unsigned int start, unsigned int cnt);
-void getSubStr(char *dest, char* src, char *split, int idx);
-void split(char **arr, char *str, const char *del);
-int strpos(char *source, char *substr, int skip);
-int strposs(char *source, char *substr, int idx);
-char *random_uuid( char buf[37] );
-static int OCPP16Callback(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len);
-char * strchr(const char *p, int ch);
-void ClientCoreProfile(HashTable* HandleRequest, HashTable* Handleresponse);
-void createq();
-int showfront(char *uuid, char *data);
-int addq(char *uuid, char *data) ;
-int delq();
-int sentqueue();
-void CheckTransactionPacket(char *uuid);
-int queue_operation(int type, char *frontUUID, char *frontData);
-
-//==========================================
-// Variables Annoucement
-//==========================================
-pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
-pthread_mutex_t lock_sentData = PTHREAD_MUTEX_INITIALIZER;
-HashTable                  	 			*tableHandleRequest;
-HashTable  						*tableHandleresponse;
-HashTable						*tableHandleError ;
-
-extern struct OCPP16Data 				*ShmOCPP16Data;
-struct lws 						*wsi_client;
-struct lws_context 					*context;
-static int sendbuffer = 0;
-extern int server_sign;
-extern int server_pending;
-extern void CheckSystemValue(void);
-unsigned char *SendBuffer;
-int SendBufLen=(1024*4);//(1024*3);
-int ConnectionEstablished=0;
-int defaultWaitingTime = 10; //10 second
-extern int BootNotificationInterval;
-map_t hashMap;
-data_struct_t* mapItem;
-sqlite3 *db;
-char *errMsg = NULL;
-
-struct _node {
-	char uuid[37];
-	char data[2000];
-	struct node *next;
-}node;
-typedef struct _node  *pnode;
-pnode  front, rear;
-
-struct StartTime
-{
-	unsigned int connect;
-	unsigned int bootNotification;
-}startTime;
-
-static char *createsql = "CREATE TABLE IF NOT EXISTS log_buffer("
-              "idx integer primary key,"
-	          "user_id text,"
-	          "cmd_sn text,"
-	          "charger_id text,"
-	          "gun_type text,"
-	          "gun_no text,"
-	          "rfid_no text,"
-	          "stime text,"
-	          "etime text,"
-	          "time_len text,"
-	          "s_soc text,"
-	          "e_soc text,"
-	          "stop_reason text,"
-	          "power text,"
-	          "meter_before text,"
-	          "meter_after text,"
-	          "charge_price text,"
-	          "reserve text,"
-	          "surplus_before text,"
-	          "surplus_after text,"
-	          "service_price text,"
-	          "is_pay text,"
-	          "charge_strategy text,"
-	          "charge_parameter text,"
-	          "vin text,"
-	          "vehicle_no text,"
-	          "start_method text,"
-	          "card_type text,"
-	          "is_upload text,"
-	          "guid text UNIQUE,"
-	          "is_buf2OK text);";
-
-
-static char *createsChargingRecordsql = "CREATE TABLE IF NOT EXISTS ChargingRecord("
-              "idx integer primary key,"
-	          "gun_type text,"
-	          "connectorId text,"
-	          "idTag  text,"
-		      "transactionId  text,"
-	          "stime text,"
-	          "etime text,"
-	          "time_len text,"
-	          "s_soc text,"
-	          "e_soc text,"
-	          "stop_reason text,"
-	          "power text,"
-	          "meter_before text,"
-	          "meter_after text,"
-	          "reservationId  text,"
-	          "guid text UNIQUE);";
-	          //"is_buf2OK text);";
-
-
-
-static char *sqlOcppAuthCache = "create table if not exists ocpp_auth_cache (idx integer primary key,"
-				"idtag text UNIQUE,"
-				"parent_idtag text,"
-				"expir_date text,"
-				"status text);";
-
-static char *sqlOcppAuthLocal = "create table if not exists ocpp_auth_local (idx integer primary key,"
-				"idtag text UNIQUE,"
-				"parent_idtag text,"
-				"expir_date text,"
-				"status text,"
-				"version text);";
-
-static char *sqlInitialOcppAuthLocal = "insert or replace into ocpp_auth_local(idtag, parent_idtag, expir_date, status, version) values('PaHdImHiOnNG','none','2099-12-31T23:59:59.999Z','Accepted','0')";
-
-
-int DiffTimeb(struct timeb ST, struct timeb ET)
-{
-	//return milli-second
-	unsigned int StartTime,StopTime;
-
-	StartTime=(unsigned int)ST.time;
-	StopTime=(unsigned int)ET.time;
-	return (StopTime-StartTime)*1000+ET.millitm-ST.millitm;
-}
-
-//=================================
-// Common routine
-//=================================
-void trim(char *s)
-{
-    int i=0, j, k, l=0;
-
-    while((s[i]==' ')||(s[i]=='\t')||(s[i]=='\n'))
-        i++;
-
-    j = strlen(s)-1;
-    while((s[j]==' ')||(s[j]=='\t')||(s[j]=='\n'))
-        j--;
-
-    if(i==0 && j==strlen(s)-1) { }
-    else if(i==0) s[j+1] = '\0';
-    else {
-        for(k=i; k<=j; k++) s[l++] = s[k];
-        s[l] = '\0';
-    }
-}
-
-int mystrcmp(char *p1,char *p2)
-{
-    while(*p1==*p2)
-    {
-        if(*p1=='\0' || *p2=='\0')
-            break;
-        p1++;
-        p2++;
-    }
-    if(*p1=='\0' && *p2=='\0')
-        return(PASS);
-    else
-        return(FAIL);
-}
-
-void substr(char *dest, const char* src, unsigned int start, unsigned int cnt)
-{
-	strncpy(dest, src + start, cnt);
-	dest[cnt] = 0;
-}
-
-void getSubStr(char *dest, char* src, char *split, int idx)
-{
-
-	int start = (strposs(src,",",idx)+1);
-	int cnt = (strposs(src,",",idx+1)-2)-(strposs(src,",",idx)+1);
-
-	strncpy(dest, src + start, cnt);
-	dest[cnt] = 0;
-}
-
-void split(char **arr, char *str, const char *del)
-{
-	char *s = strtok(str, del);
-
-	while(s != NULL)
-	{
-		*arr++ = s;
-		s = strtok(NULL, del);
-	}
-}
-
-int strpos(char *source, char *substr, int skip)
-{
-   char stack[strlen(source)];
-   strncpy(stack, source+skip, strlen(source)-skip);
-   char *p = strstr(stack, substr);
-   if (p)
-      return p - stack+skip;
-   return -1;
-}
-
-int strposs(char *source, char *substr, int idx)
-{
-   char stack[strlen(source)];
-   int result=0;
-   int count=0;
-
-   while(count<=idx)
-   {
-	   memset(stack,0,sizeof stack);
-	   strncpy(stack, source+result, strlen(source)-result);
-
-	   int loc = strcspn(stack, substr);
-
-	   if(loc>0)
-		   result += (loc+1);
-	   else
-		   result = -1;
-
-	   count++;
-   }
-
-   return result;
-}
-
-char *random_uuid( char buf[37] )
-{
-    const char *c = "89ab";
-    char *p = buf;
-    int n;
-    for( n = 0; n < 16; ++n )
-    {
-        int b = rand()%255;
-        switch( n )
-        {
-            case 6:
-                sprintf(p, "4%x", b%15 );
-            break;
-            case 8:
-                sprintf(p, "%c%x", c[rand()%strlen(c)], b%15 );
-            break;
-            default:
-                sprintf(p, "%02x", b);
-            break;
-        }
-
-        p += 2;
-        switch( n )
-        {
-            case 3:
-            case 5:
-            case 7:
-            case 9:
-                *p++ = '-';
-                break;
-        }
-    }
-    *p = 0;
-    return buf;
-}
-
-
-//==========================================
-// Web socket tranceive routine
-//==========================================
-int SendData(struct lws *wsi)
-{
-
-    int n;
-    int len;
-    unsigned char *out = NULL;
-
-    len = strlen((char *)SendBuffer);
-    out = (unsigned char *)malloc(sizeof(char)*(LWS_SEND_BUFFER_PRE_PADDING + len + LWS_SEND_BUFFER_POST_PADDING));
-    memcpy (out + LWS_SEND_BUFFER_PRE_PADDING, SendBuffer, len );
-
-    n = lws_write(wsi, out + LWS_SEND_BUFFER_PRE_PADDING, len, LWS_WRITE_TEXT);
-
-    free(out);
-    out = NULL;
-    return n;
-}
-
-static int OCPP16Callback(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len)
-{
-	int MsgType;
-	char UniqueId[37],Action[33],Payload[10241],ErrorCode[129],ErrorDescription[513];
-
-	switch (reason)
-	{
-		case LWS_CALLBACK_PROTOCOL_INIT:
-			#ifdef SystemLogMessage
-			DEBUG_INFO("LWS_CALLBACK_PROTOCOL_INIT\n");
-			#endif
-
-			break;
-		case LWS_CALLBACK_CLIENT_FILTER_PRE_ESTABLISH:
-			#ifdef SystemLogMessage
-			DEBUG_INFO("LWS_CALLBACK_CLIENT_FILTER_PRE_ESTABLISH\n");
-			#endif
-			break;
-		case LWS_CALLBACK_CLOSED_CLIENT_HTTP:
-			#ifdef SystemLogMessage
-			DEBUG_INFO("LWS_CALLBACK_CLOSED_CLIENT_HTTP\n");
-			#endif
-			break;
-		case LWS_CALLBACK_WSI_DESTROY:
-			#ifdef SystemLogMessage
-			DEBUG_INFO("LWS_CALLBACK_WSI_DESTROY\n");
-			#endif
-			server_sign = FALSE;
-			break;
-		case LWS_CALLBACK_LOCK_POLL:
-			#ifdef SystemLogMessage
-			//DEBUG_INFO("LWS_CALLBACK_LOCK_POLL\n");
-			#endif
-			break;
-		case LWS_CALLBACK_ADD_POLL_FD:
-			#ifdef SystemLogMessage
-			DEBUG_INFO("LWS_CALLBACK_ADD_POLL_FD\n");
-			#endif
-			break;
-		case LWS_CALLBACK_DEL_POLL_FD:
-			#ifdef SystemLogMessage
-			DEBUG_INFO("LWS_CALLBACK_DEL_POLL_FD\n");
-			#endif
-			break;
-		case LWS_CALLBACK_UNLOCK_POLL:
-			#ifdef SystemLogMessage
-			//DEBUG_INFO("LWS_CALLBACK_UNLOCK_POLL\n");
-			#endif
-			break;
-		case LWS_CALLBACK_CHANGE_MODE_POLL_FD:
-			#ifdef SystemLogMessage
-			//DEBUG_INFO("LWS_CALLBACK_CHANGE_MODE_POLL_FD\n");
-			#endif
-			break;
-		case LWS_CALLBACK_WSI_CREATE:
-			#ifdef SystemLogMessage
-			DEBUG_INFO("LWS_CALLBACK_WSI_CREATE\n");
-			#endif
-			break;
-		case LWS_CALLBACK_GET_THREAD_ID:
-			//#ifdef SystemLogMessage
-			//DEBUG_INFO("LWS_CALLBACK_GET_THREAD_ID\n");
-			//#endif
-			break;
-		case LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER:
-			#ifdef SystemLogMessage
-			DEBUG_INFO("LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER\n");
-			#endif
-			break;
-		case LWS_CALLBACK_CLIENT_ESTABLISHED://3
-			#ifdef SystemLogMessage
-			DEBUG_INFO("LWS_CALLBACK_CLIENT_ESTABLISHED\n");
-			#endif
-			//connected
-			ConnectionEstablished=1;
-			break;
-		case LWS_CALLBACK_CLIENT_CONNECTION_ERROR://1
-			#ifdef Debug
-			DEBUG_ERROR("LWS_CALLBACK_CLIENT_CONNECTION_ERROR:%s\n",in);
-			#endif
-			#ifdef SystemLogMessage
-			DEBUG_ERROR("LWS_CALLBACK_CLIENT_CONNECTION_ERROR\n");
-			#endif
-			//disconnected
-			ConnectionEstablished=0;
-			break;
-		case LWS_CALLBACK_CLOSED://4
-			#ifdef SystemLogMessage
-			DEBUG_INFO("LWS_CALLBACK_CLOSED\n");
-			ConnectionEstablished=0;
-			#endif
-			//disconnected
-
-			break;
-		case LWS_CALLBACK_CLIENT_WRITEABLE://10
-			//if(need to send message and its relevant data already store into SendBuffer)
-			#ifdef SystemLogMessage
-			DEBUG_INFO("LWS_CALLBACK_CLIENT_WRITEABLE\n");
-			#endif
-			SendData(wsi);
-			break;
-		case LWS_CALLBACK_CLIENT_RECEIVE://8
-			((char *)in)[len] = '\0';
-			#ifdef SystemLogMessage
-			DEBUG_INFO("LWS_CALLBACK_CLIENT_RECEIVE, RX length: %d\n", (int)len);
-			//DEBUG_INFO("Message: %s\n", (char *)in);
-			#endif
-
-			ReceivedMessage(in, len);
-
-			break;
-		default:
-			#ifdef Debug
-			DEBUG_INFO("OCPP16Callback:reason=%d\n", reason);
-			#endif
-			break;
-	}
-
-
-	return 0;
-}
-
-static struct lws_protocols protocols[] = {
-
-	{
-		"ocpp1.6",
-		OCPP16Callback,
-		10240,
-		10240,
-	},
-	{
-		"ocpp1.6",
-		OCPP16Callback,
-		10240,
-		10240,
-	},
-	{
-		NULL, NULL, 0		/* End of list */
-	}
-};
-
-
-int ConnectWsServer()
-{
-	int result = PASS;
-	struct lws_context_creation_info ContextInfo;
-	struct lws_client_connect_info ConnInfo;
-	int use_ssl=0;
-
-	//lws_set_log_level(LLL_PARSER | LLL_HEADER, NULL);
-
-	if(context!=NULL)
-		lws_context_destroy(context);
-
-	memset(&ContextInfo, 0, sizeof(struct lws_context_creation_info));
-	ContextInfo.port = CONTEXT_PORT_NO_LISTEN;
-	ContextInfo.iface = NULL;
-	ContextInfo.ssl_private_key_password = NULL;
-	ContextInfo.ssl_cert_filepath = NULL;
-	ContextInfo.ssl_private_key_filepath = NULL;
-	ContextInfo.ssl_ca_filepath = "/root/cacert.pem";
-	ContextInfo.ssl_cipher_list = NULL; //use default one
-	ContextInfo.gid = -1;
-	ContextInfo.uid = -1;
-	if(use_ssl)
-		ContextInfo.options |= LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;
-	ContextInfo.protocols = protocols;
-	ContextInfo.timeout_secs = 9999;//30;
-	//if(ping pong enabled)
-	ContextInfo.ws_ping_pong_interval = 30;//0 for none, else interval in seconds
-	context = lws_create_context(&ContextInfo);
-	if (context == NULL)
-	{
-		#ifdef SystemLogMessage
-		DEBUG_ERROR("lws_create_context NG");
-		#endif
-		result = FAIL;
-	}
-
-	memset(&ConnInfo,0,sizeof(struct lws_client_connect_info));
-	// fill up below information
-	ConnInfo.context = context;
-	ConnInfo.address=(const char *)GetOcppServerURL();
-
-
-	ConnInfo.port = GetOcppPort();
-
-	ConnInfo.path=(const char *)GetOcppPath();
-	ConnInfo.host=lws_canonical_hostname(context);
-	ConnInfo.origin="origin";
-	ConnInfo.protocol = protocols[1].name;
-	ConnInfo.ietf_version_or_minus_one = -1;
-	if(use_ssl)
-		ConnInfo.ssl_connection = LCCSCF_USE_SSL | LCCSCF_ALLOW_SELFSIGNED | LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK;;
-
-	wsi_client = lws_client_connect_via_info(&ConnInfo);
-	if (!wsi_client)
-	{
-		#ifdef SystemLogMessage
-		DEBUG_ERROR("lws_client_connect_via_info NG");
-		#endif
-		result = FAIL;
-	}
-	printf("6-3\n");
-	return result;
-}
-
-
-
-void createq() {
-	front = rear = (pnode)malloc(sizeof(node));
-	//front->next = rear->next = NULL;
-	front = rear = NULL;
-}
-
-int showfront(char *uuid, char *data) {
-	pnode  p;
-	p = front;
-
-		if(p)
-		{
-			printf("\n uuid:%s", p->uuid);
-			printf("\n data:%s", p->data);
-		    	strcpy(uuid,p->uuid);
-		    	strcpy(data,p->data);
-		    	return 1;
-		}
-		else
-		{
-			printf("queue is null\n");
-			strcpy(uuid,"");
-			strcpy(data,"");
-			return 0;
-		}
-
-
-}
-
-int addq(char *uuid, char *data) {
-	pnode  p = (pnode )malloc(sizeof(node));
-
-		if(p)
-		{
-			strcpy(p->uuid, uuid);
-			strcpy(p->data, data);
-			p->next = NULL;
-			if(rear)
-			{
-				rear->next = p;
-				rear = p;
-			}
-			else
-			{
-				front = rear = p;
-			}
-		}
-		else
-		{
-			printf("?¡æ??–å?記憶體空?“新增è??™\n");
-		}
-		printf("addq\n");
-		return 0;
-}
-
-int delq() {
-	pnode  p;
-
-		if(front)
-		{
-			p = front;
-			if(front->next)
-				front = front->next;
-			else
-				front = rear = NULL;
-			printf("delete uuid: %s data: %s\n", p->uuid, p->data);
-			free(p);
-		}
-		else
-		{
-			printf("queue is Empty\n");
-			printf("\n delete: queue is null");
-		}
-
-		return 0;
-}
-
-int showqueue() {
-	pnode  p;
-	p = front;
-
-	while(p)
-	{
-		printf("uuid: %s data: %s\n", p->uuid, p->data);
-		p = p->next;
-	}
-	return 0;
-}
-
-int sentqueue(){
-	pnode  p;
-	p = front;
-
-	printf("sentqueue\n");
-	while(p)
-	{
-		printf("uuid: %s data: %s\n", p->uuid, p->data);
-		LWS_Send(p->data);
-		p = p->next;
-	}
-	printf("sentqueue end\n");
-	return 0;
-
-}
-
-int storequeue(){
-
-	//write queue to flash
-	unsigned int i,Chk;
-	unsigned char *ptr = NULL;
-	int fd,wrd;
-
-	// Save factory default setting value to flash backup setting block
-	fd = open("/Storage/OCPP/queue.txt", O_RDWR);
-	if (fd < 0)
-	{
-		#ifdef SystemLogMessage
-		DEBUG_ERROR("open /Storage/OCPP/queue.txt NG");
-		#endif
-		//free(ptr);
-		return 0;
-	}
-	wrd=write(fd, &front, sizeof(node));
-	close(fd);
-	if(wrd!=(sizeof(node)))
-	{
-			#ifdef SystemLogMessage
-			DEBUG_ERROR("write /Storage/OCPP/queue.txt NG");
-			#endif
-			//free(ptr);
-			return 0;
-	}
-
-	return 0;
-}
-
-//
-void* processTransactionQueue(void* data) {
-
-	while(1)
-	{
-		char *frontUUID =  (char *)malloc(sizeof(char)* 100);
-		char *frontData =  (char *)malloc(sizeof(char)*1024*4);
-
-		int queueNotEmpty = 0;
-		printf("show front\n");
-		queueNotEmpty = queue_operation(1,frontUUID, frontData);//showfront(frontUUID, frontData);    ---> remove temporally
-
-		//showfront();
-
-		printf("processTransactionQueue\n");
-		if(queueNotEmpty == 1)
-		{
-			printf("processTransactionQueue queue is not empty!\n");
-			sendbuffer = 1;
-
-
-
-		}
-
-		free(frontUUID);
-		free(frontData);
-
-		sleep(30);  // sleep for 30 seconds
-	}
-  pthread_exit(NULL); // ���}�l�����
-  return 0;
-}
-
-
-void CheckTransactionPacket(char *uuid)
-{
-	char *frontUUID =  (char *)malloc(sizeof(char)* 100);
-	char *frontData =  (char *)malloc(sizeof(char)*1024*4);
-	int queueNotEmpty = 0;
-	int cmpResult = 0;
-	printf("CheckTransactionPacket 0\n");
-	queue_operation(0,"","");//showqueue(); ---> remove temporally
-	queueNotEmpty = queue_operation(1,frontUUID, frontData);//showfront(frontUUID, frontData);  ---> remove temporally
-
-	printf("CheckTransactionPacket 1\n");
-	if(queueNotEmpty == 1)
-	{
-		cmpResult = strcmp(frontUUID, uuid);
-
-		if (cmpResult == 0)
-		{
-			printf("All right!\n");
-			queue_operation(2,"","");//delq(); ---> remove temporally
-		}
-
-	}
-
-	free(frontUUID);
-	free(frontData);
-
-}
-
-/* type: 0 (showqueue ); type: 1(showfront); type: 2(delq) type: 3 (sentqueue)  type: 4 (addq) type: 5(store queue to /Storage/OCPP/ )*/
-int queue_operation(int type, char *frontUUID, char *frontData)
-{
-
-
-	pthread_mutex_lock(&lock_sentData);
-	int result=0;
-	if(type == 0)
-			result = showqueue();
-	else if(type  == 1)
-			result = showfront(frontUUID, frontData);
-	else if(type == 2)
-			result = delq();
-	else if(type == 3)
-			result = sentqueue();
-	else if(type == 4)
-		   result = addq(frontUUID, frontData);
-	else if(type == 5)
-		  result = storequeue();
-	pthread_mutex_unlock(&lock_sentData);
-	return result;
-}
-
-char * strchr
-(const char *p, int ch)
-{
-    char c;
-
-    c = ch;
-    for (;; ++p) {
-        if (*p == c)
-            return ((char *)p);
-        if (*p == '\0')
-            return (NULL);
-    }
-    /* NOTREACHED */
-}
-
-#define SystemLogMessage
-//================================================
-// Main process
-//================================================
-int main(void)
-{
-	pthread_t t;
-	void *ret;
-
-	#ifdef SystemLogMessage
-	DEBUG_INFO("Initialization...\n");
-	#endif
-
-	if(ProcessShareMemory()== FAIL)
-	{
-		return FAIL;
-	}
-
-	if((SendBuffer=malloc(SendBufLen))==NULL)
-	{
-		#ifdef SystemLogMessage
-		DEBUG_ERROR("malloc(SendBufLen) NG");
-		#endif
-		sleep(5);
-		return FAIL;
-	}
-
-	printf("2\n");
-	//inital HandleRequest/HandleResponce/HandleError map table
-	tableHandleRequest = HashTableNew(3);
-	tableHandleresponse = HashTableNew(3);
-	tableHandleError = HashTableNew(3);
-	printf("3\n");
-	ClientCoreProfile(tableHandleRequest, tableHandleresponse);
-
-	//for uuid map table
-	hashMap = hashmap_new();
-	mapItem = malloc(sizeof(data_struct_t));
-	//create queue
-	createq();
-
-	//Create Process: Resend Transaction
-	pthread_create(&t, NULL, processTransactionQueue, NULL);
-
-	if(sqlite3_open("charger.db", &db))
-	{
-		fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
-		sqlite3_close( db );
-		exit(0);
-	}
-	else
-	{
-		fprintf(stderr, "Opened database successfully\n");
-	}
-
-	 /* 建ç? Table log buffer */
-	int rc =sqlite3_exec(db, createsql, 0, 0, &errMsg);
-	if (SQLITE_OK != rc)
-	{
-		printf("%s\n",errMsg);
-		return 0;
-	}
-	else
-	{
-		fprintf(stderr, "Opened log buffer table successfully\n");
-	}
-
-	 /* 建ç? Table OcppAuthCache */
-	rc =sqlite3_exec(db, sqlOcppAuthCache, 0, 0, &errMsg);
-	if (SQLITE_OK != rc)
-	{
-		printf("%s\n",errMsg);
-		return 0;
-	}
-	else
-	{
-		fprintf(stderr, "Opened OcppAuthCache table successfully\n");
-	}
-
-	 /* 建ç? Table OcppAuthLocal */
-	rc =sqlite3_exec(db, sqlOcppAuthLocal, 0, 0, &errMsg);
-	if (SQLITE_OK != rc)
-	{
-		printf("%s\n",errMsg);
-		return 0;
-	}
-	else
-	{
-		fprintf(stderr, "Opened OcppAuthLocal table successfully\n");
-	}
-
-	initialConfigurationTable();
-
-	for(;;)
-	{
-		while(ConnectionEstablished==0)
-		{
-			if((time((time_t*)NULL)-startTime.connect)>=60)
-			{
-				#ifdef Debug
-				DEBUG_INFO("Execute ConnectWsServer\n");
-				#endif
-				ConnectWsServer();
-				startTime.connect=time((time_t*)NULL);
-			}
-			lws_service(context, 10000);//timeout_ms
-		}
-
-		if(( (BootNotificationInterval != 0  && ((time((time_t*)NULL)-startTime.bootNotification)>=BootNotificationInterval) )  || ((time((time_t*)NULL)-				       startTime.bootNotification)>=defaultWaitingTime) ) && ((server_sign == FALSE)/*|| (server_pending == TRUE)*/))
-		{
-			
-			sendBootNotificationRequest();
-
-			startTime.bootNotification=time((time_t*)NULL);
-		}
-
-		if(server_sign == TRUE)
-		{
-			printf("sign in 1\n");
-			if(sendbuffer == 1)
-			{
-				queue_operation(3, "", "");
-				sendbuffer = 0;
-				queue_operation(5,"", "");
-			}
-				// Check System Value
-			CheckSystemValue();
-			printf("sign in 2\n");
-		}
-
-		lws_service(context, 100);//timeout_ms
-	}
-
-
-	pthread_join(t, NULL); 
-	HashTableFree(tableHandleRequest);
-	HashTableFree(tableHandleresponse);
-	HashTableFree(tableHandleError);
-	hashmap_free(hashMap);
-	free(SendBuffer);
-	return FAIL;
-}
-
-
+#include 	<sys/time.h>
+#include 	<sys/timeb.h>
+#include    <sys/types.h>
+#include    <sys/stat.h>
+#include 	<sys/ioctl.h>
+#include 	<sys/socket.h>
+#include 	<sys/ipc.h>
+#include 	<sys/shm.h>
+#include 	<sys/shm.h>
+#include 	<sys/mman.h>
+#include 	<linux/wireless.h>
+#include 	<linux/sockios.h>
+#include 	<linux/socket.h>
+#include 	<arpa/inet.h>
+#include 	<netinet/in.h>
+
+#include 	<unistd.h>
+#include 	<stdarg.h>
+#include    <stdio.h>      
+#include    <stdlib.h>     
+#include    <unistd.h>     
+#include    <fcntl.h>      
+#include    <termios.h>    
+#include    <errno.h>      
+#include 	<errno.h>
+#include 	<string.h>
+#include	<time.h>
+#include	<ctype.h>
+#include 	<ifaddrs.h>
+#include 	"libwebsockets.h"
+#include 	<lws_config.h>
+
+#include	"hashmap.h"
+
+#include    "SystemLogMessage.h"
+#include 	"ShareMemory.h"
+#include 	<pthread.h>
+#include    "MessageHandler.h"
+#include	"sqlite3.h"
+
+
+
+#if 0
+#define DEBUG_INFO(format, args...) StoreLogMsg("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
+#define DEBUG_WARN(format, args...) StoreLogMsg("[%s:%d][%s][Warn] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
+#define DEBUG_ERROR(format, args...) StoreLogMsg("[%s:%d][%s][Error] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
+#endif
+
+#define Debug
+//#define ARRAY_SIZE(A)		(sizeof(A) / sizeof(A[0]))
+#define PASS				1
+#define FAIL				-1
+
+typedef enum boolean { FALSE, TRUE } BOOL;
+
+struct lws 								*wsi_client;
+struct lws_context 						*context;
+static int sendbuffer = 0;
+extern int server_sign;
+//extern int server_pending;
+
+//extern struct OCPP16Data 				*ShmOCPP16Data;
+extern void CheckSystemValue(void);
+//extern int TransactionMessageAttemptsGet(void);
+extern int FirstHeartBeatResponse(void);
+extern void OCPP_get_TableAuthlocalAllData(void);
+
+pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
+pthread_mutex_t lock_sentData = PTHREAD_MUTEX_INITIALIZER;
+
+
+//struct json_object 			*parsed_json;
+
+//extern struct node Node;
+//==========================================
+// Function prototype
+//==========================================
+void trim(char *s);
+int mystrcmp(char *p1,char *p2);
+void substr(char *dest, const char* src, unsigned int start, unsigned int cnt);
+void getSubStr(char *dest, char* src, char *split, int idx);
+void split(char **arr, char *str, const char *del);
+int strpos(char *source, char *substr, int skip);
+int strposs(char *source, char *substr, int idx);
+char *random_uuid( char buf[37] );
+static int OCPP16Callback(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len);
+char * strchr(const char *p, int ch);
+void* processTransactionQueue(void* data);
+void ReceivedMessage(void *in, size_t len);
+
+struct StartTime
+{
+	unsigned int connect;
+	unsigned int bootNotification;
+}startTime;
+
+#if 0
+unsigned char *SendBuffer;
+int SendBufLen=(1024*4);//(1024*3);
+#endif
+int SendBufLen=(1024*4);//(1024*3);
+unsigned char SendBuffer[1024*4]={0};
+static int ConnectionEstablished=0;
+static int TransactionQueueInterval = 10;//3; // TransactionMessageAttempts
+static int TransactionQueueNum = 0;
+int defaultWaitingTime = 10; //10 second
+
+extern int BootNotificationInterval;
+//char guid[37];
+//map_t hashMap;
+//data_struct_t* mapItem; --- remove for temporally
+//data_struct_t mapItem[0]={0};
+sqlite3 *db;
+char *errMsg = NULL;
+
+static char *createsql = "CREATE TABLE IF NOT EXISTS log_buffer("
+              "idx integer primary key,"
+	          "user_id text,"
+	          "cmd_sn text,"
+	          "charger_id text,"
+	          "gun_type text,"
+	          "gun_no text,"
+	          "rfid_no text,"
+	          "stime text,"
+	          "etime text,"
+	          "time_len text,"
+	          "s_soc text,"
+	          "e_soc text,"
+	          "stop_reason text,"
+	          "power text,"
+	          "meter_before text,"
+	          "meter_after text,"
+	          "charge_price text,"
+	          "reserve text,"
+	          "surplus_before text,"
+	          "surplus_after text,"
+	          "service_price text,"
+	          "is_pay text,"
+	          "charge_strategy text,"
+	          "charge_parameter text,"
+	          "vin text,"
+	          "vehicle_no text,"
+	          "start_method text,"
+	          "card_type text,"
+	          "is_upload text,"
+	          "guid text UNIQUE,"
+	          "is_buf2OK text);";
+
+#if 0
+static char *createsChargingRecordsql = "CREATE TABLE IF NOT EXISTS ChargingRecord("
+              "idx integer primary key,"
+	          "gun_type text,"
+	          "connectorId text,"
+	          "idTag  text,"
+		      "transactionId  text,"
+	          "stime text,"
+	          "etime text,"
+	          "time_len text,"
+	          "s_soc text,"
+	          "e_soc text,"
+	          "stop_reason text,"
+	          "power text,"
+	          "meter_before text,"
+	          "meter_after text,"
+	          "reservationId  text,"
+	          "guid text UNIQUE);";
+	          //"is_buf2OK text);";
+
+#endif
+
+static char *sqlOcppAuthCache = "create table if not exists ocpp_auth_cache (idx integer primary key,"
+																"idtag text UNIQUE,"
+																"parent_idtag text,"
+																"expir_date text,"
+																"status text);";
+
+static char *sqlOcppAuthLocal = "create table if not exists ocpp_auth_local (idx integer primary key,"
+								"idtag text UNIQUE,"
+								"parent_idtag text,"
+								"expir_date text,"
+								"status text,"
+								"version text);";
+
+#if 0
+static char *sqlInitialOcppAuthLocal = "insert or replace into ocpp_auth_local(idtag, parent_idtag, expir_date, status, version) values('PaHdImHiOnNG','none','2099-12-31T23:59:59.999Z','Accepted','0')";
+#endif
+
+int DiffTimeb(struct timeb ST, struct timeb ET)
+{
+	//return milli-second
+	unsigned int StartTime,StopTime;
+
+	StartTime=(unsigned int)ST.time;
+	StopTime=(unsigned int)ET.time;
+	return (StopTime-StartTime)*1000+ET.millitm-ST.millitm;
+}
+
+//=================================
+// Common routine
+//=================================
+void trim(char *s)
+{
+    int i=0, j, k, l=0;
+
+    while((s[i]==' ')||(s[i]=='\t')||(s[i]=='\n'))
+        i++;
+
+    j = strlen(s)-1;
+    while((s[j]==' ')||(s[j]=='\t')||(s[j]=='\n'))
+        j--;
+
+    if(i==0 && j==strlen(s)-1) { }
+    else if(i==0) s[j+1] = '\0';
+    else {
+        for(k=i; k<=j; k++) s[l++] = s[k];
+        s[l] = '\0';
+    }
+}
+
+int mystrcmp(char *p1,char *p2)
+{
+    while(*p1==*p2)
+    {
+        if(*p1=='\0' || *p2=='\0')
+            break;
+        p1++;
+        p2++;
+    }
+    if(*p1=='\0' && *p2=='\0')
+        return(PASS);
+    else
+        return(FAIL);
+}
+
+void substr(char *dest, const char* src, unsigned int start, unsigned int cnt)
+{
+	strncpy(dest, src + start, cnt);
+	dest[cnt] = 0;
+}
+
+void getSubStr(char *dest, char* src, char *split, int idx)
+{
+
+	int start = (strposs(src,",",idx)+1);
+	int cnt = (strposs(src,",",idx+1)-2)-(strposs(src,",",idx)+1);
+
+	strncpy(dest, src + start, cnt);
+	dest[cnt] = 0;
+}
+
+void split(char **arr, char *str, const char *del)
+{
+	char *s = strtok(str, del);
+
+	while(s != NULL)
+	{
+		*arr++ = s;
+		s = strtok(NULL, del);
+	}
+}
+
+int strpos(char *source, char *substr, int skip)
+{
+   char stack[strlen(source)];
+   strncpy(stack, source+skip, strlen(source)-skip);
+   char *p = strstr(stack, substr);
+   if (p)
+      return p - stack+skip;
+   return -1;
+}
+
+int strposs(char *source, char *substr, int idx)
+{
+   char stack[strlen(source)];
+   int result=0;
+   int count=0;
+
+   while(count<=idx)
+   {
+	   memset(stack,0,sizeof stack);
+	   strncpy(stack, source+result, strlen(source)-result);
+
+	   int loc = strcspn(stack, substr);
+
+	   if(loc>0)
+		   result += (loc+1);
+	   else
+		   result = -1;
+
+	   count++;
+   }
+
+   return result;
+}
+
+char *random_uuid( char buf[37] )
+{
+    const char *c = "89ab";
+    char *p = buf;
+    int n;
+    for( n = 0; n < 16; ++n )
+    {
+        int b = rand()%255;
+        switch( n )
+        {
+            case 6:
+                sprintf(p, "4%x", b%15 );
+            break;
+            case 8:
+                sprintf(p, "%c%x", c[rand()%strlen(c)], b%15 );
+            break;
+            default:
+                sprintf(p, "%02x", b);
+            break;
+        }
+
+        p += 2;
+        switch( n )
+        {
+            case 3:
+            case 5:
+            case 7:
+            case 9:
+                *p++ = '-';
+                break;
+        }
+    }
+    *p = 0;
+    return buf;
+}
+
+
+//==========================================
+// Web socket tranceive routine
+//==========================================
+int SendData(struct lws *wsi)
+{
+
+    int n;
+    int len;
+
+    unsigned char out[LWS_SEND_BUFFER_PRE_PADDING + 4096 + LWS_SEND_BUFFER_POST_PADDING] = {0};
+
+    len = strlen((char *)SendBuffer);
+
+    if(len == 0)
+    return 0;
+
+    memcpy (out + LWS_SEND_BUFFER_PRE_PADDING, SendBuffer, len );
+
+    DEBUG_INFO("out + LWS_SEND_BUFFER_PRE_PADDING = %s\n", out + LWS_SEND_BUFFER_PRE_PADDING);
+    n = lws_write(wsi, out + LWS_SEND_BUFFER_PRE_PADDING, len, LWS_WRITE_TEXT);
+
+    memset(SendBuffer, 0, len);
+    return n;
+}
+
+static int OCPP16Callback(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len)
+{
+	switch (reason)
+	{
+		case LWS_CALLBACK_PROTOCOL_INIT:
+			#ifdef SystemLogMessage
+			DEBUG_INFO("LWS_CALLBACK_PROTOCOL_INIT\n");
+			#endif
+
+			break;
+		case LWS_CALLBACK_CLIENT_FILTER_PRE_ESTABLISH:
+			#ifdef SystemLogMessage
+			DEBUG_INFO("LWS_CALLBACK_CLIENT_FILTER_PRE_ESTABLISH\n");
+			#endif
+			break;
+		case LWS_CALLBACK_CLOSED_CLIENT_HTTP:
+			#ifdef SystemLogMessage
+			DEBUG_INFO("LWS_CALLBACK_CLOSED_CLIENT_HTTP\n");
+			#endif
+			break;
+		case LWS_CALLBACK_WSI_DESTROY:
+			#ifdef SystemLogMessage
+			DEBUG_INFO("LWS_CALLBACK_WSI_DESTROY\n");
+			#endif
+			server_sign = FALSE;
+			break;
+		case LWS_CALLBACK_LOCK_POLL:
+			#ifdef SystemLogMessage
+			//DEBUG_INFO("LWS_CALLBACK_LOCK_POLL\n");
+			#endif
+			break;
+		case LWS_CALLBACK_ADD_POLL_FD:
+			#ifdef SystemLogMessage
+			DEBUG_INFO("LWS_CALLBACK_ADD_POLL_FD\n");
+			#endif
+			break;
+		case LWS_CALLBACK_DEL_POLL_FD:
+			#ifdef SystemLogMessage
+			DEBUG_INFO("LWS_CALLBACK_DEL_POLL_FD\n");
+			#endif
+			break;
+		case LWS_CALLBACK_UNLOCK_POLL:
+			#ifdef SystemLogMessage
+			//DEBUG_INFO("LWS_CALLBACK_UNLOCK_POLL\n");
+			#endif
+			break;
+		case LWS_CALLBACK_CHANGE_MODE_POLL_FD:
+			#ifdef SystemLogMessage
+			//DEBUG_INFO("LWS_CALLBACK_CHANGE_MODE_POLL_FD\n");
+			#endif
+			break;
+		case LWS_CALLBACK_WSI_CREATE:
+			#ifdef SystemLogMessage
+			DEBUG_INFO("LWS_CALLBACK_WSI_CREATE\n");
+			#endif
+			break;
+		case LWS_CALLBACK_GET_THREAD_ID:
+			//#ifdef SystemLogMessage
+			//DEBUG_INFO("LWS_CALLBACK_GET_THREAD_ID\n");
+			//#endif
+			break;
+		case LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER:
+			#ifdef SystemLogMessage
+			DEBUG_INFO("LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER\n");
+			#endif
+			break;
+		case LWS_CALLBACK_CLIENT_ESTABLISHED://3
+			#ifdef SystemLogMessage
+			DEBUG_INFO("LWS_CALLBACK_CLIENT_ESTABLISHED\n");
+			#endif
+			//connected
+			ConnectionEstablished=1;
+			break;
+		case LWS_CALLBACK_CLIENT_CONNECTION_ERROR://1
+			#ifdef Debug
+			DEBUG_ERROR("LWS_CALLBACK_CLIENT_CONNECTION_ERROR:%s\n",in);
+			#endif
+			#ifdef SystemLogMessage
+			DEBUG_ERROR("LWS_CALLBACK_CLIENT_CONNECTION_ERROR\n");
+			#endif
+			//disconnected
+			ConnectionEstablished=0;
+			break;
+		case LWS_CALLBACK_CLOSED://4
+			#ifdef SystemLogMessage
+			DEBUG_INFO("LWS_CALLBACK_CLOSED\n");
+			ConnectionEstablished=0;
+			#endif
+			//disconnected
+
+			break;
+		case LWS_CALLBACK_CLIENT_WRITEABLE://10
+			//if(need to send message and its relevant data already store into SendBuffer)
+			#ifdef SystemLogMessage
+			DEBUG_INFO("LWS_CALLBACK_CLIENT_WRITEABLE\n");
+			#endif
+			SendData(wsi);
+			break;
+		case LWS_CALLBACK_CLIENT_RECEIVE://8
+			((char *)in)[len] = '\0';
+			#ifdef SystemLogMessage
+			DEBUG_INFO("LWS_CALLBACK_CLIENT_RECEIVE, RX length: %d\n", (int)len);
+			//DEBUG_INFO("Message: %s\n", (char *)in);
+			#endif
+
+			ReceivedMessage(in, len);
+
+			break;
+		default:
+			#ifdef Debug
+			DEBUG_INFO("OCPP16Callback:reason=%d\n", reason);
+			#endif
+			break;
+	}
+
+
+	return 0;
+}
+
+static struct lws_protocols protocols[] = {
+
+	{
+		"ocpp1.6",
+		OCPP16Callback,
+		10240,
+		10240,
+	},
+	{
+		"ocpp1.6",
+		OCPP16Callback,
+		10240,
+		10240,
+	},
+	{
+		NULL, NULL, 0		// End of list 
+	}
+};
+
+
+int ConnectWsServer()
+{
+	int result = PASS;
+	struct lws_context_creation_info ContextInfo;
+	struct lws_client_connect_info ConnInfo;
+	int use_ssl=0;
+
+	//lws_set_log_level(LLL_PARSER | LLL_HEADER, NULL);
+
+	if(context!=NULL)
+		lws_context_destroy(context);
+
+	memset(&ContextInfo, 0, sizeof(struct lws_context_creation_info));
+	ContextInfo.port = CONTEXT_PORT_NO_LISTEN;
+	ContextInfo.iface = NULL;
+	ContextInfo.ssl_private_key_password = NULL;
+	ContextInfo.ssl_cert_filepath = NULL;
+	ContextInfo.ssl_private_key_filepath = NULL;
+	ContextInfo.ssl_ca_filepath = "/root/cacert.pem";
+	ContextInfo.ssl_cipher_list = NULL; //use default one
+	ContextInfo.gid = -1;
+	ContextInfo.uid = -1;
+	if(use_ssl)
+		ContextInfo.options |= LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;
+	ContextInfo.protocols = protocols;
+	ContextInfo.timeout_secs = 9999;//30;
+	//if(ping pong enabled)
+	ContextInfo.ws_ping_pong_interval = 30;//0 for none, else interval in seconds
+	context = lws_create_context(&ContextInfo);
+	if (context == NULL)
+	{
+		#ifdef SystemLogMessage
+		DEBUG_ERROR("lws_create_context NG");
+		#endif
+		result = FAIL;
+	}
+
+	memset(&ConnInfo,0,sizeof(struct lws_client_connect_info));
+	// fill up below information
+	ConnInfo.context = context;
+	ConnInfo.address=(const char *)GetOcppServerURL();//"172.17.40.13";//"192.168.137.1";//"192.168.201.202";//"172.1.0.109";//"172.17.40.13";//"192.168.201.202";//"192.168.10.125";
+
+
+	ConnInfo.port = GetOcppPort();//2012;//8080;
+
+	ConnInfo.path=(const char *)GetOcppPath();//"/ocpp/RDTEST103";//"/ocpp/OCTT_1";//"/RDTEST103";//"/0591201511030003";//"/RDTEST103";
+	ConnInfo.host=lws_canonical_hostname(context);
+	ConnInfo.origin="origin";
+	ConnInfo.protocol = protocols[1].name;
+	ConnInfo.ietf_version_or_minus_one = -1;
+	if(use_ssl)
+		ConnInfo.ssl_connection = LCCSCF_USE_SSL | LCCSCF_ALLOW_SELFSIGNED | LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK;;
+
+	wsi_client = lws_client_connect_via_info(&ConnInfo);
+	if (!wsi_client)
+	{
+		#ifdef SystemLogMessage
+		DEBUG_ERROR("lws_client_connect_via_info NG");
+		#endif
+		result = FAIL;
+	}
+
+	return result;
+}
+
+#if 0
+struct _node {
+	char uuid[37];
+	char data[2000];
+	struct _node *next;//struct node *next;
+}node;
+typedef struct _node  *pnode;
+
+struct _node staticNodeArray[100]={0};
+#endif
+
+//void createq();
+int showfront(char *uuid, char *data);
+int addq(char *uuid, char *data) ;
+int delq();
+int sentqueue();
+#if 0
+int storequeue();
+int readfiletoqueue();
+#endif
+void CheckTransactionPacket(char *uuid);
+int queue_operation(int type, char *frontUUID, char *frontData);
+
+#if 0
+pnode  front, rear;
+
+void createq() {
+	//front = rear = (pnode)malloc(sizeof(node)); --- remove temporally
+	//front->next = rear->next = NULL;
+	front = rear = NULL;
+}
+#endif
+
+int showfront(char *uuid, char *data) {
+
+FILE *fp;
+int result = FALSE; // 1: TRUE  0:FALSE
+char str[1200]={0};
+char sstr[50]={ 0 };//sstr[200]={ 0 };
+int c = 0;
+char *loc;
+char rmFileCmd[100]={0};
+struct stat stats;
+
+stat("../Storage/OCPP", &stats);
+
+// Check for directory existence
+if (S_ISDIR(stats.st_mode) == 1)
+{
+	DEBUG_INFO("\n OCPP directory exist \n");
+}
+else
+{
+	DEBUG_INFO("\n OCPP directory not exist, create dir \n");
+	sprintf(rmFileCmd,"mkdir -p %s","../Storage/OCPP");
+	system(rmFileCmd);
+}
+
+memset(&rmFileCmd, 0, sizeof rmFileCmd);
+
+if((access("../Storage/OCPP/TransactionRelatedQueue",F_OK))!=-1)
+{
+	DEBUG_INFO("TransactionRelatedQueue exist.\n");
+}
+else
+{
+	DEBUG_INFO("TransactionRelatedQueue not exist\n");
+	FILE *log = fopen("../Storage/OCPP/TransactionRelatedQueue", "w+");
+
+	if(log == NULL)
+	{
+		DEBUG_INFO("Can't Create File TransactionRelatedQueue \n");
+		return 0;
+	}
+	else
+	{
+		fclose(log);
+	}
+}
+
+
+//opening file for reading 
+fp = fopen("../Storage/OCPP/TransactionRelatedQueue" , "r");
+if(fp == NULL) {
+	DEBUG_INFO("Error opening TransactionRelatedQueue file");
+	return FALSE;
+}
+printf("test\n");
+if( fgets (str, 1200, fp)!=NULL ) {
+	/* writing content to stdout */
+
+	if (str[0] == '\n')
+	{
+		DEBUG_INFO("It is a blank line");
+		fclose(fp);
+		memset(&rmFileCmd, 0, sizeof rmFileCmd);
+		sprintf(rmFileCmd,"rm -f %s","../Storage/OCPP/TransactionRelatedQueue");
+		system(rmFileCmd);
+		result = FALSE;
+
+		return result;
+	}
+	else
+	{
+		 puts(str);
+		 /*********************uuid***************/
+		 loc = strstr(str, "\"");
+		 memset(sstr ,0, sizeof(sstr) );
+		 c = 0;
+		while (loc[1+c] != '\"')
+		{
+			sstr[c] = loc[1+c];
+			c++;
+		}
+		sstr[c] = '\0';
+
+		DEBUG_INFO("\n uuid:%s", sstr);
+		DEBUG_INFO("\n data:%s", str);
+		strcpy(uuid,sstr);
+		strcpy(data,str);
+		result = TRUE;
+	}
+
+	//return 1;
+}
+else
+{
+	DEBUG_INFO("queue is null\n");
+	strcpy(uuid,"");
+	strcpy(data,"");
+	result = FALSE;
+	//return 0;
+}
+fclose(fp);
+return result;
+
+#if 0
+	pnode  p;
+	p = front;
+
+		if(p)
+		{
+			//printf("姓å? %s ?»è©± %s\n", p->name, p->phone);
+			printf("\n uuid:%s", p->uuid);
+			printf("\n data:%s", p->data);
+		    strcpy(uuid,p->uuid);
+		    strcpy(data,p->data);
+		    return 1;
+		}
+		else
+		{
+			printf("queue is null\n");
+			strcpy(uuid,"");
+			strcpy(data,"");
+			return 0;
+		}
+#endif
+
+}
+
+int addq(char *uuid, char *data) {
+FILE *outfile;
+char rmFileCmd[100]={0};
+struct stat stats;
+stat("../Storage/OCPP", &stats);
+DEBUG_INFO("addq\n");
+// Check for directory existence
+if (S_ISDIR(stats.st_mode) == 1)
+{
+	DEBUG_INFO("\n OCPP directory exist \n");
+}
+else
+{
+	DEBUG_INFO("\n OCPP directory not exist, create dir \n");
+	sprintf(rmFileCmd,"mkdir -p %s","../Storage/OCPP");
+	system(rmFileCmd);
+}
+
+memset(&rmFileCmd, 0, sizeof rmFileCmd);
+
+if((access("../Storage/OCPP/TransactionRelatedQueue",F_OK))!=-1)
+{
+	DEBUG_INFO("TransactionRelatedQueue exist.\n");
+}
+else
+{
+	DEBUG_INFO("TransactionRelatedQueue not exist\n");
+	FILE *log = fopen("../Storage/OCPP/TransactionRelatedQueue", "w+");
+
+	if(log == NULL)
+	{
+		DEBUG_INFO("Can't Create File TransactionRelatedQueue \n");
+		return 0;
+	}
+	else
+	{
+		fclose(log);
+	}
+}
+
+// open file for writing
+outfile = fopen ("../Storage/OCPP/TransactionRelatedQueue", "a");
+DEBUG_INFO("data=%s\n",data);
+fputs(data, outfile);
+fputs("\n", outfile);
+fclose (outfile);
+TransactionQueueNum = TransactionQueueNum + 1;
+return 0;
+
+#if 0
+	//pnode  p = (pnode )malloc(sizeof(node));   --- remove temporally
+	int nodeCurrentFreeIndex =0;
+	for (int i = 0; i < 100; i++)  // Worst case 100+1
+	   if (staticNodeArray[i].uuid[0] == 0)  // Worst case 100
+		   nodeCurrentFreeIndex = i;
+
+	pnode  p = &staticNodeArray[nodeCurrentFreeIndex];
+	memset(p, 0, sizeof(node));
+
+		if(p)
+		{
+			strcpy(p->uuid, uuid);
+			strcpy(p->data, data);
+			//printf("請輸?¥å???");
+			//scanf("%s", p->name);
+			//printf("請輸?¥é›»è©?");
+			//scanf("%s", p->phone);
+			p->next = NULL;
+			if(rear)
+			{
+				rear->next = p;
+				rear = p;
+			}
+			else
+			{
+				front = rear = p;
+			}
+		}
+		else
+		{
+			printf("?¡æ??–å?記憶體空?“新增è??™\n");
+		}
+#endif
+
+
+}
+
+int delq() {
+char tempfile[] = "../Storage/OCPP/temp.json";
+FILE *infile;
+FILE *outfile;
+int  resultRename=0;
+char filename[60]={0};
+char rmFileCmd[100]={0};
+struct stat stats;
+stat("../Storage/OCPP", &stats);
+
+// Check for directory existence
+if (S_ISDIR(stats.st_mode) == 1)
+{
+	DEBUG_INFO("\n OCPP directory exist \n");
+}
+else
+{
+	DEBUG_INFO("\n OCPP directory not exist, create dir \n");
+	sprintf(rmFileCmd,"mkdir -p %s","../Storage/OCPP");
+	system(rmFileCmd);
+}
+
+memset(&rmFileCmd, 0, sizeof rmFileCmd);
+
+if((access("../Storage/OCPP/TransactionRelatedQueue",F_OK))!=-1)
+{
+	DEBUG_INFO("TransactionRelatedQueue exist.\n");
+}
+else
+{
+	DEBUG_INFO("TransactionRelatedQueue not exist\n");
+	FILE *log = fopen("../Storage/OCPP/TransactionRelatedQueue", "w+");
+
+	if(log == NULL)
+	{
+		DEBUG_INFO("log is NULL\n");
+		return 0;
+	}
+	else
+	{
+		fclose(log);
+	}
+}
+
+// open file for writing
+strcpy(filename, "../Storage/OCPP/TransactionRelatedQueue");
+infile = fopen ("../Storage/OCPP/TransactionRelatedQueue", "r");
+outfile = fopen (tempfile, "w");
+
+//DEBUG_INFO("feof(infile) =%d\n",feof(infile));
+int c;
+c = fgetc(infile);
+//printf("file c:%d\n",c);
+rewind(infile);
+
+if(c == EOF)
+{
+	DEBUG_INFO("TransactionRelatedQueue is  NULL\n");
+
+	fclose(infile);
+	fclose(outfile);
+
+	sprintf(rmFileCmd,"rm -f %s",tempfile);
+	system(rmFileCmd);
+}
+else
+{
+	char buf[1200]={0};
+
+	int i = 0;
+	//DEBUG_INFO("Orignal File is not NULL\n");
+	while (fgets(buf, sizeof(buf), infile) != NULL)
+	{
+		//printf("Orignal File get strings \n");
+		buf[strlen(buf) - 1] = '\0'; // eat the newline fgets() stores
+
+		if(i==0)
+		{
+			TransactionQueueNum = TransactionQueueNum - 1;
+		}
+
+		if(i != 0)
+			fprintf(outfile,"%s\n", buf);
+
+		i = i + 1;
+	}
+
+	fclose(infile);
+	fclose(outfile);
+
+	sprintf(rmFileCmd,"rm -f %s",filename);
+	system(rmFileCmd);
+
+	resultRename = rename(tempfile, filename);
+
+	if(resultRename == 0)
+	{
+		DEBUG_INFO("TransactionRelatedQueue file renamed successfully");
+	}
+	else
+	{
+		DEBUG_INFO("Error: unable to rename the TransactionRelatedQueue file");
+	}
+}
+
+return 0;
+
+#if 0
+	pnode  p;
+
+	if(front)
+	{
+		p = front;
+		if(front->next)
+			front = front->next;
+		else
+			front = rear = NULL;
+		printf("delete uuid: %s data: %s\n", p->uuid, p->data);
+			//free(p);   --- remove temporally
+
+			//new
+		memset(p, 0, sizeof(node));
+		p=NULL;
+
+	}
+	else
+	{
+		printf("queue is Empty\n");
+		printf("\n delete: queue is null");
+	}
+
+	return 0;
+#endif
+}
+
+int showqueue() {
+char rmFileCmd[100]={0};
+struct stat stats;
+stat("../Storage/OCPP", &stats);
+
+// Check for directory existence
+if (S_ISDIR(stats.st_mode) == 1)
+{
+	DEBUG_INFO("\n OCPP directory exist \n");
+}
+else
+{
+	DEBUG_INFO("\n OCPP directory not exist, create dir \n");
+	sprintf(rmFileCmd,"mkdir -p %s","../Storage/OCPP");
+	system(rmFileCmd);
+}
+
+memset(&rmFileCmd, 0, sizeof rmFileCmd);
+
+if((access("../Storage/OCPP/TransactionRelatedQueue",F_OK))!=-1)
+{
+	DEBUG_INFO("TransactionRelatedQueue exist.\n");
+}
+else
+{
+	DEBUG_INFO("TransactionRelatedQueue not exist\n");
+	FILE *log = fopen("../Storage/OCPP/TransactionRelatedQueue", "w+");
+
+	if(log == NULL)
+	{
+		DEBUG_INFO("log is NULL\n");
+		return 0;
+	}
+	else
+	{
+		fclose(log);
+	}
+}
+
+FILE *fp = fopen("../Storage/OCPP/TransactionRelatedQueue", "r");
+char line[1200]={0};
+// check if file exist (and you can open it) or not
+if (fp == NULL) {
+	DEBUG_INFO("can open file TransactionRelatedQueue!");
+  return 0;
+}
+
+while(fgets(line, sizeof line, fp) != NULL) {
+	DEBUG_INFO("%s\n", line);
+}
+
+fclose(fp);
+return 0;
+#if 0
+	pnode  p;
+	p = front;
+
+	while(p)
+	{
+		printf("uuid: %s data: %s\n", p->uuid, p->data);
+		p = p->next;
+	}
+
+	return 0;
+#endif
+}
+
+int sentqueue()
+{
+FILE *fp;
+int result = FALSE; // 1: TRUE  0:FALSE
+char str[1200]={0};
+char rmFileCmd[100]={0};
+struct stat stats;
+
+DEBUG_INFO("sentqueue\n");
+stat("../Storage/OCPP", &stats);
+
+// Check for directory existence
+ if(S_ISDIR(stats.st_mode) == 1)
+ {
+    DEBUG_INFO("\n OCPP directory exist \n");
+ }
+ else
+ {
+    DEBUG_INFO("\n OCPP directory not exist, create dir \n");
+    sprintf(rmFileCmd,"mkdir -p %s","../Storage/OCPP");
+    system(rmFileCmd);
+  }
+
+  memset(&rmFileCmd, 0, sizeof rmFileCmd);
+
+// opening file for reading 
+fp = fopen("../Storage/OCPP/TransactionRelatedQueue" , "r");
+if(fp == NULL) {
+	DEBUG_INFO("Error opening file");
+	return FALSE;
+}
+
+if( fgets (str, 1200, fp)!=NULL ) {
+	//writing content to stdout 
+	//puts(str);
+	DEBUG_INFO("\n uuid:%s", "");
+	DEBUG_INFO("\n data:%s", str);
+	LWS_Send(str);
+	result = TRUE;
+	//return 1;
+}
+else
+{
+	DEBUG_INFO("queue is null\n");
+
+	result = FALSE;
+	//return 0;
+}
+fclose(fp);
+DEBUG_INFO("sentqueue end\n");
+return result;
+
+
+#if 0
+	pnode  p;
+	p = front;
+
+	printf("sentqueue\n");
+	while(p)
+	{
+		printf("uuid: %s data: %s\n", p->uuid, p->data);
+		LWS_Send(p->data);
+		p = p->next;
+	}
+	printf("sentqueue end\n");
+	return 0;
+#endif
+}
+
+#if 0
+int storequeue(){
+
+	//write queue to flash
+	unsigned int i,Chk;
+	unsigned char *ptr = NULL;
+	int fd,wrd;
+
+	// Save factory default setting value to flash backup setting block
+	fd = open("./Storage/OCPP/queue.txt", O_RDWR);
+	if (fd < 0)
+	{
+		#ifdef SystemLogMessage
+		DEBUG_ERROR("open ./Storage/OCPP/queue.txt NG");
+		#endif
+		//free(ptr);
+		return 0;
+	}
+	wrd=write(fd, &front, sizeof(node));
+
+	if(wrd!=(sizeof(node)))
+	{
+			#ifdef SystemLogMessage
+			DEBUG_ERROR("write ./Storage/OCPP/queue.txt NG");
+			#endif
+			//free(ptr);
+			return 0;
+	}
+	close(fd);
+	close(wrd);
+
+	return 0;
+}
+
+int readfiletoqueue(){
+	 FILE *infile;
+	 //pnode  p = (pnode )malloc(sizeof(node));
+
+	 struct _node Pnode;
+	 memset(&Pnode, 0, sizeof(node));
+	 // Open person.dat for reading
+	 infile = fopen ("./Storage/OCPP/queue.txt", "r");
+	 if (infile == NULL)
+	 {
+		 fprintf(stderr, "\nError opening file\n");
+	     exit (1);
+	 }
+
+	 // read file contents till end of file
+	 while(fread(&Pnode, sizeof(node), 1, infile))
+	 printf ("uuid = %s name = %s\n", Pnode.uuid,
+			 Pnode.data);
+
+	 // close file
+	 fclose (infile);
+	// free(p);
+
+	 return 0;
+}
+#endif
+
+//
+void* processTransactionQueue(void* data) {
+	char frontUUID[100] ={0};
+	char frontData[1200] ={0};
+	int queueNotEmpty = 0;
+
+	while(1)
+	{
+		if(FirstHeartBeatResponse() == 1)
+		{
+			memset(frontUUID, 0, sizeof(frontUUID));
+			memset(frontData, 0, sizeof(frontData));
+			queueNotEmpty = 0;
+
+			queueNotEmpty = queue_operation(1,frontUUID, frontData);//showfront(frontUUID, frontData);    ---> remove temporally
+
+			//showfront();
+
+
+			if(queueNotEmpty == 1)
+			{
+				DEBUG_INFO("processTransactionQueue queue is not empty!\n");
+				sendbuffer = 1;
+			}
+
+			if(TransactionQueueNum != 0)
+			{
+				TransactionQueueInterval = 1;
+			}
+			else
+			{
+				TransactionQueueInterval = 10;
+			}
+			//TransactionQueueInterval =  TransactionMessageAttemptsGet();
+			sleep(TransactionQueueInterval);  // sleep for 30 seconds
+		}
+
+	}
+  pthread_exit(NULL); // ���}�l�����
+  return 0;
+}
+
+
+void CheckTransactionPacket(char *uuid)
+{
+	char frontUUID[100]={0};
+	char frontData[1200]={0};
+	int queueNotEmpty = 0;
+	int cmpResult = 0;
+
+	queue_operation(0,"","");//showqueue(); ---> remove temporally
+	queueNotEmpty = queue_operation(1,frontUUID, frontData);//showfront(frontUUID, frontData);  ---> remove temporally
+
+	if(queueNotEmpty == 1)
+	{
+		cmpResult = strcmp(frontUUID, uuid);
+		//cmpResult = strcmp(frontData, uuid);
+
+		if (cmpResult == 0)
+		{
+			DEBUG_INFO("TransactionPacket Compare All right!\n");
+			queue_operation(2,"","");//delq(); ---> remove temporally
+		}
+
+	}
+
+}
+
+/* type: 0 (showqueue ); type: 1(showfront); type: 2(delq) type: 3 (sentqueue)  type: 4 (addq) type: 5(store queue to /Storage/OCPP/ )*/
+int queue_operation(int type, char *frontUUID, char *frontData)
+{
+
+	pthread_mutex_unlock(&lock_sentData);
+	pthread_mutex_lock(&lock_sentData);
+	int result=0;
+	if(type == 0)   				// show items in queue
+			result = showqueue();
+	else if(type  == 1)   			// show first item
+			result = showfront(frontUUID, frontData);
+	else if(type == 2)   			// delete item
+			result = delq();
+	else if(type == 3)          	// sent items in queue
+			result = sentqueue();
+	else if(type == 4)         		// add items to the queue
+		   result = addq(frontUUID, frontData);
+
+	pthread_mutex_unlock(&lock_sentData);
+
+	return result;
+}
+
+char * strchr(const char *p, int ch)
+{
+    char c;
+
+    c = ch;
+    for (;; ++p) {
+        if (*p == c)
+            return ((char *)p);
+        if (*p == '\0')
+            return (NULL);
+    }
+    /* NOTREACHED */
+    return NULL;
+}
+
+int removeMessageSentFile(void)
+{
+char rmFileCmd[100]={0};
+struct stat stats;
+
+//
+stat("../Storage/OCPP", &stats);
+// Check for directory existence
+if (S_ISDIR(stats.st_mode) == 1)
+{
+	DEBUG_INFO("\n OCPP directory exist \n");
+}
+else
+{
+	DEBUG_INFO("\n directory not exist, create dir \n");
+	sprintf(rmFileCmd,"mkdir -p %s","../Storage/OCPP");
+	system(rmFileCmd);
+}
+
+memset(&rmFileCmd, 0, sizeof rmFileCmd);
+
+if((access("../Storage/OCPP/MessageSent",F_OK))!=-1)
+{
+	DEBUG_INFO("MessageSent file exist.\n");
+	sprintf(rmFileCmd,"rm -f %s","../Storage/OCPP/MessageSent");
+	system(rmFileCmd);
+}
+memset(&rmFileCmd, 0, sizeof rmFileCmd);
+return 0;
+}
+
+
+#define SystemLogMessage
+//================================================
+// Main process
+//================================================
+int main(void)
+{
+	pthread_t t;
+	#ifdef SystemLogMessage
+	DEBUG_INFO("Initialization...\n");
+	#endif
+
+	if(ProcessShareMemory()== FAIL)
+	{
+		return FAIL;
+	}
+
+	//Create Process: Resend Transaction
+	pthread_create(&t, NULL, processTransactionQueue, NULL); //
+
+	sqlite3_config(SQLITE_CONFIG_URI,1);
+
+	if(sqlite3_open("file:/../Storage/OCPP/charger.db", &db))
+	{
+		#ifdef Debug
+		DEBUG_INFO( "Can't open database: %s\n", sqlite3_errmsg(db));
+		#endif
+		sqlite3_close( db );
+		exit(0);
+	}
+	else
+	{
+		#ifdef Debug
+		DEBUG_INFO( "Opened database successfully\n");
+		#endif
+	}
+
+	 //Table log buffer 
+	int rc =sqlite3_exec(db, createsql, 0, 0, &errMsg);
+	if (SQLITE_OK != rc)
+	{
+		#ifdef Debug
+		DEBUG_INFO( "Create log buffer table error message: %s\n", errMsg);
+		#endif
+
+		return 0;
+	}
+	else
+	{
+		#ifdef Debug
+		DEBUG_INFO( "Opened log buffer table successfully\n");
+		#endif
+	}
+
+	 //Table OcppAuthCache 
+	rc =sqlite3_exec(db, sqlOcppAuthCache, 0, 0, &errMsg);
+	if (SQLITE_OK != rc)
+	{
+		#ifdef Debug
+		DEBUG_INFO( "Create OcppAuthCache error message: %s\n", errMsg);
+		#endif
+		return 0;
+	}
+	else
+	{
+		#ifdef Debug
+		DEBUG_INFO( "Opened OcppAuthCache table successfully\n");
+		#endif
+	}
+
+	 // Table OcppAuthLocal 
+	rc =sqlite3_exec(db, sqlOcppAuthLocal, 0, 0, &errMsg);
+	if (SQLITE_OK != rc)
+	{
+		#ifdef Debug
+		DEBUG_INFO( "Create Table OcppAuthLocal error %s\n",errMsg);
+		#endif
+		return 0;
+	}
+	else
+	{
+		#ifdef Debug
+		DEBUG_INFO( "Opened OcppAuthLocal table successfully\n");
+		#endif
+	}
+
+	initialConfigurationTable();
+	removeMessageSentFile();
+	//queryAllData();
+	OCPP_get_TableAuthlocalAllData();
+
+	for(;;)
+	{
+		while(ConnectionEstablished==0)
+		{
+
+
+			if((time((time_t*)NULL)-startTime.connect)>=60)
+			{
+				#ifdef Debug
+				DEBUG_INFO("Execute ConnectWsServer\n");
+				#endif
+				ConnectWsServer();
+				startTime.connect=time((time_t*)NULL);
+			}
+			lws_service(context, 10000);//timeout_ms
+		}
+
+		if(( (BootNotificationInterval != 0  && ((time((time_t*)NULL)-startTime.bootNotification)>=BootNotificationInterval) )  || ((time((time_t*)NULL)-startTime.bootNotification)>=defaultWaitingTime) ) && ((server_sign == FALSE)/*|| (server_pending == TRUE)*/))
+		{
+			//hashmapForMessageNew();
+			sendBootNotificationRequest();
+			startTime.bootNotification=time((time_t*)NULL);
+		}
+
+		if(server_sign == TRUE)
+		{
+			if(sendbuffer == 1)
+			{
+				queue_operation(3, "", "");//sentqueue();   ---> remove temporally
+				sendbuffer = 0;
+				//queue_operation(5,"", "");
+			}
+				// Check System Value
+			CheckSystemValue();
+		}
+
+		lws_service(context, 100);//timeout_ms
+	}
+
+
+	pthread_join(t, NULL); // ���ݤl��������槹��
+	//hashmapForMessageFree();
+	return FAIL;
+}
+
+

+ 38 - 37
EVSE/Modularization/ocppfiles/ShareMemory.h

@@ -1,37 +1,38 @@
-#include	"SystemLogMessage.h"
-#include	<stdio.h>
-#include 	<stdlib.h>
-#include 	<string.h>
-#include	<time.h>
-#include	<stdarg.h>
-#include    "SystemLogMessage.h"
-
-#define Debug
-#define SystemLogMessage
-#ifdef SystemLogMessage
-int StoreLogMsg(const char *fmt, ...)
-{
-	char Buf[4096+256];
-	char buffer[4096];
-	time_t CurrentTime;
-	struct tm *tm;
-	va_list args;
-
-	va_start(args, fmt);
-	int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
-	va_end(args);
-	memset(Buf,0,sizeof(Buf));
-	CurrentTime = time(NULL);
-	tm=localtime(&CurrentTime);
-	sprintf(Buf,"echo \"[%04d.%02d.%02d %02d:%02d:%02d] - %s\" >>  SystemLog/[%04d.%02d]SystemLog",
-			tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,
-			buffer,
-			tm->tm_year+1900,tm->tm_mon+1);
-	printf("buffer: %s\n",Buf );
-	execl("sh", "sh", "-c", Buf, NULL);//system((const char*)Buf);
-	#ifdef Debug
-	printf("[%04d.%02d.%02d %02d:%02d:%02d] - %s", tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec, buffer);
-	#endif
-	return rc;
-}
-#endif
+#include	"SystemLogMessage.h"
+#include	<stdio.h>
+#include 	<stdlib.h>
+#include 	<string.h>
+#include	<time.h>
+#include	<stdarg.h>
+#include 	<unistd.h>
+//#include    "SystemLogMessage.h"
+
+#define Debug
+#define SystemLogMessage
+#ifdef SystemLogMessage
+int StoreLogMsg(const char *fmt, ...)
+{
+	char Buf[4096+256];
+	char buffer[4096];
+	time_t CurrentTime;
+	struct tm *tm;
+	va_list args;
+
+	va_start(args, fmt);
+	int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
+	va_end(args);
+	memset(Buf,0,sizeof(Buf));
+	CurrentTime = time(NULL);
+	tm=localtime(&CurrentTime);
+	sprintf(Buf,"echo \"[%04d.%02d.%02d %02d:%02d:%02d] - %s\" >>  SystemLog/[%04d.%02d]SystemLog",
+			tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,
+			buffer,
+			tm->tm_year+1900,tm->tm_mon+1);
+	printf("buffer: %s\n",Buf );
+	execl("sh", "sh", "-c", Buf, NULL);//system((const char*)Buf);
+	#ifdef Debug
+	printf("[%04d.%02d.%02d %02d:%02d:%02d] - %s", tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec, buffer);
+	#endif
+	return rc;
+}
+#endif

+ 0 - 118
EVSE/Modularization/ocppfiles/SystemLogMessage.h

@@ -1,118 +0,0 @@
-#include <stdio.h> 
-#include <stdlib.h> 
-#include <string.h>
-
-#if 0
-struct node { 
-	char *uuid;
-    char *data;
-    struct node *next; 
-}; 
-
-typedef struct node Node; 
-
-#if 0
-void createq(); 
-int showfront(char *uuid, char *data);
-void addq(char *uuid, char *data);
-void delq(); 
-void showqueue();
-#endif
-
-Node *front, *rear; 
-
-void createq() { 
-	printf("createq \n");
-    front = rear = (Node*) malloc(sizeof(Node)); 
-    front->next = rear->next = NULL; 
-
-    if(front == NULL)
-    {
-    		printf("front is NULL \n");
-    }
-    else
-    {
-    	printf("front is not NULL \n");
-    }
-
-
-    printf(" front: (@%p)\n",&(front->next));
-    if(front->next == NULL)
-    {
-       		printf("front->next is NULL \n");
-    }
-    else
-    {
-       	printf("front->next is not NULL \n");
-    }
-} 
-
-int showfront(char *uuid, char *data){
-	Node* tmpnode;
-
-	front = rear = (Node*) malloc(sizeof(Node));
-	front->next = rear->next = NULL;
-
-
-    if(front->next == NULL)
-    {
-
-    	printf("\n queue is null");
-    	strcpy(uuid,"");
-    	strcpy(data,"");
-    	return 0;
-    }
-    else 
-    {
-    	printf("test test 11111 !!! \n");
-
-    	printf("\n uuid:%s", front->next->uuid);
-    	printf("\n頂端值:%s", front->next->data);
-    	strcpy(uuid,front->next->uuid);
-    	strcpy(data,front->next->data);
-    	return 1;
-    }
-
-} 
-
-void addq(char *uuid, char *data) {
-    Node *newnode; 
-
-    newnode = (Node*) malloc(sizeof(Node)); 
-
-    if(front->next == NULL)  
-        front->next = newnode; 
-    
-    newnode->uuid = uuid;
-    newnode->data = data; 
-    newnode->next = NULL; 
-    rear->next = newnode; 
-    rear = newnode; 
-} 
-
-void delq() { 
-    Node* tmpnode; 
-
-    if(front->next == NULL) { 
-        printf("\n佇列已空!"); 
-        return; 
-    } 
-
-    tmpnode = front->next; 
-    front->next = tmpnode->next; 
-    free(tmpnode);    
-} 
-
-void showqueue() { 
-    Node* tmpnode; 
-
-    tmpnode = front->next; 
-
-    printf("\n佇列內容:"); 
-    while(tmpnode != NULL) { 
-        printf("%s ", tmpnode->data);
-        tmpnode = tmpnode->next; 
-    } 
-} 
-
-#endif

+ 0 - 16
EVSE/Modularization/ocppfiles/TransactionQueue.h

@@ -1,16 +0,0 @@
-#ifndef TransactionQueue_H
-#define TransactionQueue_H
-
-
-//==========================================
-// HandleError routine
-//==========================================
-void createq();
-int showfront(char *uuid, char *data);
-int addq(char *uuid, char *data);
-int delq();
-int showqueue();
-
-
-
-#endif

+ 0 - 103
EVSE/Modularization/ocppfiles/array.c

@@ -1,103 +0,0 @@
-#include <stdlib.h>
-#include <string.h>
-#include "array.h"
-
-
-
-void ArrayTest() {
-  char *names[] = { "John", "Mary", "George", "Bob" };
-  Array *array = ArrayNew(1);
-  int i;
-  for (i=0; i<4; i++)
-    ArrayAdd(array, names[i]);
-  ArrayEach(array, strPrintln);
-  printf("ArrayPop()=%s\n", (char *)ArrayPop(array));
-  printf("ArrayLast()=%s\n",(char *) ArrayLast(array));
-  for (i=0; i<4; i++) {
-    int arrayIdx = ArrayFind(array, names[i], strcmp);
-    printf("ArrayFind(%s)=%d\n", names[i], arrayIdx);
-  }
-  ArrayEach(array, strPrintln);
-  ArrayFree(array, NULL);
-}
-
-Array* ArrayNew(int size) {
-  Array *array = ObjNew(Array, 1);
-  array->count = 0;
-  array->size = size;
-  array->item = ObjNew(void*, array->size);
-  return array;
-}
-
-void ArrayFree(Array *array, FuncPtr1 freeFuncPtr) {
-  if (array == NULL) return;
-  if (freeFuncPtr != NULL)
-    ArrayEach(array, freeFuncPtr);
-  ObjFree(array->item);
-  ObjFree(array);
-}
-
-void ArrayAdd(Array *array, void *item) {
-  ASSERT(array->count <= array->size);
-  if (array->count == array->size) {
-    int newSize = array->size*2;
-    void **newItems = ObjNew(void*, newSize);
-    memcpy(newItems, array->item, array->size*sizeof(void*));
-//  printf("array grow from %d to %d\n", array->count, newSize);
-    ObjFree(array->item);
-    array->item = newItems;
-    array->size = newSize;
-  }
-  array->item[array->count++] = item;
-//printf("add item = %s\n", item);
-}
-
-void ArrayPush(Array *array, void *item) {
-  ArrayAdd(array, item);
-}
-
-void* ArrayPop(Array *array) {
-  ASSERT(array->count>0);
-  return array->item[--(array->count)];
-}
-
-void* ArrayPeek(Array *array) {
-  return ArrayLast(array);
-}
-
-void* ArrayLast(Array *array) {
-  ASSERT(array->count > 0);
-  return array->item[array->count-1];
-}
-
-Array* strsplit(char *str, char *spliter, SplitMode mode) {
-  Array *tokens = ArrayNew(10);
-  int si, tokenCount=0;
-  int begin=0, ti = 0;
-  for (si=0; si<=strlen(str); si++) {
-      if (str[si]=='\0' || strMember(str[si], spliter)) {
-        int len = si-begin;
-        if (len > 0)
-          ArrayAdd(tokens, newSubstr(str, begin, len));
-        if (mode == KEEP_SPLITER)
-          ArrayAdd(tokens, newSubstr(str, si, 1));
-//      printf("token1=%s token2=%s\n", tokens->item[ti-2], tokens->item[ti-1]);
-        begin = si+1;
-      }
-  }
-  return tokens;
-}
-
-int ArrayFind(Array *array, void *data, FuncPtr2 fcmp) {
-  int i;
-  for (i=0; i<array->count; i++)
-    if (fcmp(array->item[i], data)==0)
-      return i;
-  return -1;
-}
-
-void ArrayEach(Array *array, FuncPtr1 f) {
-  int i;
-  for (i=0; i<array->count; i++)
-    f(array->item[i]);
-}

+ 0 - 28
EVSE/Modularization/ocppfiles/array.h

@@ -1,28 +0,0 @@
-#ifndef ARRAY_H
-#define ARRAY_H
-
-#include "lib.h"
-
-typedef struct {
-  int size;    // 陣列目前的上限 
-  int count;   // 陣列目前的元素個數 
-  void **item; // 每個陣列元素的指標
-} Array;       // 動態陣列的資料結構 
-
-typedef enum { KEEP_SPLITER, REMOVE_SPLITER } SplitMode;
-
-extern void ArrayTest();
-
-extern Array* ArrayNew(int size);// 建立新陣列 
-extern void ArrayFree(Array *array, FuncPtr1 freeFuncPtr); // 釋放該陣列 
-extern void ArrayAdd(Array *array, void *item); // 新增一個元素 
-extern void ArrayPush(Array *array,void *item); // (模擬堆疊) 推入一個元素 
-extern void* ArrayPop(Array *array);  //(模擬堆疊) 彈出一個元素  
-extern void* ArrayPeek(Array *array); //(模擬堆疊) 取得最上面的元素 
-extern void* ArrayLast(Array *array); // 取得最後一個元素 
-extern void ArrayEach(Array *array, FuncPtr1 f); //對每個元素都執行 f 函數 
-extern int ArrayFind(Array *array, void *data, FuncPtr2 fcmp);
-
-extern Array* strsplit(char *str, char *spliter, SplitMode mode);
-
-#endif

+ 527 - 9
EVSE/Modularization/ocppfiles/hashmap.c

@@ -4,19 +4,28 @@
  *  Created on: 2019�~4��27��
  *      Author: foluswen
  */
+#include <sys/types.h>
+#include <sys/stat.h>
 #include "hashmap.h"
-
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
 #include <pthread.h>
+#include <unistd.h>     /*Unix 標準函數定義*/
+
+typedef enum boolean { FALSE, TRUE } BOOL;
+static pthread_mutex_t m;
 
+#if 0
 #define INITIAL_SIZE (2000)//(256)
 #define MAX_CHAIN_LENGTH (8)
 
+
+//static map_t hashMap;
+
 // Compile with -pthread
 // Create a mutex this ready to be locked!
-pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t m;// = PTHREAD_MUTEX_INITIALIZER;
 
 /* We need to keep keys and values */
 typedef struct _hashmap_element{
@@ -30,13 +39,25 @@ typedef struct _hashmap_element{
 typedef struct _hashmap_map{
 	int table_size;
 	int size;
-	hashmap_element *data;
+	//hashmap_element *data; ---> remove temporally
+	hashmap_element data[2000];
 } hashmap_map;
 
+
+static struct _hashmap_map hashMap[0]={0};
+
 /*
  * Return an empty hashmap, or NULL on failure.
  */
 map_t hashmap_new() {
+	printf("hashmap_new\n");
+	memset(&hashMap, 0, sizeof hashMap);
+	printf("hashmap_new 1\n");
+	hashMap[0].table_size = INITIAL_SIZE;
+	hashMap[0].size = 0;
+	printf("(hashmap_new) hashMap.table_size=%d",hashMap[0].table_size);
+	return NULL;
+#if 0
 	hashmap_map* m = (hashmap_map*) malloc(sizeof(hashmap_map));
 	if(!m) goto err;
 
@@ -53,6 +74,7 @@ map_t hashmap_new() {
 		if (m)
 			hashmap_free(m);
 		return NULL;
+#endif
 }
 
 /* The implementation here was originally done by Gary S. Brown.  I have
@@ -190,8 +212,9 @@ unsigned int hashmap_hash_int(hashmap_map * m, char* keystring){
 
 	/* Knuth's Multiplicative Method */
 	key = (key >> 3) * 2654435761;
+	printf("table_size=%d\n",hashMap[0].table_size);
 
-	return key % m->table_size;
+	return key % hashMap[0].table_size;//key % m->table_size;
 }
 
 /*
@@ -202,10 +225,40 @@ int hashmap_hash(map_t in, char* key){
 	int curr;
 	int i;
 
+	/* If full, return immediately */
+	printf("hashMap[0].table_size=%d\n",hashMap[0].table_size);
+	if(hashMap[0].size >= (hashMap[0].table_size/2)) return MAP_FULL;
+
+	/* Find the best index */
+	curr = hashmap_hash_int(hashMap, key);
+
+	/* Linear probing */
+	for(i = 0; i< MAX_CHAIN_LENGTH; i++){
+		if(hashMap[0].data[curr].in_use == 0)
+		{
+			printf(" no in_use \n");
+			return curr;
+		}
+
+
+		if(hashMap[0].data[curr].in_use == 1 && (strcmp(hashMap[0].data[curr].key,key)==0))
+		{
+			printf("key use, key exist!!!!\n");
+			return curr;
+		}
+
+
+			curr = (curr + 1) % hashMap[0].table_size;
+	}
+
+	return MAP_FULL;
+
+#if 0
 	/* Cast the hashmap */
 	hashmap_map* m = (hashmap_map *) in;
 
 	/* If full, return immediately */
+	printf("m->table_size=%d\n",m->table_size);
 	if(m->size >= (m->table_size/2)) return MAP_FULL;
 
 	/* Find the best index */
@@ -214,21 +267,33 @@ int hashmap_hash(map_t in, char* key){
 	/* Linear probing */
 	for(i = 0; i< MAX_CHAIN_LENGTH; i++){
 		if(m->data[curr].in_use == 0)
+		{
+		    printf(" no in_use \n");
 			return curr;
+		}
+
 
 		if(m->data[curr].in_use == 1 && (strcmp(m->data[curr].key,key)==0))
+		{
+			printf("key use, key exist!!!!\n");
 			return curr;
+		}
+
 
 		curr = (curr + 1) % m->table_size;
 	}
 
 	return MAP_FULL;
+#endif
 }
 
 /*
  * Doubles the size of the hashmap, and rehashes all the elements
  */
 int hashmap_rehash(map_t in){
+
+
+#if 0
 	int i;
 	int old_size;
 	hashmap_element* curr;
@@ -262,6 +327,8 @@ int hashmap_rehash(map_t in){
 
 	free(curr);
 
+	return MAP_OK;
+#endif
 	return MAP_OK;
 }
 
@@ -271,6 +338,37 @@ int hashmap_rehash(map_t in){
 int hashmap_put(map_t in, char* key, any_t value){
 
 	int index;
+
+	/* Find a place to put our value */
+	index = hashmap_hash(in, key);
+	while(index == MAP_FULL){
+#if 0
+			if (hashmap_rehash(in) == MAP_OMEM) {
+				return MAP_OMEM;
+			}
+#endif
+		memset(&hashMap[0].data, 0, sizeof(struct _hashmap_map));
+		hashMap[0].table_size = INITIAL_SIZE;
+		hashMap[0].size = 0;
+		index = hashmap_hash(in, key);
+	}
+
+	printf("hash index=%d\n",index);
+	/* Set the data */
+	strcpy(hashMap[0].data[index].data, value);
+	strcpy(hashMap[0].data[index].key, key);
+	//m->data[index].data = value;
+	//m->data[index].key = key;
+	hashMap[0].data[index].in_use = 1;
+	hashMap[0].size++;
+
+	printf("hash m->data[index].data=%s\n",hashMap[0].data[index].data);
+	printf("hash m->data[index].key=%s\n",hashMap[0].data[index].key);
+	printf("hash m->data[index].in_use=%d\n",hashMap[0].data[index].in_use);
+
+	return MAP_OK;
+
+#if 0
 	hashmap_map* m;
 
 	/* Cast the hashmap */
@@ -299,6 +397,7 @@ int hashmap_put(map_t in, char* key, any_t value){
 	printf("hash m->data[index].in_use=%d\n",m->data[index].in_use);
 
 	return MAP_OK;
+#endif
 }
 
 /*
@@ -307,6 +406,40 @@ int hashmap_put(map_t in, char* key, any_t value){
 int hashmap_get(map_t in, char* key, any_t *arg){
 	int curr;
 	int i;
+
+	/* Find data location */
+	curr = hashmap_hash_int(hashMap, key);
+	printf("MAP_get curr=%d\n",curr);
+
+	/* Linear probing, if necessary */
+	for(i = 0; i<MAX_CHAIN_LENGTH; i++){
+
+	        int in_use = hashMap[0].data[curr].in_use;
+	        printf("MAP_get in use=%d\n",in_use);
+	        if (in_use == 1){
+	        	printf("MAP_get hashMap.data[curr].key=%s\n", hashMap[0].data[curr].key);
+	        	printf("MAP_get hashMap.data[curr].data=%s\n", hashMap[0].data[curr].data);
+	            if (strcmp(hashMap[0].data[curr].key,key)==0){
+	            	strcpy(arg, hashMap[0].data[curr].data);
+	                //*arg = (m->data[curr].data);
+	                printf("MAP_OK curr=%d\n",curr);
+	                return MAP_OK;
+	            }
+			}
+
+			curr = (curr + 1) % hashMap[0].table_size;
+			printf("MAP_MISSING curr=%d\n",curr);
+	}
+
+	memset(arg, 0, sizeof arg);
+	//*arg = NULL;
+
+	/* Not found */
+	return MAP_MISSING;
+
+#if 0
+	int curr;
+	int i;
 	hashmap_map* m;
 
 	/* Cast the hashmap */
@@ -340,6 +473,7 @@ int hashmap_get(map_t in, char* key, any_t *arg){
 
 	/* Not found */
 	return MAP_MISSING;
+#endif
 }
 
 /*
@@ -347,6 +481,7 @@ int hashmap_get(map_t in, char* key, any_t *arg){
  * additional any_t argument is passed to the function as its first
  * argument and the hashmap element is the second.
  */
+#if 0
 int hashmap_iterate(map_t in, PFany f, any_t item) {
 	int i;
 
@@ -369,11 +504,46 @@ int hashmap_iterate(map_t in, PFany f, any_t item) {
 
     return MAP_OK;
 }
-
+#endif
 /*
  * Remove an element with that key from the map
  */
 int hashmap_remove(map_t in, char* key){
+
+	int i;
+	int curr;
+
+	/* Find key */
+		curr = hashmap_hash_int(hashMap, key);
+
+		/* Linear probing, if necessary */
+		for(i = 0; i<MAX_CHAIN_LENGTH; i++){
+
+	        int in_use = hashMap[0].data[curr].in_use;
+	        if (in_use == 1){
+	            if (strcmp(hashMap[0].data[curr].key,key)==0){
+	                /* Blank out the fields */
+	            	hashMap[0].data[curr].in_use = 0;
+	                memset(hashMap[0].data[curr].data, 0, sizeof hashMap[0].data[curr].data);
+	                memset(hashMap[0].data[curr].key, 0, sizeof hashMap[0].data[curr].key);
+	               // m->data[curr].data = NULL;
+	               // m->data[curr].key = NULL;
+
+	                printf("remove m->size=%d \n",hashMap[0].size);
+	                /* Reduce the size */
+	                hashMap[0].size--;
+
+	                printf("remove ok!\n");
+	                return MAP_OK;
+	            }
+			}
+			curr = (curr + 1) % hashMap[0].table_size;
+		}
+
+		/* Data not found */
+		return MAP_MISSING;
+
+#if 0
 	int i;
 	int curr;
 	hashmap_map* m;
@@ -397,8 +567,11 @@ int hashmap_remove(map_t in, char* key){
                // m->data[curr].data = NULL;
                // m->data[curr].key = NULL;
 
+                printf("remove m->size=%d \n",m->size);
                 /* Reduce the size */
                 m->size--;
+
+                printf("remove ok!\n");
                 return MAP_OK;
             }
 		}
@@ -407,34 +580,379 @@ int hashmap_remove(map_t in, char* key){
 
 	/* Data not found */
 	return MAP_MISSING;
+#endif
 }
 
 /* Deallocate the hashmap */
 void hashmap_free(map_t in){
+
+	memset(&hashMap, 0, sizeof(hashMap));
+
+#if 0
 	hashmap_map* m = (hashmap_map*) in;
 	free(m->data);
 	free(m);
+#endif
 }
 
 /* Return the length of the hashmap */
 int hashmap_length(map_t in){
+	return hashMap[0].size;
+#if 0
 	hashmap_map* m = (hashmap_map *) in;
 	if(m != NULL) return m->size;
 	else return 0;
+#endif
 }
+#endif
 
+int MessageSent_add(char *uuid, char *data)
+{
+FILE *outfile;
+char rmFileCmd[100]={0};
+struct stat stats;
+char tempstring[100]={0};
+
+stat("../Storage/OCPP", &stats);
+// Check for directory existence
+if (S_ISDIR(stats.st_mode) == 1)
+{
+	printf("\n directory exist \n");
+}
+else
+{
+	printf("\n directory not exist, create dir \n");
+	sprintf(rmFileCmd,"mkdir -p %s","../Storage/OCPP");
+	system(rmFileCmd);
+}
+
+memset(&rmFileCmd, 0, sizeof rmFileCmd);
+
+if((access("../Storage/OCPP/MessageSent",F_OK))!=-1)
+{
+	printf("MessageSent exist.\n");
+}
+else
+{
+	printf("MessageSent not exist\n");
+	FILE *log = fopen("../Storage/OCPP/MessageSent", "w+");
+
+	if(log == NULL)
+	{
+		printf("Can't Create File MessageSent \n");
+		return 0;
+	}
+	else
+	{
+		fclose(log);
+	}
+}
+
+// open file for writing
+outfile = fopen ("../Storage/OCPP/MessageSent", "a");
+sprintf(tempstring,"%s,%s\n", uuid,data);
+fputs(tempstring, outfile);
+fclose (outfile);
+printf("MessageSent add\n");
+return 1;
+}
+
+int MessageSent_get(char *uuid, char *data)
+{
+	FILE *fp;
+	int result = FALSE; // 1: TRUE  0:FALSE
+	char str[1200]={0};
+	char sstr[50]={ 0 }, datastr[30]={0};//sstr[200]={ 0 };
+	int pos = 0, l = 0, c = 0;
+	char *loc;
+	char rmFileCmd[100]={0};
+	struct stat stats;
+	stat("../Storage/OCPP", &stats);
+
+	// Check for directory existence
+	if (S_ISDIR(stats.st_mode) == 1)
+	{
+		printf("\n directory exist \n");
+	}
+	else
+	{
+		printf("\n directory not exist, create dir \n");
+		sprintf(rmFileCmd,"mkdir -p %s","../Storage/OCPP");
+		system(rmFileCmd);
+	}
+
+	memset(&rmFileCmd, 0, sizeof rmFileCmd);
+
+	if((access("../Storage/OCPP/MessageSent",F_OK))!=-1)
+	{
+		printf("MessageSent exist.\n");
+	}
+	else
+	{
+		printf("MessageSent not exist\n");
+		FILE *log = fopen("../Storage/OCPP/MessageSent", "w+");
+
+		if(log == NULL)
+		{
+			printf("Can't Create File MessageSent \n");
+			return 0;
+		}
+		else
+		{
+			fclose(log);
+		}
+	}
+
+
+	/* opening file for reading */
+	fp = fopen("../Storage/OCPP/MessageSent" , "r");
+	if(fp == NULL) {
+		printf("Error opening file");
+		return FALSE;
+	}
+
+	c = fgetc(fp);
+	printf("c:%d\n",c);
+	rewind(fp);
+
+	if(c == EOF)
+	{
+		printf("MessageSent is null\n");
+		//strcpy(uuid,"");
+		strcpy(data,"");
+		result = FALSE;
+	}
+	else
+	{
+		result = FALSE;
+		while (fgets (str, 1200, fp)!=NULL)
+		{
+			printf("Orignal File get strings \n");
+			str[strlen(str) - 1] = '\0'; // eat the newline fgets() stores
+
+			/* writing content to stdout */
+			//puts(str);
+			printf("str[0]=%c\n",str[0]);
+
+			/*********************uuid***************/
+			int d = 0;
+			while (str[d] != ',')
+			{
+				sstr[d] = str[d];
+				d=d+ 1;
+			}
+			sstr[d] = '\0';
+
+			printf("sstr=%s\n",sstr);
+			printf("uuid=%s\n",uuid);
+
+			if(strcmp(sstr, uuid) == 0)
+			{
+				printf("\n uuid:%s compare all right!!! ", sstr);
+
+				loc = strstr(str, ",");
+				memset(sstr ,0, sizeof(sstr) );
+				int e = 0;
+				while (loc[1+e] != '\0')
+				{
+					datastr[e] = loc[1+e];
+					e++;
+				}
+				datastr[e] = '\0';
+
+				printf("\n data:%s", datastr);
+				//strcpy(uuid,sstr);
+				strcpy(data,datastr);
+				result = TRUE;
+				break;
+			}
+
+
+		}
+	}
+
+
+	fclose(fp);
+	return result;
+
+}
+
+int MessageSent_remove(char *uuid, char *data)
+{
+char tempfile[] = "../Storage/OCPP/temp1.json";
+FILE *infile;
+FILE *outfile;
+int  resultRename=0;
+char filename[60]={0};
+char rmFileCmd[100]={0};
+char tempstring[100]={0};
+struct stat stats;
+stat("../Storage/OCPP", &stats);
+
+// Check for directory existence
+if (S_ISDIR(stats.st_mode) == 1)
+{
+	printf("\n directory exist \n");
+}
+else
+{
+	printf("\n directory not exist, create dir \n");
+	sprintf(rmFileCmd,"mkdir -p %s","../Storage/OCPP");
+	system(rmFileCmd);
+}
+
+memset(&rmFileCmd, 0, sizeof rmFileCmd);
+
+if((access("../Storage/OCPP/MessageSent",F_OK))!=-1)
+{
+	printf("MessageSent exist.\n");
+}
+else
+{
+	printf("MessageSent not exist\n");
+	FILE *log = fopen("../Storage/OCPP/MessageSent", "w+");
+
+	if(log == NULL)
+	{
+		printf("log is NULL\n");
+		return 0;
+	}
+	else
+	{
+		fclose(log);
+	}
+}
+
+
+sprintf(tempstring,"%s,%s", uuid,data);
+
+// open file for writing
+strcpy(filename, "../Storage/OCPP/MessageSent");
+infile = fopen ("../Storage/OCPP/MessageSent", "r");
+outfile = fopen (tempfile, "w");
+
+/*检测到文件结束标识返回1,否则返回0。*/
+//DEBUG_INFO("feof(infile) =%d\n",feof(infile));
+int c;
+c = fgetc(infile);
+printf("file c:%d\n",c);
+rewind(infile);
+
+if(c == EOF)
+{
+	printf("MessageSent is  NULL\n");
+
+	fclose(infile);
+	fclose(outfile);
+
+	sprintf(rmFileCmd,"rm -f %s",tempfile);
+	system(rmFileCmd);
+}
+else
+{
+	char buf[1200]={0};
+
+	//int i = 0;
+	printf("Orignal File is not NULL\n");
+	while (fgets(buf, sizeof(buf), infile) != NULL)
+	{
+		printf("Orignal File get strings \n");
+		buf[strlen(buf) - 1] = '\0'; // eat the newline fgets() stores
+
+		printf("buf=%s\n",buf);
+		printf("tempstring=%s\n",tempstring);
+		//if(i != 0)
+		if(strcmp(tempstring, buf)== 0)
+		{
+			printf("Remove OK ! \n");
+		}
+		else
+		{
+			fprintf(outfile,"%s\n", buf);
+		}
+
+		//i = i + 1;
+	}
+
+	fclose(infile);
+	fclose(outfile);
+
+	sprintf(rmFileCmd,"rm -f %s",filename);
+	system(rmFileCmd);
+
+	resultRename = rename(tempfile, filename);
+
+	if(resultRename == 0)
+	{
+		printf("File renamed successfully");
+	}
+	else
+	{
+		printf("Error: unable to rename the file");
+	}
+}
+
+return 0;
+
+}
+
+#if 0
 /* type: 0 (put ); type: 1(get); type: 3(remove) */
 int hashmap_operation(int type, map_t in, char* key, any_t value, any_t *arg){
 
+	pthread_mutex_init(&m,NULL);
+	pthread_mutex_lock(&m);
+	int result=0;
+	printf("\nhashmap_operation hashMap table size=%d \n", hashMap[0].table_size);
+	printf("\nhashmap_operation hashMap key=%s \n", key);
+	printf("\nhashmap_operation hashMap value=%s \n", arg);
+	if(type == 0)
+		result = hashmap_put(hashMap/*in*/, key, arg);
+	else if(type  == 1)
+		result = hashmap_get(hashMap/*in*/, key, arg);
+	else if(type == 2)
+		result = hashmap_remove(hashMap/*in*/, key);
+	pthread_mutex_unlock(&m);
+	printf("\nhashmap_operation 1 \n");
+	return result;
+}
+#endif
+
+/* type: 0 (add ); type: 1(get); type: 3(remove) */
+int hashmap_operation(int type, char *uuid, char *data)
+{
+
+	pthread_mutex_init(&m,NULL);
 	pthread_mutex_lock(&m);
 	int result=0;
+
 	if(type == 0)
-		result = hashmap_put(in, key, value);
+		result = MessageSent_add(uuid, data);
 	else if(type  == 1)
-		result = hashmap_get(in, key, arg);
-	else if(type == 3)
-		result = hashmap_remove(in, key);
+		result = MessageSent_get(uuid,data);
+	else if(type == 2)
+		result = MessageSent_remove(uuid, data);
 	pthread_mutex_unlock(&m);
+	printf("\nhashmap_operation 1 \n");
 	return result;
 }
 
+
+
+#if 0
+void hashmapForMessageNew(void)
+{
+	hashmap_new();
+}
+
+void hashmapForMessageFree(void)
+{
+	hashmap_free(&hashMap);
+}
+
+int hashmapForMessageLength(void)
+{
+	return hashmap_length(&hashMap);
+}
+
+#endif

+ 18 - 1
EVSE/Modularization/ocppfiles/hashmap.h

@@ -28,6 +28,7 @@ typedef struct data_struct_s
  * the hashmap.
  */
 typedef void *any_t;
+//typedef void any_t;
 
 /*
  * PFany is a pointer to a function that can take two any_t arguments
@@ -90,6 +91,22 @@ extern int hashmap_length(map_t in);
 /*
  * hashmap_operation operation
  */
-extern int hashmap_operation(int type, map_t in, char* key, any_t value, any_t *arg);
+//extern int hashmap_operation(int type, map_t in, char* key, any_t value, any_t *arg);
+extern int hashmap_operation(int type, char *uuid, char *data);
+
+/*
+ * hashmapForMessageNew operation
+ */
+extern void hashmapForMessageNew(void);
+
+/*
+ * hashmapForMessageFree operation
+ */
+extern void hashmapForMessageFree(void);
+
+/*
+ * hashmapForMessageFree operation
+ */
+extern int hashmapForMessageLength(void);
 
 #endif /* HASHMAP_H_ */

+ 0 - 133
EVSE/Modularization/ocppfiles/lib.c

@@ -1,133 +0,0 @@
-#include "lib.h"
-
-char SPLITER[] = " \t\n\r~!@#$%^&*()_+{}:\"<>?-=[]|\\;',./";
-char SPACE[] = " \t\n\r";
-char ALPHA[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
-char DIGIT[] = "0123456789";
-char NAME_CHAR[] = "_0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
-
-// 記憶體配置函數 
-int newMemoryCount = 0;
-void* newMemory(int size) {
-  void *ptr=malloc(size);
-  assert(ptr != NULL);
-  memset(ptr, 0, size);
-//  printf("memGet:%p\n", ptr);
-  newMemoryCount++;
-  return ptr;
-}
-
-int freeMemoryCount=0;
-void freeMemory(void *ptr) {
-//  printf("memFree:%p\n", ptr);
-  free(ptr);
-  freeMemoryCount++;
-}
-
-void checkMemory() {
-  printf("newMemoryCount=%d freeMemoryCount=%d\n", newMemoryCount, freeMemoryCount);
-}
-
-// 檔案輸出入 
-BYTE* newFileBytes(char *fileName, int *sizePtr) {
-  FILE *file = fopen(fileName, "rb");
-  fseek(file, 0 , SEEK_END);
-  long size = ftell(file);
-  rewind(file);
-  BYTE *buffer = (char*) newMemory(size+1);
-  fread (buffer,size,1,file);
-  fclose(file);
-  *sizePtr = size;
-  return buffer;
-}
-
-char* newFileStr(char *fileName) {
-  int size;
-  BYTE *buffer = newFileBytes(fileName, &size);
-  buffer[size] = '\0';
-  return (char*) buffer;
-}
-
-char *newStr(char *str) {
-  char *rzStr = newMemory(strlen(str)+1);
-  strcpy(rzStr, str);
-  return rzStr;
-}
-
-char *newSubstr(char *str, int i, int len) {
-  char *rzStr = newMemory(len+1);
-  strSubstr(rzStr, str, i, len);
-  return rzStr;
-}
-
-// 字串函數 
-void strPrint(void *data) {
-  printf("%s ", data);
-}
-
-void strPrintln(void *data) {
-  printf("%s\n", data);
-}
-
-BOOL strHead(char *str, char *head) { 
-  return (strncmp(str, head, strlen(head))==0);
-}
-
-BOOL strTail(char *str, char *tail) {
-  int strLen = strlen(str), tailLen = strlen(tail);
-  if (strLen < tailLen) return FALSE;
-  return (strcmp(str+strLen-tailLen, tail)==0);
-}
-
-int strCountChar(char *str, char *charSet) {
-  int i, count=0;
-  for (i=0; i<strlen(str); i++)
-    if (strMember(str[i], charSet))
-      count++;
-  return count;
-}
-
-void strSubstr(char *substr, char *str, int i, int len) {
-  strncpy(substr, &str[i], len);
-  substr[len]='\0';
-}
-
-BOOL strPartOf(char *token, char *set) {
-  ASSERT(token != NULL && set != NULL);
-  ASSERT(strlen(token) < 100);
-  char ttoken[100];
-  sprintf(ttoken, "|%s|", token);
-  return (strstr(set, ttoken)!=NULL);
-}
-
-void strTrim(char *trimStr, char *str, char *set) {
-  char *start, *stop;
-  for (start = str; strMember(*start, set); start++);
-  for (stop = str+strlen(str)-1; stop > str && strMember(*stop, set); stop--);
-  if (start <= stop) {
-    strncpy(trimStr, start, stop-start+1);
-    trimStr[stop-start+1]='\0';
-  } else
-    strcpy(trimStr, "");
-}
-
-void strReplace(char *str, char *from, char to) {
-  int i;
-  for (i=0; i<strlen(str); i++)
-    if (strMember(str[i], from))
-      str[i] = to;
-}
-
-char tspaces[MAX_LEN];
-char* strSpaces(int level) {
-  assert(level < MAX_LEN);
-  memset(tspaces, ' ', MAX_LEN);
-  tspaces[level] = '\0';
-  return tspaces;
-}
-
-void strToUpper(char *str) {
-  int i;
-  for (i = 0; i<strlen(str); i++)
-    str[i] = toupper(str[i]);
-}

+ 0 - 59
EVSE/Modularization/ocppfiles/lib.h

@@ -1,59 +0,0 @@
-#ifndef LIB_H
-#define LIB_H
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <assert.h>
-
-// 基本常數 
-#define FALSE   0
-#define TRUE    1
-#define BYTE    unsigned char
-#define BOOL    unsigned char
-#define INT32   int
-#define INT16   short
-#define INT8    char
-#define UINT32  unsigned int
-#define UINT16  unsigned short
-#define UINT8  unsigned char
-#define MAX_LEN 512
-
-// 基本函數 
-#define min(x,y)         (x < y?x:y)
-#define max(x,y)         (x > y?x:y)
-#define ASSERT(cond)     assert(cond)
-#define ObjNew(type, count) newMemory(count*sizeof(type))
-#define ObjFree freeMemory
-#define strFree freeMemory
-
-void* newMemory(int size);
-void freeMemory(void *ptr);
-void checkMemory();
-char *newStr(char *str);
-char *newSubstr(char *str, int i, int len);
-BYTE* newFileBytes(char *fileName, int *sizePtr);
-char* newFileStr(char *fileName);
-
-// 字串函數 
-#define strEqual(str1, str2) (strcmp(str1, str2)==0)
-#define strMember(ch, set) (strchr(set, ch) != NULL)
-void strSubstr(char *substr, char *str, int i, int len);
-void strReplace(char *str, char *from, char to);
-void strTrim(char *trimStr, char *str, char *set);
-char *strSpaces(int len);
-void strToUpper(char *str);
-BOOL strPartOf(char *token, char *set);
-void strPrint(void *data);
-void strPrintln(void *data);
-
-// 函數指標 (用於ArrayEach(), HashTableEach()中)
-typedef void (*FuncPtr1) (void *);
-typedef int (*FuncPtr2) (void *, void *);
-
-extern char SPLITER[];
-extern char SPACE[];
-extern char ALPHA[];
-extern char DIGIT[];
-
-#endif