STS_M1A/Core/Src/sts_lamp_bar.c

451 lines
10 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* sts_lamp_bar.c
*
* Created on: 2022年12月7日
* Author: lenovo
*/
#include "main.h"
#include "dma.h"
#include "tim.h"
#include "string.h"
#include "sys_app.h"
#include "sts_lamp_bar.h"
#define ONE_PULSE (36)
#define ZERO_PULSE (20)
#define LED_DATA_LEN (24)
#define WS2812B_DATA_LEN (LED_DATA_LEN * (STS_LAMP_BAR_LED_NUM+4))
#define DEFAULT_LUMINANCE_LEVEL (20)
#define RESET_PULSE (80)
typedef struct {
uint16_t head[3];
uint16_t GRB[24*STS_LAMP_BAR_LED_NUM];
uint16_t tail;
} WS2812B_FrameTypeDef;
volatile WS2812B_FrameTypeDef rgb_buf = {
.head[0] = 0,
.head[1] = 0,
.head[2] = 0,
.tail = 0
};
uint8_t color_rgb[8][3] = { //STS_COLOR R G B MAPPING TABLE
{0,0,0},{0,1,0},{1,0,0},{0,0,1},{1,1,0},{1,0,1},{0,1,1},{1,1,1}
};
volatile uint8_t sts_work_mode = STS_DUAL_MODE;
volatile uint8_t sts_reed_hall_ext_int = 0;
volatile uint8_t sts_status_color = STS_DARK;
volatile uint8_t sts_occupancy_status = 0;
volatile uint8_t sts_reed_hall_changed_flag = 1;
uint8_t luminance_level = DEFAULT_LUMINANCE_LEVEL;
void STS_Lamp_Bar_HSV2RGB(uint32_t h, uint32_t s, uint32_t v, uint32_t *r, uint32_t *g, uint32_t *b);
void STS_YunhornSTSEventP1_Process(void)
{
STS_Reed_Hall_Working();
}
void STS_YunhornSTSEventP2_Process(void)
{
}
void STS_YunhornSTSEventP3_Process(void)
{
sts_status_color = (STS_Reed_Hall_Status == STS_Status_Open)? STS_GREEN:STS_RED;
STS_Lamp_Bar_Scoller(sts_status_color, luminance_level);
}
void STS_WS2812B_Set_RGB(uint8_t R, uint8_t G, uint8_t B, uint8_t idx)
{
if (idx < STS_LAMP_BAR_LED_NUM)
{
for (uint8_t j = 0; j < 8; j ++)
{
rgb_buf.GRB[idx*24+j] = (G&(0X80)>>j)? ONE_PULSE : ZERO_PULSE;
rgb_buf.GRB[idx*24+8+j] = (R&(0X80)>>j)? ONE_PULSE : ZERO_PULSE;
rgb_buf.GRB[idx*24+16+j] = (B&(0X80)>>j)? ONE_PULSE : ZERO_PULSE;
}
}
}
/*
* COLOR SPACE, H, S, V
*
*/
void STS_WS2812B_Set_HSV(uint16_t H, uint16_t S, uint16_t V, uint16_t idx)
{
uint32_t R = 0, G = 0, B = 0;
if (idx < STS_LAMP_BAR_LED_NUM)
{
STS_Lamp_Bar_HSV2RGB(H, S, V, &R, &G, &B);
for (uint16_t i = 0; i < 8; i++)
{
rgb_buf.GRB[idx*24 + i ] = (G << i) & (0x80) ? ONE_PULSE : ZERO_PULSE;
rgb_buf.GRB[idx*24 + i + 8] = (R << i) & (0x80) ? ONE_PULSE : ZERO_PULSE;
rgb_buf.GRB[idx*24 + i +16] = (B << i) & (0x80) ? ONE_PULSE : ZERO_PULSE;
}
}
}
void STS_Lamp_Bar_Full_Color_Gradient(void)
{
for (uint16_t hue = 0; hue < 360; hue++)
{
for (uint8_t i = 0; i < STS_LAMP_BAR_LED_NUM; i++)
{
STS_WS2812B_Set_HSV(hue, DEFAULT_SATURATION, DEFAULT_BRIGHTNESS, i);
}
STS_WS2812B_Refresh();
HAL_Delay(20);
}
}
/**
* @brief HSV COLOR SPACE TO RGB COLOR SPACE
*
* @param h HSV HHue, 0~360
* @param s HSV SSaturation, 0~100
* @param v HSV VValue of lightness, 0~100
* @param r RGB-R
* @param g RGB-G
* @param b RGB-B
*
*/
void STS_Lamp_Bar_HSV2RGB(uint32_t h, uint32_t s, uint32_t v, uint32_t *r, uint32_t *g, uint32_t *b)
{
h %= 360; // h -> [0,360]
uint32_t rgb_max = v * 2.55f;
uint32_t rgb_min = rgb_max * (100 - s) / 100.0f;
uint32_t i = h / 60;
uint32_t diff = h % 60;
uint32_t rgb_adj = (rgb_max - rgb_min) * diff / 60;
switch (i)
{
case 0:
*r = rgb_max;
*g = rgb_min + rgb_adj;
*b = rgb_min;
break;
case 1:
*r = rgb_max - rgb_adj;
*g = rgb_max;
*b = rgb_min;
break;
case 2:
*r = rgb_min;
*g = rgb_max;
*b = rgb_min + rgb_adj;
break;
case 3:
*r = rgb_min;
*g = rgb_max - rgb_adj;
*b = rgb_max;
break;
case 4:
*r = rgb_min + rgb_adj;
*g = rgb_min;
*b = rgb_max;
break;
default:
*r = rgb_max;
*g = rgb_min;
*b = rgb_max - rgb_adj;
break;
}
}
void STS_Lamp_Bar_Set_Dark(void)
{
//APP_LOG(TS_OFF, VLEVEL_M,"\r\n Set Dark .....\r\n");
HAL_Delay(200);
for (uint8_t i=0; i< STS_LAMP_BAR_LED_NUM; i++) {
STS_WS2812B_Set_RGB(0x00,0x00,0x00,i);
}
STS_WS2812B_Refresh();
}
void STS_WS2812B_Refresh(void)
{
HAL_TIM_PWM_Start_DMA(&STS_LAMP_BAR_HTIM, STS_LAMP_BAR_TIM_CHANNEL, (uint32_t *)&rgb_buf, (RESET_PULSE+WS2812B_DATA_LEN));
}
void STS_Lamp_Bar_Init(void)
{
STS_Lamp_Bar_Set_STS_RGB_Color(STS_GREEN, luminance_level);
STS_WS2812B_Refresh();
HAL_Delay(200);
STS_Lamp_Bar_Set_STS_RGB_Color(STS_RED, luminance_level);
STS_WS2812B_Refresh();
HAL_Delay(200);
STS_Lamp_Bar_Set_STS_RGB_Color(STS_BLUE, luminance_level);
STS_WS2812B_Refresh();
HAL_Delay(200);
}
//marquee scoller
void STS_Lamp_Bar_Scoller(uint8_t color, uint8_t luminance_level)
{
STS_Lamp_Bar_Set_Dark();
for(uint8_t i = 0; i<(STS_LAMP_BAR_LED_NUM+1); i++)
{
STS_WS2812B_Refresh();
HAL_Delay(60);
if (i < STS_LAMP_BAR_LED_NUM) {
STS_WS2812B_Set_RGB(color_rgb[color][0]*luminance_level,color_rgb[color][1]*luminance_level, color_rgb[color][2]*luminance_level, i);
}
}
STS_WS2812B_Refresh();
}
void STS_Lamp_Bar_Set_RGB_Color(uint8_t red, uint8_t green, uint8_t blue )
{
HAL_Delay(1);
for(uint8_t i = 0; i < STS_LAMP_BAR_LED_NUM; i++)
{
STS_WS2812B_Set_RGB(red, green, blue, i);
}
STS_WS2812B_Refresh();
}
void STS_Lamp_Bar_Set_HSV_Color(uint16_t H, uint16_t S, uint16_t V)
{
HAL_Delay(1);
for(uint8_t i = 0; i < STS_LAMP_BAR_LED_NUM; i++)
{
STS_WS2812B_Set_HSV(H, S, V, i);
}
STS_WS2812B_Refresh();
}
void STS_Lamp_Bar_Set_STS_RGB_Color(uint8_t sts_lamp_color, uint8_t luminance_level)
{
uint8_t lum = luminance_level;
STS_Lamp_Bar_Set_RGB_Color(0x0, 0x0, 0x0);
switch (sts_lamp_color)
{
case STS_DARK:
STS_Lamp_Bar_Set_RGB_Color(0x0, 0x0, 0x0);
break;
case STS_GREEN:
STS_Lamp_Bar_Set_RGB_Color(0x0, lum, 0x0);
break;
case STS_RED:
STS_Lamp_Bar_Set_RGB_Color(lum, 0x0, 0x0);
break;
case STS_BLUE:
STS_Lamp_Bar_Set_RGB_Color(0x0, 0x0, lum);
break;
case STS_YELLOW:
STS_Lamp_Bar_Set_RGB_Color(lum, lum, 0x0);
break;
case STS_PINK:
STS_Lamp_Bar_Set_RGB_Color(lum, 0x0, lum);
break;
case STS_CYAN:
STS_Lamp_Bar_Set_RGB_Color(0x0, lum, lum);
break;
case STS_WHITE:
STS_Lamp_Bar_Set_RGB_Color(lum, lum, lum);
break;
case STS_RED_BLUE:
STS_Lamp_Bar_Set_RGB_Color(lum, 0x0, 0x0);
STS_WS2812B_Refresh();
HAL_Delay(100);
STS_Lamp_Bar_Set_RGB_Color(0x0, 0x0, lum);
STS_WS2812B_Refresh();
HAL_Delay(100);
break;
}
}
void STS_Lamp_Bar_Set_STS_HSV_Color(uint8_t sts_lamp_color, uint8_t sts_lamp_hsv_value)
{
uint8_t hsv_v = sts_lamp_hsv_value;
uint16_t hsv_s = DEFAULT_SATURATION;
STS_Lamp_Bar_Set_HSV_Color(0,0,0);
switch (sts_lamp_color)
{
case STS_DARK:
STS_Lamp_Bar_Set_HSV_Color(0, 0, 0);
break;
case STS_GREEN:
STS_Lamp_Bar_Set_HSV_Color(HSV_GREEN, hsv_s, hsv_v);
break;
case STS_RED:
STS_Lamp_Bar_Set_HSV_Color(HSV_RED, hsv_s, hsv_v);
break;
case STS_BLUE:
STS_Lamp_Bar_Set_HSV_Color(HSV_BLUE, hsv_s, hsv_v);
break;
case STS_YELLOW:
STS_Lamp_Bar_Set_HSV_Color(HSV_YELLOW, hsv_s, hsv_v);
break;
case STS_PINK:
STS_Lamp_Bar_Set_HSV_Color(HSV_PINK, hsv_s, hsv_v);
break;
case STS_CYAN:
STS_Lamp_Bar_Set_HSV_Color(HSV_CYAN, hsv_s, hsv_v);
break;
case STS_WHITE:
STS_Lamp_Bar_Set_HSV_Color(HSV_WHITE, hsv_s, hsv_v);
break;
case STS_RED_BLUE:
STS_Lamp_Bar_Set_HSV_Color(HSV_RED, hsv_s, hsv_v);
STS_WS2812B_Refresh();
HAL_Delay(100);
STS_Lamp_Bar_Set_HSV_Color(HSV_BLUE, hsv_s, hsv_v);
STS_WS2812B_Refresh();
HAL_Delay(100);
break;
}
}
void STS_Reed_Hall_Working(void)
{
if (STS_Reed_Hall_Status == STS_Status_Open) {
sts_status_color = STS_GREEN;
sts_occupancy_status = 0;
APP_LOG(TS_OFF, VLEVEL_M, "\r\n Door Open \r\n");
}
else if (STS_Reed_Hall_Status == STS_Status_Close) {
sts_occupancy_status = 1;
sts_status_color = STS_RED;
APP_LOG(TS_OFF, VLEVEL_M, "\r\n Door Closed \r\n");
}
STS_Lamp_Bar_Set_STS_RGB_Color(sts_status_color,30);
sts_occupancy_status =
sts_reed_hall_ext_int = 0;
switch (sts_work_mode) {
case STS_NETWORK_MODE:
break;
case STS_WIRED_MODE:
break;
case STS_REEDSWITCH_MODE:
break;
case STS_RSS_MODE:
break;
case STS_DUAL_MODE:
STS_Lamp_Bar_Set_STS_RGB_Color(sts_status_color, luminance_level);
break;
case STS_REEDSWITCH:
break;
case STS_DUAL_RSS_MODE:
break;
case STS_TOF_MODE:
break;
case STS_TOF_RSS_MODE:
break;
default:
break;
}
}
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
HAL_TIM_PWM_Stop_DMA(&STS_LAMP_BAR_HTIM,STS_LAMP_BAR_TIM_CHANNEL);
}
void STS_Lamp_Bar_Self_Test(void)
{
uint8_t color=0, luminance_level=10;
APP_LOG(TS_OFF, VLEVEL_M, "\r\n YunHorn STS Indicative Lamp Self Test\r\n");
APP_LOG(TS_OFF, VLEVEL_M, "\r\n [#1] RGB Space Lumianance Level Testing\r\n");
for (color=STS_GREEN; color <= STS_RED_BLUE; color++)
{
luminance_level = 10;
do {
STS_Lamp_Bar_Set_STS_RGB_Color(color, luminance_level);
HAL_Delay(50);
luminance_level += 10;
} while (luminance_level < 99);
STS_Lamp_Bar_Set_Dark();
}
HAL_Delay(1000);
APP_LOG(TS_OFF, VLEVEL_M, "\r\n [#2] Scoller Testing\r\n");
for (color = STS_GREEN; color <= STS_RED_BLUE; color++)
{
STS_Lamp_Bar_Scoller(color, luminance_level);
}
STS_Lamp_Bar_Set_Dark();
HAL_Delay(1000);
/*
APP_LOG(TS_OFF, VLEVEL_M, "\r\n [#3] HSV space Color Gradient Testing\r\n");
STS_Lamp_Bar_Full_Color_Gradient();
APP_LOG(TS_OFF, VLEVEL_M, "\r\n [#4] HSV Space Lumianance Level Testing\r\n");
uint8_t hsv_value=1;
for (color=STS_GREEN; color <= STS_RED_BLUE; color++)
{
hsv_value = 10;
do {
STS_Lamp_Bar_Set_STS_HSV_Color(color, hsv_value);
HAL_Delay(10);
hsv_value += 10;
} while (hsv_value < 99);
STS_Lamp_Bar_Set_Dark();
}
*/
APP_LOG(TS_OFF, VLEVEL_M, "\r\n [##] YunHorn STS Indicative Lamp Self Test Finished\r\n");
STS_Lamp_Bar_Set_STS_RGB_Color(STS_GREEN, luminance_level);
HAL_Delay(500);
}
void sts_rgb_unit_test(void)
{
APP_LOG(TS_OFF, VLEVEL_M, "\r\n STS Lamp Bar Init...\r\n");
STS_Lamp_Bar_Set_Dark();
STS_Lamp_Bar_Full_Color_Gradient();
STS_Lamp_Bar_Self_Test();
}