From 3f53f337c763a68dcf816acae68a28a4dc6b84bf Mon Sep 17 00:00:00 2001 From: HylkeV Date: Wed, 7 Dec 2016 20:34:08 +0100 Subject: [PATCH 1/3] Moved screen buffer code to seperate file. --- C/Server/Makefile | 15 ++++ C/Server/main.c | 107 ++++++++++++++++++++++++++++ C/Server/screenbuffer.c | 90 ++++++++++++++++++++++++ C/Server/screenbuffer.h | 11 +++ vloed.c | 152 ---------------------------------------- 5 files changed, 223 insertions(+), 152 deletions(-) create mode 100644 C/Server/Makefile create mode 100644 C/Server/main.c create mode 100644 C/Server/screenbuffer.c create mode 100644 C/Server/screenbuffer.h delete mode 100644 vloed.c diff --git a/C/Server/Makefile b/C/Server/Makefile new file mode 100644 index 0000000..d383723 --- /dev/null +++ b/C/Server/Makefile @@ -0,0 +1,15 @@ +SDIR := ./ +IDIR := ./ +CC := gcc + +CFILES := $(foreach dir,$(SDIR),$(wildcard $(dir)/*.c)) +HFILES := $(foreach dir,$(HDIR),$(wildcard $(dir)/*.h)) + +build: + @echo + @echo Compiling and linking files + $(CC) $(CFILES) -I $(IDIR) -o pixelvloed -Wall + @echo Done + @echo + + diff --git a/C/Server/main.c b/C/Server/main.c new file mode 100644 index 0000000..0a26214 --- /dev/null +++ b/C/Server/main.c @@ -0,0 +1,107 @@ +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "screenbuffer.h" + +#define UDP_PORT 5005 // the port users will be connecting to +#define DISCOVER_PORT 5006 // the port on which the server will broadcast its details + +static void die(char *msg) +{ + fprintf(stderr, "%s\n", msg); + exit(EXIT_FAILURE); +} + +static int get_udp_socket(int port) +{ + int sock_fd; + struct sockaddr_in6 addr; + + memset(&addr, 0, sizeof(addr)); + + if ( ( sock_fd = socket(PF_INET6, SOCK_DGRAM,0) ) < 0 ) + die("could not create socket"); + + addr.sin6_port = htons(port); + addr.sin6_family = AF_INET6; + addr.sin6_addr = in6addr_any; + + if ( bind(sock_fd, (struct sockaddr *)&addr, sizeof(addr)) < 0 ) + die("could not bind to UDP"); + + return sock_fd; +} + + +static ssize_t get_udp_packet(int sock_fd, char *packet, size_t size) +{ + ssize_t n_read; + while ((n_read = recv(sock_fd, packet, size, 0)) < 0 ); + return n_read; +} + +// PixelVloed C version + +// application entry point +int main(int argc, char* argv[]) +{ + + + char packet[1120]; + ssize_t packet_size; + + int sock_fd = get_udp_socket(UDP_PORT); + + // Init screen buffer + if (!init_frame_buffer()) { + die("Failed to init screen buffer.\n"); + } + + // draw... + int x, y; + uint8_t r, g, b, a; + int pixeloffset = 2; + 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 +#include +#include +#include +#include +#include +#include +#include + +int fbfd = 0; +struct fb_var_screeninfo orig_vinfo; +struct fb_var_screeninfo vinfo; +struct fb_fix_screeninfo finfo; +long int screensize = 0; +char *fbp = 0; + + +int8_t init_frame_buffer(void) +{ + // Open the file for reading and writing + fbfd = open("/dev/fb0", O_RDWR); + if (!fbfd) { + printf("Error: cannot open framebuffer device.\n"); + return 0; + } + printf("The framebuffer device was opened successfully.\n"); + + // Get variable screen information + if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo)) { + printf("Error reading variable information.\n"); + return 0; + } + printf("Original %dx%d, %dbpp\n", vinfo.xres, vinfo.yres, + vinfo.bits_per_pixel ); + + // Store for reset (copy vinfo to vinfo_orig) + memcpy(&orig_vinfo, &vinfo, sizeof(struct fb_var_screeninfo)); + + // Change variable info + vinfo.bits_per_pixel = 24; + if (ioctl(fbfd, FBIOPUT_VSCREENINFO, &vinfo)) { + printf("Error setting variable information.\n"); + return 0; + } + + // Get fixed screen information + if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo)) { + printf("Error reading fixed information.\n"); + return 0; + } + + // map fb to user mem + screensize = finfo.smem_len; + fbp = (char*)mmap(0, + screensize, + PROT_READ | PROT_WRITE, + MAP_SHARED, + fbfd, + 0); + + if ((long)fbp == -1) { + printf("Error: Failed to mmap.\n"); + return 0; + } + return 1; +} + + +void deinit_frame_buffer(void) +{ + // cleanup + munmap((void *)fbp, screensize); + if (ioctl(fbfd, FBIOPUT_VSCREENINFO, &orig_vinfo)) { + printf("Error re-setting variable information.\n"); + } + close(fbfd); +} + +void write_pixel_to_screen(uint16_t x, uint16_t y, uint16_t r, uint16_t g, uint16_t b, uint8_t a){ + unsigned int pix_offset; + unsigned bpp = vinfo.bits_per_pixel / 8; + if(x < vinfo.xres && y < vinfo.yres){ + pix_offset = bpp * x + y * finfo.line_length; + fbp[pix_offset++] = r; + fbp[pix_offset++] = g; + fbp[pix_offset] = b; + } +} diff --git a/C/Server/screenbuffer.h b/C/Server/screenbuffer.h new file mode 100644 index 0000000..315a5b4 --- /dev/null +++ b/C/Server/screenbuffer.h @@ -0,0 +1,11 @@ +#ifndef _SCREENBUFFER_H +#define _SCREENBUFFER_H +#include + + + +int8_t init_frame_buffer(void); +void deinit_frame_buffer(void); +void write_pixel_to_screen(uint16_t x, uint16_t y, uint16_t r, uint16_t g, uint16_t b, uint8_t a); + +#endif diff --git a/vloed.c b/vloed.c deleted file mode 100644 index 48259fe..0000000 --- a/vloed.c +++ /dev/null @@ -1,152 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#define UDP_PORT 5005 // the port users will be connecting to -#define DISCOVER_PORT 5006 // the port on which the server will broadcast its details - -static void die(char *msg) -{ - fprintf(stderr, "%s\n", msg); - exit(EXIT_FAILURE); -} - -static int get_udp_socket(int port) -{ - int sock_fd; - struct sockaddr_in6 addr; - - memset(&addr, 0, sizeof(addr)); - - if ( ( sock_fd = socket(PF_INET6, SOCK_DGRAM,0) ) < 0 ) - die("could not create socket"); - - addr.sin6_port = htons(port); - addr.sin6_family = AF_INET6; - addr.sin6_addr = in6addr_any; - - if ( bind(sock_fd, (struct sockaddr *)&addr, sizeof(addr)) < 0 ) - die("could not bind to UDP"); - - return sock_fd; -} - - -static ssize_t get_udp_packet(int sock_fd, char *packet, size_t size) -{ - ssize_t n_read; - while ((n_read = recv(sock_fd, packet, size, 0)) < 0 ); - return n_read; -} - -// PixelVloed C version - -// application entry point -int main(int argc, char* argv[]) -{ - int fbfd = 0; - struct fb_var_screeninfo orig_vinfo; - struct fb_var_screeninfo vinfo; - struct fb_fix_screeninfo finfo; - long int screensize = 0; - char *fbp = 0; - - char packet[1120]; - ssize_t packet_size; - - int sock_fd = get_udp_socket(UDP_PORT); - - // Open the file for reading and writing - fbfd = open("/dev/fb0", O_RDWR); - if (!fbfd) { - die("Error: cannot open framebuffer device.\n"); - } - printf("The framebuffer device was opened successfully.\n"); - - // Get variable screen information - if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo)) { - printf("Error reading variable information.\n"); - } - printf("Original %dx%d, %dbpp\n", vinfo.xres, vinfo.yres, - vinfo.bits_per_pixel ); - - // Store for reset (copy vinfo to vinfo_orig) - memcpy(&orig_vinfo, &vinfo, sizeof(struct fb_var_screeninfo)); - - // Change variable info - vinfo.bits_per_pixel = 24; - if (ioctl(fbfd, FBIOPUT_VSCREENINFO, &vinfo)) { - printf("Error setting variable information.\n"); - } - - // Get fixed screen information - if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo)) { - printf("Error reading fixed information.\n"); - } - - // map fb to user mem - screensize = finfo.smem_len; - fbp = (char*)mmap(0, - screensize, - PROT_READ | PROT_WRITE, - MAP_SHARED, - fbfd, - 0); - - if ((long)fbp == -1) { - die("Failed to mmap.\n"); - } - else { - // draw... - int x, y, pixelcount; - unsigned int color = 0; - int pixeloffset = 2; - int pixellength = 0; - unsigned int pix_offset; - unsigned bpp = vinfo.bits_per_pixel / 8; - - 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 Date: Thu, 8 Dec 2016 19:50:30 +0100 Subject: [PATCH 2/3] Added support for different pixelformats. --- C/Server/main.c | 10 ++++------ C/Server/pixelvloed | Bin 0 -> 13895 bytes C/Server/screenbuffer.c | 39 ++++++++++++++++++--------------------- C/Server/screenbuffer.h | 2 +- 4 files changed, 23 insertions(+), 28 deletions(-) create mode 100755 C/Server/pixelvloed diff --git a/C/Server/main.c b/C/Server/main.c index 0a26214..8a6eaa1 100644 --- a/C/Server/main.c +++ b/C/Server/main.c @@ -68,11 +68,9 @@ int main(int argc, char* argv[]) // draw... int x, y; uint8_t r, g, b, a; - int pixeloffset = 2; + 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; @@ -90,11 +88,11 @@ int main(int argc, char* argv[]) i+=pixellength){ x = (uint8_t)packet[i ] + (((uint8_t)packet[i+1])<<8); y = (uint8_t)packet[i+2] + (((uint8_t)packet[i+3])<<8); - r = packet[i+6]; + r = packet[i+4]; g = packet[i+5]; - b = packet[i+4]; + b = packet[i+6]; a = 0; - //printf("%d %d %d %d %d %d\n", x, y, packet[i ], packet[i+1], packet[i+2], packet[i+3]); + //printf("%d %d %d %d %d %d\n", x, y, r, g, b, a); // Write pixel to screen write_pixel_to_screen(x, y, r, g, b, a); } diff --git a/C/Server/pixelvloed b/C/Server/pixelvloed new file mode 100755 index 0000000000000000000000000000000000000000..6ec012e25ebeb31d5886957fe27a582a077ded80 GIT binary patch literal 13895 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 literal 0 HcmV?d00001 diff --git a/C/Server/screenbuffer.c b/C/Server/screenbuffer.c index 1ad7786..c69e14e 100644 --- a/C/Server/screenbuffer.c +++ b/C/Server/screenbuffer.c @@ -10,7 +10,6 @@ #include int fbfd = 0; -struct fb_var_screeninfo orig_vinfo; struct fb_var_screeninfo vinfo; struct fb_fix_screeninfo finfo; long int screensize = 0; @@ -32,19 +31,9 @@ int8_t init_frame_buffer(void) printf("Error reading variable information.\n"); return 0; } - printf("Original %dx%d, %dbpp\n", vinfo.xres, vinfo.yres, + printf("Screen info %dx%d, %dbpp\n", vinfo.xres, vinfo.yres, vinfo.bits_per_pixel ); - // Store for reset (copy vinfo to vinfo_orig) - memcpy(&orig_vinfo, &vinfo, sizeof(struct fb_var_screeninfo)); - - // Change variable info - vinfo.bits_per_pixel = 24; - if (ioctl(fbfd, FBIOPUT_VSCREENINFO, &vinfo)) { - printf("Error setting variable information.\n"); - return 0; - } - // Get fixed screen information if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo)) { printf("Error reading fixed information.\n"); @@ -72,19 +61,27 @@ void deinit_frame_buffer(void) { // cleanup munmap((void *)fbp, screensize); - if (ioctl(fbfd, FBIOPUT_VSCREENINFO, &orig_vinfo)) { - printf("Error re-setting variable information.\n"); - } close(fbfd); } -void write_pixel_to_screen(uint16_t x, uint16_t y, uint16_t r, uint16_t g, uint16_t b, uint8_t a){ - unsigned int pix_offset; - unsigned bpp = vinfo.bits_per_pixel / 8; +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; + 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; - fbp[pix_offset++] = r; - fbp[pix_offset++] = g; - fbp[pix_offset] = b; + for (i=0; i Date: Sat, 18 Feb 2017 01:24:00 +0100 Subject: [PATCH 3/3] 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 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

)_+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; } }