Kaynağa Gözat

Merge branch 'V2-V2300' into V2版本-GY电池

# Conflicts:
#	inc/app.h
CHENJIE-PC\QiXiang_CHENJIE 3 yıl önce
ebeveyn
işleme
f709033b36
16 değiştirilmiş dosya ile 546 ekleme ve 172 silme
  1. 3 1
      ARMCC/Makefile
  2. 6 6
      inc/Signal.h
  3. 5 1
      inc/TcpTask.h
  4. 1 0
      inc/app.h
  5. 132 0
      inc/app.h.orig
  6. 11 0
      src/CANEncode.c
  7. 2 0
      src/CANTask.c
  8. 1 1
      src/Fota.c
  9. 36 3
      src/GpsTask.c
  10. 9 8
      src/MainTask.c
  11. 16 15
      src/Signal.c
  12. 83 33
      src/TcpTask.c
  13. 146 47
      src/UartTask.c
  14. 63 22
      src/bsp_custom.c
  15. 18 19
      src/hal_module_adapter.c
  16. 14 16
      src/sensor.c

+ 3 - 1
ARMCC/Makefile

@@ -10,7 +10,6 @@ THIRDPARTY_WAKAAMA_ENABLE   = n
 THIRDPARTY_ERCOAP_ENABLE    = y
 THIRDPARTY_TINYDTLS_ENABLE  = y
 THIRDPARTY_MBEDTLS_ENABLE   = y
-
 CFLAGS_INC        +=  -I ../inc
 
 
@@ -30,3 +29,6 @@ obj-y             += PLAT/project/$(TARGET)/apps/qx_app/src/app.o \
 					PLAT/project/$(TARGET)/apps/qx_app/src/sensor.o
 
 include $(TOP)/PLAT/tools/scripts/Makefile.rules
+
+#enable wdt
+CFLAGS += -DWDT_FEATURE_ENABLE=1

+ 6 - 6
inc/Signal.h

@@ -1,6 +1,6 @@
 #include "commontypedef.h"
 #include "cmsis_os2.h"
-extern	UINT16	COMOutTable[28];
+extern	UINT16	COMOutTable[29];
 //declear the UINT8 vars
 extern	UINT8	battCellTemp[8];
 extern	UINT8	MOSTemp;
@@ -28,10 +28,10 @@ extern	UINT8	reservedSignal5;
 extern	UINT8	reservedSignal6;
 extern	UINT8	reservedSignal7;
 extern	UINT8	reservedSignal8;
-
-
-
-
+extern  UINT8   RelayControlState;
+extern  UINT8	BuzzerControl;
+extern  UINT8   CanMsgFlag;
+extern  UINT8	VibrationStatus;
 //declear the UINT16 vars
 extern	UINT16	battCellU[28];
 extern	UINT16	minCellVol;
@@ -39,7 +39,7 @@ extern	UINT16	maxCellVol;
 extern	UINT16	battPackVol;
 extern	UINT16	battI;
 extern	UINT16	nbHwVersion;
-
+extern  INT16 xzyDataSend[3]; 
 extern UINT8 Lockstatus;
 extern UINT8 Error_count;
 

+ 5 - 1
inc/TcpTask.h

@@ -104,7 +104,11 @@ typedef struct _GPSInfoType
 	UINT8	latitude[4];
 	UINT8	longitude[4];
 	UINT8   AccMileage[4];
-	
+	UINT8   Tac[2];
+	UINT8 	CellId[4];
+	UINT8   xData;
+	UINT8   yData;
+	UINT8	zData;
 }GPSInfoType;
 typedef struct GPSMsgtoTcpType
 {

+ 1 - 0
inc/app.h

@@ -109,6 +109,7 @@ typedef struct AppDataType
     UINT32 CumulativeCapacity;
     UINT32 AccMileage;
     UINT16 SysReStart;
+    UINT8  RelayControl;
 }AppDataBody;
 typedef struct _AppDataHeader
 {

+ 132 - 0
inc/app.h.orig

@@ -0,0 +1,132 @@
+/****************************************************************************
+ *
+ * Copy right:   2017-, Copyrigths of EigenComm Ltd.
+ * File name:    app.h
+ * Description:  EC616 onenet demo entry header file
+ * History:      Rev1.0   2018-07-12
+ *
+ ****************************************************************************/
+#include "commontypedef.h"
+#ifndef  APP_H
+#define  APP_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+//全局定义声明区
+#define BMS_MANUFACTURE (1) //BMS制造商表示1-超力源,2-美顺
+#define DATA_MODULE_TYPE (1) //1表示NB模块,2表示4G cat1
+<<<<<<< HEAD
+#define BMS_INFO  (2)       //1-1表示超力源4830,1-2表示超力源6060,2-1表示美顺6455
+=======
+#define BMS_INFO  (3)       //1-1表示超力源4830,1-2表示超力源6060,2-1表示美顺MLS,2-2表示美顺MWL,2-3表示美顺MGM
+>>>>>>> V2-V2300
+#define EOLSTATE (0) //1标识下线检测跳过,使用默认值
+
+#if  BMS_MANUFACTURE==1
+    #if BMS_INFO==1
+        #define BATT_CELL_VOL_NUM  (14)
+        #define BATT_TEMP_NUM  (3)
+        #define BATT_OTHER_TEMP_NUM  (2)
+    #elif BMS_INFO==2
+        #define BATT_CELL_VOL_NUM  (17)
+        #define BATT_TEMP_NUM  (4)
+        #define BATT_OTHER_TEMP_NUM  (2)
+    #endif
+#elif  BMS_MANUFACTURE==2
+    #if BMS_INFO==1
+        #define BATT_CELL_VOL_NUM  (20)
+        #define BATT_TEMP_NUM  (3)
+        #define BATT_OTHER_TEMP_NUM  (2)
+    #elif BMS_INFO==2
+        #define BATT_CELL_VOL_NUM  (17)
+        #define BATT_TEMP_NUM  (4)
+        #define BATT_OTHER_TEMP_NUM  (2)
+    #elif BMS_INFO==3
+        #define BATT_CELL_VOL_NUM  (20)
+        #define BATT_TEMP_NUM  (4)
+        #define BATT_OTHER_TEMP_NUM  (2)
+    #endif
+#endif
+
+#define NB_OTHER_TEMP_NUM  (4)  //NB采集的温度个数
+#define BATT_CELL_VOL_NUM_2 (BATT_CELL_VOL_NUM*2)
+
+#define HWVERSION		    0x0102    //硬件主版本,现为V1.2板
+#define	BLSWVERSION		0x01020000    //BootLoader版本号V1.2.0.0
+#define	DRVSWVERSION		0x01050000     //驱动层版本号V1.4.0.0  驱动层1.5.0.0,增加了三轴
+//#define	APPSWVERSION		0x01020209     
+<<<<<<< HEAD
+#define	APPSWVERSION		0x02000108
+// #define	APPSWVERSION		0x0201000E
+=======
+#define	APPSWVERSION		0x02030010
+//#define	APPSWVERSION		0x0201000E
+>>>>>>> V2-V2300
+//--------------------------------------------------------------------------------
+
+#define APP_CONFIG_FILE_LATEST_VERSION 0
+#define APP_CONFIG_FILE_NAME  "qxappconfig.nvm"
+#define APP_DATAINFO_FILE_NAME  "qxappDataInfo.nvm"
+#define BATT_SN_LEN           17
+typedef struct AppNVMDataType
+{	
+    BOOL   appDataModify;		//数据更改标志位
+	UINT8  battSN[BATT_SN_LEN]; //电池SN号码
+   	BOOL   isBattLocked;		//0:not locked;	1:locked
+    UINT8  chargEndWorkTime;   //the unit is min
+    UINT8  wakeupWorkTime;     //the unit is min
+    UINT8  sleepTime;
+    UINT16 HwVersion;
+    UINT32 BLSwVersion;
+    UINT32 DrvSwVersion;
+    UINT32 AppSwVersion;
+	UINT8  EOLState;
+}AppNVMDataType;
+
+typedef struct AppConfigHeader
+{
+    UINT16 fileBodySize; //file body size, not include size of header;
+    UINT8  version;
+    UINT8  checkSum;
+}AppConfigHeader;
+typedef struct _UartAnswerMsg
+{
+	BOOL UartFlag;
+    UINT8 dataPtr[8];
+    UINT16 len;
+}UartAnswerMsgType;
+
+typedef enum
+{
+    APP_INIT_STATE,
+    APP_DEACTIVE_STATE,
+    APP_IPREADY_STATE,
+    APP_REPORT_STATE,
+    APP_IDLE_STATE,
+    APP_WAIT_STATE
+} appRunningState_t;
+//uint8_t* Uart_Receive_func(Uart_Receive_Type Uart_Receive_Msg,uint8_t* Uart_Rece_buffer,uint8_t Data_Len);
+//累计数据结构体
+typedef struct AppDataType
+{	
+    BOOL   appDataModify;		//数据更改标志位
+    UINT8  BmsChrgInfoSendFreq;
+    UINT8  BmsDisChrgInfoSendFreq;
+    UINT8  GpsChrgInfoSendFreq;
+    UINT8  GpsDisChrgInfoSendFreq;
+    INT8  BattCurrentNegFlag;
+    UINT32 CumulativeCapacity;
+    UINT32 AccMileage;
+    UINT16 SysReStart;
+    UINT8  RelayControl;
+}AppDataBody;
+typedef struct _AppDataHeader
+{
+    UINT16 fileBodySize; //file body size, not include size of header;
+    UINT8  checkSum;
+}AppDataHeader;
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* APP_H */

+ 11 - 0
src/CANEncode.c

@@ -203,6 +203,17 @@ void CANEncodeFunction(UINT32 ID,UINT8* rawData)
 			*(UINT8*)(rawData +6) =reservedSignal7&0xFF;
 			*(UINT8*)(rawData +7) =reservedSignal8&0xFF;
 			break;
+		case 0x7CE:
+			*(UINT8*)(rawData +0) =(xzyDataSend[0]>>8)&0xFF;
+			*(UINT8*)(rawData +1) =(xzyDataSend[0])&0xFF;
+			*(UINT8*)(rawData +2) =(xzyDataSend[1]>>8)&0xFF;
+			*(UINT8*)(rawData +3) =(xzyDataSend[1])&0xFF;
+			*(UINT8*)(rawData +4) =(xzyDataSend[2]>>8)&0xFF;
+			*(UINT8*)(rawData +5) =(xzyDataSend[2])&0xFF;
+			*(UINT8*)(rawData +6) =reservedSignal8&0xFF;
+			*(UINT8*)(rawData +7) =reservedSignal8&0xFF;
+			break;
+
 		case	0x7B0:
 			*(UINT8*)(rawData +0) = (AppNVMData.battSN[0])&0xFF;
 			*(UINT8*)(rawData +1) = (AppNVMData.battSN[1])&0xFF;

+ 2 - 0
src/CANTask.c

@@ -90,6 +90,7 @@ static void Can_Receive()
 				}
 				if(HAL_Can_Receive(CanRxMsg)>0)					
 				{
+					CanMsgFlag = 0x01;
 					delayconuter=0;						
 					for(i=0; i<2; i++)
 					{								
@@ -141,6 +142,7 @@ static void Can_Receive()
 				if(delayconuter>100 && msgFlag ==0)
 				{
 					delayconuter=0;
+					CanMsgFlag = 0x00;
 					PROC_CAN_STATE_SWITCH(PROCESS_CAN_STATE_IDLE);
 				}
 				break;

+ 1 - 1
src/Fota.c

@@ -76,7 +76,7 @@ void Fota_Func(UINT8 *DataPtr,INT32 connectId)
                     memset(Data_Read_Buffer,0x00,Fota_S.Fota_Recv_Data_Len);
                     BSP_QSPI_Read_Safe(Data_Read_Buffer,Fota_S.Fota_Flash_Addres+Fota_S.Fota_Current_Addres,Fota_S.Fota_Recv_Data_Len);
                     Data_Read_Crc = Fota_crc_chk(Data_Read_Buffer,Fota_S.Fota_Recv_Data_Len);
-                    #ifdef USING_PRINTF
+                    #ifdef USING_PRINTF1
                         printf("Data_Read_Buffer:\n");
                         for(int i=0;i<Fota_S.Fota_Recv_Data_Len;i++)
                         {

+ 36 - 3
src/GpsTask.c

@@ -29,6 +29,7 @@
 #include "MainTask.h"
 #include "GpsTask.h"
 #include "TcpTask.h"
+#include "Signal.h"
 //全局变量区输入
 extern volatile BOOL Sleep_flag; 
 extern AppDataBody AppDataInfo;
@@ -37,7 +38,7 @@ extern UINT8 WorkFlag;
 UINT8 GpsData[20];
 osMutexId_t GpsMutex = NULL;
 //线程定义区
-#define GPS_TASK_STACK_SIZE   								 (512)
+#define GPS_TASK_STACK_SIZE   								 (1024)
 static QueueHandle_t norGpsHandle = NULL;
 static osThreadId_t gpsTaskHandle = NULL;
 static StaticTask_t gpsTask = NULL;
@@ -46,9 +47,15 @@ static UINT8 gpsTaskStack[GPS_TASK_STACK_SIZE];
 //函数声明区
 void strdel(char * str,char c);
 UINT32 location_handle(char *in1);
-
+UINT8 Aoi1Event = 0;
+UINT8 Aoi2Event = 0;
 static void GpsTask(void* arg)
 {
+    UINT8 xyzCounter = 0; 
+    INT16 xData[3] = {0};
+    INT16 yData[3] = {0};
+    INT16 zData[3] = {0};
+    INT16 xyzData[3] = {0};
     gpsReqMsg msg;
 	char *p=NULL;
 	const char *delim = "\n";
@@ -66,7 +73,7 @@ static void GpsTask(void* arg)
     while(1)
     {
         //char temp[] = "$GNRMC,082626.000,A,2939.91801,N,10637.09500,E,0.543,30.254,261120,,,A,V*17";
-        osStatus_t ret = osMessageQueueGet(norGpsHandle, &msg, 0, osWaitForever);
+        osStatus_t ret = osMessageQueueGet(norGpsHandle, &msg, 0, 100);
         if(ret==0)
         {
             if (msg.dataPtr)
@@ -147,6 +154,32 @@ static void GpsTask(void* arg)
                 free(msg.dataPtr);
             msg.dataPtr=NULL;
         }
+        if(Aoi1Event||Aoi2Event||Timer_count%20==0)
+        {
+            if(Aoi1Event||Aoi2Event)
+            {
+                Aoi1Event=0;
+                Aoi2Event=0;
+                VibrationStatus = 0x01;
+            }
+            //SL_SC7A20_Reg_read_all();
+            UINT8 ret  = SL_SC7A20_Read_XYZ_Data(xyzData);
+            xData[xyzCounter] = xyzData[0];
+            yData[xyzCounter] = xyzData[1];
+            zData[xyzCounter] = xyzData[2];
+            xyzCounter++;
+            if(xyzCounter>2)
+            {
+                xyzCounter=0;
+            }
+            xzyDataSend[0] = (xData[0] + xData[1] + xData[2])/3;
+            xzyDataSend[1] = (yData[0] + yData[1] + yData[2])/3;
+            xzyDataSend[2] = (zData[0] + zData[1] + zData[2])/3;
+            #ifdef USING_PRINTF1
+                printf("\n%d %d %d \r\n", xzyDataSend[0],xzyDataSend[1],xzyDataSend[2]);
+            #endif
+
+        }
         if (Sleep_flag)
 		{
             posGGAServiceStop();

+ 9 - 8
src/MainTask.c

@@ -47,7 +47,6 @@ AppNVMDataType AppNVMData;
 AppDataHeader AppDataHr;
 AppDataBody AppDataInfo;
 
-BOOL Can_Msg_Enble = false;
 
 //主线程堆栈声明区
 static StaticTask_t           gProcess_Main_Task_t;
@@ -83,11 +82,13 @@ static void appSaveDataInfo(void);
 //主线程任务区
 static void MainTask(void* arg)
 {
-
+    if(Error_Mutex == NULL)
+    {
+        Error_Mutex = osMutexNew(NULL);
+    }
     GsensorI2CHandler(GsensorI2CCallback);
     GsensorInit();
-
-
+    
 
     int32_t inParam = 0xAABBCCDD;
     UINT32  param;
@@ -185,7 +186,7 @@ static void MainTask(void* arg)
             case PROCESS_STATE_WORK:
             {
 
-                if(Error_count>=5)
+                if(Error_count>=5 && CanMsgFlag==0x00 && UDSSwitch==0 &&BMS_Fota_update_flag==FALSE && battWorkState==0)
                 {
                     AppDataInfo.appDataModify = true;
                     AppDataInfo.SysReStart = AppDataInfo.SysReStart +1;
@@ -205,7 +206,7 @@ static void MainTask(void* arg)
                     osDelay(1000);
                     EC_SystemReset();
                 }
-                osDelay(1000);
+                osDelay(100);
                 if(Work_timer_end)
                 {
                     xTimerStop(montior_timer, 0);
@@ -245,10 +246,9 @@ static void MainTask(void* arg)
                 #ifdef USING_PRINTF1
                     printf("TcpService:%d,UDSSwitch:%d,BMS_Fota_update_flag:%d,battWorkState:%d,Can_Msg_Enble:%d\r\n",TcpService,UDSSwitch,BMS_Fota_update_flag,battWorkState,Can_Msg_Enble);
                 #endif	
-                if(TcpService!=0x00||UDSSwitch==1||BMS_Fota_update_flag||battWorkState!=0||Can_Msg_Enble==true)
+                if(TcpService!=0x00||UDSSwitch==1||BMS_Fota_update_flag||battWorkState!=0||CanMsgFlag==0x01)
                 {
                     xTimerReset(work_timer,0);
-                    Can_Msg_Enble = false;
                 }
                 if(BattChrgEndFlag)
                 {
@@ -819,6 +819,7 @@ static void setDefaultAppDataInfo(void)
     AppDataInfo.CumulativeCapacity = 0;
     AppDataInfo.AccMileage = 0;
     AppDataInfo.SysReStart = 0;
+    AppDataInfo.RelayControl = 0;
     return;
 }
 

+ 16 - 15
src/Signal.c

@@ -1,6 +1,6 @@
 #include "Signal.h"
 
-UINT16	COMOutTable[28]	=	{
+UINT16	COMOutTable[29]	=	{
 0x6A0,
 0x6A1,
 0x6A2,
@@ -15,7 +15,6 @@ UINT16	COMOutTable[28]	=	{
 0x6C2,
 0x6C3,
 0x6C4,
-
 0x7C0,
 0x7C1,
 0x7C2,
@@ -29,8 +28,8 @@ UINT16	COMOutTable[28]	=	{
 0x7CA,
 0x7CB,
 0x7CC,
-0x7CD
-
+0x7CD,
+0x7CE
 		};
 
 //declear the UINT8 vars
@@ -52,15 +51,18 @@ UINT8	bmsSwVersion = 0xFF;
 UINT8	bmsHwVersion = 0xFF;
 UINT8	battMOSSwitchState = 0xFF;
 UINT8	battHeatEnableState = 0xFF;
-UINT8	reservedSignal1 = 0xFF;
-UINT8	reservedSignal2 = 0xFF;
-UINT8	reservedSignal3 = 0xFF;
-UINT8	reservedSignal4 = 0xFF;
-UINT8	reservedSignal5 = 0xFF;
-UINT8	reservedSignal6 = 0xFF;
-UINT8	reservedSignal7 = 0xFF;
-UINT8	reservedSignal8 = 0xFF;
-
+UINT8	reservedSignal1 = 0x00;
+UINT8	reservedSignal2 = 0x00;
+UINT8	reservedSignal3 = 0x00;
+UINT8	reservedSignal4 = 0x00;
+UINT8	reservedSignal5 = 0x00;
+UINT8	reservedSignal6 = 0x00;
+UINT8	reservedSignal7 = 0x00;
+UINT8	reservedSignal8 = 0x00;
+UINT8   RelayControlState = 0x00;
+UINT8	BuzzerControl = 0x00;
+UINT8   CanMsgFlag = 0x00;
+UINT8	VibrationStatus = 0x00;
 //declear the UINT16 vars
 UINT16	battCellU[28] = {0xFFFF};
 UINT16	minCellVol = 0xFFFF;
@@ -68,10 +70,9 @@ UINT16	maxCellVol = 0xFFFF;
 UINT16	battPackVol = 0xFFFF;
 UINT16	battI = 0xFFFF;
 UINT16	nbHwVersion = 0xFFFF;
-
-
 UINT8 Lockstatus = 0;
 UINT8 Error_count=0;
+INT16 xzyDataSend[3] = {0};
 
 //declear the UINT32 vars
 UINT32	battWarningState = 0xFFFFFFFF;

+ 83 - 33
src/TcpTask.c

@@ -83,10 +83,6 @@ static void TcpTask(void* arg)
 	{
 		TcpRecvHandle = osMessageQueueNew(2,sizeof(TcpipConnectionRecvDataInd*), NULL);
 	}
-    if(Error_Mutex == NULL)
-    {
-        Error_Mutex = osMutexNew(NULL);
-    }
     osDelay(5000);//等待驻网延时5s
     while (true)
     {
@@ -162,6 +158,7 @@ static void TcpTask(void* arg)
                         osDelay(5000);
                         appSetCFUN(1);
                         osDelay(5000);
+                        sendQueueMsg(QMSG_ID_NW_IP_READY, 0);
                     }
                     break;
                 case QMSG_ID_SOCK_SENDPKG:
@@ -295,21 +292,30 @@ static void TcpDataInfoAssembleSend()
     switch(WorkFlag)
     {
         case 0x00:
-            BattSendFreq = AppDataInfo.BmsDisChrgInfoSendFreq/5;
-            GpsSendFreq = AppDataInfo.GpsChrgInfoSendFreq/5;
+            BattSendFreq = 30/5;
+            GpsSendFreq = 30/5;
             break;
         case 0x01:
-            GpsSendFreq = AppDataInfo.GpsDisChrgInfoSendFreq/5;
-            BattSendFreq = AppDataInfo.BmsDisChrgInfoSendFreq/5;
+            GpsSendFreq = 10/5;
+            BattSendFreq = 30/5;
             break;
         case 0x02:
-            BattSendFreq = AppDataInfo.BmsChrgInfoSendFreq/5;
-            GpsSendFreq = AppDataInfo.GpsChrgInfoSendFreq/5;
+            BattSendFreq = 10/5;
+            GpsSendFreq = 30/5;
             break;
         default:
-            BattSendFreq = AppDataInfo.BmsDisChrgInfoSendFreq/5;
-            GpsSendFreq = AppDataInfo.GpsChrgInfoSendFreq/5;
+            BattSendFreq = 30/5;
+            GpsSendFreq = 30/5;
             break;
+    }
+    if(VibrationStatus)
+    {
+        GpsSendFreq = 10/5;
+        VibrationStatus = 0x00;
+    }
+    else
+    {
+        GpsSendFreq = 30/5;
     }    
     if(send_counter%BattSendFreq==0)
     {
@@ -387,7 +393,10 @@ static void TcpDataInfoAssembleSend()
 		
 		BattToTcpInfo.battInfo.battSOC = battSOC;
 		BattToTcpInfo.battInfo.battSOH = battSOH;
-		memcpy(BattToTcpInfo.battInfo.batCellBalenceState,&battBalanceoInfo,4);
+        BattToTcpInfo.battInfo.batCellBalenceState[0] = (battBalanceoInfo>>24)&0xFF;
+        BattToTcpInfo.battInfo.batCellBalenceState[1] = (battBalanceoInfo>>16)&0xFF;
+        BattToTcpInfo.battInfo.batCellBalenceState[2] = (battBalanceoInfo>>8)&0xFF;
+        BattToTcpInfo.battInfo.batCellBalenceState[3] = battBalanceoInfo&0xFF;
 		BattToTcpInfo.battInfo.battCellNum= BATT_CELL_VOL_NUM ;
 
 		for(i=0;i<BATT_CELL_VOL_NUM;i++)
@@ -429,6 +438,9 @@ static void TcpDataInfoAssembleSend()
     if(send_counter%GpsSendFreq==0)
     {
         GPSMsgtoTcpType GpsToTcpInfo;
+        UINT16 Tac = 0;
+        UINT32 CellId = 0;
+        appGetLocationInfoSync(&Tac,&CellId);
         osStatus_t result = osMutexAcquire(GpsMutex, osWaitForever);
         appGetSystemTimeUtcSync(&TimeStracture);
         year=(TimeStracture.UTCtimer1&0xffff0000)>>16;
@@ -461,6 +473,15 @@ static void TcpDataInfoAssembleSend()
         GpsToTcpInfo.gpsInfo.msgCollectionTimeUTC[4] = UTC8TimeTcp.minute & 0xFF;						    //mins
         GpsToTcpInfo.gpsInfo.msgCollectionTimeUTC[5] = UTC8TimeTcp.second & 0xFF;
         memcpy((UINT8 *)&GpsToTcpInfo.gpsInfo.locateMark, GpsData,sizeof(GpsData));
+        GpsToTcpInfo.gpsInfo.Tac[0] = Tac>>8;
+        GpsToTcpInfo.gpsInfo.Tac[1] = Tac;
+        GpsToTcpInfo.gpsInfo.CellId[0] = CellId>>24;
+        GpsToTcpInfo.gpsInfo.CellId[1] = CellId>>16;
+        GpsToTcpInfo.gpsInfo.CellId[2] = CellId>>8;
+        GpsToTcpInfo.gpsInfo.CellId[3] = CellId;
+        GpsToTcpInfo.gpsInfo.xData =  (xzyDataSend[0]/100)+100;
+        GpsToTcpInfo.gpsInfo.yData =  (xzyDataSend[1]/100)+100;
+        GpsToTcpInfo.gpsInfo.zData =  (xzyDataSend[2]/100)+100;
         GpsToTcpInfo.CRC = bcc_chk((UINT8 *)&GpsToTcpInfo, sizeof(GPSMsgtoTcpType)-1 );
         osMutexRelease(GpsMutex);
         //if(GpsToTcpInfo.gpsInfo.locateMark==0x01)
@@ -550,7 +571,7 @@ static void TcpDataInfoAssembleSend()
         VerMsgToTcpInfo.VerInfo.BmsInfo = BMS_INFO;
         VerMsgToTcpInfo.VerInfo.DataModuleType = DATA_MODULE_TYPE;
         VerMsgToTcpInfo.CRC = bcc_chk((UINT8 *)&VerMsgToTcpInfo, sizeof(VerMsgToTcpInfo)-1 );
-        if(UartBattInfoRecvFlag==TRUE&&NB_Fota_update_flag==FALSE)
+        if(NB_Fota_update_flag==FALSE)
         {
             len = tcpipConnectionSend(socContext.id, (UINT8 *)&VerMsgToTcpInfo, sizeof(VerMsgToTcpInfo), 0, 0, 0);
             if(len>0)
@@ -559,15 +580,11 @@ static void TcpDataInfoAssembleSend()
             }
             else
             {
+                send_counter = 0;
                 TcpSendLen = 0xFE & TcpSendLen;
                 sendQueueMsg(QMSG_ID_NW_IP_SUSPEND, 0);
             }
         }
-        else
-        {
-            send_counter = 1;
-            return;
-        }
     }
     if(send_counter==0)//发送本次文件中的调试信息
     {
@@ -679,7 +696,6 @@ static void TcpDataInfoRecvHandle()
                     }
                     else if(*(Ptr+30)==0x80)//远程锁定命令
                     {
-                        //osMutexAcquire(UartMutex, osWaitForever);
                         TcpCmdAnswer[3] = 0x01;
                         memcpy(&TcpCmdAnswer[4],(Ptr+4),BATT_SN_LEN);
                         TcpCmdAnswer[21] = TCP_ENCPT_DISABLE;
@@ -691,26 +707,60 @@ static void TcpDataInfoRecvHandle()
                         {
                             AppNVMData.appDataModify = TRUE;
                             AppNVMData.isBattLocked = TRUE;
-                            UartWriteCmd.WriteCmd = 0x01;
-                            UartWriteCmd.Data[0] = 0x00;
-                            UartWriteCmd.Data[1] = 0x00;
-                            if(battWorkState ==0x00)
-                            {
-                                osMessageQueuePut(UartWriteCmdHandle,&UartWriteCmd,0,1000);
-                            }
                             tcpipConnectionSend(socContext.id,TcpCmdAnswer,31,0,0,0);
                         }
-                        else                //0x02代表解锁
+                        else if(*(Ptr+31)==0x02)              //0x02代表解锁
                         {
                             AppNVMData.appDataModify = TRUE;
                             AppNVMData.isBattLocked = FALSE;
-                            UartWriteCmd.WriteCmd = 0x01;
-                            UartWriteCmd.Data[0] = 0x00;
-                            UartWriteCmd.Data[1] = 0x03;
-                            osMessageQueuePut(UartWriteCmdHandle,&UartWriteCmd,0,1000);
                             tcpipConnectionSend(socContext.id,TcpCmdAnswer,31,0,0,0);
                         }
-                        //osMutexRelease(UartMutex);
+                        TcpService=0x00;
+                        
+                    }
+                    else if(*(Ptr+30)==0x8A)//继电器控制
+                    {
+                        TcpCmdAnswer[3] = 0x01;
+                        memcpy(&TcpCmdAnswer[4],(Ptr+4),BATT_SN_LEN);
+                        TcpCmdAnswer[21] = TCP_ENCPT_DISABLE;
+                        TcpCmdAnswer[22] = 0x00;
+                        TcpCmdAnswer[23] = 0x06;
+                        memcpy(&TcpCmdAnswer[24],(Ptr+24),6);
+                        TcpCmdAnswer[30] = bcc_chk(TcpCmdAnswer,30);
+                        if(*(Ptr+31)==0x01)//0x01代表断开
+                        {
+                            AppDataInfo.appDataModify = TRUE;
+                            AppDataInfo.RelayControl = TRUE;
+                            tcpipConnectionSend(socContext.id,TcpCmdAnswer,31,0,0,0);
+                        }
+                        else if(*(Ptr+31)==0x00)             //0x00代表关闭
+                        {
+                            AppDataInfo.appDataModify = TRUE;
+                            AppDataInfo.RelayControl = FALSE;
+                            tcpipConnectionSend(socContext.id,TcpCmdAnswer,31,0,0,0);
+                        }
+                        TcpService=0x00;
+                        
+                    }
+                    else if(*(Ptr+30)==0x89)//蜂鸣器控制
+                    {
+                        TcpCmdAnswer[3] = 0x01;
+                        memcpy(&TcpCmdAnswer[4],(Ptr+4),BATT_SN_LEN);
+                        TcpCmdAnswer[21] = TCP_ENCPT_DISABLE;
+                        TcpCmdAnswer[22] = 0x00;
+                        TcpCmdAnswer[23] = 0x06;
+                        memcpy(&TcpCmdAnswer[24],(Ptr+24),6);
+                        TcpCmdAnswer[30] = bcc_chk(TcpCmdAnswer,30);
+                        if(*(Ptr+31)==0x01)//0x01代表断开
+                        {
+                            BuzzerControl = TRUE;
+                            tcpipConnectionSend(socContext.id,TcpCmdAnswer,31,0,0,0);
+                        }
+                        else if(*(Ptr+31)==0x00)             //0x00代表关闭
+                        {
+                            BuzzerControl = FALSE;
+                            tcpipConnectionSend(socContext.id,TcpCmdAnswer,31,0,0,0);
+                        }
                         TcpService=0x00;
                         
                     }

+ 146 - 47
src/UartTask.c

@@ -39,6 +39,7 @@ extern volatile BOOL Sleep_flag;
 extern AppNVMDataType AppNVMData;
 extern AppDataBody AppDataInfo;
 extern UINT8 WorkFlag;
+extern UINT8 	UDSSwitch;
 //全局变量输出区
 BOOL UartBattInfoRecvFlag  = false;
 QueueHandle_t UartWriteCmdHandle = NULL;
@@ -70,7 +71,7 @@ void battSOCDisplay(void);
 void battErrorStateDisplay(void);
 void battWarningStateDisplay(void);
 void battLockStateDisplay(UINT8 lockState);
-void relayPWMControl(void);
+void relayControlFunc(float DutyRatio,UINT8  BuzzerPeriod);
 void SP_BMS_Update_Service(void);
 BOOL BattHeaterSwitch(UINT8* heaterSwitch);
 UINT16  encryptionAlgorithm (UINT16 plainText);
@@ -109,9 +110,12 @@ static void UartTask(void* arg)
     memset(&(UartReadMsg.UartFlag),0x00,sizeof(UartReadMsgType));
     if(UartWriteCmdHandle == NULL)//Uart控制命令传输指针
 	{
-		UartWriteCmdHandle = osMessageQueueNew(3,sizeof(Uart_Write_Data_Type), NULL);
+		UartWriteCmdHandle = osMessageQueueNew(1,sizeof(Uart_Write_Data_Type), NULL);
 	}
     //上电起始控制区域
+	UINT8 ret = 0x00,Ringtimes = 0;
+	UINT8 HeatSwitch = 0;
+
     while (1)
     {
         switch (gProcess_Uart_Task)
@@ -133,23 +137,38 @@ static void UartTask(void* arg)
                 osDelay(100);
                 if(Sleep_flag)
                 {
+					Ringtimes = 0;
                     PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_SLEEP);
+					break;
                 }
                 else if(Timer_count%10==0)
                 {
                     #ifdef USING_PRINTF1
                         printf("[%d]Uart Timer 1s:%d,uartReadSuccessFlag:%d\n",__LINE__,Timer_count,uartReadSuccessFlag);
                     #endif
-                    if(osMessageQueueGet(UartWriteCmdHandle,&UartWriteData,0,0)==osOK)
+                    if(osMessageQueueGet(UartWriteCmdHandle,&UartWriteData,0,0)==osOK && uartReadSuccessFlag==TRUE)
                     {
-                        #ifdef USING_PRINTF1
-                            printf("[%d]UartWriteCmdHandle :%x\n",__LINE__,UartWriteData.WriteCmd);
+                        #ifdef USING_PRINTF
+                            printf("[%d]UartWriteCmdHandle :%x-%X%X\n",__LINE__,UartWriteData.WriteCmd,UartWriteData.Data[0],UartWriteData.Data[1]);
                         #endif
+						Ringtimes = 0;
                         PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_WRITE);
+						break;
                     }
                     else
-                        PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_READ);
+					{
+						PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_READ);
+						break;
+					}
                 }
+				if(maxCellVol>4400&&maxCellVol<6000)//继电器测试
+				{
+					AppDataInfo.RelayControl=TRUE;
+				}
+				else if(maxCellVol<4000)
+				{
+					AppDataInfo.RelayControl=FALSE;
+				} 
 				if(UartReadMsg.Header[2]>0)
 				{
 					uartReadSuccessFlag = true;
@@ -173,6 +192,41 @@ static void UartTask(void* arg)
 					{
 						battWarningStateDisplay();
 					}
+					if(AppNVMData.isBattLocked==FALSE && ret==0x01)
+					{
+						relayControlFunc(0.8,5);//表示1s响2次,占比80%
+						Ringtimes++;
+						if(Ringtimes>=15)
+						{
+							relayControl(FALSE);
+							ret = 0;
+							Ringtimes = 0;
+						}
+					}
+					else if (AppNVMData.isBattLocked==TRUE && ret==0x01)
+					{
+						relayControlFunc(0.8,5);//表示1s响2次,占比80%
+						Ringtimes++;
+						if(Ringtimes>=10)
+						{
+							relayControl(FALSE);
+							ret = 0;
+							Ringtimes = 0;
+						}
+					}
+					else if(UDSSwitch==1 && Ringtimes<=50)
+					{
+						relayControlFunc(0.8,5);//表示1s响2次,占比80%
+						Ringtimes++;
+					}
+					else if(BuzzerControl==TRUE)
+					{
+						relayControlFunc(0.8,5);//表示1s响2次,占比80%
+					}
+					if(Ringtimes>=50)
+					{
+						relayControl(FALSE);
+					}
 				}
 				currentTimerCount = Timer_count;
 				if(BMS_Fota_update_flag)
@@ -180,31 +234,56 @@ static void UartTask(void* arg)
 					if(WorkFlag==0x00)
 					{
 						PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_UPDATE);
+						break;
 					}
-					
 				}
-				if(AppNVMData.isBattLocked==TRUE && ((UartReadMsg.data[(0x09+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+2)*2+1])>>1)&0x03!=0x00 && Timer_count%10==0)//try to lock
+				if(battWorkState ==0x00 && AppNVMData.isBattLocked==TRUE && ((UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1])&0x03)!=0x02)//try to lock lock the discharge 
 				{
+					#ifdef USING_PRINTF
+                        printf("[%d]try to lock:%X-%X\n",__LINE__,AppNVMData.isBattLocked,(UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1])&0x03);
+                    #endif
 					UartWriteData.WriteCmd = 0x01;
-					UartWriteData.Data[0] = 0x00;
-					UartWriteData.Data[1] = 0x00;
-					osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,1000);
-					PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_READ);
+					UartWriteData.Data[0] = 0x00|(UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2]);
+					UartWriteData.Data[1] = 0x02;
+					osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,0);
 				}
-				else if (AppNVMData.isBattLocked==FALSE && ((UartReadMsg.data[(0x09+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+2)*2+1])>>1)&0x03==0x00 && Timer_count%10==0 ) // try to unlock
+				else if (battWorkState ==0x00 && AppNVMData.isBattLocked==FALSE && ((UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1])&0x03)!=0x03) // try to unlock
 				{
+					#ifdef USING_PRINTF
+                        printf("[%d]try to unlock:%X-%X\n",__LINE__,AppNVMData.isBattLocked,(UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1])&0x03);
+                    #endif
 					UartWriteData.WriteCmd = 0x01;
-					UartWriteData.Data[0] = 0x00;
+					UartWriteData.Data[0] = 0x00|(UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2]);
 					UartWriteData.Data[1] = 0x03;
-					osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,1000);
-					PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_READ);
+					osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,0);
+				}
+				if(AppDataInfo.RelayControl==TRUE && ((UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2])&0x80)==0x00)//继电器断开
+				{
+					UartWriteData.WriteCmd = 0x03;
+					UartWriteData.Data[0] = 0x80;
+					UartWriteData.Data[1] = 0x00|(UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1]);
+					osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,0);
+				}
+				else if(AppDataInfo.RelayControl==FALSE && ((UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2])&0x80)==0x80)//继电器闭合
+				{
+					UartWriteData.WriteCmd = 0x03;
+					UartWriteData.Data[0] = 0x00;
+					UartWriteData.Data[1] = 0x00|(UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1]);
+					osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,0);
+				}
+				if(BattHeaterSwitch(&HeatSwitch)==TRUE)
+				{
+					UartWriteData.WriteCmd = 0x02;
+					UartWriteData.Data[0] = 0x00;
+					UartWriteData.Data[1] = HeatSwitch&0xFF;
+					osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,0);
 				}
                 break;
             }
             case PROCESS_UART_STATE_READ:
             {
                 UINT16 CRC_chk_buffer;
-                Reg_Num = 0x21+BATT_CELL_VOL_NUM+BATT_TEMP_NUM + 2;//按照协议里面的0x21+X+N的结束地址
+                Reg_Num = 0x21+BATT_CELL_VOL_NUM+BATT_TEMP_NUM + BATT_OTHER_TEMP_NUM;//按照协议里面的0x21+X+N的结束地址
                 Uart_Read_Msg.Bms_Address = BMS_ADDRESS_CODE;
                 Uart_Read_Msg.Bms_Funcode = UART_READ_CODE;
                 Uart_Read_Msg.Reg_Begin_H = 0x00;
@@ -238,19 +317,15 @@ static void UartTask(void* arg)
                     BattChrgEndFlag=FALSE;
                 }
 				#ifdef USING_PRINTF1
-					printf("\nUart_Recv_buffer:  ");
-					for(int i=0;i<Uart_Recv_LEN;i++)
-					{
-						printf("%x ",*((UINT8 *)&UartReadMsg.Header+i));
-					}
-					printf("\n");
-				#endif
+                    printf("[%d]lock:%X,permit:%X,Mos:%x\n",__LINE__,AppNVMData.isBattLocked,(UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1])&0x03,((UartReadMsg.data[(0x09+BATT_CELL_VOL_NUM+BATT_OTHER_TEMP_NUM)*2+1])>>1)&0x03);
+                #endif
                 break;
             }
             case PROCESS_UART_STATE_WRITE:
             {
-                Uart_WriteCmd_func(UartWriteData);
-                PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_IDLE);
+                ret = Uart_WriteCmd_func(UartWriteData);
+				osDelay(500);
+                PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_READ);
                 break;
             }
 			case PROCESS_UART_STATE_UPDATE:
@@ -343,12 +418,15 @@ static BOOL uartBattInfoDecode(UINT8* dataPtr)
 	battI = Batt_current*AppDataInfo.BattCurrentNegFlag + 0x2710;
     //bit0 ~ bit31 represent cell0 ~ cell31
     battBalanceoInfo  = dataPtr[(0x06+BATT_CELL_VOL_NUM+TEMP_NUM)*2+1] | (dataPtr[(0x06+BATT_CELL_VOL_NUM+TEMP_NUM)*2] <<8) + (dataPtr[(0x07+BATT_CELL_VOL_NUM+TEMP_NUM)*2+1]<<16) | (dataPtr[(0x07+BATT_CELL_VOL_NUM+TEMP_NUM)*2] <<24);
-
+	// chargerConnectState = (dataPtr[(0x03+BATT_CELL_VOL_NUM)*2+1])&0x04;//充电器连接状态,0表示未连接,1表示已连接
     bmsHwVersion = dataPtr[(0x08+BATT_CELL_VOL_NUM+TEMP_NUM)*2+1]; 
     bmsSwVersion = dataPtr[(0x08+BATT_CELL_VOL_NUM+TEMP_NUM)*2];    
 
     temp = ((dataPtr[(0x09+BATT_CELL_VOL_NUM+TEMP_NUM)*2+1])>>1)&0x03;    
     battMOSSwitchState = ((temp&0x01)<<1)|((temp&0x02)>>1);	
+	#ifdef USING_PRINTF1
+		printf("[%d]battMOSSwitchState :%x\n",__LINE__,battMOSSwitchState);
+	#endif
     if(AppNVMData.isBattLocked==TRUE)
     {
         battMOSSwitchState = battMOSSwitchState |(0x01<<2);
@@ -364,6 +442,7 @@ static BOOL uartBattInfoDecode(UINT8* dataPtr)
 	battPackVol =((dataPtr[(0x18+BATT_CELL_VOL_NUM+TEMP_NUM)*2])<<8|(dataPtr[(0x18+BATT_CELL_VOL_NUM+TEMP_NUM)*2+1]))/10;  //uint 100mV
 	maxCellVol = (dataPtr[(0x19+BATT_CELL_VOL_NUM+TEMP_NUM)*2] << 8) | dataPtr[(0x19+BATT_CELL_VOL_NUM+TEMP_NUM)*2 + 1];
 	minCellVol = (dataPtr[(0x1A+BATT_CELL_VOL_NUM+TEMP_NUM)*2] << 8) | dataPtr[(0x1A+BATT_CELL_VOL_NUM+TEMP_NUM)*2 + 1];
+	RelayControlState  = (dataPtr[(0x1B+BATT_CELL_VOL_NUM+TEMP_NUM)*2])&0x80;
     battHeatEnableState = dataPtr[(0x1C+BATT_CELL_VOL_NUM+TEMP_NUM)*2+1]&0x01;
 
 	maxCellTemp = 0x00;
@@ -446,6 +525,9 @@ UINT8 Uart_WriteCmd_func(Uart_Write_Data_Type UartWriteData)
     UINT16 CRC_chk_buffer;
     UINT8 timeout = 0x00;
     UINT8 Uart_Recv_Buffer[8];
+	#ifdef USING_PRINTF
+		printf("\nUart_WriteCmd_func: %x ",UartWriteData.WriteCmd);
+	#endif
     switch (UartWriteData.WriteCmd)
     {
         case 0x01://是否锁定
@@ -478,6 +560,22 @@ UINT8 Uart_WriteCmd_func(Uart_Write_Data_Type UartWriteData)
             CRC_chk_buffer = crc_chk((UINT8 *)&Uart_Write_Msg,sizeof(Uart_Write_Msg)-2);
             Uart_Write_Msg.CRC_L = CRC_chk_buffer;
             Uart_Write_Msg.CRC_H = CRC_chk_buffer>>8;
+            break;
+		}
+		case 0x03://是否继电器控制
+		{
+			RegAddress = 0x1B + BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM;
+            Uart_Write_Msg.Bms_Address = BMS_ADDRESS_CODE;
+            Uart_Write_Msg.Bms_Funcode = UART_WRITE_CODE;
+            Uart_Write_Msg.Reg_Begin_H = RegAddress>>8;
+            Uart_Write_Msg.Reg_Begin_L = RegAddress;
+            Uart_Write_Msg.Reg_Num_H = 0x00;
+            Uart_Write_Msg.Reg_Num_L = 0x01;
+            Uart_Write_Msg.Data_Count = 0x02;//要写入的字节数
+            memcpy(Uart_Write_Msg.Data,UartWriteData.Data,2);
+            CRC_chk_buffer = crc_chk((UINT8 *)&Uart_Write_Msg,sizeof(Uart_Write_Msg)-2);
+            Uart_Write_Msg.CRC_L = CRC_chk_buffer;
+            Uart_Write_Msg.CRC_H = CRC_chk_buffer>>8;
             break;
 		}
         default:
@@ -488,7 +586,7 @@ UINT8 Uart_WriteCmd_func(Uart_Write_Data_Type UartWriteData)
         }
     }
     USARTdrv->Send((UINT8 *)&Uart_Write_Msg,sizeof(Uart_Write_Msg));
-    #ifdef USING_PRINTF1
+    #ifdef USING_PRINTF
         printf("Uart_Send_buffer:  ");
         for(int i=0;i<sizeof(Uart_Write_Msg);i++)
         {
@@ -510,7 +608,7 @@ UINT8 Uart_WriteCmd_func(Uart_Write_Data_Type UartWriteData)
     }
     if (isRecvComplete == true)
     {
-        #ifdef USING_PRINTF1
+        #ifdef USING_PRINTF
             printf("Uart_Rece_buffer: ");
             for(int i=0;i<8;i++)
             {
@@ -641,21 +739,22 @@ BOOL BattHeaterSwitch(UINT8* heaterSwitch)
 	UINT8 i =0;	
 	UINT8 currentSwitchState = 0;
 	//get the current switch state and the cell temp
-	currentSwitchState = battMOSSwitchState & 0x01;
-	if(currentSwitchState==0) 	//当前状态为关闭,判断是否应该开启
+	currentSwitchState = battHeatEnableState&0x01;
+
+	if(currentSwitchState==0)  //当前状态为关闭,判断是否应该开启
 	{
-		if(minCellTemp<=5+40 && maxCellTemp<25+40 && battSOC>=12)//温度偏移为40 
+		if(minCellTemp<5+40 && minCellTemp>=-29+40 && maxCellTemp<25+40)//温度偏移为40 
 		{
 			*heaterSwitch = 1;
 			isNeedtoSwitch = true;
 		}
 	}
-	else  						//当前状态为开启,判断是否应该关闭
+	else        //当前状态为开启,判断是否应该关闭
 	{
-		if(minCellTemp>10+40 || maxCellTemp>30+40 || battSOC<10)
+		if(minCellTemp>=10+40 || maxCellTemp>=30+40)
 		{
 			*heaterSwitch = 0;
-			isNeedtoSwitch= true;
+			isNeedtoSwitch = true;
 		}
 	}
 	return isNeedtoSwitch;
@@ -870,8 +969,12 @@ void battErrorStateDisplay()
 	{	
 	
 		errorLightTimer++;
-
-		if(battWarningState != 0)
+		if(battWorkState  == 0x02)  //充电模式下,如果只有“SOC低故障”,那么就不显示故障灯   zhengchao20210713 add
+		{
+			if((((battWarningState >> 10) & 0x01) == 0x01) &&  ((battWarningState & 0xFFFFFBFF) == 0x00))
+				return;
+		}
+		if(battWarningState != 0 )
 		{
 			if(errorLightTimer<(UINT8)(errorLEDFlashPeriod*errorDutyRatio)) 
 			{	
@@ -1005,30 +1108,26 @@ void battLockStateDisplay(UINT8 lockState)
 	}	
 	errorLightTimer++;
 }
-
-void relayPWMControl()
+void relayControlFunc(float DutyRatio,UINT8  BuzzerPeriod)
 {
-	static UINT8 timerCount=0;
-	//printf("timerCout=%d\n",timerCount);
-	if(timerCount<2)
+	static UINT8  BuzzerTimer = 0;
+	BuzzerTimer++;
+	if(BuzzerTimer<(UINT8)(BuzzerPeriod*DutyRatio))
 	{
 		relayControl(TRUE);
-		timerCount++;
 	}
-	else if(timerCount>=2 && timerCount<5)
+	else if(BuzzerTimer>=(UINT8)(BuzzerPeriod*DutyRatio) && BuzzerTimer<BuzzerPeriod)
 	{
 		relayControl(FALSE);
-		timerCount++;
 	}
 	else
 	{
 		relayControl(FALSE);
-		timerCount = 0;
+		BuzzerTimer = 0;
 	}
 }
 
 
-
 UINT8  decryptionAlgorithm (UINT16 cipherText)
 {
 	UINT16 plainText = 1;	

+ 63 - 22
src/bsp_custom.c

@@ -13,12 +13,17 @@
 #include "slpman_ec616.h"
 #include "plat_config.h"
 #include "debug_log.h"
-
+#include "os_exception.h"
+#if (WDT_FEATURE_ENABLE==1)
+#include "wdt_ec616.h"
+#define WDT_TIMEOUT_VALUE     (20)            // in unit of second, shall be less than 256s
+#endif
 #ifdef BL_FILE_LOG
 extern uint8_t lockoutState;
 #endif
 extern UINT8 Lockstatus;
-extern BOOL Can_Msg_Enble;
+extern UINT8 Aoi1Event;
+extern UINT8 Aoi2Event;
 void GPR_SetUartClk(void)
 {
     GPR_ClockDisable(GPR_UART0FuncClk);
@@ -101,7 +106,7 @@ slpManSlpState_t CheckUsrdefSlpStatus(void)
 void CheckLockOutState(void){
 	if((slpManGetWakeupPinValue() & (0x1<<2)) == 0)
     {
-		#ifdef USING_PRINTF
+		#ifdef USING_PRINTF1
 			printf("LOCK_OUT DOWN\r\n");
 		#endif	
         Lockstatus = true;
@@ -112,7 +117,7 @@ void CheckLockOutState(void){
     else
     {
         Lockstatus = false;
-		#ifdef USING_PRINTF
+		#ifdef USING_PRINTF1
 			printf("LOCK_OUT UP\r\n",__LINE__);
 		#endif	
 		 #ifdef BL_FILE_LOG
@@ -133,7 +138,46 @@ static void PMU_WakeupPadInit(void)
 
     slpManSetWakeupPad(cfg);
 }
+#if (WDT_FEATURE_ENABLE == 1)
 
+/*
+ *  WDT Initialize, wdt timeout value is 20s
+ *  Parameter:   none
+ */
+void BSP_WdtInit(void)
+{
+    // Config WDT clock, source from 32.768KHz and divide by WDT_TIMEOUT_VALUE
+    GPR_SetClockSrc(GPR_WDGFuncClk, GPR_WDGClkSel_32K);
+    GPR_SetClockDiv(GPR_WDGFuncClk, WDT_TIMEOUT_VALUE);
+
+    wdt_config_t wdtConfig;
+    wdtConfig.mode = WDT_InterruptResetMode;
+    wdtConfig.timeoutValue = 32768U;
+    WDT_Init(&wdtConfig);
+}
+void NMI_Handler()
+{
+    ECOMM_TRACE(UNILOG_PLA_APP, enter_NMI_handler, P_ERROR, 0, "WDT timeout!!! Enter NMI Handler!!!");
+    // If we have been in exception handler excecution, we shall resume it.
+    if(is_in_excep_handler())
+    {
+        WDT_Stop();
+    }
+    else
+    {
+        if(BSP_GetPlatConfigItemValue(PLAT_CONFIG_ITEM_FAULT_ACTION) == EXCEP_OPTION_SILENT_RESET)
+        {
+            ResetReasonWrite(RESET_REASON_WDT);
+            EC_SystemReset();
+            while(1);
+        }
+        else
+        {
+            EC_ASSERT(0, 0, 0, 0);
+        }
+    }
+}
+#endif
 /*
  *  custom board related init
  *  Parameter:   none
@@ -168,7 +212,13 @@ void BSP_CustomInit(void)
     }
 #endif
 #endif
-
+#if (WDT_FEATURE_ENABLE == 1)
+    if(BSP_GetPlatConfigItemValue(PLAT_CONFIG_ITEM_START_WDT))
+    {
+        BSP_WdtInit();
+        WDT_Start();
+    }
+#endif
 	slpManGetPMUSettings();				
 
 	PMU_WakeupPadInit();
@@ -177,7 +227,7 @@ void BSP_CustomInit(void)
 	NVIC_EnableIRQ(PadWakeup2_IRQn);//lock
 	NVIC_EnableIRQ(PadWakeup3_IRQn);//gsensor
 	NVIC_EnableIRQ(PadWakeup4_IRQn);//gsensor
-	NVIC_DisableIRQ(PadWakeup5_IRQn);//wakeup2
+	NVIC_EnableIRQ(PadWakeup5_IRQn);//wakeup2
 	CheckLockOutState();
 	slpManStartWaitATTimer();
 
@@ -206,10 +256,6 @@ void Pad0_WakeupIntHandler(void)
     {
         return;
     }
-    else
-    {
-        Can_Msg_Enble = true;
-    }
 #ifdef USING_PRINTF1
 	printf("[%d]PadWakeup0_IRQn\r\n",__LINE__);
 // #else	
@@ -236,32 +282,27 @@ void Pad3_WakeupIntHandler(void)
 {
     if(slpManExtIntPreProcess(PadWakeup3_IRQn)==false)
         return;
-
+    Aoi1Event = 1;
     // add custom code below //
 #ifdef USING_PRINTF1
 	printf("[%d]PadWakeup3_IRQn\r\n",__LINE__);
 // #else	
 //     ECOMM_TRACE(UNILOG_PLA_APP, pad3_Wk, P_SIG, 0, "PadWakeup3_IRQn");
 #endif
-
- 	
-
-
-
 }
 
 void Pad4_WakeupIntHandler(void)
 {
     if(slpManExtIntPreProcess(PadWakeup4_IRQn)==false)
         return;
+    Aoi1Event = 2;
     // add custom code below //
-#ifdef USING_PRINTF1
-	printf("[%d]PadWakeup3_IRQn\r\n",__LINE__);
-// #else	
-
-//     ECOMM_TRACE(UNILOG_PLA_APP, pad4_Wk, P_SIG, 0, "PadWakeup4_IRQn");
-#endif
+    #ifdef USING_PRINTF1
+        printf("[%d]PadWakeup3_IRQn\r\n",__LINE__);
+    // #else	
 
+    //     ECOMM_TRACE(UNILOG_PLA_APP, pad4_Wk, P_SIG, 0, "PadWakeup4_IRQn");
+    #endif
 }
 
 void Pad5_WakeupIntHandler(void)

+ 18 - 19
src/hal_module_adapter.c

@@ -1477,18 +1477,17 @@ void GsensorTriggerEvent(UINT32 event ,UINT32 data)
 static INT32 	I2CEvtProcess(uint32_t evt)
 {
     INT32 ret;
-#if SL_SC7A20_16BIT_8BIT
-    INT16 xyzData[7];
-#else
-    INT8 xyzData[7];
-#endif
+	#if SL_SC7A20_16BIT_8BIT
+		INT16 xyzData[7];
+	#else
+		INT8 xyzData[7];
+	#endif
     HAL_I2C_RecvControl(true);
 
     if(evt & I2C_INT1_REQ_BITMAP)
     {
 
     }
-
     if(evt & I2C_INT2_REQ_BITMAP)
     {
 	SL_SC7A20_Read_XYZ_Data(xyzData);
@@ -1509,18 +1508,18 @@ static void HAL_I2C_RecvTaskEntry(void)
 
  		EC_ASSERT(flag == I2C_RECV_CONTROL_FLAG, flag, 0, 0);
 
-		status = osMessageQueueGet(i2c_recv_msgqueue, &msg, 0 , osWaitForever);
+		status = osMessageQueueGet(i2c_recv_msgqueue, &msg, 0 , 1000);
 		if(status == osOK)
 		{
 
-		      mask = SaveAndSetIRQMask();
+		    mask = SaveAndSetIRQMask();
 			//handle data
-			//I2CEvtProcess(msg.event);
-#ifdef USING_PRINTF
-			//printf("[%d]i2c recv event\r\n",__LINE__);
-#else				
-    			ECOMM_TRACE(UNILOG_PLA_DRIVER, I2C_GSENSOR_D, P_INFO, 0, "i2c recv event");
-#endif
+			I2CEvtProcess(msg.event);
+			#ifdef USING_PRINTF
+				printf("[%d]i2c recv event\r\n",__LINE__);
+			#else				
+				ECOMM_TRACE(UNILOG_PLA_DRIVER, I2C_GSENSOR_D, P_INFO, 0, "i2c recv event");
+			#endif
 			RestoreIRQMask(mask);  
 		}
 	}
@@ -1658,11 +1657,11 @@ void GsensorI2CHandler(ARM_I2C_SignalEvent_t cb_event)
      i2cDrvInstance->Control(ARM_I2C_BUS_SPEED, ARM_I2C_BUS_SPEED_STANDARD);
      i2cDrvInstance->Control(ARM_I2C_BUS_CLEAR, 0);
      HAL_I2C_CreateRecvTaskAndQueue();	 
-#ifdef USING_PRINTF
-   //printf("[%d] i2c config ok\r\n",__LINE__);
-#else	 
-     ECOMM_TRACE(UNILOG_PLA_DRIVER, I2C_GSENSOR_I, P_INFO, 0, "i2c config ok");
-#endif
+	#ifdef USING_PRINTF
+		printf("[%d] i2c config ok\r\n",__LINE__);
+	#else	 
+		ECOMM_TRACE(UNILOG_PLA_DRIVER, I2C_GSENSOR_I, P_INFO, 0, "i2c config ok");
+	#endif
 }
 
 /**

+ 14 - 16
src/sensor.c

@@ -278,13 +278,13 @@ INT8  SL_SC7A20_INT_Config(void)
 
     //HPF SET
   //  GSENSOR_ReadReg(SL_SC7A20_CTRL_REG2,1, &SL_Read_Reg); 
-    SL_Read_Reg=0xcf;//SL_Read_Reg|0x81;//Normal HP , HPF TO AOI1 
+    SL_Read_Reg=0x00;//SL_Read_Reg|0x81;//Normal HP , HPF TO AOI1 
     GSENSOR_WriteReg(SL_SC7A20_CTRL_REG2, SL_Read_Reg);
     
     //�ж���ֵ����
     GSENSOR_WriteReg(SL_SC7A20_INT1_THS, SL_SC7A20_INT_THS_20PERCENT);	
     //������ֵ����ʱ�䴥���ж�
-    GSENSOR_WriteReg(SL_SC7A20_INT1_DURATION, SL_SC7A20_INT_DURATION_30CLK);
+    GSENSOR_WriteReg(SL_SC7A20_INT1_DURATION, SL_SC7A20_INT_DURATION_10CLK);
         
     //AOI1 TO INT1
    // GSENSOR_ReadReg(SL_SC7A20_CTRL_REG3,1, &SL_Read_Reg);
@@ -313,9 +313,9 @@ INT8  SL_SC7A20_INT_Config(void)
 //    GSENSOR_WriteReg(SL_SC7A20_CTRL_REG2, SL_Read_Reg);
 
     //�ж���ֵ����
-    GSENSOR_WriteReg(SL_SC7A20_INT2_THS, SL_SC7A20_INT_THS_5PERCENT);	
+    GSENSOR_WriteReg(SL_SC7A20_INT2_THS, SL_SC7A20_INT_THS_20PERCENT);	
     //������ֵ����ʱ�䴥���ж�
-    GSENSOR_WriteReg(SL_SC7A20_INT2_DURATION, SL_SC7A20_INT_DURATION_2CLK);
+    GSENSOR_WriteReg(SL_SC7A20_INT2_DURATION, SL_SC7A20_INT_DURATION_10CLK);
     
     //AOI2 TO INT2
     GSENSOR_ReadReg(SL_SC7A20_CTRL_REG6,1, &SL_Read_Reg);
@@ -501,7 +501,6 @@ void  SL_SC7A20_Reg_read_all(void)
 		GSENSOR_ReadReg(adr,1, &SL_Read_Reg);
 		printf("%#x = %#x\r\n",adr,SL_Read_Reg);	
 	}
-	
     printf("SL_SC7A20_Reg_readall --------\r\n");	
 }
 
@@ -559,23 +558,22 @@ INT8  SL_SC7A20_Read_XYZ_Data(INT8 *SL_SC7A20_Data_XYZ_Buf)
 INT8  SL_SC7A20_Read_XYZ_Data(INT16 *SL_SC7A20_Data_XYZ_Buf)
 {
     UINT8 SL_Read_Buf[7];
-    
     GSENSOR_ReadReg(SL_SC7A20_STATUS_REG,1, &SL_Read_Buf[0]);
-    #ifdef USING_PRINTF	
-		printf("SL_SC7A20_STATUS_REG = %#x\r\n",SL_Read_Buf[0]);
-	#endif
     if((SL_Read_Buf[0]&0x0f)==0x0f)
     {
-        GSENSOR_ReadReg(SL_SC7A20_DATA_OUT,6, &SL_Read_Buf[1]);
-        #ifdef USING_PRINTF	
-			printf("SL_SC7A20_DATA_OUT22 = %#x\r\n",SL_Read_Buf[1]);
-		#endif
+        for (UINT8 i = 1; i < 7; i++)
+        {
+            GSENSOR_ReadReg(SL_SC7A20_STATUS_REG+i,1, &SL_Read_Buf[i]);
+        }
         SL_SC7A20_Data_XYZ_Buf[0]=(INT16)((SL_Read_Buf[2]<<8) + SL_Read_Buf[1]);
         SL_SC7A20_Data_XYZ_Buf[1]=(INT16)((SL_Read_Buf[4]<<8) + SL_Read_Buf[3]);
         SL_SC7A20_Data_XYZ_Buf[2]=(INT16)((SL_Read_Buf[6]<<8) + SL_Read_Buf[5]);
-        #ifdef USING_PRINTF	
-			printf("SL_SC7A20_DATA_OUT BUF:X = %d,Y = %d,Z = %d\r\n",SL_SC7A20_Data_XYZ_Buf[0],SL_SC7A20_Data_XYZ_Buf[1],SL_SC7A20_Data_XYZ_Buf[2]);
-		#endif
+        SL_SC7A20_Data_XYZ_Buf[0] = SL_SC7A20_Data_XYZ_Buf[0]>>4;
+        SL_SC7A20_Data_XYZ_Buf[1] = SL_SC7A20_Data_XYZ_Buf[1]>>4;
+        SL_SC7A20_Data_XYZ_Buf[2] = SL_SC7A20_Data_XYZ_Buf[2]>>4;
+        SL_SC7A20_Data_XYZ_Buf[0] = SL_SC7A20_Data_XYZ_Buf[0]*2;
+        SL_SC7A20_Data_XYZ_Buf[1] = SL_SC7A20_Data_XYZ_Buf[1]*2;
+        SL_SC7A20_Data_XYZ_Buf[2] = SL_SC7A20_Data_XYZ_Buf[2]*2;
         return  1;
     }
     else