例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
#ifndef __PROJ_CANBMS_H__
#define __PROJ_CANBMS_H__
 
#include <stdint.h>
#include "double_list.h"
 
#define BMS_CAN                 CANFD0  //CANFD1
#define BMS_DEVICE_MAX_BUM      100
#define CAN_RECV_BUFF_NUM       50
#define Device_Max_Num          300     //BMS最大设备数
 
//设置Location空闲超时时间
#define DEVICE_LOCATION_IDLE_TIMEOUT    50000   //设备定位空闲超时时间 *1ms
//设置Search空闲超时时间
#define DEVICE_SEARCH_IDLE_TIMEOUT      50000   //设备搜索空闲超时时间 *1ms
 
//Search升级设备搜索时间
#define DEVICE_UPGRADE_SEARCH_TIMEOUT   10000
//Location升级设备定位时间
#define DEVICE_UPGRADE_LOCATION_TIMEOUT 10000
 
//设置BMS-OTA超时时间
#define DEVICE_LOCATIONH_TIMEOUT        30000   //设备定位超时时间 *1ms
#define DEVICE_SEARCH_TIMEOUT           30000   //设备搜索超时时间 *1ms
#define DEVICE_REQUEST_TIMEOUT          30000   //设备下载申请超时时间 *1ms
#define DEVICE_ERASE_TIMEOUT            50000   //设备下载擦除超时时间 *1ms
#define DEVICE_WRITE_TIMEOUT            6000    //设备下载写入超时时间 *1ms
#define DEVICE_WRITE_END_TIMEOUT        2000    //设备下载写入完成超时时间 *1ms
 
//设备发送超时时间   < 与设备数有关 - 与缓冲区有关 - 与BMS设备超时时间有关 >
#define DEVICE_SEARCH_TIMEOUT_SEND      250//300     //设备搜索超时发送时间 *1ms
#define DEVICE_REQUEST_TIMEOUT_SEND     300     //设备下载申请超时发送时间 *1ms
#define DEVICE_ERASE_TIMEOUT_SEND       300     //设备下载擦除超时发送时间 *1ms
#define DEVICE_WRITE_END_TIMEOUT_SEND   300     //设备下载写入超时发送完成时间 *1ms
 
/*  DeviceIndex
    ALL         0XFF
    BCU         1H
    BSMU        2H
    BAMU        3H
    ITMU        4H
    ITPU        5H
    EMU         6H
    PC          FH
*/
 
//BMS设备信息
typedef struct{
    int macAddr[4];
    uint8_t arch_id[3];     //arch1_id arch2_id arch3_id
    uint8_t routeLevel;
    uint16_t tempID;
    uint16_t setID;
    uint32_t timeout;
    //uint8_t info;      //firmwareVersion + device_grade
    uint8_t firmwareVersion;
    uint8_t device_grade;
    uint8_t device_type;
    uint8_t isSelect;
    uint8_t isReady;
    uint8_t randomid;   //随机码
}BMSDeviceInfo_t;
 
//Location Search Page
typedef struct{
    uint8_t macAddr[4];
    uint8_t arch_id[3];
}Location_Search_Pack_t;
 
//BMS设备链表
typedef struct{
    BMSDeviceInfo_t BMSDeviceInfo_Member;
    double_list_t list;
}BMSDeviceInfo_Member_List_t;
 
//BMS升级设备链表
typedef struct{
    uint8_t arch_id[3];
    uint8_t Select_Flag;
    uint8_t ota_status;
    double_list_t list;
}Device_Upgrade_List_t;
 
//BMS升级设备类型信息 -- 设备类型链表嵌套设备链表
typedef struct{
    Device_Upgrade_List_t Device_Upgrade_List_Head;
    uint8_t device_type;
    uint8_t Select_Flag;
    double_list_t list;
}Device_Type_List_t;
 
//定位包
typedef struct{
    uint64_t Server_id;
    uint8_t data_id[50];
    uint8_t onoff;
    uint8_t type;
    uint8_t file_type;
    uint16_t timeInterval;      //主动上报发送间隔/ms 和 被动模式
}Location_Pack_t;
extern Location_Pack_t Location_Pack;
 
//搜索包
typedef struct{
    uint64_t Server_id;
    uint8_t data_id[50];
    uint8_t onoff;
    uint8_t type;
    uint8_t info;
    uint16_t layer_num; //MAX  100
    int macAddr[100][4];
    int arch_id[100][3]; //arch3_id  arch2_id  arch1_id
    uint8_t file_type;
    uint16_t timeInterval;      //主动上报发送间隔/ms 和 被动模式
}Search_Pack_t;
extern Search_Pack_t Search_Pack;
 
//BMS升级包
typedef struct{
    uint64_t Server_id;
    uint8_t data_id[20];
    uint8_t file_id[20];
    uint8_t file_name[50];
    uint32_t crc;
    uint8_t type;       //1:bin  2:s19
    uint8_t file_path[50];
    uint8_t version[10];
    uint8_t deviceList[300][4];
    uint32_t select_device_num;
}Updown_Pack_t;
extern Updown_Pack_t Updown_Pack;
 
//终端升级包
typedef struct{
    uint64_t Server_id;
    uint32_t crc;
    uint8_t data_id[20];
    uint8_t file_id[20];
    uint8_t file_name[50];
    uint8_t file_path[50];
    uint8_t version[13];
}Ars_Updown_Pack_t;
extern Ars_Updown_Pack_t Ars_Updown_Pack;
 
//Boot流程
enum CANBootStep{
    BOOT_IDLE = 0,
    BOOT_DEVICE_LOCATION = 8,
    BOOT_DEVICE_SEARCH = 1,
    BOOT_BURNING_REQUEST = 2,
    BOOT_MEM_ERASE = 3,
    BOOT_MEM_WRITE = 4,
    BOOT_MEM_WRITE_END = 5,
    BOOT_MEM_READ = 6,
    BOOT_APP_GO = 7,
};
 
//OTA流程
enum OtaStep{
    OTA_IDLE = 0,
    OTA_ARS = 1,
    OTA_BMS = 2,
};
 
//BMS Position错误码
enum BMS_Position_Failed_Code{
    POSITION_CAN_SEND_FAILED = 12900,                   //定位CAN发送失败
    POSITION_JSON_PARSE_FAILED = 12901,                 //Position包json数据解析异常
    POSITION_ARS_Upgrading_FAILED = 12902,              //定位ARS正在升级,拒绝搜索
    POSITION_BMS_Upgrading_FAILED = 12903,              //定位BMS正在升级,拒绝搜索
};
 
//BMS Search错误码
enum BMS_Search_Failed_Code{
    SEARCH_CAN_SEND_FAILED = 13000,                      //搜索CAN发送失败
    SEARCH_JSON_PARSE_FAILED = 13001,                    //Search包json数据解析异常
    SEARCH_ARS_Upgrading_FAILED = 13002,                 //搜索ARS正在升级,拒绝搜索
    SEARCH_BMS_Upgrading_FAILED = 13003,                 //搜索BMS正在升级,拒绝搜索
};
 
//BMS OTA升级错误码
enum BMS_Ota_Step_Failed_Code{
    BMS_ALL_TYPE_DEVICE_NOT_ALLOW_UPGRADE = 13211,       //BMS全类型设备,不允许升级
    BMS_UPGRAD_JSON_PARSE_FAILED = 13200,                //BMS升级包json数据解析异常
    BMS_DEVICE_HAPPEN_OFFLINE_FAILED = 13201,            //BMS设备发生掉线,片选设备与在线设备不一致
    BMS_REQUEST_SEND_FAILED = 13202,                     //BMS设备升级请求发送失败
    BMS_REQUEST_TIMEOUT_FAILED = 13203,                  //BMS设备升级请求接收超时失败
    BMS_MEM_ERASE_SEND_FAILED = 13204,                   //BMS设备升级擦除发送失败
    BMS_MEM_ERASE_TIMEOUT_FAILED = 13205,                //BMS设备升级擦除接收超时失败
    BMS_MEM_WRITE_SEND_FAILED = 13206,                   //BMS设备升级数据传输发送失败
    BMS_MEM_WRITE_TIMEOUT_FAILED = 13207,                //BMS设备升级数据传输接收超时失败
    BMS_DATA_CRC_FAILED = 13208,                         //BMS设备升级数据传输校验失败
    BMS_FLASH_WRITE_READ_CRC_SEND_FAILED = 13209,        //BMS设备升级数据存储校验发送失败
    BMS_FLASH_WRITE_READ_CRC_TIMEOUT_FAILED = 13210,     //BMS设备升级数据存储校验接收超时失败
    BMS_DEVICE_POS_FAILED = 13212,                       //BMS设备列表位置错误
};
 
//ARS OTA升级错误码
enum ARS_Ota_Step_Failed_Code{
    ARS_UPGRAD_JSON_PARSE_FAILED = 13400,                //升级包json数据解析异常
    ARS_VERSION_TOO_LOW_FAILED = 13401,                  //ARS设备升级版本太低升级失败
    ARS_MEM_WRITE_FAILED = 13402,                        //ARS设备升级数据传输失败
    ARS_DATA_CRC_FAILED = 13403,                         //ARS设备升级数据传输校验失败
    ARS_FLASH_WRITE_READ_CRC_FAILED = 13404,             //ARS设备升级数据存储校验失败
};
 
//FTP错误码
enum FTP_ERROR_CODE{
    FTP_LOGIN_FAILED = 13600,                            //FTP登录失败
    FTP_FILE_PATH_FAILED = 13601,                        //FTP文件路径失败
    FTP_PASV_FAILED = 13602,                             //FTP被动模式失败
    FTP_DATA_PORT_CONNECT_FAILED = 13603,                //FTP服务器数据端口连接失败
    FTP_FILE_SIZE_FAILED = 13604,                        //FTP文件大小格式失败
    FTP_RETR_FAILED = 13605,                             //FTP指令下载失败
};
 
typedef struct{
    uint32_t address;
    uint16_t data_length;
    uint8_t data[256];
}S19_Record;
 
//Ota队列数据
typedef struct{
    /*
        1:data
        2:Crc_Data
    */
    uint8_t type;
    uint8_t data[8];
}Ota_Queue_Data_t;
 
/* Global variables */
extern BMSDeviceInfo_Member_List_t Device_list_Head;
extern BMSDeviceInfo_Member_List_t Device_Location_list_Head;
extern QueueHandle_t OTA_Data_QueueHandle;
extern QueueHandle_t Can_Recv_Data_QueueHandle;
extern SemaphoreHandle_t OTA_Topic_BinarySemHandle;
extern SemaphoreHandle_t OTA_Last_Data_BinarySemHandle;
extern SemaphoreHandle_t OTA_Crc_Data_BinarySemHandle;
extern SemaphoreHandle_t OTA_Data_Done_BinarySemHandle;
extern uint16_t DeviceIndex;            //设备ID
extern volatile uint8_t CANBootStep;    //升级流程
extern uint8_t CANBootStatus;
extern uint64_t Device_Upgrade_Search_Timeout_Num;
extern uint64_t Device_Upgrade_Location_Timeout_Num;
 
void Bms_Boot_Init(void);
void Bms_Upgrade_Send_Recv_Pro(void);
int8_t Boot_Device_Location(uint16_t deviceIndex);
int8_t Boot_Device_Search(uint16_t deviceIndex);
int8_t Boot_Device_Search_t(uint16_t deviceIndex);
int8_t Boot_Device_Request(void);
//int8_t Boot_Mem_Erase(void);
int8_t Boot_Mem_Erase(uint16_t deviceIndex);
int8_t Boot_Mem_Write_End(uint16_t deviceIndex);
int8_t Boot_Mem_Write_S19_Bin(uint16_t deviceIndex, uint8_t *au8Data, uint32_t data_len);
int8_t Parse_S19_Record(const char *line, S19_Record *record);
int8_t Parse_S19_AddressLen(char *line);
void CANBootStep_Set(uint8_t BootStep);
void Clean_Search_Device_List(void);
void Clean_Location_Device_List(void);
void Bms_Boot_List_Pro(void);
void Bms_Boot_Arr_Pro(void);
 
#endif

  

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
/**
 * @Author: wangxy
 * @Date: 2024-08-15
 * @LastEditTime: 2024-08-15
 * @LastEditors: wangxy
 * @Description: proj_canbms
 * @FilePath: proj_canbms.c
 */
 
#include "main.h"
#include "proj_canbms.h"
#include "proj_fifo.h"
#include "FTP_client.h"
#include "sal_netdb.h"
#include "net_sockets.h"
#include "mqttclient.h"
 
/* Global variables */
QueueHandle_t OTA_Data_QueueHandle;
QueueHandle_t Can_Recv_Data_QueueHandle;
SemaphoreHandle_t OTA_Topic_BinarySemHandle;
SemaphoreHandle_t OTA_Last_Data_BinarySemHandle;
SemaphoreHandle_t OTA_Crc_Data_BinarySemHandle;
SemaphoreHandle_t OTA_Data_Done_BinarySemHandle;
BMSDeviceInfo_Member_List_t Device_list_Head;           //定义设备头节点
BMSDeviceInfo_Member_List_t Device_Location_list_Head;  //定义设备定位头节点
Device_Type_List_t Device_Type_List_Head;               //定义升级设备类型头节点 -- 设备类型链表再嵌套设备链表
double_list_t *ptr =NULL;
volatile uint8_t CANBootStep = BOOT_IDLE;  //BOOT_DEVICE_SEARCH;   //0;
fifo_t *Can_Recv_Buff;
uint16_t DeviceIndex = 0;    //设备ID
uint8_t OTA_Data_Done_BinarySemHandle_Flag =0;
Search_Pack_t Search_Pack;
Location_Pack_t Location_Pack;
Updown_Pack_t Updown_Pack;
Ars_Updown_Pack_t Ars_Updown_Pack;
uint16_t BOOT_Send_Timeout_Num;
extern TaskHandle_t CAN_BMS_Upgrade_handle;
volatile uint8_t CAN_BMS_BOOT_Flag =0;
Location_Search_Pack_t Location_Search_Pack;
//Search升级设备搜索时间
uint64_t Device_Upgrade_Search_Timeout_Num =DEVICE_UPGRADE_SEARCH_TIMEOUT;
//Location升级设备定位时间
uint64_t Device_Upgrade_Location_Timeout_Num =DEVICE_UPGRADE_LOCATION_TIMEOUT;
 
/**
 * @details: This function is Bms Boot Init
 */
void Bms_Boot_Init(void)
{
    /* 初始化设备链表头 */
    memset(&Device_list_Head,0,sizeof(Device_list_Head));
    double_list_init(&Device_list_Head.list);
    /* 初始化设备定位链表头 */
    memset(&Device_Location_list_Head,0,sizeof(Device_Location_list_Head));
    double_list_init(&Device_Location_list_Head.list);
    /* 初始化设备类型链表头和升级设备链表头 */
    memset(&Device_Type_List_Head,0,sizeof(Device_Type_List_Head));
    double_list_init(&Device_Type_List_Head.list);
    memset(&Device_Type_List_Head.Device_Upgrade_List_Head,0,sizeof(Device_Type_List_Head.Device_Upgrade_List_Head));
    double_list_init(&Device_Type_List_Head.Device_Upgrade_List_Head.list);
    /* 初始化CAN-Fifo缓冲区 */
    Can_Recv_Buff =fifo_alloc(CAN_RECV_BUFF_NUM, sizeof(CANFD_FD_MSG_T));
    if(Can_Recv_Buff==NULL){
        RS_LOGE("Can_Recv_Buff fifo_alloc Failed\n");
    }
    /* 初始化CAN-Queue缓冲区 */
    Can_Recv_Data_QueueHandle =xQueueCreate(CAN_RECV_BUFF_NUM, sizeof(CANFD_FD_MSG_T));
    if(Can_Recv_Data_QueueHandle ==NULL){
        RS_LOGE("Can_Recv_Data_QueueHandle xQueueCreate failed!");
    }
    /* 初始化OTA数据缓冲队列 */
    OTA_Data_QueueHandle =xQueueCreate(1, sizeof(Ota_Queue_Data_t));
    if(OTA_Data_QueueHandle ==NULL){
        RS_LOGE("OTA_Data_QueueHandle xQueueCreate failed!");
    }
    /* CreateBinary OTA_Data_Done_BinarySemHandle */
    OTA_Data_Done_BinarySemHandle =xSemaphoreCreateBinary();
    //vSemaphoreCreateBinary(OTA_Data_Done_BinarySemHandle);
    //OTA_Data_Done_BinarySemHandle = xSemaphoreCreateMutex();
    if(OTA_Data_Done_BinarySemHandle ==NULL){
        RS_LOGE("OTA_Data_Done_BinarySemHandle vSemaphoreCreateBinary failed!");
    }
    /* CreateBinary OTA_Crc_Data_BinarySemHandle */
    OTA_Crc_Data_BinarySemHandle =xSemaphoreCreateBinary();
    if(OTA_Crc_Data_BinarySemHandle ==NULL){
        RS_LOGE("OTA_Crc_Data_BinarySemHandle vSemaphoreCreateBinary failed!");
    }
    /* CreateBinary OTA_Last_Data_BinarySemHandle */
    OTA_Last_Data_BinarySemHandle =xSemaphoreCreateBinary();
    if(OTA_Last_Data_BinarySemHandle ==NULL){
        RS_LOGE("OTA_Last_Data_BinarySemHandle vSemaphoreCreateBinary failed!");
    }
    /* CreateBinary OTA_Topic_BinarySemHandle */
    //OTA_Topic_BinarySemHandle =xSemaphoreCreateBinary();
    vSemaphoreCreateBinary(OTA_Topic_BinarySemHandle);
    if(OTA_Topic_BinarySemHandle ==NULL){
        RS_LOGE("OTA_Topic_BinarySemHandle vSemaphoreCreateBinary failed!");
    }
}
 
/**
 * @details: This function is Bms Boot Deinit
 */
void Bms_Boot_Deinit(void)
{
     //no use
}
 
 
 
/**链表形式
 * @details: This function is Bms Boot List Pro
 */
void Bms_Boot_List_Pro(void)
{
    int8_t device_type =-1;
    /* 1.遍历设备类型 --> 选定设备类型 --> 开启路线定位 */
    {
        /* 1.逐一获取所有设备类型的节点 --> 获取当前类型的所有路线 */
        if(double_list_isempty(&Device_Type_List_Head.list) ==0){
            //登录FTP服务器
            if(zFTP_Connect_Fun()<0){
                RS_LOGW("zFTP_Connect_Fun Failed and Thread Exit");
                vTaskDelete(NULL);
            }
            //逐一遍历设备类型
            double_list_t *Device_Type_List_ptr =NULL;
            double_list_for_each(Device_Type_List_ptr,&Device_Type_List_Head.list){
                Device_Type_List_t *Device_Type_Member =double_list_entry(Device_Type_List_ptr, Device_Type_List_t, list);
                device_type =Device_Type_Member->device_type;
                //设置设备类型,开启BMS定位
                DeviceIndex =device_type;
                CANBootStep_Set(BOOT_DEVICE_LOCATION);
                //等待设备路线索引完成,通过设备类型,定位所有路线
                //...  Wait delay()  ...
                uint16_t Loop_Timeout =1000;
                do{
                    vTaskDelay(100);
                    //超时结束处理
                    if(!(Loop_Timeout--)){
                        RS_LOGW("Bms_Boot_List_Pro Location_Timeout Thread Exit");
                        CANBootStep_Set(BOOT_IDLE);
                        vTaskDelete(NULL);
                    }
                }while(Device_Upgrade_Location_Timeout_Num !=0);
                /* 2.逐一定位所有路线 --> 再搜索当前路线下的所有设备 */
                {
                    //1.逐一选定路线索引所有设备
                    if(double_list_isempty(&Device_Location_list_Head.list) ==0){
                        double_list_t *Device_Location_list_Head_ptr =NULL;
                        //开始逐个遍历所有路线
                        double_list_for_each(Device_Location_list_Head_ptr,&Device_Location_list_Head.list){
                            //先通过遍历判断当前设备链表是否已全部升级成功且完成?
                            int8_t Device_Upgrade_Member_Flag= 0;
                            double_list_t *Device_Upgrade_List_Head_ptr =NULL;
                            double_list_for_each(Device_Upgrade_List_Head_ptr, &Device_Type_Member->Device_Upgrade_List_Head.list){
                                Device_Upgrade_List_t *Device_Upgrade_Member =double_list_entry(Device_Upgrade_List_Head_ptr, Device_Upgrade_List_t, list);
                                if(Device_Upgrade_Member->Select_Flag ==0){
                                    //当前设备升级链表没有全部升级完成
                                    Device_Upgrade_Member_Flag =1;
                                }
                            }
                            if(Device_Upgrade_Member_Flag){
                                BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(Device_Location_list_Head_ptr, BMSDeviceInfo_Member_List_t, list);
                                memset(&Location_Search_Pack, 0, sizeof(Location_Search_Pack));
                                Location_Search_Pack.macAddr[0] =BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[0];
                                Location_Search_Pack.macAddr[1] =BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[1];
                                Location_Search_Pack.macAddr[2] =BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[2];
                                Location_Search_Pack.macAddr[3] =BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[3];
                                Location_Search_Pack.arch_id[0] =BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[0];
                                Location_Search_Pack.arch_id[1] =BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[1];
                                Location_Search_Pack.arch_id[2] =BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[2];
                                //发送定位,开启BMS搜索
                                CANBootStep_Set(BOOT_DEVICE_SEARCH);
                                //等待当前路线下的设备搜索完成
                                //...  Wait delay()  ...
                                uint16_t Loop_Timeout =1000;
                                do{
                                    vTaskDelay(100);
                                    //超时结束处理
                                    if(!(Loop_Timeout--)){
                                        RS_LOGW("Bms_Boot_List_Pro Search_Timeout Thread Exit");
                                        CANBootStep_Set(BOOT_IDLE);
                                        vTaskDelete(NULL);
                                    }
                                }while(Device_Upgrade_Search_Timeout_Num !=0);
                                /* 3.当前路线下设备与升级设备进行匹配和片选 */
                                uint8_t Route_Select_Flag =0;
                                double_list_t *Device_Upgrade_List_Head_ptr =NULL;
                                Device_Upgrade_List_t *Device_Upgrade_Member =NULL;
                                double_list_for_each(Device_Upgrade_List_Head_ptr, &Device_Type_Member->Device_Upgrade_List_Head.list){  //设备类型下--所有设备
                                    Device_Upgrade_Member =double_list_entry(Device_Upgrade_List_Head_ptr, Device_Upgrade_List_t, list);
                                    double_list_t *Device_list_Head_ptr =NULL;
                                    double_list_for_each(Device_list_Head_ptr,&Device_list_Head.list){
                                        BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(Device_list_Head_ptr, BMSDeviceInfo_Member_List_t, list);
                                        //匹配片选
                                        if(memcmp(Device_Upgrade_Member->arch_id, BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id, sizeof(BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id))==0){
                                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.isSelect =1;
                                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout =DEVICE_REQUEST_TIMEOUT;
                                            Device_Upgrade_Member->Select_Flag =1;
                                            Route_Select_Flag =1;
                                        }
                                    }
                                }
                                if(Route_Select_Flag){
                                    #if 0
                                    //匹配和片选成功,开始升级
                                    int8_t download_rel =download_S19_Bin_file_fun(1);
                                    //开始启动升级!
                                    int8_t download_rel =download_S19_Bin_file_fun(&Bms_Ota_Info_Arr.bms_ota_info[i]);
                                    //升级结束,成功则置位,片选标志清零。
                                    double_list_for_each(Device_Upgrade_List_Head_ptr,&Device_Type_Member->Device_Upgrade_List_Head.list){
                                        Device_Upgrade_Member =double_list_entry(Device_Upgrade_List_Head_ptr, Device_Upgrade_List_t, list);
                                        if(Device_Upgrade_Member->Select_Flag ==1){
                                            Device_Upgrade_Member->Select_Flag =0;
                                            if(download_rel==0){
                                                Device_Upgrade_Member->ota_status =1;
                                            }
                                        }
                                    }
                                    #endif
                                }
                            }
                        }
                    }
                }
            }
            //关闭FTP服务器
            zFTP_Close_Fun();
            //全部升级完成,遍历是否全部升级成功
            double_list_for_each(Device_Type_List_ptr,&Device_Type_List_Head.list){
                Device_Type_List_t *Device_Type_Member =double_list_entry(Device_Type_List_ptr, Device_Type_List_t, list);
                double_list_t *Device_Upgrade_List_Head_ptr =NULL;
                double_list_for_each(Device_Upgrade_List_Head_ptr, &Device_Type_Member->Device_Upgrade_List_Head.list){
                    Device_Upgrade_List_t *Device_Upgrade_Member =double_list_entry(Device_Upgrade_List_Head_ptr, Device_Upgrade_List_t, list);
                    if(Device_Upgrade_Member->ota_status == 0){
                        //完全升级失败
                        /* deal result */
                    }
                }
            }
        }else{
            //链表为空,无升级需求!
        }
    }
    vTaskDelete(NULL);
}
 
/**数组形式
 * @details: This function is Bms Boot Arr Pro
 */
void Bms_Boot_Arr_Pro(void)
{
    int8_t device_type =-1;
    /* 1.遍历设备类型 --> 选定设备类型 --> 开启路线定位 */
    {
        /* 1.逐一获取所有设备类型的节点 --> 获取当前类型的所有路线 */
        if(Bms_Ota_Info_Arr.bms_ota_info_num !=0){
            #if 0
            //登录FTP服务器
            if(zFTP_Connect_Fun()<0){
                RS_LOGW("zFTP_Connect_Fun Failed and Thread Exit");
                zFTP_Close_Fun();
                vTaskDelete(NULL);
            }
            #endif
            /* 逐一遍历每个升级的设备类型 */
            for(uint8_t i=0; i<Bms_Ota_Info_Arr.bms_ota_info_num; i++){
                device_type =Bms_Ota_Info_Arr.bms_ota_info[i].device_type;
                //设置设备类型,开启BMS定位
                DeviceIndex =device_type;
                CANBootStep_Set(BOOT_DEVICE_LOCATION);
                //等待设备路线索引完成,通过设备类型,定位所有路线
                //...  Wait delay()  ...
                uint16_t Loop_Timeout =200;
                do{
                    vTaskDelay(100);
                    //超时结束处理
                    if(!(Loop_Timeout--)){
                        RS_LOGW("Bms_Boot_Arr_Pro Location_Timeout Thread Exit");
                        CANBootStep_Set(BOOT_IDLE);
                        //zFTP_Close_Fun();
                        goto Bms_Boot_Arr_Pro_Exit;
                    }
                }while(Device_Upgrade_Location_Timeout_Num !=0);
                /* 2.逐一定位所有路线 --> 再搜索当前路线下的所有设备 */
                {
                    //1.逐一选定路线索引所有设备
                    if(double_list_isempty(&Device_Location_list_Head.list) ==0){
                        double_list_t *Device_Location_list_Head_ptr =NULL;
                        #if 0
                        /***********打印出所有的链表节点***********/
                        double_list_t *Device_Location_list_Head_ptr_t =NULL;
                        double_list_for_each(Device_Location_list_Head_ptr_t,&Device_Location_list_Head.list){
                            BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(Device_Location_list_Head_ptr_t, BMSDeviceInfo_Member_List_t, list);
                            RS_LOGI("macAddr[0]:%x macAddr[1]:%x macAddr[2]:%x macAddr[3]:%x\n\
                                    arch_id[0]:%d arch_id[1]:%d arch_id[2]:%d \n",
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[0],
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[1],
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[2],
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[3],
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[0],
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[1],
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[2]);
                        }
                        #endif
                        //开始逐个遍历所有路线
                        double_list_for_each(Device_Location_list_Head_ptr,&Device_Location_list_Head.list){
                            //先通过遍历判断当前设备链表是否已全部升级成功且完成?
                            int8_t Device_Upgrade_Member_Flag =0;
                            for(uint8_t m=0; m<Bms_Ota_Info_Arr.bms_ota_info[i].positions_device_num; m++){
                                if(Bms_Ota_Info_Arr.bms_ota_info[i].devces_positions_info[m].Select_Flag==0){
                                    //当前设备升级链表没有全部升级完成
                                    Device_Upgrade_Member_Flag =1;
                                }
                            }
                            if(Device_Upgrade_Member_Flag){
                                BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(Device_Location_list_Head_ptr, BMSDeviceInfo_Member_List_t, list);
                                memset(&Location_Search_Pack, 0, sizeof(Location_Search_Pack));
                                Location_Search_Pack.macAddr[0] =BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[0];
                                Location_Search_Pack.macAddr[1] =BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[1];
                                Location_Search_Pack.macAddr[2] =BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[2];
                                Location_Search_Pack.macAddr[3] =BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[3];
                                //层级编号
                                if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.routeLevel ==3){
                                    Location_Search_Pack.arch_id[0] =0xFF;
                                }else{
                                    Location_Search_Pack.arch_id[0] =BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[0];
                                }
                                if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.routeLevel ==2){
                                    Location_Search_Pack.arch_id[1] =0xFF;
                                }else{
                                    Location_Search_Pack.arch_id[1] =BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[1];
                                }
                                if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.routeLevel ==1){
                                    Location_Search_Pack.arch_id[2] =0xFF;
                                }else{
                                    Location_Search_Pack.arch_id[2] =BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[2];
                                }
                                //发送定位,开启BMS搜索
                                CANBootStep_Set(BOOT_DEVICE_SEARCH);
                                //等待当前路线下的设备搜索完成
                                //...  Wait delay()  ...
                                uint16_t Loop_Timeout =200;
                                do{
                                    vTaskDelay(100);
                                    //超时结束处理
                                    if(!(Loop_Timeout--)){
                                        RS_LOGW("Bms_Boot_Arr_Pro Search_Timeout Thread Exit");
                                        CANBootStep_Set(BOOT_IDLE);
                                        //zFTP_Close_Fun();
                                        goto Bms_Boot_Arr_Pro_Exit;
                                    }
                                }while(Device_Upgrade_Search_Timeout_Num !=0);
                                /* 3.当前路线下设备与升级设备进行匹配和片选 */
                                uint8_t Route_Select_Flag =0;
                                for(uint8_t m=0; m<Bms_Ota_Info_Arr.bms_ota_info[i].positions_device_num; m++){
                                    double_list_t *Device_list_Head_ptr =NULL;
                                    double_list_for_each(Device_list_Head_ptr,&Device_list_Head.list){
                                        BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(Device_list_Head_ptr, BMSDeviceInfo_Member_List_t, list);
                                        if(memcmp(Bms_Ota_Info_Arr.bms_ota_info[i].devces_positions_info[m].arch_id, BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id, sizeof(BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id))==0){
                                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.isSelect =1;
                                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout =DEVICE_REQUEST_TIMEOUT;
                                            Bms_Ota_Info_Arr.bms_ota_info[i].devces_positions_info[m].Select_Flag=1;
                                            Route_Select_Flag =1;
                                        }
                                    }
                                }
                                if(Route_Select_Flag){
                                    //开始连接服务器,启动升级!
                                    if(zFTP_Connect_Fun()<0){
                                        RS_LOGW("zFTP_Connect_Fun Failed and Thread Exit");
                                        zFTP_Close_Fun();
                                        goto Bms_Boot_Arr_Pro_Exit;
                                    }
                                    //下载升级设备固件
                                    int8_t download_rel =download_S19_Bin_file_fun(&Bms_Ota_Info_Arr.bms_ota_info[i]);
                                    if(download_rel<0){
                                        RS_LOGW("download_S19_Bin_file_fun Failed and Thread Exit");
                                        zFTP_Close_Fun();
                                        goto Bms_Boot_Arr_Pro_Exit;
                                    }
                                    //清除匹配片选标志和置位升级标志
                                    for(uint8_t n=0; n<Bms_Ota_Info_Arr.bms_ota_info[i].positions_device_num; n++){
                                        if(Bms_Ota_Info_Arr.bms_ota_info[i].devces_positions_info[n].Select_Flag ==1){
                                            Bms_Ota_Info_Arr.bms_ota_info[i].devces_positions_info[n].Select_Flag =0;
                                            Bms_Ota_Info_Arr.bms_ota_info[i].devces_positions_info[n].ota_status =1;
                                        }
                                    }
                                    //关闭Ftp客户端
                                    zFTP_Close_Fun();
                                }
                            }
                        }
                    }
                }
            }
            #if 0
            //关闭FTP客户端
            zFTP_Close_Fun();
            #endif
            //检测是否设备全部升级成功
            uint8_t ALL_Type_Device_Success_Flag =1;
            for(uint8_t p=0; p<Bms_Ota_Info_Arr.bms_ota_info_num; p++){
                for(uint8_t q=0; q<Bms_Ota_Info_Arr.bms_ota_info[p].positions_device_num; q++){
                    if(Bms_Ota_Info_Arr.bms_ota_info[p].devces_positions_info[q].ota_status == 0){
                        //所有设备完全升级失败
                        ALL_Type_Device_Success_Flag =0;
                    }
                }
            }
            Bms_Ota_Info_Arr.bms_ota_info_num =0;
            if(ALL_Type_Device_Success_Flag){
                //上报服务器成功
                BMS_Upgrade_Result_Report(1,0);
                RS_LOGV("BMS OTA ALL Transmit Success!\n");
            }else{
                //失败
                BMS_Upgrade_Result_Report(0,BMS_DEVICE_POS_FAILED);
                RS_LOGV("BMS OTA ALL Transmit Failed : DEVICE_POS ERROR!\n");
            }
        }else{
            //链表为空,无升级需求!
            RS_LOGI("List NO Device Need Upgrade!\n");
        }
    }
Bms_Boot_Arr_Pro_Exit:
    //关闭 Bms_Upgrade_Send_Recv_Pro 线程
    if(CAN_BMS_BOOT_Flag){
        CAN_BMS_BOOT_Flag =0;
        vTaskDelete(CAN_BMS_Upgrade_handle);
    }
    //清空链表上所有的搜索设备
    Clean_Search_Device_List();
    //清空链表上所有的定位设备
    Clean_Location_Device_List();
    RS_LOGI("Bms_Boot_Arr_Pro Thread Exit");
    //释放升级信号量
    if(xSemaphoreGive(OTA_Topic_BinarySemHandle) != pdTRUE){
        RS_LOGW("xSemaphoreGive OTA_Topic_BinarySemHandle Full\n");
    }
    CANBootStep_Set(BOOT_IDLE);
    vTaskDelete(NULL);
}
 
/**
 * @details: This function is Bms Send Recv Pro
 */
void Bms_Upgrade_Send_Recv_Pro(void)
{
    RS_LOGV("Bms_Upgrade_Send_Recv_Pro Begin Run...");
    for(;;){
        /* Upgrade Recv Deal Data */
        CANFD_FD_MSG_T RxMsgFrame;
        memset(&RxMsgFrame, 0, sizeof(RxMsgFrame));
        //if(fifo_unuse(Can_Recv_Buff)){
        //if(fifo_get(Can_Recv_Buff, &RxMsgFrame, sizeof(RxMsgFrame)) >0){
        if(xQueueReceive(Can_Recv_Data_QueueHandle, &RxMsgFrame, 0) == pdTRUE){
            switch(CANBootStep){
                case BOOT_DEVICE_LOCATION: //定位
                    {
                        if((RxMsgFrame.u32Id & 0xFFFFFF00) != 0x1F010000 + (DeviceIndex << 8))
                            break;
                        //重置设备搜索发送
                        //BOOT_Send_Timeout_Num =0;
                        uint8_t New_Device_Flag =1;     //遍历新设备标志
                        uint16_t Device_Curr_Num =0;    //当前在线设备数
                        //遍历当前设备链表
                        if(double_list_isempty(&Device_Location_list_Head.list) ==0){
                            double_list_for_each(ptr,&Device_Location_list_Head.list){
                                Device_Curr_Num++;
                                BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(ptr, BMSDeviceInfo_Member_List_t, list);
                                uint8_t macAddr_temp[4] ={0};
                                macAddr_temp[0] =(uint8_t)BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[0];
                                macAddr_temp[1] =(uint8_t)BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[1];
                                macAddr_temp[2] =(uint8_t)BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[2];
                                macAddr_temp[3] =(uint8_t)BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[3];
                                if(memcmp(&RxMsgFrame.au8Data[4],macAddr_temp,4)==0){
                                    //当前设备已经存在设备链表
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.firmwareVersion =((RxMsgFrame.au8Data[0]>>4)&0x0f);      //更新固件版本号
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_grade =(RxMsgFrame.au8Data[0]&0x0f);              //更新设备层级
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[0] =RxMsgFrame.au8Data[1];                       //更新设备Arch3 ID
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[1] =RxMsgFrame.au8Data[2];                       //更新设备Arch2 ID
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[2] =RxMsgFrame.au8Data[3];                       //更新设备Arch1 ID   
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_type =(((uint8_t)(RxMsgFrame.u32Id>>8))&0xff);    //更新设备类型
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout = DEVICE_SEARCH_TIMEOUT;                         //更新重置超时时间
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.routeLevel = RxMsgFrame.au8Data[0] & 0x0f;               //更新架构层级
                                    New_Device_Flag =0;
                                }
                            }
                        }
                        //扫描新设备,且小于设备总数
                        if(New_Device_Flag && (Device_Curr_Num < Device_Max_Num)){
                            //从新设置升级定位时间
                            Device_Upgrade_Location_Timeout_Num =DEVICE_UPGRADE_LOCATION_TIMEOUT;
                            BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member = pvPortMalloc(sizeof(BMSDeviceInfo_Member_List_t));
                            memset(BMSDeviceInfo_Member, 0, sizeof(*BMSDeviceInfo_Member));
                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[0] = RxMsgFrame.au8Data[4];
                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[1] = RxMsgFrame.au8Data[5];
                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[2] = RxMsgFrame.au8Data[6];
                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[3] = RxMsgFrame.au8Data[7];
                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.firmwareVersion =((RxMsgFrame.au8Data[0]>>4)&0x0f);              //获取固件版本号
                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_grade =(RxMsgFrame.au8Data[0]&0x0f);                      //获取设备层级
                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[0] =RxMsgFrame.au8Data[1];                               //获取设备Arch3 ID
                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[1] =RxMsgFrame.au8Data[2];                               //获取设备Arch2 ID
                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[2] =RxMsgFrame.au8Data[3];                               //获取设备Arch1 ID   
                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_type =(((uint8_t)(RxMsgFrame.u32Id>>8))&0xff);            //获取设备类型
                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout = DEVICE_LOCATIONH_TIMEOUT;                              //设置超时时间
                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.routeLevel = (RxMsgFrame.au8Data[0]&0x0f);                       //获取架构层级
                            double_list_insert_after(&Device_Location_list_Head.list,&BMSDeviceInfo_Member->list);                      //添加到设备定位链表
                            #if 1   //for debug test
                            RS_LOGI("Location Add a new device MacAddr: %02x-%02x-%02x-%02x\n",
                                        BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[0],
                                        BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[1],
                                        BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[2],
                                        BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[3]
                            );
                            #endif
                        }
                        break;
                    }
                case BOOT_DEVICE_SEARCH: //搜索 0x1F01YYFF
                    {
                        if((RxMsgFrame.u32Id & 0xFFFFFF00) != 0x1F020000 + (DeviceIndex << 8))
                            break;
                        //重置设备搜索发送
                        //BOOT_Send_Timeout_Num =0;
                        uint8_t New_Device_Flag =1; //遍历新设备标志
                        uint16_t Device_Curr_Num =0; //当前在线设备数
                        //遍历当前设备链表
                        if(double_list_isempty(&Device_list_Head.list) ==0){
                            double_list_for_each(ptr,&Device_list_Head.list){
                                Device_Curr_Num++;
                                BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(ptr, BMSDeviceInfo_Member_List_t, list);
                                uint8_t macAddr_temp[4] ={0};
                                macAddr_temp[0] =(uint8_t)BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[0];
                                macAddr_temp[1] =(uint8_t)BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[1];
                                macAddr_temp[2] =(uint8_t)BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[2];
                                macAddr_temp[3] =(uint8_t)BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[3];
                                //if(memcmp(&RxMsgFrame.au8Data[2],BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr,6)==0){
                                //if(memcmp(&RxMsgFrame.au8Data[4],macAddr_temp,4)==0){
                                if( (memcmp(&RxMsgFrame.au8Data[4],macAddr_temp,4)==0) && (BMSDeviceInfo_Member->BMSDeviceInfo_Member.randomid == (((uint8_t)(RxMsgFrame.u32Id))&0xff))){
                                    //当前设备已经存在设备链表
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.firmwareVersion =((RxMsgFrame.au8Data[0]>>4)&0x0f);      //更新固件版本号
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_grade =(RxMsgFrame.au8Data[0]&0x0f);              //更新设备层级
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[0] =RxMsgFrame.au8Data[1];                       //更新设备Arch3 ID
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[1] =RxMsgFrame.au8Data[2];                       //更新设备Arch2 ID
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[2] =RxMsgFrame.au8Data[3];                       //更新设备Arch1 ID
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_type =(((uint8_t)(RxMsgFrame.u32Id>>8))&0xff);    //更新设备类型
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.randomid =(((uint8_t)(RxMsgFrame.u32Id))&0xff);          //更新随机码
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout = DEVICE_SEARCH_TIMEOUT;                         //更新重置超时时间
                                    //预设ID
                                    if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_grade ==1){
                                        BMSDeviceInfo_Member->BMSDeviceInfo_Member.setID = RxMsgFrame.au8Data[3];
                                    }else if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_grade ==2){
                                        BMSDeviceInfo_Member->BMSDeviceInfo_Member.setID = RxMsgFrame.au8Data[2];
                                    }else if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_grade ==3){
                                        BMSDeviceInfo_Member->BMSDeviceInfo_Member.setID = RxMsgFrame.au8Data[1];
                                    }
                                    New_Device_Flag =0;                                                                                 //已存设备
                                }
                            }
                        }
                        //扫描新设备,且小于设备总数
                        if(New_Device_Flag && (Device_Curr_Num < Device_Max_Num)){   
                            BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member = pvPortMalloc(sizeof(BMSDeviceInfo_Member_List_t));
                            if(BMSDeviceInfo_Member !=NULL){
                                //从新设置升级搜索时间
                                Device_Upgrade_Search_Timeout_Num =DEVICE_UPGRADE_SEARCH_TIMEOUT;
                                //memcpy(BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr,&RxMsgFrame.au8Data[2],6);             //获取MAC地址
                                memset(BMSDeviceInfo_Member, 0, sizeof(*BMSDeviceInfo_Member));
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[0] = RxMsgFrame.au8Data[4];
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[1] = RxMsgFrame.au8Data[5];
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[2] = RxMsgFrame.au8Data[6];
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[3] = RxMsgFrame.au8Data[7];
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_type =(((uint8_t)(RxMsgFrame.u32Id>>8))&0xff);    //获取设备类型
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.randomid =(((uint8_t)(RxMsgFrame.u32Id))&0xff);          //获取随机码
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.firmwareVersion =((RxMsgFrame.au8Data[0]>>4)&0x0f);      //获取固件版本号
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_grade =(RxMsgFrame.au8Data[0]&0x0f);              //获取设备层级
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[0] =RxMsgFrame.au8Data[1];                       //获取设备Arch3 ID
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[1] =RxMsgFrame.au8Data[2];                       //获取设备Arch2 ID
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[2] =RxMsgFrame.au8Data[3];                       //获取设备Arch1 ID  
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout = DEVICE_SEARCH_TIMEOUT;                         //设置超时时间
                                double_list_insert_after(&Device_list_Head.list,&BMSDeviceInfo_Member->list);                       //添加到设备链表
                                //预设ID
                                if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_grade ==1){
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.setID = RxMsgFrame.au8Data[3];
                                }else if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_grade ==2){
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.setID = RxMsgFrame.au8Data[2];
                                }else if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_grade ==3){
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.setID = RxMsgFrame.au8Data[1];
                                }
                                #if 1   //for debug test
                                RS_LOGI("Search Add a new device MacAddr: %02x-%02x-%02x-%02x\n",
                                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[0],
                                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[1],
                                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[2],
                                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[3]
                                );
                                #endif
                                //Report_Search_Device_Info();
                            }else{
                                RS_LOGW("BOOT_DEVICE_SEARCH new device pvPortMalloc failed!");
                            }
                        }
                        //unsigned int num_list =double_list_len(&Device_list_Head.list);
                        //printf("Device_list num :%d\n",num_list);
                        break;
                    }
                case BOOT_BURNING_REQUEST: //请求
                    {
                        //if(RxMsgFrame.u32Id != 0x1F0300FF + (DeviceIndex << 8))
                        if((RxMsgFrame.u32Id & 0xFFFFFF00) != 0x1F030000 + (DeviceIndex << 8))
                            break;
                        //重置设备申请发送
                        //BOOT_Send_Timeout_Num =0;
                        if(double_list_isempty(&Device_list_Head.list) ==0){
                            uint8_t All_Ready =1;
                            double_list_for_each(ptr,&Device_list_Head.list){
                                BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(ptr, BMSDeviceInfo_Member_List_t, list);
                                uint8_t macAddr_temp[4] ={0};
                                macAddr_temp[0] =(uint8_t)BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[0];
                                macAddr_temp[1] =(uint8_t)BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[1];
                                macAddr_temp[2] =(uint8_t)BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[2];
                                macAddr_temp[3] =(uint8_t)BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[3];
                                //if(memcmp(&RxMsgFrame.au8Data[2],BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr,6)==0 && RxMsgFrame.au8Data[0]== BMSDeviceInfo_Member->BMSDeviceInfo_Member.tempID){
                                if(memcmp(&RxMsgFrame.au8Data[4],macAddr_temp,4)==0 && RxMsgFrame.au8Data[0]== BMSDeviceInfo_Member->BMSDeviceInfo_Member.tempID){
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.isReady =1;
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout =DEVICE_REQUEST_TIMEOUT; //设置更新超时时间
                                }
                                //BMS DEVICES ALL Ready?
                                if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.isSelect){
                                    if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.isReady ==0){
                                        All_Ready =0;
                                    }
                                }
                            }
                            if(All_Ready){
                                CANBootStep_Set(BOOT_MEM_ERASE);
                            }
                        }
                        break;
                    }
                case BOOT_MEM_ERASE: //擦除
                    {
                        if((RxMsgFrame.u32Id & 0xFFFFFF00) != 0x1F040000 + (DeviceIndex << 8))
                            break;
                        //重置设备擦除发送
                        //BOOT_Send_Timeout_Num =0;
                        if(double_list_isempty(&Device_list_Head.list) ==0){
                            uint8_t All_Ready =1;
                            double_list_for_each(ptr,&Device_list_Head.list){
                                BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(ptr, BMSDeviceInfo_Member_List_t, list);
                                if((uint8_t)RxMsgFrame.u32Id == BMSDeviceInfo_Member->BMSDeviceInfo_Member.tempID && RxMsgFrame.au8Data[0]==2){
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.isReady =1;
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout =DEVICE_ERASE_TIMEOUT;   //设置更新超时时间
                                }
                                //BMS DEVICES ALL Ready?
                                if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.isSelect){
                                    if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.isReady ==0){
                                        All_Ready =0;
                                    }
                                }
                            }
                            if(All_Ready){
                                CANBootStep_Set(BOOT_MEM_WRITE);
                                RS_LOGV("Flash Erase Finish, and begin download bms firmware...\n");
                                //发送成功指令,接收到所有片选设备应答ACK,开始升级下一帧数据
                                if(xSemaphoreGive(OTA_Data_Done_BinarySemHandle) != pdTRUE){
                                    RS_LOGE("xSemaphoreGive OTA_Data_Done_BinarySemHandle Error\n");
                                }
                            }
                        }
                        break;
                    }
                case BOOT_MEM_WRITE: //写入
                    {
                        if((RxMsgFrame.u32Id & 0xFFFFFF00) != 0x1F050000 + (DeviceIndex << 8))
                            break;
                        if(double_list_isempty(&Device_list_Head.list) ==0){
                            uint8_t All_Ready =1;
                            double_list_for_each(ptr,&Device_list_Head.list){
                                BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(ptr, BMSDeviceInfo_Member_List_t, list);
                                if(((uint8_t)RxMsgFrame.u32Id == BMSDeviceInfo_Member->BMSDeviceInfo_Member.tempID) && RxMsgFrame.au8Data[0]==1){
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.isReady =1;
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout =DEVICE_WRITE_TIMEOUT;   //设置更新超时时间
                                }
                                //BMS DEVICES ALL Ready?
                                if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.isSelect){
                                    if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.isReady ==0){
                                        All_Ready =0;
                                    }
                                }
                            }
                            if(All_Ready){
                                if(xSemaphoreTake(OTA_Crc_Data_BinarySemHandle, 0)==pdPASS){
                                    CANBootStep_Set(BOOT_MEM_WRITE_END);
                                    break;
                                }
                                //再次清除链表所有节点isReady标志
                                if(double_list_isempty(&Device_list_Head.list) ==0){
                                    double_list_for_each(ptr,&Device_list_Head.list){
                                        BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(ptr, BMSDeviceInfo_Member_List_t, list);
                                        BMSDeviceInfo_Member->BMSDeviceInfo_Member.isReady =0;
                                    }
                                }
                                //发送成功指令,接收到所有片选设备应答ACK,开始升级下一帧数据
                                if(xSemaphoreGive(OTA_Data_Done_BinarySemHandle) != pdTRUE){
                                    RS_LOGE("xSemaphoreGive OTA_Data_Done_BinarySemHandle Error\n");
                                }
                            }
                        }
                        break;
                    }
                case BOOT_MEM_WRITE_END: //写完
                    {
                        if((RxMsgFrame.u32Id & 0xFFFFFF00) != 0x1F060000 + (DeviceIndex << 8))
                            break;
                        //重置设备写结束发送
                        //BOOT_Send_Timeout_Num =0;
                        if(double_list_isempty(&Device_list_Head.list) ==0){
                            uint8_t All_Ready =1;
                            double_list_for_each(ptr,&Device_list_Head.list){
                                BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(ptr, BMSDeviceInfo_Member_List_t, list);
                                if((uint8_t)RxMsgFrame.u32Id == BMSDeviceInfo_Member->BMSDeviceInfo_Member.tempID && RxMsgFrame.au8Data[0]==0){
                                //if((uint8_t)RxMsgFrame.u32Id == BMSDeviceInfo_Member->BMSDeviceInfo_Member.tempID){
                                    if(RxMsgFrame.au8Data[0]==0){
                                        BMSDeviceInfo_Member->BMSDeviceInfo_Member.isReady =1;
                                        BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout =DEVICE_WRITE_END_TIMEOUT;       //设置更新超时时间
                                    }else if(RxMsgFrame.au8Data[0]==1){
                                        //BMS Flash FAILED
                                        BMS_Upgrade_Result_Report(0, BMS_FLASH_WRITE_READ_CRC_TIMEOUT_FAILED);
                                        CANBootStep_Set(BOOT_IDLE);
                                        break;
                                    }
                                }
                                //BMS DEVICES ALL Ready?
                                if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.isSelect){
                                    if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.isReady ==0){
                                        All_Ready =0;
                                    }
                                }
                            }
                            //升级成功,进入空闲模式
                            if(All_Ready){
                                //释放信号量,本次升级成功
                                if(xSemaphoreGive(OTA_Last_Data_BinarySemHandle) != pdTRUE){
                                    RS_LOGE("xSemaphoreGive OTA_Last_Data_BinarySemHandle Error\n");
                                }
                                //上报服务器成功
                                //BMS_Upgrade_Result_Report(1,0);
                                //RS_LOGV("BMS OTA Transmit Success!\n");
                                //CANBootStep_Set(BOOT_IDLE);
                            }
                        }
                        break;
                    }
                default: break;
            }
        }
        //}
        /* Boot Send Can Data */
        switch(CANBootStep){
            case BOOT_IDLE:
                {
                    break;
                }
            case BOOT_DEVICE_LOCATION:
                {
                    //设置Location空闲超时时间
                    if(Device_Upgrade_Location_Timeout_Num !=0){
                        Device_Upgrade_Location_Timeout_Num--;
                    }
                    //检测超时发送Location
                    if(BOOT_Send_Timeout_Num++ > DEVICE_SEARCH_TIMEOUT_SEND){
                        BOOT_Send_Timeout_Num =0;
                        if(Boot_Device_Location(DeviceIndex) != RS_OK){
                            //定位发送失败,进入idle, 结束升级
                            CANBootStep_Set(BOOT_IDLE);
                            RS_LOGE("Boot Device Location Send Failed\n");
                        }
                    }
                    break;
                }
            case BOOT_DEVICE_SEARCH:
                {
                    //设置Search空闲超时时间
                    if(Device_Upgrade_Search_Timeout_Num !=0){
                        Device_Upgrade_Search_Timeout_Num--;
                    }
                    //检测超时发送Search
                    if(BOOT_Send_Timeout_Num++ > DEVICE_SEARCH_TIMEOUT_SEND){
                        BOOT_Send_Timeout_Num =0;
                        //if(Boot_Device_Search(DeviceIndex) != RS_OK){
                        if(Boot_Device_Search_t(DeviceIndex) != RS_OK){
                            //搜索发送失败,进入idle, 结束升级
                            CANBootStep_Set(BOOT_IDLE);
                            RS_LOGE("Boot Device Search Send Failed\n");
                        }
                    }
                    break;
                }
            case BOOT_BURNING_REQUEST:
                {
                    if(BOOT_Send_Timeout_Num++ > DEVICE_REQUEST_TIMEOUT_SEND){
                        BOOT_Send_Timeout_Num =0;
                        if(Boot_Device_Request() != RS_OK){
                            //申请发送失败,进入idle, 结束升级
                            BMS_Upgrade_Result_Report(0, BMS_REQUEST_SEND_FAILED);
                            CANBootStep_Set(BOOT_IDLE);
                            RS_LOGE("Boot Device Request Send Failed\n");
                        }
                    }
                    break;
                }
            case BOOT_MEM_ERASE:
                {
                    if(BOOT_Send_Timeout_Num++ > DEVICE_ERASE_TIMEOUT_SEND){
                        BOOT_Send_Timeout_Num =0;
                        if(Boot_Mem_Erase(DeviceIndex) != RS_OK){
                            //擦除发送失败,进入idle, 结束升级
                            BMS_Upgrade_Result_Report(0, BMS_MEM_ERASE_SEND_FAILED);
                            CANBootStep_Set(BOOT_IDLE);
                            RS_LOGE("Boot Device Erase Send Failed\n");
                        }
                    }
                    break;
                }
            case BOOT_MEM_WRITE:
                {
                    break;
                }
            case BOOT_MEM_WRITE_END:
                {
                    if(BOOT_Send_Timeout_Num++ > DEVICE_WRITE_END_TIMEOUT_SEND){
                        if(Boot_Mem_Write_End(DeviceIndex) != RS_OK){
                            //写完成发送失败,进入idle, 结束升级
                            BMS_Upgrade_Result_Report(0, BMS_FLASH_WRITE_READ_CRC_SEND_FAILED);
                            CANBootStep_Set(BOOT_IDLE);
                            RS_LOGE("Boot Device Write End Send Failed\n");
                        }
                    }
                    break;
                }
            default: break;
        }
        /* 设备超时处理 */
        if(CANBootStep == BOOT_DEVICE_LOCATION){ //BOOT_DEVICE_LOCATION TIMEOUT DEAL
            if(double_list_isempty(&Device_Location_list_Head.list) ==0){
                double_list_for_each(ptr,&Device_Location_list_Head.list){
                    BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(ptr, BMSDeviceInfo_Member_List_t, list);
                    ////////////////////////////////////////////////////////////////////
                    #if 0       //for debug test
                    RS_LOGI("------------------------------------------------------------------------------>");
                    RS_LOGI("BMSDeviceInfo_Member.macAddr: %x-%x-%x-%x-%x-%x\n",
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[0],
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[1],
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[2],
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[3],
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[4],
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[5]
                    );
                    RS_LOGI("BMSDeviceInfo_Member.firmwareVersion: %x\n",BMSDeviceInfo_Member->BMSDeviceInfo_Member.firmwareVersion);
                    RS_LOGI("BMSDeviceInfo_Member.routeLevel: %x\n",BMSDeviceInfo_Member->BMSDeviceInfo_Member.routeLevel);
                    RS_LOGI("BMSDeviceInfo_Member.tempID: %x\n",BMSDeviceInfo_Member->BMSDeviceInfo_Member.tempID);
                    RS_LOGI("BMSDeviceInfo_Member.setID: %x\n",BMSDeviceInfo_Member->BMSDeviceInfo_Member.setID);
                    RS_LOGI("BMSDeviceInfo_Member.timeout: %d\n",BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout);
                    RS_LOGI("BMSDeviceInfo_Member.device_type: %x\n",BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_type);
                    RS_LOGI("BMSDeviceInfo_Member.isSelect: %x\n",BMSDeviceInfo_Member->BMSDeviceInfo_Member.isSelect);
                    RS_LOGI("BMSDeviceInfo_Member.isReady: %x\n",BMSDeviceInfo_Member->BMSDeviceInfo_Member.isReady);
                    #endif
                    ////////////////////////////////////////////////////////////////////
                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout--;//时间步长
                    if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout==0){
                        //移除设备链表
                        #if 1   //for debug test
                        RS_LOGI("Location Device Timeout Remove a device MacAddr: %02x-%02x-%02x-%02x\n",
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[0],
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[1],
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[2],
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[3]
                        );
                        #endif
                        double_list_remove(ptr);
                        vPortFree(BMSDeviceInfo_Member);
                    }
                }
            }
        }else if(CANBootStep == BOOT_DEVICE_SEARCH){      //SEARCH TIMEOUT DEAL
            if(double_list_isempty(&Device_list_Head.list) ==0){
                double_list_for_each(ptr,&Device_list_Head.list){
                    BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(ptr, BMSDeviceInfo_Member_List_t, list);
                    ////////////////////////////////////////////////////////////////////
                    #if 0       //for debug test
                    RS_LOGI("------------------------------------------------------------------------------>");
                    RS_LOGI("BMSDeviceInfo_Member.macAddr: %x-%x-%x-%x-%x-%x\n",
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[0],
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[1],
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[2],
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[3],
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[4],
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[5]
                    );
                    RS_LOGI("BMSDeviceInfo_Member.firmwareVersion: %x\n",BMSDeviceInfo_Member->BMSDeviceInfo_Member.firmwareVersion);
                    RS_LOGI("BMSDeviceInfo_Member.routeLevel: %x\n",BMSDeviceInfo_Member->BMSDeviceInfo_Member.routeLevel);
                    RS_LOGI("BMSDeviceInfo_Member.tempID: %x\n",BMSDeviceInfo_Member->BMSDeviceInfo_Member.tempID);
                    RS_LOGI("BMSDeviceInfo_Member.setID: %x\n",BMSDeviceInfo_Member->BMSDeviceInfo_Member.setID);
                    RS_LOGI("BMSDeviceInfo_Member.timeout: %d\n",BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout);
                    RS_LOGI("BMSDeviceInfo_Member.device_type: %x\n",BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_type);
                    RS_LOGI("BMSDeviceInfo_Member.isSelect: %x\n",BMSDeviceInfo_Member->BMSDeviceInfo_Member.isSelect);
                    RS_LOGI("BMSDeviceInfo_Member.isReady: %x\n",BMSDeviceInfo_Member->BMSDeviceInfo_Member.isReady);
                    #endif
                    ////////////////////////////////////////////////////////////////////
                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout--;   //时间步长
                    if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout==0){
                        //移除设备链表
                        #if 1   //for debug test
                        RS_LOGI("Search Device Timeout Remove a device MacAddr: %02x-%02x-%02x-%02x\n",
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[0],
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[1],
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[2],
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[3]
                        );
                        #endif
                        double_list_remove(ptr);
                        vPortFree(BMSDeviceInfo_Member);
                        //Report_Search_Device_Info();
                    }
                }
            }
        }else if((CANBootStep == BOOT_BURNING_REQUEST) || (CANBootStep == BOOT_MEM_ERASE) || (CANBootStep == BOOT_MEM_WRITE) || (CANBootStep == BOOT_MEM_WRITE_END)){ //TIMEOUT DEAL
            if(double_list_isempty(&Device_list_Head.list) ==0){
                uint8_t Request_Timeout =0;
                double_list_for_each(ptr,&Device_list_Head.list){
                    BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(ptr, BMSDeviceInfo_Member_List_t, list);
                    if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.isSelect){
                        BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout--;   //时间步长
                        if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout==0){
                            //设备超时标志
                            Request_Timeout =1;
                        }
                    }
                }
                //但凡一台设备超时,移除链表所有设备,本次升级失败,进入IDLE
                if(Request_Timeout){
                    double_list_for_each(ptr,&Device_list_Head.list){
                        BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(ptr, BMSDeviceInfo_Member_List_t, list);
                        double_list_remove(ptr);
                        vPortFree(BMSDeviceInfo_Member);
                    }
                    //上报服务器任务失败
                    switch(CANBootStep){
                        case BOOT_BURNING_REQUEST:
                            {
                                BMS_Upgrade_Result_Report(0, BMS_REQUEST_TIMEOUT_FAILED);
                                RS_LOGV("BMS OTA REQUEST Timeout!\n");
                                break;
                            }
                        case BOOT_MEM_ERASE:
                            {
                                BMS_Upgrade_Result_Report(0, BMS_MEM_ERASE_TIMEOUT_FAILED);
                                RS_LOGV("BMS OTA ERASE Timeout!\n");
                                break;
                            }
                        case BOOT_MEM_WRITE:
                            {
                                BMS_Upgrade_Result_Report(0, BMS_MEM_WRITE_TIMEOUT_FAILED);
                                RS_LOGV("BMS OTA WRITE Timeout!\n");
                                break;
                            }
                        case BOOT_MEM_WRITE_END:
                            {
                                BMS_Upgrade_Result_Report(0, BMS_FLASH_WRITE_READ_CRC_TIMEOUT_FAILED);
                                RS_LOGV("BMS OTA WRITE END Timeout!\n");
                                break;
                            }
                        default:break;
                    }
                    RS_LOGV("BMS OTA Transmit Failed!\n");
                    //判断是否为BOOT_MEM_WRITE,结束升级线程
                    if(CANBootStep == BOOT_BURNING_REQUEST || CANBootStep == BOOT_MEM_WRITE || CANBootStep == BOOT_MEM_WRITE_END){
                        //重置OTA的数据消息队列
                        xQueueReset(OTA_Data_QueueHandle);
                    }
                    //超时失败,本次升级失败,进入空闲模式
                    CANBootStep_Set(BOOT_IDLE);
                }
            }
        }
        //vTaskDelay(300);
        //vTaskDelay(5);
        //vTaskDelay(2);
        vTaskDelay(1);
    }
}
 
/**
 * @details: This function is Boot Location Devices
 */
int8_t Boot_Device_Location(uint16_t deviceIndex)
{
    CANFD_FD_MSG_T TxMsgFrame;
    memset(&TxMsgFrame, 0, sizeof(TxMsgFrame));
    /* Set the ID Number */
    TxMsgFrame.u32Id = 0x0F0100FF + (deviceIndex << 8);
    /* Set the frame type */
    TxMsgFrame.eIdType = eCANFD_XID;
    /* CAN FD frame type */
    TxMsgFrame.eFrmType = eCANFD_DATA_FRM;
    /* Set FD frame format attribute */
    TxMsgFrame.bFDFormat = 1;
    /* Set the bitrate switch attribute */
    TxMsgFrame.bBitRateSwitch = 1;
    /*Set data length*/
    TxMsgFrame.u32DLC = 0;
    if(CANFD_TransmitDMsg(BMS_CAN, 0, &TxMsgFrame) != 1){
        return RS_ERROR;
    }
    //xSemaphoreTake(CAN0_Transfer_Done_BinarySemHandle, portMAX_DELAY);
    return RS_OK;
}
 
/**
 * @details: This function is Boot Search Devices
 */
int8_t Boot_Device_Search(uint16_t deviceIndex)
{
    for(int i=0;i<Search_Pack.layer_num; i++){
        CANFD_FD_MSG_T TxMsgFrame;
        memset(&TxMsgFrame, 0, sizeof(TxMsgFrame));
        /* Set the ID Number */
        TxMsgFrame.u32Id = 0x0F0200FF + (deviceIndex << 8);
        /* Set the frame type */
        TxMsgFrame.eIdType = eCANFD_XID;
        /* CAN FD frame type */
        TxMsgFrame.eFrmType = eCANFD_DATA_FRM;
        /* Set FD frame format attribute */
        TxMsgFrame.bFDFormat = 1;
        /* Set the bitrate switch attribute */
        TxMsgFrame.bBitRateSwitch = 1;
        /*Set data length*/
        TxMsgFrame.u32DLC = 8;
        /*Set data */
        //arch_id
        TxMsgFrame.au8Data[1] = (uint8_t)Search_Pack.arch_id[i][0];
        TxMsgFrame.au8Data[2] = (uint8_t)Search_Pack.arch_id[i][1];
        TxMsgFrame.au8Data[3] = (uint8_t)Search_Pack.arch_id[i][2];
        //mac
        TxMsgFrame.au8Data[4] = (uint8_t)Search_Pack.macAddr[i][0];
        TxMsgFrame.au8Data[5] = (uint8_t)Search_Pack.macAddr[i][1];
        TxMsgFrame.au8Data[6] = (uint8_t)Search_Pack.macAddr[i][2];
        TxMsgFrame.au8Data[7] = (uint8_t)Search_Pack.macAddr[i][3];
        if(CANFD_TransmitDMsg(BMS_CAN, 0, &TxMsgFrame) != 1){
            return RS_ERROR;
        }
        //xSemaphoreTake(CAN0_Transfer_Done_BinarySemHandle, portMAX_DELAY);
        //delay_ms(50);
    }
    return RS_OK;
}
 
/**
 * @details: This function is Boot_Device_Search_t
 */
int8_t Boot_Device_Search_t(uint16_t deviceIndex)
{
    CANFD_FD_MSG_T TxMsgFrame;
    memset(&TxMsgFrame, 0, sizeof(TxMsgFrame));
    /* Set the ID Number */
    TxMsgFrame.u32Id = 0x0F0200FF + (deviceIndex << 8);
    /* Set the frame type */
    TxMsgFrame.eIdType = eCANFD_XID;
    /* CAN FD frame type */
    TxMsgFrame.eFrmType = eCANFD_DATA_FRM;
    /* Set FD frame format attribute */
    TxMsgFrame.bFDFormat = 1;
    /* Set the bitrate switch attribute */
    TxMsgFrame.bBitRateSwitch = 1;
    /*Set data length*/
    TxMsgFrame.u32DLC = 8;
    /*Set data */
    //arch_id
    TxMsgFrame.au8Data[1] = (uint8_t)Location_Search_Pack.arch_id[0];
    TxMsgFrame.au8Data[2] = (uint8_t)Location_Search_Pack.arch_id[1];
    TxMsgFrame.au8Data[3] = (uint8_t)Location_Search_Pack.arch_id[2];
    //mac
    TxMsgFrame.au8Data[4] = (uint8_t)Location_Search_Pack.macAddr[0];
    TxMsgFrame.au8Data[5] = (uint8_t)Location_Search_Pack.macAddr[1];
    TxMsgFrame.au8Data[6] = (uint8_t)Location_Search_Pack.macAddr[2];
    TxMsgFrame.au8Data[7] = (uint8_t)Location_Search_Pack.macAddr[3];
    if(CANFD_TransmitDMsg(BMS_CAN, 0, &TxMsgFrame) != 1){
        return RS_ERROR;
    }
    return RS_OK;
}
 
 
/**
 * @details: This function is Boot Request Devices
 */
int8_t Boot_Device_Request(void)
{
    //给选中设备分配临时ID
    if(double_list_isempty(&Device_list_Head.list) ==0){
        uint16_t TempID_Count =0;
        double_list_for_each(ptr,&Device_list_Head.list){
            BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(ptr, BMSDeviceInfo_Member_List_t, list);
            if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.isSelect){
                TempID_Count =TempID_Count+1;
                //烧录请求时,给所有片选的设备,分配临时ID
                BMSDeviceInfo_Member->BMSDeviceInfo_Member.tempID = TempID_Count;
                //发送CAN数据帧
                CANFD_FD_MSG_T TxMsgFrame;
                memset(&TxMsgFrame, 0, sizeof(TxMsgFrame));
                /*Set the ID Number*/
                TxMsgFrame.u32Id = 0x0F0300FF + ((BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_type)<< 8);
                //TxMsgFrame.u32Id = 0x0F030000 + ((BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_type)<< 8) + (BMSDeviceInfo_Member->BMSDeviceInfo_Member.randomid);
                /*Set the frame type*/
                TxMsgFrame.eIdType = eCANFD_XID;
                /*CAN FD frame type */
                TxMsgFrame.eFrmType = eCANFD_DATA_FRM;
                /*Set FD frame format attribute */
                TxMsgFrame.bFDFormat = 1;
                /*Set the bitrate switch attribute*/
                TxMsgFrame.bBitRateSwitch = 1;
                /*Set data length*/
                TxMsgFrame.u32DLC = 8;
                /*Set data */
                TxMsgFrame.au8Data[0] = (uint8_t)(BMSDeviceInfo_Member->BMSDeviceInfo_Member.tempID);
                TxMsgFrame.au8Data[1] = (uint8_t)(BMSDeviceInfo_Member->BMSDeviceInfo_Member.setID);
                TxMsgFrame.au8Data[4] = BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[0];
                TxMsgFrame.au8Data[5] = BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[1];
                TxMsgFrame.au8Data[6] = BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[2];
                TxMsgFrame.au8Data[7] = BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[3];
                if(CANFD_TransmitDMsg(BMS_CAN, 0, &TxMsgFrame) != 1){
                    return RS_ERROR;
                }
                //xSemaphoreTake(CAN0_Transfer_Done_BinarySemHandle, portMAX_DELAY);
                delay_ms(50);
            }
        }
        return RS_OK;
    }
    return RS_OK;
}
 
/**
 * @details: This function is Boot Devices Mem Erase
 */
//int8_t Boot_Mem_Erase(void)
int8_t Boot_Mem_Erase(uint16_t deviceIndex)
{
#if 0
    //给每个片选设备发送擦除指令
    if(double_list_isempty(&Device_list_Head.list) ==0){
        double_list_for_each(ptr,&Device_list_Head.list){
            BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(ptr, BMSDeviceInfo_Member_List_t, list);
            if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.isSelect){
                //发送CAN数据帧
                CANFD_FD_MSG_T TxMsgFrame;
                memset(&TxMsgFrame, 0, sizeof(TxMsgFrame));
                /*Set the ID Number*/
                TxMsgFrame.u32Id = 0x0F0400FF + ((BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_type)<< 8);
                /*Set the frame type*/
                TxMsgFrame.eIdType = eCANFD_XID;
                /*CAN FD frame type */
                TxMsgFrame.eFrmType = eCANFD_DATA_FRM;
                /*Set FD frame format attribute */
                TxMsgFrame.bFDFormat = 1;
                /*Set the bitrate switch attribute*/
                TxMsgFrame.bBitRateSwitch = 1;
                /*Set data length*/
                TxMsgFrame.u32DLC = 0;
                if(CANFD_TransmitDMsg(BMS_CAN, 0, &TxMsgFrame) != 1){
                    return RS_ERROR;
                }
                //xSemaphoreTake(CAN0_Transfer_Done_BinarySemHandle, portMAX_DELAY);
                delay_ms(50);
            }
        }
    }
#endif
     
#if 1
    //广播发送CAN数据帧
    CANFD_FD_MSG_T TxMsgFrame;
    memset(&TxMsgFrame, 0, sizeof(TxMsgFrame));
    /*Set the ID Number*/
    TxMsgFrame.u32Id = 0x0F0400FF + (deviceIndex<< 8);
    /*Set the frame type*/
    TxMsgFrame.eIdType = eCANFD_XID;
    /*CAN FD frame type */
    TxMsgFrame.eFrmType = eCANFD_DATA_FRM;
    /*Set FD frame format attribute */
    TxMsgFrame.bFDFormat = 1;
    /*Set the bitrate switch attribute*/
    TxMsgFrame.bBitRateSwitch = 1;
    /*Set data length*/
    TxMsgFrame.u32DLC = 0;
    if(CANFD_TransmitDMsg(BMS_CAN, 0, &TxMsgFrame) != 1){
        return RS_ERROR;
    }
    //xSemaphoreTake(CAN0_Transfer_Done_BinarySemHandle, portMAX_DELAY);
    delay_ms(50);
#endif
     
    return RS_OK;
}
 
/**
 * @details: This function is Boot Devices Write End
 */
int8_t Boot_Mem_Write_End(uint16_t deviceIndex)
{
    //广播发送CAN数据帧
    CANFD_FD_MSG_T TxMsgFrame;
    memset(&TxMsgFrame, 0, sizeof(TxMsgFrame));
    /* Set the ID Number */
    TxMsgFrame.u32Id = 0x0F0600FF + (deviceIndex<< 8);
    /* Set the frame type */
    TxMsgFrame.eIdType = eCANFD_XID;
    /* CAN FD frame type */
    TxMsgFrame.eFrmType = eCANFD_DATA_FRM;
    /* Set FD frame format attribute */
    TxMsgFrame.bFDFormat = 1;
    /* Set the bitrate switch attribute */
    TxMsgFrame.bBitRateSwitch = 1;
    /* Set data length */
    TxMsgFrame.u32DLC = 0;
    if(CANFD_TransmitDMsg(BMS_CAN, 0, &TxMsgFrame) != 1){
        return RS_ERROR;
    }
    //xSemaphoreTake(CAN0_Transfer_Done_BinarySemHandle, portMAX_DELAY);
    delay_ms(50);
    return RS_OK;
}
 
/**
 * @details: This function is Boot Devices Mem Write S19
 */
int8_t Boot_Mem_Write_S19_Bin(uint16_t deviceIndex, uint8_t *au8Data, uint32_t data_len)
{
    if((au8Data == NULL) || data_len >8)
        RS_LOGE("Boot_Mem_Write_S19 para error\n");
    CANFD_FD_MSG_T TxMsgFrame;
    memset(&TxMsgFrame, 0, sizeof(TxMsgFrame));
    /* Set the ID Number */
    TxMsgFrame.u32Id = 0x0F0500FF + (deviceIndex<< 8);
    /* Set the frame type */
    TxMsgFrame.eIdType = eCANFD_XID;
    /* CAN FD frame type */
    TxMsgFrame.eFrmType = eCANFD_DATA_FRM;
    /* Set FD frame format attribute */
    TxMsgFrame.bFDFormat = 1;
    /* Set the bitrate switch attribute */
    TxMsgFrame.bBitRateSwitch = 1;
    /* Set data length */
    TxMsgFrame.u32DLC = data_len;
    /* Set data */
    memcpy(TxMsgFrame.au8Data, au8Data, data_len);
    if(CANFD_TransmitDMsg(BMS_CAN, 0, &TxMsgFrame) != 1){
        return RS_ERROR;
    }
    //xSemaphoreTake(CAN0_Transfer_Done_BinarySemHandle, portMAX_DELAY);
    //delay_ms(50);
    return RS_OK;
}
 
/**
 * @details: This function is Parse_S19 Record
 */
int8_t Parse_S19_Record(const char *line, S19_Record *record)
{
    int i, checksum;
    char type[3]={0};
    int length;
    int8_t Address_length;
    uint8_t byte;
    //获取类型和长度
    if(sscanf(line, "%2c%2x", type, &length) != 2){
        RS_LOGE("Error parsing type length");
        return RS_ERROR;
    }
    //类型检查
    if(type[0] != 'S'){
        RS_LOGE("Error Invalid record type");
        return RS_ERROR;
    }
    //类型 s0 s5 s7 s8 s9 不进行数据解析
    if(type[1]=='0' || type[1]=='5' || type[1]=='7' || type[1]=='8' || type[1]=='9'){
        return -3;
    }
    //通过类型解析地址长度
    Address_length =Parse_S19_AddressLen(type);
    if(Address_length == RS_ERROR){
        RS_LOGE("Parse_S19_AddressLen");
        return RS_ERROR;
    }
    //获取行地址
    switch(Address_length){
        case 4:
            {
                if(sscanf(line+4, "%4x", &record->address) != 1){
                    RS_LOGE("Error parsing address");
                    return RS_ERROR;
                }
                break;
            }
        case 6:
            {
                if(sscanf(line+4, "%6x", &record->address) != 1){
                    RS_LOGE("Error parsing address");
                    return RS_ERROR;
                }
                break;
            }
        case 8:
            {
                if(sscanf(line+4, "%8x", &record->address) != 1){
                    RS_LOGE("Error parsing address");
                    return RS_ERROR;
                }
                break;
            }
        default:break;
    }
    //length = address + data + checksum  字节数总和
    if(length > 256){
        RS_LOGE("Error Invalid data length");
        return RS_ERROR;
    }
    //记录数据字节大小
    record->data_length = (length*2 - Address_length - 2) / 2;
    //解析数据
    for(i = 0; i < (length*2 - Address_length - 2)/2; ++i){
        if(sscanf((line+2+2+Address_length)+i*2, "%2hhx", &byte) != 1){
            RS_LOGE("Error parsing data bytes");
            return RS_ERROR;
        }
        record->data[i] = byte;
    }
    //获取行数据校验和
    int checksum_line =0;
    if(sscanf((line+length*2+2), "%2x", &checksum_line) != 1){
        RS_LOGE("Error parsing checksum_line bytes");
        return RS_ERROR;
    }
    //计算对比行校验和
    checksum = 0;
    int checksum_data =0;
    for(i=0; i<length; i++){
        if(sscanf((line+2+i*2), "%2x", &checksum_data) != 1){
            RS_LOGE("Error parsing checksum bytes");
            return RS_ERROR;
        }
        checksum +=checksum_data;
    }
    checksum = 0xFF -(checksum & 0xFF);
    //比较计算值与原始值的一致性
    if(checksum != checksum_line){
        RS_LOGE("Error Invalid checksum");
        return RS_ERROR;
    }
    return RS_OK;
}
 
/**
 * @details: This function is Parse_S19 AddressLen
 */
int8_t Parse_S19_AddressLen(char *line)
{
    int8_t AddressLen = 0;
    if(line[0] != 'S' || line == NULL || strlen(line) != 2){
        return RS_ERROR;
    }
    switch(line[1]){
        case '0': AddressLen = 2 * 2;
                  break;
        case '1': AddressLen = 2 * 2;
                  break;
        case '2': AddressLen = 3 * 2;
                  break;
        case '3': AddressLen = 4 * 2;
                  break;
        case '7': AddressLen = 4 * 2;
                  break;
        case '8': AddressLen = 3 * 2;
                  break;
        case '9': AddressLen = 2 * 2;
                  break;
        default:break;
    }
    return AddressLen;
}
 
/**
 * @details: This function is CANBootStep_Set
 */
void CANBootStep_Set(uint8_t BootStep)
{
    CANBootStep =BootStep;
    //只要跳转,清除BMS的CAN当前发送超时计数
    BOOT_Send_Timeout_Num =0;
    /*
        跳转 :
                1.对接口进行统一管理操作
                2.清除链表所有节点isReady标志
                3.重置链表所有节点超时时间
    */
    if(double_list_isempty(&Device_list_Head.list) ==0){
         double_list_for_each(ptr,&Device_list_Head.list){
            BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(ptr, BMSDeviceInfo_Member_List_t, list);
            //遍历清除所有准备状态标志
            BMSDeviceInfo_Member->BMSDeviceInfo_Member.isReady =0;
            switch(BootStep){
                case BOOT_IDLE:
                    break;
                case BOOT_DEVICE_LOCATION: BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout =DEVICE_LOCATIONH_TIMEOUT;
                    break;
                case BOOT_DEVICE_SEARCH: BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout =DEVICE_SEARCH_TIMEOUT;
                    break;
                case BOOT_BURNING_REQUEST: BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout =DEVICE_REQUEST_TIMEOUT;
                    break;
                case BOOT_MEM_ERASE: BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout =DEVICE_ERASE_TIMEOUT;
                    break;
                case BOOT_MEM_WRITE: BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout =DEVICE_WRITE_TIMEOUT;
                    break;
                case BOOT_MEM_WRITE_END: BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout =DEVICE_WRITE_END_TIMEOUT;
                    break;
                default:break;
            }
        }
    }
    /* CAN Boot Step Deal */
    switch(BootStep){
        case BOOT_IDLE:
            {
                //关闭 Search上报开关
                Search_Pack.onoff =0;
                //OTA最后一帧数据标志置位
                xSemaphoreTake(OTA_Crc_Data_BinarySemHandle, 0);
                #if 1
                //关闭 Bms_Upgrade_Send_Recv_Pro 线程
                if(CAN_BMS_BOOT_Flag){
                    CAN_BMS_BOOT_Flag =0;
                    vTaskDelete(CAN_BMS_Upgrade_handle);
                }
                #endif
                break;
            }
        case BOOT_DEVICE_LOCATION:
            {
                //设置Location升级设备定位时间
                Device_Upgrade_Location_Timeout_Num =DEVICE_UPGRADE_LOCATION_TIMEOUT;
                //针对设备类型进行过滤
                CANFD_SetXIDFltr_BMS_DeviceIndex(0x1F010000,0x1F010000,DeviceIndex);
                //清空定位设备链表节点
                Clean_Location_Device_List();
                //关闭 Bms_Upgrade_Send_Recv_Pro 线程
                if(CAN_BMS_BOOT_Flag){
                    CAN_BMS_BOOT_Flag =0;
                    vTaskDelete(CAN_BMS_Upgrade_handle);
                }
                //创建 Bms_Upgrade_Send_Recv_Pro 线程
                if(CAN_BMS_BOOT_Flag == 0){
                    if(xTaskCreate((TaskFunction_t )Bms_Upgrade_Send_Recv_Pro,
                                (const char*    )"Bms_Upgrade_Send_Recv_Pro",
                                (uint16_t       )512*3,//15 *1024,//512*6, //512*2,
                                (void*          )NULL,
                                (UBaseType_t    )7, //8, //7,//6, //3,
                                (TaskHandle_t*  )&CAN_BMS_Upgrade_handle) != pdPASS)
                    {
                        RS_LOGE("xTaskCreate Bms_Upgrade_Send_Recv_Pro Task Failed!\n");
                    }else{
                        CAN_BMS_BOOT_Flag =1;
                    }
                }
                break;
            }
        case BOOT_DEVICE_SEARCH:
            {
                //设置Search升级设备搜索时间
                Device_Upgrade_Search_Timeout_Num =DEVICE_UPGRADE_SEARCH_TIMEOUT;
                //针对设备类型进行过滤
                CANFD_SetXIDFltr_BMS_DeviceIndex(0x1F020000,0x1F020000,DeviceIndex);
                //清空搜索设备链表节点
                Clean_Search_Device_List();
                //剔除不同的设备类型节点,保留相同设备
                if(double_list_isempty(&Device_list_Head.list) ==0){
                    double_list_for_each(ptr,&Device_list_Head.list){
                        BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(ptr, BMSDeviceInfo_Member_List_t, list);
                        if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_type != DeviceIndex){
                            double_list_remove(ptr);
                            vPortFree(BMSDeviceInfo_Member);
                        }
                    }
                }
                //创建 Bms_Upgrade_Send_Recv_Pro 线程
                if(CAN_BMS_BOOT_Flag == 0){
                    if(xTaskCreate((TaskFunction_t )Bms_Upgrade_Send_Recv_Pro,
                                (const char*    )"Bms_Upgrade_Send_Recv_Pro",
                                (uint16_t       )512*3,//15 *1024,//512*6, //512*2,
                                (void*          )NULL,
                                (UBaseType_t    )7, //8, //6, //3,
                                (TaskHandle_t*  )&CAN_BMS_Upgrade_handle) != pdPASS)
                    {
                        RS_LOGE("xTaskCreate Bms_Upgrade_Send_Recv_Pro Task Failed!\n");
                    }else{
                        CAN_BMS_BOOT_Flag =1;
                    }
                }
                break;
            }
        case BOOT_BURNING_REQUEST:
            {
                //清空重置队列缓冲区
                xQueueReset(Can_Recv_Data_QueueHandle);
                //针对设备类型进行过滤
                CANFD_SetXIDFltr_BMS_DeviceIndex(0x1F030000,0x1F030000,DeviceIndex);
                break;
            }
        case BOOT_MEM_ERASE:
            {
                //清空重置队列缓冲区
                xQueueReset(Can_Recv_Data_QueueHandle);
                //针对设备类型进行过滤
                CANFD_SetXIDFltr_BMS_DeviceIndex(0x1F040000,0x1F040000,DeviceIndex);
                break;
            }
        case BOOT_MEM_WRITE:
            {
                //清空重置队列缓冲区
                xQueueReset(Can_Recv_Data_QueueHandle);
                //针对设备类型进行过滤
                CANFD_SetXIDFltr_BMS_DeviceIndex(0x1F050000,0x1F050000,DeviceIndex);
                break;
            }
        case BOOT_MEM_WRITE_END:
            {
                //清空重置队列缓冲区
                xQueueReset(Can_Recv_Data_QueueHandle);
                //针对设备类型进行过滤
                CANFD_SetXIDFltr_BMS_DeviceIndex(0x1F060000,0x1F060000,DeviceIndex);
                break;
            }
        default:break;
    }
}
 
/**清空搜索设备链表节点
 * @details: This function is Clean_Search_Device_List
 */
void Clean_Search_Device_List(void)
{
    if(double_list_isempty(&Device_list_Head.list) ==0){
        double_list_for_each(ptr,&Device_list_Head.list){
            BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(ptr, BMSDeviceInfo_Member_List_t, list);
            double_list_remove(ptr);
            vPortFree(BMSDeviceInfo_Member);
        }
    }
}
 
/**清空定位设备链表节点
 * @details: This function is Clean_Location_Device_List
 */
void Clean_Location_Device_List(void)
{
    if(double_list_isempty(&Device_Location_list_Head.list) ==0){
        double_list_for_each(ptr,&Device_Location_list_Head.list){
            BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(ptr, BMSDeviceInfo_Member_List_t, list);
            double_list_remove(ptr);
            vPortFree(BMSDeviceInfo_Member);
        }
    }
}

  

posted @   panda_w  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示