@@ -0,0 +1,34 @@ | |||
#include <stdio.h> | |||
#include <stdlib.h> | |||
#include <time.h> | |||
#include <unistd.h> | |||
#include <wiringPi.h> | |||
#include "spilcd.h" | |||
#include "spilcd_gfx.h" | |||
#include "base.h" | |||
inline uint8 random_color_r(int seed) { return seed % (256 / 7) * 7; } | |||
inline uint8 random_color_g(int seed) { return seed % (256 / 13) * 13; } | |||
inline uint8 random_color_b(int seed) { return seed % (256 / 23) * 23; } | |||
lcd_t* demo_init() | |||
{ | |||
setbuf(stdout, NULL); | |||
srand(time(NULL)); | |||
wiringPiSetup(); | |||
return lcd_init(40000000, 1, 10, 7, 8); | |||
} | |||
void demo_deinit(lcd_t* lcd) | |||
{ | |||
printf("...waiting 2 seconds before shutdown...\n"); | |||
sleep(2); | |||
printf("Terminating...\n"); | |||
lcd_fillScreen(lcd, 0, 0, 0); | |||
lcd_deinit(lcd); | |||
printf("DONE\n"); | |||
} | |||
@@ -0,0 +1,14 @@ | |||
#include <stdio.h> | |||
#include <stdlib.h> | |||
#include <time.h> | |||
#include <unistd.h> | |||
#include <wiringPi.h> | |||
#include "spilcd.h" | |||
uint8 random_color_r(int seed); | |||
uint8 random_color_g(int seed); | |||
uint8 random_color_b(int seed); | |||
lcd_t* demo_init(); | |||
void demo_deinit(lcd_t* lcd); | |||
@@ -0,0 +1,56 @@ | |||
#include "base.h" | |||
#include "spilcd_gfx.h" | |||
int main(int argc, char *argv[]) | |||
{ | |||
lcd_t* lcd = demo_init(); | |||
printf("Fill display..."); | |||
printf("blue..."); | |||
lcd_fillScreen(lcd, 0, 70, 160); | |||
lcd_redrawBuffer(lcd); | |||
printf("...waiting 1 second..."); | |||
sleep(1); | |||
printf("black..."); | |||
lcd_fillScreen(lcd, 0, 0, 0); | |||
lcd_redrawBuffer(lcd); | |||
printf("DONE\n"); | |||
printf("...waiting 1 second...\n"); | |||
sleep(1); | |||
printf("Points..."); | |||
for (int i = 1; i < 2000; i++) { | |||
int r = rand(); | |||
lcd_drawPixel(lcd, r % 128, i % 160, | |||
random_color_r(i), | |||
random_color_g(i), | |||
random_color_b(i)); | |||
} | |||
lcd_redrawBuffer(lcd); | |||
printf("DONE\n"); | |||
printf("...waiting 1 second...\n"); | |||
sleep(1); | |||
printf("Regions..."); | |||
int w = 15; | |||
int h = 20; | |||
for (int i = 1; i < 100; i++) { | |||
int x = rand() % (128 - w); | |||
int y = rand() % (160 - h); | |||
lcd_setWindow(lcd, x, y, x + w - 1, y + h - 1); | |||
uint8 r = rand(); | |||
uint8 g = rand(); | |||
uint8 b = rand(); | |||
for (int p = 0; p < w*h; p++) { | |||
lcd_pushPixel(lcd, r * p / (w*h), g * (w*h-p) / (w*h), b); | |||
} | |||
lcd_redrawBuffer(lcd); | |||
} | |||
printf("DONE\n"); | |||
demo_deinit(lcd); | |||
return 0; | |||
} | |||
@@ -3,7 +3,6 @@ | |||
#include <stdio.h> | |||
#include <stdlib.h> | |||
#include <unistd.h> | |||
#include <linux/i2c-dev.h> | |||
#include <sys/ioctl.h> | |||
#include <sys/types.h> | |||
#include <sys/stat.h> | |||
@@ -18,9 +17,9 @@ | |||
#include <linux/if_link.h> | |||
#include <signal.h> | |||
//#include "ssd1306.h" | |||
#include "spilcd_gfx.h" | |||
#include "spilcd_font.h" | |||
#include "base.h" | |||
#define NI_MAXHOST 1025 | |||
@@ -29,8 +28,6 @@ | |||
volatile sig_atomic_t done = 0; | |||
struct sigaction action; | |||
//extern FONT_INFO *_font; | |||
/** | |||
* | |||
* @return | |||
@@ -117,39 +114,80 @@ int main(int argc, char** argv) { | |||
perror("Error: cannot handle SIGTERM"); // Should not happen | |||
} | |||
wiringPiSetup(); | |||
lcd_t* lcd = lcd_init(40000000, 1, 10, 7, 8); | |||
lcd_t* lcd = demo_init(); | |||
int rowy = 10; | |||
while (done == 0) { | |||
row = 2; | |||
//_font = (FONT_INFO*)&ubuntuMono_8ptFontInfo; | |||
/* Display time */ | |||
row = 0; | |||
// Date and Time | |||
mytime = time(NULL); | |||
tm = localtime (&mytime); | |||
//ssd1306ClearScreen(LAYER0 | LAYER1) ; | |||
lcd_fillScreen(lcd, 0, 0, 0); | |||
strftime(time_buffer, 80," %H:%M:%S %x", tm); | |||
//ssd1306DrawString(0, row * 8, time_buffer, 1, WHITE, LAYER0); | |||
lcd_drawText(lcd, 0, row * 8, time_buffer, 255, 255, 255); | |||
strftime(time_buffer, 80," %H:%M:%S", tm); | |||
lcd_drawText(lcd, 0, row * rowy, time_buffer, 255, 255, 255); | |||
row++; | |||
strftime(time_buffer, 80," %x", tm); | |||
lcd_drawText(lcd, 0, row * rowy, time_buffer, 200, 200, 200); | |||
row++; | |||
row++; | |||
/* Display IP */ | |||
/* Get network information */ | |||
// CPU | |||
float c = GetCPULoad() ; | |||
lcd_drawText(lcd, 0, row * rowy, "CPU load:", 255, 255, 100); | |||
row++; | |||
snprintf(text_buffer, sizeof(text_buffer), " %0.2f", c); | |||
printf("CPU load avg: %s\n", text_buffer); | |||
if (c < 0.2) { | |||
lcd_drawText(lcd, 0, row * rowy, text_buffer, 50, 255, 50); | |||
} else if (c < 0.5) { | |||
lcd_drawText(lcd, 0, row * rowy, text_buffer, 255, 255, 50); | |||
} else { | |||
lcd_drawText(lcd, 0, row * rowy, text_buffer, 255, 50, 50); | |||
} | |||
row++; | |||
/* Memory usage */ | |||
float m = GetMemUsage(); | |||
snprintf(text_buffer, sizeof(text_buffer), " %3.0f%%", m*100); | |||
printf("Mem used: %s\n", text_buffer); | |||
lcd_drawText(lcd, 0, row * rowy, "Mem used:", 150, 150, 255); | |||
row++; | |||
lcd_drawText(lcd, 0, row * rowy, text_buffer, 255, 255, 255); | |||
//ssd1306DrawRect(0, 0, 127, 13, INVERSE, LAYER0); | |||
//ssd1306FillRect(2, 2, (int)(123 * m), 9, INVERSE, LAYER0); | |||
row++; | |||
/* CPU temperature */ | |||
int t = GetCPUTemp() ; | |||
snprintf ( text_buffer, sizeof(text_buffer), "%3d C", t ); | |||
printf("CPU temp: %s\n", text_buffer); | |||
lcd_drawText(lcd, 0, row * rowy, "CPU temp:", 255, 180, 170); | |||
row++; | |||
if (t < 20) { | |||
lcd_drawText(lcd, 0, row * rowy, text_buffer, 150, 150, 255); | |||
} else if (t < 25) { | |||
lcd_drawText(lcd, 0, row * rowy, text_buffer, 150, 255, 150); | |||
} else if (t < 30) { | |||
lcd_drawText(lcd, 0, row * rowy, text_buffer, 255, 255, 100); | |||
} else if (t < 35) { | |||
lcd_drawText(lcd, 0, row * rowy, text_buffer, 255, 120, 100); | |||
} else { | |||
lcd_drawText(lcd, 0, row * rowy, text_buffer, 255, 80, 20); | |||
} | |||
row++; | |||
// Network devices and IPs | |||
if (getifaddrs(&ifaddr) == -1) | |||
{ | |||
perror("getifaddrs"); | |||
exit(EXIT_FAILURE); | |||
} | |||
/* Walk through linked list, maintaining head pointer so we | |||
can free list later */ | |||
for (ifa = ifaddr, n = 0; ifa != NULL; ifa = ifa->ifa_next, n++) { | |||
if (ifa->ifa_addr == NULL) | |||
continue; | |||
family = ifa->ifa_addr->sa_family; | |||
/* Display interface name and family (including symbolic | |||
form of the latter for the common families) */ | |||
if ((strncmp ("eth", ifa->ifa_name, 3 ) == 0) && family == AF_INET) { | |||
s = getnameinfo(ifa->ifa_addr, | |||
(ifa->ifa_addr->sa_family == AF_INET) ? sizeof(struct sockaddr_in) : | |||
@@ -161,9 +199,11 @@ int main(int argc, char** argv) { | |||
exit(EXIT_FAILURE); | |||
} | |||
printf("%-8s <%s>\n", ifa->ifa_name, host); | |||
snprintf ( text_buffer, sizeof(text_buffer), "%s: %s",ifa->ifa_name, host ); | |||
//ssd1306DrawString(0, row * 8, text_buffer, 1, WHITE, LAYER0); | |||
lcd_drawText(lcd, 0, row * 8, text_buffer, 255, 255, 255); | |||
snprintf ( text_buffer, sizeof(text_buffer), "%s:", ifa->ifa_name); | |||
lcd_drawText(lcd, 0, row * rowy, text_buffer, 200, 200, 255); | |||
row++; | |||
snprintf ( text_buffer, sizeof(text_buffer), " %s", host ); | |||
lcd_drawText(lcd, 0, row * rowy, text_buffer, 200, 255, 200); | |||
row++; | |||
} | |||
if ((strncmp ("wlan", ifa->ifa_name, 4 ) == 0) && family == AF_INET) { | |||
@@ -177,53 +217,21 @@ int main(int argc, char** argv) { | |||
exit(EXIT_FAILURE); | |||
} | |||
printf("%-8s <%s>\n", ifa->ifa_name, host); | |||
snprintf ( text_buffer, sizeof(text_buffer), "%s: %s",ifa->ifa_name, host ); | |||
//ssd1306DrawString(0, row * 8, text_buffer, 1, WHITE, LAYER0); | |||
lcd_drawText(lcd, 0, row * 8, text_buffer, 255, 255, 255); | |||
snprintf ( text_buffer, sizeof(text_buffer), "%s:",ifa->ifa_name); | |||
lcd_drawText(lcd, 0, row * rowy, text_buffer, 255, 200, 200); | |||
row++; | |||
snprintf ( text_buffer, sizeof(text_buffer), " %s", host ); | |||
lcd_drawText(lcd, 0, row * rowy, text_buffer, 200, 255, 200); | |||
row++; | |||
} | |||
} | |||
freeifaddrs(ifaddr); | |||
/* CPU usage | |||
* | |||
*/ | |||
float c = GetCPULoad() ; | |||
snprintf ( text_buffer, sizeof(text_buffer), "CPU loadavg: %0.2f", c ); | |||
printf("%s\n", text_buffer); | |||
//ssd1306DrawString(0, row * 8, text_buffer, 1, WHITE, LAYER0); | |||
lcd_drawText(lcd, 0, row * 8, text_buffer, 255, 255, 255); | |||
row++; | |||
/* Memory usage */ | |||
float m = GetMemUsage(); | |||
snprintf ( text_buffer, sizeof(text_buffer), "Mem used: %3.0f%%", m*100 ); | |||
printf("%s\n", text_buffer); | |||
//ssd1306DrawString(4, 2, text_buffer, 1, WHITE, LAYER0); | |||
lcd_drawText(lcd, 4, 2, text_buffer, 255, 255, 255); | |||
//ssd1306DrawRect(0, 0, 127, 13, INVERSE, LAYER0); | |||
//ssd1306FillRect(2, 2, (int)(123 * m), 9, INVERSE, LAYER0); | |||
/* CPU temperature */ | |||
int t = GetCPUTemp() ; | |||
snprintf ( text_buffer, sizeof(text_buffer), "CPU temp: %3d C", t ); | |||
printf("%s\n", text_buffer); | |||
//ssd1306DrawString(0, row * 8, text_buffer, 1, WHITE, LAYER0); | |||
lcd_drawText(lcd, 0, row * 8, text_buffer, 255, 255, 255); | |||
row++; | |||
/* Refresh screen */ | |||
//ssd1306Refresh(); | |||
//SSD1306MSDELAY(1000); | |||
lcd_redrawBuffer(lcd); | |||
sleep(1); | |||
} | |||
//_font = (FONT_INFO*)&ubuntuMono_24ptFontInfo; | |||
//ssd1306ClearScreen(LAYER0 | LAYER1) ; | |||
//ssd1306Refresh(); | |||
printf("All done!\r\n"); | |||
return (EXIT_SUCCESS); | |||
demo_deinit(lcd); | |||
} | |||
@@ -0,0 +1,53 @@ | |||
#include "base.h" | |||
#include "spilcd_gfx.h" | |||
#include "spilcd_font.h" | |||
#include "img_green_screen.h" | |||
#define ABS(x) ((x) < 0 ? -(x) : (x)) | |||
#define GLOW (((i + row) % 6)*8) | |||
void draw_background(lcd_t* lcd, uint8 lightness) | |||
{ | |||
lcd_setWindow(lcd, 0, 0, lcd->width-1, lcd->height-1); | |||
char* img = header_data; | |||
for (int i = 0; i < lcd->width * lcd->height; i++) { | |||
uint8 pixel[3]; | |||
HEADER_PIXEL(img, pixel) | |||
lcd_pushPixel(lcd, pixel[0] * (int)lightness / 255, pixel[1] * (int)lightness / 255, pixel[2] * (int)lightness / 255); | |||
} | |||
} | |||
int main(int argc, char *argv[]) | |||
{ | |||
lcd_t* lcd = demo_init(); | |||
for (int p = 0; p < 20; p++) { | |||
draw_background(lcd, p * 200 / 20); | |||
lcd_redrawBuffer(lcd); | |||
} | |||
int rowy = 9; | |||
for (int i = 0; i < 100; i++) { | |||
draw_background(lcd, 200 - ABS(4 - (i%8)) * 6); | |||
int shift_x = ABS(4 - (i%8)) / 4; | |||
int shift_y = ABS(5 - (i%10)) / 4; | |||
int row = 2; | |||
lcd_drawText(lcd, 12 + shift_x, row*rowy + shift_y, "SPI Term v1.8", 0, 220-GLOW, 0); | |||
row++; | |||
row++; | |||
lcd_drawText(lcd, 8 + shift_x, row*rowy + shift_y, "#/> dir", 0, 220-GLOW, 0); | |||
row++; | |||
lcd_drawText(lcd, 8 + shift_x, row*rowy + shift_y, " a.out", 0, 220-GLOW, 0); | |||
row++; | |||
lcd_drawText(lcd, 8 + shift_x, row*rowy + shift_y, " db.txt", 0, 220-GLOW, 0); | |||
row++; | |||
lcd_drawText(lcd, 8 + shift_x, row*rowy + shift_y, "#/>", 0, 220-GLOW, 0); | |||
lcd_redrawBuffer(lcd); | |||
usleep(1000); | |||
} | |||
demo_deinit(lcd); | |||
return 0; | |||
} | |||
@@ -1,116 +0,0 @@ | |||
#include <stdio.h> | |||
#include <stdlib.h> | |||
#include <time.h> | |||
#include <unistd.h> | |||
#include <wiringPi.h> | |||
#include "spilcd.h" | |||
#include "spilcd_gfx.h" | |||
#include "spilcd_font.h" | |||
uint8 random_color_r(int seed); | |||
uint8 random_color_g(int seed); | |||
uint8 random_color_b(int seed); | |||
inline uint8 random_color_r(int seed) { return seed % (256 / 7) * 7; } | |||
inline uint8 random_color_g(int seed) { return seed % (256 / 13) * 13; } | |||
inline uint8 random_color_b(int seed) { return seed % (256 / 23) * 23; } | |||
int main(int argc, char *argv[]) | |||
{ | |||
setbuf(stdout, NULL); | |||
srand(time(NULL)); | |||
wiringPiSetup(); | |||
lcd_t* lcd = lcd_init(40000000, 1, 10, 7, 8); | |||
printf("Fill display..."); | |||
printf("blue..."); | |||
lcd_fillScreen(lcd, 0, 70, 160); | |||
lcd_redrawBuffer(lcd); | |||
printf("...waiting 1 second..."); | |||
sleep(1); | |||
printf("black..."); | |||
lcd_fillScreen(lcd, 0, 0, 0); | |||
lcd_redrawBuffer(lcd); | |||
printf("DONE\n"); | |||
printf("...waiting 1 second...\n"); | |||
sleep(1); | |||
printf("Points..."); | |||
for (int i = 1; i < 2000; i++) { | |||
int r = rand(); | |||
lcd_drawPixel(lcd, r % 128, i % 160, | |||
random_color_r(i), | |||
random_color_g(i), | |||
random_color_b(i)); | |||
} | |||
lcd_redrawBuffer(lcd); | |||
printf("DONE\n"); | |||
printf("...waiting 1 second...\n"); | |||
sleep(1); | |||
printf("Regions..."); | |||
int w = 15; | |||
int h = 20; | |||
for (int i = 1; i < 200; i++) { | |||
int x = rand() % (128 - w); | |||
int y = rand() % (160 - h); | |||
lcd_setWindow(lcd, x, y, x + w - 1, y + h - 1); | |||
uint8 r = rand(); | |||
uint8 g = rand(); | |||
uint8 b = rand(); | |||
for (int p = 0; p < w*h; p++) { | |||
lcd_pushPixel(lcd, r * p / (w*h), g * (w*h-p) / (w*h), b); | |||
} | |||
lcd_redrawBuffer(lcd); | |||
} | |||
printf("DONE\n"); | |||
return 0; | |||
printf("...waiting 1 second...\n"); | |||
sleep(1); | |||
printf("Rectangles..."); | |||
lcd_fillScreen(lcd, 0, 0, 0); | |||
lcd_fillRect(lcd, 30, 10, 10, 10, 0, 255, 255); | |||
lcd_fillRect(lcd, 30, 30, 10, 10, 255, 255, 0); | |||
lcd_redrawBuffer(lcd); | |||
printf("DONE\n"); | |||
printf("...waiting 1 second...\n"); | |||
sleep(1); | |||
printf("Text..."); | |||
lcd_fillScreen(lcd, 0, 0, 0); | |||
lcd_drawChar(lcd, 10, 90, 'A', 255, 0, 0); | |||
lcd_drawText(lcd, 10, 50, "Hello, world!", 0, 255, 0); | |||
lcd_drawChar(lcd, 10, 100, 'Z', 0, 0, 255); | |||
lcd_redrawBuffer(lcd); | |||
printf("DONE\n"); | |||
printf("...waiting 2 seconds...\n"); | |||
sleep(2); | |||
printf("Pulsing color..."); | |||
for (int i = 0; i < 256; i++) { | |||
lcd_fillScreen(lcd, | |||
random_color_r(i), | |||
random_color_g(i), | |||
random_color_b(i)); | |||
lcd_redrawBuffer(lcd); | |||
} | |||
printf("DONE\n"); | |||
printf("...waiting 2 seconds before shutdown...\n"); | |||
sleep(2); | |||
printf("Terminating...\n"); | |||
lcd_fillScreen(lcd, 0, 0, 0); | |||
lcd_deinit(lcd); | |||
printf("DONE\n"); | |||
return 0; | |||
} | |||
@@ -1,5 +1,6 @@ | |||
project('dejvino-ST7735', 'c') | |||
src1 = ['main.c', 'spilcd_gfx.c', 'spilcd_font.c', 'st7735.c'] | |||
src2 = ['example.c', 'spilcd_gfx.c', 'spilcd_font.c', 'st7735.c'] | |||
executable('st7735', src1, link_args: '-lwiringPi') | |||
executable('example', src2, link_args: '-lwiringPi') | |||
src_lib = ['spilcd_gfx.c', 'spilcd_font.c', 'st7735.c'] | |||
src_demo = src_lib + ['demo/base.c'] | |||
executable('demo_simple', src_demo + ['demo/simple.c'], link_args: '-lwiringPi') | |||
executable('demo_term', src_demo + ['demo/term.c'], link_args: '-lwiringPi') | |||
executable('demo_system_monitor', src_demo + ['demo/system_monitor.c'], link_args: '-lwiringPi') |