#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; }