From 895e9c32f0eb3153e3f70acfae43ac527ca6bf61 Mon Sep 17 00:00:00 2001 From: klein panic Date: Sun, 29 Sep 2024 15:41:05 -0400 Subject: [PATCH] Automated update --- clock/src/clock.c.bak | 17 +-- display/README.md | 3 + display/build/Makefile | 24 ++++ display/build/clock | Bin 0 -> 25848 bytes display/include/clock.h | 43 +++++++ display/obj/clock.o | Bin 0 -> 15144 bytes display/src/clock.c | 270 ++++++++++++++++++++++++++++++++++++++++ display/src/clock.c.bak | 168 +++++++++++++++++++++++++ 8 files changed, 518 insertions(+), 7 deletions(-) create mode 100644 display/README.md create mode 100644 display/build/Makefile create mode 100755 display/build/clock create mode 100644 display/include/clock.h create mode 100644 display/obj/clock.o create mode 100644 display/src/clock.c create mode 100644 display/src/clock.c.bak diff --git a/clock/src/clock.c.bak b/clock/src/clock.c.bak index 63481b4..118ec73 100644 --- a/clock/src/clock.c.bak +++ b/clock/src/clock.c.bak @@ -107,13 +107,17 @@ void update_time(int *framebuffer, struct fb_var_screeninfo vinfo) { time(&rawtime); timeinfo = localtime(&rawtime); - // Correcting hour and minute hand angles - float hour_angle = ((timeinfo->tm_hour % 12) * 30 + timeinfo->tm_min * 0.5) * (M_PI / 180.0) - M_PI / 2; - float minute_angle = (timeinfo->tm_min * 6 + timeinfo->tm_sec * 0.1) * (M_PI / 180.0) - M_PI / 2; + // Calculate the angle for the hour hand + float hour_angle_degrees = (30 * timeinfo->tm_hour) + (timeinfo->tm_min * 0.5); + float hour_angle = - hour_angle_degrees * M_PI / 180.0 + M_PI / 2; // Convert to radians and adjust to 12 o'clock start - // Draw both hands in black color - draw_hand(framebuffer, vinfo, hour_angle, HOUR_HAND_LENGTH, 0x000000); // Hour hand in black - draw_hand(framebuffer, vinfo, minute_angle, MINUTE_HAND_LENGTH, 0x000000); // Minute hand in black + // Calculate the angle for the minute hand + float minute_angle_degrees = 6 * timeinfo->tm_min; + float minute_angle = - minute_angle_degrees * M_PI / 180.0 + M_PI / 2; // Convert to radians and adjust to 12 o'clock start + + // Draw both hands in white (0xFFFFFF) + draw_hand(framebuffer, vinfo, hour_angle, HOUR_HAND_LENGTH, 0xFFFFFF); // Hour hand is shorter + draw_hand(framebuffer, vinfo, minute_angle, MINUTE_HAND_LENGTH, 0xFFFFFF); // Minute hand is longer // Display the date strftime(date_buffer, sizeof(date_buffer), "%Y-%m-%d", timeinfo); @@ -124,7 +128,6 @@ void update_time(int *framebuffer, struct fb_var_screeninfo vinfo) { draw_text(framebuffer, vinfo, time_buffer, CENTER_X - 80, CENTER_Y + 350, 3, 0xFFFFFF); // Moved lower and increased size } -// Main function int main() { // Open the framebuffer device int fbfd = open("/dev/fb0", O_RDWR); diff --git a/display/README.md b/display/README.md new file mode 100644 index 0000000..7653c0e --- /dev/null +++ b/display/README.md @@ -0,0 +1,3 @@ +# clock Project + +This is a C project generated with the setup tool. diff --git a/display/build/Makefile b/display/build/Makefile new file mode 100644 index 0000000..f0e7f35 --- /dev/null +++ b/display/build/Makefile @@ -0,0 +1,24 @@ +# build/Makefile +CC = gcc +CFLAGS = -Wall -I../include +SRCDIR = ../src +OBJDIR = ../obj +BINDIR = ../build +TARGET = clock + +# Gather all source files in src directory +SOURCES = $(wildcard $(SRCDIR)/*.c) +OBJECTS = $(patsubst $(SRCDIR)/%.c, $(OBJDIR)/%.o, $(SOURCES)) + +all: $(TARGET) + +$(TARGET): $(OBJECTS) + $(CC) $(CFLAGS) -o $(BINDIR)/$(TARGET) $(OBJECTS) -lm + +$(OBJDIR)/%.o: $(SRCDIR)/%.c + $(CC) $(CFLAGS) -c $< -o $@ + +clean: + rm -f $(OBJDIR)/*.o $(BINDIR)/$(TARGET) + +.PHONY: all clean diff --git a/display/build/clock b/display/build/clock new file mode 100755 index 0000000000000000000000000000000000000000..8b67f0556d413148decacdd38761e75053d7ba3b GIT binary patch literal 25848 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#define SCREEN_WIDTH 800 +#define SCREEN_HEIGHT 600 +#define CENTER_X (SCREEN_WIDTH / 2) +#define CENTER_Y (SCREEN_HEIGHT / 2) +#define RADIUS 200 +#define HOUR_HAND_LENGTH 100 +#define MINUTE_HAND_LENGTH 150 + +typedef struct { + int x; + int y; +} Point; + +void draw_circle(int *framebuffer, struct fb_var_screeninfo vinfo); +void draw_hand(int *framebuffer, struct fb_var_screeninfo vinfo, float angle, int length, int color); +void draw_clock_face(int *framebuffer, struct fb_var_screeninfo vinfo); +void update_time(int *framebuffer, struct fb_var_screeninfo vinfo); +void draw_text(int *framebuffer, struct fb_var_screeninfo vinfo, const char *text, int x, int y, int size, int color); +void update_system_info(int *framebuffer, struct fb_var_screeninfo vinfo); +int get_cpu_usage(); +int get_ram_usage(); +int get_disk_usage(); +int get_battery_percentage(); +int get_cpu_temperature(); + +#endif diff --git a/display/obj/clock.o b/display/obj/clock.o new file mode 100644 index 0000000000000000000000000000000000000000..d380a6765c8e83d7516ffad11934db459f19cf22 GIT binary patch literal 15144 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include // Include this for statvfs + +// Set a pixel at (x, y) with color in the framebuffer +void set_pixel(int *framebuffer, struct fb_var_screeninfo vinfo, int x, int y, int color) { + if (x >= 0 && x < vinfo.xres_virtual && y >= 0 && y < vinfo.yres_virtual) { + framebuffer[y * vinfo.xres_virtual + x] = color; + } +} + +// Bresenham's line algorithm for drawing lines +void draw_line(int *framebuffer, struct fb_var_screeninfo vinfo, int x0, int y0, int x1, int y1, int color) { + int dx = abs(x1 - x0), sx = x0 < x1 ? 1 : -1; + int dy = -abs(y1 - y0), sy = y0 < y1 ? 1 : -1; + int err = dx + dy, e2; + + while (1) { + set_pixel(framebuffer, vinfo, x0, y0, color); + if (x0 == x1 && y0 == y1) break; + e2 = 2 * err; + if (e2 >= dy) { err += dy; x0 += sx; } + if (e2 <= dx) { err += dx; y0 += sy; } + } +} + +// Draw a simple filled rectangle to represent text characters +void draw_char(int *framebuffer, struct fb_var_screeninfo vinfo, char c, int x, int y, int size, int color) { + static const char font[10][5][3] = { + { "111", "101", "101", "101", "111" }, // '0' + { "110", "010", "010", "010", "111" }, // '1' + { "111", "001", "111", "100", "111" }, // '2' + { "111", "001", "111", "001", "111" }, // '3' + { "101", "101", "111", "001", "001" }, // '4' + { "111", "100", "111", "001", "111" }, // '5' + { "111", "100", "111", "101", "111" }, // '6' + { "111", "001", "001", "001", "001" }, // '7' + { "111", "101", "111", "101", "111" }, // '8' + { "111", "101", "111", "001", "111" } // '9' + }; + + if (c >= '0' && c <= '9') { + int index = c - '0'; + for (int row = 0; row < 5; ++row) { + for (int col = 0; col < 3; ++col) { + if (font[index][row][col] == '1') { + for (int i = 0; i < size; ++i) { + for (int j = 0; j < size; ++j) { + set_pixel(framebuffer, vinfo, x + col * size + i, y + row * size + j, color); + } + } + } + } + } + } +} + +// Draw a string of characters +void draw_text(int *framebuffer, struct fb_var_screeninfo vinfo, const char *text, int x, int y, int size, int color) { + for (const char *p = text; *p; ++p) { + draw_char(framebuffer, vinfo, *p, x, y, size, color); + x += size * 4; // Move to the next character position + } +} + +// Draw numbers around the clock face +void draw_circle(int *framebuffer, struct fb_var_screeninfo vinfo) { + for (int i = 1; i <= 12; ++i) { + float angle = (i * 30 - 90) * M_PI / 180.0; + int x = CENTER_X + (int)(RADIUS * cos(angle)); + int y = CENTER_Y + (int)(RADIUS * sin(angle)); + + char buffer[3]; + sprintf(buffer, "%d", i); + draw_text(framebuffer, vinfo, buffer, x - 10, y - 10, 3, 0xFFFFFF); // Increased the size to '3' for visibility + } +} + +// Draw clock hands +void draw_hand(int *framebuffer, struct fb_var_screeninfo vinfo, float angle, int length, int color) { + int x_end = CENTER_X + length * cos(angle); + int y_end = CENTER_Y - length * sin(angle); + draw_line(framebuffer, vinfo, CENTER_X, CENTER_Y, x_end, y_end, color); +} + +// Draw the clock face with numbers +void draw_clock_face(int *framebuffer, struct fb_var_screeninfo vinfo) { + memset(framebuffer, 0, vinfo.yres_virtual * vinfo.xres_virtual * sizeof(int)); // Clear screen + draw_circle(framebuffer, vinfo); // Draw the numbers +} + +// Function to read the first line of a file +int read_first_line(const char *path, char *buffer, size_t size) { + FILE *file = fopen(path, "r"); + if (file == NULL) return -1; + if (fgets(buffer, size, file) == NULL) { + fclose(file); + return -1; + } + fclose(file); + return 0; +} + +// Get system data +int get_cpu_usage() { + char buffer[256]; + unsigned long long int user, nice, system, idle; + read_first_line("/proc/stat", buffer, sizeof(buffer)); + sscanf(buffer, "cpu %llu %llu %llu %llu", &user, &nice, &system, &idle); + + static unsigned long long int prev_user = 0, prev_nice = 0, prev_system = 0, prev_idle = 0; + unsigned long long int total_diff = (user - prev_user) + (nice - prev_nice) + (system - prev_system); + unsigned long long int idle_diff = idle - prev_idle; + int cpu_usage = (total_diff * 100) / (total_diff + idle_diff); + + prev_user = user; + prev_nice = nice; + prev_system = system; + prev_idle = idle; + + return cpu_usage; +} + +int get_ram_usage() { + char buffer[256]; + unsigned long mem_total, mem_available; + read_first_line("/proc/meminfo", buffer, sizeof(buffer)); + sscanf(buffer, "MemTotal: %lu kB", &mem_total); + read_first_line("/proc/meminfo", buffer, sizeof(buffer)); + sscanf(buffer, "MemAvailable: %lu kB", &mem_available); + + int ram_usage = ((mem_total - mem_available) * 100) / mem_total; + return ram_usage; +} + +int get_disk_usage() { + struct statvfs stat; + if (statvfs("/", &stat) != 0) return -1; + + unsigned long total_blocks = stat.f_blocks; + unsigned long free_blocks = stat.f_bfree; + int disk_usage = ((total_blocks - free_blocks) * 100) / total_blocks; + + return disk_usage; +} + +int get_battery_percentage() { + char buffer[16]; + read_first_line("/sys/class/power_supply/BAT0/capacity", buffer, sizeof(buffer)); + return atoi(buffer); +} + +int get_cpu_temperature() { + char buffer[16]; + read_first_line("/sys/class/thermal/thermal_zone0/temp", buffer, sizeof(buffer)); + return atoi(buffer) / 1000; +} + +// Draw a percentage bar using [#####] style +void draw_percentage_bar(int *framebuffer, struct fb_var_screeninfo vinfo, int x, int y, int percentage, int size, int color) { + char bar[6]; + int num_hashes = (percentage / 20); + for (int i = 0; i < 5; ++i) { + bar[i] = i < num_hashes ? '#' : ' '; + } + bar[5] = '\0'; + draw_text(framebuffer, vinfo, bar, x, y, size, color); +} + +// Update system info on the screen +void update_system_info(int *framebuffer, struct fb_var_screeninfo vinfo) { + int battery_percentage = get_battery_percentage(); + int cpu_usage = get_cpu_usage(); + int ram_usage = get_ram_usage(); + int disk_usage = get_disk_usage(); + int cpu_temp = get_cpu_temperature(); + + char buffer[80]; + + // Draw battery info + sprintf(buffer, "Battery: %d%%", battery_percentage); + draw_text(framebuffer, vinfo, buffer, CENTER_X - 100, CENTER_Y + 300, 2, 0xFFFFFF); + draw_percentage_bar(framebuffer, vinfo, CENTER_X + 60, CENTER_Y + 300, battery_percentage, 2, 0xFFFFFF); + + // Draw CPU usage + sprintf(buffer, "CPU: %d%% Temp: %d°C", cpu_usage, cpu_temp); + draw_text(framebuffer, vinfo, buffer, CENTER_X - 100, CENTER_Y + 350, 2, 0xFFFFFF); + draw_percentage_bar(framebuffer, vinfo, CENTER_X + 60, CENTER_Y + 350, cpu_usage, 2, 0xFFFFFF); + + // Draw RAM usage + sprintf(buffer, "RAM: %d%%", ram_usage); + draw_text(framebuffer, vinfo, buffer, CENTER_X - 100, CENTER_Y + 400, 2, 0xFFFFFF); + draw_percentage_bar(framebuffer, vinfo, CENTER_X + 60, CENTER_Y + 400, ram_usage, 2, 0xFFFFFF); + + // Draw Disk usage + sprintf(buffer, "Disk: %d%%", disk_usage); + draw_text(framebuffer, vinfo, buffer, CENTER_X - 100, CENTER_Y + 450, 2, 0xFFFFFF); + draw_percentage_bar(framebuffer, vinfo, CENTER_X + 60, CENTER_Y + 450, disk_usage, 2, 0xFFFFFF); +} + +// Update the clock hands and date/time display +void update_time(int *framebuffer, struct fb_var_screeninfo vinfo) { + time_t rawtime; + struct tm *timeinfo; + char date_buffer[80]; + char time_buffer[80]; + + time(&rawtime); + timeinfo = localtime(&rawtime); + + float hour_angle_degrees = (30 * timeinfo->tm_hour) + (timeinfo->tm_min * 0.5); + float hour_angle = - hour_angle_degrees * M_PI / 180.0 + M_PI / 2; + + float minute_angle_degrees = 6 * timeinfo->tm_min; + float minute_angle = - minute_angle_degrees * M_PI / 180.0 + M_PI / 2; + + draw_hand(framebuffer, vinfo, hour_angle, HOUR_HAND_LENGTH, 0xFFFFFF); + draw_hand(framebuffer, vinfo, minute_angle, MINUTE_HAND_LENGTH, 0xFFFFFF); + + strftime(date_buffer, sizeof(date_buffer), "%Y-%m-%d", timeinfo); + draw_text(framebuffer, vinfo, date_buffer, CENTER_X - 100, CENTER_Y + 200, 3, 0xFFFFFF); + + strftime(time_buffer, sizeof(time_buffer), "%H:%M:%S", timeinfo); + draw_text(framebuffer, vinfo, time_buffer, CENTER_X - 80, CENTER_Y + 250, 3, 0xFFFFFF); + + update_system_info(framebuffer, vinfo); +} + +int main() { + int fbfd = open("/dev/fb0", O_RDWR); + if (fbfd == -1) { + perror("Error: cannot open framebuffer device"); + exit(1); + } + + struct fb_var_screeninfo vinfo; + if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo)) { + perror("Error reading variable information"); + close(fbfd); + exit(2); + } + + size_t screensize = vinfo.yres_virtual * vinfo.xres_virtual * vinfo.bits_per_pixel / 8; + int *framebuffer = (int *)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fbfd, 0); + if (framebuffer == MAP_FAILED) { + perror("Error mapping framebuffer device to memory"); + close(fbfd); + exit(3); + } + + while (1) { + draw_clock_face(framebuffer, vinfo); + update_time(framebuffer, vinfo); + sleep(1); + } + + munmap(framebuffer, screensize); + close(fbfd); + + return 0; +} + diff --git a/display/src/clock.c.bak b/display/src/clock.c.bak new file mode 100644 index 0000000..118ec73 --- /dev/null +++ b/display/src/clock.c.bak @@ -0,0 +1,168 @@ +// src/clock.c +#include "../include/clock.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Set a pixel at (x, y) with color in the framebuffer +void set_pixel(int *framebuffer, struct fb_var_screeninfo vinfo, int x, int y, int color) { + if (x >= 0 && x < vinfo.xres_virtual && y >= 0 && y < vinfo.yres_virtual) { + framebuffer[y * vinfo.xres_virtual + x] = color; + } +} + +// Bresenham's line algorithm for drawing lines +void draw_line(int *framebuffer, struct fb_var_screeninfo vinfo, int x0, int y0, int x1, int y1, int color) { + int dx = abs(x1 - x0), sx = x0 < x1 ? 1 : -1; + int dy = -abs(y1 - y0), sy = y0 < y1 ? 1 : -1; + int err = dx + dy, e2; + + while (1) { + set_pixel(framebuffer, vinfo, x0, y0, color); + if (x0 == x1 && y0 == y1) break; + e2 = 2 * err; + if (e2 >= dy) { err += dy; x0 += sx; } + if (e2 <= dx) { err += dx; y0 += sy; } + } +} + +// Draw a simple filled rectangle to represent text characters +void draw_char(int *framebuffer, struct fb_var_screeninfo vinfo, char c, int x, int y, int size, int color) { + static const char font[10][5][3] = { + { "111", "101", "101", "101", "111" }, // '0' + { "110", "010", "010", "010", "111" }, // '1' + { "111", "001", "111", "100", "111" }, // '2' + { "111", "001", "111", "001", "111" }, // '3' + { "101", "101", "111", "001", "001" }, // '4' + { "111", "100", "111", "001", "111" }, // '5' + { "111", "100", "111", "101", "111" }, // '6' + { "111", "001", "001", "001", "001" }, // '7' + { "111", "101", "111", "101", "111" }, // '8' + { "111", "101", "111", "001", "111" } // '9' + }; + + if (c >= '0' && c <= '9') { + int index = c - '0'; + for (int row = 0; row < 5; ++row) { + for (int col = 0; col < 3; ++col) { + if (font[index][row][col] == '1') { + for (int i = 0; i < size; ++i) { + for (int j = 0; j < size; ++j) { + set_pixel(framebuffer, vinfo, x + col * size + i, y + row * size + j, color); + } + } + } + } + } + } +} + +// Draw a string of characters +void draw_text(int *framebuffer, struct fb_var_screeninfo vinfo, const char *text, int x, int y, int size, int color) { + for (const char *p = text; *p; ++p) { + draw_char(framebuffer, vinfo, *p, x, y, size, color); + x += size * 4; // Move to the next character position + } +} + +// Draw numbers around the clock face +void draw_circle(int *framebuffer, struct fb_var_screeninfo vinfo) { + for (int i = 1; i <= 12; ++i) { + float angle = (i * 30 - 90) * M_PI / 180.0; + int x = CENTER_X + (int)(RADIUS * cos(angle)); + int y = CENTER_Y + (int)(RADIUS * sin(angle)); + + char buffer[3]; + sprintf(buffer, "%d", i); + draw_text(framebuffer, vinfo, buffer, x - 10, y - 10, 3, 0xFFFFFF); // Increased the size to '3' for visibility + } +} + +// Draw clock hands +void draw_hand(int *framebuffer, struct fb_var_screeninfo vinfo, float angle, int length, int color) { + int x_end = CENTER_X + length * cos(angle); + int y_end = CENTER_Y - length * sin(angle); + draw_line(framebuffer, vinfo, CENTER_X, CENTER_Y, x_end, y_end, color); +} + +// Draw the clock face with numbers +void draw_clock_face(int *framebuffer, struct fb_var_screeninfo vinfo) { + memset(framebuffer, 0, vinfo.yres_virtual * vinfo.xres_virtual * sizeof(int)); // Clear screen + draw_circle(framebuffer, vinfo); // Draw the numbers +} + +// Update the clock hands and date/time display +void update_time(int *framebuffer, struct fb_var_screeninfo vinfo) { + time_t rawtime; + struct tm *timeinfo; + char date_buffer[80]; + char time_buffer[80]; + + time(&rawtime); + timeinfo = localtime(&rawtime); + + // Calculate the angle for the hour hand + float hour_angle_degrees = (30 * timeinfo->tm_hour) + (timeinfo->tm_min * 0.5); + float hour_angle = - hour_angle_degrees * M_PI / 180.0 + M_PI / 2; // Convert to radians and adjust to 12 o'clock start + + // Calculate the angle for the minute hand + float minute_angle_degrees = 6 * timeinfo->tm_min; + float minute_angle = - minute_angle_degrees * M_PI / 180.0 + M_PI / 2; // Convert to radians and adjust to 12 o'clock start + + // Draw both hands in white (0xFFFFFF) + draw_hand(framebuffer, vinfo, hour_angle, HOUR_HAND_LENGTH, 0xFFFFFF); // Hour hand is shorter + draw_hand(framebuffer, vinfo, minute_angle, MINUTE_HAND_LENGTH, 0xFFFFFF); // Minute hand is longer + + // Display the date + strftime(date_buffer, sizeof(date_buffer), "%Y-%m-%d", timeinfo); + draw_text(framebuffer, vinfo, date_buffer, CENTER_X - 100, CENTER_Y + 300, 3, 0xFFFFFF); // Moved lower and increased size + + // Display the time + strftime(time_buffer, sizeof(time_buffer), "%H:%M:%S", timeinfo); + draw_text(framebuffer, vinfo, time_buffer, CENTER_X - 80, CENTER_Y + 350, 3, 0xFFFFFF); // Moved lower and increased size +} + +int main() { + // Open the framebuffer device + int fbfd = open("/dev/fb0", O_RDWR); + if (fbfd == -1) { + perror("Error: cannot open framebuffer device"); + exit(1); + } + + // Get variable screen information + struct fb_var_screeninfo vinfo; + if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo)) { + perror("Error reading variable information"); + close(fbfd); + exit(2); + } + + // Map the framebuffer to user memory + size_t screensize = vinfo.yres_virtual * vinfo.xres_virtual * vinfo.bits_per_pixel / 8; + int *framebuffer = (int *)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fbfd, 0); + if (framebuffer == MAP_FAILED) { + perror("Error mapping framebuffer device to memory"); + close(fbfd); + exit(3); + } + + // Continuously update the clock + while (1) { + draw_clock_face(framebuffer, vinfo); + update_time(framebuffer, vinfo); + sleep(1); // Sleep for 1 second to update the clock every second + } + + // Cleanup + munmap(framebuffer, screensize); + close(fbfd); + + return 0; +}