Browse Source

1. define.h content update \r\n 2. 4gModem sample code update.

7550 5 years ago
parent
commit
454d9b86b0
2 changed files with 265 additions and 11 deletions
  1. 250 7
      EVSE/Projects/Taurus/Apps/4gModem.c
  2. 15 4
      EVSE/Projects/define.h

+ 250 - 7
EVSE/Projects/Taurus/Apps/4gModem.c

@@ -16,9 +16,16 @@
 #include <sys/timeb.h> 
 #include <netinet/in.h>
 #include <unistd.h>
-#include "../../define.h"
+#include "define.h"
+
+//#define debug		
+#define CheckModemInterval		30	//sec
+#define CheckSimInterval			10 	//sec
+#define CheckConnectionInterval		5 	//sec
+#define DisconnInterval				60 	//sec
+
+
 
-//#define debug
 
 struct SysConfigAndInfo			*ShmSysConfigAndInfo;
 struct StatusCodeData 			*ShmStatusCodeData;
@@ -178,6 +185,134 @@ int InitComPort(unsigned char ModemModel)
 	
 }
 
+void GetModelName(int Fd, unsigned char *ModelName)
+{
+	//AT command processing
+}
+
+void GetModelVersion(int Fd, unsigned char *ModelVersion)
+{
+	//AT command processing
+}
+
+void GetModelImei(int Fd, unsigned char *ModelImei)
+{
+	//AT command processing
+}
+
+void GetSimImsi(int Fd, unsigned char *SimImsi)
+{
+	//AT command processing
+}
+
+unsigned char GetModemMode(int Fd)
+{
+	int Mode;
+	//AT command processing
+	return Mode;
+}
+
+int GetSignalRssi(int Fd)
+{
+	int RssiValue;
+	//AT command processing
+	return RssiValue;
+}
+
+int GetPPP0Info(unsigned char *IPaddress)
+{
+    	int fd,rd=0;
+	unsigned int address;
+	char buf[128],addr[32],*sptr,*eptr;
+	
+
+    	system("ifconfig ppp0 | grep \"inet addr:\" > /mnt/GetPPP0Info");
+	fd = open("/mnt/GetPPP0Info", O_RDONLY);
+    	if(fd<0)
+   	{
+    		system("rm -f /mnt/GetPPP0Info");
+	        return 0;
+    	}
+    
+    	memset(addr,0,sizeof(addr));
+    	memset(buf,0,sizeof(buf));
+    	rd=read(fd,buf,sizeof(buf));	
+    	if(rd<=0)
+    	{
+    		close(fd);
+    		system("rm -f /mnt/GetPPP0Info");
+        	return 0;
+   	}
+    	close(fd);
+    	if((sptr=strstr(buf,"inet addr:"))==NULL)
+    	{
+    		close(fd);
+    		system("rm -f /mnt/GetPPP0Info");
+        	return 0;
+    	}
+    	sptr+=strlen("inet addr:");
+    	if((eptr=strstr(buf,"  P-t-P:"))==NULL)
+    	{
+    		close(fd);
+    		system("rm -f /mnt/GetPPP0Info");
+        	return 0;
+    	}
+    	memset(IPaddress,0,strlen(IPaddress));
+    	strncpy(IPaddress,sptr,eptr-sptr);   
+    	#ifdef SystemLogMessage	
+	{
+		unsigned char Buffer[128];
+		memset(Buffer,0,sizeof(Buffer));
+		sprintf(Buffer,"[4gModem]GetPPP0Info: 4G IP Address = %s",IPaddress);
+		StoreLogMsg(Buffer);
+	}
+	#endif		
+    	return 1;
+}
+int  Load4gConfiguration()
+{
+	unsigned char CopyTmp[128];
+	
+	if(strlen(ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomApn)<=0)
+		return 0;
+	system("cat /dev/null > /root/ppp/auto-apn.conf");
+	system("chmod 777 /root/ppp/auto-apn.conf");  
+	system("cat /dev/null > /etc/ppp/options"); 
+	system("chmod 777 /etc/ppp/options"); 
+	system("cat /dev/null > /etc/ppp/pap-secrets"); 
+	system("chmod 777 /etc/ppp/pap-secrets"); 
+	system("cat /dev/null > /etc/ppp/chap-secrets"); 
+	system("chmod 777 /etc/ppp/chap-secrets"); 
+	memset(CopyTmp,0,sizeof(CopyTmp));
+	sprintf(CopyTmp,"echo \"APN=\"%s\"\" > /root/ppp/auto-apn.conf",ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomApn);
+	system(CopyTmp);
+	system("echo \"ACCOUNT=\" >> /root/ppp/auto-apn.conf");
+	system("echo \"PASSWORD=\" >> /root/ppp/auto-apn.conf");
+	
+	if(strlen(ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomChapPapId)>0)
+	{	
+		memset(CopyTmp,0,sizeof(CopyTmp));
+		sprintf(CopyTmp,"echo \"name %s \" > /etc/ppp/options",ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomChapPapId);
+		system(CopyTmp);
+		
+		memset(CopyTmp,0,sizeof(CopyTmp));
+		sprintf(CopyTmp,"echo \"%s * %s \" > /etc/ppp/pap-secrets",
+		ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomChapPapId,
+		((strlen(ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomChapPapPwd)>0)?ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomChapPapPwd : " "));
+		system(CopyTmp);
+
+		memset(CopyTmp,0,sizeof(CopyTmp));
+		sprintf(CopyTmp,"echo \"%s * %s \" > /etc/ppp/chap-secrets",
+		ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomChapPapId,
+		((strlen(ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomChapPapPwd)>0)?ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomChapPapPwd : " "));
+		system(CopyTmp);
+	}	
+	return 1;
+}
+void ResetModem()
+{
+	//power cycle modem by GPIO
+}
 /**************************************************************/
 /************** main function********************************/
 /*************************************************************/
@@ -185,6 +320,8 @@ int main(int argc,char *argv[])
 {
 	unsigned char ModuleModel=0;//0: None, 1: Qutel, 2: ublox SARA-U201
 	int UsbFd=-1;
+	unsigned int StartTime,EndTime,Tmp; 
+	unsigned char TmpIpAddr[16];
 	
 	//Initialization
 	if(InitShareMemory()==0)
@@ -199,13 +336,20 @@ int main(int argc,char *argv[])
 		sleep(5);
 		return 0;
 	}	
-    
+	ResetModem();
+	
+ReCheckModem:    
+	//ResetModem();
+	UsbFd=-1;
+	ModuleModel=0;
+	Load4gConfiguration();
+
 	while(1)
 	{
 		ModuleModel=Check4GModem();
 		if(ModuleModel<=0)
 		{
-			sleep(30);
+			sleep(CheckModemInterval);
 			continue;
 		}	
 		if(UsbFd>0)
@@ -213,11 +357,110 @@ int main(int argc,char *argv[])
 		UsbFd=InitComPort(ModuleModel);
 		if(UsbFd<0)
 		{
-			sleep(30);
+			sleep(CheckModemInterval);
 			continue;
 		}
-		//processing...
-		
+		/**** Record some modem information and dial up if SIM card ready ****/
+		memset(&ShmSysConfigAndInfo->SysConfig.TelecomInterface,0,sizeof(struct TeleConfigData));
+		while(1)
+		{
+			if(strlen(ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomModelName)<=0)
+				GetModelName(UsbFd,ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomModelName);
+			if(strlen(ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSoftwareVer)<=0)
+				GetModelVersion(UsbFd,ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSoftwareVer);	
+			if(strlen(ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomModemImei)<=0)
+				GetModelImei(UsbFd,ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomModemImei);		
+			GetSimImsi(UsbFd,ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSimImsi);		
+			if(strlen(ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSimImsi)<=0)
+			{	
+				ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSimStatus=0;
+				sleep(CheckSimInterval);	
+				if(Check4GModem()<=0)
+					goto ReCheckModem;
+			}
+			else
+			{
+				ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSimStatus=1;
+				if(strlen(ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomApn)<=0)
+				{
+					sleep(DisconnInterval);
+					goto ReCheckModem;		
+				}
+				system("killall 4GDetection");	
+				sleep(2);
+				if(ModuleModel==1)
+					system("/root/ppp/4GDetection /dev/ttyUSB0 &");	
+				else if(ModuleModel==2)
+					system("/root/ppp/4GDetection /dev/ttyACM0 &");
+				break;	
+			}			
+		}
+		/***** Periodically check RSSI and connection*****/
+		StartTime=time((time_t*)NULL);
+		EndTime=time((time_t*)NULL);
+		while(1)
+		{
+			if((time((time_t*)NULL)-StartTime)>=CheckConnectionInterval)
+			{	
+				//check IP address 
+				memset(TmpIpAddr,0,sizeof(TmpIpAddr));
+				if(GetPPP0Info(TmpIpAddr)<=0)
+				{
+					ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomNetworkConn=0;
+					if((time((time_t*)NULL)-EndTime)>=DisconnInterval)
+						goto ReCheckModem; 
+				}	
+				else
+				{
+					ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomNetworkConn=1;
+					if(strstr(ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomIpAddress,TmpIpAddr)==NULL)
+					{
+						#ifdef SystemLogMessage	
+						{
+							unsigned char Buffer[128];
+							memset(Buffer,0,sizeof(Buffer));
+							sprintf(Buffer,"[4gModem]main:  4G IP Address changed from %s to %s",ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomIpAddress,TmpIpAddr);
+							StoreLogMsg(Buffer);
+						}
+						#endif		
+						memset(ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomIpAddress,0,sizeof(ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomIpAddress));
+						strcpy(ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomIpAddress,TmpIpAddr);
+						system("route del default");
+						system("route add default dev ppp0");
+					}
+					EndTime=time((time_t*)NULL);
+				}	
+				//check RSSI
+				Tmp=GetSignalRssi(UsbFd);
+				if(abs(Tmp-ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomRssi)>=5)
+				{
+					#ifdef SystemLogMessage	
+					{
+						unsigned char Buffer[128];
+						memset(Buffer,0,sizeof(Buffer));
+						sprintf(Buffer,"[4gModem]main: RSSI changed from %d to %d",ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomRssi,Tmp);
+						StoreLogMsg(Buffer);
+					}
+					#endif		
+					ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomRssi=Tmp;
+				}	
+				//check Mode
+				Tmp=GetModemMode(UsbFd);
+				if(Tmp!=ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomModemMode)
+				{
+					#ifdef SystemLogMessage	
+					{
+						unsigned char Buffer[128];
+						memset(Buffer,0,sizeof(Buffer));
+						sprintf(Buffer,"[4gModem]main: Modem mode changed from %d to %d",ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomModemMode,Tmp);
+						StoreLogMsg(Buffer);
+					}
+					#endif
+					ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomModemMode=Tmp;
+				}	
+				StartTime=time((time_t*)NULL);
+			}
+		}
 	}//main while loop
 }
 

+ 15 - 4
EVSE/Projects/define.h

@@ -85,10 +85,13 @@ struct WifiConfigData
 	unsigned char		WifiIpAddress[16];			//default:192.168.2.10		
 	unsigned char		WifiSubmaskAddress[16];		//default:255.255.255.0			
 	unsigned char		WifiGatewayAddress[16];	//default:192.168.2.254	
+	unsigned char 		WifiNetworkConn;			//0: disconnected, 1: connected		
 };
 
 struct TeleConfigData 
 {	
+	unsigned char		TelcomModelName[64];		//default: Null		
+	unsigned char		TelcomSoftwareVer[64];		//default: Null		
 	unsigned char		TelcomApn[256];			//default: Null		
 	int				TelcomRssi;				//dbm	
 	unsigned char		TelcomChapPapId[256];		//default: Null		
@@ -97,7 +100,8 @@ struct TeleConfigData
 	unsigned char		TelcomSimImsi[16];			//default: Null			
 	unsigned char		TelcomSimStatus;			//0: no SIM card is found, 1: valid SIM card, 2: invalid SIM card	
 	unsigned char		TelcomModemMode;		//0: No services, 1: CDMA, 2: GSM/GPRS, 3: WCDMA, 4: GSM/WCDMA, 5: TD_SCDMA mode, 6: Unknow
-	unsigned char		TelcomIpAddress[16];		//default: Null			
+	unsigned char		TelcomIpAddress[16];		//default: Null		
+	unsigned char 		TelcomNetworkConn;		//0: disconnected, 1: connected		
 };
 
 struct SysConfigData 
@@ -141,7 +145,10 @@ struct SysConfigData
 
 struct ChargingInfoData 
 {
-	int 				CurrentLimit;				//0: rating value, 1 ~ RATED_CURRENT	amp"	
+	unsigned char		SystemStatus;				//0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault		
+	float				MaximumChargingVoltage;	//0~6553.5 volt
+	float				AvailableChargingCurrent;	//0~6553.5 amp		
+	float				AvailableChargingPower;	//0~6553.5 kW		
 	float				PresentChargingVoltage	;	//0~6553.5 volt
 	float				PresentChargingCurrent;		//0~6553.5 amp		
 	float				PresentChargingPower;		//0~6553.5 kW		
@@ -151,12 +158,15 @@ struct ChargingInfoData
 	float				EvBatteryMaxVoltage;		// 0~6553.5 volt				
 	float				EvBatterytargetVoltage;		// 0~6553.5 volt				
 	int				EvBatterySoc;				// 0~100%		
+	unsigned char 		ConnectorPlugIn;			//0: unplug, 1: Plug-in	
+	float 			PilotVoltage;				
+	unsigned char 		PilotState;				//1:state A, 2:State B1, 3:State B2, 4:State C, 5:State D, 6:State E, 7:State F, 8: Pilot error
+	unsigned char 		PilotDuty;					// 0~100%		
 };
 
 struct SysInfoData 
 {
-	/**************System***************/
-	unsigned char		SystemStatus;				//0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault		
+	/**************System***************/	
 	unsigned char		FactoryConfiguration;		//0: normal, 1: trigger, charger will return the configuration to factory default if trigger
 	float 			InputVoltageR;			//0~655.35 volt		
 	float 			InputVoltageS;				//0~655.35 volt		
@@ -2209,6 +2219,7 @@ struct V2GMessageType_ISO15118_2018
 
 struct CcsData 
 {
+	unsigned char 							CommProtocol;	// 1: V2GMessage_DIN70121, 2:V2GMessage_ISO15118_2014, 3:V2GMessage_ISO15118_2018
 	struct V2GMessageType_DIN70121			V2GMessage_DIN70121[CCS_QUANTITY];
 	struct V2GMessageType_ISO15118_2014  		V2GMessage_ISO15118_2014[CCS_QUANTITY];
 	struct V2GMessageType_ISO15118_2018  		V2GMessage_ISO15118_2018[CCS_QUANTITY];