Pārlūkot izejas kodu

1.前后灯独立控制;2.增加电池容量的计算(上报单位功耗、剩余续航);3.CV写入增加反馈;4.FW、HW、CV、SN格式调整;

Ye Jin 5 mēneši atpakaļ
vecāks
revīzija
1f0239a0a1

+ 27 - 0
User project/3.BasicFunction/Include/Customization.h

@@ -0,0 +1,27 @@
+/*
+ * Customization.h
+ *
+ *  Created on: 2025年3月13日
+ *      Author: yejin4
+ */
+
+#ifndef _CUSTOMIZATION_H_
+#define _CUSTOMIZATION_H_
+
+/****************************************
+ *
+ *          Include
+ *
+ ****************************************/
+#include "giant_can.h"
+
+
+/****************************************
+ *
+ *          Definitions & Macros
+ *
+ ****************************************/
+#define GIANT_ENABLE                     1   //0-标准程序,1-giant定制
+
+
+#endif /* 3_BASICFUNCTION_INCLUDE_CUSTOMIZATION_H_ */

+ 3 - 1
User project/3.BasicFunction/Include/giant_can.h

@@ -117,6 +117,8 @@ typedef struct
     UBYTE RidingModeEn;
     UBYTE AdjustingMode;
     UBYTE StartMode;
+    UBYTE RearLight;//12V(2)
+    UBYTE FrontLight;//12V(1)
     UWORD WheelCircumference;
     UBYTE MaximumTorque;
     UBYTE Acceleration;
@@ -144,7 +146,7 @@ void giant_Init(void);
 void giant_10msTask(void);
 void CANFrame_Rx_ISR(void);
 void giant_CANRxData_Process(void);
-void giant_SendDriveChainPassiveData(UBYTE remoteMG, UBYTE DataAddr);
+void giant_SendDriveChainPassiveData(UBYTE nodegroup, UBYTE dataaddr);
 void giant_SendDriveChainActiveData(UBYTE functiongroup, UBYTE dataaddr);
 void giant_SendRemote(UBYTE motiongroup);
 void giant_SendExtendData(UBYTE dataaddr, UBYTE datatype, UBYTE *data, UBYTE len);

+ 33 - 1
User project/3.BasicFunction/Source/bikelight.c

@@ -20,6 +20,7 @@
 #include "power.h"
 #include "CodePara.h"
 #include "adc.h"
+#include "Customization.h"
 //----------------------------
 
 static BIKELED_STR         BikeLedPara;
@@ -229,6 +230,7 @@ void bikelight_voBikeLightControl(UWORD switchAction, BOOL Brate_Sta,UWORD uwLig
   }
   else
   {
+#if(GIANT_ENABLE == 0)
     // ---------------尾灯6个状态处理------------
     switch( ubBackLedMode)
     {
@@ -432,7 +434,37 @@ void bikelight_voBikeLightControl(UWORD switchAction, BOOL Brate_Sta,UWORD uwLig
          BikeLedGloFun.blBike_ForwardLedSta=FALSE;
         }
     }
-
+#else
+    if (stGiantControlParams.FrontLight == 1)
+    {
+        if(BikeLedPara.ubBike_keyLedSta==0)
+        {
+            IO_FORWARDLED_ON(); //开前灯
+            BikeLedPara.ubBike_keyLedSta=1;
+            BikeLedGloFun.blBike_ForwardLedSta=TRUE;
+        }
+    }
+    else if (stGiantControlParams.FrontLight == 0)
+    {
+        if(BikeLedPara.ubBike_keyLedSta!=0)
+        {
+         IO_FORWARDLED_OFF();//关前灯
+         BikeLedPara.ubBike_keyLedSta=0;
+         BikeLedGloFun.blBike_ForwardLedSta=FALSE;
+        }
+    }
+    
+    if (stGiantControlParams.RearLight == 1)
+    {
+        IO_BACKLED_ON();
+        BikeLedGloFun.blBike_BackLedSta = TRUE;
+    }
+    else if (stGiantControlParams.RearLight == 0)
+    {
+        IO_BACKLED_OFF();
+        BikeLedGloFun.blBike_BackLedSta = FALSE;
+    }
+#endif
     //--------------LED电路检测----------
     bikelight_voGetBikeLightError(adc_stUpOut.uwFU6VPu,BikeLedGloFun.blBike_ForwardLedSta,&BikeLedCheckF); //前灯检测
     bikelight_voGetBikeLightError(adc_stUpOut.uwRU6VPu,BikeLedGloFun.blBike_BackLedSta,&BikeLedCheckB); //尾灯检测

+ 1 - 1
User project/3.BasicFunction/Source/canAppl.c

@@ -264,7 +264,7 @@ void Can_voInitMC_Run(void)
     
     // Software version
     char chFwVersion[16]="V1r1r0_";
-    strncat(chFwVersion,COMMIT_TIME,8);
+    strncat(chFwVersion,COMMIT_TIME,9);
     strncpy(MC_VerInfo.FW_Version, (char *)chFwVersion, 16);
     
     // Firmware Special Info

+ 61 - 61
User project/3.BasicFunction/Source/giant_can.c

@@ -32,6 +32,7 @@ GiantStandardRemoteFrameID_Struct_t stGiantStandardRemoteFrameID_rx;
 GiantControlParams_Struct_t stGiantControlParams;
 CANFrame_Info_Struct_t stCANFrame_InfoRx = {MAXFRAME_SIZE, 0, 0, 0};
 CAN_ReceiveFrame_Struct_t stCAN_ReceiveFrame_Buf_Rx[MAXFRAME_SIZE];
+UBYTE HW_psn[3];
 /***************************************************************
  Function: 
  Description: 
@@ -56,6 +57,26 @@ void giant_Init(void)
         UWORD app_data[2] = {0xAAAA, 0x5555};//标记为有app
         FLASH_voWriteMoreData(APPLICATIONSTATUS_ADDRESS, app_data, 2);
     }
+    
+    ULONG tmpdata;
+    if(MC_VerInfo.ProductLabel[7] > '9')
+    {
+        tmpdata = (MC_VerInfo.ProductLabel[7]-0x58+10)*1000000 + (MC_VerInfo.ProductLabel[8]-0x30)*100000
+               +(MC_VerInfo.ProductLabel[9]-0x30)*10000+(MC_VerInfo.ProductLabel[12]-0x30)*1000+(MC_VerInfo.ProductLabel[13]-0x30)*100
+                +(MC_VerInfo.ProductLabel[14]-0x30)*10+(MC_VerInfo.ProductLabel[15]-0x30);
+    }
+    else
+    {
+        tmpdata = (MC_VerInfo.ProductLabel[7]-0x30)*1000000 + (MC_VerInfo.ProductLabel[8]-0x30)*100000
+               +(MC_VerInfo.ProductLabel[9]-0x30)*10000+(MC_VerInfo.ProductLabel[12]-0x30)*1000+(MC_VerInfo.ProductLabel[13]-0x30)*100
+                +(MC_VerInfo.ProductLabel[14]-0x30)*10+(MC_VerInfo.ProductLabel[15]-0x30);
+    }
+    HW_psn[0] = (UBYTE)((tmpdata & 0xFF0000)>>16);
+    HW_psn[1] = (UBYTE)((tmpdata & 0xFF00)>>8);
+    HW_psn[2] = (UBYTE)(tmpdata & 0xFF);
+    
+    power_stPowStateOut.powerstate = POWER_ON;
+    power_stPowStateOut.blPowerStartupFlg = TRUE;
 }
 
 void giant_10msTask(void)
@@ -304,19 +325,8 @@ void giant_CANRxData_Process(void)
                     {
                         if(CAN_ReceiveFrame_tmp->rx_dlen == 7)//cmd2
                         {
-                            if((CAN_ReceiveFrame_tmp->rx_data[0] & 0x30) == 0x00)
-                            {
-                                MC_ControlCode.LightSwitch = MC_LightSwitch_OFF;//light off
-                            }
-                            else if((CAN_ReceiveFrame_tmp->rx_data[0] & 0x30) == 0x10)
-                            {
-                                MC_ControlCode.LightSwitch = MC_LightSwitch_ON;//light on
-                            }
-                            else
-                            {
-                              //rsv
-                            }
-                            MC_RunInfo.LightSwitch = MC_ControlCode.LightSwitch;
+                            stGiantControlParams.RearLight = ((CAN_ReceiveFrame_tmp->rx_data[0] & 0x20) >> 5);//0-off,1-on
+                            stGiantControlParams.FrontLight = ((CAN_ReceiveFrame_tmp->rx_data[0] & 0x10) >> 4);//0-off,1-on
                             
                             stGiantControlParams.WheelCircumference = (CAN_ReceiveFrame_tmp->rx_data[2] + (CAN_ReceiveFrame_tmp->rx_data[3]<<8));//Tire circumference,900-2500mm                            
         
@@ -369,6 +379,7 @@ void giant_CANRxData_Process(void)
                         if(CAN_ReceiveFrame_tmp->rx_dlen == 8)//Capacity
                         {
                             BMS_RunInfo.SOC = CAN_ReceiveFrame_tmp->rx_data[0];
+                            BMS_RunInfo.RC = (CAN_ReceiveFrame_tmp->rx_data[1] + (CAN_ReceiveFrame_tmp->rx_data[2]<<8));
                         }
                         break;
                     }
@@ -383,12 +394,9 @@ void giant_CANRxData_Process(void)
                 {
                     case 0x4:
                     {
-                        if(CAN_ReceiveFrame_tmp->rx_dlen == 8)//Customized Version
-                        {
-                            memcpy(MC_RsASSCII.CustomASCII1, CAN_ReceiveFrame_tmp->rx_data, 8);
-                            //执行存储操作
-                            memcpy(flash_stPara.ubRsASSCII.CustomASCII1, MC_RsASSCII.CustomASCII1, sizeof(MC_RsASSCII.CustomASCII1));
-                        }
+                        memcpy(MC_RsASSCII.CustomASCII1, CAN_ReceiveFrame_tmp->rx_data, CAN_ReceiveFrame_tmp->rx_dlen);
+                        memcpy(flash_stPara.ubRsASSCII.CustomASCII1, MC_RsASSCII.CustomASCII1, sizeof(MC_RsASSCII.CustomASCII1));
+                        giant_SendDriveChainPassiveData(NODE_DRIVECHAIN, 0xF);
                         break;
                     }
                     default:
@@ -416,12 +424,12 @@ void giant_CANRxData_Process(void)
             {
                 case MG_HEARTBEAT:
                 {
-                    giant_SendDriveChainPassiveData(stGiantStandardRemoteFrameID_rx.MotionGroup,0xF);
+                    giant_SendDriveChainPassiveData(NODE_DRIVECHAIN, 0xF);
                     break;
                 }
                 case MG_CONFIRMATION:
                 {
-                    giant_SendDriveChainPassiveData(stGiantStandardRemoteFrameID_rx.MotionGroup,0xF);
+                    giant_SendDriveChainPassiveData(NODE_DRIVECHAIN, 0xF);
                     break;
                 }
                 case MG_ACTIVEDATA1:
@@ -445,33 +453,35 @@ void giant_CANRxData_Process(void)
                 }
                 case MG_PASSIVEDATA1:
                 {
-                    giant_SendDriveChainPassiveData(stGiantStandardRemoteFrameID_rx.MotionGroup,0x0);
-                    giant_SendDriveChainPassiveData(stGiantStandardRemoteFrameID_rx.MotionGroup,0x1);
-                    giant_SendDriveChainPassiveData(stGiantStandardRemoteFrameID_rx.MotionGroup,0x2);
+                    giant_SendDriveChainPassiveData(NODE_DRIVECHAIN, 0x0);
+                    giant_SendDriveChainPassiveData(NODE_DRIVECHAIN, 0x1);
+                    giant_SendDriveChainPassiveData(NODE_DRIVECHAIN, 0x2);
                     break;
                 }
                 case MG_PASSIVEDATA2:
                 {
-                    giant_SendDriveChainPassiveData(stGiantStandardRemoteFrameID_rx.MotionGroup,0x3);
-                    giant_SendDriveChainPassiveData(stGiantStandardRemoteFrameID_rx.MotionGroup,0x4);
-                    giant_SendDriveChainPassiveData(stGiantStandardRemoteFrameID_rx.MotionGroup,0x5);
                     break;
                 }
                 case MG_PASSIVEDATA3:
                 {
-                    
                     break;
                 }
                 case MG_PASSIVEDATA4:
                 {
-                    giant_SendDriveChainPassiveData(stGiantStandardRemoteFrameID_rx.MotionGroup,0xB);
-                    giant_SendDriveChainPassiveData(stGiantStandardRemoteFrameID_rx.MotionGroup,0xC);
                     break;
                 }
                 default:
                     break;
             }
         }
+        else if(stGiantStandardRemoteFrameID_rx.ResponseNodeGroup == NODE_GIANTAPP)
+        {
+            if(stGiantStandardRemoteFrameID_rx.MotionGroup == MG_PASSIVEDATA4)
+            {
+                giant_SendDriveChainPassiveData(NODE_GIANTAPP, 0xC);
+                giant_SendDriveChainPassiveData(NODE_GIANTAPP, 0xD);
+            }
+        }
     }
     
     giant_DataProcess();
@@ -485,55 +495,47 @@ void giant_CANRxData_Process(void)
   }
 }
 
-void giant_SendDriveChainPassiveData(UBYTE remoteMG, UBYTE DataAddr)
+void giant_SendDriveChainPassiveData(UBYTE nodegroup, UBYTE dataaddr)
 {
     UBYTE len = 8;
     UBYTE data[8] = {0,};
     UWORD ID = 0;
     
     ID = ((FG_RESPONSEDATA<<9)
-          |(NODE_DRIVECHAIN<<5)
+          |(nodegroup<<5)
           |(DB_PASSIVEDATA<<4)
-          |DataAddr);
+          |dataaddr);
       
-    switch(DataAddr)
+    switch(dataaddr)
     {
         case 0x0:
         {
-            memcpy(data, (UBYTE *)"MOAACITY", 8);//Mode name
+            memcpy(data, (UBYTE *)"MOAA", 4);//FW
+            
+            data[4] = ((MC_VerInfo.FW_Version[9]-0x30)<<4) + (MC_VerInfo.FW_Version[10]-0x30);//year
+            data[5] = ((MC_VerInfo.FW_Version[11]-0x30)*10) + (MC_VerInfo.FW_Version[12]-0x30);//month
+            data[6] = ((MC_VerInfo.FW_Version[13]-0x30)<<4) + (MC_VerInfo.FW_Version[14]-0x30);//day
+            data[7] = 0x30;
             break;
         }
         case 0x1:
         {
-            memcpy(data, MC_VerInfo.FW_Version, 8);//FW1
+            memcpy(data, (UBYTE *)"XMOA", 4);//HW
+            data[4] = 0x30;
+            memcpy(&data[5], HW_psn, 3);
             break;
         }
         case 0x2:
-        {
-            memcpy(data, &MC_VerInfo.FW_Version[8], 8);//FW2
-            break;
-        }
-        case 0x3:
-        {
-            memcpy(data, MC_VerInfo.HW_Version, 8);//HW1
-            break;
-        }
-        case 0x4:
-        {
-            memcpy(data, &MC_VerInfo.HW_Version[8], 8);//HW2
-            break;
-        }
-        case 0x5:
         {
             memcpy(data, MC_RsASSCII.CustomASCII1, 8);//Customized Version
             break;
         }
-        case 0xB:
+        case 0xC:
         {
             memcpy(data, MC_VerInfo.ProductLabel, 8);//SN1
             break;
         }
-        case 0xC:
+        case 0xD:
         {
             memcpy(data, &MC_VerInfo.ProductLabel[8], 8);//SN2
             break;
@@ -586,12 +588,10 @@ void giant_SendDriveChainActiveData(UBYTE functiongroup, UBYTE dataaddr)
             {
                 data[0] |= 0x01;//Communication sleep
             }
-            if(MC_RunInfo.LightSwitch == MC_LightSwitch_ON)
-            {
-                data[2] |= (0x01<<6);
-            }   
-            data[2] |= (stGiantControlParams.StartMode<<4);
-            data[2] |= (MC_RunInfo.CadenceDir<<2);
+            data[2] = ((stGiantControlParams.RearLight<<7)
+                        | (stGiantControlParams.FrontLight<<6)
+                        | (stGiantControlParams.StartMode<<4)
+                        | (MC_RunInfo.CadenceDir<<2));
             data[3] = (UBYTE)(stGiantControlParams.SpeedLimitation & 0xFF);// speed limitation,0.01km/h
             data[4] = (UBYTE)((stGiantControlParams.SpeedLimitation & 0xFF00) >> 8);
             break;
@@ -659,8 +659,8 @@ void giant_SendDriveChainActiveData(UBYTE functiongroup, UBYTE dataaddr)
             data[3] = (UBYTE)(((BMS_VoltEstimat.uwIbusLpf/10) & 0xFF00) >> 8);
             data[4] = (UBYTE)(MC_RunInfo.MotorSpeed & 0xFF);//  motor rotor speed,RPM
             data[5] = (UBYTE)((MC_RunInfo.MotorSpeed & 0xFF00) >> 8);
-//            data[6] = (UBYTE)(MC_RunInfo.RemainDistance & 0xFF);// remaining range of drive chain system,km
-//            data[7] = (UBYTE)((MC_RunInfo.RemainDistance & 0xFF00) >> 8);
+            data[6] = (UBYTE)(MC_RunInfo.RemainDistance & 0xFF);// remaining range of drive chain system,km
+            data[7] = (UBYTE)((MC_RunInfo.RemainDistance & 0xFF00) >> 8);
             break;
         }
         case 0x7:

+ 1 - 1
tools/reduce_bin.py

@@ -39,6 +39,6 @@ def reduce_bin_file_size(relative_path, target_size):
     print(f"新文件已创建: {new_file_path},大小: {target_size} 字节")
 
 # 示例用法
-relative_path = 'Debug/Exe/MC_MTB-36V_V1.0.1_20240319.bin'  # 替换为你的 bin 文件相对路径
+relative_path = 'Debug/Exe/MC_CITY-36V_V1.1.0_20250315.bin'  # 替换为你的 bin 文件相对路径
 target_size = 116*1024  # 目标文件大小(字节),例如 1024 字节
 reduce_bin_file_size(relative_path, target_size)