Files
pwm32e_pro/project/example/2.4g/RF24_ADV/app/src/light.c
T
moyuhai 41a602f89c V1.0
2026-06-09 16:39:17 +08:00

287 lines
5.3 KiB
C

#include "app.h"
#include "xc_hal.h"
#include "xc_24g.h"
const uint16_t lightmap[32] = {65535, 13107, 6554, 2621, 1311, 655, 328, 218, 164, 131, 82, 66, 44, 33, 26, 22, 19, 16, 15, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1};//ÁÁÃðµÆËٶȱí
configa_t lampcfg = {0};
struct _lamprun_t {
uint16_t ll1;
uint16_t ll2;
uint32_t ll3;
uint16_t ll4;
uint16_t ll5;
uint16_t ll6[5];
uint16_t ll7[5];
}runval;
struct _rlight_t {
uint16_t val;
uint16_t tar;
uint16_t out;
float now;
float step;
}rlight;
struct _rcolor_t {
uint16_t val[5];
uint16_t tar[5];
uint16_t out[5];
float now[5];
float step[5];
}rcolor;
uint16_t rspeed;
uint16_t blink_speed = 0;
uint16_t blink_cycle = 0;
uint8_t blink_type = 0;
volatile uint16_t updata_wait = 0;
volatile uint32_t blink_wait = 0;
volatile uint32_t light_count;
volatile uint32_t test1_wait = 0;
volatile uint32_t test2_wait = 0;
static void updata_runval(void)
{
runval.ll1 = (uint32_t)(lampcfg.light1 * 65535) / 100;
runval.ll2 = (uint32_t)(lampcfg.light0 * 65535) / 100;
runval.ll3 = lampcfg.time * SEC(10);
runval.ll4 = lightmap[(lampcfg.uidx>>1)&0x1F];
runval.ll5 = lightmap[lampcfg.didx&0x1F];
for(uint8_t i = 0; i < 5; i++)
{
runval.ll6[i] = lampcfg.color1[i] * 257;
runval.ll7[i] = lampcfg.color0[i] * 257;
}
}
void light_init(void)
{
lampcfg = param.ca;
updata_runval();
if(runval.ll1 == runval.ll2)
{
for(uint8_t i = 0; i < 5; i++)
{
rcolor.now[i] = (float)runval.ll7[i];
}
}
else
{
for(uint8_t i = 0; i < 5; i++)
{
rcolor.now[i] = (float)runval.ll6[i];
}
}
}
void light_tick(void)
{
if(light_count < 0xFFFFFFFF)
{
light_count++;
}
if(updata_wait > 0)
{
updata_wait--;
}
if(blink_wait > 0)
{
blink_wait--;
}
}
void light_process_100ms(void)
{
if(test1_wait > 0)
{
test1_wait--;
}
if(test2_wait > 0)
{
test2_wait--;
}
}
static float light_updata(float now, float target, float speed)
{
if(now < target)
{
now += speed;
if(now > target) {now = target;}
}
else if(now > target)
{
now -= speed;
if(now < target) {now = target;}
}
return now;
}
static void setout1(void)
{
rlight.val = runval.ll1;
for(uint8_t i = 0; i < 5; i++)
{
rcolor.val[i] = runval.ll6[i];
}
}
static void setout0(void)
{
rlight.val = runval.ll2;
for(uint8_t i = 0; i < 5; i++)
{
rcolor.val[i] = runval.ll7[i];
}
}
__RAM_CODE void light_loop(void)
{
if(blink_wait > 0)
{
if(blink_type == BLINK)
{
rlight.val = ((blink_wait%blink_cycle) > (blink_cycle>>1)) ? 0 : 45874;
}
else if(blink_type == BLINK2)
{
rlight.val = ((blink_wait%blink_cycle) > (blink_cycle>>1)) ? 45874 : 3276;
}
rspeed = blink_speed;
}
else
{
if(runval.ll3 == 0)
{
if(blink_type == 0) rspeed = runval.ll5;
}
else if(runval.ll1 == runval.ll2)
{
setout0();
if(blink_type == 0) rspeed = runval.ll4;
}
else if(light_count < runval.ll3)
{
setout1();
if(blink_type == 0) rspeed = runval.ll4;
}
else
{
setout0();
if(blink_type == 0) rspeed = runval.ll5;
}
}
if(updata_wait == 0)
{
updata_wait = MSEC(10);
if(rlight.tar != rlight.val || rcolor.tar[0] != rcolor.val[0] || rcolor.tar[1] != rcolor.val[1] ||
rcolor.tar[2] != rcolor.val[2] || rcolor.tar[3] != rcolor.val[3] || rcolor.tar[4] != rcolor.val[4])
{
rlight.tar = rlight.val;
for(uint8_t i = 0; i < 5; i++)
{
rcolor.tar[i] = rcolor.val[i];
}
rlight.step = (rspeed * f_delta(rlight.now, rlight.tar)) / 65535.0f;
for(uint8_t i = 0; i < 5; i++)
{
rcolor.step[i] = (rspeed * f_delta(rcolor.now[i], rcolor.tar[i])) / 65535.0f;
}
}
rlight.now = light_updata(rlight.now, rlight.tar, rlight.step);
rlight.out = (uint16_t)rlight.now;
for(uint8_t i = 0; i < 5; i++)
{
rcolor.now[i] = light_updata(rcolor.now[i], rcolor.tar[i], rcolor.step[i]);
rcolor.out[i] = (uint16_t)rcolor.now[i];
}
api_pwm_out(rlight.out, rcolor.out);
if((blink_wait == 0) && (rlight.out == rlight.tar))
{
blink_type = 0;
}
}
}
void light_set_mode(uint8_t *data, uint8_t save)
{
if(data[0] <= 100) lampcfg.light1 = data[0];
if(data[1] <= 100) lampcfg.light0 = data[1];
if(data[2] <= 254) lampcfg.time = data[2];
lampcfg.didx = (data[3]&0x3F);
lampcfg.uidx = (data[6]&0x3F);
if((data[5]<<8|data[4]) < 65535)
{
lampcfg.weight = data[5]<<8|data[4];
}
updata_runval();
if(save != 0) store_write_param(PARAM8, lampcfg.data);
}
void light_set_color(uint8_t *data, uint8_t save)
{
if(data[0] <= 100) lampcfg.light1 = data[0];
if(data[1] <= 100) lampcfg.light0 = data[1];
for(uint8_t i = 0; i < 5; i++)
{
lampcfg.color1[i] = data[2+i];
lampcfg.color0[i] = data[7+i];
}
updata_runval();
if(save != 0) store_write_param(PARAM8, lampcfg.data);
}
void light_get_mode(uint8_t *data)
{
data[0] = lampcfg.light1;
data[1] = lampcfg.light0;
data[2] = lampcfg.time;
data[6] = lampcfg.uidx;
data[3] = lampcfg.didx;
data[4] = lampcfg.weight & 0xFF;
data[5] = lampcfg.weight >> 8;
}
void light_set_trig(void)
{
light_count = 0;
}
void light_blink(uint32_t cycle, uint16_t times, uint8_t type)
{
if(blink_wait == 0 && times > 0)
{
blink_type = type;
blink_cycle = cycle;
blink_speed = 2621400/cycle;
blink_wait = blink_cycle*times-1;
if(blink_type == BLINK2)
{
light_count = 0xFFFFFFFF;
}
}
else if(times == 0)
{
blink_wait = 0;
}
}
uint16_t light_nowout(void)
{
return rlight.now;
}