Вот тестилка - исходник линухового потока (как и планировал, все красоты в апельсинке. Отжирает всего 1% у одного ядра проца), в котором все крутится. Можешь прикинуть, как все выглядит ;)
///////////////////////////////////////////////////////////////////////////////////////////////
///////////// Свет
///////////////////////////////////////////////////////////////////////////////////////////////
#define U8 unsigned char
#define U32 unsigned int
U8 hid_buf[65];
U8 tmp_buf[65];
U8 or, og, ob, ow, ovr, ovg, ovb;
void delay_ms(int dl)
{
usleep(1000 * dl);
}
void fillRGBW(U8 R, U8 G, U8 B, U8 W, U8 VR, U8 VG, U8 VB)
{
int i;
char *ptr;
hid_buf[2]=W;
hid_buf[3]=0;
ptr=&hid_buf[4];
for(i=0;i<8;i++)
{
*ptr++ = G;
*ptr++ = R;
*ptr++ = B;
}
for(i=0;i<4;i++)
{
*ptr++ = VG;
*ptr++ = VR;
*ptr++ = VB;
}
}
int send_hid(unsigned char cmd)
{
int res;
if (fdh < 1) return(1);
if (fl_color==0) memset(hid_buf,0,64); ////////////////////////
else if (fl_color==1)
{
memset(hid_buf,0,64);
hid_buf[3]=255;
}
else if (fl_color==2)
{
memset(hid_buf,0,64);
hid_buf[2]=255;
}
else if (fl_color==3)
{
memset(hid_buf,255,64);
}
hid_buf[0] = 0; // для HID!
hid_buf[1] = cmd;
/* Send a Report to the Device */
res = write(fdh, hid_buf, 64);
if (res < 0)
{
// printf("Error!");
close(fdh);
fdh=0;
return(2);
}
return(0);
}
void fade(U8 r, U8 g, U8 b, U8 w, U8 vr, U8 vg, U8 vb, int d)
{
int delay;
int i;
float rb, gb, bb, wb, vrb, vgb, vbb,
dr, dg, db, dw, dvr, dvg, dvb;
rb=or;
gb=og;
bb=ob;
wb=ow;
vrb=ovr;
vgb=ovg;
vbb=ovb;
delay = (10+d/10); // время fade; d - миллисекунды !
dr= (float)(r-or) / delay;
dg= (float)(g-og) / delay;
db= (float)(b-ob) / delay;
dw= (float)(w-ow) / delay;
dvr= (float)(vr-ovr) / delay;
dvg= (float)(vg-ovg) / delay;
dvb= (float)(vb-ovb) / delay;
for(i=0;i<delay;i++)
{
rb+=dr;
gb+=dg;
bb+=db;
wb+=dw;
vrb+=dvr;
vgb+=dvg;
vbb+=dvb;
fillRGBW((rb),(gb),(bb),(wb),(vrb),(vgb),(vbb)) ;
//pthread_mutex_lock(&lock); // Синхронизация. Приостанавливает основной поток
send_hid(0x80);
//pthread_mutex_unlock(&lock);
delay_ms(10); // спим 10 ms
}
or = r;
og = g;
ob = b;
ow = w;
ovr = vr;
ovg = vg;
ovb = vb;
}
void flash(void)
{
int i;
memmove(tmp_buf, hid_buf, sizeof(hid_buf));
memset(hid_buf,0,64);
for(i=0; i<5;i++)
{
hid_buf[2]=0;
hid_buf[3]=255;
send_hid(0x80);
delay_ms(30); // спим 10 ms
hid_buf[2]=255;
hid_buf[3]=0;
send_hid(0x80);
delay_ms(30); // спим 10 ms
}
for(i=0; i<2;i++)
{
fillRGBW(0,0, 0, 0 ,0, 0, 0);
send_hid(0x80);
delay_ms(40); // спим ms
fillRGBW(255,255, 255, 255 ,255, 255, 255);
send_hid(0x80);
delay_ms(70); // спим ms
}
memmove(hid_buf, tmp_buf, sizeof(hid_buf));
send_hid(0x80);
}
void rot(U8 n, U8 k, U8 d)
{
int i;
U8 r,g,b;
memmove(tmp_buf, hid_buf, sizeof(hid_buf));
hid_buf[4]= 0;
hid_buf[5]= 0;
hid_buf[6]= 0;
for(i=0;i<k;i++)
{
memmove(&hid_buf[7],&hid_buf[4], 7*3);
send_hid(0x80);
delay_ms(10*d);
}
for(i=0;i<n*8;i++)
{
r= hid_buf[25];
g= hid_buf[26];
b= hid_buf[27];
memmove(&hid_buf[7],&hid_buf[4], 7*3);
hid_buf[4]= r;
hid_buf[5]= g;
hid_buf[6]= b;
send_hid(0x80);
delay_ms(10*d);
}
memmove(hid_buf, tmp_buf, sizeof(hid_buf));
send_hid(0x80);
}
void rotv(U8 n)
{
int i;
U8 r,g,b;
memmove(tmp_buf, hid_buf, sizeof(hid_buf));
hid_buf[28]= 0;
hid_buf[29]= 0;
hid_buf[30]= 0;
for(i=0;i<1;i++)
{
memmove(&hid_buf[31],&hid_buf[28], 3*3);
send_hid(0x80);
delay_ms(10);
}
for(i=0;i<n*8;i++)
{
r= hid_buf[37];
g= hid_buf[38];
b= hid_buf[39];
memmove(&hid_buf[31],&hid_buf[28], 7*3);
hid_buf[28]= r;
hid_buf[29]= g;
hid_buf[30]= b;
send_hid(0x80);
delay_ms(10+i);
}
memmove(hid_buf, tmp_buf, sizeof(hid_buf));
send_hid(0x80);
}
void rota(U8 n)
{
int i;
U8 r,g,b;
memmove(tmp_buf, hid_buf, sizeof(hid_buf));
hid_buf[28]= 0;
hid_buf[29]= 0;
hid_buf[30]= 0;
for(i=0;i<1;i++)
{
memmove(&hid_buf[31],&hid_buf[28], 3*3);
send_hid(0x80);
delay_ms(10*n);
}
hid_buf[4]= 0;
hid_buf[5]= 0;
hid_buf[6]= 0;
for(i=0;i<3;i++)
{
memmove(&hid_buf[7],&hid_buf[4], 7*3);
send_hid(0x80);
delay_ms(10*n);
}
for(i=0;i<n*8;i++)
{
r= hid_buf[37];
g= hid_buf[38];
b= hid_buf[39];
memmove(&hid_buf[31],&hid_buf[28], 7*3);
hid_buf[28]= r;
hid_buf[29]= g;
hid_buf[30]= b;
r= hid_buf[25];
g= hid_buf[26];
b= hid_buf[27];
memmove(&hid_buf[7],&hid_buf[4], 7*3);
hid_buf[4]= r;
hid_buf[5]= g;
hid_buf[6]= b;
send_hid(0x80);
delay_ms(10*n-i);
}
memmove(hid_buf, tmp_buf, sizeof(hid_buf));
send_hid(0x80);
}
void exchange(U8 n, int d)
{
int i;
U8 r,g,b;
memmove(tmp_buf, hid_buf, sizeof(hid_buf));
for(i=0;i<n;i++)
{
fade(ovr, ovg, ovb, ow , or, og, ob, (d*i));
send_hid(0x80);
fade(or, og, ob, ow , ovr, ovg, ovb, (d*i));
send_hid(0x80);
memmove(hid_buf, tmp_buf, sizeof(hid_buf));
send_hid(0x80);
}
}
///////////////////////////////////////////////////////////
void* Color(void *args) // поток света/лучи поноса ;)
{
U8 cnt =0;
while (1)
{
if (fl_color==4)
{
fade(255, 0, 0, 0 , 0, 0, 0, 3000);
rot(8,4,2);
fade(0, 0, 0, 0 , 0, 0, 255, 1000);
rotv(8);
fade(255, 0, 0, 0 , 0, 255, 0, 1000);
rota(8);
fade(0, 30, 0, 0 , 30, 0, 0, 3000);
fade(255, 0, 255, 0 , 0, 0, 0, 1000);
//exchange(4,100);
exchange(10,0);
fade(0, 0, 0, 0 , 0, 0, 0, 5000);
flash();
fade(0, 0, 0, 255 , 0, 0, 0, 4000);
}
sleep(1); // !!!!!!!!!! Это обязательно, чтобы не жрать, если f_color не включен !!!!!!!!!
}
}
-
- Спасибо! Красиво на загляденье! - De_User(16.01.2019 21:11)
- Вот еще "костер" до-кучи... Гудвин(570 знак., 16.01.2019 21:26)
- красата! как мультики позырил LordN(5 знак., 12.01.2019 20:40)
- Спасибо! Красиво на загляденье! - De_User(16.01.2019 21:11)