Browse Source

[Add][AX80][main]

2022.04.29 / Folus Wen

Actions:
1. Charger try to get EVCCID and get its authorization result by OCPP.

Files:
1. As follow commit history

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

Hardware PWB P/N : XXXXXXX
Hardware Version : XXXXXXX
FolusWen 2 năm trước cách đây
mục cha
commit
5258afaab2

+ 34 - 6
EVSE/Modularization/Makefile

@@ -4,11 +4,12 @@ export PATH=/bin:/sbin:/usr/bin:$(SDK_PATH_TARGET)/usr/bin:$PATH
 #define library variable
 Lib_SQLite3 = "-L../../../Modularization/ocppfiles" -lsqlite3
 Lib_RatedCurrentLib = "-L./" -lm -lModule_RatedCurrent
+Lib_Xml = "-L../GPL/libxml2-2.7.6/release/lib" -lxml2
 
-all: clean Module_RFIDLib Module_SystexLib Module_RatedCurrentLib Module_UpgradeLib Module_Wifi \
-     WebServiceLib Ocpp16 Phihong_PsuCommObj Module_4g Infypwr_PsuCommObj \
-     Module_EventLogging Module_ProduceUtils \
-     Ocpp20 Module_Payment Module_DcMeter Ocppph Module_PowerSharing_Task
+all: clean Module_RFIDLib Module_SystexLib Infypwr_PsuCommObj Phihong_PsuCommObj Module_RatedCurrentLib Module_UpgradeLib \
+     Module_Wifi Module_4g WebServiceLib Module_EventLogging Module_ProduceUtils Module_DcMeter Module_PowerSharing_Task \
+     Ocpp16 Ocpp20 Ocppph \
+     Module_Payment Module_Payment_Bazel8
 
 clean:
 	rm -f libModule_RFID.a
@@ -28,6 +29,7 @@ clean:
 	rm -f Module_PowerSharing
 
 Module_ProduceUtils:
+	@echo "===== Module_ProduceUtils =========================================="
 	rm -f Module_ProduceUtils
 	$(CC) -D $(Project) -O0  -Wall -c -fmessage-length=0 -I ../Projects -o Module_ProduceUtils.o Module_ProduceUtils.c
 	$(CC) -o Module_ProduceUtils Module_ProduceUtils.o
@@ -35,24 +37,28 @@ Module_ProduceUtils:
 	mv -f Module_ProduceUtils ../rootfs/root
 
 Module_RatedCurrentLib:
+	@echo "===== Module_RatedCurrentLib ======================================="
 	rm -f libModule_RatedCurrent.a
 	$(CC) -D $(Project) -O0  -Wall -c -fmessage-length=0 -o Module_RatedCurrent.o Module_RatedCurrent.c
 	$(AR) -r libModule_RatedCurrent.a Module_RatedCurrent.o
 	rm -f Module_RatedCurrent.o
 
 Module_RFIDLib:
+	@echo "===== Module_RFIDLib ==============================================="
 	rm -f libModule_RFID.a
 	$(CC) -D $(Project) -O0  -Wall -c -fmessage-length=0 -o Module_RFID.o Module_RFID.c
 	$(AR) -r libModule_RFID.a Module_RFID.o
 	rm -f Module_RFID.o
 
 Module_SystexLib:
+	@echo "===== Module_SystexLib ============================================="
 	rm -f libModule_Systex.a
 	$(CC) -D $(Project) -O0  -Wall -c -fmessage-length=0 -o Module_Systex.o Module_Systex.c
 	$(AR) -r libModule_Systex.a Module_Systex.o
 	rm -f Module_Systex.o
 
 Module_Wifi:
+	@echo "===== Module_Wifi =================================================="
 	rm -f Module_Wifi
 	$(CC) -D $(Project) -I ../Projects -I .//ocppfiles -I ../GPL/json-c-json-c-0.13.1-20180305/release/include -O0  -Wall -c -fmessage-length=0 -o Module_Wifi.o Module_Wifi.c
 	$(CC) -o Module_Wifi Module_Wifi.o ${Lib_SQLite3} -L ../GPL/json-c-json-c-0.13.1-20180305/release/lib -ljson-c
@@ -60,6 +66,7 @@ Module_Wifi:
 	mv -f Module_Wifi ../rootfs/root
 
 Module_4g:
+	@echo "===== Module_4g ==================================================="
 	rm -f Module_4g
 	$(CC) -D $(Project) -I ../Projects -O0  -Wall -c -fmessage-length=0 -o Module_4g.o Module_4g.c
 	$(CC) -o Module_4g Module_4g.o
@@ -67,6 +74,7 @@ Module_4g:
 	mv -f Module_4g ../rootfs/root
 
 WebServiceLib:
+	@echo "===== WebServiceLib =============================================="
 	rm -f WebService
 	$(CC) -D $(Project) -I ../GPL/json-c-json-c-0.13.1-20180305/release/include/json-c -I ../Projects -O0  -Wall -c -fmessage-length=0 -o WebService.o -ljson-c -lm -w WebService.c
 	$(CC) -L ../GPL/json-c-json-c-0.13.1-20180305/release/lib -o WebService WebService.o -ljson-c -lm
@@ -78,41 +86,46 @@ WebServiceLib:
 	mv -f logPackTools ../rootfs/root/
 
 Ocppph:
+	@echo "===== Ocppph ====================================================="
 	rm -f OcppBackendPH;
 	$(CC) -D $(TLS_EXPIRED) -D $(Project) -D__USE_XOPEN -D_GNU_SOURCE ./ocppph/Module_OcppBackend.c ./ocppph/MessageHandler.c ./ocppph/JsonParser.c ./ocppph/SystemLogMessage.c ./ocppph/hashmap.c ./ocppph/common.c -I ../Projects -I ../GPL/libwebsockets-2.2.2-stable/release/include -I ../GPL/json-c-json-c-0.13.1-20180305/release/include -include ./Module_RatedCurrent.h  -L ../GPL/libwebsockets-2.2.2-stable/release/lib -L ../GPL/openssl-1.0.2g/release/lib -L ../GPL/json-c-json-c-0.13.1-20180305/release/lib -L ./ -lwebsockets -lrt -luuid -lpthread -lc -lsqlite3 -ljson-c ${Lib_RatedCurrentLib} -o OcppBackendPH
 	mv -f OcppBackendPH ../rootfs/root/
 
 Ocpp16:
+	@echo "===== Ocpp16 ====================================================="
 	rm -f OcppBackend;
 	$(CC) -D $(TLS_EXPIRED) -D $(Project) -D__USE_XOPEN -D_GNU_SOURCE ./ocppfiles/Module_OcppBackend.c ./ocppfiles/MessageHandler.c ./ocppfiles/JsonParser.c ./ocppfiles/SystemLogMessage.c ./ocppfiles/hashmap.c ./ocppfiles/common.c -I ../Projects -I ../GPL/libwebsockets-2.2.2-stable/release/include -I ../GPL/json-c-json-c-0.13.1-20180305/release/include -include ./Module_RatedCurrent.h -L ../GPL/libwebsockets-2.2.2-stable/release/lib -L ../GPL/openssl-1.0.2g/release/lib -L ../GPL/json-c-json-c-0.13.1-20180305/release/lib -L ./ -lwebsockets -lrt -luuid -lpthread -lc -lsqlite3 -ljson-c ${Lib_RatedCurrentLib} -o OcppBackend
 	mv -f OcppBackend ../rootfs/root/
 
 Ocpp20:
+	@echo "===== Ocpp20 ====================================================="
 	rm -f OcppBackend20;
 	$(CC) -D $(TLS_EXPIRED) -D $(Project) -D__USE_XOPEN -D_GNU_SOURCE ./ocpp20/Module_OcppBackend20.c ./ocpp20/MessageHandler.c ./ocpp20/JsonParser.c ./ocpp20/SystemLogMessage.c ./ocpp20/hashmap.c ./ocpp20/common.c -I ../Projects -I ../GPL/libwebsockets-2.2.2-stable/release/include -I ../GPL/json-c-json-c-0.13.1-20180305/release/include -include ./Module_RatedCurrent.h  -L ../GPL/libwebsockets-2.2.2-stable/release/lib -L ../GPL/openssl-1.0.2g/release/lib -L ../GPL/json-c-json-c-0.13.1-20180305/release/lib -L ./ -lwebsockets -lrt -luuid -lpthread -lc -lsqlite3 -ljson-c ${Lib_RatedCurrentLib} -o OcppBackend20
 	mv -f OcppBackend20 ../rootfs/root/
 
-
-
 Phihong_PsuCommObj:
+	@echo "===== Module_PsuCommObj =========================================="
 	rm -f libPhihong_PsuCommObj.a
 	$(CC) -D $(Project) -O0  -Wall -c -fmessage-length=0 -o Phihong_PsuCommObj.o Phihong_PsuCommObj.c
 	$(AR) -r libPhihong_PsuCommObj.a Phihong_PsuCommObj.o
 	rm -f Phihong_PsuCommObj.o
 
 Infypwr_PsuCommObj:
+	@echo "===== Infypwr_PsuCommObj =========================================="
 	rm -f libInfypwr_PsuCommObj.a
 	$(CC) -D $(Project) -O0  -Wall -c -fmessage-length=0 -o Infypwr_PsuCommObj.o Infypwr_PsuCommObj.c
 	$(AR) -r libInfypwr_PsuCommObj.a Infypwr_PsuCommObj.o
 	rm -f Infypwr_PsuCommObj.o
 
 Module_UpgradeLib:
+	@echo "===== Module_UpgradeLib =========================================="
 	rm -f libModule_Upgrade.a
 	$(CC) -D $(Project) -O0  -Wall -c -fmessage-length=0 -o Module_Upgrade.o Module_Upgrade.c
 	$(AR) -r libModule_Upgrade.a Module_Upgrade.o
 	rm -f Module_Upgrade.o
 
 Module_EventLogging:
+	@echo "===== Module_EventLogging ========================================"
 	rm -f Module_EventLogging
 	$(CC) -D $(Project) -I ../Projects -I ./ocppfiles -O0  -Wall -c -fmessage-length=0 -o Module_EventLogging.o Module_EventLogging.c
 	$(CC) -L ./ocppfiles -lsqlite3 -o Module_EventLogging Module_EventLogging.o
@@ -120,6 +133,7 @@ Module_EventLogging:
 	mv -f Module_EventLogging ../rootfs/root
 
 Module_PhBackend:
+	@echo "===== Module_PhBackend ==========================================="
 	rm -f Module_Phbackend
 	$(CC) -D $(Project) -I ../Projects -O0  -Wall -c -fmessage-length=0 -o Module_PhBackend.o Module_PhBackend.c
 	$(CC) -o Module_PhBackend Module_PhBackend.o ${Lib_RatedCurrentLib}
@@ -127,6 +141,7 @@ Module_PhBackend:
 	mv -f Module_PhBackend ../rootfs/root
 
 Module_InitUpgrade:
+	@echo "===== Module_InitUpgrade ========================================="
 	rm -f Module_InitUpgrade
 	$(CC) -D $(Project) -I ../Projects -O0  -Wall -c -fmessage-length=0 -o Module_InitUpgrade.o Module_InitUpgrade.c
 	$(CC) -o Module_InitUpgrade Module_InitUpgrade.o
@@ -134,18 +149,29 @@ Module_InitUpgrade:
 	mv -f Module_InitUpgrade ../rootfs/root
 
 Module_Payment:
+	@echo "===== Module_Payment ============================================="
 	rm -f Module_Payment
 	$(CC) -D $(Project) -I ../Projects -O0  -Wall -c -fmessage-length=0 -o Module_Payment.o Module_Payment.c
 	$(CC) -o Module_Payment Module_Payment.o
 	rm -f Module_Payment.o
 	mv -f Module_Payment ../rootfs/root
 
+Module_Payment_Bazel8:
+	@echo "===== Module_Payment_Bazel8 ======================================"
+	rm -f Module_Payment_Bazel8
+	$(CC) -D $(Project) -I ../Projects -I ../GPL/libxml2-2.7.6/release/include/libxml2 -O0  -Wall -c -fmessage-length=0 -o Module_Payment_Bazel8.o Module_Payment_Bazel8.c
+	$(CC) -o Module_Payment_Bazel8 Module_Payment_Bazel8.o -lrt ${Lib_Xml}
+	rm -f Module_Payment_Bazel8.o
+	mv -f Module_Payment_Bazel8 ../rootfs/root
+
 Module_DcMeter:
+	@echo "===== 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 ./ -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 ${Lib_RatedCurrentLib}
 	mv -f Module_DcMeter ../rootfs/root/
 
 Module_PCBTest:
+	@echo "===== Module_PCBTest ============================================="
 	rm -f Module_PCBTest
 	$(CC) -o Module_PCBTest ./PCBTest/Module_PCBTest.c ./PCBTest/Comm_Test.c ./PCBTest/Ethernet_Test.c ./PCBTest/IO_Test.c ./PCBTest/PrimaryMCU_Test.c ./PCBTest/Storage_Test.c -I ./
 	mv -f Module_PCBTest ../rootfs/root
@@ -156,3 +182,5 @@ Module_PowerSharing_Task:
 	$(CC) -D $(Project) "-I../Projects" "-I./ocppfiles" "-include./Module_RatedCurrent.h" -O0  -Wall -fmessage-length=0 Module_PowerSharing.c ${Lib_RatedCurrentLib} -lm -lrt -o Module_PowerSharing
 	rm -f *.o
 	mv -f Module_PowerSharing ../rootfs/root
+
+

+ 620 - 0
EVSE/Modularization/Module_Payment_Bazel8.c

@@ -0,0 +1,620 @@
+/*
+ * Module_Payment_Ominixpay.c
+ *
+ *  Created on: 2022/04/29
+ *      Author: Folus Wen
+ */
+
+#include "Module_Payment_Bazel8.h"
+
+struct COMMAND commandRaw;
+struct timespec	tmr[TIMER_CNT];
+
+//==========================================
+// Common routine
+//==========================================
+int StoreLogMsg(const char *fmt, ...)
+{
+	char Buf[65536+256];
+	char buffer[65536];
+	//char Buf[4096+256];
+	//char buffer[4096];
+	time_t CurrentTime;
+	struct tm *tm;
+	struct timeval tv;
+	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);
+	gettimeofday(&tv, NULL); // get microseconds, 10^-6
+
+	sprintf(Buf,"echo -n \"[%04d.%02d.%02d %02d:%02d:%02d.%06ld]%s\" >>  /Storage/SystemLog/[%04d.%02d]PaymentLog",
+			tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,tv.tv_usec,
+			buffer,
+			tm->tm_year+1900,tm->tm_mon+1);
+	system((const char*)Buf);
+
+#ifdef ConsloePrintLog
+	printf("[%04d.%02d.%02d %02d:%02d:%02d.%06ld]%s", tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,tv.tv_usec, buffer);
+#endif
+
+	return rc;
+}
+/**
+ * Execute shell command
+ * @param cmd: shell command string
+ * @return shell command execution result
+ */
+int runShellCmd(const char*cmd)
+{
+	int result = FAIL;
+	char buf[256];
+	FILE *fp;
+
+	fp = popen(cmd, "r");
+	if(fp != NULL)
+	{
+		while(fgets(buf, sizeof(buf), fp) != NULL)
+		{
+			DEBUG_INFO("%s\n", buf);
+		}
+
+		result = PASS;
+	}
+	pclose(fp);
+
+	return result;
+}
+
+/**
+ *
+ * @param timer
+ */
+void refreshStartTimer(struct timespec *timer)
+{
+	clock_gettime(CLOCK_MONOTONIC, timer);
+}
+
+/**
+ *
+ * @param timer
+ * @return
+ */
+int getDiffSecNow(struct timespec timer)
+{
+	struct timespec timerNow;
+
+	clock_gettime(CLOCK_MONOTONIC, &timerNow);
+
+	return (int)((((unsigned long)(timerNow.tv_sec - timer.tv_sec) * 1000) + ((unsigned long)((timerNow.tv_nsec / 1000000) - (timer.tv_nsec / 1000000))))/1000);
+}
+
+/**
+ *
+ * @param ST
+ */
+long long DiffTimebWithNow(struct timeb ST)
+{
+	//return milli-second
+	struct timeb ET;
+	long long StartTime,StopTime;
+
+	ftime(&ET);
+	StartTime=(long long)ST.time;
+	StopTime=(long long)ET.time;
+	return ((StopTime-StartTime)*1000) + (ET.millitm-ST.millitm);
+}
+
+/**
+ *
+ * @return
+ */
+int getTimePassSinceToday()
+{
+	int result = -1;
+	static time_t lastTime;
+	time_t t;
+	struct tm *tmStartToday;
+	struct timeb tbStartToday;
+
+	t=time(NULL);
+	if(difftime(t, lastTime)>0)
+	{
+		tmStartToday=localtime(&t);
+
+		tmStartToday->tm_hour = 0;
+		tmStartToday->tm_min = 0;
+		tmStartToday->tm_sec = 0;
+
+		tbStartToday.time = mktime(tmStartToday);
+		tbStartToday.millitm = 0;
+		result = DiffTimebWithNow(tbStartToday)/1000;
+		lastTime = t;
+	}
+
+	return result;
+}
+/**
+ * Calculate time differential
+ * @param ST: start time
+ * @param ET: end time
+ * @return time differential in million seconds
+ */
+int DiffTimeb(struct timeb ST, struct timeb ET)
+{
+	//return milli-second
+	unsigned int StartTime,StopTime;
+
+	StartTime=(unsigned int)ST.time;
+	StopTime=(unsigned int)ET.time;
+	return (StopTime-StartTime)*1000+ET.millitm-ST.millitm;
+}
+
+/**
+ * Show communication raw data to debug info
+ * @param data: raw data
+ * @param len: data length
+ * @param isRX: is receive data
+ */
+void show_raw(uint8_t *data, uint16_t len, uint8_t isRX)
+{
+	uint8_t output[512]={0};
+
+	if(isRX)
+		DEBUG_INFO("RX ---------------------------------------------\n");
+	else
+		DEBUG_INFO("TX ---------------------------------------------\n");
+
+	DEBUG_INFO(" 0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F \n");
+	DEBUG_INFO("------------------------------------------------\n");
+
+	memset(output, 0x00, ARRAY_SIZE(output));
+	for(int idx=0;idx<len;idx++)
+	{
+		if(strlen((char*)output)<48)
+			sprintf((char*)output, "%s%02X ", output, data[idx]);
+		else
+		{
+			DEBUG_INFO("%s\n", output);
+			memset(output, 0x00, ARRAY_SIZE(output));
+			sprintf((char*)output, "%s%02X ", output, data[idx]);
+		}
+	}
+	DEBUG_INFO("%s\n", output);
+}
+
+/**
+ *
+ * @param dec: number in dec
+ * @return number in bcd
+ */
+int decTobcd(int dec)
+{
+	return (dec/10 * 16)+ (dec%10);
+}
+
+/**
+ *
+ * @param data: message array
+ * @param dataLen: command & data field length in array
+ * @return check sum result
+ */
+int calChksum(unsigned char *data)
+{
+	int result = 0;
+
+	for(uint16_t idx=0;idx<(((data[1] << 8) | (data[1]))+3);idx++)
+	{
+		result ^= data[idx];
+	}
+
+	return (result&0xff);
+}
+
+//==========================================
+// Init share memory
+//==========================================
+/**
+ * Share memory initialization
+ * @return function result
+ */
+int InitShareMemory()
+{
+	int result = PASS;
+	int MeterSMId;
+
+#ifndef X86
+	//init 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
+    {}
+
+	//init 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
+	{}
+
+   	//init ShmOCPP16Data
+   	if ((MeterSMId = shmget(ShmOcppModuleKey, sizeof(struct OCPP16Data),  0777)) < 0)
+	{
+		DEBUG_ERROR("shmget ShmOCPP16Data NG\n");
+		result = FAIL;
+	}
+	else if ((ShmOCPP16Data = shmat(MeterSMId, NULL, 0)) == (void *) -1)
+	{
+		DEBUG_ERROR("shmat ShmOCPP16Data NG\n");
+		result = FAIL;
+	}
+	else
+	{}
+#endif
+
+   	return result;
+}
+
+//==========================================
+// Init com port
+//==========================================
+/**
+ * TTY port initialization
+ * @return port initial result
+ */
+int InitComPort()
+{
+	int fd;
+	struct termios tios;
+
+	fd = open(TTY_PORT, O_RDWR);
+	if(fd<=0)
+	{
+		return FAIL;
+	}
+	ioctl (fd, TCGETS, &tios);
+	tios.c_cflag = B9600| CS8 | CLOCAL | CREAD;
+	tios.c_lflag = 0;
+	tios.c_iflag = 0;
+	tios.c_oflag = 0;
+	tios.c_cc[VMIN]=0;						// data length threshold, 0 bytes
+	tios.c_cc[VTIME]=(unsigned char)5;		// timeout threshold, 0.5 seconds
+	tios.c_lflag=0;
+	tcflush(fd, TCIFLUSH);
+	ioctl (fd, TCSETS, &tios);
+
+	return fd;
+}
+
+/**
+ *
+ * @param serial port handle
+ * @param request message data
+ * @param response message data
+ * @return
+ */
+int pollingRequest(int uart, unsigned char* cmd)
+{
+	int result=FAIL;
+
+	tcflush(uart,TCIOFLUSH);
+	cmd[(cmd[1]<<8)|(cmd[2])] = calChksum(cmd);
+
+	//show_raw(cmd, cmd_len, NO);
+	if(write(uart, cmd, ARRAY_SIZE(cmd)) > 0)
+	{
+		result = PASS;
+	}
+	else
+	{
+		DEBUG_ERROR("pollingRequest fail.\n");
+	}
+
+	return result;
+}
+
+/**
+ *
+ * @param uart
+ * @param rx
+ * @return
+ */
+int pollingResponse(int uart, unsigned char* rx)
+{
+	int result=FAIL;
+
+	read(uart, rx, RAW_DATA_LENGTH);
+	//show_raw(rx, rx_len, YES);
+
+	if(calChksum(&rx[0]) == rx[(((rx[1] << 8) | (rx[1]))+3)])
+	{
+		result = PASS;
+	}
+
+	return result;
+}
+
+/**
+ *
+ * @param uart
+ * @return
+ */
+int getInputBufferCount(int uart)
+{
+	int bytes_avail;
+	ioctl(uart, FIONREAD, &bytes_avail);
+
+	return bytes_avail;
+}
+
+/**
+ *
+ * @param node
+ * @param node_name
+ * @return
+ */
+xmlNode *find_node(xmlNode *node, char *node_name)
+{
+	xmlNode *result;
+
+	if (node == NULL) return NULL;
+
+	while(node)
+	{
+		if((node->type == XML_ELEMENT_NODE) && (strcmp((char*)node->name, node_name) == 0)) return node;
+
+		if((result = find_node(node->children, node_name))) return result;
+
+		node = node->next;
+	}
+
+  return NULL;
+}
+
+//==========================================
+// Reader operation function
+//==========================================
+int preAuthRequest(int uart)
+{
+	char xmlBody[512]={0};
+
+	xmlBuffer * outputXmlPtr = xmlBufferCreate();
+	xmlDocPtr doc = NULL;
+	xmlNodePtr node_req = NULL;
+	xmlNodePtr node_cmd = NULL;
+	xmlNodePtr node_param = NULL;
+	xmlNodePtr node_param_Txn = NULL;
+
+	// Create xml message
+	doc = xmlNewDoc(BAD_CAST "1.0");
+	node_req = xmlNewNode(NULL, BAD_CAST "Req");
+	xmlDocSetRootElement(doc, node_req);
+
+	node_cmd = xmlNewNode(NULL, BAD_CAST "Cmd");
+	xmlNewChild(node_cmd, NULL, BAD_CAST "CmdId", BAD_CAST "TxnStart");
+	xmlNewChild(node_cmd, NULL, BAD_CAST "CmdTout", BAD_CAST "30");
+	xmlAddChild(node_req, node_cmd);
+
+	node_param = xmlNewNode(NULL, BAD_CAST "Param");
+	node_param_Txn = xmlNewNode(NULL, BAD_CAST "Txn");
+	xmlNewChild(node_param_Txn, NULL, BAD_CAST "TxnType", BAD_CAST "AuthOnly");
+	xmlNewChild(node_param_Txn, NULL, BAD_CAST "CurrCode", BAD_CAST "840");
+	xmlNewChild(node_param_Txn, NULL, BAD_CAST "TxnAmt", BAD_CAST "100");
+	xmlAddChild(node_param, node_param_Txn);
+	xmlAddChild(node_req, node_param);
+
+    xmlNodeDump(outputXmlPtr, NULL, (xmlNode *)node_req, 0, 0);
+    sprintf(xmlBody, "%s", (const char *)outputXmlPtr->content);
+
+    xmlBufferFree(outputXmlPtr);
+    xmlFreeDoc(doc);
+    xmlCleanupParser();
+    xmlMemoryDump();
+
+	// Create protocol message
+	memset(commandRaw.requestData, 0x00, ARRAY_SIZE(commandRaw.requestData));
+
+	commandRaw.requestData[0] = STX;
+	commandRaw.requestData[1] = (strlen(xmlBody)>>8)&0xff;
+	commandRaw.requestData[2] = (strlen(xmlBody)>>0)&0xff;
+	memcpy(&commandRaw.requestData[3], xmlBody, strlen(xmlBody));
+
+
+	return pollingRequest(uart, commandRaw.requestData);
+}
+
+int preAuthResponse(int uart)
+{
+	int result = pollingResponse(uart, commandRaw.responseData);
+	//char *xmlTestBody = "<Event><MesgId>21</MesgId><MesgStr>PLEASE PRESENT CARD</MesgStr></Event>";
+	//char *xmlTestBody = "<Event><MesgId>27</MesgId><MesgStr>AUTHORIZING. PLEASE WAIT...</MesgStr></Event>";
+	//char *xmlTestBody = "<Resp><Cmd><CmdId>TxnStartResp</CmdId><StatusCode>001F</StatusCode><StatusText>TransactionDeferred</StatusText></Cmd><Data><Txn><TxnId>62</TxnId></Txn></Data></Resp>";
+	char xmlTestBody[512] = {0};
+
+	if(result == PASS)
+	{
+		memcpy(xmlTestBody, &commandRaw.responseData[3], ((commandRaw.responseData[1] << 8) | commandRaw.responseData[2]));
+
+		xmlDocPtr doc = xmlParseDoc((const xmlChar *)xmlTestBody);
+		xmlNode *root_element = xmlDocGetRootElement(doc);
+
+		if(find_node(root_element, "Event") != NULL)
+		{
+			DEBUG_INFO("===== Get event =======================\n");
+			ShmSysConfigAndInfo->SysInfo.bazel8.event.messageId = atoi((char*)xmlNodeGetContent(find_node(root_element, "MesgId")));
+			sprintf(ShmSysConfigAndInfo->SysInfo.bazel8.event.messageString, "%s", xmlNodeGetContent(find_node(root_element, "MesgId")));
+			ShmSysConfigAndInfo->SysInfo.bazel8.event.isGetOn = ON;
+
+			DEBUG_INFO("Message id: %d\n", ShmSysConfigAndInfo->SysInfo.bazel8.event.messageId);
+			DEBUG_INFO("%s: %s\n", root_element->children->next->name, xmlNodeGetContent(root_element->children->next));
+		}
+		else if((find_node(root_element, "Resp") != NULL) && (strstr((char*)xmlNodeGetContent(find_node(root_element, "CmdId")), "TxnStartResp") != NULL))
+		{
+			DEBUG_INFO("===== Get response =======================\n");
+			sprintf(ShmSysConfigAndInfo->SysInfo.bazel8.txResp.statusCode, "%s", xmlNodeGetContent(find_node(root_element, "StatusCode")));
+			sprintf(ShmSysConfigAndInfo->SysInfo.bazel8.txResp.statusText, "%s", xmlNodeGetContent(find_node(root_element, "StatusText")));
+			sprintf(ShmSysConfigAndInfo->SysInfo.bazel8.txResp.txnId, "%s", xmlNodeGetContent(find_node(root_element, "TxnId")));
+			ShmSysConfigAndInfo->SysInfo.bazel8.txResp.isGetOn = ON;
+
+			DEBUG_INFO("Status code: %s\n", ShmSysConfigAndInfo->SysInfo.bazel8.txResp.statusCode);
+			DEBUG_INFO("Status text: %s\n", ShmSysConfigAndInfo->SysInfo.bazel8.txResp.statusText);
+			DEBUG_INFO("TxnId: %s\n", ShmSysConfigAndInfo->SysInfo.bazel8.txResp.txnId);
+		}
+		else
+		{
+			DEBUG_INFO("===== Get unknown node =======================\n");
+		}
+
+	    xmlFreeDoc(doc);
+	    xmlCleanupParser();
+	    xmlMemoryDump();
+	}
+
+	return result;
+}
+
+//==========================================
+// Main loop
+//==========================================
+int main(void)
+{
+	int UartFd;
+	int preAuthRetry = 0;
+	int cmdRepeatCount = 0;
+
+	//===============================================
+	// Initialization
+	//===============================================
+#ifndef X86
+	if(InitShareMemory() == FAIL)
+	{
+		DEBUG_ERROR("InitShareMemory NG\n");
+
+		if(ShmStatusCodeData!=NULL)
+		{
+			ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=1;
+		}
+		sleep(5);
+		return FAIL;
+	}
+#endif
+
+	UartFd=InitComPort();
+	if(UartFd<0)
+	{
+		DEBUG_ERROR("InitComPort NG\n");
+		if(ShmStatusCodeData!=NULL)
+		{
+#ifndef X86
+			ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
+#endif
+		}
+		sleep(5);
+		return FAIL;
+	}
+	else
+	{
+		DEBUG_INFO("%s port open success.\n", TTY_PORT);
+	}
+
+	DEBUG_INFO("Payment module initialize completed.\n");
+
+	//===============================================
+	// Main loop
+	//===============================================
+	for(;;)
+	{
+		if(ShmSysConfigAndInfo->SysInfo.bazel8.cmdPreAuth.isReq)
+		{
+			// Pre auth request
+			if(!ShmSysConfigAndInfo->SysInfo.bazel8.cmdPreAuth.isWaitRes)
+			{
+				ShmSysConfigAndInfo->SysInfo.bazel8.cmdPreAuth.isRes = false;
+				ShmSysConfigAndInfo->SysInfo.bazel8.event.isGetOn = false;
+				ShmSysConfigAndInfo->SysInfo.bazel8.txResp.isGetOn = false;
+
+				if(preAuthRequest(UartFd))
+				{
+					ShmSysConfigAndInfo->SysInfo.bazel8.cmdPreAuth.isWaitRes = true;
+					cmdRepeatCount = 0;
+					refreshStartTimer(&tmr[TIMER_READ_RESPONSE]);
+				}
+
+				if(cmdRepeatCount > SPEC_REQUEST_RETRY)
+				{
+					DEBUG_WARN("preAuthRequest fail over count(%d).", cmdRepeatCount);
+					cmdRepeatCount = 0;
+					ShmSysConfigAndInfo->SysInfo.bazel8.cmdPreAuth.isReq = false;
+					ShmSysConfigAndInfo->SysInfo.bazel8.cmdPreAuth.isResultPass = false;
+					ShmSysConfigAndInfo->SysInfo.bazel8.cmdPreAuth.isRes = true;
+				}
+				else
+				{
+					cmdRepeatCount += 1;
+				}
+			}
+			else
+			{
+				if((getInputBufferCount(UartFd) >= RAW_DATA_LENGTH))
+				{
+					if(preAuthResponse(UartFd))
+					{
+						if(ShmSysConfigAndInfo->SysInfo.bazel8.event.isGetOn)
+						{
+							/*
+							 *	TODO:
+							 *	1. Announce CSU event content.
+							 */
+							ShmSysConfigAndInfo->SysInfo.bazel8.event.isGetOn = false;
+						}
+						else if(ShmSysConfigAndInfo->SysInfo.bazel8.txResp.isGetOn)
+						{
+							ShmSysConfigAndInfo->SysInfo.bazel8.cmdPreAuth.isResultPass = ((strstr(ShmSysConfigAndInfo->SysInfo.bazel8.txResp.statusCode, "0000") != NULL)?true:false);
+
+							if(ShmSysConfigAndInfo->SysInfo.bazel8.cmdPreAuth.isResultPass || (preAuthRetry++ >= 3))
+							{
+								ShmSysConfigAndInfo->SysInfo.bazel8.cmdPreAuth.isReq = false;
+								ShmSysConfigAndInfo->SysInfo.bazel8.cmdPreAuth.isRes = true;
+
+								preAuthRetry = 0;
+							}
+							ShmSysConfigAndInfo->SysInfo.bazel8.cmdPreAuth.isWaitRes = false;
+						}
+					}
+				}
+
+				if((getDiffSecNow(tmr[TIMER_READ_RESPONSE]) > TIMEOUT_REQUEST))
+				{
+					ShmSysConfigAndInfo->SysInfo.bazel8.cmdPreAuth.isReq = false;
+					ShmSysConfigAndInfo->SysInfo.bazel8.cmdPreAuth.isWaitRes = false;
+					ShmSysConfigAndInfo->SysInfo.bazel8.cmdPreAuth.isResultPass = false;
+					ShmSysConfigAndInfo->SysInfo.bazel8.cmdPreAuth.isRes = true;
+					DEBUG_WARN("Wait pre auth response timeout(%d secs).", TIMEOUT_REQUEST);
+				}
+			}
+		}
+
+		sleep(3);
+	}
+
+	return FAIL;
+}

+ 100 - 0
EVSE/Modularization/Module_Payment_Bazel8.h

@@ -0,0 +1,100 @@
+/*
+ * Module_Payment_Omnixpay.h
+ *
+ *  Created on: 2022/01/24
+ *      Author: folus
+ */
+
+#ifndef MODULE_PAYMENT_BAZEL8_H_
+#define MODULE_PAYMENT_BAZEL8_H_
+//#define	X86
+
+#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 	<math.h>
+#include	<limits.h>
+#include	<stdint.h>
+#include 	<libxml/parser.h>
+#include 	<libxml/tree.h>
+
+#ifndef X86
+	#include	"define.h"
+	#define TTY_PORT		"/dev/ttyS2"
+#else
+	#define ConsloePrintLog
+	#define TTY_PORT		"/dev/ttyUSB0"
+#endif
+
+#define DEBUG_INFO(format, args...) StoreLogMsg("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
+#define DEBUG_WARN(format, args...) StoreLogMsg("[%s:%d][%s][Warn] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
+#define DEBUG_ERROR(format, args...) StoreLogMsg("[%s:%d][%s][Error] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
+
+#define is_error(ptr) 				((unsigned long)ptr > (unsigned long)-4000L)
+#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 RAW_DATA_LENGTH				32
+#define SPEC_REQUEST_RETRY			3
+#define TIMEOUT_REQUEST				40
+
+struct SysConfigAndInfo				*ShmSysConfigAndInfo;
+struct StatusCodeData 				*ShmStatusCodeData;
+struct OCPP16Data 					*ShmOCPP16Data;
+
+enum TIMER
+{
+	TIMER_READ_RESPONSE,
+	TIMER_INDEX_1,
+	TIMER_CNT
+};
+
+enum Boolean
+{
+	false=0,
+	true
+};
+
+enum MESSAGE_HEADER
+{
+	STX=0xC2
+};
+
+struct COMMAND
+{
+	uint8_t requestData[1024];
+	uint8_t responseData[1024];
+};
+
+
+#endif /* MODULE_PAYMENT_BAZEL8_H_ */

+ 78 - 1
EVSE/Projects/AX80/Apps/main.c

@@ -5611,6 +5611,7 @@ int main(void)
 							ShmCharger->gun_info[gun_index].rfidReq = OFF;
 							ShmCharger->gun_info[gun_index].bleConfigData.isRequestStart = OFF;
 							ShmCharger->gun_info[gun_index].bleConfigData.isRequestStop = OFF;
+							ShmCharger->gun_info[gun_index].isGetEvCCID = OFF;
 							ocpp_set_remotestart(gun_index, OFF);
 							ocpp_set_remotestop(gun_index, OFF);
 
@@ -5667,13 +5668,48 @@ int main(void)
 							}
 						}
 
+						// Try to get EVCCID if plug first
+						if(ShmCharger->isCcsEnable && (ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == CP_STATE_B))
+						{
+							if(!getRequest(gun_index))
+							{
+								DEBUG_INFO("Try to get EVCCID.\n");
+								setRequest(gun_index, ON);
+							}
+
+							if(ShmCharger->gun_info[gun_index].ccsHandshakeState == HANDSHAKE_CCS)
+							{
+								if((16 < ShmCharger->gun_info[gun_index].acCcsInfo.PresentMsgFlowStatus) && (ShmCharger->gun_info[gun_index].acCcsInfo.PresentMsgFlowStatus < 254))
+								{
+									sprintf((char*)ShmSysConfigAndInfo->SysConfig.UserId, "%02X%02X%02X%02X%02X%02X", ShmCharger->gun_info[gun_index].acCcsInfo.EVCCID[0],
+																													  ShmCharger->gun_info[gun_index].acCcsInfo.EVCCID[1],
+																													  ShmCharger->gun_info[gun_index].acCcsInfo.EVCCID[2],
+																													  ShmCharger->gun_info[gun_index].acCcsInfo.EVCCID[3],
+																													  ShmCharger->gun_info[gun_index].acCcsInfo.EVCCID[4],
+																													  ShmCharger->gun_info[gun_index].acCcsInfo.EVCCID[5]);
+									//sprintf((char*)ShmSysConfigAndInfo->SysConfig.UserId, "F5902677");
+									ShmCharger->gun_info[gun_index].isGetEvCCID = ON;
+
+									DEBUG_INFO("Got EVCCID: %s\n", ShmSysConfigAndInfo->SysConfig.UserId);
+								}
+							}
+						}
+						else
+						{
+							if(getRequest(gun_index))
+							{
+								setRequest(gun_index, OFF);
+							}
+						}
+
 						if(((ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_DISABLE) && (ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == CP_STATE_B)) ||
 						   ((ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_DISABLE) && (ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == CP_STATE_C)) ||
 						   ((ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_DISABLE) && (ShmCharger->gun_info[gun_index].primaryMcuState.socket_e.isSocketEPinOn == ON)) ||
 						   (ShmCharger->gun_info[gun_index].rfidReq == ON) ||
 						   (ShmCharger->gun_info[gun_index].bleConfigData.isRequestStart == ON) ||
 						   (ocpp_get_remotestart(gun_index) == ON) ||
-						   (ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].schedule.isTriggerStart == ON))
+						   (ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].schedule.isTriggerStart == ON) ||
+						   (ShmCharger->gun_info[gun_index].isGetEvCCID == ON))
 						{
 							if((ShmCharger->gun_info[gun_index].rfidReq == ON))
 							{
@@ -5697,6 +5733,13 @@ int main(void)
 								setSpeaker(ON, SPEAKER_SHORT);
 								DEBUG_INFO("Start Method : BLE...\n");
 							}
+							else if(ShmCharger->gun_info[gun_index].isGetEvCCID == ON)
+							{
+								ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartMethod = START_METHOD_EVCCID;
+								ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartIdType = IdTokenType_MacAddress;
+								setSpeaker(ON, SPEAKER_SHORT);
+								DEBUG_INFO("Start Method : EVCCID...\n");
+							}
 							else
 							{
 								ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartMethod = START_METHOD_FREE;
@@ -5711,6 +5754,7 @@ int main(void)
 							ocpp_set_remotestart(gun_index, OFF);
 							ShmCharger->gun_info[gun_index].bleConfigData.isRequestStart = OFF;
 							ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].schedule.isTriggerStart = OFF;
+							ShmCharger->gun_info[gun_index].isGetEvCCID = OFF;
 
 							// Get target current
 							ocpp_set_profile_req(gun_index, ON);
@@ -5732,6 +5776,11 @@ int main(void)
 								DEBUG_INFO("Remote start request authorize.\n");
 								ocpp_set_auth_req(ON, "ISO14443");
 							}
+							else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartMethod == START_METHOD_EVCCID))
+							{
+								DEBUG_INFO("EVCCID request authorize.\n");
+								ocpp_set_auth_req(ON, "MacAddress");
+							}
 						}
 
 						if(getDiffSecNow(startTime[gun_index][TMR_IDX_AUTH]) > TIMEOUT_SPEC_AUTH)
@@ -5778,6 +5827,34 @@ int main(void)
 										setChargerMode(gun_index, SYS_MODE_PREPARING);
 									}
 									break;
+								case START_METHOD_EVCCID:
+									if(ocpp_get_auth_conf() ||
+									   (!ocpp_get_connection_status() && ((ShmSysConfigAndInfo->SysConfig.OfflinePolicy == OFF_POLICY_FREE) || (ShmSysConfigAndInfo->SysConfig.OfflinePolicy == OFF_POLICY_NOCHARGE))) ||
+									   (!ocpp_get_connection_status() && (ShmSysConfigAndInfo->SysConfig.OfflinePolicy == OFF_POLICY_LOCALLIST) && (getDiffSecNow(startTime[0][TMR_IDX_AUTH]) > 2)))
+									{
+										if(ocpp_get_auth_result(gun_index) ||
+										  (!ocpp_get_connection_status() && (ShmSysConfigAndInfo->SysConfig.OfflinePolicy == OFF_POLICY_FREE)) ||
+										  (!ocpp_get_connection_status() && (isValidLocalWhiteCard() == PASS) && (ShmSysConfigAndInfo->SysConfig.OfflinePolicy == OFF_POLICY_LOCALLIST)))
+										{
+											memcpy((char*)ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartUserId, ShmSysConfigAndInfo->SysConfig.UserId, ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.UserId));
+
+											DEBUG_INFO("Authorize pass.\n");
+											setSpeaker(ON, SPEAKER_SHORT);
+											setLedMotion(gun_index, LED_ACTION_RFID_PASS);
+											setChargerMode(gun_index, SYS_MODE_PREPARING);
+										}
+										else
+										{
+											DEBUG_INFO("Authorize fail.\n");
+											setSpeaker(ON, SPEAKER_INTERVAL_3COUNT);
+											setLedMotion(gun_index, LED_ACTION_RFID_FAIL);
+											sleep(3);
+											setChargerMode(gun_index, SYS_MODE_IDLE);
+										}
+
+										ocpp_set_auth_conf(OFF);
+									}
+									break;
 								case START_METHOD_RFID:
 								case START_METHOD_BLE:
 								case START_METHOD_FREE:

+ 3 - 1
EVSE/Projects/AX80/Apps/main.h

@@ -172,7 +172,8 @@ enum START_METHOD
 	START_METHOD_FREE=0,
 	START_METHOD_RFID,
 	START_METHOD_BACKEND,
-	START_METHOD_BLE
+	START_METHOD_BLE,
+	START_METHOD_EVCCID
 };
 
 enum HANDSHAKE_STATE
@@ -796,6 +797,7 @@ typedef struct GUN_INFO
 	uint32_t										isUpgradePASS:1;
 	uint32_t										isGunUnpluggedBefore:1;
 	uint32_t										isEmergencyStopReport:1;
+	uint32_t										isGetEvCCID:1;
 }Gun_Info;
 
 struct Charger

+ 32 - 0
EVSE/Projects/define.h

@@ -900,6 +900,37 @@ typedef struct DC_METER_INFO
     unsigned char LinkStatus;                   // 0 = unknow ,1 = link , 2 miss link
 }DC_Meter_Info;
 
+typedef struct Bazel8Command
+{
+	unsigned char isReq:1;
+	unsigned char isRes:1;
+	unsigned char isWaitRes:1;
+	unsigned char isResultPass:1;
+} bazel8Command;
+
+typedef struct EventInfo
+{
+	int messageId;
+	char messageString[64];
+	unsigned char isGetOn:1;
+}eventInfo;
+
+typedef struct StartTxResp
+{
+	char statusCode[8];
+	char statusText[128];
+	char txnId[32];
+	unsigned char isGetOn:1;
+}startTxResp;
+
+struct BAZEL8
+{
+	eventInfo		event;
+	startTxResp		txResp;
+
+	bazel8Command	cmdPreAuth;
+};
+
 struct SysInfoData
 {
 	/**************System***************/
@@ -997,6 +1028,7 @@ struct SysInfoData
     unsigned char           OTPTemp;                    // OTP Temperature
     unsigned char           OTPTempR;                   // OTP Recovery Temperature
     struct LCD_OVERRIDE     LcdOveride;                 // LCD override info (no use anymore)
+    struct BAZEL8			bazel8;						// Bazel8 payment used
 };
 
 struct SysConfigAndInfo

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

@@ -10,5 +10,6 @@ Module_EventLogging
 Module_PhBackend
 Module_InitUpgrade
 Module_Payment
+Module_Payment_Bazel8
 Module_DcMeter
 Module_PowerSharing