convert color[3][16] to color[16][3]
This commit is contained in:
parent
0d9b9ba985
commit
f92a03776d
22
main.c
22
main.c
@ -163,32 +163,24 @@ int main(void)
|
|||||||
/* wait for complete update */
|
/* wait for complete update */
|
||||||
rgb_update(COLOR_MASK, 1);
|
rgb_update(COLOR_MASK, 1);
|
||||||
|
|
||||||
_delay_ms(1);
|
// _delay_ms(1);
|
||||||
|
|
||||||
|
#if 1
|
||||||
step++;
|
step++;
|
||||||
if (step == 16) {
|
if (step == 16) {
|
||||||
step = 0;
|
step = 0;
|
||||||
x = sequence_chase(x, &xdir, 0x1F1F);
|
x = sequence_chase(x, &xdir, 0x1F1F);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 1
|
|
||||||
uint8_t color[3] = { 0, 0, 0 };
|
uint8_t color[3] = { 0, 0, 0 };
|
||||||
ramp = color_ramp(ramp +1, color);
|
ramp = color_ramp(ramp +1, chan_value[x]);
|
||||||
|
|
||||||
uint8_t i, j;
|
uint8_t i, j;
|
||||||
for (i = 0; i < 16; i++) {
|
for (i = 0; i < 16; i++) {
|
||||||
for (j = 0; j < 3; j++) {
|
if (x != i) {
|
||||||
#if 1
|
chan_value[i][0] = 0;
|
||||||
if (x == i) {
|
chan_value[i][1] = 0;
|
||||||
chan_value[j][i] = color[j];
|
chan_value[i][2] = 0;
|
||||||
|
|
||||||
} else if (chan_value[j][i] > 0) {
|
|
||||||
uint8_t tmp = (chan_value[j][i] >> 5);
|
|
||||||
chan_value[j][i] -= (tmp > 0) ? tmp : 1;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
chan_value[j][i] = color[j];
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
16
mpmctrl.c
16
mpmctrl.c
@ -217,7 +217,7 @@ void mpm_check_transfer(void)
|
|||||||
uint8_t pos = 1;
|
uint8_t pos = 1;
|
||||||
uint8_t cause = CAUSE_SUCCESS;
|
uint8_t cause = CAUSE_SUCCESS;
|
||||||
|
|
||||||
uint8_t (*baseptr)[3][16] = (rx_cmd == CMD_WRITE_RAW_COLOR) ? &chan_value : &nvram_data.initialRGB;
|
uint8_t (*baseptr)[16][3] = (rx_cmd == CMD_WRITE_RAW_COLOR) ? &chan_value : &nvram_data.initialRGB;
|
||||||
|
|
||||||
while ((pos < rx_length)) {
|
while ((pos < rx_length)) {
|
||||||
if ((chan >= 16) || ((pos +2) >= MPM_MAX_DATA_SIZE)) {
|
if ((chan >= 16) || ((pos +2) >= MPM_MAX_DATA_SIZE)) {
|
||||||
@ -225,9 +225,9 @@ void mpm_check_transfer(void)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
baseptr[0][COLOR_RED][chan] = mpm_data[pos++];
|
baseptr[0][chan][COLOR_RED] = mpm_data[pos++];
|
||||||
baseptr[0][COLOR_GREEN][chan] = mpm_data[pos++];
|
baseptr[0][chan][COLOR_GREEN] = mpm_data[pos++];
|
||||||
baseptr[0][COLOR_BLUE][chan] = mpm_data[pos++];
|
baseptr[0][chan][COLOR_BLUE] = mpm_data[pos++];
|
||||||
chan++;
|
chan++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -250,7 +250,7 @@ void mpm_check_transfer(void)
|
|||||||
uint8_t pos = 0;
|
uint8_t pos = 0;
|
||||||
uint8_t cause = CAUSE_SUCCESS;
|
uint8_t cause = CAUSE_SUCCESS;
|
||||||
|
|
||||||
uint8_t (*baseptr)[3][16] = (rx_cmd == CMD_READ_RAW_COLOR) ? &chan_value : &nvram_data.initialRGB;
|
uint8_t (*baseptr)[16][3] = (rx_cmd == CMD_READ_RAW_COLOR) ? &chan_value : &nvram_data.initialRGB;
|
||||||
|
|
||||||
while (count--) {
|
while (count--) {
|
||||||
if ((chan >= 16) || ((pos +2) >= MPM_MAX_DATA_SIZE)) {
|
if ((chan >= 16) || ((pos +2) >= MPM_MAX_DATA_SIZE)) {
|
||||||
@ -258,9 +258,9 @@ void mpm_check_transfer(void)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
mpm_data[pos++] = baseptr[0][COLOR_RED][chan];
|
mpm_data[pos++] = baseptr[0][chan][COLOR_RED];
|
||||||
mpm_data[pos++] = baseptr[0][COLOR_GREEN][chan];
|
mpm_data[pos++] = baseptr[0][chan][COLOR_GREEN];
|
||||||
mpm_data[pos++] = baseptr[0][COLOR_BLUE][chan];
|
mpm_data[pos++] = baseptr[0][chan][COLOR_BLUE];
|
||||||
chan++;
|
chan++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
12
rgb16mpm.h
12
rgb16mpm.h
@ -30,14 +30,16 @@
|
|||||||
|
|
||||||
struct _nvdata {
|
struct _nvdata {
|
||||||
uint16_t nvram_size; /* first */
|
uint16_t nvram_size; /* first */
|
||||||
uint8_t initialRGB[3][16]; /* initial color values */
|
uint8_t initialRGB[16][3]; /* initial color values */
|
||||||
uint16_t nvram_crc; /* last */
|
uint16_t nvram_crc; /* last */
|
||||||
};
|
};
|
||||||
|
|
||||||
#define NVRAM_DEFAULTS {\
|
#define NVRAM_DEFAULTS {\
|
||||||
.initialRGB = { { 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x20, 0x40, 0x80, 0xFF, }, \
|
.initialRGB = { { 0xFF, 0x00, 0x00 }, { 0xFF, 0x80, 0x00 }, { 0xFF, 0xFF, 0x00 }, { 0x80, 0xFF, 0x00 }, \
|
||||||
{ 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x20, 0x40, 0x80, 0xFF, }, \
|
{ 0x00, 0xFF, 0x00 }, { 0x00, 0xFF, 0x80 }, { 0x00, 0xFF, 0xFF }, { 0x00, 0x80, 0xFF }, \
|
||||||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x20, 0x40, 0x80, 0xFF, } }, \
|
{ 0x00, 0x00, 0xFF }, { 0x80, 0x00, 0xFF }, { 0xFF, 0x00, 0xFF }, { 0xFF, 0x00, 0x80 }, \
|
||||||
|
{ 0x20, 0x20, 0x20 }, { 0x40, 0x40, 0x40 }, { 0x80, 0x80, 0x80 }, { 0xFF, 0xFF, 0xFF } \
|
||||||
|
}, \
|
||||||
};
|
};
|
||||||
|
|
||||||
/* eeprom.c vars */
|
/* eeprom.c vars */
|
||||||
@ -52,7 +54,7 @@ void mpm_init(void);
|
|||||||
void mpm_check_transfer(void);
|
void mpm_check_transfer(void);
|
||||||
|
|
||||||
/* rgbctrl.c vars */
|
/* rgbctrl.c vars */
|
||||||
extern uint8_t chan_value[3][16];
|
extern uint8_t chan_value[16][3];
|
||||||
|
|
||||||
/* rgbctrl.c funcs */
|
/* rgbctrl.c funcs */
|
||||||
void rgb_init(void);
|
void rgb_init(void);
|
||||||
|
26
rgbctrl.c
26
rgbctrl.c
@ -25,7 +25,7 @@
|
|||||||
#include "rgb16mpm.h"
|
#include "rgb16mpm.h"
|
||||||
|
|
||||||
/* 16 values per color */
|
/* 16 values per color */
|
||||||
uint8_t chan_value[3][16];
|
uint8_t chan_value[16][3];
|
||||||
|
|
||||||
/* (16 +1) * 4 values (portA, portC, OCR0, flags) per color */
|
/* (16 +1) * 4 values (portA, portC, OCR0, flags) per color */
|
||||||
static uint8_t chan_rawdata[3][17 * 4];
|
static uint8_t chan_rawdata[3][17 * 4];
|
||||||
@ -189,9 +189,9 @@ ISR(TIMER0_COMP_vect, ISR_NAKED)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* calc chan_valueX => chan_rawdataX */
|
/* calc chan_valueX => chan_rawdataX */
|
||||||
static void calculate_timer_values(uint8_t *value, uint8_t *pDataStart)
|
static void calculate_timer_values(uint8_t color)
|
||||||
{
|
{
|
||||||
uint8_t *pData = pDataStart +4; /* skip first entry (init) */
|
uint8_t *pData = &chan_rawdata[color][4]; /* skip first entry (init) */
|
||||||
uint8_t index = 0;
|
uint8_t index = 0;
|
||||||
uint16_t chan_used = 0xFFFF;
|
uint16_t chan_used = 0xFFFF;
|
||||||
uint16_t chan_init = 0xFFFF;
|
uint16_t chan_init = 0xFFFF;
|
||||||
@ -205,22 +205,22 @@ static void calculate_timer_values(uint8_t *value, uint8_t *pDataStart)
|
|||||||
uint16_t chan_mask = 0x0001;
|
uint16_t chan_mask = 0x0001;
|
||||||
|
|
||||||
for (i = 0; i < 16; i++) {
|
for (i = 0; i < 16; i++) {
|
||||||
|
uint8_t value = chan_value[i][color];
|
||||||
|
|
||||||
/* skip if channel already used */
|
/* skip if channel already used */
|
||||||
if (chan_used & chan_mask)
|
if (chan_used & chan_mask) {
|
||||||
{
|
|
||||||
/* channel is not used (value 0x00) */
|
/* channel is not used (value 0x00) */
|
||||||
if (value[i] == 0x00) {
|
if (value == 0x00) {
|
||||||
chan_init &= (~chan_mask);
|
chan_init &= (~chan_mask);
|
||||||
chan_used &= (~chan_mask);
|
chan_used &= (~chan_mask);
|
||||||
|
|
||||||
/* found a new lower value */
|
/* found a new lower value */
|
||||||
} else if (value[i] < min_value) {
|
} else if (value < min_value) {
|
||||||
min_value = value[i];
|
min_value = value;
|
||||||
chan_tmp = chan_used & (~chan_mask);
|
chan_tmp = chan_used & (~chan_mask);
|
||||||
|
|
||||||
/* found another value with the same value */
|
/* found another value with the same value */
|
||||||
} else if (value[i] == min_value) {
|
} else if (value == min_value) {
|
||||||
chan_tmp &= (~chan_mask);
|
chan_tmp &= (~chan_mask);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -257,7 +257,7 @@ static void calculate_timer_values(uint8_t *value, uint8_t *pDataStart)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* first slot/init: enable only channels that are > 0 */
|
/* first slot/init: enable only channels that are > 0 */
|
||||||
pData = pDataStart;
|
pData = &chan_rawdata[color][0];
|
||||||
*pData++ = (chan_init & 0xFF); /* PORTA */
|
*pData++ = (chan_init & 0xFF); /* PORTA */
|
||||||
*pData++ = ((chan_init >> 8) & 0xFF); /* PORTC */
|
*pData++ = ((chan_init >> 8) & 0xFF); /* PORTC */
|
||||||
}
|
}
|
||||||
@ -270,15 +270,15 @@ uint8_t rgb_update(uint8_t dirty_mask, uint8_t blocking)
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
if ((chan_dirty & (1<<COLOR_RED)) && (nextColor == COLOR_BLUE)) {
|
if ((chan_dirty & (1<<COLOR_RED)) && (nextColor == COLOR_BLUE)) {
|
||||||
calculate_timer_values(chan_value[COLOR_RED], chan_rawdata[COLOR_RED]);
|
calculate_timer_values(COLOR_RED);
|
||||||
chan_dirty &= ~(1<<COLOR_RED);
|
chan_dirty &= ~(1<<COLOR_RED);
|
||||||
|
|
||||||
} else if ((chan_dirty & (1<<COLOR_GREEN)) && (nextColor == COLOR_RED)) {
|
} else if ((chan_dirty & (1<<COLOR_GREEN)) && (nextColor == COLOR_RED)) {
|
||||||
calculate_timer_values(chan_value[COLOR_GREEN], chan_rawdata[COLOR_GREEN]);
|
calculate_timer_values(COLOR_GREEN);
|
||||||
chan_dirty &= ~(1<<COLOR_GREEN);
|
chan_dirty &= ~(1<<COLOR_GREEN);
|
||||||
|
|
||||||
} else if ((chan_dirty & (1<<COLOR_BLUE)) && (nextColor == COLOR_GREEN)) {
|
} else if ((chan_dirty & (1<<COLOR_BLUE)) && (nextColor == COLOR_GREEN)) {
|
||||||
calculate_timer_values(chan_value[COLOR_BLUE], chan_rawdata[COLOR_BLUE]);
|
calculate_timer_values(COLOR_BLUE);
|
||||||
chan_dirty &= ~(1<<COLOR_BLUE);
|
chan_dirty &= ~(1<<COLOR_BLUE);
|
||||||
|
|
||||||
} else if (!blocking) {
|
} else if (!blocking) {
|
||||||
|
Loading…
Reference in New Issue
Block a user