V1.0
This commit is contained in:
@@ -0,0 +1,286 @@
|
||||
#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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user