Эх сурвалжийг харах

[Improve][Modularization][Module_Upgrade]

2020.11.20 / Folus Wen

Actions:
1. EVSE/Modularization/Module_Upgrade.c UART function add delay 1 second before retry.
2. EVSE/Modularization/Module_Upgrade.c UART function prevent message length over buffer size.

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 4 жил өмнө
parent
commit
ddc5a49457

+ 43 - 17
EVSE/Modularization/Module_Upgrade.c

@@ -19,6 +19,8 @@
 #define ARRAY_SIZE(A)       (sizeof(A) / sizeof(A[0]))
 #define PASS                1
 #define FAIL                -1
+#define	YES					1
+#define	NO					0
 
 struct SysConfigAndInfo         *ShmSysConfigAndInfo;
 struct StatusCodeData           *ShmStatusCodeData;
@@ -444,14 +446,35 @@ int Upgrade_Flash(unsigned int Type,char *SourcePath,char *ModelName)
 //================================================
 // UART update function
 //================================================
+void displayMessage(uint8_t *data, uint16_t len, uint8_t isRX)
+{
+	uint8_t output[8192];
+
+	memset(output, 0x00, ARRAY_SIZE(output));
+	sprintf((char*)output, "%s", (isRX?"RX: ":"TX: "));
+	for(uint16_t idx = 0;idx<len;idx++)
+	{
+		sprintf((char*)output, "%s%02x ", output, data[idx]);
+	}
+
+	DEBUG_INFO("%s\n", output);
+}
+
 int uart_tranceive(int fd, unsigned char* cmd, unsigned char* rx, int len, unsigned char needErase)
 {
 	uint16_t rxLen = 0;
 
     tcflush(fd,TCIOFLUSH);
+    //displayMessage(cmd, 6, NO);
     if(write(fd, cmd, len) >= len)
     {
-    	rxLen = read(fd, rx, 9);
+    	rxLen = read(fd, rx, 8);
+
+    	/*
+    	if(rxLen > 0)
+			displayMessage(rx, rxLen, YES);
+		else
+			DEBUG_INFO("RX: NULL\n");*/
     }
     else
     {
@@ -465,22 +488,22 @@ unsigned char uart_update_start(unsigned char fd, unsigned char targetAddr, unsi
 {
     unsigned char result = FAIL;
     unsigned char tx[11] = {0xaa, 0x00, targetAddr, UART_CMD_UPDATE_START, 0x04, 0x00, (crc32>>0)&0xff, (crc32>>8)&0xff, (crc32>>16)&0xff, (crc32>>24)&0xff, 0x00};
-    unsigned char rx[512];
+    unsigned char rx[8] = {0};
     unsigned char chksum = 0x00;
 
     for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++)
         chksum ^= tx[6+idx];
     tx[10] = chksum;
 
-    if(uart_tranceive(fd, tx, rx, 11, 0x01) >0)
+    if(uart_tranceive(fd, tx, rx, 11, 0x01) >= 8)
     {
         chksum = 0x00;
-        for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
+        for(int idx=0;idx<((rx[4] | rx[5]<<8)>1?1:(rx[4] | rx[5]<<8));idx++)
         {
             chksum ^= rx[6+idx];
         }
 
-        if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
+        if((chksum == rx[6+((rx[4] | rx[5]<<8)>1?1:(rx[4] | rx[5]<<8))]) &&
            (rx[2] == tx[1]) &&
            (rx[1] == tx[2]) &&
            (rx[3] == tx[3]) &&
@@ -506,18 +529,18 @@ unsigned char uart_update_abord(unsigned char fd, unsigned char targetAddr)
 {
     unsigned char result = FAIL;
     unsigned char tx[7] = {0xaa, 0x00, targetAddr, UART_CMD_UPDATE_ABORD, 0x00, 0x00, 0x00};
-    unsigned char rx[512];
+    unsigned char rx[8] = {0};
     unsigned char chksum = 0x00;
 
 
-    if(uart_tranceive(fd, tx, rx, 7, 0x00) >0)
+    if(uart_tranceive(fd, tx, rx, 7, 0x00) >= 8)
     {
-        for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
+        for(int idx=0;idx<((rx[4] | rx[5]<<8)>1?1:(rx[4] | rx[5]<<8));idx++)
         {
             chksum ^= rx[6+idx];
         }
 
-        if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
+        if((chksum == rx[6+((rx[4] | rx[5]<<8)>1?1:(rx[4] | rx[5]<<8))]) &&
            (rx[2] == tx[1]) &&
            (rx[1] == tx[2]) &&
            (rx[3] == tx[3]) &&
@@ -543,7 +566,7 @@ unsigned char uart_update_transfer(unsigned char fd, unsigned char targetAddr, u
 {
     unsigned char result = FAIL;
     unsigned char tx[11 + length];
-    unsigned char rx[512];
+    unsigned char rx[8] = {0};
     unsigned char chksum = 0x00;
 
     tx[0] = 0xaa;
@@ -562,15 +585,15 @@ unsigned char uart_update_transfer(unsigned char fd, unsigned char targetAddr, u
         chksum ^= tx[6+idx];
     tx[sizeof(tx)-1] = chksum;
 
-    if(uart_tranceive(fd, tx, rx, 11 + length,0x00) >0)
+    if(uart_tranceive(fd, tx, rx, (11 + length), 0x00) >= 8)
     {
         chksum = 0;
-        for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
+        for(int idx=0;idx<((rx[4] | rx[5]<<8)>1?1:(rx[4] | rx[5]<<8));idx++)
         {
             chksum ^= rx[6+idx];
         }
 
-        if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
+        if((chksum == rx[6+((rx[4] | rx[5]<<8)>1?1:(rx[4] | rx[5]<<8))]) &&
            (rx[2] == tx[1]) &&
            (rx[1] == tx[2]) &&
            (rx[3] == tx[3]) &&
@@ -591,18 +614,18 @@ unsigned char uart_update_finish(unsigned char fd, unsigned char targetAddr)
 {
     unsigned char result = FAIL;
     unsigned char tx[7] = {0xaa, 0x00, targetAddr, UART_CMD_UPDATE_FINISH, 0x00, 0x00, 0x00};
-    unsigned char rx[512];
+    unsigned char rx[8] = {0};
     unsigned char chksum = 0x00;
 
 
-    if(uart_tranceive(fd, tx, rx, 7,0x00) >0)
+    if(uart_tranceive(fd, tx, rx, 7, 0x00) >= 8)
     {
-        for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
+        for(int idx=0;idx<((rx[4] | rx[5]<<8)>1?1:(rx[4] | rx[5]<<8));idx++)
         {
             chksum ^= rx[6+idx];
         }
 
-        if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
+        if((chksum == rx[6+((rx[4] | rx[5]<<8)>1?1:(rx[4] | rx[5]<<8))]) &&
            (rx[2] == tx[1]) &&
            (rx[1] == tx[2]) &&
            (rx[3] == tx[3]) &&
@@ -705,6 +728,7 @@ int Upgrade_UART(int uartfdOrd,unsigned int Type,unsigned char TargetAddr,char *
                             else
                             {
                                 DEBUG_WARN("Data transfer fail, retry %d \n", ++CNT_Fail);
+                                sleep(1);
                             }
                         }while(DataLength-(CNT_Trans*1024)>0 && CNT_Fail<10);
 
@@ -712,10 +736,12 @@ int Upgrade_UART(int uartfdOrd,unsigned int Type,unsigned char TargetAddr,char *
                         {
                             uart_update_abord(uartfd, TargetAddr);
                             DEBUG_ERROR("UART upgrade retry > limits, aboard upgrade.\n");
+                            printf("UART upgrade retry > limits, aboard upgrade.\n");
                         }
                         else if(uart_update_finish(uartfd, TargetAddr)==PASS)
                         {
                             result = PASS;
+                            printf("UART upgrade success.\n");
                         }
                     }
                     else