|
|
@ -1633,8 +1633,20 @@ bool RCOutput::set_neopixel_num_LEDs(const uint16_t chan, uint8_t num_leds) |
|
|
|
setup neopixel (WS2812B) output data for a given output channel |
|
|
|
setup neopixel (WS2812B) output data for a given output channel |
|
|
|
and mask of LEDs on the channel |
|
|
|
and mask of LEDs on the channel |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
|
|
|
|
void ArrayShift2(uint8_t a[], int n, int m) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
while (m--) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
int temp = a[n - 1]; |
|
|
|
|
|
|
|
for (int i = n - 1; i >= 1; i--) |
|
|
|
|
|
|
|
a[i] = a[i - 1]; |
|
|
|
|
|
|
|
a[0] = temp; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void RCOutput::set_neopixel_rgb_data(const uint16_t chan, uint32_t ledmask, uint8_t red, uint8_t green, uint8_t blue) |
|
|
|
void RCOutput::set_neopixel_rgb_data(const uint16_t chan, uint32_t ledmask, uint8_t red, uint8_t green, uint8_t blue) |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
#if 0 |
|
|
|
uint8_t i; |
|
|
|
uint8_t i; |
|
|
|
pwm_group *grp = find_chan(chan, i); |
|
|
|
pwm_group *grp = find_chan(chan, i); |
|
|
|
if (!grp) { |
|
|
|
if (!grp) { |
|
|
@ -1662,6 +1674,50 @@ void RCOutput::set_neopixel_rgb_data(const uint16_t chan, uint32_t ledmask, uint |
|
|
|
ledmask >>= 1; |
|
|
|
ledmask >>= 1; |
|
|
|
led++; |
|
|
|
led++; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#else |
|
|
|
|
|
|
|
uint8_t i; |
|
|
|
|
|
|
|
pwm_group *grp = find_chan(chan, i); |
|
|
|
|
|
|
|
if (!grp) { |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// mask out for enabled LEDs
|
|
|
|
|
|
|
|
static uint8_t data_flow[24]={5,15,50,100, 100,50,15,5, 0,0,0,0, 0,0,0,0};// 0,0,0,0, 5,20,50,100, 100,50,20,5, 0,0,0,0};
|
|
|
|
|
|
|
|
ledmask &= (1U<<grp->neopixel_nleds)-1; |
|
|
|
|
|
|
|
uint8_t led = 0; |
|
|
|
|
|
|
|
int k = 0; |
|
|
|
|
|
|
|
// static uint8_t delay_cnt;
|
|
|
|
|
|
|
|
// delay_cnt++;
|
|
|
|
|
|
|
|
// if(delay_cnt>10){
|
|
|
|
|
|
|
|
// ArrayShift2(data_flow,16,1);
|
|
|
|
|
|
|
|
// delay_cnt = 0;
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
ArrayShift2(data_flow,24,1);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while (ledmask) { |
|
|
|
|
|
|
|
if (ledmask & 1) { |
|
|
|
|
|
|
|
red = 0; |
|
|
|
|
|
|
|
green = data_flow[k]; |
|
|
|
|
|
|
|
blue = 0; |
|
|
|
|
|
|
|
k++; |
|
|
|
|
|
|
|
const uint8_t pad_start_bits = 1; |
|
|
|
|
|
|
|
const uint8_t neopixel_bit_length = 24; |
|
|
|
|
|
|
|
const uint8_t stride = 4; |
|
|
|
|
|
|
|
uint32_t *buf = grp->dma_buffer + (led * neopixel_bit_length + pad_start_bits) * stride + i; |
|
|
|
|
|
|
|
uint32_t bits = (green<<16) | (red<<8) | blue; |
|
|
|
|
|
|
|
const uint32_t BIT_0 = 7 * grp->bit_width_mul; |
|
|
|
|
|
|
|
const uint32_t BIT_1 = 14 * grp->bit_width_mul; |
|
|
|
|
|
|
|
for (uint16_t b=0; b < 24; b++) { |
|
|
|
|
|
|
|
buf[b * stride] = (bits & 0x800000) ? BIT_1 : BIT_0; |
|
|
|
|
|
|
|
bits <<= 1; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
ledmask >>= 1; |
|
|
|
|
|
|
|
led++; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
/*
|
|
|
|