Przeglądaj źródła

2020-01-10 / Folus

Actions:
1. Merge from master.

Files:
1. As follow commit history.
8009 5 lat temu
rodzic
commit
5699d08c4f

BIN
EVSE/Modularization/OcppBackend


+ 11 - 2
EVSE/Projects/AW-Regular/Apps/Makefile

@@ -6,7 +6,7 @@ Lib_Module_RFID = -L../../../Modularization -lModule_RFID
 Lib_Module_Upgrade = "-L../../../Modularization" -lModule_Upgrade
 
 all: CopyFile apps
-apps: Module_InternalComm_Task Module_FactoryConfig_Task Module_EventLogging_Task Module_AlarmDetect_Task Module_CSU_Task
+apps: Module_InternalComm_Task Module_FactoryConfig_Task Module_EventLogging_Task Module_AlarmDetect_Task Module_CSU_Task Module_Speaker_Task
 
 
 Module_InternalComm_Task:
@@ -57,8 +57,17 @@ Module_CSU_Task:
 	$(CC) -o main main.o ${Lib_Module_RFID} ${Lib_Module_Upgrade}
 	rm -f *.o
 	mv -f main ../Images/root		
+	@echo \
+
+Module_Speaker_Task:
+	@echo "===== Module_Speaker_Task ===================================="
+	rm -f Module_Speaker
+	$(CC) "-I../../"  -O0 -g3 -Wall -c -fmessage-length=0 -o Module_Speaker.o  "./Module_Speaker.c"
+	$(CC) -o Module_Speaker Module_Speaker.o 
+	rm -f *.o
+	mv -f Module_Speaker ../Images/root	
 	@echo \ 
-	
+
 CopyFile: 
 	rm -rfv ../Images/root
 	mkdir -p ../Images/root

+ 2 - 2
EVSE/Projects/AW-Regular/Apps/Module_FactoryConfig.c

@@ -226,8 +226,8 @@ int main(int argc, char *argv[])
 	// System configuration
 	time_t t = time(NULL);
 	struct tm tm = *localtime(&t);
-	strcpy((char*)SysConfig.ModelName, "AWLU770100W1P0");
-	strcpy((char*)SysConfig.SerialNumber, "D19520001A0");
+	strcpy((char*)SysConfig.ModelName, "AWLU700100W1PH");
+	strcpy((char*)SysConfig.SerialNumber, "D1904A001A0");
 	sprintf((char*)SysConfig.SystemId, "%s%s", SysConfig.ModelName, SysConfig.SerialNumber);
 	sprintf((char*)SysConfig.SystemDateTime, "%d-%d-%d %d:%d:%d", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
 	SysConfig.AuthorisationMode = 0;	// 0:PH card	1: OCPP backend		2: PH backend	3: Free Mode

Plik diff jest za duży
+ 667 - 441
EVSE/Projects/AW-Regular/Apps/Module_InternalComm.c


+ 1 - 1
EVSE/Projects/AW-Regular/Apps/Module_InternalComm.h

@@ -1,7 +1,7 @@
 /*
  * Module_InternalComm.h
  *
- *  Created on: 2019?8?28?
+ *  Created on: 2019年8月28日
  *      Author: USER
  */
 

+ 285 - 0
EVSE/Projects/AW-Regular/Apps/Module_Speaker.c

@@ -0,0 +1,285 @@
+/*
+ * Module_Speaker.c
+ *
+ *  Created on: 2019年12月23日
+ *      Author: USER
+ */
+
+#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>     /*Unix 標準函數定義*/
+#include    <fcntl.h>      /*檔控制定義*/
+#include    <termios.h>    /*PPSIX 終端控制定義*/
+#include    <errno.h>      /*錯誤號定義*/
+#include 	<errno.h>
+#include 	<string.h>
+#include	<time.h>
+#include	<ctype.h>
+#include 	<ifaddrs.h>
+#include	"define.h"
+#include	"main.h"
+
+#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 EVENT_INFO(format, args...) StoreEventLogMsg("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
+
+#define Debug
+#define ARRAY_SIZE(A)		(sizeof(A) / sizeof(A[0]))
+#define PASS				1
+#define FAIL				-1
+#define ON					1
+#define OFF					0
+
+#define INTERVAL_1			100000
+#define INTERVAL_2			50000
+
+unsigned char speaker_type = SPEAKER_STOP;
+unsigned char pre_speaker_type = SPEAKER_STOP;
+
+struct SysConfigAndInfo			*ShmSysConfigAndInfo;
+struct StatusCodeData 			*ShmStatusCodeData;
+struct Charger					*ShmCharger;
+
+void trim(char *s);
+int mystrcmp(char *p1,char *p2);
+void substr(char *dest, const char* src, unsigned int start, unsigned int cnt);
+void split(char **arr, char *str, const char *del);
+
+
+#ifdef SystemLogMessage
+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 \"[%04d.%02d.%02d %02d:%02d:%02d] - %s\" >> /Storage/SystemLog/%04d-%02d_%s_%s_SystemLog",
+			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,
+			ShmSysConfigAndInfo->SysConfig.ModelName,
+			ShmSysConfigAndInfo->SysConfig.SerialNumber);
+#ifdef SystemLogMessage
+	system(Buf);
+#endif
+
+	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);
+
+	return rc;
+}
+#endif
+
+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;
+}
+
+//=================================
+// Common routine
+//=================================
+void trim(char *s)
+{
+    int i=0, j, k, l=0;
+
+    while((s[i]==' ')||(s[i]=='\t')||(s[i]=='\n'))
+        i++;
+
+    j = strlen(s)-1;
+    while((s[j]==' ')||(s[j]=='\t')||(s[j]=='\n'))
+        j--;
+
+    if(i==0 && j==strlen(s)-1) { }
+    else if(i==0) s[j+1] = '\0';
+    else {
+        for(k=i; k<=j; k++) s[l++] = s[k];
+        s[l] = '\0';
+    }
+}
+
+int mystrcmp(char *p1,char *p2)
+{
+    while(*p1==*p2)
+    {
+        if(*p1=='\0' || *p2=='\0')
+            break;
+        p1++;
+        p2++;
+    }
+    if(*p1=='\0' && *p2=='\0')
+        return(PASS);
+    else
+        return(FAIL);
+}
+
+void substr(char *dest, const char* src, unsigned int start, unsigned int cnt)
+{
+	strncpy(dest, src + start, cnt);
+	dest[cnt] = 0;
+}
+
+void split(char **arr, char *str, const char *del)
+{
+	char *s = strtok(str, del);
+
+	while(s != NULL)
+	{
+		*arr++ = s;
+		s = strtok(NULL, del);
+	}
+}
+
+//==========================================
+// Init all share memory
+//==========================================
+int InitShareMemory()
+{
+	int result = PASS;
+	int MeterSMId;
+
+	//Initial ShmSysConfigAndInfo
+	if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo),  0777)) < 0)
+	{
+		#ifdef SystemLogMessage
+		DEBUG_ERROR("shmget ShmSysConfigAndInfo NG\n");
+		#endif
+		result = FAIL;
+	}
+	else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
+	{
+		#ifdef SystemLogMessage
+		DEBUG_ERROR("[shmat ShmSysConfigAndInfo NG\n");
+		#endif
+		result = FAIL;
+	}
+
+	//Initial ShmStatusCodeData
+	if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData),  0777)) < 0)
+	{
+		#ifdef SystemLogMessage
+		DEBUG_ERROR("shmget ShmStatusCodeData NG\n");
+		#endif
+		result = FAIL;
+	}
+	else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
+	{
+		#ifdef SystemLogMessage
+		DEBUG_ERROR("shmat ShmStatusCodeData NG\n");
+		#endif
+		result = FAIL;
+	}
+
+	//Initial ShmCharger
+	if ((MeterSMId = shmget(ShmChargerKey, sizeof(struct Charger), IPC_CREAT | 0777)) < 0)
+	{
+		#ifdef SystemLogMessage
+		DEBUG_ERROR("shmget ShmChargerKey NG\r\n");
+		#endif
+		result = FAIL;
+	}
+	else if ((ShmCharger = shmat(MeterSMId, NULL, 0)) == (void *) -1)
+	{
+		#ifdef SystemLogMessage
+		DEBUG_ERROR("shmat ShmChargerKey NG\r\n");
+		#endif
+		result = FAIL;
+	}
+
+	return result;
+}
+
+//================================================
+// Main process
+//================================================
+int main(void)
+{
+	if(InitShareMemory() == FAIL)
+	{
+		DEBUG_ERROR("InitShareMemory NG\n");
+
+		if(ShmStatusCodeData!=NULL)
+		{
+			ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=1;
+		}
+		sleep(5);
+		return FAIL;
+	}
+
+	for(;;)
+	{
+		if(ShmCharger->isSpeakerOn == ON)
+		{
+			switch(ShmCharger->speaker_type)
+			{
+				case SPEAKER_STOP:
+					DEBUG_INFO("SPEAKER_STOP...\r\n");
+					ShmCharger->isSpeakerOn = OFF;
+					break;
+				case SPEAKER_ALWAYS_ON:
+					break;
+				case SPEAKER_SHORT:
+					system("echo 1 > /sys/class/gpio/gpio65/value");
+					usleep(INTERVAL_1);
+					system("echo 0 > /sys/class/gpio/gpio65/value");
+
+					ShmCharger->isSpeakerOn = OFF;
+					DEBUG_INFO("SPEAKER_SHORT...\r\n");
+					break;
+				case SPEAKER_LONG:
+					break;
+				case SPEAKER_INTERVAL_SHORT:
+					break;
+				case SPEAKER_INTERVAL_LONG:
+					break;
+				case SPEAKER_INTERVAL_3COUNT:
+					system("echo 1 > /sys/class/gpio/gpio65/value");
+					usleep(INTERVAL_2);
+					system("echo 0 > /sys/class/gpio/gpio65/value");
+					usleep(INTERVAL_2);
+					system("echo 1 > /sys/class/gpio/gpio65/value");
+					usleep(INTERVAL_2);
+					system("echo 0 > /sys/class/gpio/gpio65/value");
+					usleep(INTERVAL_2);
+					system("echo 1 > /sys/class/gpio/gpio65/value");
+					usleep(INTERVAL_2);
+					system("echo 0 > /sys/class/gpio/gpio65/value");
+
+					ShmCharger->isSpeakerOn = OFF;
+					DEBUG_INFO("SPEAKER_INTERVAL_3COUNT...\r\n");
+					break;
+			}
+		}
+	}
+}
+

+ 57 - 18
EVSE/Projects/AW-Regular/Apps/main.c

@@ -27,8 +27,9 @@
 #define TMR_IDX_8					8
 #define TMR_IDX_9 					9
 
-#define TIMEOUT_SPEC_HANDSHAKING	180000
-#define TIMEOUT_SPEC_AUTH			30000
+#define TIMEOUT_SPEC_HANDSHAKING		180000
+#define TIMEOUT_SPEC_AUTH				30000
+#define TIMEOUT_SPEC_HANDSHAKING_LED	185000
 
 #define MtdBlockSize 				0x600000
 
@@ -484,7 +485,7 @@ int LoadSysConfigAndInfo(struct SysConfigData *ptr)
 	{
 		ChkSum+=buf[wrd];
 	}
-	memcpy(&ChkSumOrg,buf+(0x00600000-4),sizeof(ChkSumOrg));
+	memcpy(&ChkSumOrg,buf+(MtdBlockSize-4),sizeof(ChkSumOrg));
 
 	//================================================
 	// Load configuration from mtdblock11
@@ -533,7 +534,7 @@ int LoadSysConfigAndInfo(struct SysConfigData *ptr)
 		{
 			ChkSum+=buf[wrd];
 		}
-		memcpy(&ChkSumOrg,buf+(0x00600000-4),sizeof(ChkSumOrg));
+		memcpy(&ChkSumOrg,buf+(MtdBlockSize-4),sizeof(ChkSumOrg));
 
 		//================================================
 		// Load configuration from mtdblock12 (Factory default)
@@ -582,7 +583,7 @@ int LoadSysConfigAndInfo(struct SysConfigData *ptr)
 			{
 				ChkSum+=buf[wrd];
 			}
-			memcpy(&ChkSumOrg,buf+(0x00600000-4),sizeof(ChkSumOrg));
+			memcpy(&ChkSumOrg,buf+(MtdBlockSize-4),sizeof(ChkSumOrg));
 			if(ChkSum!=ChkSumOrg)
 			{
 				DEBUG_WARN("factory default  SysConfigData checksum NG, restore factory default\r\n");
@@ -614,7 +615,6 @@ void InitEthernet()
 	char tmpbuf[256];
 	//unsigned int address;
 
-	DEBUG_INFO("11111111111111111111");
 	//Init Eth0 for internet
 	if(isInterfaceUp("eth0")==PASS)
 	{
@@ -628,7 +628,7 @@ void InitEthernet()
 		ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthGatewayAddress);
 		system(tmpbuf);
 	}
-	DEBUG_INFO("2222222222222222");
+
 	if(isInterfaceUp("eth1")==PASS)
 	{
 		//Init Eth1 for administrator tool
@@ -638,7 +638,7 @@ void InitEthernet()
 		ShmSysConfigAndInfo->SysConfig.Eth1Interface.EthSubmaskAddress);
 		system(tmpbuf);
 	}
-	DEBUG_INFO("3333333333333333333333");
+
 
     //Run DHCP client if enabled
 	system("killall udhcpc");
@@ -662,6 +662,7 @@ int SpawnTask()
 	system ("pkill OcppBackend");
 	system ("pkill Module_AlarmDetect");
 	system ("pkill Module_InternalComm");
+	system ("pkill Module_Speaker");
 
 	if(ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'T')
 	{
@@ -673,9 +674,13 @@ int SpawnTask()
 	}
 
 	system("/root/Module_EventLogging &");
-	system("/root/OcppBackend &");
+	if(strcmp((char *)&ShmSysConfigAndInfo->SysConfig.OcppServerURL,"") != 0)
+	{
+		system("/root/OcppBackend &");
+	}
 	system("/root/Module_AlarmDetect &");
 	system("/root/Module_InternalComm &");
+	system ("/root/Module_Speaker &");
 
 	return PASS;
 }
@@ -1213,6 +1218,15 @@ void setLedMotion(unsigned char gun_index,unsigned char led_mode)
 		case LED_ACTION_ALL_OFF:
 			ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_ACTION_ALL_OFF;
 			break;
+		case LED_RELAY_ON:
+			ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_RELAY_ON;
+			break;
+		case LED_RELAY_OFF:
+			ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_RELAY_OFF;
+			break;
+		case LED_ACTION_HANDSHAKE_FAIL:
+			ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_ACTION_HANDSHAKE_FAIL;
+			break;
 	}
 }
 
@@ -1354,6 +1368,11 @@ int main(void)
 	// Main loop
 	for(;;)
 	{
+		//==========================================
+		// Synchronize share memory from OCPP struct
+		//==========================================
+		ShmSysConfigAndInfo->SysInfo.OcppConnStatus = ShmOCPP16Data->OcppConnStatus;
+
 		//==========================================
 		// Something need run in Idle mode
 		//==========================================
@@ -1486,14 +1505,13 @@ int main(void)
 						ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent = ShmCharger->gun_info[gun_index].primaryMcuState.rating_current;
 						ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargedDuration = 0;
 						ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargedEnergy = 0;
+						setLedMotion(gun_index,LED_ACTION_IDLE);
 					}
 
-					if(((ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == CP_STATE_B) && (ShmCharger->rfidReq == ON)) ||
+					if((ShmCharger->rfidReq == ON) ||
 					   (ShmSysConfigAndInfo->SysConfig.Bluetooth.isRequestStart == ON) ||
 					   (ShmOCPP16Data->CsMsg.bits[gun_index].RemoteStartTransactionReq == ON))
 					{
-						setSpeaker(ON,SPEAKER_SHORT);
-
 						// User id
 						memset(ShmSysConfigAndInfo->SysConfig.UserId, 0x00, ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.UserId));
 
@@ -1644,7 +1662,23 @@ int main(void)
 						switch(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartMethod)
 						{
 							case START_METHOD_BACKEND:
-								setChargerMode(gun_index, MODE_PREPARING);
+								if(ShmOCPP16Data->SpMsg.bits.AuthorizeConf ||
+								  (ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_OCPP))
+								{
+									if((strcmp((char*)ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status, "Accepted")==0))
+									{
+										setSpeaker(ON,SPEAKER_SHORT);
+										setChargerMode(gun_index, MODE_PREPARING);
+									}
+									else
+									{
+										setSpeaker(ON,SPEAKER_INTERVAL_3COUNT);
+										setChargerMode(gun_index, MODE_IDLE);
+									}
+
+									ShmCharger->rfidReq = OFF;
+									ShmOCPP16Data->SpMsg.bits.AuthorizeConf = OFF;
+								}
 								break;
 							case START_METHOD_RFID:
 								if(ShmOCPP16Data->SpMsg.bits.AuthorizeConf ||
@@ -1655,10 +1689,12 @@ int main(void)
 									   (ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_FREEMODE) ||
 									   (!ShmOCPP16Data->OcppConnStatus&&(ShmSysConfigAndInfo->SysConfig.OfflinePolicy == OFF_POLICY_FREEMODE)))
 									{
+										setSpeaker(ON,SPEAKER_SHORT);
 										setChargerMode(gun_index, MODE_PREPARING);
 									}
 									else
 									{
+										setSpeaker(ON,SPEAKER_INTERVAL_3COUNT);
 										setChargerMode(gun_index, MODE_IDLE);
 									}
 
@@ -1674,8 +1710,6 @@ int main(void)
 						}
 					}
 
-					setLedMotion(gun_index,LED_ACTION_AUTHED);
-
 					break;
 				case MODE_PREPARING:
 					if(isModeChange(gun_index))
@@ -1695,7 +1729,12 @@ int main(void)
 						 * 	TODO:
 						 * 	1. HANDSHAKING timeout process
 						 */
-						setChargerMode(gun_index, MODE_IDLE);
+						setLedMotion(gun_index, LED_ACTION_HANDSHAKE_FAIL);
+
+						if(DiffTimeb(startTime[TMR_IDX_HANDSHAKING]) > TIMEOUT_SPEC_HANDSHAKING_LED)
+						{
+							setChargerMode(gun_index, MODE_IDLE);
+						}
 					}
 					else if((ShmCharger->gun_info[gun_index].primaryMcuState.relay_state == ON))
 					{
@@ -1706,12 +1745,12 @@ int main(void)
 						ShmOCPP16Data->CpMsg.bits[gun_index].StartTransactionReq = ON;
 						setChargerMode(gun_index, MODE_CHARGING);
 					}
-
-					if((ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == CP_STATE_B))
+					else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == CP_STATE_B))
 					{
 						setLedMotion(gun_index,LED_ACTION_CONNECTED);
 					}
 
+
 					break;
 				case MODE_CHARGING:
 					if(isModeChange(gun_index))

+ 3 - 0
EVSE/Projects/AW-Regular/Apps/main.h

@@ -126,6 +126,9 @@
 #define LED_ACTION_BLE_DISABLE      	11
 #define LED_ACTION_DEBUG            	12
 #define LED_ACTION_ALL_OFF          	13
+#define LED_RELAY_ON               	 	14
+#define LED_RELAY_OFF               	15
+#define LED_ACTION_HANDSHAKE_FAIL   	16
 
 #define START_METHOD_MANUAL 			0
 #define START_METHOD_RFID	 			1

BIN
EVSE/Projects/AW-Regular/Images/FactoryDefaultConfig.bin


BIN
EVSE/Projects/AW-Regular/Images/ramdisk.gz


BIN
EVSE/rootfs/root/OcppBackend


Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików