瀏覽代碼

2020-01-14 / Folus Wen

Actions:
1. Synchronize BYTON-GB/Apps from AW-Regular/Apps.

Files:
1. As follow commit history.
FolusWen 5 年之前
父節點
當前提交
cd4772c528

+ 5 - 1
EVSE/Projects/BYTON-GB/Apps/Makefile

@@ -5,7 +5,6 @@ export PATH=/bin:/sbin:/usr/bin:$(SDK_PATH_TARGET)/usr/bin:$PATH
 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
 
@@ -21,6 +20,11 @@ Module_InternalComm_Task:
 	
 Module_FactoryConfig_Task:
 	@echo "===== Module_FactoryConfig_Task =================================="
+	rm -f Module_FactoryConfig
+	gcc "-I../../" -o Module_FactoryConfig "./Module_FactoryConfig.c"
+	mkdir -p /Storage/SystemLog	
+	./Module_FactoryConfig -f;true
+	cp /mnt/FactoryDefaultConfig.bin ../Images 
 	rm -f Module_FactoryConfig 
 	$(CC) "-I../../" -O0 -g3 -Wall -c -fmessage-length=0 -o Module_FactoryConfig.o "./Module_FactoryConfig.c"
 	$(CC) -o Module_FactoryConfig Module_FactoryConfig.o 

+ 2 - 0
EVSE/Projects/BYTON-GB/Apps/Module_AlarmDetect.c

@@ -608,6 +608,7 @@ int main(void)
 			//=====================================
 			// Current DC leak detection
 			//=====================================
+			/*
 			if(ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode & ALARM_CURRENT_LEAK_DC)
 			{
 				if(Alarm_Counter[gun_index].Dc_Leak > FILTER_SPEC)
@@ -634,6 +635,7 @@ int main(void)
 					DEBUG_INFO("ALARM_CURRENT_LEAK_DC : recover \r\n");
 				}
 			}
+			*/
 
 			//=====================================
 			// MCU self test fail detection

+ 3 - 3
EVSE/Projects/BYTON-GB/Apps/Module_EventLogging.c

@@ -276,7 +276,7 @@ int main(void)
 						memcpy(EventCodeTmp,FaultStatusCode[ByteCount*8+BitCount],sizeof(EventCodeTmp)-1);
 						if(((tmp>>BitCount)&0x01)==0)//Recovered
 						{
-							EventCodeTmp[0]=1;
+							EventCodeTmp[0]='1';
 							ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount]&=~(1<<BitCount);
 						}
 						else
@@ -301,7 +301,7 @@ int main(void)
 						memcpy(EventCodeTmp,AlarmStatusCode[ByteCount*8+BitCount],sizeof(EventCodeTmp)-1);
 						if(((tmp>>BitCount)&0x01)==0)//Recovered
 						{
-							EventCodeTmp[0]=1;
+							EventCodeTmp[0]='1';
 							ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount]&=(0<<BitCount);
 						}
 						else
@@ -326,7 +326,7 @@ int main(void)
 						memcpy(EventCodeTmp,InfoStatusCode[ByteCount*8+BitCount],sizeof(EventCodeTmp)-1);
 						if(((tmp>>BitCount)&0x01)==0)//Recovered
 						{
-							EventCodeTmp[0]=1;
+							EventCodeTmp[0]='1';
 							ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount]&=(0<<BitCount);
 						}
 						else

+ 144 - 81
EVSE/Projects/BYTON-GB/Apps/Module_FactoryConfig.c

@@ -36,6 +36,9 @@
 #define ARRAY_SIZE(A)		(sizeof(A) / sizeof(A[0]))
 #define PASS				1
 #define FAIL				-1
+#define OUTPUT_FLASH		0x01
+#define OUTPUT_FILE			0x02
+
 
 struct SysConfigData 			SysConfig;
 struct SysConfigAndInfo			*ShmSysConfigAndInfo;
@@ -186,24 +189,35 @@ int InitShareMemory()
     return result;
 }
 
+void helpOutput(void)
+{
+	printf("Usage: Module_FactoryConfig [OPTION]...\r\n\r\n");
+	printf("Generate factory default configuration value\r\n\r\n");
+	printf("OPTION:\r\n");
+	printf("	-a Write to file(/mnt) & flash\r\n");
+	printf("	-f Write to file(/mnt)\r\n");
+	printf("	-m Write to flash\r\n");
+}
+
 //================================================
 // Main process
 //================================================
-int main(void)
+int main(int argc, char *argv[])
 {
-
-	unsigned int i,Chk;
+	unsigned char outType=0;
+	unsigned int i,Chk,MtdBlockSize=0x600000;
 	unsigned char *ptr;
 	int fd,wrd;
 
-	ptr=malloc(sizeof(struct SysConfigData));
+	ptr=malloc(MtdBlockSize);
 	if(ptr==NULL)
 	{
-		DEBUG_ERROR("malloc for SysConfigData NG\r\n");
-
+		#ifdef SystemLogMessage
+		StoreLogMsg("[FactoryConfig]main: malloc for SysConfigData NG");
+		#endif
 		return 0;
 	}
-	memset(ptr,0,sizeof(struct SysConfigData));
+	memset(ptr,0,MtdBlockSize);
 	memset(&SysConfig,0,sizeof(struct SysConfigData));
 
 	/*
@@ -213,7 +227,7 @@ int main(void)
 	time_t t = time(NULL);
 	struct tm tm = *localtime(&t);
 	strcpy((char*)SysConfig.ModelName, "AWLU770100W1P0");
-	strcpy((char*)SysConfig.SerialNumber, "D195200001A0");
+	strcpy((char*)SysConfig.SerialNumber, "D19520001A0");
 	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
@@ -254,7 +268,7 @@ int main(void)
 	SysConfig.OfflinePolicy = 0;			// 0: Local list	1: PH RFID		2: Free		3: Deny
 	SysConfig.OfflineMaxChargeEnergy = 0;	// 0: Same as MaxChargeEnergy	Other: 1~65535KWH
 	SysConfig.OfflineMaxChargeDuration = 0; // 0: Same as MaxChargeDuration Other: 1~65535 minutes
-	strcpy((char*)SysConfig.OcppServerURL, "ws://evsocket.phihong.com.tw/");
+	strcpy((char*)SysConfig.OcppServerURL, "ws://192.168.0.246:8080/ocpp/");
 	sprintf((char*)SysConfig.ChargeBoxId, "%s%s", SysConfig.ModelName, SysConfig.SerialNumber);
 
 
@@ -263,94 +277,143 @@ int main(void)
 
 	// Calculate CRC
 	Chk=0;
-	for(i=0;i<(sizeof(struct SysConfigData)-4);i++)
+	for(i=0;i<(MtdBlockSize-4);i++)
 	{
 		Chk+=*(ptr+i);
 	}
-	SysConfig.Checksum=Chk;
+	memcpy(	ptr+MtdBlockSize-4,&Chk,4);
 
-	// Save factory default setting value to file
-	fd = open("/mnt/FactoryDefaultConfig.bin", O_RDWR|O_CREAT);
-	if (fd < 0)
-	{
-
-		DEBUG_ERROR("open /mnt/FactoryDefaultConfig.bin NG\r\n");
-
-		free(ptr);
-		return 0;
-	}
-	wrd=write(fd, &SysConfig, sizeof(struct SysConfigData));
-	close(fd);
-	if(wrd!=(sizeof(struct SysConfigData)))
+	/*
+	 * Parameter process
+	 */
+	if(argc>1)
 	{
-		DEBUG_ERROR("write /mnt/FactoryDefaultConfig.bin NG\r\n");
-
-		free(ptr);
-		return 0;
+		char *arg = argv[1];
+		switch(arg[0])
+		{
+			case '-':
+				switch(arg[1])
+				{
+					case 'a':
+						outType |= OUTPUT_FILE;
+						outType |= OUTPUT_FLASH;
+						break;
+					case 'f':
+						outType |= OUTPUT_FILE;
+						break;
+					case 'm':
+						outType |= OUTPUT_FLASH;
+						break;
+					default:
+						helpOutput();
+						break;
+				}
+				break;
+			default:
+				helpOutput();
+				break;
+		}
 	}
-
-	// Save factory default setting value to flash factory default setting block
-	fd = open("/dev/mtdblock12", O_RDWR);
-	if (fd < 0)
+	else
 	{
-
-		DEBUG_ERROR("open /dev/mtdblock12 NG\r\n");
-
-		free(ptr);
-		return 0;
+		helpOutput();
 	}
-	wrd=write(fd, &SysConfig, sizeof(struct SysConfigData));
-	close(fd);
-	if(wrd!=(sizeof(struct SysConfigData)))
-	{
-		DEBUG_ERROR("write /dev/mtdblock12 NG\r\n");
 
-		free(ptr);
-		return 0;
-	}
-
-	// Save factory default setting value to flash backup setting block
-	fd = open("/dev/mtdblock11", O_RDWR);
-	if (fd < 0)
-	{
-		DEBUG_ERROR("open /dev/mtdblock11 NG\r\n");
-
-		free(ptr);
-		return 0;
-	}
-	wrd=write(fd, &SysConfig, sizeof(struct SysConfigData));
-	close(fd);
-	if(wrd!=(sizeof(struct SysConfigData)))
+	/*
+	 * Configuration bin file generate
+	 */
+	if((outType&OUTPUT_FILE)>0)
 	{
-		DEBUG_ERROR("write /dev/mtdblock11 NG\r\n");
-
-		free(ptr);
-		return 0;
+		// Save factory default setting value to file
+		fd = open("/mnt/FactoryDefaultConfig.bin", O_RDWR|O_CREAT);
+		if (fd < 0)
+		{
+
+			DEBUG_ERROR("open /mnt/FactoryDefaultConfig.bin NG\r\n");
+
+			free(ptr);
+			return 0;
+		}
+		wrd=write(fd, ptr, MtdBlockSize);
+		close(fd);
+		if(wrd<MtdBlockSize)
+		{
+			DEBUG_ERROR("write /mnt/FactoryDefaultConfig.bin NG\r\n");
+
+			free(ptr);
+			return 0;
+		}
+
+		DEBUG_INFO("FactoryConfig write to file in /mnt OK.\r\n");
 	}
 
-	// Save factory default setting value to flash setting block
-	fd = open("/dev/mtdblock10", O_RDWR);
-	if (fd < 0)
-	{
-		DEBUG_ERROR("open /dev/mtdblock10 NG\r\n");
-
-		free(ptr);
-		return 0;
-	}
-	wrd=write(fd, &SysConfig, sizeof(struct SysConfigData));
-	close(fd);
-	if(wrd!=(sizeof(struct SysConfigData)))
+	/*
+	 * Flash memory write
+	 */
+	if((outType&OUTPUT_FLASH)>0)
 	{
-		DEBUG_ERROR("write /dev/mtdblock10 NG\r\n");
-
-		free(ptr);
-		return 0;
+		// Save factory default setting value to flash factory default setting block
+		fd = open("/dev/mtdblock12", O_RDWR);
+		if (fd < 0)
+		{
+
+			DEBUG_ERROR("open /dev/mtdblock12 NG\r\n");
+
+			free(ptr);
+			return 0;
+		}
+		wrd=write(fd, ptr, MtdBlockSize);
+		close(fd);
+		if(wrd<MtdBlockSize)
+		{
+			DEBUG_ERROR("write /dev/mtdblock12 NG\r\n");
+
+			free(ptr);
+			return 0;
+		}
+
+		// Save factory default setting value to flash backup setting block
+		fd = open("/dev/mtdblock11", O_RDWR);
+		if (fd < 0)
+		{
+			DEBUG_ERROR("open /dev/mtdblock11 NG\r\n");
+
+			free(ptr);
+			return 0;
+		}
+		wrd=write(fd, ptr, MtdBlockSize);
+		close(fd);
+		if(wrd<MtdBlockSize)
+		{
+			DEBUG_ERROR("write /dev/mtdblock11 NG\r\n");
+
+			free(ptr);
+			return 0;
+		}
+
+		// Save factory default setting value to flash setting block
+		fd = open("/dev/mtdblock10", O_RDWR);
+		if (fd < 0)
+		{
+			DEBUG_ERROR("open /dev/mtdblock10 NG\r\n");
+
+			free(ptr);
+			return 0;
+		}
+		wrd=write(fd, ptr, MtdBlockSize);
+		close(fd);
+		if(wrd<MtdBlockSize)
+		{
+			DEBUG_ERROR("write /dev/mtdblock10 NG\r\n");
+
+			free(ptr);
+			return 0;
+		}
+
+		DEBUG_INFO("FactoryConfig write to flash OK\r\n");
 	}
 
 	free(ptr);
 
-	DEBUG_INFO("FactoryConfig OK\r\n");
-
-
 	return FAIL;
 }

+ 56 - 5
EVSE/Projects/BYTON-GB/Apps/Module_InternalComm.c

@@ -198,7 +198,7 @@ int InitShareMemory()
 		result = FAIL;
 	}
 
-	//Initial ShmOcppModuleKey
+	//Initial ShmCharger
 	if ((MeterSMId = shmget(ShmChargerKey, sizeof(struct Charger), IPC_CREAT | 0777)) < 0)
 	{
 		#ifdef SystemLogMessage
@@ -711,6 +711,7 @@ unsigned char Query_AC_MCU_Status(unsigned char fd, unsigned char targetAddr, Ac
 			Ret_Buf->meter_state = rx[16];
 			Ret_Buf->pp_state = rx[17];
 			Ret_Buf->rating_current = rx[18];
+			Ret_Buf->rotatory_switch = rx[19];
 
 			result = PASS;
 		}
@@ -1261,6 +1262,37 @@ unsigned char Config_AC_MCU_LEGACY_REQUEST(unsigned char fd, unsigned char targe
 	return result;
 }
 
+unsigned char Query_AC_GUN_PLUGIN_TIMES(unsigned char fd, unsigned char targetAddr, Gun_Plugin_Times *Ret_Buf)
+{
+	unsigned char result = FAIL;
+	unsigned char tx[7] = {0xaa, 0x00, targetAddr, CMD_CONFIG_GUN_PLUGIN_TIMES, 0x00, 0x00, 0x00};
+	unsigned char rx[512];
+	unsigned char chksum = 0x00;
+	unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
+
+	if(len > 0)
+	{
+		if(len < 6+(rx[4] | rx[5]<<8))
+			return result;
+
+		for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
+		{
+			chksum ^= rx[6+idx];
+		}
+
+		if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
+		   (rx[2] == tx[1]) &&
+		   (rx[1] == tx[2]) &&
+		   (rx[3] == tx[3]))
+		{
+			Ret_Buf-> GunPluginTimes = ((uint32_t)rx[6] | (((uint32_t)rx[7])<<8) | (((uint32_t)rx[8])<<16) | (((uint32_t)rx[9])<<24));
+			result = PASS;
+		}
+	}
+
+	return result;
+}
+
 unsigned char Config_AC_MaxCurrent_And_CpPwmDuty(unsigned char fd, unsigned char targetAddr, Ac_Primary_Mcu_Cp_Pwm_Duty*Set_Buf)
 {
 	unsigned char result = FAIL;
@@ -1526,7 +1558,7 @@ int main(void)
 				memcpy(ShmCharger->evseId.serial_number, ShmSysConfigAndInfo->SysConfig.SerialNumber, ARRAY_SIZE(ShmCharger->evseId.serial_number));
 				if(Config_Serial_Number(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->evseId))
 				{
-					DEBUG_INFO("MCU-%d set serial number OK...\r\n");
+					DEBUG_INFO("MCU-%d set serial number : %.12s\r\n",gun_index,ShmCharger->evseId.serial_number);
 					ShmCharger->gun_info[gun_index].mcuFlag.isSetSerialNumberPass = PASS;
 
 					failCount[gun_index] = 0;
@@ -1549,7 +1581,7 @@ int main(void)
 				memcpy(ShmCharger->evseId.model_name, ShmSysConfigAndInfo->SysConfig.ModelName, ARRAY_SIZE(ShmCharger->evseId.model_name));
 				if(Config_Model_Name(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->evseId))
 				{
-					DEBUG_INFO("MCU-%d set model name OK...\r\n");
+					DEBUG_INFO("MCU-%d set model name : %.14s\r\n",gun_index,ShmCharger->evseId.model_name);
 					ShmCharger->gun_info[gun_index].mcuFlag.isSetModelNamePass = PASS;
 
 					failCount[gun_index] = 0;
@@ -1601,6 +1633,25 @@ int main(void)
 					failCount[gun_index]++;
 			}
 
+			//===============================
+			// Query gun plug-in times
+			//===============================
+			if(Query_AC_GUN_PLUGIN_TIMES(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1), &ShmCharger->gun_info[gun_index].gunPluginTimes) == PASS)
+			{
+				DEBUG_INFO("MCU-%d get gun plugin times : %.2f\r\n", gun_index, (float)ShmCharger->gun_info[gun_index].gunPluginTimes.GunPluginTimes);
+
+				ShmSysConfigAndInfo->SysConfig.AcPlugInTimes = (float)ShmCharger->gun_info[gun_index].gunPluginTimes.GunPluginTimes;
+
+				failCount[gun_index] = 0;
+			}
+			else
+			{
+
+				DEBUG_WARN("MCU-%d get gun plugin times fail...%d\r\n", gun_index, failCount[gun_index]);
+				if(failCount[gun_index]<1000)
+					failCount[gun_index]++;
+			}
+
 			//===============================
 			// Query temperature
 			//===============================
@@ -1635,6 +1686,7 @@ int main(void)
 				DEBUG_INFO("MCU-%d get Meter State : %d\r\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuState.meter_state);
 				DEBUG_INFO("MCU-%d get PP State : %d\r\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuState.pp_state);
 				DEBUG_INFO("MCU-%d get Rating Current : %.2f\r\n", gun_index, (float)ShmCharger->gun_info[gun_index].primaryMcuState.rating_current);
+				DEBUG_INFO("MCU-%d get Rotatory switch : %d\r\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuState.rotatory_switch);
 
 				ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState = ShmCharger->gun_info[gun_index].primaryMcuState.cp_state;
 				ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotDuty = (ShmCharger->gun_info[gun_index].primaryMcuState.current_limit>51?(unsigned char)((ShmCharger->gun_info[gun_index].primaryMcuState.current_limit/2.5)+64):(unsigned char)(ShmCharger->gun_info[gun_index].primaryMcuState.current_limit/0.6));
@@ -1887,7 +1939,6 @@ int main(void)
 				tmMcu.tm_sec = ShmCharger->gun_info[gun_index].rtc.sec;
 				mcuTime.time = mktime(&tmMcu);
 
-
 				if(ShmCharger->gun_info[gun_index].bleConfigData.isLogin && !ShmOCPP16Data->OcppConnStatus)
 				{
 					if(abs(DiffTimeb(csuTime, mcuTime)) > 10000)
@@ -2043,7 +2094,7 @@ int main(void)
 				}
 			}
 		}
-		sleep(3);
+		usleep(100000);
 	}
 
 	return FAIL;

+ 2 - 1
EVSE/Projects/BYTON-GB/Apps/Module_InternalComm.h

@@ -1,7 +1,7 @@
 /*
  * Module_InternalComm.h
  *
- *  Created on: 2019Ś~8¤ë28¤é
+ *  Created on: 2019?8?28?
  *      Author: USER
  */
 
@@ -44,6 +44,7 @@ enum MESSAGE_COMMAND
 	CMD_CONFIG_AC_LED = 0x88,
 	CMD_CONFIG_CURRENT_LINIT = 0x89,
 	CMD_CONFIG_MCU_MODE = 0x8A,
+	CMD_CONFIG_GUN_PLUGIN_TIMES = 0x2D,
 
 	CMD_UPDATE_START = 0xe0,
 	CMD_UPDATE_ABOARD = 0xe1,

文件差異過大導致無法顯示
+ 312 - 409
EVSE/Projects/BYTON-GB/Apps/main.c


+ 32 - 2
EVSE/Projects/BYTON-GB/Apps/main.h

@@ -127,6 +127,21 @@
 #define LED_ACTION_DEBUG            	12
 #define LED_ACTION_ALL_OFF          	13
 
+#define START_METHOD_MANUAL 			0
+#define START_METHOD_RFID	 			1
+#define START_METHOD_BACKEND 			2
+#define START_METHOD_BLE	 			3
+
+#define AUTH_MODE_PH_RFID				0
+#define AUTH_MODE_OCPP					1
+#define AUTH_MODE_PH_BACKEND			2
+#define AUTH_MODE_FREEMODE				3
+
+#define OFF_POLICY_LOCALLIST			0
+#define OFF_POLICY_PH_RFID				1
+#define OFF_POLICY_FREEMODE				2
+#define OFF_POLICY_NOCHARGE				3
+
 #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)
@@ -245,14 +260,15 @@ typedef struct AC_PRIMARY_MCU
 {
 	unsigned char cp_state;
 	unsigned int  current_limit;
-	unsigned int  cp_voltage_positive;
-	unsigned int  cp_voltage_negtive;
+	float cp_voltage_positive;
+	float cp_voltage_negtive;
 	unsigned char locker_state;
 	unsigned char relay_state;
 	unsigned char shutter_state;
 	unsigned char meter_state;
 	unsigned char pp_state;
 	unsigned char rating_current;
+	unsigned char rotatory_switch;
 }Ac_Primary_Mcu;
 
 typedef struct AC_PRIMARY_MCU_ALARM
@@ -357,6 +373,18 @@ typedef struct FW_UPGRADE_INFO
 	char location[384];
 }Fw_Upgrade_Info;
 
+typedef struct GUN_PLUGIN_TIMES
+{
+	uint32_t GunPluginTimes;
+
+}Gun_Plugin_Times;
+
+typedef struct INTERNAL_SYSTEM_STATUS
+{
+	unsigned char SystemStatus;
+	unsigned char PreviousSystemStatus;
+}Internal_Sysyem_status;
+
 typedef struct GUN_INFO
 {
 	Ver 											ver;
@@ -376,6 +404,8 @@ typedef struct GUN_INFO
 	Ac_Primary_Mcu_Cp_Pwm_Duty						primaryMcuCp_Pwn_Duty;
 	Other_Alarm_Code								otherAlarmCode;
 	Pilot_Voltage									PilotVoltage;
+	Gun_Plugin_Times								gunPluginTimes;
+	Internal_Sysyem_status							internalSystemStatus;
 }Gun_Info;
 
 struct Charger

部分文件因文件數量過多而無法顯示