浏览代码

[Improve][AW-CCS / AX80][Module_CCS / Module_LcmControl]

2022.01.12 / Folus Wen

Actions:
1. SeccComm & CsuComm CPU utilization issue fix.
2. Module_LcmControl include JSON-C 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 年之前
父节点
当前提交
22f7a13c28

+ 1 - 0
EVSE/Projects/AW-CCS/Apps/CCS/CsuComm.c

@@ -3328,6 +3328,7 @@ int CsuCommAC_Proc()
     while(1)
     {
         CsuCommAC_SHM_Rx_Update();
+	usleep(100000);
     }
 }
 #endif

+ 2 - 1
EVSE/Projects/AW-CCS/Apps/CCS/SeccComm.c

@@ -1477,6 +1477,7 @@ void CP_Detection()
 
         #if ((CCS_ENERGY_TRANSFER_MODE == MODE_AC_SINGLE_PHASE_CORE) || (CCS_ENERGY_TRANSFER_MODE == MODE_AC_THREE_PHASE_CORE))
         {
+	    usleep(100000);
             ccs->CpVoltage = ShmInternalComm->AC_CpPositiveVoltage;
             ccs->CpState = ShmInternalComm->AC_CpPresentState;
         }
@@ -2043,7 +2044,7 @@ void Error_Monitor()
             Update_V2G_Flow_Status(Other_Fault);
             End_Process();
         }
-
+	usleep(100000);
     }//while
 }
 

+ 1 - 1
EVSE/Projects/AW-CCS/Apps/Makefile

@@ -105,7 +105,7 @@ Module_CCS_Task:
 Module_LcmControl_Task:
 	@echo "===== Module_LcmControl_Task ==================================="
 	rm -f Module_LcmControl
-	$(CC) -D $(Project) "-I../../../Modularization/ocppfiles/" "-I./" "-I../../" -O0  -Wall -fmessage-length=0 LCM/lcmComm_dgus.c LCM/Module_LcmControl.c LCM/cbmp.c -lrt -o Module_LcmControl
+	$(CC) -D $(Project) "-I../../../Modularization/ocppfiles/" "-I./" "-I../../" "-include../../../GPL/json-c-json-c-0.13.1-20180305/release/include/json-c/json.h" -O0  -Wall -fmessage-length=0 LCM/lcmComm_dgus.c LCM/Module_LcmControl.c LCM/cbmp.c -lrt ${Lib_JSONC} -o Module_LcmControl
 	rm -f *.o	
 	mv -f Module_LcmControl ../Images/root
 

+ 17 - 9
EVSE/Projects/AW-CCS/Apps/main.c

@@ -2297,7 +2297,7 @@ int LoadSysConfigAndInfo(struct SysConfigData *ptr)
 		if(ShmSysConfigAndInfo->SysConfig.ModelName[7+idx] == '7')
 			ShmCharger->isCcsEnable = ON;
 	}
-         #ifdef ENABLE_CCS
+        #ifdef ENABLE_CCS
 	ShmCharger->isCcsEnable = ON;
 	#endif
 	RatedCurrentParsing((char*)ShmSysConfigAndInfo->SysConfig.ModelName, &modelnameInfo);
@@ -2675,14 +2675,6 @@ int SpawnTask(uint8_t gun_index)
 		system ("/root/Module_Speaker &");
 		system ("/root/Module_ProduceUtils &");
 		system ("/root/Module_LcmControl &");
-		/*+++Vern, for CCS +++*/
-		if(ShmCharger->isCcsEnable == ON)
-		{	
-			system ("/root/CsuComm &");
-			sleep(3);
-			system ("/root/SeccComm &");
-		}
-		/*---Vern, for CCS ---*/
 	}
 
 	return PASS;
@@ -4042,6 +4034,22 @@ void checkTask()
 		DEBUG_INFO("Module_PowerSharing not running, restart it.\n");
 		system ("/root/Module_PowerSharing &");
 	}
+
+	if(ShmCharger->isCcsEnable == ON)
+        {
+                if((system("pidof -s CsuComm > /dev/null") != 0))
+                {
+                        DEBUG_INFO("CsuComm not running, restart it.\n");
+                        system ("/root/CsuComm &");
+                }
+ 
+                if((system("pidof -s SeccComm > /dev/null") != 0))
+                {
+                        sleep(3);
+                        DEBUG_INFO("SeccComm not running, restart it.\n");
+                        system ("/root/SeccComm &");
+                }
+        }
 }
 
 void checkConnectionTimeout()

+ 1 - 0
EVSE/Projects/AX80/Apps/CCS/CsuComm.c

@@ -3328,6 +3328,7 @@ int CsuCommAC_Proc()
     while(1)
     {
         CsuCommAC_SHM_Rx_Update();
+        usleep(100000);
     }
 }
 #endif

+ 9 - 9
EVSE/Projects/AX80/Apps/CCS/SeccComm.c

@@ -58,7 +58,7 @@ struct appHandEXIDocument ccs_handshake;
 struct dinEXIDocument ccs_exi_doc_DIN;
 struct iso1EXIDocument ccs_exi_doc_ISO1;
 struct iso2EXIDocument ccs_exi_doc_ISO2;
-unsigned char V2GTP_Tx_buf[V2GTP_MSG_TX_BUFFER_SIZE];   //64*1024 ﺿ65,536 = 65.5KB
+unsigned char V2GTP_Tx_buf[V2GTP_MSG_TX_BUFFER_SIZE];   //64*1024 嚘�65,536 = 65.5KB
 unsigned char buf_log_evcomm[SIZE_OF_LOG_BUFFER];
 unsigned char buf_log_evcomm_fork1[SIZE_OF_LOG_BUFFER];
 unsigned char buf_log_evcomm_fork2[SIZE_OF_LOG_BUFFER];
@@ -1477,6 +1477,7 @@ void CP_Detection()
 
         #if ((CCS_ENERGY_TRANSFER_MODE == MODE_AC_SINGLE_PHASE_CORE) || (CCS_ENERGY_TRANSFER_MODE == MODE_AC_THREE_PHASE_CORE))
         {
+        	usleep(10000);
             ccs->CpVoltage = ShmInternalComm->AC_CpPositiveVoltage;
             ccs->CpState = ShmInternalComm->AC_CpPresentState;
         }
@@ -1725,7 +1726,6 @@ void PP_Detection()
                 EVCOMM_SYS_INFO.PpVoltage_pre = EVCOMM_SYS_INFO.PpVoltage;
             }
         }
-
         #if 0
         sleep(5);
         printf("V_pp = %.02f\n", TotalTmpVolt);
@@ -2043,7 +2043,7 @@ void Error_Monitor()
             Update_V2G_Flow_Status(Other_Fault);
             End_Process();
         }
-
+        usleep(100000);
     }//while
 }
 
@@ -2070,12 +2070,12 @@ int SendSetKey()
     SendMmePacket.MMTYPE = MMTYPE_CM_SET_KEY_REQ;
     SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
     SendMmePacketSize = 0;
-    SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x01;//Fixed value (0x01) to indicate ��NMK��
+    SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x01;//Fixed value (0x01) to indicate 嚙踝蕭NMK嚙踝蕭
     memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,4);//My Nonce, Fixed value(0x00000000), encrypted payload not used
     SendMmePacketSize+=4;
     memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,4);//Your Nonce, Fixed value(0x00000000), encrypted payload not used
     SendMmePacketSize+=4;
-    SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x04;//PID, Fixed value (0x04) to indicate ��HLE protocol��
+    SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x04;//PID, Fixed value (0x04) to indicate 嚙踝蕭HLE protocol嚙踝蕭
     memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,2);//PRN, Fixed value(0x00), encrypted payload not used
     SendMmePacketSize+=2;
     SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x00;//PMN, Fixed value(0x00) encrypted payload not used
@@ -2107,7 +2107,7 @@ int SendSetKey()
     HPAVKeyNID(Nid,NewNmkKey,DEFAULT_LEVEL);
     memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,Nid,sizeof(Nid));    //NID, 54 LSBs contain the NID 2 MSBs = 0b00
     SendMmePacketSize+=sizeof(Nid);
-    SendMmePacket.MMENTRY[SendMmePacketSize++]=0x01;//NewEKS,Fixed value (0x01)to indicate ��NMK��
+    SendMmePacket.MMENTRY[SendMmePacketSize++]=0x01;//NewEKS,Fixed value (0x01)to indicate 嚙踝蕭NMK嚙踝蕭
     memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,NewNmkKey,sizeof(NewNmkKey));//NewKey
     SendMmePacketSize += sizeof(NewNmkKey);
     SendMmePacketSize += 19;  //the size before MMENTRY
@@ -3256,9 +3256,9 @@ int MmeProcess(unsigned char *Buffer, int DataLength)
 	        #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
 	        {
 	            DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_VALIDATE_REQ ---\n");
-	            DEBUG_PRINTF_EVCOMM_DETAIL("Signal Type: 0x%x\n", MmePacket->MMENTRY[0]);    //Fixed value (0x00) to indicate ��PEV S2 toggles on control pilot line��
+	            DEBUG_PRINTF_EVCOMM_DETAIL("Signal Type: 0x%x\n", MmePacket->MMENTRY[0]);    //Fixed value (0x00) to indicate 嚙踝蕭PEV S2 toggles on control pilot line嚙踝蕭
 	            DEBUG_PRINTF_EVCOMM_DETAIL("Timer: 0x%x\n", MmePacket->MMENTRY[1]);    //Fixed value In the first VALIDATE Request-Response exchange, the Timer field shall be set to zero.
-	            DEBUG_PRINTF_EVCOMM_DETAIL("Result: 0x%x\n", MmePacket->MMENTRY[2]);    //Fixed value In the first VALIDATE Request-Response exchange, the Result field shall be set to 0x01 = ��ready��.
+	            DEBUG_PRINTF_EVCOMM_DETAIL("Result: 0x%x\n", MmePacket->MMENTRY[2]);    //Fixed value In the first VALIDATE Request-Response exchange, the Result field shall be set to 0x01 = 嚙踝蕭ready嚙踝蕭.
 	        }
 	        #endif
 	
@@ -3404,7 +3404,7 @@ int MmeProcess(unsigned char *Buffer, int DataLength)
 	                    }
 	                    if(DiffTimeb(SeqStartTime, SeqEndTime) >= (SendMmePacket.MMENTRY[1]*100 + 100))
 	                    {
-	                        SendMmePacket.MMENTRY[SendMmePacketSize++] = 0;    //Fixed value to indicate ��PEV S2 toggles on control pilot line��
+	                        SendMmePacket.MMENTRY[SendMmePacketSize++] = 0;    //Fixed value to indicate 嚙踝蕭PEV S2 toggles on control pilot line嚙踝蕭
 	                        SendMmePacket.MMENTRY[SendMmePacketSize++] = ToggleNum;
 	                        #if (SUPPORT_BCB_TOGGLE_FUNCTION == ENABLE)
 	                        SendMmePacket.MMENTRY[SendMmePacketSize++] = 2;    //0x02 = Success

+ 1 - 1
EVSE/Projects/AX80/Apps/CCS/define.h

@@ -50,7 +50,7 @@
 /**************************************************************************************/
 /*********************************System Limitation**********************************/
 /**************************************************************************************/
-#ifdef AWCCS
+#ifdef AX80
 #undef CONNECTOR_TEMP_DETECTION
 #define CCS_ENERGY_TRANSFER_MODE                    MODE_AC_SINGLE_PHASE_CORE //MODE_AC_THREE_PHASE_CORE
 #else

+ 41 - 42
EVSE/Projects/AX80/Apps/LCM/Module_LcmControl.c

@@ -2,9 +2,9 @@
  * Module_LcmControl.c
  *
  * Created on : 2020-10-20
- * Update on : 2022-01-07
+ * Update on : 2021-12-24
  * Author : Folus Wen, Eason Yang
- * Version : V0.26
+ * Version : V0.25
  *
  */
 
@@ -102,6 +102,8 @@ struct timespec					startTime[AC_QUANTITY][TMR_IDX_SHOW_AUTH_RESULT];
 #define TIME_AUTH_RESULT_TIME			5 // Unit: Second
 #define TIME_REFRESH_INFO				3 // Unit: Second
 
+#define is_error(ptr) 					((unsigned long)ptr > (unsigned long)-4000L)
+
 //=======================================
 // Declare Variable
 //=======================================
@@ -114,7 +116,7 @@ int Uart1Fd;
 //=======================================
 // Record version and date
 //=======================================
-char *FIRMWARE_UPDATE_IMAGE[3] = {"V0.26", "2022-01-07", "REV.02.00"};
+char *FIRMWARE_UPDATE_IMAGE[3] = {"V0.25", "2021-12-24", "REV.02.00"};
 
 //=======================================
 // Common routine
@@ -272,7 +274,7 @@ void getDateTimeString(char* result)
 	CurrentTime = time(NULL);
 	tm=localtime(&CurrentTime);
 
-	sprintf(result, "%04d/%02d/%02d %02d:%02d", tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min);
+	sprintf(result, "%04d/%02d/%02d %02d:%02d %s", tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,(tm->tm_hour%12),tm->tm_min,((tm->tm_hour/12)>0?"p.m":"a.m"));
 }
 
 //======================================================
@@ -1310,14 +1312,12 @@ void setDefaultPrice(uint8_t type)
 //=======================================
 void setFinalCost(uint8_t gun_index, uint8_t type)
 {
-	uint8_t length;
 	uint8_t output_data[32];
 	char input_data[32];
 	char tmp[256];
-	char *splitString[10];
-	const char *Symbol = ";";
 	unsigned char cost_empty[32];
 	unsigned char balance_empty[32];
+	json_object *jsonDescription;
 
 	memset(tmp, 0, ARRAY_SIZE(tmp));
 	memset(output_data, 0x00, ARRAY_SIZE(output_data));
@@ -1344,28 +1344,31 @@ void setFinalCost(uint8_t gun_index, uint8_t type)
 			}
 			else
 			{
-				if((strstr((char*)ShmOCPP16Data->Cost.FinalCost[gun_index].description, "Total Cost:") > 0))
-				{
-					// APPEAR COST ICON
-					setDisplayValue(ICON_CHARGING_COST, APPEAR);
+				double totalCost = 0;
+				jsonDescription = json_tokener_parse((char*)ShmOCPP16Data->Cost.FinalCost[gun_index].description);
 
-					// APPEAR COST TEXT
-					strcpy((char*)tmp,(char*)ShmOCPP16Data->Cost.FinalCost[gun_index].description);
-					split((char**)splitString, tmp, Symbol);
-					memcpy(input_data, splitString[3], strlen(splitString[3]));
-					length = strlen(input_data);
-					trim_string(input_data,length);
-					memcpy(output_data ,input_data, strlen(input_data));
-					lcdRegisterWrite(Uart1Fd, REG_TYPE_RAM, TEXT_CHARGING_COST, output_data, ARRAY_SIZE(output_data));
-				}
-				else
+				if(!is_error(jsonDescription))
 				{
-					setDisplayValue(ICON_CHARGING_COST, APPEAR);
+					if(json_object_object_get(jsonDescription,"chargingFee") != NULL)
+					{
+						totalCost += json_object_get_double(json_object_object_get(jsonDescription,"chargingFee"));
+					}
+
+					if(json_object_object_get(jsonDescription,"parkingFee") != NULL)
+					{
+						totalCost += json_object_get_double(json_object_object_get(jsonDescription,"parkingFee"));
+					}
 
-					strcpy((char*)cost_empty, "-----");
-					string2ByteArray(cost_empty, output_data);
+					if(totalCost > 0)
+						sprintf((char*)output_data, "$ %.2f", totalCost);
+					else
+						sprintf((char*)output_data, "-----");
+
+					// APPEAR COST ICON
+					setDisplayValue(ICON_CHARGING_COST, APPEAR);
 					lcdRegisterWrite(Uart1Fd, REG_TYPE_RAM, TEXT_CHARGING_COST, output_data, ARRAY_SIZE(output_data));
 				}
+				json_object_put(jsonDescription);
 			}
 			break;
 		case ACCOUNT_BALANCE:
@@ -1380,29 +1383,26 @@ void setFinalCost(uint8_t gun_index, uint8_t type)
 			}
 			else
 			{
-				if((strstr((char*)ShmOCPP16Data->Cost.FinalCost[gun_index].description, "Account Balance:") > 0))
-				{
-					// APPEAR BALANCE ICON
-					setDisplayValue(ICON_COMPLETE_WALLET, APPEAR);
+				double accountBalance = 0;
+				jsonDescription = json_tokener_parse((char*)ShmOCPP16Data->Cost.FinalCost[gun_index].description);
 
-					// APPEAR BALANCE TEXT
-					strcpy((char*)tmp,(char*)ShmOCPP16Data->Cost.FinalCost[gun_index].description);
-					split((char**)splitString, tmp, Symbol);
-					memcpy(input_data, splitString[4], strlen(splitString[4]));
-					length = strlen(input_data);
-					trim_string(input_data,length);
-					memcpy(output_data ,input_data, strlen(input_data));
-					lcdRegisterWrite(Uart1Fd, REG_TYPE_RAM, TEXT_REMAINING_ACCOUNT_BALANCE, output_data, ARRAY_SIZE(output_data));
-				}
-				else
+				if(!is_error(jsonDescription))
 				{
-					setDisplayValue(ICON_COMPLETE_WALLET, APPEAR);
+					if(json_object_object_get(jsonDescription,"accountBalance") != NULL)
+					{
+						accountBalance += json_object_get_double(json_object_object_get(jsonDescription,"chargingFee"));
+					}
 
-					strcpy((char*)balance_empty, "-----");
-					string2ByteArray(balance_empty, output_data);
+					if(accountBalance > 0)
+						sprintf((char*)output_data, "$ %.2f", accountBalance);
+					else
+						sprintf((char*)output_data, "-----");
 
+					// APPEAR COST ICON
+					setDisplayValue(ICON_COMPLETE_WALLET, APPEAR);
 					lcdRegisterWrite(Uart1Fd, REG_TYPE_RAM, TEXT_REMAINING_ACCOUNT_BALANCE, output_data, ARRAY_SIZE(output_data));
 				}
+				json_object_put(jsonDescription);
 			}
 			break;
 		default:
@@ -2656,7 +2656,6 @@ int main(void)
 			else
 			{
 				refreshStartTimer(&startTime[ShmCharger->gun_selectd][TMR_IDX_SHOW_AUTH_RESULT]);
-				ShmCharger->gun_info[ShmCharger->gun_selectd].isHandshakeTimerRefresh = NO;
 
 				switch(ShmSysConfigAndInfo->SysInfo.AcChargingData[ShmCharger->gun_selectd].SystemStatus)
 				{

+ 1 - 1
EVSE/Projects/AX80/Apps/Makefile

@@ -97,7 +97,7 @@ Module_Speaker_Task:
 Module_LcmControl_Task:
 	@echo "===== Module_LcmControl_Task ==================================="
 	rm -f Module_LcmControl
-	$(CC) -D $(Project) "-I../../../Modularization/ocppfiles/" "-I./" "-I../../" -O0  -Wall -fmessage-length=0 LCM/lcmComm_dgus.c LCM/Module_LcmControl.c LCM/cbmp.c -lrt -o Module_LcmControl
+	$(CC) -D $(Project) "-I../../../Modularization/ocppfiles/" "-I./" "-I../../" "-include../../../GPL/json-c-json-c-0.13.1-20180305/release/include/json-c/json.h" -O0  -Wall -fmessage-length=0 LCM/lcmComm_dgus.c LCM/Module_LcmControl.c LCM/cbmp.c -lrt ${Lib_JSONC} -o Module_LcmControl
 	rm -f *.o	
 	mv -f Module_LcmControl ../Images/root
 

+ 17 - 7
EVSE/Projects/AX80/Apps/main.c

@@ -2798,13 +2798,6 @@ int SpawnTask()
 	system ("/root/Module_Cabinet &");
 	system ("/root/Module_Dispenser &");
 
-	if(ShmCharger->isCcsEnable == ON)
-	{
-		system ("/root/CsuComm &");
-		sleep(3);
-		system ("/root/SeccComm &");
-	}
-
 	return PASS;
 }
 
@@ -4120,6 +4113,23 @@ void checkTask()
 		DEBUG_INFO("Module_Dispenser not running, restart it.\n");
 		system ("/root/Module_Dispenser &");
 	}
+
+	if(ShmCharger->isCcsEnable == ON)
+	{
+		if((system("pidof -s CsuComm > /dev/null") != 0))
+		{
+			DEBUG_INFO("CsuComm not running, restart it.\n");
+			system ("/root/CsuComm &");
+		}
+
+		if((system("pidof -s SeccComm > /dev/null") != 0))
+		{
+			sleep(3);
+			DEBUG_INFO("SeccComm not running, restart it.\n");
+			system ("/root/SeccComm &");
+		}
+	}
+
 }
 
 void checkConnectionTimeout()