瀏覽代碼

2020-06-05 /Kathy Yeh
1. modify TransactionRelatedQueue content: 槍號,封包內容(StartTransaction/StopTransaction/MeterValue)
2. modify Transaction Id error
3. add StatusNotfication ConnectorPlugIn for Chademo/ CCS / GB

Kathy_Yeh 4 年之前
父節點
當前提交
8d0139ee1d
共有 3 個文件被更改,包括 16507 次插入16410 次删除
  1. 16120 16032
      EVSE/Modularization/ocppfiles/MessageHandler.c
  2. 172 172
      EVSE/Modularization/ocppfiles/MessageHandler.h
  3. 215 206
      EVSE/Modularization/ocppfiles/Module_OcppBackend.c

+ 16120 - 16032
EVSE/Modularization/ocppfiles/MessageHandler.c

@@ -1,16033 +1,16121 @@
-#include "Module_OcppBackend.h"
-#include "define.h"
-
-//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"
-
-
-//===================================
-//	Define CP State constant
-//===================================
-#define CP_STATE_UNKNOWN			0
-#define CP_STATE_A					1
-#define CP_STATE_B					2
-#define CP_STATE_C					3
-#define CP_STATE_D					4
-#define CP_STATE_E					5
-#define CP_STATE_F					6
-
-struct SysConfigAndInfo				*ShmSysConfigAndInfo;
-struct StatusCodeData 				*ShmStatusCodeData;
-struct PsuData 						*ShmPsuData ;
-struct OCPP16Data 					*ShmOCPP16Data;
-
-#define MACROSTR(k) #k
-
-//ConfigurationMaxKeys
-#define GetConfigurationMaxKeysNUM 	43
-
-pthread_mutex_t lock 				= PTHREAD_MUTEX_INITIALIZER;
-char queuedata[2600]				= {0};
-
-//=================================
-//  StatusNotification cycle
-//=================================
-static int server_cycle_Status 		= 120;
-
-//===============================
-// Configuration: unknownkey
-//===============================
-static char unknownkey[10][20]		= {0};
-static int UnknownKeynum 			= 0;
-
-//===============================
-// Gun Total  Numbers
-//===============================
-static int gunTotalNumber			= 0;
-static unsigned char gunType[4] 	= {0};
-
-//===============================
-// Local List Version
-//===============================
-static int localversion=0;
-static char idTagAuthorization[32]	= {0};
-
-//===============================
-// OCPP sign variable
-//===============================
-static int server_sign				= FALSE;
-int server_pending 					= FALSE;
-int PRE_SYS_MODE[CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY + AC_QUANTITY];
-static int BootNotificationInterval = 0;
-static int SystemInitial 			= 0;//= CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY;	// System Boot UP
-
-//===============================
-// OCPP auth variable
-//===============================
-static int authorizeRetryTimes 		= 0;  //number of  Retry times
-
-//===============================
-// OCPP other variables
-//===============================
-//int isUpdateRequest = FALSE;
-static int HeartBeatWaitTime 						= 10;
-static int FirstHeartBeat 							= 0;
-static int FirmwareStatusNotificationStatus 		= FIRMWARE_STATUS_IDLE;  // Idle
-static int DiagnosticsStatusNotificationStatus 		= DIAGNOSTIC_STATUS_IDLE; // Idle
-static char CurrentChargingProfileScheduleStr[30]	= {0};
-
-//========================================
-// OCPP status/previous related variables
-//========================================
-static int GunStatusInterval 															= 10;
-static int statusModeChage[CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY + AC_QUANTITY] 	= {FALSE};
-static int ChademoPreviousSystemStatus[CHAdeMO_QUANTITY];
-static int CcsPreviousSystemStatus[CCS_QUANTITY];
-static int GbPreviousSystemStatus[GB_QUANTITY];
-static int AcPreviousSystemStatus[AC_QUANTITY];
-static int ChademoPreviousConnectorPlugIn[CHAdeMO_QUANTITY];
-static int CcsPreviousConnectorPlugIn[CCS_QUANTITY];
-static int GbPreviousConnectorPlugIn[GB_QUANTITY];
-static int AcPreviousConnectorPlugIn[AC_QUANTITY];
-static int TransactionMessageAttemptsValue 												= 0;
-static int TransactionMessageRetryIntervalValue 										= 0;
-static int TempMeterValueInterval 														= 0;
-static struct OCPPAuthLocalElemet
-{
-	int listVersionInt;
-	char idTagstr[20];
-	char parentIdTag[20];
-	char expiryDate[30];
-	char idTagstatus[16];
-}idTagQuery;
-
-//=============================================
-// OCPP HeartBeat Response Not Receive Counts
-//============================================
-static int HeartBeatWithNOResponse = 0;
-static int HeartBeatCountPerHour = 0;
-
-extern void  ChageWebSocketPingInterval(int WebSocketPingInterval);
-extern int GetTransactionQueueNum(void);
-extern pthread_mutex_t mutex1;
-extern struct Charger_Info Charger;
-extern sqlite3 *db;
-
-int TransactionMessageAttemptsGet(void);
-int TransactionMessageRetryIntervalGet(void);
-int GetOcppConnStatus(void);
-void SetOcppConnStatus(uint8_t status);
-int setKeyValue(char *key, char *value);
-void OCPP_get_TableAuthlocalAllData(void);
-void processUnkownKey(void);
-
-struct StructOCPPMeterValue
-{
-	unsigned char 				TimeStamp[28];
-	struct StructSampledValue	SampledValue[10];
-};
-
-struct ClientTime
-{
-	unsigned int Heartbeat;
-	unsigned int StatusNotification[CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY + AC_QUANTITY];
-	unsigned int StartTransaction;
-	unsigned int StopTransaction;
-	unsigned int MeterValues[CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY + AC_QUANTITY];
-
-}clientTime;
-
-typedef union
-{
-	//Operations Initiated by Central System
-	unsigned char CsMsgValue[CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY + AC_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 + AC_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;
-
-#if 0
-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)
-};
-#endif
-
-/*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)
-};
-
-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};
-
-
-//==========================================
-// GetCompositeSchedule logic related function
-//==========================================
-int DiffTimebSec(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);
-}
-
-int DiffTimebWithNowSec(struct timeb ST)
-{
-	//return milli-second
-	struct timeb ET;
-	unsigned int StartTime,StopTime;
-
-	ftime(&ET);
-	StartTime=(unsigned int)ST.time;
-	StopTime=(unsigned int)ET.time;
-	return (StopTime-StartTime);
-}
-
-int getStartStop(uint8_t *start, uint8_t *stop)
-{
-	int result = -1;
-	struct tm tmStart;
-	struct timeb tbStart;
-	struct tm tmStop;
-	struct timeb tbStop;
-
-
-	if((sscanf((char*)start, "%4d-%2d-%2dT%2d:%2d:%2d", &tmStart.tm_year, &tmStart.tm_mon, &tmStart.tm_mday, &tmStart.tm_hour, &tmStart.tm_min, &tmStart.tm_sec) == 6) &&
-	   (sscanf((char*)stop, "%4d-%2d-%2dT%2d:%2d:%2d", &tmStop.tm_year, &tmStop.tm_mon, &tmStop.tm_mday, &tmStop.tm_hour, &tmStop.tm_min, &tmStop.tm_sec) == 6))
-	{
-		tmStart.tm_year -= 1900;
-		tmStart.tm_mon -= 1;
-		tbStart.time = mktime(&tmStart);
-		tbStart.millitm = 0;
-
-		tmStop.tm_year -= 1900;
-		tmStop.tm_mon -= 1;
-		tbStop.time = mktime(&tmStop);
-		tbStop.millitm = 0;
-
-		result = DiffTimebSec(tbStart, tbStop);
-	}
-	else
-	{
-		DEBUG_WARN("Start or stop date parsing error.\r\n");
-	}
-
-	return result;
-}
-
-int getStartSinceToday(uint8_t *stop)
-{
-	int result = -1;
-	time_t t;
-	struct tm *tmStartToday;
-	struct timeb tbStartToday;
-	struct tm tmStop;
-	struct timeb tbStop;
-
-	if((sscanf((char*)stop, "%4d-%2d-%2dT%2d:%2d:%2d", &tmStop.tm_year, &tmStop.tm_mon, &tmStop.tm_mday, &tmStop.tm_hour, &tmStop.tm_min, &tmStop.tm_sec) == 6))
-	{
-		t=time(NULL);
-		tmStartToday=localtime(&t);
-		tmStartToday->tm_hour = 0;
-		tmStartToday->tm_min = 0;
-		tmStartToday->tm_sec = 0;
-		tbStartToday.time = mktime(tmStartToday);
-
-		tmStop.tm_year -= 1900;
-		tmStop.tm_mon -= 1;
-		tbStop.time = mktime(&tmStop);
-		tbStop.millitm = 0;
-
-		result = DiffTimebSec(tbStartToday, tbStop);
-	}
-
-	return result;
-}
-
-int getStartSinceWeek(uint8_t *stop)
-{
-	int result = -1;
-	time_t t;
-	struct tm *tmStartWeek;
-	struct timeb tbStartWeek;
-	struct tm tmStop;
-	struct timeb tbStop;
-
-	if((sscanf((char*)stop, "%4d-%2d-%2dT%2d:%2d:%2d", &tmStop.tm_year, &tmStop.tm_mon, &tmStop.tm_mday, &tmStop.tm_hour, &tmStop.tm_min, &tmStop.tm_sec) == 6))
-	{
-		t=time(NULL);
-		tmStartWeek=localtime(&t);
-		t-=86400*tmStartWeek->tm_wday;
-		tmStartWeek=localtime(&t);
-
-		tmStartWeek->tm_hour = 0;
-		tmStartWeek->tm_min = 0;
-		tmStartWeek->tm_sec = 0;
-		tbStartWeek.time = mktime(tmStartWeek);
-
-		tmStop.tm_year -= 1900;
-		tmStop.tm_mon -= 1;
-		tbStop.time = mktime(&tmStop);
-		tbStop.millitm = 0;
-
-		result = DiffTimebSec(tbStartWeek, tbStop);
-	}
-
-	return result;
-}
-
-void checkCompositeSchedule(uint8_t connectorId, uint32_t durationReq, struct StructChargingProfile *compositeProfile)
-{
-	FILE *fp;
-	char profileFileName[128];
-	char *line = NULL;
-	size_t len = 0;
-	time_t CurrentTime;
-	struct tm *tmComposite;
-
-	struct StructChargingProfile maxProfile;
-	struct StructChargingProfile defaultTxProfile;
-	struct StructChargingProfile txProfile;
-
-	struct StructChargingSchedulePeriod tmpPeriod;
-	uint8_t limitMax=0;
-	uint8_t limitDef=0;
-	uint8_t limitTx=0;
-
-	int compositePeriodIdx = 0;
-
-	CurrentTime = time(NULL);
-	tmComposite=localtime(&CurrentTime);
-	sprintf((char*)compositeProfile->ChargingSchedule.StartSchedule, "%04d-%02d-%02dT%02d:%02d:%02dZ", tmComposite->tm_year+1900, tmComposite->tm_mon+1, tmComposite->tm_mday, tmComposite->tm_hour, tmComposite->tm_min, tmComposite->tm_sec);
-	sprintf((char*)compositeProfile->ChargingSchedule.ChargingRateUnit, "A");
-	compositeProfile->ChargingSchedule.Duration = durationReq;
-	for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(compositeProfile->ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
-	{
-		compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = -1;
-		compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = -1;
-		compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = 3;
-	}
-	compositeProfile->ChargingProfileId = 1;
-	compositeProfile->StackLevel = 99 ;
-	sprintf((char*)compositeProfile->ChargingProfileKind ,"Absolute");
-
-	maxProfile.ChargingProfileId = -1;
-	defaultTxProfile.ChargingProfileId = -1;
-	txProfile.ChargingProfileId = -1;
-
-	system("yes|rm /tmp/*.json");
-	system("cp /Storage/OCPP/*.json /tmp");
-	/*
-	 * Search valid charging profile
-	 */
-	//DEBUG_INFO("====================================\n");
-	// Search max profile
-	sprintf(profileFileName, "/tmp/ChargePointMaxProfile.json");
-	if((access(profileFileName, F_OK))!=-1)
-	{
-		fp = fopen(profileFileName, "r");
-
-		for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(maxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
-		{
-			maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = -1;
-			maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = -1;
-			maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = 3;
-		}
-		maxProfile.ChargingProfileId = -1;
-		maxProfile.StackLevel = -1;
-
-		while(getline(&line, &len, fp) != -1)
-		{
-			json_object *obj = NULL;
-
-			obj = json_tokener_parse(line);
-			if(is_error(obj))
-			{
-				DEBUG_ERROR("Parse MaxProfile from file error.\n");
-			}
-			else
-			{
-				if((json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "ChargingProfileId")) != maxProfile.ChargingProfileId) &&
-				   (json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "stackLevel")) >= maxProfile.StackLevel)
-				  )
-				{
-					if((json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom") != NULL) &&
-					   (json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo") != NULL)
-					  )
-					{
-						struct tm tmFrom, tmTo;
-						struct timeb tbFrom, tbTo;
-
-						if((sscanf((char*)json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom")), "%4d-%2d-%2dT%2d:%2d:%2d", &tmFrom.tm_year, &tmFrom.tm_mon, &tmFrom.tm_mday, &tmFrom.tm_hour, &tmFrom.tm_min, &tmFrom.tm_sec) == 6) &&
-						   (sscanf((char*)json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo")), "%4d-%2d-%2dT%2d:%2d:%2d", &tmTo.tm_year, &tmTo.tm_mon, &tmTo.tm_mday, &tmTo.tm_hour, &tmTo.tm_min, &tmTo.tm_sec) == 6))
-						{
-							tmFrom.tm_year -= 1900;
-							tmFrom.tm_mon -= 1;
-							tbFrom.time = mktime(&tmFrom);
-
-							tmTo.tm_year -= 1900;
-							tmTo.tm_mon -= 1;
-							tbTo.time = mktime(&tmTo);
-
-							if((DiffTimebWithNowSec(tbFrom)>=0) && (DiffTimebWithNowSec(tbTo)<=0))
-							{
-								if(maxProfile.ChargingProfileId == -1)
-									DEBUG_INFO("MaxProfile found.\n");
-								else
-									DEBUG_INFO("MaxProfile updated.\n");
-
-								// Required item
-								maxProfile.ChargingProfileId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileId"));
-								maxProfile.StackLevel = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "stackLevel"));
-								sprintf((char*)maxProfile.ChargingProfileKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileKind")));
-								sprintf((char*)maxProfile.ChargingSchedule.ChargingRateUnit, "A");
-
-								for(int idxPeriod=0;idxPeriod<json_object_array_length(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"));idxPeriod++)
-								{
-									maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "startPeriod"));
-									maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = (strstr(json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingRateUnit")),"W")!=NULL?json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit"))/220:json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit")));
-									maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = (json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")==NULL?
-																												  3:
-																												  json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")));
-								}
-
-								// Optional item
-								if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom") != NULL)
-								{
-									sprintf((char*)maxProfile.ValidFrom, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom")));
-								}
-								else
-								{
-									sprintf((char*)maxProfile.ValidFrom, " ");
-								}
-
-								if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo") != NULL)
-								{
-									sprintf((char*)maxProfile.ValidTo, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo")));
-								}
-								else
-								{
-									sprintf((char*)maxProfile.ValidTo, " ");
-								}
-
-								if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind") != NULL)
-								{
-									sprintf((char*)maxProfile.RecurrencyKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind")));
-								}
-								else
-								{
-									sprintf((char*)maxProfile.RecurrencyKind, " ");
-								}
-
-								if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId") != NULL)
-								{
-									maxProfile.TransactionId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId"));
-								}
-								else
-								{
-									maxProfile.TransactionId = -1;
-								}
-
-								if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration") != NULL)
-								{
-									maxProfile.ChargingSchedule.Duration = json_object_get_int(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration"));
-								}
-								else
-								{
-									maxProfile.ChargingSchedule.Duration = -1;
-								}
-
-								if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule") != NULL)
-								{
-									sprintf((char*)maxProfile.ChargingSchedule.StartSchedule, "%s", json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule")));
-								}
-								else
-								{
-									sprintf((char*)maxProfile.ChargingSchedule.StartSchedule, " ");
-								}
-
-								if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate") != NULL)
-								{
-									maxProfile.ChargingSchedule.MinChargingRate = json_object_get_double(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate"));
-								}
-								else
-								{
-									maxProfile.ChargingSchedule.MinChargingRate = -1;
-								}
-							}
-						}
-					}
-					else
-					{
-						if(maxProfile.ChargingProfileId == -1)
-							DEBUG_INFO("MaxProfile found.\n");
-						else
-							DEBUG_INFO("MaxProfile updated.\n");
-
-						// Required item
-						maxProfile.ChargingProfileId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileId"));
-						maxProfile.StackLevel = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "stackLevel"));
-						sprintf((char*)maxProfile.ChargingProfileKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileKind")));
-						sprintf((char*)maxProfile.ChargingSchedule.ChargingRateUnit, "A");
-
-						for(int idxPeriod=0;idxPeriod<json_object_array_length(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"));idxPeriod++)
-						{
-							maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "startPeriod"));
-							maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = (strstr((char*)json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingRateUnit")),"W")!=NULL?json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit"))/220:json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit")));
-							maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = (json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")==NULL?
-																										  3:
-																										  json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")));
-						}
-
-						// Optional item
-						if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom") != NULL)
-						{
-							sprintf((char*)maxProfile.ValidFrom, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom")));
-						}
-						else
-						{
-							sprintf((char*)maxProfile.ValidFrom, " ");
-						}
-
-						if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo") != NULL)
-						{
-							sprintf((char*)maxProfile.ValidTo, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo")));
-						}
-						else
-						{
-							sprintf((char*)maxProfile.ValidTo, " ");
-						}
-
-						if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind") != NULL)
-						{
-							sprintf((char*)maxProfile.RecurrencyKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind")));
-						}
-						else
-						{
-							sprintf((char*)maxProfile.RecurrencyKind, " ");
-						}
-
-						if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId") != NULL)
-						{
-							maxProfile.TransactionId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId"));
-						}
-						else
-						{
-							maxProfile.TransactionId = -1;
-						}
-
-						if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration") != NULL)
-						{
-							maxProfile.ChargingSchedule.Duration = json_object_get_int(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration"));
-						}
-						else
-						{
-							maxProfile.ChargingSchedule.Duration = -1;
-						}
-
-						if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule") != NULL)
-						{
-							sprintf((char*)maxProfile.ChargingSchedule.StartSchedule, "%s", json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule")));
-						}
-						else
-						{
-							sprintf((char*)maxProfile.ChargingSchedule.StartSchedule, " ");
-						}
-
-						if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate") != NULL)
-						{
-							maxProfile.ChargingSchedule.MinChargingRate = json_object_get_double(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate"));
-						}
-						else
-						{
-							maxProfile.ChargingSchedule.MinChargingRate = -1;
-						}
-					}
-				}
-			}
-			json_object_put(obj);
-		}
-		fclose(fp);
-/*
-		if(maxProfile.ChargingProfileId !=-1)
-		{
-			DEBUG_INFO("Profile ID: %d\n", maxProfile.ChargingProfileId);
-			DEBUG_INFO("Profile stackLevel: %d\n", maxProfile.StackLevel);
-			DEBUG_INFO("Profile TransactionId: %d\n", maxProfile.TransactionId);
-			DEBUG_INFO("Profile valid from: %s\n", maxProfile.ValidFrom);
-			DEBUG_INFO("Profile valid to: %s\n", maxProfile.ValidTo);
-			DEBUG_INFO("Profile ChargingProfileKind: %s\n", maxProfile.ChargingProfileKind);
-			DEBUG_INFO("Profile RecurrencyKind: %s\n", maxProfile.RecurrencyKind);
-
-			DEBUG_INFO("Profile start schedule: %s\n", maxProfile.ChargingSchedule.StartSchedule);
-			DEBUG_INFO("Profile schedule duration: %d\n", maxProfile.ChargingSchedule.Duration);
-			DEBUG_INFO("Profile charging rate unit: %s\n", maxProfile.ChargingSchedule.ChargingRateUnit);
-			DEBUG_INFO("Profile charging min rate: %f\n", maxProfile.ChargingSchedule.MinChargingRate);
-
-			for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(maxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
-			{
-				if(maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod >= 0)
-				{
-					DEBUG_INFO("Period-%02d startPeriod: %d\n", idxPeriod, maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod);
-					DEBUG_INFO("Period-%02d limit: %f\n", idxPeriod, maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit);
-					DEBUG_INFO("Period-%02d NumberPhases: %d\n", idxPeriod, maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases);
-				}
-			}
-		}
-		else
-			DEBUG_INFO("MaxProfile not found.\n");
-		DEBUG_INFO("------------------------------------\n");*/
-	}
-
-	// Search default tx profile
-	sprintf(profileFileName, "/tmp/TxDefaultProfile_%d.json", connectorId);
-	if((access(profileFileName, F_OK))==-1)
-		sprintf(profileFileName, "/tmp/TxDefaultProfile_0.json");
-
-	if((access(profileFileName, F_OK))!=-1)
-	{
-		fp = fopen(profileFileName, "r");
-
-		for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
-		{
-			defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = -1;
-			defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = -1;
-			defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = 3;
-		}
-		defaultTxProfile.ChargingProfileId = -1;
-		defaultTxProfile.StackLevel = -1;
-
-		while(getline(&line, &len, fp) != -1)
-		{
-			json_object *obj = NULL;
-
-			obj = json_tokener_parse(line);
-			if(is_error(obj))
-			{
-				DEBUG_ERROR("Parse TxDefaultProfile from file error.\n");
-			}
-			else
-			{
-				if((json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "ChargingProfileId")) != defaultTxProfile.ChargingProfileId) &&
-				   (json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "stackLevel")) >= defaultTxProfile.StackLevel)
-				  )
-				{
-					if((json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom") != NULL) &&
-					   (json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo") != NULL)
-					  )
-					{
-						struct tm tmFrom, tmTo;
-						struct timeb tbFrom, tbTo;
-
-						if((sscanf((char*)json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom")), "%4d-%2d-%2dT%2d:%2d:%2d", &tmFrom.tm_year, &tmFrom.tm_mon, &tmFrom.tm_mday, &tmFrom.tm_hour, &tmFrom.tm_min, &tmFrom.tm_sec) == 6) &&
-						   (sscanf((char*)json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo")), "%4d-%2d-%2dT%2d:%2d:%2d", &tmTo.tm_year, &tmTo.tm_mon, &tmTo.tm_mday, &tmTo.tm_hour, &tmTo.tm_min, &tmTo.tm_sec) == 6))
-						{
-							tmFrom.tm_year -= 1900;
-							tmFrom.tm_mon -= 1;
-							tbFrom.time = mktime(&tmFrom);
-
-							tmTo.tm_year -= 1900;
-							tmTo.tm_mon -= 1;
-							tbTo.time = mktime(&tmTo);
-
-							if((DiffTimebWithNowSec(tbFrom)>=0) && (DiffTimebWithNowSec(tbTo)<=0))
-							{
-								if(defaultTxProfile.ChargingProfileId == -1)
-									DEBUG_INFO("TxDefaultProfile found.\n");
-								else
-									DEBUG_INFO("TxDefaultProfile updated.\n");
-
-								// Required item
-								defaultTxProfile.ChargingProfileId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileId"));
-								defaultTxProfile.StackLevel = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "stackLevel"));
-								sprintf((char*)defaultTxProfile.ChargingProfileKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileKind")));
-								sprintf((char*)defaultTxProfile.ChargingSchedule.ChargingRateUnit, "A");
-
-								for(int idxPeriod=0;idxPeriod<json_object_array_length(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"));idxPeriod++)
-								{
-									defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "startPeriod"));
-									defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = (strstr(json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingRateUnit")),"W")!=NULL?json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit"))/220:json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit")));
-									defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = (json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")==NULL?
-																												  3:
-																												  json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")));
-								}
-
-								// Optional item
-								if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom") != NULL)
-								{
-									sprintf((char*)defaultTxProfile.ValidFrom, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom")));
-								}
-								else
-								{
-									sprintf((char*)defaultTxProfile.ValidFrom, " ");
-								}
-
-								if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo") != NULL)
-								{
-									sprintf((char*)defaultTxProfile.ValidTo, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo")));
-								}
-								else
-								{
-									sprintf((char*)defaultTxProfile.ValidTo, " ");
-								}
-
-								if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind") != NULL)
-								{
-									sprintf((char*)defaultTxProfile.RecurrencyKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind")));
-								}
-								else
-								{
-									sprintf((char*)defaultTxProfile.RecurrencyKind, " ");
-								}
-
-								if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId") != NULL)
-								{
-									defaultTxProfile.TransactionId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId"));
-								}
-								else
-								{
-									defaultTxProfile.TransactionId = -1;
-								}
-
-								if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration") != NULL)
-								{
-									defaultTxProfile.ChargingSchedule.Duration = json_object_get_int(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration"));
-								}
-								else
-								{
-									defaultTxProfile.ChargingSchedule.Duration = -1;
-								}
-
-								if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule") != NULL)
-								{
-									sprintf((char*)defaultTxProfile.ChargingSchedule.StartSchedule, "%s", json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule")));
-								}
-								else
-								{
-									sprintf((char*)defaultTxProfile.ChargingSchedule.StartSchedule, " ");
-								}
-
-								if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate") != NULL)
-								{
-									defaultTxProfile.ChargingSchedule.MinChargingRate = json_object_get_double(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate"));
-								}
-								else
-								{
-									defaultTxProfile.ChargingSchedule.MinChargingRate = -1;
-								}
-							}
-						}
-					}
-					else
-					{
-						if(defaultTxProfile.ChargingProfileId == -1)
-							DEBUG_INFO("TxDefaultProfile found.\n");
-						else
-							DEBUG_INFO("TxDefaultProfile updated.\n");
-
-						// Required item
-						defaultTxProfile.ChargingProfileId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileId"));
-						defaultTxProfile.StackLevel = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "stackLevel"));
-						sprintf((char*)defaultTxProfile.ChargingProfileKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileKind")));
-						sprintf((char*)defaultTxProfile.ChargingSchedule.ChargingRateUnit, "A");
-
-						for(int idxPeriod=0;idxPeriod<json_object_array_length(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"));idxPeriod++)
-						{
-							defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "startPeriod"));
-							defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = (strstr(json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingRateUnit")),"W")!=NULL?json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit"))/220:json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit")));
-							defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = (json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")==NULL?
-																										  3:
-																										  json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")));
-						}
-
-						// Optional item
-						if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom") != NULL)
-						{
-							sprintf((char*)defaultTxProfile.ValidFrom, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom")));
-						}
-						else
-						{
-							sprintf((char*)defaultTxProfile.ValidFrom, " ");
-						}
-
-						if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo") != NULL)
-						{
-							sprintf((char*)defaultTxProfile.ValidTo, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo")));
-						}
-						else
-						{
-							sprintf((char*)defaultTxProfile.ValidTo, " ");
-						}
-
-						if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind") != NULL)
-						{
-							sprintf((char*)defaultTxProfile.RecurrencyKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind")));
-						}
-						else
-						{
-							sprintf((char*)defaultTxProfile.RecurrencyKind, " ");
-						}
-
-						if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId") != NULL)
-						{
-							defaultTxProfile.TransactionId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId"));
-						}
-						else
-						{
-							defaultTxProfile.TransactionId = -1;
-						}
-
-						if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration") != NULL)
-						{
-							defaultTxProfile.ChargingSchedule.Duration = json_object_get_int(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration"));
-						}
-						else
-						{
-							defaultTxProfile.ChargingSchedule.Duration = -1;
-						}
-
-						if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule") != NULL)
-						{
-							sprintf((char*)defaultTxProfile.ChargingSchedule.StartSchedule, "%s", json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule")));
-						}
-						else
-						{
-							sprintf((char*)defaultTxProfile.ChargingSchedule.StartSchedule, " ");
-						}
-
-						if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate") != NULL)
-						{
-							maxProfile.ChargingSchedule.MinChargingRate = json_object_get_double(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate"));
-						}
-						else
-						{
-							maxProfile.ChargingSchedule.MinChargingRate = -1;
-						}
-					}
-				}
-			}
-			json_object_put(obj);
-		}
-		fclose(fp);
-/*
-		if(defaultTxProfile.ChargingProfileId != -1)
-		{
-			DEBUG_INFO("Profile ID: %d\n", defaultTxProfile.ChargingProfileId);
-			DEBUG_INFO("Profile stackLevel: %d\n", defaultTxProfile.StackLevel);
-			DEBUG_INFO("Profile TransactionId: %d\n", defaultTxProfile.TransactionId);
-			DEBUG_INFO("Profile valid from: %s\n", defaultTxProfile.ValidFrom);
-			DEBUG_INFO("Profile valid to: %s\n", defaultTxProfile.ValidTo);
-			DEBUG_INFO("Profile ChargingProfileKind: %s\n", defaultTxProfile.ChargingProfileKind);
-			DEBUG_INFO("Profile RecurrencyKind: %s\n", defaultTxProfile.RecurrencyKind);
-
-			DEBUG_INFO("Profile start schedule: %s\n", defaultTxProfile.ChargingSchedule.StartSchedule);
-			DEBUG_INFO("Profile schedule duration: %d\n", defaultTxProfile.ChargingSchedule.Duration);
-			DEBUG_INFO("Profile charging rate unit: %s\n", defaultTxProfile.ChargingSchedule.ChargingRateUnit);
-			DEBUG_INFO("Profile charging min rate: %f\n", defaultTxProfile.ChargingSchedule.MinChargingRate);
-
-			for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
-			{
-				if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod >= 0)
-				{
-					DEBUG_INFO("Period-%02d startPeriod: %d\n", idxPeriod, defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod);
-					DEBUG_INFO("Period-%02d limit: %f\n", idxPeriod, defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit);
-					DEBUG_INFO("Period-%02d NumberPhases: %d\n", idxPeriod, defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases);
-				}
-			}
-		}
-		else
-			DEBUG_INFO("TxDefaultProfile not found.\n");
-
-		DEBUG_INFO("------------------------------------\n");*/
-	}
-
-	// Search tx profile
-	sprintf(profileFileName, "/tmp/TxProfile_%d.json", connectorId);
-	if((access(profileFileName, F_OK))!=-1)
-	{
-		fp = fopen(profileFileName, "r");
-
-		for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(txProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
-		{
-			txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = -1;
-			txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = -1;
-			txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = 3;
-		}
-		txProfile.ChargingProfileId = -1;
-		txProfile.StackLevel = -1;
-
-		while(getline(&line, &len, fp) != -1)
-		{
-			json_object *obj = NULL;
-
-			obj = json_tokener_parse(line);
-			if(is_error(obj))
-			{
-				DEBUG_ERROR("Parse txProfile from file error.\n");
-			}
-			else
-			{
-				if((json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "ChargingProfileId")) != txProfile.ChargingProfileId) &&
-				   (json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "stackLevel")) >= txProfile.StackLevel)
-				  )
-				{
-					if((json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom") != NULL) &&
-					   (json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo") != NULL)
-					  )
-					{
-						struct tm tmFrom, tmTo;
-						struct timeb tbFrom, tbTo;
-
-						if((sscanf((char*)json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom")), "%4d-%2d-%2dT%2d:%2d:%2d", &tmFrom.tm_year, &tmFrom.tm_mon, &tmFrom.tm_mday, &tmFrom.tm_hour, &tmFrom.tm_min, &tmFrom.tm_sec) == 6) &&
-						   (sscanf((char*)json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo")), "%4d-%2d-%2dT%2d:%2d:%2d", &tmTo.tm_year, &tmTo.tm_mon, &tmTo.tm_mday, &tmTo.tm_hour, &tmTo.tm_min, &tmTo.tm_sec) == 6))
-						{
-							tmFrom.tm_year -= 1900;
-							tmFrom.tm_mon -= 1;
-							tbFrom.time = mktime(&tmFrom);
-
-							tmTo.tm_year -= 1900;
-							tmTo.tm_mon -= 1;
-							tbTo.time = mktime(&tmTo);
-
-							if((DiffTimebWithNowSec(tbFrom)>=0) && (DiffTimebWithNowSec(tbTo)<=0))
-							{
-								if(txProfile.ChargingProfileId == -1)
-									DEBUG_INFO("TxProfile found.\n");
-								else
-									DEBUG_INFO("TxProfile updated.\n");
-
-								// Required item
-								txProfile.ChargingProfileId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileId"));
-								txProfile.StackLevel = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "stackLevel"));
-								sprintf((char*)txProfile.ChargingProfileKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileKind")));
-								sprintf((char*)txProfile.ChargingSchedule.ChargingRateUnit, "A");
-
-								for(int idxPeriod=0;idxPeriod<json_object_array_length(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"));idxPeriod++)
-								{
-									txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "startPeriod"));
-									txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = (strstr(json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingRateUnit")),"W")!=NULL?json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit"))/220:json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit")));
-									txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = (json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")==NULL?
-																												  3:
-																												  json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")));
-								}
-
-								// Optional item
-								if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom") != NULL)
-								{
-									sprintf((char*)txProfile.ValidFrom, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom")));
-								}
-								else
-								{
-									sprintf((char*)txProfile.ValidFrom, " ");
-								}
-
-								if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo") != NULL)
-								{
-									sprintf((char*)txProfile.ValidTo, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo")));
-								}
-								else
-								{
-									sprintf((char*)txProfile.ValidTo, " ");
-								}
-
-								if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind") != NULL)
-								{
-									sprintf((char*)txProfile.RecurrencyKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind")));
-								}
-								else
-								{
-									sprintf((char*)txProfile.RecurrencyKind, " ");
-								}
-
-								if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId") != NULL)
-								{
-									txProfile.TransactionId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId"));
-								}
-								else
-								{
-									txProfile.TransactionId = -1;
-								}
-
-								if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration") != NULL)
-								{
-									txProfile.ChargingSchedule.Duration = json_object_get_int(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration"));
-								}
-								else
-								{
-									txProfile.ChargingSchedule.Duration = -1;
-								}
-
-								if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule") != NULL)
-								{
-									sprintf((char*)txProfile.ChargingSchedule.StartSchedule, "%s", json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule")));
-								}
-								else
-								{
-									sprintf((char*)txProfile.ChargingSchedule.StartSchedule, " ");
-								}
-
-								if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate") != NULL)
-								{
-									txProfile.ChargingSchedule.MinChargingRate = json_object_get_double(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate"));
-								}
-								else
-								{
-									txProfile.ChargingSchedule.MinChargingRate = -1;
-								}
-							}
-						}
-					}
-					else
-					{
-						if(txProfile.ChargingProfileId == -1)
-							DEBUG_INFO("TxProfile found.\n");
-						else
-							DEBUG_INFO("TxProfile updated.\n");
-
-						// Required item
-						txProfile.ChargingProfileId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileId"));
-						txProfile.StackLevel = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "stackLevel"));
-						sprintf((char*)txProfile.ChargingProfileKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileKind")));
-						sprintf((char*)txProfile.ChargingSchedule.ChargingRateUnit, "A");
-
-						for(int idxPeriod=0;idxPeriod<json_object_array_length(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"));idxPeriod++)
-						{
-							txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "startPeriod"));
-							txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = (strstr(json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingRateUnit")),"W")!=NULL?json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit"))/220:json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit")));
-							txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = (json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")==NULL?
-																										  3:
-																										  json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")));
-						}
-
-						// Optional item
-						if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom") != NULL)
-						{
-							sprintf((char*)txProfile.ValidFrom, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom")));
-						}
-						else
-						{
-							sprintf((char*)txProfile.ValidFrom, " ");
-						}
-
-						if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo") != NULL)
-						{
-							sprintf((char*)txProfile.ValidTo, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo")));
-						}
-						else
-						{
-							sprintf((char*)txProfile.ValidTo, " ");
-						}
-
-						if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind") != NULL)
-						{
-							sprintf((char*)txProfile.RecurrencyKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind")));
-						}
-						else
-						{
-							sprintf((char*)txProfile.RecurrencyKind, " ");
-						}
-
-						if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId") != NULL)
-						{
-							txProfile.TransactionId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId"));
-						}
-						else
-						{
-							txProfile.TransactionId = -1;
-						}
-
-						if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration") != NULL)
-						{
-							txProfile.ChargingSchedule.Duration = json_object_get_int(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration"));
-						}
-						else
-						{
-							txProfile.ChargingSchedule.Duration = -1;
-						}
-
-						if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule") != NULL)
-						{
-							sprintf((char*)txProfile.ChargingSchedule.StartSchedule, "%s", json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule")));
-						}
-						else
-						{
-							sprintf((char*)txProfile.ChargingSchedule.StartSchedule, " ");
-						}
-
-						if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate") != NULL)
-						{
-							maxProfile.ChargingSchedule.MinChargingRate = json_object_get_double(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate"));
-						}
-						else
-						{
-							maxProfile.ChargingSchedule.MinChargingRate = -1;
-						}
-					}
-				}
-			}
-			json_object_put(obj);
-		}
-		fclose(fp);
-/*
-		if(defaultTxProfile.ChargingProfileId != -1)
-		{
-			DEBUG_INFO("Profile ID: %d\n", txProfile.ChargingProfileId);
-			DEBUG_INFO("Profile stackLevel: %d\n", txProfile.StackLevel);
-			DEBUG_INFO("Profile TransactionId: %d\n", txProfile.TransactionId);
-			DEBUG_INFO("Profile valid from: %s\n", txProfile.ValidFrom);
-			DEBUG_INFO("Profile valid to: %s\n", txProfile.ValidTo);
-			DEBUG_INFO("Profile ChargingProfileKind: %s\n", txProfile.ChargingProfileKind);
-			DEBUG_INFO("Profile RecurrencyKind: %s\n", txProfile.RecurrencyKind);
-
-			DEBUG_INFO("Profile start schedule: %s\n", txProfile.ChargingSchedule.StartSchedule);
-			DEBUG_INFO("Profile schedule duration: %d\n", txProfile.ChargingSchedule.Duration);
-			DEBUG_INFO("Profile charging rate unit: %s\n", txProfile.ChargingSchedule.ChargingRateUnit);
-			DEBUG_INFO("Profile charging min rate: %f\n", txProfile.ChargingSchedule.MinChargingRate);
-
-			for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(txProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
-			{
-				if(txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod >= 0)
-				{
-					DEBUG_INFO("Period-%02d startPeriod: %d\n", idxPeriod, txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod);
-					DEBUG_INFO("Period-%02d limit: %f\n", idxPeriod, txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit);
-					DEBUG_INFO("Period-%02d NumberPhases: %d\n", idxPeriod, txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases);
-				}
-			}
-		}
-		else
-			DEBUG_INFO("TxProfile not found.\n");*/
-	}
-
-	/*
-	 * Align found profile start schedule & periods
-	 */
-	//DEBUG_INFO("====================================\n");
-	/*
-	// For local test usage, force modify found profile start schedule info
-	sprintf((char*)maxProfile.ChargingSchedule.StartSchedule, "%04d-%02d-%02dT%02d:%02d:%02dZ", tmComposite->tm_year+1900, tmComposite->tm_mon+1, tmComposite->tm_mday, tmComposite->tm_hour, tmComposite->tm_min, tmComposite->tm_sec-10);
-	sprintf((char*)defaultTxProfile.ChargingSchedule.StartSchedule, "%04d-%02d-%02dT%02d:%02d:%02dZ", tmComposite->tm_year+1900, tmComposite->tm_mon+1, tmComposite->tm_mday, tmComposite->tm_hour, tmComposite->tm_min, tmComposite->tm_sec-5);
-	sprintf((char*)txProfile.ChargingSchedule.StartSchedule, "%04d-%02d-%02dT%02d:%02d:%02dZ", tmComposite->tm_year+1900, tmComposite->tm_mon+1, tmComposite->tm_mday, tmComposite->tm_hour, tmComposite->tm_min, tmComposite->tm_sec-3);
-*/
-
-	if(maxProfile.ChargingProfileId != -1)
-	{
-		if(strstr((char*)maxProfile.ChargingProfileKind, "Absolute") != NULL)
-		{
-			if(maxProfile.ChargingSchedule.Duration != -1)
-			{
-				maxProfile.ChargingSchedule.Duration = ((maxProfile.ChargingSchedule.Duration-getStartStop(maxProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule))<0?
-														0:
-														(maxProfile.ChargingSchedule.Duration-getStartStop(maxProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule)));
-			}
-
-			for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(maxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
-			{
-				if(maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
-				{
-					maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = ((maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(maxProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule))<0?
-																								 0:
-																								 (maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(maxProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule)));
-				}
-			}
-		}
-		else if(strstr((char*)maxProfile.ChargingProfileKind, "Relative") != NULL)
-		{
-			if(maxProfile.ChargingSchedule.Duration != -1)
-			{
-				maxProfile.ChargingSchedule.Duration = (strstr((char*)ShmOCPP16Data->StatusNotification[(connectorId==0?0:connectorId-1)].Status, "Charging")==NULL)?maxProfile.ChargingSchedule.Duration:((maxProfile.ChargingSchedule.Duration-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule))<0?
-																																								  0:
-																																								 (maxProfile.ChargingSchedule.Duration-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule)));
-			}
-
-			for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(maxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
-			{
-				if(maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
-				{
-					maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = (strstr((char*)ShmOCPP16Data->StatusNotification[(connectorId==0?0:connectorId-1)].Status, "Charging")==NULL)?maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod:((maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule))<0?
-																																																											    0:
-																																																											   (maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule)));
-				}
-			}
-		}
-		else
-		{
-			if(strstr((char*)maxProfile.RecurrencyKind, "Weekly") != NULL)
-			{
-				if(maxProfile.ChargingSchedule.Duration != -1)
-				{
-					maxProfile.ChargingSchedule.Duration = ((maxProfile.ChargingSchedule.Duration-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule))<0?
-															0:
-															(maxProfile.ChargingSchedule.Duration-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule)));
-				}
-
-				for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(maxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
-				{
-					if(maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
-					{
-						maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = ((maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule))<0?
-																									 0:
-																									 (maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule)));
-					}
-				}
-			}
-			else
-			{
-				if(maxProfile.ChargingSchedule.Duration != -1)
-				{
-					maxProfile.ChargingSchedule.Duration = ((maxProfile.ChargingSchedule.Duration-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule))<0?
-															0:
-															(maxProfile.ChargingSchedule.Duration-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule)));
-				}
-
-				for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(maxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
-				{
-					if(maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
-					{
-						maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = ((maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule))<0?
-																									 0:
-																									 (maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule)));
-					}
-				}
-			}
-		}
-/*
-		DEBUG_INFO("MaxProfile after align.\n");
-		DEBUG_INFO("Profile ID: %d\n", maxProfile.ChargingProfileId);
-		DEBUG_INFO("Profile stackLevel: %d\n", maxProfile.StackLevel);
-		DEBUG_INFO("Profile TransactionId: %d\n", maxProfile.TransactionId);
-		DEBUG_INFO("Profile valid from: %s\n", maxProfile.ValidFrom);
-		DEBUG_INFO("Profile valid to: %s\n", maxProfile.ValidTo);
-		DEBUG_INFO("Profile ChargingProfileKind: %s\n", maxProfile.ChargingProfileKind);
-		DEBUG_INFO("Profile RecurrencyKind: %s\n", maxProfile.RecurrencyKind);
-
-		DEBUG_INFO("Profile start schedule: %s\n", compositeProfile->ChargingSchedule.StartSchedule);
-		DEBUG_INFO("Profile schedule duration: %d\n", maxProfile.ChargingSchedule.Duration);
-		DEBUG_INFO("Profile charging rate unit: %s\n", maxProfile.ChargingSchedule.ChargingRateUnit);
-		DEBUG_INFO("Profile charging min rate: %f\n", maxProfile.ChargingSchedule.MinChargingRate);
-
-		for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(maxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
-		{
-			if(maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod >= 0)
-			{
-				DEBUG_INFO("Period-%02d startPeriod: %d\n", idxPeriod, maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod);
-				DEBUG_INFO("Period-%02d limit: %f\n", idxPeriod, maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit);
-				DEBUG_INFO("Period-%02d NumberPhases: %d\n", idxPeriod, maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases);
-			}
-		}
-		DEBUG_INFO("------------------------------------\n");*/
-	}
-
-	if(defaultTxProfile.ChargingProfileId != -1)
-	{
-		if(strstr((char*)defaultTxProfile.ChargingProfileKind, "Absolute") != NULL)
-		{
-			if(defaultTxProfile.ChargingSchedule.Duration != -1)
-			{
-				defaultTxProfile.ChargingSchedule.Duration = ((defaultTxProfile.ChargingSchedule.Duration-getStartStop(defaultTxProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule))<0?
-														0:
-														(defaultTxProfile.ChargingSchedule.Duration-getStartStop(defaultTxProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule)));
-			}
-
-			for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
-			{
-				if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
-				{
-					defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = ((defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(defaultTxProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule))<0?
-																								 0:
-																								 (defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(defaultTxProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule)));
-				}
-			}
-		}
-		else if(strstr((char*)defaultTxProfile.ChargingProfileKind, "Relative") != NULL)
-		{
-			if(defaultTxProfile.ChargingSchedule.Duration != -1)
-			{
-				defaultTxProfile.ChargingSchedule.Duration = (strstr((char*)ShmOCPP16Data->StatusNotification[(connectorId==0?0:connectorId-1)].Status, "Charging")==NULL)?defaultTxProfile.ChargingSchedule.Duration:((defaultTxProfile.ChargingSchedule.Duration-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule))<0?
-																																								  0:
-																																								 (defaultTxProfile.ChargingSchedule.Duration-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule)));
-			}
-
-			for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
-			{
-				if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
-				{
-					defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = (strstr((char*)ShmOCPP16Data->StatusNotification[(connectorId==0?0:connectorId-1)].Status, "Charging")==NULL)?defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod:((defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule))<0?
-																																																												0:
-																																																											   (defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule)));
-				}
-			}
-		}
-		else
-		{
-			if(strstr((char*)defaultTxProfile.RecurrencyKind, "Weekly") != NULL)
-			{
-				if(defaultTxProfile.ChargingSchedule.Duration != -1)
-				{
-					defaultTxProfile.ChargingSchedule.Duration = ((defaultTxProfile.ChargingSchedule.Duration-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule))<0?
-															0:
-															(defaultTxProfile.ChargingSchedule.Duration-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule)));
-				}
-
-				for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
-				{
-					if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
-					{
-						defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = ((defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule))<0?
-																									 0:
-																									 (defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule)));
-					}
-				}
-			}
-			else
-			{
-				if(defaultTxProfile.ChargingSchedule.Duration != -1)
-				{
-					defaultTxProfile.ChargingSchedule.Duration = ((defaultTxProfile.ChargingSchedule.Duration-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule))<0?
-															0:
-															(defaultTxProfile.ChargingSchedule.Duration-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule)));
-				}
-
-				for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
-				{
-					if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
-					{
-						defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = ((defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule))<0?
-																									 0:
-																									 (defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule)));
-					}
-				}
-			}
-		}
-/*
-		DEBUG_INFO("defaultTxProfile after align.\n");
-		DEBUG_INFO("Profile ID: %d\n", defaultTxProfile.ChargingProfileId);
-		DEBUG_INFO("Profile stackLevel: %d\n", defaultTxProfile.StackLevel);
-		DEBUG_INFO("Profile TransactionId: %d\n", defaultTxProfile.TransactionId);
-		DEBUG_INFO("Profile valid from: %s\n", defaultTxProfile.ValidFrom);
-		DEBUG_INFO("Profile valid to: %s\n", defaultTxProfile.ValidTo);
-		DEBUG_INFO("Profile ChargingProfileKind: %s\n", defaultTxProfile.ChargingProfileKind);
-		DEBUG_INFO("Profile RecurrencyKind: %s\n", defaultTxProfile.RecurrencyKind);
-
-		DEBUG_INFO("Profile start schedule: %s\n", compositeProfile->ChargingSchedule.StartSchedule);
-		DEBUG_INFO("Profile schedule duration: %d\n", defaultTxProfile.ChargingSchedule.Duration);
-		DEBUG_INFO("Profile charging rate unit: %s\n", defaultTxProfile.ChargingSchedule.ChargingRateUnit);
-		DEBUG_INFO("Profile charging min rate: %f\n", defaultTxProfile.ChargingSchedule.MinChargingRate);
-
-		for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
-		{
-			if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod >= 0)
-			{
-				DEBUG_INFO("Period-%02d startPeriod: %d\n", idxPeriod, defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod);
-				DEBUG_INFO("Period-%02d limit: %f\n", idxPeriod, defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit);
-				DEBUG_INFO("Period-%02d NumberPhases: %d\n", idxPeriod, defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases);
-			}
-		}
-		DEBUG_INFO("------------------------------------\n");*/
-	}
-
-	if(txProfile.ChargingProfileId != -1)
-	{
-		if(strstr((char*)txProfile.ChargingProfileKind, "Absolute") != NULL)
-		{
-			if(txProfile.ChargingSchedule.Duration != -1)
-			{
-				txProfile.ChargingSchedule.Duration = ((txProfile.ChargingSchedule.Duration-getStartStop(txProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule))<0?
-														0:
-														(txProfile.ChargingSchedule.Duration-getStartStop(txProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule)));
-			}
-
-			for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(txProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
-			{
-				if(txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
-				{
-					txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = ((txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(txProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule))<0?
-																								 0:
-																								 (txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(txProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule)));
-				}
-			}
-		}
-		else if(strstr((char*)txProfile.ChargingProfileKind, "Relative") != NULL)
-		{
-			if(txProfile.ChargingSchedule.Duration != -1)
-			{
-				txProfile.ChargingSchedule.Duration = (strstr((char*)ShmOCPP16Data->StatusNotification[(connectorId==0?0:connectorId-1)].Status, "Charging")==NULL)?txProfile.ChargingSchedule.Duration:((txProfile.ChargingSchedule.Duration-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule))<0?
-																																								  0:
-																																								 (txProfile.ChargingSchedule.Duration-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule)));
-			}
-
-			for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(txProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
-			{
-				if(txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
-				{
-					txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = (strstr((char*)ShmOCPP16Data->StatusNotification[(connectorId==0?0:connectorId-1)].Status, "Charging")==NULL)?txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod:((txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule))<0?
-																																																												0:
-																																																											   (txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule)));
-				}
-			}
-		}
-		else
-		{
-			if(strstr((char*)txProfile.RecurrencyKind, "Weekly") != NULL)
-			{
-				if(txProfile.ChargingSchedule.Duration != -1)
-				{
-					txProfile.ChargingSchedule.Duration = ((txProfile.ChargingSchedule.Duration-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule))<0?
-															0:
-															(txProfile.ChargingSchedule.Duration-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule)));
-				}
-
-				for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(txProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
-				{
-					if(txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
-					{
-						txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = ((txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule))<0?
-																									 0:
-																									 (txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule)));
-					}
-				}
-			}
-			else
-			{
-				if(txProfile.ChargingSchedule.Duration != -1)
-				{
-					txProfile.ChargingSchedule.Duration = ((txProfile.ChargingSchedule.Duration-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule))<0?
-															0:
-															(txProfile.ChargingSchedule.Duration-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule)));
-				}
-
-				for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(txProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
-				{
-					if(txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
-					{
-						txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = ((txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule))<0?
-																									 0:
-																									 (txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule)));
-					}
-				}
-			}
-		}
-		/*
-		DEBUG_INFO("txProfile after align.\n");
-		DEBUG_INFO("Profile ID: %d\n", txProfile.ChargingProfileId);
-		DEBUG_INFO("Profile stackLevel: %d\n", txProfile.StackLevel);
-		DEBUG_INFO("Profile TransactionId: %d\n", txProfile.TransactionId);
-		DEBUG_INFO("Profile valid from: %s\n", txProfile.ValidFrom);
-		DEBUG_INFO("Profile valid to: %s\n", txProfile.ValidTo);
-		DEBUG_INFO("Profile ChargingProfileKind: %s\n", txProfile.ChargingProfileKind);
-		DEBUG_INFO("Profile RecurrencyKind: %s\n", txProfile.RecurrencyKind);
-
-		DEBUG_INFO("Profile start schedule: %s\n", compositeProfile->ChargingSchedule.StartSchedule);
-		DEBUG_INFO("Profile schedule duration: %d\n", txProfile.ChargingSchedule.Duration);
-		DEBUG_INFO("Profile charging rate unit: %s\n", txProfile.ChargingSchedule.ChargingRateUnit);
-		DEBUG_INFO("Profile charging min rate: %f\n", txProfile.ChargingSchedule.MinChargingRate);
-
-		for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(txProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
-		{
-			if(txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod >= 0)
-			{
-				DEBUG_INFO("Period-%02d startPeriod: %d\n", idxPeriod, txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod);
-				DEBUG_INFO("Period-%02d limit: %f\n", idxPeriod, txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit);
-				DEBUG_INFO("Period-%02d NumberPhases: %d\n", idxPeriod, txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases);
-			}
-		}*/
-	}
-
-	/*
-	 * Merge to conposite schedule
-	 */
-	//DEBUG_INFO("====================================\n");
-	// Find each profile period quantity
-	for(int idx=0;idx<ARRAY_SIZE(maxProfile.ChargingSchedule.ChargingSchedulePeriod);idx++)
-	{
-		if(maxProfile.ChargingSchedule.ChargingSchedulePeriod[idx].Limit != -1)
-			limitMax = idx+1;
-	}
-
-	for(int idx=0;idx<ARRAY_SIZE(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod);idx++)
-	{
-		if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idx].Limit != -1)
-			limitDef = idx+1;
-	}
-
-	for(int idx=0;idx<ARRAY_SIZE(txProfile.ChargingSchedule.ChargingSchedulePeriod);idx++)
-	{
-		if(txProfile.ChargingSchedule.ChargingSchedulePeriod[idx].Limit != -1)
-			limitTx = idx+1;
-	}
-
-	// TxProfile found, composite schedule based on it
-	if(txProfile.ChargingProfileId != -1)
-	{
-		for(int idxTxPeriod=0;idxTxPeriod<limitTx;idxTxPeriod++)
-		{
-			if((txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].Limit != -1) &&
-			   (txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].StartPeriod < durationReq))
-			{
-				if(maxProfile.ChargingProfileId != -1)
-				{
-					for(int idxMaxPeriod=0;idxMaxPeriod<limitMax;idxMaxPeriod++)
-					{
-						if((txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].StartPeriod >= maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].StartPeriod) &&
-						   (maxProfile.ChargingSchedule.Duration > txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].StartPeriod))
-						{
-							tmpPeriod.StartPeriod = txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].StartPeriod;
-							tmpPeriod.NumberPhases = txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].NumberPhases;
-							tmpPeriod.Limit = (txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].Limit>maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].Limit?maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].Limit:txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].Limit);
-						}
-
-						if(idxMaxPeriod == (limitMax-1))
-						{
-							if(tmpPeriod.Limit != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].Limit)
-							{
-								if(tmpPeriod.StartPeriod != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].StartPeriod)
-								{
-									memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx], &tmpPeriod , sizeof(struct StructChargingSchedulePeriod));
-									compositePeriodIdx++;
-								}
-								else
-								{
-									memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)], &tmpPeriod , sizeof(struct StructChargingSchedulePeriod));
-								}
-							}
-						}
-					}
-				}
-				else
-				{
-					if(txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].StartPeriod != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].StartPeriod)
-					{
-						memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx], &txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod],sizeof(struct StructChargingSchedulePeriod));
-						compositePeriodIdx++;
-					}
-					else
-					{
-						memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)], &txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod],sizeof(struct StructChargingSchedulePeriod));
-					}
-				}
-			}
-
-			if(idxTxPeriod == (limitTx-1))
-			{
-				if(defaultTxProfile.ChargingProfileId != -1)
-				{
-					for(int idxDefPeriod=0;idxDefPeriod<limitDef;idxDefPeriod++)
-					{
-						if((defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].StartPeriod > txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].StartPeriod) &&
-						   (defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].StartPeriod < durationReq))
-						{
-							if(maxProfile.ChargingProfileId != -1)
-							{
-								for(int idxMaxPeriod=0;idxMaxPeriod<limitMax;idxMaxPeriod++)
-								{
-									if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].StartPeriod >= maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].StartPeriod)
-									{
-										tmpPeriod.StartPeriod = defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].StartPeriod;
-										tmpPeriod.NumberPhases = defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].NumberPhases;
-										tmpPeriod.Limit = (defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].Limit>maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].Limit?maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].Limit:defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].Limit);
-
-										if(tmpPeriod.Limit != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].Limit)
-										{
-											if(tmpPeriod.StartPeriod != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].StartPeriod)
-											{
-												memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx], &tmpPeriod , sizeof(struct StructChargingSchedulePeriod));
-												compositePeriodIdx++;
-											}
-											else
-											{
-												memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)], &tmpPeriod , sizeof(struct StructChargingSchedulePeriod));
-											}
-										}
-
-										break;
-									}
-								}
-							}
-							else
-							{
-								if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].StartPeriod != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].StartPeriod)
-								{
-									memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx], &defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod],sizeof(struct StructChargingSchedulePeriod));
-									compositePeriodIdx++;
-								}
-								else
-								{
-									memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)], &defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod],sizeof(struct StructChargingSchedulePeriod));
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-	}
-	// TxProfile not found but defaultTxProfile found, composite schedule based on it
-	else if(defaultTxProfile.ChargingProfileId != -1)
-	{
-		for(int idxDefPeriod=0;idxDefPeriod<limitDef;idxDefPeriod++)
-		{
-			if((defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].Limit != -1) &&
-			   (defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].StartPeriod < durationReq))
-			{
-				if(maxProfile.ChargingProfileId != -1)
-				{
-					for(int idxMaxPeriod=0;idxMaxPeriod<limitMax;idxMaxPeriod++)
-					{
-						if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].StartPeriod >= maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].StartPeriod)
-						{
-							tmpPeriod.StartPeriod = defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].StartPeriod;
-							tmpPeriod.NumberPhases = defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].NumberPhases;
-							tmpPeriod.Limit = (defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].Limit>maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].Limit?maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].Limit:defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].Limit);
-
-							if(tmpPeriod.Limit != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].Limit)
-							{
-								if(tmpPeriod.StartPeriod != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].StartPeriod)
-								{
-									memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx], &tmpPeriod , sizeof(struct StructChargingSchedulePeriod));
-									compositePeriodIdx++;
-								}
-								else
-								{
-									memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)], &tmpPeriod , sizeof(struct StructChargingSchedulePeriod));
-								}
-							}
-
-							break;
-						}
-					}
-				}
-				else
-				{
-					if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].StartPeriod != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].StartPeriod)
-					{
-						memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx], &defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod],sizeof(struct StructChargingSchedulePeriod));
-						compositePeriodIdx++;
-					}
-					else
-					{
-						memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)], &defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod],sizeof(struct StructChargingSchedulePeriod));
-					}
-				}
-			}
-		}
-	}
-
-	// Fill other period by MaxProfile
-	if(maxProfile.ChargingProfileId != -1)
-	{
-		for(int idxMaxPeriod=0;idxMaxPeriod<limitMax;idxMaxPeriod++)
-		{
-			if((maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].Limit != -1) &&
-			   (maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].StartPeriod < durationReq))
-			{
-				if((maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].StartPeriod >= compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx==0?0:compositePeriodIdx-1].StartPeriod) &&
-				   (maxProfile.ChargingSchedule.Duration > compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx==0?0:compositePeriodIdx-1].StartPeriod))
-				{
-					tmpPeriod.StartPeriod = compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx==0?0:compositePeriodIdx-1].StartPeriod;
-					tmpPeriod.NumberPhases = compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx==0?0:compositePeriodIdx-1].NumberPhases;
-					tmpPeriod.Limit = maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].Limit;
-				}
-
-				if(idxMaxPeriod == (limitMax-1))
-				{
-					if(maxProfile.ChargingSchedule.Duration > compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx==0?0:compositePeriodIdx-1].StartPeriod)
-					{
-						tmpPeriod.StartPeriod = compositeProfile->ChargingSchedule.Duration;
-						tmpPeriod.NumberPhases = maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].NumberPhases;
-						tmpPeriod.Limit = maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].Limit;
-					}
-
-					if(tmpPeriod.Limit != -1)
-					{
-						if(tmpPeriod.Limit != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].Limit)
-						{
-							if(tmpPeriod.StartPeriod != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].StartPeriod)
-							{
-								memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx], &tmpPeriod , sizeof(struct StructChargingSchedulePeriod));
-								compositePeriodIdx++;
-							}
-							else
-							{
-								memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)], &tmpPeriod , sizeof(struct StructChargingSchedulePeriod));
-							}
-						}
-					}
-				}
-			}
-		}
-	}
-
-	DEBUG_INFO("Composite schedule start: %s\n", compositeProfile->ChargingSchedule.StartSchedule);
-	DEBUG_INFO("Composite schedule duration: %d\n", compositeProfile->ChargingSchedule.Duration);
-	DEBUG_INFO("Composite rate unit: %s\n", compositeProfile->ChargingSchedule.ChargingRateUnit);
-	for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(compositeProfile->ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
-	{
-		if(compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod >= 0)
-		{
-			DEBUG_INFO("Period-%02d startPeriod: %d\n", idxPeriod, compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod);
-			DEBUG_INFO("Period-%02d limit: %f\n", idxPeriod, compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit);
-			DEBUG_INFO("Period-%02d NumberPhases: %d\n", idxPeriod, compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases);
-		}
-
-		if(compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit == -1)
-			compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit =0;
-
-		if(compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod == -1)
-			compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod =0;
-	}
-
-	if(line)
-		free(line);
-}
-
-//==========================================
-// Init all share memory
-//==========================================
-int InitShareMemory()
-{
-	int result = PASS;
-	int MeterSMId;
-
-	//creat ShmSysConfigAndInfo
-	if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo),  0777)) < 0)
-    {
-		DEBUG_ERROR("shmget ShmSysConfigAndInfo NG\n");
-		result = FAIL;
-	}
-    else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
-    {
-    	DEBUG_ERROR("shmat ShmSysConfigAndInfo NG\n");
-    	result = FAIL;
-   	 }
-    else
-    {}
-
-   	if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData),  0777)) < 0)
-    {
-   		DEBUG_ERROR("shmget ShmStatusCodeData NG\n");
-   		result = FAIL;
-	}
-    else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
-    {
-    	DEBUG_ERROR("shmat ShmStatusCodeData NG\n");
-    	result = FAIL;
-   	}
-    else
-    {}
-
-	//creat ShmPsuData
-   	if ((MeterSMId = shmget(ShmPsuKey, sizeof(struct PsuData), 0777)) < 0)
-    {
-   		DEBUG_ERROR("shmget ShmPsuData NG\n");
-   		result = FAIL;
-	}
-    else if ((ShmPsuData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
-    {
-    	DEBUG_ERROR("shmat ShmPsuData NG\n");
-    	result = FAIL;
-   	}
-    else
-    {}
-
-   	//creat ShmOCPP16Data
-   	if ((MeterSMId = shmget(ShmOcppModuleKey, sizeof(struct OCPP16Data),  0777)) < 0)
-	{
-		DEBUG_ERROR("shmget ShmOCPP16Data NG");
-		result = FAIL;
-	}
-	else if ((ShmOCPP16Data = shmat(MeterSMId, NULL, 0)) == (void *) -1)
-	{
-		DEBUG_ERROR("shmat ShmOCPP16Data NG");
-		result = FAIL;
-	}
-	else
-	{}
-
-
-    /****************************** For Initial Settings************************************************/
-	ShmOCPP16Data->GetConfiguration.ResponseUnknownKey = NULL;
-	ShmOCPP16Data->SendLocalList.LocalAuthorizationList = NULL;
-
-	// allocate Configuration memory address
-	ShmOCPP16Data->GetConfiguration.Key = staticKeyArray;
-	ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey = staticResponseConfigurationKeyArray;
-	ShmOCPP16Data->GetConfiguration.ResponseUnknownKey = staticResponseUnknownKey;
-	ShmOCPP16Data->SendLocalList.LocalAuthorizationList = staticLocalAuthorizationList;
-
-	//offline MeterValue Interval
-	TempMeterValueInterval = 0;
-
-	return result;
-}
-
-
-int ProcessShareMemory()
-{
-	if(InitShareMemory() == FAIL)
-	{
-		DEBUG_ERROR("InitShareMemory NG\n");
-
-		if(ShmStatusCodeData!=NULL)
-		{
-			ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=1;
-		}
-		sleep(5);
-		return FAIL;
-	}
-	return PASS;
-}
-
-//---------------------common routine---------------------------//
-int isOFFline(void)
-{
-	if(ShmSysConfigAndInfo->SysInfo.InternetConn == 0)
-	{
-		if(TempMeterValueInterval >=  2  )
-		{
-			TempMeterValueInterval = 0;
-			return TRUE;
-		}
-		else
-		{
-			TempMeterValueInterval = TempMeterValueInterval+ 1;
-			return FALSE;
-		}
-	}
-	else
-	{
-		return FALSE;
-	}
-}
-
-//---------------------------------------------
-//  new:
-//  enum SYSTEM_STATUS
-//	{
-//		SYS_MODE_BOOTING		= 0,
-//		SYS_MODE_IDLE    	  	= 1,
-//		SYS_MODE_AUTHORIZING		= 2,
-//		SYS_MODE_MODE_REASSIGN_CHECK	= 3,
-//		SYS_MODE_REASSIGN		= 4,
-//		SYS_MODE_PREPARING		= 5,
-//		SYS_MODE_PREPARE_FOR_EV		= 6,
-//		SYS_MODE_PREPARE_FOR_EVSE	= 7,
-//		SYS_MODE_CHARGING		= 8,
-//		SYS_MODE_TERMINATING		= 9,
-//		SYS_MODE_COMPLETE		= 10,
-//		SYS_MODE_ALARM			= 11,
-//		SYS_MODE_FAULT			= 12,
-//		SYS_MODE_RESERVATION		= 13,
-//		SYS_MODE_BOOKING		= 14,
-//		SYS_MODE_MAINTAIN		= 15,
-//		SYS_MODE_DEBUG			= 16,
-//		SYS_MODE_CCS_PRECHARGE_STEP0	= 17,
-//		SYS_MODE_CCS_PRECHARGE_STEP1	= 18,
-//		SYS_MODE_UPDATE			= 19
-//	};
-//
-//
-//-----------------------------------------
-
-void CheckSystemValue(void)
-{
-	int meterValueSend[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY + AC_QUANTITY]={0};
-	//int IdleModeCnt = 0;
-	char filenmae[100]={0};
-	char str[100]={0};
-
-	//===============================
-	// send Heartbeat
-	//===============================
-	//HeartBeatWaitTime = ShmOCPP16Data->BootNotification.ResponseHeartbeatInterval;
-	if((difftime(time((time_t*)NULL), clientTime.Heartbeat) < 0) || (HeartBeatWaitTime <= 0))
-	{
-		clientTime.Heartbeat=time((time_t*)NULL);
-
-		if(server_sign == TRUE)
-		{
-			HeartBeatWaitTime = ShmOCPP16Data->BootNotification.ResponseHeartbeatInterval;
-		}
-		else
-		{
-			HeartBeatWaitTime = atoi((char*)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemData);
-		}
-
-	}
-
-	if((server_sign == TRUE) && (difftime(time((time_t*)NULL), clientTime.Heartbeat) >= HeartBeatWaitTime))
-	{
-		//parameter for test
-		sendHeartbeatRequest(0);
-	    //==============================================
-		// Reset Waiting Time
-		//==============================================
-		clientTime.Heartbeat=time((time_t*)NULL);
-		HeartBeatWithNOResponse = HeartBeatWithNOResponse + 1;
-
-	}
-
-	for(int gun_index=0;gun_index < gunTotalNumber ;gun_index++)
-	{
-		//===============================
-		// CSU Trigger Reset Conf
-		//===============================
-		if((server_sign == TRUE) && (ShmOCPP16Data->MsMsg.bits.ResetConf == 1))
-		{
-			sendResetConfirmation((char *)ShmOCPP16Data->Reset.guid, (char *)ShmOCPP16Data->Reset.ResponseStatus);
-		}
-
-		//===============================
-		// CSU Trigger Authorize Request
-		//===============================
-		if((server_sign == TRUE) && (ShmOCPP16Data->SpMsg.bits.AuthorizeReq == 1)&&(authorizeRetryTimes < 3))
-		{
-			sendAuthorizeRequest(0);
-			authorizeRetryTimes = authorizeRetryTimes + 1;
-
-			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
-			server_sign = FALSE;
-		}
-		else if((server_sign == FALSE) &&(strcmp((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData, "TRUE") == 0)&&(strcmp((const char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "TRUE") == 0)&&(ShmOCPP16Data->OcppConnStatus == 0)&& (ShmOCPP16Data->SpMsg.bits.AuthorizeReq == 1))
-		{
-			sendAuthorizeRequest(0);
-		}
-
-		//===============================
-		// CSU Trigger Smart Charging Profilw
-	   //===============================
-	   if(ShmOCPP16Data->CSUMsg.bits[gun_index].ChargingProfileReq == 1)
-	   {
-		   ShmOCPP16Data->CSUMsg.bits[gun_index].ChargingProfileReq = 0;
-		   checkCompositeSchedule(gun_index+1, 86400, &ShmOCPP16Data->SmartChargingProfile[gun_index]);
-		   ShmOCPP16Data->CSUMsg.bits[gun_index].ChargingProfileConf = 1;
-	   }
-
-		//==============================================
-		// Charger start transaction
-		//==============================================
-		if(/*(server_sign == TRUE) &&*/ (ShmOCPP16Data->CpMsg.bits[gun_index].StartTransactionReq == 1))
-		{
-			ShmOCPP16Data->CpMsg.bits[gun_index].StartTransactionReq =0;
-			sendStartTransactionRequest(gun_index);
-			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)))
-		{
-			ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq =0;
-			sendStopTransactionRequest(gun_index);
-			clientTime.StopTransaction = time((time_t*)NULL);
-		}
-
-		//==============================================
-		// Charger status report
-		//==============================================
-		//--- Check Mode Change ---//
-		// J: CHAdeMO  U: CCS1 combo  E: CCS2 combo  G: GBT DCcc
-
-		if(gunType[gun_index] == 'J')
-		{
-			for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)
-				{
-					if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != ChademoPreviousSystemStatus[index]) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ConnectorPlugIn != ChademoPreviousConnectorPlugIn[index]) )//if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != ChademoPreviousSystemStatus[index]/*PRE_SYS_MODE[gun_index]*/ )
-					{
-						//PRE_SYS_MODE[gun_index] = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus;
-						ChademoPreviousSystemStatus[index] = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus;
-						ChademoPreviousConnectorPlugIn[index] = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ConnectorPlugIn;
-						cpinitateMsg.bits[gun_index].StatusNotificationReq = 1;
-						statusModeChage[gun_index] = TRUE;
-					}
-
-			#if 1 // for TempStopTransaction
-					if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_IDLE) && (ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq == 0))
-					{
-						checkTempStopTransaction(gun_index);
-					}
-			#endif
-
-				}
-			}
-		}
-		else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
-		{
-			for (int index = 0; index < CCS_QUANTITY; index++)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)
-				{
-					if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != CcsPreviousSystemStatus[index]) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ConnectorPlugIn != CcsPreviousConnectorPlugIn[index]) )//if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != CcsPreviousSystemStatus[index]/*PRE_SYS_MODE[gun_index]*/ )
-					{
-						//PRE_SYS_MODE[gun_index] = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus;
-						CcsPreviousSystemStatus[index] = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus;
-						CcsPreviousConnectorPlugIn[index] = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ConnectorPlugIn;
-						cpinitateMsg.bits[gun_index].StatusNotificationReq = 1;
-						statusModeChage[gun_index] = TRUE;
-					}
-
-			#if 1 // for TempStopTransaction
-					if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_IDLE) && (ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq == 0))
-					{
-						checkTempStopTransaction(gun_index);
-					}
-			#endif
-
-				}
-			}
-		}
-		else if(gunType[gun_index] == 'G')
-		{
-			for (int index = 0; index < GB_QUANTITY; index++)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)
-				{
-					if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != GbPreviousSystemStatus[index]) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ConnectorPlugIn != GbPreviousConnectorPlugIn[index]) )//if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != GbPreviousSystemStatus[index]/*PRE_SYS_MODE[gun_index]*/ )
-					{
-						//PRE_SYS_MODE[gun_index] = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus;
-						GbPreviousSystemStatus[index] = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus;
-						GbPreviousConnectorPlugIn[index] = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ConnectorPlugIn;
-						cpinitateMsg.bits[gun_index].StatusNotificationReq = 1;
-						statusModeChage[gun_index] = TRUE;
-					}
-
-		#if 1 // for TempStopTransaction
-					if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_IDLE) && (ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq == 0))
-					{
-						checkTempStopTransaction(gun_index);
-					}
-		#endif
-
-				}
-			}
-
-		}
-		else
-		{
-			for (int index = 0; index < AC_QUANTITY; index++)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == gun_index)
-				{
-					if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != AcPreviousSystemStatus[index]) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState != AcPreviousConnectorPlugIn[index]) )//if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != AcPreviousSystemStatus[index]/*PRE_SYS_MODE[gun_index]*/ )
-					{
-						//PRE_SYS_MODE[gun_index] = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus;
-						AcPreviousSystemStatus[index] = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus;
-						AcPreviousConnectorPlugIn[index] = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState;
-						cpinitateMsg.bits[gun_index].StatusNotificationReq = 1;
-						statusModeChage[gun_index] = TRUE;
-					}
-
-			#if 1 // for TempStopTransaction
-					if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_IDLE) && (ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq == 0))
-					{
-						checkTempStopTransaction(gun_index);
-					}
-			#endif
-				}
-			}// END
-
-		}
-
-
-	if(((server_sign == TRUE) && (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;
-
-		sendStatusNotificationRequest(gun_index);
-		clientTime.StatusNotification[gun_index] = time((time_t*)NULL);
-		statusModeChage[gun_index] = FALSE;
-	}
-
-	//==============================================
-	// Meter report
-	//==============================================
-	if(/*(server_sign == TRUE) &&*/(isOFFline() == TRUE) || ((time((time_t*)NULL) - clientTime.MeterValues[gun_index])> (atoi((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemData)- 1 ) ) )
-	{
-		//check Transaction active
-		if(gunType[gun_index] == 'J')
-		{
-			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 == SYS_MODE_CHARGING))
-				{
-					meterValueSend[gun_index] =1;
-				}
-
-				if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // complete
-				{
-					sprintf(filenmae,"/Storage/OCPP/TxProfile_%d.json",(gun_index+1));
-					if((access(filenmae,F_OK))!=-1)
-					{
-						DEBUG_INFO("TxProfile exist. OCPP will delete TX Charging Profile\n");
-
-						sprintf(str,"rm -f %s",filenmae);
-						system(str);
-					}
-
-				}
-			}// End for CHAdeMO
-		}
-		else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
-		{
-			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 == SYS_MODE_CHARGING))
-				{
-					meterValueSend[gun_index] =1;
-				}
-
-				if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // complete
-				{
-					sprintf(filenmae,"/Storage/OCPP/TxProfile_%d.json",(gun_index+1));
-					if((access(filenmae,F_OK))!=-1)
-					{
-						DEBUG_INFO("TxProfile exist. OCPP will delete TX Charging Profile\n");
-						sprintf(str,"rm -f %s",filenmae);
-						system(str);
-					}
-				}
-			} // End for CCS
-		}
-		else if(gunType[gun_index] == 'G')
-		{
-			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 == SYS_MODE_CHARGING))
-				{
-					meterValueSend[gun_index] =1;
-				}
-
-				if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // complete
-				{
-					sprintf(filenmae,"/Storage/OCPP/TxProfile_%d.json",(gun_index+1));
-					if((access(filenmae,F_OK))!=-1)
-					{
-						DEBUG_INFO("TxProfile exist. OCPP will delete TX Charging Profile\n");
-						sprintf(str,"rm -f %s",filenmae);
-						system(str);
-					}
-				}
-			}// End for GB
-
-		}
-		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 == SYS_MODE_CHARGING))
-				{
-					meterValueSend[gun_index] =1;
-				}
-
-				if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // complete
-				{
-					sprintf(filenmae,"/Storage/OCPP/TxProfile_%d.json",(gun_index+1));
-					if((access(filenmae,F_OK))!=-1)
-					{
-						DEBUG_INFO("TxProfile exist. OCPP will delete TX Charging Profile\n");
-
-						sprintf(str,"rm -f %s",filenmae);
-						system(str);
-					}
-				}
-			}//End for AC
-		}
-
-		clientTime.MeterValues[gun_index] = time((time_t*)NULL);
-
-		if(meterValueSend[gun_index] == 1)
-		{
-			sendMeterValuesRequest(gun_index);
-#if 1 // for TempStopTransaction
-			storeTempStopTransaction(gun_index);
-#endif
-		}
-
-	}
-
-	//==============================================
-	// Check Connector reserved
-	//==============================================
-
-	//===============================
-	// 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);
-		strptime((char *)ShmOCPP16Data->ReserveNow[gun_index].ExpiryDate, "%Y-%m-%dT%H:%M:%S", &tp);
-		tp.tm_isdst = -1;
-		time_t utc = mktime(&tp);
-		diff_t = difftime(utc, t);
-
-		if(diff_t <= 0)
-		{
-			DEBUG_INFO("reserve expired.\n");
-			memset(ShmOCPP16Data->ReserveNow[gun_index].ExpiryDate,0,sizeof(ShmOCPP16Data->ReserveNow[gun_index].ExpiryDate));
-		}
-
-	 }//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((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;
-	  }
-
-	  //==========================================
-	  // csu trigger DataTransferReq
-	  //==========================================
-	  if((server_sign == TRUE) &&(ShmOCPP16Data->CsMsg.bits[gun_index].DataTransferReq == 1))
-	  {
-		  sendDataTransferRequest(gun_index);
-		  ShmOCPP16Data->CsMsg.bits[gun_index].DataTransferReq = 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_INFO("sendAuthorizeRequest...\n");
-	memset(&(ShmOCPP16Data->Authorize.ResponseIdTagInfo),0,sizeof(struct StructIdTagInfo));
-
-	//Local Authorize
-	if	((strcmp((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemData , "TRUE")==0) &&(ShmOCPP16Data->OcppConnStatus == 0))
-	{
-		DEBUG_INFO("Allow OfflineTx UnknownId Pass !!!!\n");
-		strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ExpiryDate, "");
-		strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag, "");
-		strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status, "Accepted");
-		result = PASS;
-		ShmOCPP16Data->SpMsg.bits.AuthorizeReq = 0;
-		ShmOCPP16Data->SpMsg.bits.AuthorizeConf = 1; // inform csu
-		authorizeRetryTimes = 0;
-		return result;
-
-	}
-	else if(((strcmp((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData, "TRUE") == 0)&&(strcmp((const char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "TRUE") == 0)&&(ShmOCPP16Data->OcppConnStatus == 0))||
-			((strcmp((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemData, "TRUE") == 0)&&(strcmp((const char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "TRUE") == 0)))
-	{
-		OCPP_getIdTag((char *)ShmSysConfigAndInfo->SysConfig.UserId);
-		if((strcmp(idTagQuery.idTagstr,"") == 0) || (strcmp(idTagQuery.idTagstatus,"Accepted") != 0) )
-		{
-			if(strcmp(idTagQuery.idTagstr,"") == 0)
-			{
-				DEBUG_INFO("offline Local Authorization Fail !!!!, Card %s is blank!!!!\n", idTagQuery.idTagstr);
-			}
-
-			if(strcmp(idTagQuery.idTagstatus,"Accepted") != 0)
-			{
-				DEBUG_INFO("offline Local Authorization Fail !!!!, Card %s is not Accepted!!!!\n", idTagQuery.idTagstr);
-			}
-
-			DEBUG_INFO("offline 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("offline 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);
-
-	sprintf(tempdata, "Authorize,%d", gun_index);
-	if(hashmap_operation(HASH_OP_ADD, guid, tempdata) == 1)
-	{
-		result = PASS;
-		DEBUG_INFO("Authorize mapItem pass\n");
-	}
-
-	ShmOCPP16Data->SpMsg.bits.AuthorizeReq = 0;
-	return result;
-}
-
-int sendBootNotificationRequest(void)
-{
-	mtrace();
-	int result = FAIL;
-	char message[500]={0}, payload[700]={0};
-    char guid[37]={0};
-    char tempdata[65]={0};
-    int IsGunCharging = FALSE;
-
-    //check Transaction active
-    for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-    {
-    	if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_CHARGING) //S_CHARGING
-    	{
-    		IsGunCharging = TRUE;
-    	}
-
-    }
-
-    for (int index = 0; index < CCS_QUANTITY; index++)
-    {
-    	if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_CHARGING) //S_CHARGING
-    	{
-    		IsGunCharging = TRUE;
-    	}
-    }
-
-    for (int index = 0; index < GB_QUANTITY; index++)
-    {
-    	if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_CHARGING) //S_CHARGING
-    	{
-    		IsGunCharging = TRUE;
-    	}
-    }
-
-    for (int index = 0; index < AC_QUANTITY; index++)
-    {
-    	if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_CHARGING) //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);
-	strcpy((char *)ShmOCPP16Data->BootNotification.CpFwVersion,(const char *)ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev);
-	strcpy((char *)ShmOCPP16Data->BootNotification.CpIccid,(const char *)ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSimIccid);
-	strcpy((char *)ShmOCPP16Data->BootNotification.CpImsi,(const char *)ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSimImsi);
-
-	sprintf(payload, "{\"chargeBoxSerialNumber\":\"%s\",\"chargePointModel\":\"%s\",\"chargePointSerialNumber\":\"%s\",\"chargePointVendor\":\"%s\",\"firmwareVersion\":\"%s\",\"iccid\":\"%s\",\"imsi\":\"%s\"} ",
-				ShmOCPP16Data->ChargeBoxId
-				,ShmSysConfigAndInfo->SysConfig.ModelName
-				,ShmSysConfigAndInfo->SysConfig.SerialNumber
-				,ShmSysConfigAndInfo->SysConfig.chargePointVendor
-				,ShmOCPP16Data->BootNotification.CpFwVersion
-				,ShmOCPP16Data->BootNotification.CpIccid
-				,ShmOCPP16Data->BootNotification.CpImsi);
-
-	random_uuid(guid);
-
-	sprintf(message,"[%d,\"%s\",\"%s\",%s]",MESSAGE_TYPE_CALL, guid, "BootNotification", payload);
-	LWS_Send(message);
-	sprintf(tempdata, "BootNotification,0");
-	if(hashmap_operation(HASH_OP_ADD, 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, sizeof(queuedata));
-	strcpy(queuedata,message);
-
-	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);
-
-	sprintf(tempdata, "DataTransfer,%d", (gun_index + 1));
-	if(hashmap_operation(HASH_OP_ADD, guid, tempdata) == 1)
-	{
-		result = PASS;
-		DEBUG_INFO("DataTransfer mapItem pass\n");
-	}
-
-	return result;
-}
-
-int sendFirmwareVersionByDataTransfer(void)
-{
-	int8_t result = FAIL;
-	json_object *FirmwareDataTransfer = json_object_new_object();
-
-	// AC & DC model
-	json_object_object_add(FirmwareDataTransfer, "CsuBootLoadFwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.CsuBootLoadFwRev));
-	json_object_object_add(FirmwareDataTransfer, "CsuKernelFwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.CsuKernelFwRev));
-	json_object_object_add(FirmwareDataTransfer, "CsuRootFsFwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev));
-	json_object_object_add(FirmwareDataTransfer, "CsuPrimFwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.CsuPrimFwRev));
-
-	// DC model
-	if((ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D'))
-	{
-		json_object_object_add(FirmwareDataTransfer, "FanModuleFwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.FanModuleFwRev));
-		json_object_object_add(FirmwareDataTransfer, "RelayModuleFwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.RelayModuleFwRev));
-		json_object_object_add(FirmwareDataTransfer, "LedModuleFwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.LedModuleFwRev));
-		json_object_object_add(FirmwareDataTransfer, "Connector1FwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.Connector1FwRev));
-	}
-
-	if((ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D') &&
-	   ((gunType[1] != '0') || (gunType[2] != '0') || (gunType[3] != '0')))
-	{
-		json_object_object_add(FirmwareDataTransfer, "Connector2FwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.Connector2FwRev));
-	}
-
-	// 4G model
-	if((ShmSysConfigAndInfo->SysConfig.ModelName[10]=='T'))
-	{
-		json_object_object_add(FirmwareDataTransfer, "TelcomModemFwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSoftwareVer));
-	}
-
-	sprintf((char*)ShmOCPP16Data->DataTransfer[0].VendorId, "Phihong Technology");
-	sprintf((char*)ShmOCPP16Data->DataTransfer[0].MessageId, "ID_FirmwareVersion");
-	sprintf((char*)ShmOCPP16Data->DataTransfer[0].Data, json_object_to_json_string(FirmwareDataTransfer));
-
-	if(sendDataTransferRequest(0))
-	{
-		result = PASS;
-	}
-
-	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);
-
-	sprintf(tempdata, "DiagnosticsStatusNotification,%d", 0);
-
-	if(hashmap_operation(HASH_OP_ADD, guid, tempdata) == 1)
-	{
-		result = PASS;
-		//DEBUG_INFO("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 = DIAGNOSTIC_STATUS_IDLE;
-	}
-	else if(strcmp(status,"Uploaded")==0)
-	{
-		DiagnosticsStatusNotificationStatus = DIAGNOSTIC_STATUS_UPLOADED;
-	}
-	else if(strcmp(status,"UploadFailed")==0)
-	{
-		DiagnosticsStatusNotificationStatus = DIAGNOSTIC_STATUS_UPLOAD_FAIL;
-	}
-	else if(strcmp(status,"Uploading")==0)
-	{
-		DiagnosticsStatusNotificationStatus = DIAGNOSTIC_STATUS_UPLOADING;
-	}
-
-	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);
-
-	sprintf(tempdata, "FirmwareStatusNotification,%d", 0);
-
-	if(hashmap_operation(HASH_OP_ADD, 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);
-	//#endif
-
-	ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationReq = 0;
-	ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationConf = 0;
-
-	//record status
-	if(strcmp(status,"Downloaded")==0)
-	{
-		 FirmwareStatusNotificationStatus = FIRMWARE_STATUS_DOWNLOADED;
-	}
-	else if(strcmp(status,"DownloadFailed")==0)
-	{
-		FirmwareStatusNotificationStatus = FIRMWARE_STATUS_DOWNLOAD_DAILED;
-	}
-	else if(strcmp(status,"Downloading")==0)
-	{
-		FirmwareStatusNotificationStatus = FIRMWARE_STATUS_DOWNLOADING;
-	}
-	else if(strcmp(status,"Idle")==0)
-	{
-		FirmwareStatusNotificationStatus = FIRMWARE_STATUS_IDLE;
-	}
-	else if(strcmp(status,"InstallationFailed")==0)
-	{
-		FirmwareStatusNotificationStatus = FIRMWARE_STATUS_INSTALLATION_FAILED;
-	}
-	else if(strcmp(status,"Installing")==0)
-	{
-		FirmwareStatusNotificationStatus = FIRMWARE_STATUS_INSTALLING;
-	}
-	else if(strcmp(status,"Installed")==0)
-	{
-		FirmwareStatusNotificationStatus = FIRMWARE_STATUS_INSTALLED;
-	}
-
-
-	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);
-
-	sprintf(tempdata, "Heartbeat,%d", 0);
-
-	if(hashmap_operation(HASH_OP_ADD, 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;
-	}
-
-	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[28];//, usec_buf[6];
-	char tempdata[65]={0};
-	int tempIndex = 0;
-
-	DEBUG_INFO("sendStartTransactionRequest...\n");
-	gettimeofday(&tmnow, NULL);
-
-	time_t t;
-	t = time(NULL);
-	/*UTC time and date*/
-	tm = gmtime(&t);
-	strftime(buf,28,"%Y-%m-%dT%H:%M:%SZ", tm);
-
-	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);
-
-	// clear StartTransaction Response
-	strcpy((char *)ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.ExpiryDate, "");
-	strcpy((char *)ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.ParentIdTag, "");
-	strcpy((char *)ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.Status, "");
-	ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId = 0;
-
-	//J: CHAdeMO   U: CCS1 combo   E: CCS2 combo  G: GBT DCcc
-
-	if(gunType[gun_index] == 'J')
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
-			{
-				ShmOCPP16Data->StartTransaction[gun_index].MeterStart = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedEnergy;
-				ShmOCPP16Data->StartTransaction[gun_index].ReservationId = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId;
-			}
-		}
-
-	}
-	else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < CCS_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
-			{
-				ShmOCPP16Data->StartTransaction[gun_index].MeterStart = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy;
-				ShmOCPP16Data->StartTransaction[gun_index].ReservationId = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ReservationId;
-			}
-		}
-	}
-	else if(gunType[gun_index] == 'G')
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < GB_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
-			{
-				ShmOCPP16Data->StartTransaction[gun_index].MeterStart = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy;
-				ShmOCPP16Data->StartTransaction[gun_index].ReservationId = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ReservationId;
-			}
-		}
-	}
-	else
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
-		{
-			tempIndex = 2;
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < AC_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
-			{
-				ShmOCPP16Data->StartTransaction[gun_index].MeterStart = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PowerConsumption;
-				ShmOCPP16Data->StartTransaction[gun_index].ReservationId = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].ReservationId;
-			}
-		}
-	}
-
-	random_uuid(guid);
-
-	if(ShmOCPP16Data->StartTransaction[gun_index].ReservationId == -1)
-	{
-		sprintf(message, "[%d,\"%s\",\"StartTransaction\",{\"connectorId\":%d,\"idTag\":\"%s\",\"meterStart\":%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].Timestamp );
-	}
-	else
-	{
-		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 );
-	}
-
-	sprintf(tempdata, "StartTransaction,%d", (gun_index));
-	if(hashmap_operation(HASH_OP_ADD, 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
-
-	if(GetTransactionQueueNum() == 1)
-	{
-		LWS_Send(message);
-	}
-
-	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[28];//, usec_buf[6];
-	char tempdata[65]={0};
-	int tempIndex = 0;
-
-	gettimeofday(&tmnow, NULL);
-
-	time_t t;
-	t = time(NULL);
-	/*UTC time and date*/
-	tm = gmtime(&t);
-	strftime(buf,28,"%Y-%m-%dT%H:%M:%SZ", tm);
-
-	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
-	//J: CHAdeMO  U: CCS1 combo  E: CCS2 combo  G: GBT DCcc
-	if(gunType[gun_index] == 'J')
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-		{
-			if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex))
-			{
-				if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_IDLE)//S_IDLE
-				{
-					
-					currentStatus = 0; //OCPP Status: Available	
-				}
-				else if ( ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus >= SYS_MODE_PREPARING)&&( ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus <= SYS_MODE_PREPARE_FOR_EVSE))
-				|| ( ( ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus >= SYS_MODE_CCS_PRECHARGE_STEP0) && ( ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus <= SYS_MODE_CCS_PRECHARGE_STEP1))					
-				|| (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING)) //S_PRECHARGE
-				{
-					currentStatus = 1; //OCPP Status: Preparing
-				}
-				else if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_CHARGING) //S_CHARGING
-				{
-					currentStatus = 2; //OCPP Status: Charging
-				}
-				else if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_COMPLETE) //S_COMPLETE
-				{
-					currentStatus = 5; //OCPP Status: Finishing
-				}
-				else if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_TERMINATING) // S_TERMINATING   ---> SuspendedEV
-				{
-					currentStatus = 4; //OCPP Status: SuspendedEV
-				}
-				else if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_MAINTAIN)|| (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //  ---> Unavailable
-				{
-					currentStatus = 7; //OCPP Status: Unavailable
-				}
-				else if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_FAULT)|| (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_ALARM)) //S_ALARM,S_FAULT   ---> Faulted
-				{
-					currentStatus = 8; //OCPP Status: Faulted
-				}
-				else if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_RESERVATION) //    ---> Reserved
-				{
-					currentStatus = 6; //OCPP Status: Reserved
-				}
-
-			} //end of the same index
-
-		}//end of for CHAdeMO_QUANTITY
-
-	}
-	else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < CCS_QUANTITY; index++)
-		{
-			if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_IDLE) //S_IDLE
-				{
-				
-					currentStatus = 0; //OCPP Status: Available
-					
-				}
-				else if ( ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus >= SYS_MODE_PREPARING)&&( ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus <= SYS_MODE_PREPARE_FOR_EVSE)) 
-					|| ( ( ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus >= SYS_MODE_CCS_PRECHARGE_STEP0) && ( ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus <= SYS_MODE_CCS_PRECHARGE_STEP1))
-					|| (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING)) //S_PRECHARGE
-				{
-					currentStatus = 1; //OCPP Status: Preparing
-				}
-				else if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_CHARGING) //S_CHARGING
-				{
-					currentStatus = 2; //OCPP Status: Charging
-				}
-				else if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_COMPLETE) //S_COMPLETE
-				{
-					currentStatus = 5; //OCPP Status: Finishing
-				}
-				else if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_TERMINATING) //S_TERMINATING  ---> SuspendedEV
-				{
-					currentStatus = 4; //OCPP Status: SuspendedEV
-				}
-				else if ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_MAINTAIN) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //   ---> Unavailable
-				{
-					currentStatus = 7; //OCPP Status : Unavailable
-				}
-				else if ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_ALARM)) //S_ALARM ,S_FAULT   ---> Faulted
-				{
-					currentStatus = 8; //OCPP Status: Faulted
-				}
-				else if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_RESERVATION) //   ---> Reserved
-				{
-					currentStatus = 6; //OCPP Status: Reserved
-				}
-
-			} //end of the same index
-
-		} // end of for CCS_QUANTITY
-	}
-	else if(gunType[gun_index] == 'G')
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < GB_QUANTITY; index++)
-		{
-			if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_IDLE) //S_IDLE
-				{
-					
-					currentStatus = 0; //OCPP Status: Available
-					
-				}
-				else if (((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus >= SYS_MODE_PREPARING)&&( ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus <= SYS_MODE_PREPARE_FOR_EVSE)) 
-					|| ( ( ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus >= SYS_MODE_CCS_PRECHARGE_STEP0) && ( ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus <= SYS_MODE_CCS_PRECHARGE_STEP1))
-					|| (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING)) //S_PRECHARGE
-				{
-					currentStatus = 1; //OCPP Status: Preparing
-				}
-				else if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_CHARGING) //S_CHARGING
-				{
-					currentStatus = 2; //OCPP Status: Charging
-				}
-				else if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_COMPLETE) //S_COMPLETE
-				{
-					currentStatus = 5; //OCPP Status: Finishing
-				}
-				else if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_TERMINATING) // S_TERMINATING  ---> SuspendedEV
-				{
-					currentStatus = 4; //OCPP Status: SuspendedEV
-				}
-				else if ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_MAINTAIN) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //  ---> Unavailable
-				{
-					currentStatus = 7; //OCPP Status: Unavailable
-				}
-				else if ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_ALARM)) //S_ALARM ,S_FAULT   ---> Faulted
-				{
-					currentStatus = 8; //OCPP Status: Faulted
-				}
-				else if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_RESERVATION) //   ---> Reserved
-				{
-					currentStatus = 6; //OCPP Status: Reserved
-				}
-			} //end of the same index
-
-		} // end of for GB_QUANTITY
-	}
-	else
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
-		{
-			tempIndex = 2;
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < AC_QUANTITY; index++)
-		{
-			if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_IDLE) //SYS_MODE_IDLE
-				{
-					if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState == CP_STATE_B) ||(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState == CP_STATE_C) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState == CP_STATE_D))
-					{
-						currentStatus = 1; //OCPP Status: Preparing
-					}
-					else
-					{
-						currentStatus = 0; //OCPP Status: Available
-					}
-
-				}
-				else if ((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_PREPARING) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING)) //SYS_MODE_PREPARING
-				{
-					currentStatus = 1; //OCPP Status: Preparing
-				}
-				else if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_CHARGING) //SYS_MODE_CHARGING
-				{
-					currentStatus = 2; //OCPP Status: Charging
-				}
-				else if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_COMPLETE) //SYS_MODE_COMPLETE
-				{
-					currentStatus = 5; //OCPP Status: Finishing
-				}
-				else if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_TERMINATING) // S_TERMINATING   ---> SuspendedEV
-				{
-					currentStatus = 4; //OCPP Status: SuspendedEV
-				}
-				else if ((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_MAINTAIN)|| (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //   ---> Unavailable
-				{
-					currentStatus = 7; //OCPP Status: Unavailable
-				}
-				else if ((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_ALARM)) //S_ALARM,S_FAULT   ---> Faulted
-				{
-					currentStatus = 8; //OCPP Status: Faulted
-				}
-				else if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_RESERVATION) //    ---> Reserved
-				{
-					currentStatus = 6; //OCPP Status: Reserved
-				}
-
-			}//end of the same index
-
-		}//end of for AC_QUANTITY
-
-	}
-
-	//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].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);
-
-	sprintf(tempdata, "StatusNotification,%d", (gun_index));
-
-	if(hashmap_operation(HASH_OP_ADD, 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;
-	}
-
-	return result;
-}
-
-int sendStopTransactionRequest(int gun_index)
-{
-	mtrace();
-	int result = FAIL;
-	//char message[1500]={0};
-	char guid[37]={0};
-	char tempdata[65]={0};
-	int tempIndex = 0;
-	//int idx_sample=0;
-
-	DEBUG_INFO("sendStopTransactionRequest...\n");
-	memset(queuedata, 0, sizeof(queuedata));
-
-	//ENERGY_ACTIVE_IMPORT_REGISTER
-	//J: CHAdeMO  U: CCS1 combo  E: CCS2 combo  G: GBT DCcc
-	if(gunType[gun_index] == 'J')
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
-			{
-				ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PowerConsumption;
-			}
-		}// END OF CHAdeMO_QUANTITY
-	}
-	else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < CCS_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
-			{
-				ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PowerConsumption;
-			}
-		}// END OF CCS_QUANTITY
-
-	}
-	else if(gunType[gun_index] == 'G')
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < GB_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
-			{
-				ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PowerConsumption;
-			}
-		}// END OF GB_QUANTITY
-	}
-	else
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
-		{
-			tempIndex = 2;
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < AC_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
-			{
-				ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PowerConsumption;
-			}
-		}// END OF AC_QUANTITY
-	}
-
-	//Stop Transaction Time
-	struct timeval tmnow;
-	struct tm *tm;
-	char buf[28];//, usec_buf[6];
-	gettimeofday(&tmnow, NULL);
-
-	time_t t;
-	t = time(NULL);
-	/*UTC time and date*/
-	tm = gmtime(&t);
-	strftime(buf,28,"%Y-%m-%dT%H:%M:%SZ", tm);
-
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].Timestamp,buf);
-	ShmOCPP16Data->StopTransaction[gun_index].TransactionId = ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId;
-
-	random_uuid(guid);
-
-	/***********************************transactionData******************************************************/
-	memset(ShmOCPP16Data->StopTransaction[gun_index].TransactionData, 0, sizeof(sizeof(struct StructMeterValue)));
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].TimeStamp, buf);
-
-	//=================================
-	// Transaction_Begin
-	//=================================
-	// Energy.Active.Export.Interval
-    //idx_sample=0;
-	sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Value, "%.1f",(float)(ShmOCPP16Data->StartTransaction[gun_index].MeterStart)); // MeterStart is 0~6553.5 kWh
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Context,ReadingContextStr[ReadingContext_Transaction_Begin]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Format,ValueFormatStr[Raw]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Measurand,MeasurandStr[Energy_Active_Import_Interval]);//MeasurandStr[Energy_Active_Export_Interval/*Energy_Reactive_Export_Register*/]);
-
-	//J: CHAdeMO  U: CCS1 combo  E: CCS2 combo  G: GBT DCcc
-	if((gunType[gun_index] == 'J')||(gunType[gun_index] == 'U')||(gunType[gun_index] == 'E')||(gunType[gun_index] == 'G'))
-	{
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Phase,PhaseStr[L3_N]);
-	}
-	else
-	{
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Phase,PhaseStr[L1_N]);
-	}
-
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Location,LocationStr[Location_Outlet]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Unit,UnitOfMeasureStr[UnitOfMeasure_kWh]);
-
-	//=================================
-	// Transaction_End
-	//=================================
-	//Current.Export
-	//idx_sample=1;
-	//J: CHAdeMO  U: CCS1 combo  E: CCS2 combo  G : GBT DC
-	if(gunType[gun_index] == 'J')
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingCurrent );// PresentChargingCurrent is 0~6553.5 amp
-			}
-		}// End of for CHAdeMO_QUANTITY
-
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L3_N]);
-	}
-	else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < CCS_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingCurrent );// PresentChargingCurrent is 0~6553.5 amp
-			}
-		}// End of for CCS_QUANTITY
-
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L3_N]);
-	}
-	else if(gunType[gun_index] == 'G')
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < GB_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingCurrent );// PresentChargingCurrent is 0~6553.5 amp
-			}
-		}// End of for GB_QUANTITY
-
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L3_N]);
-	}
-	else
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
-		{
-			tempIndex = 2;
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < AC_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingCurrent );//  0~6553.5 amp for EVSE
-			}
-		}// End of for AC_QUANTITY
-
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L1_N]);
-	}
-
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Context,ReadingContextStr[ReadingContext_Transaction_End]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Format,ValueFormatStr[Raw]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Measurand,MeasurandStr[Current_Import]);
-	//strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L1_N]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Location,LocationStr[Location_Outlet]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Unit,UnitOfMeasureStr[UnitOfMeasure_A]);
-
-	//Energy.Active.Export.Interval
-	//idx_sample=2;
-	//J: CHAdeMO  U: CCS1 combo   E: CCS2 combo   G: GBT DC
-
-	if(gunType[gun_index] == 'J')
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedEnergy );// PresentChargedEnergy is 0~6553.5 kWh
-			}
-		}// END OF CHAdeMO_QUANTITY
-
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L3_N]);
-
-	}
-	else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < CCS_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy );// PresentChargedEnergy is 0~6553.5 kWh
-			}
-		}// END OF CCS_QUANTITY
-
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L3_N]);
-
-	}
-	else if(gunType[gun_index] == 'G')
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < GB_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy );// PresentChargedEnergy is 0~6553.5 kWh
-			}
-		}// END OF GB_QUANTITY
-
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L3_N]);
-	}
-	else
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
-		{
-			tempIndex = 2;
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-
-		for (int index = 0; index < AC_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargedEnergy );// PresentChargedEnergy is 0~6553.5 kWh
-			}
-		}// END OF AC_QUANTITY
-
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L1_N]);
-	}
-
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Context,ReadingContextStr[ReadingContext_Transaction_End]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Format,ValueFormatStr[Raw]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Measurand,MeasurandStr[Energy_Active_Import_Interval]);
-	//strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L1_N]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Location,LocationStr[Location_Outlet]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Unit,UnitOfMeasureStr[UnitOfMeasure_kWh]);
-
-	//Power.Active.Export
-	//idx_sample=3;
-	//J: CHAdeMO  U: CCS1 combo  E: CCS2 combo  G: GBT DC
-
-	if(gunType[gun_index] == 'J')
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingPower );//  PresentChargingPower is 0~6553.5 kW
-			}
-		} // End for CHAdeMO_QUANTITY
-
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L3_N]);
-	}
-	else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < CCS_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingPower );// PresentChargingPower is 0~6553.5 kW
-			}
-		} // END for CCS_QUANTITY
-
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L3_N]);
-	}
-	else if(gunType[gun_index] == 'G')
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < GB_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingPower );// PresentChargingPower is 0~6553.5 kW
-			}
-		}// END for GB_QUANTITY
-
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L3_N]);
-	}
-	else
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
-		{
-			tempIndex = 2;
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < AC_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingPower );// PresentChargingPower is 0~6553.5 kW
-			}
-		} // END for AC_QUANTITY
-
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L1_N]);
-	}
-
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Context,ReadingContextStr[ReadingContext_Transaction_End]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Format,ValueFormatStr[Raw]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Measurand,MeasurandStr[Power_Active_Import]);
-	//strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L1_N]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Location,LocationStr[Location_Outlet]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Unit,UnitOfMeasureStr[UnitOfMeasure_kW/*UnitOfMeasure_kWh*/]);
-
-	//Voltage
-	//idx_sample=4;
-	//J: CHAdeMO  U: CCS1 combo  E: CCS2 combo  G: GBT DC
-	if(gunType[gun_index] == 'J')
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingVoltage );// PresentChargingVoltage is 0~6553.5 volt
-			}
-		} // END OF FOR CHAdeMO_QUANTITY
-
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L3_N]);
-
-	}
-	else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < CCS_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingVoltage );// PresentChargingVoltage is 0~6553.5 volt
-			}
-		} // END OF  FOR CCS_QUANTITY
-
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L3_N]);
-	}
-	else if(gunType[gun_index] == 'G')
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < GB_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingVoltage );// PresentChargingVoltage is 0~6553.5 volt
-			}
-		} // END OF FOR GB_QUANTITY
-
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L3_N]);
-	}
-	else
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
-		{
-			tempIndex = 2;
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < AC_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingVoltage );//AcChargingVoltage is 0~6553.5 volt  for AC EVSE
-			}
-		} // END OF FOR AC_QUANTITY
-
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L1_N]);
-	}
-
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Context,ReadingContextStr[ReadingContext_Transaction_End]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Format,ValueFormatStr[Raw]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Measurand,MeasurandStr[Voltage]);
-	//strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L1_N]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Location,LocationStr[Location_Outlet]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Unit,UnitOfMeasureStr[UnitOfMeasure_V]);
-
-	//SoC
-	//idx_sample=5;
-	//J : CHAdeMO  U: CCS1 combo  E: CCS2 combo  G: GBT DC
-	if((gunType[gun_index] == 'J')||(gunType[gun_index] == 'U')||(gunType[gun_index] == 'E')||(gunType[gun_index] == 'G'))
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		if(gunType[gun_index] == 'J')
-		{
-			for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
-				{
-					sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].EvBatterySoc );// 0~100%
-				}
-			}
-		}
-		else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
-		{
-			for (int index = 0; index < CCS_QUANTITY; index++)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
-				{
-					sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].EvBatterySoc );// 0~100%
-				}
-			}
-
-		}
-		else if(gunType[gun_index] == 'G')
-		{
-			for (int index = 0; index < GB_QUANTITY; index++)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
-				{
-					sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].EvBatterySoc );// 0~100%
-				}
-			}
-
-		}
-
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Context,ReadingContextStr[ReadingContext_Transaction_End]);
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Format,ValueFormatStr[Raw]);
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Measurand,MeasurandStr[SoC/*Energy_Reactive_Export_Register*/]);
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Phase,PhaseStr[L3_N]);
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Location,LocationStr[Location_Outlet]);
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Unit,UnitOfMeasureStr[UnitOfMeasure_Percent/*UnitOfMeasure_kWh*/]);
-
-	} // END FOR DC CASE
-
-	if((gunType[gun_index] == 'J')||(gunType[gun_index] == 'U')||(gunType[gun_index] == 'E')||(gunType[gun_index] == 'G'))
-	{
-		sprintf(queuedata,"[%d,\"%s\",\"StopTransaction\",{\"idTag\":\"%s\",\"meterStop\":%d,\"timestamp\":\"%s\",\"transactionId\":%d,\"reason\":\"%s\",\"transactionData\":[{\"timestamp\":\"%s\",\"sampledValue\":[{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"}]}]}]"
-
-							,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
-							,(const char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].TimeStamp
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Value
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Context
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Format
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Measurand
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Phase
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Location
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Unit
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Context
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Format
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Measurand
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Location
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Unit
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Context
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Format
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Measurand
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Location
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Unit
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Context
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Format
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Measurand
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Location
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Unit
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Context
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Format
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Measurand
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Location
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Unit
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Value
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Context
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Format
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Measurand
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Phase
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Location
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Unit
-							);
-	}
-	else
-	{
-		sprintf(queuedata,"[%d,\"%s\",\"StopTransaction\",{\"idTag\":\"%s\",\"meterStop\":%d,\"timestamp\":\"%s\",\"transactionId\":%d,\"reason\":\"%s\",\"transactionData\":[{\"timestamp\":\"%s\",\"sampledValue\":[{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"}]}]}]"
-
-							,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
-							,(const char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].TimeStamp
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Value
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Context
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Format
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Measurand
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Phase
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Location
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Unit
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Context
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Format
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Measurand
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Location
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Unit
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Context
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Format
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Measurand
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Location
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Unit
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Context
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Format
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Measurand
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Location
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Unit
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Context
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Format
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Measurand
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Location
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Unit
-							);
-
-	}
-
-#if 1 // for TempStopTransaction
-	//Delete TempStopTransaction
-	if((access("/Storage/OCPP/TempStopTransaction",F_OK))!=-1)
-	{
-		remove("/Storage/OCPP/TempStopTransaction");  		// remove file "TempStopTransaction"
-	}
-#endif
-
-	sprintf(tempdata, "StopTransaction,%d", (gun_index));
-	if(hashmap_operation(HASH_OP_ADD, guid, tempdata) == 1)
-	{
-			result = PASS;
-			DEBUG_INFO("StopTransaction mapitem pass\n");
-	}
-	queue_operation(4, guid, queuedata );//addq(guid, queuedata); ---> remove temporally
-
-	if(GetTransactionQueueNum() == 1)
-	{
-		LWS_Send(queuedata);
-	}
-
-	//----------------------------replace queue StopTransaction TransactionId ---------------------------//
-	int gettransactionId = GetTransactionId(gun_index+1, (char*)ShmOCPP16Data->StartTransaction[gun_index].IdTag);
-
-	if((ShmOCPP16Data->StopTransaction[gun_index].TransactionId != 0) && (gettransactionId != 0))
-	{
-		SetTransactionIdZero(ShmOCPP16Data->StopTransaction[gun_index].TransactionId);
-	}
-
-	//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};
-	int tempIndex = 0;
-
-	DEBUG_INFO("sendMeterValuesRequest...\n");
-
-	if((ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId == 0)&&(ShmOCPP16Data->CsMsg.bits[gun_index].TriggerMessageReq == 0)) // no TransactionId
-	{
-		DEBUG_ERROR("NOT SENT METER Vlaue\n");
-
-		return result;
-	}
-
-	if(ShmOCPP16Data->CsMsg.bits[gun_index].TriggerMessageReq == 1)
-	{
-		ShmOCPP16Data->CsMsg.bits[gun_index].TriggerMessageReq = 0;
-	}
-
-	memset(queuedata, 0, sizeof(queuedata));
-	//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);
-
-	//UTC Date time
-	struct timeval tmnow;
-	struct tm *tm;
-	char buf[28];//, usec_buf[6];
-	gettimeofday(&tmnow, NULL);
-
-	time_t t;
-	t = time(NULL);
-	/*UTC time and date*/
-	tm = gmtime(&t);
-	strftime(buf,28,"%Y-%m-%dT%H:%M:%SZ", tm);
-	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].TimeStamp, buf);
-
-	DEBUG_INFO( "ShmSysConfigAndInfo->SysConfig.ModelName[0]=%c\n", ShmSysConfigAndInfo->SysConfig.ModelName[0]);
-
-	//idx_sample=0;
-	//********************************(1)Current.Export************************************************/
-	//J: CHAdeMO  U: CCS1 combo  E: CCS2 combo  G: GBT DC
-
-	if(gunType[gun_index] == 'J')
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingCurrent );
-			}
-		}
-
-		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Phase, PhaseStr[L3_N]);
-	}
-	else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < CCS_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingCurrent );
-			}
-		}
-
-		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Phase, PhaseStr[L3_N]);
-	}
-	else if(gunType[gun_index] == 'G')
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < GB_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingCurrent );
-			}
-		}
-
-		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Phase, PhaseStr[L3_N]);
-	}
-	else
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
-		{
-			tempIndex = 2;
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < AC_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingCurrent );
-			}
-		}
-
-		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Phase, PhaseStr[L1_N]);
-	}
-
-	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Context, ReadingContextStr[ReadingContext_Sample_Periodic]);
-	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Format, ValueFormatStr[Raw]);
-	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Measurand, MeasurandStr[Current_Import]);
-	//strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Phase, PhaseStr[L1_N]);
-	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Location, LocationStr[Location_Outlet]);
-	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Unit,UnitOfMeasureStr[UnitOfMeasure_A]);
-
-
-	//idx_sample=1;
-	//********************************(2)Energy.Active.Import.Register ************************************************/
-	//J: CHAdeMO  U: CCS1 combo  E: CCS2 combo  G: GBT DC
-
-	if(gunType[gun_index] == 'J')
-	{
-			if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-			{
-				tempIndex = ((gun_index==2) ? 1: 0);
-			}
-			else
-			{
-				tempIndex = gun_index;
-			}
-
-			for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
-				{
-					sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PowerConsumption );
-				}
-			}
-
-			strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Phase, PhaseStr[L3_N]);
-	}
-	else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
-	{
-			if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-			{
-				tempIndex = ((gun_index==2) ? 1: 0);
-			}
-			else
-			{
-				tempIndex = gun_index;
-			}
-
-			for (int index = 0; index < CCS_QUANTITY; index++)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
-				{
-					sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PowerConsumption );
-				}
-			}
-
-			strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Phase, PhaseStr[L3_N]);
-	}
-	else if(gunType[gun_index] == 'G')
-	{
-			if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-			{
-				tempIndex = ((gun_index==2) ? 1: 0);
-			}
-			else
-			{
-				tempIndex = gun_index;
-			}
-
-			for (int index = 0; index < GB_QUANTITY; index++)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
-				{
-					sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PowerConsumption );
-				}
-			}
-
-			strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Phase, PhaseStr[L3_N]);
-	}
-	else
-	{
-			if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
-			{
-				tempIndex = 2;
-			}
-			else
-			{
-				tempIndex = gun_index;
-			}
-
-			for (int index = 0; index < AC_QUANTITY; index++)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
-				{
-					sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PowerConsumption );
-				}
-			}
-
-			strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Phase, PhaseStr[L1_N]);
-	}
-
-	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Context, ReadingContextStr[ReadingContext_Sample_Periodic]);
-	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Format, ValueFormatStr[Raw]);
-	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Measurand, MeasurandStr[Energy_Active_Import_Register]);
-	//strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Phase, PhaseStr[L1_N]);
-	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Location, LocationStr[Location_Outlet]);
-	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Unit,UnitOfMeasureStr[UnitOfMeasure_kWh]);
-
-
-	//idx_sample=2;
-	//****************************************************(3)Energy.Active.Export.Interval*********************************************/
-	//J: CHAdeMO  U: CCS1 combo  E: CCS2 combo  G: GBT DC
-
-	if(gunType[gun_index] == 'J')
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedEnergy );
-			}
-		} // END OF FOR CHAdeMO_QUANTITY
-
-		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Phase, PhaseStr[L3_N]);
-	}
-	else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		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 == tempIndex)
-			{
-			   //ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy = 100.0;
-			   sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy );
-			}
-		} // END OF CCS_QUANTITY
-
-		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Phase, PhaseStr[L3_N]);
-	}
-	else if(gunType[gun_index] == 'G')
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < GB_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy);
-			}
-		} // END OF GB_QUANTITY
-
-		 strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Phase, PhaseStr[L3_N]);
-	}
-	else
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
-		{
-			tempIndex = 2;
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < AC_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargedEnergy );
-			}
-		 }
-
-		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Phase, PhaseStr[L1_N]);
-	}
-
-	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Context, ReadingContextStr[ReadingContext_Sample_Periodic]);
-	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Format, ValueFormatStr[Raw]);
-	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Measurand, MeasurandStr[Energy_Active_Import_Interval]);
-	//strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Phase, PhaseStr[L1_N]);
-	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Location, LocationStr[Location_Outlet]);
-	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Unit,UnitOfMeasureStr[UnitOfMeasure_kWh]);
-
-	//idx_sample=3;
-	//********************************(4)Power.Active.Export************************************************/
-	//J : CHAdeMO   U: CCS1 combo   E: CCS2 combo   G: GBT DC
-
-	if(gunType[gun_index] == 'J')
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Value, "%.1f" , ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingPower);
-			}
-		} // END OF FOR
-
-		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Phase, PhaseStr[L3_N]);
-	}
-	else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < CCS_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Value, "%.1f" , ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingPower);
-			}
-		}
-
-		 strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Phase, PhaseStr[L3_N]);
-	}
-	else if(gunType[gun_index] == 'G')
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < GB_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
-			{
-				 //ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingPower = 100.0;
-				sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Value, "%.1f" , ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingPower);
-			}
-		}
-
-		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Phase, PhaseStr[L3_N]);
-	}
-	else
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
-		{
-			tempIndex = 2;
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < AC_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Value, "%.1f" , ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingPower);
-			}
-		}
-
-		 strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Phase, PhaseStr[L1_N]);
-	}
-
-	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Context, ReadingContextStr[ReadingContext_Sample_Periodic]);
-	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Format, ValueFormatStr[Raw]);
-	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Measurand, MeasurandStr[Power_Active_Import]);
-	//strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Phase, PhaseStr[L1_N]);
-	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Location, LocationStr[Location_Outlet]);
-	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Unit,UnitOfMeasureStr[UnitOfMeasure_kW]);
-
-
-	//idx_sample=4;
-	//***********************************************(5)VOLTAGE******************************************************/
-	//J : CHAdeMO   U: CCS1 combo   E: CCS2 combo   G: GBT DC
-
-	if(gunType[gun_index] == 'J')
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingVoltage );
-			}
-		}
-
-		 strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Phase, PhaseStr[L3_N]);
-	}
-	else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < CCS_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingVoltage );
-			}
-		}
-
-		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Phase, PhaseStr[L3_N]);
-	}
-	else if(gunType[gun_index] == 'G')
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < GB_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingVoltage );
-			}
-		}
-
-		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Phase, PhaseStr[L3_N]);
-	}
-	else
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
-		{
-			tempIndex = 2;
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < AC_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingVoltage );
-			}
-		}
-
-		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Phase, PhaseStr[L1_N]);
-	}
-
-	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Context, ReadingContextStr[ReadingContext_Sample_Periodic]);
-	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Format, ValueFormatStr[Raw]);
-	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Measurand, MeasurandStr[Voltage]);
-	// strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Phase, PhaseStr[L1_N]);
-	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Location, LocationStr[Location_Outlet]);
-	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Unit,UnitOfMeasureStr[UnitOfMeasure_V]);
-
-
-	if((gunType[gun_index] == 'J')||(gunType[gun_index] == 'U')||(gunType[gun_index] == 'E')||(gunType[gun_index] == 'G'))
-	{
-		//idx_sample=5;
-		//sampledValue = NULL;
-		//***********************************************(6)SOC******************************************************/
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		if(gunType[gun_index] == 'J')
-		{
-			//tempIndex = ((gun_index==2) ? 1: 0);
-
-			for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
-				{
-					sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].EvBatterySoc );
-				}
-			}
-		}
-		else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
-		{
-			//tempIndex = ((gun_index==2) ? 1: 0);
-
-			for (int index = 0; index < CCS_QUANTITY; index++)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
-				{
-					sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].EvBatterySoc );
-				}
-			}
-
-		}
-		else if(gunType[gun_index] == 'G')
-		{
-			//tempIndex = ((gun_index==2) ? 1: 0);
-
-			for (int index = 0; index < GB_QUANTITY; index++)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
-				{
-					 sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].EvBatterySoc );
-				}
-			}
-
-		}
-
-		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Context, ReadingContextStr[ReadingContext_Sample_Periodic]);
-		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Format, ValueFormatStr[Raw]);
-		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Measurand, MeasurandStr[SoC]);
-		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Phase, PhaseStr[L3_N]);
-		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Location, LocationStr[Location_Outlet]);
-		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Unit,UnitOfMeasureStr[UnitOfMeasure_Percent]);
-	}
-
-
-	if((gunType[gun_index] == 'J')||(gunType[gun_index] == 'U')||(gunType[gun_index] == 'E')||(gunType[gun_index] == 'G'))
-	{
-		 sprintf(queuedata,"[%d,\"%s\",\"MeterValues\",{\"connectorId\":%d,\"transactionId\":%d,\"meterValue\":[{\"timestamp\":\"%s\",\"sampledValue\":[{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"}]}]}]"
-						,MESSAGE_TYPE_CALL
-						,guid
-						,ShmOCPP16Data->MeterValues[gun_index].ConnectorId
-						,ShmOCPP16Data->MeterValues[gun_index].TransactionId
-						,(const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].TimeStamp
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Value
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Context
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Format
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Measurand
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Phase
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Location
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Unit
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Value
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Context
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Format
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Measurand
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Phase
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Location
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Unit
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Value
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Context
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Format
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Measurand
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Phase
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Location
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Unit
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Value
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Context
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Format
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Measurand
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Phase
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Location
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Unit
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Value
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Context
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Format
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Measurand
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Phase
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Location
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Unit
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Value
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Context
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Format
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Measurand
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Phase
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Location
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Unit
-
-			 );
-	 }
-	 else
-	 {
-		 sprintf(queuedata,"[%d,\"%s\",\"MeterValues\",{\"connectorId\":%d,\"transactionId\":%d,\"meterValue\":[{\"timestamp\":\"%s\",\"sampledValue\":[{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"}]}]}]"
-						,MESSAGE_TYPE_CALL
-						,guid
-						,ShmOCPP16Data->MeterValues[gun_index].ConnectorId
-						,ShmOCPP16Data->MeterValues[gun_index].TransactionId
-						,(const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].TimeStamp
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Value
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Context
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Format
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Measurand
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Phase
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Location
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Unit
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Value
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Context
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Format
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Measurand
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Phase
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Location
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Unit
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Value
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Context
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Format
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Measurand
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Phase
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Location
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Unit
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Value
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Context
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Format
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Measurand
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Phase
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Location
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Unit
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Value
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Context
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Format
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Measurand
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Phase
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Location
-						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Unit
-
-			 );
-	}
-
-	// Put request guid to hash map
-	sprintf(tempdata, "MeterValues,%d", (gun_index));
-	if(hashmap_operation(HASH_OP_ADD, 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");
-	}
-	queue_operation(4, guid, queuedata );//addq(guid, queuedata);  ---> remove temporally
-
-	if(GetTransactionQueueNum() == 1)
-	{
-		LWS_Send(queuedata);
-
-	}
-
-	return result;
-}
-
-//==========================================
-// send confirm routine
-//==========================================
-int sendCancelReservationConfirmation(char *uuid,char *payload)
-{
-	mtrace();
-	int result = FAIL;
-	char message[100]={0};
-
-	DEBUG_INFO("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_INFO("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_INFO("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};
-
-    DEBUG_INFO("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};
-
-	DEBUG_INFO("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;
-
-	DEBUG_INFO("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};
-	int CompositeScheduleIndex = 0;
-
-	DEBUG_INFO("sendGetCompositeScheduleConfirmation...\n");
-
-  	CompositeScheduleIndex = (connectorIdInt > 0) ?(connectorIdInt -1) : 0;
-	if(nPeriod == 0)
-	{
-		if(strcmp((const char *)ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.StartSchedule,"")==0)
-		{
-			sprintf(message,"[%d,\"%s\",{\"status\":\"%s\",\"connectorId\":%d}]"
-												,MESSAGE_TYPE_CALLRESULT
-												,uuid
-												,payload
-												,connectorIdInt);
-		}
-		else
-		{
-			sprintf(message,"[%d,\"%s\",{\"status\":\"%s\",\"connectorId\":%d,\"scheduleStart\":\"%s\",\"chargingSchedule\":{\"duration\":%d,\"startSchedule\":\"%s\",\"chargingRateUnit\":\"%s\",\"chargingSchedulePeriod\":[{\"startPeriod\":0,\"limit\":0,\"numberPhases\":3}]}}]"
-										,MESSAGE_TYPE_CALLRESULT
-										,uuid
-										,payload
-										,connectorIdInt
-										,ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.StartSchedule
-										,ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.Duration
-										,ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.StartSchedule
-										,ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.ChargingRateUnit);
-		}
-	}
-	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[CompositeScheduleIndex].ResponseChargingSchedule.StartSchedule
-							,ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.Duration
-							,ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.StartSchedule
-							,ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.ChargingRateUnit);
-
-		for(int idx_sample=0;idx_sample< nPeriod;idx_sample++)
-		{
-			if (idx_sample == 0)
-			{
-				sprintf(message + strlen(message), "{\"startPeriod\":%d,\"limit\":%.1f,\"numberPhases\":%d}"
-						, ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.ChargingSchedulePeriod[idx_sample].StartPeriod
-						, ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.ChargingSchedulePeriod[idx_sample].Limit
-						, ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.ChargingSchedulePeriod[idx_sample].NumberPhases );
-			}
-			else
-			{
-				sprintf(message + strlen(message), ",{\"startPeriod\":%d,\"limit\":%.1f,\"numberPhases\":%d}"
-						, ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.ChargingSchedulePeriod[idx_sample].StartPeriod
-						, ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.ChargingSchedulePeriod[idx_sample].Limit
-						, ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.ChargingSchedulePeriod[idx_sample].NumberPhases );
-			}
-		}
-		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_INFO("sendGetConfigurationConfirmation...\n");
-
-	MaxKeySupported = atoi((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemData);
-
-	//DEBUG_INFO("MaxKeySupported=%d\n",MaxKeySupported);
-
-	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);
-
-	return result;
-}
-
-int sendGetDiagnosticsConfirmation(char *uuid,char *payload)
-{
-	mtrace();
-	int result = FAIL;
-	char message[400]={0};
-
-	DEBUG_INFO("sendGetDiagnosticsConfirmation...\n");
-
-	if(strcmp(payload,"")==0)
-	{
-		sprintf(message,"[%d,\"%s\",{}]",MESSAGE_TYPE_CALLRESULT, uuid);
-	}
-	else
-	{
-		sprintf(message,"[%d,\"%s\",{\"fileName\":\"%s\"}]", MESSAGE_TYPE_CALLRESULT, uuid, payload);
-	}
-	LWS_Send(message);
-	result = TRUE;
-
-	return result;
-}
-
-int sendGetLocalListVersionConfirmation(char *uuid,char *payload)
-{
-	mtrace();
-	int result = FAIL;
-	char message[80]={0};
-
-	DEBUG_INFO("sendGetLocalListVersionConfirmation...\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};
-
-	DEBUG_INFO("sendRemoteStartConfirmation...\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};
-
-	DEBUG_INFO("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_INFO("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_INFO("sendSetChargingProfileConfirmation...\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_INFO("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_INFO("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_INFO("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();
-	char message[220]={0};
-
-	DEBUG_INFO("An error occurred. Sending this information: uniqueId {}: action: {}, errorCore: {}, errorDescription: {}\n", uniqueId, action, errorCode, errorDescription);
-
-	sprintf(message,"[%d,\"%s\",\"%s\",\"%s\",{}]",MESSAGE_TYPE_CALLERROR, uniqueId, errorCode, errorDescription);
-	LWS_Send(message);
-}
-
-
-//==========================================
-// Handle server request routine  Start
-//==========================================
-int handleCancelReservationRequest(char *uuid, char *payload)
-{
-	mtrace();
-	int result = FAIL;
-    int gunNO = 0;
-	int reservationIdInt =0;
-	char comfirmstr[20];
-    DEBUG_INFO("handleCancelReservationRequest...\n");
-
-	json_object *CancelReservation;
-	CancelReservation = json_tokener_parse(payload);
-	if(!is_error(CancelReservation))
-	{
-		// Required data
-		reservationIdInt = json_object_get_int(json_object_object_get(CancelReservation, "reservationId"));
-	}
-	json_object_put(CancelReservation);
-
-
-	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
-	//J: CHAdeMO   U: CCS1 combo   E: CCS2 combo  G: GBT DC
-	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 );
-
-			if(gunType[2] == 'J')
-			{
-				gunNO = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index + 1;
-			}
-			else
-			{
-				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 );
-			if((gunType[2] == 'U') || (gunType[2] == 'E'))
-			{
-				gunNO = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index + 1;
-			}
-			else
-			{
-				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 );
-			if(gunType[2] == 'G')
-			{
-				gunNO = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index + 1;
-			}
-			else
-			{
-				gunNO = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index;
-			}
-
-			ShmOCPP16Data->CsMsg.bits[gunNO].CancelReservationReq = 1;
-			goto end;
-		}
-	}
-
-
-	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 );
-
-			if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
-			{
-				gunNO = 1; //ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index ;
-			}
-			else
-			{
-				gunNO = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index;
-			}
-
-			ShmOCPP16Data->CsMsg.bits[gunNO].CancelReservationReq = 1;
-			goto end;
-		}
-	}
-
-	//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 typeStr[16]={0};
-	char comfirmstr[20];
-	int specificId = FALSE;
-
-	DEBUG_INFO("handleChangeAvailabilityRequest...\n");
-
-	json_object *ChangeAvailability;
-	ChangeAvailability = json_tokener_parse(payload);
-
-	if(!is_error(ChangeAvailability))
-	{
-		// Required data
-		gunIndex = json_object_get_int(json_object_object_get(ChangeAvailability, "connectorId"));
-		sprintf((char*)typeStr, "%s", json_object_get_string(json_object_object_get(ChangeAvailability, "type")));
-	}
-	json_object_put(ChangeAvailability);
-
-
-	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(strcmp((const char *)typeStr, AvailabilityTypeStr[Inoperative]) == 0)
-	{
-		
-			//----------------------gunIndex is 0  ------------------------------------------------//
-		if(gunIndex  == 0)
-		{
-			if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D') // 'D' means DC
-			{
-				for(int i=0; i < gunTotalNumber; i++)
-				{
-					for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-					{
-						if (gunType[i] == 'J')
-						{
-							if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_RESERVATION) // S_PRECHARGE
-							{
-								sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
-								goto end;
-							}
-							else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING) ||
-									(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_PREPARING) ||
-									(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_CHARGING) ||
-									(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_TERMINATING) ||
-									(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_COMPLETE))  // S_CHARGING
-							{
-								sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
-								goto end;
-							}
-						}
-					}//END FOR CHAdeMO_QUANTITY
-
-					for (int index = 0; index < CCS_QUANTITY; index++)
-					{
-						if ((gunType[i] == 'U')||(gunType[i] == 'E'))
-						{
-							if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_RESERVATION)// S_PRECHARGE
-							{
-									sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
-									goto end;
-							}
-								else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING) ||
-										(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_PREPARING) ||
-										(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_CHARGING) ||
-										(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_TERMINATING) ||
-										(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // S_CHARGING
-							{
-									sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
-									goto end;
-							}
-						}
-					}//END FOR CCS_QUANTITY
-
-					for (int index = 0; index < GB_QUANTITY; index++)
-					{
-						if (gunType[i] == 'G')
-						{
-							if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_RESERVATION) // S_PRECHARGE
-							{
-									sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
-									goto end;
-							}
-							else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING) ||
-									(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_PREPARING) ||
-									(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_CHARGING) ||
-									(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_TERMINATING) ||
-									(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // S_CHARGING
-							{
-									sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
-									goto end;
-							}
-						}
-					}// END FOR GB_QUANTITY
-
-					for (int index = 0; index < AC_QUANTITY; index++)
-					{
-						if ((gunType[i] > '0')&&(gunType[i] <= '9'))
-						{
-							if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_RESERVATION) // S_PRECHARGE
-							{
-									sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
-									goto end;
-							}
-							else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING) ||
-									(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_PREPARING) ||
-									(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_CHARGING) ||
-									(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_TERMINATING) ||
-									(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // S_CHARGING
-							{
-									sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
-									goto end;
-							}
-						}
-					}//END FOR AC_QUANTITY
-				}// END FOR gunTotalNumber
-			}
-			else if (ShmSysConfigAndInfo->SysConfig.ModelName[0]=='A') //'A' means AC
-			{
-				for(int i=0; i < gunTotalNumber; i++)
-				{
-					if(ShmSysConfigAndInfo->SysInfo.AcChargingData[i].SystemStatus == SYS_MODE_RESERVATION) // S_PRECHARGE
-					{
-						sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
-						goto end;
-					}
-					else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[i].SystemStatus == SYS_MODE_AUTHORIZING) ||
-						(ShmSysConfigAndInfo->SysInfo.AcChargingData[i].SystemStatus == SYS_MODE_PREPARING) ||
-						(ShmSysConfigAndInfo->SysInfo.AcChargingData[i].SystemStatus == SYS_MODE_CHARGING) ||
-						(ShmSysConfigAndInfo->SysInfo.AcChargingData[i].SystemStatus == SYS_MODE_TERMINATING) ||
-						(ShmSysConfigAndInfo->SysInfo.AcChargingData[i].SystemStatus == SYS_MODE_COMPLETE)) // S_CHARGING
-					{
-						sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
-						goto end;
-					}
-				}
-			}
-
-			sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
-			goto end;
-		}
-
-
-		//----------------------gunIndex is not 0  ------------------------------------------------//
-		
-	    //check Transaction active
-		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-		{
-			if ((gunIndex > 0)&&(gunType[gunIndex-1] == 'J'))
-			{
-				if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_RESERVATION) ) // S_PRECHARGE
-				{
-					sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
-					goto end;
-				}
-				else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING) ||
-						(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_PREPARING) ||
-						(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_CHARGING) ||
-						(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_TERMINATING) ||
-						(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_COMPLETE))  // S_CHARGING
-				{
-					sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
-					goto end;
-				}
-				else
-				{
-					DEBUG_INFO("ShmSysConfigAndInfo->SysInfo.ChademoChargingData[%d].SystemStatus = %d\n",index, ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus);
-					sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
-					goto end;
-				}
-			}
-		}//END FOR CHAdeMO_QUANTITY
-
-		for (int index = 0; index < CCS_QUANTITY; index++)
-		{
-			if ((gunIndex > 0)&&((gunType[gunIndex - 1] == 'U')||(gunType[gunIndex - 1] == 'E')))
-			{
-				if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_RESERVATION) )// S_PRECHARGE
-				{
-					sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
-					goto end;
-				}
-				else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING) ||
-						(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_PREPARING) ||
-						(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_CHARGING) ||
-						(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_TERMINATING) ||
-						(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // S_CHARGING
-				{
-					sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
-					goto end;
-				}
-				else
-				{
-					DEBUG_INFO("ShmSysConfigAndInfo->SysInfo.CcsChargingData[%d].SystemStatus=%d\n",index, ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus);
-					sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
-					goto end;
-				}
-			}
-		}//END FOR CCS_QUANTITY
-
-		for (int index = 0; index < GB_QUANTITY; index++)
-		{
-			if ((gunIndex > 0)&&(gunType[gunIndex-1] == 'G'))
-			{
-				if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_RESERVATION)) // S_PRECHARGE
-				{
-					sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
-					goto end;
-				}
-				else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING) ||
-						(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_PREPARING) ||
-						(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_CHARGING) ||
-						(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_TERMINATING) ||
-						(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // S_CHARGING
-				{
-					sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
-					goto end;
-				}
-				else
-				{
-					DEBUG_INFO("ShmSysConfigAndInfo->SysInfo.GbChargingData[%d].SystemStatus=%d\n",index,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus);
-					sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
-					goto end;
-				}
-
-
-			}
-		}// END FOR GB_QUANTITY
-
-		for (int index = 0; index < AC_QUANTITY; index++)
-		{
-			if ((gunIndex > 0)&&((gunType[gunIndex-1] > '0')&&(gunType[gunIndex-1] <= '9')))
-			{
-				if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_RESERVATION)) // S_PRECHARGE
-				{
-					sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
-					goto end;
-				}
-				else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING) ||
-						(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_PREPARING) ||
-						(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_CHARGING) ||
-						(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_TERMINATING) ||
-						(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // S_CHARGING
-				{
-					sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
-					goto end;
-				}
-				else
-				{
-					DEBUG_INFO("ShmSysConfigAndInfo->SysInfo.AcChargingData[%d].SystemStatus=%d\n",index, ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus);
-					sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
-					goto end;
-				}
-			}
-		}//END FOR AC_QUANTITY
-
-	}//END FOR AvailabilityTypeStr[Inoperative]
-	
-
-	if(strcmp((const char *)typeStr, AvailabilityTypeStr[Operative]) == 0)
-	{
-		//----------------------gunIndex is 0  ------------------------------------------------//
-		if(gunIndex  == 0)
-		{
-			if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D') // 'D' means DC
-			{
-				for(int i=0; i < gunTotalNumber; i++)
-				{
-					for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-					{
-						if ((gunType[i] == 'J' ) &&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_FAULT))  //S_FAULT   //(((gunIndex  == 0)|| ((gunIndex > 0)&&(gunType[gunIndex-1] == 'J')) ) &&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != SYS_MODE_FAULT))  //S_FAULT
-						{
-							sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
-							goto end;
-						}
-					}//END FOR CHAdeMO_QUANTITY
-
-					for (int index = 0; index < CCS_QUANTITY; index++)
-					{
-						if (((gunType[i] == 'U')||(gunType[i] == 'E'))&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_FAULT)) //S_FAULT//(((gunIndex  == 0)|| ((gunIndex > 0)&&((gunType[gunIndex - 1] == 'U')||(gunType[gunIndex - 1] == 'E'))) )&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != SYS_MODE_FAULT)) //S_FAULT
-						{
-							sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
-							goto end;
-						}
-					}//END FOR CCS_QUANTITY
-
-					for (int index = 0; index < GB_QUANTITY; index++)
-					{
-						if ((gunType[i] == 'G')&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_FAULT)) //S_FAULT  //(((gunIndex  == 0)|| ((gunIndex > 0)&&(gunType[gunIndex-1] == 'G')))&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != SYS_MODE_FAULT)) //S_FAULT
-						{
-							//ShmOCPP16Data->CsMsg.bits[gunIndex - 1].ChangeAvailabilityReq = 1;
-							sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
-							goto end;
-						}
-					}// END FOR GB_QUANTITY
-
-					for (int index = 0; index < AC_QUANTITY; index++)
-					{
-						if (((gunType[i] > '0')&&(gunType[i] <= '9')) &&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_FAULT))  //S_FAULT // (((gunIndex  == 0)|| ((gunIndex > 0)&&((gunType[gunIndex-1] > '0')&&(gunType[gunIndex-1] <= '9')))) &&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_FAULT))  //S_FAULT
-						{
-							sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
-							goto end;
-						}
-					}//END FOR CHAdeMO_QUANTITY
-
-				}// END FOR gunTotalNumber
-			}
-			else if (ShmSysConfigAndInfo->SysConfig.ModelName[0]=='A') //'A' means AC
-			{
-				for(int i=0; i < gunTotalNumber; i++)
-				{
-					for (int index = 0; index < AC_QUANTITY; index++)
-					{
-						if (((gunType[i] > '0')&&(gunType[i] <= '9')) &&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_FAULT))  //S_FAULT // (((gunIndex  == 0)|| ((gunIndex > 0)&&((gunType[gunIndex-1] > '0')&&(gunType[gunIndex-1] <= '9')))) &&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_FAULT))  //S_FAULT
-						{
-							sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
-							goto end;
-						}
-					}//END FOR CHAdeMO_QUANTITY
-
-				} // END FOR gunTotalNumber
-			}
-
-			sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
-			goto end;
-		}
-
-		//----------------------gunIndex is not 0  ------------------------------------------------//
-	    //check Transaction active
-		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-		{
-			if (((gunIndex > 0)&&(gunType[gunIndex-1] == 'J') ) &&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != SYS_MODE_FAULT))  //S_FAULT
-			{
-				sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
-				goto end;
-			}
-		}//END FOR CHAdeMO_QUANTITY
-
-		for (int index = 0; index < CCS_QUANTITY; index++)
-		{
-			if ((((gunIndex > 0)&&((gunType[gunIndex - 1] == 'U')||(gunType[gunIndex - 1] == 'E'))) )&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != SYS_MODE_FAULT))  //S_FAULT
-			{
-				sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
-				goto end;
-			}
-		}//END FOR CCS_QUANTITY
-
-		for (int index = 0; index < GB_QUANTITY; index++)
-		{
-			if (((gunIndex > 0)&&(gunType[gunIndex-1] == 'G'))&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != SYS_MODE_FAULT)) //S_FAULT
-			{
-				sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
-				goto end;
-			}
-		}// END FOR GB_QUANTITY
-
-		for (int index = 0; index < AC_QUANTITY; index++)
-		{
-			if (((gunIndex > 0)&&((gunType[gunIndex-1] > '0')&&(gunType[gunIndex-1] <= '9'))) &&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_FAULT))  //S_FAULT
-			{
-				sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
-				goto end;
-			}
-		}//END FOR AC_QUANTITY
-	}//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 );
-	}
-
-	if(gunIndex != 0)
-	{
-		if(strstr(comfirmstr, AvailabilityStatusStr[Rejected]) == NULL)
-			ShmOCPP16Data->CsMsg.bits[gunIndex - 1].ChangeAvailabilityReq = 1;
-	}
-	else
-	{
-		if(strstr(comfirmstr, AvailabilityStatusStr[Rejected]) == NULL)
-		{
-			for(int i=0; i < gunTotalNumber/*(CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY)*/; i++)
-				ShmOCPP16Data->CsMsg.bits[i].ChangeAvailabilityReq = 1;
-		}
-	}
-
-	sendChangeAvailabilityConfirmation(uuid, comfirmstr);
-
-	return result;
-}
-
-int handleChangeConfigurationRequest(char *uuid, char *payload)
-{
-	mtrace();
-	int result = FAIL;
-	char keystr[40]={0};
-	char valuestr[100]={0};
-	char comfirmstr[20]={0};
-
-	DEBUG_INFO("handleChangeConfigurationRequest...\n");
-	json_object *ChangeConfiguration;
-	ChangeConfiguration = json_tokener_parse(payload);
-	if(!is_error(ChangeConfiguration))
-	{
-		// Required data
-		sprintf((char*)keystr, "%s", json_object_get_string(json_object_object_get(ChangeConfiguration, "key")));
-		sprintf((char*)valuestr, "%s", json_object_get_string(json_object_object_get(ChangeConfiguration, "value")));
-	}
-	json_object_put(ChangeConfiguration);
-
-
-    if((uuid==NULL) || (payload ==NULL) )
-    {
-		DEBUG_ERROR("Payload is null\n");
-		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;
-    			StoreConfigurationTable();
-    		break;
-
-    		case ConfigurationStatus_Rejected:
-    			sprintf(comfirmstr, "%s", ConfigurationStatusStr[ConfigurationStatus_Rejected] );
-    		break;
-
-    		case RebootRequired:
-    			sprintf(comfirmstr, "%s", ConfigurationStatusStr[RebootRequired]);
-    			StoreConfigurationTable();
-    		break;
-
-    		case NotSupported:
-    			sprintf(comfirmstr, "%s", ConfigurationStatusStr[NotSupported] );
-    			break;
-
-    		default:
-    		break;
-    	}
-    }
-
-    sendChangeConfigurationConfirmation(uuid, comfirmstr);
-	ShmOCPP16Data->MsMsg.bits.ChangeConfigurationConf = 1;
-	if((strcmp(keystr,"WebSocketPingInterval")==0)&&(strcmp(comfirmstr,"Accepted")==0))
-	{
-		ChageWebSocketPingInterval(atoi(valuestr));
-	}
-
-	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_INFO("handleClearCacheRequest...\n");
-    stat("/Storage/OCPP", &stats);
-
-    // Check for directory existence
-    if (S_ISDIR(stats.st_mode) == 1)
-    {}
-    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(AuthorizationCache_JSON,F_OK))!=-1)
-    {
-    	DEBUG_INFO("AuthorizationCache file exist.\n");
-    }
-    else
-    {
-    	DEBUG_INFO("AuthorizationCache file not exist\n");
-    	FILE *log = fopen(AuthorizationCache_JSON, "w+");
-
-    	if(log == NULL)
-    	{
-    		DEBUG_INFO("AuthorizationCache file is NULL\n");
-    		sprintf(comfirmstr, "%s", ClearCacheStatusStr[ClearCacheStatus_Rejected] );
-    		goto end;
-    	}
-    	else
-    	{
-    		fclose(log);
-    	}
-    }
-
-    if((fd = open(AuthorizationCache_JSON,O_RDWR)) < 0)
-    {
-    	DEBUG_INFO("open AuthorizationCache file failed\n");
-        sprintf(comfirmstr, "%s", ClearCacheStatusStr[ClearCacheStatus_Rejected] );
-    }
-    else
-    {
-    	DEBUG_INFO("open AuthorizationCache file successful\n");
-        ftruncate(fd,0);
-        lseek(fd,0,SEEK_SET);
-        close(fd);
-        sprintf(comfirmstr, "%s", ClearCacheStatusStr[ClearCacheStatus_Accepted] );
-    }
-
-end:
-    sendClearCacheConfirmation(uuid, comfirmstr);
-	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};
-	char str[100]={0};
-	int c = 0;
-	char *loc;
-	char fname[200]={0};
-	char comfirmstr[20]={0};
-	char word[1600]={0};
-	int clearflag = FALSE;
-	int chargingProfileIdIsNULL = FALSE;
-	int connectorIsNULL = FALSE;
-	int chargingProfilePurposeIsNULL = FALSE;
-	int stackLevelIsNULL = FALSE;
-	//int GotoEnd = FALSE;
-	FILE *fptr1, *fptr2;
-	char temp[] = "/Storage/OCPP/ClearChargingProfiletemp.json";  // Create temp file
-    int n_chargingProfile=0;
-    int isEmptyFile = FALSE;
-    char sLineWord[1600]={0};
-    char chargingProfiles[10][100]={0};
-    int ChargeProfileCount = 0;
-    char ch;
-    connectorIdInt = chargingProfileIdInt = stackLevelInt = 0;
-    DEBUG_INFO("handleClearChargingProfileRequest...\n");
-    json_object *ClearChargingProfile;
-	ClearChargingProfile = json_tokener_parse(payload);
-	if(!is_error(ClearChargingProfile))
-	{
-		// Optional data
-		if(json_object_object_get(ClearChargingProfile, "id") != NULL)
-			chargingProfileIdInt = json_object_get_int(json_object_object_get(ClearChargingProfile, "id"));
-		else
-			chargingProfileIdIsNULL = TRUE;
-
-		if(json_object_object_get(ClearChargingProfile, "connectorId") != NULL)
-			connectorIdInt = json_object_get_int(json_object_object_get(ClearChargingProfile, "connectorId"));
-		else
-			connectorIsNULL = TRUE;
-
-		if(json_object_object_get(ClearChargingProfile, "chargingProfilePurpose") != NULL)
-			sprintf((char*)chargingProfilePurposeStr, "%s", json_object_get_string(json_object_object_get(ClearChargingProfile, "chargingProfilePurpose")));
-		else
-			chargingProfilePurposeIsNULL = TRUE;
-
-		if(json_object_object_get(ClearChargingProfile, "stackLevel") != NULL)
-			stackLevelInt = json_object_get_int(json_object_object_get(ClearChargingProfile, "stackLevel"));
-		else
-			stackLevelIsNULL = TRUE;
-	}
-	json_object_put(ClearChargingProfile);
-
-
-
-	if(connectorIsNULL == FALSE)
-	{
-		switch(connectorIdInt)
-		{
-			case 0:
-
-			    if(chargingProfilePurposeIsNULL == TRUE)
-				{
-			    	int l = 0;
-			    	strcpy(fname, ChargePointMaxProfile_JSON);
-			    	if((access(fname,F_OK))!=-1)
-			    	{
-			    		strcpy(chargingProfiles[l], fname);
-			    		l = l + 1;
-			    	}
-
-			    	strcpy(fname, TxDefaultProfile_0_JSON);
-			    	if((access(fname,F_OK))!=-1)
-			    	{
-			    		strcpy(chargingProfiles[l], fname);
-			    		l = l + 1;
-			    	}
-			    	ChargeProfileCount = l;
-
-				}
-				else if((chargingProfilePurposeIsNULL == FALSE)&&(strcmp(chargingProfilePurposeStr,"ChargePointMaxProfile")==0))
-				{
-					strcpy(fname, ChargePointMaxProfile_JSON);
-					if((access(fname,F_OK))!=-1)
-					{
-						strcpy(chargingProfiles[0], fname);
-						ChargeProfileCount = 1;
-					}
-				}
-				else if((chargingProfilePurposeIsNULL == FALSE)&&(strcmp(chargingProfilePurposeStr,"TxDefaultProfile")==0))
-				{
-					strcpy(fname, TxDefaultProfile_0_JSON);
-					if((access(fname,F_OK))!=-1)
-					{
-						strcpy(chargingProfiles[0], fname);
-						ChargeProfileCount = 1;
-					}
-				}
-
-				break;
-
-			default:
-			    if(chargingProfilePurposeIsNULL == TRUE)
-			    {
-			    	int m = 0;
-			    	memset(fname, 0, sizeof fname);
-			    	sprintf(fname, "/Storage/OCPP/TxDefaultProfile_%d.json", connectorIdInt);
-			    	if((access(fname,F_OK))!=-1)
-			    	{
-			    		strcpy(chargingProfiles[m], fname);
-			    		m = m + 1;
-			    	}
-
-			    	memset(fname, 0, sizeof fname);
-			    	sprintf(fname, "/Storage/OCPP/TxProfile_%d.json", connectorIdInt);
-			    	if((access(fname,F_OK))!=-1)
-			    	{
-			    		strcpy(chargingProfiles[m], fname);
-			    		m = m + 1;
-			    	}
-
-			    	ChargeProfileCount = m;
-			    }
-				else if((chargingProfilePurposeIsNULL == FALSE)&&(strcmp(chargingProfilePurposeStr,"TxDefaultProfile")==0))
-				{
-					//strcpy(fname, TxDefaultProfile_1_JSON);
-					sprintf(fname, "/Storage/OCPP/TxDefaultProfile_%d.json", connectorIdInt);
-					if((access(fname,F_OK))!=-1)
-					{
-						strcpy(chargingProfiles[0], fname);
-						ChargeProfileCount = 1;
-					}
-
-				}
-				else if((chargingProfilePurposeIsNULL == FALSE)&&(strcmp(chargingProfilePurposeStr,"TxProfile")==0))
-				{
-					sprintf(fname, "/Storage/OCPP/TxProfile_%d.json", connectorIdInt);
-					if((access(fname,F_OK))!=-1)
-					{
-						strcpy(chargingProfiles[0], fname);
-						ChargeProfileCount = 1;
-					}
-					//strcpy(fname, TxProfile_1_JSON);
-				}
-				//strcpy(fname, ChargePointMaxProfile_JSON );
-				break;
-		}
-	}
-	else // Check all Charging Profiles
-	{
-		int i = 0;
-		char fnametemp[200]={0};
-		ChargeProfileCount = 0;
-		//Check ChargePointMaxProfile.json exit
-		if((access("/Storage/OCPP/ChargePointMaxProfile.json",F_OK))!=-1)
-		{
-			strcpy(chargingProfiles[i], "/Storage/OCPP/ChargePointMaxProfile.json");
-			i = i + 1;
-		}
-
-		//Check TxDefaultProfile_0.json exit
-		if((access("/Storage/OCPP/TxDefaultProfile_0.json",F_OK))!=-1)
-		{
-			strcpy(chargingProfiles[i], "/Storage/OCPP/TxDefaultProfile_0.json");
-			i = i + 1;
-		}
-
-        //Check TxDefaultProfile_%d.json
-		for(int j=1; j <= gunTotalNumber; j++)
-		{
-			memset(fnametemp, 0, sizeof fnametemp);
-			sprintf(fnametemp, "/Storage/OCPP/TxDefaultProfile_%d.json", j);
-			if((access(fnametemp,F_OK))!=-1)
-			{
-				strcpy(chargingProfiles[i], fnametemp);
-				i = i + 1;
-			}
-		}
-
-		//Check TxProfile_%d.json
-		for(int j=1; j <= gunTotalNumber; j++)
-		{
-			memset(fnametemp, 0, sizeof fnametemp);
-			sprintf(fnametemp, "/Storage/OCPP/TxProfile_%d.json", j);
-			if((access(fnametemp,F_OK))!=-1)
-			{
-				strcpy(chargingProfiles[i], fnametemp);
-				i = i + 1;
-			}
-		}
-
-		ChargeProfileCount = i;
-	}// End connectorIsNULL is TRUE
-
-	if(ChargeProfileCount == 0)
-	{
-		sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Unknown] );
-		goto end;
-	}
-
-	if(connectorIsNULL == FALSE && (connectorIdInt != 0) && ( (connectorIdInt-1) > gunTotalNumber) )
-	{
-		sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Unknown] );
-		goto end;
-	}
-
-	if((connectorIsNULL == FALSE) && (connectorIdInt == 0) )
-	{
-		memset(str, 0, sizeof str);
-		// clear temp file
-		sprintf(str,"rm -f %s",temp);
-		system(str);
-
-		for(int k=0; k < ChargeProfileCount; k++)
-		{
-			memset(str, 0, sizeof str);
-			//clear file in C
-			sprintf(str,"rm -f %s",chargingProfiles[k]);
-			system(str);
-		}
-
-		sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Accepted] );
-		goto end;
-	}
-	else if(connectorIsNULL == TRUE)
-	{
-		for(int k=0; k < ChargeProfileCount; k++)
-		{
-			fptr1 = fopen(chargingProfiles[k], "r");
-			fptr2 = fopen("/Storage/OCPP/ClearChargingProfiletemp.json", "w+");
-
-			//Check Charging Profile Count
-			while(fscanf(fptr1, "%s", word) != EOF)
-			{
-				//DEBUG_INFO("word=%s\n",word);
-				if(strstr(word, "chargingProfileId")!= NULL)
-				{
-					//DEBUG_INFO("test chargingProfileId \n");
-					n_chargingProfile = n_chargingProfile + 1;
-					//DEBUG_INFO("chargingProfileId 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);
-				printf("file's gun number is %d\n", tempconnectorIdInt);
-
-				//--------------------------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)&&(tempchargingProfileIdInt == chargingProfileIdInt))
-				{
-					//------- not write to  fptr2-------//
-					sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Accepted] );
-					//clearflag = TRUE;
-				}
-				else if((chargingProfilePurposeIsNULL == FALSE)&&(strcmp(tempchargingProfilePurposeStr, chargingProfilePurposeStr) == 0))
-				{
-					//------- not write to  fptr2-------//
-					sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Accepted] );
-				}
-				else if((stackLevelIsNULL == FALSE) &&(tempstackLevelInt == stackLevelInt))
-				{
-					//------- not write to  fptr2-------//
-					sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Accepted] );
-				}
-				else
-				{
-					fprintf(fptr2, sLineWord);//writing data into file
-				}
-
-				memset(sLineWord, 0, sizeof sLineWord);
-
-		   } //End of while ( fgets( sLineWord, sizeof sLineWord, fptr1 ) != NULL )
-
-		   if(clearflag == TRUE)
-		   {
-			   fclose(fptr1);
-			   fclose(fptr2);
-
-			   sprintf(str,"rm -f %s",chargingProfiles[k]);
-			   system(str);
-
-			   // clear temp file
-			   sprintf(str,"rm -f %s",temp);
-			   system(str);
-
-		   }
-		   else
-		   {
-			   fclose(fptr1);
-			   fclose(fptr2);
-
-			   memset(str, 0, sizeof str);
-			   sprintf(str,"rm -f %s",chargingProfiles[k]);
-			   system(str);
-
-			   resultRename = rename(temp, chargingProfiles[k]);
-
-			   if(resultRename == 0)
-			   {
-			       DEBUG_INFO("File ChargingProfile renamed successfully");
-			   }
-			   else
-			   {
-			       DEBUG_INFO("Error: unable to rename the ChargingProfile file");
-			   }
-
-			   if(comfirmstr[0]== 0)
-			   {
-			       sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Unknown] );
-
-			   }
-
-			    //Check chargingProfile is empty file
-			    /*------ Read the file ----------------*/
-			    fptr1=fopen(chargingProfiles[k],"r");
-			    ch=fgetc(fptr1);
-			    rewind(fptr1);
-			    memset(sLineWord, 0, sizeof sLineWord);
-			    if(ch!=EOF)
-			    {
-			        while (fgets( sLineWord, sizeof sLineWord, fptr1) != NULL)
-			        {
-			        	str[strlen(sLineWord) - 1] = '\0'; // eat the newline fgets() stores
-
-			        	if(sLineWord[0]=='\0')
-			        	{
-			        		isEmptyFile = TRUE;
-			        		break;
-			        	}
-			        	else
-			        	{
-			        		isEmptyFile = FALSE;
-			        		break;
-			        	}
-			        }
-			    }
-			    fclose(fptr1);
-
-			    if(isEmptyFile == TRUE)
-			    {
-			    	memset(str, 0, sizeof str);
-			        sprintf(str,"rm -f %s",chargingProfiles[k]);
-			        system(str);
-			    }
-			}
-
-	  }// End of while(int k=0; k < ChargePointCount; k++)
-	}
-	else if((connectorIsNULL == FALSE) && (connectorIdInt != 0) )
-	{
-		DEBUG_INFO("ChargeProfileCount = %d\n", ChargeProfileCount);
-		for(int k=0; k < ChargeProfileCount; k++)
-		{
-		   fptr1 = fopen(chargingProfiles[k], "r");
-		   fptr2 = fopen(temp, "w+");
-		   //Check Charging Profile Count
-		   while(fscanf(fptr1, "%s", word) != EOF)
-		   {
-			   //DEBUG_INFO("word=%s\n",word);
-			   if(strstr(word, "chargingProfileId")!= NULL)
-			   {
-				   n_chargingProfile = n_chargingProfile + 1;
-			   }
-		   }
-		   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)&&(tempchargingProfileIdInt == chargingProfileIdInt))
-			   {
-				   //------- not write to  fptr2-------//
-				   sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Accepted] );
-				   //clearflag = TRUE;
-			   }
-			   else if((stackLevelIsNULL == FALSE) &&(tempstackLevelInt == stackLevelInt))
-			   {
-				   //------- not write to  fptr2-------//
-				   sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Accepted] );
-			   }
-			   else if(stackLevelIsNULL == TRUE)
-			   {
-				   //Clear Whole File
-				   sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Accepted] );
-				   clearflag = TRUE;
-				   break;
-			   }
-			   else
-			   {
-				   fprintf(fptr2, sLineWord);//writing data into file
-			   }
-
-			   memset(sLineWord, 0, sizeof sLineWord);
-		   }
-
-		   if(clearflag == TRUE)
-		   {
-			   fclose(fptr1);
-			   fclose(fptr2);
-
-			   sprintf(str,"rm -f %s",chargingProfiles[k]);
-			   system(str);
-
-			   // clear temp file
-			   sprintf(str,"rm -f %s",temp);
-			   system(str);
-		   }
-		   else
-		   {
-			   fclose(fptr1);
-			   fclose(fptr2);
-
-			   sprintf(str,"rm -f %s",chargingProfiles[k]);
-			   system(str);
-
-			   resultRename = rename(temp, chargingProfiles[k]);
-
-			   if(resultRename == 0)
-			   {
-				   DEBUG_INFO("File ChargingProfile renamed successfully");
-			   }
-			   else
-			   {
-				   DEBUG_INFO("Error: unable to rename the ChargingProfile file");
-			   }
-
-			   if(comfirmstr[0]== 0)
-			   {
-				   sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Unknown] );
-			   }
-
-			   //Check chargingProfile is empty file
-			   /*------ Read the file ----------------*/
-			   fptr1=fopen(chargingProfiles[k],"r");
-			   ch=fgetc(fptr1);
-			   rewind(fptr1);
-			   memset(sLineWord, 0, sizeof sLineWord);
-			   if(ch!=EOF)
-			   {
-				   while (fgets( sLineWord, sizeof sLineWord, fptr1) != NULL)
-				   {
-					   str[strlen(sLineWord) - 1] = '\0'; // eat the newline fgets() stores
-
-					   if(sLineWord[0]=='\0')
-					   {
-						   isEmptyFile = TRUE;
-						   break;
-					   }
-					   else
-					   {
-						   isEmptyFile = FALSE;
-						   break;
-					   }
-				   }
-			   }
-			   fclose(fptr1);
-
-			   if(isEmptyFile == TRUE)
-			   {
-				   memset(str, 0, sizeof str);
-				   sprintf(str,"rm -f %s",chargingProfiles[k]);
-				   system(str);
-			   }
-			   /*------- End of reading ---------------*/
-		   }
-
-	  } //  while(int k=0; k < ChargeProfileCount; k++)
-
-	}// (connectorIsNULL == FALSE) && (connectorIdInt != 0)
-
-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 message[80]={0};
-
-	DEBUG_INFO("handleDataTransferRequest...\n");
-	if((uuid != NULL) && (payload != NULL))
-	{
-		json_object *DataTransfer;
-		DataTransfer = json_tokener_parse(payload);
-
-		if(!is_error(DataTransfer))
-		{
-			// Required data
-			sprintf((char*)tempvendorId, "%s", json_object_get_string(json_object_object_get(DataTransfer, "vendorId")));
-
-			// Optional data
-			if(json_object_object_get(DataTransfer, "messageId") != NULL)
-				sprintf((char*)tempmessageId, "%s", json_object_get_string(json_object_object_get(DataTransfer, "messageId")));
-
-			if(json_object_object_get(DataTransfer, "data") != NULL)
-				sprintf((char*)tempdata, "%s", json_object_get_string(json_object_object_get(DataTransfer, "data")));
-
-			result = PASS;
-		}
-		json_object_put(DataTransfer);
-
-
-		sprintf(message,"[%d,\"%s\",{\"status\":\"%s\",\"data\":\"vendorId-%s messageId-%s data-%s\"}]",MESSAGE_TYPE_CALLRESULT, uuid, "Rejected", tempvendorId, tempmessageId, tempdata );
-	}
-	else
-	{
-		char guid[37]={0};
-		random_uuid(guid);
-
-		//[2,"1577349264923","DataTransfer",{"vendorId":"Phihong","messageId":"MSGID","data":"Data1"}]
-		sprintf(message,"[%d,\"%s\",\"%s\",{\"vendorId\":\"Phihong\",\"messageId\":\"MSGID\",\"data\":\"Data1\"}]",MESSAGE_TYPE_CALL, guid, "DataTransfer");
-	}
-
-	LWS_Send(message);
-	return result;
-}
-
-int handleGetCompositeScheduleRequest(char *uuid, char *payload)
-{
-	mtrace();
-	int result = FAIL;
-	int connectorIdInt, durationInt;
-	char chargingRateUnitStr[4]={0};
-	char comfirmstr[20];
-    int confirmPeriods = 0;
-
-	DEBUG_INFO("handleGetCompositeScheduleRequest...\n");
-	json_object *GetCompositeSchedule;
-	GetCompositeSchedule = json_tokener_parse(payload);
-	if(!is_error(GetCompositeSchedule))
-	{
-		// Required data
-		connectorIdInt= json_object_get_int(json_object_object_get(GetCompositeSchedule, "connectorId"));
-		durationInt = json_object_get_int(json_object_object_get(GetCompositeSchedule, "duration"));
-
-		// Optional data
-		if(json_object_object_get(GetCompositeSchedule, "chargingRateUnit") != NULL)
-			sprintf((char*)chargingRateUnitStr, "%s", json_object_get_string(json_object_object_get(GetCompositeSchedule, "chargingRateUnit")));
-	}
-	json_object_put(GetCompositeSchedule);
-
-	memset(ShmOCPP16Data->GetCompositeSchedule, 0, sizeof(struct StructChargingSchedulePeriod)*gunTotalNumber);
-	if((connectorIdInt == 0) ||
-	   ((connectorIdInt > 0) && ((connectorIdInt -1) < gunTotalNumber)))
-  	{
-		int gun_index = (connectorIdInt==0?0:connectorIdInt-1);
-		struct StructChargingProfile tmpProfile[1];
-
-  		checkCompositeSchedule(connectorIdInt, durationInt, &tmpProfile[0]);
-  		for(int idx=0;idx<ARRAY_SIZE(ShmOCPP16Data->GetCompositeSchedule[gun_index].ResponseChargingSchedule.ChargingSchedulePeriod);idx++)
-  		{
-			DEBUG_INFO("Smart Period-%02d start: %d\n", idx, tmpProfile[0].ChargingSchedule.ChargingSchedulePeriod[idx].StartPeriod);
-			DEBUG_INFO("Smart Period-%02d limit: %f\n", idx, tmpProfile[0].ChargingSchedule.ChargingSchedulePeriod[idx].Limit);
-		}
-  		ShmOCPP16Data->GetCompositeSchedule[gun_index].ResponseConnectorId = connectorIdInt;
-  		memcpy(&ShmOCPP16Data->GetCompositeSchedule[gun_index].ResponseChargingSchedule, &tmpProfile[0].ChargingSchedule, sizeof(struct StructChargingSchedule));
-  		memcpy(&ShmOCPP16Data->GetCompositeSchedule[gun_index].ResponseScheduleStart ,&tmpProfile[0].ChargingSchedule.StartSchedule, ARRAY_SIZE(tmpProfile[0].ChargingSchedule.StartSchedule));
-
-  		for(int idx=0;idx<ARRAY_SIZE(ShmOCPP16Data->GetCompositeSchedule[gun_index].ResponseChargingSchedule.ChargingSchedulePeriod);idx++)
-  		{
-   			DEBUG_INFO("Composite Period-%02d start: %d\n", idx, ShmOCPP16Data->GetCompositeSchedule[gun_index].ResponseChargingSchedule.ChargingSchedulePeriod[idx].StartPeriod);
-  			DEBUG_INFO("Composite Period-%02d limit: %f\n", idx, ShmOCPP16Data->GetCompositeSchedule[gun_index].ResponseChargingSchedule.ChargingSchedulePeriod[idx].Limit);
-
-  			if((ShmOCPP16Data->GetCompositeSchedule[gun_index].ResponseChargingSchedule.ChargingSchedulePeriod[idx].StartPeriod==0) &&
-  			   (ShmOCPP16Data->GetCompositeSchedule[gun_index].ResponseChargingSchedule.ChargingSchedulePeriod[idx].Limit==0))
-  			{
-  				confirmPeriods = idx;
-  				break;
-  			}
-  		}
-  		sprintf(comfirmstr, "%s", GetCompositeScheduleStatusStr[GetCompositeScheduleStatus_Accepted] );
-  	}
-  	else
-  	{
-  		sprintf(comfirmstr, "%s", GetCompositeScheduleStatusStr[GetCompositeScheduleStatus_Rejected] );
-  	}
-
-	sendGetCompositeScheduleConfirmation(uuid, comfirmstr, connectorIdInt, confirmPeriods);
-
-	return result;
-}
-
-int handleGetConfigurationRequest(char *uuid, char *payload)
-{
-	mtrace();
-	int result = FAIL;
-	int MaxKeySupported = 0;
-	int n_keys = 0;
-	char requestKey[43][50]={0};
-
-	DEBUG_INFO("handleGetConfigurationRequest...\n");
-	json_object *GetConfiguration;
-	GetConfiguration = json_tokener_parse(payload);
-
-	if(!is_error(GetConfiguration))
-	{
-		// Optional data
-		if(json_object_object_get(GetConfiguration, "key") != NULL)
-		{
-			for(int idx=0;idx<json_object_array_length(json_object_object_get(GetConfiguration, "key"));idx++)
-			{
-				sprintf((char*)requestKey[idx], "%s", json_object_get_string(json_object_array_get_idx(json_object_object_get(GetConfiguration, "key"), idx)));
-				n_keys = idx + 1;
-			}
-		}
-	}
-	json_object_put(GetConfiguration);
-
-	UnknownKeynum = 0;
-	memset( (void *)unknownkey, 0, sizeof(unknownkey));
-
-	MaxKeySupported = GetConfigurationMaxKeysNUM;
-	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]);
-		}
-	}
-	else
-	{
-		DEBUG_INFO("There is no key in Message, get all configuration\n");
-		getKeyValue("");
-	}
-
-	processUnkownKey();
-	sendGetConfigurationConfirmation(uuid);
-
-	return result;
-}
-
-static char fnamePlusPath[100]={0};
-static char fnamePWithNoPath[60]={0};
-void checkUploadLog(void)
-{
-	FILE *fp;
-	/* Open the command for reading. */
-	fp = popen("find /mnt/ -type f -name \"*.zip\" |xargs ls -t", "r");
-	if (fp == NULL) {
-	   printf("Failed to run command\n" );
-	   exit(1);
-	}
-
-	int ftppathlen = 0;
-	memset(fnamePlusPath, 0, sizeof(fnamePlusPath));
-	int i = 0;
-	/* Read the output a line at a time - output it. */
-	while (fgets(fnamePlusPath, sizeof(fnamePlusPath), fp) != NULL) {
-		if(i==0)
-		{
-			ftppathlen = strlen(fnamePlusPath);
-			printf("%s\n", fnamePlusPath);
-			fnamePlusPath[ftppathlen]='\0';
-			break;
-		}
-		i= i+1;
-	}
-
-	/* close */
-	pclose(fp);
-
-	for(int k=0; k< sizeof(fnamePlusPath); k++)
-	{
-		if((fnamePlusPath[k]=='\n') || (fnamePlusPath[k]=='r'))
-		{
-			fnamePlusPath[k]='\0';
-		}
-	}
-
-
-	i=1;
-	//char fname[60]={0};
-	while(i < ftppathlen)
-	{
-		int len=ftppathlen-i;
-		if(fnamePlusPath[len]== 47) // '/' ascll code: 47
-		{
-			printf("compare '/' all right\n");
-			break;
-		}
-		i=i+1;
-	}
-
-	memset(fnamePWithNoPath, 0, sizeof(fnamePWithNoPath));
-	strncpy(fnamePWithNoPath, fnamePlusPath+(ftppathlen-i+1), i+1);
-	fnamePWithNoPath[i+1] = '\0';
-
-	for(int j=0; j< sizeof(fnamePWithNoPath); j++)
-	{
-		if((fnamePWithNoPath[j]=='\n') || (fnamePWithNoPath[j]=='r'))
-		{
-			fnamePWithNoPath[j]='\0';
-		}
-	}
-
-	FILE* fp1 = fopen(fnamePlusPath, "r");
-	if (fp1)
-	{
-		printf("testfuc : fnamePlusPath=%s exist.\n", fnamePlusPath);
-		// file exists
-		fclose(fp1);
-	}
-	else
-	{
-		// file doesn't exist
-		printf("testfuc : fnamePlusPath=%s not exist!\n", fnamePlusPath);
-	}
-}
-
-int handleGetDiagnosticsRequest(char *uuid, char *payload)
-{
-	mtrace();
-	int result = FAIL;
-	char cmdBuf[512];
-	char fName[258];
-	time_t CurrentTime;
-	struct tm *tm;
-
-	pthread_t th_Status;
-	CurrentTime = time(NULL);
-	tm = localtime(&CurrentTime);
-	sprintf(fName ,"%s-%s-%04d%02d%02d%02d%02d%02d.zip", ShmSysConfigAndInfo->SysConfig.ModelName, ShmSysConfigAndInfo->SysConfig.SerialNumber, (tm->tm_year+1900), (tm->tm_mon+1),tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec);
-	sendGetDiagnosticsConfirmation(uuid, fName);
-	system("exec /root/logPackTools 'log' 6");
-	sprintf(cmdBuf, "mv /mnt/log.zip /mnt/%s", fName);
-	system(cmdBuf);
-	checkUploadLog();
-
-	pthread_create(&th_Status, NULL, GetDiagnosticsProcess, stringtrimspace(payload));
-
-	return result;
-}
-
-void* GetDiagnosticsProcess(void* data)
-{
-	pthread_detach(pthread_self());
-	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 sstr[260]={ 0 };
-	int c = 0;
-	char *loc;
-	int isSuccess = FALSE;
-	char ftpbuf[200]={0};
-	char * pch;
-
-	char str[300]={ 0 };
-	strcpy(str,(const char*)data);
-
-	retriesIsNULL = retryIntervalIsNULL = startTimeIsNULL = stopTimeIsNULL = FALSE;
-
-	DEBUG_INFO("GetDiagnosticsProcess...%s\n", str);
-	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);
-	//strcpy(locationstr,"http://test.evsocket.phihong.com.cn:9001/UploadFiles/Diagnostics/");
-
-	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] != ',')&&(loc[strlen("retries")+2+c] != '}'))
-		{
-			sstr[c] = loc[strlen("retries")+2+c];
-			c++;
-		}
-		sstr[c] = '\0';
-		retriesInt = atoi(sstr);
-	}
-
-	if(retriesIsNULL == TRUE)
-	{
-		retriesInt = 3; // If this field is not present, it is left to Charge Point to decide how many times it wants to retry.
-	}
-
-	//****************retryInterval*******************/
-	c = 0;
-	loc = strstr(str, "retryInterval");
-	if(loc == NULL)
-	{
-		retryIntervalIsNULL = TRUE;
-		retryIntervalInt = 30; // if this field is not present, it is left to Charge Point to decide how long to wait between attempts.
-	}
-	else
-	{
-		while ((loc[strlen("retryInterval")+2+c] != ',')&&(loc[strlen("retries")+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*/
-
-	//DEBUG_INFO("fnamePlusPath =%s\n",fnamePlusPath);
-	if((access(fnamePlusPath,F_OK))!=-1)
-	{
-		DEBUG_INFO("fnamePlusPath exist.\n");
-	}
-	else
-	{
-		DEBUG_INFO("fnamePlusPath not exist!\n");
-		sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatus_UploadFailed]);
-		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)&&(strcmp(protocol,"http")!=0))
-	{
-		DEBUG_INFO("protocol is not ftp/http ! \n");
-		sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatus_UploadFailed]);
-		goto end;
-
-	}
-
-	if(strncmp(locationstr,"http", 4) == 0)
-	{
-		sscanf(locationstr,"%[^:]:%*2[/]%[^/]/%199[^\n]", protocol, host, path);
-
-		sprintf(ftppath,"/%s", path);
-
-		do{
-			isSuccess = httpUploadFile(host, ftppath, fnamePlusPath, locationstr);
-			sleep(retryIntervalInt);
-		}while((isSuccess == 0)&&(retriesInt > 0 && retriesInt --));
-
-		if(!isSuccess)
-		{
-			DEBUG_INFO("Diagnostics fail.\n");
-			sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatus_UploadFailed]);
-		}
-		else
-		{
-			DEBUG_INFO("sendDiagnosticsStatusNotificationRequest Uploaded\n");
-			sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatus_Uploaded]);
-		}
-
-	}
-	else
-	{
-		sscanf(host,"%[^/]%s",host1, path1);
-		sprintf(ftppath,"%s", path1);
-
-		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;
-		memset(ftpbuf, 0, sizeof(ftpbuf));
-
-		if(port == 0)
-		   port = 21;
-
-		do{
-		    isSuccess = ftpFile(host1, user, password, port, ftppath, fnamePlusPath, fnamePWithNoPath);
-		    sleep(retryIntervalInt);
-		}while((!isSuccess)&&(retriesInt > 0 && retriesInt --));
-
-		if(!isSuccess)
-		{
-			DEBUG_INFO("Diagnostics fail.\n");
-			sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatus_UploadFailed]);
-		}
-		else
-		{
-			DEBUG_INFO("sendDiagnosticsStatusNotificationRequest Uploaded\n");
-			sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatus_Uploaded]);
-		}
-	}
-
-end:
-	DiagnosticsStatusNotificationStatus = DIAGNOSTIC_STATUS_IDLE;
-	pthread_exit(NULL);
-}
-
-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};
-	int tempIndex = 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 },sstrtemp[1600]={ 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;
-
-	strcpy(sstrtemp, stringtrimspace(payload));
-
-	//**********connectorId****************/
-	c = 0;
-	memset(sstr ,0, sizeof(sstr) );
-	loc = strstr(sstrtemp, "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)  // Number of the connector on which to start the transaction. connectorId SHALL be > 0
-	{
-		strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
-		goto end;
-	}
-
-	//****************idTag*******************/
-	c = 0;
-	memset(sstr ,0, sizeof(sstr) );
-	loc = strstr(sstrtemp, "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(sstrtemp, "chargingProfile");
-	if(loc == NULL)
-	{
-		chargingProfileIsNULL = TRUE;
-	}
-	else
-	{
-		//****************chargingProfileId*******************/
-		c=0;
-		loc = strstr(sstrtemp, "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(sstrtemp, "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(sstrtemp, "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(sstrtemp, "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(sstrtemp, "chargingProfileKind");
-		while (loc[3+strlen("chargingProfileKind")+c] != '\"')
-		{
-			sstr[c] = loc[3+strlen("chargingProfileKind")+c];
-			c++;
-		}
-		sstr[c] = '\0';
-		strcpy(chargingProfileKindstr,sstr);
-
-		//****************recurrencyKind*******************/
-		loc = strstr(sstrtemp, "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(sstrtemp, "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(sstrtemp, "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(sstrtemp, "chargingSchedule");
-		if(loc != NULL)
-		{
-			//****************duration*******************/
-			loc = strstr(sstrtemp, "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(sstrtemp, "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(sstrtemp, "chargingRateUnit");
-			while (loc[3+strlen("chargingRateUnit")+c] != '\"')
-			{
-				sstr[c] = loc[3+strlen("chargingRateUnit")+c];
-				c++;
-			}
-			sstr[c] = '\0';
-			strcpy(chargingRateUnitstr,sstr);
-
-			//****************minChargingRate*******************/
-			loc = strstr(sstrtemp, "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 = sstrtemp;
-
-
-			while ((where = strstr(where, "startPeriod"))) {
-				        where += what_len;
-				        chargingSchedulePeriodCount++;
-			}
-
-			where = sstrtemp;
-
-			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;
-
-			} // END FOR chargingSchedulePeriodCount
-		}// END IF chargingSchedule
-
-	} // END chargingProfile
-
-	/*
-
-	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(gunType[connectorIdInt -1] == 'J')
-		{
-
-			if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-			{
-				tempIndex =  ((connectorIdInt -1) == 2) ? 1: 0;
-			}
-			else
-			{
-				tempIndex = connectorIdInt -1;
-			}
-
-			for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex )
-				{
-
-					if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId != -1)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId >= 0)&&(strcmp((const char *)ShmOCPP16Data->ReserveNow[index].IdTag, idTagstr) == 0))
-					{
-						//Reserved
-						DEBUG_INFO("Reserved now !!!The idTag matches the idTag of Reservation!!!\n");
-					}
-					else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId != -1)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId >= 0)&&(strcmp((const char *)ShmOCPP16Data->ReserveNow[index].IdTag, 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 != SYS_MODE_IDLE)				//S_IDLE
-							&& (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != SYS_MODE_PREPARING ) 	//S_PRECHARGE
-							&& (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != SYS_MODE_PREPARE_FOR_EV ) 	//S_PREPARING_FOR_EV
-							&& (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != SYS_MODE_PREPARE_FOR_EVSE ))   // S_PREPARING_FOR_EVSE
-						{
-							strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
-							goto end;
-						}
-					}//END FOR ELSE
-				}
-			}// END FOR CHAdeMO_QUANTITY
-
-		}
-		else if((gunType[connectorIdInt -1] == 'U')||(gunType[connectorIdInt -1] == 'E'))
-		{
-			if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-			{
-				tempIndex =  ((connectorIdInt -1) == 2) ? 1: 0;
-			}
-			else
-			{
-				tempIndex = connectorIdInt -1;
-			}
-
-			for (int index = 0; index < CCS_QUANTITY; index++)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
-				{
-					if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ReservationId != -1)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ReservationId >= 0)&&(strcmp((const char *)ShmOCPP16Data->ReserveNow[index].IdTag, idTagstr) == 0))
-					{
-						//Reserved
-						DEBUG_INFO("Reserved now !!!The idTag matches the idTag of Reservation!!!\n");
-					}
-					else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ReservationId != -1)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ReservationId >= 0)&&(strcmp((const char *)ShmOCPP16Data->ReserveNow[index].IdTag, 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 != SYS_MODE_IDLE)          //S_IDLE
-							&& (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != SYS_MODE_PREPARING)   	//S_PRECHARGE
-							&& (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != SYS_MODE_PREPARE_FOR_EV)   	//S_PREPARING_FOR_EV
-							&& (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != SYS_MODE_PREPARE_FOR_EVSE)) 	// S_PREPARING_FOR_EVSE
-						{
-							strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
-							goto end;
-						}
-
-					}// END FOR ELSE
-				}
-			}// END FOR CCS_QUANTITY
-		}
-		else if(gunType[connectorIdInt -1] == 'G')
-		{
-			if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-			{
-				tempIndex =  ((connectorIdInt -1) == 2) ? 1: 0;
-			}
-			else
-			{
-				tempIndex = connectorIdInt -1;
-			}
-
-			for (int index = 0; index < GB_QUANTITY; index++)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex )
-				{
-					if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ReservationId != -1)&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ReservationId >= 0)&&(strcmp((const char *)ShmOCPP16Data->ReserveNow[index].IdTag, idTagstr) == 0))
-					{
-						//Reserved
-						DEBUG_INFO("Reserved now !!!The idTag matches the idTag of Reservation!!!\n");
-					}
-					else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ReservationId != -1)&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ReservationId >= 0)&&(strcmp((const char *)ShmOCPP16Data->ReserveNow[index].IdTag, 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 != SYS_MODE_IDLE)         	//S_IDLE
-							&& (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != SYS_MODE_PREPARING)		//S_PRECHARGE
-							&& (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != SYS_MODE_PREPARE_FOR_EV)		//S_PREPARING_FOR_EV
-							&& (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != SYS_MODE_PREPARE_FOR_EVSE)) 		// S_PREPARING_FOR_EVSE
-						{
-							strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
-							goto end;
-						}
-
-					}// END FOR ELSE
-				}
-			} // END FOR GB_QUANTITY
-
-		}
-		else
-		{
-			if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D') // 'D' means DC
-			{
-				tempIndex = 2;
-			}
-			else
-			{
-				tempIndex = connectorIdInt -1;
-			}
-
-			for (int index = 0; index < AC_QUANTITY; index++)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex )
-				{
-
-					if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].ReservationId != -1)&&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].ReservationId >= 0)&&(strcmp((const char *)ShmOCPP16Data->ReserveNow[index].IdTag, idTagstr) == 0))
-					{
-						//Reserved
-						DEBUG_INFO("Reserved now !!!The idTag matches the idTag of Reservation!!!\n");
-					}
-					else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].ReservationId != -1)&&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].ReservationId >= 0)&&(strcmp((const char *)ShmOCPP16Data->ReserveNow[index].IdTag, 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 != SYS_MODE_IDLE)				//S_IDLE
-							&& (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_PREPARING) 	//S_PRECHARGE
-							&& (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_PREPARE_FOR_EV) 	//S_PREPARING_FOR_EV
-							&& (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_PREPARE_FOR_EVSE))   // 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]);
-
-
-				//memset idTag
-				memset((char *)ShmOCPP16Data->StartTransaction[connectorIdInt -1].IdTag,0, 20);
-				strcpy((char *)ShmOCPP16Data->StartTransaction[connectorIdInt -1].IdTag, idTagstr);
-
-
-				memset((char *)ShmOCPP16Data->StopTransaction[connectorIdInt -1].IdTag,0, 20);
-				strcpy((char *)ShmOCPP16Data->StopTransaction[connectorIdInt -1].IdTag, idTagstr);
-
-
-			}
-			else
-			{
-				strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
-			}
-
-		}
-		else
-		{
-			ShmOCPP16Data->CsMsg.bits[connectorIdInt -1].RemoteStartTransactionReq = 1;
-			strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Accepted]);
-
-
-			//memset idTag
-			memset((char *)ShmOCPP16Data->StartTransaction[connectorIdInt -1].IdTag,0, 20);
-			strcpy((char *)ShmOCPP16Data->StartTransaction[connectorIdInt -1].IdTag, idTagstr);
-
-			memset((char *)ShmOCPP16Data->StopTransaction[connectorIdInt -1].IdTag,0, 20);
-			strcpy((char *)ShmOCPP16Data->StopTransaction[connectorIdInt -1].IdTag, idTagstr);
-
-		}
-	 }
-	 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);
-
-	//OCPP send RemoteStartConfirmation by first.
-	sendRemoteStartConfirmation(uuid, comfirmstr);
-
-	return result;
-}
-
-int handleRemoteStopTransactionRequest(char *uuid, char *payload)
-{
-	mtrace();
-	int result = FAIL;
-	int match = FALSE;
-	int GunNO = 0;
-	int tempIndex = 0;
-	int transactionIdInt=0;
-	int transactionIdIsNULL= FALSE;
-	char sstr[16]={ 0 },sstrtemp[50]={ 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;
-	}
-
-	strcpy(sstrtemp, stringtrimspace(payload));
-
-	c=0;
-	loc = strstr(sstrtemp, "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;gun_index++)
-	    {
-			if(ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId == transactionIdInt)
-	        {
-				//check Transaction active
-				if(gunType[gun_index] == 'J')
-				{
-					if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-					{
-						tempIndex = ((gun_index==2) ? 1: 0);
-					}
-					else
-					{
-						tempIndex = gun_index;
-					}
-
-					for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-					{
-						if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
-						{
-							if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_TERMINATING)) // SYS_MODE_CHARGING, SYS_MODE_TERMINATING
-							{
-								match = TRUE;
-								GunNO = gun_index;
-							}
-						}
-					}// END FOR CHAdeMO_QUANTITY
-
-				}
-				else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
-				{
-					if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-					{
-						tempIndex = ((gun_index==2) ? 1: 0);
-					}
-					else
-					{
-						tempIndex = gun_index;
-					}
-
-					for (int index = 0; index < CCS_QUANTITY; index++)
-					{
-						if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
-						{
-							if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_TERMINATING) ) // SYS_MODE_CHARGING, SYS_MODE_TERMINATING
-							{
-								match = TRUE;
-								GunNO = gun_index;
-							}
-						}
-					}// END FOR CCS_QUANTITY
-				}
-				else if(gunType[gun_index] == 'G')
-				{
-					if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-					{
-						tempIndex = ((gun_index==2) ? 1: 0);
-					}
-					else
-					{
-						tempIndex = gun_index;
-					}
-
-					for (int index = 0; index < GB_QUANTITY; index++)
-					{
-						if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
-						{
-							if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_TERMINATING)) // SYS_MODE_CHARGING, SYS_MODE_TERMINATING
-							{
-								match = TRUE;
-								GunNO = gun_index;
-							}
-						}
-					}// END FOR GB_QUANTITY
-
-				}
-				else
-				{
-					if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D') // 'D' means DC
-					{
-						tempIndex = 2;
-					}
-					else
-					{
-						tempIndex = gun_index;
-					}
-
-					for (int index = 0; index < AC_QUANTITY; index++)
-					{
-						if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
-						{
-							if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_TERMINATING)) // SYS_MODE_CHARGING, SYS_MODE_TERMINATING
-							{
-								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;
-	int tempIndex = 0;
-	char expiryDatestr[30]={0}, idTagstr[20]={0},parentIdTagstr[20]={0};
-	char comfirmstr[20]={0};
-	char sstr[180]={ 0 },sstrtemp[200]={ 0 };
-	int c = 0;
-	char *loc;
-	//char *ptr;
-
-	DEBUG_INFO("handleReserveNowTransactionRequest ...\n");
-
-	strcpy(sstrtemp, stringtrimspace(payload));
-	//***(1)connectorId ****/
-	c=0;
-	loc = strstr(sstrtemp, "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];
-		//printf("i=%d sstr=%c\n",c, sstr[c]);
-		c++;
-	}
-	sstr[c] = '\0';
-	connectorIdInt = atoi(sstr);
-
-	//***(2)expiryDate ****/
-	loc = strstr(sstrtemp, "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(sstrtemp, "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(sstrtemp, "parentIdTag");
-	memset(sstr ,0, sizeof(sstr) );
-	c = 0;
-
-	if(loc == NULL)
-	{
-		strcpy(parentIdTagstr, "");
-	}
-	else
-	{
-		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(sstrtemp, "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
-	{
-	SYS_MODE_BOOTING		= 0,
-	SYS_MODE_IDLE    	  	= 1,
-	SYS_MODE_AUTHORIZING		= 2,
-	SYS_MODE_MODE_REASSIGN_CHECK	= 3,
-	SYS_MODE_REASSIGN		= 4,
-	SYS_MODE_PREPARING		= 5,
-	SYS_MODE_PREPARE_FOR_EV		= 6,
-	SYS_MODE_PREPARE_FOR_EVSE	= 7,
-	SYS_MODE_CHARGING		= 8,
-	SYS_MODE_TERMINATING		= 9,
-	SYS_MODE_COMPLETE		= 10,
-	SYS_MODE_ALARM			= 11,
-	SYS_MODE_FAULT			= 12,
-	SYS_MODE_RESERVATION		= 13,
-	SYS_MODE_BOOKING		= 14,
-	SYS_MODE_MAINTAIN		= 15,
-	SYS_MODE_DEBUG			= 16,
-	SYS_MODE_CCS_PRECHARGE_STEP0	= 17,
-	SYS_MODE_CCS_PRECHARGE_STEP1	= 18,
-	SYS_MODE_UPDATE			= 19
-	};
-	*/
-	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))
-	{
-		//check Transaction active
-		if(gunType[connectorIdInt -1] == 'J')
-		{
-			if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-			{
-				tempIndex = (((connectorIdInt -1)==2) ? 1: 0);
-			}
-			else
-			{
-				tempIndex = connectorIdInt -1;
-			}
-
-			for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
-				{
-					if(reservationIdInt != ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId)
-					{
-						if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != SYS_MODE_FAULT)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != SYS_MODE_ALARM)) //S_FAULT
-						{
-							if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_IDLE) //S_IDLE
-							{
-								ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
-								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
-							}
-							else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_MAINTAIN)||(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //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 == SYS_MODE_PREPARING) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_RESERVATION) ) //S_PRECHARGE
-							{
-								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
-							}
-							else
-							{
-								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
-							}
-						}
-						else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_TERMINATING)) // SYS_MODE_FAULT, SYS_MODE_ALARM, SYS_MODE_TERMINATING   ---> SuspendedEV
-						{
-							strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
-						}
-					}
-					else
-					{
-						//replace reservation
-						ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
-						strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
-					}
-
-				}
-			} // END FOR CHAdeMO_QUANTITY
-
-		}
-		else if((gunType[connectorIdInt -1] == 'U')||(gunType[connectorIdInt -1] == 'E'))
-		{
-			if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-			{
-				tempIndex = (((connectorIdInt -1)==2) ? 1: 0);
-			}
-			else
-			{
-				tempIndex = connectorIdInt -1;
-			}
-
-			for (int index = 0; index < CCS_QUANTITY; index++)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
-				{
-
-					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 != SYS_MODE_FAULT)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != SYS_MODE_ALARM)) //S_FAULT
-						{
-							if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_IDLE) //S_IDLE
-							{
-								ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
-								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
-							}
-							else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_MAINTAIN) ||(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //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 == SYS_MODE_PREPARING) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_RESERVATION)) //S_PRECHARGE
-							{
-								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
-							}
-							else
-							{
-								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
-							}
-						}
-						else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus ==SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus ==SYS_MODE_ALARM) ||(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_TERMINATING)) //SYS_MODE_FAUL, SYS_MODE_TERMINATING  ---> SuspendedEV
-						{
-							strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
-						}
-					}
-					else
-					{
-						//replace reservation
-						ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
-						strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
-					}
-				}
-			} // END FOR CCS_QUANTITY
-
-		}
-		else if(gunType[connectorIdInt -1] == 'G')
-		{
-			if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-			{
-				tempIndex = (((connectorIdInt -1)==2) ? 1: 0);
-			}
-			else
-			{
-				tempIndex = connectorIdInt -1;
-			}
-
-			for (int index = 0; index < GB_QUANTITY; index++)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
-				{
-
-					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 != SYS_MODE_FAULT)&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != SYS_MODE_ALARM)) //SYS_MODE_FAULT, SYS_MODE_ALARM
-						{
-
-							if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_IDLE) //S_IDLE
-							{
-								ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
-								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
-							}
-							else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_MAINTAIN) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //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 == SYS_MODE_PREPARING) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_RESERVATION) ) //S_PRECHARGE
-							{
-								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
-							}
-							else
-							{
-								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
-							}
-						}
-						else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus ==SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus ==SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus ==SYS_MODE_TERMINATING)) //SYS_MODE_FAULT, SYS_MODE_ALARM ,SYS_MODE_TERMINATING  ---> SuspendedEV
-						{
-							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
-		{
-			if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D') // 'D' means DC
-			{
-				tempIndex = 2;
-			}
-			else
-			{
-				tempIndex = (connectorIdInt -1);
-			}
-
-			for (int index = 0; index < AC_QUANTITY; index++)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
-				{
-
-					if(reservationIdInt != ShmSysConfigAndInfo->SysInfo.AcChargingData[index].ReservationId)
-					{
-
-						if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_FAULT)&&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_ALARM)) //SYS_MODE_FAULT, SYS_MODE_ALARM
-						{
-							if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_IDLE) //S_IDLE
-							{
-								if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState == CP_STATE_B) ||(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState == CP_STATE_C) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState == CP_STATE_D))
-								{
-									strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
-								}
-								else
-								{
-									ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
-									strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
-								}
-							}
-							else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_MAINTAIN) ||(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //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 == SYS_MODE_PREPARING) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_RESERVATION) ) //S_PRECHARGE
-							{
-								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
-							}
-							else
-							{
-								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
-							}
-						}
-						else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_FAULT) ||(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_TERMINATING)) //SYS_MODE_FAULT, SYS_MODE_ALARM, SYS_MODE_TERMINATING ---> SuspendedEV
-						{
-							strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
-						}
-					}
-					else
-					{
-						//replace reservation
-						ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
-						strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
-					}
-				}
-			} // END FOR AC_QUANTITY
-		}
-
-		sprintf((char *)ShmOCPP16Data->ReserveNow[connectorIdInt-1].ResponseStatus, "%s" ,comfirmstr);
-	}
-	else if(connectorIdInt == 0)
-	{
-		//check Transaction active
-		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-		{
-			if(reservationIdInt != ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId)
-			{
-				if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_MAINTAIN) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //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 == SYS_MODE_PREPARING) //S_PRECHARGE
-				{
-					strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
-					goto end;
-				}
-				else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_TERMINATING)) //SYS_MODE_FAULT, SYS_MODE_TERMINATING ---> SuspendedEV
-				{
-					strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
-					goto end;
-				}
-				else if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != SYS_MODE_IDLE) //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 == SYS_MODE_MAINTAIN)||(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //S_TERMINATING  //else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == '6') || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == '9'))
-				  {
-					  strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Unavailable]);
-					  goto end;
-				  }
-				  else if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_PREPARING) //SYS_MODE_PREPARING
-				  {
-					  strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
-					  goto end;
-				  }
-				  else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus ==SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus ==SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus ==SYS_MODE_TERMINATING)) //SYS_MODE_FAULT, SYS_MODE_TERMINATING ---> SuspendedEV
-				  {
-					  strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
-					  goto end;
-				  }
-				  else if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != SYS_MODE_IDLE) //S_IDLE
-				  {
-					  strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
-					  goto end;
-				  }
-			   }
-			} // 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 == SYS_MODE_MAINTAIN)||(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //S_TERMINATING //else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == '6') || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == '9'))
-					{
-						strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Unavailable]);
-						goto end;
-					}
-					else if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_PREPARING) //S_PRECHARGE
-					{
-						strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
-						goto end;
-					}
-					else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus ==SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus ==SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus ==SYS_MODE_TERMINATING) ) //SYS_MODE_FAULT, SYS_MODE_TERMINATING ---> SuspendedEV
-					{
-						strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
-						goto end;
-					}
-					else if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != SYS_MODE_IDLE) //S_IDLE
-					{
-						strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
-						goto end;
-					}
-				}
-
-			} // END FOR GB_QUANTITY
-
-			for (int index = 0; index < AC_QUANTITY; index++)
-			{
-				if(reservationIdInt != ShmSysConfigAndInfo->SysInfo.AcChargingData[index].ReservationId)
-				{
-					if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_MAINTAIN) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //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 == SYS_MODE_PREPARING) //S_PRECHARGE
-					{
-						strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
-						goto end;
-					}
-					else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_TERMINATING)) //SYS_MODE_FAULT, SYS_MODE_TERMINATING ---> SuspendedEV
-					{
-						strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
-						goto end;
-					}
-					if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_IDLE) //S_IDLE
-					{
-						if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState == CP_STATE_B) ||(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState == CP_STATE_C) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState == CP_STATE_D))
-						{
-							strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
-							goto end;
-						}
-					}
-					else if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_IDLE) //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},sstrtemp[30]={ 0 };
-	char typestr[10]={0};
-	char comfirmstr[20]={0};
-	int c = 0;
-	char *loc;
-
-	DEBUG_INFO("handleResetRequest...\n");
-
-	strcpy(sstrtemp, stringtrimspace(payload));
-	loc = strstr(sstrtemp, "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);
-	if((strcmp(typestr, ResetTypeStr[Hard])==0) || (strcmp(typestr, ResetTypeStr[Soft])==0))
-	{
-	  	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 },sstrtemp[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;
-	}
-
-	//check Charge Point state
-	for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-	{
-		if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_FAULT) //S_FAULT   ---> Faulted
-		{
-			checkState_Faulted = TRUE; //OCPP Status: Faulted
-		}
-
-	}
-
-	for (int index = 0; index < CCS_QUANTITY; index++)
-	{
-		if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_FAULT) //S_FAULT   ---> Faulted
-		{
-			checkState_Faulted = TRUE; //OCPP Status
-		}
-
-	}
-
-	for (int index = 0; index < GB_QUANTITY; index++)
-	{
-		if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_FAULT) //S_FAULT   ---> Faulted
-		{
-			checkState_Faulted = TRUE; //OCPP Status: Faulted
-		}
-	}
-
-	//check Charge Point state
-	for (int index = 0; index < AC_QUANTITY; index++)
-	{
-		if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_FAULT) //S_FAULT   ---> Faulted
-		{
-			checkState_Faulted = TRUE; //OCPP Status: Faulted
-		}
-	}
-
-	if(checkState_Faulted == TRUE)
-	{
-		strcpy(comfirmstr, UpdateStatusStr[UpdateStatus_Failed]);
-		goto end;
-	}
-
-	//Filter payload space
-	strcpy(sstrtemp, stringtrimspace(payload));
-
-	//listVersion
-	c = 0;
-	loc = strstr(sstrtemp, listsearch);
-	while ((loc[strlen("listVersion")+2+c] != ',')&&(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(sstrtemp, 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(sstrtemp, 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_getListVerion();
-
-			if(listVersionInt < localversion )//if(listVersionInt <= localversion ) for OCTT Case ---remove temporally
-			{
-				strcpy(comfirmstr, UpdateStatusStr[UpdateStatus_Failed]);
-				goto end;
-			}
-
-			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';
-
-		//DEBUG_INFO("sstr=%s\n", sstr);
-
-		//parsing strings to words
-		i = 0;
-		pch = strtok(sstr,delim1);
-		while (pch != NULL)
-		{
-			strcpy(CardList[i], pch);
-			//DEBUG_INFO("CardList[i]=%s\n", CardList[i]);
-			pch = strtok (NULL, delim1);
-			i = i + 1;
-		}
-
-		//DEBUG_INFO("listVersionInt=%s\n", sstr);
-		//local Authorizations List Numbers
-		//n_localAuthorizations = i;
-		ShmOCPP16Data->SendLocalList.ListVersion = listVersionInt;
-
-		memset(ShmOCPP16Data->SendLocalList.LocalAuthorizationList, 0 , sizeof(struct StructLocalAuthorizationList)* 500);
-
-		c= 0;
-		while(c < i) // i is CardList Number
-		{
-			//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);
-			//DEBUG_INFO("idTagstr=%s\n", idTagstr);
-
-			//Search "expiryDate"
-			memset(sstr ,0, sizeof(sstr) );
-			loc = strstr(CardList[c], "expiryDate");
-			j = 0;
-			if(loc != NULL)
-			{
-				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);
-
-			}
-			else
-			{
-				strcpy(expiryDate, "");
-			}
-
-			//DEBUG_INFO("expiryDate=%s\n", expiryDate);
-
-			//Search "parentIdTag"
-			memset(sstr ,0, sizeof(sstr) );
-			loc = strstr(CardList[c], "parentIdTag");
-			j = 0;
-			if(loc != NULL)
-			{
-				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);
-			}
-			else
-			{
-				strcpy(parentIdTag, "");
-			}
-
-			//DEBUG_INFO("parentIdTag=%s\n", parentIdTag);
-
-
-			//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);
-
-			//DEBUG_INFO("idTagstatus=%s\n", idTagstatus);
-
-			OCPP_getIdTag(idTagstr);
-			//OCPP_getIdTag("test"); For Test
-			//DEBUG_INFO("idTagAuthorization=%s\n",idTagAuthorization);
-			//DEBUG_INFO("updateTypestr=%s\n",updateTypestr);
-
-			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);
-				//DEBUG_INFO("Local list full update. 1\n");
-				//OCPP_get_TableAuthlocalAllData();
-				//DEBUG_INFO("Local list full update. 2\n");
-			}
-			else if(strcmp(updateTypestr, UpdateTypeStr[Differential]) == 0)
-			{
-				OCPP_addLocalList_1(listVersionInt, idTagstr, parentIdTag, expiryDate, idTagstatus); // update or add
-			}
-
-			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
-	{
-		//Check UpdateType
-		if(strcmp(updateTypestr, UpdateTypeStr[Full]) == 0)
-		{
-			//Local list full update
-			DEBUG_INFO("If no (empty) localAuthorizationList is given and the updateType is Full, all identifications are removed from the list. \n");
-			OCPP_cleanLocalList();
-			strcpy(comfirmstr, UpdateStatusStr[UpdateStatus_Accepted]);
-			goto end;
-		}
-
-		if(strcmp(updateTypestr, UpdateTypeStr[Differential]) == 0)
-		{
-			 //Local list different update
-			DEBUG_INFO("Requesting a Differential update without (empty) localAuthorizationList will have no effect on the list\n");
-			strcpy(comfirmstr, UpdateStatusStr[UpdateStatus_Accepted]);
-			goto end;
-
-		}
-	}
-
-	strcpy(comfirmstr, UpdateStatusStr[UpdateStatus_Accepted]);
-
-end:
-
-	sendSendLocalListConfirmation(uuid, comfirmstr);
-	//ShmOCPP16Data->MsMsg.bits.SendLocalListConf = 1;
-
-	return result;
-}
-
-#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},sstrtemp[1600]={ 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/SetChargingProfiletemp.json";
-	//int  resultRename=0;
-	char rmFileCmd[50]={0};
-	char tempchargingProfilePurposeStr[30]={0};
-	char word[1600]={0};
-	int n_chargingProfile = 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;
-
-	//Filter string space
-	strcpy(sstrtemp, stringtrimspace(payload));
-
-	//*********************connectorId***************************/
-	loc = strstr(sstrtemp, "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(sstrtemp, "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(sstrtemp, "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(sstrtemp, "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(sstrtemp, "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(sstrtemp, "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(sstrtemp, "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);
-		}
-
-	}
-	else
-	{
-		if(connectorIdInt == 0) //  an overall limit for the Charge Point.
-		{
-			strcpy((char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.RecurrencyKind, "");
-		}
-		else
-		{
-			strcpy((char *)ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.RecurrencyKind, "");
-		}
-	}
-
-	//DEBUG_INFO("handleSetChargingProfileRequest -8\n");
-	//*********************validFrom***************************/
-	loc = strstr(sstrtemp, "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);
-		}
-	}
-	else
-	{
-		if(connectorIdInt == 0) //  an overall limit for the Charge Point.
-		{
-			strcpy((char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ValidFrom, "");
-		}
-		else
-		{
-			strcpy((char *)ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ValidFrom, "");
-		}
-	}
-
-	//DEBUG_INFO("handleSetChargingProfileRequest -9\n");
-	//*********************validTo***************************/
-	loc = strstr(sstrtemp, "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);
-
-		}
-
-	}
-	else
-	{
-		if(connectorIdInt == 0) //  an overall limit for the Charge Point.
-		{
-			strcpy((char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ValidTo, "");
-		}
-		else
-		{
-			strcpy((char *)ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ValidTo, "");
-
-		}
-	}
-
-	//DEBUG_INFO("handleSetChargingProfileRequest -10\n");
-	//*********************duration***************************/
-	loc = strstr(sstrtemp, "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;
-		}
-
-	}
-	else
-	{
-		if(connectorIdInt == 0) //  an overall limit for the Charge Point.
-		{
-			ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingSchedule.Duration = 0;
-		}
-		else
-		{
-			ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingSchedule.Duration = 0;
-		}
-	}
-
-	//DEBUG_INFO("handleSetChargingProfileRequest -11\n");
-	//*********************startSchedule***************************/
-	loc = strstr(sstrtemp, "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);
-		}
-
-	}
-	else
-	{
-		if(connectorIdInt == 0) //  an overall limit for the Charge Point.
-		{
-			strcpy((char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingSchedule.StartSchedule,"");
-
-		}
-		else
-		{
-			strcpy((char *)ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingSchedule.StartSchedule,"");
-		}
-
-	}
-
-	//DEBUG_INFO("handleSetChargingProfileRequest -12\n");
-	//*********************chargingRateUnit***************************/
-	loc = strstr(sstrtemp, "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 tempChargingProfile[1600]={0};
-	strcpy(tempChargingProfile,(const char*)sstrtemp);
-	char *where = tempChargingProfile;
-	if (what_len)
-	{
-		while ((where = strstr(where, "startPeriod"))) {
-			where += what_len;
-			chargingSchedulePeriodCount++;
-		}
-
-	}
-
-	if( chargingSchedulePeriodCount > atoi((const char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemData))
-	{
-		sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Rejected] );
-		goto end;
-
-	}
-
-	//DEBUG_INFO("chargingSchedulePeriodCount=%d\n",chargingSchedulePeriodCount);
-	//where = payload;
-	int templength = 0;
-	//int searchstart = 0;
-	for(int periodNums=0; periodNums < chargingSchedulePeriodCount; periodNums++)
-	{
-		//****************startPeriod*******************/
-		c=0;
-		loc = strstr(tempChargingProfile + templength, "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];
-		}
-
-		templength = strlen("startPeriod")+2+c;
-
-		//DEBUG_INFO("handleSetChargingProfileRequest -13 -2\n");
-		//****************limit*******************/
-		c=0;
-		loc = strstr(tempChargingProfile + templength, "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];
-		}
-
-		templength = templength + strlen("limit")+2+c;
-
-		//****************numberPhases*******************/
-		loc = strstr(tempChargingProfile + templength, "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];
-
-			}
-
-			templength = templength + strlen("numberPhases")+2+c;
-		}
-
-		//where = loc;
-	}
-	//****************chargingSchedulePeriod count end*******************/
-
-
-	//*********************minChargingRate***************************/
-	loc = strstr(sstrtemp, "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;
-		}
-
-	}
-	else
-	{
-		if(connectorIdInt == 0) //  an overall limit for the Charge Point.
-		{
-			ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingSchedule.MinChargingRate = 0.0;
-		}
-		else
-		{
-			ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingSchedule.MinChargingRate = 0.0;
-		}
-
-	}
-
-
-	if(strcmp(chargingProfilePurposeStr, ChargingProfilePurposeTypeStr[ChargePointMaxProfile]) == 0)
-	{
-		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+");
-		}
-		else
-		{
-			//Check Charging Profile Count
-			while(fscanf(fptr1, "%s", word) != EOF)
-			{
-				//DEBUG_INFO("word=%s\n",word);
-				if(strstr(word, "chargingProfileId")!= NULL)
-				{
-					//DEBUG_INFO("test chargingProfileId \n");
-					n_chargingProfile = n_chargingProfile + 1;
-					//DEBUG_INFO("chargingProfileId Found\n");
-				}
-			}
-		}
-		fclose(fptr1);
-
-	}
-	else if(strcmp(chargingProfilePurposeStr, ChargingProfilePurposeTypeStr[TxDefaultProfile]) == 0)
-	{
-		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;
-		}
-
-		memset(filename, 0, sizeof filename);
-		sprintf(filename, "/Storage/OCPP/TxDefaultProfile_%d.json", connectorIdInt);
-
-		fptr1 = fopen(filename, "r");
-		if (!fptr1)
-		{
-			//file not exist
-			//DEBUG_INFO("Unable to open the input file!!\n");
-			fptr1 = fopen(filename, "w+");
-
-		}
-		else
-		{
-			//Check Charging Profile Count
-			while(fscanf(fptr1, "%s", word) != EOF)
-			{
-				//DEBUG_INFO("word=%s\n",word);
-				if(strstr(word, "chargingProfileId")!= NULL)
-				{
-					//DEBUG_INFO("test chargingProfileId \n");
-					n_chargingProfile = n_chargingProfile + 1;
-					//DEBUG_INFO("chargingProfileId Found\n");
-				}
-			}
-		}
-		fclose(fptr1);
-	}
-	else if(strcmp(chargingProfilePurposeStr, ChargingProfilePurposeTypeStr[TxProfile]) == 0)
-	{
-		//printf("set chargingProfile 1-4\n");
-		DEBUG_INFO("chargingProfilePurposeStr is TxProfile !!! \n");
-
-		//---TxProfile SHALL only be set at Charge Point ConnectorId > 0. ---//
-		if(connectorIdInt == 0)
-		{
-			sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Rejected] );
-			goto end;
-		}
-
-		int tempIndex = 0;
-		//check Transaction active
-		if(gunType[connectorIdInt -1] == 'J')
-		{
-			if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-			{
-				tempIndex = (((connectorIdInt -1)==2) ? 1: 0);
-			}
-			else
-			{
-				tempIndex = connectorIdInt -1;
-			}
-
-			for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
-				{
-					if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_CHARGING) // S_CHARGING
-					{
-						if(transactionIdInt == ShmOCPP16Data->StartTransaction[connectorIdInt -1].ResponseTransactionId)
-						{
-							meet = TRUE;
-							break;
-						}
-
-					}
-
-				}
-			}
-
-
-		}
-		else if((gunType[connectorIdInt -1] == 'U')||(gunType[connectorIdInt -1] == 'E'))
-		{
-			if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-			{
-				tempIndex = (((connectorIdInt -1)==2) ? 1: 0);
-			}
-			else
-			{
-				tempIndex = connectorIdInt -1;
-			}
-
-			for (int index = 0; index < CCS_QUANTITY; index++)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
-				{
-					if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_CHARGING) // S_CHARGING
-					{
-						if(transactionIdInt == ShmOCPP16Data->StartTransaction[connectorIdInt -1].ResponseTransactionId)
-						{
-							meet = TRUE;
-							break;
-						}
-					}
-
-				}
-			}
-
-		}
-		else if(gunType[connectorIdInt -1] == 'G')
-		{
-			if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-			{
-				tempIndex = (((connectorIdInt -1)==2) ? 1: 0);
-			}
-			else
-			{
-				tempIndex = connectorIdInt -1;
-			}
-
-			for (int index = 0; index < GB_QUANTITY; index++)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
-				{
-					if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_CHARGING) // S_CHARGING
-					{
-						if(transactionIdInt == ShmOCPP16Data->StartTransaction[connectorIdInt -1].ResponseTransactionId)
-						{
-							meet = TRUE;
-							break;
-						}
-					}
-
-				}
-			}
-		}
-		else
-		{
-
-			if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D') // 'D' means DC
-			{
-				tempIndex = 2;
-			}
-			else
-			{
-				tempIndex = (connectorIdInt -1);
-			}
-
-			for (int index = 0; index < AC_QUANTITY; index++)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
-				{
-					if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_CHARGING) // S_CHARGING
-					{
-						if(transactionIdInt == ShmOCPP16Data->StartTransaction[connectorIdInt -1].ResponseTransactionId)
-						{
-							meet = TRUE;
-							break;
-						}
-					}
-
-				}
-			}
-
-		}
-
-		//check Transaction active
-
-		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;
-		}
-
-		sprintf(filename, "/Storage/OCPP/TxProfile_%d.json", connectorIdInt);
-
-		fptr1 = fopen(filename, "r");
-		if (!fptr1)
-		{
-			//file not exist
-			DEBUG_INFO("Unable to open the input file!!\n");
-			fptr1 = fopen(filename, "w+");
-
-		}
-		else
-		{
-			//Check Charging Profile Count
-			while(fscanf(fptr1, "%s", word) != EOF)
-			{
-				//DEBUG_INFO("word=%s\n",word);
-				if(strstr(word, "chargingProfileId")!= NULL)
-				{
-					//DEBUG_INFO("test chargingProfileId \n");
-					n_chargingProfile = n_chargingProfile + 1;
-					//DEBUG_INFO("chargingProfileId Found\n");
-				}
-			}
-		}
-		fclose(fptr1);
-	}
-
-	// Check ChargeProfileMaxStackLevel
-	if(n_chargingProfile >= atoi((const char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemData))
-	{
-		sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Rejected] );
-		goto end;
-	}
-
-
-	//------------------------------Satrt: Check Configuration Key "MaxChargingProfilesInstalled" Logic---------------------------------------//
-	{
-		int i = 0;
-	    char fnametemp[200]={0};
-	    n_chargingProfile = 0;
-		//Check ChargePointMaxProfile.json exit
-		if((access("/Storage/OCPP/ChargePointMaxProfile.json",F_OK))!=-1)
-		{
-			fptr1 = fopen("/Storage/OCPP/ChargePointMaxProfile.json", "r");
-			//Check Charging Profile Count
-			while(fscanf(fptr1, "%s", word) != EOF)
-			{
-				//DEBUG_INFO("word=%s\n",word);
-				if(strstr(word, "chargingProfileId")!= NULL)
-				{
-					//DEBUG_INFO("test chargingProfileId \n");
-					n_chargingProfile = n_chargingProfile + 1;
-					i = i + 1;
-					//DEBUG_INFO("chargingProfileId Found\n");
-				}
-				memset(word, 0, sizeof word);
-			}
-			fclose(fptr1);
-			DEBUG_INFO("ChargePointMaxProfile.json has %d charging Profile\n",i );
-		}
-
-		//Check TxDefaultProfile_0.json exit
-		if((access("/Storage/OCPP/TxDefaultProfile_0.json",F_OK))!=-1)
-		{
-			i = 0;
-			fptr1 = fopen("/Storage/OCPP/TxDefaultProfile_0.json", "r");
-			//Check Charging Profile Count
-			while(fscanf(fptr1, "%s", word) != EOF)
-			{
-				//DEBUG_INFO("word=%s\n",word);
-				if(strstr(word, "chargingProfileId")!= NULL)
-				{
-					//DEBUG_INFO("test chargingProfileId \n");
-					n_chargingProfile = n_chargingProfile + 1;
-					i = i + 1;
-					//DEBUG_INFO("chargingProfileId Found\n");
-				}
-				memset(word, 0, sizeof word);
-			}
-			fclose(fptr1);
-			DEBUG_INFO("TxDefaultProfile_0.json has %d charging Profile\n",i );
-
-		}
-
-	    //Check TxDefaultProfile_%d.json
-	    for(int j=1; j <= gunTotalNumber; j++)
-		{
-			memset(fnametemp, 0, sizeof fnametemp);
-			sprintf(fnametemp, "/Storage/OCPP/TxDefaultProfile_%d.json", j);
-			if((access(fnametemp,F_OK))!=-1)
-			{
-				i = 0;
-				fptr1 = fopen(fnametemp, "r");
-				//Check Charging Profile Count
-				while(fscanf(fptr1, "%s", word) != EOF)
-				{
-					//DEBUG_INFO("word=%s\n",word);
-					if(strstr(word, "chargingProfileId")!= NULL)
-					{
-						//DEBUG_INFO("test chargingProfileId \n");
-						n_chargingProfile = n_chargingProfile + 1;
-						i = i + 1;
-						//DEBUG_INFO("chargingProfileId Found\n");
-					}
-					memset(word, 0, sizeof word);
-				}
-				fclose(fptr1);
-				DEBUG_INFO("%s has %d charging Profile\n",fnametemp, i);
-			}
-		}
-
-		//Check TxProfile_%d.json
-		for(int j=1; j <= gunTotalNumber; j++)
-		{
-			memset(fnametemp, 0, sizeof fnametemp);
-			sprintf(fnametemp, "/Storage/OCPP/TxProfile_%d.json", j);
-			if((access(fnametemp,F_OK))!=-1)
-			{
-				i = 0;
-				fptr1 = fopen(fnametemp, "r");
-				//Check Charging Profile Count
-				while(fscanf(fptr1, "%s", word) != EOF)
-				{
-					//DEBUG_INFO("word=%s\n",word);
-					if(strstr(word, "chargingProfileId")!= NULL)
-					{
-						//DEBUG_INFO("test chargingProfileId \n");
-						n_chargingProfile = n_chargingProfile + 1;
-						i = i + 1;
-						//DEBUG_INFO("chargingProfileId Found\n");
-					}
-					memset(word, 0, sizeof word);
-				}
-				fclose(fptr1);
-				DEBUG_INFO("%s has %d charging Profile\n",fnametemp, i);
-			}
-		}
-
-		if( n_chargingProfile > atoi((const char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemData))
-		{
-			sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Rejected] );
-			goto end;
-		}
-
-	}
-	//------------------------------End: Check Configuration Key "MaxChargingProfilesInstalled" Logic---------------------------------------//
-
-	//**********************************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);
-
-	//*璉 瘚  辣蝏      1嚗     0  */
-	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);
-
-		rename(tempfile, filename);
-		sleep(1);
-		//sprintf(rmFileCmd,"rm -f %s",tempfile);
-		//system(rmFileCmd);
-	}
-	else
-	{
-		char buf[1000]={0};
-		int ChargingProfileAdded = FALSE;
-
-		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] != '\"')
-			{
-				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");
-					if(ChargingProfileAdded == FALSE)
-					{
-						fprintf(outfile,"%s\n",payload);
-						ChargingProfileAdded = TRUE;
-					}
-				}
-				else
-				{
-					if(tempstackLevelInt < stackLevelInt)
-					{
-						if(ChargingProfileAdded == FALSE)
-						{
-							fprintf(outfile,"%s\n",payload);
-							ChargingProfileAdded = TRUE;
-							fprintf(outfile,"%s\n",buf);
-						}
-						else
-						{
-							fprintf(outfile,"%s\n",buf);
-						}
-					}
-					else
-					{
-						if(ChargingProfileAdded == FALSE)
-						{
-							fprintf(outfile,"%s\n",buf);
-							fprintf(outfile,"%s\n",payload);
-							ChargingProfileAdded = TRUE;
-						}
-						else
-						{
-							fprintf(outfile,"%s\n",buf);
-						}
-					}
-				}
-			}
-			else
-			{
-				if(tempchargingProfileIdInt < chargingProfileIdInt)
-				{
-					if(ChargingProfileAdded == FALSE)
-					{
-						fprintf(outfile,"%s\n",payload);
-						ChargingProfileAdded = TRUE;
-						fprintf(outfile,"%s\n",buf);
-					}
-					else
-					{
-						fprintf(outfile,"%s\n",buf);
-					}
-			    }
-				else if(tempstackLevelInt < stackLevelInt)
-				{
-					if(ChargingProfileAdded == FALSE)
-					{
-						fprintf(outfile,"%s\n",payload);
-						ChargingProfileAdded = TRUE;
-						fprintf(outfile,"%s\n",buf);
-					}
-					else
-					{
-						fprintf(outfile,"%s\n",buf);
-					}
-				}
-				else
-				{
-					if(ChargingProfileAdded == FALSE)
-					{
-						fprintf(outfile,"%s\n",buf);
-						fprintf(outfile,"%s\n",payload);
-						ChargingProfileAdded = TRUE;
-					}
-					else
-					{
-						fprintf(outfile,"%s\n",buf);
-					}
-
-				}
-
-			}
-
-		} // end of while loop
-
-		fclose(infile);
-		fclose(outfile);
-
-		sprintf(rmFileCmd,"rm -f %s",filename);
-		system(rmFileCmd);
-
-		rename(tempfile, filename);
-		sleep(1);
-
-		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},sstrtemp[100]={ 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}]
-	strcpy(sstrtemp, stringtrimspace(payload));
-
-	c = 0;
-	loc = strstr(sstrtemp, "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(sstrtemp, "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)
-	{
-		if((FirmwareStatusNotificationStatus != FIRMWARE_STATUS_DOWNLOADING) &&
-		   (FirmwareStatusNotificationStatus != FIRMWARE_STATUS_IDLE) &&
-		   (FirmwareStatusNotificationStatus != FIRMWARE_STATUS_INSTALLING) )
-		{
-			FirmwareStatusNotificationStatus = FIRMWARE_STATUS_IDLE;
-		}
-
-		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))
-			{
-				ShmOCPP16Data->CsMsg.bits[connectorIdInt -1].TriggerMessageReq = 1;
-				sendMeterValuesRequest(connectorIdInt -1);
-				//sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
-			}
-
-		}
-		else
-		{
-			for(int idx=0;idx< gunTotalNumber;idx++)
-			{
-				ShmOCPP16Data->CsMsg.bits[idx].TriggerMessageReq = 1;
-				sendMeterValuesRequest(idx);
-			}
-		}
-	}
-	else if(strcmp(requestedMessagestr, MessageTriggerStr[StatusNotification]) == 0 )
-	{
-		if(connectorIdIsNULL == FALSE)
-		{
-			if((connectorIdInt > 0) && ((connectorIdInt -1) < gunTotalNumber))
-			{
-				sendStatusNotificationRequest(connectorIdInt -1);
-				//sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
-			}
-		}
-		else
-		{
-			for(int idx=0;idx< gunTotalNumber;idx++)
-				sendStatusNotificationRequest(idx);
-
-			//sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
-		}
-
-	}
-
-	return result;
-}
-
-int handleUnlockConnectorRequest(char *uuid, char *payload)
-{
-	mtrace();
-	int result = FAIL;
-	char sstr[6]={0},sstrtemp[50]={ 0 };
-	int connectorIdInt =0;
-	char comfirmstr[20]={0};
-	int c = 0;
-	int tempIndex = 0;
-	char *loc;
-
-//[2,"ba1cbd49-2a76-493a-8f76-fa23e7606532","UnlockConnector",{"connectorId":1}]
-	DEBUG_INFO("handleUnlockConnectorRequest ...\n");
-
-	strcpy(sstrtemp, stringtrimspace(payload));
-	c = 0;
-	loc = strstr(sstrtemp, "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(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(gunType[connectorIdInt-1] == 'J')
-		{
-			if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-			{
-				tempIndex = (((connectorIdInt -1)==2) ? 1: 0);
-			}
-			else
-			{
-				tempIndex = connectorIdInt -1;
-			}
-
-			for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-			{
-				if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex ) && ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_IDLE) ))
-				{
-					//stop Transaction
-					ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].UnlockConnectorReq = 1;
-
-				}
-			}
-		}
-		else if((gunType[connectorIdInt-1] == 'U')||(gunType[connectorIdInt-1] == 'E'))
-		{
-			if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-			{
-				tempIndex = (((connectorIdInt -1)==2) ? 1: 0);
-			}
-			else
-			{
-				tempIndex = connectorIdInt -1;
-			}
-
-			for (int index = 0; index < CCS_QUANTITY; index++)
-			{
-				if ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex ) &&  ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_IDLE) ))
-				{
-					//stop Transaction
-					ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].UnlockConnectorReq = 1;
-				}
-			}
-		}
-		else if(gunType[connectorIdInt-1] == 'G')
-		{
-			if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-			{
-				tempIndex = (((connectorIdInt -1)==2) ? 1: 0);
-			}
-			else
-			{
-				tempIndex = connectorIdInt -1;
-			}
-
-			for (int index = 0; index < GB_QUANTITY; index++)
-			{
-				if ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex ) &&((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_CHARGING)||(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_IDLE)))
-				{
-					//stop Transaction
-					ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].UnlockConnectorReq = 1;
-				}
-			}
-
-		}
-		else
-		{
-			if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
-			{
-				tempIndex = 2;
-			}
-			else
-			{
-				tempIndex = connectorIdInt-1;
-			}
-
-			for (int index = 0; index < AC_QUANTITY; index++)
-			{
-				if ((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex ) && ((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_IDLE) ))
-				{
-					ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].UnlockConnectorReq = 1;
-
-				}
-			}
-
-		}
-
-	  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;
-}
-
-static char UpdateFirmwarepayloadData[300]={0};
-int handleUpdateFirmwareRequest(char *uuid, char *payload)
-{
-	mtrace();
-	int result = FAIL;
-	pthread_t t;
-
-	sendUpdateFirmwareConfirmation(uuid);
-	memset(UpdateFirmwarepayloadData, 0, 300);
-	strcpy(UpdateFirmwarepayloadData, stringtrimspace(payload));
-	pthread_create(&t, NULL, UpdateFirmwareProcess, stringtrimspace(payload));
-	////pthread_join(t, NULL); //
-	//pthread_detach(t);
-
-	//sendUpdateFirmwareConfirmation(uuid);
-	ShmOCPP16Data->MsMsg.bits.UpdateFirmwareConf =1;
-	//ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq = 1;
-	return result;
-}
-
-void *UpdateFirmwareProcess(void *data)
-{
-	pthread_detach(pthread_self());
-	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[300]={ 0 };
-	//char *str = (char*) data; // ?  ?頛詨鞈  ?
-	DEBUG_INFO("handleUpdateFirmwareRequest ...\n");
-	//DEBUG_INFO("packet=%s\n", (const char*)payloadData);
-    strcpy(str,(const char*)UpdateFirmwarepayloadData);
-	//***************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] != ',') && (loc[strlen("retryInterval")+2+c] != '}'))
-		{
-			sstr[c] = loc[strlen("retryInterval")+2+c];
-			//DEBUG_INFO("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 IdTagstrtemp[20]={0};
-	char statusstrtemp[20]={0};
-	int expiryDateISNULL=FALSE;
-	int parentIdTagISNULL=FALSE;
-	char sstr[160]={0};
-	char* filename = AuthorizationCache_JSON;
-	char tempfile[] = "/Storage/OCPP/Authorizetemp.json";
-	char *loc;
-	int  resultRename=0;
-	int responseIdTagInfoAsZero= 0;
-	char rmFileCmd[50]={0};
-
-	DEBUG_INFO("handleAuthorizeResponse...\n");
-	json_object *Authorize;
-	Authorize = json_tokener_parse(payload);
-
-	if(!is_error(Authorize))
-	{
-		if(json_object_object_get(Authorize, "idTagInfo") != NULL)
-		{
-			// Required data
-			sprintf((char *)statusstr, "%s", json_object_get_string(json_object_object_get(json_object_object_get(Authorize,"idTagInfo"), "status")));
-
-			// Optional data
-			if(json_object_object_get(json_object_object_get(Authorize,"idTagInfo"), "expiryDate") != NULL)
-				sprintf((char *)expiryDatestr, "%s", json_object_get_string(json_object_object_get(json_object_object_get(Authorize,"idTagInfo"), "expiryDate")));
-
-			if(json_object_object_get(json_object_object_get(Authorize,"idTagInfo"), "parentIdTag") != NULL)
-				sprintf((char *)parentIdTagstr, "%s", json_object_get_string(json_object_object_get(json_object_object_get(Authorize,"idTagInfo"), "parentIdTag")));
-		}
-	}
-	json_object_put(Authorize);
-
-
-	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)
-		{
-			printf("AuthorizationCache exist.\n");
-		}
-		else
-		{
-			printf("AuthorizationCache not exist\n");
-			FILE *log = fopen(filename, "w+");
-
-			if(log == NULL)
-			{
-				printf("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");
-
-
-		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
-			{
-				strcpy(parentIdTagstrtemp, (const char *)ShmOCPP16Data->Authorize.IdTag);
-			}
-
-			strcpy(statusstrtemp, (const char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status);
-
-			fprintf(outfile,"[{\"idTag\":\"%s\",\"idTagInfo\":{\"expiryDate\":\"%s\",\"parentIdTag\":\"%s\",\"status\":\"%s\"}}]\n",ShmOCPP16Data->Authorize.IdTag, expiryDatestrtemp, parentIdTagstrtemp, statusstrtemp);
-			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");
-			}
-
-		}
-		else
-		{
-			char buf[160]={0};
-
-			while (fgets(buf, sizeof(buf), infile) != NULL)
-			{
-			   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(IdTagstrtemp, 0, sizeof(IdTagstrtemp));
-			   memset(expiryDatestrtemp, 0, sizeof(expiryDatestrtemp));
-			   memset(parentIdTagstrtemp, 0, sizeof(parentIdTagstrtemp));
-			   memset(statusstrtemp, 0, sizeof(statusstrtemp));
-
-			   //------------------IdTag-----------------------
-			   loc = strstr(buf, "idTag");
-			   memset(sstr ,0, sizeof(sstr) );
-			   c = 0;
-			   while (loc[3+strlen("idTag")+c] != '\"')
-			   {
-			 		sstr[c] = loc[3+strlen("idTag")+c];
-			 		c++;
-			   }
-			   sstr[c] = '\0';
-			   strcpy(IdTagstrtemp,sstr);
-
-			   //*********************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) || (strcmp((const char *)ShmOCPP16Data->Authorize.IdTag, IdTagstrtemp) == 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)|| (strcmp(IdTagstrtemp,(const char *)ShmOCPP16Data->Authorize.IdTag) == 0)))
-			   {
-					//modify item
-
-					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
-					{
-						strcpy(parentIdTagstrtemp, parentIdTagstr);
-					}
-					strcpy(statusstrtemp,(const char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status);
-
-			   }
-			   else
-			   {
-				   //wrie original item
-				   strcpy(expiryDatestrtemp, expiryDatestr);
-				   strcpy(parentIdTagstrtemp, parentIdTagstr);
-				   strcpy(statusstrtemp, statusstr);
-			   }
-
-			   fprintf(outfile,"[{\"idTag\":\"%s\",\"idTagInfo\":{\"expiryDate\":\"%s\",\"parentIdTag\":\"%s\",\"status\":\"%s\"}}]\n",ShmOCPP16Data->Authorize.IdTag, 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;
-}
-
-char * strtrimc( char * s )
-{
-    char * p1 = s;
-	char * p2 = s;
-	while(*p1 != '\0')
-	{
-		while(*p1 == ' ' || *p1 == '\t' || *p1 == '\"' || *p1 == '\n' || *p1 == '}' || *p1 == '\r')
-		{
-			if(*p1 != ',')
-			{
-				p1 ++;
-			}
-			else
-			{
-				break;
-			}
-		}
-
-		if(*p1 != ',')
-		{
-			* p2 ++ = *p1 ++;
-			//printf("p2=%s\n",p2);
-		}
-		else
-		{
-			break;
-		}
-	}
-	*p2 = '\0';
-	return (s);
-}
-
-void handleBootNotificationResponse(char *payload, int gun_index)
-{
-	mtrace();
-	char statusStr[12]={0};
-	char currentTimeStr[30]={0};
-	int intervalInt = 0;
-	struct tm tp;
-	char buf[28]={0};
-	char timebuf[50]={0};
-
-	DEBUG_INFO("handleBootNotificationResponse...\n");
-
-	json_object *BootNotification;
-	BootNotification = json_tokener_parse(payload);
-	if(!is_error(BootNotification))
-	{
-		// Required data
-		sprintf((char *)currentTimeStr, "%s", json_object_get_string(json_object_object_get(BootNotification,"currentTime")));
-		intervalInt = json_object_get_int(json_object_object_get(BootNotification,"interval"));
-		sprintf((char *)statusStr, "%s", json_object_get_string(json_object_object_get(BootNotification,"status")));
-	}
-	json_object_put(BootNotification);
-
-
-	ShmOCPP16Data->BootNotification.ResponseHeartbeatInterval = intervalInt;
-	BootNotificationInterval = intervalInt;
-	HeartBeatWaitTime = intervalInt;
-
-	//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 ))
-	{
-		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);
-	system(timebuf);
-
-	clientTime.Heartbeat = time((time_t*)NULL) - (ShmOCPP16Data->BootNotification.ResponseHeartbeatInterval-5);
-	//==============================================
-	// RTC sync
-	//==============================================
-	system("/sbin/hwclock -w --systohc");
-
-	ShmOCPP16Data->OcppConnStatus = 1; ////0: disconnected, 1: connected
-	ShmOCPP16Data->SpMsg.bits.BootNotificationConf = 1;
-
-	sendFirmwareVersionByDataTransfer();
-}
-
-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);
-
-}
-
-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();
-	struct tm tp;
-	char buf[28]={0};
-	char timebuf[50]={0};
-
-	DEBUG_INFO("handleHeartbeatResponse...\n");
-	json_object *Heartbeat;
-	Heartbeat = json_tokener_parse(payload);
-	if(!is_error(Heartbeat))
-	{
-		// Required data
-		sprintf((char *)ShmOCPP16Data->Heartbeat.ResponseCurrentTime, "%s", json_object_get_string(json_object_object_get(Heartbeat,"currentTime")));
-
-	}
-	json_object_put(BootNotification);
-
-	if(FirstHeartBeat == 0)
-	{
-		FirstHeartBeat = 1;
-		DEBUG_INFO("FirstHeartBeat \n");
-	}
-	HeartBeatWithNOResponse = 0;
-
-
-	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");
-
-	//===============================================
-	//Print Out HeartBeat log
-	//===============================================
-	{
-		double diff_t;
-		struct tm tp,tp1;
-
-		// BootNotification Receive Time
-
-		strptime((const char *)ShmOCPP16Data->BootNotification.ResponseCurrentTime, "%Y-%m-%dT%H:%M:%S", &tp);
-		tp.tm_isdst = -1;
-		time_t BootNotificationReceiveTime = mktime(&tp);
-
-		//HeartBeat Receive Time
-		strptime((const char *)ShmOCPP16Data->Heartbeat.ResponseCurrentTime, "%Y-%m-%dT%H:%M:%S", &tp1);
-		tp1.tm_isdst = -1;
-		time_t HeartBeatReceiveTime = mktime(&tp1);
-
-		diff_t = difftime(HeartBeatReceiveTime, BootNotificationReceiveTime);
-
-		printf("handleHeartbeatResponse differnt time=%f..\n",diff_t);
-
-		if(((int)diff_t / 3600) > HeartBeatCountPerHour)
-		{
-			HeartBeatCountPerHour =  (int)diff_t / 3600;
-			DEBUG_INFO("handleHeartbeatResponse ...\n");
-			DEBUG_INFO("After 1 hour, It will print out Heartbeat.\n");
-		}
-	}
-}
-
-void handleMeterValuesResponse(char *payload, int gun_index)
-{
-	mtrace();
-	DEBUG_INFO("handleMeterValuesResponse...\n");
-}
-
-void handleStartTransactionResponse(char *payload, int gun_index)
-{
-	mtrace();
-	//int transactionIdInt = 0;
-	FILE *outfile;
-	char data[100]={0};
-
-	DEBUG_INFO("handleStartTransactionResponse...\n");
-
-	json_object *StartTransaction;
-	StartTransaction = json_tokener_parse(payload);
-
-	if(!is_error(StartTransaction))
-	{
-
-		// Required data
-		sprintf((char *)ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.Status, "%s", json_object_get_string(json_object_object_get(json_object_object_get(StartTransaction,"idTagInfo"), "status")));
-		ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId  = json_object_get_int(json_object_object_get(StartTransaction,"transactionId"));
-
-		// Optional data
-		if(json_object_object_get(json_object_object_get(StartTransaction,"idTagInfo"), "expiryDate") != NULL)
-			sprintf((char *)ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.ExpiryDate, "%s", json_object_get_string(json_object_object_get(json_object_object_get(StartTransaction,"idTagInfo"), "expiryDate")));
-
-		if(json_object_object_get(json_object_object_get(StartTransaction,"idTagInfo"), "parentIdTag") != NULL)
-			sprintf((char *)ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.ParentIdTag, "%s", json_object_get_string(json_object_object_get(json_object_object_get(StartTransaction,"idTagInfo"), "parentIdTag")));
-	}
-	json_object_put(StartTransaction);
-
-	ShmOCPP16Data->CpMsg.bits[gun_index].StartTransactionConf = 1;
-	ShmOCPP16Data->CpMsg.bits[gun_index].StartTransactionReq = 0;
-
-	//-----------Start : write to the Queue TransactionId file -----------------//
-	if((access("/Storage/OCPP/QueueTransactionId",F_OK))!=-1)
-	{}
-	else
-	{
-		FILE *log = fopen("/Storage/OCPP/QueueTransactionId", "w+");
-
-		if(log == NULL)
-		{
-			DEBUG_INFO("Can't Create File QueueTransactionId \n");
-			return ;
-		}
-		else
-		{
-			fclose(log);
-		}
-	}
-
-	// open file for writing
-	//-------------Start:  write to the Queue TransactionId file------------------------------------------//
-	if((ShmOCPP16Data->StartTransaction[gun_index].ConnectorId !=0)&&(strcmp((const char *)ShmOCPP16Data->StartTransaction[gun_index].IdTag,"")!=0)&&(ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId !=0))
-	{
-		outfile = fopen ("/Storage/OCPP/QueueTransactionId", "a");
-		sprintf(data,"%d,%s,%d\n", ShmOCPP16Data->StartTransaction[gun_index].ConnectorId , ShmOCPP16Data->StartTransaction[gun_index].IdTag, ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId);  // GunIndex, idtag, TransactionId
-		fputs(data, outfile);
-		fclose (outfile);
-	}
-
-	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);
-}
-
-void handleStatusNotificationResponse(char *payload, int gun_index)
-{
-	mtrace();
-	DEBUG_INFO("handleStatusNotificationResponse...\n");
-
-	cpinitateMsg.bits[gun_index].StatusNotificationReq = 0;
-	cpinitateMsg.bits[gun_index].StatusNotificationConf = 1;
-
-}
-
-void handleStopTransactionnResponse(char *payload, int gun_index)
-{
-	mtrace();
-	DEBUG_INFO("handleStopTransactionnResponse...\n");
-	json_object *StopTransaction;
-	StopTransaction = json_tokener_parse(payload);
-
-	if(!is_error(StopTransaction))
-	{
-		// Optional data
-		if(json_object_object_get(StopTransaction, "idTagInfo") != NULL)
-		{
-			sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].ResponseIdTagInfo.Status, "%s", json_object_get_string(json_object_object_get(json_object_object_get(StopTransaction,"idTagInfo"), "status")));
-
-			if(json_object_object_get(json_object_object_get(StopTransaction,"idTagInfo"), "expiryDate") != NULL)
-				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].ResponseIdTagInfo.ExpiryDate, "%s", json_object_get_string(json_object_object_get(json_object_object_get(StopTransaction,"idTagInfo"), "expiryDate")));
-
-			if(json_object_object_get(json_object_object_get(StopTransaction,"idTagInfo"), "parentIdTag") != NULL)
-				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].ResponseIdTagInfo.ParentIdTag, "%s", json_object_get_string(json_object_object_get(json_object_object_get(StopTransaction,"idTagInfo"), "parentIdTag")));
-		}
-	}
-	json_object_put(StopTransaction);
-
-
-	ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionConf = 1;
-	ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq = 0;
-
-	DEBUG_INFO("idTagInfo-expiryDate: %s\n", ShmOCPP16Data->StopTransaction[gun_index].ResponseIdTagInfo.ExpiryDate);
-	DEBUG_INFO("idTagInfo-parentIdTag: %s\n", ShmOCPP16Data->StopTransaction[gun_index].ResponseIdTagInfo.ParentIdTag);
-	DEBUG_INFO("idTagInfo-status: %s\n", ShmOCPP16Data->StopTransaction[gun_index].ResponseIdTagInfo.Status);
-}
-
-//==========================================
-// 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)
-{
-	//clock_t start_t, end_t, total_t;
-	FILE *fp;
-	FILE *outfile;
-	char str[200]={0};
-	char sstr[100]={0};
-	int c = 0;
-	char *loc;
-	DEBUG_INFO("initialConfigurationTable...\n");
-	//start_t = clock();
-	//printf("Starting of the program, start_t = %ld\n", start_t);
-	memset(&(ShmOCPP16Data->ConfigurationTable), 0, sizeof(struct OCPP16ConfigurationTable) );
-
-
-	if((access("/Storage/OCPP/OCPPConfiguration",F_OK))==-1)
-	{
-		outfile = fopen("/Storage/OCPP/OCPPConfiguration" , "w+");
-		if(outfile == NULL)
-		{
-			DEBUG_INFO("Error opening file\n");
-			return FALSE;
-		}
-
-		/*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, "FALSE" );
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","AllowOfflineTxForUnknownId", "false", "FALSE");
-
-		//AuthorizationCacheEnabled
-		ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemAccessibility = 1;
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemName, "AuthorizationCacheEnabled");
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemData, "FALSE" );
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","AuthorizationCacheEnabled", "false", "FALSE");
-
-		//AuthorizeRemoteTxRequests
-		ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemAccessibility = 0;
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemName, "AuthorizeRemoteTxRequests");
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemData, "FALSE" );
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","AuthorizeRemoteTxRequests", "true", "FALSE");
-
-		//BlinkRepeat
-		ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemAccessibility = 1;
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemName, "BlinkRepeat");
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemData, "0" );
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","BlinkRepeat", "false", "0");
-
-		//ClockAlignedDataInterval
-		ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemAccessibility = 1;
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemName, "ClockAlignedDataInterval");
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemData, "0" );
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ClockAlignedDataInterval", "false", "0");
-
-		//ConnectionTimeOut
-		ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemAccessibility = 1;
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemName, "ConnectionTimeOut");
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemData, "180" );
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ConnectionTimeOut", "false", "180");
-
-		//GetConfigurationMaxKeys
-		ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemAccessibility =0;
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemName, "GetConfigurationMaxKeys");
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemData, "43" );
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","GetConfigurationMaxKeys", "true", "43");
-
-		// HeartbeatInterval
-		ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemAccessibility = 1;
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemName, "HeartbeatInterval");
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemData, "10" );
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","HeartbeatInterval", "false", "10");
-
-		// LightIntensity
-		ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemAccessibility = 1;
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemName, "LightIntensity");
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemData, "0" );
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LightIntensity", "false", "0");
-
-
-		// LocalAuthorizeOffline
-		ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemAccessibility = 0;
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemName, "LocalAuthorizeOffline");
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData, "TRUE" );
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LocalAuthorizeOffline", "true", "TRUE");
-
-		// LocalPreAuthorize
-		ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemAccessibility = 0;
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemName, "LocalPreAuthorize");
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemData, "FALSE" );
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LocalPreAuthorize", "true", "FALSE");
-
-		// MaxEnergyOnInvalidId
-		ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemAccessibility = 1;
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemName, "MaxEnergyOnInvalidId");
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemData, "0" );
-		ShmSysConfigAndInfo->SysConfig.OfflineMaxChargeEnergy = 0;
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MaxEnergyOnInvalidId", "false", "0");
-
-		// MeterValuesAlignedData
-		ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemAccessibility = 0;
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemName, "MeterValuesAlignedData");
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemData, "" );
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValuesAlignedData", "true", "");
-
-		// MeterValuesAlignedDataMaxLength
-		ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemAccessibility = 0;
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemName, "MeterValuesAlignedDataMaxLength");
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemData, "5" );
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValuesAlignedDataMaxLength", "true", "5");
-
-
-		// MeterValuesSampledData
-		ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemAccessibility = 0;
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemName, "MeterValuesSampledData");
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemData, "Current.Import,Energy.Active.Import.Register,Energy.Active.Import.Interval,Power.Active.Import,Voltage,SOC" );
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValuesSampledData", "true", "Current.Import,Energy.Active.Import.Register,Energy.Active.Import.Interval,Power.Active.Import,Voltage,SOC");
-
-
-		// MeterValuesSampledDataMaxLength
-		ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemAccessibility = 0;
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemName, "MeterValuesSampledDataMaxLength");
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemData, "6" );
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValuesSampledDataMaxLength", "true", "6");
-
-		// MeterValueSampleInterval
-		ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemAccessibility = 1;
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemName, "MeterValueSampleInterval");
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemData, "10" );
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValueSampleInterval", "false", "10");
-
-		// MinimumStatusDuration
-		ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemAccessibility = 1;
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemName, "MinimumStatusDuration");
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemData, "120" );
-		server_cycle_Status = 120; //StatusNotification cycle
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MinimumStatusDuration", "false", "120");
-
-		// NumberOfConnectors
-		ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemAccessibility = 0;
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemName, "NumberOfConnectors");
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
-		{
-			sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemData, "%d", (CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY));
-		}
-		else
-		{
-			sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemData, "%d", AC_QUANTITY);
-		}
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","NumberOfConnectors", "true", ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemData);
-
-		// ResetRetries
-		ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemAccessibility = 1;
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemName, "ResetRetries");
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemData, "3" );
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ResetRetries", "false", "3");
-
-		// ConnectorPhaseRotation
-		ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemAccessibility = 1;
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemName, "ConnectorPhaseRotation");
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "NotApplicable" );
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ConnectorPhaseRotation", "false", "NotApplicable");
-
-		// ConnectorPhaseRotationMaxLength
-		ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemAccessibility = 0;
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemName, "ConnectorPhaseRotationMaxLength");
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemData, "1" );
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ConnectorPhaseRotationMaxLength", "true", "1");
-
-		// StopTransactionOnEVSideDisconnect
-		ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemAccessibility = 0;
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemName, "StopTransactionOnEVSideDisconnect");
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemData, "TRUE" );
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTransactionOnEVSideDisconnect", "true", "TRUE");
-
-		// StopTransactionOnInvalidId
-		ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemAccessibility = 0; //1;
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemName, "StopTransactionOnInvalidId");
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemData, "FALSE" );
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTransactionOnInvalidId", "true", "FALSE");
-
-		// StopTxnAlignedData
-		ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemAccessibility = 0;
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemName, "StopTxnAlignedData");
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemData, "Energy.Active.Import.Register" );
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTxnAlignedData", "true", "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" );
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTxnAlignedDataMaxLength", "true", "0");
-
-		// StopTxnSampledData
-		ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemAccessibility = 0;
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemName, "StopTxnSampledData");
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemData, "Current.Import,Energy.Active.Import.Interval,Power.Active.Import,Voltage,SOC" );
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTxnSampledData", "true", "Current.Import,Energy.Active.Import.Interval,Power.Active.Import,Voltage,SOC");
-
-		// StopTxnSampledDataMaxLength
-		ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemAccessibility = 0;
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemName, "StopTxnSampledDataMaxLength");
-
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
-		{
-			sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData, "%d", 6);
-		}
-		else
-		{
-			sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData, "%d", 5);
-		}
-
-		//strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData, "0" );
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTxnSampledDataMaxLength", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData);
-
-		// 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" );
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","SupportedFeatureProfiles", "true", "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" );
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","SupportedFeatureProfilesMaxLength", "true", "6");
-
-		// TransactionMessageAttempts
-		ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemAccessibility = 1;
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemName, "TransactionMessageAttempts");
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemData, "3" );
-		TransactionMessageAttemptsValue = atoi((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemData);
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","TransactionMessageAttempts", "false", "3");
-
-		// TransactionMessageRetryInterval
-		ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemAccessibility = 1;
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemName, "TransactionMessageRetryInterval");
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemData, "60" );
-		TransactionMessageRetryIntervalValue = atoi((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemData);
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","TransactionMessageRetryInterval", "false", "60");
-
-		// UnlockConnectorOnEVSideDisconnect
-		ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemAccessibility = 0;
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemName, "UnlockConnectorOnEVSideDisconnect");
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemData, "TRUE" );
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","UnlockConnectorOnEVSideDisconnect", "true", "TRUE");
-
-
-		// WebSocketPingInterval
-		ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemAccessibility = 1;
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemName, "WebSocketPingInterval");
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemData, "30" );
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","WebSocketPingInterval", "false", "30");
-
-			//* Local Auth List Management Profile*/
-		#if 0
-			//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 1
-			//LocalAuthListEnabled
-			ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemAccessibility = 1;
-			strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemName, "LocalAuthListEnabled");
-			strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "TRUE" );
-			fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LocalAuthListEnabled", "false", "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" );
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LocalAuthListMaxLength", "true", "500");
-
-		//SendLocalListMaxLength
-		ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemAccessibility = 0;
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemName, "SendLocalListMaxLength");
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemData, "500" );
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","SendLocalListMaxLength", "true", "500");
-
-
-		//ReserveConnectorZeroSupported
-		ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemAccessibility = 0;
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemName, "ReserveConnectorZeroSupported");
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemData, "FALSE" );
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ReserveConnectorZeroSupported", "true", "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" );
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ChargeProfileMaxStackLevel", "true", "3");
-
-		// ChargingScheduleAllowedChargingRateUnit
-		ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemAccessibility = 0;
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemName, "ChargingScheduleAllowedChargingRateUnit");
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemData, "Current" );
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ChargingScheduleAllowedChargingRateUnit", "true", "Current");
-
-
-		// ChargingScheduleMaxPeriods
-		ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemAccessibility = 0;
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemName, "ChargingScheduleMaxPeriods");
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemData, "10" );
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ChargingScheduleMaxPeriods", "true", "10");
-
-		// ConnectorSwitch3to1PhaseSupported
-		ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemAccessibility = 0;
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemName, "ConnectorSwitch3to1PhaseSupported");
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemData, "TRUE" );
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ConnectorSwitch3to1PhaseSupported", "true", "TRUE");
-
-		// MaxChargingProfilesInstalled
-		ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemAccessibility = 0;
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemName, "MaxChargingProfilesInstalled");
-		strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemData, "3" );
-
-		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MaxChargingProfilesInstalled", "true", "3");
-
-		fclose(outfile);
-	}
-	else
-	{
-		//DEBUG_INFO("../Storage/OCPP/OCPPConfiguration    EXit\n");
-		char keystr[60]={0};
-		char readonlystr[10]={0};
-		char valuestr[100]={0};
-		fp = fopen("/Storage/OCPP/OCPPConfiguration" , "r");
-		if(fp == NULL) {
-			DEBUG_INFO("Error opening file");
-			return FALSE;
-		}
-
-		while( fgets (str, sizeof(str), fp)!=NULL )
-		{
-			//DEBUG_INFO("Get Configuration \n");
-
-			str[strlen(str) - 1] = '\0'; // eat the newline fgets() stores
-			//*************************key*********************************/
-			loc = strstr(str, "key");
-			c = 0;
-			memset(sstr ,0, sizeof(sstr) );
-			while (loc[strlen("key")+3+c] != '\"')
-			{
-				sstr[c] = loc[strlen("key")+3+c];
-				c++;
-			}
-			sstr[c] = '\0';
-			strcpy(keystr,sstr);
-
-
-			//*************************readonly*********************************/
-			loc = strstr(str, "readonly");
-			c = 0;
-			memset(sstr ,0, sizeof(sstr) );
-			while (loc[strlen("readonly")+2+c] != ',')
-			{
-				sstr[c] = loc[strlen("readonly")+2+c];
-				c++;
-			}
-			sstr[c] = '\0';
-			strcpy(readonlystr,sstr);
-
-			//*************************value*********************************/
-			loc = strstr(str, "value");
-			c = 0;
-			memset(sstr ,0, sizeof(sstr) );
-			while (loc[strlen("value")+3+c] != '\"')
-			{
-				sstr[c] = loc[strlen("value")+3+c];
-				c++;
-			}
-			sstr[c] = '\0';
-			strcpy(valuestr,sstr);
-
-//			DEBUG_INFO("keystr=%s\n",keystr);
-//			DEBUG_INFO("readonlystr=%s\n",readonlystr);
-//			DEBUG_INFO("valuestr=%s\n",valuestr);
-
-			if(strcmp(keystr, "AllowOfflineTxForUnknownId") == 0)
-			{
-				//Charger.AllowOfflineTxForUnknownId = (value.toLowerCase().equals("true")?true:false);
-				ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemData, "%s", valuestr );
-//			    DEBUG_INFO("AllowOfflineTxForUnknownId setting\n");
-//			    DEBUG_INFO("AllowOfflineTxForUnknownId setting\n");
-			}
-
-			if(strcmp(keystr, "AuthorizationCacheEnabled") == 0)
-			{
-				//Charger.AuthorizationCacheEnabled = (value.toLowerCase().equals("true")?true:false);
-				ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemData, "%s", valuestr );
-
-			}
-
-			if(strcmp(keystr, "AuthorizeRemoteTxRequests") == 0)
-			{
-				ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemData, "%s", valuestr );
-
-			}
-
-			if(strcmp(keystr, "BlinkRepeat") == 0)
-			{
-				//Charger.BlinkRepeat = Integer.parseInt(value);
-				ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemData, "%d", atoi(valuestr) );
-
-			}
-
-			if(strcmp(keystr, "ClockAlignedDataInterval") == 0)
-			{
-				ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemData, "%d", atoi(valuestr) );
-
-			}
-
-			if(strcmp(keystr, "ConnectionTimeOut") == 0 )
-			{
-				ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemData, "%d", atoi(valuestr));
-			}
-
-			if(strcmp(keystr, "GetConfigurationMaxKeys") == 0)
-			{
-				ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemData, "%d", atoi(valuestr));
-
-			}
-
-			if(strcmp(keystr, "HeartbeatInterval") == 0)
-			{
-				ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemAccessibility  = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemData, "%d", atoi(valuestr));
-				HeartBeatWaitTime = atoi(valuestr);
-
-			}
-
-			if(strcmp(keystr, "LightIntensity") == 0)
-			{
-				ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemData, "%d", atoi(valuestr));
-			}
-
-			if(strcmp(keystr, "LocalAuthorizeOffline") == 0)
-			{
-				ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData, "%s", valuestr );
-			}
-
-			if(strcmp(keystr, "LocalPreAuthorize") == 0)
-			{
-				ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemData, "%s", valuestr );
-			}
-
-			if(strcmp(keystr, "MaxEnergyOnInvalidId") == 0)
-			{
-				ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemData, "%d", atoi(valuestr) );
-				ShmSysConfigAndInfo->SysConfig.OfflineMaxChargeEnergy = atoi(valuestr)/1000;
-			}
-
-			if(strcmp(keystr, "MeterValuesAlignedData") == 0)
-			{
-				ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemData, "%s", valuestr );
-
-			}
-
-			if(strcmp(keystr, "MeterValuesAlignedDataMaxLength") == 0)
-			{
-				ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemData, "%d", atoi(valuestr));
-
-			}
-
-			if(strcmp(keystr, "MeterValuesSampledData") == 0 )
-			{
-				ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemData, "%s", valuestr );
-
-			}
-
-			if(strcmp(keystr, "MeterValuesSampledDataMaxLength") == 0)
-			{
-				ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemAccessibility  = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemData, "%d", atoi(valuestr));
-
-			}
-
-
-			if(strcmp(keystr, "MeterValueSampleInterval") == 0)
-			{
-				ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemAccessibility  = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemData, "%d", atoi(valuestr));
-
-			}
-
-			if(strcmp(keystr, "MinimumStatusDuration") == 0)
-			{
-				ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemData, "%d", atoi(valuestr) );
-				server_cycle_Status = atoi(valuestr); //StatusNotification cycle
-			}
-
-			if(strcmp(keystr, "NumberOfConnectors") == 0)
-			{
-				ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemData, "%d", atoi(valuestr) );
-
-			}
-
-			if(strcmp(keystr, "ResetRetries") == 0)
-			{
-				ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemData, "%d", atoi(valuestr) );
-
-			}
-
-			if(strcmp(keystr, "ConnectorPhaseRotation") == 0)
-			{
-				ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", valuestr );
-
-			}
-
-			if(strcmp(keystr, "ConnectorPhaseRotationMaxLength") == 0)
-			{
-				 ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				 sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemData, "%d", atoi(valuestr) );
-
-			}
-
-			if(strcmp(keystr, "StopTransactionOnEVSideDisconnect") == 0)
-			{
-				ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemData, "%s", valuestr );
-
-			}
-
-			if(strcmp(keystr, "StopTransactionOnInvalidId") == 0)
-			{
-				ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemData, "%s", valuestr );
-
-			}
-
-
-			if(strcmp(keystr, "StopTxnAlignedData") == 0)
-			{
-				ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemData, "%s", valuestr );
-			}
-
-			if(strcmp(keystr, "StopTxnAlignedDataMaxLength") == 0)
-			{
-				ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemAccessibility  = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemData, "%d", atoi(valuestr) );
-			}
-
-			if(strcmp(keystr, "StopTxnSampledData") == 0)
-			{
-				ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemAccessibility  = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemData, "%s", valuestr );
-
-			}
-
-			if(strcmp(keystr, "StopTxnSampledDataMaxLength") == 0)
-			{
-				ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemAccessibility  = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData, "%d", atoi(valuestr) );
-
-			}
-
-			if(strcmp(keystr, "SupportedFeatureProfiles") == 0)
-			{
-				 ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemAccessibility  = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				 sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemData, "%s", valuestr );
-
-			}
-
-			if(strcmp(keystr, "SupportedFeatureProfilesMaxLength") == 0)
-			{
-				ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemAccessibility  = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemData, "%d", atoi(valuestr) );
-
-			}
-
-			if(strcmp(keystr, "TransactionMessageAttempts") == 0)
-			{
-				ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemData, "%d", atoi(valuestr) );
-				TransactionMessageAttemptsValue = atoi(valuestr);
-
-			}
-
-			if(strcmp(keystr, "TransactionMessageRetryInterval") == 0)
-			{
-				ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemAccessibility= (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemData, "%d", atoi(valuestr) );
-				TransactionMessageRetryIntervalValue = atoi(valuestr);
-
-			}
-
-			if(strcmp(keystr, "UnlockConnectorOnEVSideDisconnect") == 0)
-			{
-				ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemData, "%s", valuestr );
-
-			}
-
-			if(strcmp(keystr, "WebSocketPingInterval") == 0)
-			{
-				 ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				 sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemData, "%d", atoi(valuestr) );
-
-			}
-
-
-			if(strcmp(keystr, "LocalAuthListEnabled") == 0)
-			{
-				ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				sprintf((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "%s", valuestr );
-
-			}
-
-			if(strcmp(keystr, "LocalAuthListMaxLength") == 0)
-			{
-				 ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemAccessibility  = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				  sprintf((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemData, "%d", atoi(valuestr) );
-
-			}
-
-			if(strcmp(keystr, "SendLocalListMaxLength") == 0)
-			{
-				ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				sprintf((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemData, "%d", atoi(valuestr) );
-
-			}
-
-			if(strcmp(keystr, "ReserveConnectorZeroSupported") == 0)
-			{
-				ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemAccessibility  = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				sprintf((char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemData, "%s", valuestr );
-
-			}
-
-			if(strcmp(keystr, "ChargeProfileMaxStackLevel") == 0)
-			{
-				 ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemAccessibility  = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				 sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemData, "%d", atoi(valuestr) );
-
-			}
-
-			if(strcmp(keystr, "ChargingScheduleAllowedChargingRateUnit") == 0)
-			{
-				ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemData, "%s", valuestr );
-
-			}
-
-			if(strcmp(keystr, "ChargingScheduleMaxPeriods") == 0)
-			{
-				ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemData, "%d", atoi(valuestr) );
-
-			}
-
-			if(strcmp(keystr, "ConnectorSwitch3to1PhaseSupported") == 0)
-			{
-				 ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				 sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemData, "%s", valuestr);
-
-			}
-
-			if(strcmp(keystr, "MaxChargingProfilesInstalled") == 0)
-			{
-				 ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
-				 sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemData, "%d", atoi(valuestr) );
-
-			}
-		}
-
-		fclose(fp);
-	}
-
-	return 0;
-}
-
-
-void StoreConfigurationTable(void)
-{
-	FILE *outfile;
-	outfile = fopen("/Storage/OCPP/OCPPConfiguration" , "w+");
-	if(outfile == NULL)
-	{
-		DEBUG_INFO("Error opening file");
-		return ;
-	}
-
-	/*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" );
-    */
-
-	//DEBUG_INFO("data=%s\n",data);
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","AllowOfflineTxForUnknownId", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemData);
-
-	//AuthorizationCacheEnabled
-	/*
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemAccessibility = 1;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemName, "AuthorizationCacheEnabled");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemData, "FALSE" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","AuthorizationCacheEnabled", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemData);
-
-	//AuthorizeRemoteTxRequests
-	/*
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemName, "AuthorizeRemoteTxRequests");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemData, "TRUE" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","AuthorizeRemoteTxRequests", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemData);
-
-	//BlinkRepeat
-	/*
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemAccessibility = 1;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemName, "BlinkRepeat");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemData, "0" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","BlinkRepeat", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemData);
-
-	//ClockAlignedDataInterval
-	/*
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemAccessibility = 1;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemName, "ClockAlignedDataInterval");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemData, "0" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ClockAlignedDataInterval", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemData);
-
-	//ConnectionTimeOut
-	/*
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemAccessibility = 1;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemName, "ConnectionTimeOut");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemData, "180" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ConnectionTimeOut", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemData);
-
-	//GetConfigurationMaxKeys
-	/*
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemAccessibility =0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemName, "GetConfigurationMaxKeys");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemData, "43" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","GetConfigurationMaxKeys", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemData);
-
-	// HeartbeatInterval
-	/*
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemAccessibility = 1;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemName, "HeartbeatInterval");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemData, "10" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","HeartbeatInterval", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemData);
-
-	// LightIntensity
-	/*
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemAccessibility = 1;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemName, "LightIntensity");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemData, "0" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LightIntensity", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemData);
-
-	// LocalAuthorizeOffline
-	/*
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemName, "LocalAuthorizeOffline");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData, "TRUE" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LocalAuthorizeOffline", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData);
-
-	// LocalPreAuthorize
-	/*
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemName, "LocalPreAuthorize");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemData, "FALSE" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LocalPreAuthorize", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemData);
-
-	// MaxEnergyOnInvalidId
-	/*
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemAccessibility = 1;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemName, "MaxEnergyOnInvalidId");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemData, "0" );
-	*/
-	//ShmSysConfigAndInfo->SysConfig.OfflineMaxChargeEnergy = 0;
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MaxEnergyOnInvalidId", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemData);
-
-	// MeterValuesAlignedData
-	/*
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemAccessibility = 1;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemName, "MeterValuesAlignedData");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemData, "Current.Export,Energy.Active.Export.Interval,Power.Active.Export,Voltage,SOC" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValuesAlignedData", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemData);
-
-	// MeterValuesAlignedDataMaxLength
-	/*
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemName, "MeterValuesAlignedDataMaxLength");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemData, "5" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValuesAlignedDataMaxLength", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemData);
-
-
-	// MeterValuesSampledData
-	/*
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemAccessibility = 1;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemName, "MeterValuesSampledData");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemData, "Current.Export,Energy.Active.Export.Interval,Power.Active.Export,Voltage,SOC" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValuesSampledData", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemData);
-
-
-	// MeterValuesSampledDataMaxLength
-	/*
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemName, "MeterValuesSampledDataMaxLength");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemData, "5" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValuesSampledDataMaxLength", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemData);
-
-	// MeterValueSampleInterval
-	/*
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemAccessibility = 1;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemName, "MeterValueSampleInterval");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemData, "10" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValueSampleInterval", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemData);
-
-	// MinimumStatusDuration
-	/*
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemAccessibility = 1;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemName, "MinimumStatusDuration");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemData, "0" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MinimumStatusDuration", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemData);
-
-	// NumberOfConnectors
-	/*
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemName, "NumberOfConnectors");
-	if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
-	{
-		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemData, "%d", (CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY));
-	}
-	else
-	{
-		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemData, "%d", AC_QUANTITY);
-	}
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","NumberOfConnectors", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemData);
-
-	// ResetRetries
-	/*
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemAccessibility = 1;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemName, "ResetRetries");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemData, "3" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ResetRetries", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemData);
-
-	// ConnectorPhaseRotation
-	/*
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemAccessibility = 1;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemName, "ConnectorPhaseRotation");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "NotApplicable" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ConnectorPhaseRotation", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData);
-
-	// ConnectorPhaseRotationMaxLength
-	/*
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemName, "ConnectorPhaseRotationMaxLength");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemData, "1" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ConnectorPhaseRotationMaxLength", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemData);
-
-	// StopTransactionOnEVSideDisconnect
-	/*
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemName, "StopTransactionOnEVSideDisconnect");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemData, "TRUE" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTransactionOnEVSideDisconnect", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemData);
-
-	// StopTransactionOnInvalidId
-	/*
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemName, "StopTransactionOnInvalidId");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemData, "FALSE" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTransactionOnInvalidId", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemData);
-
-	// 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" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTxnAlignedData", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemData);
-
-	// StopTxnAlignedDataMaxLength
-	/*
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemName, "StopTxnAlignedDataMaxLength");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemData, "0" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTxnAlignedDataMaxLength", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemData);
-
-	// 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" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTxnSampledData", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemData);
-
-	// StopTxnSampledDataMaxLength
-	/*
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemName, "StopTxnSampledDataMaxLength");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData, "0" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTxnSampledDataMaxLength", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData);
-
-	// 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" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","SupportedFeatureProfiles", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemData);
-
-	// SupportedFeatureProfilesMaxLength
-	/*
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemName, "SupportedFeatureProfilesMaxLength");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemData, "6" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","SupportedFeatureProfilesMaxLength", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemData);
-
-	// TransactionMessageAttempts
-	/*
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemAccessibility = 1;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemName, "TransactionMessageAttempts");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemData, "3" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","TransactionMessageAttempts", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemData);
-
-	// TransactionMessageRetryInterval
-	/*
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemAccessibility = 1;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemName, "TransactionMessageRetryInterval");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemData, "60" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","TransactionMessageRetryInterval", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemData);
-
-	// UnlockConnectorOnEVSideDisconnect
-	/*
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemName, "UnlockConnectorOnEVSideDisconnect");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemData, "TRUE" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","UnlockConnectorOnEVSideDisconnect", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemData);
-
-
-	// WebSocketPingInterval
-	/*
-	ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemAccessibility = 1;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemName, "WebSocketPingInterval");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemData, "30" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","WebSocketPingInterval", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemData);
-
-	//* 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" );
-	*/
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LocalAuthListEnabled", "false", (char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData);
-
-	//LocalAuthListMaxLength
-	/*
-	ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemName, "LocalAuthListMaxLength");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemData, "500" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LocalAuthListMaxLength", "true", (char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemData);
-
-	//SendLocalListMaxLength
-	/*
-	ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemName, "SendLocalListMaxLength");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemData, "500" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","SendLocalListMaxLength", "true", (char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemData);
-
-
-	//ReserveConnectorZeroSupported
-	/*
-	ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemName, "ReserveConnectorZeroSupported");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemData, "FALSE" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ReserveConnectorZeroSupported", "true", (char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemData);
-
-	//*  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" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ChargeProfileMaxStackLevel", "true", (char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemData);
-
-	// ChargingScheduleAllowedChargingRateUnit
-	/*
-	ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemName, "ChargingScheduleAllowedChargingRateUnit");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemData, "Current" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ChargingScheduleAllowedChargingRateUnit", "true", (char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemData);
-
-	// ChargingScheduleMaxPeriods
-	/*
-	ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemName, "ChargingScheduleMaxPeriods");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemData, "10" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ChargingScheduleMaxPeriods", "true", (char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemData);
-
-	// ConnectorSwitch3to1PhaseSupported
-	/*
-	ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemName, "ConnectorSwitch3to1PhaseSupported");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemData, "TRUE" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ConnectorSwitch3to1PhaseSupported", "true", (char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemData);
-
-	// MaxChargingProfilesInstalled
-	/*
-	ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemAccessibility = 0;
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemName, "MaxChargingProfilesInstalled");
-	strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemData, "3" );
-	*/
-
-	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MaxChargingProfilesInstalled", "true", (char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemData);
-
-	fclose(outfile);
-
-}
-
-
-void getKeyValue(char *keyReq)
-{
-	 int isEmpty = FALSE;
-	 int isKnowKey = FALSE;
-
-	 DEBUG_INFO("keyReq = %s\n", keyReq);
-
-	 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 );
-		   ShmSysConfigAndInfo->SysConfig.OfflineMaxChargeEnergy = atoi((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemData)/1000;
-		   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
-	      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;
-	char str[10]={0};
-
-	DEBUG_INFO(" setKeyValue %s = %s\n", key, value);
-
-    if(strcmp(key, "AllowOfflineTxForUnknownId") == 0)
-    {
-        //Charger.AllowOfflineTxForUnknownId = (value.toLowerCase().equals("true")?true:false);
-    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemAccessibility == 1)
-    	{
-    		strcpy(str, (const char*)value);
-    		for(int i = 0; str[i]; i++){
-    		  str[i] = tolower(str[i]);
-    		}
-
-    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemData, "%s", (strcmp(str, "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)
-    	{
-    		strcpy(str, (const char*)value);
-    		for(int i = 0; str[i]; i++){
-    		   str[i] = tolower(str[i]);
-    		}
-
-    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemData, "%s", (strcmp(str, "true")==0) ?"TRUE":"FALSE" );
-    		isSuccess = ConfigurationStatus_Accepted;
-    		//updateSetting("AuthorizationCacheEnabled",(char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[1].ItemData);
-    	}
-    	else
-    	{
-    		isSuccess = ConfigurationStatus_Rejected;
-    	}
-
-    }
-
-    if(strcmp(key, "AuthorizeRemoteTxRequests") == 0)
-    {
-    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemAccessibility == 1)
-    	{
-    		strcpy(str, (const char*)value);
-    		for(int i = 0; str[i]; i++)
-    		{
-    			str[i] = tolower(str[i]);
-    		}
-    		//Charger.AuthorizeRemoteTxRequests = (value.toLowerCase().equals("true")?true:false);
-    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemData, "%s", (strcmp(str, "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) );
-    			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));
-    			isSuccess = ConfigurationStatus_Accepted;
-    		}
-    	}
-    	else
-        {
-        	isSuccess = ConfigurationStatus_Rejected;
-        }
-
-    }
-
-    if(strcmp(key, "GetConfigurationMaxKeys") == 0)
-    {
-    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].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[GetConfigurationMaxKeys].ItemData, "%d", atoi(value) );
-        		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));
-    			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)
-    	{
-    		strcpy(str, (const char*)value);
-    		for(int i = 0; str[i]; i++)
-    		{
-    		   str[i] = tolower(str[i]);
-    		}
-    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData, "%s", (strcmp(str, "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)
-    	{
-    		strcpy(str, (const char*)value);
-    		for(int i = 0; str[i]; i++)
-    		{
-    		   str[i] = tolower(str[i]);
-    		}
-    	    sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemData, "%s", (strcmp(str, "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) );
-    			 ShmSysConfigAndInfo->SysConfig.OfflineMaxChargeEnergy = atoi(value)/1000;
-    			 isSuccess = ConfigurationStatus_Accepted;
-    		}
-    	}
-    	else
-    	{
-    	    isSuccess = ConfigurationStatus_Rejected;
-    	}
-
-    }
-
-    if(strcmp(key, "MeterValuesAlignedData") == 0)
-    {
-    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemAccessibility == 1)
-    	{
-    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemData, "%s", value );
-    		isSuccess = ConfigurationStatus_Accepted;
-    	}
-    	else
-    	{
-    	   isSuccess = ConfigurationStatus_Rejected;
-    	}
-
-    }
-
-    if(strcmp(key, "MeterValuesAlignedDataMaxLength") == 0)
-    {
-     	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].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[MeterValuesAlignedDataMaxLength].ItemData, "%d", atoi(value));
-     			isSuccess = ConfigurationStatus_Accepted;
-     		}
-     	}
-     	else
-     	{
-     	    isSuccess = ConfigurationStatus_Rejected;
-
-     	}
-
-    }
-
-    if(strcmp(key, "MeterValuesSampledData") == 0 )
-    {
-    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemAccessibility == 1)
-    	{
-    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemData, "%s", value );
-    		isSuccess = ConfigurationStatus_Accepted;
-    	}
-    	else
-    	{
-    	    isSuccess = ConfigurationStatus_Rejected;
-    	}
-
-    }
-
-    if(strcmp(key, "MeterValuesSampledDataMaxLength") == 0)
-    {
-     	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].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[MeterValuesSampledDataMaxLength].ItemData, "%d", atoi(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;
-    		}
-    	}
-    	else
-    	{
-    	    isSuccess = ConfigurationStatus_Rejected;
-
-    	}
-
-    }
-
-    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
-    		{
-    			if(atoi(value) == 0) // MinimumStatusDuration's value can not be 0
-    			{
-    				isSuccess = ConfigurationStatus_Rejected;
-    			}
-    			else
-    			{
-    				//Charger.MinimumStatusDuration = Integer.parseInt(value);
-    			    sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemData, "%d", atoi(value) );
-    			    server_cycle_Status = atoi(value); //StatusNotification Cycle
-    			    isSuccess = ConfigurationStatus_Accepted;
-    			}
-    		}
-    	}
-    	else
-        {
-        	isSuccess = ConfigurationStatus_Rejected;
-        }
-
-    }
-
-    if(strcmp(key, "NumberOfConnectors") == 0)
-    {
-      	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].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[NumberOfConnectors].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)
-	   {
-		   strcpy(str, (const char*)value);
-		   for(int i = 0; str[i]; i++)
-		   {
-			   str[i] = tolower(str[i]);
-		   }
-
-		   if(strcmp(str, "notapplicable")== 0)
-		   {
-			   sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", "NotApplicable" );
-			   isSuccess = ConfigurationStatus_Accepted;
-		   }
-		   else  if(strcmp(str, "unknown")== 0)
-		   {
-			   sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", "Unknown" );
-			   isSuccess = ConfigurationStatus_Accepted;
-		   }
-		   else  if(strcmp(str, "rst")== 0)
-		   {
-			   sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", "RST" );
-			   isSuccess = ConfigurationStatus_Accepted;
-		   }
-		   else  if(strcmp(str, "rts")== 0)
-		   {
-			   sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", "RTS" );
-			   isSuccess = ConfigurationStatus_Accepted;
-		   }
-		   else  if(strcmp(str, "srt")== 0)
-		   {
-			   sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", "SRT" );
-			   isSuccess = ConfigurationStatus_Accepted;
-		   }
-		   else  if(strcmp(str, "str")== 0)
-		   {
-			   sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", "STR" );
-			   isSuccess = ConfigurationStatus_Accepted;
-		   }
-		   else  if(strcmp(str, "trs")== 0)
-		   {
-			   sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", "TRS" );
-			   isSuccess = ConfigurationStatus_Accepted;
-		   }
-		   else  if(strcmp(str, "tsr")== 0)
-		   {
-			   sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", "TSR" );
-			   isSuccess = ConfigurationStatus_Accepted;
-		   }
-		   else
-		   {
-			   isSuccess = ConfigurationStatus_Rejected;
-		   }
-	   }
-	   else
-	   {
-	       isSuccess = ConfigurationStatus_Rejected;
-	   }
-
-   }
-
-   if(strcmp(key, "ConnectorPhaseRotationMaxLength") == 0)
-   {
-	  if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemAccessibility == 1)
-	  {
-		  check_ascii = value[0];
-		  if( (check_ascii < 48) || (check_ascii > 57) )
-		  {
-		      isSuccess = ConfigurationStatus_Rejected;
-		  }
-		  else
-		  {
-		      sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemData, "%d", atoi(value) );
-		      isSuccess = ConfigurationStatus_Accepted;
-		  }
-	  }
-	  else
-	  {
-	  	  isSuccess = ConfigurationStatus_Rejected;
-	  }
-   }
-
-   if(strcmp(key, "StopTransactionOnEVSideDisconnect") == 0)
-   {
-	   if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemAccessibility == 1)
-	   {
-		   strcpy(str, (const char*)value);
-		   for(int i = 0; str[i]; i++)
-		   {
-		      str[i] = tolower(str[i]);
-		   }
-		   //Charger.StopTransactionOnEVSideDisconnect = (value.toLowerCase().equals("true")?true:false);
-		   sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemData, "%s", (strcmp(str, "true")==0) ?"TRUE":"FALSE" );
-		   isSuccess = ConfigurationStatus_Accepted;
-	   }
-	   else
-	   {
-	       isSuccess = ConfigurationStatus_Rejected;
-	   }
-
-   }
-
-    if(strcmp(key, "StopTransactionOnInvalidId") == 0)
-    {
-    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemAccessibility == 1)
-    	{
-    		strcpy(str, (const char*)value);
-    		for(int i = 0; str[i]; i++)
-    		{
-    			str[i] = tolower(str[i]);
-    		}
-    		//Charger.StopTransactionOnInvalidId = (value.toLowerCase().equals("true")?true:false);
-    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemData, "%s", (strcmp(str, "true")==0) ?"TRUE":"FALSE" );
-    		isSuccess = ConfigurationStatus_Accepted;
-    	}
-        else
-        {
-    		isSuccess = ConfigurationStatus_Rejected;
-        }
-    }
-
-
-    if(strcmp(key, "StopTxnAlignedData") == 0)
-    {
-    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemAccessibility == 1)
-    	{
-    	    sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemData, "%s", value );
-    		isSuccess = ConfigurationStatus_Accepted;
-    	}
-    	else
-    	{
-    	    isSuccess = ConfigurationStatus_Rejected;
-    	}
-    }
-
-    if(strcmp(key, "StopTxnAlignedDataMaxLength") == 0)
-    {
-   	  if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemAccessibility == 1)
-   	  {
-   		 check_ascii = value[0];
-   		 if( (check_ascii < 48) || (check_ascii > 57) )
-   		 {
-   			isSuccess = ConfigurationStatus_Rejected;
-   		 }
-   		 else
-   		 {
-   			sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemData, "%d", atoi(value) );
-   			isSuccess = ConfigurationStatus_Accepted;
-   		 }
-   	  }
-   	  else
-   	  {
-   	  	  isSuccess = ConfigurationStatus_Rejected;
-   	  }
-    }
-
-    if(strcmp(key, "StopTxnSampledData") == 0)
-    {
-    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemAccessibility == 1)
-    	{
-    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemData, "%s", value );
-    		isSuccess = ConfigurationStatus_Accepted;
-    	}
-    	else
-    	{
-    	    isSuccess = ConfigurationStatus_Rejected;
-    	}
-
-    }
-
-    if(strcmp(key, "StopTxnSampledDataMaxLength") == 0)
-    {
-    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemAccessibility == 1)
-    	{
-    		 check_ascii = value[0];
-    		 if( (check_ascii < 48) || (check_ascii > 57) )
-    		 {
-    			 isSuccess = ConfigurationStatus_Rejected;
-    		 }
-    		 else
-    		 {
-    			 sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData, "%d", atoi(value) );
-    			 isSuccess = ConfigurationStatus_Accepted;
-    		 }
-    	}
-    	else
-    	{
-     	  	isSuccess = ConfigurationStatus_Rejected;
-    	}
-    }
-
-    if(strcmp(key, "SupportedFeatureProfiles") == 0)
-    {
-       	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemAccessibility == 1)
-       	{
-       		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemData, "%s", value );
-       		isSuccess = ConfigurationStatus_Accepted;
-       	}
-       	else
-       	{
-       	    isSuccess = ConfigurationStatus_Rejected;
-       	}
-
-    }
-
-    if(strcmp(key, "SupportedFeatureProfilesMaxLength") == 0)
-    {
-        if(ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemAccessibility == 1)
-        {
-        	 check_ascii = value[0];
-        	 if( (check_ascii < 48) || (check_ascii > 57) )
-        	 {
-        	    isSuccess = ConfigurationStatus_Rejected;
-        	 }
-        	 else
-        	 {
-        	    sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemData, "%d", atoi(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) );
-    			TransactionMessageAttemptsValue = 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) );
-    			TransactionMessageRetryIntervalValue = atoi(value);
-    			isSuccess = ConfigurationStatus_Accepted;
-    		}
-    	}
-    	else
-    	{
-    	    isSuccess = ConfigurationStatus_Rejected;
-    	}
-
-    }
-
-    if(strcmp(key, "UnlockConnectorOnEVSideDisconnect") == 0)
-    {
-    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemAccessibility == 1)
-    	{
-    		strcpy(str, (const char*)value);
-    		for(int i = 0; str[i]; i++)
-    		{
-    		   str[i] = tolower(str[i]);
-    		}
-    		//Charger.UnlockConnectorOnEVSideDisconnect = (value.toLowerCase().equals("true")?true:false);
-    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemData, "%s", (strcmp(str, "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 0
-    //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 1
-    if(strcmp(key, "LocalAuthListEnabled") == 0)
-    {
-    	if(ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemAccessibility == 1)
-    	{
-    		strcpy(str, (const char*)value);
-    		for(int i = 0; str[i]; i++)
-    		{
-    		   str[i] = tolower(str[i]);
-    		}
-        sprintf((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "%s", (strcmp(str, "true")==0) ?"TRUE":"FALSE" );
-    		isSuccess = ConfigurationStatus_Accepted;
-    		//updateSetting("LocalAuthListEnabled", (char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData);
-    	}
-    	else
-        {
-        	isSuccess = ConfigurationStatus_Rejected;
-        }
-
-    }
-#endif
-
-    if(strcmp(key, "LocalAuthListMaxLength") == 0)
-    {
-      	if(ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemAccessibility == 1)
-      	{
-      		check_ascii = value[0];
-      		if( (check_ascii < 48) || (check_ascii > 57) )
-      		{
-      			isSuccess = ConfigurationStatus_Rejected;
-      		}
-      		else
-      		{
-
-          		sprintf((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemData, "%d", atoi(value) );
-          		isSuccess = ConfigurationStatus_Accepted;
-      		}
-      	}
-      	else
-      	{
-      	    isSuccess = ConfigurationStatus_Rejected;
-      	}
-    }
-
-    if(strcmp(key, "SendLocalListMaxLength") == 0)
-    {
-        if(ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemAccessibility == 1)
-        {
-        	check_ascii = value[0];
-        	if( (check_ascii < 48) || (check_ascii > 57) )
-        	{
-        		isSuccess = ConfigurationStatus_Rejected;
-        	}
-        	else
-        	{
-
-            	sprintf((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemData, "%d", atoi(value) );
-            	isSuccess = ConfigurationStatus_Accepted;
-        	}
-        }
-        else
-        {
-        	isSuccess = ConfigurationStatus_Rejected;
-        }
-    }
-
-    if(strcmp(key, "ReserveConnectorZeroSupported") == 0)
-    {
-    	if(ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemAccessibility == 1)
-    	{
-    		strcpy(str, (const char*)value);
-    		for(int i = 0; str[i]; i++)
-    		{
-    		    str[i] = tolower(str[i]);
-    		}
-    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemData, "%s", (strcmp(str, "true")==0) ?"TRUE":"FALSE" );
-    		isSuccess = ConfigurationStatus_Accepted;
-    	}
-    	else
-    	{
-           	isSuccess = ConfigurationStatus_Rejected;
-    	}
-    }
-
-    if(strcmp(key, "ChargeProfileMaxStackLevel") == 0)
-    {
-         if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemAccessibility == 1)
-         {
-         	check_ascii = value[0];
-         	if( (check_ascii < 48) || (check_ascii > 57) )
-         	{
-         		isSuccess = ConfigurationStatus_Rejected;
-         	}
-         	else
-         	{
-
-             	sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemData, "%d", atoi(value) );
-             	isSuccess = ConfigurationStatus_Accepted;
-         	}
-         }
-         else
-         {
-         	isSuccess = ConfigurationStatus_Rejected;
-         }
-    }
-
-    if(strcmp(key, "ChargingScheduleAllowedChargingRateUnit") == 0)
-    {
-    	if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemAccessibility == 1)
-        {
-    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemData, "%s", value );
-         	isSuccess = ConfigurationStatus_Accepted;
-        }
-        else
-        {
-         	isSuccess = ConfigurationStatus_Rejected;
-        }
-
-    }
-
-    if(strcmp(key, "ChargingScheduleMaxPeriods") == 0)
-    {
-    	if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemAccessibility == 1)
-        {
-           	check_ascii = value[0];
-           	if( (check_ascii < 48) || (check_ascii > 57) )
-           	{
-           		isSuccess = ConfigurationStatus_Rejected;
-           	}
-           	else
-           	{
-
-               	sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemData, "%d", atoi(value) );
-               	isSuccess = ConfigurationStatus_Accepted;
-           	}
-        }
-    	else
-        {
-           	isSuccess = ConfigurationStatus_Rejected;
-        }
-    }
-
-    if(strcmp(key, "ConnectorSwitch3to1PhaseSupported") == 0)
-    {
-       	if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemAccessibility == 1)
-       	{
-       		strcpy(str, (const char*)value);
-       		for(int i = 0; str[i]; i++)
-       		{
-       		    str[i] = tolower(str[i]);
-       		}
-       		sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemData, "%s", (strcmp(str, "true")==0) ?"TRUE":"FALSE" );
-       		isSuccess = ConfigurationStatus_Accepted;
-       	}
-       	else
-       	{
-              	isSuccess = ConfigurationStatus_Rejected;
-       	}
-    }
-
-    if(strcmp(key, "MaxChargingProfilesInstalled") == 0)
-    {
-       	if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemAccessibility == 1)
-        {
-       		check_ascii = value[0];
-            if( (check_ascii < 48) || (check_ascii > 57) )
-            {
-            	isSuccess = ConfigurationStatus_Rejected;
-            }
-            else
-            {
-
-                 sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemData, "%d", atoi(value) );
-                 isSuccess = ConfigurationStatus_Accepted;
-            }
-       }
-       else
-       {
-            isSuccess = ConfigurationStatus_Rejected;
-       }
-    }
-
-
-    return isSuccess;
-}
-
-int TransactionMessageAttemptsGet(void)
-{
-	return TransactionMessageAttemptsValue;
-}
-
-int FirstHeartBeatResponse(void)
-{
-	return FirstHeartBeat;
-}
-
-
-int TransactionMessageRetryIntervalGet(void)
-{
-	return TransactionMessageRetryIntervalValue;//atoi((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemData);
-}
-
-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 rmFileCmd[100]={0};
-    char FilePath[100]={0};
-	char ftpbuf[200];
-	int systemresult;
-
-	//DEBUG_INFO("filename=%s\n",filename);
-	//DEBUG_INFO("url=%s\n",url);
-	sprintf(FilePath,"/mnt/%s",filename);
-
-	if((access(FilePath,F_OK))!=-1)
-	{
-		DEBUG_INFO("filename=%s exist.\n",FilePath);
-		sprintf(rmFileCmd,"rm -f %s",FilePath);
-		system(rmFileCmd);
-	}
-	memset(ftpbuf, 0, sizeof(ftpbuf));
-	sprintf(ftpbuf, "wget --tries=3 -O /mnt/%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 rmFileCmd[100]={0};
-	char FilePath[100]={0};
-	char ftpbuf[200];
-	int systemresult;
-	//char temp[100];
-	sprintf(FilePath,"/mnt/%s",filename);
-
-	if((access(FilePath,F_OK))!=-1)
-	{
-		DEBUG_INFO("filename=%s exist.\n",FilePath);
-		sprintf(rmFileCmd,"rm -f %s",FilePath);
-		system(rmFileCmd);
-	}
-
-	memset(ftpbuf, 0, sizeof(ftpbuf));
-
-	sprintf(ftpbuf, "wget --tries=3 -O /mnt/%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("wget error!\n");
-		return FALSE;
-	}
-
-	return TRUE;
-
-}
-
-int httpUploadFile(char *location, char *path, char *filename,char *url)
-{
-	char rmFileCmd[100]={0};
-    char FilePath[100]={0};
-	char ftpbuf[200];
-	int systemresult;
-
-	//DEBUG_INFO("filename=%s\n",filename);
-	//DEBUG_INFO("url=%s\n",url);
-	sprintf(FilePath,"%s","/mnt/upload_file.txt");
-
-	if((access(FilePath,F_OK))!=-1)
-	{
-		DEBUG_INFO("filename=%s exist.\n",FilePath);
-		sprintf(rmFileCmd,"rm -f %s",FilePath);
-		system(rmFileCmd);
-	}
-
-	FILE *fp = fopen("/mnt/upload_file.txt", "w+");
-
-	if(fp == NULL)
-	{
-		DEBUG_INFO("log is NULL\n");
-		return FALSE;
-	}
-	else
-	{
-		fprintf(fp, "%s\n", url);
-		fprintf(fp, "%s\n", filename);
-		fclose(fp);
-	}
-
-	memset(ftpbuf, 0, sizeof(ftpbuf));
-	sprintf(ftpbuf, "%s","/bin/php-cgi /var/www/ocpp_upload.php");
-	systemresult = system(ftpbuf);
-
-	DEBUG_INFO("systemresult = %d\n",systemresult);
-	if(systemresult != 0)
-	{
-		DEBUG_INFO("http upload 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 phihong -p y42j%2f4cj84 112.91.88.35 -P 21 /2020-02.zip ../mnt/2020-02.zip*/
-	/* 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;
-
-}
-
-/**
- * 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)
-{
-//   localversion = argv[5] ? atoi(argv[5]) : 0;
-//   printf("localversion=%d\n", localversion);
-	return 0;
-}
-
-//=========================================
-// Sqlite3 related function
-//=========================================
-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");
-
-    /* Execute SQL statement */
-    rc = sqlite3_exec(db, sql, versioncallback, 0, (char **)&zErrMsg);
-
-    if( rc != SQLITE_OK )
-    {
-    	DEBUG_INFO("SQL error: %s", zErrMsg);
-    }
-}
-
-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));
-
-    //DEBUG_INFO("look up card: %s in ocpp_auth_local table", idTag);
-    sprintf(sql,"select * from ocpp_auth_local where idtag='%s'", idTag);
-
-    /* Execute SQL statement */
-
-    rc = sqlite3_exec(db, sql, IdTagcallback, 0, (char **)&zErrMsg);
-
-    if( rc != SQLITE_OK )
-    {
-    	DEBUG_INFO("SQL error: %s", zErrMsg);
-    }
-
-   //return ver;
-}
-
-void OCPP_get_TableAuthlocalAllData(void)
-{
-    int rc = 0;
-    char sql[100];
-    char zErrMsg[100];
-
-    memset(sql, 0, 100);
-    memset(zErrMsg, 0, 100);
-
-    sprintf(sql,"select * from ocpp_auth_local ");
-
-    /* Execute SQL statement */
-
-    rc = sqlite3_exec(db, sql, &sqlite3_exec_callback, 0,(char **)&zErrMsg);
-
-    if( rc != SQLITE_OK )
-    {
-    	DEBUG_INFO("SQL error: %s", zErrMsg);
-    }
-
-    //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)
-	{
-		DEBUG_INFO("%s\n",errMsg);
-		return FALSE;
-	}
-
-	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[300];
-	 char zErrMsg[200];
-
-	 memset(sql, 0, 300);
-	 memset(zErrMsg, 0, 200);
-
-	 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);
-
-	 //* Execute SQL statement */
-	 ret = sqlite3_exec(db, sql, callback, 0, (char **)&zErrMsg);
-	 if( ret != SQLITE_OK )
-	 {
-		 DEBUG_INFO("SQL error: %s\n", zErrMsg);
-		 return isSuccess;
-	 }
-
-	 memset(sql, 0, 300);
-	 sprintf(sql, "UPDATE ocpp_auth_local SET version=%d",version);
-	 ret = sqlite3_exec(db, sql, NULL, NULL, (char **)&zErrMsg);
-	 if( ret != SQLITE_OK )
-	 {
-		 DEBUG_INFO("SQL error: %s\n", zErrMsg);
-		 return isSuccess;
-	 }
-
-	 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 */
-	rc = sqlite3_exec(db, sql, deleteIdTagcallback, 0,(char **)&zErrMsg);
-	if( rc != SQLITE_OK )
-	{
-		DEBUG_INFO("SQL error: %s", zErrMsg);
-	}
-}
-
-int GetOcppServerURL()
-{
-    int result = FALSE;
-	memset(OcppProtocol, 0, sizeof(OcppProtocol));
-	memset(OcppHost, 0, sizeof(OcppHost));
-	memset(OcppTempPath, 0, sizeof(OcppTempPath));
-
-	if((ShmSysConfigAndInfo->SysConfig.OcppServerURL != NULL) && (strcmp((const char *)ShmSysConfigAndInfo->SysConfig.OcppServerURL,"") != 0) )
-	{
-#if 1
-		sscanf((const char *)ShmSysConfigAndInfo->SysConfig.OcppServerURL,
-						"%[^:]:%*2[/]%[^:]:%i/%[a-zA-Z0-9._/-]",
-						OcppProtocol, OcppHost, &OcppPort, OcppTempPath);
-#endif
-		result = TRUE;
-		goto End;
-	}
-	else if((ShmOCPP16Data->OcppServerURL != NULL) && (strcmp((const char *)ShmOCPP16Data->OcppServerURL,"") != 0))
-	{
-		sscanf((const char *)ShmOCPP16Data->OcppServerURL,
-								"%[^:]:%*2[/]%[^:]:%i/%[a-zA-Z0-9._/-]",
-								OcppProtocol, OcppHost, &OcppPort, OcppTempPath);
-		result = TRUE;
-		goto End;
-
-	}
-	else
-	{
-		strcpy(OcppHost,"");
-	}
-
-End:
-	return result;
-}
-
-int GetOcppPath()
-{
-	int result = FALSE;
-	if((ShmSysConfigAndInfo->SysConfig.ChargeBoxId != NULL) && (strcmp((const char *)ShmSysConfigAndInfo->SysConfig.ChargeBoxId,"") != 0) )
-	{
-		if(OcppTempPath == NULL)
-		{
-			sprintf(OcppPath,"/%s",ShmSysConfigAndInfo->SysConfig.ChargeBoxId);
-		}
-		else
-		{
-			sprintf(OcppPath,"/%s%s",OcppTempPath,ShmSysConfigAndInfo->SysConfig.ChargeBoxId);
-		}
-		result = TRUE;
-		goto End;
-	}
-	else if((ShmOCPP16Data->ChargeBoxId != NULL) && (strcmp((const char *)ShmOCPP16Data->ChargeBoxId,"") != 0))
-	{
-		if(OcppTempPath == NULL)
-		{
-			sprintf(OcppPath,"/%s",ShmOCPP16Data->ChargeBoxId);
-		}
-		else
-		{
-			sprintf(OcppPath,"/%s%s",OcppTempPath,ShmOCPP16Data->ChargeBoxId);
-		}
-		result = TRUE;
-		goto End;
-	}
-	else
-	{
-		strcpy(OcppPath,"");
-	}
-
-End:
-	return result;
-}
-
-int GetOcppPort()
-{
-	return OcppPort;
-}
-
-int GetOcppConnStatus(void)
-{
-	return ShmOCPP16Data->OcppConnStatus;
-}
-
-void SetOcppConnStatus(uint8_t status)
-{
-	ShmOCPP16Data->OcppConnStatus = status;
-	ShmSysConfigAndInfo->SysInfo.OcppConnStatus = status;
-}
-
-int GetHeartBeatWithNOResponse(void)
-{
-	return HeartBeatWithNOResponse;
-}
-
-void SetHeartBeatWithNOResponse(void)
-{
-	HeartBeatWithNOResponse = 0;
-}
-
-void GetStartTransactionIdTag(int gun_index)
-{
-	memset(StartTransactionIdTagTemp, 0 ,sizeof(StartTransactionIdTagTemp));
-	strcpy(StartTransactionIdTagTemp, (const char *)ShmOCPP16Data->StartTransaction[gun_index].IdTag);
-}
-
-int GetTransactionId(int gunindex, char idTag[])
-{
-	char ch;
-	FILE *fptr1;
-	int temptransactionId;
-	char str[100]={0};
-
-	temptransactionId = 0;
-
-	if((strcmp((const char*)idTag, "")==0)||(idTag[0]=='\0'))
-	{
-		return temptransactionId;
-	}
-
-	/*------ Read the file ----------------*/
-	fptr1=fopen("/Storage/OCPP/QueueTransactionId", "r");
-	if (!fptr1)
-	{
-		return temptransactionId;
-	}
-
-	ch=fgetc(fptr1);
-	rewind(fptr1);
-	if(ch!=EOF)
-	{
-		while (fgets(str, 100, fptr1) != NULL)
-		{
-			str[strlen(str) - 1] = '\0'; // eat the newline fgets() stores
-
-			if(str[0]=='\0')
-			{
-				break;
-			}
-			char *revbuf[8] = {0};
-			int num = 0;
-			splitstring(str,",",revbuf,&num);
-			if((revbuf[1][0] != '\0')&&(revbuf[2][0] != '\0'))
-			{
-				if((atoi(revbuf[0])==gunindex) || (strcmp(revbuf[1],(const char *)idTag)==0))
-				{
-					temptransactionId = atoi(revbuf[2]);
-					break;
-				}
-			}
-		}
-	}
-
-	fclose(fptr1);
-	/*------- End of reading ---------------*/
-	return temptransactionId;
-}
-
-void SetTransactionIdZero(int transactionId)
-{
-    char ch;
-    FILE *fptr1, *fptr2;
-	int temptransactionId = 0;
-    char str[100]={0}, strtemp[100]={0}, temp[] = "/Storage/OCPP/QueueTransactionIdtemp.json";
-
-    fptr1 = fopen("/Storage/OCPP/QueueTransactionId", "r");
-    if (!fptr1)
-	{
-    	//printf(" File not found or unable to open the input file!!\n");
-        return ;
-    }
-
-    fptr2 = fopen(temp, "w"); // open the temporary file in write mode
-    if (!fptr2)
-	{
-        DEBUG_INFO("Unable to open a temporary file to write!!\n");
-        fclose(fptr1);
-        return ;
-    }
-
-    ch=fgetc(fptr1);
-
-    rewind(fptr1);
-    if(ch!=EOF)
-    {
-    	// copy all contents to the temporary file except the specific line
-    	while (fgets(str, 100, fptr1) != NULL)
-    	{
-    		str[strlen(str) - 1] = '\0'; // eat the newline fgets() stores
-
-    		if(str[0]=='\0')
-    		{
-    			break;
-    		}
-
-    		char *revbuf[8] = {0};
-    		int num = 0;
-
-    		strcpy(strtemp, str);
-    		splitstring(str,",",revbuf,&num);
-
-    		if(revbuf[2][0] != '\0')
-    		{
-    			temptransactionId = atoi(revbuf[2]);
-    			if(transactionId != temptransactionId)
-    			{
-    			   fprintf(fptr2, "%s\n", strtemp);
-    			}
-    		}
-    	}
-    }
-    fclose(fptr1);
-    fclose(fptr2);
-    remove("/Storage/OCPP/QueueTransactionId");  		// remove the original file
-    rename(temp, "/Storage/OCPP/QueueTransactionId"); 	// rename the temporary file to original name
-/*------ Read the file ----------------*/
-
-}
-
-int InternetDisconnect(void)
-{
-	return (ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectVia4Gi && ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet && ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaWiFi	);
-}
-
-//Note: It is not real StopTransaction. It is temporary StopTransaction.
-void storeTempStopTransaction(int gun_index)
-{
-	char guid[37]={0};
-	int tempIndex = 0;
-	DEBUG_INFO("storeTempStopTransaction...\n");
-	memset(queuedata, 0, sizeof(queuedata));
-
-	//ENERGY_ACTIVE_IMPORT_REGISTER
-	//J: CHAdeMO  U: CCS1 combo  E: CCS2 combo  G: GBT DCcc
-	if(gunType[gun_index] == 'J')
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
-			{
-				ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PowerConsumption;
-			}
-		}// END OF CHAdeMO_QUANTITY
-	}
-	else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < CCS_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
-			{
-				ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PowerConsumption;
-			}
-		}// END OF CCS_QUANTITY
-
-	}
-	else if(gunType[gun_index] == 'G')
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < GB_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
-			{
-				ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PowerConsumption;
-			}
-		}// END OF GB_QUANTITY
-	}
-	else
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
-		{
-			tempIndex = 2;
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < AC_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
-			{
-				ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PowerConsumption;
-			}
-		}// END OF AC_QUANTITY
-	}
-
-	//Stop Transaction Time
-	struct timeval tmnow;
-	struct tm *tm;
-	char buf[28];//, usec_buf[6];
-	gettimeofday(&tmnow, NULL);
-
-	time_t t;
-	t = time(NULL);
-	/*UTC time and date*/
-	tm = gmtime(&t);
-	strftime(buf,28,"%Y-%m-%dT%H:%M:%SZ", tm);
-
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].Timestamp,buf);
-	ShmOCPP16Data->StopTransaction[gun_index].TransactionId = ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId;
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].IdTag, (const char*)ShmOCPP16Data->StartTransaction[gun_index].IdTag);
-
-	random_uuid(guid);
-
-	/***********************************transactionData******************************************************/
-	memset(ShmOCPP16Data->StopTransaction[gun_index].TransactionData, 0, sizeof(sizeof(struct StructMeterValue)));
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].TimeStamp, buf);
-
-	//=================================
-	//1. Transaction_Begin
-	//=================================
-	// Energy.Active.Export.Interval
-    //idx_sample=0;
-	sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Value, "%.1f",(float)(ShmOCPP16Data->StartTransaction[gun_index].MeterStart)); // MeterStart is 0~6553.5 kWh
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Context,ReadingContextStr[ReadingContext_Transaction_Begin]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Format,ValueFormatStr[Raw]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Measurand,MeasurandStr[Energy_Active_Import_Interval]);//MeasurandStr[Energy_Active_Export_Interval/*Energy_Reactive_Export_Register*/]);
-
-	//J: CHAdeMO  U: CCS1 combo  E: CCS2 combo  G: GBT DCcc
-	if((gunType[gun_index] == 'J')||(gunType[gun_index] == 'U')||(gunType[gun_index] == 'E')||(gunType[gun_index] == 'G'))
-	{
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Phase,PhaseStr[L3_N]);
-	}
-	else
-	{
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Phase,PhaseStr[L1_N]);
-	}
-
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Location,LocationStr[Location_Outlet]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Unit,UnitOfMeasureStr[UnitOfMeasure_kWh]);
-
-	//=================================
-	//2. Transaction_End
-	//=================================
-	//2.1 Current.Export
-	//idx_sample=1;
-	//J: CHAdeMO  U: CCS1 combo  E: CCS2 combo  G : GBT DC
-	if(gunType[gun_index] == 'J')
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingCurrent );// PresentChargingCurrent is 0~6553.5 amp
-			}
-		}// End of for CHAdeMO_QUANTITY
-
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L3_N]);
-	}
-	else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < CCS_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingCurrent );// PresentChargingCurrent is 0~6553.5 amp
-			}
-		}// End of for CCS_QUANTITY
-
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L3_N]);
-	}
-	else if(gunType[gun_index] == 'G')
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < GB_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingCurrent );// PresentChargingCurrent is 0~6553.5 amp
-			}
-		}// End of for GB_QUANTITY
-
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L3_N]);
-	}
-	else
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
-		{
-			tempIndex = 2;
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < AC_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingCurrent );//  0~6553.5 amp for EVSE
-			}
-		}// End of for AC_QUANTITY
-
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L1_N]);
-	}
-
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Context,ReadingContextStr[ReadingContext_Transaction_End]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Format,ValueFormatStr[Raw]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Measurand,MeasurandStr[Current_Import]);
-	//strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L1_N]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Location,LocationStr[Location_Outlet]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Unit,UnitOfMeasureStr[UnitOfMeasure_A]);
-
-	//2.2 Energy.Active.Export.Interval
-	//idx_sample=2;
-	//J: CHAdeMO  U: CCS1 combo   E: CCS2 combo   G: GBT DC
-
-	if(gunType[gun_index] == 'J')
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedEnergy );// PresentChargedEnergy is 0~6553.5 kWh
-			}
-		}// END OF CHAdeMO_QUANTITY
-
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L3_N]);
-
-	}
-	else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < CCS_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy );// PresentChargedEnergy is 0~6553.5 kWh
-			}
-		}// END OF CCS_QUANTITY
-
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L3_N]);
-
-	}
-	else if(gunType[gun_index] == 'G')
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < GB_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy );// PresentChargedEnergy is 0~6553.5 kWh
-			}
-		}// END OF GB_QUANTITY
-
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L3_N]);
-	}
-	else
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
-		{
-			tempIndex = 2;
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-
-		for (int index = 0; index < AC_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargedEnergy );// PresentChargedEnergy is 0~6553.5 kWh
-			}
-		}// END OF AC_QUANTITY
-
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L1_N]);
-	}
-
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Context,ReadingContextStr[ReadingContext_Transaction_End]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Format,ValueFormatStr[Raw]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Measurand,MeasurandStr[Energy_Active_Import_Interval]);
-	//strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L1_N]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Location,LocationStr[Location_Outlet]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Unit,UnitOfMeasureStr[UnitOfMeasure_kWh]);
-
-	//2.3 Power.Active.Export
-	//idx_sample=3;
-	//J: CHAdeMO  U: CCS1 combo  E: CCS2 combo  G: GBT DC
-
-	if(gunType[gun_index] == 'J')
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingPower );//  PresentChargingPower is 0~6553.5 kW
-			}
-		} // End for CHAdeMO_QUANTITY
-
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L3_N]);
-	}
-	else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < CCS_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingPower );// PresentChargingPower is 0~6553.5 kW
-			}
-		} // END for CCS_QUANTITY
-
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L3_N]);
-	}
-	else if(gunType[gun_index] == 'G')
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < GB_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingPower );// PresentChargingPower is 0~6553.5 kW
-			}
-		}// END for GB_QUANTITY
-
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L3_N]);
-	}
-	else
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
-		{
-			tempIndex = 2;
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < AC_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingPower );// PresentChargingPower is 0~6553.5 kW
-			}
-		} // END for AC_QUANTITY
-
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L1_N]);
-	}
-
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Context,ReadingContextStr[ReadingContext_Transaction_End]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Format,ValueFormatStr[Raw]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Measurand,MeasurandStr[Power_Active_Import]);
-	//strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L1_N]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Location,LocationStr[Location_Outlet]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Unit,UnitOfMeasureStr[UnitOfMeasure_kW/*UnitOfMeasure_kWh*/]);
-
-	//2.4 Voltage
-	//idx_sample=4;
-	//J: CHAdeMO  U: CCS1 combo  E: CCS2 combo  G: GBT DC
-	if(gunType[gun_index] == 'J')
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingVoltage );// PresentChargingVoltage is 0~6553.5 volt
-			}
-		} // END OF FOR CHAdeMO_QUANTITY
-
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L3_N]);
-
-	}
-	else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < CCS_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingVoltage );// PresentChargingVoltage is 0~6553.5 volt
-			}
-		} // END OF  FOR CCS_QUANTITY
-
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L3_N]);
-	}
-	else if(gunType[gun_index] == 'G')
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < GB_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingVoltage );// PresentChargingVoltage is 0~6553.5 volt
-			}
-		} // END OF FOR GB_QUANTITY
-
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L3_N]);
-	}
-	else
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
-		{
-			tempIndex = 2;
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		for (int index = 0; index < AC_QUANTITY; index++)
-		{
-			if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
-			{
-				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingVoltage );//AcChargingVoltage is 0~6553.5 volt  for AC EVSE
-			}
-		} // END OF FOR AC_QUANTITY
-
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L1_N]);
-	}
-
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Context,ReadingContextStr[ReadingContext_Transaction_End]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Format,ValueFormatStr[Raw]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Measurand,MeasurandStr[Voltage]);
-	//strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L1_N]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Location,LocationStr[Location_Outlet]);
-	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Unit,UnitOfMeasureStr[UnitOfMeasure_V]);
-
-	//2.5 SoC
-	//idx_sample=5;
-	//J : CHAdeMO  U: CCS1 combo  E: CCS2 combo  G: GBT DC
-	if((gunType[gun_index] == 'J')||(gunType[gun_index] == 'U')||(gunType[gun_index] == 'E')||(gunType[gun_index] == 'G'))
-	{
-		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
-		{
-			tempIndex = ((gun_index==2) ? 1: 0);
-		}
-		else
-		{
-			tempIndex = gun_index;
-		}
-
-		if(gunType[gun_index] == 'J')
-		{
-			for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
-				{
-					sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].EvBatterySoc );// 0~100%
-				}
-			}
-		}
-		else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
-		{
-			for (int index = 0; index < CCS_QUANTITY; index++)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
-				{
-					sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].EvBatterySoc );// 0~100%
-				}
-			}
-
-		}
-		else if(gunType[gun_index] == 'G')
-		{
-			for (int index = 0; index < GB_QUANTITY; index++)
-			{
-				if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
-				{
-					sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].EvBatterySoc );// 0~100%
-				}
-			}
-
-		}
-
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Context,ReadingContextStr[ReadingContext_Transaction_End]);
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Format,ValueFormatStr[Raw]);
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Measurand,MeasurandStr[SoC/*Energy_Reactive_Export_Register*/]);
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Phase,PhaseStr[L3_N]);
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Location,LocationStr[Location_Outlet]);
-		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Unit,UnitOfMeasureStr[UnitOfMeasure_Percent/*UnitOfMeasure_kWh*/]);
-
-	} // END FOR DC CASE
-
-	if((gunType[gun_index] == 'J')||(gunType[gun_index] == 'U')||(gunType[gun_index] == 'E')||(gunType[gun_index] == 'G'))
-	{
-		sprintf(queuedata,"[%d,\"%s\",\"StopTransaction\",{\"idTag\":\"%s\",\"meterStop\":%d,\"timestamp\":\"%s\",\"transactionId\":%d,\"reason\":\"%s\",\"transactionData\":[{\"timestamp\":\"%s\",\"sampledValue\":[{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"}]}]}]"
-
-							,MESSAGE_TYPE_CALL
-							,guid
-							,ShmOCPP16Data->StopTransaction[gun_index].IdTag
-							,ShmOCPP16Data->StopTransaction[gun_index].MeterStop
-							,ShmOCPP16Data->StopTransaction[gun_index].Timestamp
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionId
-							,"PowerLoss"
-							,(const char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].TimeStamp
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Value
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Context
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Format
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Measurand
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Phase
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Location
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Unit
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Context
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Format
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Measurand
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Location
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Unit
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Context
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Format
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Measurand
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Location
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Unit
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Context
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Format
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Measurand
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Location
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Unit
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Context
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Format
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Measurand
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Location
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Unit
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Value
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Context
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Format
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Measurand
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Phase
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Location
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Unit
-							);
-	}
-	else
-	{
-		sprintf(queuedata,"[%d,\"%s\",\"StopTransaction\",{\"idTag\":\"%s\",\"meterStop\":%d,\"timestamp\":\"%s\",\"transactionId\":%d,\"reason\":\"%s\",\"transactionData\":[{\"timestamp\":\"%s\",\"sampledValue\":[{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"}]}]}]"
-
-							,MESSAGE_TYPE_CALL
-							,guid
-							,ShmOCPP16Data->StopTransaction[gun_index].IdTag
-							,ShmOCPP16Data->StopTransaction[gun_index].MeterStop
-							,ShmOCPP16Data->StopTransaction[gun_index].Timestamp
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionId
-							,"PowerLoss"
-							,(const char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].TimeStamp
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Value
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Context
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Format
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Measurand
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Phase
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Location
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Unit
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Context
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Format
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Measurand
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Location
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Unit
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Context
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Format
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Measurand
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Location
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Unit
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Context
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Format
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Measurand
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Location
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Unit
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Context
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Format
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Measurand
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Location
-							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Unit
-							);
-
-	}
-
-
-
-	// Check File "TempStopTransaction" Exist
-	if((access("/Storage/OCPP/TempStopTransaction",F_OK))!=-1)
-	{
-		//DEBUG_INFO("TransactionRelatedQueue exist.\n");
-		fclose(fopen("/Storage/OCPP/TempStopTransaction", "w"));
-	}
-	else
-	{
-		//DEBUG_INFO("TransactionRelatedQueue not exist\n");
-		FILE *log = fopen("/Storage/OCPP/TempStopTransaction", "w+");
-
-		if(log == NULL)
-		{
-			//DEBUG_INFO("Can't Create File TransactionRelatedQueue \n");
-			return ;
-		}
-		else
-		{
-			fclose(log);
-		}
-	}
-
-	//Add TempStopTransaction | Update TempStopTransaction
-	// open file for writing
-	FILE *outfile;
-	outfile = fopen ("/Storage/OCPP/TempStopTransaction", "a");
-	//DEBUG_INFO("data = %s\n", queuedata);
-	fputs(queuedata, outfile);
-	fputs("\n", outfile);
-	fclose (outfile);
-}
-
-void checkTempStopTransaction(int gun_index)
-{
-	FILE *fptr1;
-	char ch;
-	char str[1200]={0};
-	char guid[37]={0};
-	char tempdata[65]={0};
-
-	fptr1 = fopen("/Storage/OCPP/TempStopTransaction", "r");
-	if (!fptr1)
-	{
-		//printf(" File not found or unable to open the input file!!\n");
-	    return ;
-	}
-
-	ch=fgetc(fptr1);
-	//printf(" Now the content of the file %s is : \n",fname);
-
-	rewind(fptr1);
-	if(ch!=EOF)
-	{
-		// copy all contents to the temporary file except the specific line
-		while (fgets(str, 1200, fptr1) != NULL)
-		{
-			str[strlen(str) - 1] = '\0'; // eat the newline fgets() stores
-
-			if(str[0]=='\0')
-			{
-				break;
-			}
-
-			//random_uuid(guid);
-			strncpy(guid, str+4, 36); //skip 4 bytes( [2," ),copy guid
-			sprintf(tempdata, "StopTransaction,%d", (gun_index));
-			if(hashmap_operation(HASH_OP_ADD, guid, tempdata) == 1)
-			{
-				DEBUG_INFO("StopTransaction mapitem pass\n");
-			}
-			queue_operation(QUEUE_OPERATION_ADD, guid, str );//addq(guid, queuedata); ---> remove temporally
-
-			memset(str,0,sizeof str);
-		}
-	}
-
-	// fptr1=freopen(NULL,"w",fptr1); // reset the fptr1 again
-	fclose(fptr1);
-	remove("/Storage/OCPP/TempStopTransaction");  		// remove the original file
-}
-
-void FillStartTransaction(int ConnectorId, unsigned char IdTag[], int MeterStart,int ReservationId,unsigned char Timestamp[])
-{
-	ShmOCPP16Data->StartTransaction[ConnectorId-1].ConnectorId = ConnectorId;
-	ShmOCPP16Data->StartTransaction[ConnectorId-1].ReservationId = ReservationId;
-	ShmOCPP16Data->StartTransaction[ConnectorId-1].MeterStart = MeterStart;
-	strcpy((char *)ShmOCPP16Data->StartTransaction[ConnectorId-1].IdTag, (char *)IdTag);
-	strcpy((char *)ShmOCPP16Data->StartTransaction[ConnectorId-1].Timestamp,(char *) Timestamp);
-}
-
-int GetWebSocketPingInterval(void)
-{
-	return atoi((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemData);
-}
-
-int GetServerSign(void)
-{
-	return server_sign;
-}
-
-void SetServerSign(int value)
-{
-	server_sign = value;
-}
-
-int GetBootNotificationInterval(void)
-{
-	return BootNotificationInterval;
-}
-
-int GetInternetConn(void)
-{
-	return ShmSysConfigAndInfo->SysInfo.InternetConn;
-}
-
-void InitialSystemValue(void)
-{
-	int connectorIndex = 0;
-	//int valueASCII = 0;
-	server_cycle_Status = 120;
-	gunTotalNumber=0;
-	SystemInitial = 0;
-	localversion=0;
-	BootNotificationInterval = 0;
-	authorizeRetryTimes = 0;
-	GunStatusInterval = 10;
-	TransactionMessageAttemptsValue = 0;
-	TransactionMessageRetryIntervalValue = 0;
-
-	//Hear Beat
-	HeartBeatWithNOResponse = 0;
-	HeartBeatCountPerHour = 0;
-	HeartBeatWaitTime = atoi((char*)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemData);;
-	FirstHeartBeat = 0;
-
-	FirmwareStatusNotificationStatus = FIRMWARE_STATUS_IDLE;  // Idle
-	DiagnosticsStatusNotificationStatus = DIAGNOSTIC_STATUS_IDLE; // Idle
-
-	memset(CurrentChargingProfileScheduleStr, 0, sizeof(CurrentChargingProfileScheduleStr));
-	memset(statusModeChage, 0, sizeof(statusModeChage));
-	memset(ChademoPreviousSystemStatus, 0, sizeof(ChademoPreviousSystemStatus));
-	memset(CcsPreviousSystemStatus, 0, sizeof(CcsPreviousSystemStatus));
-	memset(GbPreviousSystemStatus, 0, sizeof(GbPreviousSystemStatus));
-	memset(AcPreviousSystemStatus, 0, sizeof(AcPreviousSystemStatus));
-	memset(ChademoPreviousConnectorPlugIn, 0, sizeof(ChademoPreviousConnectorPlugIn));
-	memset(CcsPreviousConnectorPlugIn, 0, sizeof(CcsPreviousConnectorPlugIn));
-	memset(GbPreviousConnectorPlugIn, 0, sizeof(GbPreviousConnectorPlugIn));
-	memset(AcPreviousConnectorPlugIn, 0, sizeof(AcPreviousConnectorPlugIn));
-	memset(gunType, 0, sizeof(gunType));
-
- 	if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D') // 'D' means DC
-	{
-		//check connector / socket type (index: 8, 9, 10)
-		for(int index=7; index <10 ; index++)
-		{
-			if(index != 8)
-			{
-				// DC Connector
-				if ((ShmSysConfigAndInfo->SysConfig.ModelName[index]  >= 'A') && (ShmSysConfigAndInfo->SysConfig.ModelName[index] <= 'Z'))
-				{
-					SystemInitial = SystemInitial + 1;
-					gunTotalNumber = gunTotalNumber + 1;
-					gunType[connectorIndex] = ShmSysConfigAndInfo->SysConfig.ModelName[index];
-					connectorIndex = connectorIndex + 1;
-				}
-			}
-			else
-			{
-				// AC Connector
-				if ((ShmSysConfigAndInfo->SysConfig.ModelName[index] > '0') && (ShmSysConfigAndInfo->SysConfig.ModelName[index] <= '9'))
-				{
-					SystemInitial = SystemInitial + 1;
-					gunTotalNumber = gunTotalNumber + 1;
-					gunType[connectorIndex] = ShmSysConfigAndInfo->SysConfig.ModelName[index];
-					connectorIndex = connectorIndex + 1;
-				}
-			}
-		}
-
-		//DEBUG_INFO("DC ...\n");
-	}
-	else if (ShmSysConfigAndInfo->SysConfig.ModelName[0]=='A') //'A' means AC
-	{
-		//check connector / socket type (index: 8, 9, 10)
-		for(int index=7; index <10 ; index++)
-		{
-			if ((ShmSysConfigAndInfo->SysConfig.ModelName[index] > '0') && (ShmSysConfigAndInfo->SysConfig.ModelName[index] <= '9'))
-			{
-				SystemInitial = SystemInitial + 1;
-				gunTotalNumber = gunTotalNumber + 1;
-				gunType[connectorIndex] = ShmSysConfigAndInfo->SysConfig.ModelName[index];
-				connectorIndex = connectorIndex + 1;
-
-				//DEBUG_INFO("AC: %d, %c\n", index, ShmSysConfigAndInfo->SysConfig.ModelName[index]);
-			}
-		}
-	}
-
-	//Status &&  ConnectorPlugIn Setting
-	for (int index = 0; index < CHAdeMO_QUANTITY; index++)
-	{
-		ChademoPreviousSystemStatus[index]= ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PreviousSystemStatus;
-		ChademoPreviousConnectorPlugIn[index] = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ConnectorPlugIn;
-	}
-
-	for (int index = 0; index < CCS_QUANTITY; index++)
-	{
-		CcsPreviousSystemStatus[index] = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PreviousSystemStatus;
-		CcsPreviousConnectorPlugIn[index] = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ConnectorPlugIn;
-	}
-
-	for (int index = 0; index < GB_QUANTITY; index++)
-	{
-		GbPreviousSystemStatus[index] = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PreviousSystemStatus;
-		GbPreviousConnectorPlugIn[index] = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ConnectorPlugIn;
-	}
-
-	for (int index = 0; index < AC_QUANTITY; index++)
-	{
-		AcPreviousSystemStatus[index]= ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PreviousSystemStatus;
-		AcPreviousConnectorPlugIn[index] = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState;
-	}
-
-	for(int gun_index=0; gun_index < gunTotalNumber; gun_index++ )
-	{
-		cpinitateMsg.bits[gun_index].StatusNotificationReq = 0;
-		cpinitateMsg.bits[gun_index].StatusNotificationConf = 0;
-		clientTime.MeterValues[gun_index] = time((time_t*)NULL);
-		clientTime.StatusNotification[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));
-
-	clientTime.Heartbeat=time((time_t*)NULL);
-
-	sleep(1);
-}
-
-void LWS_Send(char * str)
-{
-	//=====================================================
-	// Check InternetConn 0: disconnected, 1: connected
-	//====================================================
-	if(ShmSysConfigAndInfo->SysInfo.InternetConn == 0)
-	{
-		DEBUG_INFO("\n offline  now !!!\n");
-		return;
-	}
-
-	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, 100);//timeout_ms
+#include "Module_OcppBackend.h"
+#include "define.h"
+
+//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"
+
+
+//===================================
+//	Define CP State constant
+//===================================
+#define CP_STATE_UNKNOWN			0
+#define CP_STATE_A					1
+#define CP_STATE_B					2
+#define CP_STATE_C					3
+#define CP_STATE_D					4
+#define CP_STATE_E					5
+#define CP_STATE_F					6
+
+struct SysConfigAndInfo				*ShmSysConfigAndInfo;
+struct StatusCodeData 				*ShmStatusCodeData;
+struct PsuData 						*ShmPsuData ;
+struct OCPP16Data 					*ShmOCPP16Data;
+
+#define MACROSTR(k) #k
+
+//ConfigurationMaxKeys
+#define GetConfigurationMaxKeysNUM 	43
+
+pthread_mutex_t lock 				= PTHREAD_MUTEX_INITIALIZER;
+char queuedata[2600]				= {0};
+
+//=================================
+//  StatusNotification cycle
+//=================================
+static int server_cycle_Status 		= 120;
+
+//===============================
+// Configuration: unknownkey
+//===============================
+static char unknownkey[10][20]		= {0};
+static int UnknownKeynum 			= 0;
+
+//===============================
+// Gun Total  Numbers
+//===============================
+static int gunTotalNumber			= 0;
+static unsigned char gunType[4] 	= {0};
+
+//===============================
+// Local List Version
+//===============================
+static int localversion=0;
+static char idTagAuthorization[32]	= {0};
+
+//===============================
+// OCPP sign variable
+//===============================
+static int server_sign				= FALSE;
+int server_pending 					= FALSE;
+int PRE_SYS_MODE[CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY + AC_QUANTITY];
+static int BootNotificationInterval = 0;
+static int SystemInitial 			= 0;//= CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY;	// System Boot UP
+
+//===============================
+// OCPP auth variable
+//===============================
+static int authorizeRetryTimes 		= 0;  //number of  Retry times
+
+//===============================
+// OCPP other variables
+//===============================
+//int isUpdateRequest = FALSE;
+static int HeartBeatWaitTime 						= 10;
+static int FirstHeartBeat 							= 0;
+static int FirmwareStatusNotificationStatus 		= FIRMWARE_STATUS_IDLE;  // Idle
+static int DiagnosticsStatusNotificationStatus 		= DIAGNOSTIC_STATUS_IDLE; // Idle
+static char CurrentChargingProfileScheduleStr[30]	= {0};
+
+//========================================
+// OCPP status/previous related variables
+//========================================
+static int GunStatusInterval 															= 10;
+static int statusModeChage[CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY + AC_QUANTITY] 	= {FALSE};
+static int ChademoPreviousSystemStatus[CHAdeMO_QUANTITY];
+static int CcsPreviousSystemStatus[CCS_QUANTITY];
+static int GbPreviousSystemStatus[GB_QUANTITY];
+static int AcPreviousSystemStatus[AC_QUANTITY];
+static int ChademoPreviousConnectorPlugIn[CHAdeMO_QUANTITY];
+static int CcsPreviousConnectorPlugIn[CCS_QUANTITY];
+static int GbPreviousConnectorPlugIn[GB_QUANTITY];
+static int AcPreviousConnectorPlugIn[AC_QUANTITY];
+static int TransactionMessageAttemptsValue 												= 0;
+static int TransactionMessageRetryIntervalValue 										= 0;
+static int TempMeterValueInterval 														= 0;
+static struct OCPPAuthLocalElemet
+{
+	int listVersionInt;
+	char idTagstr[20];
+	char parentIdTag[20];
+	char expiryDate[30];
+	char idTagstatus[16];
+}idTagQuery;
+
+//=============================================
+// OCPP HeartBeat Response Not Receive Counts
+//============================================
+static int HeartBeatWithNOResponse = 0;
+static int HeartBeatCountPerHour = 0;
+
+extern void  ChageWebSocketPingInterval(int WebSocketPingInterval);
+extern int GetTransactionQueueNum(void);
+extern pthread_mutex_t mutex1;
+extern struct Charger_Info Charger;
+extern sqlite3 *db;
+
+int TransactionMessageAttemptsGet(void);
+int TransactionMessageRetryIntervalGet(void);
+int GetOcppConnStatus(void);
+void SetOcppConnStatus(uint8_t status);
+int setKeyValue(char *key, char *value);
+void OCPP_get_TableAuthlocalAllData(void);
+void processUnkownKey(void);
+
+struct StructOCPPMeterValue
+{
+	unsigned char 				TimeStamp[28];
+	struct StructSampledValue	SampledValue[10];
+};
+
+struct ClientTime
+{
+	unsigned int Heartbeat;
+	unsigned int StatusNotification[CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY + AC_QUANTITY];
+	unsigned int StartTransaction;
+	unsigned int StopTransaction;
+	unsigned int MeterValues[CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY + AC_QUANTITY];
+
+}clientTime;
+
+typedef union
+{
+	//Operations Initiated by Central System
+	unsigned char CsMsgValue[CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY + AC_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 + AC_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;
+
+#if 0
+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)
+};
+#endif
+
+/*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)
+};
+
+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};
+
+
+//==========================================
+// GetCompositeSchedule logic related function
+//==========================================
+int DiffTimebSec(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);
+}
+
+int DiffTimebWithNowSec(struct timeb ST)
+{
+	//return milli-second
+	struct timeb ET;
+	unsigned int StartTime,StopTime;
+
+	ftime(&ET);
+	StartTime=(unsigned int)ST.time;
+	StopTime=(unsigned int)ET.time;
+	return (StopTime-StartTime);
+}
+
+int getStartStop(uint8_t *start, uint8_t *stop)
+{
+	int result = -1;
+	struct tm tmStart;
+	struct timeb tbStart;
+	struct tm tmStop;
+	struct timeb tbStop;
+
+
+	if((sscanf((char*)start, "%4d-%2d-%2dT%2d:%2d:%2d", &tmStart.tm_year, &tmStart.tm_mon, &tmStart.tm_mday, &tmStart.tm_hour, &tmStart.tm_min, &tmStart.tm_sec) == 6) &&
+	   (sscanf((char*)stop, "%4d-%2d-%2dT%2d:%2d:%2d", &tmStop.tm_year, &tmStop.tm_mon, &tmStop.tm_mday, &tmStop.tm_hour, &tmStop.tm_min, &tmStop.tm_sec) == 6))
+	{
+		tmStart.tm_year -= 1900;
+		tmStart.tm_mon -= 1;
+		tbStart.time = mktime(&tmStart);
+		tbStart.millitm = 0;
+
+		tmStop.tm_year -= 1900;
+		tmStop.tm_mon -= 1;
+		tbStop.time = mktime(&tmStop);
+		tbStop.millitm = 0;
+
+		result = DiffTimebSec(tbStart, tbStop);
+	}
+	else
+	{
+		DEBUG_WARN("Start or stop date parsing error.\r\n");
+	}
+
+	return result;
+}
+
+int getStartSinceToday(uint8_t *stop)
+{
+	int result = -1;
+	time_t t;
+	struct tm *tmStartToday;
+	struct timeb tbStartToday;
+	struct tm tmStop;
+	struct timeb tbStop;
+
+	if((sscanf((char*)stop, "%4d-%2d-%2dT%2d:%2d:%2d", &tmStop.tm_year, &tmStop.tm_mon, &tmStop.tm_mday, &tmStop.tm_hour, &tmStop.tm_min, &tmStop.tm_sec) == 6))
+	{
+		t=time(NULL);
+		tmStartToday=localtime(&t);
+		tmStartToday->tm_hour = 0;
+		tmStartToday->tm_min = 0;
+		tmStartToday->tm_sec = 0;
+		tbStartToday.time = mktime(tmStartToday);
+
+		tmStop.tm_year -= 1900;
+		tmStop.tm_mon -= 1;
+		tbStop.time = mktime(&tmStop);
+		tbStop.millitm = 0;
+
+		result = DiffTimebSec(tbStartToday, tbStop);
+	}
+
+	return result;
+}
+
+int getStartSinceWeek(uint8_t *stop)
+{
+	int result = -1;
+	time_t t;
+	struct tm *tmStartWeek;
+	struct timeb tbStartWeek;
+	struct tm tmStop;
+	struct timeb tbStop;
+
+	if((sscanf((char*)stop, "%4d-%2d-%2dT%2d:%2d:%2d", &tmStop.tm_year, &tmStop.tm_mon, &tmStop.tm_mday, &tmStop.tm_hour, &tmStop.tm_min, &tmStop.tm_sec) == 6))
+	{
+		t=time(NULL);
+		tmStartWeek=localtime(&t);
+		t-=86400*tmStartWeek->tm_wday;
+		tmStartWeek=localtime(&t);
+
+		tmStartWeek->tm_hour = 0;
+		tmStartWeek->tm_min = 0;
+		tmStartWeek->tm_sec = 0;
+		tbStartWeek.time = mktime(tmStartWeek);
+
+		tmStop.tm_year -= 1900;
+		tmStop.tm_mon -= 1;
+		tbStop.time = mktime(&tmStop);
+		tbStop.millitm = 0;
+
+		result = DiffTimebSec(tbStartWeek, tbStop);
+	}
+
+	return result;
+}
+
+void checkCompositeSchedule(uint8_t connectorId, uint32_t durationReq, struct StructChargingProfile *compositeProfile)
+{
+	FILE *fp;
+	char profileFileName[128];
+	char *line = NULL;
+	size_t len = 0;
+	time_t CurrentTime;
+	struct tm *tmComposite;
+
+	struct StructChargingProfile maxProfile;
+	struct StructChargingProfile defaultTxProfile;
+	struct StructChargingProfile txProfile;
+
+	struct StructChargingSchedulePeriod tmpPeriod;
+	uint8_t limitMax=0;
+	uint8_t limitDef=0;
+	uint8_t limitTx=0;
+
+	int compositePeriodIdx = 0;
+
+	CurrentTime = time(NULL);
+	tmComposite=localtime(&CurrentTime);
+	sprintf((char*)compositeProfile->ChargingSchedule.StartSchedule, "%04d-%02d-%02dT%02d:%02d:%02dZ", tmComposite->tm_year+1900, tmComposite->tm_mon+1, tmComposite->tm_mday, tmComposite->tm_hour, tmComposite->tm_min, tmComposite->tm_sec);
+	sprintf((char*)compositeProfile->ChargingSchedule.ChargingRateUnit, "A");
+	compositeProfile->ChargingSchedule.Duration = durationReq;
+	for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(compositeProfile->ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
+	{
+		compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = -1;
+		compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = -1;
+		compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = 3;
+	}
+	compositeProfile->ChargingProfileId = 1;
+	compositeProfile->StackLevel = 99 ;
+	sprintf((char*)compositeProfile->ChargingProfileKind ,"Absolute");
+
+	maxProfile.ChargingProfileId = -1;
+	defaultTxProfile.ChargingProfileId = -1;
+	txProfile.ChargingProfileId = -1;
+
+	system("yes|rm /tmp/*.json");
+	system("cp /Storage/OCPP/*.json /tmp");
+	/*
+	 * Search valid charging profile
+	 */
+	//DEBUG_INFO("====================================\n");
+	// Search max profile
+	sprintf(profileFileName, "/tmp/ChargePointMaxProfile.json");
+	if((access(profileFileName, F_OK))!=-1)
+	{
+		fp = fopen(profileFileName, "r");
+
+		for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(maxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
+		{
+			maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = -1;
+			maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = -1;
+			maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = 3;
+		}
+		maxProfile.ChargingProfileId = -1;
+		maxProfile.StackLevel = -1;
+
+		while(getline(&line, &len, fp) != -1)
+		{
+			json_object *obj = NULL;
+
+			obj = json_tokener_parse(line);
+			if(is_error(obj))
+			{
+				DEBUG_ERROR("Parse MaxProfile from file error.\n");
+			}
+			else
+			{
+				if((json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "ChargingProfileId")) != maxProfile.ChargingProfileId) &&
+				   (json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "stackLevel")) >= maxProfile.StackLevel)
+				  )
+				{
+					if((json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom") != NULL) &&
+					   (json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo") != NULL)
+					  )
+					{
+						struct tm tmFrom, tmTo;
+						struct timeb tbFrom, tbTo;
+
+						if((sscanf((char*)json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom")), "%4d-%2d-%2dT%2d:%2d:%2d", &tmFrom.tm_year, &tmFrom.tm_mon, &tmFrom.tm_mday, &tmFrom.tm_hour, &tmFrom.tm_min, &tmFrom.tm_sec) == 6) &&
+						   (sscanf((char*)json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo")), "%4d-%2d-%2dT%2d:%2d:%2d", &tmTo.tm_year, &tmTo.tm_mon, &tmTo.tm_mday, &tmTo.tm_hour, &tmTo.tm_min, &tmTo.tm_sec) == 6))
+						{
+							tmFrom.tm_year -= 1900;
+							tmFrom.tm_mon -= 1;
+							tbFrom.time = mktime(&tmFrom);
+
+							tmTo.tm_year -= 1900;
+							tmTo.tm_mon -= 1;
+							tbTo.time = mktime(&tmTo);
+
+							if((DiffTimebWithNowSec(tbFrom)>=0) && (DiffTimebWithNowSec(tbTo)<=0))
+							{
+								if(maxProfile.ChargingProfileId == -1)
+									DEBUG_INFO("MaxProfile found.\n");
+								else
+									DEBUG_INFO("MaxProfile updated.\n");
+
+								// Required item
+								maxProfile.ChargingProfileId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileId"));
+								maxProfile.StackLevel = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "stackLevel"));
+								sprintf((char*)maxProfile.ChargingProfileKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileKind")));
+								sprintf((char*)maxProfile.ChargingSchedule.ChargingRateUnit, "A");
+
+								for(int idxPeriod=0;idxPeriod<json_object_array_length(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"));idxPeriod++)
+								{
+									maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "startPeriod"));
+									maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = (strstr(json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingRateUnit")),"W")!=NULL?json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit"))/220:json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit")));
+									maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = (json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")==NULL?
+																												  3:
+																												  json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")));
+								}
+
+								// Optional item
+								if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom") != NULL)
+								{
+									sprintf((char*)maxProfile.ValidFrom, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom")));
+								}
+								else
+								{
+									sprintf((char*)maxProfile.ValidFrom, " ");
+								}
+
+								if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo") != NULL)
+								{
+									sprintf((char*)maxProfile.ValidTo, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo")));
+								}
+								else
+								{
+									sprintf((char*)maxProfile.ValidTo, " ");
+								}
+
+								if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind") != NULL)
+								{
+									sprintf((char*)maxProfile.RecurrencyKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind")));
+								}
+								else
+								{
+									sprintf((char*)maxProfile.RecurrencyKind, " ");
+								}
+
+								if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId") != NULL)
+								{
+									maxProfile.TransactionId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId"));
+								}
+								else
+								{
+									maxProfile.TransactionId = -1;
+								}
+
+								if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration") != NULL)
+								{
+									maxProfile.ChargingSchedule.Duration = json_object_get_int(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration"));
+								}
+								else
+								{
+									maxProfile.ChargingSchedule.Duration = -1;
+								}
+
+								if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule") != NULL)
+								{
+									sprintf((char*)maxProfile.ChargingSchedule.StartSchedule, "%s", json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule")));
+								}
+								else
+								{
+									sprintf((char*)maxProfile.ChargingSchedule.StartSchedule, " ");
+								}
+
+								if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate") != NULL)
+								{
+									maxProfile.ChargingSchedule.MinChargingRate = json_object_get_double(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate"));
+								}
+								else
+								{
+									maxProfile.ChargingSchedule.MinChargingRate = -1;
+								}
+							}
+						}
+					}
+					else
+					{
+						if(maxProfile.ChargingProfileId == -1)
+							DEBUG_INFO("MaxProfile found.\n");
+						else
+							DEBUG_INFO("MaxProfile updated.\n");
+
+						// Required item
+						maxProfile.ChargingProfileId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileId"));
+						maxProfile.StackLevel = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "stackLevel"));
+						sprintf((char*)maxProfile.ChargingProfileKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileKind")));
+						sprintf((char*)maxProfile.ChargingSchedule.ChargingRateUnit, "A");
+
+						for(int idxPeriod=0;idxPeriod<json_object_array_length(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"));idxPeriod++)
+						{
+							maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "startPeriod"));
+							maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = (strstr((char*)json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingRateUnit")),"W")!=NULL?json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit"))/220:json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit")));
+							maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = (json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")==NULL?
+																										  3:
+																										  json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")));
+						}
+
+						// Optional item
+						if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom") != NULL)
+						{
+							sprintf((char*)maxProfile.ValidFrom, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom")));
+						}
+						else
+						{
+							sprintf((char*)maxProfile.ValidFrom, " ");
+						}
+
+						if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo") != NULL)
+						{
+							sprintf((char*)maxProfile.ValidTo, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo")));
+						}
+						else
+						{
+							sprintf((char*)maxProfile.ValidTo, " ");
+						}
+
+						if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind") != NULL)
+						{
+							sprintf((char*)maxProfile.RecurrencyKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind")));
+						}
+						else
+						{
+							sprintf((char*)maxProfile.RecurrencyKind, " ");
+						}
+
+						if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId") != NULL)
+						{
+							maxProfile.TransactionId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId"));
+						}
+						else
+						{
+							maxProfile.TransactionId = -1;
+						}
+
+						if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration") != NULL)
+						{
+							maxProfile.ChargingSchedule.Duration = json_object_get_int(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration"));
+						}
+						else
+						{
+							maxProfile.ChargingSchedule.Duration = -1;
+						}
+
+						if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule") != NULL)
+						{
+							sprintf((char*)maxProfile.ChargingSchedule.StartSchedule, "%s", json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule")));
+						}
+						else
+						{
+							sprintf((char*)maxProfile.ChargingSchedule.StartSchedule, " ");
+						}
+
+						if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate") != NULL)
+						{
+							maxProfile.ChargingSchedule.MinChargingRate = json_object_get_double(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate"));
+						}
+						else
+						{
+							maxProfile.ChargingSchedule.MinChargingRate = -1;
+						}
+					}
+				}
+			}
+			json_object_put(obj);
+		}
+		fclose(fp);
+/*
+		if(maxProfile.ChargingProfileId !=-1)
+		{
+			DEBUG_INFO("Profile ID: %d\n", maxProfile.ChargingProfileId);
+			DEBUG_INFO("Profile stackLevel: %d\n", maxProfile.StackLevel);
+			DEBUG_INFO("Profile TransactionId: %d\n", maxProfile.TransactionId);
+			DEBUG_INFO("Profile valid from: %s\n", maxProfile.ValidFrom);
+			DEBUG_INFO("Profile valid to: %s\n", maxProfile.ValidTo);
+			DEBUG_INFO("Profile ChargingProfileKind: %s\n", maxProfile.ChargingProfileKind);
+			DEBUG_INFO("Profile RecurrencyKind: %s\n", maxProfile.RecurrencyKind);
+
+			DEBUG_INFO("Profile start schedule: %s\n", maxProfile.ChargingSchedule.StartSchedule);
+			DEBUG_INFO("Profile schedule duration: %d\n", maxProfile.ChargingSchedule.Duration);
+			DEBUG_INFO("Profile charging rate unit: %s\n", maxProfile.ChargingSchedule.ChargingRateUnit);
+			DEBUG_INFO("Profile charging min rate: %f\n", maxProfile.ChargingSchedule.MinChargingRate);
+
+			for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(maxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
+			{
+				if(maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod >= 0)
+				{
+					DEBUG_INFO("Period-%02d startPeriod: %d\n", idxPeriod, maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod);
+					DEBUG_INFO("Period-%02d limit: %f\n", idxPeriod, maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit);
+					DEBUG_INFO("Period-%02d NumberPhases: %d\n", idxPeriod, maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases);
+				}
+			}
+		}
+		else
+			DEBUG_INFO("MaxProfile not found.\n");
+		DEBUG_INFO("------------------------------------\n");*/
+	}
+
+	// Search default tx profile
+	sprintf(profileFileName, "/tmp/TxDefaultProfile_%d.json", connectorId);
+	if((access(profileFileName, F_OK))==-1)
+		sprintf(profileFileName, "/tmp/TxDefaultProfile_0.json");
+
+	if((access(profileFileName, F_OK))!=-1)
+	{
+		fp = fopen(profileFileName, "r");
+
+		for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
+		{
+			defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = -1;
+			defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = -1;
+			defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = 3;
+		}
+		defaultTxProfile.ChargingProfileId = -1;
+		defaultTxProfile.StackLevel = -1;
+
+		while(getline(&line, &len, fp) != -1)
+		{
+			json_object *obj = NULL;
+
+			obj = json_tokener_parse(line);
+			if(is_error(obj))
+			{
+				DEBUG_ERROR("Parse TxDefaultProfile from file error.\n");
+			}
+			else
+			{
+				if((json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "ChargingProfileId")) != defaultTxProfile.ChargingProfileId) &&
+				   (json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "stackLevel")) >= defaultTxProfile.StackLevel)
+				  )
+				{
+					if((json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom") != NULL) &&
+					   (json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo") != NULL)
+					  )
+					{
+						struct tm tmFrom, tmTo;
+						struct timeb tbFrom, tbTo;
+
+						if((sscanf((char*)json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom")), "%4d-%2d-%2dT%2d:%2d:%2d", &tmFrom.tm_year, &tmFrom.tm_mon, &tmFrom.tm_mday, &tmFrom.tm_hour, &tmFrom.tm_min, &tmFrom.tm_sec) == 6) &&
+						   (sscanf((char*)json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo")), "%4d-%2d-%2dT%2d:%2d:%2d", &tmTo.tm_year, &tmTo.tm_mon, &tmTo.tm_mday, &tmTo.tm_hour, &tmTo.tm_min, &tmTo.tm_sec) == 6))
+						{
+							tmFrom.tm_year -= 1900;
+							tmFrom.tm_mon -= 1;
+							tbFrom.time = mktime(&tmFrom);
+
+							tmTo.tm_year -= 1900;
+							tmTo.tm_mon -= 1;
+							tbTo.time = mktime(&tmTo);
+
+							if((DiffTimebWithNowSec(tbFrom)>=0) && (DiffTimebWithNowSec(tbTo)<=0))
+							{
+								if(defaultTxProfile.ChargingProfileId == -1)
+									DEBUG_INFO("TxDefaultProfile found.\n");
+								else
+									DEBUG_INFO("TxDefaultProfile updated.\n");
+
+								// Required item
+								defaultTxProfile.ChargingProfileId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileId"));
+								defaultTxProfile.StackLevel = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "stackLevel"));
+								sprintf((char*)defaultTxProfile.ChargingProfileKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileKind")));
+								sprintf((char*)defaultTxProfile.ChargingSchedule.ChargingRateUnit, "A");
+
+								for(int idxPeriod=0;idxPeriod<json_object_array_length(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"));idxPeriod++)
+								{
+									defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "startPeriod"));
+									defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = (strstr(json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingRateUnit")),"W")!=NULL?json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit"))/220:json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit")));
+									defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = (json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")==NULL?
+																												  3:
+																												  json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")));
+								}
+
+								// Optional item
+								if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom") != NULL)
+								{
+									sprintf((char*)defaultTxProfile.ValidFrom, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom")));
+								}
+								else
+								{
+									sprintf((char*)defaultTxProfile.ValidFrom, " ");
+								}
+
+								if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo") != NULL)
+								{
+									sprintf((char*)defaultTxProfile.ValidTo, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo")));
+								}
+								else
+								{
+									sprintf((char*)defaultTxProfile.ValidTo, " ");
+								}
+
+								if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind") != NULL)
+								{
+									sprintf((char*)defaultTxProfile.RecurrencyKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind")));
+								}
+								else
+								{
+									sprintf((char*)defaultTxProfile.RecurrencyKind, " ");
+								}
+
+								if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId") != NULL)
+								{
+									defaultTxProfile.TransactionId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId"));
+								}
+								else
+								{
+									defaultTxProfile.TransactionId = -1;
+								}
+
+								if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration") != NULL)
+								{
+									defaultTxProfile.ChargingSchedule.Duration = json_object_get_int(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration"));
+								}
+								else
+								{
+									defaultTxProfile.ChargingSchedule.Duration = -1;
+								}
+
+								if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule") != NULL)
+								{
+									sprintf((char*)defaultTxProfile.ChargingSchedule.StartSchedule, "%s", json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule")));
+								}
+								else
+								{
+									sprintf((char*)defaultTxProfile.ChargingSchedule.StartSchedule, " ");
+								}
+
+								if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate") != NULL)
+								{
+									defaultTxProfile.ChargingSchedule.MinChargingRate = json_object_get_double(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate"));
+								}
+								else
+								{
+									defaultTxProfile.ChargingSchedule.MinChargingRate = -1;
+								}
+							}
+						}
+					}
+					else
+					{
+						if(defaultTxProfile.ChargingProfileId == -1)
+							DEBUG_INFO("TxDefaultProfile found.\n");
+						else
+							DEBUG_INFO("TxDefaultProfile updated.\n");
+
+						// Required item
+						defaultTxProfile.ChargingProfileId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileId"));
+						defaultTxProfile.StackLevel = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "stackLevel"));
+						sprintf((char*)defaultTxProfile.ChargingProfileKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileKind")));
+						sprintf((char*)defaultTxProfile.ChargingSchedule.ChargingRateUnit, "A");
+
+						for(int idxPeriod=0;idxPeriod<json_object_array_length(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"));idxPeriod++)
+						{
+							defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "startPeriod"));
+							defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = (strstr(json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingRateUnit")),"W")!=NULL?json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit"))/220:json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit")));
+							defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = (json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")==NULL?
+																										  3:
+																										  json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")));
+						}
+
+						// Optional item
+						if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom") != NULL)
+						{
+							sprintf((char*)defaultTxProfile.ValidFrom, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom")));
+						}
+						else
+						{
+							sprintf((char*)defaultTxProfile.ValidFrom, " ");
+						}
+
+						if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo") != NULL)
+						{
+							sprintf((char*)defaultTxProfile.ValidTo, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo")));
+						}
+						else
+						{
+							sprintf((char*)defaultTxProfile.ValidTo, " ");
+						}
+
+						if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind") != NULL)
+						{
+							sprintf((char*)defaultTxProfile.RecurrencyKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind")));
+						}
+						else
+						{
+							sprintf((char*)defaultTxProfile.RecurrencyKind, " ");
+						}
+
+						if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId") != NULL)
+						{
+							defaultTxProfile.TransactionId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId"));
+						}
+						else
+						{
+							defaultTxProfile.TransactionId = -1;
+						}
+
+						if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration") != NULL)
+						{
+							defaultTxProfile.ChargingSchedule.Duration = json_object_get_int(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration"));
+						}
+						else
+						{
+							defaultTxProfile.ChargingSchedule.Duration = -1;
+						}
+
+						if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule") != NULL)
+						{
+							sprintf((char*)defaultTxProfile.ChargingSchedule.StartSchedule, "%s", json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule")));
+						}
+						else
+						{
+							sprintf((char*)defaultTxProfile.ChargingSchedule.StartSchedule, " ");
+						}
+
+						if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate") != NULL)
+						{
+							maxProfile.ChargingSchedule.MinChargingRate = json_object_get_double(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate"));
+						}
+						else
+						{
+							maxProfile.ChargingSchedule.MinChargingRate = -1;
+						}
+					}
+				}
+			}
+			json_object_put(obj);
+		}
+		fclose(fp);
+/*
+		if(defaultTxProfile.ChargingProfileId != -1)
+		{
+			DEBUG_INFO("Profile ID: %d\n", defaultTxProfile.ChargingProfileId);
+			DEBUG_INFO("Profile stackLevel: %d\n", defaultTxProfile.StackLevel);
+			DEBUG_INFO("Profile TransactionId: %d\n", defaultTxProfile.TransactionId);
+			DEBUG_INFO("Profile valid from: %s\n", defaultTxProfile.ValidFrom);
+			DEBUG_INFO("Profile valid to: %s\n", defaultTxProfile.ValidTo);
+			DEBUG_INFO("Profile ChargingProfileKind: %s\n", defaultTxProfile.ChargingProfileKind);
+			DEBUG_INFO("Profile RecurrencyKind: %s\n", defaultTxProfile.RecurrencyKind);
+
+			DEBUG_INFO("Profile start schedule: %s\n", defaultTxProfile.ChargingSchedule.StartSchedule);
+			DEBUG_INFO("Profile schedule duration: %d\n", defaultTxProfile.ChargingSchedule.Duration);
+			DEBUG_INFO("Profile charging rate unit: %s\n", defaultTxProfile.ChargingSchedule.ChargingRateUnit);
+			DEBUG_INFO("Profile charging min rate: %f\n", defaultTxProfile.ChargingSchedule.MinChargingRate);
+
+			for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
+			{
+				if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod >= 0)
+				{
+					DEBUG_INFO("Period-%02d startPeriod: %d\n", idxPeriod, defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod);
+					DEBUG_INFO("Period-%02d limit: %f\n", idxPeriod, defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit);
+					DEBUG_INFO("Period-%02d NumberPhases: %d\n", idxPeriod, defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases);
+				}
+			}
+		}
+		else
+			DEBUG_INFO("TxDefaultProfile not found.\n");
+
+		DEBUG_INFO("------------------------------------\n");*/
+	}
+
+	// Search tx profile
+	sprintf(profileFileName, "/tmp/TxProfile_%d.json", connectorId);
+	if((access(profileFileName, F_OK))!=-1)
+	{
+		fp = fopen(profileFileName, "r");
+
+		for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(txProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
+		{
+			txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = -1;
+			txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = -1;
+			txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = 3;
+		}
+		txProfile.ChargingProfileId = -1;
+		txProfile.StackLevel = -1;
+
+		while(getline(&line, &len, fp) != -1)
+		{
+			json_object *obj = NULL;
+
+			obj = json_tokener_parse(line);
+			if(is_error(obj))
+			{
+				DEBUG_ERROR("Parse txProfile from file error.\n");
+			}
+			else
+			{
+				if((json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "ChargingProfileId")) != txProfile.ChargingProfileId) &&
+				   (json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "stackLevel")) >= txProfile.StackLevel)
+				  )
+				{
+					if((json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom") != NULL) &&
+					   (json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo") != NULL)
+					  )
+					{
+						struct tm tmFrom, tmTo;
+						struct timeb tbFrom, tbTo;
+
+						if((sscanf((char*)json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom")), "%4d-%2d-%2dT%2d:%2d:%2d", &tmFrom.tm_year, &tmFrom.tm_mon, &tmFrom.tm_mday, &tmFrom.tm_hour, &tmFrom.tm_min, &tmFrom.tm_sec) == 6) &&
+						   (sscanf((char*)json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo")), "%4d-%2d-%2dT%2d:%2d:%2d", &tmTo.tm_year, &tmTo.tm_mon, &tmTo.tm_mday, &tmTo.tm_hour, &tmTo.tm_min, &tmTo.tm_sec) == 6))
+						{
+							tmFrom.tm_year -= 1900;
+							tmFrom.tm_mon -= 1;
+							tbFrom.time = mktime(&tmFrom);
+
+							tmTo.tm_year -= 1900;
+							tmTo.tm_mon -= 1;
+							tbTo.time = mktime(&tmTo);
+
+							if((DiffTimebWithNowSec(tbFrom)>=0) && (DiffTimebWithNowSec(tbTo)<=0))
+							{
+								if(txProfile.ChargingProfileId == -1)
+									DEBUG_INFO("TxProfile found.\n");
+								else
+									DEBUG_INFO("TxProfile updated.\n");
+
+								// Required item
+								txProfile.ChargingProfileId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileId"));
+								txProfile.StackLevel = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "stackLevel"));
+								sprintf((char*)txProfile.ChargingProfileKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileKind")));
+								sprintf((char*)txProfile.ChargingSchedule.ChargingRateUnit, "A");
+
+								for(int idxPeriod=0;idxPeriod<json_object_array_length(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"));idxPeriod++)
+								{
+									txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "startPeriod"));
+									txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = (strstr(json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingRateUnit")),"W")!=NULL?json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit"))/220:json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit")));
+									txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = (json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")==NULL?
+																												  3:
+																												  json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")));
+								}
+
+								// Optional item
+								if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom") != NULL)
+								{
+									sprintf((char*)txProfile.ValidFrom, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom")));
+								}
+								else
+								{
+									sprintf((char*)txProfile.ValidFrom, " ");
+								}
+
+								if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo") != NULL)
+								{
+									sprintf((char*)txProfile.ValidTo, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo")));
+								}
+								else
+								{
+									sprintf((char*)txProfile.ValidTo, " ");
+								}
+
+								if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind") != NULL)
+								{
+									sprintf((char*)txProfile.RecurrencyKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind")));
+								}
+								else
+								{
+									sprintf((char*)txProfile.RecurrencyKind, " ");
+								}
+
+								if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId") != NULL)
+								{
+									txProfile.TransactionId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId"));
+								}
+								else
+								{
+									txProfile.TransactionId = -1;
+								}
+
+								if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration") != NULL)
+								{
+									txProfile.ChargingSchedule.Duration = json_object_get_int(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration"));
+								}
+								else
+								{
+									txProfile.ChargingSchedule.Duration = -1;
+								}
+
+								if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule") != NULL)
+								{
+									sprintf((char*)txProfile.ChargingSchedule.StartSchedule, "%s", json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule")));
+								}
+								else
+								{
+									sprintf((char*)txProfile.ChargingSchedule.StartSchedule, " ");
+								}
+
+								if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate") != NULL)
+								{
+									txProfile.ChargingSchedule.MinChargingRate = json_object_get_double(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate"));
+								}
+								else
+								{
+									txProfile.ChargingSchedule.MinChargingRate = -1;
+								}
+							}
+						}
+					}
+					else
+					{
+						if(txProfile.ChargingProfileId == -1)
+							DEBUG_INFO("TxProfile found.\n");
+						else
+							DEBUG_INFO("TxProfile updated.\n");
+
+						// Required item
+						txProfile.ChargingProfileId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileId"));
+						txProfile.StackLevel = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "stackLevel"));
+						sprintf((char*)txProfile.ChargingProfileKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileKind")));
+						sprintf((char*)txProfile.ChargingSchedule.ChargingRateUnit, "A");
+
+						for(int idxPeriod=0;idxPeriod<json_object_array_length(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"));idxPeriod++)
+						{
+							txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "startPeriod"));
+							txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = (strstr(json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingRateUnit")),"W")!=NULL?json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit"))/220:json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit")));
+							txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = (json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")==NULL?
+																										  3:
+																										  json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")));
+						}
+
+						// Optional item
+						if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom") != NULL)
+						{
+							sprintf((char*)txProfile.ValidFrom, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom")));
+						}
+						else
+						{
+							sprintf((char*)txProfile.ValidFrom, " ");
+						}
+
+						if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo") != NULL)
+						{
+							sprintf((char*)txProfile.ValidTo, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo")));
+						}
+						else
+						{
+							sprintf((char*)txProfile.ValidTo, " ");
+						}
+
+						if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind") != NULL)
+						{
+							sprintf((char*)txProfile.RecurrencyKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind")));
+						}
+						else
+						{
+							sprintf((char*)txProfile.RecurrencyKind, " ");
+						}
+
+						if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId") != NULL)
+						{
+							txProfile.TransactionId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId"));
+						}
+						else
+						{
+							txProfile.TransactionId = -1;
+						}
+
+						if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration") != NULL)
+						{
+							txProfile.ChargingSchedule.Duration = json_object_get_int(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration"));
+						}
+						else
+						{
+							txProfile.ChargingSchedule.Duration = -1;
+						}
+
+						if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule") != NULL)
+						{
+							sprintf((char*)txProfile.ChargingSchedule.StartSchedule, "%s", json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule")));
+						}
+						else
+						{
+							sprintf((char*)txProfile.ChargingSchedule.StartSchedule, " ");
+						}
+
+						if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate") != NULL)
+						{
+							maxProfile.ChargingSchedule.MinChargingRate = json_object_get_double(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate"));
+						}
+						else
+						{
+							maxProfile.ChargingSchedule.MinChargingRate = -1;
+						}
+					}
+				}
+			}
+			json_object_put(obj);
+		}
+		fclose(fp);
+/*
+		if(defaultTxProfile.ChargingProfileId != -1)
+		{
+			DEBUG_INFO("Profile ID: %d\n", txProfile.ChargingProfileId);
+			DEBUG_INFO("Profile stackLevel: %d\n", txProfile.StackLevel);
+			DEBUG_INFO("Profile TransactionId: %d\n", txProfile.TransactionId);
+			DEBUG_INFO("Profile valid from: %s\n", txProfile.ValidFrom);
+			DEBUG_INFO("Profile valid to: %s\n", txProfile.ValidTo);
+			DEBUG_INFO("Profile ChargingProfileKind: %s\n", txProfile.ChargingProfileKind);
+			DEBUG_INFO("Profile RecurrencyKind: %s\n", txProfile.RecurrencyKind);
+
+			DEBUG_INFO("Profile start schedule: %s\n", txProfile.ChargingSchedule.StartSchedule);
+			DEBUG_INFO("Profile schedule duration: %d\n", txProfile.ChargingSchedule.Duration);
+			DEBUG_INFO("Profile charging rate unit: %s\n", txProfile.ChargingSchedule.ChargingRateUnit);
+			DEBUG_INFO("Profile charging min rate: %f\n", txProfile.ChargingSchedule.MinChargingRate);
+
+			for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(txProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
+			{
+				if(txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod >= 0)
+				{
+					DEBUG_INFO("Period-%02d startPeriod: %d\n", idxPeriod, txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod);
+					DEBUG_INFO("Period-%02d limit: %f\n", idxPeriod, txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit);
+					DEBUG_INFO("Period-%02d NumberPhases: %d\n", idxPeriod, txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases);
+				}
+			}
+		}
+		else
+			DEBUG_INFO("TxProfile not found.\n");*/
+	}
+
+	/*
+	 * Align found profile start schedule & periods
+	 */
+	//DEBUG_INFO("====================================\n");
+	/*
+	// For local test usage, force modify found profile start schedule info
+	sprintf((char*)maxProfile.ChargingSchedule.StartSchedule, "%04d-%02d-%02dT%02d:%02d:%02dZ", tmComposite->tm_year+1900, tmComposite->tm_mon+1, tmComposite->tm_mday, tmComposite->tm_hour, tmComposite->tm_min, tmComposite->tm_sec-10);
+	sprintf((char*)defaultTxProfile.ChargingSchedule.StartSchedule, "%04d-%02d-%02dT%02d:%02d:%02dZ", tmComposite->tm_year+1900, tmComposite->tm_mon+1, tmComposite->tm_mday, tmComposite->tm_hour, tmComposite->tm_min, tmComposite->tm_sec-5);
+	sprintf((char*)txProfile.ChargingSchedule.StartSchedule, "%04d-%02d-%02dT%02d:%02d:%02dZ", tmComposite->tm_year+1900, tmComposite->tm_mon+1, tmComposite->tm_mday, tmComposite->tm_hour, tmComposite->tm_min, tmComposite->tm_sec-3);
+*/
+
+	if(maxProfile.ChargingProfileId != -1)
+	{
+		if(strstr((char*)maxProfile.ChargingProfileKind, "Absolute") != NULL)
+		{
+			if(maxProfile.ChargingSchedule.Duration != -1)
+			{
+				maxProfile.ChargingSchedule.Duration = ((maxProfile.ChargingSchedule.Duration-getStartStop(maxProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule))<0?
+														0:
+														(maxProfile.ChargingSchedule.Duration-getStartStop(maxProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule)));
+			}
+
+			for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(maxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
+			{
+				if(maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
+				{
+					maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = ((maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(maxProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule))<0?
+																								 0:
+																								 (maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(maxProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule)));
+				}
+			}
+		}
+		else if(strstr((char*)maxProfile.ChargingProfileKind, "Relative") != NULL)
+		{
+			if(maxProfile.ChargingSchedule.Duration != -1)
+			{
+				maxProfile.ChargingSchedule.Duration = (strstr((char*)ShmOCPP16Data->StatusNotification[(connectorId==0?0:connectorId-1)].Status, "Charging")==NULL)?maxProfile.ChargingSchedule.Duration:((maxProfile.ChargingSchedule.Duration-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule))<0?
+																																								  0:
+																																								 (maxProfile.ChargingSchedule.Duration-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule)));
+			}
+
+			for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(maxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
+			{
+				if(maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
+				{
+					maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = (strstr((char*)ShmOCPP16Data->StatusNotification[(connectorId==0?0:connectorId-1)].Status, "Charging")==NULL)?maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod:((maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule))<0?
+																																																											    0:
+																																																											   (maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule)));
+				}
+			}
+		}
+		else
+		{
+			if(strstr((char*)maxProfile.RecurrencyKind, "Weekly") != NULL)
+			{
+				if(maxProfile.ChargingSchedule.Duration != -1)
+				{
+					maxProfile.ChargingSchedule.Duration = ((maxProfile.ChargingSchedule.Duration-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule))<0?
+															0:
+															(maxProfile.ChargingSchedule.Duration-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule)));
+				}
+
+				for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(maxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
+				{
+					if(maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
+					{
+						maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = ((maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule))<0?
+																									 0:
+																									 (maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule)));
+					}
+				}
+			}
+			else
+			{
+				if(maxProfile.ChargingSchedule.Duration != -1)
+				{
+					maxProfile.ChargingSchedule.Duration = ((maxProfile.ChargingSchedule.Duration-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule))<0?
+															0:
+															(maxProfile.ChargingSchedule.Duration-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule)));
+				}
+
+				for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(maxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
+				{
+					if(maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
+					{
+						maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = ((maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule))<0?
+																									 0:
+																									 (maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule)));
+					}
+				}
+			}
+		}
+/*
+		DEBUG_INFO("MaxProfile after align.\n");
+		DEBUG_INFO("Profile ID: %d\n", maxProfile.ChargingProfileId);
+		DEBUG_INFO("Profile stackLevel: %d\n", maxProfile.StackLevel);
+		DEBUG_INFO("Profile TransactionId: %d\n", maxProfile.TransactionId);
+		DEBUG_INFO("Profile valid from: %s\n", maxProfile.ValidFrom);
+		DEBUG_INFO("Profile valid to: %s\n", maxProfile.ValidTo);
+		DEBUG_INFO("Profile ChargingProfileKind: %s\n", maxProfile.ChargingProfileKind);
+		DEBUG_INFO("Profile RecurrencyKind: %s\n", maxProfile.RecurrencyKind);
+
+		DEBUG_INFO("Profile start schedule: %s\n", compositeProfile->ChargingSchedule.StartSchedule);
+		DEBUG_INFO("Profile schedule duration: %d\n", maxProfile.ChargingSchedule.Duration);
+		DEBUG_INFO("Profile charging rate unit: %s\n", maxProfile.ChargingSchedule.ChargingRateUnit);
+		DEBUG_INFO("Profile charging min rate: %f\n", maxProfile.ChargingSchedule.MinChargingRate);
+
+		for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(maxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
+		{
+			if(maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod >= 0)
+			{
+				DEBUG_INFO("Period-%02d startPeriod: %d\n", idxPeriod, maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod);
+				DEBUG_INFO("Period-%02d limit: %f\n", idxPeriod, maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit);
+				DEBUG_INFO("Period-%02d NumberPhases: %d\n", idxPeriod, maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases);
+			}
+		}
+		DEBUG_INFO("------------------------------------\n");*/
+	}
+
+	if(defaultTxProfile.ChargingProfileId != -1)
+	{
+		if(strstr((char*)defaultTxProfile.ChargingProfileKind, "Absolute") != NULL)
+		{
+			if(defaultTxProfile.ChargingSchedule.Duration != -1)
+			{
+				defaultTxProfile.ChargingSchedule.Duration = ((defaultTxProfile.ChargingSchedule.Duration-getStartStop(defaultTxProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule))<0?
+														0:
+														(defaultTxProfile.ChargingSchedule.Duration-getStartStop(defaultTxProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule)));
+			}
+
+			for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
+			{
+				if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
+				{
+					defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = ((defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(defaultTxProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule))<0?
+																								 0:
+																								 (defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(defaultTxProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule)));
+				}
+			}
+		}
+		else if(strstr((char*)defaultTxProfile.ChargingProfileKind, "Relative") != NULL)
+		{
+			if(defaultTxProfile.ChargingSchedule.Duration != -1)
+			{
+				defaultTxProfile.ChargingSchedule.Duration = (strstr((char*)ShmOCPP16Data->StatusNotification[(connectorId==0?0:connectorId-1)].Status, "Charging")==NULL)?defaultTxProfile.ChargingSchedule.Duration:((defaultTxProfile.ChargingSchedule.Duration-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule))<0?
+																																								  0:
+																																								 (defaultTxProfile.ChargingSchedule.Duration-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule)));
+			}
+
+			for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
+			{
+				if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
+				{
+					defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = (strstr((char*)ShmOCPP16Data->StatusNotification[(connectorId==0?0:connectorId-1)].Status, "Charging")==NULL)?defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod:((defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule))<0?
+																																																												0:
+																																																											   (defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule)));
+				}
+			}
+		}
+		else
+		{
+			if(strstr((char*)defaultTxProfile.RecurrencyKind, "Weekly") != NULL)
+			{
+				if(defaultTxProfile.ChargingSchedule.Duration != -1)
+				{
+					defaultTxProfile.ChargingSchedule.Duration = ((defaultTxProfile.ChargingSchedule.Duration-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule))<0?
+															0:
+															(defaultTxProfile.ChargingSchedule.Duration-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule)));
+				}
+
+				for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
+				{
+					if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
+					{
+						defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = ((defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule))<0?
+																									 0:
+																									 (defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule)));
+					}
+				}
+			}
+			else
+			{
+				if(defaultTxProfile.ChargingSchedule.Duration != -1)
+				{
+					defaultTxProfile.ChargingSchedule.Duration = ((defaultTxProfile.ChargingSchedule.Duration-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule))<0?
+															0:
+															(defaultTxProfile.ChargingSchedule.Duration-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule)));
+				}
+
+				for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
+				{
+					if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
+					{
+						defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = ((defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule))<0?
+																									 0:
+																									 (defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule)));
+					}
+				}
+			}
+		}
+/*
+		DEBUG_INFO("defaultTxProfile after align.\n");
+		DEBUG_INFO("Profile ID: %d\n", defaultTxProfile.ChargingProfileId);
+		DEBUG_INFO("Profile stackLevel: %d\n", defaultTxProfile.StackLevel);
+		DEBUG_INFO("Profile TransactionId: %d\n", defaultTxProfile.TransactionId);
+		DEBUG_INFO("Profile valid from: %s\n", defaultTxProfile.ValidFrom);
+		DEBUG_INFO("Profile valid to: %s\n", defaultTxProfile.ValidTo);
+		DEBUG_INFO("Profile ChargingProfileKind: %s\n", defaultTxProfile.ChargingProfileKind);
+		DEBUG_INFO("Profile RecurrencyKind: %s\n", defaultTxProfile.RecurrencyKind);
+
+		DEBUG_INFO("Profile start schedule: %s\n", compositeProfile->ChargingSchedule.StartSchedule);
+		DEBUG_INFO("Profile schedule duration: %d\n", defaultTxProfile.ChargingSchedule.Duration);
+		DEBUG_INFO("Profile charging rate unit: %s\n", defaultTxProfile.ChargingSchedule.ChargingRateUnit);
+		DEBUG_INFO("Profile charging min rate: %f\n", defaultTxProfile.ChargingSchedule.MinChargingRate);
+
+		for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
+		{
+			if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod >= 0)
+			{
+				DEBUG_INFO("Period-%02d startPeriod: %d\n", idxPeriod, defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod);
+				DEBUG_INFO("Period-%02d limit: %f\n", idxPeriod, defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit);
+				DEBUG_INFO("Period-%02d NumberPhases: %d\n", idxPeriod, defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases);
+			}
+		}
+		DEBUG_INFO("------------------------------------\n");*/
+	}
+
+	if(txProfile.ChargingProfileId != -1)
+	{
+		if(strstr((char*)txProfile.ChargingProfileKind, "Absolute") != NULL)
+		{
+			if(txProfile.ChargingSchedule.Duration != -1)
+			{
+				txProfile.ChargingSchedule.Duration = ((txProfile.ChargingSchedule.Duration-getStartStop(txProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule))<0?
+														0:
+														(txProfile.ChargingSchedule.Duration-getStartStop(txProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule)));
+			}
+
+			for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(txProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
+			{
+				if(txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
+				{
+					txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = ((txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(txProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule))<0?
+																								 0:
+																								 (txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(txProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule)));
+				}
+			}
+		}
+		else if(strstr((char*)txProfile.ChargingProfileKind, "Relative") != NULL)
+		{
+			if(txProfile.ChargingSchedule.Duration != -1)
+			{
+				txProfile.ChargingSchedule.Duration = (strstr((char*)ShmOCPP16Data->StatusNotification[(connectorId==0?0:connectorId-1)].Status, "Charging")==NULL)?txProfile.ChargingSchedule.Duration:((txProfile.ChargingSchedule.Duration-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule))<0?
+																																								  0:
+																																								 (txProfile.ChargingSchedule.Duration-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule)));
+			}
+
+			for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(txProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
+			{
+				if(txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
+				{
+					txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = (strstr((char*)ShmOCPP16Data->StatusNotification[(connectorId==0?0:connectorId-1)].Status, "Charging")==NULL)?txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod:((txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule))<0?
+																																																												0:
+																																																											   (txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule)));
+				}
+			}
+		}
+		else
+		{
+			if(strstr((char*)txProfile.RecurrencyKind, "Weekly") != NULL)
+			{
+				if(txProfile.ChargingSchedule.Duration != -1)
+				{
+					txProfile.ChargingSchedule.Duration = ((txProfile.ChargingSchedule.Duration-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule))<0?
+															0:
+															(txProfile.ChargingSchedule.Duration-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule)));
+				}
+
+				for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(txProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
+				{
+					if(txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
+					{
+						txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = ((txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule))<0?
+																									 0:
+																									 (txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule)));
+					}
+				}
+			}
+			else
+			{
+				if(txProfile.ChargingSchedule.Duration != -1)
+				{
+					txProfile.ChargingSchedule.Duration = ((txProfile.ChargingSchedule.Duration-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule))<0?
+															0:
+															(txProfile.ChargingSchedule.Duration-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule)));
+				}
+
+				for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(txProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
+				{
+					if(txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
+					{
+						txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = ((txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule))<0?
+																									 0:
+																									 (txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule)));
+					}
+				}
+			}
+		}
+		/*
+		DEBUG_INFO("txProfile after align.\n");
+		DEBUG_INFO("Profile ID: %d\n", txProfile.ChargingProfileId);
+		DEBUG_INFO("Profile stackLevel: %d\n", txProfile.StackLevel);
+		DEBUG_INFO("Profile TransactionId: %d\n", txProfile.TransactionId);
+		DEBUG_INFO("Profile valid from: %s\n", txProfile.ValidFrom);
+		DEBUG_INFO("Profile valid to: %s\n", txProfile.ValidTo);
+		DEBUG_INFO("Profile ChargingProfileKind: %s\n", txProfile.ChargingProfileKind);
+		DEBUG_INFO("Profile RecurrencyKind: %s\n", txProfile.RecurrencyKind);
+
+		DEBUG_INFO("Profile start schedule: %s\n", compositeProfile->ChargingSchedule.StartSchedule);
+		DEBUG_INFO("Profile schedule duration: %d\n", txProfile.ChargingSchedule.Duration);
+		DEBUG_INFO("Profile charging rate unit: %s\n", txProfile.ChargingSchedule.ChargingRateUnit);
+		DEBUG_INFO("Profile charging min rate: %f\n", txProfile.ChargingSchedule.MinChargingRate);
+
+		for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(txProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
+		{
+			if(txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod >= 0)
+			{
+				DEBUG_INFO("Period-%02d startPeriod: %d\n", idxPeriod, txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod);
+				DEBUG_INFO("Period-%02d limit: %f\n", idxPeriod, txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit);
+				DEBUG_INFO("Period-%02d NumberPhases: %d\n", idxPeriod, txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases);
+			}
+		}*/
+	}
+
+	/*
+	 * Merge to conposite schedule
+	 */
+	//DEBUG_INFO("====================================\n");
+	// Find each profile period quantity
+	for(int idx=0;idx<ARRAY_SIZE(maxProfile.ChargingSchedule.ChargingSchedulePeriod);idx++)
+	{
+		if(maxProfile.ChargingSchedule.ChargingSchedulePeriod[idx].Limit != -1)
+			limitMax = idx+1;
+	}
+
+	for(int idx=0;idx<ARRAY_SIZE(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod);idx++)
+	{
+		if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idx].Limit != -1)
+			limitDef = idx+1;
+	}
+
+	for(int idx=0;idx<ARRAY_SIZE(txProfile.ChargingSchedule.ChargingSchedulePeriod);idx++)
+	{
+		if(txProfile.ChargingSchedule.ChargingSchedulePeriod[idx].Limit != -1)
+			limitTx = idx+1;
+	}
+
+	// TxProfile found, composite schedule based on it
+	if(txProfile.ChargingProfileId != -1)
+	{
+		for(int idxTxPeriod=0;idxTxPeriod<limitTx;idxTxPeriod++)
+		{
+			if((txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].Limit != -1) &&
+			   (txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].StartPeriod < durationReq))
+			{
+				if(maxProfile.ChargingProfileId != -1)
+				{
+					for(int idxMaxPeriod=0;idxMaxPeriod<limitMax;idxMaxPeriod++)
+					{
+						if((txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].StartPeriod >= maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].StartPeriod) &&
+						   (maxProfile.ChargingSchedule.Duration > txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].StartPeriod))
+						{
+							tmpPeriod.StartPeriod = txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].StartPeriod;
+							tmpPeriod.NumberPhases = txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].NumberPhases;
+							tmpPeriod.Limit = (txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].Limit>maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].Limit?maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].Limit:txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].Limit);
+						}
+
+						if(idxMaxPeriod == (limitMax-1))
+						{
+							if(tmpPeriod.Limit != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].Limit)
+							{
+								if(tmpPeriod.StartPeriod != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].StartPeriod)
+								{
+									memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx], &tmpPeriod , sizeof(struct StructChargingSchedulePeriod));
+									compositePeriodIdx++;
+								}
+								else
+								{
+									memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)], &tmpPeriod , sizeof(struct StructChargingSchedulePeriod));
+								}
+							}
+						}
+					}
+				}
+				else
+				{
+					if(txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].StartPeriod != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].StartPeriod)
+					{
+						memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx], &txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod],sizeof(struct StructChargingSchedulePeriod));
+						compositePeriodIdx++;
+					}
+					else
+					{
+						memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)], &txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod],sizeof(struct StructChargingSchedulePeriod));
+					}
+				}
+			}
+
+			if(idxTxPeriod == (limitTx-1))
+			{
+				if(defaultTxProfile.ChargingProfileId != -1)
+				{
+					for(int idxDefPeriod=0;idxDefPeriod<limitDef;idxDefPeriod++)
+					{
+						if((defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].StartPeriod > txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].StartPeriod) &&
+						   (defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].StartPeriod < durationReq))
+						{
+							if(maxProfile.ChargingProfileId != -1)
+							{
+								for(int idxMaxPeriod=0;idxMaxPeriod<limitMax;idxMaxPeriod++)
+								{
+									if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].StartPeriod >= maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].StartPeriod)
+									{
+										tmpPeriod.StartPeriod = defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].StartPeriod;
+										tmpPeriod.NumberPhases = defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].NumberPhases;
+										tmpPeriod.Limit = (defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].Limit>maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].Limit?maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].Limit:defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].Limit);
+
+										if(tmpPeriod.Limit != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].Limit)
+										{
+											if(tmpPeriod.StartPeriod != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].StartPeriod)
+											{
+												memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx], &tmpPeriod , sizeof(struct StructChargingSchedulePeriod));
+												compositePeriodIdx++;
+											}
+											else
+											{
+												memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)], &tmpPeriod , sizeof(struct StructChargingSchedulePeriod));
+											}
+										}
+
+										break;
+									}
+								}
+							}
+							else
+							{
+								if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].StartPeriod != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].StartPeriod)
+								{
+									memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx], &defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod],sizeof(struct StructChargingSchedulePeriod));
+									compositePeriodIdx++;
+								}
+								else
+								{
+									memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)], &defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod],sizeof(struct StructChargingSchedulePeriod));
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+	// TxProfile not found but defaultTxProfile found, composite schedule based on it
+	else if(defaultTxProfile.ChargingProfileId != -1)
+	{
+		for(int idxDefPeriod=0;idxDefPeriod<limitDef;idxDefPeriod++)
+		{
+			if((defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].Limit != -1) &&
+			   (defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].StartPeriod < durationReq))
+			{
+				if(maxProfile.ChargingProfileId != -1)
+				{
+					for(int idxMaxPeriod=0;idxMaxPeriod<limitMax;idxMaxPeriod++)
+					{
+						if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].StartPeriod >= maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].StartPeriod)
+						{
+							tmpPeriod.StartPeriod = defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].StartPeriod;
+							tmpPeriod.NumberPhases = defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].NumberPhases;
+							tmpPeriod.Limit = (defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].Limit>maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].Limit?maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].Limit:defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].Limit);
+
+							if(tmpPeriod.Limit != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].Limit)
+							{
+								if(tmpPeriod.StartPeriod != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].StartPeriod)
+								{
+									memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx], &tmpPeriod , sizeof(struct StructChargingSchedulePeriod));
+									compositePeriodIdx++;
+								}
+								else
+								{
+									memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)], &tmpPeriod , sizeof(struct StructChargingSchedulePeriod));
+								}
+							}
+
+							break;
+						}
+					}
+				}
+				else
+				{
+					if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].StartPeriod != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].StartPeriod)
+					{
+						memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx], &defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod],sizeof(struct StructChargingSchedulePeriod));
+						compositePeriodIdx++;
+					}
+					else
+					{
+						memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)], &defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod],sizeof(struct StructChargingSchedulePeriod));
+					}
+				}
+			}
+		}
+	}
+
+	// Fill other period by MaxProfile
+	if(maxProfile.ChargingProfileId != -1)
+	{
+		for(int idxMaxPeriod=0;idxMaxPeriod<limitMax;idxMaxPeriod++)
+		{
+			if((maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].Limit != -1) &&
+			   (maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].StartPeriod < durationReq))
+			{
+				if((maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].StartPeriod >= compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx==0?0:compositePeriodIdx-1].StartPeriod) &&
+				   (maxProfile.ChargingSchedule.Duration > compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx==0?0:compositePeriodIdx-1].StartPeriod))
+				{
+					tmpPeriod.StartPeriod = compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx==0?0:compositePeriodIdx-1].StartPeriod;
+					tmpPeriod.NumberPhases = compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx==0?0:compositePeriodIdx-1].NumberPhases;
+					tmpPeriod.Limit = maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].Limit;
+				}
+
+				if(idxMaxPeriod == (limitMax-1))
+				{
+					if(maxProfile.ChargingSchedule.Duration > compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx==0?0:compositePeriodIdx-1].StartPeriod)
+					{
+						tmpPeriod.StartPeriod = compositeProfile->ChargingSchedule.Duration;
+						tmpPeriod.NumberPhases = maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].NumberPhases;
+						tmpPeriod.Limit = maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].Limit;
+					}
+
+					if(tmpPeriod.Limit != -1)
+					{
+						if(tmpPeriod.Limit != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].Limit)
+						{
+							if(tmpPeriod.StartPeriod != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].StartPeriod)
+							{
+								memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx], &tmpPeriod , sizeof(struct StructChargingSchedulePeriod));
+								compositePeriodIdx++;
+							}
+							else
+							{
+								memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)], &tmpPeriod , sizeof(struct StructChargingSchedulePeriod));
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+
+	DEBUG_INFO("Composite schedule start: %s\n", compositeProfile->ChargingSchedule.StartSchedule);
+	DEBUG_INFO("Composite schedule duration: %d\n", compositeProfile->ChargingSchedule.Duration);
+	DEBUG_INFO("Composite rate unit: %s\n", compositeProfile->ChargingSchedule.ChargingRateUnit);
+	for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(compositeProfile->ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
+	{
+		if(compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod >= 0)
+		{
+			DEBUG_INFO("Period-%02d startPeriod: %d\n", idxPeriod, compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod);
+			DEBUG_INFO("Period-%02d limit: %f\n", idxPeriod, compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit);
+			DEBUG_INFO("Period-%02d NumberPhases: %d\n", idxPeriod, compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases);
+		}
+
+		if(compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit == -1)
+			compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit =0;
+
+		if(compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod == -1)
+			compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod =0;
+	}
+
+	if(line)
+		free(line);
+}
+
+//==========================================
+// Init all share memory
+//==========================================
+int InitShareMemory()
+{
+	int result = PASS;
+	int MeterSMId;
+
+	//creat ShmSysConfigAndInfo
+	if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo),  0777)) < 0)
+    {
+		DEBUG_ERROR("shmget ShmSysConfigAndInfo NG\n");
+		result = FAIL;
+	}
+    else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
+    {
+    	DEBUG_ERROR("shmat ShmSysConfigAndInfo NG\n");
+    	result = FAIL;
+   	 }
+    else
+    {}
+
+   	if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData),  0777)) < 0)
+    {
+   		DEBUG_ERROR("shmget ShmStatusCodeData NG\n");
+   		result = FAIL;
+	}
+    else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
+    {
+    	DEBUG_ERROR("shmat ShmStatusCodeData NG\n");
+    	result = FAIL;
+   	}
+    else
+    {}
+
+	//creat ShmPsuData
+   	if ((MeterSMId = shmget(ShmPsuKey, sizeof(struct PsuData), 0777)) < 0)
+    {
+   		DEBUG_ERROR("shmget ShmPsuData NG\n");
+   		result = FAIL;
+	}
+    else if ((ShmPsuData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
+    {
+    	DEBUG_ERROR("shmat ShmPsuData NG\n");
+    	result = FAIL;
+   	}
+    else
+    {}
+
+   	//creat ShmOCPP16Data
+   	if ((MeterSMId = shmget(ShmOcppModuleKey, sizeof(struct OCPP16Data),  0777)) < 0)
+	{
+		DEBUG_ERROR("shmget ShmOCPP16Data NG");
+		result = FAIL;
+	}
+	else if ((ShmOCPP16Data = shmat(MeterSMId, NULL, 0)) == (void *) -1)
+	{
+		DEBUG_ERROR("shmat ShmOCPP16Data NG");
+		result = FAIL;
+	}
+	else
+	{}
+
+
+    /****************************** For Initial Settings************************************************/
+	ShmOCPP16Data->GetConfiguration.ResponseUnknownKey = NULL;
+	ShmOCPP16Data->SendLocalList.LocalAuthorizationList = NULL;
+
+	// allocate Configuration memory address
+	ShmOCPP16Data->GetConfiguration.Key = staticKeyArray;
+	ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey = staticResponseConfigurationKeyArray;
+	ShmOCPP16Data->GetConfiguration.ResponseUnknownKey = staticResponseUnknownKey;
+	ShmOCPP16Data->SendLocalList.LocalAuthorizationList = staticLocalAuthorizationList;
+
+	//offline MeterValue Interval
+	TempMeterValueInterval = 0;
+
+	return result;
+}
+
+
+int ProcessShareMemory()
+{
+	if(InitShareMemory() == FAIL)
+	{
+		DEBUG_ERROR("InitShareMemory NG\n");
+
+		if(ShmStatusCodeData!=NULL)
+		{
+			ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=1;
+		}
+		sleep(5);
+		return FAIL;
+	}
+	return PASS;
+}
+
+//---------------------common routine---------------------------//
+int isOFFline(void)
+{
+	if(ShmSysConfigAndInfo->SysInfo.InternetConn == 0)
+	{
+		if(TempMeterValueInterval >=  2  )
+		{
+			TempMeterValueInterval = 0;
+			return TRUE;
+		}
+		else
+		{
+			TempMeterValueInterval = TempMeterValueInterval+ 1;
+			return FALSE;
+		}
+	}
+	else
+	{
+		return FALSE;
+	}
+}
+
+//---------------------------------------------
+//  new:
+//  enum SYSTEM_STATUS
+//	{
+//		SYS_MODE_BOOTING		= 0,
+//		SYS_MODE_IDLE    	  	= 1,
+//		SYS_MODE_AUTHORIZING		= 2,
+//		SYS_MODE_MODE_REASSIGN_CHECK	= 3,
+//		SYS_MODE_REASSIGN		= 4,
+//		SYS_MODE_PREPARING		= 5,
+//		SYS_MODE_PREPARE_FOR_EV		= 6,
+//		SYS_MODE_PREPARE_FOR_EVSE	= 7,
+//		SYS_MODE_CHARGING		= 8,
+//		SYS_MODE_TERMINATING		= 9,
+//		SYS_MODE_COMPLETE		= 10,
+//		SYS_MODE_ALARM			= 11,
+//		SYS_MODE_FAULT			= 12,
+//		SYS_MODE_RESERVATION		= 13,
+//		SYS_MODE_BOOKING		= 14,
+//		SYS_MODE_MAINTAIN		= 15,
+//		SYS_MODE_DEBUG			= 16,
+//		SYS_MODE_CCS_PRECHARGE_STEP0	= 17,
+//		SYS_MODE_CCS_PRECHARGE_STEP1	= 18,
+//		SYS_MODE_UPDATE			= 19
+//	};
+//
+//
+//-----------------------------------------
+
+void CheckSystemValue(void)
+{
+	int meterValueSend[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY + AC_QUANTITY]={0};
+	//int IdleModeCnt = 0;
+	char filenmae[100]={0};
+	char str[100]={0};
+
+	//===============================
+	// send Heartbeat
+	//===============================
+	//HeartBeatWaitTime = ShmOCPP16Data->BootNotification.ResponseHeartbeatInterval;
+	if((difftime(time((time_t*)NULL), clientTime.Heartbeat) < 0) || (HeartBeatWaitTime <= 0))
+	{
+		clientTime.Heartbeat=time((time_t*)NULL);
+
+		if(server_sign == TRUE)
+		{
+			HeartBeatWaitTime = ShmOCPP16Data->BootNotification.ResponseHeartbeatInterval;
+		}
+		else
+		{
+			HeartBeatWaitTime = atoi((char*)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemData);
+		}
+
+	}
+
+	if((server_sign == TRUE) && (difftime(time((time_t*)NULL), clientTime.Heartbeat) >= HeartBeatWaitTime))
+	{
+		//parameter for test
+		sendHeartbeatRequest(0);
+	    //==============================================
+		// Reset Waiting Time
+		//==============================================
+		clientTime.Heartbeat=time((time_t*)NULL);
+		HeartBeatWithNOResponse = HeartBeatWithNOResponse + 1;
+
+	}
+
+	for(int gun_index=0;gun_index < gunTotalNumber ;gun_index++)
+	{
+		//===============================
+		// CSU Trigger Reset Conf
+		//===============================
+		if((server_sign == TRUE) && (ShmOCPP16Data->MsMsg.bits.ResetConf == 1))
+		{
+			sendResetConfirmation((char *)ShmOCPP16Data->Reset.guid, (char *)ShmOCPP16Data->Reset.ResponseStatus);
+		}
+
+		//===============================
+		// CSU Trigger Authorize Request
+		//===============================
+		if((server_sign == TRUE) && (ShmOCPP16Data->SpMsg.bits.AuthorizeReq == 1)&&(authorizeRetryTimes < 3))
+		{
+			sendAuthorizeRequest(0);
+			authorizeRetryTimes = authorizeRetryTimes + 1;
+
+			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
+			server_sign = FALSE;
+		}
+		else if((server_sign == FALSE) &&(strcmp((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData, "TRUE") == 0)&&(strcmp((const char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "TRUE") == 0)&&(ShmOCPP16Data->OcppConnStatus == 0)&& (ShmOCPP16Data->SpMsg.bits.AuthorizeReq == 1))
+		{
+			sendAuthorizeRequest(0);
+		}
+
+		//===============================
+		// CSU Trigger Smart Charging Profilw
+	   //===============================
+	   if(ShmOCPP16Data->CSUMsg.bits[gun_index].ChargingProfileReq == 1)
+	   {
+		   ShmOCPP16Data->CSUMsg.bits[gun_index].ChargingProfileReq = 0;
+		   checkCompositeSchedule(gun_index+1, 86400, &ShmOCPP16Data->SmartChargingProfile[gun_index]);
+		   ShmOCPP16Data->CSUMsg.bits[gun_index].ChargingProfileConf = 1;
+	   }
+
+		//==============================================
+		// Charger start transaction
+		//==============================================
+		if(/*(server_sign == TRUE) &&*/ (ShmOCPP16Data->CpMsg.bits[gun_index].StartTransactionReq == 1))
+		{
+			ShmOCPP16Data->CpMsg.bits[gun_index].StartTransactionReq =0;
+			sendStartTransactionRequest(gun_index);
+			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)))
+		{
+			ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq =0;
+			sendStopTransactionRequest(gun_index);
+			clientTime.StopTransaction = time((time_t*)NULL);
+		}
+
+		//==============================================
+		// Charger status report
+		//==============================================
+		//--- Check Mode Change ---//
+		// J: CHAdeMO  U: CCS1 combo  E: CCS2 combo  G: GBT DCcc
+
+		if(gunType[gun_index] == 'J')
+		{
+			for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)
+				{
+					if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != ChademoPreviousSystemStatus[index]) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ConnectorPlugIn != ChademoPreviousConnectorPlugIn[index]) )//if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != ChademoPreviousSystemStatus[index]/*PRE_SYS_MODE[gun_index]*/ )
+					{
+						//PRE_SYS_MODE[gun_index] = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus;
+						ChademoPreviousSystemStatus[index] = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus;
+						ChademoPreviousConnectorPlugIn[index] = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ConnectorPlugIn;
+						cpinitateMsg.bits[gun_index].StatusNotificationReq = 1;
+						statusModeChage[gun_index] = TRUE;
+					}
+
+			#if 1 // for TempStopTransaction
+					if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_IDLE) && (ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq == 0))
+					{
+						checkTempStopTransaction(gun_index);
+					}
+			#endif
+
+				}
+			}
+		}
+		else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
+		{
+			for (int index = 0; index < CCS_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)
+				{
+					if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != CcsPreviousSystemStatus[index]) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ConnectorPlugIn != CcsPreviousConnectorPlugIn[index]) )//if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != CcsPreviousSystemStatus[index]/*PRE_SYS_MODE[gun_index]*/ )
+					{
+						//PRE_SYS_MODE[gun_index] = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus;
+						CcsPreviousSystemStatus[index] = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus;
+						CcsPreviousConnectorPlugIn[index] = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ConnectorPlugIn;
+						cpinitateMsg.bits[gun_index].StatusNotificationReq = 1;
+						statusModeChage[gun_index] = TRUE;
+					}
+
+			#if 1 // for TempStopTransaction
+					if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_IDLE) && (ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq == 0))
+					{
+						checkTempStopTransaction(gun_index);
+					}
+			#endif
+
+				}
+			}
+		}
+		else if(gunType[gun_index] == 'G')
+		{
+			for (int index = 0; index < GB_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)
+				{
+					if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != GbPreviousSystemStatus[index]) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ConnectorPlugIn != GbPreviousConnectorPlugIn[index]) )//if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != GbPreviousSystemStatus[index]/*PRE_SYS_MODE[gun_index]*/ )
+					{
+						//PRE_SYS_MODE[gun_index] = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus;
+						GbPreviousSystemStatus[index] = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus;
+						GbPreviousConnectorPlugIn[index] = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ConnectorPlugIn;
+						cpinitateMsg.bits[gun_index].StatusNotificationReq = 1;
+						statusModeChage[gun_index] = TRUE;
+					}
+
+		#if 1 // for TempStopTransaction
+					if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_IDLE) && (ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq == 0))
+					{
+						checkTempStopTransaction(gun_index);
+					}
+		#endif
+
+				}
+			}
+
+		}
+		else
+		{
+			for (int index = 0; index < AC_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == gun_index)
+				{
+					if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != AcPreviousSystemStatus[index]) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState != AcPreviousConnectorPlugIn[index]) )//if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != AcPreviousSystemStatus[index]/*PRE_SYS_MODE[gun_index]*/ )
+					{
+						//PRE_SYS_MODE[gun_index] = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus;
+						AcPreviousSystemStatus[index] = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus;
+						AcPreviousConnectorPlugIn[index] = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState;
+						cpinitateMsg.bits[gun_index].StatusNotificationReq = 1;
+						statusModeChage[gun_index] = TRUE;
+					}
+
+			#if 1 // for TempStopTransaction
+					if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_IDLE) && (ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq == 0))
+					{
+						checkTempStopTransaction(gun_index);
+					}
+			#endif
+				}
+			}// END
+
+		}
+
+
+	if(((server_sign == TRUE) && (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;
+
+		sendStatusNotificationRequest(gun_index);
+		clientTime.StatusNotification[gun_index] = time((time_t*)NULL);
+		statusModeChage[gun_index] = FALSE;
+	}
+
+	//==============================================
+	// Meter report
+	//==============================================
+	if(/*(server_sign == TRUE) &&*/(isOFFline() == TRUE) || ((time((time_t*)NULL) - clientTime.MeterValues[gun_index])> (atoi((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemData)- 1 ) ) )
+	{
+		//check Transaction active
+		if(gunType[gun_index] == 'J')
+		{
+			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 == SYS_MODE_CHARGING))
+				{
+					meterValueSend[gun_index] =1;
+				}
+
+				if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // complete
+				{
+					sprintf(filenmae,"/Storage/OCPP/TxProfile_%d.json",(gun_index+1));
+					if((access(filenmae,F_OK))!=-1)
+					{
+						DEBUG_INFO("TxProfile exist. OCPP will delete TX Charging Profile\n");
+
+						sprintf(str,"rm -f %s",filenmae);
+						system(str);
+					}
+
+				}
+			}// End for CHAdeMO
+		}
+		else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
+		{
+			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 == SYS_MODE_CHARGING))
+				{
+					meterValueSend[gun_index] =1;
+				}
+
+				if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // complete
+				{
+					sprintf(filenmae,"/Storage/OCPP/TxProfile_%d.json",(gun_index+1));
+					if((access(filenmae,F_OK))!=-1)
+					{
+						DEBUG_INFO("TxProfile exist. OCPP will delete TX Charging Profile\n");
+						sprintf(str,"rm -f %s",filenmae);
+						system(str);
+					}
+				}
+			} // End for CCS
+		}
+		else if(gunType[gun_index] == 'G')
+		{
+			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 == SYS_MODE_CHARGING))
+				{
+					meterValueSend[gun_index] =1;
+				}
+
+				if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // complete
+				{
+					sprintf(filenmae,"/Storage/OCPP/TxProfile_%d.json",(gun_index+1));
+					if((access(filenmae,F_OK))!=-1)
+					{
+						DEBUG_INFO("TxProfile exist. OCPP will delete TX Charging Profile\n");
+						sprintf(str,"rm -f %s",filenmae);
+						system(str);
+					}
+				}
+			}// End for GB
+
+		}
+		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 == SYS_MODE_CHARGING))
+				{
+					meterValueSend[gun_index] =1;
+				}
+
+				if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // complete
+				{
+					sprintf(filenmae,"/Storage/OCPP/TxProfile_%d.json",(gun_index+1));
+					if((access(filenmae,F_OK))!=-1)
+					{
+						DEBUG_INFO("TxProfile exist. OCPP will delete TX Charging Profile\n");
+
+						sprintf(str,"rm -f %s",filenmae);
+						system(str);
+					}
+				}
+			}//End for AC
+		}
+
+		clientTime.MeterValues[gun_index] = time((time_t*)NULL);
+
+		if(meterValueSend[gun_index] == 1)
+		{
+			sendMeterValuesRequest(gun_index);
+#if 1 // for TempStopTransaction
+			storeTempStopTransaction(gun_index);
+#endif
+		}
+
+	}
+
+	//==============================================
+	// Check Connector reserved
+	//==============================================
+
+	//===============================
+	// 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);
+		strptime((char *)ShmOCPP16Data->ReserveNow[gun_index].ExpiryDate, "%Y-%m-%dT%H:%M:%S", &tp);
+		tp.tm_isdst = -1;
+		time_t utc = mktime(&tp);
+		diff_t = difftime(utc, t);
+
+		if(diff_t <= 0)
+		{
+			DEBUG_INFO("reserve expired.\n");
+			memset(ShmOCPP16Data->ReserveNow[gun_index].ExpiryDate,0,sizeof(ShmOCPP16Data->ReserveNow[gun_index].ExpiryDate));
+		}
+
+	 }//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((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;
+	  }
+
+	  //==========================================
+	  // csu trigger DataTransferReq
+	  //==========================================
+	  if((server_sign == TRUE) &&(ShmOCPP16Data->CsMsg.bits[gun_index].DataTransferReq == 1))
+	  {
+		  sendDataTransferRequest(gun_index);
+		  ShmOCPP16Data->CsMsg.bits[gun_index].DataTransferReq = 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_INFO("sendAuthorizeRequest...\n");
+	memset(&(ShmOCPP16Data->Authorize.ResponseIdTagInfo),0,sizeof(struct StructIdTagInfo));
+
+	//Local Authorize
+	if	((strcmp((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemData , "TRUE")==0) &&(ShmOCPP16Data->OcppConnStatus == 0))
+	{
+		DEBUG_INFO("Allow OfflineTx UnknownId Pass !!!!\n");
+		strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ExpiryDate, "");
+		strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag, "");
+		strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status, "Accepted");
+		result = PASS;
+		ShmOCPP16Data->SpMsg.bits.AuthorizeReq = 0;
+		ShmOCPP16Data->SpMsg.bits.AuthorizeConf = 1; // inform csu
+		authorizeRetryTimes = 0;
+		return result;
+
+	}
+	else if(((strcmp((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData, "TRUE") == 0)&&(strcmp((const char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "TRUE") == 0)&&(ShmOCPP16Data->OcppConnStatus == 0))||
+			((strcmp((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemData, "TRUE") == 0)&&(strcmp((const char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "TRUE") == 0)))
+	{
+		OCPP_getIdTag((char *)ShmSysConfigAndInfo->SysConfig.UserId);
+		if((strcmp(idTagQuery.idTagstr,"") == 0) || (strcmp(idTagQuery.idTagstatus,"Accepted") != 0) )
+		{
+			if(strcmp(idTagQuery.idTagstr,"") == 0)
+			{
+				DEBUG_INFO("offline Local Authorization Fail !!!!, Card %s is blank!!!!\n", idTagQuery.idTagstr);
+			}
+
+			if(strcmp(idTagQuery.idTagstatus,"Accepted") != 0)
+			{
+				DEBUG_INFO("offline Local Authorization Fail !!!!, Card %s is not Accepted!!!!\n", idTagQuery.idTagstr);
+			}
+
+			DEBUG_INFO("offline 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("offline 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);
+
+	sprintf(tempdata, "Authorize,%d", gun_index);
+	if(hashmap_operation(HASH_OP_ADD, guid, tempdata) == 1)
+	{
+		result = PASS;
+		DEBUG_INFO("Authorize mapItem pass\n");
+	}
+
+	ShmOCPP16Data->SpMsg.bits.AuthorizeReq = 0;
+	return result;
+}
+
+int sendBootNotificationRequest(void)
+{
+	mtrace();
+	int result = FAIL;
+	char message[500]={0}, payload[700]={0};
+    char guid[37]={0};
+    char tempdata[65]={0};
+    int IsGunCharging = FALSE;
+
+    //check Transaction active
+    for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+    {
+    	if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_CHARGING) //S_CHARGING
+    	{
+    		IsGunCharging = TRUE;
+    	}
+
+    }
+
+    for (int index = 0; index < CCS_QUANTITY; index++)
+    {
+    	if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_CHARGING) //S_CHARGING
+    	{
+    		IsGunCharging = TRUE;
+    	}
+    }
+
+    for (int index = 0; index < GB_QUANTITY; index++)
+    {
+    	if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_CHARGING) //S_CHARGING
+    	{
+    		IsGunCharging = TRUE;
+    	}
+    }
+
+    for (int index = 0; index < AC_QUANTITY; index++)
+    {
+    	if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_CHARGING) //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);
+	strcpy((char *)ShmOCPP16Data->BootNotification.CpFwVersion,(const char *)ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev);
+	strcpy((char *)ShmOCPP16Data->BootNotification.CpIccid,(const char *)ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSimIccid);
+	strcpy((char *)ShmOCPP16Data->BootNotification.CpImsi,(const char *)ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSimImsi);
+
+	sprintf(payload, "{\"chargeBoxSerialNumber\":\"%s\",\"chargePointModel\":\"%s\",\"chargePointSerialNumber\":\"%s\",\"chargePointVendor\":\"%s\",\"firmwareVersion\":\"%s\",\"iccid\":\"%s\",\"imsi\":\"%s\"} ",
+				ShmOCPP16Data->ChargeBoxId
+				,ShmSysConfigAndInfo->SysConfig.ModelName
+				,ShmSysConfigAndInfo->SysConfig.SerialNumber
+				,ShmSysConfigAndInfo->SysConfig.chargePointVendor
+				,ShmOCPP16Data->BootNotification.CpFwVersion
+				,ShmOCPP16Data->BootNotification.CpIccid
+				,ShmOCPP16Data->BootNotification.CpImsi);
+
+	random_uuid(guid);
+
+	sprintf(message,"[%d,\"%s\",\"%s\",%s]",MESSAGE_TYPE_CALL, guid, "BootNotification", payload);
+	LWS_Send(message);
+	sprintf(tempdata, "BootNotification,0");
+	if(hashmap_operation(HASH_OP_ADD, 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, sizeof(queuedata));
+	strcpy(queuedata,message);
+
+	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);
+
+	sprintf(tempdata, "DataTransfer,%d", (gun_index + 1));
+	if(hashmap_operation(HASH_OP_ADD, guid, tempdata) == 1)
+	{
+		result = PASS;
+		DEBUG_INFO("DataTransfer mapItem pass\n");
+	}
+
+	return result;
+}
+
+int sendFirmwareVersionByDataTransfer(void)
+{
+	int8_t result = FAIL;
+	json_object *FirmwareDataTransfer = json_object_new_object();
+
+	// AC & DC model
+	json_object_object_add(FirmwareDataTransfer, "CsuBootLoadFwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.CsuBootLoadFwRev));
+	json_object_object_add(FirmwareDataTransfer, "CsuKernelFwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.CsuKernelFwRev));
+	json_object_object_add(FirmwareDataTransfer, "CsuRootFsFwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev));
+	json_object_object_add(FirmwareDataTransfer, "CsuPrimFwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.CsuPrimFwRev));
+
+	// DC model
+	if((ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D'))
+	{
+		json_object_object_add(FirmwareDataTransfer, "FanModuleFwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.FanModuleFwRev));
+		json_object_object_add(FirmwareDataTransfer, "RelayModuleFwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.RelayModuleFwRev));
+		json_object_object_add(FirmwareDataTransfer, "LedModuleFwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.LedModuleFwRev));
+		json_object_object_add(FirmwareDataTransfer, "Connector1FwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.Connector1FwRev));
+	}
+
+	if((ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D') &&
+	   ((gunType[1] != '0') || (gunType[2] != '0') || (gunType[3] != '0')))
+	{
+		json_object_object_add(FirmwareDataTransfer, "Connector2FwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.Connector2FwRev));
+	}
+
+	// 4G model
+	if((ShmSysConfigAndInfo->SysConfig.ModelName[10]=='T'))
+	{
+		json_object_object_add(FirmwareDataTransfer, "TelcomModemFwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSoftwareVer));
+	}
+
+	sprintf((char*)ShmOCPP16Data->DataTransfer[0].VendorId, "Phihong Technology");
+	sprintf((char*)ShmOCPP16Data->DataTransfer[0].MessageId, "ID_FirmwareVersion");
+	sprintf((char*)ShmOCPP16Data->DataTransfer[0].Data, json_object_to_json_string(FirmwareDataTransfer));
+
+	if(sendDataTransferRequest(0))
+	{
+		result = PASS;
+	}
+
+	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);
+
+	sprintf(tempdata, "DiagnosticsStatusNotification,%d", 0);
+
+	if(hashmap_operation(HASH_OP_ADD, guid, tempdata) == 1)
+	{
+		result = PASS;
+		//DEBUG_INFO("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 = DIAGNOSTIC_STATUS_IDLE;
+	}
+	else if(strcmp(status,"Uploaded")==0)
+	{
+		DiagnosticsStatusNotificationStatus = DIAGNOSTIC_STATUS_UPLOADED;
+	}
+	else if(strcmp(status,"UploadFailed")==0)
+	{
+		DiagnosticsStatusNotificationStatus = DIAGNOSTIC_STATUS_UPLOAD_FAIL;
+	}
+	else if(strcmp(status,"Uploading")==0)
+	{
+		DiagnosticsStatusNotificationStatus = DIAGNOSTIC_STATUS_UPLOADING;
+	}
+
+	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);
+
+	sprintf(tempdata, "FirmwareStatusNotification,%d", 0);
+
+	if(hashmap_operation(HASH_OP_ADD, 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);
+	//#endif
+
+	ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationReq = 0;
+	ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationConf = 0;
+
+	//record status
+	if(strcmp(status,"Downloaded")==0)
+	{
+		 FirmwareStatusNotificationStatus = FIRMWARE_STATUS_DOWNLOADED;
+	}
+	else if(strcmp(status,"DownloadFailed")==0)
+	{
+		FirmwareStatusNotificationStatus = FIRMWARE_STATUS_DOWNLOAD_DAILED;
+	}
+	else if(strcmp(status,"Downloading")==0)
+	{
+		FirmwareStatusNotificationStatus = FIRMWARE_STATUS_DOWNLOADING;
+	}
+	else if(strcmp(status,"Idle")==0)
+	{
+		FirmwareStatusNotificationStatus = FIRMWARE_STATUS_IDLE;
+	}
+	else if(strcmp(status,"InstallationFailed")==0)
+	{
+		FirmwareStatusNotificationStatus = FIRMWARE_STATUS_INSTALLATION_FAILED;
+	}
+	else if(strcmp(status,"Installing")==0)
+	{
+		FirmwareStatusNotificationStatus = FIRMWARE_STATUS_INSTALLING;
+	}
+	else if(strcmp(status,"Installed")==0)
+	{
+		FirmwareStatusNotificationStatus = FIRMWARE_STATUS_INSTALLED;
+	}
+
+
+	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);
+
+	sprintf(tempdata, "Heartbeat,%d", 0);
+
+	if(hashmap_operation(HASH_OP_ADD, 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;
+	}
+
+	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[28];//, usec_buf[6];
+	char tempdata[65]={0};
+	int tempIndex = 0;
+
+	DEBUG_INFO("sendStartTransactionRequest...");
+	gettimeofday(&tmnow, NULL);
+
+	time_t t;
+	t = time(NULL);
+	/*UTC time and date*/
+	tm = gmtime(&t);
+	strftime(buf,28,"%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
+
+	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);
+
+	// clear StartTransaction Response
+	strcpy((char *)ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.ExpiryDate, "");
+	strcpy((char *)ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.ParentIdTag, "");
+	strcpy((char *)ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.Status, "");
+	ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId = 0;
+
+	//J: CHAdeMO   U: CCS1 combo   E: CCS2 combo  G: GBT DCcc
+
+	if(gunType[gun_index] == 'J')
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
+			{
+				ShmOCPP16Data->StartTransaction[gun_index].MeterStart = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedEnergy;
+				ShmOCPP16Data->StartTransaction[gun_index].ReservationId = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId;
+			}
+		}
+
+	}
+	else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < CCS_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
+			{
+				ShmOCPP16Data->StartTransaction[gun_index].MeterStart = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy;
+				ShmOCPP16Data->StartTransaction[gun_index].ReservationId = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ReservationId;
+			}
+		}
+	}
+	else if(gunType[gun_index] == 'G')
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < GB_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
+			{
+				ShmOCPP16Data->StartTransaction[gun_index].MeterStart = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy;
+				ShmOCPP16Data->StartTransaction[gun_index].ReservationId = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ReservationId;
+			}
+		}
+	}
+	else
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
+		{
+			tempIndex = 2;
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < AC_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
+			{
+				ShmOCPP16Data->StartTransaction[gun_index].MeterStart = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PowerConsumption;
+				ShmOCPP16Data->StartTransaction[gun_index].ReservationId = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].ReservationId;
+			}
+		}
+	}
+
+	random_uuid(guid);
+
+	if(ShmOCPP16Data->StartTransaction[gun_index].ReservationId == -1) // No Reservation
+	{
+		sprintf(message, "%d,[%d,\"%s\",\"StartTransaction\",{\"connectorId\":%d,\"idTag\":\"%s\",\"meterStart\":%d,\"timestamp\":\"%s\"}]"
+						, gun_index +1
+						, MESSAGE_TYPE_CALL
+						, guid
+						, ShmOCPP16Data->StartTransaction[gun_index].ConnectorId
+						, ShmOCPP16Data->StartTransaction[gun_index].IdTag
+						, ShmOCPP16Data->StartTransaction[gun_index].MeterStart
+						, ShmOCPP16Data->StartTransaction[gun_index].Timestamp );
+
+	}
+	else
+	{
+		sprintf(message, "%d,[%d,\"%s\",\"StartTransaction\",{\"connectorId\":%d,\"idTag\":\"%s\",\"meterStart\":%d,\"reservationId\":%d,\"timestamp\":\"%s\"}]"
+						, gun_index +1
+						, 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 );
+	}
+
+
+#if 1
+	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;
+	}
+#endif
+
+	strcpy(queuedata, message);
+	queue_operation(4, guid, queuedata );//addq(guid, queuedata); ---> remove temporally
+
+	if(GetTransactionQueueNum() == 1)
+	{
+		LWS_Send(message + 2);
+	}
+
+	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[28];//, usec_buf[6];
+	char tempdata[65]={0};
+	int tempIndex = 0;
+
+	gettimeofday(&tmnow, NULL);
+
+	time_t t;
+	t = time(NULL);
+	/*UTC time and date*/
+	tm = gmtime(&t);
+	strftime(buf,28,"%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
+	//J: CHAdeMO  U: CCS1 combo  E: CCS2 combo  G: GBT DCcc
+	if(gunType[gun_index] == 'J')
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+		{
+			if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex))
+			{
+				if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_IDLE)//S_IDLE
+				{
+
+					if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ConnectorPlugIn == 1) // //0: unplug, 1: Plug-in
+					{
+						currentStatus = 1; //OCPP Status: Preparing
+					}
+					else
+					{
+						currentStatus = 0; //OCPP Status: Available
+					}
+
+
+
+				}
+				else if ( ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus >= SYS_MODE_PREPARING)&&( ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus <= SYS_MODE_PREPARE_FOR_EVSE)) ||
+				                         ( ( ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus >= SYS_MODE_CCS_PRECHARGE_STEP0) && ( ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus <= SYS_MODE_CCS_PRECHARGE_STEP1) )
+								) //S_PRECHARGE
+
+				{
+					currentStatus = 1; //OCPP Status: Preparing
+				}
+				else if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_CHARGING) //S_CHARGING
+				{
+					currentStatus = 2; //OCPP Status: Charging
+				}
+				else if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_COMPLETE) //S_COMPLETE
+				{
+					currentStatus = 5; //OCPP Status: Finishing
+				}
+				else if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_TERMINATING) // S_TERMINATING   ---> SuspendedEV
+				{
+					currentStatus = 4; //OCPP Status: SuspendedEV
+				}
+				else if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_MAINTAIN)|| (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //  ---> Unavailable
+				{
+					currentStatus = 7; //OCPP Status: Unavailable
+				}
+				else if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_FAULT)|| (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_ALARM)) //S_ALARM,S_FAULT   ---> Faulted
+				{
+					currentStatus = 8; //OCPP Status: Faulted
+				}
+				else if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_RESERVATION) //    ---> Reserved
+				{
+					currentStatus = 6; //OCPP Status: Reserved
+				}
+
+			} //end of the same index
+
+		}//end of for CHAdeMO_QUANTITY
+
+	}
+	else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < CCS_QUANTITY; index++)
+		{
+			if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_IDLE) //S_IDLE
+				{
+
+					if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ConnectorPlugIn == 1) //0: unplug, 1: Plug-in
+					{
+						currentStatus = 1; //OCPP Status: Preparing
+					}
+					else
+					{
+						currentStatus = 0; //OCPP Status: Available
+					}
+
+
+				}
+				else if ( ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus >= SYS_MODE_PREPARING)&&( ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus <= SYS_MODE_PREPARE_FOR_EVSE)) ||
+				                         ( ( ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus >= SYS_MODE_CCS_PRECHARGE_STEP0) && ( ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus <= SYS_MODE_CCS_PRECHARGE_STEP1) )
+								) //S_PRECHARGE
+
+				{
+					currentStatus = 1; //OCPP Status: Preparing
+				}
+				else if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_CHARGING) //S_CHARGING
+				{
+					currentStatus = 2; //OCPP Status: Charging
+				}
+				else if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_COMPLETE) //S_COMPLETE
+				{
+					currentStatus = 5; //OCPP Status: Finishing
+				}
+				else if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_TERMINATING) //S_TERMINATING  ---> SuspendedEV
+				{
+					currentStatus = 4; //OCPP Status: SuspendedEV
+				}
+				else if ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_MAINTAIN) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //   ---> Unavailable
+				{
+					currentStatus = 7; //OCPP Status : Unavailable
+				}
+				else if ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_ALARM)) //S_ALARM ,S_FAULT   ---> Faulted
+				{
+					currentStatus = 8; //OCPP Status: Faulted
+				}
+				else if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_RESERVATION) //   ---> Reserved
+				{
+					currentStatus = 6; //OCPP Status: Reserved
+				}
+
+			} //end of the same index
+
+		} // end of for CCS_QUANTITY
+	}
+	else if(gunType[gun_index] == 'G')
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < GB_QUANTITY; index++)
+		{
+			if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_IDLE) //S_IDLE
+				{
+
+					if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ConnectorPlugIn == 1) // //0: unplug, 1: Plug-in
+					{
+						currentStatus = 1; //OCPP Status: Preparing
+					}
+					else
+					{
+						currentStatus = 0; //OCPP Status: Available
+					}
+
+				}
+				else if ( ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus >= SYS_MODE_PREPARING)&&( ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus <= SYS_MODE_PREPARE_FOR_EVSE)) ||
+				                         ( ( ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus >= SYS_MODE_CCS_PRECHARGE_STEP0) && ( ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus <= SYS_MODE_CCS_PRECHARGE_STEP1) )
+								) //S_PRECHARGE
+
+				{
+					currentStatus = 1; //OCPP Status: Preparing
+				}
+				else if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_CHARGING) //S_CHARGING
+				{
+					currentStatus = 2; //OCPP Status: Charging
+				}
+				else if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_COMPLETE) //S_COMPLETE
+				{
+					currentStatus = 5; //OCPP Status: Finishing
+				}
+				else if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_TERMINATING) // S_TERMINATING  ---> SuspendedEV
+				{
+					currentStatus = 4; //OCPP Status: SuspendedEV
+				}
+				else if ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_MAINTAIN) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //  ---> Unavailable
+				{
+					currentStatus = 7; //OCPP Status: Unavailable
+				}
+				else if ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_ALARM)) //S_ALARM ,S_FAULT   ---> Faulted
+				{
+					currentStatus = 8; //OCPP Status: Faulted
+				}
+				else if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_RESERVATION) //   ---> Reserved
+				{
+					currentStatus = 6; //OCPP Status: Reserved
+				}
+			} //end of the same index
+
+		} // end of for GB_QUANTITY
+	}
+	else
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
+		{
+			tempIndex = 2;
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < AC_QUANTITY; index++)
+		{
+			if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_IDLE) //SYS_MODE_IDLE
+				{
+					if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState == CP_STATE_B) ||(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState == CP_STATE_C) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState == CP_STATE_D))
+					{
+						currentStatus = 1; //OCPP Status: Preparing
+					}
+					else
+					{
+						currentStatus = 0; //OCPP Status: Available
+					}
+
+				}
+				else if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_PREPARING) //SYS_MODE_PREPARING
+				{
+					currentStatus = 1; //OCPP Status: Preparing
+				}
+				else if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_CHARGING) //SYS_MODE_CHARGING
+				{
+					currentStatus = 2; //OCPP Status: Charging
+				}
+				else if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_COMPLETE) //SYS_MODE_COMPLETE
+				{
+					currentStatus = 5; //OCPP Status: Finishing
+				}
+				else if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_TERMINATING) // S_TERMINATING   ---> SuspendedEV
+				{
+					currentStatus = 4; //OCPP Status: SuspendedEV
+				}
+				else if ((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_MAINTAIN)|| (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //   ---> Unavailable
+				{
+					currentStatus = 7; //OCPP Status: Unavailable
+				}
+				else if ((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_ALARM)) //S_ALARM,S_FAULT   ---> Faulted
+				{
+					currentStatus = 8; //OCPP Status: Faulted
+				}
+				else if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_RESERVATION) //    ---> Reserved
+				{
+					currentStatus = 6; //OCPP Status: Reserved
+				}
+
+			}//end of the same index
+
+		}//end of for AC_QUANTITY
+
+	}
+
+	//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].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);
+
+	sprintf(tempdata, "StatusNotification,%d", (gun_index));
+
+	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;
+	}
+
+	return result;
+}
+
+int sendStopTransactionRequest(int gun_index)
+{
+	mtrace();
+	int result = FAIL;
+	//char message[1500]={0};
+	char guid[37]={0};
+	char tempdata[65]={0};
+	int tempIndex = 0;
+	//int idx_sample=0;
+
+	DEBUG_ERROR("sendStopTransactionRequest \n");
+	memset(queuedata, 0, sizeof(queuedata));
+
+	//ENERGY_ACTIVE_IMPORT_REGISTER
+	//J: CHAdeMO  U: CCS1 combo  E: CCS2 combo  G: GBT DCcc
+	if(gunType[gun_index] == 'J')
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
+			{
+				ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PowerConsumption;
+			}
+		}// END OF CHAdeMO_QUANTITY
+	}
+	else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < CCS_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
+			{
+				ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PowerConsumption;
+			}
+		}// END OF CCS_QUANTITY
+
+	}
+	else if(gunType[gun_index] == 'G')
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < GB_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
+			{
+				ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PowerConsumption;
+			}
+		}// END OF GB_QUANTITY
+	}
+	else
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
+		{
+			tempIndex = 2;
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < AC_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
+			{
+				ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PowerConsumption;
+			}
+		}// END OF AC_QUANTITY
+	}
+
+	//Stop Transaction Time
+	struct timeval tmnow;
+	struct tm *tm;
+	char buf[28];//, usec_buf[6];
+	gettimeofday(&tmnow, NULL);
+
+	time_t t;
+	t = time(NULL);
+	/*UTC time and date*/
+	tm = gmtime(&t);
+	strftime(buf,28,"%Y-%m-%dT%H:%M:%SZ", tm);
+
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].Timestamp,buf);
+	ShmOCPP16Data->StopTransaction[gun_index].TransactionId = ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId;
+
+	random_uuid(guid);
+
+	/***********************************transactionData******************************************************/
+	memset(ShmOCPP16Data->StopTransaction[gun_index].TransactionData, 0, sizeof(sizeof(struct StructMeterValue)));
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].TimeStamp, buf);
+
+	//=================================
+	// Transaction_Begin
+	//=================================
+	// Energy.Active.Export.Interval
+    //idx_sample=0;
+	sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Value, "%.1f",(float)(ShmOCPP16Data->StartTransaction[gun_index].MeterStart)); // MeterStart is 0~6553.5 kWh
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Context,ReadingContextStr[ReadingContext_Transaction_Begin]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Format,ValueFormatStr[Raw]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Measurand,MeasurandStr[Energy_Active_Import_Interval]);//MeasurandStr[Energy_Active_Export_Interval/*Energy_Reactive_Export_Register*/]);
+
+	//J: CHAdeMO  U: CCS1 combo  E: CCS2 combo  G: GBT DCcc
+	if((gunType[gun_index] == 'J')||(gunType[gun_index] == 'U')||(gunType[gun_index] == 'E')||(gunType[gun_index] == 'G'))
+	{
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Phase,PhaseStr[L3_N]);
+	}
+	else
+	{
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Phase,PhaseStr[L1_N]);
+	}
+
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Location,LocationStr[Location_Outlet]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Unit,UnitOfMeasureStr[UnitOfMeasure_kWh]);
+
+	//=================================
+	// Transaction_End
+	//=================================
+	//Current.Export
+	//idx_sample=1;
+	//J: CHAdeMO  U: CCS1 combo  E: CCS2 combo  G : GBT DC
+	if(gunType[gun_index] == 'J')
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingCurrent );// PresentChargingCurrent is 0~6553.5 amp
+			}
+		}// End of for CHAdeMO_QUANTITY
+
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L3_N]);
+	}
+	else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < CCS_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingCurrent );// PresentChargingCurrent is 0~6553.5 amp
+			}
+		}// End of for CCS_QUANTITY
+
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L3_N]);
+	}
+	else if(gunType[gun_index] == 'G')
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < GB_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingCurrent );// PresentChargingCurrent is 0~6553.5 amp
+			}
+		}// End of for GB_QUANTITY
+
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L3_N]);
+	}
+	else
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
+		{
+			tempIndex = 2;
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < AC_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingCurrent );//  0~6553.5 amp for EVSE
+			}
+		}// End of for AC_QUANTITY
+
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L1_N]);
+	}
+
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Context,ReadingContextStr[ReadingContext_Transaction_End]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Format,ValueFormatStr[Raw]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Measurand,MeasurandStr[Current_Import]);
+	//strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L1_N]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Location,LocationStr[Location_Outlet]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Unit,UnitOfMeasureStr[UnitOfMeasure_A]);
+
+	//Energy.Active.Export.Interval
+	//idx_sample=2;
+	//J: CHAdeMO  U: CCS1 combo   E: CCS2 combo   G: GBT DC
+
+	if(gunType[gun_index] == 'J')
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedEnergy );// PresentChargedEnergy is 0~6553.5 kWh
+			}
+		}// END OF CHAdeMO_QUANTITY
+
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L3_N]);
+
+	}
+	else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < CCS_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy );// PresentChargedEnergy is 0~6553.5 kWh
+			}
+		}// END OF CCS_QUANTITY
+
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L3_N]);
+
+	}
+	else if(gunType[gun_index] == 'G')
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < GB_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy );// PresentChargedEnergy is 0~6553.5 kWh
+			}
+		}// END OF GB_QUANTITY
+
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L3_N]);
+	}
+	else
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
+		{
+			tempIndex = 2;
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+
+		for (int index = 0; index < AC_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargedEnergy );// PresentChargedEnergy is 0~6553.5 kWh
+			}
+		}// END OF AC_QUANTITY
+
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L1_N]);
+	}
+
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Context,ReadingContextStr[ReadingContext_Transaction_End]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Format,ValueFormatStr[Raw]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Measurand,MeasurandStr[Energy_Active_Import_Interval]);
+	//strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L1_N]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Location,LocationStr[Location_Outlet]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Unit,UnitOfMeasureStr[UnitOfMeasure_kWh]);
+
+	//Power.Active.Export
+	//idx_sample=3;
+	//J: CHAdeMO  U: CCS1 combo  E: CCS2 combo  G: GBT DC
+
+	if(gunType[gun_index] == 'J')
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingPower );//  PresentChargingPower is 0~6553.5 kW
+			}
+		} // End for CHAdeMO_QUANTITY
+
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L3_N]);
+	}
+	else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < CCS_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingPower );// PresentChargingPower is 0~6553.5 kW
+			}
+		} // END for CCS_QUANTITY
+
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L3_N]);
+	}
+	else if(gunType[gun_index] == 'G')
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < GB_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingPower );// PresentChargingPower is 0~6553.5 kW
+			}
+		}// END for GB_QUANTITY
+
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L3_N]);
+	}
+	else
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
+		{
+			tempIndex = 2;
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < AC_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingPower );// PresentChargingPower is 0~6553.5 kW
+			}
+		} // END for AC_QUANTITY
+
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L1_N]);
+	}
+
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Context,ReadingContextStr[ReadingContext_Transaction_End]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Format,ValueFormatStr[Raw]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Measurand,MeasurandStr[Power_Active_Import]);
+	//strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L1_N]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Location,LocationStr[Location_Outlet]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Unit,UnitOfMeasureStr[UnitOfMeasure_kW/*UnitOfMeasure_kWh*/]);
+
+	//Voltage
+	//idx_sample=4;
+	//J: CHAdeMO  U: CCS1 combo  E: CCS2 combo  G: GBT DC
+	if(gunType[gun_index] == 'J')
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingVoltage );// PresentChargingVoltage is 0~6553.5 volt
+			}
+		} // END OF FOR CHAdeMO_QUANTITY
+
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L3_N]);
+
+	}
+	else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < CCS_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingVoltage );// PresentChargingVoltage is 0~6553.5 volt
+			}
+		} // END OF  FOR CCS_QUANTITY
+
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L3_N]);
+	}
+	else if(gunType[gun_index] == 'G')
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < GB_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingVoltage );// PresentChargingVoltage is 0~6553.5 volt
+			}
+		} // END OF FOR GB_QUANTITY
+
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L3_N]);
+	}
+	else
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
+		{
+			tempIndex = 2;
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < AC_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingVoltage );//AcChargingVoltage is 0~6553.5 volt  for AC EVSE
+			}
+		} // END OF FOR AC_QUANTITY
+
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L1_N]);
+	}
+
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Context,ReadingContextStr[ReadingContext_Transaction_End]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Format,ValueFormatStr[Raw]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Measurand,MeasurandStr[Voltage]);
+	//strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L1_N]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Location,LocationStr[Location_Outlet]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Unit,UnitOfMeasureStr[UnitOfMeasure_V]);
+
+	//SoC
+	//idx_sample=5;
+	//J : CHAdeMO  U: CCS1 combo  E: CCS2 combo  G: GBT DC
+	if((gunType[gun_index] == 'J')||(gunType[gun_index] == 'U')||(gunType[gun_index] == 'E')||(gunType[gun_index] == 'G'))
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		if(gunType[gun_index] == 'J')
+		{
+			for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
+				{
+					sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].EvBatterySoc );// 0~100%
+				}
+			}
+		}
+		else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
+		{
+			for (int index = 0; index < CCS_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
+				{
+					sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].EvBatterySoc );// 0~100%
+				}
+			}
+
+		}
+		else if(gunType[gun_index] == 'G')
+		{
+			for (int index = 0; index < GB_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
+				{
+					sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].EvBatterySoc );// 0~100%
+				}
+			}
+
+		}
+
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Context,ReadingContextStr[ReadingContext_Transaction_End]);
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Format,ValueFormatStr[Raw]);
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Measurand,MeasurandStr[SoC/*Energy_Reactive_Export_Register*/]);
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Phase,PhaseStr[L3_N]);
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Location,LocationStr[Location_Outlet]);
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Unit,UnitOfMeasureStr[UnitOfMeasure_Percent/*UnitOfMeasure_kWh*/]);
+
+	} // END FOR DC CASE
+
+	if((gunType[gun_index] == 'J')||(gunType[gun_index] == 'U')||(gunType[gun_index] == 'E')||(gunType[gun_index] == 'G'))
+	{
+		sprintf(queuedata,"%d,[%d,\"%s\",\"StopTransaction\",{\"idTag\":\"%s\",\"meterStop\":%d,\"timestamp\":\"%s\",\"transactionId\":%d,\"reason\":\"%s\",\"transactionData\":[{\"timestamp\":\"%s\",\"sampledValue\":[{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"}]}]}]"
+
+							,gun_index+1
+							,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
+							,(const char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].TimeStamp
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Value
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Context
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Format
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Measurand
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Phase
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Location
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Unit
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Context
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Format
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Measurand
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Location
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Unit
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Context
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Format
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Measurand
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Location
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Unit
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Context
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Format
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Measurand
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Location
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Unit
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Context
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Format
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Measurand
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Location
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Unit
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Value
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Context
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Format
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Measurand
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Phase
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Location
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Unit
+							);
+	}
+	else
+	{
+		sprintf(queuedata,"%d,[%d,\"%s\",\"StopTransaction\",{\"idTag\":\"%s\",\"meterStop\":%d,\"timestamp\":\"%s\",\"transactionId\":%d,\"reason\":\"%s\",\"transactionData\":[{\"timestamp\":\"%s\",\"sampledValue\":[{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"}]}]}]"
+
+							,gun_index+1
+							,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
+							,(const char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].TimeStamp
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Value
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Context
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Format
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Measurand
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Phase
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Location
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Unit
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Context
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Format
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Measurand
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Location
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Unit
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Context
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Format
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Measurand
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Location
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Unit
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Context
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Format
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Measurand
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Location
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Unit
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Context
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Format
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Measurand
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Location
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Unit
+							);
+
+	}
+
+#if 1 // for TempStopTransaction
+	//Delete TempStopTransaction
+	if((access("/Storage/OCPP/TempStopTransaction",F_OK))!=-1)
+	{
+		remove("/Storage/OCPP/TempStopTransaction");  		// remove file "TempStopTransaction"
+	}
+#endif
+
+#if 1
+	sprintf(tempdata, "StopTransaction,%d", (gun_index));
+	if(hashmap_operation(0, guid, tempdata) == 1)
+	{
+			result = PASS;
+			DEBUG_INFO("StopTransaction mapitem pass\n");
+	}
+#endif
+	queue_operation(4, guid, queuedata );//addq(guid, queuedata); ---> remove temporally
+
+	if(GetTransactionQueueNum() == 1)
+	{
+		LWS_Send(queuedata+2);
+	}
+
+	//----------------------------replace queue StopTransaction TransactionId ---------------------------//
+	//int gettransactionId = GetTransactionId(gun_index+1, ShmOCPP16Data->StopTransaction[gun_index].IdTag);
+	int gettransactionId = GetTransactionId(gun_index+1, ShmOCPP16Data->StartTransaction[gun_index].IdTag);
+
+	if((ShmOCPP16Data->StopTransaction[gun_index].TransactionId != 0) && (gettransactionId != 0))
+	{
+		SetTransactionIdZero(ShmOCPP16Data->StopTransaction[gun_index].TransactionId);
+	}
+
+	//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};
+	int tempIndex = 0;
+
+	DEBUG_INFO("sendMeterValuesRequest ...\n");
+	//DEBUG_ERROR("gun_index =%d\n",gun_index);
+
+	if((ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId == 0)&&(ShmOCPP16Data->CsMsg.bits[gun_index].TriggerMessageReq == 0)) // no TransactionId
+	{
+		DEBUG_INFO("NOT SENT METER Vlaue\n");
+		//DEBUG_ERROR("ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId =%d\n",ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId);
+		//DEBUG_ERROR("ShmOCPP16Data->CsMsg.bits[gun_index].TriggerMessageReq =%d\n",ShmOCPP16Data->CsMsg.bits[gun_index].TriggerMessageReq);
+
+		return result;
+	}
+
+	if(ShmOCPP16Data->CsMsg.bits[gun_index].TriggerMessageReq == 1)
+	{
+		ShmOCPP16Data->CsMsg.bits[gun_index].TriggerMessageReq = 0;
+	}
+
+	memset(queuedata, 0, sizeof(queuedata));
+	//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);
+
+	//UTC Date time
+	struct timeval tmnow;
+	struct tm *tm;
+	char buf[28];//, usec_buf[6];
+	gettimeofday(&tmnow, NULL);
+
+	time_t t;
+	t = time(NULL);
+	/*UTC time and date*/
+	tm = gmtime(&t);
+	strftime(buf,28,"%Y-%m-%dT%H:%M:%SZ", tm);
+	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].TimeStamp, buf);
+
+	DEBUG_INFO( "ShmSysConfigAndInfo->SysConfig.ModelName[0]=%c\n", ShmSysConfigAndInfo->SysConfig.ModelName[0]);
+
+	//idx_sample=0;
+	//********************************(1)Current.Export************************************************/
+	//J: CHAdeMO  U: CCS1 combo  E: CCS2 combo  G: GBT DC
+
+	if(gunType[gun_index] == 'J')
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingCurrent );
+			}
+		}
+
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Phase, PhaseStr[L3_N]);
+	}
+	else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < CCS_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingCurrent );
+			}
+		}
+
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Phase, PhaseStr[L3_N]);
+	}
+	else if(gunType[gun_index] == 'G')
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < GB_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingCurrent );
+			}
+		}
+
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Phase, PhaseStr[L3_N]);
+	}
+	else
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
+		{
+			tempIndex = 2;
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < AC_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingCurrent );
+			}
+		}
+
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Phase, PhaseStr[L1_N]);
+	}
+
+	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Context, ReadingContextStr[ReadingContext_Sample_Periodic]);
+	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Format, ValueFormatStr[Raw]);
+	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Measurand, MeasurandStr[Current_Import]);
+	//strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Phase, PhaseStr[L1_N]);
+	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Location, LocationStr[Location_Outlet]);
+	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Unit,UnitOfMeasureStr[UnitOfMeasure_A]);
+
+
+	//idx_sample=1;
+	//********************************(2)Energy.Active.Import.Register ************************************************/
+	//J: CHAdeMO  U: CCS1 combo  E: CCS2 combo  G: GBT DC
+
+	if(gunType[gun_index] == 'J')
+	{
+			if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+			{
+				tempIndex = ((gun_index==2) ? 1: 0);
+			}
+			else
+			{
+				tempIndex = gun_index;
+			}
+
+			for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
+				{
+					sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PowerConsumption );
+				}
+			}
+
+			strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Phase, PhaseStr[L3_N]);
+	}
+	else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
+	{
+			if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+			{
+				tempIndex = ((gun_index==2) ? 1: 0);
+			}
+			else
+			{
+				tempIndex = gun_index;
+			}
+
+			for (int index = 0; index < CCS_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
+				{
+					sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PowerConsumption );
+				}
+			}
+
+			strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Phase, PhaseStr[L3_N]);
+	}
+	else if(gunType[gun_index] == 'G')
+	{
+			if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+			{
+				tempIndex = ((gun_index==2) ? 1: 0);
+			}
+			else
+			{
+				tempIndex = gun_index;
+			}
+
+			for (int index = 0; index < GB_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
+				{
+					sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PowerConsumption );
+				}
+			}
+
+			strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Phase, PhaseStr[L3_N]);
+	}
+	else
+	{
+			if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
+			{
+				tempIndex = 2;
+			}
+			else
+			{
+				tempIndex = gun_index;
+			}
+
+			for (int index = 0; index < AC_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
+				{
+					sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PowerConsumption );
+				}
+			}
+
+			strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Phase, PhaseStr[L1_N]);
+	}
+
+	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Context, ReadingContextStr[ReadingContext_Sample_Periodic]);
+	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Format, ValueFormatStr[Raw]);
+	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Measurand, MeasurandStr[Energy_Active_Import_Register]);
+	//strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Phase, PhaseStr[L1_N]);
+	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Location, LocationStr[Location_Outlet]);
+	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Unit,UnitOfMeasureStr[UnitOfMeasure_kWh]);
+
+
+	//idx_sample=2;
+	//****************************************************(3)Energy.Active.Export.Interval*********************************************/
+	//J: CHAdeMO  U: CCS1 combo  E: CCS2 combo  G: GBT DC
+
+	if(gunType[gun_index] == 'J')
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedEnergy );
+			}
+		} // END OF FOR CHAdeMO_QUANTITY
+
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Phase, PhaseStr[L3_N]);
+	}
+	else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		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 == tempIndex)
+			{
+			   //ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy = 100.0;
+			   sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy );
+			}
+		} // END OF CCS_QUANTITY
+
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Phase, PhaseStr[L3_N]);
+	}
+	else if(gunType[gun_index] == 'G')
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < GB_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy);
+			}
+		} // END OF GB_QUANTITY
+
+		 strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Phase, PhaseStr[L3_N]);
+	}
+	else
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
+		{
+			tempIndex = 2;
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < AC_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargedEnergy );
+			}
+		 }
+
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Phase, PhaseStr[L1_N]);
+	}
+
+	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Context, ReadingContextStr[ReadingContext_Sample_Periodic]);
+	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Format, ValueFormatStr[Raw]);
+	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Measurand, MeasurandStr[Energy_Active_Import_Interval]);
+	//strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Phase, PhaseStr[L1_N]);
+	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Location, LocationStr[Location_Outlet]);
+	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Unit,UnitOfMeasureStr[UnitOfMeasure_kWh]);
+
+	//idx_sample=3;
+	//********************************(4)Power.Active.Export************************************************/
+	//J : CHAdeMO   U: CCS1 combo   E: CCS2 combo   G: GBT DC
+
+	if(gunType[gun_index] == 'J')
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Value, "%.1f" , ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingPower);
+			}
+		} // END OF FOR
+
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Phase, PhaseStr[L3_N]);
+	}
+	else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < CCS_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Value, "%.1f" , ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingPower);
+			}
+		}
+
+		 strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Phase, PhaseStr[L3_N]);
+	}
+	else if(gunType[gun_index] == 'G')
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < GB_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
+			{
+			     //ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingPower = 100.0;
+			    sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Value, "%.1f" , ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingPower);
+			}
+		}
+
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Phase, PhaseStr[L3_N]);
+	}
+	else
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
+		{
+			tempIndex = 2;
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < AC_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
+			{
+			    sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Value, "%.1f" , ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingPower);
+			}
+		}
+
+		 strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Phase, PhaseStr[L1_N]);
+	}
+
+	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Context, ReadingContextStr[ReadingContext_Sample_Periodic]);
+	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Format, ValueFormatStr[Raw]);
+	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Measurand, MeasurandStr[Power_Active_Import]);
+	//strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Phase, PhaseStr[L1_N]);
+	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Location, LocationStr[Location_Outlet]);
+	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Unit,UnitOfMeasureStr[UnitOfMeasure_kW]);
+
+
+	//idx_sample=4;
+	//***********************************************(5)VOLTAGE******************************************************/
+	//J : CHAdeMO   U: CCS1 combo   E: CCS2 combo   G: GBT DC
+
+	if(gunType[gun_index] == 'J')
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
+			{
+			 	sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingVoltage );
+			}
+		}
+
+		 strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Phase, PhaseStr[L3_N]);
+	}
+	else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < CCS_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
+			{
+			 	sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingVoltage );
+			}
+		}
+
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Phase, PhaseStr[L3_N]);
+	}
+	else if(gunType[gun_index] == 'G')
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < GB_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
+			{
+			 	sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingVoltage );
+			}
+		}
+
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Phase, PhaseStr[L3_N]);
+	}
+	else
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
+		{
+			tempIndex = 2;
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < AC_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingVoltage );
+			}
+		}
+
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Phase, PhaseStr[L1_N]);
+	}
+
+	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Context, ReadingContextStr[ReadingContext_Sample_Periodic]);
+	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Format, ValueFormatStr[Raw]);
+	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Measurand, MeasurandStr[Voltage]);
+	// strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Phase, PhaseStr[L1_N]);
+	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Location, LocationStr[Location_Outlet]);
+	strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Unit,UnitOfMeasureStr[UnitOfMeasure_V]);
+
+
+	if((gunType[gun_index] == 'J')||(gunType[gun_index] == 'U')||(gunType[gun_index] == 'E')||(gunType[gun_index] == 'G'))
+	{
+		//idx_sample=5;
+		//sampledValue = NULL;
+		//***********************************************(6)SOC******************************************************/
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		if(gunType[gun_index] == 'J')
+		{
+			//tempIndex = ((gun_index==2) ? 1: 0);
+
+			for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
+				{
+					sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].EvBatterySoc );
+				}
+			}
+		}
+		else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
+		{
+			//tempIndex = ((gun_index==2) ? 1: 0);
+
+			for (int index = 0; index < CCS_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
+				{
+					sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].EvBatterySoc );
+				}
+			}
+
+		}
+		else if(gunType[gun_index] == 'G')
+		{
+			//tempIndex = ((gun_index==2) ? 1: 0);
+
+			for (int index = 0; index < GB_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
+				{
+					 sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].EvBatterySoc );
+				}
+			}
+
+		}
+
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Context, ReadingContextStr[ReadingContext_Sample_Periodic]);
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Format, ValueFormatStr[Raw]);
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Measurand, MeasurandStr[SoC]);
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Phase, PhaseStr[L3_N]);
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Location, LocationStr[Location_Outlet]);
+		strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Unit,UnitOfMeasureStr[UnitOfMeasure_Percent]);
+	}
+
+
+	if((gunType[gun_index] == 'J')||(gunType[gun_index] == 'U')||(gunType[gun_index] == 'E')||(gunType[gun_index] == 'G'))
+	{
+		 sprintf(queuedata,"%d,[%d,\"%s\",\"MeterValues\",{\"connectorId\":%d,\"transactionId\":%d,\"meterValue\":[{\"timestamp\":\"%s\",\"sampledValue\":[{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"}]}]}]"
+				 	 	,gun_index + 1
+				 	 	,MESSAGE_TYPE_CALL
+		 	 			,guid
+		 	 			,ShmOCPP16Data->MeterValues[gun_index].ConnectorId
+		 	 			,ShmOCPP16Data->MeterValues[gun_index].TransactionId
+		 				,(const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].TimeStamp
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Value
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Context
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Format
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Measurand
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Phase
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Location
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Unit
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Value
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Context
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Format
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Measurand
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Phase
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Location
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Unit
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Value
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Context
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Format
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Measurand
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Phase
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Location
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Unit
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Value
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Context
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Format
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Measurand
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Phase
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Location
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Unit
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Value
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Context
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Format
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Measurand
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Phase
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Location
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Unit
+						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Value
+						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Context
+						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Format
+						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Measurand
+						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Phase
+						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Location
+						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Unit
+
+		 	 );
+	 }
+	 else
+	 {
+		 sprintf(queuedata,"%d,[%d,\"%s\",\"MeterValues\",{\"connectorId\":%d,\"transactionId\":%d,\"meterValue\":[{\"timestamp\":\"%s\",\"sampledValue\":[{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"}]}]}]"
+				 	 	,gun_index + 1
+						,MESSAGE_TYPE_CALL
+		 	 			,guid
+		 	 			,ShmOCPP16Data->MeterValues[gun_index].ConnectorId
+		 	 			,ShmOCPP16Data->MeterValues[gun_index].TransactionId
+		 				,(const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].TimeStamp
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Value
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Context
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Format
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Measurand
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Phase
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Location
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Unit
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Value
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Context
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Format
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Measurand
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Phase
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Location
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Unit
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Value
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Context
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Format
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Measurand
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Phase
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Location
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Unit
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Value
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Context
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Format
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Measurand
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Phase
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Location
+		 				,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Unit
+						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Value
+						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Context
+						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Format
+						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Measurand
+						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Phase
+						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Location
+						,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Unit
+
+		 	 );
+	}
+
+	// Put request guid to hash map
+	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");
+	}
+	queue_operation(4, guid, queuedata );//addq(guid, queuedata);  ---> remove temporally
+
+	if(GetTransactionQueueNum() == 1)
+	{
+		LWS_Send(queuedata +2);
+
+	}
+
+	return result;
+}
+
+//==========================================
+// send confirm routine
+//==========================================
+int sendCancelReservationConfirmation(char *uuid,char *payload)
+{
+	mtrace();
+	int result = FAIL;
+	char message[100]={0};
+
+	DEBUG_INFO("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_INFO("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_INFO("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};
+
+    DEBUG_INFO("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};
+
+	DEBUG_INFO("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;
+
+	DEBUG_INFO("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};
+	int CompositeScheduleIndex = 0;
+
+	DEBUG_INFO("sendGetCompositeScheduleConfirmation...\n");
+
+  	CompositeScheduleIndex = (connectorIdInt > 0) ?(connectorIdInt -1) : 0;
+	if(nPeriod == 0)
+	{
+		if(strcmp((const char *)ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.StartSchedule,"")==0)
+		{
+			sprintf(message,"[%d,\"%s\",{\"status\":\"%s\",\"connectorId\":%d}]"
+												,MESSAGE_TYPE_CALLRESULT
+												,uuid
+												,payload
+												,connectorIdInt);
+		}
+		else
+		{
+			sprintf(message,"[%d,\"%s\",{\"status\":\"%s\",\"connectorId\":%d,\"scheduleStart\":\"%s\",\"chargingSchedule\":{\"duration\":%d,\"startSchedule\":\"%s\",\"chargingRateUnit\":\"%s\",\"chargingSchedulePeriod\":[{\"startPeriod\":0,\"limit\":0,\"numberPhases\":3}]}}]"
+										,MESSAGE_TYPE_CALLRESULT
+										,uuid
+										,payload
+										,connectorIdInt
+										,ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.StartSchedule
+										,ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.Duration
+										,ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.StartSchedule
+										,ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.ChargingRateUnit);
+		}
+	}
+	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[CompositeScheduleIndex].ResponseChargingSchedule.StartSchedule
+							,ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.Duration
+							,ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.StartSchedule
+							,ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.ChargingRateUnit);
+
+		for(int idx_sample=0;idx_sample< nPeriod;idx_sample++)
+		{
+			if (idx_sample == 0)
+			{
+				sprintf(message + strlen(message), "{\"startPeriod\":%d,\"limit\":%.1f,\"numberPhases\":%d}"
+						, ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.ChargingSchedulePeriod[idx_sample].StartPeriod
+						, ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.ChargingSchedulePeriod[idx_sample].Limit
+						, ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.ChargingSchedulePeriod[idx_sample].NumberPhases );
+			}
+			else
+			{
+				sprintf(message + strlen(message), ",{\"startPeriod\":%d,\"limit\":%.1f,\"numberPhases\":%d}"
+						, ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.ChargingSchedulePeriod[idx_sample].StartPeriod
+						, ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.ChargingSchedulePeriod[idx_sample].Limit
+						, ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.ChargingSchedulePeriod[idx_sample].NumberPhases );
+			}
+		}
+		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_INFO("sendGetConfigurationConfirmation...\n");
+
+	MaxKeySupported = atoi((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemData);
+
+	//DEBUG_INFO("MaxKeySupported=%d\n",MaxKeySupported);
+
+	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);
+
+	return result;
+}
+
+int sendGetDiagnosticsConfirmation(char *uuid,char *payload)
+{
+	mtrace();
+	int result = FAIL;
+	char message[400]={0};
+
+	DEBUG_INFO("sendGetDiagnosticsConfirmation...\n");
+
+	if(strcmp(payload,"")==0)
+	{
+		sprintf(message,"[%d,\"%s\",{}]",MESSAGE_TYPE_CALLRESULT, uuid);
+	}
+	else
+	{
+		sprintf(message,"[%d,\"%s\",{\"fileName\":\"%s\"}]", MESSAGE_TYPE_CALLRESULT, uuid, payload);
+	}
+	LWS_Send(message);
+	result = TRUE;
+
+	return result;
+}
+
+int sendGetLocalListVersionConfirmation(char *uuid,char *payload)
+{
+	mtrace();
+	int result = FAIL;
+	char message[80]={0};
+
+	DEBUG_INFO("sendGetLocalListVersionConfirmation...\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};
+
+	DEBUG_INFO("sendRemoteStartConfirmation...\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};
+
+	DEBUG_INFO("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_INFO("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_INFO("sendSetChargingProfileConfirmation...\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_INFO("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_INFO("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_INFO("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();
+	char message[220]={0};
+
+	DEBUG_INFO("An error occurred. Sending this information: uniqueId {}: action: {}, errorCore: {}, errorDescription: {}\n", uniqueId, action, errorCode, errorDescription);
+
+	sprintf(message,"[%d,\"%s\",\"%s\",\"%s\",{}]",MESSAGE_TYPE_CALLERROR, uniqueId, errorCode, errorDescription);
+	LWS_Send(message);
+}
+
+
+//==========================================
+// Handle server request routine  Start
+//==========================================
+int handleCancelReservationRequest(char *uuid, char *payload)
+{
+	mtrace();
+	int result = FAIL;
+    int gunNO = 0;
+	int reservationIdInt =0;
+	char comfirmstr[20];
+    DEBUG_INFO("handleCancelReservationRequest...\n");
+
+	json_object *CancelReservation;
+	CancelReservation = json_tokener_parse(payload);
+	if(!is_error(CancelReservation))
+	{
+		// Required data
+		reservationIdInt = json_object_get_int(json_object_object_get(CancelReservation, "reservationId"));
+	}
+	json_object_put(CancelReservation);
+
+
+	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
+	//J: CHAdeMO   U: CCS1 combo   E: CCS2 combo  G: GBT DC
+	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 );
+
+			if(gunType[2] == 'J')
+			{
+				gunNO = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index + 1;
+			}
+			else
+			{
+				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 );
+			if((gunType[2] == 'U') || (gunType[2] == 'E'))
+			{
+				gunNO = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index + 1;
+			}
+			else
+			{
+				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 );
+			if(gunType[2] == 'G')
+			{
+				gunNO = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index + 1;
+			}
+			else
+			{
+				gunNO = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index;
+			}
+
+			ShmOCPP16Data->CsMsg.bits[gunNO].CancelReservationReq = 1;
+			goto end;
+		}
+	}
+
+
+	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 );
+
+			if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
+			{
+				gunNO = 1; //ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index ;
+			}
+			else
+			{
+				gunNO = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index;
+			}
+
+			ShmOCPP16Data->CsMsg.bits[gunNO].CancelReservationReq = 1;
+			goto end;
+		}
+	}
+
+	//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 typeStr[16]={0};
+	char comfirmstr[20];
+	int specificId = FALSE;
+
+	DEBUG_INFO("handleChangeAvailabilityRequest...\n");
+
+	json_object *ChangeAvailability;
+	ChangeAvailability = json_tokener_parse(payload);
+
+	if(!is_error(ChangeAvailability))
+	{
+		// Required data
+		gunIndex = json_object_get_int(json_object_object_get(ChangeAvailability, "connectorId"));
+		sprintf((char*)typeStr, "%s", json_object_get_string(json_object_object_get(ChangeAvailability, "type")));
+	}
+	json_object_put(ChangeAvailability);
+
+
+	if(gunIndex != 0)
+	{
+		ShmOCPP16Data->ChangeAvailability[gunIndex - 1].ConnectorId= gunIndex;
+		sprintf((char *)ShmOCPP16Data->ChangeAvailability[gunIndex - 1].Type, "%s", typeStr);
+	}
+	else
+	{
+		for(int i=0; i < gunTotalNumber; i++)
+		{
+			ShmOCPP16Data->ChangeAvailability[i].ConnectorId= gunIndex;
+			sprintf((char *)ShmOCPP16Data->ChangeAvailability[i].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(strcmp((const char *)typeStr, AvailabilityTypeStr[Inoperative]) == 0)
+	{
+		
+		//----------------------gunIndex is 0  ------------------------------------------------//
+		if(gunIndex  == 0)
+		{
+			if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D') // 'D' means DC
+			{
+				for(int i=0; i < gunTotalNumber; i++)
+				{
+					for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+					{
+						if ((gunType[i] == 'J')&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == i))
+						{
+							if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_RESERVATION) // S_PRECHARGE
+							{
+								sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
+								goto end;
+							}
+							else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING) ||
+									(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_PREPARING) ||
+									(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_CHARGING) ||
+									(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_TERMINATING) ||
+									(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_COMPLETE))  // S_CHARGING
+							{
+								sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
+								goto end;
+							}
+						}
+					}//END FOR CHAdeMO_QUANTITY
+
+					for (int index = 0; index < CCS_QUANTITY; index++)
+					{
+						if (((gunType[i] == 'U')||(gunType[i] == 'E'))&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == i))
+						{
+							if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_RESERVATION)// S_PRECHARGE
+							{
+									sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
+									goto end;
+							}
+								else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING) ||
+										(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_PREPARING) ||
+										(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_CHARGING) ||
+										(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_TERMINATING) ||
+										(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // S_CHARGING
+							{
+									sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
+									goto end;
+							}
+						}
+					}//END FOR CCS_QUANTITY
+
+					for (int index = 0; index < GB_QUANTITY; index++)
+					{
+						if ((gunType[i] == 'G')&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == i))
+						{
+							if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_RESERVATION) // S_PRECHARGE
+							{
+									sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
+									goto end;
+							}
+							else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING) ||
+									(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_PREPARING) ||
+									(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_CHARGING) ||
+									(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_TERMINATING) ||
+									(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // S_CHARGING
+							{
+									sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
+									goto end;
+							}
+						}
+					}// END FOR GB_QUANTITY
+
+					for (int index = 0; index < AC_QUANTITY; index++)
+					{
+						if (((gunType[i] > '0')&&(gunType[i] <= '9'))&&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == i))
+						{
+							if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_RESERVATION) // S_PRECHARGE
+							{
+									sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
+									goto end;
+							}
+							else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING) ||
+									(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_PREPARING) ||
+									(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_CHARGING) ||
+									(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_TERMINATING) ||
+									(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // S_CHARGING
+							{
+									sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
+									goto end;
+							}
+						}
+					}//END FOR AC_QUANTITY
+				}// END FOR gunTotalNumber
+			}
+			else if (ShmSysConfigAndInfo->SysConfig.ModelName[0]=='A') //'A' means AC
+			{
+				for(int i=0; i < gunTotalNumber; i++)
+				{
+					if(ShmSysConfigAndInfo->SysInfo.AcChargingData[i].SystemStatus == SYS_MODE_RESERVATION) // S_PRECHARGE
+					{
+						sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
+						goto end;
+					}
+					else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[i].SystemStatus == SYS_MODE_AUTHORIZING) ||
+						(ShmSysConfigAndInfo->SysInfo.AcChargingData[i].SystemStatus == SYS_MODE_PREPARING) ||
+						(ShmSysConfigAndInfo->SysInfo.AcChargingData[i].SystemStatus == SYS_MODE_CHARGING) ||
+						(ShmSysConfigAndInfo->SysInfo.AcChargingData[i].SystemStatus == SYS_MODE_TERMINATING) ||
+						(ShmSysConfigAndInfo->SysInfo.AcChargingData[i].SystemStatus == SYS_MODE_COMPLETE)) // S_CHARGING
+					{
+						sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
+						goto end;
+					}
+				}
+			}
+
+			sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
+			goto end;
+		}
+
+
+		//----------------------gunIndex is not 0  ------------------------------------------------//
+		
+	    //check Transaction active
+		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+		{
+			if ((gunIndex > 0)&&(gunType[gunIndex-1] == 'J'))
+			{
+				if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_RESERVATION) ) // S_PRECHARGE
+				{
+					sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
+					goto end;
+				}
+				else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING) ||
+						(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_PREPARING) ||
+						(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_CHARGING) ||
+						(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_TERMINATING) ||
+						(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_COMPLETE))  // S_CHARGING
+				{
+					sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
+					goto end;
+				}
+				else
+				{
+					DEBUG_INFO("ShmSysConfigAndInfo->SysInfo.ChademoChargingData[%d].SystemStatus = %d\n",index, ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus);
+					sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
+					goto end;
+				}
+			}
+		}//END FOR CHAdeMO_QUANTITY
+
+		for (int index = 0; index < CCS_QUANTITY; index++)
+		{
+			if ((gunIndex > 0)&&((gunType[gunIndex - 1] == 'U')||(gunType[gunIndex - 1] == 'E')))
+			{
+				if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_RESERVATION) )// S_PRECHARGE
+				{
+					sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
+					goto end;
+				}
+				else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING) ||
+						(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_PREPARING) ||
+						(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_CHARGING) ||
+						(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_TERMINATING) ||
+						(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // S_CHARGING
+				{
+					sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
+					goto end;
+				}
+				else
+				{
+					DEBUG_INFO("ShmSysConfigAndInfo->SysInfo.CcsChargingData[%d].SystemStatus=%d\n",index, ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus);
+					sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
+					goto end;
+				}
+			}
+		}//END FOR CCS_QUANTITY
+
+		for (int index = 0; index < GB_QUANTITY; index++)
+		{
+			if ((gunIndex > 0)&&(gunType[gunIndex-1] == 'G'))
+			{
+				if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_RESERVATION)) // S_PRECHARGE
+				{
+					sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
+					goto end;
+				}
+				else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING) ||
+						(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_PREPARING) ||
+						(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_CHARGING) ||
+						(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_TERMINATING) ||
+						(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // S_CHARGING
+				{
+					sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
+					goto end;
+				}
+				else
+				{
+					DEBUG_INFO("ShmSysConfigAndInfo->SysInfo.GbChargingData[%d].SystemStatus=%d\n",index,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus);
+					sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
+					goto end;
+				}
+
+
+			}
+		}// END FOR GB_QUANTITY
+
+		for (int index = 0; index < AC_QUANTITY; index++)
+		{
+			if ((gunIndex > 0)&&((gunType[gunIndex-1] > '0')&&(gunType[gunIndex-1] <= '9')))
+			{
+				if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_RESERVATION)) // S_PRECHARGE
+				{
+					sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
+					goto end;
+				}
+				else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING) ||
+						(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_PREPARING) ||
+						(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_CHARGING) ||
+						(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_TERMINATING) ||
+						(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // S_CHARGING
+				{
+					sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
+					goto end;
+				}
+				else
+				{
+					DEBUG_INFO("ShmSysConfigAndInfo->SysInfo.AcChargingData[%d].SystemStatus=%d\n",index, ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus);
+					sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
+					goto end;
+				}
+			}
+		}//END FOR AC_QUANTITY
+
+	}//END FOR AvailabilityTypeStr[Inoperative]
+	
+
+	if(strcmp((const char *)typeStr, AvailabilityTypeStr[Operative]) == 0)
+	{
+		//----------------------gunIndex is 0  ------------------------------------------------//
+		if(gunIndex  == 0)
+		{
+			if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D') // 'D' means DC
+			{
+				for(int i=0; i < gunTotalNumber; i++)
+				{
+					for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+					{
+						if ((gunType[i] == 'J' )&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == i)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_FAULT))  //S_FAULT   //(((gunIndex  == 0)|| ((gunIndex > 0)&&(gunType[gunIndex-1] == 'J')) ) &&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != SYS_MODE_FAULT))  //S_FAULT
+						{
+							sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
+							goto end;
+						}
+					}//END FOR CHAdeMO_QUANTITY
+
+					for (int index = 0; index < CCS_QUANTITY; index++)
+					{
+						if (((gunType[i] == 'U')||(gunType[i] == 'E'))&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == i)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_FAULT)) //S_FAULT//(((gunIndex  == 0)|| ((gunIndex > 0)&&((gunType[gunIndex - 1] == 'U')||(gunType[gunIndex - 1] == 'E'))) )&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != SYS_MODE_FAULT)) //S_FAULT
+						{
+							sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
+							goto end;
+						}
+					}//END FOR CCS_QUANTITY
+
+					for (int index = 0; index < GB_QUANTITY; index++)
+					{
+						if ((gunType[i] == 'G')&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == i)&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_FAULT)) //S_FAULT  //(((gunIndex  == 0)|| ((gunIndex > 0)&&(gunType[gunIndex-1] == 'G')))&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != SYS_MODE_FAULT)) //S_FAULT
+						{
+							//ShmOCPP16Data->CsMsg.bits[gunIndex - 1].ChangeAvailabilityReq = 1;
+							sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
+							goto end;
+						}
+					}// END FOR GB_QUANTITY
+
+					for (int index = 0; index < AC_QUANTITY; index++)
+					{
+						if (((gunType[i] > '0')&&(gunType[i] <= '9')) &&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_FAULT))  //S_FAULT // (((gunIndex  == 0)|| ((gunIndex > 0)&&((gunType[gunIndex-1] > '0')&&(gunType[gunIndex-1] <= '9')))) &&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_FAULT))  //S_FAULT
+						{
+							sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
+							goto end;
+						}
+					}//END FOR CHAdeMO_QUANTITY
+
+				}// END FOR gunTotalNumber
+			}
+			else if (ShmSysConfigAndInfo->SysConfig.ModelName[0]=='A') //'A' means AC
+			{
+				for(int i=0; i < gunTotalNumber; i++)
+				{
+					for (int index = 0; index < AC_QUANTITY; index++)
+					{
+						if (((gunType[i] > '0')&&(gunType[i] <= '9')) &&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_FAULT))  //S_FAULT // (((gunIndex  == 0)|| ((gunIndex > 0)&&((gunType[gunIndex-1] > '0')&&(gunType[gunIndex-1] <= '9')))) &&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_FAULT))  //S_FAULT
+						{
+							sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
+							goto end;
+						}
+					}//END FOR CHAdeMO_QUANTITY
+
+				} // END FOR gunTotalNumber
+			}
+
+			sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
+			goto end;
+		}
+
+		//----------------------gunIndex is not 0  ------------------------------------------------//
+	    //check Transaction active
+		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+		{
+			if (((gunIndex > 0)&&(gunType[gunIndex-1] == 'J') ) &&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != SYS_MODE_FAULT))  //S_FAULT
+			{
+				sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
+				goto end;
+			}
+		}//END FOR CHAdeMO_QUANTITY
+
+		for (int index = 0; index < CCS_QUANTITY; index++)
+		{
+			if ((((gunIndex > 0)&&((gunType[gunIndex - 1] == 'U')||(gunType[gunIndex - 1] == 'E'))) )&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != SYS_MODE_FAULT))  //S_FAULT
+			{
+				sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
+				goto end;
+			}
+		}//END FOR CCS_QUANTITY
+
+		for (int index = 0; index < GB_QUANTITY; index++)
+		{
+			if (((gunIndex > 0)&&(gunType[gunIndex-1] == 'G'))&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != SYS_MODE_FAULT)) //S_FAULT
+			{
+				sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
+				goto end;
+			}
+		}// END FOR GB_QUANTITY
+
+		for (int index = 0; index < AC_QUANTITY; index++)
+		{
+			if (((gunIndex > 0)&&((gunType[gunIndex-1] > '0')&&(gunType[gunIndex-1] <= '9'))) &&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_FAULT))  //S_FAULT
+			{
+				sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
+				goto end;
+			}
+		}//END FOR AC_QUANTITY
+	}//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 );
+	}
+
+	if(gunIndex != 0)
+	{
+		if(strstr(comfirmstr, AvailabilityStatusStr[Rejected]) == NULL)
+			ShmOCPP16Data->CsMsg.bits[gunIndex - 1].ChangeAvailabilityReq = 1;
+	}
+	else
+	{
+		if(strstr(comfirmstr, AvailabilityStatusStr[Rejected]) == NULL)
+		{
+			for(int i=0; i < gunTotalNumber/*(CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY)*/; i++)
+				ShmOCPP16Data->CsMsg.bits[i].ChangeAvailabilityReq = 1;
+		}
+	}
+
+	sendChangeAvailabilityConfirmation(uuid, comfirmstr);
+
+	return result;
+}
+
+int handleChangeConfigurationRequest(char *uuid, char *payload)
+{
+	mtrace();
+	int result = FAIL;
+	char keystr[40]={0};
+	char valuestr[100]={0};
+	char comfirmstr[20]={0};
+
+	DEBUG_INFO("handleChangeConfigurationRequest...\n");
+	json_object *ChangeConfiguration;
+	ChangeConfiguration = json_tokener_parse(payload);
+	if(!is_error(ChangeConfiguration))
+	{
+		// Required data
+		sprintf((char*)keystr, "%s", json_object_get_string(json_object_object_get(ChangeConfiguration, "key")));
+		sprintf((char*)valuestr, "%s", json_object_get_string(json_object_object_get(ChangeConfiguration, "value")));
+	}
+	json_object_put(ChangeConfiguration);
+
+
+    if((uuid==NULL) || (payload ==NULL) )
+    {
+		DEBUG_ERROR("Payload is null\n");
+		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;
+    			StoreConfigurationTable();
+    		break;
+
+    		case ConfigurationStatus_Rejected:
+    			sprintf(comfirmstr, "%s", ConfigurationStatusStr[ConfigurationStatus_Rejected] );
+    		break;
+
+    		case RebootRequired:
+    			sprintf(comfirmstr, "%s", ConfigurationStatusStr[RebootRequired]);
+    			StoreConfigurationTable();
+    		break;
+
+    		case NotSupported:
+    			sprintf(comfirmstr, "%s", ConfigurationStatusStr[NotSupported] );
+    			break;
+
+    		default:
+    		break;
+    	}
+    }
+
+    sendChangeConfigurationConfirmation(uuid, comfirmstr);
+	ShmOCPP16Data->MsMsg.bits.ChangeConfigurationConf = 1;
+	if((strcmp(keystr,"WebSocketPingInterval")==0)&&(strcmp(comfirmstr,"Accepted")==0))
+	{
+		ChageWebSocketPingInterval(atoi(valuestr));
+	}
+
+	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_INFO("handleClearCacheRequest...\n");
+    stat("/Storage/OCPP", &stats);
+
+    // Check for directory existence
+    if (S_ISDIR(stats.st_mode) == 1)
+    {}
+    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(AuthorizationCache_JSON,F_OK))!=-1)
+    {
+    	DEBUG_INFO("AuthorizationCache file exist.\n");
+    }
+    else
+    {
+    	DEBUG_INFO("AuthorizationCache file not exist\n");
+    	FILE *log = fopen(AuthorizationCache_JSON, "w+");
+
+    	if(log == NULL)
+    	{
+    		DEBUG_INFO("AuthorizationCache file is NULL\n");
+    		sprintf(comfirmstr, "%s", ClearCacheStatusStr[ClearCacheStatus_Rejected] );
+    		goto end;
+    	}
+    	else
+    	{
+    		fclose(log);
+    	}
+    }
+
+    if((fd = open(AuthorizationCache_JSON,O_RDWR)) < 0)
+    {
+    	DEBUG_INFO("open AuthorizationCache file failed\n");
+        sprintf(comfirmstr, "%s", ClearCacheStatusStr[ClearCacheStatus_Rejected] );
+    }
+    else
+    {
+    	DEBUG_INFO("open AuthorizationCache file successful\n");
+        ftruncate(fd,0);
+        lseek(fd,0,SEEK_SET);
+        close(fd);
+        sprintf(comfirmstr, "%s", ClearCacheStatusStr[ClearCacheStatus_Accepted] );
+    }
+
+end:
+    sendClearCacheConfirmation(uuid, comfirmstr);
+	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};
+	char str[100]={0};
+	int c = 0;
+	char *loc;
+	char fname[200]={0};
+	char comfirmstr[20]={0};
+	char word[1600]={0};
+	int clearflag = FALSE;
+	int chargingProfileIdIsNULL = FALSE;
+	int connectorIsNULL = FALSE;
+	int chargingProfilePurposeIsNULL = FALSE;
+	int stackLevelIsNULL = FALSE;
+	//int GotoEnd = FALSE;
+	FILE *fptr1, *fptr2;
+	char temp[] = "/Storage/OCPP/ClearChargingProfiletemp.json";  // Create temp file
+    int n_chargingProfile=0;
+    int isEmptyFile = FALSE;
+    char sLineWord[1600]={0};
+    char chargingProfiles[10][100]={0};
+    int ChargeProfileCount = 0;
+    char ch;
+    connectorIdInt = chargingProfileIdInt = stackLevelInt = 0;
+    DEBUG_INFO("handleClearChargingProfileRequest...\n");
+    json_object *ClearChargingProfile;
+	ClearChargingProfile = json_tokener_parse(payload);
+	if(!is_error(ClearChargingProfile))
+	{
+		// Optional data
+		if(json_object_object_get(ClearChargingProfile, "id") != NULL)
+			chargingProfileIdInt = json_object_get_int(json_object_object_get(ClearChargingProfile, "id"));
+		else
+			chargingProfileIdIsNULL = TRUE;
+
+		if(json_object_object_get(ClearChargingProfile, "connectorId") != NULL)
+			connectorIdInt = json_object_get_int(json_object_object_get(ClearChargingProfile, "connectorId"));
+		else
+			connectorIsNULL = TRUE;
+
+		if(json_object_object_get(ClearChargingProfile, "chargingProfilePurpose") != NULL)
+			sprintf((char*)chargingProfilePurposeStr, "%s", json_object_get_string(json_object_object_get(ClearChargingProfile, "chargingProfilePurpose")));
+		else
+			chargingProfilePurposeIsNULL = TRUE;
+
+		if(json_object_object_get(ClearChargingProfile, "stackLevel") != NULL)
+			stackLevelInt = json_object_get_int(json_object_object_get(ClearChargingProfile, "stackLevel"));
+		else
+			stackLevelIsNULL = TRUE;
+	}
+	json_object_put(ClearChargingProfile);
+
+
+
+	if(connectorIsNULL == FALSE)
+	{
+		switch(connectorIdInt)
+		{
+			case 0:
+
+			    if(chargingProfilePurposeIsNULL == TRUE)
+				{
+			    	int l = 0;
+			    	strcpy(fname, ChargePointMaxProfile_JSON);
+			    	if((access(fname,F_OK))!=-1)
+			    	{
+			    		strcpy(chargingProfiles[l], fname);
+			    		l = l + 1;
+			    	}
+
+			    	strcpy(fname, TxDefaultProfile_0_JSON);
+			    	if((access(fname,F_OK))!=-1)
+			    	{
+			    		strcpy(chargingProfiles[l], fname);
+			    		l = l + 1;
+			    	}
+			    	ChargeProfileCount = l;
+
+				}
+				else if((chargingProfilePurposeIsNULL == FALSE)&&(strcmp(chargingProfilePurposeStr,"ChargePointMaxProfile")==0))
+				{
+					strcpy(fname, ChargePointMaxProfile_JSON);
+					if((access(fname,F_OK))!=-1)
+					{
+						strcpy(chargingProfiles[0], fname);
+						ChargeProfileCount = 1;
+					}
+				}
+				else if((chargingProfilePurposeIsNULL == FALSE)&&(strcmp(chargingProfilePurposeStr,"TxDefaultProfile")==0))
+				{
+					strcpy(fname, TxDefaultProfile_0_JSON);
+					if((access(fname,F_OK))!=-1)
+					{
+						strcpy(chargingProfiles[0], fname);
+						ChargeProfileCount = 1;
+					}
+				}
+
+				break;
+
+			default:
+			    if(chargingProfilePurposeIsNULL == TRUE)
+			    {
+			    	int m = 0;
+			    	memset(fname, 0, sizeof fname);
+			    	sprintf(fname, "/Storage/OCPP/TxDefaultProfile_%d.json", connectorIdInt);
+			    	if((access(fname,F_OK))!=-1)
+			    	{
+			    		strcpy(chargingProfiles[m], fname);
+			    		m = m + 1;
+			    	}
+
+			    	memset(fname, 0, sizeof fname);
+			    	sprintf(fname, "/Storage/OCPP/TxProfile_%d.json", connectorIdInt);
+			    	if((access(fname,F_OK))!=-1)
+			    	{
+			    		strcpy(chargingProfiles[m], fname);
+			    		m = m + 1;
+			    	}
+
+			    	ChargeProfileCount = m;
+			    }
+				else if((chargingProfilePurposeIsNULL == FALSE)&&(strcmp(chargingProfilePurposeStr,"TxDefaultProfile")==0))
+				{
+					//strcpy(fname, TxDefaultProfile_1_JSON);
+					sprintf(fname, "/Storage/OCPP/TxDefaultProfile_%d.json", connectorIdInt);
+					if((access(fname,F_OK))!=-1)
+					{
+						strcpy(chargingProfiles[0], fname);
+						ChargeProfileCount = 1;
+					}
+
+				}
+				else if((chargingProfilePurposeIsNULL == FALSE)&&(strcmp(chargingProfilePurposeStr,"TxProfile")==0))
+				{
+					sprintf(fname, "/Storage/OCPP/TxProfile_%d.json", connectorIdInt);
+					if((access(fname,F_OK))!=-1)
+					{
+						strcpy(chargingProfiles[0], fname);
+						ChargeProfileCount = 1;
+					}
+					//strcpy(fname, TxProfile_1_JSON);
+				}
+				//strcpy(fname, ChargePointMaxProfile_JSON );
+				break;
+		}
+	}
+	else // Check all Charging Profiles
+	{
+		int i = 0;
+		char fnametemp[200]={0};
+		ChargeProfileCount = 0;
+		//Check ChargePointMaxProfile.json exit
+		if((access("/Storage/OCPP/ChargePointMaxProfile.json",F_OK))!=-1)
+		{
+			strcpy(chargingProfiles[i], "/Storage/OCPP/ChargePointMaxProfile.json");
+			i = i + 1;
+		}
+
+		//Check TxDefaultProfile_0.json exit
+		if((access("/Storage/OCPP/TxDefaultProfile_0.json",F_OK))!=-1)
+		{
+			strcpy(chargingProfiles[i], "/Storage/OCPP/TxDefaultProfile_0.json");
+			i = i + 1;
+		}
+
+        //Check TxDefaultProfile_%d.json
+		for(int j=1; j <= gunTotalNumber; j++)
+		{
+			memset(fnametemp, 0, sizeof fnametemp);
+			sprintf(fnametemp, "/Storage/OCPP/TxDefaultProfile_%d.json", j);
+			if((access(fnametemp,F_OK))!=-1)
+			{
+				strcpy(chargingProfiles[i], fnametemp);
+				i = i + 1;
+			}
+		}
+
+		//Check TxProfile_%d.json
+		for(int j=1; j <= gunTotalNumber; j++)
+		{
+			memset(fnametemp, 0, sizeof fnametemp);
+			sprintf(fnametemp, "/Storage/OCPP/TxProfile_%d.json", j);
+			if((access(fnametemp,F_OK))!=-1)
+			{
+				strcpy(chargingProfiles[i], fnametemp);
+				i = i + 1;
+			}
+		}
+
+		ChargeProfileCount = i;
+	}// End connectorIsNULL is TRUE
+
+	if(ChargeProfileCount == 0)
+	{
+		sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Unknown] );
+		goto end;
+	}
+
+	if(connectorIsNULL == FALSE && (connectorIdInt != 0) && ( (connectorIdInt-1) > gunTotalNumber) )
+	{
+		sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Unknown] );
+		goto end;
+	}
+
+	if((connectorIsNULL == FALSE) && (connectorIdInt == 0) )
+	{
+		memset(str, 0, sizeof str);
+		// clear temp file
+		sprintf(str,"rm -f %s",temp);
+		system(str);
+
+		for(int k=0; k < ChargeProfileCount; k++)
+		{
+			memset(str, 0, sizeof str);
+			//clear file in C
+			sprintf(str,"rm -f %s",chargingProfiles[k]);
+			system(str);
+		}
+
+		sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Accepted] );
+		goto end;
+	}
+	else if(connectorIsNULL == TRUE)
+	{
+		for(int k=0; k < ChargeProfileCount; k++)
+		{
+			fptr1 = fopen(chargingProfiles[k], "r");
+			fptr2 = fopen("/Storage/OCPP/ClearChargingProfiletemp.json", "w+");
+
+			//Check Charging Profile Count
+			while(fscanf(fptr1, "%s", word) != EOF)
+			{
+				//DEBUG_INFO("word=%s\n",word);
+				if(strstr(word, "chargingProfileId")!= NULL)
+				{
+					//DEBUG_INFO("test chargingProfileId \n");
+					n_chargingProfile = n_chargingProfile + 1;
+					//DEBUG_INFO("chargingProfileId 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);
+				printf("file's gun number is %d\n", tempconnectorIdInt);
+
+				//--------------------------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)&&(tempchargingProfileIdInt == chargingProfileIdInt))
+				{
+					//------- not write to  fptr2-------//
+					sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Accepted] );
+					//clearflag = TRUE;
+				}
+				else if((chargingProfilePurposeIsNULL == FALSE)&&(strcmp(tempchargingProfilePurposeStr, chargingProfilePurposeStr) == 0))
+				{
+					//------- not write to  fptr2-------//
+					sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Accepted] );
+				}
+				else if((stackLevelIsNULL == FALSE) &&(tempstackLevelInt == stackLevelInt))
+				{
+					//------- not write to  fptr2-------//
+					sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Accepted] );
+				}
+				else
+				{
+					fprintf(fptr2, sLineWord);//writing data into file
+				}
+
+				memset(sLineWord, 0, sizeof sLineWord);
+
+		   } //End of while ( fgets( sLineWord, sizeof sLineWord, fptr1 ) != NULL )
+
+		   if(clearflag == TRUE)
+		   {
+			   fclose(fptr1);
+			   fclose(fptr2);
+
+			   sprintf(str,"rm -f %s",chargingProfiles[k]);
+			   system(str);
+
+			   // clear temp file
+			   sprintf(str,"rm -f %s",temp);
+			   system(str);
+
+		   }
+		   else
+		   {
+			   fclose(fptr1);
+			   fclose(fptr2);
+
+			   memset(str, 0, sizeof str);
+			   sprintf(str,"rm -f %s",chargingProfiles[k]);
+			   system(str);
+
+			   resultRename = rename(temp, chargingProfiles[k]);
+
+			   if(resultRename == 0)
+			   {
+			       DEBUG_INFO("File ChargingProfile renamed successfully");
+			   }
+			   else
+			   {
+			       DEBUG_INFO("Error: unable to rename the ChargingProfile file");
+			   }
+
+			   if(comfirmstr[0]== 0)
+			   {
+			       sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Unknown] );
+
+			   }
+
+			    //Check chargingProfile is empty file
+			    /*------ Read the file ----------------*/
+			    fptr1=fopen(chargingProfiles[k],"r");
+			    ch=fgetc(fptr1);
+			    rewind(fptr1);
+			    memset(sLineWord, 0, sizeof sLineWord);
+			    if(ch!=EOF)
+			    {
+			        while (fgets( sLineWord, sizeof sLineWord, fptr1) != NULL)
+			        {
+			        	str[strlen(sLineWord) - 1] = '\0'; // eat the newline fgets() stores
+
+			        	if(sLineWord[0]=='\0')
+			        	{
+			        		isEmptyFile = TRUE;
+			        		break;
+			        	}
+			        	else
+			        	{
+			        		isEmptyFile = FALSE;
+			        		break;
+			        	}
+			        }
+			    }
+			    fclose(fptr1);
+
+			    if(isEmptyFile == TRUE)
+			    {
+			    	memset(str, 0, sizeof str);
+			        sprintf(str,"rm -f %s",chargingProfiles[k]);
+			        system(str);
+			    }
+			}
+
+	  }// End of while(int k=0; k < ChargePointCount; k++)
+	}
+	else if((connectorIsNULL == FALSE) && (connectorIdInt != 0) )
+	{
+		DEBUG_INFO("ChargeProfileCount = %d\n", ChargeProfileCount);
+		for(int k=0; k < ChargeProfileCount; k++)
+		{
+		   fptr1 = fopen(chargingProfiles[k], "r");
+		   fptr2 = fopen(temp, "w+");
+		   //Check Charging Profile Count
+		   while(fscanf(fptr1, "%s", word) != EOF)
+		   {
+			   //DEBUG_INFO("word=%s\n",word);
+			   if(strstr(word, "chargingProfileId")!= NULL)
+			   {
+				   n_chargingProfile = n_chargingProfile + 1;
+			   }
+		   }
+		   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)&&(tempchargingProfileIdInt == chargingProfileIdInt))
+			   {
+				   //------- not write to  fptr2-------//
+				   sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Accepted] );
+				   //clearflag = TRUE;
+			   }
+			   else if((stackLevelIsNULL == FALSE) &&(tempstackLevelInt == stackLevelInt))
+			   {
+				   //------- not write to  fptr2-------//
+				   sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Accepted] );
+			   }
+			   else if(stackLevelIsNULL == TRUE)
+			   {
+				   //Clear Whole File
+				   sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Accepted] );
+				   clearflag = TRUE;
+				   break;
+			   }
+			   else
+			   {
+				   fprintf(fptr2, sLineWord);//writing data into file
+			   }
+
+			   memset(sLineWord, 0, sizeof sLineWord);
+		   }
+
+		   if(clearflag == TRUE)
+		   {
+			   fclose(fptr1);
+			   fclose(fptr2);
+
+			   sprintf(str,"rm -f %s",chargingProfiles[k]);
+			   system(str);
+
+			   // clear temp file
+			   sprintf(str,"rm -f %s",temp);
+			   system(str);
+		   }
+		   else
+		   {
+			   fclose(fptr1);
+			   fclose(fptr2);
+
+			   sprintf(str,"rm -f %s",chargingProfiles[k]);
+			   system(str);
+
+			   resultRename = rename(temp, chargingProfiles[k]);
+
+			   if(resultRename == 0)
+			   {
+				   DEBUG_INFO("File ChargingProfile renamed successfully");
+			   }
+			   else
+			   {
+				   DEBUG_INFO("Error: unable to rename the ChargingProfile file");
+			   }
+
+			   if(comfirmstr[0]== 0)
+			   {
+				   sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Unknown] );
+			   }
+
+			   //Check chargingProfile is empty file
+			   /*------ Read the file ----------------*/
+			   fptr1=fopen(chargingProfiles[k],"r");
+			   ch=fgetc(fptr1);
+			   rewind(fptr1);
+			   memset(sLineWord, 0, sizeof sLineWord);
+			   if(ch!=EOF)
+			   {
+				   while (fgets( sLineWord, sizeof sLineWord, fptr1) != NULL)
+				   {
+					   str[strlen(sLineWord) - 1] = '\0'; // eat the newline fgets() stores
+
+					   if(sLineWord[0]=='\0')
+					   {
+						   isEmptyFile = TRUE;
+						   break;
+					   }
+					   else
+					   {
+						   isEmptyFile = FALSE;
+						   break;
+					   }
+				   }
+			   }
+			   fclose(fptr1);
+
+			   if(isEmptyFile == TRUE)
+			   {
+				   memset(str, 0, sizeof str);
+				   sprintf(str,"rm -f %s",chargingProfiles[k]);
+				   system(str);
+			   }
+			   /*------- End of reading ---------------*/
+		   }
+
+	  } //  while(int k=0; k < ChargeProfileCount; k++)
+
+	}// (connectorIsNULL == FALSE) && (connectorIdInt != 0)
+
+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 message[80]={0};
+
+	DEBUG_INFO("handleDataTransferRequest...\n");
+	if((uuid != NULL) && (payload != NULL))
+	{
+		json_object *DataTransfer;
+		DataTransfer = json_tokener_parse(payload);
+
+		if(!is_error(DataTransfer))
+		{
+			// Required data
+			sprintf((char*)tempvendorId, "%s", json_object_get_string(json_object_object_get(DataTransfer, "vendorId")));
+
+			// Optional data
+			if(json_object_object_get(DataTransfer, "messageId") != NULL)
+				sprintf((char*)tempmessageId, "%s", json_object_get_string(json_object_object_get(DataTransfer, "messageId")));
+
+			if(json_object_object_get(DataTransfer, "data") != NULL)
+				sprintf((char*)tempdata, "%s", json_object_get_string(json_object_object_get(DataTransfer, "data")));
+
+			result = PASS;
+		}
+		json_object_put(DataTransfer);
+
+
+		sprintf(message,"[%d,\"%s\",{\"status\":\"%s\",\"data\":\"vendorId-%s messageId-%s data-%s\"}]",MESSAGE_TYPE_CALLRESULT, uuid, "Rejected", tempvendorId, tempmessageId, tempdata );
+	}
+	else
+	{
+		char guid[37]={0};
+		random_uuid(guid);
+
+		//[2,"1577349264923","DataTransfer",{"vendorId":"Phihong","messageId":"MSGID","data":"Data1"}]
+		sprintf(message,"[%d,\"%s\",\"%s\",{\"vendorId\":\"Phihong\",\"messageId\":\"MSGID\",\"data\":\"Data1\"}]",MESSAGE_TYPE_CALL, guid, "DataTransfer");
+	}
+
+	LWS_Send(message);
+	return result;
+}
+
+int handleGetCompositeScheduleRequest(char *uuid, char *payload)
+{
+	mtrace();
+	int result = FAIL;
+	int connectorIdInt, durationInt;
+	char chargingRateUnitStr[4]={0};
+	char comfirmstr[20];
+    int confirmPeriods = 0;
+
+	DEBUG_INFO("handleGetCompositeScheduleRequest...\n");
+	json_object *GetCompositeSchedule;
+	GetCompositeSchedule = json_tokener_parse(payload);
+	if(!is_error(GetCompositeSchedule))
+	{
+		// Required data
+		connectorIdInt= json_object_get_int(json_object_object_get(GetCompositeSchedule, "connectorId"));
+		durationInt = json_object_get_int(json_object_object_get(GetCompositeSchedule, "duration"));
+
+		// Optional data
+		if(json_object_object_get(GetCompositeSchedule, "chargingRateUnit") != NULL)
+			sprintf((char*)chargingRateUnitStr, "%s", json_object_get_string(json_object_object_get(GetCompositeSchedule, "chargingRateUnit")));
+	}
+	json_object_put(GetCompositeSchedule);
+
+	memset(ShmOCPP16Data->GetCompositeSchedule, 0, sizeof(struct StructChargingSchedulePeriod)*gunTotalNumber);
+	if((connectorIdInt == 0) ||
+	   ((connectorIdInt > 0) && ((connectorIdInt -1) < gunTotalNumber)))
+  	{
+		int gun_index = (connectorIdInt==0?0:connectorIdInt-1);
+		struct StructChargingProfile tmpProfile[1];
+
+  		checkCompositeSchedule(connectorIdInt, durationInt, &tmpProfile[0]);
+  		for(int idx=0;idx<ARRAY_SIZE(ShmOCPP16Data->GetCompositeSchedule[gun_index].ResponseChargingSchedule.ChargingSchedulePeriod);idx++)
+  		{
+			DEBUG_INFO("Smart Period-%02d start: %d\n", idx, tmpProfile[0].ChargingSchedule.ChargingSchedulePeriod[idx].StartPeriod);
+			DEBUG_INFO("Smart Period-%02d limit: %f\n", idx, tmpProfile[0].ChargingSchedule.ChargingSchedulePeriod[idx].Limit);
+		}
+  		ShmOCPP16Data->GetCompositeSchedule[gun_index].ResponseConnectorId = connectorIdInt;
+  		memcpy(&ShmOCPP16Data->GetCompositeSchedule[gun_index].ResponseChargingSchedule, &tmpProfile[0].ChargingSchedule, sizeof(struct StructChargingSchedule));
+  		memcpy(&ShmOCPP16Data->GetCompositeSchedule[gun_index].ResponseScheduleStart ,&tmpProfile[0].ChargingSchedule.StartSchedule, ARRAY_SIZE(tmpProfile[0].ChargingSchedule.StartSchedule));
+
+  		for(int idx=0;idx<ARRAY_SIZE(ShmOCPP16Data->GetCompositeSchedule[gun_index].ResponseChargingSchedule.ChargingSchedulePeriod);idx++)
+  		{
+   			DEBUG_INFO("Composite Period-%02d start: %d\n", idx, ShmOCPP16Data->GetCompositeSchedule[gun_index].ResponseChargingSchedule.ChargingSchedulePeriod[idx].StartPeriod);
+  			DEBUG_INFO("Composite Period-%02d limit: %f\n", idx, ShmOCPP16Data->GetCompositeSchedule[gun_index].ResponseChargingSchedule.ChargingSchedulePeriod[idx].Limit);
+
+  			if((ShmOCPP16Data->GetCompositeSchedule[gun_index].ResponseChargingSchedule.ChargingSchedulePeriod[idx].StartPeriod==0) &&
+  			   (ShmOCPP16Data->GetCompositeSchedule[gun_index].ResponseChargingSchedule.ChargingSchedulePeriod[idx].Limit==0))
+  			{
+  				confirmPeriods = idx;
+  				break;
+  			}
+  		}
+  		sprintf(comfirmstr, "%s", GetCompositeScheduleStatusStr[GetCompositeScheduleStatus_Accepted] );
+  	}
+  	else
+  	{
+  		sprintf(comfirmstr, "%s", GetCompositeScheduleStatusStr[GetCompositeScheduleStatus_Rejected] );
+  	}
+
+	sendGetCompositeScheduleConfirmation(uuid, comfirmstr, connectorIdInt, confirmPeriods);
+
+	return result;
+}
+
+int handleGetConfigurationRequest(char *uuid, char *payload)
+{
+	mtrace();
+	int result = FAIL;
+	int MaxKeySupported = 0;
+	int n_keys = 0;
+	char requestKey[43][50]={0};
+
+	DEBUG_INFO("handleGetConfigurationRequest...\n");
+	json_object *GetConfiguration;
+	GetConfiguration = json_tokener_parse(payload);
+
+	if(!is_error(GetConfiguration))
+	{
+		// Optional data
+		if(json_object_object_get(GetConfiguration, "key") != NULL)
+		{
+			for(int idx=0;idx<json_object_array_length(json_object_object_get(GetConfiguration, "key"));idx++)
+			{
+				sprintf((char*)requestKey[idx], "%s", json_object_get_string(json_object_array_get_idx(json_object_object_get(GetConfiguration, "key"), idx)));
+				n_keys = idx + 1;
+			}
+		}
+	}
+	json_object_put(GetConfiguration);
+
+	UnknownKeynum = 0;
+	memset( (void *)unknownkey, 0, sizeof(unknownkey));
+
+	MaxKeySupported = GetConfigurationMaxKeysNUM;
+	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]);
+		}
+	}
+	else
+	{
+		DEBUG_INFO("There is no key in Message, get all configuration\n");
+		getKeyValue("");
+	}
+
+	processUnkownKey();
+	sendGetConfigurationConfirmation(uuid);
+
+	return result;
+}
+
+static char fnamePlusPath[100]={0};
+static char fnamePWithNoPath[60]={0};
+void checkUploadLog(void)
+{
+	FILE *fp;
+	/* Open the command for reading. */
+	fp = popen("find /mnt/ -type f -name \"*.zip\" |xargs ls -t", "r");
+	if (fp == NULL) {
+	   printf("Failed to run command\n" );
+	   exit(1);
+	}
+
+	int ftppathlen = 0;
+	memset(fnamePlusPath, 0, sizeof(fnamePlusPath));
+	int i = 0;
+	/* Read the output a line at a time - output it. */
+	while (fgets(fnamePlusPath, sizeof(fnamePlusPath), fp) != NULL) {
+		if(i==0)
+		{
+			ftppathlen = strlen(fnamePlusPath);
+			printf("%s\n", fnamePlusPath);
+			fnamePlusPath[ftppathlen]='\0';
+			break;
+		}
+		i= i+1;
+	}
+
+	/* close */
+	pclose(fp);
+
+	for(int k=0; k< sizeof(fnamePlusPath); k++)
+	{
+		if((fnamePlusPath[k]=='\n') || (fnamePlusPath[k]=='r'))
+		{
+			fnamePlusPath[k]='\0';
+		}
+	}
+
+
+	i=1;
+	//char fname[60]={0};
+	while(i < ftppathlen)
+	{
+		int len=ftppathlen-i;
+		if(fnamePlusPath[len]== 47) // '/' ascll code: 47
+		{
+			printf("compare '/' all right\n");
+			break;
+		}
+		i=i+1;
+	}
+
+	memset(fnamePWithNoPath, 0, sizeof(fnamePWithNoPath));
+	strncpy(fnamePWithNoPath, fnamePlusPath+(ftppathlen-i+1), i+1);
+	fnamePWithNoPath[i+1] = '\0';
+
+	for(int j=0; j< sizeof(fnamePWithNoPath); j++)
+	{
+		if((fnamePWithNoPath[j]=='\n') || (fnamePWithNoPath[j]=='r'))
+		{
+			fnamePWithNoPath[j]='\0';
+		}
+	}
+
+	FILE* fp1 = fopen(fnamePlusPath, "r");
+	if (fp1)
+	{
+		printf("testfuc : fnamePlusPath=%s exist.\n", fnamePlusPath);
+		// file exists
+		fclose(fp1);
+	}
+	else
+	{
+		// file doesn't exist
+		printf("testfuc : fnamePlusPath=%s not exist!\n", fnamePlusPath);
+	}
+}
+
+int handleGetDiagnosticsRequest(char *uuid, char *payload)
+{
+	mtrace();
+	int result = FAIL;
+	char cmdBuf[512];
+	char fName[258];
+	time_t CurrentTime;
+	struct tm *tm;
+
+	pthread_t th_Status;
+	CurrentTime = time(NULL);
+	tm = localtime(&CurrentTime);
+	sprintf(fName ,"%s-%s-%04d%02d%02d%02d%02d%02d.zip", ShmSysConfigAndInfo->SysConfig.ModelName, ShmSysConfigAndInfo->SysConfig.SerialNumber, (tm->tm_year+1900), (tm->tm_mon+1),tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec);
+	sendGetDiagnosticsConfirmation(uuid, fName);
+	system("exec /root/logPackTools 'log' 6");
+	sprintf(cmdBuf, "mv /mnt/log.zip /mnt/%s", fName);
+	system(cmdBuf);
+	checkUploadLog();
+
+	pthread_create(&th_Status, NULL, GetDiagnosticsProcess, stringtrimspace(payload));
+
+	return result;
+}
+
+void* GetDiagnosticsProcess(void* data)
+{
+	pthread_detach(pthread_self());
+	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 sstr[260]={ 0 };
+	int c = 0;
+	char *loc;
+	int isSuccess = FALSE;
+	char ftpbuf[200]={0};
+	char * pch;
+
+	char str[300]={ 0 };
+	strcpy(str,(const char*)data);
+
+	retriesIsNULL = retryIntervalIsNULL = startTimeIsNULL = stopTimeIsNULL = FALSE;
+
+	DEBUG_INFO("GetDiagnosticsProcess...%s\n", str);
+	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);
+	//strcpy(locationstr,"http://test.evsocket.phihong.com.cn:9001/UploadFiles/Diagnostics/");
+
+	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] != ',')&&(loc[strlen("retries")+2+c] != '}'))
+		{
+			sstr[c] = loc[strlen("retries")+2+c];
+			c++;
+		}
+		sstr[c] = '\0';
+		retriesInt = atoi(sstr);
+	}
+
+	if(retriesIsNULL == TRUE)
+	{
+		retriesInt = 3; // If this field is not present, it is left to Charge Point to decide how many times it wants to retry.
+	}
+
+	//****************retryInterval*******************/
+	c = 0;
+	loc = strstr(str, "retryInterval");
+	if(loc == NULL)
+	{
+		retryIntervalIsNULL = TRUE;
+		retryIntervalInt = 30; // if this field is not present, it is left to Charge Point to decide how long to wait between attempts.
+	}
+	else
+	{
+		while ((loc[strlen("retryInterval")+2+c] != ',')&&(loc[strlen("retries")+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*/
+
+	//DEBUG_INFO("fnamePlusPath =%s\n",fnamePlusPath);
+	if((access(fnamePlusPath,F_OK))!=-1)
+	{
+		DEBUG_INFO("fnamePlusPath exist.\n");
+	}
+	else
+	{
+		DEBUG_INFO("fnamePlusPath not exist!\n");
+		sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatus_UploadFailed]);
+		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)&&(strcmp(protocol,"http")!=0))
+	{
+		DEBUG_INFO("protocol is not ftp/http ! \n");
+		sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatus_UploadFailed]);
+		goto end;
+
+	}
+
+	if(strncmp(locationstr,"http", 4) == 0)
+	{
+		sscanf(locationstr,"%[^:]:%*2[/]%[^/]/%199[^\n]", protocol, host, path);
+
+		sprintf(ftppath,"/%s", path);
+
+		do{
+			isSuccess = httpUploadFile(host, ftppath, fnamePlusPath, locationstr);
+			sleep(retryIntervalInt);
+		}while((isSuccess == 0)&&(retriesInt > 0 && retriesInt --));
+
+		if(!isSuccess)
+		{
+			DEBUG_INFO("Diagnostics fail.\n");
+			sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatus_UploadFailed]);
+		}
+		else
+		{
+			DEBUG_INFO("sendDiagnosticsStatusNotificationRequest Uploaded\n");
+			sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatus_Uploaded]);
+		}
+
+	}
+	else
+	{
+		sscanf(host,"%[^/]%s",host1, path1);
+		sprintf(ftppath,"%s", path1);
+
+		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;
+		memset(ftpbuf, 0, sizeof(ftpbuf));
+
+		if(port == 0)
+		   port = 21;
+
+		do{
+		    isSuccess = ftpFile(host1, user, password, port, ftppath, fnamePlusPath, fnamePWithNoPath);
+		    sleep(retryIntervalInt);
+		}while((!isSuccess)&&(retriesInt > 0 && retriesInt --));
+
+		if(!isSuccess)
+		{
+			DEBUG_INFO("Diagnostics fail.\n");
+			sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatus_UploadFailed]);
+		}
+		else
+		{
+			DEBUG_INFO("sendDiagnosticsStatusNotificationRequest Uploaded\n");
+			sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatus_Uploaded]);
+		}
+	}
+
+end:
+	DiagnosticsStatusNotificationStatus = DIAGNOSTIC_STATUS_IDLE;
+	pthread_exit(NULL);
+}
+
+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};
+	int tempIndex = 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 },sstrtemp[1600]={ 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;
+
+	strcpy(sstrtemp, stringtrimspace(payload));
+
+	//**********connectorId****************/
+	c = 0;
+	memset(sstr ,0, sizeof(sstr) );
+	loc = strstr(sstrtemp, "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)  // Number of the connector on which to start the transaction. connectorId SHALL be > 0
+	{
+		strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
+		goto end;
+	}
+
+	//****************idTag*******************/
+	c = 0;
+	memset(sstr ,0, sizeof(sstr) );
+	loc = strstr(sstrtemp, "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(sstrtemp, "chargingProfile");
+	if(loc == NULL)
+	{
+		chargingProfileIsNULL = TRUE;
+	}
+	else
+	{
+		//****************chargingProfileId*******************/
+		c=0;
+		loc = strstr(sstrtemp, "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(sstrtemp, "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(sstrtemp, "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(sstrtemp, "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(sstrtemp, "chargingProfileKind");
+		while (loc[3+strlen("chargingProfileKind")+c] != '\"')
+		{
+			sstr[c] = loc[3+strlen("chargingProfileKind")+c];
+			c++;
+		}
+		sstr[c] = '\0';
+		strcpy(chargingProfileKindstr,sstr);
+
+		//****************recurrencyKind*******************/
+		loc = strstr(sstrtemp, "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(sstrtemp, "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(sstrtemp, "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(sstrtemp, "chargingSchedule");
+		if(loc != NULL)
+		{
+			//****************duration*******************/
+			loc = strstr(sstrtemp, "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(sstrtemp, "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(sstrtemp, "chargingRateUnit");
+			while (loc[3+strlen("chargingRateUnit")+c] != '\"')
+			{
+				sstr[c] = loc[3+strlen("chargingRateUnit")+c];
+				c++;
+			}
+			sstr[c] = '\0';
+			strcpy(chargingRateUnitstr,sstr);
+
+			//****************minChargingRate*******************/
+			loc = strstr(sstrtemp, "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 = sstrtemp;
+
+
+			while ((where = strstr(where, "startPeriod"))) {
+				        where += what_len;
+				        chargingSchedulePeriodCount++;
+			}
+
+			where = sstrtemp;
+
+			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;
+
+			} // END FOR chargingSchedulePeriodCount
+		}// END IF chargingSchedule
+
+	} // END chargingProfile
+
+	/*
+
+	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(gunType[connectorIdInt -1] == 'J')
+		{
+
+			if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+			{
+				tempIndex =  ((connectorIdInt -1) == 2) ? 1: 0;
+			}
+			else
+			{
+				tempIndex = connectorIdInt -1;
+			}
+
+			for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex )
+				{
+
+					if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId != -1)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId >= 0)&&(strcmp((const char *)ShmOCPP16Data->ReserveNow[index].IdTag, idTagstr) == 0))
+					{
+						//Reserved
+						DEBUG_INFO("Reserved now !!!The idTag matches the idTag of Reservation!!!\n");
+					}
+					else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId != -1)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId >= 0)&&(strcmp((const char *)ShmOCPP16Data->ReserveNow[index].IdTag, 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 != SYS_MODE_IDLE)				//S_IDLE
+							&& (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != SYS_MODE_PREPARING ) 	//S_PRECHARGE
+							&& (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != SYS_MODE_PREPARE_FOR_EV ) 	//S_PREPARING_FOR_EV
+							&& (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != SYS_MODE_PREPARE_FOR_EVSE ))   // S_PREPARING_FOR_EVSE
+						{
+							strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
+							goto end;
+						}
+					}//END FOR ELSE
+				}
+			}// END FOR CHAdeMO_QUANTITY
+
+		}
+		else if((gunType[connectorIdInt -1] == 'U')||(gunType[connectorIdInt -1] == 'E'))
+		{
+			if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+			{
+				tempIndex =  ((connectorIdInt -1) == 2) ? 1: 0;
+			}
+			else
+			{
+				tempIndex = connectorIdInt -1;
+			}
+
+			for (int index = 0; index < CCS_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
+				{
+					if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ReservationId != -1)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ReservationId >= 0)&&(strcmp((const char *)ShmOCPP16Data->ReserveNow[index].IdTag, idTagstr) == 0))
+					{
+						//Reserved
+						DEBUG_INFO("Reserved now !!!The idTag matches the idTag of Reservation!!!\n");
+					}
+					else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ReservationId != -1)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ReservationId >= 0)&&(strcmp((const char *)ShmOCPP16Data->ReserveNow[index].IdTag, 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 != SYS_MODE_IDLE)          //S_IDLE
+							&& (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != SYS_MODE_PREPARING)   	//S_PRECHARGE
+							&& (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != SYS_MODE_PREPARE_FOR_EV)   	//S_PREPARING_FOR_EV
+							&& (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != SYS_MODE_PREPARE_FOR_EVSE)) 	// S_PREPARING_FOR_EVSE
+						{
+							strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
+							goto end;
+						}
+
+					}// END FOR ELSE
+				}
+			}// END FOR CCS_QUANTITY
+		}
+		else if(gunType[connectorIdInt -1] == 'G')
+		{
+			if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+			{
+				tempIndex =  ((connectorIdInt -1) == 2) ? 1: 0;
+			}
+			else
+			{
+				tempIndex = connectorIdInt -1;
+			}
+
+			for (int index = 0; index < GB_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex )
+				{
+					if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ReservationId != -1)&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ReservationId >= 0)&&(strcmp((const char *)ShmOCPP16Data->ReserveNow[index].IdTag, idTagstr) == 0))
+					{
+						//Reserved
+						DEBUG_INFO("Reserved now !!!The idTag matches the idTag of Reservation!!!\n");
+					}
+					else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ReservationId != -1)&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ReservationId >= 0)&&(strcmp((const char *)ShmOCPP16Data->ReserveNow[index].IdTag, 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 != SYS_MODE_IDLE)         	//S_IDLE
+							&& (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != SYS_MODE_PREPARING)		//S_PRECHARGE
+							&& (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != SYS_MODE_PREPARE_FOR_EV)		//S_PREPARING_FOR_EV
+							&& (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != SYS_MODE_PREPARE_FOR_EVSE)) 		// S_PREPARING_FOR_EVSE
+						{
+							strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
+							goto end;
+						}
+
+					}// END FOR ELSE
+				}
+			} // END FOR GB_QUANTITY
+
+		}
+		else
+		{
+			if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D') // 'D' means DC
+			{
+				tempIndex = 2;
+			}
+			else
+			{
+				tempIndex = connectorIdInt -1;
+			}
+
+			for (int index = 0; index < AC_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex )
+				{
+
+					if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].ReservationId != -1)&&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].ReservationId >= 0)&&(strcmp((const char *)ShmOCPP16Data->ReserveNow[index].IdTag, idTagstr) == 0))
+					{
+						//Reserved
+						DEBUG_INFO("Reserved now !!!The idTag matches the idTag of Reservation!!!\n");
+					}
+					else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].ReservationId != -1)&&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].ReservationId >= 0)&&(strcmp((const char *)ShmOCPP16Data->ReserveNow[index].IdTag, 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 != SYS_MODE_IDLE)				//S_IDLE
+							&& (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_PREPARING) 	//S_PRECHARGE
+							&& (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_PREPARE_FOR_EV) 	//S_PREPARING_FOR_EV
+							&& (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_PREPARE_FOR_EVSE))   // 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]);
+
+
+				//memset idTag
+				memset((char *)ShmOCPP16Data->StartTransaction[connectorIdInt -1].IdTag,0, 20);
+				strcpy((char *)ShmOCPP16Data->StartTransaction[connectorIdInt -1].IdTag, idTagstr);
+
+
+				memset((char *)ShmOCPP16Data->StopTransaction[connectorIdInt -1].IdTag,0, 20);
+				strcpy((char *)ShmOCPP16Data->StopTransaction[connectorIdInt -1].IdTag, idTagstr);
+
+
+			}
+			else
+			{
+				strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
+			}
+
+		}
+		else
+		{
+			ShmOCPP16Data->CsMsg.bits[connectorIdInt -1].RemoteStartTransactionReq = 1;
+			strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Accepted]);
+
+
+			//memset idTag
+			memset((char *)ShmOCPP16Data->StartTransaction[connectorIdInt -1].IdTag,0, 20);
+			strcpy((char *)ShmOCPP16Data->StartTransaction[connectorIdInt -1].IdTag, idTagstr);
+
+			memset((char *)ShmOCPP16Data->StopTransaction[connectorIdInt -1].IdTag,0, 20);
+			strcpy((char *)ShmOCPP16Data->StopTransaction[connectorIdInt -1].IdTag, idTagstr);
+
+		}
+	 }
+	 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);
+
+	//OCPP send RemoteStartConfirmation by first.
+	sendRemoteStartConfirmation(uuid, comfirmstr);
+
+	return result;
+}
+
+int handleRemoteStopTransactionRequest(char *uuid, char *payload)
+{
+	mtrace();
+	int result = FAIL;
+	int match = FALSE;
+	int GunNO = 0;
+	int tempIndex = 0;
+	int transactionIdInt=0;
+	int transactionIdIsNULL= FALSE;
+	char sstr[16]={ 0 },sstrtemp[50]={ 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;
+	}
+
+	strcpy(sstrtemp, stringtrimspace(payload));
+
+	c=0;
+	loc = strstr(sstrtemp, "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;gun_index++)
+	    {
+			if(ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId == transactionIdInt)
+	        {
+				//check Transaction active
+				if(gunType[gun_index] == 'J')
+				{
+					if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+					{
+						tempIndex = ((gun_index==2) ? 1: 0);
+					}
+					else
+					{
+						tempIndex = gun_index;
+					}
+
+					for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+					{
+						if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
+						{
+							if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_TERMINATING)) // SYS_MODE_CHARGING, SYS_MODE_TERMINATING
+							{
+								match = TRUE;
+								GunNO = gun_index;
+							}
+						}
+					}// END FOR CHAdeMO_QUANTITY
+
+				}
+				else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
+				{
+					if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+					{
+						tempIndex = ((gun_index==2) ? 1: 0);
+					}
+					else
+					{
+						tempIndex = gun_index;
+					}
+
+					for (int index = 0; index < CCS_QUANTITY; index++)
+					{
+						if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
+						{
+							if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_TERMINATING) ) // SYS_MODE_CHARGING, SYS_MODE_TERMINATING
+							{
+								match = TRUE;
+								GunNO = gun_index;
+							}
+						}
+					}// END FOR CCS_QUANTITY
+				}
+				else if(gunType[gun_index] == 'G')
+				{
+					if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+					{
+						tempIndex = ((gun_index==2) ? 1: 0);
+					}
+					else
+					{
+						tempIndex = gun_index;
+					}
+
+					for (int index = 0; index < GB_QUANTITY; index++)
+					{
+						if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
+						{
+							if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_TERMINATING)) // SYS_MODE_CHARGING, SYS_MODE_TERMINATING
+							{
+								match = TRUE;
+								GunNO = gun_index;
+							}
+						}
+					}// END FOR GB_QUANTITY
+
+				}
+				else
+				{
+					if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D') // 'D' means DC
+					{
+						tempIndex = 2;
+					}
+					else
+					{
+						tempIndex = gun_index;
+					}
+
+					for (int index = 0; index < AC_QUANTITY; index++)
+					{
+						if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
+						{
+							if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_TERMINATING)) // SYS_MODE_CHARGING, SYS_MODE_TERMINATING
+							{
+								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;
+	int tempIndex = 0;
+	char expiryDatestr[30]={0}, idTagstr[20]={0},parentIdTagstr[20]={0};
+	char comfirmstr[20]={0};
+	char sstr[180]={ 0 },sstrtemp[200]={ 0 };
+	int c = 0;
+	char *loc;
+	//char *ptr;
+
+	DEBUG_INFO("handleReserveNowTransactionRequest ...\n");
+
+	strcpy(sstrtemp, stringtrimspace(payload));
+	//***(1)connectorId ****/
+	c=0;
+	loc = strstr(sstrtemp, "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];
+		//printf("i=%d sstr=%c\n",c, sstr[c]);
+		c++;
+	}
+	sstr[c] = '\0';
+	connectorIdInt = atoi(sstr);
+
+	//***(2)expiryDate ****/
+	loc = strstr(sstrtemp, "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(sstrtemp, "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(sstrtemp, "parentIdTag");
+	memset(sstr ,0, sizeof(sstr) );
+	c = 0;
+
+	if(loc == NULL)
+	{
+		strcpy(parentIdTagstr, "");
+	}
+	else
+	{
+		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(sstrtemp, "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
+	{
+	SYS_MODE_BOOTING		= 0,
+	SYS_MODE_IDLE    	  	= 1,
+	SYS_MODE_AUTHORIZING		= 2,
+	SYS_MODE_MODE_REASSIGN_CHECK	= 3,
+	SYS_MODE_REASSIGN		= 4,
+	SYS_MODE_PREPARING		= 5,
+	SYS_MODE_PREPARE_FOR_EV		= 6,
+	SYS_MODE_PREPARE_FOR_EVSE	= 7,
+	SYS_MODE_CHARGING		= 8,
+	SYS_MODE_TERMINATING		= 9,
+	SYS_MODE_COMPLETE		= 10,
+	SYS_MODE_ALARM			= 11,
+	SYS_MODE_FAULT			= 12,
+	SYS_MODE_RESERVATION		= 13,
+	SYS_MODE_BOOKING		= 14,
+	SYS_MODE_MAINTAIN		= 15,
+	SYS_MODE_DEBUG			= 16,
+	SYS_MODE_CCS_PRECHARGE_STEP0	= 17,
+	SYS_MODE_CCS_PRECHARGE_STEP1	= 18,
+	SYS_MODE_UPDATE			= 19
+	};
+	*/
+	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))
+	{
+		//check Transaction active
+		if(gunType[connectorIdInt -1] == 'J')
+		{
+			if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+			{
+				tempIndex = (((connectorIdInt -1)==2) ? 1: 0);
+			}
+			else
+			{
+				tempIndex = connectorIdInt -1;
+			}
+
+			for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
+				{
+					if(reservationIdInt != ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId)
+					{
+						if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != SYS_MODE_FAULT)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != SYS_MODE_ALARM)) //S_FAULT
+						{
+							if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_IDLE) //S_IDLE
+							{
+								ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
+								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
+							}
+							else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_MAINTAIN)||(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //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 == SYS_MODE_PREPARING) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_RESERVATION) ) //S_PRECHARGE
+							{
+								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
+							}
+							else
+							{
+								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
+							}
+						}
+						else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_TERMINATING)) // SYS_MODE_FAULT, SYS_MODE_ALARM, SYS_MODE_TERMINATING   ---> SuspendedEV
+						{
+							strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
+						}
+					}
+					else
+					{
+						//replace reservation
+						ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
+						strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
+					}
+
+				}
+			} // END FOR CHAdeMO_QUANTITY
+
+		}
+		else if((gunType[connectorIdInt -1] == 'U')||(gunType[connectorIdInt -1] == 'E'))
+		{
+			if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+			{
+				tempIndex = (((connectorIdInt -1)==2) ? 1: 0);
+			}
+			else
+			{
+				tempIndex = connectorIdInt -1;
+			}
+
+			for (int index = 0; index < CCS_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
+				{
+
+					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 != SYS_MODE_FAULT)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != SYS_MODE_ALARM)) //S_FAULT
+						{
+							if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_IDLE) //S_IDLE
+							{
+								ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
+								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
+							}
+							else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_MAINTAIN) ||(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //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 == SYS_MODE_PREPARING) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_RESERVATION)) //S_PRECHARGE
+							{
+								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
+							}
+							else
+							{
+								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
+							}
+						}
+						else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus ==SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus ==SYS_MODE_ALARM) ||(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_TERMINATING)) //SYS_MODE_FAUL, SYS_MODE_TERMINATING  ---> SuspendedEV
+						{
+							strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
+						}
+					}
+					else
+					{
+						//replace reservation
+						ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
+						strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
+					}
+				}
+			} // END FOR CCS_QUANTITY
+
+		}
+		else if(gunType[connectorIdInt -1] == 'G')
+		{
+			if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+			{
+				tempIndex = (((connectorIdInt -1)==2) ? 1: 0);
+			}
+			else
+			{
+				tempIndex = connectorIdInt -1;
+			}
+
+			for (int index = 0; index < GB_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
+				{
+
+					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 != SYS_MODE_FAULT)&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != SYS_MODE_ALARM)) //SYS_MODE_FAULT, SYS_MODE_ALARM
+						{
+
+							if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_IDLE) //S_IDLE
+							{
+								ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
+								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
+							}
+							else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_MAINTAIN) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //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 == SYS_MODE_PREPARING) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_RESERVATION) ) //S_PRECHARGE
+							{
+								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
+							}
+							else
+							{
+								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
+							}
+						}
+						else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus ==SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus ==SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus ==SYS_MODE_TERMINATING)) //SYS_MODE_FAULT, SYS_MODE_ALARM ,SYS_MODE_TERMINATING  ---> SuspendedEV
+						{
+							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
+		{
+			if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D') // 'D' means DC
+			{
+				tempIndex = 2;
+			}
+			else
+			{
+				tempIndex = (connectorIdInt -1);
+			}
+
+			for (int index = 0; index < AC_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
+				{
+
+					if(reservationIdInt != ShmSysConfigAndInfo->SysInfo.AcChargingData[index].ReservationId)
+					{
+
+						if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_FAULT)&&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_ALARM)) //SYS_MODE_FAULT, SYS_MODE_ALARM
+						{
+							if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_IDLE) //S_IDLE
+							{
+								if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState == CP_STATE_B) ||(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState == CP_STATE_C) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState == CP_STATE_D))
+								{
+									strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
+								}
+								else
+								{
+									ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
+									strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
+								}
+							}
+							else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_MAINTAIN) ||(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //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 == SYS_MODE_PREPARING) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_RESERVATION) ) //S_PRECHARGE
+							{
+								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
+							}
+							else
+							{
+								strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
+							}
+						}
+						else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_FAULT) ||(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_TERMINATING)) //SYS_MODE_FAULT, SYS_MODE_ALARM, SYS_MODE_TERMINATING ---> SuspendedEV
+						{
+							strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
+						}
+					}
+					else
+					{
+						//replace reservation
+						ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
+						strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
+					}
+				}
+			} // END FOR AC_QUANTITY
+		}
+
+		sprintf((char *)ShmOCPP16Data->ReserveNow[connectorIdInt-1].ResponseStatus, "%s" ,comfirmstr);
+	}
+	else if(connectorIdInt == 0)
+	{
+		//check Transaction active
+		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+		{
+			if(reservationIdInt != ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId)
+			{
+				if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_MAINTAIN) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //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 == SYS_MODE_PREPARING) //S_PRECHARGE
+				{
+					strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
+					goto end;
+				}
+				else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_TERMINATING)) //SYS_MODE_FAULT, SYS_MODE_TERMINATING ---> SuspendedEV
+				{
+					strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
+					goto end;
+				}
+				else if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != SYS_MODE_IDLE) //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 == SYS_MODE_MAINTAIN)||(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //S_TERMINATING  //else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == '6') || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == '9'))
+				  {
+					  strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Unavailable]);
+					  goto end;
+				  }
+				  else if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_PREPARING) //SYS_MODE_PREPARING
+				  {
+					  strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
+					  goto end;
+				  }
+				  else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus ==SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus ==SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus ==SYS_MODE_TERMINATING)) //SYS_MODE_FAULT, SYS_MODE_TERMINATING ---> SuspendedEV
+				  {
+					  strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
+					  goto end;
+				  }
+				  else if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != SYS_MODE_IDLE) //S_IDLE
+				  {
+					  strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
+					  goto end;
+				  }
+			   }
+			} // 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 == SYS_MODE_MAINTAIN)||(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //S_TERMINATING //else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == '6') || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == '9'))
+					{
+						strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Unavailable]);
+						goto end;
+					}
+					else if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_PREPARING) //S_PRECHARGE
+					{
+						strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
+						goto end;
+					}
+					else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus ==SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus ==SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus ==SYS_MODE_TERMINATING) ) //SYS_MODE_FAULT, SYS_MODE_TERMINATING ---> SuspendedEV
+					{
+						strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
+						goto end;
+					}
+					else if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != SYS_MODE_IDLE) //S_IDLE
+					{
+						strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
+						goto end;
+					}
+				}
+
+			} // END FOR GB_QUANTITY
+
+			for (int index = 0; index < AC_QUANTITY; index++)
+			{
+				if(reservationIdInt != ShmSysConfigAndInfo->SysInfo.AcChargingData[index].ReservationId)
+				{
+					if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_MAINTAIN) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //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 == SYS_MODE_PREPARING) //S_PRECHARGE
+					{
+						strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
+						goto end;
+					}
+					else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_TERMINATING)) //SYS_MODE_FAULT, SYS_MODE_TERMINATING ---> SuspendedEV
+					{
+						strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
+						goto end;
+					}
+					if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_IDLE) //S_IDLE
+					{
+						if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState == CP_STATE_B) ||(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState == CP_STATE_C) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState == CP_STATE_D))
+						{
+							strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
+							goto end;
+						}
+					}
+					else if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_IDLE) //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},sstrtemp[30]={ 0 };
+	char typestr[10]={0};
+	char comfirmstr[20]={0};
+	int c = 0;
+	char *loc;
+
+	DEBUG_INFO("handleResetRequest...\n");
+
+	strcpy(sstrtemp, stringtrimspace(payload));
+	loc = strstr(sstrtemp, "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);
+	if((strcmp(typestr, ResetTypeStr[Hard])==0) || (strcmp(typestr, ResetTypeStr[Soft])==0))
+	{
+	  	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 },sstrtemp[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;
+	}
+
+	//check Charge Point state
+	for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+	{
+		if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_FAULT) //S_FAULT   ---> Faulted
+		{
+			checkState_Faulted = TRUE; //OCPP Status: Faulted
+		}
+
+	}
+
+	for (int index = 0; index < CCS_QUANTITY; index++)
+	{
+		if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_FAULT) //S_FAULT   ---> Faulted
+		{
+			checkState_Faulted = TRUE; //OCPP Status
+		}
+
+	}
+
+	for (int index = 0; index < GB_QUANTITY; index++)
+	{
+		if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_FAULT) //S_FAULT   ---> Faulted
+		{
+			checkState_Faulted = TRUE; //OCPP Status: Faulted
+		}
+	}
+
+	//check Charge Point state
+	for (int index = 0; index < AC_QUANTITY; index++)
+	{
+		if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_FAULT) //S_FAULT   ---> Faulted
+		{
+			checkState_Faulted = TRUE; //OCPP Status: Faulted
+		}
+	}
+
+	if(checkState_Faulted == TRUE)
+	{
+		strcpy(comfirmstr, UpdateStatusStr[UpdateStatus_Failed]);
+		goto end;
+	}
+
+	//Filter payload space
+	strcpy(sstrtemp, stringtrimspace(payload));
+
+	//listVersion
+	c = 0;
+	loc = strstr(sstrtemp, listsearch);
+	while ((loc[strlen("listVersion")+2+c] != ',')&&(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(sstrtemp, 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(sstrtemp, 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_getListVerion();
+
+			if(listVersionInt < localversion )//if(listVersionInt <= localversion ) for OCTT Case ---remove temporally
+			{
+				strcpy(comfirmstr, UpdateStatusStr[UpdateStatus_Failed]);
+				goto end;
+			}
+
+			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';
+
+		//DEBUG_INFO("sstr=%s\n", sstr);
+
+		//parsing strings to words
+		i = 0;
+		pch = strtok(sstr,delim1);
+		while (pch != NULL)
+		{
+			strcpy(CardList[i], pch);
+			//DEBUG_INFO("CardList[i]=%s\n", CardList[i]);
+			pch = strtok (NULL, delim1);
+			i = i + 1;
+		}
+
+		//DEBUG_INFO("listVersionInt=%s\n", sstr);
+		//local Authorizations List Numbers
+		//n_localAuthorizations = i;
+		ShmOCPP16Data->SendLocalList.ListVersion = listVersionInt;
+
+		memset(ShmOCPP16Data->SendLocalList.LocalAuthorizationList, 0 , sizeof(struct StructLocalAuthorizationList)* 500);
+
+		c= 0;
+		while(c < i) // i is CardList Number
+		{
+			//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);
+			//DEBUG_INFO("idTagstr=%s\n", idTagstr);
+
+			//Search "expiryDate"
+			memset(sstr ,0, sizeof(sstr) );
+			loc = strstr(CardList[c], "expiryDate");
+			j = 0;
+			if(loc != NULL)
+			{
+				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);
+
+			}
+			else
+			{
+				strcpy(expiryDate, "");
+			}
+
+			//DEBUG_INFO("expiryDate=%s\n", expiryDate);
+
+			//Search "parentIdTag"
+			memset(sstr ,0, sizeof(sstr) );
+			loc = strstr(CardList[c], "parentIdTag");
+			j = 0;
+			if(loc != NULL)
+			{
+				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);
+			}
+			else
+			{
+				strcpy(parentIdTag, "");
+			}
+
+			//DEBUG_INFO("parentIdTag=%s\n", parentIdTag);
+
+
+			//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);
+
+			//DEBUG_INFO("idTagstatus=%s\n", idTagstatus);
+
+			OCPP_getIdTag(idTagstr);
+			//OCPP_getIdTag("test"); For Test
+			//DEBUG_INFO("idTagAuthorization=%s\n",idTagAuthorization);
+			//DEBUG_INFO("updateTypestr=%s\n",updateTypestr);
+
+			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);
+				//DEBUG_INFO("Local list full update. 1\n");
+				//OCPP_get_TableAuthlocalAllData();
+				//DEBUG_INFO("Local list full update. 2\n");
+			}
+			else if(strcmp(updateTypestr, UpdateTypeStr[Differential]) == 0)
+			{
+				OCPP_addLocalList_1(listVersionInt, idTagstr, parentIdTag, expiryDate, idTagstatus); // update or add
+			}
+
+			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
+	{
+		//Check UpdateType
+		if(strcmp(updateTypestr, UpdateTypeStr[Full]) == 0)
+		{
+			//Local list full update
+			DEBUG_INFO("If no (empty) localAuthorizationList is given and the updateType is Full, all identifications are removed from the list. \n");
+			OCPP_cleanLocalList();
+			strcpy(comfirmstr, UpdateStatusStr[UpdateStatus_Accepted]);
+			goto end;
+		}
+
+		if(strcmp(updateTypestr, UpdateTypeStr[Differential]) == 0)
+		{
+			 //Local list different update
+			DEBUG_INFO("Requesting a Differential update without (empty) localAuthorizationList will have no effect on the list\n");
+			strcpy(comfirmstr, UpdateStatusStr[UpdateStatus_Accepted]);
+			goto end;
+
+		}
+	}
+
+	strcpy(comfirmstr, UpdateStatusStr[UpdateStatus_Accepted]);
+
+end:
+
+	sendSendLocalListConfirmation(uuid, comfirmstr);
+	//ShmOCPP16Data->MsMsg.bits.SendLocalListConf = 1;
+
+	return result;
+}
+
+#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},sstrtemp[1600]={ 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/SetChargingProfiletemp.json";
+	//int  resultRename=0;
+	char rmFileCmd[50]={0};
+	char tempchargingProfilePurposeStr[30]={0};
+	char word[1600]={0};
+	int n_chargingProfile = 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;
+
+	//Filter string space
+	strcpy(sstrtemp, stringtrimspace(payload));
+
+	//*********************connectorId***************************/
+	loc = strstr(sstrtemp, "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(sstrtemp, "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(sstrtemp, "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(sstrtemp, "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(sstrtemp, "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(sstrtemp, "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(sstrtemp, "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);
+		}
+
+	}
+	else
+	{
+		if(connectorIdInt == 0) //  an overall limit for the Charge Point.
+		{
+			strcpy((char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.RecurrencyKind, "");
+		}
+		else
+		{
+			strcpy((char *)ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.RecurrencyKind, "");
+		}
+	}
+
+	//DEBUG_INFO("handleSetChargingProfileRequest -8\n");
+	//*********************validFrom***************************/
+	loc = strstr(sstrtemp, "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);
+		}
+	}
+	else
+	{
+		if(connectorIdInt == 0) //  an overall limit for the Charge Point.
+		{
+			strcpy((char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ValidFrom, "");
+		}
+		else
+		{
+			strcpy((char *)ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ValidFrom, "");
+		}
+	}
+
+	//DEBUG_INFO("handleSetChargingProfileRequest -9\n");
+	//*********************validTo***************************/
+	loc = strstr(sstrtemp, "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);
+
+		}
+
+	}
+	else
+	{
+		if(connectorIdInt == 0) //  an overall limit for the Charge Point.
+		{
+			strcpy((char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ValidTo, "");
+		}
+		else
+		{
+			strcpy((char *)ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ValidTo, "");
+
+		}
+	}
+
+	//DEBUG_INFO("handleSetChargingProfileRequest -10\n");
+	//*********************duration***************************/
+	loc = strstr(sstrtemp, "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;
+		}
+
+	}
+	else
+	{
+		if(connectorIdInt == 0) //  an overall limit for the Charge Point.
+		{
+			ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingSchedule.Duration = 0;
+		}
+		else
+		{
+			ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingSchedule.Duration = 0;
+		}
+	}
+
+	//DEBUG_INFO("handleSetChargingProfileRequest -11\n");
+	//*********************startSchedule***************************/
+	loc = strstr(sstrtemp, "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);
+		}
+
+	}
+	else
+	{
+		if(connectorIdInt == 0) //  an overall limit for the Charge Point.
+		{
+			strcpy((char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingSchedule.StartSchedule,"");
+
+		}
+		else
+		{
+			strcpy((char *)ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingSchedule.StartSchedule,"");
+		}
+
+	}
+
+	//DEBUG_INFO("handleSetChargingProfileRequest -12\n");
+	//*********************chargingRateUnit***************************/
+	loc = strstr(sstrtemp, "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 tempChargingProfile[1600]={0};
+	strcpy(tempChargingProfile,(const char*)sstrtemp);
+	char *where = tempChargingProfile;
+	if (what_len)
+	{
+		while ((where = strstr(where, "startPeriod"))) {
+			where += what_len;
+			chargingSchedulePeriodCount++;
+		}
+
+	}
+
+	if( chargingSchedulePeriodCount > atoi((const char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemData))
+	{
+		sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Rejected] );
+		goto end;
+
+	}
+
+	//DEBUG_INFO("chargingSchedulePeriodCount=%d\n",chargingSchedulePeriodCount);
+	//where = payload;
+	int templength = 0;
+	//int searchstart = 0;
+	for(int periodNums=0; periodNums < chargingSchedulePeriodCount; periodNums++)
+	{
+		//****************startPeriod*******************/
+		c=0;
+		loc = strstr(tempChargingProfile + templength, "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];
+		}
+
+		templength = strlen("startPeriod")+2+c;
+
+		//DEBUG_INFO("handleSetChargingProfileRequest -13 -2\n");
+		//****************limit*******************/
+		c=0;
+		loc = strstr(tempChargingProfile + templength, "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];
+		}
+
+		templength = templength + strlen("limit")+2+c;
+
+		//****************numberPhases*******************/
+		loc = strstr(tempChargingProfile + templength, "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];
+
+			}
+
+			templength = templength + strlen("numberPhases")+2+c;
+		}
+
+		//where = loc;
+	}
+	//****************chargingSchedulePeriod count end*******************/
+
+
+	//*********************minChargingRate***************************/
+	loc = strstr(sstrtemp, "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;
+		}
+
+	}
+	else
+	{
+		if(connectorIdInt == 0) //  an overall limit for the Charge Point.
+		{
+			ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingSchedule.MinChargingRate = 0.0;
+		}
+		else
+		{
+			ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingSchedule.MinChargingRate = 0.0;
+		}
+
+	}
+
+
+	if(strcmp(chargingProfilePurposeStr, ChargingProfilePurposeTypeStr[ChargePointMaxProfile]) == 0)
+	{
+		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+");
+		}
+		else
+		{
+			//Check Charging Profile Count
+			while(fscanf(fptr1, "%s", word) != EOF)
+			{
+				//DEBUG_INFO("word=%s\n",word);
+				if(strstr(word, "chargingProfileId")!= NULL)
+				{
+					//DEBUG_INFO("test chargingProfileId \n");
+					n_chargingProfile = n_chargingProfile + 1;
+					//DEBUG_INFO("chargingProfileId Found\n");
+				}
+			}
+		}
+		fclose(fptr1);
+
+	}
+	else if(strcmp(chargingProfilePurposeStr, ChargingProfilePurposeTypeStr[TxDefaultProfile]) == 0)
+	{
+		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;
+		}
+
+		memset(filename, 0, sizeof filename);
+		sprintf(filename, "/Storage/OCPP/TxDefaultProfile_%d.json", connectorIdInt);
+
+		fptr1 = fopen(filename, "r");
+		if (!fptr1)
+		{
+			//file not exist
+			//DEBUG_INFO("Unable to open the input file!!\n");
+			fptr1 = fopen(filename, "w+");
+
+		}
+		else
+		{
+			//Check Charging Profile Count
+			while(fscanf(fptr1, "%s", word) != EOF)
+			{
+				//DEBUG_INFO("word=%s\n",word);
+				if(strstr(word, "chargingProfileId")!= NULL)
+				{
+					//DEBUG_INFO("test chargingProfileId \n");
+					n_chargingProfile = n_chargingProfile + 1;
+					//DEBUG_INFO("chargingProfileId Found\n");
+				}
+			}
+		}
+		fclose(fptr1);
+	}
+	else if(strcmp(chargingProfilePurposeStr, ChargingProfilePurposeTypeStr[TxProfile]) == 0)
+	{
+		//printf("set chargingProfile 1-4\n");
+		DEBUG_INFO("chargingProfilePurposeStr is TxProfile !!! \n");
+
+		//---TxProfile SHALL only be set at Charge Point ConnectorId > 0. ---//
+		if(connectorIdInt == 0)
+		{
+			sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Rejected] );
+			goto end;
+		}
+
+		int tempIndex = 0;
+		//check Transaction active
+		if(gunType[connectorIdInt -1] == 'J')
+		{
+			if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+			{
+				tempIndex = (((connectorIdInt -1)==2) ? 1: 0);
+			}
+			else
+			{
+				tempIndex = connectorIdInt -1;
+			}
+
+			for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
+				{
+					if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_CHARGING) // S_CHARGING
+					{
+						if(transactionIdInt == ShmOCPP16Data->StartTransaction[connectorIdInt -1].ResponseTransactionId)
+						{
+							meet = TRUE;
+							break;
+						}
+
+					}
+
+				}
+			}
+
+
+		}
+		else if((gunType[connectorIdInt -1] == 'U')||(gunType[connectorIdInt -1] == 'E'))
+		{
+			if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+			{
+				tempIndex = (((connectorIdInt -1)==2) ? 1: 0);
+			}
+			else
+			{
+				tempIndex = connectorIdInt -1;
+			}
+
+			for (int index = 0; index < CCS_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
+				{
+					if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_CHARGING) // S_CHARGING
+					{
+						if(transactionIdInt == ShmOCPP16Data->StartTransaction[connectorIdInt -1].ResponseTransactionId)
+						{
+							meet = TRUE;
+							break;
+						}
+					}
+
+				}
+			}
+
+		}
+		else if(gunType[connectorIdInt -1] == 'G')
+		{
+			if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+			{
+				tempIndex = (((connectorIdInt -1)==2) ? 1: 0);
+			}
+			else
+			{
+				tempIndex = connectorIdInt -1;
+			}
+
+			for (int index = 0; index < GB_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
+				{
+					if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_CHARGING) // S_CHARGING
+					{
+						if(transactionIdInt == ShmOCPP16Data->StartTransaction[connectorIdInt -1].ResponseTransactionId)
+						{
+							meet = TRUE;
+							break;
+						}
+					}
+
+				}
+			}
+		}
+		else
+		{
+
+			if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D') // 'D' means DC
+			{
+				tempIndex = 2;
+			}
+			else
+			{
+				tempIndex = (connectorIdInt -1);
+			}
+
+			for (int index = 0; index < AC_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
+				{
+					if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_CHARGING) // S_CHARGING
+					{
+						if(transactionIdInt == ShmOCPP16Data->StartTransaction[connectorIdInt -1].ResponseTransactionId)
+						{
+							meet = TRUE;
+							break;
+						}
+					}
+
+				}
+			}
+
+		}
+
+		//check Transaction active
+
+		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;
+		}
+
+		sprintf(filename, "/Storage/OCPP/TxProfile_%d.json", connectorIdInt);
+
+		fptr1 = fopen(filename, "r");
+		if (!fptr1)
+		{
+			//file not exist
+			DEBUG_INFO("Unable to open the input file!!\n");
+			fptr1 = fopen(filename, "w+");
+
+		}
+		else
+		{
+			//Check Charging Profile Count
+			while(fscanf(fptr1, "%s", word) != EOF)
+			{
+				//DEBUG_INFO("word=%s\n",word);
+				if(strstr(word, "chargingProfileId")!= NULL)
+				{
+					//DEBUG_INFO("test chargingProfileId \n");
+					n_chargingProfile = n_chargingProfile + 1;
+					//DEBUG_INFO("chargingProfileId Found\n");
+				}
+			}
+		}
+		fclose(fptr1);
+	}
+
+	// Check ChargeProfileMaxStackLevel
+	if(n_chargingProfile >= atoi((const char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemData))
+	{
+		sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Rejected] );
+		goto end;
+	}
+
+
+	//------------------------------Satrt: Check Configuration Key "MaxChargingProfilesInstalled" Logic---------------------------------------//
+	{
+		int i = 0;
+	    char fnametemp[200]={0};
+	    n_chargingProfile = 0;
+		//Check ChargePointMaxProfile.json exit
+		if((access("/Storage/OCPP/ChargePointMaxProfile.json",F_OK))!=-1)
+		{
+			fptr1 = fopen("/Storage/OCPP/ChargePointMaxProfile.json", "r");
+			//Check Charging Profile Count
+			while(fscanf(fptr1, "%s", word) != EOF)
+			{
+				//DEBUG_INFO("word=%s\n",word);
+				if(strstr(word, "chargingProfileId")!= NULL)
+				{
+					//DEBUG_INFO("test chargingProfileId \n");
+					n_chargingProfile = n_chargingProfile + 1;
+					i = i + 1;
+					//DEBUG_INFO("chargingProfileId Found\n");
+				}
+				memset(word, 0, sizeof word);
+			}
+			fclose(fptr1);
+			DEBUG_INFO("ChargePointMaxProfile.json has %d charging Profile\n",i );
+		}
+
+		//Check TxDefaultProfile_0.json exit
+		if((access("/Storage/OCPP/TxDefaultProfile_0.json",F_OK))!=-1)
+		{
+			i = 0;
+			fptr1 = fopen("/Storage/OCPP/TxDefaultProfile_0.json", "r");
+			//Check Charging Profile Count
+			while(fscanf(fptr1, "%s", word) != EOF)
+			{
+				//DEBUG_INFO("word=%s\n",word);
+				if(strstr(word, "chargingProfileId")!= NULL)
+				{
+					//DEBUG_INFO("test chargingProfileId \n");
+					n_chargingProfile = n_chargingProfile + 1;
+					i = i + 1;
+					//DEBUG_INFO("chargingProfileId Found\n");
+				}
+				memset(word, 0, sizeof word);
+			}
+			fclose(fptr1);
+			DEBUG_INFO("TxDefaultProfile_0.json has %d charging Profile\n",i );
+
+		}
+
+	    //Check TxDefaultProfile_%d.json
+	    for(int j=1; j <= gunTotalNumber; j++)
+		{
+			memset(fnametemp, 0, sizeof fnametemp);
+			sprintf(fnametemp, "/Storage/OCPP/TxDefaultProfile_%d.json", j);
+			if((access(fnametemp,F_OK))!=-1)
+			{
+				i = 0;
+				fptr1 = fopen(fnametemp, "r");
+				//Check Charging Profile Count
+				while(fscanf(fptr1, "%s", word) != EOF)
+				{
+					//DEBUG_INFO("word=%s\n",word);
+					if(strstr(word, "chargingProfileId")!= NULL)
+					{
+						//DEBUG_INFO("test chargingProfileId \n");
+						n_chargingProfile = n_chargingProfile + 1;
+						i = i + 1;
+						//DEBUG_INFO("chargingProfileId Found\n");
+					}
+					memset(word, 0, sizeof word);
+				}
+				fclose(fptr1);
+				DEBUG_INFO("%s has %d charging Profile\n",fnametemp, i);
+			}
+		}
+
+		//Check TxProfile_%d.json
+		for(int j=1; j <= gunTotalNumber; j++)
+		{
+			memset(fnametemp, 0, sizeof fnametemp);
+			sprintf(fnametemp, "/Storage/OCPP/TxProfile_%d.json", j);
+			if((access(fnametemp,F_OK))!=-1)
+			{
+				i = 0;
+				fptr1 = fopen(fnametemp, "r");
+				//Check Charging Profile Count
+				while(fscanf(fptr1, "%s", word) != EOF)
+				{
+					//DEBUG_INFO("word=%s\n",word);
+					if(strstr(word, "chargingProfileId")!= NULL)
+					{
+						//DEBUG_INFO("test chargingProfileId \n");
+						n_chargingProfile = n_chargingProfile + 1;
+						i = i + 1;
+						//DEBUG_INFO("chargingProfileId Found\n");
+					}
+					memset(word, 0, sizeof word);
+				}
+				fclose(fptr1);
+				DEBUG_INFO("%s has %d charging Profile\n",fnametemp, i);
+			}
+		}
+
+		if( n_chargingProfile > atoi((const char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemData))
+		{
+			sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Rejected] );
+			goto end;
+		}
+
+	}
+	//------------------------------End: Check Configuration Key "MaxChargingProfilesInstalled" Logic---------------------------------------//
+
+	//**********************************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);
+
+	//*璉 瘚  辣蝏      1嚗     0  */
+	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);
+
+		rename(tempfile, filename);
+		sleep(1);
+		//sprintf(rmFileCmd,"rm -f %s",tempfile);
+		//system(rmFileCmd);
+	}
+	else
+	{
+		char buf[1000]={0};
+		int ChargingProfileAdded = FALSE;
+
+		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] != '\"')
+			{
+				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");
+					if(ChargingProfileAdded == FALSE)
+					{
+						fprintf(outfile,"%s\n",payload);
+						ChargingProfileAdded = TRUE;
+					}
+				}
+				else
+				{
+					if(tempstackLevelInt < stackLevelInt)
+					{
+						if(ChargingProfileAdded == FALSE)
+						{
+							fprintf(outfile,"%s\n",payload);
+							ChargingProfileAdded = TRUE;
+							fprintf(outfile,"%s\n",buf);
+						}
+						else
+						{
+							fprintf(outfile,"%s\n",buf);
+						}
+					}
+					else
+					{
+						if(ChargingProfileAdded == FALSE)
+						{
+							fprintf(outfile,"%s\n",buf);
+							fprintf(outfile,"%s\n",payload);
+							ChargingProfileAdded = TRUE;
+						}
+						else
+						{
+							fprintf(outfile,"%s\n",buf);
+						}
+					}
+				}
+			}
+			else
+			{
+				if(tempchargingProfileIdInt < chargingProfileIdInt)
+				{
+					if(ChargingProfileAdded == FALSE)
+					{
+						fprintf(outfile,"%s\n",payload);
+						ChargingProfileAdded = TRUE;
+						fprintf(outfile,"%s\n",buf);
+					}
+					else
+					{
+						fprintf(outfile,"%s\n",buf);
+					}
+			    }
+				else if(tempstackLevelInt < stackLevelInt)
+				{
+					if(ChargingProfileAdded == FALSE)
+					{
+						fprintf(outfile,"%s\n",payload);
+						ChargingProfileAdded = TRUE;
+						fprintf(outfile,"%s\n",buf);
+					}
+					else
+					{
+						fprintf(outfile,"%s\n",buf);
+					}
+				}
+				else
+				{
+					if(ChargingProfileAdded == FALSE)
+					{
+						fprintf(outfile,"%s\n",buf);
+						fprintf(outfile,"%s\n",payload);
+						ChargingProfileAdded = TRUE;
+					}
+					else
+					{
+						fprintf(outfile,"%s\n",buf);
+					}
+
+				}
+
+			}
+
+		} // end of while loop
+
+		fclose(infile);
+		fclose(outfile);
+
+		sprintf(rmFileCmd,"rm -f %s",filename);
+		system(rmFileCmd);
+
+		rename(tempfile, filename);
+		sleep(1);
+
+		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},sstrtemp[100]={ 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}]
+	strcpy(sstrtemp, stringtrimspace(payload));
+
+	c = 0;
+	loc = strstr(sstrtemp, "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(sstrtemp, "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)
+	{
+		if((FirmwareStatusNotificationStatus != FIRMWARE_STATUS_DOWNLOADING) &&
+		   (FirmwareStatusNotificationStatus != FIRMWARE_STATUS_IDLE) &&
+		   (FirmwareStatusNotificationStatus != FIRMWARE_STATUS_INSTALLING) )
+		{
+			FirmwareStatusNotificationStatus = FIRMWARE_STATUS_IDLE;
+		}
+
+		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))
+			{
+				ShmOCPP16Data->CsMsg.bits[connectorIdInt -1].TriggerMessageReq = 1;
+				sendMeterValuesRequest(connectorIdInt -1);
+				//sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
+			}
+
+		}
+		else
+		{
+			for(int idx=0;idx< gunTotalNumber;idx++)
+			{
+				ShmOCPP16Data->CsMsg.bits[idx].TriggerMessageReq = 1;
+				sendMeterValuesRequest(idx);
+			}
+		}
+	}
+	else if(strcmp(requestedMessagestr, MessageTriggerStr[StatusNotification]) == 0 )
+	{
+		if(connectorIdIsNULL == FALSE)
+		{
+			if((connectorIdInt > 0) && ((connectorIdInt -1) < gunTotalNumber))
+			{
+				sendStatusNotificationRequest(connectorIdInt -1);
+				//sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
+			}
+		}
+		else
+		{
+			for(int idx=0;idx< gunTotalNumber;idx++)
+				sendStatusNotificationRequest(idx);
+
+			//sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
+		}
+
+	}
+
+	return result;
+}
+
+int handleUnlockConnectorRequest(char *uuid, char *payload)
+{
+	mtrace();
+	int result = FAIL;
+	char sstr[6]={0},sstrtemp[50]={ 0 };
+	int connectorIdInt =0;
+	char comfirmstr[20]={0};
+	int c = 0;
+	int tempIndex = 0;
+	char *loc;
+
+//[2,"ba1cbd49-2a76-493a-8f76-fa23e7606532","UnlockConnector",{"connectorId":1}]
+	DEBUG_INFO("handleUnlockConnectorRequest ...\n");
+
+	strcpy(sstrtemp, stringtrimspace(payload));
+	c = 0;
+	loc = strstr(sstrtemp, "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(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(gunType[connectorIdInt-1] == 'J')
+		{
+			if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+			{
+				tempIndex = (((connectorIdInt -1)==2) ? 1: 0);
+			}
+			else
+			{
+				tempIndex = connectorIdInt -1;
+			}
+
+			for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+			{
+				if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex ) && ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_IDLE) ))
+				{
+					//stop Transaction
+					ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].UnlockConnectorReq = 1;
+
+				}
+			}
+		}
+		else if((gunType[connectorIdInt-1] == 'U')||(gunType[connectorIdInt-1] == 'E'))
+		{
+			if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+			{
+				tempIndex = (((connectorIdInt -1)==2) ? 1: 0);
+			}
+			else
+			{
+				tempIndex = connectorIdInt -1;
+			}
+
+			for (int index = 0; index < CCS_QUANTITY; index++)
+			{
+				if ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex ) &&  ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_IDLE) ))
+				{
+					//stop Transaction
+					ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].UnlockConnectorReq = 1;
+				}
+			}
+		}
+		else if(gunType[connectorIdInt-1] == 'G')
+		{
+			if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+			{
+				tempIndex = (((connectorIdInt -1)==2) ? 1: 0);
+			}
+			else
+			{
+				tempIndex = connectorIdInt -1;
+			}
+
+			for (int index = 0; index < GB_QUANTITY; index++)
+			{
+				if ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex ) &&((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_CHARGING)||(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_IDLE)))
+				{
+					//stop Transaction
+					ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].UnlockConnectorReq = 1;
+				}
+			}
+
+		}
+		else
+		{
+			if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
+			{
+				tempIndex = 2;
+			}
+			else
+			{
+				tempIndex = connectorIdInt-1;
+			}
+
+			for (int index = 0; index < AC_QUANTITY; index++)
+			{
+				if ((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex ) && ((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_IDLE) ))
+				{
+					ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].UnlockConnectorReq = 1;
+
+				}
+			}
+
+		}
+
+	  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;
+}
+
+static char UpdateFirmwarepayloadData[300]={0};
+int handleUpdateFirmwareRequest(char *uuid, char *payload)
+{
+	mtrace();
+	int result = FAIL;
+	pthread_t t;
+
+	sendUpdateFirmwareConfirmation(uuid);
+	memset(UpdateFirmwarepayloadData, 0, 300);
+	strcpy(UpdateFirmwarepayloadData, stringtrimspace(payload));
+	pthread_create(&t, NULL, UpdateFirmwareProcess, stringtrimspace(payload));
+	////pthread_join(t, NULL); //
+	//pthread_detach(t);
+
+	//sendUpdateFirmwareConfirmation(uuid);
+	ShmOCPP16Data->MsMsg.bits.UpdateFirmwareConf =1;
+	//ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq = 1;
+	return result;
+}
+
+void *UpdateFirmwareProcess(void *data)
+{
+	pthread_detach(pthread_self());
+	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[300]={ 0 };
+	//char *str = (char*) data; // ?  ?頛詨鞈  ?
+	DEBUG_INFO("handleUpdateFirmwareRequest ...\n");
+	//DEBUG_INFO("packet=%s\n", (const char*)payloadData);
+    strcpy(str,(const char*)UpdateFirmwarepayloadData);
+	//***************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] != ',') && (loc[strlen("retryInterval")+2+c] != '}'))
+		{
+			sstr[c] = loc[strlen("retryInterval")+2+c];
+			//DEBUG_INFO("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 IdTagstrtemp[20]={0};
+	char statusstrtemp[20]={0};
+	int expiryDateISNULL=FALSE;
+	int parentIdTagISNULL=FALSE;
+	char sstr[160]={0};
+	char* filename = AuthorizationCache_JSON;
+	char tempfile[] = "/Storage/OCPP/Authorizetemp.json";
+	char *loc;
+	int  resultRename=0;
+	int responseIdTagInfoAsZero= 0;
+	char rmFileCmd[50]={0};
+
+	DEBUG_INFO("handleAuthorizeResponse...\n");
+	json_object *Authorize;
+	Authorize = json_tokener_parse(payload);
+
+	if(!is_error(Authorize))
+	{
+		if(json_object_object_get(Authorize, "idTagInfo") != NULL)
+		{
+			// Required data
+			sprintf((char *)statusstr, "%s", json_object_get_string(json_object_object_get(json_object_object_get(Authorize,"idTagInfo"), "status")));
+
+			// Optional data
+			if(json_object_object_get(json_object_object_get(Authorize,"idTagInfo"), "expiryDate") != NULL)
+				sprintf((char *)expiryDatestr, "%s", json_object_get_string(json_object_object_get(json_object_object_get(Authorize,"idTagInfo"), "expiryDate")));
+
+			if(json_object_object_get(json_object_object_get(Authorize,"idTagInfo"), "parentIdTag") != NULL)
+				sprintf((char *)parentIdTagstr, "%s", json_object_get_string(json_object_object_get(json_object_object_get(Authorize,"idTagInfo"), "parentIdTag")));
+		}
+	}
+	json_object_put(Authorize);
+
+
+	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)
+		{
+			printf("AuthorizationCache exist.\n");
+		}
+		else
+		{
+			printf("AuthorizationCache not exist\n");
+			FILE *log = fopen(filename, "w+");
+
+			if(log == NULL)
+			{
+				printf("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");
+
+
+		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
+			{
+				strcpy(parentIdTagstrtemp, (const char *)ShmOCPP16Data->Authorize.IdTag);
+			}
+
+			strcpy(statusstrtemp, (const char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status);
+
+			fprintf(outfile,"[{\"idTag\":\"%s\",\"idTagInfo\":{\"expiryDate\":\"%s\",\"parentIdTag\":\"%s\",\"status\":\"%s\"}}]\n",ShmOCPP16Data->Authorize.IdTag, expiryDatestrtemp, parentIdTagstrtemp, statusstrtemp);
+			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");
+			}
+
+		}
+		else
+		{
+			char buf[160]={0};
+
+			while (fgets(buf, sizeof(buf), infile) != NULL)
+			{
+			   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(IdTagstrtemp, 0, sizeof(IdTagstrtemp));
+			   memset(expiryDatestrtemp, 0, sizeof(expiryDatestrtemp));
+			   memset(parentIdTagstrtemp, 0, sizeof(parentIdTagstrtemp));
+			   memset(statusstrtemp, 0, sizeof(statusstrtemp));
+
+			   //------------------IdTag-----------------------
+			   loc = strstr(buf, "idTag");
+			   memset(sstr ,0, sizeof(sstr) );
+			   c = 0;
+			   while (loc[3+strlen("idTag")+c] != '\"')
+			   {
+			 		sstr[c] = loc[3+strlen("idTag")+c];
+			 		c++;
+			   }
+			   sstr[c] = '\0';
+			   strcpy(IdTagstrtemp,sstr);
+
+			   //*********************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) || (strcmp((const char *)ShmOCPP16Data->Authorize.IdTag, IdTagstrtemp) == 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)|| (strcmp(IdTagstrtemp,(const char *)ShmOCPP16Data->Authorize.IdTag) == 0)))
+			   {
+					//modify item
+
+					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
+					{
+						strcpy(parentIdTagstrtemp, parentIdTagstr);
+					}
+					strcpy(statusstrtemp,(const char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status);
+
+			   }
+			   else
+			   {
+				   //wrie original item
+				   strcpy(expiryDatestrtemp, expiryDatestr);
+				   strcpy(parentIdTagstrtemp, parentIdTagstr);
+				   strcpy(statusstrtemp, statusstr);
+			   }
+
+			   fprintf(outfile,"[{\"idTag\":\"%s\",\"idTagInfo\":{\"expiryDate\":\"%s\",\"parentIdTag\":\"%s\",\"status\":\"%s\"}}]\n",ShmOCPP16Data->Authorize.IdTag, 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;
+}
+
+char * strtrimc( char * s )
+{
+    char * p1 = s;
+	char * p2 = s;
+	while(*p1 != '\0')
+	{
+		while(*p1 == ' ' || *p1 == '\t' || *p1 == '\"' || *p1 == '\n' || *p1 == '}' || *p1 == '\r')
+		{
+			if(*p1 != ',')
+			{
+				p1 ++;
+			}
+			else
+			{
+				break;
+			}
+		}
+
+		if(*p1 != ',')
+		{
+			* p2 ++ = *p1 ++;
+			//printf("p2=%s\n",p2);
+		}
+		else
+		{
+			break;
+		}
+	}
+	*p2 = '\0';
+	return (s);
+}
+
+void handleBootNotificationResponse(char *payload, int gun_index)
+{
+	mtrace();
+	char statusStr[12]={0};
+	char currentTimeStr[30]={0};
+	int intervalInt = 0;
+	struct tm tp;
+	char buf[28]={0};
+	char timebuf[50]={0};
+
+	DEBUG_INFO("handleBootNotificationResponse...\n");
+
+	json_object *BootNotification;
+	BootNotification = json_tokener_parse(payload);
+	if(!is_error(BootNotification))
+	{
+		// Required data
+		sprintf((char *)currentTimeStr, "%s", json_object_get_string(json_object_object_get(BootNotification,"currentTime")));
+		intervalInt = json_object_get_int(json_object_object_get(BootNotification,"interval"));
+		sprintf((char *)statusStr, "%s", json_object_get_string(json_object_object_get(BootNotification,"status")));
+	}
+	json_object_put(BootNotification);
+
+
+	ShmOCPP16Data->BootNotification.ResponseHeartbeatInterval = intervalInt;
+	BootNotificationInterval = intervalInt;
+	HeartBeatWaitTime = intervalInt;
+
+	//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 ))
+	{
+		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);
+	system(timebuf);
+
+	clientTime.Heartbeat = time((time_t*)NULL) - (ShmOCPP16Data->BootNotification.ResponseHeartbeatInterval-5);
+	//==============================================
+	// RTC sync
+	//==============================================
+	system("/sbin/hwclock -w --systohc");
+
+	ShmOCPP16Data->OcppConnStatus = 1; ////0: disconnected, 1: connected
+	ShmOCPP16Data->SpMsg.bits.BootNotificationConf = 1;
+
+	sendFirmwareVersionByDataTransfer();
+}
+
+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);
+
+}
+
+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();
+	struct tm tp;
+	char buf[28]={0};
+	char timebuf[50]={0};
+
+	DEBUG_INFO("handleHeartbeatResponse...\n");
+	json_object *Heartbeat;
+	Heartbeat = json_tokener_parse(payload);
+	if(!is_error(Heartbeat))
+	{
+		// Required data
+		sprintf((char *)ShmOCPP16Data->Heartbeat.ResponseCurrentTime, "%s", json_object_get_string(json_object_object_get(Heartbeat,"currentTime")));
+
+	}
+	json_object_put(BootNotification);
+
+	if(FirstHeartBeat == 0)
+	{
+		FirstHeartBeat = 1;
+		DEBUG_INFO("FirstHeartBeat \n");
+	}
+	HeartBeatWithNOResponse = 0;
+
+
+	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");
+
+	//===============================================
+	//Print Out HeartBeat log
+	//===============================================
+	{
+		double diff_t;
+		struct tm tp,tp1;
+
+		// BootNotification Receive Time
+
+		strptime((const char *)ShmOCPP16Data->BootNotification.ResponseCurrentTime, "%Y-%m-%dT%H:%M:%S", &tp);
+		tp.tm_isdst = -1;
+		time_t BootNotificationReceiveTime = mktime(&tp);
+
+		//HeartBeat Receive Time
+		strptime((const char *)ShmOCPP16Data->Heartbeat.ResponseCurrentTime, "%Y-%m-%dT%H:%M:%S", &tp1);
+		tp1.tm_isdst = -1;
+		time_t HeartBeatReceiveTime = mktime(&tp1);
+
+		diff_t = difftime(HeartBeatReceiveTime, BootNotificationReceiveTime);
+
+		printf("handleHeartbeatResponse differnt time=%f..\n",diff_t);
+
+		if(((int)diff_t / 3600) > HeartBeatCountPerHour)
+		{
+			HeartBeatCountPerHour =  (int)diff_t / 3600;
+			DEBUG_INFO("handleHeartbeatResponse ...\n");
+			DEBUG_INFO("After 1 hour, It will print out Heartbeat.\n");
+		}
+	}
+}
+
+void handleMeterValuesResponse(char *payload, int gun_index)
+{
+	mtrace();
+	DEBUG_INFO("handleMeterValuesResponse...\n");
+}
+
+void handleStartTransactionResponse(char *payload, int gun_index)
+{
+	mtrace();
+	//int transactionIdInt = 0;
+	FILE *outfile;
+	char data[100]={0};
+
+	DEBUG_INFO("handleStartTransactionResponse...\n");
+
+	json_object *StartTransaction;
+	StartTransaction = json_tokener_parse(payload);
+
+	if(!is_error(StartTransaction))
+	{
+
+		// Required data
+		sprintf((char *)ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.Status, "%s", json_object_get_string(json_object_object_get(json_object_object_get(StartTransaction,"idTagInfo"), "status")));
+		ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId  = json_object_get_int(json_object_object_get(StartTransaction,"transactionId"));
+
+		// Optional data
+		if(json_object_object_get(json_object_object_get(StartTransaction,"idTagInfo"), "expiryDate") != NULL)
+			sprintf((char *)ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.ExpiryDate, "%s", json_object_get_string(json_object_object_get(json_object_object_get(StartTransaction,"idTagInfo"), "expiryDate")));
+
+		if(json_object_object_get(json_object_object_get(StartTransaction,"idTagInfo"), "parentIdTag") != NULL)
+			sprintf((char *)ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.ParentIdTag, "%s", json_object_get_string(json_object_object_get(json_object_object_get(StartTransaction,"idTagInfo"), "parentIdTag")));
+	}
+	json_object_put(StartTransaction);
+
+	ShmOCPP16Data->CpMsg.bits[gun_index].StartTransactionConf = 1;
+	ShmOCPP16Data->CpMsg.bits[gun_index].StartTransactionReq = 0;
+
+	//-----------Start : write to the Queue TransactionId file -----------------//
+	if((access("/Storage/OCPP/QueueTransactionId",F_OK))!=-1)
+	{}
+	else
+	{
+		FILE *log = fopen("/Storage/OCPP/QueueTransactionId", "w+");
+
+		if(log == NULL)
+		{
+			DEBUG_INFO("Can't Create File QueueTransactionId \n");
+			return ;
+		}
+		else
+		{
+			fclose(log);
+		}
+	}
+
+	// open file for writing
+	//-------------Start:  write to the Queue TransactionId file------------------------------------------//
+	if((ShmOCPP16Data->StartTransaction[gun_index].ConnectorId !=0)&&(strcmp((const char *)ShmOCPP16Data->StartTransaction[gun_index].IdTag,"")!=0)&&(ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId !=0))
+	{
+		outfile = fopen ("/Storage/OCPP/QueueTransactionId", "a");
+		sprintf(data,"%d,%s,%d\n", ShmOCPP16Data->StartTransaction[gun_index].ConnectorId , ShmOCPP16Data->StartTransaction[gun_index].IdTag, ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId);  // GunIndex, idtag, TransactionId
+		fputs(data, outfile);
+		fclose (outfile);
+	}
+
+	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);
+}
+
+void handleStatusNotificationResponse(char *payload, int gun_index)
+{
+	mtrace();
+	DEBUG_INFO("handleStatusNotificationResponse...\n");
+
+	cpinitateMsg.bits[gun_index].StatusNotificationReq = 0;
+	cpinitateMsg.bits[gun_index].StatusNotificationConf = 1;
+
+}
+
+void handleStopTransactionnResponse(char *payload, int gun_index)
+{
+	mtrace();
+	DEBUG_INFO("handleStopTransactionnResponse...\n");
+	json_object *StopTransaction;
+	StopTransaction = json_tokener_parse(payload);
+
+	if(!is_error(StopTransaction))
+	{
+		// Optional data
+		if(json_object_object_get(StopTransaction, "idTagInfo") != NULL)
+		{
+			sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].ResponseIdTagInfo.Status, "%s", json_object_get_string(json_object_object_get(json_object_object_get(StopTransaction,"idTagInfo"), "status")));
+
+			if(json_object_object_get(json_object_object_get(StopTransaction,"idTagInfo"), "expiryDate") != NULL)
+				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].ResponseIdTagInfo.ExpiryDate, "%s", json_object_get_string(json_object_object_get(json_object_object_get(StopTransaction,"idTagInfo"), "expiryDate")));
+
+			if(json_object_object_get(json_object_object_get(StopTransaction,"idTagInfo"), "parentIdTag") != NULL)
+				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].ResponseIdTagInfo.ParentIdTag, "%s", json_object_get_string(json_object_object_get(json_object_object_get(StopTransaction,"idTagInfo"), "parentIdTag")));
+		}
+	}
+	json_object_put(StopTransaction);
+
+
+	ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionConf = 1;
+	ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq = 0;
+
+	DEBUG_INFO("idTagInfo-expiryDate: %s\n", ShmOCPP16Data->StopTransaction[gun_index].ResponseIdTagInfo.ExpiryDate);
+	DEBUG_INFO("idTagInfo-parentIdTag: %s\n", ShmOCPP16Data->StopTransaction[gun_index].ResponseIdTagInfo.ParentIdTag);
+	DEBUG_INFO("idTagInfo-status: %s\n", ShmOCPP16Data->StopTransaction[gun_index].ResponseIdTagInfo.Status);
+}
+
+//==========================================
+// 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)
+{
+	//clock_t start_t, end_t, total_t;
+	FILE *fp;
+	FILE *outfile;
+	char str[200]={0};
+	char sstr[100]={0};
+	int c = 0;
+	char *loc;
+	DEBUG_INFO("initialConfigurationTable...\n");
+	//start_t = clock();
+	//printf("Starting of the program, start_t = %ld\n", start_t);
+	memset(&(ShmOCPP16Data->ConfigurationTable), 0, sizeof(struct OCPP16ConfigurationTable) );
+
+
+	if((access("/Storage/OCPP/OCPPConfiguration",F_OK))==-1)
+	{
+		outfile = fopen("/Storage/OCPP/OCPPConfiguration" , "w+");
+		if(outfile == NULL)
+		{
+			DEBUG_INFO("Error opening file\n");
+			return FALSE;
+		}
+
+		/*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, "FALSE" );
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","AllowOfflineTxForUnknownId", "false", "FALSE");
+
+		//AuthorizationCacheEnabled
+		ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemAccessibility = 1;
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemName, "AuthorizationCacheEnabled");
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemData, "FALSE" );
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","AuthorizationCacheEnabled", "false", "FALSE");
+
+		//AuthorizeRemoteTxRequests
+		ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemAccessibility = 0;
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemName, "AuthorizeRemoteTxRequests");
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemData, "FALSE" );
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","AuthorizeRemoteTxRequests", "true", "FALSE");
+
+		//BlinkRepeat
+		ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemAccessibility = 1;
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemName, "BlinkRepeat");
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemData, "0" );
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","BlinkRepeat", "false", "0");
+
+		//ClockAlignedDataInterval
+		ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemAccessibility = 1;
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemName, "ClockAlignedDataInterval");
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemData, "0" );
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ClockAlignedDataInterval", "false", "0");
+
+		//ConnectionTimeOut
+		ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemAccessibility = 1;
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemName, "ConnectionTimeOut");
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemData, "180" );
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ConnectionTimeOut", "false", "180");
+
+		//GetConfigurationMaxKeys
+		ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemAccessibility =0;
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemName, "GetConfigurationMaxKeys");
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemData, "43" );
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","GetConfigurationMaxKeys", "true", "43");
+
+		// HeartbeatInterval
+		ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemAccessibility = 1;
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemName, "HeartbeatInterval");
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemData, "10" );
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","HeartbeatInterval", "false", "10");
+
+		// LightIntensity
+		ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemAccessibility = 1;
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemName, "LightIntensity");
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemData, "0" );
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LightIntensity", "false", "0");
+
+
+		// LocalAuthorizeOffline
+		ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemAccessibility = 0;
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemName, "LocalAuthorizeOffline");
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData, "TRUE" );
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LocalAuthorizeOffline", "true", "TRUE");
+
+		// LocalPreAuthorize
+		ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemAccessibility = 0;
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemName, "LocalPreAuthorize");
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemData, "FALSE" );
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LocalPreAuthorize", "true", "FALSE");
+
+		// MaxEnergyOnInvalidId
+		ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemAccessibility = 1;
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemName, "MaxEnergyOnInvalidId");
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemData, "0" );
+		ShmSysConfigAndInfo->SysConfig.OfflineMaxChargeEnergy = 0;
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MaxEnergyOnInvalidId", "false", "0");
+
+		// MeterValuesAlignedData
+		ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemAccessibility = 0;
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemName, "MeterValuesAlignedData");
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemData, "" );
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValuesAlignedData", "true", "");
+
+		// MeterValuesAlignedDataMaxLength
+		ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemAccessibility = 0;
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemName, "MeterValuesAlignedDataMaxLength");
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemData, "5" );
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValuesAlignedDataMaxLength", "true", "5");
+
+
+		// MeterValuesSampledData
+		ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemAccessibility = 0;
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemName, "MeterValuesSampledData");
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemData, "Current.Import,Energy.Active.Import.Register,Energy.Active.Import.Interval,Power.Active.Import,Voltage,SOC" );
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValuesSampledData", "true", "Current.Import,Energy.Active.Import.Register,Energy.Active.Import.Interval,Power.Active.Import,Voltage,SOC");
+
+
+		// MeterValuesSampledDataMaxLength
+		ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemAccessibility = 0;
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemName, "MeterValuesSampledDataMaxLength");
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemData, "6" );
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValuesSampledDataMaxLength", "true", "6");
+
+		// MeterValueSampleInterval
+		ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemAccessibility = 1;
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemName, "MeterValueSampleInterval");
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemData, "10" );
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValueSampleInterval", "false", "10");
+
+		// MinimumStatusDuration
+		ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemAccessibility = 1;
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemName, "MinimumStatusDuration");
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemData, "120" );
+		server_cycle_Status = 120; //StatusNotification cycle
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MinimumStatusDuration", "false", "120");
+
+		// NumberOfConnectors
+		ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemAccessibility = 0;
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemName, "NumberOfConnectors");
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
+		{
+			sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemData, "%d", (CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY));
+		}
+		else
+		{
+			sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemData, "%d", AC_QUANTITY);
+		}
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","NumberOfConnectors", "true", ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemData);
+
+		// ResetRetries
+		ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemAccessibility = 1;
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemName, "ResetRetries");
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemData, "3" );
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ResetRetries", "false", "3");
+
+		// ConnectorPhaseRotation
+		ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemAccessibility = 1;
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemName, "ConnectorPhaseRotation");
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "NotApplicable" );
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ConnectorPhaseRotation", "false", "NotApplicable");
+
+		// ConnectorPhaseRotationMaxLength
+		ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemAccessibility = 0;
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemName, "ConnectorPhaseRotationMaxLength");
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemData, "1" );
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ConnectorPhaseRotationMaxLength", "true", "1");
+
+		// StopTransactionOnEVSideDisconnect
+		ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemAccessibility = 0;
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemName, "StopTransactionOnEVSideDisconnect");
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemData, "TRUE" );
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTransactionOnEVSideDisconnect", "true", "TRUE");
+
+		// StopTransactionOnInvalidId
+		ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemAccessibility = 0; //1;
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemName, "StopTransactionOnInvalidId");
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemData, "FALSE" );
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTransactionOnInvalidId", "true", "FALSE");
+
+		// StopTxnAlignedData
+		ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemAccessibility = 0;
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemName, "StopTxnAlignedData");
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemData, "Energy.Active.Import.Register" );
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTxnAlignedData", "true", "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" );
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTxnAlignedDataMaxLength", "true", "0");
+
+		// StopTxnSampledData
+		ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemAccessibility = 0;
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemName, "StopTxnSampledData");
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemData, "Current.Import,Energy.Active.Import.Interval,Power.Active.Import,Voltage,SOC" );
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTxnSampledData", "true", "Current.Import,Energy.Active.Import.Interval,Power.Active.Import,Voltage,SOC");
+
+		// StopTxnSampledDataMaxLength
+		ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemAccessibility = 0;
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemName, "StopTxnSampledDataMaxLength");
+
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
+		{
+			sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData, "%d", 6);
+		}
+		else
+		{
+			sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData, "%d", 5);
+		}
+
+		//strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData, "0" );
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTxnSampledDataMaxLength", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData);
+
+		// 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" );
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","SupportedFeatureProfiles", "true", "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" );
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","SupportedFeatureProfilesMaxLength", "true", "6");
+
+		// TransactionMessageAttempts
+		ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemAccessibility = 1;
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemName, "TransactionMessageAttempts");
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemData, "3" );
+		TransactionMessageAttemptsValue = atoi((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemData);
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","TransactionMessageAttempts", "false", "3");
+
+		// TransactionMessageRetryInterval
+		ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemAccessibility = 1;
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemName, "TransactionMessageRetryInterval");
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemData, "60" );
+		TransactionMessageRetryIntervalValue = atoi((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemData);
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","TransactionMessageRetryInterval", "false", "60");
+
+		// UnlockConnectorOnEVSideDisconnect
+		ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemAccessibility = 0;
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemName, "UnlockConnectorOnEVSideDisconnect");
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemData, "TRUE" );
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","UnlockConnectorOnEVSideDisconnect", "true", "TRUE");
+
+
+		// WebSocketPingInterval
+		ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemAccessibility = 1;
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemName, "WebSocketPingInterval");
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemData, "30" );
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","WebSocketPingInterval", "false", "30");
+
+			//* Local Auth List Management Profile*/
+		#if 0
+			//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 1
+			//LocalAuthListEnabled
+			ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemAccessibility = 1;
+			strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemName, "LocalAuthListEnabled");
+			strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "TRUE" );
+			fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LocalAuthListEnabled", "false", "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" );
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LocalAuthListMaxLength", "true", "500");
+
+		//SendLocalListMaxLength
+		ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemAccessibility = 0;
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemName, "SendLocalListMaxLength");
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemData, "500" );
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","SendLocalListMaxLength", "true", "500");
+
+
+		//ReserveConnectorZeroSupported
+		ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemAccessibility = 0;
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemName, "ReserveConnectorZeroSupported");
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemData, "FALSE" );
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ReserveConnectorZeroSupported", "true", "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" );
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ChargeProfileMaxStackLevel", "true", "3");
+
+		// ChargingScheduleAllowedChargingRateUnit
+		ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemAccessibility = 0;
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemName, "ChargingScheduleAllowedChargingRateUnit");
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemData, "Current" );
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ChargingScheduleAllowedChargingRateUnit", "true", "Current");
+
+
+		// ChargingScheduleMaxPeriods
+		ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemAccessibility = 0;
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemName, "ChargingScheduleMaxPeriods");
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemData, "10" );
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ChargingScheduleMaxPeriods", "true", "10");
+
+		// ConnectorSwitch3to1PhaseSupported
+		ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemAccessibility = 0;
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemName, "ConnectorSwitch3to1PhaseSupported");
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemData, "TRUE" );
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ConnectorSwitch3to1PhaseSupported", "true", "TRUE");
+
+		// MaxChargingProfilesInstalled
+		ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemAccessibility = 0;
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemName, "MaxChargingProfilesInstalled");
+		strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemData, "3" );
+
+		fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MaxChargingProfilesInstalled", "true", "3");
+
+		fclose(outfile);
+	}
+	else
+	{
+		//DEBUG_INFO("../Storage/OCPP/OCPPConfiguration    EXit\n");
+		char keystr[60]={0};
+		char readonlystr[10]={0};
+		char valuestr[100]={0};
+		fp = fopen("/Storage/OCPP/OCPPConfiguration" , "r");
+		if(fp == NULL) {
+			DEBUG_INFO("Error opening file");
+			return FALSE;
+		}
+
+		while( fgets (str, sizeof(str), fp)!=NULL )
+		{
+			//DEBUG_INFO("Get Configuration \n");
+
+			str[strlen(str) - 1] = '\0'; // eat the newline fgets() stores
+			//*************************key*********************************/
+			loc = strstr(str, "key");
+			c = 0;
+			memset(sstr ,0, sizeof(sstr) );
+			while (loc[strlen("key")+3+c] != '\"')
+			{
+				sstr[c] = loc[strlen("key")+3+c];
+				c++;
+			}
+			sstr[c] = '\0';
+			strcpy(keystr,sstr);
+
+
+			//*************************readonly*********************************/
+			loc = strstr(str, "readonly");
+			c = 0;
+			memset(sstr ,0, sizeof(sstr) );
+			while (loc[strlen("readonly")+2+c] != ',')
+			{
+				sstr[c] = loc[strlen("readonly")+2+c];
+				c++;
+			}
+			sstr[c] = '\0';
+			strcpy(readonlystr,sstr);
+
+			//*************************value*********************************/
+			loc = strstr(str, "value");
+			c = 0;
+			memset(sstr ,0, sizeof(sstr) );
+			while (loc[strlen("value")+3+c] != '\"')
+			{
+				sstr[c] = loc[strlen("value")+3+c];
+				c++;
+			}
+			sstr[c] = '\0';
+			strcpy(valuestr,sstr);
+
+//			DEBUG_INFO("keystr=%s\n",keystr);
+//			DEBUG_INFO("readonlystr=%s\n",readonlystr);
+//			DEBUG_INFO("valuestr=%s\n",valuestr);
+
+			if(strcmp(keystr, "AllowOfflineTxForUnknownId") == 0)
+			{
+				//Charger.AllowOfflineTxForUnknownId = (value.toLowerCase().equals("true")?true:false);
+				ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemData, "%s", valuestr );
+//			    DEBUG_INFO("AllowOfflineTxForUnknownId setting\n");
+//			    DEBUG_INFO("AllowOfflineTxForUnknownId setting\n");
+			}
+
+			if(strcmp(keystr, "AuthorizationCacheEnabled") == 0)
+			{
+				//Charger.AuthorizationCacheEnabled = (value.toLowerCase().equals("true")?true:false);
+				ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemData, "%s", valuestr );
+
+			}
+
+			if(strcmp(keystr, "AuthorizeRemoteTxRequests") == 0)
+			{
+				ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemData, "%s", valuestr );
+
+			}
+
+			if(strcmp(keystr, "BlinkRepeat") == 0)
+			{
+				//Charger.BlinkRepeat = Integer.parseInt(value);
+				ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemData, "%d", atoi(valuestr) );
+
+			}
+
+			if(strcmp(keystr, "ClockAlignedDataInterval") == 0)
+			{
+				ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemData, "%d", atoi(valuestr) );
+
+			}
+
+			if(strcmp(keystr, "ConnectionTimeOut") == 0 )
+			{
+				ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemData, "%d", atoi(valuestr));
+			}
+
+			if(strcmp(keystr, "GetConfigurationMaxKeys") == 0)
+			{
+				ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemData, "%d", atoi(valuestr));
+
+			}
+
+			if(strcmp(keystr, "HeartbeatInterval") == 0)
+			{
+				ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemAccessibility  = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemData, "%d", atoi(valuestr));
+				HeartBeatWaitTime = atoi(valuestr);
+
+			}
+
+			if(strcmp(keystr, "LightIntensity") == 0)
+			{
+				ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemData, "%d", atoi(valuestr));
+			}
+
+			if(strcmp(keystr, "LocalAuthorizeOffline") == 0)
+			{
+				ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData, "%s", valuestr );
+			}
+
+			if(strcmp(keystr, "LocalPreAuthorize") == 0)
+			{
+				ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemData, "%s", valuestr );
+			}
+
+			if(strcmp(keystr, "MaxEnergyOnInvalidId") == 0)
+			{
+				ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemData, "%d", atoi(valuestr) );
+				ShmSysConfigAndInfo->SysConfig.OfflineMaxChargeEnergy = atoi(valuestr)/1000;
+			}
+
+			if(strcmp(keystr, "MeterValuesAlignedData") == 0)
+			{
+				ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemData, "%s", valuestr );
+
+			}
+
+			if(strcmp(keystr, "MeterValuesAlignedDataMaxLength") == 0)
+			{
+				ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemData, "%d", atoi(valuestr));
+
+			}
+
+			if(strcmp(keystr, "MeterValuesSampledData") == 0 )
+			{
+				ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemData, "%s", valuestr );
+
+			}
+
+			if(strcmp(keystr, "MeterValuesSampledDataMaxLength") == 0)
+			{
+				ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemAccessibility  = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemData, "%d", atoi(valuestr));
+
+			}
+
+
+			if(strcmp(keystr, "MeterValueSampleInterval") == 0)
+			{
+				ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemAccessibility  = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemData, "%d", atoi(valuestr));
+
+			}
+
+			if(strcmp(keystr, "MinimumStatusDuration") == 0)
+			{
+				ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemData, "%d", atoi(valuestr) );
+				server_cycle_Status = atoi(valuestr); //StatusNotification cycle
+			}
+
+			if(strcmp(keystr, "NumberOfConnectors") == 0)
+			{
+				ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemData, "%d", atoi(valuestr) );
+
+			}
+
+			if(strcmp(keystr, "ResetRetries") == 0)
+			{
+				ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemData, "%d", atoi(valuestr) );
+
+			}
+
+			if(strcmp(keystr, "ConnectorPhaseRotation") == 0)
+			{
+				ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", valuestr );
+
+			}
+
+			if(strcmp(keystr, "ConnectorPhaseRotationMaxLength") == 0)
+			{
+				 ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				 sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemData, "%d", atoi(valuestr) );
+
+			}
+
+			if(strcmp(keystr, "StopTransactionOnEVSideDisconnect") == 0)
+			{
+				ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemData, "%s", valuestr );
+
+			}
+
+			if(strcmp(keystr, "StopTransactionOnInvalidId") == 0)
+			{
+				ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemData, "%s", valuestr );
+
+			}
+
+
+			if(strcmp(keystr, "StopTxnAlignedData") == 0)
+			{
+				ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemData, "%s", valuestr );
+			}
+
+			if(strcmp(keystr, "StopTxnAlignedDataMaxLength") == 0)
+			{
+				ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemAccessibility  = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemData, "%d", atoi(valuestr) );
+			}
+
+			if(strcmp(keystr, "StopTxnSampledData") == 0)
+			{
+				ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemAccessibility  = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemData, "%s", valuestr );
+
+			}
+
+			if(strcmp(keystr, "StopTxnSampledDataMaxLength") == 0)
+			{
+				ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemAccessibility  = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData, "%d", atoi(valuestr) );
+
+			}
+
+			if(strcmp(keystr, "SupportedFeatureProfiles") == 0)
+			{
+				 ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemAccessibility  = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				 sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemData, "%s", valuestr );
+
+			}
+
+			if(strcmp(keystr, "SupportedFeatureProfilesMaxLength") == 0)
+			{
+				ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemAccessibility  = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemData, "%d", atoi(valuestr) );
+
+			}
+
+			if(strcmp(keystr, "TransactionMessageAttempts") == 0)
+			{
+				ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemData, "%d", atoi(valuestr) );
+				TransactionMessageAttemptsValue = atoi(valuestr);
+
+			}
+
+			if(strcmp(keystr, "TransactionMessageRetryInterval") == 0)
+			{
+				ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemAccessibility= (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemData, "%d", atoi(valuestr) );
+				TransactionMessageRetryIntervalValue = atoi(valuestr);
+
+			}
+
+			if(strcmp(keystr, "UnlockConnectorOnEVSideDisconnect") == 0)
+			{
+				ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemData, "%s", valuestr );
+
+			}
+
+			if(strcmp(keystr, "WebSocketPingInterval") == 0)
+			{
+				 ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				 sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemData, "%d", atoi(valuestr) );
+
+			}
+
+
+			if(strcmp(keystr, "LocalAuthListEnabled") == 0)
+			{
+				ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				sprintf((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "%s", valuestr );
+
+			}
+
+			if(strcmp(keystr, "LocalAuthListMaxLength") == 0)
+			{
+				 ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemAccessibility  = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				  sprintf((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemData, "%d", atoi(valuestr) );
+
+			}
+
+			if(strcmp(keystr, "SendLocalListMaxLength") == 0)
+			{
+				ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				sprintf((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemData, "%d", atoi(valuestr) );
+
+			}
+
+			if(strcmp(keystr, "ReserveConnectorZeroSupported") == 0)
+			{
+				ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemAccessibility  = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				sprintf((char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemData, "%s", valuestr );
+
+			}
+
+			if(strcmp(keystr, "ChargeProfileMaxStackLevel") == 0)
+			{
+				 ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemAccessibility  = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				 sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemData, "%d", atoi(valuestr) );
+
+			}
+
+			if(strcmp(keystr, "ChargingScheduleAllowedChargingRateUnit") == 0)
+			{
+				ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemData, "%s", valuestr );
+
+			}
+
+			if(strcmp(keystr, "ChargingScheduleMaxPeriods") == 0)
+			{
+				ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemData, "%d", atoi(valuestr) );
+
+			}
+
+			if(strcmp(keystr, "ConnectorSwitch3to1PhaseSupported") == 0)
+			{
+				 ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				 sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemData, "%s", valuestr);
+
+			}
+
+			if(strcmp(keystr, "MaxChargingProfilesInstalled") == 0)
+			{
+				 ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
+				 sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemData, "%d", atoi(valuestr) );
+
+			}
+		}
+
+		fclose(fp);
+	}
+
+	return 0;
+}
+
+
+void StoreConfigurationTable(void)
+{
+	FILE *outfile;
+	outfile = fopen("/Storage/OCPP/OCPPConfiguration" , "w+");
+	if(outfile == NULL)
+	{
+		DEBUG_INFO("Error opening file");
+		return ;
+	}
+
+	/*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" );
+    */
+
+	//DEBUG_INFO("data=%s\n",data);
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","AllowOfflineTxForUnknownId", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemData);
+
+	//AuthorizationCacheEnabled
+	/*
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemAccessibility = 1;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemName, "AuthorizationCacheEnabled");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemData, "FALSE" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","AuthorizationCacheEnabled", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemData);
+
+	//AuthorizeRemoteTxRequests
+	/*
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemAccessibility = 0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemName, "AuthorizeRemoteTxRequests");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemData, "TRUE" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","AuthorizeRemoteTxRequests", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemData);
+
+	//BlinkRepeat
+	/*
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemAccessibility = 1;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemName, "BlinkRepeat");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemData, "0" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","BlinkRepeat", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemData);
+
+	//ClockAlignedDataInterval
+	/*
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemAccessibility = 1;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemName, "ClockAlignedDataInterval");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemData, "0" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ClockAlignedDataInterval", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemData);
+
+	//ConnectionTimeOut
+	/*
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemAccessibility = 1;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemName, "ConnectionTimeOut");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemData, "180" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ConnectionTimeOut", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemData);
+
+	//GetConfigurationMaxKeys
+	/*
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemAccessibility =0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemName, "GetConfigurationMaxKeys");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemData, "43" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","GetConfigurationMaxKeys", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemData);
+
+	// HeartbeatInterval
+	/*
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemAccessibility = 1;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemName, "HeartbeatInterval");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemData, "10" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","HeartbeatInterval", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemData);
+
+	// LightIntensity
+	/*
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemAccessibility = 1;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemName, "LightIntensity");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemData, "0" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LightIntensity", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemData);
+
+	// LocalAuthorizeOffline
+	/*
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemAccessibility = 0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemName, "LocalAuthorizeOffline");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData, "TRUE" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LocalAuthorizeOffline", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData);
+
+	// LocalPreAuthorize
+	/*
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemAccessibility = 0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemName, "LocalPreAuthorize");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemData, "FALSE" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LocalPreAuthorize", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemData);
+
+	// MaxEnergyOnInvalidId
+	/*
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemAccessibility = 1;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemName, "MaxEnergyOnInvalidId");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemData, "0" );
+	*/
+	//ShmSysConfigAndInfo->SysConfig.OfflineMaxChargeEnergy = 0;
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MaxEnergyOnInvalidId", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemData);
+
+	// MeterValuesAlignedData
+	/*
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemAccessibility = 1;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemName, "MeterValuesAlignedData");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemData, "Current.Export,Energy.Active.Export.Interval,Power.Active.Export,Voltage,SOC" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValuesAlignedData", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemData);
+
+	// MeterValuesAlignedDataMaxLength
+	/*
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemAccessibility = 0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemName, "MeterValuesAlignedDataMaxLength");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemData, "5" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValuesAlignedDataMaxLength", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemData);
+
+
+	// MeterValuesSampledData
+	/*
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemAccessibility = 1;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemName, "MeterValuesSampledData");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemData, "Current.Export,Energy.Active.Export.Interval,Power.Active.Export,Voltage,SOC" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValuesSampledData", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemData);
+
+
+	// MeterValuesSampledDataMaxLength
+	/*
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemAccessibility = 0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemName, "MeterValuesSampledDataMaxLength");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemData, "5" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValuesSampledDataMaxLength", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemData);
+
+	// MeterValueSampleInterval
+	/*
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemAccessibility = 1;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemName, "MeterValueSampleInterval");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemData, "10" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValueSampleInterval", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemData);
+
+	// MinimumStatusDuration
+	/*
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemAccessibility = 1;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemName, "MinimumStatusDuration");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemData, "0" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MinimumStatusDuration", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemData);
+
+	// NumberOfConnectors
+	/*
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemAccessibility = 0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemName, "NumberOfConnectors");
+	if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
+	{
+		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemData, "%d", (CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY));
+	}
+	else
+	{
+		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemData, "%d", AC_QUANTITY);
+	}
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","NumberOfConnectors", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemData);
+
+	// ResetRetries
+	/*
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemAccessibility = 1;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemName, "ResetRetries");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemData, "3" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ResetRetries", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemData);
+
+	// ConnectorPhaseRotation
+	/*
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemAccessibility = 1;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemName, "ConnectorPhaseRotation");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "NotApplicable" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ConnectorPhaseRotation", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData);
+
+	// ConnectorPhaseRotationMaxLength
+	/*
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemAccessibility = 0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemName, "ConnectorPhaseRotationMaxLength");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemData, "1" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ConnectorPhaseRotationMaxLength", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemData);
+
+	// StopTransactionOnEVSideDisconnect
+	/*
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemAccessibility = 0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemName, "StopTransactionOnEVSideDisconnect");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemData, "TRUE" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTransactionOnEVSideDisconnect", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemData);
+
+	// StopTransactionOnInvalidId
+	/*
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemAccessibility = 0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemName, "StopTransactionOnInvalidId");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemData, "FALSE" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTransactionOnInvalidId", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemData);
+
+	// 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" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTxnAlignedData", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemData);
+
+	// StopTxnAlignedDataMaxLength
+	/*
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemAccessibility = 0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemName, "StopTxnAlignedDataMaxLength");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemData, "0" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTxnAlignedDataMaxLength", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemData);
+
+	// 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" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTxnSampledData", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemData);
+
+	// StopTxnSampledDataMaxLength
+	/*
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemAccessibility = 0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemName, "StopTxnSampledDataMaxLength");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData, "0" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTxnSampledDataMaxLength", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData);
+
+	// 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" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","SupportedFeatureProfiles", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemData);
+
+	// SupportedFeatureProfilesMaxLength
+	/*
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemAccessibility = 0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemName, "SupportedFeatureProfilesMaxLength");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemData, "6" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","SupportedFeatureProfilesMaxLength", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemData);
+
+	// TransactionMessageAttempts
+	/*
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemAccessibility = 1;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemName, "TransactionMessageAttempts");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemData, "3" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","TransactionMessageAttempts", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemData);
+
+	// TransactionMessageRetryInterval
+	/*
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemAccessibility = 1;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemName, "TransactionMessageRetryInterval");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemData, "60" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","TransactionMessageRetryInterval", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemData);
+
+	// UnlockConnectorOnEVSideDisconnect
+	/*
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemAccessibility = 0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemName, "UnlockConnectorOnEVSideDisconnect");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemData, "TRUE" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","UnlockConnectorOnEVSideDisconnect", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemData);
+
+
+	// WebSocketPingInterval
+	/*
+	ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemAccessibility = 1;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemName, "WebSocketPingInterval");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemData, "30" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","WebSocketPingInterval", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemData);
+
+	//* 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" );
+	*/
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LocalAuthListEnabled", "false", (char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData);
+
+	//LocalAuthListMaxLength
+	/*
+	ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemAccessibility = 0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemName, "LocalAuthListMaxLength");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemData, "500" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LocalAuthListMaxLength", "true", (char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemData);
+
+	//SendLocalListMaxLength
+	/*
+	ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemAccessibility = 0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemName, "SendLocalListMaxLength");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemData, "500" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","SendLocalListMaxLength", "true", (char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemData);
+
+
+	//ReserveConnectorZeroSupported
+	/*
+	ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemAccessibility = 0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemName, "ReserveConnectorZeroSupported");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemData, "FALSE" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ReserveConnectorZeroSupported", "true", (char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemData);
+
+	//*  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" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ChargeProfileMaxStackLevel", "true", (char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemData);
+
+	// ChargingScheduleAllowedChargingRateUnit
+	/*
+	ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemAccessibility = 0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemName, "ChargingScheduleAllowedChargingRateUnit");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemData, "Current" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ChargingScheduleAllowedChargingRateUnit", "true", (char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemData);
+
+	// ChargingScheduleMaxPeriods
+	/*
+	ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemAccessibility = 0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemName, "ChargingScheduleMaxPeriods");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemData, "10" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ChargingScheduleMaxPeriods", "true", (char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemData);
+
+	// ConnectorSwitch3to1PhaseSupported
+	/*
+	ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemAccessibility = 0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemName, "ConnectorSwitch3to1PhaseSupported");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemData, "TRUE" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ConnectorSwitch3to1PhaseSupported", "true", (char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemData);
+
+	// MaxChargingProfilesInstalled
+	/*
+	ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemAccessibility = 0;
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemName, "MaxChargingProfilesInstalled");
+	strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemData, "3" );
+	*/
+
+	fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MaxChargingProfilesInstalled", "true", (char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemData);
+
+	fclose(outfile);
+
+}
+
+
+void getKeyValue(char *keyReq)
+{
+	 int isEmpty = FALSE;
+	 int isKnowKey = FALSE;
+
+	 DEBUG_INFO("keyReq = %s\n", keyReq);
+
+	 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 );
+		   ShmSysConfigAndInfo->SysConfig.OfflineMaxChargeEnergy = atoi((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemData)/1000;
+		   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
+	      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;
+	char str[10]={0};
+
+	DEBUG_INFO(" setKeyValue %s = %s\n", key, value);
+
+    if(strcmp(key, "AllowOfflineTxForUnknownId") == 0)
+    {
+        //Charger.AllowOfflineTxForUnknownId = (value.toLowerCase().equals("true")?true:false);
+    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemAccessibility == 1)
+    	{
+    		strcpy(str, (const char*)value);
+    		for(int i = 0; str[i]; i++){
+    		  str[i] = tolower(str[i]);
+    		}
+
+    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemData, "%s", (strcmp(str, "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)
+    	{
+    		strcpy(str, (const char*)value);
+    		for(int i = 0; str[i]; i++){
+    		   str[i] = tolower(str[i]);
+    		}
+
+    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemData, "%s", (strcmp(str, "true")==0) ?"TRUE":"FALSE" );
+    		isSuccess = ConfigurationStatus_Accepted;
+    		//updateSetting("AuthorizationCacheEnabled",(char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[1].ItemData);
+    	}
+    	else
+    	{
+    		isSuccess = ConfigurationStatus_Rejected;
+    	}
+
+    }
+
+    if(strcmp(key, "AuthorizeRemoteTxRequests") == 0)
+    {
+    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemAccessibility == 1)
+    	{
+    		strcpy(str, (const char*)value);
+    		for(int i = 0; str[i]; i++)
+    		{
+    			str[i] = tolower(str[i]);
+    		}
+    		//Charger.AuthorizeRemoteTxRequests = (value.toLowerCase().equals("true")?true:false);
+    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemData, "%s", (strcmp(str, "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) );
+    			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));
+    			isSuccess = ConfigurationStatus_Accepted;
+    		}
+    	}
+    	else
+        {
+        	isSuccess = ConfigurationStatus_Rejected;
+        }
+
+    }
+
+    if(strcmp(key, "GetConfigurationMaxKeys") == 0)
+    {
+    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].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[GetConfigurationMaxKeys].ItemData, "%d", atoi(value) );
+        		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));
+    			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)
+    	{
+    		strcpy(str, (const char*)value);
+    		for(int i = 0; str[i]; i++)
+    		{
+    		   str[i] = tolower(str[i]);
+    		}
+    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData, "%s", (strcmp(str, "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)
+    	{
+    		strcpy(str, (const char*)value);
+    		for(int i = 0; str[i]; i++)
+    		{
+    		   str[i] = tolower(str[i]);
+    		}
+    	    sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemData, "%s", (strcmp(str, "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) );
+    			 ShmSysConfigAndInfo->SysConfig.OfflineMaxChargeEnergy = atoi(value)/1000;
+    			 isSuccess = ConfigurationStatus_Accepted;
+    		}
+    	}
+    	else
+    	{
+    	    isSuccess = ConfigurationStatus_Rejected;
+    	}
+
+    }
+
+    if(strcmp(key, "MeterValuesAlignedData") == 0)
+    {
+    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemAccessibility == 1)
+    	{
+    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemData, "%s", value );
+    		isSuccess = ConfigurationStatus_Accepted;
+    	}
+    	else
+    	{
+    	   isSuccess = ConfigurationStatus_Rejected;
+    	}
+
+    }
+
+    if(strcmp(key, "MeterValuesAlignedDataMaxLength") == 0)
+    {
+     	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].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[MeterValuesAlignedDataMaxLength].ItemData, "%d", atoi(value));
+     			isSuccess = ConfigurationStatus_Accepted;
+     		}
+     	}
+     	else
+     	{
+     	    isSuccess = ConfigurationStatus_Rejected;
+
+     	}
+
+    }
+
+    if(strcmp(key, "MeterValuesSampledData") == 0 )
+    {
+    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemAccessibility == 1)
+    	{
+    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemData, "%s", value );
+    		isSuccess = ConfigurationStatus_Accepted;
+    	}
+    	else
+    	{
+    	    isSuccess = ConfigurationStatus_Rejected;
+    	}
+
+    }
+
+    if(strcmp(key, "MeterValuesSampledDataMaxLength") == 0)
+    {
+     	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].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[MeterValuesSampledDataMaxLength].ItemData, "%d", atoi(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;
+    		}
+    	}
+    	else
+    	{
+    	    isSuccess = ConfigurationStatus_Rejected;
+
+    	}
+
+    }
+
+    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
+    		{
+    			if(atoi(value) == 0) // MinimumStatusDuration's value can not be 0
+    			{
+    				isSuccess = ConfigurationStatus_Rejected;
+    			}
+    			else
+    			{
+    				//Charger.MinimumStatusDuration = Integer.parseInt(value);
+    			    sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemData, "%d", atoi(value) );
+    			    server_cycle_Status = atoi(value); //StatusNotification Cycle
+    			    isSuccess = ConfigurationStatus_Accepted;
+    			}
+    		}
+    	}
+    	else
+        {
+        	isSuccess = ConfigurationStatus_Rejected;
+        }
+
+    }
+
+    if(strcmp(key, "NumberOfConnectors") == 0)
+    {
+      	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].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[NumberOfConnectors].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)
+	   {
+		   strcpy(str, (const char*)value);
+		   for(int i = 0; str[i]; i++)
+		   {
+			   str[i] = tolower(str[i]);
+		   }
+
+		   if(strcmp(str, "notapplicable")== 0)
+		   {
+			   sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", "NotApplicable" );
+			   isSuccess = ConfigurationStatus_Accepted;
+		   }
+		   else  if(strcmp(str, "unknown")== 0)
+		   {
+			   sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", "Unknown" );
+			   isSuccess = ConfigurationStatus_Accepted;
+		   }
+		   else  if(strcmp(str, "rst")== 0)
+		   {
+			   sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", "RST" );
+			   isSuccess = ConfigurationStatus_Accepted;
+		   }
+		   else  if(strcmp(str, "rts")== 0)
+		   {
+			   sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", "RTS" );
+			   isSuccess = ConfigurationStatus_Accepted;
+		   }
+		   else  if(strcmp(str, "srt")== 0)
+		   {
+			   sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", "SRT" );
+			   isSuccess = ConfigurationStatus_Accepted;
+		   }
+		   else  if(strcmp(str, "str")== 0)
+		   {
+			   sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", "STR" );
+			   isSuccess = ConfigurationStatus_Accepted;
+		   }
+		   else  if(strcmp(str, "trs")== 0)
+		   {
+			   sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", "TRS" );
+			   isSuccess = ConfigurationStatus_Accepted;
+		   }
+		   else  if(strcmp(str, "tsr")== 0)
+		   {
+			   sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", "TSR" );
+			   isSuccess = ConfigurationStatus_Accepted;
+		   }
+		   else
+		   {
+			   isSuccess = ConfigurationStatus_Rejected;
+		   }
+	   }
+	   else
+	   {
+	       isSuccess = ConfigurationStatus_Rejected;
+	   }
+
+   }
+
+   if(strcmp(key, "ConnectorPhaseRotationMaxLength") == 0)
+   {
+	  if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemAccessibility == 1)
+	  {
+		  check_ascii = value[0];
+		  if( (check_ascii < 48) || (check_ascii > 57) )
+		  {
+		      isSuccess = ConfigurationStatus_Rejected;
+		  }
+		  else
+		  {
+		      sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemData, "%d", atoi(value) );
+		      isSuccess = ConfigurationStatus_Accepted;
+		  }
+	  }
+	  else
+	  {
+	  	  isSuccess = ConfigurationStatus_Rejected;
+	  }
+   }
+
+   if(strcmp(key, "StopTransactionOnEVSideDisconnect") == 0)
+   {
+	   if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemAccessibility == 1)
+	   {
+		   strcpy(str, (const char*)value);
+		   for(int i = 0; str[i]; i++)
+		   {
+		      str[i] = tolower(str[i]);
+		   }
+		   //Charger.StopTransactionOnEVSideDisconnect = (value.toLowerCase().equals("true")?true:false);
+		   sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemData, "%s", (strcmp(str, "true")==0) ?"TRUE":"FALSE" );
+		   isSuccess = ConfigurationStatus_Accepted;
+	   }
+	   else
+	   {
+	       isSuccess = ConfigurationStatus_Rejected;
+	   }
+
+   }
+
+    if(strcmp(key, "StopTransactionOnInvalidId") == 0)
+    {
+    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemAccessibility == 1)
+    	{
+    		strcpy(str, (const char*)value);
+    		for(int i = 0; str[i]; i++)
+    		{
+    			str[i] = tolower(str[i]);
+    		}
+    		//Charger.StopTransactionOnInvalidId = (value.toLowerCase().equals("true")?true:false);
+    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemData, "%s", (strcmp(str, "true")==0) ?"TRUE":"FALSE" );
+    		isSuccess = ConfigurationStatus_Accepted;
+    	}
+        else
+        {
+    		isSuccess = ConfigurationStatus_Rejected;
+        }
+    }
+
+
+    if(strcmp(key, "StopTxnAlignedData") == 0)
+    {
+    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemAccessibility == 1)
+    	{
+    	    sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemData, "%s", value );
+    		isSuccess = ConfigurationStatus_Accepted;
+    	}
+    	else
+    	{
+    	    isSuccess = ConfigurationStatus_Rejected;
+    	}
+    }
+
+    if(strcmp(key, "StopTxnAlignedDataMaxLength") == 0)
+    {
+   	  if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemAccessibility == 1)
+   	  {
+   		 check_ascii = value[0];
+   		 if( (check_ascii < 48) || (check_ascii > 57) )
+   		 {
+   			isSuccess = ConfigurationStatus_Rejected;
+   		 }
+   		 else
+   		 {
+   			sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemData, "%d", atoi(value) );
+   			isSuccess = ConfigurationStatus_Accepted;
+   		 }
+   	  }
+   	  else
+   	  {
+   	  	  isSuccess = ConfigurationStatus_Rejected;
+   	  }
+    }
+
+    if(strcmp(key, "StopTxnSampledData") == 0)
+    {
+    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemAccessibility == 1)
+    	{
+    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemData, "%s", value );
+    		isSuccess = ConfigurationStatus_Accepted;
+    	}
+    	else
+    	{
+    	    isSuccess = ConfigurationStatus_Rejected;
+    	}
+
+    }
+
+    if(strcmp(key, "StopTxnSampledDataMaxLength") == 0)
+    {
+    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemAccessibility == 1)
+    	{
+    		 check_ascii = value[0];
+    		 if( (check_ascii < 48) || (check_ascii > 57) )
+    		 {
+    			 isSuccess = ConfigurationStatus_Rejected;
+    		 }
+    		 else
+    		 {
+    			 sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData, "%d", atoi(value) );
+    			 isSuccess = ConfigurationStatus_Accepted;
+    		 }
+    	}
+    	else
+    	{
+     	  	isSuccess = ConfigurationStatus_Rejected;
+    	}
+    }
+
+    if(strcmp(key, "SupportedFeatureProfiles") == 0)
+    {
+       	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemAccessibility == 1)
+       	{
+       		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemData, "%s", value );
+       		isSuccess = ConfigurationStatus_Accepted;
+       	}
+       	else
+       	{
+       	    isSuccess = ConfigurationStatus_Rejected;
+       	}
+
+    }
+
+    if(strcmp(key, "SupportedFeatureProfilesMaxLength") == 0)
+    {
+        if(ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemAccessibility == 1)
+        {
+        	 check_ascii = value[0];
+        	 if( (check_ascii < 48) || (check_ascii > 57) )
+        	 {
+        	    isSuccess = ConfigurationStatus_Rejected;
+        	 }
+        	 else
+        	 {
+        	    sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemData, "%d", atoi(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) );
+    			TransactionMessageAttemptsValue = 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) );
+    			TransactionMessageRetryIntervalValue = atoi(value);
+    			isSuccess = ConfigurationStatus_Accepted;
+    		}
+    	}
+    	else
+    	{
+    	    isSuccess = ConfigurationStatus_Rejected;
+    	}
+
+    }
+
+    if(strcmp(key, "UnlockConnectorOnEVSideDisconnect") == 0)
+    {
+    	if(ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemAccessibility == 1)
+    	{
+    		strcpy(str, (const char*)value);
+    		for(int i = 0; str[i]; i++)
+    		{
+    		   str[i] = tolower(str[i]);
+    		}
+    		//Charger.UnlockConnectorOnEVSideDisconnect = (value.toLowerCase().equals("true")?true:false);
+    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemData, "%s", (strcmp(str, "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 0
+    //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 1
+    if(strcmp(key, "LocalAuthListEnabled") == 0)
+    {
+    	if(ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemAccessibility == 1)
+    	{
+    		strcpy(str, (const char*)value);
+    		for(int i = 0; str[i]; i++)
+    		{
+    		   str[i] = tolower(str[i]);
+    		}
+        sprintf((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "%s", (strcmp(str, "true")==0) ?"TRUE":"FALSE" );
+    		isSuccess = ConfigurationStatus_Accepted;
+    		//updateSetting("LocalAuthListEnabled", (char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData);
+    	}
+    	else
+        {
+        	isSuccess = ConfigurationStatus_Rejected;
+        }
+
+    }
+#endif
+
+    if(strcmp(key, "LocalAuthListMaxLength") == 0)
+    {
+      	if(ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemAccessibility == 1)
+      	{
+      		check_ascii = value[0];
+      		if( (check_ascii < 48) || (check_ascii > 57) )
+      		{
+      			isSuccess = ConfigurationStatus_Rejected;
+      		}
+      		else
+      		{
+
+          		sprintf((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemData, "%d", atoi(value) );
+          		isSuccess = ConfigurationStatus_Accepted;
+      		}
+      	}
+      	else
+      	{
+      	    isSuccess = ConfigurationStatus_Rejected;
+      	}
+    }
+
+    if(strcmp(key, "SendLocalListMaxLength") == 0)
+    {
+        if(ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemAccessibility == 1)
+        {
+        	check_ascii = value[0];
+        	if( (check_ascii < 48) || (check_ascii > 57) )
+        	{
+        		isSuccess = ConfigurationStatus_Rejected;
+        	}
+        	else
+        	{
+
+            	sprintf((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemData, "%d", atoi(value) );
+            	isSuccess = ConfigurationStatus_Accepted;
+        	}
+        }
+        else
+        {
+        	isSuccess = ConfigurationStatus_Rejected;
+        }
+    }
+
+    if(strcmp(key, "ReserveConnectorZeroSupported") == 0)
+    {
+    	if(ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemAccessibility == 1)
+    	{
+    		strcpy(str, (const char*)value);
+    		for(int i = 0; str[i]; i++)
+    		{
+    		    str[i] = tolower(str[i]);
+    		}
+    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemData, "%s", (strcmp(str, "true")==0) ?"TRUE":"FALSE" );
+    		isSuccess = ConfigurationStatus_Accepted;
+    	}
+    	else
+    	{
+           	isSuccess = ConfigurationStatus_Rejected;
+    	}
+    }
+
+    if(strcmp(key, "ChargeProfileMaxStackLevel") == 0)
+    {
+         if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemAccessibility == 1)
+         {
+         	check_ascii = value[0];
+         	if( (check_ascii < 48) || (check_ascii > 57) )
+         	{
+         		isSuccess = ConfigurationStatus_Rejected;
+         	}
+         	else
+         	{
+
+             	sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemData, "%d", atoi(value) );
+             	isSuccess = ConfigurationStatus_Accepted;
+         	}
+         }
+         else
+         {
+         	isSuccess = ConfigurationStatus_Rejected;
+         }
+    }
+
+    if(strcmp(key, "ChargingScheduleAllowedChargingRateUnit") == 0)
+    {
+    	if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemAccessibility == 1)
+        {
+    		sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemData, "%s", value );
+         	isSuccess = ConfigurationStatus_Accepted;
+        }
+        else
+        {
+         	isSuccess = ConfigurationStatus_Rejected;
+        }
+
+    }
+
+    if(strcmp(key, "ChargingScheduleMaxPeriods") == 0)
+    {
+    	if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemAccessibility == 1)
+        {
+           	check_ascii = value[0];
+           	if( (check_ascii < 48) || (check_ascii > 57) )
+           	{
+           		isSuccess = ConfigurationStatus_Rejected;
+           	}
+           	else
+           	{
+
+               	sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemData, "%d", atoi(value) );
+               	isSuccess = ConfigurationStatus_Accepted;
+           	}
+        }
+    	else
+        {
+           	isSuccess = ConfigurationStatus_Rejected;
+        }
+    }
+
+    if(strcmp(key, "ConnectorSwitch3to1PhaseSupported") == 0)
+    {
+       	if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemAccessibility == 1)
+       	{
+       		strcpy(str, (const char*)value);
+       		for(int i = 0; str[i]; i++)
+       		{
+       		    str[i] = tolower(str[i]);
+       		}
+       		sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemData, "%s", (strcmp(str, "true")==0) ?"TRUE":"FALSE" );
+       		isSuccess = ConfigurationStatus_Accepted;
+       	}
+       	else
+       	{
+              	isSuccess = ConfigurationStatus_Rejected;
+       	}
+    }
+
+    if(strcmp(key, "MaxChargingProfilesInstalled") == 0)
+    {
+       	if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemAccessibility == 1)
+        {
+       		check_ascii = value[0];
+            if( (check_ascii < 48) || (check_ascii > 57) )
+            {
+            	isSuccess = ConfigurationStatus_Rejected;
+            }
+            else
+            {
+
+                 sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemData, "%d", atoi(value) );
+                 isSuccess = ConfigurationStatus_Accepted;
+            }
+       }
+       else
+       {
+            isSuccess = ConfigurationStatus_Rejected;
+       }
+    }
+
+
+    return isSuccess;
+}
+
+int TransactionMessageAttemptsGet(void)
+{
+	return TransactionMessageAttemptsValue;
+}
+
+int FirstHeartBeatResponse(void)
+{
+	return FirstHeartBeat;
+}
+
+
+int TransactionMessageRetryIntervalGet(void)
+{
+	return TransactionMessageRetryIntervalValue;//atoi((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemData);
+}
+
+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 rmFileCmd[100]={0};
+    char FilePath[100]={0};
+	char ftpbuf[200];
+	int systemresult;
+
+	//DEBUG_INFO("filename=%s\n",filename);
+	//DEBUG_INFO("url=%s\n",url);
+	sprintf(FilePath,"/mnt/%s",filename);
+
+	if((access(FilePath,F_OK))!=-1)
+	{
+		DEBUG_INFO("filename=%s exist.\n",FilePath);
+		sprintf(rmFileCmd,"rm -f %s",FilePath);
+		system(rmFileCmd);
+	}
+	memset(ftpbuf, 0, sizeof(ftpbuf));
+	sprintf(ftpbuf, "wget --tries=3 -O /mnt/%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 rmFileCmd[100]={0};
+	char FilePath[100]={0};
+	char ftpbuf[200];
+	int systemresult;
+	//char temp[100];
+	sprintf(FilePath,"/mnt/%s",filename);
+
+	if((access(FilePath,F_OK))!=-1)
+	{
+		DEBUG_INFO("filename=%s exist.\n",FilePath);
+		sprintf(rmFileCmd,"rm -f %s",FilePath);
+		system(rmFileCmd);
+	}
+
+	memset(ftpbuf, 0, sizeof(ftpbuf));
+
+	sprintf(ftpbuf, "wget --tries=3 -O /mnt/%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("wget error!\n");
+		return FALSE;
+	}
+
+	return TRUE;
+
+}
+
+int httpUploadFile(char *location, char *path, char *filename,char *url)
+{
+	char rmFileCmd[100]={0};
+    char FilePath[100]={0};
+	char ftpbuf[200];
+	int systemresult;
+
+	//DEBUG_INFO("filename=%s\n",filename);
+	//DEBUG_INFO("url=%s\n",url);
+	sprintf(FilePath,"%s","/mnt/upload_file.txt");
+
+	if((access(FilePath,F_OK))!=-1)
+	{
+		DEBUG_INFO("filename=%s exist.\n",FilePath);
+		sprintf(rmFileCmd,"rm -f %s",FilePath);
+		system(rmFileCmd);
+	}
+
+	FILE *fp = fopen("/mnt/upload_file.txt", "w+");
+
+	if(fp == NULL)
+	{
+		DEBUG_INFO("log is NULL\n");
+		return FALSE;
+	}
+	else
+	{
+		fprintf(fp, "%s\n", url);
+		fprintf(fp, "%s\n", filename);
+		fclose(fp);
+	}
+
+	memset(ftpbuf, 0, sizeof(ftpbuf));
+	sprintf(ftpbuf, "%s","/bin/php-cgi /var/www/ocpp_upload.php");
+	systemresult = system(ftpbuf);
+
+	DEBUG_INFO("systemresult = %d\n",systemresult);
+	if(systemresult != 0)
+	{
+		DEBUG_INFO("http upload 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 phihong -p y42j%2f4cj84 112.91.88.35 -P 21 /2020-02.zip ../mnt/2020-02.zip*/
+	/* 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;
+
+}
+
+/**
+ * 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)
+{
+//   localversion = argv[5] ? atoi(argv[5]) : 0;
+//   printf("localversion=%d\n", localversion);
+	return 0;
+}
+
+//=========================================
+// Sqlite3 related function
+//=========================================
+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");
+
+    /* Execute SQL statement */
+    rc = sqlite3_exec(db, sql, versioncallback, 0, (char **)&zErrMsg);
+
+    if( rc != SQLITE_OK )
+    {
+    	DEBUG_INFO("SQL error: %s", zErrMsg);
+    }
+}
+
+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));
+
+    //DEBUG_INFO("look up card: %s in ocpp_auth_local table", idTag);
+    sprintf(sql,"select * from ocpp_auth_local where idtag='%s'", idTag);
+
+    /* Execute SQL statement */
+
+    rc = sqlite3_exec(db, sql, IdTagcallback, 0, (char **)&zErrMsg);
+
+    if( rc != SQLITE_OK )
+    {
+    	DEBUG_INFO("SQL error: %s", zErrMsg);
+    }
+
+   //return ver;
+}
+
+void OCPP_get_TableAuthlocalAllData(void)
+{
+    int rc = 0;
+    char sql[100];
+    char zErrMsg[100];
+
+    memset(sql, 0, 100);
+    memset(zErrMsg, 0, 100);
+
+    sprintf(sql,"select * from ocpp_auth_local ");
+
+    /* Execute SQL statement */
+
+    rc = sqlite3_exec(db, sql, &sqlite3_exec_callback, 0,(char **)&zErrMsg);
+
+    if( rc != SQLITE_OK )
+    {
+    	DEBUG_INFO("SQL error: %s", zErrMsg);
+    }
+
+    //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)
+	{
+		DEBUG_INFO("%s\n",errMsg);
+		return FALSE;
+	}
+
+	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[300];
+	 char zErrMsg[200];
+
+	 memset(sql, 0, 300);
+	 memset(zErrMsg, 0, 200);
+
+	 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);
+
+	 //* Execute SQL statement */
+	 ret = sqlite3_exec(db, sql, callback, 0, (char **)&zErrMsg);
+	 if( ret != SQLITE_OK )
+	 {
+		 DEBUG_INFO("SQL error: %s\n", zErrMsg);
+		 return isSuccess;
+	 }
+
+	 memset(sql, 0, 300);
+	 sprintf(sql, "UPDATE ocpp_auth_local SET version=%d",version);
+	 ret = sqlite3_exec(db, sql, NULL, NULL, (char **)&zErrMsg);
+	 if( ret != SQLITE_OK )
+	 {
+		 DEBUG_INFO("SQL error: %s\n", zErrMsg);
+		 return isSuccess;
+	 }
+
+	 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 */
+	rc = sqlite3_exec(db, sql, deleteIdTagcallback, 0,(char **)&zErrMsg);
+	if( rc != SQLITE_OK )
+	{
+		DEBUG_INFO("SQL error: %s", zErrMsg);
+	}
+}
+
+int GetOcppServerURL()
+{
+    int result = FALSE;
+	memset(OcppProtocol, 0, sizeof(OcppProtocol));
+	memset(OcppHost, 0, sizeof(OcppHost));
+	memset(OcppTempPath, 0, sizeof(OcppTempPath));
+
+	if((ShmSysConfigAndInfo->SysConfig.OcppServerURL != NULL) && (strcmp((const char *)ShmSysConfigAndInfo->SysConfig.OcppServerURL,"") != 0) )
+	{
+#if 1
+		sscanf((const char *)ShmSysConfigAndInfo->SysConfig.OcppServerURL,
+						"%[^:]:%*2[/]%[^:]:%i/%[a-zA-Z0-9._/-]",
+						OcppProtocol, OcppHost, &OcppPort, OcppTempPath);
+#endif
+		result = TRUE;
+		goto End;
+	}
+	else if((ShmOCPP16Data->OcppServerURL != NULL) && (strcmp((const char *)ShmOCPP16Data->OcppServerURL,"") != 0))
+	{
+		sscanf((const char *)ShmOCPP16Data->OcppServerURL,
+								"%[^:]:%*2[/]%[^:]:%i/%[a-zA-Z0-9._/-]",
+								OcppProtocol, OcppHost, &OcppPort, OcppTempPath);
+		result = TRUE;
+		goto End;
+
+	}
+	else
+	{
+		strcpy(OcppHost,"");
+	}
+
+End:
+	return result;
+}
+
+int GetOcppPath()
+{
+	int result = FALSE;
+	if((ShmSysConfigAndInfo->SysConfig.ChargeBoxId != NULL) && (strcmp((const char *)ShmSysConfigAndInfo->SysConfig.ChargeBoxId,"") != 0) )
+	{
+		if(OcppTempPath == NULL)
+		{
+			sprintf(OcppPath,"/%s",ShmSysConfigAndInfo->SysConfig.ChargeBoxId);
+		}
+		else
+		{
+			sprintf(OcppPath,"/%s%s",OcppTempPath,ShmSysConfigAndInfo->SysConfig.ChargeBoxId);
+		}
+		result = TRUE;
+		goto End;
+	}
+	else if((ShmOCPP16Data->ChargeBoxId != NULL) && (strcmp((const char *)ShmOCPP16Data->ChargeBoxId,"") != 0))
+	{
+		if(OcppTempPath == NULL)
+		{
+			sprintf(OcppPath,"/%s",ShmOCPP16Data->ChargeBoxId);
+		}
+		else
+		{
+			sprintf(OcppPath,"/%s%s",OcppTempPath,ShmOCPP16Data->ChargeBoxId);
+		}
+		result = TRUE;
+		goto End;
+	}
+	else
+	{
+		strcpy(OcppPath,"");
+	}
+
+End:
+	return result;
+}
+
+int GetOcppPort()
+{
+	return OcppPort;
+}
+
+int GetOcppConnStatus(void)
+{
+	return ShmOCPP16Data->OcppConnStatus;
+}
+
+void SetOcppConnStatus(uint8_t status)
+{
+	ShmOCPP16Data->OcppConnStatus = status;
+	ShmSysConfigAndInfo->SysInfo.OcppConnStatus = status;
+}
+
+int GetHeartBeatWithNOResponse(void)
+{
+	return HeartBeatWithNOResponse;
+}
+
+void SetHeartBeatWithNOResponse(void)
+{
+	HeartBeatWithNOResponse = 0;
+}
+
+void GetStartTransactionIdTag(int gun_index)
+{
+	memset(StartTransactionIdTagTemp, 0 ,sizeof(StartTransactionIdTagTemp));
+	strcpy(StartTransactionIdTagTemp, (const char *)ShmOCPP16Data->StartTransaction[gun_index].IdTag);
+	DEBUG_INFO("gun_index=%d StartTransactionIdTagTemp=%s\n",gun_index,StartTransactionIdTagTemp);
+}
+
+int GetTransactionId(int gunindex, unsigned char idTag[])
+{
+	char ch;
+	FILE *fptr1;
+	int temptransactionId;
+	char str[100]={0};
+
+	temptransactionId = 0;
+
+	if((strcmp((const char*)idTag, "")==0)||(idTag[0]=='\0'))
+	{
+		DEBUG_INFO("test 1 \n");
+		return temptransactionId;
+	}
+
+	/*------ Read the file ----------------*/
+	fptr1=fopen("/Storage/OCPP/QueueTransactionId","r");
+	if (!fptr1)
+	{
+		DEBUG_INFO("test 2 \n");
+		//printf(" File not found or unable to open the input file!!\n");
+		return temptransactionId;
+	}
+
+	ch=fgetc(fptr1);
+	//printf(" Now the content of the file %s is : \n","/Storage/OCPP/QueueTransactionId");
+	rewind(fptr1);
+	if(ch!=EOF)
+	{
+	   // printf("%c",ch);
+		while (fgets(str, 100, fptr1) != NULL)
+		{
+			str[strlen(str) - 1] = '\0'; // eat the newline fgets() stores
+
+			if(str[0]=='\0')
+			{
+				break;
+			}
+			char *revbuf[8] = {0}; //存放分割後的子字串
+			int num = 0;//分割後子字串的個數
+			splitstring(str,",",revbuf,&num); //呼叫函式進行分割
+			if((revbuf[1][0] != '\0')&&(revbuf[2][0] != '\0'))
+			{
+				if((atoi(revbuf[0])==gunindex) || (strcmp(revbuf[1],(const char *)idTag)==0))
+				{
+					temptransactionId = atoi(revbuf[2]);
+					break;
+				}
+			}
+
+		}
+	}
+
+	fclose(fptr1);
+	/*------- End of reading ---------------*/
+	return temptransactionId;
+}
+
+void SetTransactionIdZero(int transactionId)
+{
+    char ch;
+    FILE *fptr1, *fptr2;
+	int temptransactionId = 0;
+    char str[100]={0}, strtemp[100]={0}, temp[] = "/Storage/OCPP/QueueTransactionIdtemp.json";
+
+    fptr1 = fopen("/Storage/OCPP/QueueTransactionId", "r");
+    if (!fptr1)
+	{
+    	//printf(" File not found or unable to open the input file!!\n");
+        return ;
+    }
+
+    fptr2 = fopen(temp, "w"); // open the temporary file in write mode
+    if (!fptr2)
+	{
+        DEBUG_INFO("Unable to open a temporary file to write!!\n");
+        fclose(fptr1);
+        return ;
+    }
+
+    ch=fgetc(fptr1);
+
+    rewind(fptr1);
+    if(ch!=EOF)
+    {
+    	// copy all contents to the temporary file except the specific line
+    	while (fgets(str, 100, fptr1) != NULL)
+    	{
+    		str[strlen(str) - 1] = '\0'; // eat the newline fgets() stores
+
+    		if(str[0]=='\0')
+    		{
+    			break;
+    		}
+
+    		char *revbuf[8] = {0};
+    		int num = 0;
+
+    		strcpy(strtemp, str);
+    		splitstring(str,",",revbuf,&num);
+
+    		if(revbuf[2][0] != '\0')
+    		{
+    			temptransactionId = atoi(revbuf[2]);
+    			if(transactionId != temptransactionId)
+    			{
+    			   fprintf(fptr2, "%s\n", strtemp);
+    			}
+    		}
+    	}
+    }
+    fclose(fptr1);
+    fclose(fptr2);
+    remove("/Storage/OCPP/QueueTransactionId");  		// remove the original file
+    rename(temp, "/Storage/OCPP/QueueTransactionId"); 	// rename the temporary file to original name
+/*------ Read the file ----------------*/
+
+}
+
+int InternetDisconnect(void)
+{
+	return (ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectVia4Gi && ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet && ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaWiFi	);
+}
+
+//Note: It is not real StopTransaction. It is temporary StopTransaction.
+void storeTempStopTransaction(int gun_index)
+{
+	char guid[37]={0};
+	int tempIndex = 0;
+	DEBUG_INFO("storeTempStopTransaction...\n");
+	memset(queuedata, 0, sizeof(queuedata));
+
+	//ENERGY_ACTIVE_IMPORT_REGISTER
+	//J: CHAdeMO  U: CCS1 combo  E: CCS2 combo  G: GBT DCcc
+	if(gunType[gun_index] == 'J')
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
+			{
+				ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PowerConsumption;
+			}
+		}// END OF CHAdeMO_QUANTITY
+	}
+	else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < CCS_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
+			{
+				ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PowerConsumption;
+			}
+		}// END OF CCS_QUANTITY
+
+	}
+	else if(gunType[gun_index] == 'G')
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < GB_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
+			{
+				ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PowerConsumption;
+			}
+		}// END OF GB_QUANTITY
+	}
+	else
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
+		{
+			tempIndex = 2;
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < AC_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
+			{
+				ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PowerConsumption;
+			}
+		}// END OF AC_QUANTITY
+	}
+
+	//Stop Transaction Time
+	struct timeval tmnow;
+	struct tm *tm;
+	char buf[28];//, usec_buf[6];
+	gettimeofday(&tmnow, NULL);
+
+	time_t t;
+	t = time(NULL);
+	/*UTC time and date*/
+	tm = gmtime(&t);
+	strftime(buf,28,"%Y-%m-%dT%H:%M:%SZ", tm);
+
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].Timestamp,buf);
+	ShmOCPP16Data->StopTransaction[gun_index].TransactionId = ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId;
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].IdTag, (const char*)ShmOCPP16Data->StartTransaction[gun_index].IdTag);
+
+	random_uuid(guid);
+
+	/***********************************transactionData******************************************************/
+	memset(ShmOCPP16Data->StopTransaction[gun_index].TransactionData, 0, sizeof(sizeof(struct StructMeterValue)));
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].TimeStamp, buf);
+
+	//=================================
+	//1. Transaction_Begin
+	//=================================
+	// Energy.Active.Export.Interval
+    //idx_sample=0;
+	sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Value, "%.1f",(float)(ShmOCPP16Data->StartTransaction[gun_index].MeterStart)); // MeterStart is 0~6553.5 kWh
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Context,ReadingContextStr[ReadingContext_Transaction_Begin]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Format,ValueFormatStr[Raw]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Measurand,MeasurandStr[Energy_Active_Import_Interval]);//MeasurandStr[Energy_Active_Export_Interval/*Energy_Reactive_Export_Register*/]);
+
+	//J: CHAdeMO  U: CCS1 combo  E: CCS2 combo  G: GBT DCcc
+	if((gunType[gun_index] == 'J')||(gunType[gun_index] == 'U')||(gunType[gun_index] == 'E')||(gunType[gun_index] == 'G'))
+	{
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Phase,PhaseStr[L3_N]);
+	}
+	else
+	{
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Phase,PhaseStr[L1_N]);
+	}
+
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Location,LocationStr[Location_Outlet]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Unit,UnitOfMeasureStr[UnitOfMeasure_kWh]);
+
+	//=================================
+	//2. Transaction_End
+	//=================================
+	//2.1 Current.Export
+	//idx_sample=1;
+	//J: CHAdeMO  U: CCS1 combo  E: CCS2 combo  G : GBT DC
+	if(gunType[gun_index] == 'J')
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingCurrent );// PresentChargingCurrent is 0~6553.5 amp
+			}
+		}// End of for CHAdeMO_QUANTITY
+
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L3_N]);
+	}
+	else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < CCS_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingCurrent );// PresentChargingCurrent is 0~6553.5 amp
+			}
+		}// End of for CCS_QUANTITY
+
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L3_N]);
+	}
+	else if(gunType[gun_index] == 'G')
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < GB_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingCurrent );// PresentChargingCurrent is 0~6553.5 amp
+			}
+		}// End of for GB_QUANTITY
+
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L3_N]);
+	}
+	else
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
+		{
+			tempIndex = 2;
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < AC_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingCurrent );//  0~6553.5 amp for EVSE
+			}
+		}// End of for AC_QUANTITY
+
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L1_N]);
+	}
+
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Context,ReadingContextStr[ReadingContext_Transaction_End]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Format,ValueFormatStr[Raw]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Measurand,MeasurandStr[Current_Import]);
+	//strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L1_N]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Location,LocationStr[Location_Outlet]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Unit,UnitOfMeasureStr[UnitOfMeasure_A]);
+
+	//2.2 Energy.Active.Export.Interval
+	//idx_sample=2;
+	//J: CHAdeMO  U: CCS1 combo   E: CCS2 combo   G: GBT DC
+
+	if(gunType[gun_index] == 'J')
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedEnergy );// PresentChargedEnergy is 0~6553.5 kWh
+			}
+		}// END OF CHAdeMO_QUANTITY
+
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L3_N]);
+
+	}
+	else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < CCS_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy );// PresentChargedEnergy is 0~6553.5 kWh
+			}
+		}// END OF CCS_QUANTITY
+
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L3_N]);
+
+	}
+	else if(gunType[gun_index] == 'G')
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < GB_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy );// PresentChargedEnergy is 0~6553.5 kWh
+			}
+		}// END OF GB_QUANTITY
+
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L3_N]);
+	}
+	else
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
+		{
+			tempIndex = 2;
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+
+		for (int index = 0; index < AC_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargedEnergy );// PresentChargedEnergy is 0~6553.5 kWh
+			}
+		}// END OF AC_QUANTITY
+
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L1_N]);
+	}
+
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Context,ReadingContextStr[ReadingContext_Transaction_End]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Format,ValueFormatStr[Raw]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Measurand,MeasurandStr[Energy_Active_Import_Interval]);
+	//strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L1_N]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Location,LocationStr[Location_Outlet]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Unit,UnitOfMeasureStr[UnitOfMeasure_kWh]);
+
+	//2.3 Power.Active.Export
+	//idx_sample=3;
+	//J: CHAdeMO  U: CCS1 combo  E: CCS2 combo  G: GBT DC
+
+	if(gunType[gun_index] == 'J')
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingPower );//  PresentChargingPower is 0~6553.5 kW
+			}
+		} // End for CHAdeMO_QUANTITY
+
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L3_N]);
+	}
+	else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < CCS_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingPower );// PresentChargingPower is 0~6553.5 kW
+			}
+		} // END for CCS_QUANTITY
+
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L3_N]);
+	}
+	else if(gunType[gun_index] == 'G')
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < GB_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingPower );// PresentChargingPower is 0~6553.5 kW
+			}
+		}// END for GB_QUANTITY
+
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L3_N]);
+	}
+	else
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
+		{
+			tempIndex = 2;
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < AC_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingPower );// PresentChargingPower is 0~6553.5 kW
+			}
+		} // END for AC_QUANTITY
+
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L1_N]);
+	}
+
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Context,ReadingContextStr[ReadingContext_Transaction_End]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Format,ValueFormatStr[Raw]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Measurand,MeasurandStr[Power_Active_Import]);
+	//strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L1_N]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Location,LocationStr[Location_Outlet]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Unit,UnitOfMeasureStr[UnitOfMeasure_kW/*UnitOfMeasure_kWh*/]);
+
+	//2.4 Voltage
+	//idx_sample=4;
+	//J: CHAdeMO  U: CCS1 combo  E: CCS2 combo  G: GBT DC
+	if(gunType[gun_index] == 'J')
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingVoltage );// PresentChargingVoltage is 0~6553.5 volt
+			}
+		} // END OF FOR CHAdeMO_QUANTITY
+
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L3_N]);
+
+	}
+	else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < CCS_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingVoltage );// PresentChargingVoltage is 0~6553.5 volt
+			}
+		} // END OF  FOR CCS_QUANTITY
+
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L3_N]);
+	}
+	else if(gunType[gun_index] == 'G')
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < GB_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingVoltage );// PresentChargingVoltage is 0~6553.5 volt
+			}
+		} // END OF FOR GB_QUANTITY
+
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L3_N]);
+	}
+	else
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
+		{
+			tempIndex = 2;
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		for (int index = 0; index < AC_QUANTITY; index++)
+		{
+			if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
+			{
+				sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingVoltage );//AcChargingVoltage is 0~6553.5 volt  for AC EVSE
+			}
+		} // END OF FOR AC_QUANTITY
+
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L1_N]);
+	}
+
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Context,ReadingContextStr[ReadingContext_Transaction_End]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Format,ValueFormatStr[Raw]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Measurand,MeasurandStr[Voltage]);
+	//strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L1_N]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Location,LocationStr[Location_Outlet]);
+	strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Unit,UnitOfMeasureStr[UnitOfMeasure_V]);
+
+	//2.5 SoC
+	//idx_sample=5;
+	//J : CHAdeMO  U: CCS1 combo  E: CCS2 combo  G: GBT DC
+	if((gunType[gun_index] == 'J')||(gunType[gun_index] == 'U')||(gunType[gun_index] == 'E')||(gunType[gun_index] == 'G'))
+	{
+		if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
+		{
+			tempIndex = ((gun_index==2) ? 1: 0);
+		}
+		else
+		{
+			tempIndex = gun_index;
+		}
+
+		if(gunType[gun_index] == 'J')
+		{
+			for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
+				{
+					sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].EvBatterySoc );// 0~100%
+				}
+			}
+		}
+		else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
+		{
+			for (int index = 0; index < CCS_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
+				{
+					sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].EvBatterySoc );// 0~100%
+				}
+			}
+
+		}
+		else if(gunType[gun_index] == 'G')
+		{
+			for (int index = 0; index < GB_QUANTITY; index++)
+			{
+				if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
+				{
+					sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].EvBatterySoc );// 0~100%
+				}
+			}
+
+		}
+
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Context,ReadingContextStr[ReadingContext_Transaction_End]);
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Format,ValueFormatStr[Raw]);
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Measurand,MeasurandStr[SoC/*Energy_Reactive_Export_Register*/]);
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Phase,PhaseStr[L3_N]);
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Location,LocationStr[Location_Outlet]);
+		strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Unit,UnitOfMeasureStr[UnitOfMeasure_Percent/*UnitOfMeasure_kWh*/]);
+
+	} // END FOR DC CASE
+
+	if((gunType[gun_index] == 'J')||(gunType[gun_index] == 'U')||(gunType[gun_index] == 'E')||(gunType[gun_index] == 'G'))
+	{
+		sprintf(queuedata,"%d,[%d,\"%s\",\"StopTransaction\",{\"idTag\":\"%s\",\"meterStop\":%d,\"timestamp\":\"%s\",\"transactionId\":%d,\"reason\":\"%s\",\"transactionData\":[{\"timestamp\":\"%s\",\"sampledValue\":[{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"}]}]}]"
+
+							,gun_index
+							,MESSAGE_TYPE_CALL
+							,guid
+							,ShmOCPP16Data->StopTransaction[gun_index].IdTag
+							,ShmOCPP16Data->StopTransaction[gun_index].MeterStop
+							,ShmOCPP16Data->StopTransaction[gun_index].Timestamp
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionId
+							,"PowerLoss"
+							,(const char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].TimeStamp
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Value
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Context
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Format
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Measurand
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Phase
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Location
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Unit
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Context
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Format
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Measurand
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Location
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Unit
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Context
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Format
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Measurand
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Location
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Unit
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Context
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Format
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Measurand
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Location
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Unit
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Context
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Format
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Measurand
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Location
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Unit
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Value
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Context
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Format
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Measurand
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Phase
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Location
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Unit
+							);
+	}
+	else
+	{
+		sprintf(queuedata,"%d,[%d,\"%s\",\"StopTransaction\",{\"idTag\":\"%s\",\"meterStop\":%d,\"timestamp\":\"%s\",\"transactionId\":%d,\"reason\":\"%s\",\"transactionData\":[{\"timestamp\":\"%s\",\"sampledValue\":[{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"}]}]}]"
+
+							,gun_index
+							,MESSAGE_TYPE_CALL
+							,guid
+							,ShmOCPP16Data->StopTransaction[gun_index].IdTag
+							,ShmOCPP16Data->StopTransaction[gun_index].MeterStop
+							,ShmOCPP16Data->StopTransaction[gun_index].Timestamp
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionId
+							,"PowerLoss"
+							,(const char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].TimeStamp
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Value
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Context
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Format
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Measurand
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Phase
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Location
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Unit
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Context
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Format
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Measurand
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Location
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Unit
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Context
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Format
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Measurand
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Location
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Unit
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Context
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Format
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Measurand
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Location
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Unit
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Context
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Format
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Measurand
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Location
+							,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Unit
+							);
+
+	}
+
+
+	// Check File "TempStopTransaction" Exist
+	if((access("/Storage/OCPP/TempStopTransaction",F_OK))!=-1)
+	{
+		//DEBUG_INFO("TransactionRelatedQueue exist.\n");
+		fclose(fopen("/Storage/OCPP/TempStopTransaction", "w"));
+	}
+	else
+	{
+		//DEBUG_INFO("TransactionRelatedQueue not exist\n");
+		FILE *log = fopen("/Storage/OCPP/TempStopTransaction", "w+");
+
+		if(log == NULL)
+		{
+			//DEBUG_INFO("Can't Create File TransactionRelatedQueue \n");
+			return ;
+		}
+		else
+		{
+			fclose(log);
+		}
+	}
+
+	//Add TempStopTransaction | Update TempStopTransaction
+	// open file for writing
+	FILE *outfile;
+	outfile = fopen ("/Storage/OCPP/TempStopTransaction", "a");
+	//DEBUG_INFO("data = %s\n", queuedata);
+	fputs(queuedata, outfile);
+	fputs("\n", outfile);
+	fclose (outfile);
+}
+
+void checkTempStopTransaction(int gun_index)
+{
+	FILE *fptr1;
+	char ch;
+	char str[1200]={0};
+	char guid[37]={0};
+	char tempdata[65]={0};
+	char connectorStr[2]={0};
+
+	fptr1 = fopen("/Storage/OCPP/TempStopTransaction", "r");
+
+	//TempStopTransaction格式: 槍號,StopTransaction封包
+	if (!fptr1)
+	{
+		//printf(" File not found or unable to open the input file!!\n");
+	    return ;
+	}
+
+	ch=fgetc(fptr1);
+	//printf(" Now the content of the file %s is : \n",fname);
+
+	rewind(fptr1);
+	if(ch!=EOF)
+	{
+		// copy all contents to the temporary file except the specific line
+		while (fgets(str, 1200, fptr1) != NULL)
+		{
+			str[strlen(str) - 1] = '\0'; // eat the newline fgets() stores
+
+			if(str[0]=='\0')
+	    {
+				break;
+	    }
+
+			//TempStopTransaction格式: 槍號,StopTransaction封包
+			strncpy(connectorStr, str, 1);
+			if(atoi(connectorStr) != gun_index)
+			{
+				DEBUG_INFO("atoi(connectorStr)=%d\n",atoi(connectorStr));
+				return ;
+			}
+
+	    //random_uuid(guid);
+			strncpy(guid, str+4, 36); //copy guid
+	    sprintf(tempdata, "StopTransaction,%d", (gun_index));
+	    if(hashmap_operation(0, guid, tempdata) == 1)
+	    {
+	    	DEBUG_INFO("StopTransaction mapitem pass\n");
+	    }
+	    queue_operation(4, guid, str+2 );//addq(guid, queuedata); ---> remove temporally
+
+	    memset(str,0,sizeof str);
+		}
+
+	}
+
+	// fptr1=freopen(NULL,"w",fptr1); // reset the fptr1 again
+	fclose(fptr1);
+	remove("/Storage/OCPP/TempStopTransaction");  		// remove the original file
+}
+
+void FillStartTransaction(int ConnectorId, unsigned char IdTag[], int MeterStart,int ReservationId,unsigned char Timestamp[])
+{
+	ShmOCPP16Data->StartTransaction[ConnectorId-1].ConnectorId = ConnectorId;
+	ShmOCPP16Data->StartTransaction[ConnectorId-1].ReservationId = ReservationId;
+	ShmOCPP16Data->StartTransaction[ConnectorId-1].MeterStart = MeterStart;
+	strcpy((char *)ShmOCPP16Data->StartTransaction[ConnectorId-1].IdTag, (char *)IdTag);
+	strcpy((char *)ShmOCPP16Data->StartTransaction[ConnectorId-1].Timestamp,(char *) Timestamp);
+}
+
+int GetWebSocketPingInterval(void)
+{
+	return atoi((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemData);
+}
+
+int GetServerSign(void)
+{
+	return server_sign;
+}
+
+void SetServerSign(int value)
+{
+	server_sign = value;
+}
+
+int GetBootNotificationInterval(void)
+{
+	return BootNotificationInterval;
+}
+
+int GetInternetConn(void)
+{
+	return ShmSysConfigAndInfo->SysInfo.InternetConn;
+}
+
+void InitialSystemValue(void)
+{
+	int connectorIndex = 0;
+	//int valueASCII = 0;
+	server_cycle_Status = 120;
+	gunTotalNumber=0;
+	SystemInitial = 0;
+	localversion=0;
+	BootNotificationInterval = 0;
+	authorizeRetryTimes = 0;
+	GunStatusInterval = 10;
+
+	TransactionMessageAttemptsValue = atoi((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemData);
+	TransactionMessageRetryIntervalValue = atoi((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemData);
+
+	//Hear Beat
+	HeartBeatWithNOResponse = 0;
+	HeartBeatCountPerHour = 0;
+	HeartBeatWaitTime = 10;
+	FirstHeartBeat = 0;
+
+	FirmwareStatusNotificationStatus = 3;  // Idle
+	DiagnosticsStatusNotificationStatus = 0; // Idle
+
+	memset(CurrentChargingProfileScheduleStr, 0, sizeof(CurrentChargingProfileScheduleStr));
+	memset(statusModeChage, 0, sizeof(statusModeChage));
+	memset(ChademoPreviousSystemStatus, 0, sizeof(ChademoPreviousSystemStatus));
+	memset(CcsPreviousSystemStatus, 0, sizeof(CcsPreviousSystemStatus));
+	memset(GbPreviousSystemStatus, 0, sizeof(GbPreviousSystemStatus));
+	memset(AcPreviousSystemStatus, 0, sizeof(AcPreviousSystemStatus));
+	memset(ChademoPreviousConnectorPlugIn, 0, sizeof(ChademoPreviousConnectorPlugIn));
+	memset(CcsPreviousConnectorPlugIn, 0, sizeof(CcsPreviousConnectorPlugIn));
+	memset(GbPreviousConnectorPlugIn, 0, sizeof(GbPreviousConnectorPlugIn));
+	memset(AcPreviousConnectorPlugIn, 0, sizeof(AcPreviousConnectorPlugIn));
+	memset(gunType, 0, sizeof(gunType));
+
+ 	if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D') // 'D' means DC
+	{
+		//check connector / socket type (index: 8, 9, 10)
+		for(int index=7; index <10 ; index++)
+		{
+			if(index != 8)
+			{
+				// DC Connector
+				if ((ShmSysConfigAndInfo->SysConfig.ModelName[index]  >= 'A') && (ShmSysConfigAndInfo->SysConfig.ModelName[index] <= 'Z'))
+				{
+					SystemInitial = SystemInitial + 1;
+					gunTotalNumber = gunTotalNumber + 1;
+					gunType[connectorIndex] = ShmSysConfigAndInfo->SysConfig.ModelName[index];
+					connectorIndex = connectorIndex + 1;
+				}
+			}
+			else
+			{
+				// AC Connector
+				if ((ShmSysConfigAndInfo->SysConfig.ModelName[index] > '0') && (ShmSysConfigAndInfo->SysConfig.ModelName[index] <= '9'))
+				{
+					SystemInitial = SystemInitial + 1;
+					gunTotalNumber = gunTotalNumber + 1;
+					gunType[connectorIndex] = ShmSysConfigAndInfo->SysConfig.ModelName[index];
+					connectorIndex = connectorIndex + 1;
+				}
+			}
+		}
+
+		//DEBUG_INFO("DC ...\n");
+	}
+	else if (ShmSysConfigAndInfo->SysConfig.ModelName[0]=='A') //'A' means AC
+	{
+		//check connector / socket type (index: 8, 9, 10)
+		for(int index=7; index <10 ; index++)
+		{
+			if ((ShmSysConfigAndInfo->SysConfig.ModelName[index] > '0') && (ShmSysConfigAndInfo->SysConfig.ModelName[index] <= '9'))
+			{
+				SystemInitial = SystemInitial + 1;
+				gunTotalNumber = gunTotalNumber + 1;
+				gunType[connectorIndex] = ShmSysConfigAndInfo->SysConfig.ModelName[index];
+				connectorIndex = connectorIndex + 1;
+
+				DEBUG_INFO("AC: %d, %c\n", index, ShmSysConfigAndInfo->SysConfig.ModelName[index]);
+			}
+
+		}
+
+		DEBUG_INFO("gunTotalNumber: %d\n", gunTotalNumber);
+		DEBUG_INFO("connectorIndex: %d\n", connectorIndex);
+		DEBUG_INFO("SystemInitial: %d\n", SystemInitial);
+		//DEBUG_INFO("AC ...\n");
+	}
+
+	//Status &&  ConnectorPlugIn Setting
+	for (int index = 0; index < CHAdeMO_QUANTITY; index++)
+	{
+		ChademoPreviousSystemStatus[index]= ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PreviousSystemStatus;
+		ChademoPreviousConnectorPlugIn[index] = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ConnectorPlugIn;
+	}
+
+	for (int index = 0; index < CCS_QUANTITY; index++)
+	{
+		CcsPreviousSystemStatus[index] = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PreviousSystemStatus;
+		CcsPreviousConnectorPlugIn[index] = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ConnectorPlugIn;
+	}
+
+	for (int index = 0; index < GB_QUANTITY; index++)
+	{
+		GbPreviousSystemStatus[index] = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PreviousSystemStatus;
+		GbPreviousConnectorPlugIn[index] = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ConnectorPlugIn;
+	}
+
+	for (int index = 0; index < AC_QUANTITY; index++)
+	{
+		AcPreviousSystemStatus[index]= ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PreviousSystemStatus;
+		AcPreviousConnectorPlugIn[index] = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState;
+	}
+
+	for(int gun_index=0; gun_index < gunTotalNumber; gun_index++ )
+	{
+		cpinitateMsg.bits[gun_index].StatusNotificationReq = 0;
+		cpinitateMsg.bits[gun_index].StatusNotificationConf = 0;
+		clientTime.MeterValues[gun_index] = time((time_t*)NULL);
+		clientTime.StatusNotification[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));
+
+	clientTime.Heartbeat=time((time_t*)NULL);
+
+	sleep(1);
+}
+
+void LWS_Send(char * str)
+{
+	//=====================================================
+	// Check InternetConn 0: disconnected, 1: connected
+	//====================================================
+	if(ShmSysConfigAndInfo->SysInfo.InternetConn == 0)
+	{
+		DEBUG_INFO("\n offline  now !!!\n");
+		return;
+	}
+
+	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, 100);//timeout_ms
 }

+ 172 - 172
EVSE/Modularization/ocppfiles/MessageHandler.h

@@ -1,172 +1,172 @@
-#ifndef MessageHandler_H
-#define MessageHandler_H
-
-struct StructPeriod
-{
-	int		StartPeriod;
-	float 	Limit;//0.1;
-	int		NumberPhases;
-};
-
-struct StructProfile
-{
-	int	Duration;
-	int TotalPeriod;
-	struct StructPeriod	Period[10];
-};
-
-
-//===============================================
-// Common routine
-//===============================================
-int initialConfigurationTable(void);
-void StoreConfigurationTable(void);
-void GetStartTransactionIdTag(int gun_index);
-
-//==========================================
-// send request routine
-//==========================================
-int sendAuthorizeRequest(int gun_index);
-int sendBootNotificationRequest(void);
-int sendDataTransferRequest(int gun_index);
-int sendFirmwareVersionByDataTransfer(void);
-int sendDiagnosticsStatusNotificationRequest(char *status);
-int sendFirmwareStatusNotificationRequest(char *status);
-int sendHeartbeatRequest(int gun_index);
-int sendStartTransactionRequest(int gun_index);
-int sendStatusNotificationRequest(int gun_index);
-int sendStopTransactionRequest(int gun_index);
-int sendMeterValuesRequest(int gun_index);
-
-//==========================================
-// send confirm routine
-//==========================================
-int sendCancelReservationConfirmation(char *uuid,char *payload);
-int sendChangeAvailabilityConfirmation(char *uuid,char *payload);
-int sendChangeConfigurationConfirmation(char *uuid,char *payload);
-int sendClearCacheConfirmation(char *uuid,char *payload);
-int sendClearChargingProfileConfirmation(char *uuid,char *payload);
-int sendDataTransferConfirmation(char *uuid,char *payload);
-int sendGetCompositeScheduleConfirmation(char *uuid,char *payload, int connectorIdInt,int nPeriod);
-int sendGetConfigurationConfirmation(char *uuid);
-int sendGetDiagnosticsConfirmation(char *uuid,char *payload);
-int sendGetLocalListVersionConfirmation(char *uuid,char *payload);
-int sendRemoteStartConfirmation(char *uuid,char *payload);
-int sendRemoteStopTransactionConfirmation(char *uuid,char *payload);
-int sendReserveNowTransactionConfirmation(char *uuid,char *payload);
-int sendResetConfirmation(char *uuid,char *payload);
-int sendSendLocalListConfirmation(char *uuid,char *payload);
-int sendSetChargingProfileConfirmation(char *uuid,char *payload);
-int sendTriggerMessageConfirmation(char *uuid,char *payload);
-int sendUnlockConnectorConfirmation(char *uuid,char *payload);
-int sendUpdateFirmwareConfirmation(char *uuid);
-
-//==========================================
-// send CallError routine
-//==========================================
-void SendCallError(char *uniqueId, char *action, char *errorCode, char *errorDescription);
-
-//==========================================
-// Handle server request routine  Start
-//==========================================
-int handleCancelReservationRequest(char *uuid, char *payload);
-int handleChangeAvailabilityRequest(char *uuid, char *payload);
-int handleChangeConfigurationRequest(char *uuid, char *payload);
-int handleClearCacheRequest(char *uuid, char *payload);
-int handleClearChargingProfileRequest(char *uuid, char *payload);
-int handleDataTransferRequest(char *uuid, char *payload);
-int handleGetCompositeScheduleRequest(char *uuid, char *payload);
-int handleGetConfigurationRequest(char *uuid, char *payload);
-int handleGetDiagnosticsRequest(char *uuid, char *payload);
-int handleGetLocalListVersionRequest(char *uuid, char *payload);
-int handleRemoteStartRequest(char *uuid, char *payload);
-int handleRemoteStopTransactionRequest(char *uuid, char *payload);
-int handleReserveNowTransactionRequest(char *uuid, char *payload);
-int handleResetRequest(char *uuid, char *payload);
-int handleSendLocalListRequest(char *uuid, char *payload);
-int handleSetChargingProfileRequest(char *uuid, char *payload);
-int handleTriggerMessageRequest(char *uuid, char *payload);
-int handleUnlockConnectorRequest(char *uuid, char *payload);
-int handleUpdateFirmwareRequest(char *uuid, char *payload);
-void handleAuthorizeResponse(char *payload, int gun_index);
-void handleBootNotificationResponse(char *payload, int gun_index);
-void handleDataTransferResponse(char *payload, int gun_index);
-void handleDiagnosticsStatusNotificationResponse(char *payload, int gun_index);
-void handleFirmwareStatusNotificationResponse(char *payload, int gun_index);
-void handleHeartbeatResponse(char *payload, int gun_index);
-void handleMeterValuesResponse(char *payload, int gun_index);
-void handleStartTransactionResponse(char *payload, int gun_index);
-void handleStatusNotificationResponse(char *payload, int gun_index);
-void handleStopTransactionnResponse(char *payload, int gun_index);
-
-//==========================================
-// Handle Error routine
-//==========================================
-void handleError(char *id, char *errorCode, char *errorDescription,char *payload);
-
-//===============================================
-// Common routine
-//===============================================
-void getKeyValue(char *keyReq);
-int  setKeyValue(char *key, char *value);
-int updateSetting(char *key, char *value);
-int httpDownLoadFile(char *location, char *path, char *filename,char *url);
-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 httpUploadFile(char *location, char *path, char *filename,char *url);
-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);
-void LWS_Send(char * str);
-extern int queue_operation(int type, char *frontUUID, char *frontData);
-int GetOcppServerURL();
-int GetOcppPath();
-int GetOcppPort();
-int GetTransactionId(int gunindex, char idTag[]);
-void SetTransactionIdZero(int transactionId);
-void GetChargingProfileRequest(int gunindex);
-void FillStartTransaction(int ConnectorId, unsigned char IdTag[], int MeterStart,int ReservationId,unsigned char Timestamp[]);
-void splitstring(char *src,const char *separator,char **dest,int *num);
-int GetWebSocketPingInterval(void);
-int GetInternetConn(void);
-int GetServerSign(void);
-void SetServerSign(int value);
-int GetBootNotificationInterval(void);
-void InitialSystemValue(void);
-void checkTempStopTransaction(int gun_index);
-void storeTempStopTransaction(int gun_index);
-
- //===============================================
- // sqlite related routine
- //===============================================
- int SettingChargingRecord(int target, int transactionId);
- int addBuff(int gun_idx, int user_id, int cmd_sn);
- void OCPP_getListVerion();
- int OCPP_cleanLocalList();
- int OCPP_addLocalList(int version, char *idTag, char *parentTage, char *expiryDate, char *status);
- int OCPP_addLocalList_1(int version, char *idTag, char *parentTage, char *expiryDate, char *status);
- void OCPP_getIdTag(char idTag[]);
- void OCPP_deleteIdTag(char idTag[]);
-
-
-enum FIRMWARE_NOTIFICATION_STATUS
-{
-	FIRMWARE_STATUS_DOWNLOADED = 0,
-	FIRMWARE_STATUS_DOWNLOAD_DAILED = 1,
-	FIRMWARE_STATUS_DOWNLOADING = 2,
-	FIRMWARE_STATUS_IDLE = 3,
-	FIRMWARE_STATUS_INSTALLATION_FAILED =4,
-	FIRMWARE_STATUS_INSTALLING = 5,
-	FIRMWARE_STATUS_INSTALLED = 6
-};
-
-enum DIAGNOSTIC_NOTIFICATION_STATUS
-{
-	DIAGNOSTIC_STATUS_IDLE = 0,
-	DIAGNOSTIC_STATUS_UPLOADED = 1,
-	DIAGNOSTIC_STATUS_UPLOAD_FAIL = 2,
-	DIAGNOSTIC_STATUS_UPLOADING =3
-};
-
-
-#endif
+#ifndef MessageHandler_H
+#define MessageHandler_H
+
+struct StructPeriod
+{
+	int		StartPeriod;
+	float 	Limit;//0.1;
+	int		NumberPhases;
+};
+
+struct StructProfile
+{
+	int	Duration;
+	int TotalPeriod;
+	struct StructPeriod	Period[10];
+};
+
+
+//===============================================
+// Common routine
+//===============================================
+int initialConfigurationTable(void);
+void StoreConfigurationTable(void);
+void GetStartTransactionIdTag(int gun_index);
+
+//==========================================
+// send request routine
+//==========================================
+int sendAuthorizeRequest(int gun_index);
+int sendBootNotificationRequest(void);
+int sendDataTransferRequest(int gun_index);
+int sendFirmwareVersionByDataTransfer(void);
+int sendDiagnosticsStatusNotificationRequest(char *status);
+int sendFirmwareStatusNotificationRequest(char *status);
+int sendHeartbeatRequest(int gun_index);
+int sendStartTransactionRequest(int gun_index);
+int sendStatusNotificationRequest(int gun_index);
+int sendStopTransactionRequest(int gun_index);
+int sendMeterValuesRequest(int gun_index);
+
+//==========================================
+// send confirm routine
+//==========================================
+int sendCancelReservationConfirmation(char *uuid,char *payload);
+int sendChangeAvailabilityConfirmation(char *uuid,char *payload);
+int sendChangeConfigurationConfirmation(char *uuid,char *payload);
+int sendClearCacheConfirmation(char *uuid,char *payload);
+int sendClearChargingProfileConfirmation(char *uuid,char *payload);
+int sendDataTransferConfirmation(char *uuid,char *payload);
+int sendGetCompositeScheduleConfirmation(char *uuid,char *payload, int connectorIdInt,int nPeriod);
+int sendGetConfigurationConfirmation(char *uuid);
+int sendGetDiagnosticsConfirmation(char *uuid,char *payload);
+int sendGetLocalListVersionConfirmation(char *uuid,char *payload);
+int sendRemoteStartConfirmation(char *uuid,char *payload);
+int sendRemoteStopTransactionConfirmation(char *uuid,char *payload);
+int sendReserveNowTransactionConfirmation(char *uuid,char *payload);
+int sendResetConfirmation(char *uuid,char *payload);
+int sendSendLocalListConfirmation(char *uuid,char *payload);
+int sendSetChargingProfileConfirmation(char *uuid,char *payload);
+int sendTriggerMessageConfirmation(char *uuid,char *payload);
+int sendUnlockConnectorConfirmation(char *uuid,char *payload);
+int sendUpdateFirmwareConfirmation(char *uuid);
+
+//==========================================
+// send CallError routine
+//==========================================
+void SendCallError(char *uniqueId, char *action, char *errorCode, char *errorDescription);
+
+//==========================================
+// Handle server request routine  Start
+//==========================================
+int handleCancelReservationRequest(char *uuid, char *payload);
+int handleChangeAvailabilityRequest(char *uuid, char *payload);
+int handleChangeConfigurationRequest(char *uuid, char *payload);
+int handleClearCacheRequest(char *uuid, char *payload);
+int handleClearChargingProfileRequest(char *uuid, char *payload);
+int handleDataTransferRequest(char *uuid, char *payload);
+int handleGetCompositeScheduleRequest(char *uuid, char *payload);
+int handleGetConfigurationRequest(char *uuid, char *payload);
+int handleGetDiagnosticsRequest(char *uuid, char *payload);
+int handleGetLocalListVersionRequest(char *uuid, char *payload);
+int handleRemoteStartRequest(char *uuid, char *payload);
+int handleRemoteStopTransactionRequest(char *uuid, char *payload);
+int handleReserveNowTransactionRequest(char *uuid, char *payload);
+int handleResetRequest(char *uuid, char *payload);
+int handleSendLocalListRequest(char *uuid, char *payload);
+int handleSetChargingProfileRequest(char *uuid, char *payload);
+int handleTriggerMessageRequest(char *uuid, char *payload);
+int handleUnlockConnectorRequest(char *uuid, char *payload);
+int handleUpdateFirmwareRequest(char *uuid, char *payload);
+void handleAuthorizeResponse(char *payload, int gun_index);
+void handleBootNotificationResponse(char *payload, int gun_index);
+void handleDataTransferResponse(char *payload, int gun_index);
+void handleDiagnosticsStatusNotificationResponse(char *payload, int gun_index);
+void handleFirmwareStatusNotificationResponse(char *payload, int gun_index);
+void handleHeartbeatResponse(char *payload, int gun_index);
+void handleMeterValuesResponse(char *payload, int gun_index);
+void handleStartTransactionResponse(char *payload, int gun_index);
+void handleStatusNotificationResponse(char *payload, int gun_index);
+void handleStopTransactionnResponse(char *payload, int gun_index);
+
+//==========================================
+// Handle Error routine
+//==========================================
+void handleError(char *id, char *errorCode, char *errorDescription,char *payload);
+
+//===============================================
+// Common routine
+//===============================================
+void getKeyValue(char *keyReq);
+int  setKeyValue(char *key, char *value);
+int updateSetting(char *key, char *value);
+int httpDownLoadFile(char *location, char *path, char *filename,char *url);
+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 httpUploadFile(char *location, char *path, char *filename,char *url);
+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);
+void LWS_Send(char * str);
+extern int queue_operation(int type, char *frontUUID, char *frontData);
+int GetOcppServerURL();
+int GetOcppPath();
+int GetOcppPort();
+int GetTransactionId(int gunindex, unsigned char idTag[]);
+void SetTransactionIdZero(int transactionId);
+void GetChargingProfileRequest(int gunindex);
+void FillStartTransaction(int ConnectorId, unsigned char IdTag[], int MeterStart,int ReservationId,unsigned char Timestamp[]);
+void splitstring(char *src,const char *separator,char **dest,int *num);
+int GetWebSocketPingInterval(void);
+int GetInternetConn(void);
+int GetServerSign(void);
+void SetServerSign(int value);
+int GetBootNotificationInterval(void);
+void InitialSystemValue(void);
+void checkTempStopTransaction(int gun_index);
+void storeTempStopTransaction(int gun_index);
+
+ //===============================================
+ // sqlite related routine
+ //===============================================
+ int SettingChargingRecord(int target, int transactionId);
+ int addBuff(int gun_idx, int user_id, int cmd_sn);
+ void OCPP_getListVerion();
+ int OCPP_cleanLocalList();
+ int OCPP_addLocalList(int version, char *idTag, char *parentTage, char *expiryDate, char *status);
+ int OCPP_addLocalList_1(int version, char *idTag, char *parentTage, char *expiryDate, char *status);
+ void OCPP_getIdTag(char idTag[]);
+ void OCPP_deleteIdTag(char idTag[]);
+
+
+enum FIRMWARE_NOTIFICATION_STATUS
+{
+	FIRMWARE_STATUS_DOWNLOADED = 0,
+	FIRMWARE_STATUS_DOWNLOAD_DAILED = 1,
+	FIRMWARE_STATUS_DOWNLOADING = 2,
+	FIRMWARE_STATUS_IDLE = 3,
+	FIRMWARE_STATUS_INSTALLATION_FAILED =4,
+	FIRMWARE_STATUS_INSTALLING = 5,
+	FIRMWARE_STATUS_INSTALLED = 6
+};
+
+enum DIAGNOSTIC_NOTIFICATION_STATUS
+{
+	DIAGNOSTIC_STATUS_IDLE = 0,
+	DIAGNOSTIC_STATUS_UPLOADED = 1,
+	DIAGNOSTIC_STATUS_UPLOAD_FAIL = 2,
+	DIAGNOSTIC_STATUS_UPLOADING =3
+};
+
+
+#endif

+ 215 - 206
EVSE/Modularization/ocppfiles/Module_OcppBackend.c

@@ -681,6 +681,7 @@ int showfront(char *uuid, char *data)
 
 }
 
+//----------------  addq():  add the item to the end of queue  ----------------//
 int addq(char *uuid, char *data)
 	{
 	FILE *outfile;
@@ -738,6 +739,7 @@ int addq(char *uuid, char *data)
 
 }
 
+//---------------- delq(): delete the top item --------------//
 int delq()
 {
 	char tempfile[] = "/Storage/OCPP/delqtemp.json";
@@ -916,261 +918,268 @@ int showqueue()
 	return TRUE;
 }
 
-int sentqueue()
+int sentqueue(){
+FILE *fp;
+int result = FALSE; // 1: TRUE  0:FALSE
+int temptransactionId = 0, gettransactionId = 0;
+int tempconnectorId = 0;
+//int gunIndex = 0;
+char guid[37]={0};
+char tempdata[65]={0};
+char key_value[65]={0};
+int IsStopTransaction = FALSE;
+//int IsconnectorIdNULL = FALSE;
+//int IsIdtagNULL = FALSE;
+char str[1200]={0};
+char strcomposite[1200]={0};
+char rmFileCmd[100]={0};
+char connectorStr[2]={0};
+struct stat stats;
+char sstr[28]={0};
+unsigned char IdtagStr[20]={0};
+unsigned char timestampStr[30]={0};
+int tempmeterStart = 0;
+int tempreservationId = 0;
+int c = 0;
+char *loc;
+
+DEBUG_INFO("sentqueue\n");
+stat("/Storage/OCPP", &stats);
+
+// Check for directory existence
+if (S_ISDIR(stats.st_mode) == 1)
 {
-	FILE *fp;
-	int result = FALSE; // 1: TRUE  0:FALSE
-	int temptransactionId = 0, gettransactionId = 0;
-	int tempconnectorId = 0;
-	//int gunIndex = 0;
-	char guid[37]={0};
-	char tempdata[65]={0};
-	char key_value[65]={0};
-	int IsStopTransaction = FALSE;
-	//int IsconnectorIdNULL = FALSE;
-	//int IsIdtagNULL = FALSE;
-	char str[1200]={0};
-	char strcomposite[1200]={0};
-	char rmFileCmd[100]={0};
-	struct stat stats;
-	char sstr[28]={0};
-	unsigned char IdtagStr[20]={0};
-	unsigned char timestampStr[30]={0};
-	int tempmeterStart = 0;
-	int tempreservationId = 0;
-	int c = 0;
-	char *loc;
+	//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);
+}
 
-	DEBUG_INFO("Sent Queue\n");
-	stat("/Storage/OCPP", &stats);
+memset(rmFileCmd, 0, sizeof rmFileCmd);
 
-	// 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);
-	}
+/* opening file for reading */
+fp = fopen("/Storage/OCPP/TransactionRelatedQueue" , "r");
+if(fp == NULL) {
+	DEBUG_INFO("Error opening file");
+	return FALSE;
+}
 
-	memset(rmFileCmd, 0, sizeof rmFileCmd);
+if( fgets (str, 1200, fp)!=NULL ) {
 
-	/* opening file for reading */
-	fp = fopen("/Storage/OCPP/TransactionRelatedQueue" , "r");
-	if(fp == NULL) {
-		DEBUG_INFO("Error opening file");
-		return FALSE;
-	}
+	//---- writing content to stdout ---//
 
-	if( fgets (str, 1200, fp)!=NULL ) {
+	//*********************Start: StopTransaction***************************/
+	loc = strstr(str, "StopTransaction");
+	c = 0;
+	memset(sstr ,0, sizeof(sstr) );
+	if(loc != NULL)
+	{
+		IsStopTransaction = TRUE;
+  }
 
-		//---- writing content to stdout ---//
+	memset(connectorStr,0,sizeof(connectorStr));
+	strncpy(connectorStr, str, 1);
+	tempconnectorId = atoi(connectorStr);
 
-		//*********************StopTransaction***************************/
-		loc = strstr(str, "StopTransaction");
-		c = 0;
-		memset(sstr ,0, sizeof(sstr) );
-		if(loc != NULL)
+	//*********************End: StopTransaction***************************/
+
+#if 0
+	//*********************Start:connectorId***************************/
+	loc = strstr(str, "connectorId");
+	c = 0;
+	memset(sstr ,0, sizeof(sstr) );
+	if(loc != NULL)
+	{
+		while (loc[strlen("connectorId")+2+c] != ',')
+		{
+			sstr[c] = loc[strlen("connectorId")+2+c];
+			c++;
+		}
+		sstr[c] = '\0';
+		tempconnectorId = atoi(sstr);
+	}
+//	else
+//	{
+//		IsconnectorIdNULL = TRUE;
+//	}
+	//*********************End:connectorId***************************/
+#endif
+
+	//*********************Start:idTag***************************/
+	loc = strstr(str, "idTag");
+	c = 0;
+	memset(sstr ,0, sizeof(sstr) );
+	if(loc != NULL)
+	{
+		while (loc[3+strlen("idTag")+c] != '\"')
+		{
+			sstr[c] = loc[3+strlen("idTag")+c];
+			c++;
+		}
+		sstr[c] = '\0';
+		strcpy((char*)IdtagStr, sstr);
+	}
+//	else
+//	{
+//		IsIdtagNULL = TRUE;
+//	}
+	//*********************End:idTag***************************/
+
+
+	//*********************Start: StartTransaction***************************/
+	loc = strstr(str, "StartTransaction");
+	c = 0;
+	memset(sstr ,0, sizeof(sstr) );
+	if(loc != NULL)
+	{
+		// [2,0200000000000000000000000001584415776,StartTransaction,{connectorId:1,idTag:123,meterStart:100,reservationId:0,timestamp:2020-03-17T03:29:36Z}]
+		//DEBUG_INFO("\n sent queue StartTransaction\n");
+		if(tempconnectorId > 0)
 		{
-			IsStopTransaction = TRUE;
+			sprintf(tempdata, "StartTransaction,%d", (tempconnectorId-1));
 		}
 
-		//*********************Start:connectorId***************************/
-		loc = strstr(str, "connectorId");
-		c = 0;
+        //GUID
 		memset(sstr ,0, sizeof(sstr) );
-		if(loc != NULL)
+		c=0;
+		while (str[6+c] != '\"')
 		{
-			while (loc[strlen("connectorId")+2+c] != ',')
-			{
-				sstr[c] = loc[strlen("connectorId")+2+c];
-				c++;
-			}
-			sstr[c] = '\0';
-			tempconnectorId = atoi(sstr);
+		  	sstr[c] = str[6+c];
+		  	c++;
 		}
-	//	else
-	//	{
-	//		IsconnectorIdNULL = TRUE;
-	//	}
-		//*********************End:connectorId***************************/
+		sstr[c] = '\0';
+		strcpy(guid, sstr);
 
 
-		//*********************Start:idTag***************************/
+		//Idtag
 		loc = strstr(str, "idTag");
+		memset(sstr ,0, sizeof(sstr) );
+		c=0;
+		while (loc[3+strlen("idTag")+c] != '\"')
+		{
+			sstr[c] = loc[3+strlen("idTag")+c];
+			c++;
+	    }
+		sstr[c] = '\0';
+		strcpy((char*)IdtagStr, sstr);
+
+		//meterStart
+		loc = strstr(str, "meterStart");
 		c = 0;
 		memset(sstr ,0, sizeof(sstr) );
 		if(loc != NULL)
 		{
-			while (loc[3+strlen("idTag")+c] != '\"')
+			while (loc[strlen("meterStart")+2+c] != ',')
 			{
-				sstr[c] = loc[3+strlen("idTag")+c];
+				sstr[c] = loc[strlen("meterStart")+2+c];
 				c++;
 			}
 			sstr[c] = '\0';
-			strcpy((char*)IdtagStr, sstr);
-		}
-	//	else
-	//	{
-	//		IsIdtagNULL = TRUE;
-	//	}
-		//*********************End:idTag***************************/
+			tempmeterStart = atoi(sstr);
 
+		}
 
-		//*********************Start: StartTransaction***************************/
-		loc = strstr(str, "StartTransaction");
+		//reservationId
+		loc = strstr(str, "reservationId");
 		c = 0;
 		memset(sstr ,0, sizeof(sstr) );
 		if(loc != NULL)
 		{
-			// [2,0200000000000000000000000001584415776,StartTransaction,{connectorId:1,idTag:123,meterStart:100,reservationId:0,timestamp:2020-03-17T03:29:36Z}]
-			//DEBUG_INFO("\n sent queue StartTransaction\n");
-			if(tempconnectorId > 0)
-			{
-				sprintf(tempdata, "StartTransaction,%d", (tempconnectorId-1));
-			}
-
-			//GUID
-			memset(sstr ,0, sizeof(sstr) );
-			c=0;
-			while (str[4+c] != '\"')
-			{
-				sstr[c] = str[4+c];
-				c++;
-			}
-			sstr[c] = '\0';
-			strcpy(guid, sstr);
-
-
-			//Idtag
-			loc = strstr(str, "idTag");
-			memset(sstr ,0, sizeof(sstr) );
-			c=0;
-			while (loc[3+strlen("idTag")+c] != '\"')
+			while (loc[strlen("reservationId")+2+c] != ',')
 			{
-				sstr[c] = loc[3+strlen("idTag")+c];
+				sstr[c] = loc[strlen("reservationId")+2+c];
 				c++;
 			}
 			sstr[c] = '\0';
-			strcpy((char*)IdtagStr, sstr);
-
-			//meterStart
-			loc = strstr(str, "meterStart");
-			c = 0;
-			memset(sstr ,0, sizeof(sstr) );
-			if(loc != NULL)
-			{
-				while (loc[strlen("meterStart")+2+c] != ',')
-				{
-					sstr[c] = loc[strlen("meterStart")+2+c];
-					c++;
-				}
-				sstr[c] = '\0';
-				tempmeterStart = atoi(sstr);
+			tempreservationId = atoi(sstr);
 
-			}
+		}
 
-			//reservationId
-			loc = strstr(str, "reservationId");
-			c = 0;
-			memset(sstr ,0, sizeof(sstr) );
-			if(loc != NULL)
-			{
-				while (loc[strlen("reservationId")+2+c] != ',')
-				{
-					sstr[c] = loc[strlen("reservationId")+2+c];
-					c++;
-				}
-				sstr[c] = '\0';
-				tempreservationId = atoi(sstr);
+		//timestamp
+		loc = strstr(str, "timestamp");
+		memset(sstr ,0, sizeof(sstr) );
+		c=0;
+		while (loc[3+strlen("timestamp")+c] != '\"')
+		{
+			sstr[c] = loc[3+strlen("timestamp")+c];
+			c++;
+		}
+		sstr[c] = '\0';
+		strcpy((char*)timestampStr, sstr);
 
-			}
 
-			//timestamp
-			loc = strstr(str, "timestamp");
-			memset(sstr ,0, sizeof(sstr) );
-			c=0;
-			while (loc[3+strlen("timestamp")+c] != '\"')
-			{
-				sstr[c] = loc[3+strlen("timestamp")+c];
-				c++;
-			}
-			sstr[c] = '\0';
-			strcpy((char*)timestampStr, sstr);
+		if(hashmap_operation(1, guid, key_value) == TRUE)
+		{
+			//DEBUG_INFO("\n 1. sent queue guid=%s\n",guid);
+		}
+		else
+		{
+			hashmap_operation(0, guid, tempdata);
+			FillStartTransaction(tempconnectorId, IdtagStr, tempmeterStart, tempreservationId, timestampStr);
+			//DEBUG_INFO("\n 2. sent queue guid=%s\n",guid);
+		}
+	}
+	//*********************End: StartTransaction***************************/
 
 
-			if(hashmap_operation(HASH_OP_GET, guid, key_value) == TRUE)
-			{
-				//DEBUG_INFO("\n 1. sent queue guid=%s\n",guid);
-			}
-			else
-			{
-				hashmap_operation(HASH_OP_ADD, guid, tempdata);
-				FillStartTransaction(tempconnectorId, IdtagStr, tempmeterStart, tempreservationId, timestampStr);
-				//DEBUG_INFO("\n 2. sent queue guid=%s\n",guid);
-			}
-		}
-		//*********************End: StartTransaction***************************/
+	//****************transactionId********************/
+	 c=0;
+	 loc = strstr(str, "transactionId");
+	 memset(sstr ,0, sizeof(sstr) );
+	 if(loc != NULL)
+	 {
 
-		//****************transactionId********************/
-		 c=0;
-		 loc = strstr(str, "transactionId");
-		 memset(sstr ,0, sizeof(sstr) );
-		 if(loc != NULL)
+		 while ((loc[strlen("transactionId")+2+c] != '}') && (loc[strlen("transactionId")+2+c] != ','))
 		 {
+			sstr[c] = loc[strlen("transactionId")+2+c];
+			c++;
+		 }
 
-			 while ((loc[strlen("transactionId")+2+c] != '}') && (loc[strlen("transactionId")+2+c] != ','))
-			 {
-				sstr[c] = loc[strlen("transactionId")+2+c];
-				c++;
-			 }
-
-			sstr[c] = '\0';
-			temptransactionId = atoi(sstr);
+		sstr[c] = '\0';
+		temptransactionId = atoi(sstr);
 
-			GetStartTransactionIdTag(tempconnectorId-1);
-			gettransactionId = GetTransactionId(tempconnectorId, StartTransactionIdTagTemp);
-			if((gettransactionId != 0)&&(temptransactionId != gettransactionId))
-			{
-				//replace transactionId of metervalue or stopTransaction
-				strncpy(strcomposite,str, (loc-str)+2+strlen("transactionId"));
-				sprintf(strcomposite+((loc-str)+2+strlen("transactionId")),"%d",gettransactionId);
-				strcat(strcomposite, loc+strlen("transactionId")+2+c);
-				LWS_Send(strcomposite);
-			}
-			else
-			{
-				LWS_Send(str);
-				gettransactionId = temptransactionId;
-			}
+		//gettransactionId = GetTransactionId(tempconnectorId, IdtagStr);
 
-			DEBUG_INFO("StartTransactionIdTagTemp: %d\n", StartTransactionIdTagTemp);
-			DEBUG_INFO("temptransactionId: %d\n", temptransactionId);
-			DEBUG_INFO("gettransactionId: %d\n", gettransactionId);
+		//From StartTransaction取得IdTag, 存到 StartTransactionIdTagTemp,主要是 給Queue中StopTransaction使用(StartTransaction. StopTransaction不同卡號 ),取得真正的TransactionId
+		GetStartTransactionIdTag(tempconnectorId-1);
+		DEBUG_INFO("\n StartTransactionIdTagTemp=%s",StartTransactionIdTagTemp);
+		gettransactionId = GetTransactionId(tempconnectorId, StartTransactionIdTagTemp);
+		DEBUG_INFO("\n gettransactionId=%d",gettransactionId);
+		if((gettransactionId != 0)&&(temptransactionId != gettransactionId))
+		{
+			//replace transactionId of metervalue or stopTransaction
+			strncpy(strcomposite,str, (loc-str)+2+strlen("transactionId"));
+			sprintf(strcomposite+((loc-str)+2+strlen("transactionId")),"%d",gettransactionId);
+			strcat(strcomposite, loc+strlen("transactionId")+2+c); // 把 字串中transactionId後面的字串串接到 strcomposite後面
+			LWS_Send(strcomposite+2); // skip 2 bytes字串->  槍號,
+		}
+		else
+		{
+			LWS_Send(str+2);  // skip 2 bytes字串->  槍號,
+		}
 
-			if((IsStopTransaction == TRUE)&&(gettransactionId != 0))
-			{
-				DEBUG_INFO("IsStopTransaction: true\n");
-				SetTransactionIdZero(gettransactionId);
-			}
-		 }
-		 else
-		 {
-			 LWS_Send(str);
-		 }
+		if((IsStopTransaction == TRUE)&&(gettransactionId != 0))
+		{
+			SetTransactionIdZero(gettransactionId);
+		}
 
-		result = TRUE;
-	}
-	else
-	{
-		result = FALSE;
-	}
-	fclose(fp);
+	 }
+	 else
+	 {
+		 LWS_Send(str+2);
+	 }
 
-	return result;
+	result = TRUE;
+}
+else
+{
+	result = FALSE;
+}
+fclose(fp);
+return result;
 }
 
 void* processTransactionQueue(void* data)