From e26592df1965c8cfc9d24eae692196aec81d573e Mon Sep 17 00:00:00 2001 From: Hylke44 Date: Sat, 18 Feb 2017 01:24:00 +0100 Subject: [PATCH] Modified for use for eth0 --- C/Server/Makefile | 2 +- C/Server/main.c | 133 ++++++++++++++++++++++++++++++---------- C/Server/pixelvloed | Bin 13895 -> 13631 bytes C/Server/screenbuffer.c | 98 +++++++++++++++++++++++------ 4 files changed, 179 insertions(+), 54 deletions(-) diff --git a/C/Server/Makefile b/C/Server/Makefile index d383723..4f0b384 100644 --- a/C/Server/Makefile +++ b/C/Server/Makefile @@ -8,7 +8,7 @@ HFILES := $(foreach dir,$(HDIR),$(wildcard $(dir)/*.h)) build: @echo @echo Compiling and linking files - $(CC) $(CFILES) -I $(IDIR) -o pixelvloed -Wall + $(CC) $(CFILES) -I $(IDIR) -Os -o pixelvloed -Wall @echo Done @echo diff --git a/C/Server/main.c b/C/Server/main.c index 8a6eaa1..a240af3 100644 --- a/C/Server/main.c +++ b/C/Server/main.c @@ -53,10 +53,12 @@ static ssize_t get_udp_packet(int sock_fd, char *packet, size_t size) // application entry point int main(int argc, char* argv[]) { - - - char packet[1120]; + uint8_t packet[1120 + 32]; ssize_t packet_size; + uint16_t x, y; + uint8_t r, g, b, a; + uint8_t pixellength = 0, protocol, version; + uint16_t i; int sock_fd = get_udp_socket(UDP_PORT); @@ -66,36 +68,101 @@ int main(int argc, char* argv[]) } // draw... - int x, y; - uint8_t r, g, b, a; - int pixeloffset = 1; - int pixellength = 0; - - while( (packet_size = get_udp_packet(sock_fd, packet, sizeof(packet))) >= 0 ) { - if((uint8_t)packet[0] == 1){ - pixellength = 8; - } else { - pixellength = 7; - } - - // how many pixels - //pixelcount = (packet_size-1)/pixellength; - //printf("%d pixels in packet of size: %d using a pixel size of: %d \n", pixelcount, packet_size, pixellength); - // fetch a pixel from the udp socket - int i = 0; - for(i=pixeloffset; // skip pixeloffset - i= 0 ) { + + + + // Get protocol from the packet + version = packet[1]; // + protocol = packet[0]; // Alpha in old + + //printf("V:%d, P:%d\n", version, protocol); + + switch (protocol) { + // Protocol 0: xyrgb 16:16:8:8:8 specified for each pixel + case 0: + pixellength = 7; + for (i=2; icYt}a5M!I-8$k&7 zjUYr1j1GYaGlWdu$#~i(k|}`quSM9V$fCWSNxFBBe9rt31~P}Afq{XMfq{Vyq#DFv z5MTm{2{14)m^zh|T7K%5nS7B^g3)*KM<#Jb12Aa{CL_UQ8kj5ulg*PKGK(|DgV>WD zSR@#&KrF@_FewirCo3>ZOpaiYP*h=HU=U=GWLTh(0J4|?WF3eR1Qp*fc_NFVReXFw zQD$CAT6}UwHbZJfW(h-Po>^i_N>O}bUL`|8X-P3dZf;@$LsDj53PXH+8bbBt_bjTD zWmq-qjrB|z+IImB0E$JL@iK(`j3@?fdLe(AVCn`fFv%k`7LWSW4%Z7 z8xD_d*1r-83?8iqN?2c1GcYiCG#}wO4AQ{B@Za>4gaX5V)h`kX4E*vA4F6R@{0xxf z%Lo7e|NpQ0N;L~( zJp~c~IrZfPu!2J%KFCim8^HWsAU?={FAKo@O&~r8$bbYee-((&3E~HU`HMh&E)d@V z%%26~bA$K>VE!Z!p9jQO0NMXvwF@M`3lb3c|Np;7=g$C-Zri023Jkkk1RNOlf&6B8 z;Kh;u|Nrj?v0tqE|Np;Z=uVK63@_~idDSr_G}xo@%?uU>29Mqx6^;~-ZWdJyP)K&R zsC2L}Fc=>2=zRZq^?s1EUUdEc|G)KsW9O0m9`yna3>8NF0<7vF>tw(>-gO>NJMN;w zCEN?5IJg-21zl7GUWkHqRdVf55O8345&r-G{}=i!3=Ay?_Lm7bFqFJCJh`g@WPj&7 zm(J%e!vFpM@6md|qw{dZvxXWK4%YJf{M%eqI2`wa-1}eU=nMe|21ow-?MFQB7Qs@Bs(sF~?p9MmPR#E+QQK+rJ@69OvKu|HTIu28P$|j{IPY z`RjY#|Ns9Fw!Qf%$Y7|w9_$!)pG39WH~Eqq|27{UvK*1a!ocvd^8f$;^)QF@9{BhF zKZpYl1-9M*#@+%Zm)-zYkK{`b@4Iw?JhiRHgrhfr#UuHWOXo5EZ9XC#y#dSzpR+VS z<9BR)@PUDWf%6|Y)Eo~!0IA~N79zso!g(ALCNDlPBSN7527j;nKX?d$LY@&6@{YX$ zEUvvCY_4G2zk!1PQkM%02S3PeNIZyeIQ9lG`zD`+1ViUBkK{|LAj=^x0b9!X4-$P4 zn-4x<;XMAL2xNT|$g3WfH|qI&PyU5^y!j{##LE!xx^(%7KHa<82k^v{M7oV6I7+yC( z902maCr$^1U~#}T$Hqs<4tRv(0I)TkCmlgE}YjLAuOnKUSu&b z)HA#+{r~^J;aktni*X*Ek35>6dbUe@WBh zmu~@;ehfS2D^q2Z#q# zfA9yhN9R+I&dIKvaz-GD|Bs-`8f+Cs6c`vv1w%bLpT4O3|NnpNF;+ei1qQ~?hd~9f zN3(5);N+>C8ufwuPY5_L7#;wZKrb%-0u?HqtT%-f81`QjaA4qXQDbCa*#84mTB!W` z|G(RIpRfXh;elNb6cQNrF}N`>ywC;f*{>n!z`)=7gMop;rJMDjumVFj?{Z-UhJ8MQ z4h-F*Ge8D{%00saFMPn}l!48u-_@X)z_5=AWYE)}Aj|isfeqTgz`)SWS|zN&(ELN8 zgtPgF1b^!U1_p*^+d^Rl1`ht#W-uo~Sb;&Hw5r)Q9VA*>*lZgGW@I$mCW0C9&9))J zpr8nAwv7fee4B0kzzmoD?Sl0V3@`kC{{P=?xCk_Aa1i5w>sLJX5 z;L*u?P)LE{g~?A)$?1l$i4R0IXcIDqzf6{Rm zsJXzu{kE&-DgJGjT=}=(=HGUbfBOMf{%r>w`PbiaJo3o0#;sh{u@Q8VIiwc8`>0n`sK8(m^{PGNw z0|Z25E%+1|LOptQL3FT>=2OGl9tZz2gIX^y{(hU>C=fjPhJevz0YL>T28LH0kTz*D zCxm_lrIWcJ{D)9F5!&k2Pf0D)PfIeGY%i!WIYTf+GB~*?H8oEmGcPS)K{cg9HAP23 zH6^K_fNS!9K_zdfY*J}jT56F(ZhlItLT0f-acMz8eo;wkiXMY&P>_F+l>&BkdHE#> zwUgzAB!d|krJ1b*K(z(~1B1%f|NrMOFffRG`~Uw40|SHAxBvg|fQpY_|NrMOFfe@l z_5VK)BLjo$pa1`L7#SE+|NQ^&!pOjI0n2-`v&(F!Pg!I@N zzWo3HfnlNFnE0Z|6dJcs0$yst*OJnz!1a0z!3KJ|Nmp4eB;C?(97h< zC(*;~$fwZ8;>f4b%<9f}0My6=X#=%WdKefO?*9D$KLnK79Qg#8gBbZhjWUot$euNz zHudlS{}n(2j(h@9d>mQ~AdMhjN&f!-KMABUnNOgZiP?_vFhs8l0|Ubo1_p+V$%Z1% zoFM;A`1Aii)8cz}c*cmy8|CB~ zS53YsXU`ZgSx{bHZ~-es9jM6$QWr7VQC^=>V{)OqJR{TOiSq5DGsLrQ4wNG$_3cN^fI#m@KTII(dc`&*TS;ESond%wS@iG1*gDUoe6NVnqa~@yo!# zuxj!{ZQ;ptlw|~&pw43gwSpNK7?dWTRMzLzfQo8NW>hifjDYeYCOfK_!#%VBsv}@> zr;0uoEI2-}O+KVzCL{oLlK|A)9~dTcsp<(aK(hw}G`fs9CVQ#saheD~oM$q*QPo_~ z0m^d#ClCgP)ss)E>I=epd9dDJ$Yf46eL)8yh)xF~P}njslx+4?t7l~Fn0!)QpR)tn z=jfQss9`P$>v_!pCkqA!gUOy6=8Q8YH)_~39-e$q!(KE%6Jm%1)OE593=H~{MK!g# zCKy6w)-zA`(%i-vF_}?IoRMj=p_V8!2ZP3BLoIQ}2r!R}VZr1?EpbU$a6q&{NM;5e z27$>FwZtXi!2po}lgtc!3?`EgYKb#COg^Y3DlNbO^D$T&N-#4BGB`~Bs3kgCPJ0q# z$K;LL;*&RMi%q_#ttAO^H4_6b1I%=AHe+C5;FF4WaGd;?-K2r)>=LHe3tE&~I@U$8Dw1`RZE zw#gTD#Z4s{LH&Di1_r3hV7l}f85o2Zco{&gE07qdF9M?NLE@7yG77T>GBPkIfLOA* zAQpoJ11tf7)PZmXOl^G^Blhn6VyHN%p###f07Nh_FsuaWWZ-4E3k^qb(Z#^Pu$vLo zzm{MCwZouF!PFtBIiPk9NB~qugXj|waXp3;Q15{v9VBrXYylqwEGvP;K=>v|9ONn1 z*KpQ97>iMGa-hDnrvMhO+A={rcmT~FN2vG(s5rDhVQ^!D23~zANClGw!vv@bkSjnq z2_(+I&j8EbFr9@=kcbK7gCqiQ;mp9m&<+&`wSz(WQ$Yj+1H*JCP>@M7Tu?+!7IPr# zwHRO{N>KF-i=i6O!+8DVKz(t^!w_u@pmsJ$2e=YqU|=`_l4X1ZCcl74RyJm+7bT^b zAx<`gIvHA`Fz8KAG!&O~U}j(tWWtP7ACN3-I?NQqMzAT|4CrM=J4io+Bm->71Qx}! zCo39BaOEau=IJFfq-3T}wlLZ;S<<*~@+RXB7SOQJJb46F);LqOuVJXwSWo2Yhaly#Mq{oAOzti z2to9~=oE-BL(1fxjHhkPqIU5l1!!?AFODA;Aag*P85tND*g&d53rYnDVVV4eNrbT!BsTei5`-56 z;xT4|$r>5{j}63=Dz{k_-nF5rx&;uG^K845~EiW%bLi%Sxdv*VL9 zvg6YdGjkYna}x^~a#M4QQ%e|X}H%H#y8SUx$BRoIXRWDFF; zyu!-BzyJzUs4&9?s24%v!keeEMl;rTK!w;D7#R3r>KGUpCLoE!LIfl|14&#EBml)8 z&2Kn7x>;i-6c{{O50tRJIL*Mo;L&`9<1j?Qf72id1&05sArcA<{PGSA|5ZW!jCzpl z%Lo7e|NpP*C85BO0ZIukFM#<@AU-ImygUHrTY>n@3=9k}H-Py@AU+F-zW~hF0`Wm! zdpQBjR|4@t$?IhUm@ft5gZ%lj0L&MXP++Lf-~btr02bf^Dc}V01HgPH5T6UgcL4K$ zi7PNaW4l5EL#T)D289F$kLDkI9-U9inPLy`00k*14!*?h2TA>Zz%Snb659dd!PFo8 z!R*ob)MIiAkGv5`{Qo1Uss`IcaRmm3Qo&G<&ZjTx{{R0UdyLgjT!De{^I=fLc{JO0 zh)mwfqfrl1;L-d>z@xMFhetOngSY~NM|bFteK$bP?K}>4$BU|e|Nrj?Me2(K|Nj36 zX$kgdeiPAIyC%h>n?+Rvlu9~XUl<U&*!qj(`Khi_-u9|988t;op9s^Z1L^fB*ka>vTPocHH#< z7lTJPYm^wsS)$P(s?+s^M`!2-k6zyc-L8AUws~}(>pcE~_22*htp_T(_J08xr~)={ zk4JaxixdxI8L%TuSYH_Y{r}&i`A9@`>|u~U>OGp@7 zgH3(u!pOj|KLaFI@azBoZq_Pc1%_P<6cZTsF}N`>z%u8SU!Y`PBC>x5NTnNGHybDw z@XCoOFm#KufJoL~!U_zX$M)}myCU*eJt%jAOavLb1JqFP=)CUHdGNEx(r#96xP6RB z_PN6By8*KA`cIf^r!z1xbhBO;QefESpp?L{j|oYSAViPgeg+{2h8K%rdS0j1ce8?A z*m=OClXa;O$f?tXKv|u2hL8e-BRC5>c3#*C${f2uwT4IMvHhU@@uJ};D9f={LR1%l zsOBI4O9l5Uf^2Yt+rYX5q!*IeJ-S&PK?*w$d33YdgIV?0K!wzipP=BC138@m6d1_f zjra);UatKXAcJ510IB>UsKC&9{Dtq&|No&TH@|V{JmJ!LGOe@rPFiQ_jgHVO9j+H# zI$Y0m_?|#66Mh&T=w|H^QeZgvg1N)>bv^&~&^z6%DMAVimWTM8zkn+6?V&fiS;L?r zj~Eyjj=O#U`MEpv1OK+tE8VP7LJAB!L1lsF!Ojz%2QRYH@aD?g%lY0 z*B@lO(CPZ-nCmNs*E$~EqR#{r82GpOzUp>;!+4_efCu9t{%x+WKv~^|^+N{}h|_$4 zvBUKhzrr@xS5~gCi%x@z)f5k7NM%yO`eMrW|Nl=OPMa|K0KbUr3SI?

)_+5FPBJ z`PA^X$HBkMpw`L@-tUt?@&|*G#$;y!V^G6^fnjo~fFi$sN@|&YT9N@M@5Bg^K`|Nk9~3=C8M{Qtj#k%8gE-~azlFfuSC{QLi3094;HOtuqJVtVm) za*~i<{fsXVV;J}Z-1sEC__@nD8W`-QthJ0)ltA7B)!Qx%3=Fm3{{J@y2{`fzv@tpJ zf?8i7t_lMK1IWn}zWx7y93%jfcWq{7+RMWZN|7L8kU2dJ3=I0;|NplJ2|(1<^Rkse z6oCv{!@$7c_5J^U4UjV-3V7K(nwgoUnIMW77#KhXT>+{4`Tu_tC>z7nG1oGJ6oKSH zIcCkT|NkQq7V)w%g@B~N`b8KS7@mUU8KoH*7~lqkfDHio)`St%vxpRSX02glVDQ+y zPWHCvXq>f-~@IE7t|~S*>hxapjzwl)I;!{*6_%KCyK zPzQ%VG7f{rJt0`{^a3=cd}5z$q^iexL;&KnBa<^#%>^$&c^5!UY6b>|{>d9v z^#x(wQdoC2W%5T=eZdpZPU{J1|LDkOL$!KFP{gR~b1r~(au!T}sctR^>rHJ?07VP~ z!-dI)8s>}}CTD8cGv1!OQo~*}LlY_kbseZnX*l_>hBlXl5k!WcWwMdxHc41eLIfcs zGXpzA$Ye$>amI$pj9Q}1oD3T#8)}I&{s8m18753_R1jumX5eAi0A=wqT$nsjOPuk@ z7+`q=BnZMY!5V}Z1kg0>nEX&j+!It=gPgS&YCX7MVPIeY^(aB&AE4sk z0)>Hr;S$6ehV5LCL;)^97#J8Hf=rw2pu{ryj<$#-s6J$55M<~Ofv5tx1BCy9f@rdX zu7oES*grxT-jHSld0Ui01I@K6Q1$4(FrU0oS6tGU5!46gWdQZ%K=yzNEf5_$`J%44 zY(67o@B!3z0EsRD5ey6rRp6rKBBQY6G!TnHf&rE$p$Zrlg7nvKhU$l%inh5GlEV z3E~`dPwxfE8eU?81lk8QyRSjTA3(*Sf5F-XEkkYLgM8>D{nMMjay za}2j@;OGzSOR5Sa-BsC|UsgNDq&BXOugkl{5{F~}I) @@ -16,8 +23,7 @@ long int screensize = 0; char *fbp = 0; -int8_t init_frame_buffer(void) -{ +int8_t init_frame_buffer(void) { // Open the file for reading and writing fbfd = open("/dev/fb0", O_RDWR); if (!fbfd) { @@ -31,16 +37,27 @@ int8_t init_frame_buffer(void) printf("Error reading variable information.\n"); return 0; } - printf("Screen info %dx%d, %dbpp\n", vinfo.xres, vinfo.yres, - vinfo.bits_per_pixel ); + printf("Screen info %dx%d, %dbpp\n", vinfo.xres, vinfo.yres, vinfo.bits_per_pixel ); // Get fixed screen information if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo)) { printf("Error reading fixed information.\n"); return 0; } + + // Check if the framebuffer mode is supported + if ((vinfo.bits_per_pixel == 24 || vinfo.bits_per_pixel == 32) && + vinfo.red.length == 8 && vinfo.red.offset == 16 && + vinfo.green.length == 8 && vinfo.green.offset == 8 && + vinfo.blue.length == 8 && vinfo.blue.offset == 0 && + vinfo.transp.length == 0 && vinfo.transp.offset == 0) { + printf("Screen buffer mode is supported.\n"); + } else { + printf("ERROR: Screen buffer mode is not supported.\n"); + return 0; + } - // map fb to user mem + // Map fb to user mem screensize = finfo.smem_len; fbp = (char*)mmap(0, screensize, @@ -66,22 +83,63 @@ void deinit_frame_buffer(void) void write_pixel_to_screen(uint16_t x, uint16_t y, uint8_t r, uint8_t g, uint8_t b, uint8_t a){ uint32_t pix_offset; - uint8_t bpp = vinfo.bits_per_pixel / 8; - union { - uint32_t pixel32; - uint8_t pixel8[4]; - } pixel; - uint8_t i; + uint16_t temp_r, temp_g, temp_b; - if(x < vinfo.xres && y < vinfo.yres){ - pixel.pixel32 = 0; - pixel.pixel32 |= ((uint32_t)r >> (8 - vinfo.red.length)) << vinfo.red.offset; - pixel.pixel32 |= ((uint32_t)g >> (8 - vinfo.green.length)) << vinfo.green.offset; - pixel.pixel32 |= ((uint32_t)b >> (8 - vinfo.blue.length)) << vinfo.blue.offset; - - pix_offset = bpp * x + y * finfo.line_length; - for (i=0; i= vinfo.xres || y >= vinfo.yres) { + return; + } + + //pix_offset = byte_pp * x + y * finfo.line_length; + + // If alpha is used calculate it, otherwise just paint the colors + if (a != 0xFF) { + + // Get the old pixel + if (vinfo.bits_per_pixel == 24) { + // 24bpp format + pix_offset = 3 * x + y * finfo.line_length; + temp_r = fbp[pix_offset+0]; + temp_g = fbp[pix_offset+1]; + temp_b = fbp[pix_offset+2]; + } else if (vinfo.bits_per_pixel == 32) { + // 32bpp format + pix_offset = 4 * x + y * finfo.line_length; + temp_r = fbp[pix_offset+0]; + temp_g = fbp[pix_offset+1]; + temp_b = fbp[pix_offset+2]; + } else { + temp_r = 0; + temp_g = 0; + temp_b = 0; } + //printf("%08x : %04x %04x %04x\n", pixel.pixel32, temp_r, temp_g, temp_b); + // Aply alpha + temp_r = (temp_r * (256-a))>>8; + temp_r = temp_r + ((r * (a))>>8); + temp_g = (temp_g * (256-a))>>8; + temp_g = temp_g + ((g * (a))>>8); + temp_b = (temp_b * (256-a))>>8; + temp_b = temp_b + ((b * (a))>>8); + } else { + temp_r = r; + temp_g = g; + temp_b = b; + } + + // Write new pixels to buffer + if (vinfo.bits_per_pixel == 24) { + // 24bpp format + pix_offset = 3 * x + y * finfo.line_length; + fbp[pix_offset+2] = temp_r; + fbp[pix_offset+1] = temp_g; + fbp[pix_offset+0] = temp_b; + } + if (vinfo.bits_per_pixel == 32) { + // 32bpp format + pix_offset = 4 * x + y * finfo.line_length; + fbp[pix_offset+2] = temp_r; + fbp[pix_offset+1] = temp_g; + fbp[pix_offset+0] = temp_b; } }