287 lines
5.3 KiB
C
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;
|
|
}
|
|
|