added shit
This commit is contained in:
3
Earth/README.md
Normal file
3
Earth/README.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Earth Project
|
||||||
|
|
||||||
|
This is a C project generated with the setup tool.
|
||||||
3
timer/README.md
Normal file
3
timer/README.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# timer Project
|
||||||
|
|
||||||
|
This is a C project generated with the setup tool.
|
||||||
25
timer/build/Makefile
Normal file
25
timer/build/Makefile
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
# Makefile
|
||||||
|
|
||||||
|
CC = gcc
|
||||||
|
CFLAGS = -Wall -I../include
|
||||||
|
LDFLAGS = -lm
|
||||||
|
|
||||||
|
SRC_DIR = ../src
|
||||||
|
OBJ_DIR = ../obj
|
||||||
|
INCLUDE_DIR = ../include
|
||||||
|
|
||||||
|
SOURCES = $(wildcard $(SRC_DIR)/*.c)
|
||||||
|
OBJECTS = $(patsubst $(SRC_DIR)/%.c, $(OBJ_DIR)/%.o, $(SOURCES))
|
||||||
|
|
||||||
|
TARGET = timer_app
|
||||||
|
|
||||||
|
all: $(TARGET)
|
||||||
|
|
||||||
|
$(TARGET): $(OBJECTS)
|
||||||
|
$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
|
||||||
|
|
||||||
|
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
|
||||||
|
$(CC) $(CFLAGS) -c $< -o $@
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(OBJ_DIR)/*.o $(TARGET)
|
||||||
48
timer/include/timer.h
Normal file
48
timer/include/timer.h
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
// include/timer.h
|
||||||
|
#ifndef TIMER_H
|
||||||
|
#define TIMER_H
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <linux/fb.h> // Include this for framebuffer structures
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <sys/statvfs.h> // For disk usage calculations
|
||||||
|
|
||||||
|
#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
|
||||||
|
|
||||||
|
#define RING_COLOR 0xFFFFFF // White color
|
||||||
|
#define TIMER_COLOR 0xFFA500 // Orange color
|
||||||
|
#define TIMER_START_VALUE 60 // Start value of the countdown timer in seconds
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
} Point;
|
||||||
|
|
||||||
|
typedef struct fb_var_screeninfo fb_var_screeninfo; // Alias for convenience
|
||||||
|
|
||||||
|
typedef int framebuffer_t; // Define the framebuffer_t as an int for this context
|
||||||
|
|
||||||
|
void draw_ring(int *framebuffer, fb_var_screeninfo vinfo, int center_x, int center_y, int radius, int thickness, int color);
|
||||||
|
void draw_static_ring(int *framebuffer, fb_var_screeninfo vinfo);
|
||||||
|
void draw_dynamic_ring(int *framebuffer, fb_var_screeninfo vinfo);
|
||||||
|
void draw_countdown_timer(int *framebuffer, fb_var_screeninfo vinfo);
|
||||||
|
void draw_clock_face(int *framebuffer, fb_var_screeninfo vinfo);
|
||||||
|
void update_time(int *framebuffer, fb_var_screeninfo vinfo);
|
||||||
|
void draw_text(int *framebuffer, fb_var_screeninfo vinfo, const char *text, int x, int y, int size, int color);
|
||||||
|
|
||||||
|
#endif // TIMER_H
|
||||||
BIN
timer/obj/main.o
Normal file
BIN
timer/obj/main.o
Normal file
Binary file not shown.
133
timer/src/main.c
Normal file
133
timer/src/main.c
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
#include "../include/timer.h"
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <sys/statvfs.h>
|
||||||
|
|
||||||
|
#define RING_COLOR 0xFFFFFF // White for the static ring
|
||||||
|
#define TIMER_COLOR 0xFFA500 // Orange for the dynamic ring and timer
|
||||||
|
#define TIMER_START_VALUE 60 // Start value of the countdown timer in seconds
|
||||||
|
|
||||||
|
int countdown = TIMER_START_VALUE;
|
||||||
|
|
||||||
|
// 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Draw a ring with specified thickness
|
||||||
|
void draw_ring(int *framebuffer, struct fb_var_screeninfo vinfo, int center_x, int center_y, int radius, int thickness, int color) {
|
||||||
|
for (int r = radius - thickness / 2; r <= radius + thickness / 2; r++) {
|
||||||
|
for (int angle = 0; angle < 360; ++angle) {
|
||||||
|
int x = center_x + (int)(r * cos(angle * M_PI / 180));
|
||||||
|
int y = center_y + (int)(r * sin(angle * M_PI / 180));
|
||||||
|
set_pixel(framebuffer, vinfo, x, y, color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Draw the static ring for the clock face
|
||||||
|
void draw_static_ring(int *framebuffer, struct fb_var_screeninfo vinfo) {
|
||||||
|
draw_ring(framebuffer, vinfo, CENTER_X, CENTER_Y, RADIUS, 5, RING_COLOR); // Draw a thick white ring
|
||||||
|
}
|
||||||
|
|
||||||
|
// Draw the dynamic ring with decreasing radius
|
||||||
|
void draw_dynamic_ring(int *framebuffer, struct fb_var_screeninfo vinfo) {
|
||||||
|
int dynamic_radius = RADIUS * countdown / TIMER_START_VALUE; // Scale the radius based on remaining time
|
||||||
|
draw_ring(framebuffer, vinfo, CENTER_X, CENTER_Y, dynamic_radius, 3, TIMER_COLOR); // Draw an orange ring
|
||||||
|
}
|
||||||
|
|
||||||
|
// Draw the countdown timer inside the ring
|
||||||
|
void draw_countdown_timer(int *framebuffer, struct fb_var_screeninfo vinfo) {
|
||||||
|
char timer_text[10];
|
||||||
|
sprintf(timer_text, "%d", countdown);
|
||||||
|
draw_text(framebuffer, vinfo, timer_text, CENTER_X - 10, CENTER_Y - 10, 3, TIMER_COLOR); // Center the text
|
||||||
|
}
|
||||||
|
|
||||||
|
// Draw the clock face with rings and 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_static_ring(framebuffer, vinfo); // Draw the static white ring
|
||||||
|
draw_dynamic_ring(framebuffer, vinfo); // Draw the dynamic orange ring
|
||||||
|
draw_countdown_timer(framebuffer, vinfo); // Draw the countdown timer
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update the clock hands, date/time display, and system information
|
||||||
|
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 % 12)) + (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); // Hour hand
|
||||||
|
draw_hand(framebuffer, vinfo, minute_angle, MINUTE_HAND_LENGTH, 0xFFFFFF); // Minute hand
|
||||||
|
|
||||||
|
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); // Display system info
|
||||||
|
|
||||||
|
// Countdown timer logic
|
||||||
|
draw_countdown_timer(framebuffer, vinfo);
|
||||||
|
|
||||||
|
if (countdown > 0) {
|
||||||
|
countdown--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Main function to continuously update the clock
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user