-= Александр =- писал(а):Нет, глюк именно сверху. Будь он там - оно бы воспроизводимо было. А так - случайно всплывает...
А оно и воспроизводимо! Попробуй цвета 0x0202FC, 0x808000 или 0x404080. Может в коде еще есть ошибка, но при этих цветах E = 0 точно!
-= Александр =- писал(а):Все замечания пиши сюда - вместе подумаем!
Рассмотрим блок:
- Код: Выделить всё • Развернуть
for(i=1;i<=4;i++)
{
if(rx_buffer[0]==i-1){R[i]=rx_buffer[1];G[i]=rx_buffer[2];B[i]=rx_buffer[3];}
if(R[i]+G[i]+B[i]==0)E[i]=0;
else E[i]=1;
}
Во первых, заменяем
- Код: Выделить всё • Развернуть
if(R[i]+G[i]+B[i]==0)E[i]=0;
else E[i]=1;
на
- Код: Выделить всё • Развернуть
E[i] = (R[i] || G[i] || B[i]);
тем самым, исправляя глюк.
В твоем цикле E задается для каждого i от 1 до 4, но, за один раз, изменяется значение только одного E, поэтому «E[i]=» переносим «глубже»:
- Код: Выделить всё • Развернуть
for(i=1;i<=4;i++)
{
if(rx_buffer[0]==i-1)
{
R[i]=rx_buffer[1];G[i]=rx_buffer[2];B[i]=rx_buffer[3];
E[i] = (R[i] || G[i] || B[i]);
}
}
Исходя из полученного, приходим к выводу, что цикл нам вообще ни к чему:
- Код: Выделить всё • Развернуть
i = rx_buffer[0]+1;
R[i] = rx_buffer[1];
G[i] = rx_buffer[2];
B[i] = rx_buffer[3];
E[i] = (R[i] || G[i] || B[i]);
На случай, если в будущем будут предусмотрены дополнительные команды, придется добавить ограничение:
- Код: Выделить всё • Развернуть
i = rx_buffer[0]+1;
if (i <= 4)
{
R[i] = rx_buffer[1];
G[i] = rx_buffer[2];
B[i] = rx_buffer[3];
E[i] = (R[i] || G[i] || B[i]);
}
Элементы с индексами [0] у тебя не используются (пропадают без дела), поэтому можно строку
- Код: Выделить всё • Развернуть
i = rx_buffer[0]+1;
заменить на
- Код: Выделить всё • Развернуть
i = rx_buffer[0];
но тогда необходимо в строках
- Код: Выделить всё • Развернуть
if(E[1]){R1=1; G1=1; B1=1;}
и др., а также
- Код: Выделить всё • Развернуть
if(counter>R[1])R1=0; if(counter>G[1])G1=0; if(counter>B[1])B1=0;
и др. заменить индекс [1] на [0], [2] на [1] и т.д. В строке
- Код: Выделить всё • Развернуть
if (i <= 4)
можно будет просто убрать знак «равно».
Ну, и совсем для «готичности», вместо этих строк
- Код: Выделить всё • Развернуть
R[1]=0;
G[1]=0;
B[1]=0;
и др. можно сделать так:
- Код: Выделить всё • Развернуть
char R[4] = {0, 0, 0, 0};
и т.д.
Кроме того в строках
- Код: Выделить всё • Развернуть
if(counter>R[1])R1=0; if(counter>G[1])G1=0; if(counter>B[1])B1=0;
ты используешь знак «больше», поэтому контроллер будет выполнять очень много лишних команд (в зависимости от яркости). Достаточно будет и «==».