porkling office 6 bulan lalu
induk
melakukan
a03bc76eea
69 mengubah file dengan 4708 tambahan dan 2434 penghapusan
  1. 18 0
      OnlyUpdateApp_IAP/APP/ch32v20x_it.c
  2. 59 47
      OnlyUpdateApp_IAP/APP/include/define.h
  3. 41 72
      OnlyUpdateApp_IAP/APP/include/led.h
  4. 27 0
      OnlyUpdateApp_IAP/APP/include/user_upgrade.h
  5. 46 0
      OnlyUpdateApp_IAP/APP/include/user_ws2812b.h
  6. 40 0
      OnlyUpdateApp_IAP/APP/include/ws2812b_spi.h
  7. 70 219
      OnlyUpdateApp_IAP/APP/led.c
  8. 3 1
      OnlyUpdateApp_IAP/APP/peripheral.c
  9. 18 0
      OnlyUpdateApp_IAP/APP/peripheral_main.c
  10. 64 0
      OnlyUpdateApp_IAP/APP/user_upgrade.c
  11. 214 0
      OnlyUpdateApp_IAP/APP/user_ws2812b.c
  12. 100 0
      OnlyUpdateApp_IAP/APP/ws2812b_spi.c
  13. 25 1
      OnlyUpdateApp_IAP/obj/APP/ch32v20x_it.d
  14. 6 0
      OnlyUpdateApp_IAP/obj/APP/led.d
  15. 4 1
      OnlyUpdateApp_IAP/obj/APP/peripheral.d
  16. 10 1
      OnlyUpdateApp_IAP/obj/APP/peripheral_main.d
  17. 16 4
      OnlyUpdateApp_IAP/obj/APP/subdir.mk
  18. 118 0
      OnlyUpdateApp_IAP/obj/APP/user_upgrade.d
  19. 115 0
      OnlyUpdateApp_IAP/obj/APP/user_ws2812b.d
  20. 115 0
      OnlyUpdateApp_IAP/obj/APP/ws2812b_spi.d
  21. TEMPAT SAMPAH
      OnlyUpdateApp_IAP/obj/OnlyUpdateApp_IAP.bin
  22. 560 253
      OnlyUpdateApp_IAP/obj/OnlyUpdateApp_IAP.lst
  23. 513 469
      OnlyUpdateApp_IAP/obj/OnlyUpdateApp_IAP.map
  24. 2 0
      mainboard/.cproject
  25. 3 3
      mainboard/.mrs/launch.json
  26. 9 1
      mainboard/User/app_main.c
  27. 18 0
      mainboard/User/ch32v20x_it.c
  28. 4 0
      mainboard/User/include/define.h
  29. 29 5
      mainboard/components/action/user_server.h
  30. 253 15
      mainboard/components/action/user_sever.c
  31. 2 2
      mainboard/components/charge/user_adc.c
  32. 2 2
      mainboard/components/charge/user_adc.h
  33. 1 0
      mainboard/components/charge/user_charge.c
  34. 2 2
      mainboard/components/charge/user_charge.h
  35. 155 0
      mainboard/components/charge/user_fan.c
  36. 63 0
      mainboard/components/charge/user_fan.h
  37. 232 0
      mainboard/components/electlock/elect_sw.c
  38. 52 0
      mainboard/components/electlock/elect_sw.h
  39. 20 1
      mainboard/components/electlock/user_elect.c
  40. 3 2
      mainboard/components/electlock/user_elect.h
  41. 80 229
      mainboard/components/led/user_led.c
  42. 29 66
      mainboard/components/led/user_led.h
  43. 6 6
      mainboard/components/nfc/lpcd.c
  44. 1 1
      mainboard/components/nfc/user_nfc.h
  45. 215 0
      mainboard/components/ws2812b/user_ws2812b.c
  46. 46 0
      mainboard/components/ws2812b/user_ws2812b.h
  47. 100 0
      mainboard/components/ws2812b/ws2812b_spi.c
  48. 40 0
      mainboard/components/ws2812b/ws2812b_spi.h
  49. 4 2
      mainboard/mainboard.wvproj
  50. 0 0
      mainboard/obj/HAL/subdir.mk
  51. 0 0
      mainboard/obj/Profile/subdir.mk
  52. 0 0
      mainboard/obj/SRC/Core/subdir.mk
  53. 0 0
      mainboard/obj/SRC/Debug/subdir.mk
  54. 0 0
      mainboard/obj/SRC/Peripheral/src/subdir.mk
  55. 0 0
      mainboard/obj/User/app_drv_fifo/subdir.mk
  56. 0 0
      mainboard/obj/User/subdir.mk
  57. 0 0
      mainboard/obj/components/action/subdir.mk
  58. 0 0
      mainboard/obj/components/can/subdir.mk
  59. 8 4
      mainboard/obj/components/charge/subdir.mk
  60. 0 0
      mainboard/obj/components/config/subdir.mk
  61. 4 0
      mainboard/obj/components/electlock/subdir.mk
  62. 0 0
      mainboard/obj/components/led/subdir.mk
  63. 0 0
      mainboard/obj/components/nfc/subdir.mk
  64. 0 0
      mainboard/obj/components/tools/subdir.mk
  65. 27 0
      mainboard/obj/components/ws2812b/subdir.mk
  66. 1114 1025
      mainboard/obj/mainboard.map
  67. 1 0
      mainboard/obj/makefile
  68. 1 0
      mainboard/obj/sources.mk
  69. TEMPAT SAMPAH
      obj/main.bin

+ 18 - 0
OnlyUpdateApp_IAP/APP/ch32v20x_it.c

@@ -15,6 +15,8 @@
  */
 #include "ch32v20x_it.h"
 #include "CONFIG.h"
+#include "ws2812b_spi.h"
+#include "user_ws2812b.h"
 
 /*********************************************************************
  * LOCAL FUNCTIONS
@@ -23,6 +25,7 @@ void NMI_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
 void HardFault_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
 void BB_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
 //void LLE_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
+void USER_WS2812B_DMA_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
 
 /*********************************************************************
  * @fn      NMI_Handler
@@ -74,3 +77,18 @@ void BB_IRQHandler(void)
 //{
 //    LLE_IRQLibHandler();
 //}
+
+void USER_WS2812B_DMA_IRQHandler(void)
+{
+    if(DMA_GetITStatus(USER_WS2812B_DMA_IT_TC))
+    {
+        // 清除中断标志
+        DMA_ClearITPendingBit(USER_WS2812B_DMA_IT_TC);
+
+        DMA_Cmd(USER_WS2812B_DMA_CHANNEL, DISABLE);
+        SPI_I2S_DMACmd(USER_WS2812B_SPI, SPI_I2S_DMAReq_Tx, DISABLE);
+        // 在这里处理传输完成逻辑
+        // 例如: 设置标志、准备下一次传输等
+        vUser_ws2812b_set_tx_stat(false);
+    }
+}

+ 59 - 47
OnlyUpdateApp_IAP/APP/include/define.h

@@ -7,63 +7,75 @@
 #include "CONFIG.h"
 #include "HAL.h"
 
-#define LOG_OUTPUT_TIME						                3000
+#define LOG_OUTPUT_TIME						                    3000
 
-#define Timecount                                           256
+#define Timecount                                               256
 
-#define REBYTE_LEN                                          512
-#define SEND_LEN                                            128
+#define REBYTE_LEN                                              512
+#define SEND_LEN                                                128
 
-#define HIGH							                    1
-#define LOW							                        0
+#define HIGH							                        1
+#define LOW							                            0
 
-#define SOFTWARE_VERSION					                0x10
-#define HARDWARE_VERSION					                0x14
+#define SOFTWARE_VERSION					                    0x10
+#define HARDWARE_VERSION					                    0x14
 
-#define AES_ENABLE						                    0
+#define AES_ENABLE						                        0
 
 
 /* OTA upgrade logo */
-#define IMAGE_OTA_FLAG       			                    0x03
+#define IMAGE_OTA_FLAG       			                        0x03
 
 /* Store on the DataFlash address, the position of Bluetooth cannot be occupied */
-#define OTA_DATAFLASH_ADDR                                  0x08077000
-
-#define IMAGE_FLAG_1                                        0x1A
-#define IMAGE_FLAG_2                                        0x2A
-#define IMAGE_FLAG_3                                        0x3A
-
-#define KEY_GPIO_RCC_ENABLE					                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE)
-
-#define CHARGE_LEFT_GPIO                                    GPIOC
-#define CHARGE_LEFT_PIN                                     GPIO_Pin_10
-#define CHARGE_LEFT_ON						                GPIO_WriteBit(CHARGE_LEFT_GPIO, CHARGE_LEFT_PIN, Bit_SET)
-#define CHARGE_LEFT_OFF						                GPIO_WriteBit(CHARGE_LEFT_GPIO, CHARGE_LEFT_PIN, Bit_RESET)
-
-#define CHARGE_RIGHT_GPIO                                   GPIOA
-#define CHARGE_RIGHT_PIN                                    GPIO_Pin_4
-#define CHARGE_RIGHT_ON						                GPIO_WriteBit(CHARGE_RIGHT_GPIO, CHARGE_RIGHT_PIN, Bit_SET)
-#define CHARGE_RIGHT_OFF						            GPIO_WriteBit(CHARGE_RIGHT_GPIO, CHARGE_RIGHT_PIN, Bit_RESET)
-
-#define ELECT_LEFT_OPEN_GPIO                                GPIOC
-#define ELECT_LEFT_OPEN_PIN                                 GPIO_Pin_12
-#define ELECT_LEFT_OPEN_ON						            GPIO_WriteBit(ELECT_LEFT_OPEN_GPIO, ELECT_LEFT_OPEN_PIN, Bit_SET)
-#define ELECT_LEFT_OPEN_OFF						            GPIO_WriteBit(ELECT_LEFT_OPEN_GPIO, ELECT_LEFT_OPEN_PIN, Bit_RESET)
-
-#define ELECT_LEFT_CLOSE_GPIO                               GPIOC
-#define ELECT_LEFT_CLOSE_PIN                                GPIO_Pin_11
-#define ELECT_LEFT_CLOSE_ON						            GPIO_WriteBit(ELECT_LEFT_CLOSE_GPIO, ELECT_LEFT_CLOSE_PIN, Bit_SET)
-#define ELECT_LEFT_CLOSE_OFF						        GPIO_WriteBit(ELECT_LEFT_CLOSE_GPIO, ELECT_LEFT_CLOSE_PIN, Bit_RESET)
-
-#define ELECT_RIGHT_OPEN_GPIO                               GPIOA
-#define ELECT_RIGHT_OPEN_PIN                                GPIO_Pin_3
-#define ELECT_RIGHT_OPEN_ON						            GPIO_WriteBit(ELECT_RIGHT_OPEN_GPIO, ELECT_RIGHT_OPEN_PIN, Bit_SET)
-#define ELECT_RIGHT_OPEN_OFF						        GPIO_WriteBit(ELECT_RIGHT_OPEN_GPIO, ELECT_RIGHT_OPEN_PIN, Bit_RESET)
-
-#define ELECT_RIGHT_CLOSE_GPIO                              GPIOD
-#define ELECT_RIGHT_CLOSE_PIN                               GPIO_Pin_4
-#define ELECT_RIGHT_CLOSE_ON						        GPIO_WriteBit(ELECT_RIGHT_CLOSE_GPIO, ELECT_RIGHT_CLOSE_PIN, Bit_SET)
-#define ELECT_RIGHT_CLOSE_OFF						        GPIO_WriteBit(ELECT_RIGHT_CLOSE_GPIO, ELECT_RIGHT_CLOSE_PIN, Bit_RESET)
+#define OTA_DATAFLASH_ADDR                                      0x08077000
+
+#define IMAGE_FLAG_1                                            0x1A
+#define IMAGE_FLAG_2                                            0x2A
+#define IMAGE_FLAG_3                                            0x3A
+
+#define USER_WS2812B_COUNT_DEFAULT                              3
+
+#define KEY_GPIO_RCC_ENABLE					                    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE)
+
+#define CHARGE_LEFT_GPIO                                        GPIOC
+#define CHARGE_LEFT_PIN                                         GPIO_Pin_10
+#define CHARGE_LEFT_ON						                    GPIO_WriteBit(CHARGE_LEFT_GPIO, CHARGE_LEFT_PIN, Bit_SET)
+#define CHARGE_LEFT_OFF						                    GPIO_WriteBit(CHARGE_LEFT_GPIO, CHARGE_LEFT_PIN, Bit_RESET)
+
+#define CHARGE_RIGHT_GPIO                                       GPIOB
+#define CHARGE_RIGHT_PIN                                        GPIO_Pin_0
+#define CHARGE_RIGHT_ON						                    GPIO_WriteBit(CHARGE_RIGHT_GPIO, CHARGE_RIGHT_PIN, Bit_SET)
+#define CHARGE_RIGHT_OFF						                GPIO_WriteBit(CHARGE_RIGHT_GPIO, CHARGE_RIGHT_PIN, Bit_RESET)
+
+#define LEFT_FAN_GPIO                                     	    GPIOA
+#define LEFT_FAN_PIN                                       	    GPIO_Pin_15
+#define LEFT_FAN_ON						                        GPIO_WriteBit(LEFT_FAN_GPIO, LEFT_FAN_PIN, Bit_SET)
+#define LEFT_FAN_OFF						                    GPIO_WriteBit(LEFT_FAN_GPIO, LEFT_FAN_PIN, Bit_RESET)
+
+#define RIGHT_FAN_GPIO                                      	GPIOB
+#define RIGHT_FAN_PIN                                       	GPIO_Pin_3
+#define RIGHT_FAN_ON						                    GPIO_WriteBit(RIGHT_FAN_GPIO, RIGHT_FAN_PIN, Bit_SET)
+#define RIGHT_FAN_OFF						                    GPIO_WriteBit(RIGHT_FAN_GPIO, RIGHT_FAN_PIN, Bit_RESET)
+
+#define ELECT_LEFT_OPEN_GPIO                                    GPIOC
+#define ELECT_LEFT_OPEN_PIN                                     GPIO_Pin_12
+#define ELECT_LEFT_OPEN_ON						                GPIO_WriteBit(ELECT_LEFT_OPEN_GPIO, ELECT_LEFT_OPEN_PIN, Bit_SET)
+#define ELECT_LEFT_OPEN_OFF						                GPIO_WriteBit(ELECT_LEFT_OPEN_GPIO, ELECT_LEFT_OPEN_PIN, Bit_RESET)
+
+#define ELECT_LEFT_CLOSE_GPIO                                   GPIOC
+#define ELECT_LEFT_CLOSE_PIN                                    GPIO_Pin_11
+#define ELECT_LEFT_CLOSE_ON						                GPIO_WriteBit(ELECT_LEFT_CLOSE_GPIO, ELECT_LEFT_CLOSE_PIN, Bit_SET)
+#define ELECT_LEFT_CLOSE_OFF						            GPIO_WriteBit(ELECT_LEFT_CLOSE_GPIO, ELECT_LEFT_CLOSE_PIN, Bit_RESET)
+
+#define ELECT_RIGHT_OPEN_GPIO                                   GPIOA
+#define ELECT_RIGHT_OPEN_PIN                                    GPIO_Pin_4
+#define ELECT_RIGHT_OPEN_ON						                GPIO_WriteBit(ELECT_RIGHT_OPEN_GPIO, ELECT_RIGHT_OPEN_PIN, Bit_SET)
+#define ELECT_RIGHT_OPEN_OFF						            GPIO_WriteBit(ELECT_RIGHT_OPEN_GPIO, ELECT_RIGHT_OPEN_PIN, Bit_RESET)
+
+#define ELECT_RIGHT_CLOSE_GPIO                                  GPIOD
+#define ELECT_RIGHT_CLOSE_PIN                                   GPIO_Pin_4
+#define ELECT_RIGHT_CLOSE_ON						            GPIO_WriteBit(ELECT_RIGHT_CLOSE_GPIO, ELECT_RIGHT_CLOSE_PIN, Bit_SET)
+#define ELECT_RIGHT_CLOSE_OFF						            GPIO_WriteBit(ELECT_RIGHT_CLOSE_GPIO, ELECT_RIGHT_CLOSE_PIN, Bit_RESET)
 
 
 #endif /* USER_DEFINE_H_ */

+ 41 - 72
OnlyUpdateApp_IAP/APP/include/led.h

@@ -1,5 +1,5 @@
-#ifndef USER_LED_H__
-#define USER_LED_H__
+#ifndef _LED_H__
+#define _LED_H__
 
 #include <stdint.h>
 #include <stdbool.h>
@@ -11,59 +11,23 @@ extern "C" {
 
 #define LED_INTERVAL						                    10
 
-#define LED_ON_DUTY                                             95
-#define LED_OFF_DUTY                                            0
+#define WS2812B_NORMAL_RGB                              0x0000FF00
+#define WS2812B_RST_RGB                                 0x00FFFFCC
+#define WS2812B_BLE_RGB                                 0x0000FF40
+#define WS2812B_CANID_ERROR_RGB                         0x00FFD700
+#define WS2812B_OFFLINE_RGB                             0x00FFEC8B
 
-#define TIM_LED_PERIOD					                        100
-#define TIM_LED_PRESCALER					                    360
-#define TIM_DEV_LED						                        TIM5
-#define TIM_IND_LED						                        TIM2
+#define LED_VIEW_ALARM_COLOR                            0x00FF9900                         //报警
+#define LED_VIEW_WARN_COLOR                             0x00FFFF00                         //警告
+#define LED_VIEW_KEY_ELECT_COLOR                        0x00FF0000                         //有钥匙并上锁
+#define LED_VIEW_NOKEY_ELECT_COLOR                      0x00FF0000                         //无钥匙并上锁
+#define LED_VIEW_KEY_NOELECT_COLOR                      0x0000FF00                         //有钥匙没上锁
+#define LED_VIEW_NOKEY_NOELECT_COLOR                    0x0000FF00                         //无钥匙没上锁
 
-#define LED_PWM_RCC_ENABLE					                    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM5, ENABLE);
-#define LED_GPIO_RCC_ENABLE					                    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
-
-#define LED_REMAPCONFIG_ENABLE                                  GPIO_PinRemapConfig(GPIO_FullRemap_TIM2, ENABLE);
-
-#define DEV_LED_GPIO                                      	    GPIOA
-#define DEV_LED_PIN                                       	    GPIO_Pin_2
-
-#define LEFT_LED_R_GPIO                                     	GPIOA
-#define LEFT_LED_R_PIN                                       	GPIO_Pin_15
-
-#define LEFT_LED_G_GPIO                                      	GPIOB
-#define LEFT_LED_G_PIN                                       	GPIO_Pin_3
-
-#define RIGHT_LED_R_GPIO                                     	GPIOB
-#define RIGHT_LED_R_PIN                                       	GPIO_Pin_10
-
-#define RIGHT_LED_G_GPIO                                      	GPIOB
-#define RIGHT_LED_G_PIN                                       	GPIO_Pin_11
-
-#define DEV_LED_INIT(InitStructure)					            TIM5_OC3Init(InitStructure);
-#define LEFT_LED_R_INIT(InitStructure)					        TIM_OC1Init(TIM_IND_LED, InitStructure);
-#define LEFT_LED_G_INIT(InitStructure)				            TIM_OC2Init(TIM_IND_LED, InitStructure);
-#define RIGHT_LED_R_INIT(InitStructure)				            TIM_OC3Init(TIM_IND_LED, InitStructure);
-#define RIGHT_LED_G_INIT(InitStructure)				            TIM_OC4Init(TIM_IND_LED, InitStructure);
-
-#define DEV_LED_RUN							                    TIM5_OC3PreloadConfig(TIM_OCPreload_Enable);
-#define DEV_LED_STOP						                    TIM5_OC3PreloadConfig(TIM_OCPreload_Disable);
-#define DEV_LED_COMPARE(value)					                TIM5_SetCompare3(value)
-
-#define LEFT_LED_R_RUN						                    TIM_OC1PreloadConfig(TIM_IND_LED, TIM_OCPreload_Enable);
-#define LEFT_LED_R_STOP						                    TIM_OC1PreloadConfig(TIM_IND_LED, TIM_OCPreload_Disable);
-#define LEFT_LED_R_COMPARE(value)					            TIM_SetCompare1(TIM_IND_LED, value)
-
-#define LEFT_LED_G_RUN						                    TIM_OC2PreloadConfig(TIM_IND_LED, TIM_OCPreload_Enable);
-#define LEFT_LED_G_STOP						                    TIM_OC2PreloadConfig(TIM_IND_LED, TIM_OCPreload_Disable);
-#define LEFT_LED_G_COMPARE(value)					            TIM_SetCompare2(TIM_IND_LED, value)
-
-#define RIGHT_LED_R_RUN						                    TIM_OC3PreloadConfig(TIM_IND_LED, TIM_OCPreload_Enable);
-#define RIGHT_LED_R_STOP						                TIM_OC3PreloadConfig(TIM_IND_LED, TIM_OCPreload_Disable);
-#define RIGHT_LED_R_COMPARE(value)					            TIM_SetCompare3(TIM_IND_LED, value)
-
-#define RIGHT_LED_G_RUN						                    TIM_OC4PreloadConfig(TIM_IND_LED, TIM_OCPreload_Enable);
-#define RIGHT_LED_G_STOP						                TIM_OC4PreloadConfig(TIM_IND_LED, TIM_OCPreload_Disable);
-#define RIGHT_LED_G_COMPARE(value)					            TIM_SetCompare4(TIM_IND_LED, value)
+#define FLICKER_DELAYTIME_DEFAULT                       100 / USER_WS2812B_INTERVAL
+#define ID_ERROR_FLICKER_DEFAULT                        1000 / USER_WS2812B_INTERVAL
+#define OFFLINE_FLICKER_DEFAULT                         200 / USER_WS2812B_INTERVAL
+#define BREATH_SPEED_DEFAULT                            2000 / USER_WS2812B_INTERVAL
 
 typedef enum
 {
@@ -71,17 +35,17 @@ typedef enum
 }LED_QUEUE_TYPE;
 
 typedef enum{
-    DEV_LED 		= 0,
-    LEFT_LED 		= 1,
-    RIGHT_LED 		= 2,
+    RIGHT_LED 		= 0,
+    DEV_LED 		= 1,
+    LEFT_LED 		= 2,
     LED_TYPE_MAX	= 3,
 }LED_TYPE;
 
-typedef enum{
-    RED_LED 		= 0,
-    GREEN_LED 		= 1,
-    YELLOW_LED 		= 2,
-}LED_COLOR;
+typedef struct{
+    uint8_t red;
+    uint8_t green;
+    uint8_t blue;
+}led_color_s;
 
 typedef enum{
     LED_STAT_OFF 	= 0,
@@ -96,13 +60,25 @@ typedef enum{
     LED_WORK_MAX 	    = 5,
 }LED_WORK_STAT;
 
-typedef void (*led_set_duty_func)(uint16_t duty);
+typedef enum{
+    LED_VIEW_NULL = 0,
+    LED_VIEW_ENTER_OTA, 
+    LED_VIEW_OTA,    
+}led_view_stat_e;
+
+typedef enum{
+    LED_ALL_ALARM_RST = 0,
+    LED_ALL_ALARM_BLE = 1,
+    LED_ALL_ALARM_CAN_IDX_ERROR = 2,
+    LED_ALL_ALARM_OFFLINE = 3,
+}led_all_alarm_stat_e;
 
 typedef struct{
-    uint8_t idx;
+    const uint8_t idx;
     LED_STAT stat;                        
-    LED_COLOR color;
+    led_color_s color;
     LED_WORK_STAT workStat;
+    led_view_stat_e viewStat;
     uint32_t single_flicker_period;
     uint32_t flicker_period ;
     uint32_t flicker_onperiod;
@@ -113,18 +89,11 @@ typedef struct{
     uint32_t on_durationTime;			    //PWM变化结束后持续时间,单位:ms
     uint32_t single_off_durationTime;		//PWM变化结束后持续时间,单位:ms
     uint32_t off_durationTime;			    //PWM变化结束后持续时间,单位:ms
-    led_set_duty_func set_duty;
 }led_work_s;
 
-typedef enum{
-    LED_VIEW_NULL = 0,
-    LED_VIEW_ENTER_OTA, 
-    LED_VIEW_OTA,       
-}led_view_stat_e;
-
 void led_task_init(void);
 void led_task_start(void);
-bool set_led_indication(LED_TYPE type, LED_COLOR color, LED_WORK_STAT work_stat, ...);
+bool set_led_indication(LED_TYPE type, uint32_t color, LED_WORK_STAT work_stat, ...);
 void vUser_led_set_view_stat(led_view_stat_e stat);
 
 extern tmosTaskID led_task_id;

+ 27 - 0
OnlyUpdateApp_IAP/APP/include/user_upgrade.h

@@ -0,0 +1,27 @@
+#ifndef __USER_UPGRADE_H__
+#define __USER_UPGRADE_H__
+
+#include "define.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum
+{
+    USER_UPGRADE_QUEUE_TIME 		= 0,
+    USER_UPGRADE_QUEUE_ENTER_APP 	= 1,
+}USER_UPGRADE_QUEUE_TYPE;
+
+void user_upgrade_init(void);
+void user_upgrade_start(void);
+void ota_timeout_task_start(bool stat);
+void Set_User_Upgrade_Queue(USER_UPGRADE_QUEUE_TYPE type);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // __USER_UPGRADE_H__
+
+/** @} */

+ 46 - 0
OnlyUpdateApp_IAP/APP/include/user_ws2812b.h

@@ -0,0 +1,46 @@
+#ifndef USER_WS2812B_H__
+#define USER_WS2812B_H__
+
+#include <stdint.h>
+#include <stdbool.h>
+#include "define.h"
+#include "ws2812b_spi.h"
+
+#define USER_WS2812B_INTERVAL				            10
+
+#define WS2812B_LOW                                     0xC0
+#define WS2812B_HIGH                                    0xF0
+
+typedef enum
+{
+    WS2812B_QUEUE_TIME        = 0,
+    WS2812B_QUEUE_INT		  = 1,
+}USER_WS2812B_QUEUE_TYPE;
+
+typedef struct{
+    bool change;                                        //是否有变化
+    uint8_t bright;                                     //灯亮度
+    uint8_t rValue;
+    uint8_t gValue;
+    uint8_t bValue;
+}ws2812b_led_param_s;
+
+typedef struct{
+    bool txStat;                                        //数据写状态
+    uint8_t count;                                      //灯的数量
+    ws2812b_led_param_s *led_param;
+    uint8_t *rgbValue;
+}user_ws2812b_work_s;
+    
+void vUser_ws2812b_init(uint8_t count);
+void vUser_ws2812b_task_start(void);
+void vUser_ws2812b_set_tx_stat(bool stat);
+void vUser_ws2812b_set_stat(uint8_t idx, uint8_t r, uint8_t g, uint8_t b, uint8_t bright);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // USER_WS2812B_H__
+
+/** @} */

+ 40 - 0
OnlyUpdateApp_IAP/APP/include/ws2812b_spi.h

@@ -0,0 +1,40 @@
+#ifndef __WS1812B_SPI_H_
+#define __WS1812B_SPI_H_
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include "define.h"
+
+#define USER_WS2812B_GPIO_RCC_ENABLE 						RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB, ENABLE);
+#define USER_WS2812B_SPI_RCC_ENABLE 						RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
+#define USER_WS2812B_DMA_RCC_ENABLE                         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
+
+#define USER_WS2812B_SPI									SPI2
+
+#define USER_WS2812B_DMA_CHANNEL                            DMA1_Channel5
+
+#define USER_WS2812B_DMA_IRQn                               DMA1_Channel5_IRQn
+
+#define USER_WS2812B_DMA_IRQHandler                         DMA1_Channel5_IRQHandler
+
+#define USER_WS2812B_DMA_IT_TC                              DMA1_IT_TC5
+
+#define USER_WS2812B_SPI_MOSI_GPIO						    GPIOB
+#define USER_WS2812B_SPI_MOSI_PIN						    GPIO_Pin_15
+
+#define USER_WS2812B_SPI_SCLK_GPIO						    GPIOB
+#define USER_WS2812B_SPI_SCLK_PIN						    GPIO_Pin_13
+
+
+void ws2812b_spi_Init(void);
+bool bWs2812b_spi_WriteByte(volatile uint8_t *TxData, uint32_t TxSize);
+void Ws2812b_spi_dma_init(uint8_t *txData, uint32_t txSize);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __WS1812B_SPI_H_ */

+ 70 - 219
OnlyUpdateApp_IAP/APP/led.c

@@ -1,19 +1,25 @@
 #include "led.h"
+#include "user_ws2812b.h"
 #include "define.h"
 #include "stdarg.h"
 
 tmosTaskID led_task_id = INVALID_TASK_ID;
+
+static uint32_t alarm_stat = 0;
+
 static uint16_t led_task_process_event(uint8_t task_id, uint16_t events);
-static void led_dev_duty(uint16_t duty);
-static void left_dev_duty(uint16_t duty);
-static void right_dev_duty(uint16_t duty);
+static void prvSet_led_duty(LED_TYPE type);
 
 static led_work_s led_work[LED_TYPE_MAX] = {
   {
-      .idx = DEV_LED,
-      .set_duty = led_dev_duty,
-      .color = RED_LED,
+      .idx = RIGHT_LED,
+      .color = {
+        .red = 0,
+        .green = 0xFF,
+        .blue = 0,
+      },
       .workStat = LED_WORK_OFF,
+      .viewStat = LED_VIEW_NULL,
       .single_flicker_period = 0,
       .flicker_period = 0,
       .flicker_onperiod = 0,
@@ -26,10 +32,14 @@ static led_work_s led_work[LED_TYPE_MAX] = {
       .off_durationTime = 0,				//PWM变化结束后持续时间,单位:ms
   },
   {
-      .idx = LEFT_LED,
-      .set_duty = left_dev_duty,
-      .color = RED_LED,
+      .idx = DEV_LED,
+      .color = {
+        .red = 0,
+        .green = 0xFF,
+        .blue = 0,
+      },
       .workStat = LED_WORK_OFF,
+      .viewStat = LED_VIEW_NULL,
       .single_flicker_period = 0,
       .flicker_period = 0,
       .flicker_onperiod = 0,
@@ -42,10 +52,14 @@ static led_work_s led_work[LED_TYPE_MAX] = {
       .off_durationTime = 0,				//PWM变化结束后持续时间,单位:ms
   },
   {
-      .idx = RIGHT_LED,
-      .set_duty = right_dev_duty,
-      .color = RED_LED,
+      .idx = LEFT_LED,
+      .color = {
+        .red = 0,
+        .green = 0xFF,
+        .blue = 0,
+      },
       .workStat = LED_WORK_OFF,
+      .viewStat = LED_VIEW_NULL,
       .single_flicker_period = 0,
       .flicker_period = 0,
       .flicker_onperiod = 0,
@@ -60,193 +74,16 @@ static led_work_s led_work[LED_TYPE_MAX] = {
 };
 
 /*******************************************************************************
-  * @函数名称   led_pwm_init
-  * @函数说明   初始化
-  * @输入参数  	
+  * @函数名称   prvSet_led_duty
+  * @函数说明   设置指示灯亮度
+  * @输入参数  	type:灯下标
   * @输出参数   无
   * @返回参数   无
 *******************************************************************************/
-static void led_pwm_init(void)
+static void prvSet_led_duty(LED_TYPE type)
 {
-    GPIO_InitTypeDef GPIO_InitStructure={0};
-    TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
-    TIM_OCInitTypeDef TIM_OutputCompareInitStructure;
-    TIM_BDTRInitTypeDef BDTR_Structure;
-    TIM5_TimeBaseInitTypeDef TIM5_BaseInitStructure;
-    TIM5_OCInitTypeDef TIM5_OutputCompareInitStructure;
-    TIM5_BDTRInitTypeDef BDTR5_Structure;
-
-    LED_GPIO_RCC_ENABLE;
-    GPIO_InitStructure.GPIO_Pin = DEV_LED_PIN;
-    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
-    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
-    GPIO_Init(DEV_LED_GPIO, &GPIO_InitStructure );
-
-    GPIO_InitStructure.GPIO_Pin = LEFT_LED_R_PIN;
-    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
-    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
-    GPIO_Init(LEFT_LED_R_GPIO, &GPIO_InitStructure );
-
-    GPIO_InitStructure.GPIO_Pin = LEFT_LED_G_PIN;
-    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
-    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
-    GPIO_Init(LEFT_LED_G_GPIO, &GPIO_InitStructure );
-
-    GPIO_InitStructure.GPIO_Pin = RIGHT_LED_R_PIN;
-    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
-    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
-    GPIO_Init(RIGHT_LED_R_GPIO, &GPIO_InitStructure );
-
-    GPIO_InitStructure.GPIO_Pin = RIGHT_LED_G_PIN;
-    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
-    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
-    GPIO_Init(RIGHT_LED_G_GPIO, &GPIO_InitStructure );
-
-    LED_PWM_RCC_ENABLE;
-#ifdef LED_REMAPCONFIG_ENABLE
-    LED_REMAPCONFIG_ENABLE;
-#endif
-    
-    TIM_BaseInitStructure.TIM_Period = TIM_LED_PERIOD;
-    TIM_BaseInitStructure.TIM_Prescaler = TIM_LED_PRESCALER - 1;
-    TIM_BaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up;
-    TIM_BaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
-    TIM_BaseInitStructure.TIM_RepetitionCounter = 0;
-    TIM_TimeBaseInit(TIM_IND_LED,&TIM_BaseInitStructure);
-
-    TIM_OutputCompareInitStructure.TIM_OCMode =TIM_OCMode_PWM1;				//占空比设置的高电平
-    TIM_OutputCompareInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
-    TIM_OutputCompareInitStructure.TIM_OCNPolarity =TIM_OCNPolarity_Low;
-    TIM_OutputCompareInitStructure.TIM_OutputState =TIM_OutputState_Enable;
-    TIM_OutputCompareInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
-    TIM_OutputCompareInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
-    TIM_OutputCompareInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
-    TIM_OutputCompareInitStructure.TIM_Pulse = 0;
-
-    BDTR_Structure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
-    BDTR_Structure.TIM_Break = TIM_Break_Disable;
-    BDTR_Structure.TIM_BreakPolarity = TIM_BreakPolarity_High;
-    BDTR_Structure.TIM_DeadTime = 0x80;
-    BDTR_Structure.TIM_LOCKLevel = TIM_LOCKLevel_1;
-    BDTR_Structure.TIM_OSSIState = TIM_OSSIState_Enable;
-    BDTR_Structure.TIM_OSSRState = TIM_OSSRState_Enable;
-    TIM_BDTRConfig(TIM_IND_LED,&BDTR_Structure);
-
-    LEFT_LED_R_INIT(&TIM_OutputCompareInitStructure);
-    LEFT_LED_G_INIT(&TIM_OutputCompareInitStructure);
-    RIGHT_LED_R_INIT(&TIM_OutputCompareInitStructure);
-    RIGHT_LED_G_INIT(&TIM_OutputCompareInitStructure);
-
-
-    TIM5_BaseInitStructure.TIM_Period = TIM_LED_PERIOD;
-    TIM5_BaseInitStructure.TIM_Prescaler = TIM_LED_PRESCALER - 1;
-    TIM5_BaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up;
-    TIM5_BaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
-    TIM5_BaseInitStructure.TIM_RepetitionCounter = 0;
-    TIM5_TimeBaseInit(&TIM5_BaseInitStructure);
-
-    TIM5_OutputCompareInitStructure.TIM_OCMode =TIM_OCMode_PWM2;				//占空比设置的高电平
-    TIM5_OutputCompareInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
-    TIM5_OutputCompareInitStructure.TIM_OCNPolarity =TIM_OCNPolarity_Low;
-    TIM5_OutputCompareInitStructure.TIM_OutputState =TIM_OutputState_Enable;
-    TIM5_OutputCompareInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
-    TIM5_OutputCompareInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
-    TIM5_OutputCompareInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
-    TIM5_OutputCompareInitStructure.TIM_Pulse = 0;
-
-    BDTR5_Structure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
-    BDTR5_Structure.TIM_Break = TIM_Break_Disable;
-    BDTR5_Structure.TIM_BreakPolarity = TIM_BreakPolarity_High;
-    BDTR5_Structure.TIM_DeadTime = 0x80;
-    BDTR5_Structure.TIM_LOCKLevel = TIM_LOCKLevel_1;
-    BDTR5_Structure.TIM_OSSIState = TIM_OSSIState_Enable;
-    BDTR5_Structure.TIM_OSSRState = TIM_OSSRState_Enable;
-    TIM5_BDTRConfig(&BDTR5_Structure);
-
-    DEV_LED_INIT(&TIM5_OutputCompareInitStructure);
-    
-
-    DEV_LED_RUN;
-    LEFT_LED_R_RUN;
-    LEFT_LED_G_RUN;
-    RIGHT_LED_R_RUN;
-    RIGHT_LED_G_RUN;
-
-    DEV_LED_COMPARE(0);
-    LEFT_LED_R_COMPARE(0);
-    LEFT_LED_G_COMPARE(0);
-    LEFT_LED_R_COMPARE(0);
-    LEFT_LED_G_COMPARE(0);
-
-    TIM_Cmd(TIM_DEV_LED,ENABLE);
-    TIM_Cmd(TIM_IND_LED,ENABLE);
-}
-
-/*******************************************************************************
-  * @函数名称   led_dev_duty
-  * @函数说明   设置设备指示灯PWM百分比
-  * @输入参数  	duty:百分比
-  * @输出参数   无
-  * @返回参数   无
-*******************************************************************************/
-static void led_dev_duty(uint16_t duty)
-{
-    uint16_t value = TIM_LED_PERIOD * duty / 100;
-    DEV_LED_COMPARE(value);
-}
-
-/*******************************************************************************
-  * @函数名称   left_dev_duty
-  * @函数说明   设置左边指示灯PWM百分比
-  * @输入参数  	duty:百分比
-  * @输出参数   无
-  * @返回参数   无
-*******************************************************************************/
-static void left_dev_duty(uint16_t duty)
-{
-    uint16_t value = TIM_LED_PERIOD * duty / 100;
-    if(led_work[LEFT_LED].color == RED_LED)
-    {
-        LEFT_LED_G_COMPARE(LED_OFF_DUTY);
-        LEFT_LED_R_COMPARE(duty);
-    }
-    else if(led_work[LEFT_LED].color == GREEN_LED)
-    {
-        LEFT_LED_R_COMPARE(LED_OFF_DUTY);
-        LEFT_LED_G_COMPARE(duty);
-    }
-    else if(led_work[LEFT_LED].color == YELLOW_LED)
-    {
-        LEFT_LED_R_COMPARE(duty);
-        LEFT_LED_G_COMPARE(duty);
-    }
-}
-
-/*******************************************************************************
-  * @函数名称   right_dev_duty
-  * @函数说明   设置右边指示灯PWM百分比
-  * @输入参数  	duty:百分比
-  * @输出参数   无
-  * @返回参数   无
-*******************************************************************************/
-static void right_dev_duty(uint16_t duty)
-{
-    uint16_t value = TIM_LED_PERIOD * duty / 100;
-    if(led_work[RIGHT_LED].color == RED_LED)
-    {
-        RIGHT_LED_G_COMPARE(LED_OFF_DUTY);
-        RIGHT_LED_R_COMPARE(duty);
-    }
-    else if(led_work[RIGHT_LED].color == GREEN_LED)
-    {
-        RIGHT_LED_R_COMPARE(LED_OFF_DUTY);
-        RIGHT_LED_G_COMPARE(duty);
-    }
-    else if(led_work[RIGHT_LED].color == YELLOW_LED)
-    {
-        RIGHT_LED_R_COMPARE(duty);
-        RIGHT_LED_G_COMPARE(duty);
-    }
+    vUser_ws2812b_set_stat(type, led_work[type].color.red, led_work[type].color.green, 
+                            led_work[type].color.blue, led_work[type].duty_value);
 }
 
 /*******************************************************************************
@@ -264,13 +101,15 @@ static void led_invert(led_work_s *led_work)
         {
             led_work->single_flicker_period = led_work->flicker_period;
             led_work->stat = LED_STAT_ON;
-            led_work->set_duty(LED_ON_DUTY);
+            led_work->duty_value = 100;
+            prvSet_led_duty(led_work->idx);
         }
         else if(led_work->single_flicker_period == (led_work->flicker_period - led_work->flicker_onperiod))
         {
             led_work->single_flicker_period--;
             led_work->stat = LED_STAT_OFF;
-            led_work->set_duty(LED_OFF_DUTY);
+            led_work->duty_value = 0;
+            prvSet_led_duty(led_work->idx);
             led_work->flicker_count--;
         }
         else{
@@ -279,7 +118,8 @@ static void led_invert(led_work_s *led_work)
     }
     else{
         led_work->workStat = LED_WORK_OFF;
-        led_work->set_duty(LED_OFF_DUTY);
+        led_work->duty_value = 0;
+        prvSet_led_duty(led_work->idx);
     }
 }
 
@@ -300,15 +140,15 @@ static void led_heart(led_work_s *led_work)
         led_work->single_flicker_period = led_work->flicker_period;
         led_work->duty_value = 0;
         led_work->single_off_durationTime = led_work->off_durationTime;
-        led_work->set_duty(led_work->duty_value);
+        prvSet_led_duty(led_work->idx);
         led_work->flicker_count--;
       }
       else if(led_work->single_flicker_period == off_period)
       {
         led_work->single_flicker_period--;
-        led_work->duty_value = led_work->duty_on;
+        led_work->duty_value = 100;
         led_work->single_on_durationTime = led_work->on_durationTime;
-        led_work->set_duty(led_work->duty_value);
+        prvSet_led_duty(led_work->idx);
       }
       else{
         if(led_work->single_flicker_period > off_period)
@@ -317,7 +157,7 @@ static void led_heart(led_work_s *led_work)
             {
                 led_work->single_flicker_period--;
                 led_work->duty_value = (led_work->flicker_period - led_work->single_flicker_period) * 100 / led_work->flicker_onperiod;
-                led_work->set_duty(led_work->duty_value);
+                prvSet_led_duty(led_work->idx);
             }
             else{
                 led_work->single_off_durationTime--;
@@ -328,7 +168,7 @@ static void led_heart(led_work_s *led_work)
             {
                 led_work->single_flicker_period--;
                 led_work->duty_value = led_work->single_flicker_period * 100 / off_period;
-                led_work->set_duty(led_work->duty_value);
+                prvSet_led_duty(led_work->idx);
             }
             else{
                 led_work->single_on_durationTime--;
@@ -418,7 +258,7 @@ static uint16_t led_task_process_event(uint8_t task_id, uint16_t events)
   * @输出参数   无
   * @返回参数   无
 *******************************************************************************/
-bool set_led_indication(LED_TYPE type, LED_COLOR color, LED_WORK_STAT work_stat, ...)
+bool set_led_indication(LED_TYPE type, uint32_t color, LED_WORK_STAT work_stat, ...)
 {
     bool stat = false;
 
@@ -427,22 +267,19 @@ bool set_led_indication(LED_TYPE type, LED_COLOR color, LED_WORK_STAT work_stat,
 	    goto exit;
     }
 
-    if(color > YELLOW_LED)
-    {
-	    goto exit;
-    }
+    led_work[type].color.red = (color >> 16) & 0xFF;
+    led_work[type].color.green = (color >> 8) & 0xFF;
+    led_work[type].color.blue = color & 0xFF;
 
     if(work_stat == LED_WORK_OFF || work_stat == LED_WORK_ON)
     {
-        led_work[type].color = color;
         led_work[type].workStat = work_stat;
-        led_work[type].set_duty((work_stat == LED_WORK_ON) ? LED_ON_DUTY : LED_OFF_DUTY);
-
+        led_work[type].duty_value = (work_stat == LED_WORK_ON) ? 100 : 0;
+        prvSet_led_duty(led_work[type].idx);
         stat = true;
     }
     else if(work_stat == LED_WORK_INVERT || work_stat == LED_WORK_BREATHE)
     {
-        led_work[type].color = color;
         led_work[type].workStat = work_stat;
         led_work[type].duty_value = 0;
         led_work[type].stat = LED_STAT_OFF;
@@ -468,6 +305,21 @@ bool set_led_indication(LED_TYPE type, LED_COLOR color, LED_WORK_STAT work_stat,
 
         va_end(ap);
 
+        for(int i = 0; i < LED_TYPE_MAX; i++)
+        {
+            if(led_work[i].workStat == LED_WORK_INVERT 
+            || led_work[i].workStat == LED_WORK_BREATHE)
+            {
+                led_work[i].single_flicker_period = led_work[i].flicker_period;
+                led_work[i].duty_value = 0;
+                if(led_work[i].workStat == LED_WORK_BREATHE)
+                {
+                    led_work[i].single_on_durationTime = led_work[i].on_durationTime;
+                    led_work[i].single_off_durationTime = led_work[i].off_durationTime;
+                }
+            }
+        }
+
         stat = true;
     }
 exit:
@@ -485,7 +337,6 @@ void led_task_init(void)
 {
     led_task_id  = TMOS_ProcessEventRegister(led_task_process_event);
     PRINT("led_task_id=%d\n", led_task_id);
-    led_pwm_init();
 }
 
 /*******************************************************************************
@@ -513,14 +364,14 @@ void vUser_led_set_view_stat(led_view_stat_e stat)
     switch(stat)
     {
         case LED_VIEW_ENTER_OTA:{
-            set_led_indication(DEV_LED, YELLOW_LED, LED_WORK_BREATHE, 3000, 1500, 0, 500, 500);
-            set_led_indication(LEFT_LED, YELLOW_LED, LED_WORK_BREATHE, 3000, 1500, 0, 500, 500);
-            set_led_indication(RIGHT_LED, YELLOW_LED, LED_WORK_BREATHE, 3000, 1500, 0, 500, 500);
+            set_led_indication(DEV_LED, WS2812B_BLE_RGB, LED_WORK_BREATHE, 3000, 1500, 0, 500, 500);
+            set_led_indication(LEFT_LED, WS2812B_BLE_RGB, LED_WORK_BREATHE, 3000, 1500, 0, 500, 500);
+            set_led_indication(RIGHT_LED, WS2812B_BLE_RGB, LED_WORK_BREATHE, 3000, 1500, 0, 500, 500);
         }break;  
         case LED_VIEW_OTA:{
-            set_led_indication(DEV_LED, YELLOW_LED, LED_WORK_BREATHE, 200, 100, 0, 10, 10);
-            set_led_indication(LEFT_LED, YELLOW_LED, LED_WORK_BREATHE, 200, 100, 0, 10, 10);
-            set_led_indication(RIGHT_LED, YELLOW_LED, LED_WORK_BREATHE, 200, 100, 0, 10, 10);
+            set_led_indication(DEV_LED, WS2812B_BLE_RGB, LED_WORK_BREATHE, 200, 100, 0, 10, 10);
+            set_led_indication(LEFT_LED, WS2812B_BLE_RGB, LED_WORK_BREATHE, 200, 100, 0, 10, 10);
+            set_led_indication(RIGHT_LED, WS2812B_BLE_RGB, LED_WORK_BREATHE, 200, 100, 0, 10, 10);
         }break; 
         default:break;
     }

+ 3 - 1
OnlyUpdateApp_IAP/APP/peripheral.c

@@ -22,6 +22,7 @@
 #include "OTA.h"
 #include "OTAprofile.h"
 #include "led.h"
+#include "user_upgrade.h"
 
 /*********************************************************************
  * MACROS
@@ -390,7 +391,7 @@ static void peripheralStateNotificationCB(gapRole_States_t newState, gapRoleEven
 
             conn_interval = event->connInterval;
             PRINT("Connected.. \n");
-
+            ota_timeout_task_start(false);
             if(conn_interval > DEFAULT_DESIRED_MAX_CONN_INTERVAL)
             {
                 PRINT("Send Update\r\n");
@@ -413,6 +414,7 @@ static void peripheralStateNotificationCB(gapRole_States_t newState, gapRoleEven
             // Set the GAP Role Parameters
             GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t), &initial_advertising_enable);
             PRINT("Disconnected..\n");
+            ota_timeout_task_start(true);
         }
         break;
 

+ 18 - 0
OnlyUpdateApp_IAP/APP/peripheral_main.c

@@ -18,6 +18,8 @@
 #include "OTA.h"
 #include "OTAprofile.h"
 #include "led.h"
+#include "user_ws2812b.h"
+#include "user_upgrade.h"
 
 /* ¼Ç¼µ±Ç°µÄImage */
 unsigned char CurrImageFlag = 0xff;
@@ -110,6 +112,18 @@ static void User_GPIO_Init(void)
     GPIO_Init(CHARGE_RIGHT_GPIO, &GPIO_InitStructure);
     CHARGE_RIGHT_OFF;
 
+    GPIO_InitStructure.GPIO_Pin = LEFT_FAN_PIN;
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
+    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+    GPIO_Init(LEFT_FAN_GPIO, &GPIO_InitStructure);
+    LEFT_FAN_OFF;
+
+    GPIO_InitStructure.GPIO_Pin = RIGHT_FAN_PIN;
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
+    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+    GPIO_Init(RIGHT_FAN_GPIO, &GPIO_InitStructure);
+    RIGHT_FAN_OFF;
+
     GPIO_InitStructure.GPIO_Pin = ELECT_LEFT_OPEN_PIN;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
@@ -182,10 +196,14 @@ int main(void)
     HAL_Init();
     GAPRole_PeripheralInit();
     Peripheral_Init();
+    vUser_ws2812b_init(USER_WS2812B_COUNT_DEFAULT);
     led_task_init();
+    user_upgrade_start();
+    vUser_ws2812b_task_start();
     led_task_start();
 	vUser_led_set_view_stat(LED_VIEW_ENTER_OTA);
     PRINT("start task\n");
+    ota_timeout_task_start(true);
     Main_Circulation();
 }
 

+ 64 - 0
OnlyUpdateApp_IAP/APP/user_upgrade.c

@@ -0,0 +1,64 @@
+#include "user_upgrade.h"
+#include "peripheral.h"
+#include "ota.h"
+#include "led.h"
+
+static tmosTaskID user_upgrade_task_id = INVALID_TASK_ID;
+
+static bool ota_timeout_check = false;
+static uint16_t ota_timeout_delay_count = 60;
+
+static void user_upgrade_time_pro(void)
+{
+    if(ota_timeout_check == true)
+    {
+	if(ota_timeout_delay_count > 0)
+	{
+	    ota_timeout_delay_count--;
+	    if(ota_timeout_delay_count == 1)
+	    {
+		    Set_User_Upgrade_Queue(USER_UPGRADE_QUEUE_ENTER_APP);
+	    }
+	}
+    }
+}
+
+void Set_User_Upgrade_Queue(USER_UPGRADE_QUEUE_TYPE type)
+{
+    bStatus_t stat = tmos_start_task(user_upgrade_task_id, (1 << type), MS1_TO_SYSTEM_TIME(10));
+}
+
+//task的event处理回调函数,需要在注册task时候,传进去
+static uint16_t user_upgrade_task_process_event(uint8_t task_id, uint16_t events)
+{
+    //event 处理
+    if(events & (1 << USER_UPGRADE_QUEUE_TIME))
+    {
+        user_upgrade_time_pro();
+        return (events ^ (1 << USER_UPGRADE_QUEUE_TIME)); //异或的方式清除该事件运行标志,并返回未运行的事件标志
+    }
+    //event 处理
+    if(events & (1 << USER_UPGRADE_QUEUE_ENTER_APP))
+    {
+        /* Close all the current use interrupt, or it is convenient to directly close */
+        __disable_irq();
+        PRINT("ota timeout jump App \n");
+        Delay_Ms(10);
+        app_start();
+    	return (events ^ (1 << USER_UPGRADE_QUEUE_ENTER_APP)); //异或的方式清除该事件运行标志,并返回未运行的事件标志
+    }
+
+    return 0;
+}
+
+void ota_timeout_task_start(bool stat)
+{
+  ota_timeout_check = stat;
+  ota_timeout_delay_count = 60;
+}
+
+void user_upgrade_start(void)
+{
+    user_upgrade_task_id  = TMOS_ProcessEventRegister(user_upgrade_task_process_event);
+    bStatus_t stat = tmos_start_reload_task(user_upgrade_task_id, (1 << USER_UPGRADE_QUEUE_TIME), MS1_TO_SYSTEM_TIME(1000));
+}

+ 214 - 0
OnlyUpdateApp_IAP/APP/user_ws2812b.c

@@ -0,0 +1,214 @@
+#include "user_ws2812b.h"
+#include "ws2812b_spi.h"
+
+tmosTaskID user_ws2812b_task_id = INVALID_TASK_ID;
+
+static uint16_t user_ws2812b_task_process_event(uint8_t task_id, uint16_t events);
+
+static void vUser_ws2812b_wrRGB(uint8_t r, uint8_t g, uint8_t b);
+
+static user_ws2812b_work_s user_ws2812b_work = {
+    .txStat = false,
+    .count = 0,                                     //灯的数量
+    .rgbValue = NULL,
+};
+
+/*******************************************************************************
+  * @函数名称	vUser_ws2812b_set_wrByte
+  * @函数说明   转换ws2812b颜色数据
+  * @输入参数  	byte:字节
+               color:spi发送数据属猪
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+static void vUser_ws2812b_set_wrByte(uint8_t byte, uint8_t *color)
+{
+    for(uint8_t i = 0; i < 8; i++)
+	{
+        if((byte & 0x80) == 0x80)
+        {
+            *color++ = WS2812B_HIGH;
+        }
+        else
+        {
+            *color++ = WS2812B_LOW;
+        }
+        byte <<= 1;
+	}   
+}
+
+/*******************************************************************************
+  * @函数名称   prvUser_ws2812b_set_breath
+  * @函数说明   设置ws2812b 呼吸灯效果
+  * @输入参数  	idx:左边或者右边
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+static void prvUser_ws2812b_set_breath(uint8_t idx)
+{
+    // 应用二次衰减算法(非线性),亮度更柔和自然
+    uint8_t bri = (user_ws2812b_work.led_param[idx].bright * user_ws2812b_work.led_param[idx].bright) >> 8;
+
+    // 应用亮度到颜色
+    uint8_t out_r = ((uint16_t)user_ws2812b_work.led_param[idx].rValue * (uint16_t)bri) >> 8;
+    uint8_t out_g = ((uint16_t)user_ws2812b_work.led_param[idx].gValue * (uint16_t)bri) >> 8;
+    uint8_t out_b = ((uint16_t)user_ws2812b_work.led_param[idx].bValue * (uint16_t)bri) >> 8;
+
+    vUser_ws2812b_set_wrByte(out_g, &user_ws2812b_work.rgbValue[idx * 24]);
+    vUser_ws2812b_set_wrByte(out_r, &user_ws2812b_work.rgbValue[idx * 24 + 8]);
+    vUser_ws2812b_set_wrByte(out_b, &user_ws2812b_work.rgbValue[idx * 24 + 16]);
+}
+
+/*******************************************************************************
+  * @函数名称   prvUser_ws2812b_txData
+  * @函数说明   发送ws2812b数据
+  * @输入参数  	idx:左边或者右边
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+static void prvUser_ws2812b_txData(void)
+{
+    bWs2812b_spi_WriteByte(user_ws2812b_work.rgbValue, user_ws2812b_work.count * 3 * 8);
+}
+
+/*******************************************************************************
+  * @函数名称   vUser_ws2812b_left_time_task
+  * @函数说明   ws2812b时间循环任务
+  * @输入参数  	无
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+static void vUser_ws2812b_check(void)
+{
+    if(user_ws2812b_work.txStat == false)
+    {
+        bool stat = false;
+        for(uint8_t i = 0; i < user_ws2812b_work.count; i++)
+        {
+            if(user_ws2812b_work.led_param[i].change == true)
+            {
+                user_ws2812b_work.led_param[i].change = false;
+                stat = true;
+                prvUser_ws2812b_set_breath(i);
+            }
+        }
+
+        if(stat == true)
+        {
+            prvUser_ws2812b_txData();
+        }
+    }
+}
+
+/*******************************************************************************
+  * @函数名称   vUser_ws2812b_time_task
+  * @函数说明   ws2812b时间循环任务
+  * @输入参数  	无
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+static void vUser_ws2812b_time_task(void)
+{
+    vUser_ws2812b_check();
+}
+
+/*******************************************************************************
+  * @函数名称   user_charge_task_process_event
+  * @函数说明   task的event处理回调函数,需要在注册task时候,传进去
+  * @输入参数  	task_id:任务ID
+               events:事件
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+static uint16_t user_ws2812b_task_process_event(uint8_t task_id, uint16_t events)
+{
+    //event 处理
+    if(events & (1 << WS2812B_QUEUE_TIME))
+    {
+        vUser_ws2812b_time_task();
+        return (events ^ (1 << WS2812B_QUEUE_TIME)); //异或的方式清除该事件运行标志,并返回未运行的事件标志
+    }
+
+    if(events & (1 << WS2812B_QUEUE_INT))
+    {
+        
+        return (events ^ (1 << WS2812B_QUEUE_INT)); //异或的方式清除该事件运行标志,并返回未运行的事件标志
+    }
+
+    return 0;
+}
+
+/*******************************************************************************
+  * @函数名称   vUser_ws2812b_task_start
+  * @函数说明   任务开始
+  * @输入参数  	无
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+void vUser_ws2812b_task_start(void)
+{
+    bStatus_t stat = tmos_start_reload_task(user_ws2812b_task_id, (1 << WS2812B_QUEUE_TIME), MS1_TO_SYSTEM_TIME(USER_WS2812B_INTERVAL));
+}
+
+/*******************************************************************************
+  * @函数名称   vUser_ws2812b_init
+  * @函数说明   初始化
+  * @输入参数  	无
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+void vUser_ws2812b_init(uint8_t count)
+{
+    user_ws2812b_work.count = count;
+    user_ws2812b_work.led_param = (ws2812b_led_param_s *)malloc(count * sizeof(ws2812b_led_param_s));
+    user_ws2812b_work.rgbValue = (uint8_t *)malloc(count * 3 * 8);
+
+    for(int i = 0; i < count; i++)
+    {
+        user_ws2812b_work.led_param[i].change = false;                      //是否有变化
+        user_ws2812b_work.led_param[i].bright = 0;                          //灯亮度
+        user_ws2812b_work.led_param[i].rValue = 0;
+        user_ws2812b_work.led_param[i].gValue = 0;
+        user_ws2812b_work.led_param[i].bValue = 0;
+    }
+
+    ws2812b_spi_Init();
+    Ws2812b_spi_dma_init(user_ws2812b_work.rgbValue, user_ws2812b_work.count * 3 * 8);
+
+    user_ws2812b_task_id  = TMOS_ProcessEventRegister(user_ws2812b_task_process_event);
+    PRINT("user_ws2812b_task_id=%d\n", user_ws2812b_task_id);
+}
+
+/*******************************************************************************
+  * @函数名称   vUser_ws2812b_set_tx_stat
+  * @函数说明   设置数据发射状态
+  * @输入参数  	stat:状态
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+void vUser_ws2812b_set_tx_stat(bool stat)
+{
+    user_ws2812b_work.txStat = stat;
+}
+
+/*******************************************************************************
+  * @函数名称   vUser_ws2812b_set_stat
+  * @函数说明   设置RGB灯状态
+  * @输入参数  	idx:灯下标
+               r:红色值
+               g:绿色值
+               b:蓝色值
+               bright:亮度
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+void vUser_ws2812b_set_stat(uint8_t idx, uint8_t r, uint8_t g, uint8_t b, uint8_t bright)
+{
+    PRINT("idx=%d,r=%02X,g=%02X,b=%02X,bright=%dms\n",idx, r,g,b,bright);
+    
+    user_ws2812b_work.led_param[idx].rValue = r;
+    user_ws2812b_work.led_param[idx].gValue = g;
+    user_ws2812b_work.led_param[idx].bValue = b;
+    user_ws2812b_work.led_param[idx].bright = bright;
+    user_ws2812b_work.led_param[idx].change = true;
+}

+ 100 - 0
OnlyUpdateApp_IAP/APP/ws2812b_spi.c

@@ -0,0 +1,100 @@
+#include "ws2812b_spi.h"
+#include "user_ws2812b.h"
+
+/*******************************************************************************
+  * @函数名称   user_spi_dma_init
+  * @函数说明   SPI DMA初始化
+  * @输入参数  	txData:数据指针
+               txSize:数据长度
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+void Ws2812b_spi_dma_init(uint8_t *txData, uint32_t txSize)
+{
+    DMA_InitTypeDef DMA_InitStructure;
+    NVIC_InitTypeDef NVIC_InitStructure;
+
+    DMA_DeInit(USER_WS2812B_DMA_CHANNEL);  // Channel 3 for SPI1_TX
+    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USER_WS2812B_SPI->DATAR;
+
+    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)txData;
+    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
+    DMA_InitStructure.DMA_BufferSize = txSize;
+    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
+    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
+    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
+    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
+    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
+    DMA_InitStructure.DMA_Priority = DMA_Priority_High;
+    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
+
+    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
+    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
+    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+
+    DMA_Init(USER_WS2812B_DMA_CHANNEL, &DMA_InitStructure);
+    // 启用 DMA 传输完成中断
+    DMA_ITConfig(USER_WS2812B_DMA_CHANNEL, DMA_IT_TC, ENABLE);
+    NVIC_InitStructure.NVIC_IRQChannel = USER_WS2812B_DMA_IRQn;
+
+    NVIC_Init(&NVIC_InitStructure);
+}
+
+/*******************************************************************************
+  * @函数名称   SPI_FullDuplex_Init
+  * @函数说明   SPI初始化
+  * @输入参数  	无
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+void ws2812b_spi_Init(void)
+{
+    GPIO_InitTypeDef GPIO_InitStructure = {0};
+    SPI_InitTypeDef  SPI_InitStructure = {0};
+
+    USER_WS2812B_GPIO_RCC_ENABLE;
+    USER_WS2812B_SPI_RCC_ENABLE;
+    USER_WS2812B_DMA_RCC_ENABLE;
+
+    GPIO_InitStructure.GPIO_Pin = USER_WS2812B_SPI_MOSI_PIN;
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
+    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+    GPIO_Init(USER_WS2812B_SPI_MOSI_GPIO, &GPIO_InitStructure);
+
+    SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
+    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
+    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
+    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
+    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
+    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
+    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
+    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
+    SPI_InitStructure.SPI_CRCPolynomial = 7;
+    SPI_Init(USER_WS2812B_SPI, &SPI_InitStructure);
+
+    SPI_CalculateCRC(USER_WS2812B_SPI, DISABLE);
+
+    SPI_Cmd(USER_WS2812B_SPI, ENABLE);
+}
+
+/*******************************************************************************
+* Function Name  : bUser_spi_WriteByte
+* Description    : SPI写字节
+* Input          : unsigned char TxData 写入字节
+* Output         : None
+* Return         : 结果
+Flash_ReadWriteByte
+*******************************************************************************/
+bool bWs2812b_spi_WriteByte(volatile uint8_t *TxData, uint32_t TxSize)
+{
+    // 清除传输完成标志
+    vUser_ws2812b_set_tx_stat(true);
+    // 配置 DMA
+    DMA_SetCurrDataCounter(USER_WS2812B_DMA_CHANNEL, TxSize);
+    // 启用 SPI DMA 请求
+    SPI_I2S_DMACmd(USER_WS2812B_SPI, SPI_I2S_DMAReq_Tx, ENABLE);
+    // 启用 DMA 通道
+    DMA_Cmd(USER_WS2812B_DMA_CHANNEL, ENABLE);
+
+    return true;
+}

+ 25 - 1
OnlyUpdateApp_IAP/obj/APP/ch32v20x_it.d

@@ -29,7 +29,15 @@ APP/ch32v20x_it.o: ../APP/ch32v20x_it.c \
  d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/ch32v20x_it.h \
  d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_misc.h \
  d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/CONFIG.h \
- d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/LIB/WCHBLE_ROM.H
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/LIB/WCHBLE_ROM.H \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/ws2812b_spi.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/define.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/HAL.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/config.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/RTC.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/SLEEP.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/user_ws2812b.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/ws2812b_spi.h
 
 d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/ch32v20x_it.h:
 
@@ -92,3 +100,19 @@ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/
 d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/CONFIG.h:
 
 d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/LIB/WCHBLE_ROM.H:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/ws2812b_spi.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/define.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/HAL.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/config.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/RTC.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/SLEEP.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/user_ws2812b.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/ws2812b_spi.h:

+ 6 - 0
OnlyUpdateApp_IAP/obj/APP/led.d

@@ -35,6 +35,8 @@ APP/led.o: ../APP/led.c \
  d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/config.h \
  d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/RTC.h \
  d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/SLEEP.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/user_ws2812b.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/ws2812b_spi.h \
  d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/define.h
 
 d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/led.h:
@@ -109,4 +111,8 @@ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/
 
 d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/SLEEP.h:
 
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/user_ws2812b.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/ws2812b_spi.h:
+
 d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/define.h:

+ 4 - 1
OnlyUpdateApp_IAP/obj/APP/peripheral.d

@@ -38,7 +38,8 @@ APP/peripheral.o: ../APP/peripheral.c \
  d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/HAL.h \
  d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/config.h \
  d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/RTC.h \
- d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/SLEEP.h
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/SLEEP.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/user_upgrade.h
 
 d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/CONFIG.h:
 
@@ -119,3 +120,5 @@ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/
 d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/RTC.h:
 
 d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/SLEEP.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/user_upgrade.h:

+ 10 - 1
OnlyUpdateApp_IAP/obj/APP/peripheral_main.d

@@ -38,7 +38,10 @@ APP/peripheral_main.o: ../APP/peripheral_main.c \
  d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/OTA.h \
  d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/Profile/include/OTAprofile.h \
  d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/led.h \
- d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/define.h
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/define.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/user_ws2812b.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/ws2812b_spi.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/user_upgrade.h
 
 d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/define.h:
 
@@ -119,3 +122,9 @@ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpda
 d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/led.h:
 
 d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/define.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/user_ws2812b.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/ws2812b_spi.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/user_upgrade.h:

+ 16 - 4
OnlyUpdateApp_IAP/obj/APP/subdir.mk

@@ -9,21 +9,30 @@ C_SRCS += \
 ../APP/led.c \
 ../APP/peripheral.c \
 ../APP/peripheral_main.c \
-../APP/system_ch32v20x.c 
+../APP/system_ch32v20x.c \
+../APP/user_upgrade.c \
+../APP/user_ws2812b.c \
+../APP/ws2812b_spi.c 
 
 C_DEPS += \
 ./APP/ch32v20x_it.d \
 ./APP/led.d \
 ./APP/peripheral.d \
 ./APP/peripheral_main.d \
-./APP/system_ch32v20x.d 
+./APP/system_ch32v20x.d \
+./APP/user_upgrade.d \
+./APP/user_ws2812b.d \
+./APP/ws2812b_spi.d 
 
 OBJS += \
 ./APP/ch32v20x_it.o \
 ./APP/led.o \
 ./APP/peripheral.o \
 ./APP/peripheral_main.o \
-./APP/system_ch32v20x.o 
+./APP/system_ch32v20x.o \
+./APP/user_upgrade.o \
+./APP/user_ws2812b.o \
+./APP/ws2812b_spi.o 
 
 
 EXPANDS += \
@@ -31,7 +40,10 @@ EXPANDS += \
 ./APP/led.c.234r.expand \
 ./APP/peripheral.c.234r.expand \
 ./APP/peripheral_main.c.234r.expand \
-./APP/system_ch32v20x.c.234r.expand 
+./APP/system_ch32v20x.c.234r.expand \
+./APP/user_upgrade.c.234r.expand \
+./APP/user_ws2812b.c.234r.expand \
+./APP/ws2812b_spi.c.234r.expand 
 
 
 

+ 118 - 0
OnlyUpdateApp_IAP/obj/APP/user_upgrade.d

@@ -0,0 +1,118 @@
+APP/user_upgrade.o: ../APP/user_upgrade.c \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/user_upgrade.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/define.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/CONFIG.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/LIB/WCHBLE_ROM.H \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Core/core_riscv.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/system_ch32v20x.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/ch32v20x_conf.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_adc.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_bkp.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_can.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_crc.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_dbgmcu.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_dma.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_exti.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_flash.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_gpio.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_i2c.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_iwdg.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_pwr.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_rcc.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_rtc.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_spi.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_tim.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_tim5.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_tim.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_usart.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_wwdg.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/ch32v20x_it.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Debug/debug.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_misc.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/HAL.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/config.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/RTC.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/SLEEP.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/peripheral.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/ota.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/led.h
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/user_upgrade.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/define.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/CONFIG.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/LIB/WCHBLE_ROM.H:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Core/core_riscv.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/system_ch32v20x.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/ch32v20x_conf.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_adc.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_bkp.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_can.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_crc.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_dbgmcu.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_dma.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_exti.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_flash.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_gpio.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_i2c.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_iwdg.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_pwr.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_rcc.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_rtc.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_spi.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_tim.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_tim5.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_tim.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_usart.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_wwdg.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/ch32v20x_it.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Debug/debug.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_misc.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/HAL.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/config.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/RTC.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/SLEEP.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/peripheral.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/ota.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/led.h:

+ 115 - 0
OnlyUpdateApp_IAP/obj/APP/user_ws2812b.d

@@ -0,0 +1,115 @@
+APP/user_ws2812b.o: ../APP/user_ws2812b.c \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/user_ws2812b.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/define.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/CONFIG.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/LIB/WCHBLE_ROM.H \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Core/core_riscv.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/system_ch32v20x.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/ch32v20x_conf.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_adc.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_bkp.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_can.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_crc.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_dbgmcu.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_dma.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_exti.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_flash.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_gpio.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_i2c.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_iwdg.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_pwr.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_rcc.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_rtc.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_spi.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_tim.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_tim5.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_tim.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_usart.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_wwdg.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/ch32v20x_it.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Debug/debug.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_misc.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/HAL.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/config.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/RTC.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/SLEEP.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/ws2812b_spi.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/ws2812b_spi.h
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/user_ws2812b.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/define.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/CONFIG.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/LIB/WCHBLE_ROM.H:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Core/core_riscv.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/system_ch32v20x.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/ch32v20x_conf.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_adc.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_bkp.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_can.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_crc.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_dbgmcu.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_dma.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_exti.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_flash.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_gpio.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_i2c.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_iwdg.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_pwr.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_rcc.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_rtc.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_spi.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_tim.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_tim5.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_tim.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_usart.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_wwdg.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/ch32v20x_it.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Debug/debug.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_misc.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/HAL.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/config.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/RTC.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/SLEEP.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/ws2812b_spi.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/ws2812b_spi.h:

+ 115 - 0
OnlyUpdateApp_IAP/obj/APP/ws2812b_spi.d

@@ -0,0 +1,115 @@
+APP/ws2812b_spi.o: ../APP/ws2812b_spi.c \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/ws2812b_spi.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/define.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/CONFIG.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/LIB/WCHBLE_ROM.H \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Core/core_riscv.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/system_ch32v20x.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/ch32v20x_conf.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_adc.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_bkp.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_can.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_crc.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_dbgmcu.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_dma.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_exti.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_flash.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_gpio.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_i2c.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_iwdg.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_pwr.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_rcc.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_rtc.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_spi.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_tim.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_tim5.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_tim.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_usart.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_wwdg.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/ch32v20x_it.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Debug/debug.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_misc.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/HAL.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/config.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/RTC.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/SLEEP.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/user_ws2812b.h \
+ d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/ws2812b_spi.h
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/ws2812b_spi.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/define.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/CONFIG.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/LIB/WCHBLE_ROM.H:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Core/core_riscv.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/system_ch32v20x.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/ch32v20x_conf.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_adc.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_bkp.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_can.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_crc.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_dbgmcu.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_dma.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_exti.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_flash.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_gpio.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_i2c.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_iwdg.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_pwr.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_rcc.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_rtc.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_spi.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_tim.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_tim5.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_tim.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_usart.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_wwdg.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/ch32v20x_it.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Debug/debug.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/SRC/Peripheral/inc/ch32v20x_misc.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/HAL.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/config.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/RTC.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/Library/HAL/include/SLEEP.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/user_ws2812b.h:
+
+d:/git_workspace/bozz/loto/bozz_loto_software/for_can/ISCS_KEY_BASE_CAN/OnlyUpdateApp_IAP/APP/include/ws2812b_spi.h:

TEMPAT SAMPAH
OnlyUpdateApp_IAP/obj/OnlyUpdateApp_IAP.bin


File diff ditekan karena terlalu besar
+ 560 - 253
OnlyUpdateApp_IAP/obj/OnlyUpdateApp_IAP.lst


File diff ditekan karena terlalu besar
+ 513 - 469
OnlyUpdateApp_IAP/obj/OnlyUpdateApp_IAP.map


+ 2 - 0
mainboard/.cproject

@@ -139,6 +139,8 @@
                   <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/User/app_drv_fifo}&quot;"/>
                   <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/components/charge}&quot;"/>
                   <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/components/nfc}&quot;"/>
+                  <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/components}&quot;"/>
+                  <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/components/ws2812b}&quot;"/>
                 </option>
                 <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.include.systempaths.2011720354" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.include.systempaths" useByScannerDiscovery="true" valueType="includePath"/>
                 <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.include.files.542153928" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.include.files" useByScannerDiscovery="true" valueType="includeFiles"/>

+ 3 - 3
mainboard/.mrs/launch.json

@@ -5,7 +5,7 @@
 			"type": "mrs-debugger",
 			"request": "launch",
 			"name": "mainboard",
-			"cwd": "d:\\git_workspace\\bozz\\loto\\bozz_loto_software\\for_can\\ICSC_KEY_BASE_CAN\\mainboard",
+			"cwd": "d:\\git_workspace\\bozz\\loto\\bozz_loto_software\\for_can\\ISCS_KEY_BASE_CAN\\mainboard",
 			"openOCDCfg": {
 				"useLocalOpenOCD": true,
 				"executable": "d:/MounRiver/MounRiver_Studio2/resources/app/resources/win32/components/WCH/OpenOCD/OpenOCD/bin/openocd.exe",
@@ -39,8 +39,8 @@
 					"additionalCommands": []
 				},
 				"loadedFiles": {
-					"executableFile": "d:\\git_workspace\\bozz\\loto\\bozz_loto_software\\for_can\\ICSC_KEY_BASE_CAN\\mainboard\\obj\\mainboard.elf",
-					"symbolFile": "d:\\git_workspace\\bozz\\loto\\bozz_loto_software\\for_can\\ICSC_KEY_BASE_CAN\\mainboard\\obj\\mainboard.elf",
+					"executableFile": "d:\\git_workspace\\bozz\\loto\\bozz_loto_software\\for_can\\ISCS_KEY_BASE_CAN\\mainboard\\obj\\mainboard.elf",
+					"symbolFile": "d:\\git_workspace\\bozz\\loto\\bozz_loto_software\\for_can\\ISCS_KEY_BASE_CAN\\mainboard\\obj\\mainboard.elf",
 					"executableFileOffset": 0,
 					"symbolFileOffset": 0
 				},

+ 9 - 1
mainboard/User/app_main.c

@@ -26,6 +26,9 @@
 #include "user_nfc.h"
 #include "user_can.h"
 #include "user_server.h"
+#include "user_ws2812b.h"
+#include "user_fan.h"
+#include "elect_sw.h"
 
 /*********************************************************************
  * GLOBAL TYPEDEFS
@@ -71,10 +74,13 @@ static void task_init(void)
   vBle_action_init();
   vUser_can_init();
   vDipsw_init();
+  vElectsw_init();
+  vUser_ws2812b_init(USER_WS2812B_COUNT_DEFAULT);
   led_task_init();
   elect_task_init();
   user_charge_init();
   adc_init();
+  fan_init();
   led_task_init();
   // ble_action_init();
   vUser_nfc_init();
@@ -84,8 +90,10 @@ static void task_start(void)
 {
   dipsw_task_start();
   adc_task_start();
+  vUser_ws2812b_task_start();
   led_task_start();
   elect_task_start();
+  electsw_task_start();
   vUser_nfc_task_start();
   vUser_server_task_start();
 }
@@ -116,7 +124,7 @@ int main(void)
     Peripheral_Init();
     task_init();
     task_start();
-    set_led_indication(DEV_LED, RED_LED, LED_WORK_BREATHE, 5000, 2500, 0, 500, 500);
+    set_led_indication(DEV_LED, WS2812B_NORMAL_RGB, LED_WORK_INVERT, 5000, 2500, 0);
     Main_Circulation();
 }
 

+ 18 - 0
mainboard/User/ch32v20x_it.c

@@ -18,6 +18,8 @@
 #include "user_nfc.h"
 #include "user_adc.h"
 #include "user_can.h"
+#include "ws2812b_spi.h"
+#include "user_ws2812b.h"
 
 /*********************************************************************
  * LOCAL FUNCTIONS
@@ -27,6 +29,7 @@ void HardFault_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
 void BB_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
 void DMA1_Channel1_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
 void USB_LP_CAN1_RX0_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
+void USER_WS2812B_DMA_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
 
 /*********************************************************************
  * @fn      NMI_Handler
@@ -98,3 +101,18 @@ void USB_LP_CAN1_RX0_IRQHandler(void)
         CAN_ClearITPendingBit(CAN1, CAN_IT_FMP0);
     }
 }
+
+void USER_WS2812B_DMA_IRQHandler(void)
+{
+    if(DMA_GetITStatus(USER_WS2812B_DMA_IT_TC))
+    {
+        // 清除中断标志
+        DMA_ClearITPendingBit(USER_WS2812B_DMA_IT_TC);
+
+        DMA_Cmd(USER_WS2812B_DMA_CHANNEL, DISABLE);
+        SPI_I2S_DMACmd(USER_WS2812B_SPI, SPI_I2S_DMAReq_Tx, DISABLE);
+        // 在这里处理传输完成逻辑
+        // 例如: 设置标志、准备下一次传输等
+        vUser_ws2812b_set_tx_stat(false);
+    }
+}

+ 4 - 0
mainboard/User/include/define.h

@@ -39,5 +39,9 @@
 
 #define CAN_OFFLINE_TIMEOUT_DEFAULT         5000
 
+#define USER_WS2812B_COUNT_DEFAULT          3
+
+#define USER_FAN_STOP_DFAULT_VALUE          400             //40.0¶È
+
 
 #endif /* USER_DEFINE_H_ */

+ 29 - 5
mainboard/components/action/user_server.h

@@ -38,6 +38,9 @@ extern "C" {
 #define REG_ELECT_STAT_IDX									    0x6011
 #define REG_ELECT_STAT_SUBIDX                                   0x00
 
+#define REG_CHARGE_TEMP_IDX									    0x6017
+#define REG_CHARGE_TEMP_SUBIDX                                  0x00
+
 #define REG_LEFT_KEY_ID_IDX							            0x6020
 #define REG_LEFT_KEY_ID_SUBIDX                                  0x00
 
@@ -47,10 +50,10 @@ extern "C" {
 typedef struct{
 	uint16_t left_key_stat:1;
 	uint16_t left_charge_stat:1;
-	uint16_t :6;
+	uint16_t left_Reserved:6;
 	uint16_t right_key_stat:1;
 	uint16_t right_charge_stat:1;
-	uint16_t :6;
+	uint16_t right_Reserved:6;
 }__attribute__((packed))key_stat_s;
 
 typedef struct{
@@ -71,16 +74,37 @@ typedef struct{
 typedef struct{
 	uint16_t left_key_elect_stat:1;
 	uint16_t left_charge_stat:1;
-	uint16_t :2;
+	uint16_t left_Reserved:2;
 	uint16_t right_key_elect_stat:1;
 	uint16_t right_charge_stat:1;
-	uint16_t :2;
-	uint16_t :8;
+	uint16_t right_Reserved:2;
+	uint16_t left_elect_fault:1;
+	uint16_t left_elect_stat_Reserved:3;
+	uint16_t right_elect_fault:1;
+	uint16_t right_elect_stat_Reserved:3;
 }__attribute__((packed))key_elect_stat_s;
 
+typedef struct{
+	uint8_t left_elect_act:1;
+	uint8_t :3;
+	uint8_t right_elect_act:1;
+	uint8_t :3;
+	uint8_t left_elect_finish:1;
+	uint8_t :3;
+	uint8_t right_elect_finish:1;
+	uint8_t :3;
+}__attribute__((packed))key_elect_act_s;
+
+typedef struct{
+	int16_t left_temperature;
+	int16_t right_temperature;
+}__attribute__((packed))key_charge_temp_s;
+
 typedef struct{
 	key_stat_s key_stat;
+	key_elect_act_s elect_act;
 	key_elect_stat_s elect_stat;
+	key_charge_temp_s charge_temp;
 	uint8_t left_key_id[4];
 	uint8_t right_key_id[4];
 }__attribute__((packed))key_data_s;

+ 253 - 15
mainboard/components/action/user_sever.c

@@ -4,22 +4,47 @@
 #include "user_elect.h"
 #include "user_led.h"
 #include "dip_sw.h"
+#include "elect_sw.h"
+#include "user_fan.h"
+#include "user_adc.h"
 
 tmosTaskID user_server_task_id = INVALID_TASK_ID;
 static uint32_t offline_timeout = CAN_OFFLINE_TIMEOUT_DEFAULT / USER_SERVER_INTERVAL;
 static bool offline_stat = false;
 static uint8_t can_idx = 0xFF;
+static uint8_t left_fan_speed = 0;
+static uint8_t right_fan_speed = 0;
 static key_data_s key_data = {
+    .elect_act = {
+        .left_elect_act = 0,
+        .left_elect_finish = 0,
+        .right_elect_act = 0,
+        .right_elect_finish = 0,
+    },
 	.elect_stat = {
 		.left_key_elect_stat = 0,
+        .left_charge_stat = 0,
+        .left_Reserved = 0,
 		.right_key_elect_stat = 0,
+        .right_charge_stat = 0,
+        .right_Reserved = 0,
+        .left_elect_fault = 0,
+        .left_elect_stat_Reserved = 0,
+        .right_elect_fault = 0,
+        .right_elect_stat_Reserved = 0,
 	},
 	.key_stat = {
 		.left_key_stat = 0,
 		.left_charge_stat = 0,
+        .left_Reserved = 0,
 		.right_key_stat = 0,
 		.right_charge_stat = 0,
+        .right_Reserved = 0,
 	},
+    .charge_temp = {
+        .left_temperature = -100,
+        .right_temperature = -100,
+    },
 	.left_key_id = 0,
 	.right_key_id = 0,
 };
@@ -51,7 +76,7 @@ static void prvUser_server_dev_type_protocol(void)
         }
         else{
             can_open_data_s s_data;
-            s_data.ins = can_open_data.ins;
+            s_data.ins = R_INS_WR_FAIL;
             s_data.idx = REG_DEV_TYPE_IDX;
             s_data.subidx = REG_DEV_TYPE_SUBIDX;
             memset(s_data.data, 0, 4);
@@ -85,7 +110,7 @@ static void prvUser_server_version_protocol(void)
         }
         else{
             can_open_data_s s_data;
-            s_data.ins = can_open_data.ins;
+            s_data.ins = R_INS_WR_FAIL;
             s_data.idx = REG_VERSION_IDX;
             s_data.subidx = REG_VERSION_SUBIDX;
             memset(s_data.data, 0, 4);
@@ -117,7 +142,7 @@ static void prvUser_server_key_stat_protocol(void)
         }
         else{
             can_open_data_s s_data;
-            s_data.ins = can_open_data.ins;
+            s_data.ins = R_INS_WR_FAIL;
             s_data.idx = REG_KEY_STAT_IDX;
             s_data.subidx = REG_KEY_STAT_SUBIDX;
             memset(s_data.data, 0, 4);
@@ -177,12 +202,12 @@ static void prvUser_server_elect_stat_protocol(void)
             
             if(elect.right_charge_enable == 1)
             {
-                set_user_charge_Queue((elect.left_charge_control == 1)?CHARGE_QUEUE_RIGHT_OPEN:CHARGE_QUEUE_RIGHT_CLOSE);
+                set_user_charge_Queue((elect.right_charge_control == 1)?CHARGE_QUEUE_RIGHT_OPEN:CHARGE_QUEUE_RIGHT_CLOSE);
             }
         }
         else{
             can_open_data_s s_data;
-            s_data.ins = can_open_data.ins;
+            s_data.ins = R_INS_WR_FAIL;
             s_data.idx = REG_ELECT_STAT_IDX;
             s_data.subidx = REG_ELECT_STAT_SUBIDX;
             memset(s_data.data, 0, 4);
@@ -191,6 +216,37 @@ static void prvUser_server_elect_stat_protocol(void)
     }
 }
 
+/*******************************************************************************
+  * @函数名称   prvUser_server_charge_temp_protocol
+  * @函数说明   充电温度值索引解析
+  * @输入参数  	无
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+static void prvUser_server_charge_temp_protocol(void)
+{
+    if(can_open_data.subidx == REG_CHARGE_TEMP_SUBIDX)
+    {
+        if(can_open_data.ins == S_INS_RD)
+        {
+            can_open_data_s s_data;
+            s_data.ins = R_INS_RD_DWORD;
+            s_data.idx = REG_CHARGE_TEMP_IDX;
+            s_data.subidx = REG_CHARGE_TEMP_SUBIDX;
+            memcpy(s_data.data,(uint8_t *)&(key_data.charge_temp), 4);
+            vUser_can_send_data((uint8_t *)&s_data, 8);
+        }
+        else{
+            can_open_data_s s_data;
+            s_data.ins = R_INS_WR_FAIL;
+            s_data.idx = REG_CHARGE_TEMP_IDX;
+            s_data.subidx = REG_CHARGE_TEMP_SUBIDX;
+            memset(s_data.data, 0, 4);
+            vUser_can_send_data((uint8_t *)&s_data, 8);
+        }
+    }
+}
+
 /*******************************************************************************
   * @函数名称   prvUser_server_left_key_id_protocol
   * @函数说明   左边钥匙NFC号索引解析
@@ -208,12 +264,15 @@ static void prvUser_server_left_key_id_protocol(void)
             s_data.ins = R_INS_RD_DWORD;
             s_data.idx = REG_LEFT_KEY_ID_IDX;
             s_data.subidx = REG_LEFT_KEY_ID_SUBIDX;
-            memcpy(s_data.data,(uint8_t *)&(key_data.left_key_id), 4);
+            s_data.data[0] = key_data.left_key_id[3];
+            s_data.data[1] = key_data.left_key_id[2];
+            s_data.data[2] = key_data.left_key_id[1];
+            s_data.data[3] = key_data.left_key_id[0];
             vUser_can_send_data((uint8_t *)&s_data, 8);
         }
         else{
             can_open_data_s s_data;
-            s_data.ins = can_open_data.ins;
+            s_data.ins = R_INS_WR_FAIL;
             s_data.idx = REG_LEFT_KEY_ID_IDX;
             s_data.subidx = REG_LEFT_KEY_ID_SUBIDX;
             memset(s_data.data, 0, 4);
@@ -240,12 +299,15 @@ static void prvUser_server_right_key_id_protocol(void)
             s_data.idx = REG_RIGHT_KEY_ID_IDX;
             s_data.subidx = REG_RIGHT_KEY_ID_SUBIDX;
             memset(s_data.data, 0, 4);
-            memcpy(s_data.data,(uint8_t *)&(key_data.right_key_id), 4);
+            s_data.data[0] = key_data.right_key_id[3];
+            s_data.data[1] = key_data.right_key_id[2];
+            s_data.data[2] = key_data.right_key_id[1];
+            s_data.data[3] = key_data.right_key_id[0];
             vUser_can_send_data((uint8_t *)&s_data, 8);
         }
         else{
             can_open_data_s s_data;
-            s_data.ins = can_open_data.ins;
+            s_data.ins = R_INS_WR_FAIL;
             s_data.idx = REG_RIGHT_KEY_ID_IDX;
             s_data.subidx = REG_RIGHT_KEY_ID_SUBIDX;
             memset(s_data.data, 0, 4);
@@ -270,6 +332,7 @@ static void prvUser_server_can_protocol(void)
         case REG_VERSION_IDX:prvUser_server_version_protocol();stat = true;break;
         case REG_KEY_STAT_IDX:prvUser_server_key_stat_protocol();stat = true;break;
         case REG_ELECT_STAT_IDX:prvUser_server_elect_stat_protocol();stat = true;break;
+        case REG_CHARGE_TEMP_IDX:prvUser_server_charge_temp_protocol();stat = true;break;
         case REG_LEFT_KEY_ID_IDX:prvUser_server_left_key_id_protocol();stat = true;break;
         case REG_RIGHT_KEY_ID_IDX:prvUser_server_right_key_id_protocol();stat = true;break;
         default:break;
@@ -385,7 +448,11 @@ static void vUser_server_set_led_stat(uint8_t idx)
 {
     if(idx == LEFT_IDX)
     {
-        if(key_data.elect_stat.left_key_elect_stat == 1 && key_data.key_stat.left_key_stat == 1)
+        if(key_data.elect_stat.left_elect_fault == 1)
+        {
+            vUser_led_set_view_stat(LEFT_IDX, LED_VIEW_ELECT_FAUIL);
+        }
+        else if(key_data.elect_stat.left_key_elect_stat == 1 && key_data.key_stat.left_key_stat == 1)
         {
             vUser_led_set_view_stat(LEFT_IDX, LED_VIEW_KEY_ELECT);
         }
@@ -404,7 +471,11 @@ static void vUser_server_set_led_stat(uint8_t idx)
     }
     else if(idx ==RIGHT_IDX)
     {
-        if(key_data.elect_stat.right_key_elect_stat == 1 && key_data.key_stat.right_key_stat == 1)
+        if(key_data.elect_stat.right_elect_fault == 1)
+        {
+            vUser_led_set_view_stat(RIGHT_IDX, LED_VIEW_ELECT_FAUIL);
+        }
+        else if(key_data.elect_stat.right_key_elect_stat == 1 && key_data.key_stat.right_key_stat == 1)
         {
             vUser_led_set_view_stat(RIGHT_IDX, LED_VIEW_KEY_ELECT);
         }
@@ -449,6 +520,26 @@ static void prvUser_can_recv_data_callback(uint8_t *data, uint8_t size)
     bStatus_t stat = tmos_start_task(user_server_task_id, (1 << SERVER_QUEUE_CAN), MS1_TO_SYSTEM_TIME(1));
 }
 
+/*******************************************************************************
+  * @函数名称   prvUser_server_check_elect_stat
+  * @函数说明   检测电磁锁状态是否正常
+  * @输入参数  	idx:左或者右边
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+static void prvUser_server_check_elect_stat(uint8_t idx)
+{
+    if(idx == LEFT_IDX)
+    {
+        key_data.elect_stat.left_elect_fault = key_data.elect_act.left_elect_finish;
+    }
+    else if(idx == RIGHT_IDX)
+    {
+        key_data.elect_stat.right_elect_fault = key_data.elect_act.right_elect_finish;
+    }
+    vUser_server_set_led_stat(idx);
+}
+
 /*******************************************************************************
   * @函数名称   vUser_nfc_upload_card_callback
   * @函数说明   钥匙nfc标签读取上报回调
@@ -482,17 +573,37 @@ static void prvUser_nfc_upload_card_callback(uint8_t idx, bool stat, unsigned ch
   * @输出参数   无
   * @返回参数   无
 *******************************************************************************/
-static void vUser_elect_upload_stat_callback(uint8_t idx, bool stat)
+static void vUser_elect_upload_stat_callback(uint8_t idx, bool stat, bool finish)
 {
 	if(idx == LEFT_IDX)
 	{
-		key_data.elect_stat.left_key_elect_stat = (stat == true)?1:0;
+		key_data.elect_act.left_elect_act = (stat == true)?1:0;
 	}
 	else if(idx == RIGHT_IDX)
 	{
-		key_data.elect_stat.right_key_elect_stat = (stat == true)?1:0;
+		key_data.elect_act.right_elect_act = (stat == true)?1:0;
 	}
-    vUser_server_set_led_stat(idx);
+    
+    if(finish == false)
+    {
+        if(idx == LEFT_IDX)
+        {
+            if(key_data.elect_act.left_elect_act != key_data.elect_stat.left_key_elect_stat)
+            {
+                key_data.elect_act.left_elect_finish = 1;
+            }
+        }
+        else if(idx == RIGHT_IDX)
+        {
+            if(key_data.elect_act.right_elect_act != key_data.elect_stat.right_key_elect_stat)
+            {
+                key_data.elect_act.right_elect_finish = 1;
+            }
+        }
+    }
+    else{
+        prvUser_server_check_elect_stat(idx);
+    }
 }
 
 /*******************************************************************************
@@ -509,11 +620,19 @@ static void vUser_charge_upload_stat_callback(uint8_t idx, bool stat)
 	{
 		key_data.key_stat.left_charge_stat = (stat == true)?1:0;
         key_data.elect_stat.left_charge_stat = (stat == true)?1:0;
+        if(stat == true)
+        {
+            set_fan_indication(LEFT_IDX, 50);
+        }
 	}
 	else if(idx == RIGHT_IDX)
 	{
 		key_data.key_stat.right_charge_stat = (stat == true)?1:0;
         key_data.elect_stat.right_charge_stat = (stat == true)?1:0;
+        if(stat == true)
+        {
+            set_fan_indication(RIGHT_IDX, 50);
+        }
 	}
     vUser_nfc_set_charge_stat(idx, stat);
 }
@@ -542,6 +661,123 @@ static void prvDipsw_upload_callback(uint8_t addr)
     }
 }
 
+/*******************************************************************************
+  * @函数名称   prvDipsw_upload_callback
+  * @函数说明   地址读取回调
+  * @输入参数  	无
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+static void prvElectsw_upload_callback(uint8_t idx, bool stat)
+{
+    if(idx == LEFT_IDX)
+	{
+		key_data.elect_stat.left_key_elect_stat = (stat == true)?1:0;
+        key_data.elect_act.left_elect_finish = 0;
+	}
+	else if(idx == RIGHT_IDX)
+	{
+		key_data.elect_stat.right_key_elect_stat = (stat == true)?1:0;
+        key_data.elect_act.right_elect_finish = 0;
+	}
+    prvUser_server_check_elect_stat(idx);
+}
+
+/*******************************************************************************
+  * @函数名称   prvUser_server_charge_fan_change
+  * @函数说明   f风扇转速调整
+  * @输入参数  	无
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+static void prvUser_server_charge_fan_change(void)
+{
+    if(key_data.key_stat.left_charge_stat == false)
+    {
+        if(key_data.charge_temp.left_temperature <= USER_FAN_STOP_DFAULT_VALUE)
+        {
+            if(left_fan_speed > 0)
+            {
+                left_fan_speed = 0;
+                set_fan_indication(LEFT_IDX, 0);
+                PRINT("left fan set 0\n");
+            }
+        }
+    }
+    else{
+        if(key_data.charge_temp.left_temperature > USER_FAN_STOP_DFAULT_VALUE)
+        {
+            uint8_t value = (key_data.charge_temp.left_temperature - USER_FAN_STOP_DFAULT_VALUE) / 10;
+            if(left_fan_speed != value)
+            {
+                left_fan_speed = value;
+                set_fan_indication(LEFT_IDX, (value > 50)?100:(50 + value));
+                PRINT("left fan set %d%%", value);
+            }
+        }
+        else{
+            if(left_fan_speed -= 50)
+            {
+                left_fan_speed = 50;
+                set_fan_indication(LEFT_IDX, 50);
+                PRINT("left fan set 0\n");
+            }
+        }
+    }
+
+    if(key_data.key_stat.right_charge_stat == false)
+    {
+        if(key_data.charge_temp.right_temperature <= USER_FAN_STOP_DFAULT_VALUE)
+        {
+            if(right_fan_speed > 0)
+            {
+                right_fan_speed = 0;
+                set_fan_indication(RIGHT_IDX, 0);
+                PRINT("right fan set 0\n");
+            }
+        }
+    }
+    else{
+        if(key_data.charge_temp.right_temperature > USER_FAN_STOP_DFAULT_VALUE)
+        {
+            uint8_t value = (key_data.charge_temp.right_temperature - USER_FAN_STOP_DFAULT_VALUE) / 10;
+            if(right_fan_speed != value)
+            {
+                right_fan_speed = value;
+                set_fan_indication(RIGHT_IDX, (value > 50)?100:(50 + value));
+                PRINT("right fan set %d%%", value);
+            }
+        }
+        else{
+            if(right_fan_speed != 50)
+            {
+                right_fan_speed = 50;
+                set_fan_indication(RIGHT_IDX, 50);
+                PRINT("right fan set 50\n");
+            }
+        }
+    }
+}
+
+/*******************************************************************************
+  * @函数名称   prvAdc_upload_callback
+  * @函数说明   温度上报回调
+  * @输入参数  	data:温度数据
+               tmp_stat:温度计状态
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+static void prvAdc_upload_callback(adc_data_s data, bool tmp_stat)
+{
+    if(tmp_stat == true)
+    {
+        key_data.charge_temp.left_temperature = data.left_ntc / 10;
+        key_data.charge_temp.right_temperature = data.right_ntc / 10;
+
+        prvUser_server_charge_fan_change();
+    }
+}
+
 /*******************************************************************************
   * @函数名称   vUser_server_init
   * @函数说明   初始化
@@ -556,6 +792,8 @@ void vUser_server_init(void)
     vUser_elect_set_upload_stat_func(vUser_elect_upload_stat_callback);
     vUser_charge_set_upload_stat_func(vUser_charge_upload_stat_callback);
     vDipsw_set_upload_func(prvDipsw_upload_callback);
+    vElectsw_set_upload_func(prvElectsw_upload_callback);
+    set_adc_upload_func(prvAdc_upload_callback);
 
     user_server_task_id  = TMOS_ProcessEventRegister(user_server_task_process_event);
     PRINT("user_server_task_id=%d\n", user_server_task_id);

+ 2 - 2
mainboard/components/charge/user_adc.c

@@ -215,8 +215,8 @@ static void temperature_task(void)
 *******************************************************************************/
 static void upload_adc_value(bool tmp_stat)
 {
-    // PRINT("temperature left=%d.%d, right=%d.%d\n", adc_data.left_ntc / 100 , adc_data.left_ntc % 100, 
-    //                             adc_data.right_ntc / 100, adc_data.right_ntc % 100);
+    PRINT("temperature left=%d.%d, right=%d.%d\n", adc_data.left_ntc / 100 , adc_data.left_ntc % 100, 
+                                adc_data.right_ntc / 100, adc_data.right_ntc % 100);
     if(adc_upload != NULL)
     {
 	    adc_upload(adc_data, tmp_stat);

+ 2 - 2
mainboard/components/charge/user_adc.h

@@ -41,8 +41,8 @@ extern "C" {
 #define RIGHT_NTC_CHANNEL						          ADC_Channel_1
 
 typedef struct{
-  uint16_t left_ntc;
-  uint16_t right_ntc;
+  int16_t left_ntc;
+  int16_t right_ntc;
 #if TEMPE_OWNER == 1
   float tmp_chip;
 #endif

+ 1 - 0
mainboard/components/charge/user_charge.c

@@ -2,6 +2,7 @@
 #include "user_config.h"
 #include "user_adc.h"
 #include "my_math.h"
+#include "user_fan.h"
 
 tmosTaskID user_charge_task_id = INVALID_TASK_ID;
 static vUser_charge_upload_stat_func xUpload_stat = NULL;

+ 2 - 2
mainboard/components/charge/user_charge.h

@@ -19,8 +19,8 @@ extern "C" {
 #define CHARGE_LEFT_ON						                GPIO_WriteBit(CHARGE_LEFT_GPIO, CHARGE_LEFT_PIN, Bit_SET)
 #define CHARGE_LEFT_OFF						                GPIO_WriteBit(CHARGE_LEFT_GPIO, CHARGE_LEFT_PIN, Bit_RESET)
 
-#define CHARGE_RIGHT_GPIO                                   GPIOA
-#define CHARGE_RIGHT_PIN                                    GPIO_Pin_4
+#define CHARGE_RIGHT_GPIO                                   GPIOB
+#define CHARGE_RIGHT_PIN                                    GPIO_Pin_0
 #define CHARGE_RIGHT_ON						                GPIO_WriteBit(CHARGE_RIGHT_GPIO, CHARGE_RIGHT_PIN, Bit_SET)
 #define CHARGE_RIGHT_OFF						            GPIO_WriteBit(CHARGE_RIGHT_GPIO, CHARGE_RIGHT_PIN, Bit_RESET)
 

+ 155 - 0
mainboard/components/charge/user_fan.c

@@ -0,0 +1,155 @@
+#include "user_fan.h"
+#include "define.h"
+#include "stdarg.h"
+
+static void left_fan_duty(uint16_t duty);
+static void right_fan_duty(uint16_t duty);
+
+static fan_work_s fan_work[2] = {
+  {
+      .idx = LEFT_IDX,
+      .speed = 0,
+      .set_duty = left_fan_duty,
+  },
+  {
+      .idx = RIGHT_IDX,
+      .speed = 0,
+      .set_duty = right_fan_duty,
+  },
+};
+
+/*******************************************************************************
+  * @函数名称   fan_pwm_init
+  * @函数说明   初始化
+  * @输入参数  	无
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+static void fan_pwm_init(void)
+{
+    GPIO_InitTypeDef GPIO_InitStructure={0};
+    TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
+    TIM_OCInitTypeDef TIM_OutputCompareInitStructure;
+    TIM_BDTRInitTypeDef BDTR_Structure;
+
+    FAN_GPIO_RCC_ENABLE;
+    GPIO_InitStructure.GPIO_Pin = LEFT_FAN_PIN;
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
+    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+    GPIO_Init(LEFT_FAN_GPIO, &GPIO_InitStructure );
+
+    GPIO_InitStructure.GPIO_Pin = RIGHT_FAN_PIN;
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
+    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+    GPIO_Init(RIGHT_FAN_GPIO, &GPIO_InitStructure );
+
+    FAN_PWM_RCC_ENABLE;
+#ifdef FAN_REMAPCONFIG_ENABLE
+    FAN_REMAPCONFIG_ENABLE;
+#endif
+    
+    TIM_BaseInitStructure.TIM_Period = TIM_FAN_PERIOD;
+    TIM_BaseInitStructure.TIM_Prescaler = TIM_FAN_PRESCALER - 1;
+    TIM_BaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up;
+    TIM_BaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
+    TIM_BaseInitStructure.TIM_RepetitionCounter = 0;
+    TIM_TimeBaseInit(TIM_IND_FAN,&TIM_BaseInitStructure);
+
+    TIM_OutputCompareInitStructure.TIM_OCMode =TIM_OCMode_PWM1;				//占空比设置的高电平
+    TIM_OutputCompareInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
+    TIM_OutputCompareInitStructure.TIM_OCNPolarity =TIM_OCNPolarity_Low;
+    TIM_OutputCompareInitStructure.TIM_OutputState =TIM_OutputState_Enable;
+    TIM_OutputCompareInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
+    TIM_OutputCompareInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
+    TIM_OutputCompareInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
+    TIM_OutputCompareInitStructure.TIM_Pulse = 0;
+
+    BDTR_Structure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
+    BDTR_Structure.TIM_Break = TIM_Break_Disable;
+    BDTR_Structure.TIM_BreakPolarity = TIM_BreakPolarity_High;
+    BDTR_Structure.TIM_DeadTime = 0x80;
+    BDTR_Structure.TIM_LOCKLevel = TIM_LOCKLevel_1;
+    BDTR_Structure.TIM_OSSIState = TIM_OSSIState_Enable;
+    BDTR_Structure.TIM_OSSRState = TIM_OSSRState_Enable;
+    TIM_BDTRConfig(TIM_IND_FAN,&BDTR_Structure);
+
+    LEFT_FAN_INIT(&TIM_OutputCompareInitStructure);
+    RIGHT_FAN_INIT(&TIM_OutputCompareInitStructure);
+
+    LEFT_FAN_RUN;
+    RIGHT_FAN_RUN;
+
+    LEFT_FAN_COMPARE(0);
+    RIGHT_FAN_COMPARE(0);
+
+    TIM_Cmd(TIM_IND_FAN,ENABLE);
+}
+
+/*******************************************************************************
+  * @函数名称   left_fan_duty
+  * @函数说明   设置左风扇PWM百分比
+  * @输入参数  	duty:百分比
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+static void left_fan_duty(uint16_t duty)
+{
+    uint16_t value = TIM_FAN_PERIOD * duty / 100;
+    LEFT_FAN_COMPARE(value);
+}
+
+/*******************************************************************************
+  * @函数名称   right_fan_duty
+  * @函数说明   设置右边风扇PWM百分比
+  * @输入参数  	duty:百分比
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+static void right_fan_duty(uint16_t duty)
+{
+    uint16_t value = TIM_FAN_PERIOD * duty / 100;
+    RIGHT_FAN_COMPARE(value);
+}
+
+/*******************************************************************************
+  * @函数名称   set_fan_indication
+  * @函数说明   风扇转速设置
+  * @输入参数  	idx:左边或右边
+               speed:转速百分比
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+bool set_fan_indication(uint8_t idx, uint8_t speed)
+{
+    bool stat = false;
+
+    if(idx != LEFT_IDX && idx != RIGHT_IDX)
+    {
+	    goto exit;
+    }
+
+    if(speed > 100)
+    {
+	    goto exit;
+    }
+
+    fan_work[idx].speed = speed;
+    fan_work[idx].set_duty(speed);
+
+    stat = true;
+exit:
+    return stat;
+}
+
+/*******************************************************************************
+  * @函数名称   fan_init
+  * @函数说明   初始化
+  * @输入参数  	无
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+void fan_init(void)
+{
+    fan_pwm_init();
+}
+

+ 63 - 0
mainboard/components/charge/user_fan.h

@@ -0,0 +1,63 @@
+#ifndef USER_FAN_H__
+#define USER_FAN_H__
+
+#include <stdint.h>
+#include <stdbool.h>
+#include "define.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define FAN_INTERVAL						                    10
+
+#define FAN_ON_DUTY                                             95
+#define FAN_OFF_DUTY                                            0
+
+#define TIM_FAN_PERIOD					                        100
+#define TIM_FAN_PRESCALER					                    360
+
+#define TIM_IND_FAN						                        TIM2
+
+#define FAN_PWM_RCC_ENABLE					                    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
+#define FAN_GPIO_RCC_ENABLE					                    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
+
+#define FAN_REMAPCONFIG_ENABLE                                  GPIO_PinRemapConfig(GPIO_FullRemap_TIM2, ENABLE);
+
+#define LEFT_FAN_GPIO                                     	    GPIOA
+#define LEFT_FAN_PIN                                       	    GPIO_Pin_15
+
+#define RIGHT_FAN_GPIO                                      	GPIOB
+#define RIGHT_FAN_PIN                                       	GPIO_Pin_3
+
+#define LEFT_FAN_INIT(InitStructure)					        TIM_OC1Init(TIM_IND_FAN, InitStructure);
+#define RIGHT_FAN_INIT(InitStructure)				            TIM_OC2Init(TIM_IND_FAN, InitStructure);
+
+#define LEFT_FAN_RUN						                    TIM_OC1PreloadConfig(TIM_IND_FAN, TIM_OCPreload_Enable);
+#define LEFT_FAN_STOP						                    TIM_OC1PreloadConfig(TIM_IND_FAN, TIM_OCPreload_Disable);
+#define LEFT_FAN_COMPARE(value)					                TIM_SetCompare1(TIM_IND_FAN, value)
+
+#define RIGHT_FAN_RUN						                    TIM_OC2PreloadConfig(TIM_IND_FAN, TIM_OCPreload_Enable);
+#define RIGHT_FAN_STOP						                    TIM_OC2PreloadConfig(TIM_IND_FAN, TIM_OCPreload_Disable);
+#define RIGHT_FAN_COMPARE(value)					            TIM_SetCompare2(TIM_IND_FAN, value)
+
+typedef void (*fan_set_duty_func)(uint16_t duty);
+
+typedef struct{
+    const uint8_t idx;                      
+    uint8_t speed;
+    fan_set_duty_func set_duty;
+}fan_work_s;
+
+void fan_init(void);
+bool set_fan_indication(uint8_t idx, uint8_t speed);
+
+extern tmosTaskID FAN_task_id;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // FAN_H__
+
+/** @} */

+ 232 - 0
mainboard/components/electlock/elect_sw.c

@@ -0,0 +1,232 @@
+#include "elect_sw.h"
+#include "user_elect.h"
+
+static bool get_electsw_left_level(void);
+static bool get_electsw_right_level(void);
+
+static electsw_work_s electsw_work[2] =
+{
+  {
+    .idx = LEFT_IDX,
+    .electsw_stat = ELECTSW_STAT_NULL,
+    .electsw_finish = false,
+    .electsw_on_count = ELECT_SW_CHECK_COUNT,
+    .electsw_off_count = ELECT_SW_CHECK_COUNT,
+    .get_level = get_electsw_left_level,
+  },
+  {
+    .idx = RIGHT_IDX,
+    .electsw_stat = ELECTSW_STAT_NULL,
+    .electsw_finish = false,
+    .electsw_on_count = ELECT_SW_CHECK_COUNT,
+    .electsw_off_count = ELECT_SW_CHECK_COUNT,
+    .get_level = get_electsw_right_level,
+  },
+};
+
+electsw_upload_func electsw_upload = NULL;
+
+static void electsw_pro(void);
+
+/*******************************************************************************
+  * @函数名称   electsw_gpio_init
+  * @函数说明   GPIO初始化
+  * @输入参数  	无
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+static void electsw_gpio_init(void)
+{
+  GPIO_InitTypeDef GPIO_InitStructure={0};
+
+//    PWR_BackupAccessCmd(ENABLE);	//允许修改RTC 和后备寄存器
+//    RCC_LSICmd(DISABLE);		//关闭外部低速外部时钟信号功能 后,PC14 PC15 才可以当普通IO用。
+//    BKP_TamperPinCmd(DISABLE);		//关闭入侵检测功能,也就是 PC13,也可以当普通IO 使用
+
+  ELECT_SW_GPIO_RCC_ENABLE;
+
+  GPIO_InitStructure.GPIO_Pin = ELECT_LEFT_SW_PIN;
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
+  GPIO_Init(ELECT_LEFT_SW_GPIO, &GPIO_InitStructure);
+
+  GPIO_InitStructure.GPIO_Pin = ELECT_RIGHT_SW_PIN;
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
+  GPIO_Init(ELECT_RIGHT_SW_GPIO, &GPIO_InitStructure);
+}
+
+/*******************************************************************************
+  * @函数名称   vElectsw_init
+  * @函数说明   初始化
+  * @输入参数  	无
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+void vElectsw_init(void)
+{
+  electsw_gpio_init();
+}
+
+/*******************************************************************************
+  * @函数名称   get_electsw_left_level
+  * @函数说明   读取端口状态
+  * @输入参数  	无
+  * @输出参数   无
+  * @返回参数   状态
+*******************************************************************************/
+static bool get_electsw_left_level(void)
+{
+  if(0 == ELECT_LEFT_SW_IN)
+  {
+    return true;
+  }
+  else{
+    return false;
+  }
+}
+
+/*******************************************************************************
+  * @函数名称   get_electsw_right_level
+  * @函数说明   读取端口状态
+  * @输入参数  	无
+  * @输出参数   无
+  * @返回参数   状态
+*******************************************************************************/
+static bool get_electsw_right_level(void)
+{
+  if(0 == ELECT_RIGHT_SW_IN)
+  {
+    return true;
+  }
+  else{
+    return false;
+  }
+}
+
+/*******************************************************************************
+  * @函数名称   electsw_check
+  * @函数说明   电磁锁状态检测
+  * @输入参数  	electsw     
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+static void electsw_check(electsw_work_s *electsw)
+{
+  if(true == electsw->get_level())
+  {
+    electsw->electsw_off_count = ELECT_SW_CHECK_COUNT;
+    if(electsw->electsw_on_count == 0)
+    {
+      if(electsw->electsw_finish == false)
+      {
+        electsw->electsw_finish = true;
+        if(electsw->electsw_stat != ELECTSW_STAT_OPEN)
+        {
+          electsw->electsw_stat = ELECTSW_STAT_OPEN;
+          if(electsw_upload != NULL)
+          {
+            PRINT("No.%d elect stat is open\n", electsw->idx);
+            electsw_upload(electsw->idx, false);
+          }
+        }
+      }
+    }
+    else{
+      electsw->electsw_finish = false;
+      electsw->electsw_on_count--;
+    }
+  }
+  else{
+    electsw->electsw_on_count = ELECT_SW_CHECK_COUNT;
+    if(electsw->electsw_off_count == 0)
+    {
+      if(electsw->electsw_finish == false)
+      {
+        electsw->electsw_finish = true;
+        if(electsw->electsw_stat != ELECTSW_STAT_CLOSE)
+        {
+          electsw->electsw_stat = ELECTSW_STAT_CLOSE;
+          if(electsw_upload != NULL)
+          {
+            PRINT("No.%d elect stat is close\n", electsw->idx);
+            electsw_upload(electsw->idx, true);
+          }
+        }
+      }
+    }
+    else{
+      electsw->electsw_finish = false;
+      electsw->electsw_off_count--;
+    }
+  }
+}
+
+/*******************************************************************************
+  * @函数名称   electsw_pro
+  * @函数说明   执行的任务
+  * @输入参数  	无    
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+static void electsw_pro(void)
+{
+  for(uint8_t i = 0; i < 2; i++)
+  {
+    electsw_check(&electsw_work[i]);
+  }
+}
+
+/*******************************************************************************
+  * @函数名称   electsw_task_process_event
+  * @函数说明   task的event处理回调函数,需要在注册task时候,传进去
+  * @输入参数  	task_id:任务ID
+               events:事件 
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+uint16_t electsw_task_process_event(uint8_t task_id, uint16_t events)
+{
+    //event 处理
+    if(events & (1 << ELECTSW_QUEUE_TIME))
+    {
+      electsw_pro();
+      return (events ^ (1 << ELECTSW_QUEUE_TIME));
+    }
+
+    return 0;
+}
+
+/*******************************************************************************
+  * @函数名称   electsw_task_start
+  * @函数说明   任务开始
+  * @输入参数  	无
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+void electsw_task_start(void)
+{
+    bStatus_t stat = tmos_start_reload_task(elect_task_id, (1 << ELECTSW_QUEUE_TIME), MS1_TO_SYSTEM_TIME(ELECT_SW_INTERVAL));
+}
+
+/*******************************************************************************
+  * @函数名称   vDipsw_set_upload_func
+  * @函数说明   设置上报地址回调函数
+  * @输入参数  	func:回调函数指针
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+void vElectsw_set_upload_func(electsw_upload_func func)
+{
+    electsw_upload = func;
+}
+
+/*******************************************************************************
+  * @函数名称   bElectsw_get_stat
+  * @函数说明   获取电磁锁当前状态
+  * @输入参数  	idx:电磁锁下标
+  * @输出参数   无
+  * @返回参数   电磁锁状态
+*******************************************************************************/
+electsw_stat_e bElectsw_get_stat(uint8_t idx)
+{
+  return electsw_work[idx].electsw_stat;
+}

+ 52 - 0
mainboard/components/electlock/elect_sw.h

@@ -0,0 +1,52 @@
+#ifndef _ELECT_SW_H__
+#define _ELECT_SW_H__
+
+#include <stdint.h>
+#include <stdbool.h>
+#include "define.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ELECT_SW_INTERVAL						          	            5
+
+#define ELECT_SW_CHECK_COUNT					          	          10
+#define ELECT_SW_CHECK_FAST_COUNT					      	          2
+
+#define ELECT_SW_GPIO_RCC_ENABLE					    	            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
+
+#define ELECT_LEFT_SW_GPIO                                  GPIOA
+#define ELECT_LEFT_SW_PIN                                   GPIO_Pin_3
+#define ELECT_LEFT_SW_IN							     		              GPIO_ReadInputDataBit(ELECT_LEFT_SW_GPIO, ELECT_LEFT_SW_PIN)
+
+#define ELECT_RIGHT_SW_GPIO                                 GPIOA
+#define ELECT_RIGHT_SW_PIN                                  GPIO_Pin_2
+#define ELECT_RIGHT_SW_IN							        	            GPIO_ReadInputDataBit(ELECT_RIGHT_SW_GPIO, ELECT_RIGHT_SW_PIN)
+
+typedef bool (*get_level_func)(void);
+
+typedef enum{
+  ELECTSW_STAT_NULL = 0,
+  ELECTSW_STAT_OPEN = 1,
+  ELECTSW_STAT_CLOSE = 2,
+}electsw_stat_e;
+
+typedef struct{
+  uint8_t idx;
+  electsw_stat_e electsw_stat;
+  bool electsw_finish;
+  uint8_t electsw_on_count;
+  uint8_t electsw_off_count;
+  get_level_func get_level;
+}electsw_work_s;
+
+typedef void (*electsw_upload_func)(uint8_t idx, bool stat);
+
+void vElectsw_init(void);
+void electsw_task_start(void);
+void vElectsw_set_upload_func(electsw_upload_func func);
+uint16_t electsw_task_process_event(uint8_t task_id, uint16_t events);
+electsw_stat_e bElectsw_get_stat(uint8_t idx);
+
+#endif	//_SWITCH_H__

+ 20 - 1
mainboard/components/electlock/user_elect.c

@@ -1,4 +1,5 @@
 #include "user_elect.h"
+#include "elect_sw.h"
 #include "define.h"
 #include "stdarg.h"
 
@@ -121,9 +122,25 @@ static void elect_right_work_stat(bool stat, elect_work_type_e type)
 *******************************************************************************/
 void set_elect_work_stat(uint8_t idx, bool stat)
 {
+  electsw_stat_e electswStat = bElectsw_get_stat(idx);
+
+  if(electswStat == ELECTSW_STAT_OPEN && stat == false)
+  {
+      return;
+  }
+  else if(electswStat == ELECTSW_STAT_CLOSE && stat == true)
+  {
+      return;
+  }
+  
 	elect_work[idx].stat = stat;
 	elect_work[idx].type = ELECT_WORK_START;
 	elect_work[idx].workTime = 0;
+
+  if(xUpload_stat != NULL)
+  {
+      xUpload_stat(idx, elect_work[idx].stat, false);
+  }
 }
 
 /*******************************************************************************
@@ -149,7 +166,7 @@ static void elect_work_pro(elect_work_s *elect)
 			elect->type = ELECT_WORK_NULL;
       if(xUpload_stat != NULL)
       {
-          xUpload_stat(elect->idx, elect->stat);
+          xUpload_stat(elect->idx, elect->stat, true);
       }
 		}
 	}
@@ -197,6 +214,8 @@ static uint16_t elect_task_process_event(uint8_t task_id, uint16_t events)
         return (events ^ (1 << ELECT_QUEUE_START)); //异或的方式清除该事件运行标志,并返回未运行的事件标志
     }
 
+    electsw_task_process_event(task_id, events);
+
     return 0;
 }
 

+ 3 - 2
mainboard/components/electlock/user_elect.h

@@ -26,7 +26,7 @@ extern "C" {
 #define ELECT_LEFT_CLOSE_OFF						            GPIO_WriteBit(ELECT_LEFT_CLOSE_GPIO, ELECT_LEFT_CLOSE_PIN, Bit_RESET)
 
 #define ELECT_RIGHT_OPEN_GPIO                                   GPIOA
-#define ELECT_RIGHT_OPEN_PIN                                    GPIO_Pin_3
+#define ELECT_RIGHT_OPEN_PIN                                    GPIO_Pin_4
 #define ELECT_RIGHT_OPEN_ON						                GPIO_WriteBit(ELECT_RIGHT_OPEN_GPIO, ELECT_RIGHT_OPEN_PIN, Bit_SET)
 #define ELECT_RIGHT_OPEN_OFF						            GPIO_WriteBit(ELECT_RIGHT_OPEN_GPIO, ELECT_RIGHT_OPEN_PIN, Bit_RESET)
 
@@ -55,9 +55,10 @@ typedef enum
 {
     ELECT_QUEUE_TIME	= 0,
     ELECT_QUEUE_START	= 1,
+	ELECTSW_QUEUE_TIME	= 2,
 }ELECT_QUEUE_TYPE;
 
-typedef void (*vUser_elect_upload_stat_func)(uint8_t idx, bool stat);
+typedef void (*vUser_elect_upload_stat_func)(uint8_t idx, bool stat, bool finish);
 
 void elect_task_init(void);
 void elect_task_start(void);

+ 80 - 229
mainboard/components/led/user_led.c

@@ -1,4 +1,5 @@
 #include "user_led.h"
+#include "user_ws2812b.h"
 #include "define.h"
 #include "stdarg.h"
 
@@ -7,15 +8,16 @@ tmosTaskID led_task_id = INVALID_TASK_ID;
 static uint32_t alarm_stat = 0;
 
 static uint16_t led_task_process_event(uint8_t task_id, uint16_t events);
-static void led_dev_duty(uint16_t duty);
-static void left_dev_duty(uint16_t duty);
-static void right_dev_duty(uint16_t duty);
+static void prvSet_led_duty(LED_TYPE type);
 
 static led_work_s led_work[LED_TYPE_MAX] = {
   {
-      .idx = DEV_LED,
-      .set_duty = led_dev_duty,
-      .color = RED_LED,
+      .idx = RIGHT_LED,
+      .color = {
+        .red = 0,
+        .green = 0xFF,
+        .blue = 0,
+      },
       .workStat = LED_WORK_OFF,
       .viewStat = LED_VIEW_NULL,
       .single_flicker_period = 0,
@@ -30,9 +32,12 @@ static led_work_s led_work[LED_TYPE_MAX] = {
       .off_durationTime = 0,				//PWM变化结束后持续时间,单位:ms
   },
   {
-      .idx = LEFT_LED,
-      .set_duty = left_dev_duty,
-      .color = RED_LED,
+      .idx = DEV_LED,
+      .color = {
+        .red = 0,
+        .green = 0xFF,
+        .blue = 0,
+      },
       .workStat = LED_WORK_OFF,
       .viewStat = LED_VIEW_NULL,
       .single_flicker_period = 0,
@@ -47,9 +52,12 @@ static led_work_s led_work[LED_TYPE_MAX] = {
       .off_durationTime = 0,				//PWM变化结束后持续时间,单位:ms
   },
   {
-      .idx = RIGHT_LED,
-      .set_duty = right_dev_duty,
-      .color = RED_LED,
+      .idx = LEFT_LED,
+      .color = {
+        .red = 0,
+        .green = 0xFF,
+        .blue = 0,
+      },
       .workStat = LED_WORK_OFF,
       .viewStat = LED_VIEW_NULL,
       .single_flicker_period = 0,
@@ -66,193 +74,16 @@ static led_work_s led_work[LED_TYPE_MAX] = {
 };
 
 /*******************************************************************************
-  * @函数名称   led_pwm_init
-  * @函数说明   初始化
-  * @输入参数  	无
-  * @输出参数   无
-  * @返回参数   无
-*******************************************************************************/
-static void led_pwm_init(void)
-{
-    GPIO_InitTypeDef GPIO_InitStructure={0};
-    TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
-    TIM_OCInitTypeDef TIM_OutputCompareInitStructure;
-    TIM_BDTRInitTypeDef BDTR_Structure;
-    TIM5_TimeBaseInitTypeDef TIM5_BaseInitStructure;
-    TIM5_OCInitTypeDef TIM5_OutputCompareInitStructure;
-    TIM5_BDTRInitTypeDef BDTR5_Structure;
-
-    LED_GPIO_RCC_ENABLE;
-    GPIO_InitStructure.GPIO_Pin = DEV_LED_PIN;
-    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
-    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
-    GPIO_Init(DEV_LED_GPIO, &GPIO_InitStructure );
-
-    GPIO_InitStructure.GPIO_Pin = LEFT_LED_R_PIN;
-    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
-    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
-    GPIO_Init(LEFT_LED_R_GPIO, &GPIO_InitStructure );
-
-    GPIO_InitStructure.GPIO_Pin = LEFT_LED_G_PIN;
-    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
-    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
-    GPIO_Init(LEFT_LED_G_GPIO, &GPIO_InitStructure );
-
-    GPIO_InitStructure.GPIO_Pin = RIGHT_LED_R_PIN;
-    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
-    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
-    GPIO_Init(RIGHT_LED_R_GPIO, &GPIO_InitStructure );
-
-    GPIO_InitStructure.GPIO_Pin = RIGHT_LED_G_PIN;
-    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
-    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
-    GPIO_Init(RIGHT_LED_G_GPIO, &GPIO_InitStructure );
-
-    LED_PWM_RCC_ENABLE;
-#ifdef LED_REMAPCONFIG_ENABLE
-    LED_REMAPCONFIG_ENABLE;
-#endif
-    
-    TIM_BaseInitStructure.TIM_Period = TIM_LED_PERIOD;
-    TIM_BaseInitStructure.TIM_Prescaler = TIM_LED_PRESCALER - 1;
-    TIM_BaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up;
-    TIM_BaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
-    TIM_BaseInitStructure.TIM_RepetitionCounter = 0;
-    TIM_TimeBaseInit(TIM_IND_LED,&TIM_BaseInitStructure);
-
-    TIM_OutputCompareInitStructure.TIM_OCMode =TIM_OCMode_PWM1;				//占空比设置的高电平
-    TIM_OutputCompareInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
-    TIM_OutputCompareInitStructure.TIM_OCNPolarity =TIM_OCNPolarity_Low;
-    TIM_OutputCompareInitStructure.TIM_OutputState =TIM_OutputState_Enable;
-    TIM_OutputCompareInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
-    TIM_OutputCompareInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
-    TIM_OutputCompareInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
-    TIM_OutputCompareInitStructure.TIM_Pulse = 0;
-
-    BDTR_Structure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
-    BDTR_Structure.TIM_Break = TIM_Break_Disable;
-    BDTR_Structure.TIM_BreakPolarity = TIM_BreakPolarity_High;
-    BDTR_Structure.TIM_DeadTime = 0x80;
-    BDTR_Structure.TIM_LOCKLevel = TIM_LOCKLevel_1;
-    BDTR_Structure.TIM_OSSIState = TIM_OSSIState_Enable;
-    BDTR_Structure.TIM_OSSRState = TIM_OSSRState_Enable;
-    TIM_BDTRConfig(TIM_IND_LED,&BDTR_Structure);
-
-    LEFT_LED_R_INIT(&TIM_OutputCompareInitStructure);
-    LEFT_LED_G_INIT(&TIM_OutputCompareInitStructure);
-    RIGHT_LED_R_INIT(&TIM_OutputCompareInitStructure);
-    RIGHT_LED_G_INIT(&TIM_OutputCompareInitStructure);
-
-
-    TIM5_BaseInitStructure.TIM_Period = TIM_LED_PERIOD;
-    TIM5_BaseInitStructure.TIM_Prescaler = TIM_LED_PRESCALER - 1;
-    TIM5_BaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up;
-    TIM5_BaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
-    TIM5_BaseInitStructure.TIM_RepetitionCounter = 0;
-    TIM5_TimeBaseInit(&TIM5_BaseInitStructure);
-
-    TIM5_OutputCompareInitStructure.TIM_OCMode =TIM_OCMode_PWM2;				//占空比设置的高电平
-    TIM5_OutputCompareInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
-    TIM5_OutputCompareInitStructure.TIM_OCNPolarity =TIM_OCNPolarity_Low;
-    TIM5_OutputCompareInitStructure.TIM_OutputState =TIM_OutputState_Enable;
-    TIM5_OutputCompareInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
-    TIM5_OutputCompareInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
-    TIM5_OutputCompareInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
-    TIM5_OutputCompareInitStructure.TIM_Pulse = 0;
-
-    BDTR5_Structure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
-    BDTR5_Structure.TIM_Break = TIM_Break_Disable;
-    BDTR5_Structure.TIM_BreakPolarity = TIM_BreakPolarity_High;
-    BDTR5_Structure.TIM_DeadTime = 0x80;
-    BDTR5_Structure.TIM_LOCKLevel = TIM_LOCKLevel_1;
-    BDTR5_Structure.TIM_OSSIState = TIM_OSSIState_Enable;
-    BDTR5_Structure.TIM_OSSRState = TIM_OSSRState_Enable;
-    TIM5_BDTRConfig(&BDTR5_Structure);
-
-    DEV_LED_INIT(&TIM5_OutputCompareInitStructure);
-    
-
-    DEV_LED_RUN;
-    LEFT_LED_R_RUN;
-    LEFT_LED_G_RUN;
-    RIGHT_LED_R_RUN;
-    RIGHT_LED_G_RUN;
-
-    DEV_LED_COMPARE(0);
-    LEFT_LED_R_COMPARE(0);
-    LEFT_LED_G_COMPARE(0);
-    LEFT_LED_R_COMPARE(0);
-    LEFT_LED_G_COMPARE(0);
-
-    TIM_Cmd(TIM_DEV_LED,ENABLE);
-    TIM_Cmd(TIM_IND_LED,ENABLE);
-}
-
-/*******************************************************************************
-  * @函数名称   led_dev_duty
-  * @函数说明   设置设备指示灯PWM百分比
-  * @输入参数  	duty:百分比
+  * @函数名称   prvSet_led_duty
+  * @函数说明   设置指示灯亮度
+  * @输入参数  	type:灯下标
   * @输出参数   无
   * @返回参数   无
 *******************************************************************************/
-static void led_dev_duty(uint16_t duty)
+static void prvSet_led_duty(LED_TYPE type)
 {
-    uint16_t value = TIM_LED_PERIOD * duty / 100;
-    DEV_LED_COMPARE(value);
-}
-
-/*******************************************************************************
-  * @函数名称   left_dev_duty
-  * @函数说明   设置左边指示灯PWM百分比
-  * @输入参数  	duty:百分比
-  * @输出参数   无
-  * @返回参数   无
-*******************************************************************************/
-static void left_dev_duty(uint16_t duty)
-{
-    uint16_t value = TIM_LED_PERIOD * duty / 100;
-    if(led_work[LEFT_LED].color == RED_LED)
-    {
-        LEFT_LED_G_COMPARE(LED_OFF_DUTY);
-        LEFT_LED_R_COMPARE(duty);
-    }
-    else if(led_work[LEFT_LED].color == GREEN_LED)
-    {
-        LEFT_LED_R_COMPARE(LED_OFF_DUTY);
-        LEFT_LED_G_COMPARE(duty);
-    }
-    else if(led_work[LEFT_LED].color == YELLOW_LED)
-    {
-        LEFT_LED_R_COMPARE(duty);
-        LEFT_LED_G_COMPARE(duty);
-    }
-}
-
-/*******************************************************************************
-  * @函数名称   right_dev_duty
-  * @函数说明   设置右边指示灯PWM百分比
-  * @输入参数  	duty:百分比
-  * @输出参数   无
-  * @返回参数   无
-*******************************************************************************/
-static void right_dev_duty(uint16_t duty)
-{
-    uint16_t value = TIM_LED_PERIOD * duty / 100;
-    if(led_work[RIGHT_LED].color == RED_LED)
-    {
-        RIGHT_LED_G_COMPARE(LED_OFF_DUTY);
-        RIGHT_LED_R_COMPARE(duty);
-    }
-    else if(led_work[RIGHT_LED].color == GREEN_LED)
-    {
-        RIGHT_LED_R_COMPARE(LED_OFF_DUTY);
-        RIGHT_LED_G_COMPARE(duty);
-    }
-    else if(led_work[RIGHT_LED].color == YELLOW_LED)
-    {
-        RIGHT_LED_R_COMPARE(duty);
-        RIGHT_LED_G_COMPARE(duty);
-    }
+    vUser_ws2812b_set_stat(type, led_work[type].color.red, led_work[type].color.green, 
+                            led_work[type].color.blue, led_work[type].duty_value);
 }
 
 /*******************************************************************************
@@ -270,13 +101,15 @@ static void led_invert(led_work_s *led_work)
         {
             led_work->single_flicker_period = led_work->flicker_period;
             led_work->stat = LED_STAT_ON;
-            led_work->set_duty(LED_ON_DUTY);
+            led_work->duty_value = 100;
+            prvSet_led_duty(led_work->idx);
         }
         else if(led_work->single_flicker_period == (led_work->flicker_period - led_work->flicker_onperiod))
         {
             led_work->single_flicker_period--;
             led_work->stat = LED_STAT_OFF;
-            led_work->set_duty(LED_OFF_DUTY);
+            led_work->duty_value = 0;
+            prvSet_led_duty(led_work->idx);
             led_work->flicker_count--;
         }
         else{
@@ -285,7 +118,8 @@ static void led_invert(led_work_s *led_work)
     }
     else{
         led_work->workStat = LED_WORK_OFF;
-        led_work->set_duty(LED_OFF_DUTY);
+        led_work->duty_value = 0;
+        prvSet_led_duty(led_work->idx);
     }
 }
 
@@ -306,15 +140,15 @@ static void led_heart(led_work_s *led_work)
         led_work->single_flicker_period = led_work->flicker_period;
         led_work->duty_value = 0;
         led_work->single_off_durationTime = led_work->off_durationTime;
-        led_work->set_duty(led_work->duty_value);
+        prvSet_led_duty(led_work->idx);
         led_work->flicker_count--;
       }
       else if(led_work->single_flicker_period == off_period)
       {
         led_work->single_flicker_period--;
-        led_work->duty_value = led_work->duty_on;
+        led_work->duty_value = 100;
         led_work->single_on_durationTime = led_work->on_durationTime;
-        led_work->set_duty(led_work->duty_value);
+        prvSet_led_duty(led_work->idx);
       }
       else{
         if(led_work->single_flicker_period > off_period)
@@ -323,7 +157,7 @@ static void led_heart(led_work_s *led_work)
             {
                 led_work->single_flicker_period--;
                 led_work->duty_value = (led_work->flicker_period - led_work->single_flicker_period) * 100 / led_work->flicker_onperiod;
-                led_work->set_duty(led_work->duty_value);
+                prvSet_led_duty(led_work->idx);
             }
             else{
                 led_work->single_off_durationTime--;
@@ -334,7 +168,7 @@ static void led_heart(led_work_s *led_work)
             {
                 led_work->single_flicker_period--;
                 led_work->duty_value = led_work->single_flicker_period * 100 / off_period;
-                led_work->set_duty(led_work->duty_value);
+                prvSet_led_duty(led_work->idx);
             }
             else{
                 led_work->single_on_durationTime--;
@@ -424,7 +258,7 @@ static uint16_t led_task_process_event(uint8_t task_id, uint16_t events)
   * @输出参数   无
   * @返回参数   无
 *******************************************************************************/
-bool set_led_indication(LED_TYPE type, LED_COLOR color, LED_WORK_STAT work_stat, ...)
+bool set_led_indication(LED_TYPE type, uint32_t color, LED_WORK_STAT work_stat, ...)
 {
     bool stat = false;
 
@@ -433,22 +267,19 @@ bool set_led_indication(LED_TYPE type, LED_COLOR color, LED_WORK_STAT work_stat,
 	    goto exit;
     }
 
-    if(color > YELLOW_LED)
-    {
-	    goto exit;
-    }
+    led_work[type].color.red = (color >> 16) & 0xFF;
+    led_work[type].color.green = (color >> 8) & 0xFF;
+    led_work[type].color.blue = color & 0xFF;
 
     if(work_stat == LED_WORK_OFF || work_stat == LED_WORK_ON)
     {
-        led_work[type].color = color;
         led_work[type].workStat = work_stat;
-        led_work[type].set_duty((work_stat == LED_WORK_ON) ? LED_ON_DUTY : LED_OFF_DUTY);
-
+        led_work[type].duty_value = (work_stat == LED_WORK_ON) ? 100 : 0;
+        prvSet_led_duty(led_work[type].idx);
         stat = true;
     }
     else if(work_stat == LED_WORK_INVERT || work_stat == LED_WORK_BREATHE)
     {
-        led_work[type].color = color;
         led_work[type].workStat = work_stat;
         led_work[type].duty_value = 0;
         led_work[type].stat = LED_STAT_OFF;
@@ -474,6 +305,21 @@ bool set_led_indication(LED_TYPE type, LED_COLOR color, LED_WORK_STAT work_stat,
 
         va_end(ap);
 
+        for(int i = 0; i < LED_TYPE_MAX; i++)
+        {
+            if(led_work[i].workStat == LED_WORK_INVERT 
+            || led_work[i].workStat == LED_WORK_BREATHE)
+            {
+                led_work[i].single_flicker_period = led_work[i].flicker_period;
+                led_work[i].duty_value = 0;
+                if(led_work[i].workStat == LED_WORK_BREATHE)
+                {
+                    led_work[i].single_on_durationTime = led_work[i].on_durationTime;
+                    led_work[i].single_off_durationTime = led_work[i].off_durationTime;
+                }
+            }
+        }
+
         stat = true;
     }
 exit:
@@ -491,7 +337,6 @@ void led_task_init(void)
 {
     led_task_id  = TMOS_ProcessEventRegister(led_task_process_event);
     PRINT("led_task_id=%d\n", led_task_id);
-    led_pwm_init();
 }
 
 /*******************************************************************************
@@ -521,12 +366,13 @@ void vUser_led_set_view_stat(uint8_t idx, led_view_stat_e stat)
     {
         switch(stat)
         {
-            case LED_VIEW_ALARM:set_led_indication((idx == LEFT_IDX)?LEFT_LED:RIGHT_LED, YELLOW_LED, LED_WORK_INVERT, 1000, 500, 0);break;                       //报警
-            case LED_VIEW_WARN:set_led_indication((idx == LEFT_IDX)?LEFT_LED:RIGHT_LED, YELLOW_LED, LED_WORK_BREATHE, 3000, 1500, 0, 500, 500);break;            //警告
-            case LED_VIEW_KEY_ELECT:set_led_indication((idx == LEFT_IDX)?LEFT_LED:RIGHT_LED, RED_LED, LED_WORK_ON);break;                                        //有钥匙并上锁
-            case LED_VIEW_NOKEY_ELECT:set_led_indication((idx == LEFT_IDX)?LEFT_LED:RIGHT_LED, RED_LED, LED_WORK_BREATHE, 500, 250, 0, 100, 100);break;         //无钥匙并上锁
-            case LED_VIEW_KEY_NOELECT:set_led_indication((idx == LEFT_IDX)?LEFT_LED:RIGHT_LED, GREEN_LED, LED_WORK_BREATHE, 500, 250, 0, 100, 100);break;       //有钥匙没上锁
-            case LED_VIEW_NOKEY_NOELECT:set_led_indication((idx == LEFT_IDX)?LEFT_LED:RIGHT_LED, GREEN_LED, LED_WORK_ON);break;                                  //无钥匙没上锁
+            case LED_VIEW_ALARM:set_led_indication((idx == LEFT_IDX)?LEFT_LED:RIGHT_LED, LED_VIEW_ALARM_COLOR, LED_WORK_INVERT, 1000, 500, 0);break;                       //报警
+            case LED_VIEW_WARN:set_led_indication((idx == LEFT_IDX)?LEFT_LED:RIGHT_LED, LED_VIEW_WARN_COLOR, LED_WORK_BREATHE, 3000, 1500, 0, 500, 500);break;            //警告
+            case LED_VIEW_ELECT_FAUIL:set_led_indication((idx == LEFT_IDX)?LEFT_LED:RIGHT_LED, LED_VIEW_ELECT_FAULT_COLOR, LED_WORK_INVERT, 200, 100, 0);break;            //电磁锁故障
+            case LED_VIEW_KEY_ELECT:set_led_indication((idx == LEFT_IDX)?LEFT_LED:RIGHT_LED, LED_VIEW_NOKEY_ELECT_COLOR, LED_WORK_ON);break;                                        //有钥匙并上锁
+            case LED_VIEW_NOKEY_ELECT:set_led_indication((idx == LEFT_IDX)?LEFT_LED:RIGHT_LED, LED_VIEW_NOKEY_ELECT_COLOR, LED_WORK_BREATHE, 500, 250, 0, 100, 100);break;         //无钥匙并上锁
+            case LED_VIEW_KEY_NOELECT:set_led_indication((idx == LEFT_IDX)?LEFT_LED:RIGHT_LED, LED_VIEW_KEY_NOELECT_COLOR, LED_WORK_BREATHE, 500, 250, 0, 100, 100);break;       //有钥匙没上锁
+            case LED_VIEW_NOKEY_NOELECT:set_led_indication((idx == LEFT_IDX)?LEFT_LED:RIGHT_LED, LED_VIEW_NOKEY_NOELECT_COLOR, LED_WORK_ON);break;                                  //无钥匙没上锁
             default:break;
         }
     }
@@ -552,31 +398,36 @@ void vUser_led_set_alarm_view(led_all_alarm_stat_e alarmStat, bool stat)
 
     if((alarm_stat & (1 << LED_ALL_ALARM_RST)) != 0)
     {
-        for(int i = 1; i < LED_TYPE_MAX; i++)
+        for(int i = 0; i < LED_TYPE_MAX; i++)
         {
-            set_led_indication(i, YELLOW_LED, LED_WORK_INVERT, 1000, 500, 0, 0, 0);
+            set_led_indication(i, WS2812B_RST_RGB, LED_WORK_INVERT, 1000, 500, 0, 0, 0);
         }
     }
     else if((alarm_stat & (1 << LED_ALL_ALARM_BLE)) != 0)
     {
-        for(int i = 1; i < LED_TYPE_MAX; i++)
+        for(int i = 0; i < LED_TYPE_MAX; i++)
         {
-            set_led_indication(i, GREEN_LED, LED_WORK_INVERT, 200, 100, 0, 0, 0);
+            set_led_indication(i, WS2812B_BLE_RGB, LED_WORK_INVERT, 200, 100, 0, 0, 0);
         }
     }
     else if((alarm_stat & (1 << LED_ALL_ALARM_CAN_IDX_ERROR)) != 0)
     {
-        set_led_indication(LEFT_LED, YELLOW_LED, LED_WORK_BREATHE, 3000, 1500, 0, 500, 500);
-        set_led_indication(RIGHT_LED, YELLOW_LED, LED_WORK_BREATHE, 3000, 1500, 0, 500, 500);
+        for(int i = 0; i < LED_TYPE_MAX; i++)
+        {
+            set_led_indication(i, WS2812B_CANID_ERROR_RGB, LED_WORK_BREATHE, 3000, 1500, 0, 500, 500);
+        }
     }
     else if((alarm_stat & (1 <<  LED_ALL_ALARM_OFFLINE)) != 0)
     {
-        set_led_indication(LEFT_LED, YELLOW_LED, LED_WORK_BREATHE, 300, 150, 0, 100, 100);
-        set_led_indication(RIGHT_LED, YELLOW_LED, LED_WORK_BREATHE, 300, 150, 0, 100, 100);
+        for(int i = 0; i < LED_TYPE_MAX; i++)
+        {
+            set_led_indication(i, WS2812B_OFFLINE_RGB, LED_WORK_BREATHE, 300, 150, 0, 100, 100);
+        }
     }
     else if(alarm_stat == 0)
     {
-        vUser_led_set_view_stat(LEFT_LED, led_work[LEFT_LED].viewStat);
-        vUser_led_set_view_stat(RIGHT_LED, led_work[RIGHT_LED].viewStat);
+        set_led_indication(DEV_LED, WS2812B_NORMAL_RGB, LED_WORK_INVERT, 5000, 2500, 0);
+        vUser_led_set_view_stat(LEFT_IDX, led_work[LEFT_IDX].viewStat);
+        vUser_led_set_view_stat(RIGHT_IDX, led_work[RIGHT_IDX].viewStat);
     }
 }

+ 29 - 66
mainboard/components/led/user_led.h

@@ -11,59 +11,24 @@ extern "C" {
 
 #define LED_INTERVAL						                    10
 
-#define LED_ON_DUTY                                             95
-#define LED_OFF_DUTY                                            0
-
-#define TIM_LED_PERIOD					                        100
-#define TIM_LED_PRESCALER					                    360
-#define TIM_DEV_LED						                        TIM5
-#define TIM_IND_LED						                        TIM2
-
-#define LED_PWM_RCC_ENABLE					                    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM5, ENABLE);
-#define LED_GPIO_RCC_ENABLE					                    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
-
-#define LED_REMAPCONFIG_ENABLE                                  GPIO_PinRemapConfig(GPIO_FullRemap_TIM2, ENABLE);
-
-#define DEV_LED_GPIO                                      	    GPIOA
-#define DEV_LED_PIN                                       	    GPIO_Pin_2
-
-#define LEFT_LED_R_GPIO                                     	GPIOA
-#define LEFT_LED_R_PIN                                       	GPIO_Pin_15
-
-#define LEFT_LED_G_GPIO                                      	GPIOB
-#define LEFT_LED_G_PIN                                       	GPIO_Pin_3
-
-#define RIGHT_LED_R_GPIO                                     	GPIOB
-#define RIGHT_LED_R_PIN                                       	GPIO_Pin_10
-
-#define RIGHT_LED_G_GPIO                                      	GPIOB
-#define RIGHT_LED_G_PIN                                       	GPIO_Pin_11
-
-#define DEV_LED_INIT(InitStructure)					            TIM5_OC3Init(InitStructure);
-#define LEFT_LED_R_INIT(InitStructure)					        TIM_OC1Init(TIM_IND_LED, InitStructure);
-#define LEFT_LED_G_INIT(InitStructure)				            TIM_OC2Init(TIM_IND_LED, InitStructure);
-#define RIGHT_LED_R_INIT(InitStructure)				            TIM_OC3Init(TIM_IND_LED, InitStructure);
-#define RIGHT_LED_G_INIT(InitStructure)				            TIM_OC4Init(TIM_IND_LED, InitStructure);
-
-#define DEV_LED_RUN							                    TIM5_OC3PreloadConfig(TIM_OCPreload_Enable);
-#define DEV_LED_STOP						                    TIM5_OC3PreloadConfig(TIM_OCPreload_Disable);
-#define DEV_LED_COMPARE(value)					                TIM5_SetCompare3(value)
-
-#define LEFT_LED_R_RUN						                    TIM_OC1PreloadConfig(TIM_IND_LED, TIM_OCPreload_Enable);
-#define LEFT_LED_R_STOP						                    TIM_OC1PreloadConfig(TIM_IND_LED, TIM_OCPreload_Disable);
-#define LEFT_LED_R_COMPARE(value)					            TIM_SetCompare1(TIM_IND_LED, value)
-
-#define LEFT_LED_G_RUN						                    TIM_OC2PreloadConfig(TIM_IND_LED, TIM_OCPreload_Enable);
-#define LEFT_LED_G_STOP						                    TIM_OC2PreloadConfig(TIM_IND_LED, TIM_OCPreload_Disable);
-#define LEFT_LED_G_COMPARE(value)					            TIM_SetCompare2(TIM_IND_LED, value)
-
-#define RIGHT_LED_R_RUN						                    TIM_OC3PreloadConfig(TIM_IND_LED, TIM_OCPreload_Enable);
-#define RIGHT_LED_R_STOP						                TIM_OC3PreloadConfig(TIM_IND_LED, TIM_OCPreload_Disable);
-#define RIGHT_LED_R_COMPARE(value)					            TIM_SetCompare3(TIM_IND_LED, value)
-
-#define RIGHT_LED_G_RUN						                    TIM_OC4PreloadConfig(TIM_IND_LED, TIM_OCPreload_Enable);
-#define RIGHT_LED_G_STOP						                TIM_OC4PreloadConfig(TIM_IND_LED, TIM_OCPreload_Disable);
-#define RIGHT_LED_G_COMPARE(value)					            TIM_SetCompare4(TIM_IND_LED, value)
+#define WS2812B_NORMAL_RGB                              0x0000FF00
+#define WS2812B_RST_RGB                                 0x00FFFFCC
+#define WS2812B_BLE_RGB                                 0x0000FF40
+#define WS2812B_CANID_ERROR_RGB                         0x00FFD700
+#define WS2812B_OFFLINE_RGB                             0x00FFEC8B
+
+#define LED_VIEW_ALARM_COLOR                            0x00FF9900                         //报警
+#define LED_VIEW_WARN_COLOR                             0x00FFFF00                         //警告
+#define LED_VIEW_ELECT_FAULT_COLOR                      0x00FFA500                         //电磁锁故障
+#define LED_VIEW_KEY_ELECT_COLOR                        0x00FF0000                         //有钥匙并上锁
+#define LED_VIEW_NOKEY_ELECT_COLOR                      0x00FF0000                         //无钥匙并上锁
+#define LED_VIEW_KEY_NOELECT_COLOR                      0x0000FF00                         //有钥匙没上锁
+#define LED_VIEW_NOKEY_NOELECT_COLOR                    0x0000FF00                         //无钥匙没上锁
+
+#define FLICKER_DELAYTIME_DEFAULT                       100 / USER_WS2812B_INTERVAL
+#define ID_ERROR_FLICKER_DEFAULT                        1000 / USER_WS2812B_INTERVAL
+#define OFFLINE_FLICKER_DEFAULT                         200 / USER_WS2812B_INTERVAL
+#define BREATH_SPEED_DEFAULT                            2000 / USER_WS2812B_INTERVAL
 
 typedef enum
 {
@@ -71,17 +36,17 @@ typedef enum
 }LED_QUEUE_TYPE;
 
 typedef enum{
-    DEV_LED 		= 0,
-    LEFT_LED 		= 1,
-    RIGHT_LED 		= 2,
+    RIGHT_LED 		= 0,
+    DEV_LED 		= 1,
+    LEFT_LED 		= 2,
     LED_TYPE_MAX	= 3,
 }LED_TYPE;
 
-typedef enum{
-    RED_LED 		= 0,
-    GREEN_LED 		= 1,
-    YELLOW_LED 		= 2,
-}LED_COLOR;
+typedef struct{
+    uint8_t red;
+    uint8_t green;
+    uint8_t blue;
+}led_color_s;
 
 typedef enum{
     LED_STAT_OFF 	= 0,
@@ -96,12 +61,11 @@ typedef enum{
     LED_WORK_MAX 	    = 5,
 }LED_WORK_STAT;
 
-typedef void (*led_set_duty_func)(uint16_t duty);
-
 typedef enum{
     LED_VIEW_NULL = 0,
     LED_VIEW_ALARM,                         //报警
     LED_VIEW_WARN,                          //警告
+    LED_VIEW_ELECT_FAUIL,                   //电磁锁故障
     LED_VIEW_KEY_ELECT,                     //有钥匙并上锁
     LED_VIEW_NOKEY_ELECT,                   //无钥匙并上锁
     LED_VIEW_KEY_NOELECT,                   //有钥匙没上锁
@@ -118,7 +82,7 @@ typedef enum{
 typedef struct{
     const uint8_t idx;
     LED_STAT stat;                        
-    LED_COLOR color;
+    led_color_s color;
     LED_WORK_STAT workStat;
     led_view_stat_e viewStat;
     uint32_t single_flicker_period;
@@ -131,12 +95,11 @@ typedef struct{
     uint32_t on_durationTime;			    //PWM变化结束后持续时间,单位:ms
     uint32_t single_off_durationTime;		//PWM变化结束后持续时间,单位:ms
     uint32_t off_durationTime;			    //PWM变化结束后持续时间,单位:ms
-    led_set_duty_func set_duty;
 }led_work_s;
 
 void led_task_init(void);
 void led_task_start(void);
-bool set_led_indication(LED_TYPE type, LED_COLOR color, LED_WORK_STAT work_stat, ...);
+bool set_led_indication(LED_TYPE type, uint32_t color, LED_WORK_STAT work_stat, ...);
 void vUser_led_set_view_stat(uint8_t idx, led_view_stat_e stat);
 void vUser_led_set_alarm_view(led_all_alarm_stat_e alarmStat, bool stat);
 

+ 6 - 6
mainboard/components/nfc/lpcd.c

@@ -589,15 +589,15 @@ bool TyteA_Read(uint8_t *picc_atqa, uint8_t *picc_uid)
     FM175X_SoftReset();                                                	/* FM175xx软件复位              */
     Set_Rf(3);                                                        	/* 打开双天线                   */
     Pcd_ConfigISOType(0);                                             	/* ISO14443寄存器初始化         */
-		memset((void *)picc_uid, 0, 15);
-		Delay_Ms(1);
+	memset((void *)picc_uid, 0, 15);
+	Delay_Ms(1);
     statues = TypeA_CardActive(picc_atqa, picc_uid, picc_sak);    			/* 激活卡片                     */
     if(statues == true) 
-		{
-			TypeA_Halt(0);                                          					/* 睡眠卡片                     */                       
+	{
+		TypeA_Halt(0);                                          					/* 睡眠卡片                     */                       
     }
-		Set_Rf(0);  
-		SetReg(ComIEnReg, 0x80);                                    /* */
+	Set_Rf(0);  
+	SetReg(ComIEnReg, 0x80);                                    /* */
     SetReg(DivIEnReg, 0x80);
     SetReg(ComIrqReg, 0x7f);                                    /* */ 	
     return statues;

+ 1 - 1
mainboard/components/nfc/user_nfc.h

@@ -19,7 +19,7 @@
 #define LEFT_CS_OFF                      					GPIO_WriteBit(LEFT_CS_GPIO, LEFT_CS_PIN, Bit_SET);
 	 
 #define RIGHT_CS_GPIO                  						GPIOB
-#define RIGHT_CS_PIN                     					GPIO_Pin_0
+#define RIGHT_CS_PIN                     					GPIO_Pin_1
 #define RIGHT_CS_ON                       					GPIO_WriteBit(RIGHT_CS_GPIO, RIGHT_CS_PIN, Bit_RESET);
 #define RIGHT_CS_OFF                      					GPIO_WriteBit(RIGHT_CS_GPIO, RIGHT_CS_PIN, Bit_SET);
 	 

+ 215 - 0
mainboard/components/ws2812b/user_ws2812b.c

@@ -0,0 +1,215 @@
+#include "user_ws2812b.h"
+#include "ws2812b_spi.h"
+
+tmosTaskID user_ws2812b_task_id = INVALID_TASK_ID;
+
+static uint16_t user_ws2812b_task_process_event(uint8_t task_id, uint16_t events);
+
+static void vUser_ws2812b_wrRGB(uint8_t r, uint8_t g, uint8_t b);
+
+static user_ws2812b_work_s user_ws2812b_work = {
+    .txStat = false,
+    .count = 0,                                     //灯的数量
+    .rgbValue = NULL,
+};
+
+/*******************************************************************************
+  * @函数名称	vUser_ws2812b_set_wrByte
+  * @函数说明   转换ws2812b颜色数据
+  * @输入参数  	byte:字节
+               color:spi发送数据属猪
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+static void vUser_ws2812b_set_wrByte(uint8_t byte, uint8_t *color)
+{
+    for(uint8_t i = 0; i < 8; i++)
+	{
+        if((byte & 0x80) == 0x80)
+        {
+            *color++ = WS2812B_HIGH;
+        }
+        else
+        {
+            *color++ = WS2812B_LOW;
+        }
+        byte <<= 1;
+	}   
+}
+
+/*******************************************************************************
+  * @函数名称   prvUser_ws2812b_set_breath
+  * @函数说明   设置ws2812b 呼吸灯效果
+  * @输入参数  	idx:左边或者右边
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+static void prvUser_ws2812b_set_breath(uint8_t idx)
+{
+    // 应用二次衰减算法(非线性),亮度更柔和自然
+    uint8_t bri = (user_ws2812b_work.led_param[idx].bright * user_ws2812b_work.led_param[idx].bright) >> 8;
+
+    // 应用亮度到颜色
+    uint8_t out_r = ((uint16_t)user_ws2812b_work.led_param[idx].rValue * (uint16_t)bri) >> 8;
+    uint8_t out_g = ((uint16_t)user_ws2812b_work.led_param[idx].gValue * (uint16_t)bri) >> 8;
+    uint8_t out_b = ((uint16_t)user_ws2812b_work.led_param[idx].bValue * (uint16_t)bri) >> 8;
+
+    vUser_ws2812b_set_wrByte(out_g, &user_ws2812b_work.rgbValue[idx * 24]);
+    vUser_ws2812b_set_wrByte(out_r, &user_ws2812b_work.rgbValue[idx * 24 + 8]);
+    vUser_ws2812b_set_wrByte(out_b, &user_ws2812b_work.rgbValue[idx * 24 + 16]);
+}
+
+/*******************************************************************************
+  * @函数名称   prvUser_ws2812b_txData
+  * @函数说明   发送ws2812b数据
+  * @输入参数  	idx:左边或者右边
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+static void prvUser_ws2812b_txData(void)
+{
+    bWs2812b_spi_WriteByte(user_ws2812b_work.rgbValue, user_ws2812b_work.count * 3 * 8);
+}
+
+/*******************************************************************************
+  * @函数名称   vUser_ws2812b_left_time_task
+  * @函数说明   ws2812b时间循环任务
+  * @输入参数  	无
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+static void vUser_ws2812b_check(void)
+{
+    if(user_ws2812b_work.txStat == false)
+    {
+        bool stat = false;
+        for(uint8_t i = 0; i < user_ws2812b_work.count; i++)
+        {
+            if(user_ws2812b_work.led_param[i].change == true)
+            {
+                user_ws2812b_work.led_param[i].change = false;
+                stat = true;
+                prvUser_ws2812b_set_breath(i);
+            }
+        }
+
+        if(stat == true)
+        {
+            prvUser_ws2812b_txData();
+        }
+    }
+}
+
+/*******************************************************************************
+  * @函数名称   vUser_ws2812b_time_task
+  * @函数说明   ws2812b时间循环任务
+  * @输入参数  	无
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+static void vUser_ws2812b_time_task(void)
+{
+    vUser_ws2812b_check();
+}
+
+/*******************************************************************************
+  * @函数名称   user_charge_task_process_event
+  * @函数说明   task的event处理回调函数,需要在注册task时候,传进去
+  * @输入参数  	task_id:任务ID
+               events:事件
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+static uint16_t user_ws2812b_task_process_event(uint8_t task_id, uint16_t events)
+{
+    //event 处理
+    if(events & (1 << WS2812B_QUEUE_TIME))
+    {
+        vUser_ws2812b_time_task();
+        return (events ^ (1 << WS2812B_QUEUE_TIME)); //异或的方式清除该事件运行标志,并返回未运行的事件标志
+    }
+
+    if(events & (1 << WS2812B_QUEUE_INT))
+    {
+        
+        return (events ^ (1 << WS2812B_QUEUE_INT)); //异或的方式清除该事件运行标志,并返回未运行的事件标志
+    }
+
+    return 0;
+}
+
+/*******************************************************************************
+  * @函数名称   vUser_ws2812b_task_start
+  * @函数说明   任务开始
+  * @输入参数  	无
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+void vUser_ws2812b_task_start(void)
+{
+    bStatus_t stat = tmos_start_reload_task(user_ws2812b_task_id, (1 << WS2812B_QUEUE_TIME), MS1_TO_SYSTEM_TIME(USER_WS2812B_INTERVAL));
+}
+
+/*******************************************************************************
+  * @函数名称   vUser_ws2812b_init
+  * @函数说明   初始化
+  * @输入参数  	无
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+void vUser_ws2812b_init(uint8_t count)
+{
+    user_ws2812b_work.count = count;
+    user_ws2812b_work.led_param = (ws2812b_led_param_s *)malloc(count * sizeof(ws2812b_led_param_s));
+    user_ws2812b_work.rgbValue = (uint8_t *)malloc(count * 3 * 8);
+    memset(user_ws2812b_work.rgbValue, WS2812B_HIGH, count * 3 * 8);
+
+    for(int i = 0; i < count; i++)
+    {
+        user_ws2812b_work.led_param[i].change = false;                      //是否有变化
+        user_ws2812b_work.led_param[i].bright = 0;                          //灯亮度
+        user_ws2812b_work.led_param[i].rValue = 0;
+        user_ws2812b_work.led_param[i].gValue = 0;
+        user_ws2812b_work.led_param[i].bValue = 0;
+    }
+
+    ws2812b_spi_Init();
+    Ws2812b_spi_dma_init(user_ws2812b_work.rgbValue, user_ws2812b_work.count * 3 * 8);
+
+    user_ws2812b_task_id  = TMOS_ProcessEventRegister(user_ws2812b_task_process_event);
+    PRINT("user_ws2812b_task_id=%d\n", user_ws2812b_task_id);
+}
+
+/*******************************************************************************
+  * @函数名称   vUser_ws2812b_set_tx_stat
+  * @函数说明   设置数据发射状态
+  * @输入参数  	stat:状态
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+void vUser_ws2812b_set_tx_stat(bool stat)
+{
+    user_ws2812b_work.txStat = stat;
+}
+
+/*******************************************************************************
+  * @函数名称   vUser_ws2812b_set_stat
+  * @函数说明   设置RGB灯状态
+  * @输入参数  	idx:灯下标
+               r:红色值
+               g:绿色值
+               b:蓝色值
+               bright:亮度
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+void vUser_ws2812b_set_stat(uint8_t idx, uint8_t r, uint8_t g, uint8_t b, uint8_t bright)
+{
+    // PRINT("idx=%d,r=%02X,g=%02X,b=%02X,bright=%d\n",idx, r,g,b,bright);
+    
+    user_ws2812b_work.led_param[idx].rValue = r;
+    user_ws2812b_work.led_param[idx].gValue = g;
+    user_ws2812b_work.led_param[idx].bValue = b;
+    user_ws2812b_work.led_param[idx].bright = bright;
+    user_ws2812b_work.led_param[idx].change = true;
+}

+ 46 - 0
mainboard/components/ws2812b/user_ws2812b.h

@@ -0,0 +1,46 @@
+#ifndef USER_WS2812B_H__
+#define USER_WS2812B_H__
+
+#include <stdint.h>
+#include <stdbool.h>
+#include "define.h"
+#include "ws2812b_spi.h"
+
+#define USER_WS2812B_INTERVAL				            10
+
+#define WS2812B_LOW                                     0xC0
+#define WS2812B_HIGH                                    0xF0
+
+typedef enum
+{
+    WS2812B_QUEUE_TIME        = 0,
+    WS2812B_QUEUE_INT		  = 1,
+}USER_WS2812B_QUEUE_TYPE;
+
+typedef struct{
+    bool change;                                        //是否有变化
+    uint8_t bright;                                     //灯亮度
+    uint8_t rValue;
+    uint8_t gValue;
+    uint8_t bValue;
+}ws2812b_led_param_s;
+
+typedef struct{
+    bool txStat;                                        //数据写状态
+    uint8_t count;                                      //灯的数量
+    ws2812b_led_param_s *led_param;
+    uint8_t *rgbValue;
+}user_ws2812b_work_s;
+    
+void vUser_ws2812b_init(uint8_t count);
+void vUser_ws2812b_task_start(void);
+void vUser_ws2812b_set_tx_stat(bool stat);
+void vUser_ws2812b_set_stat(uint8_t idx, uint8_t r, uint8_t g, uint8_t b, uint8_t bright);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // USER_WS2812B_H__
+
+/** @} */

+ 100 - 0
mainboard/components/ws2812b/ws2812b_spi.c

@@ -0,0 +1,100 @@
+#include "ws2812b_spi.h"
+#include "user_ws2812b.h"
+
+/*******************************************************************************
+  * @函数名称   user_spi_dma_init
+  * @函数说明   SPI DMA初始化
+  * @输入参数  	txData:数据指针
+               txSize:数据长度
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+void Ws2812b_spi_dma_init(uint8_t *txData, uint32_t txSize)
+{
+    DMA_InitTypeDef DMA_InitStructure;
+    NVIC_InitTypeDef NVIC_InitStructure;
+
+    DMA_DeInit(USER_WS2812B_DMA_CHANNEL);  // Channel 3 for SPI1_TX
+    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USER_WS2812B_SPI->DATAR;
+
+    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)txData;
+    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
+    DMA_InitStructure.DMA_BufferSize = txSize;
+    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
+    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
+    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
+    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
+    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
+    DMA_InitStructure.DMA_Priority = DMA_Priority_High;
+    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
+
+    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
+    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
+    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+
+    DMA_Init(USER_WS2812B_DMA_CHANNEL, &DMA_InitStructure);
+    // 启用 DMA 传输完成中断
+    DMA_ITConfig(USER_WS2812B_DMA_CHANNEL, DMA_IT_TC, ENABLE);
+    NVIC_InitStructure.NVIC_IRQChannel = USER_WS2812B_DMA_IRQn;
+
+    NVIC_Init(&NVIC_InitStructure);
+}
+
+/*******************************************************************************
+  * @函数名称   SPI_FullDuplex_Init
+  * @函数说明   SPI初始化
+  * @输入参数  	无
+  * @输出参数   无
+  * @返回参数   无
+*******************************************************************************/
+void ws2812b_spi_Init(void)
+{
+    GPIO_InitTypeDef GPIO_InitStructure = {0};
+    SPI_InitTypeDef  SPI_InitStructure = {0};
+
+    USER_WS2812B_GPIO_RCC_ENABLE;
+    USER_WS2812B_SPI_RCC_ENABLE;
+    USER_WS2812B_DMA_RCC_ENABLE;
+
+    GPIO_InitStructure.GPIO_Pin = USER_WS2812B_SPI_MOSI_PIN;
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
+    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+    GPIO_Init(USER_WS2812B_SPI_MOSI_GPIO, &GPIO_InitStructure);
+
+    SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
+    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
+    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
+    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
+    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
+    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
+    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
+    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
+    SPI_InitStructure.SPI_CRCPolynomial = 7;
+    SPI_Init(USER_WS2812B_SPI, &SPI_InitStructure);
+
+    SPI_CalculateCRC(USER_WS2812B_SPI, DISABLE);
+
+    SPI_Cmd(USER_WS2812B_SPI, ENABLE);
+}
+
+/*******************************************************************************
+* Function Name  : bUser_spi_WriteByte
+* Description    : SPI写字节
+* Input          : unsigned char TxData 写入字节
+* Output         : None
+* Return         : 结果
+Flash_ReadWriteByte
+*******************************************************************************/
+bool bWs2812b_spi_WriteByte(volatile uint8_t *TxData, uint32_t TxSize)
+{
+    // 清除传输完成标志
+    vUser_ws2812b_set_tx_stat(true);
+    // 配置 DMA
+    DMA_SetCurrDataCounter(USER_WS2812B_DMA_CHANNEL, TxSize);
+    // 启用 SPI DMA 请求
+    SPI_I2S_DMACmd(USER_WS2812B_SPI, SPI_I2S_DMAReq_Tx, ENABLE);
+    // 启用 DMA 通道
+    DMA_Cmd(USER_WS2812B_DMA_CHANNEL, ENABLE);
+
+    return true;
+}

+ 40 - 0
mainboard/components/ws2812b/ws2812b_spi.h

@@ -0,0 +1,40 @@
+#ifndef __WS1812B_SPI_H_
+#define __WS1812B_SPI_H_
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include "define.h"
+
+#define USER_WS2812B_GPIO_RCC_ENABLE 						RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB, ENABLE);
+#define USER_WS2812B_SPI_RCC_ENABLE 						RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
+#define USER_WS2812B_DMA_RCC_ENABLE                         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
+
+#define USER_WS2812B_SPI									SPI2
+
+#define USER_WS2812B_DMA_CHANNEL                            DMA1_Channel5
+
+#define USER_WS2812B_DMA_IRQn                               DMA1_Channel5_IRQn
+
+#define USER_WS2812B_DMA_IRQHandler                         DMA1_Channel5_IRQHandler
+
+#define USER_WS2812B_DMA_IT_TC                              DMA1_IT_TC5
+
+#define USER_WS2812B_SPI_MOSI_GPIO						    GPIOB
+#define USER_WS2812B_SPI_MOSI_PIN						    GPIO_Pin_15
+
+#define USER_WS2812B_SPI_SCLK_GPIO						    GPIOB
+#define USER_WS2812B_SPI_SCLK_PIN						    GPIO_Pin_13
+
+
+void ws2812b_spi_Init(void);
+bool bWs2812b_spi_WriteByte(volatile uint8_t *TxData, uint32_t TxSize);
+void Ws2812b_spi_dma_init(uint8_t *txData, uint32_t txSize);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __WS1812B_SPI_H_ */

+ 4 - 2
mainboard/mainboard.wvproj

@@ -181,7 +181,9 @@
 							"${project}/components/can",
 							"${project}/User/app_drv_fifo",
 							"${project}/components/charge",
-							"${project}/components/nfc"
+							"${project}/components/nfc",
+							"${project}/components",
+							"${project}/components/ws2812b"
 						],
 						"include_system_paths": [],
 						"include_files": []
@@ -389,7 +391,7 @@
 		"address": "0x08005000",
 		"target_path": "obj\\mainboard.hex",
 		"clkSpeed": "High",
-		"debug_interface_mode": "",
+		"debug_interface_mode": "1-wire serial",
 		"erase": false,
 		"program": true,
 		"verify": true,

File diff ditekan karena terlalu besar
+ 0 - 0
mainboard/obj/HAL/subdir.mk


File diff ditekan karena terlalu besar
+ 0 - 0
mainboard/obj/Profile/subdir.mk


File diff ditekan karena terlalu besar
+ 0 - 0
mainboard/obj/SRC/Core/subdir.mk


File diff ditekan karena terlalu besar
+ 0 - 0
mainboard/obj/SRC/Debug/subdir.mk


File diff ditekan karena terlalu besar
+ 0 - 0
mainboard/obj/SRC/Peripheral/src/subdir.mk


File diff ditekan karena terlalu besar
+ 0 - 0
mainboard/obj/User/app_drv_fifo/subdir.mk


File diff ditekan karena terlalu besar
+ 0 - 0
mainboard/obj/User/subdir.mk


File diff ditekan karena terlalu besar
+ 0 - 0
mainboard/obj/components/action/subdir.mk


File diff ditekan karena terlalu besar
+ 0 - 0
mainboard/obj/components/can/subdir.mk


File diff ditekan karena terlalu besar
+ 8 - 4
mainboard/obj/components/charge/subdir.mk


File diff ditekan karena terlalu besar
+ 0 - 0
mainboard/obj/components/config/subdir.mk


File diff ditekan karena terlalu besar
+ 4 - 0
mainboard/obj/components/electlock/subdir.mk


File diff ditekan karena terlalu besar
+ 0 - 0
mainboard/obj/components/led/subdir.mk


File diff ditekan karena terlalu besar
+ 0 - 0
mainboard/obj/components/nfc/subdir.mk


File diff ditekan karena terlalu besar
+ 0 - 0
mainboard/obj/components/tools/subdir.mk


File diff ditekan karena terlalu besar
+ 27 - 0
mainboard/obj/components/ws2812b/subdir.mk


File diff ditekan karena terlalu besar
+ 1114 - 1025
mainboard/obj/mainboard.map


+ 1 - 0
mainboard/obj/makefile

@@ -8,6 +8,7 @@ RM := rm -rf
 
 # All of the sources participating in the build are defined here
 -include sources.mk
+-include components/ws2812b/subdir.mk
 -include components/tools/subdir.mk
 -include components/nfc/subdir.mk
 -include components/led/subdir.mk

+ 1 - 0
mainboard/obj/sources.mk

@@ -42,3 +42,4 @@ components/electlock \
 components/led \
 components/nfc \
 components/tools \
+components/ws2812b \

TEMPAT SAMPAH
obj/main.bin


Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini