fb-dash/fbdash.c

154 lines
3.9 KiB
C

/*
* 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;
}