소스 검색

2023-01-31/ Jerry Wang
[OCPP 2.0.1]

Action:
1. Fix sqlite3 error of creating table 'ocpp20_variable_monitoring' which would always cause initialization failure.
2. Build up VariableMonitoring related functions. (Not done yet)
3. Cancel Heartbeat resend logic.

File:
1. EVSE/Modularization/ocpp20/MessageHandler.c
--> Action 1-3

Jerry Wang 2 년 전
부모
커밋
b30ec3be5b
1개의 변경된 파일250개의 추가작업 그리고 75개의 파일을 삭제
  1. 250 75
      EVSE/Modularization/ocpp20/MessageHandler.c

+ 250 - 75
EVSE/Modularization/ocpp20/MessageHandler.c

@@ -1524,7 +1524,7 @@ int DB_Initial()
 
 	char *sqlVariableMonitoring =  "create table if not exists ocpp20_variable_monitoring (idx integer primary key,"
 								 "id integer ,"
-								 "transaction text, "
+								 "txn text, "
 								 "value text , "
 								 "type text, "
 								 "severity integer, "
@@ -7781,7 +7781,8 @@ void CheckSystemValue(void)
 	if((server_sign == TRUE) && (getDiffSecNow(clientTime.Heartbeat) >= (HeartBeatWaitTime + HeartBeatWithNOResponse)))
 	{
 		//parameter for test
-		sendHeartbeatRequest(0);
+		if(HeartBeatWithNOResponse < 1)
+			sendHeartbeatRequest(0);
 	    //==============================================
 		// Reset Waiting Time
 		//==============================================
@@ -7827,51 +7828,12 @@ void CheckSystemValue(void)
 	   (server_sign == TRUE) &&
 	   (ShmOCPP20Data->GetMonitoringReport.requestId > 0))
 	{
-		for(uint8_t idxCriterion=0;idxCriterion<ARRAY_SIZE(ShmOCPP20Data->GetMonitoringReport.monitoringCriteria);idxCriterion++)
-		{
-			if((strcmp((char*)ShmOCPP20Data->GetMonitoringReport.monitoringCriteria[idxCriterion],  MonitoringCriterionEnumTypeStr[MonitoringCriterionEnumType_ThresholdMonitoring]) == 0) ||
-			   (strcmp((char*)ShmOCPP20Data->GetMonitoringReport.monitoringCriteria[idxCriterion], MonitoringCriterionEnumTypeStr[MonitoringCriterionEnumType_DeltaMonitoring]) == 0) ||
-			   (strcmp((char*)ShmOCPP20Data->GetMonitoringReport.monitoringCriteria[idxCriterion], MonitoringCriterionEnumTypeStr[MonitoringCriterionEnumType_PeriodicMonitoring]) == 0))
-			{
-				/*for(uint8_t idxVarMonitoring=0; idxVarMonitoring<10; idxVarMonitoring++)
-				{
-					if(strcmp((char*)ShmOCPP20Data->ControllerVariableMonitoring[idxVarMonitoring].variableMonitoring[idxVarMonitoring].type, (char*)ShmOCPP20Data->GetMonitoringReport.monitoringCriteria[idxCriterion]))
-					{
-						strcpy(ShmOCPP20Data->NotifyMonitoringReport.monitor[idxVarMonitoring].component, ShmOCPP20Data->ControllerVariableMonitoring[idxVarMonitoring].
-					}
-				}*/
-			}
-
-			if(strcmp((char*)ShmOCPP20Data->GetMonitoringReport.monitoringCriteria[idxCriterion],  MonitoringCriterionEnumTypeStr[MonitoringCriterionEnumType_ThresholdMonitoring]) == 0)
-			{
+		ShmOCPP20Data->NotifyMonitoringReport.requestId = ShmOCPP20Data->GetMonitoringReport.requestId;
+		ShmOCPP20Data->NotifyMonitoringReport.tbc = 0;
+		ShmOCPP20Data->NotifyMonitoringReport.seqNo = 0;
+		getNowDatetime(ShmOCPP20Data->NotifyMonitoringReport.generatedAt);
 
-				/*
-				 * TODO:
-				 * 	1. Report component that are ThresholdMonitoring
-				 */
-			}
-			else if(strcmp((char*)ShmOCPP20Data->GetMonitoringReport.monitoringCriteria[idxCriterion], MonitoringCriterionEnumTypeStr[MonitoringCriterionEnumType_DeltaMonitoring]) == 0)
-			{
-				/*
-				 * TODO:
-				 * 	1. Report component that are DeltaMonitoring
-				 */
-			}
-			else if(strcmp((char*)ShmOCPP20Data->GetMonitoringReport.monitoringCriteria[idxCriterion], MonitoringCriterionEnumTypeStr[MonitoringCriterionEnumType_PeriodicMonitoring]) == 0)
-			{
-				/*
-				 * TODO:
-				 * 	1. Report component that are PeriodicMonitoring
-				 */
-			}
-			else
-			{
-				/*
-				 * TODO:
-				 * 	1. Process unknown criteria condition
-				 */
-			}
-		}
+		sendNotifyMonitoringReportRequest();
 
 		ShmOCPP20Data->GetMonitoringReport.requestId = 0;
 	}
@@ -16154,19 +16116,20 @@ int handleGetMonitoringReportRequest(char *uuid, char *payload)
 	}
 	json_object_put(GetMonitoringReport);
 
-	strcpy((char*)ShmOCPP20Data->GetMonitoringReport.Response_status, GenericDeviceModelStatusEnumTypeStr[GenericDeviceModelStatusEnumType_NotSupported]);
+	//strcpy((char*)ShmOCPP20Data->GetMonitoringReport.Response_status, GenericDeviceModelStatusEnumTypeStr[GenericDeviceModelStatusEnumType_NotSupported]);
+	strcpy((char*)ShmOCPP20Data->GetMonitoringReport.Response_status, GenericDeviceModelStatusEnumTypeStr[GenericDeviceModelStatusEnumType_EmptyResultSet]);
 
 	if(cntComponentVariable>0)
 	{
 		uint8_t cntTypeSupport = 0;
 		for(int idx_cv=0; idx_cv < cntComponentVariable; idx_cv++)
 		{
+			cntTypeSupport = 0;
 			for(int idx=0; idx < 10; idx++)
 			{
 				if((strcmp((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].component.name, (char*)ShmOCPP20Data->GetMonitoringReport.componentVariable[idx_cv].component.name)==0) &&
 				   (strcmp((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].variable.name, (char*)ShmOCPP20Data->GetMonitoringReport.componentVariable[idx_cv].variable.name)==0))
 				{
-					cntTypeSupport = 0;
 					if(strlen((char*)ShmOCPP20Data->GetMonitoringReport.monitoringCriteria[0]) > 0)
 					{
 						for(int idx_cri=0; idx_cri<cntCriteria; idx_cri++)
@@ -16175,14 +16138,15 @@ int handleGetMonitoringReportRequest(char *uuid, char *payload)
 							{
 								if(strcmp((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type, MonitoringCriterionEnumTypeStr[MonitoringCriterionEnumType_ThresholdMonitoring])==0)
 								{
-									memcpy(&ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].component, &ShmOCPP20Data->MonitoringComponentVariable[idx].component, sizeof(struct ComponentType));
-									memcpy(&ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].variable, &ShmOCPP20Data->MonitoringComponentVariable[idx].variable, sizeof(struct VariableType));
+									memcpy(&ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].component, &ShmOCPP20Data->MonitoringComponentVariable[idx].component, sizeof(struct ComponentType));
+									memcpy(&ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variable, &ShmOCPP20Data->MonitoringComponentVariable[idx].variable, sizeof(struct VariableType));
 
-									ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].variableMonitoring[cntTypeSupport].id = ShmOCPP20Data->MonitoringComponentVariable[idx].id;
-									ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].variableMonitoring[cntTypeSupport].severity = ShmOCPP20Data->MonitoringComponentVariable[idx].severity;
-									ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].variableMonitoring[cntTypeSupport].transaction = ShmOCPP20Data->MonitoringComponentVariable[idx].transaction;
-									strcpy((char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].variableMonitoring[cntTypeSupport].type,(char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type);
-									ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].variableMonitoring[cntTypeSupport].value = ShmOCPP20Data->MonitoringComponentVariable[idx].value;
+									ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[cntTypeSupport].id = ShmOCPP20Data->MonitoringComponentVariable[idx].id;
+									ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[cntTypeSupport].severity = ShmOCPP20Data->MonitoringComponentVariable[idx].severity;
+									ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[cntTypeSupport].transaction = ShmOCPP20Data->MonitoringComponentVariable[idx].transaction;
+									strcpy((char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[cntTypeSupport].type,(char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type);
+									ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[cntTypeSupport].value = ShmOCPP20Data->MonitoringComponentVariable[idx].value;
+									strcpy((char*)ShmOCPP20Data->GetMonitoringReport.Response_status, GenericDeviceModelStatusEnumTypeStr[GenericDeviceModelStatusEnumType_Accepted]);
 
 									cntTypeSupport++;
 									break;
@@ -16192,14 +16156,15 @@ int handleGetMonitoringReportRequest(char *uuid, char *payload)
 							{
 								if(strcmp((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type, MonitoringCriterionEnumTypeStr[MonitoringCriterionEnumType_DeltaMonitoring])==0)
 								{
-									memcpy(&ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].component, &ShmOCPP20Data->MonitoringComponentVariable[idx].component, sizeof(struct ComponentType));
-									memcpy(&ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].variable, &ShmOCPP20Data->MonitoringComponentVariable[idx].variable, sizeof(struct VariableType));
+									memcpy(&ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].component, &ShmOCPP20Data->MonitoringComponentVariable[idx].component, sizeof(struct ComponentType));
+									memcpy(&ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variable, &ShmOCPP20Data->MonitoringComponentVariable[idx].variable, sizeof(struct VariableType));
 
-									ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].variableMonitoring[cntTypeSupport].id = ShmOCPP20Data->MonitoringComponentVariable[idx].id;
-									ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].variableMonitoring[cntTypeSupport].severity = ShmOCPP20Data->MonitoringComponentVariable[idx].severity;
-									ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].variableMonitoring[cntTypeSupport].transaction = ShmOCPP20Data->MonitoringComponentVariable[idx].transaction;
-									strcpy((char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].variableMonitoring[cntTypeSupport].type,(char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type);
-									ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].variableMonitoring[cntTypeSupport].value = ShmOCPP20Data->MonitoringComponentVariable[idx].value;
+									ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[cntTypeSupport].id = ShmOCPP20Data->MonitoringComponentVariable[idx].id;
+									ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[cntTypeSupport].severity = ShmOCPP20Data->MonitoringComponentVariable[idx].severity;
+									ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[cntTypeSupport].transaction = ShmOCPP20Data->MonitoringComponentVariable[idx].transaction;
+									strcpy((char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[cntTypeSupport].type,(char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type);
+									ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[cntTypeSupport].value = ShmOCPP20Data->MonitoringComponentVariable[idx].value;
+									strcpy((char*)ShmOCPP20Data->GetMonitoringReport.Response_status, GenericDeviceModelStatusEnumTypeStr[GenericDeviceModelStatusEnumType_Accepted]);
 
 									cntTypeSupport++;
 									break;
@@ -16209,35 +16174,245 @@ int handleGetMonitoringReportRequest(char *uuid, char *payload)
 							{
 								if(strcmp((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type, MonitoringCriterionEnumTypeStr[MonitoringCriterionEnumType_PeriodicMonitoring])==0)
 								{
-									memcpy(&ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].component, &ShmOCPP20Data->MonitoringComponentVariable[idx].component, sizeof(struct ComponentType));
-									memcpy(&ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].variable, &ShmOCPP20Data->MonitoringComponentVariable[idx].variable, sizeof(struct VariableType));
+									memcpy(&ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].component, &ShmOCPP20Data->MonitoringComponentVariable[idx].component, sizeof(struct ComponentType));
+									memcpy(&ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variable, &ShmOCPP20Data->MonitoringComponentVariable[idx].variable, sizeof(struct VariableType));
 
-									ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].variableMonitoring[cntTypeSupport].id = ShmOCPP20Data->MonitoringComponentVariable[idx].id;
-									ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].variableMonitoring[cntTypeSupport].severity = ShmOCPP20Data->MonitoringComponentVariable[idx].severity;
-									ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].variableMonitoring[cntTypeSupport].transaction = ShmOCPP20Data->MonitoringComponentVariable[idx].transaction;
-									strcpy((char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].variableMonitoring[cntTypeSupport].type,(char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type);
-									ShmOCPP20Data->NotifyMonitoringReport.monitor[cntFoundMonitoringVariable].variableMonitoring[cntTypeSupport].value = ShmOCPP20Data->MonitoringComponentVariable[idx].value;
+									ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[cntTypeSupport].id = ShmOCPP20Data->MonitoringComponentVariable[idx].id;
+									ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[cntTypeSupport].severity = ShmOCPP20Data->MonitoringComponentVariable[idx].severity;
+									ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[cntTypeSupport].transaction = ShmOCPP20Data->MonitoringComponentVariable[idx].transaction;
+									strcpy((char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[cntTypeSupport].type,(char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type);
+									ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[cntTypeSupport].value = ShmOCPP20Data->MonitoringComponentVariable[idx].value;
+									strcpy((char*)ShmOCPP20Data->GetMonitoringReport.Response_status, GenericDeviceModelStatusEnumTypeStr[GenericDeviceModelStatusEnumType_Accepted]);
 
 									cntTypeSupport++;
 									break;
 								}
 							}
 						}
+					}
+					else
+					{
+						memcpy(&ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].component, &ShmOCPP20Data->MonitoringComponentVariable[idx].component, sizeof(struct ComponentType));
+						memcpy(&ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variable, &ShmOCPP20Data->MonitoringComponentVariable[idx].variable, sizeof(struct VariableType));
+
+						ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[cntTypeSupport].id = ShmOCPP20Data->MonitoringComponentVariable[idx].id;
+						ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[cntTypeSupport].severity = ShmOCPP20Data->MonitoringComponentVariable[idx].severity;
+						ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[cntTypeSupport].transaction = ShmOCPP20Data->MonitoringComponentVariable[idx].transaction;
+						strcpy((char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[cntTypeSupport].type,(char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type);
+						ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[cntTypeSupport].value = ShmOCPP20Data->MonitoringComponentVariable[idx].value;
+						strcpy((char*)ShmOCPP20Data->GetMonitoringReport.Response_status, GenericDeviceModelStatusEnumTypeStr[GenericDeviceModelStatusEnumType_Accepted]);
 
+						cntTypeSupport++;
 					}
 					cntFoundMonitoringVariable++;
 				}
 			}
 		}
 	}
+	else
+	{
+		for(int idx=0; idx < 10; idx++)
+		{
+			if(strlen((char*)ShmOCPP20Data->GetMonitoringReport.monitoringCriteria[0]) > 0)
+			{
+				if((strlen((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].component.name)>0) && (strlen((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].variable.name)>0))
+				{
+					int isSameVariableFound = FALSE;
 
+					for(int idx_cri=0; idx_cri<cntCriteria; idx_cri++)
+					{
+						if(strcmp((char*)ShmOCPP20Data->GetMonitoringReport.monitoringCriteria[idx_cri], MonitoringCriterionEnumTypeStr[MonitoringCriterionEnumType_ThresholdMonitoring]) == 0)
+						{
+							if(strcmp((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type, MonitoringCriterionEnumTypeStr[MonitoringCriterionEnumType_ThresholdMonitoring])==0)
+							{
+								for(int idx_cv=0; idx_cv < 10; idx_cv++)
+								{
+									if((strlen((char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].component.name)>0) && (strlen((char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variable.name)>0))
+									{
+										if((strstr((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].component.name, (char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].component.name) != NULL) &&
+										   (strstr((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].variable.name, (char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variable.name) != NULL))
+										{
+											isSameVariableFound = TRUE;
+											for(int idx_vm=1; idx_vm < 10; idx_vm++)
+											{
+												if(strlen((char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[idx_vm].type) == 0)
+												{
+													ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[idx_vm].id = ShmOCPP20Data->MonitoringComponentVariable[idx].id;
+													ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[idx_vm].severity = ShmOCPP20Data->MonitoringComponentVariable[idx].severity;
+													ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[idx_vm].transaction = ShmOCPP20Data->MonitoringComponentVariable[idx].transaction;
+													strcpy((char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[idx_vm].type,(char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type);
+													ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[idx_vm].value = ShmOCPP20Data->MonitoringComponentVariable[idx].value;
+												}
+											}
+											break;
+										}
+									}
+									else
+									{
+										if(isSameVariableFound==FALSE)
+										{
+											memcpy(&ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].component, &ShmOCPP20Data->MonitoringComponentVariable[idx].component, sizeof(struct ComponentType));
+											memcpy(&ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variable, &ShmOCPP20Data->MonitoringComponentVariable[idx].variable, sizeof(struct VariableType));
+
+											ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[0].id = ShmOCPP20Data->MonitoringComponentVariable[idx].id;
+											ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[0].severity = ShmOCPP20Data->MonitoringComponentVariable[idx].severity;
+											ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[0].transaction = ShmOCPP20Data->MonitoringComponentVariable[idx].transaction;
+											strcpy((char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[0].type,(char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type);
+											ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[0].value = ShmOCPP20Data->MonitoringComponentVariable[idx].value;
+											strcpy((char*)ShmOCPP20Data->GetMonitoringReport.Response_status, GenericDeviceModelStatusEnumTypeStr[GenericDeviceModelStatusEnumType_Accepted]);
+										}
+										break;
+									}
+								}
+								break;
+							}
+						}
+						else if(strcmp((char*)ShmOCPP20Data->GetMonitoringReport.monitoringCriteria[idx_cri], MonitoringCriterionEnumTypeStr[MonitoringCriterionEnumType_DeltaMonitoring]) == 0)
+						{
+							if(strcmp((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type, MonitoringCriterionEnumTypeStr[MonitoringCriterionEnumType_DeltaMonitoring])==0)
+							{
+								for(int idx_cv=0; idx_cv < 10; idx_cv++)
+								{
+									if((strlen((char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].component.name)>0) && (strlen((char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variable.name)>0))
+									{
+										if((strstr((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].component.name, (char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].component.name) != NULL) &&
+										   (strstr((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].variable.name, (char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variable.name) != NULL))
+										{
+											isSameVariableFound = TRUE;
+											for(int idx_vm=1; idx_vm < 10; idx_vm++)
+											{
+												if(strlen((char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[idx_vm].type) == 0)
+												{
+													ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[idx_vm].id = ShmOCPP20Data->MonitoringComponentVariable[idx].id;
+													ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[idx_vm].severity = ShmOCPP20Data->MonitoringComponentVariable[idx].severity;
+													ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[idx_vm].transaction = ShmOCPP20Data->MonitoringComponentVariable[idx].transaction;
+													strcpy((char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[idx_vm].type,(char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type);
+													ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[idx_vm].value = ShmOCPP20Data->MonitoringComponentVariable[idx].value;
+												}
+											}
+											break;
+										}
+									}
+									else
+									{
+										if(isSameVariableFound==FALSE)
+										{
+											memcpy(&ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].component, &ShmOCPP20Data->MonitoringComponentVariable[idx].component, sizeof(struct ComponentType));
+											memcpy(&ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variable, &ShmOCPP20Data->MonitoringComponentVariable[idx].variable, sizeof(struct VariableType));
+
+											ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[0].id = ShmOCPP20Data->MonitoringComponentVariable[idx].id;
+											ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[0].severity = ShmOCPP20Data->MonitoringComponentVariable[idx].severity;
+											ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[0].transaction = ShmOCPP20Data->MonitoringComponentVariable[idx].transaction;
+											strcpy((char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[0].type,(char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type);
+											ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[0].value = ShmOCPP20Data->MonitoringComponentVariable[idx].value;
+											strcpy((char*)ShmOCPP20Data->GetMonitoringReport.Response_status, GenericDeviceModelStatusEnumTypeStr[GenericDeviceModelStatusEnumType_Accepted]);
+										}
+										break;
+									}
+								}
+								break;
+							}
+						}
+						else if(strcmp((char*)ShmOCPP20Data->GetMonitoringReport.monitoringCriteria[idx_cri], MonitoringCriterionEnumTypeStr[MonitoringCriterionEnumType_PeriodicMonitoring]) == 0)
+						{
+							if(strcmp((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type, MonitoringCriterionEnumTypeStr[MonitoringCriterionEnumType_PeriodicMonitoring])==0)
+							{
+								for(int idx_cv=0; idx_cv < 10; idx_cv++)
+								{
+									if((strlen((char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].component.name)>0) && (strlen((char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variable.name)>0))
+									{
+										if((strstr((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].component.name, (char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].component.name) != NULL) &&
+										   (strstr((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].variable.name, (char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variable.name) != NULL))
+										{
+											isSameVariableFound = TRUE;
+											for(int idx_vm=1; idx_vm < 10; idx_vm++)
+											{
+												if(strlen((char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[idx_vm].type) == 0)
+												{
+													ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[idx_vm].id = ShmOCPP20Data->MonitoringComponentVariable[idx].id;
+													ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[idx_vm].severity = ShmOCPP20Data->MonitoringComponentVariable[idx].severity;
+													ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[idx_vm].transaction = ShmOCPP20Data->MonitoringComponentVariable[idx].transaction;
+													strcpy((char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[idx_vm].type,(char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type);
+													ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[idx_vm].value = ShmOCPP20Data->MonitoringComponentVariable[idx].value;
+												}
+											}
+											break;
+										}
+									}
+									else
+									{
+										if(isSameVariableFound==FALSE)
+										{
+											memcpy(&ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].component, &ShmOCPP20Data->MonitoringComponentVariable[idx].component, sizeof(struct ComponentType));
+											memcpy(&ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variable, &ShmOCPP20Data->MonitoringComponentVariable[idx].variable, sizeof(struct VariableType));
+
+											ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[0].id = ShmOCPP20Data->MonitoringComponentVariable[idx].id;
+											ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[0].severity = ShmOCPP20Data->MonitoringComponentVariable[idx].severity;
+											ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[0].transaction = ShmOCPP20Data->MonitoringComponentVariable[idx].transaction;
+											strcpy((char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[0].type,(char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type);
+											ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[0].value = ShmOCPP20Data->MonitoringComponentVariable[idx].value;
+											strcpy((char*)ShmOCPP20Data->GetMonitoringReport.Response_status, GenericDeviceModelStatusEnumTypeStr[GenericDeviceModelStatusEnumType_Accepted]);
+										}
+										break;
+									}
+								}
+								break;
+							}
+						}
+					}
+				}
+			}
+			else
+			{
+				if((strlen((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].component.name)>0) && (strlen((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].variable.name)>0))
+				{
+					int isSameVariableFound = FALSE;
+					for(int idx_cv=0; idx_cv < 10; idx_cv++)
+					{
+						if((strlen((char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].component.name)>0) && (strlen((char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variable.name)>0))
+						{
+							if((strstr((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].component.name, (char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].component.name) != NULL) &&
+							   (strstr((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].variable.name, (char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variable.name) != NULL))
+							{
+								isSameVariableFound = TRUE;
+								for(int idx_vm=1; idx_vm < 10; idx_vm++)
+								{
+									if(strlen((char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[idx_vm].type) == 0)
+									{
+										ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[idx_vm].id = ShmOCPP20Data->MonitoringComponentVariable[idx].id;
+										ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[idx_vm].severity = ShmOCPP20Data->MonitoringComponentVariable[idx].severity;
+										ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[idx_vm].transaction = ShmOCPP20Data->MonitoringComponentVariable[idx].transaction;
+										strcpy((char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[idx_vm].type,(char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type);
+										ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[idx_vm].value = ShmOCPP20Data->MonitoringComponentVariable[idx].value;
+									}
+								}
+							}
+						}
+						else
+						{
+							if(isSameVariableFound==FALSE)
+							{
+								memcpy(&ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].component, &ShmOCPP20Data->MonitoringComponentVariable[idx].component, sizeof(struct ComponentType));
+								memcpy(&ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variable, &ShmOCPP20Data->MonitoringComponentVariable[idx].variable, sizeof(struct VariableType));
+
+								ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[0].id = ShmOCPP20Data->MonitoringComponentVariable[idx].id;
+								ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[0].severity = ShmOCPP20Data->MonitoringComponentVariable[idx].severity;
+								ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[0].transaction = ShmOCPP20Data->MonitoringComponentVariable[idx].transaction;
+								strcpy((char*)ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[0].type,(char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type);
+								ShmOCPP20Data->NotifyMonitoringReport.monitor[idx_cv].variableMonitoring[0].value = ShmOCPP20Data->MonitoringComponentVariable[idx].value;
+								strcpy((char*)ShmOCPP20Data->GetMonitoringReport.Response_status, GenericDeviceModelStatusEnumTypeStr[GenericDeviceModelStatusEnumType_Accepted]);
+							}
+						}
+					}
+				}
+			}
+			cntFoundMonitoringVariable++;
+		}
+	}
 
+	if(strcmp((char*)ShmOCPP20Data->GetMonitoringReport.Response_status, GenericDeviceModelStatusEnumTypeStr[GenericDeviceModelStatusEnumType_Accepted]) != 0)
+		ShmOCPP20Data->GetMonitoringReport.requestId = 0;
 
-	/*
-	 * TODO:
-	 * 	1. Response result
-	 */
-	strcpy((char*)ShmOCPP20Data->GetMonitoringReport.Response_status, GenericDeviceModelStatusEnumTypeStr[GenericDeviceModelStatusEnumType_Accepted]);
 	sendGetMonitoringReportConfirmation(uuid);
 
 	return result;
@@ -21147,7 +21322,7 @@ int initialConfigurationTable(void)
 	}
 
 	DB_getNetworkProfileFromDb();
-	//DB_variableMonitoringLoadFromDb();
+	DB_variableMonitoringLoadFromDb();
 
 	return 0;
 }