瀏覽代碼

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

Action:
1. Build up VariableMonitoring related functions. (Not done yet)

File:
1. EVSE/Modularization/ocpp20/MessageHandler.c
--> Action 1
2. EVSE/Projects/define.h
--> Action 1

Jerry Wang 2 年之前
父節點
當前提交
917183e439

+ 219 - 5
EVSE/Modularization/ocpp20/MessageHandler.c

@@ -1522,6 +1522,19 @@ int DB_Initial()
 		                     "variableCharacteristicsMinLimit real,"
 							 "unique(componentName, componentInstance,variableName, variableInstance) on conflict replace);";
 
+	char *sqlVariableMonitoring =  "create table if not exists ocpp20_variable_monitoring (idx integer primary key,"
+								 "id integer ,"
+								 "transaction text, "
+								 "value text , "
+								 "type text, "
+								 "severity integer, "
+								 "component_name text, "
+								 "component_instance text,"
+								 "component_evse_id integer, "
+								 "component_evse_connectorId integer, "
+								 "variable_name text, "
+			                     "variable_instance text);";
+
 	char *sqlBootType 	  =  "create table if not exists ocpp20_boot_type (idx integer primary key,"
 							 "type text);";
 
@@ -1586,6 +1599,17 @@ int DB_Initial()
 			DEBUG_INFO( "Create OCPP 2.0 variable table successfully\n");
 		}
 
+		if (sqlite3_exec(db, sqlVariableMonitoring, 0, 0, &errMsg) != SQLITE_OK)
+		{
+			result = FAIL;
+			DEBUG_ERROR( "Create OCPP 2.0 variable monitoring table error message: %s\n", errMsg);
+		}
+		else
+		{
+			DEBUG_INFO( "Create OCPP 2.0 variable monitoring table successfully\n");
+		}
+
+
 		if (sqlite3_exec(db, sqlBootType, 0, 0, &errMsg) != SQLITE_OK)
 		{
 			result = FAIL;
@@ -1949,10 +1973,10 @@ int DB_updateSecurityEventType(SecurityEventEnumType reason)
 int DB_variableClear()
 {
 	int result = PASS;
-	char * sqlcleanLocalList = "delete from ocpp20_variable";
+	char * sqlclearVariable = "delete from ocpp20_variable";
 	char *errMsg = 0;
 
-	if (sqlite3_exec(db, sqlcleanLocalList, 0, 0, &errMsg) != SQLITE_OK)
+	if (sqlite3_exec(db, sqlclearVariable, 0, 0, &errMsg) != SQLITE_OK)
 	{
 		DEBUG_INFO("%s\n", errMsg);
 		result = FAIL;
@@ -3721,6 +3745,108 @@ void DB_variableLoadFromDb()
 	}
 }
 
+//==============================
+// Variable Monitoring
+//==============================
+int DB_variableMonitoringClear()
+{
+	int result = PASS;
+	char * sqlclearVariableMonitoring = "delete from ocpp20_variable_monitoring";
+	char *errMsg = 0;
+
+	if (sqlite3_exec(db, sqlclearVariableMonitoring, 0, 0, &errMsg) != SQLITE_OK)
+	{
+		DEBUG_INFO("%s\n", errMsg);
+		result = FAIL;
+	}
+
+	return result;
+}
+
+int DB_cbVariableMonitoringSaveToDb(void *para, int columnCount, char **columnValue, char **columnName)
+{
+   for(int i = 0; i<columnCount; i++)
+   {
+     // printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
+   }
+
+   return 0;
+}
+
+int DB_variableMonitoringSaveToDb(struct SetMonitoringDataType *variableMonitoring)
+{
+	int result = FAIL;
+
+	char sql[4096];
+	char* errMsg = NULL;
+
+	sprintf(sql,"insert or replace into ocpp20_variable_monitoring "
+			"(id, transaction, value, type, severity, component_name, component_instance, component_evse_id, component_evse_connectorId, variable_name, variable_instance) "
+			"VALUES('%d', '%d', '%.2f', '%s', '%d', '%s', %s, '%d', '%d', '%s', '%s');  SELECT * from ocpp20_variable_monitoring;",
+			variableMonitoring->id,
+			variableMonitoring->transaction,
+			variableMonitoring->value,
+			variableMonitoring->type,
+			variableMonitoring->severity,
+			variableMonitoring->component.name,
+			variableMonitoring->component.instance,
+			variableMonitoring->component.evse.id,
+			variableMonitoring->component.evse.connectorId,
+			variableMonitoring->variable.name,
+			variableMonitoring->variable.instance
+			);
+
+	//* Execute SQL statement */
+	if(sqlite3_exec(db, sql, DB_cbVariableMonitoringSaveToDb, 0, &errMsg) != SQLITE_OK)
+	{
+		DEBUG_INFO("SQL error: %s\n", errMsg);
+		result = FAIL;
+	}
+
+	return result;
+}
+
+int DB_cbVariableMonitoringLoadFromDb(void *para, int columnCount, char **columnValue, char **columnName)
+{
+	for(int idx=0;idx<10;idx++)
+	{
+		if((strlen((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].component.name) == 0) &&
+		   (strlen((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].variable.name) == 0))
+		{
+			ShmOCPP20Data->MonitoringComponentVariable[idx].id = strlen(columnValue[1])>=0?atoi(columnValue[1]):-1;
+			ShmOCPP20Data->MonitoringComponentVariable[idx].transaction = strlen(columnValue[2])>=0?atoi(columnValue[2]):0;
+			ShmOCPP20Data->MonitoringComponentVariable[idx].value = strlen(columnValue[3])>=0?atof(columnValue[3]):0;
+			sprintf((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].type, "%s", columnValue[4]);
+			ShmOCPP20Data->MonitoringComponentVariable[idx].severity = strlen(columnValue[5])>0?atoi(columnValue[5]):9;
+			sprintf((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].component.name, "%s", columnValue[6]);
+			sprintf((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].component.instance, "%s", columnValue[7]);
+			ShmOCPP20Data->MonitoringComponentVariable[idx].component.evse.id = strlen(columnValue[8])>0?atoi(columnValue[8]):-1;
+			ShmOCPP20Data->MonitoringComponentVariable[idx].component.evse.connectorId = strlen(columnValue[9])>0?atoi(columnValue[9]):-1;
+
+			sprintf((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].variable.name, "%s", columnValue[10]);
+			sprintf((char*)ShmOCPP20Data->MonitoringComponentVariable[idx].variable.instance, "%s", columnValue[11]);
+
+			break;
+		}
+	}
+
+	return 0;
+}
+
+void DB_variableMonitoringLoadFromDb()
+{
+	char sql[512];
+	char* errMsg = NULL;
+
+	sprintf(sql,"select * from ocpp20_variable_monitoring order by idx;");
+
+	/* Execute SQL statement */
+	if(sqlite3_exec(db, sql, DB_cbVariableMonitoringLoadFromDb, 0, &errMsg) != SQLITE_OK )
+	{
+		DEBUG_INFO("SQL error: %s\n", errMsg);
+	}
+}
+
 int DB_cbGetNetworkProfileFromDb(void *para, int columnCount, char **columnValue, char **columnName)
 {
 	memset(&ShmOCPP20Data->NetworkConnectionProfile[0], 0x00, ARRAY_SIZE(ShmOCPP20Data->NetworkConnectionProfile));
@@ -15950,6 +16076,9 @@ int handleGetMonitoringReportRequest(char *uuid, char *payload)
 {
 	mtrace();
 	int result = FAIL;
+	uint8_t cntCriteria = 0;
+	int cntComponentVariable = 0;
+	uint8_t cntFoundMonitoringVariable = 0;
 	json_object *GetMonitoringReport;
 
 	DEBUG_INFO("handleGetMonitoringReportRequest...\n");
@@ -15967,14 +16096,19 @@ int handleGetMonitoringReportRequest(char *uuid, char *payload)
 		// Optional data
 		if(json_object_object_get(GetMonitoringReport, "monitoringCriteria") != NULL)
 		{
-			sprintf((char*)ShmOCPP20Data->GetMonitoringReport.monitoringCriteria, "%s", json_object_get_string(json_object_object_get(GetMonitoringReport, "monitoringCriteria")));
+			cntCriteria = json_object_array_length(json_object_object_get(GetMonitoringReport, "monitoringCriteria"));
+			for(int idx=0; idx<cntCriteria; idx++)
+			{
+				sprintf((char*)ShmOCPP20Data->GetMonitoringReport.monitoringCriteria[idx], "%s", json_object_get_string(json_object_object_get(GetMonitoringReport, "monitoringCriteria")));
+			}
 		}
 
 		if(json_object_object_get(GetMonitoringReport, "componentVariable") != NULL)
 		{
-			if(json_object_array_length(json_object_object_get(GetMonitoringReport, "componentVariable")) <= ARRAY_SIZE(ShmOCPP20Data->GetMonitoringReport.componentVariable))
+			cntComponentVariable = json_object_array_length(json_object_object_get(GetMonitoringReport, "componentVariable"));
+			if(cntComponentVariable <= ARRAY_SIZE(ShmOCPP20Data->GetMonitoringReport.componentVariable))
 			{
-				for(int idx=0;idx<json_object_array_length(json_object_object_get(GetMonitoringReport, "componentVariable"));idx++)
+				for(int idx=0;idx<cntComponentVariable;idx++)
 				{
 					if(json_object_object_get(json_object_array_get_idx(json_object_object_get(GetMonitoringReport, "componentVariable"), idx), "component") != NULL)
 					{
@@ -16020,6 +16154,85 @@ int handleGetMonitoringReportRequest(char *uuid, char *payload)
 	}
 	json_object_put(GetMonitoringReport);
 
+	strcpy((char*)ShmOCPP20Data->GetMonitoringReport.Response_status, GenericDeviceModelStatusEnumTypeStr[GenericDeviceModelStatusEnumType_NotSupported]);
+
+	if(cntComponentVariable>0)
+	{
+		uint8_t cntTypeSupport = 0;
+		for(int idx_cv=0; idx_cv < cntComponentVariable; idx_cv++)
+		{
+			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++)
+						{
+							if(strcmp((char*)ShmOCPP20Data->GetMonitoringReport.monitoringCriteria[idx_cri], MonitoringCriterionEnumTypeStr[MonitoringCriterionEnumType_ThresholdMonitoring]) == 0)
+							{
+								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));
+
+									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;
+
+									cntTypeSupport++;
+									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)
+								{
+									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));
+
+									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;
+
+									cntTypeSupport++;
+									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)
+								{
+									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));
+
+									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;
+
+									cntTypeSupport++;
+									break;
+								}
+							}
+						}
+
+					}
+					cntFoundMonitoringVariable++;
+				}
+			}
+		}
+	}
+
+
+
 	/*
 	 * TODO:
 	 * 	1. Response result
@@ -20934,6 +21147,7 @@ int initialConfigurationTable(void)
 	}
 
 	DB_getNetworkProfileFromDb();
+	//DB_variableMonitoringLoadFromDb();
 
 	return 0;
 }

二進制
EVSE/Projects/AW-Regular/Images/root/Module_FactoryConfig


二進制
EVSE/Projects/AW-Regular/Images/root/Module_InternalComm


+ 3 - 2
EVSE/Projects/define.h

@@ -5453,10 +5453,10 @@ struct ReportDataType
 
 struct SetMonitoringDataType
 {
-	unsigned int id;												// Optional. An id SHALL only be given to replace an existing monitor. The Charging Station handles the generation of id’s for new monitors.
+	int id;												            // Optional. An id SHALL only be given to replace an existing monitor. The Charging Station handles the generation of id’s for new monitors.
 	float value;													// Required. Value for threshold or delta monitoring. For Periodic or PeriodicClockAligned this is the interval in seconds.
 	unsigned char type[32];											// Required. The type of this monitor, e.g. a threshold, delta or periodic monitor.
-	unsigned char severity;											// Required. The severity that will be assigned to an event that is triggered by this monitor.
+	unsigned char severity;											    // Required. The severity that will be assigned to an event that is triggered by this monitor.
 	unsigned char transaction;										// Optional. Monitor only active when a transaction is ongoing on a component relevant to this transaction. Default = false.
 	struct ComponentType component;									// Required. Component for which monitor is set.
 	struct VariableType variable;									// Required. Variable for which monitor is set.
@@ -6374,6 +6374,7 @@ struct OCPP20Data
 	unsigned short 							Ping_Pong_Interval;
 	long int                                procDogTime;            // Process watch dog refresh timer
 	struct ReportDataType                   ControllerComponentVariable[CtrlrVariable_CNT];
+	struct SetMonitoringDataType            MonitoringComponentVariable[10];
 	struct NetworkConnectionProfile_20      NetworkConnectionProfile[10];
 
 	union