ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
21 ноября
895593 Топик полностью
Гудвин, волшебник (12.01.2019 17:38, просмотров: 421) ответил Гудвин на Нашел сегодня время, посидел - подобрал всяческие динамические эффекты вдобавок к fade. В общем, мультики никак - имеюшийся под руками Canon ничего не передает. Кина не будеет :) Убог - мигающие огоньки весом 60 Мб... Никаких цветовых переходов и
Вот тестилка - исходник линухового потока (как и планировал, все красоты в апельсинке. Отжирает всего 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 не включен !!!!!!!!! } }