/* * fbdash.c * * Adapted by Florian Klemenz for use in the fb_dash project * * Source and all credit goes to * http://raspberrycompote.blogspot.com/ * -------------------------------------------------------------------------------------------- * * http://raspberrycompote.blogspot.ie/2014/03/low-level-graphics-on-raspberry-pi-part_14.html * * Original work by J-P Rosti (a.k.a -rst- and 'Raspberry Compote') * * Licensed under the Creative Commons Attribution 3.0 Unported License * (http://creativecommons.org/licenses/by/3.0/deed.en_US) * * Distributed in the hope that this will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * */ #include "fblib.h" #include "fbfonts.h" // 'global' variables to store screen info char *fbp = 0; struct fb_var_screeninfo vinfo; struct fb_fix_screeninfo finfo; #define FONTW 8 #define FONTH 8 // helper function for drawing - no more need to go mess with // the main function when just want to change what to draw... void draw() { clear_screen(fbp); // horizontal spacersint x_space = 10; int y_step_width = vinfo.yres / 4; for (int i = 1; i < 4; i++) { int x0 = 15; int x1 = vinfo.xres - x0; int y = y_step_width * i; int r = 200; int g = 32; int b = 32; draw_line(fbp, x0, y-1, x1, y-1, r, g, b); draw_line(fbp, x0, y , x1, y , r, g, b); draw_line(fbp, x0, y+1, x1, y+1, r, g, b); } char *text = "HUHU!"; int text_length = strlen(text); int i, x, y; // see https://www.geeksforgeeks.org/pointer-array-array-pointer/ //char *fontImg = font8x8_basic; for (i = 0; i < text_length; i++) { // each character int ix = text[i]; //printf("%c --> %d\n", text[i], ix); char *img = font8x8_basic[ix]; // loop through pixel rows (8 rows with 8 pixels/bits or 1 bytes each) for (y = 0; y < FONTH; y++) { // each line // loop through pixel/bit columns char row = img[y]; for (x = 0; x < FONTW; x++) { // each column unsigned char mask = 1 << x; if(row & mask) { printf("x"); // plot the pixel put_pixel(fbp, i * FONTW + x, y, 255, 255, 255); } else { printf(" "); // leave empty (or maybe plot 'text backgr color') } } // end "for x" printf("\n"); } // end "for y" } // end "for i" } // application entry point int main(int argc, char* argv[]) { int fbfd = 0; //struct fb_var_screeninfo orig_vinfo; long int screensize = 0; // Open the framebuffer file for reading and writing fbfd = open("/dev/fb1", O_RDWR); if (fbfd == -1) { printf("Error: cannot open framebuffer device.\n"); return(1); } 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("Variable 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"); } printf("Fixed info: smem_len %d, line_length %d\n", finfo.smem_len, finfo.line_length); // map fb to user mem screensize = finfo.smem_len; fbp = (char*)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fbfd, 0); if ((int)fbp == -1) { printf("Failed to mmap.\n"); } else { // draw... draw(); } // cleanup //clear_screen(fbp); // unmap fb file from memory munmap(fbp, screensize); // close fb file close(fbfd); return 0; }