Эх сурвалжийг харах

[Add][Modularization][Module_DcMeter]

2021.06.08 / Folus Wen

Actions:
1. Add Module_DcMeter task sample.
2. Remove unused share library.

Files:
1. As follow commit history

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

Hardware PWB P/N : XXXXXXX
Hardware Version : XXXXXXX
FolusWen 3 жил өмнө
parent
commit
399d0ceb33
37 өөрчлөгдсөн 1194 нэмэгдсэн , 449 устгасан
  1. 131 439
      EVSE/GPL/curl-7.37.1/config.log
  2. 3 1
      EVSE/GPL/curl-7.37.1/config.status
  3. BIN
      EVSE/GPL/curl-7.37.1/lib/.libs/libcurl.a
  4. BIN
      EVSE/GPL/curl-7.37.1/lib/.libs/libcurl.so.4.3.0
  5. 4 4
      EVSE/GPL/curl-7.37.1/lib/curl_config.h
  6. BIN
      EVSE/GPL/curl-7.37.1/release/bin/curl
  7. BIN
      EVSE/GPL/curl-7.37.1/release/lib/libcurl.a
  8. BIN
      EVSE/GPL/curl-7.37.1/release/lib/libcurl.so.4.3.0
  9. BIN
      EVSE/GPL/curl-7.37.1/src/.libs/curl
  10. 2 2
      EVSE/GPL/curl-7.37.1/src/tool_hugehelp.c
  11. 193 0
      EVSE/Modularization/DcMeter/Module_DcMeter.c
  12. 57 0
      EVSE/Modularization/DcMeter/Module_DcMeter.h
  13. 66 0
      EVSE/Modularization/DcMeter/SystemLogMessage.c
  14. 10 0
      EVSE/Modularization/DcMeter/SystemLogMessage.h
  15. 405 0
      EVSE/Modularization/DcMeter/curlApi.c
  16. 28 0
      EVSE/Modularization/DcMeter/curlApi.h
  17. 222 0
      EVSE/Modularization/DcMeter/meterComm.c
  18. 63 0
      EVSE/Modularization/DcMeter/meterComm.h
  19. 9 3
      EVSE/Modularization/Makefile
  20. BIN
      EVSE/rootfs/lib/ld-2.19.so
  21. BIN
      EVSE/rootfs/lib/libBrokenLocale-2.19.so
  22. BIN
      EVSE/rootfs/lib/libanl-2.19.so
  23. BIN
      EVSE/rootfs/lib/libc-2.19.so
  24. BIN
      EVSE/rootfs/lib/libcrypt-2.19.so
  25. BIN
      EVSE/rootfs/lib/libdl-2.19.so
  26. BIN
      EVSE/rootfs/lib/libm-2.19.so
  27. BIN
      EVSE/rootfs/lib/libnsl-2.19.so
  28. BIN
      EVSE/rootfs/lib/libnss_compat-2.19.so
  29. BIN
      EVSE/rootfs/lib/libnss_dns-2.19.so
  30. BIN
      EVSE/rootfs/lib/libnss_files-2.19.so
  31. BIN
      EVSE/rootfs/lib/libpthread-2.19.so
  32. BIN
      EVSE/rootfs/lib/libresolv-2.19.so
  33. BIN
      EVSE/rootfs/lib/librt-2.19.so
  34. BIN
      EVSE/rootfs/lib/libutil-2.19.so
  35. 1 0
      EVSE/rootfs/root/.gitignore
  36. BIN
      EVSE/rootfs/root/Module_Payment
  37. BIN
      EVSE/rootfs/root/OcppBackend20

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 131 - 439
EVSE/GPL/curl-7.37.1/config.log


+ 3 - 1
EVSE/GPL/curl-7.37.1/config.status

@@ -1143,6 +1143,7 @@ D["TIME_WITH_SYS_TIME"]=" 1"
 D["HAVE_SYS_TYPES_H"]=" 1"
 D["HAVE_SYS_TIME_H"]=" 1"
 D["HAVE_TIME_H"]=" 1"
+D["HAVE_CLOCK_GETTIME_MONOTONIC"]=" 1"
 D["HAVE_ZLIB_H"]=" 1"
 D["HAVE_LIBZ"]=" 1"
 D["CURL_DISABLE_LDAP"]=" 1"
@@ -1169,8 +1170,9 @@ D["HAVE_RAND_EGD"]=" 1"
 D["HAVE_ENGINE_CLEANUP"]=" 1"
 D["HAVE_CRYPTO_CLEANUP_ALL_EX_DATA"]=" 1"
 D["HAVE_SSL_GET_SHUTDOWN"]=" 1"
-D["HAVE_SSLV2_CLIENT_METHOD"]=" 1"
 D["HAVE_SSL_CTX_SET_NEXT_PROTO_SELECT_CB"]=" 1"
+D["HAVE_SSL_CTX_SET_ALPN_PROTOS"]=" 1"
+D["HAVE_SSL_CTX_SET_ALPN_SELECT_CB"]=" 1"
 D["HAVE_SSLEAY_SRP"]=" 1"
 D["STDC_HEADERS"]=" 1"
 D["HAVE_MALLOC_H"]=" 1"

BIN
EVSE/GPL/curl-7.37.1/lib/.libs/libcurl.a


BIN
EVSE/GPL/curl-7.37.1/lib/.libs/libcurl.so.4.3.0


+ 4 - 4
EVSE/GPL/curl-7.37.1/lib/curl_config.h

@@ -122,7 +122,7 @@
 #define HAVE_BOOL_T 1
 
 /* Define to 1 if you have the clock_gettime function and monotonic timer. */
-/* #undef HAVE_CLOCK_GETTIME_MONOTONIC */
+#define HAVE_CLOCK_GETTIME_MONOTONIC 1
 
 /* Define to 1 if you have the closesocket function. */
 /* #undef HAVE_CLOSESOCKET */
@@ -598,13 +598,13 @@
 #define HAVE_SSLEAY_SRP 1
 
 /* Define to 1 if you have the `SSLv2_client_method' function. */
-#define HAVE_SSLV2_CLIENT_METHOD 1
+/* #undef HAVE_SSLV2_CLIENT_METHOD */
 
 /* Define to 1 if you have the `SSL_CTX_set_alpn_protos' function. */
-/* #undef HAVE_SSL_CTX_SET_ALPN_PROTOS */
+#define HAVE_SSL_CTX_SET_ALPN_PROTOS 1
 
 /* Define to 1 if you have the `SSL_CTX_set_alpn_select_cb' function. */
-/* #undef HAVE_SSL_CTX_SET_ALPN_SELECT_CB */
+#define HAVE_SSL_CTX_SET_ALPN_SELECT_CB 1
 
 /* Define to 1 if you have the `SSL_CTX_set_next_proto_select_cb' function. */
 #define HAVE_SSL_CTX_SET_NEXT_PROTO_SELECT_CB 1

BIN
EVSE/GPL/curl-7.37.1/release/bin/curl


BIN
EVSE/GPL/curl-7.37.1/release/lib/libcurl.a


BIN
EVSE/GPL/curl-7.37.1/release/lib/libcurl.so.4.3.0


BIN
EVSE/GPL/curl-7.37.1/src/.libs/curl


+ 2 - 2
EVSE/GPL/curl-7.37.1/src/tool_hugehelp.c

@@ -2,7 +2,7 @@
 #ifndef HAVE_LIBZ
 /*
  * NEVER EVER edit this manually, fix the mkhelp.pl script instead!
- * Generation time: Sat Feb 29 14:44:54 2020
+ * Generation time: Sat Jun  5 10:04:45 2021
  */
 #ifdef USE_MANUAL
 #include "tool_hugehelp.h"
@@ -4207,7 +4207,7 @@ void hugehelp(void) {}
 #else
 /*
  * NEVER EVER edit this manually, fix the mkhelp.pl script instead!
- * Generation time: Sat Feb 29 14:44:54 2020
+ * Generation time: Sat Jun  5 10:04:46 2021
  */
 #ifdef USE_MANUAL
 #include "tool_hugehelp.h"

+ 193 - 0
EVSE/Modularization/DcMeter/Module_DcMeter.c

@@ -0,0 +1,193 @@
+/*
+ * Module_DcMeter.c
+ *
+ *  Created on: 2021/5/31
+ *      Author: foluswen
+ */
+#include "Module_DcMeter.h"
+#include "meterComm.h"
+
+/**
+ * Initial share memory
+ * @return
+ */
+int InitShareMemory()
+{
+	int result = PASS;
+	int MeterSMId;
+
+	//Initialize 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
+    {}
+
+   	//Initialize ShmStatusCodeData
+   	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
+    {}
+
+    return result;
+}
+
+//==========================================
+// Main loop
+//==========================================
+int main(void)
+{
+	Meter_Info meter_info;
+	uint8_t pollingIndex = 0;
+	uint8_t failCount = 0;
+
+#ifndef DEBUG_STANDALONG
+	// Initialize share memory
+	if(InitShareMemory() == FAIL)
+	{
+		DEBUG_ERROR("InitShareMemory NG\n");
+
+		if(ShmStatusCodeData!=NULL)
+		{
+			ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=ON;
+		}
+		sleep(5);
+		return -1;
+	}
+#endif//DEBUG_STANDALONG
+
+	// Initialize DC meter model
+	/*
+	 *	TODO:
+	 *		1. Maybe need to parse configuration by model name
+	 */
+	meterInitialize(METER_MODEL_LEM_L18005A);
+
+	// Main loop
+	for(;;)
+	{
+		switch(pollingIndex)
+		{
+			case 0:
+				if(readCurrent(&meter_info))
+				{
+#ifndef DEBUG_STANDALONG
+					/*
+					 *	TODO:
+					 *		1. Synchronize data to share memory
+					 */
+#else
+					DEBUG_INFO("Output current: %.3f A\n", meter_info.presentCurrent);
+#endif//DEBUG_STANDALONG
+					pollingIndex++;
+					failCount = 0;
+				}
+				else
+				{
+					if(failCount < 10)
+						failCount++;
+				}
+				break;
+			case 1:
+				if(readVoltage(&meter_info))
+				{
+#ifndef DEBUG_STANDALONG
+					/*
+					 *	TODO:
+					 *		1. Synchronize data to share memory
+					 */
+#else
+					DEBUG_INFO("Output voltage: %.3f V\n", meter_info.presetVoltage);
+#endif//DEBUG_STANDALONG
+					pollingIndex++;
+					failCount = 0;
+				}
+				else
+				{
+					if(failCount < 10)
+						failCount++;
+				}
+				break;
+			case 2:
+				if(readPower(&meter_info))
+				{
+#ifndef DEBUG_STANDALONG
+					/*
+					 *	TODO:
+					 *		1. Synchronize data to share memory
+					 */
+#else
+					DEBUG_INFO("Output power: %.3f kw\n", meter_info.presentPower);
+#endif//DEBUG_STANDALONG
+					pollingIndex++;
+					failCount = 0;
+				}
+				else
+				{
+					if(failCount < 10)
+						failCount++;
+				}
+				break;
+			case 3:
+				if(readEnergy(&meter_info))
+				{
+#ifndef DEBUG_STANDALONG
+					/*
+					 *	TODO:
+					 *		1. Synchronize data to share memory
+					 */
+#else
+					DEBUG_INFO("Totalize import energy: %.3f kwh\n", meter_info.totlizeImportEnergy);
+					DEBUG_INFO("Totalize export energy: %.3f kwh\n", meter_info.totlizeExportEnergy);
+#endif//DEBUG_STANDALONG
+					pollingIndex++;
+					failCount = 0;
+				}
+				else
+				{
+					if(failCount < 10)
+						failCount++;
+				}
+				break;
+			default:
+				pollingIndex = 0;
+				break;
+		}
+
+		if(failCount >= 10)
+		{
+#ifndef DEBUG_STANDALONG
+			if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.MeterCommTimeout)
+			{
+				DEBUG_ERROR("Meter communication timeout");
+				ShmStatusCodeData->AlarmCode.AlarmEvents.bits.MeterCommTimeout = ON;
+			}
+#endif//DEBUG_STANDALONG
+		}
+		else
+		{
+#ifndef DEBUG_STANDALONG
+			ShmStatusCodeData->AlarmCode.AlarmEvents.bits.MeterCommTimeout = OFF;
+#endif//DEBUG_STANDALONG
+		}
+
+		usleep(500000);
+	}
+
+	return -1;
+}

+ 57 - 0
EVSE/Modularization/DcMeter/Module_DcMeter.h

@@ -0,0 +1,57 @@
+/*
+ * Module_DcMeter.h
+ *
+ *  Created on: 2021/5/31
+ *      Author: foluswen
+ */
+
+#ifndef MODULE_DCMETER_H_
+#define MODULE_DCMETER_H_
+#include 	<sys/time.h>
+#include 	<sys/timeb.h>
+#include    <sys/types.h>
+#include    <sys/stat.h>
+#include 	<sys/types.h>
+#include 	<sys/ioctl.h>
+#include 	<sys/socket.h>
+#include 	<sys/ipc.h>
+#include 	<sys/shm.h>
+#include 	<sys/shm.h>
+#include 	<sys/mman.h>
+#include 	<linux/wireless.h>
+#include 	<arpa/inet.h>
+#include 	<netinet/in.h>
+
+#include 	<unistd.h>
+#include 	<stdarg.h>
+#include    <stdio.h>
+#include    <stdlib.h>
+#include    <unistd.h>
+#include    <fcntl.h>
+#include    <termios.h>
+#include    <errno.h>
+#include 	<errno.h>
+#include 	<string.h>
+#include	<time.h>
+#include	<ctype.h>
+#include 	<ifaddrs.h>
+#include    <signal.h>
+#include	"define.h"
+#include 	"SystemLogMessage.h"
+
+#define	DEBUG_STANDALONG
+
+#define ARRAY_SIZE(A)				(sizeof(A) / sizeof(A[0]))
+#define PASS						1
+#define FAIL			   			-1
+#define ON							1
+#define OFF							0
+#define YES							1
+#define NO							0
+#define TRUE			    		1
+#define FALSE						0
+
+struct SysConfigAndInfo			*ShmSysConfigAndInfo;
+struct StatusCodeData 			*ShmStatusCodeData;
+
+#endif /* MODULE_DCMETER_H_ */

+ 66 - 0
EVSE/Modularization/DcMeter/SystemLogMessage.c

@@ -0,0 +1,66 @@
+#include 	<sys/time.h>
+#include 	<sys/timeb.h>
+#include    <sys/types.h>
+#include    <sys/stat.h>
+#include 	<sys/types.h>
+#include 	<sys/ioctl.h>
+#include 	<sys/socket.h>
+#include 	<sys/ipc.h>
+#include 	<sys/shm.h>
+#include 	<sys/shm.h>
+#include 	<sys/mman.h>
+#include 	<linux/wireless.h>
+#include 	<arpa/inet.h>
+#include 	<netinet/in.h>
+
+#include 	<unistd.h>
+#include 	<stdarg.h>
+#include    <stdio.h>
+#include    <stdlib.h>
+#include    <unistd.h>
+#include    <fcntl.h>
+#include    <termios.h>
+#include    <errno.h>
+#include 	<errno.h>
+#include 	<string.h>
+#include	<time.h>
+#include	<ctype.h>
+#include 	<ifaddrs.h>
+#include    <signal.h>
+#include 	"SystemLogMessage.h"
+
+/**
+ * Output debug info
+ * @param fmt
+ * @return
+ */
+int StoreLogMsg(const char *fmt, ...)
+{
+	char Buf[4096+256];
+	char buffer[4096];
+	time_t CurrentTime;
+	struct tm *tm;
+	va_list args;
+
+	va_start(args, fmt);
+	int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
+	va_end(args);
+
+	memset(Buf,0,sizeof(Buf));
+	CurrentTime = time(NULL);
+	tm=localtime(&CurrentTime);
+	sprintf(Buf,"echo -n \"[%04d.%02d.%02d %02d:%02d:%02d] - %s\" >> /Storage/SystemLog/[%04d.%02d]Module_DcMeterLog",
+			tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,
+			buffer,
+			tm->tm_year+1900,tm->tm_mon+1);
+
+	system(Buf);
+
+
+#ifdef ConsloePrintLog
+	printf("[%04d.%02d.%02d %02d:%02d:%02d] - %s", tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec, buffer);
+#endif
+
+	return rc;
+}
+

+ 10 - 0
EVSE/Modularization/DcMeter/SystemLogMessage.h

@@ -0,0 +1,10 @@
+#ifndef SystemLogMessage_H
+#define SystemLogMessage_H
+
+#define DEBUG_INFO(format, args...) StoreLogMsg("[%s:%d][%s][Info] "format, (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__), __LINE__, __FUNCTION__, ##args)
+#define DEBUG_WARN(format, args...) StoreLogMsg("[%s:%d][%s][Warn] "format, (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__), __LINE__, __FUNCTION__, ##args)
+#define DEBUG_ERROR(format, args...) StoreLogMsg("[%s:%d][%s][Error] "format, (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__), __LINE__, __FUNCTION__, ##args)
+
+extern int StoreLogMsg(const char *fmt, ...);
+
+#endif

+ 405 - 0
EVSE/Modularization/DcMeter/curlApi.c

@@ -0,0 +1,405 @@
+/*
+ * curlApi.c
+ *
+ *  Created on: 2021/6/1
+ *      Author: foluswen
+ */
+#include 	<sys/time.h>
+#include 	<sys/timeb.h>
+#include    <sys/types.h>
+#include    <sys/stat.h>
+#include 	<sys/types.h>
+#include 	<sys/ioctl.h>
+#include 	<sys/socket.h>
+#include 	<sys/ipc.h>
+#include 	<sys/shm.h>
+#include 	<sys/shm.h>
+#include 	<sys/mman.h>
+#include 	<linux/wireless.h>
+#include 	<arpa/inet.h>
+#include 	<netinet/in.h>
+
+#include 	<unistd.h>
+#include 	<stdarg.h>
+#include    <stdio.h>
+#include    <stdlib.h>
+#include    <unistd.h>
+#include    <fcntl.h>
+#include    <termios.h>
+#include    <errno.h>
+#include 	<errno.h>
+#include 	<string.h>
+#include	<time.h>
+#include	<ctype.h>
+#include 	<ifaddrs.h>
+#include    <signal.h>
+#include 	<curl/curl.h>
+#include 	<curl/easy.h>
+#include	"SystemLogMessage.h"
+#include	"curlApi.h"
+
+struct MemoryStruct
+{
+  uint8_t memory[4096];
+  size_t size;
+};
+
+struct MemoryStruct chunk;
+
+/**
+ * HTTP get/post data response callback
+ * @param contents
+ * @param size
+ * @param nmemb
+ * @param userp
+ */
+static size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)
+{
+	size_t realsize = size*nmemb;
+	struct MemoryStruct *mem = (struct MemoryStruct *)userp;
+
+	mem->size = realsize;;
+
+	memset(mem->memory, 0x00, ARRAY_SIZE(mem->memory));
+	chunk.size = realsize;
+	memcpy(mem->memory, contents, realsize);
+
+	return realsize;
+}
+
+/**
+ * HTTP get request/response
+ * @param url
+ * @param responseData
+ * @return
+ */
+int httpGet(uint8_t *url, uint8_t *responseData)
+{
+	int result = FAIL;
+	CURL *curl;
+	CURLcode res;
+
+	curl_global_init(CURL_GLOBAL_ALL);
+	curl = curl_easy_init();
+
+	if(curl)
+	{
+		 curl_easy_setopt(curl, CURLOPT_URL, (char*)url);
+		 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
+		 curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);
+		 //curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl-agent/1.0");
+		 //curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)strlen((char*)postData));
+		 curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);
+		 //curl_easy_setopt(curl, CURLOPT_HTTPAUTH, (long)CURLAUTH_ANY);
+		 //curl_easy_setopt(curl, CURLOPT_USERPWD, "user:password");
+
+		 res = curl_easy_perform(curl);
+
+		 if(res != CURLE_OK)
+		 {
+			 DEBUG_ERROR("curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
+		 }
+		 else
+		 {
+			 if(chunk.size > 0)
+			 {
+				 //DEBUG_INFO("Response content: %s\n", chunk.memory);
+				 memcpy(responseData, chunk.memory, ARRAY_SIZE(chunk.memory));
+			 }
+
+			 result = PASS;
+		 }
+		 curl_easy_cleanup(curl);
+	}
+	curl_global_cleanup();
+
+	return result;
+}
+
+/**
+ * HTTP post request/response
+ * @param url
+ * @param postData
+ * @return
+ */
+int httpPost(uint8_t *url, uint8_t *postData, uint8_t *responseData)
+{
+	int result = FAIL;
+	CURL *curl;
+	CURLcode res;
+
+	curl_global_init(CURL_GLOBAL_ALL);
+	curl = curl_easy_init();
+
+	if(curl)
+	{
+		 curl_easy_setopt(curl, CURLOPT_URL, (char*)url);
+		 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
+		 curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);
+		 //curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl-agent/1.0");
+		 curl_easy_setopt(curl, CURLOPT_POSTFIELDS, (char*)postData);
+		 //curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)strlen((char*)postData));
+		 curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);
+		 //curl_easy_setopt(curl, CURLOPT_HTTPAUTH, (long)CURLAUTH_ANY);
+		 //curl_easy_setopt(curl, CURLOPT_USERPWD, "user:password");
+
+		 res = curl_easy_perform(curl);
+
+		 if(res != CURLE_OK)
+		 {
+			 DEBUG_ERROR("curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
+		 }
+		 else
+		 {
+			 if(chunk.size > 0)
+			 {
+				 //DEBUG_INFO("Response content: %s\n", chunk.memory);
+				 memcpy(responseData, chunk.memory, ARRAY_SIZE(chunk.memory));
+			 }
+
+			 result = PASS;
+		 }
+		 curl_easy_cleanup(curl);
+	}
+	curl_global_cleanup();
+
+	return result;
+}
+
+/**
+ * HTTP put request
+ * @param url
+ * @param postData
+ * @return
+ */
+int httpPut(uint8_t *url, uint8_t *postData)
+{
+	int result = FAIL;
+	CURL *curl;
+	CURLcode res;
+
+	curl_global_init(CURL_GLOBAL_ALL);
+	curl = curl_easy_init();
+
+	if(curl)
+	{
+		struct curl_slist *headers = NULL;
+		headers = curl_slist_append(headers, "Content-Type: literature/classic");
+		curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
+		curl_easy_setopt(curl, CURLOPT_URL, (char*)url);
+		curl_easy_setopt(curl, CURLOPT_POSTFIELDS, (char*)postData);
+		curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT");
+		curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);
+		//curl_easy_setopt(curl, CURLOPT_HTTPAUTH, (long)CURLAUTH_ANY);
+		//curl_easy_setopt(curl, CURLOPT_USERPWD, "user:password");
+
+		res = curl_easy_perform(curl);
+
+		if(res != CURLE_OK)
+		{
+			 DEBUG_ERROR("curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
+		}
+		else
+		{
+			result = PASS;
+		}
+		curl_easy_cleanup(curl);
+		curl_slist_free_all(headers);
+	}
+	curl_global_cleanup();
+
+	return result;
+}
+
+/**
+ * HTTP download response callback
+ * @param ptr
+ * @param size
+ * @param nmemb
+ * @param stream
+ * @return
+ */
+static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
+{
+  size_t written = fwrite(ptr, size, nmemb, (FILE *)stream);
+
+  return written;
+}
+
+/**
+ * Curl download request
+ * @param url
+ * @return
+ */
+int curlDownload(uint8_t *url, uint8_t *filename)
+{
+	int result = FAIL;
+	CURL *curl;
+	CURLcode res;
+	FILE *downloadFile;
+
+	curl_global_init(CURL_GLOBAL_ALL);
+	curl = curl_easy_init();
+
+	if(curl)
+	{
+		curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 30L);
+		curl_easy_setopt(curl, CURLOPT_URL, (char*)url);
+		curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
+		curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);
+		//curl_easy_setopt(curl, CURLOPT_HTTPAUTH, (long)CURLAUTH_ANY);
+		//curl_easy_setopt(curl, CURLOPT_USERPWD, "user:password");
+
+		downloadFile = fopen((char*)filename, "wb");
+		if(downloadFile)
+		{
+			curl_easy_setopt(curl, CURLOPT_WRITEDATA, downloadFile);
+		    res = curl_easy_perform(curl);
+		    if(res != CURLE_OK)
+			{
+		    	DEBUG_ERROR("curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
+			}
+			else
+			{
+				//DEBUG_INFO("Download %s success.\n", url);
+				result = PASS;
+			}
+
+		    fclose(downloadFile);
+		}
+		curl_easy_cleanup(curl);
+	}
+	curl_global_cleanup();
+
+	return result;
+}
+
+/**
+ * HTTP upload request
+ * @param url
+ * @param filename
+ * @return
+ */
+int httpUpload(uint8_t *url, uint8_t *filename)
+{
+	int result = FAIL;
+	CURL *curl;
+	CURLcode res;
+	FILE *upFile;
+	struct stat file_info;
+	curl_off_t speed_upload, total_time;
+
+	if((upFile = fopen((char*)filename, "rb")))
+	{
+		if(fstat(fileno(upFile), &file_info) == 0)
+		{
+			curl = curl_easy_init();
+			if(curl)
+			{
+				curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 30L);
+				curl_easy_setopt(curl, CURLOPT_URL, (char*)url);
+				curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
+				curl_easy_setopt(curl, CURLOPT_READDATA, upFile);
+				curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, (curl_off_t)file_info.st_size);
+				curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+				//curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);
+				//curl_easy_setopt(curl, CURLOPT_HTTPAUTH, (long)CURLAUTH_ANY);
+				//curl_easy_setopt(curl, CURLOPT_USERPWD, "user:password");
+
+				res = curl_easy_perform(curl);
+				if(res != CURLE_OK)
+				{
+					DEBUG_ERROR("curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
+				}
+				else
+				{
+					curl_easy_getinfo(curl, CURLINFO_SPEED_UPLOAD, &speed_upload);
+					curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME, &total_time);
+					/*DEBUG_INFO("Upload %s to %s success.\n", filename, url);
+					DEBUG_INFO("Speed: %" CURL_FORMAT_CURL_OFF_T " bytes/sec during %"
+					           CURL_FORMAT_CURL_OFF_T ".%06ld seconds\n",
+					           speed_upload,
+					           (total_time / 1000000), (long)(total_time % 1000000));*/
+
+					result = PASS;
+				}
+
+				fclose(upFile);
+
+				curl_easy_cleanup(curl);
+			}
+		}
+	}
+
+	return result;
+}
+
+/**
+ * File read callback
+ * @param ptr
+ * @param size
+ * @param nmemb
+ * @param stream
+ * @return
+ */
+static size_t read_callback(char *ptr, size_t size, size_t nmemb, void *stream)
+{
+  curl_off_t nread;
+  size_t retcode = fread(ptr, size, nmemb, stream);
+  nread = (curl_off_t)retcode;
+
+  DEBUG_INFO("Read %" CURL_FORMAT_CURL_OFF_T " bytes from file\n", nread);
+
+  return retcode;
+}
+/**
+ * FTP upload request
+ * @param url
+ * @param filename
+ * @return
+ */
+int ftpUpload(uint8_t *url, uint8_t *filename)
+{
+	int result = FAIL;
+	CURL *curl;
+	CURLcode res;
+	FILE *upFile;
+	struct stat file_info;
+	curl_off_t fsize;
+
+	curl_global_init(CURL_GLOBAL_ALL);
+	if(!stat((char*)filename, &file_info))
+	{
+		fsize = (curl_off_t)file_info.st_size;
+		DEBUG_INFO("%s size: %" CURL_FORMAT_CURL_OFF_T " bytes.\n", filename, fsize);
+
+		if((upFile = fopen((char*)filename, "rb")))
+		{
+			curl = curl_easy_init();
+			if(curl)
+			{
+				curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 30L);
+				curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
+				curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
+				curl_easy_setopt(curl, CURLOPT_URL, url);
+				curl_easy_setopt(curl, CURLOPT_READDATA, upFile);
+				curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, (curl_off_t)fsize);
+				res = curl_easy_perform(curl);
+				if(res != CURLE_OK)
+				{
+					DEBUG_ERROR("curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
+
+				}
+				else
+				{
+					//DEBUG_INFO("Upload %s success.\n", url);
+				}
+				curl_easy_cleanup(curl);
+			}
+			fclose(upFile);
+		}
+	}
+	curl_global_cleanup();
+
+	return result;
+}

+ 28 - 0
EVSE/Modularization/DcMeter/curlApi.h

@@ -0,0 +1,28 @@
+/*
+ * curlApi.h
+ *
+ *  Created on: 2021/6/1
+ *      Author: foluswen
+ */
+
+#ifndef CURLAPI_H_
+#define CURLAPI_H_
+
+#define ARRAY_SIZE(A)				(sizeof(A) / sizeof(A[0]))
+#define PASS						1
+#define FAIL			   			-1
+#define ON							1
+#define OFF							0
+#define YES							1
+#define NO							0
+#define TRUE			    		1
+#define FALSE						0
+
+extern int httpGet(uint8_t *url, uint8_t *responseData);
+extern int httpPost(uint8_t *url, uint8_t *postData, uint8_t *responseData);
+extern int httpPut(uint8_t *url, uint8_t *postData);
+extern int curlDownload(uint8_t *url, uint8_t *filename);
+extern int httpUpload(uint8_t *url, uint8_t *filename);
+extern int ftpUpload(uint8_t *url, uint8_t *filename);
+
+#endif /* CURLAPI_H_ */

+ 222 - 0
EVSE/Modularization/DcMeter/meterComm.c

@@ -0,0 +1,222 @@
+/*
+ * MeterDriver.c
+ *
+ *  Created on: 2021/6/4
+ *      Author: foluswen
+ */
+#include 	"meterComm.h"
+#include 	"curlApi.h"
+#include 	"SystemLogMessage.h"
+#include	"json-c/json.h"
+
+#define is_error(ptr) 			((unsigned long)ptr > (unsigned long)-4000L)
+
+unsigned char 	meterModel = 0;
+char			meterApiAddress[128];
+
+
+/**
+ * Meter driver initialize
+ * @param model
+ */
+void meterInitialize(uint8_t model)
+{
+	meterModel = model;
+
+	switch(meterModel)
+	{
+		case METER_MODEL_LEM_L18005A:
+		default:
+			/*
+			 * TODO:
+			 * 	1. Check meter actual API address.
+			 */
+			//sprintf(meterApiAddress, "http://192.168.1.2/livemeasure");
+			sprintf(meterApiAddress, "https://foluswen.com/tmate/livemeasure.php"); // Simulator by web server
+
+			break;
+	}
+}
+
+/**
+ * Output voltage read
+ * @param meter_info
+ * @return
+ */
+int readVoltage(Meter_Info *meter_info)
+{
+	int result = FAIL;
+	uint8_t	data[4096];
+
+	switch(meterModel)
+	{
+
+		case METER_MODEL_LEM_L18005A:
+		default:
+			if(httpGet((uint8_t*)meterApiAddress, data))
+			{
+				json_object *livemeasure;
+				livemeasure = json_tokener_parse((char*)data);
+				if(!is_error(livemeasure))
+				{
+					if(json_object_object_get(livemeasure, "voltage") != NULL)
+						meter_info->presetVoltage = json_object_get_double(json_object_object_get(livemeasure, "voltage"));
+
+					if(json_object_object_get(livemeasure, "current") != NULL)
+						meter_info->presentCurrent = json_object_get_double(json_object_object_get(livemeasure, "current"));
+
+					if(json_object_object_get(livemeasure, "power") != NULL)
+						meter_info->presentPower = json_object_get_double(json_object_object_get(livemeasure, "power"));
+
+					if(json_object_object_get(livemeasure, "energyImportTotal") != NULL)
+						meter_info->totlizeImportEnergy = json_object_get_double(json_object_object_get(livemeasure, "energyImportTotal"));
+
+					if(json_object_object_get(livemeasure, "energyExportTotal") != NULL)
+						meter_info->totlizeExportEnergy = json_object_get_double(json_object_object_get(livemeasure, "energyExportTotal"));
+
+					result = PASS;
+				}
+				json_object_put(livemeasure);
+			}
+
+			break;
+	}
+
+	return result;
+}
+
+/**
+ * Output current read
+ * @param meter_info
+ * @return
+ */
+int readCurrent(Meter_Info *meter_info)
+{
+	int result = FAIL;
+	uint8_t	data[4096];
+
+	switch(meterModel)
+	{
+		case METER_MODEL_LEM_L18005A:
+		default:
+			if(httpGet((uint8_t*)meterApiAddress, data))
+			{
+				json_object *livemeasure;
+				livemeasure = json_tokener_parse((char*)data);
+				if(!is_error(livemeasure))
+				{
+					if(json_object_object_get(livemeasure, "voltage") != NULL)
+						meter_info->presetVoltage = json_object_get_double(json_object_object_get(livemeasure, "voltage"));
+
+					if(json_object_object_get(livemeasure, "current") != NULL)
+						meter_info->presentCurrent = json_object_get_double(json_object_object_get(livemeasure, "current"));
+
+					if(json_object_object_get(livemeasure, "power") != NULL)
+						meter_info->presentPower = json_object_get_double(json_object_object_get(livemeasure, "power"));
+
+					if(json_object_object_get(livemeasure, "energyImportTotal") != NULL)
+						meter_info->totlizeImportEnergy = json_object_get_double(json_object_object_get(livemeasure, "energyImportTotal"));
+
+					if(json_object_object_get(livemeasure, "energyExportTotal") != NULL)
+						meter_info->totlizeExportEnergy = json_object_get_double(json_object_object_get(livemeasure, "energyExportTotal"));
+
+					result = PASS;
+				}
+				json_object_put(livemeasure);
+			}
+			break;
+	}
+
+	return result;
+}
+
+/**
+ * Output power read
+ * @param meter_info
+ * @return
+ */
+int readPower(Meter_Info *meter_info)
+{
+	int result = FAIL;
+	uint8_t	data[4096];
+
+	switch(meterModel)
+	{
+		case METER_MODEL_LEM_L18005A:
+		default:
+			if(httpGet((uint8_t*)meterApiAddress, data))
+			{
+				json_object *livemeasure;
+				livemeasure = json_tokener_parse((char*)data);
+				if(!is_error(livemeasure))
+				{
+					if(json_object_object_get(livemeasure, "voltage") != NULL)
+						meter_info->presetVoltage = json_object_get_double(json_object_object_get(livemeasure, "voltage"));
+
+					if(json_object_object_get(livemeasure, "current") != NULL)
+						meter_info->presentCurrent = json_object_get_double(json_object_object_get(livemeasure, "current"));
+
+					if(json_object_object_get(livemeasure, "power") != NULL)
+						meter_info->presentPower = json_object_get_double(json_object_object_get(livemeasure, "power"));
+
+					if(json_object_object_get(livemeasure, "energyImportTotal") != NULL)
+						meter_info->totlizeImportEnergy = json_object_get_double(json_object_object_get(livemeasure, "energyImportTotal"));
+
+					if(json_object_object_get(livemeasure, "energyExportTotal") != NULL)
+						meter_info->totlizeExportEnergy = json_object_get_double(json_object_object_get(livemeasure, "energyExportTotal"));
+
+					result = PASS;
+				}
+				json_object_put(livemeasure);
+			}
+			break;
+	}
+
+	return result;
+}
+
+/**
+ * Export & import totalize energy read
+ * @param meter_info
+ * @return
+ */
+int readEnergy(Meter_Info *meter_info)
+{
+	int result = FAIL;
+	uint8_t	data[4096];
+
+	switch(meterModel)
+	{
+		case METER_MODEL_LEM_L18005A:
+		default:
+			if(httpGet((uint8_t*)meterApiAddress, data))
+			{
+				json_object *livemeasure;
+				livemeasure = json_tokener_parse((char*)data);
+				if(!is_error(livemeasure))
+				{
+					if(json_object_object_get(livemeasure, "voltage") != NULL)
+						meter_info->presetVoltage = json_object_get_double(json_object_object_get(livemeasure, "voltage"));
+
+					if(json_object_object_get(livemeasure, "current") != NULL)
+						meter_info->presentCurrent = json_object_get_double(json_object_object_get(livemeasure, "current"));
+
+					if(json_object_object_get(livemeasure, "power") != NULL)
+						meter_info->presentPower = json_object_get_double(json_object_object_get(livemeasure, "power"));
+
+					if(json_object_object_get(livemeasure, "energyImportTotal") != NULL)
+						meter_info->totlizeImportEnergy = json_object_get_double(json_object_object_get(livemeasure, "energyImportTotal"));
+
+					if(json_object_object_get(livemeasure, "energyExportTotal") != NULL)
+						meter_info->totlizeExportEnergy = json_object_get_double(json_object_object_get(livemeasure, "energyExportTotal"));
+
+					result = PASS;
+				}
+				json_object_put(livemeasure);
+			}
+			break;
+	}
+
+	return result;
+}
+

+ 63 - 0
EVSE/Modularization/DcMeter/meterComm.h

@@ -0,0 +1,63 @@
+/*
+ * meterComm.h
+ *
+ *  Created on: 2021/6/4
+ *      Author: foluswen
+ */
+
+#ifndef HEADER_METERCOMM_H_
+#define HEADER_METERCOMM_H_
+#include 	<sys/time.h>
+#include 	<sys/timeb.h>
+#include    <sys/types.h>
+#include    <sys/stat.h>
+#include 	<sys/types.h>
+#include 	<sys/ioctl.h>
+#include 	<sys/socket.h>
+#include 	<sys/ipc.h>
+#include 	<sys/shm.h>
+#include 	<sys/shm.h>
+#include 	<sys/mman.h>
+#include 	<linux/wireless.h>
+#include 	<arpa/inet.h>
+#include 	<netinet/in.h>
+
+#include 	<unistd.h>
+#include 	<stdarg.h>
+#include    <stdio.h>
+#include    <stdlib.h>
+#include    <unistd.h>
+#include    <fcntl.h>
+#include    <termios.h>
+#include    <errno.h>
+#include 	<errno.h>
+#include 	<string.h>
+#include	<time.h>
+#include	<ctype.h>
+#include 	<ifaddrs.h>
+#include    <signal.h>
+
+typedef struct METER_INFO
+{
+	double presetVoltage;		// resolution: 1v
+	double presentCurrent;		// resolution: 1a
+	double presentPower;		// resolution: 1kw
+	double totlizeImportEnergy;	// resolution: 1kwh
+	double totlizeExportEnergy;	// resolution: 1kwh
+}Meter_Info;
+
+enum METER_MODEL
+{
+	METER_MODEL_LEM_L18005A=0,
+};
+
+extern void meterInitialize(uint8_t model);
+extern int readVoltage(Meter_Info *meter_info);
+extern int readCurrent(Meter_Info *meter_info);
+extern int readPower(Meter_Info *meter_info);
+extern int readEnergy(Meter_Info *meter_info);
+
+extern unsigned char 	meterModel;
+extern char				meterApiAddress[];
+
+#endif /* HEADER_METERCOMM_H_ */

+ 9 - 3
EVSE/Modularization/Makefile

@@ -7,9 +7,8 @@ Lib_SQLite3 = "-L../../../Modularization/ocppfiles" -lsqlite3
 all: clean Module_RFIDLib Module_Wifi WebServiceLib Ocpp16 \
      Phihong_PsuCommObj Module_4g Module_UpgradeLib Infypwr_PsuCommObj \
      Module_EventLogging Module_ProduceUtils Module_PhBackend \
-     Ocpp20 Module_InitUpgrade Module_RatedCurrentLib Module_Payment
-
-
+     Ocpp20 Module_InitUpgrade Module_RatedCurrentLib Module_Payment \
+     Module_DcMeter
 
 clean:
 	rm -f libModule_RFID.a
@@ -24,6 +23,7 @@ clean:
 	rm -f Module_ProduceUtils
 	rm -f Module_PhBackend
 	rm -f OcppBackend20
+	rm -f Module_DcMeter
 
 Module_ProduceUtils:
 	rm -f Module_ProduceUtils
@@ -126,3 +126,9 @@ Module_Payment:
 	$(CC) -o Module_Payment Module_Payment.o
 	rm -f Module_Payment.o
 	mv -f Module_Payment ../rootfs/root
+
+Module_DcMeter:
+	rm -f Module_DcMeter;
+	$(CC) -D $(Project) "-Wl,-rpath-link,../rootfs/lib" ./DcMeter/Module_DcMeter.c ./DcMeter/meterComm.c ./DcMeter/curlApi.c ./DcMeter/SystemLogMessage.c -I ../Projects -I ../GPL/curl-7.37.1/release/include -I ../GPL/json-c-json-c-0.13.1-20180305/release/include -L ../GPL/json-c-json-c-0.13.1-20180305/release/lib -L ../GPL/curl-7.37.1/release/lib -ljson-c -lcurl -lssl -o Module_DcMeter
+	mv -f Module_DcMeter ../rootfs/root/
+

BIN
EVSE/rootfs/lib/ld-2.19.so


BIN
EVSE/rootfs/lib/libBrokenLocale-2.19.so


BIN
EVSE/rootfs/lib/libanl-2.19.so


BIN
EVSE/rootfs/lib/libc-2.19.so


BIN
EVSE/rootfs/lib/libcrypt-2.19.so


BIN
EVSE/rootfs/lib/libdl-2.19.so


BIN
EVSE/rootfs/lib/libm-2.19.so


BIN
EVSE/rootfs/lib/libnsl-2.19.so


BIN
EVSE/rootfs/lib/libnss_compat-2.19.so


BIN
EVSE/rootfs/lib/libnss_dns-2.19.so


BIN
EVSE/rootfs/lib/libnss_files-2.19.so


BIN
EVSE/rootfs/lib/libpthread-2.19.so


BIN
EVSE/rootfs/lib/libresolv-2.19.so


BIN
EVSE/rootfs/lib/librt-2.19.so


BIN
EVSE/rootfs/lib/libutil-2.19.so


+ 1 - 0
EVSE/rootfs/root/.gitignore

@@ -9,3 +9,4 @@ Module_EventLogging
 Module_PhBackend
 Module_InitUpgrade
 Module_Payment
+Module_DcMeter

BIN
EVSE/rootfs/root/Module_Payment


BIN
EVSE/rootfs/root/OcppBackend20


Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно