From 83bb5a2ead25e9d835ffeeeb82de1361aa0ed761 Mon Sep 17 00:00:00 2001 From: klein panic Date: Thu, 9 Jan 2025 21:11:57 -0500 Subject: [PATCH] version 1 metricpet is made --- blackcat.jpg | Bin 0 -> 13336 bytes blackcat.txt | 54 +++++ cat_lay.jpeg | Bin 0 -> 5998 bytes image_to_grid_convert | Bin 0 -> 16640 bytes image_to_grid_convert.c | 71 +++++++ metricpet.c | 227 ++++++++++++++++++++ pet_program | Bin 0 -> 30312 bytes pet_program.c | 458 ++++++++++++++++++++++++++++++++++++++++ pet_program.c.bak | 394 ++++++++++++++++++++++++++++++++++ 9 files changed, 1204 insertions(+) create mode 100644 blackcat.jpg create mode 100644 blackcat.txt create mode 100644 cat_lay.jpeg create mode 100755 image_to_grid_convert create mode 100644 image_to_grid_convert.c create mode 100644 metricpet.c create mode 100755 pet_program create mode 100644 pet_program.c create mode 100644 pet_program.c.bak diff --git a/blackcat.jpg b/blackcat.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0e8a465e051e69b9c012a5cfba3e92a0898a6777 GIT binary patch literal 13336 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 FCII*sDgFQe literal 0 HcmV?d00001 diff --git a/blackcat.txt b/blackcat.txt new file mode 100644 index 0000000..2f3988b --- /dev/null +++ b/blackcat.txt @@ -0,0 +1,54 @@ +const int grid[25][25] = { + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } +}; + +Pixel Art: +######################### +################ ####### +##### ######## ###### +##### ###### ###### +##### ###### +##### ## ###### +##### ## ## ###### +###### # # # # ###### +##### # # ##### +##### # ### ##### +##### ## # ##### +##### ###### +###### ###### +###### ####### +####### ######## +######## ######## +######## ####### +######## ###### +####### ###### +####### ###### +###### ###### +###### ###### +###### ####### +######### ######### +######################### diff --git a/cat_lay.jpeg b/cat_lay.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..ba8ecbfbb751be2f8c0f95bdca12bc3a996075b3 GIT binary patch literal 5998 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 amR>$LJL_fm6xRThJ_TAAgD_YA|4jfA!sw#_ literal 0 HcmV?d00001 diff --git a/image_to_grid_convert b/image_to_grid_convert new file mode 100755 index 0000000000000000000000000000000000000000..1b096a0055c54d59bc06e8fffc7475945a5fb3e5 GIT binary patch literal 16640 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 T)2{^Ts53AyNTF#!<1zpMmFGgo literal 0 HcmV?d00001 diff --git a/image_to_grid_convert.c b/image_to_grid_convert.c new file mode 100644 index 0000000..22488d2 --- /dev/null +++ b/image_to_grid_convert.c @@ -0,0 +1,71 @@ +#include +#include +#include +#include + +#define GRID_SIZE 25 // 25x25 grid +#define PIXEL_THRESHOLD 128 // Threshold to decide between 0 and 1 for pixel intensity + +void convert_image_to_grid(const char *image_path) { + SDL_Init(SDL_INIT_VIDEO); + IMG_Init(IMG_INIT_JPG | IMG_INIT_PNG); + + SDL_Surface *image = IMG_Load(image_path); + if (!image) { + fprintf(stderr, "Failed to load image: %s\n", IMG_GetError()); + IMG_Quit(); + SDL_Quit(); + return; + } + + int width = image->w; + int height = image->h; + + SDL_Surface *scaled_image = SDL_CreateRGBSurface(0, GRID_SIZE, GRID_SIZE, 32, 0x00FF0000, 0x0000FF00, 0x000000FF, 0); + SDL_BlitScaled(image, NULL, scaled_image, NULL); + SDL_FreeSurface(image); + + printf("const int grid[%d][%d] = {\n", GRID_SIZE, GRID_SIZE); + + for (int y = 0; y < GRID_SIZE; y++) { + printf(" { "); + for (int x = 0; x < GRID_SIZE; x++) { + Uint32 pixel = ((Uint32 *)scaled_image->pixels)[y * GRID_SIZE + x]; + Uint8 r, g, b; + SDL_GetRGB(pixel, scaled_image->format, &r, &g, &b); + int intensity = (r + g + b) / 3; + printf("%d%s", intensity < PIXEL_THRESHOLD ? 0 : 1, x == GRID_SIZE - 1 ? "" : ", "); + } + printf(" }%s\n", y == GRID_SIZE - 1 ? "" : ","); + } + + printf("};\n\n"); + + printf("Pixel Art:\n"); + for (int y = 0; y < GRID_SIZE; y++) { + for (int x = 0; x < GRID_SIZE; x++) { + Uint32 pixel = ((Uint32 *)scaled_image->pixels)[y * GRID_SIZE + x]; + Uint8 r, g, b; + SDL_GetRGB(pixel, scaled_image->format, &r, &g, &b); + int intensity = (r + g + b) / 3; + printf(intensity < PIXEL_THRESHOLD ? " " : "#"); + } + printf("\n"); + } + + SDL_FreeSurface(scaled_image); + IMG_Quit(); + SDL_Quit(); +} + +int main(int argc, char *argv[]) { + if (argc < 2) { + fprintf(stderr, "Usage: %s \n", argv[0]); + return 1; + } + + convert_image_to_grid(argv[1]); + + return 0; +} + diff --git a/metricpet.c b/metricpet.c new file mode 100644 index 0000000..b61f2a2 --- /dev/null +++ b/metricpet.c @@ -0,0 +1,227 @@ +#include +#include +#include +#include +#include +#include +#include + +#define WINDOW_WIDTH 64 +#define WINDOW_HEIGHT 64 +#define PIXEL_SIZE 8 // Size of each pixel in the pet's display grid +#define BATTERY_THRESHOLD 20 +#define CONNECTION_CHECK_CMD "ping -c 1 google.com > /dev/null 2>&1" + +// Pet mood states +typedef enum { HAPPY, NEUTRAL, SAD, ANGRY, SWEATING, TIRED, CONFUSED } Mood; + +// Colors for different moods +const SDL_Color colors[] = { + {255, 255, 255, 255}, // HAPPY - white + {200, 200, 200, 255}, // NEUTRAL - grey + {0, 0, 255, 255}, // SAD - blue + {255, 0, 0, 255}, // ANGRY - red + {255, 165, 0, 255}, // SWEATING - orange + {169, 169, 169, 255}, // TIRED - grey + {128, 0, 128, 255} // CONFUSED - purple +}; + +// Hardcoded pixel art for the cat (3 frames for animation) +const int cat_frames[3][8][8] = { + { // Frame 1 + {0, 1, 1, 0, 0, 1, 1, 0}, + {1, 0, 0, 1, 1, 0, 0, 1}, + {1, 0, 0, 0, 0, 0, 0, 1}, + {1, 0, 1, 0, 0, 1, 0, 1}, + {1, 1, 0, 0, 0, 0, 1, 1}, + {0, 1, 1, 1, 1, 1, 1, 0}, + {0, 0, 1, 1, 1, 1, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0} + }, + { // Frame 2 + {0, 1, 1, 0, 0, 1, 1, 0}, + {1, 0, 0, 1, 1, 0, 0, 1}, + {1, 0, 0, 0, 0, 0, 0, 1}, + {1, 0, 1, 0, 0, 1, 0, 1}, + {1, 1, 0, 0, 0, 0, 1, 1}, + {0, 0, 1, 1, 1, 1, 0, 0}, + {0, 1, 1, 1, 1, 1, 1, 0}, + {0, 0, 0, 0, 0, 0, 0, 0} + }, + { // Frame 3 + {0, 1, 1, 0, 0, 1, 1, 0}, + {1, 0, 0, 1, 1, 0, 0, 1}, + {1, 0, 0, 0, 0, 0, 0, 1}, + {1, 0, 1, 1, 1, 1, 0, 1}, + {1, 1, 0, 0, 0, 0, 1, 1}, + {0, 0, 1, 1, 1, 1, 0, 0}, + {0, 1, 1, 1, 1, 1, 1, 0}, + {0, 0, 0, 0, 0, 0, 0, 0} + } +}; + +// Function to get CPU usage (simplified) +double get_cpu_usage() { + static long prev_idle = 0, prev_total = 0; + long idle, total; + double usage = 0.0; + + FILE *file = fopen("/proc/stat", "r"); + if (file == NULL) { + perror("Failed to open /proc/stat"); + return 0.0; + } + + long user, nice, system, idle_time; + fscanf(file, "cpu %ld %ld %ld %ld", &user, &nice, &system, &idle_time); + fclose(file); + + idle = idle_time; + total = user + nice + system + idle; + + long delta_idle = idle - prev_idle; + long delta_total = total - prev_total; + + if (delta_total != 0) { + usage = (1.0 - ((double)delta_idle / delta_total)) * 100.0; + } + + prev_idle = idle; + prev_total = total; + + return usage; +} + +// Function to get RAM usage percentage +double get_ram_usage() { + long total, free, available; + FILE *file = fopen("/proc/meminfo", "r"); + if (file == NULL) { + perror("Failed to open /proc/meminfo"); + return 0.0; + } + + fscanf(file, "MemTotal: %ld kB\nMemFree: %ld kB\nMemAvailable: %ld kB", &total, &free, &available); + fclose(file); + + return ((double)(total - available) / total) * 100.0; +} + +// Function to check battery percentage +int get_battery_percentage() { + int percentage = 100; + FILE *file = fopen("/sys/class/power_supply/BAT0/capacity", "r"); + if (file) { + fscanf(file, "%d", &percentage); + fclose(file); + } + return percentage; +} + +// Function to check internet connection +bool is_connected() { + return system(CONNECTION_CHECK_CMD) == 0; +} + +// Function to draw the pet with animation and color based on mood +void draw_pet(SDL_Renderer *renderer, Mood mood, int frame) { + const int (*cat)[8][8] = &cat_frames[frame % 3]; + SDL_SetRenderDrawColor(renderer, colors[mood].r, colors[mood].g, colors[mood].b, colors[mood].a); + + SDL_RenderClear(renderer); + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); + + for (int y = 0; y < 8; y++) { + for (int x = 0; x < 8; x++) { + if ((*cat)[y][x] == 1) { + SDL_Rect rect = {x * PIXEL_SIZE, y * PIXEL_SIZE, PIXEL_SIZE, PIXEL_SIZE}; + SDL_RenderFillRect(renderer, &rect); + } + } + } + + SDL_RenderPresent(renderer); +} + +void print_verbose_info(Mood mood, double cpu_usage, double ram_usage, int battery, bool connected) { + const char *mood_names[] = {"HAPPY", "NEUTRAL", "SAD", "ANGRY", "SWEATING", "TIRED", "CONFUSED"}; + printf("Mood: %s\n", mood_names[mood]); + printf("CPU Usage: %.2f%%\n", cpu_usage); + printf("RAM Usage: %.2f%%\n", ram_usage); + printf("Battery: %d%%\n", battery); + printf("Internet Connection: %s\n", connected ? "Connected" : "Disconnected"); +} + +int main(int argc, char *argv[]) { + bool verbose = false; + if (argc > 1 && strcmp(argv[1], "--verbose") == 0) { + verbose = true; + } + + if (SDL_Init(SDL_INIT_VIDEO) != 0) { + fprintf(stderr, "SDL_Init Error: %s\n", SDL_GetError()); + return 1; + } + + SDL_Window *window = SDL_CreateWindow("Cat Pet", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_SHOWN); + if (window == NULL) { + fprintf(stderr, "SDL_CreateWindow Error: %s\n", SDL_GetError()); + SDL_Quit(); + return 1; + } + + SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); + if (renderer == NULL) { + fprintf(stderr, "SDL_CreateRenderer Error: %s\n", SDL_GetError()); + SDL_DestroyWindow(window); + SDL_Quit(); + return 1; + } + + bool running = true; + SDL_Event event; + int frame = 0; + + while (running) { + while (SDL_PollEvent(&event)) { + if (event.type == SDL_QUIT) { + running = false; + } + } + + double cpu_usage = get_cpu_usage(); + double ram_usage = get_ram_usage(); + int battery = get_battery_percentage(); + bool connected = is_connected(); + + Mood mood; + if (!connected) { + mood = CONFUSED; + } else if (battery < BATTERY_THRESHOLD) { + mood = TIRED; + } else if (cpu_usage > 80.0) { + mood = ANGRY; + } else if (ram_usage > 80.0) { + mood = SAD; + } else if (cpu_usage > 60.0) { + mood = SWEATING; + } else { + mood = HAPPY; + } + + if (verbose) { + print_verbose_info(mood, cpu_usage, ram_usage, battery, connected); + } + + draw_pet(renderer, mood, frame); + frame++; + SDL_Delay(500); + } + + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); + SDL_Quit(); + + return 0; +} + diff --git a/pet_program b/pet_program new file mode 100755 index 0000000000000000000000000000000000000000..7f8f8cc05216bc6f7006fb4362dff32c53c6a261 GIT binary patch literal 30312 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 kd;)xx3j@Ouv;+&X52gl0gN9MD>F +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define WINDOW_WIDTH 200 +#define WINDOW_HEIGHT 200 +#define PIXEL_SIZE 8 // Size of each pixel in the pet's display grid +#define GRID_SIZE 25 // 25x25 grid for the cat pixel art +#define BATTERY_THRESHOLD 20 +#define EYE_GREEN_CONDITION 100 // Condition for green eyes when battery is fully charged +#define BLINK_INTERVAL 2500 // Interval in milliseconds for blinking +#define CPU_USAGE_THRESHOLD 80 +#define RAM_USAGE_THRESHOLD 80 +#define METRIC_UPDATE_INTERVAL 60000 // 1 minute in milliseconds +#define VERSION "1.0.0" + +// Function prototypes +int get_battery_percentage(); +double get_cpu_usage(); +double get_ram_usage(); +bool is_connected(); +void generate_colored_grid(int grid[GRID_SIZE][GRID_SIZE], SDL_Renderer *renderer, SDL_Color color); +void parse_arguments(int argc, char *argv[], bool *verbose, bool *test); +void modify_grid(int grid[GRID_SIZE][GRID_SIZE], bool grey_body, bool red_eyes, bool yellow_eyes, bool green_eyes); +void draw_cat(SDL_Renderer *renderer, int grid[GRID_SIZE][GRID_SIZE]); +void print_help(); +void print_version(); + +// Placeholder for cat pixel art frames and additional views +const int cat_frames[2][GRID_SIZE][GRID_SIZE] = { + // Frame 0: Default cat sitting (add pixel art) + { + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } + }, + // Frame 1: Blinking cat (add pixel art) + { + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } + + } +}; + +const int sleepy_cat[GRID_SIZE][GRID_SIZE] = { + // Sleepy cat pixel art (add pixel art) + { + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } + } +}; + +// Function to get battery percentage +int get_battery_percentage() { + FILE *fp = fopen("/sys/class/power_supply/BAT0/capacity", "r"); + if (!fp) { + fprintf(stderr, "Error reading battery percentage: %s\n", strerror(errno)); + return -1; + } + int battery; + fscanf(fp, "%d", &battery); + fclose(fp); + return battery; +} + +// Function to get CPU usage +double get_cpu_usage() { + static long prev_idle = 0, prev_total = 0; + long idle, total; + FILE *fp = fopen("/proc/stat", "r"); + if (!fp) { + fprintf(stderr, "Error reading CPU usage: %s\n", strerror(errno)); + return 0.0; + } + char buffer[256]; + fgets(buffer, sizeof(buffer), fp); + fclose(fp); + + long user, nice, system, idle_now, iowait, irq, softirq; + sscanf(buffer, "cpu %ld %ld %ld %ld %ld %ld %ld", &user, &nice, &system, &idle_now, &iowait, &irq, &softirq); + + idle = idle_now; + total = user + nice + system + idle_now + iowait + irq + softirq; + + double usage = (1.0 - (double)(idle - prev_idle) / (total - prev_total)) * 100.0; + + prev_idle = idle; + prev_total = total; + return usage; +} + +// Function to get RAM usage +double get_ram_usage() { + struct sysinfo info; + if (sysinfo(&info) != 0) { + fprintf(stderr, "Error reading RAM usage: %s\n", strerror(errno)); + return 0.0; + } + double used_ram = (double)(info.totalram - info.freeram) / info.totalram * 100.0; + return used_ram; +} + +// Function to check internet connection +bool is_connected() { + struct ifaddrs *ifaddr, *ifa; + bool connected = false; + + if (getifaddrs(&ifaddr) == -1) { + fprintf(stderr, "Error checking internet connection: %s\n", strerror(errno)); + return false; + } + + for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { + if (ifa->ifa_addr && ifa->ifa_addr->sa_family == AF_INET) { + connected = true; + break; + } + } + + freeifaddrs(ifaddr); + return connected; +} + +// Function to parse command line arguments +void parse_arguments(int argc, char *argv[], bool *verbose, bool *test) { + for (int i = 1; i < argc; i++) { + if (strcmp(argv[i], "--verbose") == 0) { + *verbose = true; + } else if (strcmp(argv[i], "--test") == 0) { + *verbose = true; + *test = true; + } else if (strcmp(argv[i], "--version") == 0) { + print_version(); + exit(0); + } else if (strcmp(argv[i], "--help") == 0) { + print_help(); + exit(0); + } else { + fprintf(stderr, "Unknown option: %s\n", argv[i]); + print_help(); + exit(1); + } + } +} + +// Function to print help message +void print_help() { + printf("Usage: pet_program [OPTIONS]\n"); + printf("Options:\n"); + printf(" --verbose Show detailed debug information\n"); + printf(" --test Simulate changing metrics for testing\n"); + printf(" --version Show program version\n"); + printf(" --help Show this help message\n"); +} + +// Function to print version +void print_version() { + printf("Pet Program Version %s\n", VERSION); +} + +// Function to modify grid for high CPU, RAM, or no internet +void modify_grid(int grid[GRID_SIZE][GRID_SIZE], bool grey_body, bool red_eyes, bool yellow_eyes, bool green_eyes) { + for (int y = 0; y < GRID_SIZE; y++) { + for (int x = 0; x < GRID_SIZE; x++) { + if (grey_body) { + if (grid[y][x] == 1) { + grid[y][x] = 2; // Grey for no internet + } + } else if (green_eyes) { + if (y >= 7 && y <= 8 && (x == 8 || x == 16)) { // Eye positions + grid[y][x] = 5; // Green for full battery + } + } else if (red_eyes) { + if (y >= 7 && y <= 8 && (x == 8 || x == 16)) { // Eye positions + grid[y][x] = 3; // Red for high CPU + } + } else if (yellow_eyes) { + if (y >= 7 && y <= 8 && (x == 8 || x == 16)) { // Eye positions + grid[y][x] = 4; // Yellow for high RAM + } + } + } + } +} + +// Function to draw the cat with different colors based on system metrics +void draw_cat(SDL_Renderer *renderer, int grid[GRID_SIZE][GRID_SIZE]) { + SDL_Color color; + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); // Black background + SDL_RenderClear(renderer); + + for (int y = 0; y < GRID_SIZE; y++) { + for (int x = 0; x < GRID_SIZE; x++) { + switch (grid[y][x]) { + case 1: + color = (SDL_Color){255, 255, 255, 255}; // White + break; + case 2: + color = (SDL_Color){169, 169, 169, 255}; // Grey + break; + case 3: + color = (SDL_Color){255, 0, 0, 255}; // Red + break; + case 4: + color = (SDL_Color){255, 255, 0, 255}; // Yellow + break; + case 5: + color = (SDL_Color){0, 255, 0, 255}; // Green + break; + default: + continue; + } + SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, color.a); + SDL_Rect rect = {x * PIXEL_SIZE, y * PIXEL_SIZE, PIXEL_SIZE, PIXEL_SIZE}; + SDL_RenderFillRect(renderer, &rect); + } + } + SDL_RenderPresent(renderer); +} + +int main(int argc, char *argv[]) { + srand(time(NULL)); + bool verbose = false; + bool test = false; + parse_arguments(argc, argv, &verbose, &test); + + if (SDL_Init(SDL_INIT_VIDEO) != 0) { + fprintf(stderr, "SDL_Init Error: %s\n", SDL_GetError()); + return 1; + } + + SDL_Window *window = SDL_CreateWindow("Cat Pet", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_SHOWN); + if (!window) { + fprintf(stderr, "SDL_CreateWindow Error: %s\n", SDL_GetError()); + SDL_Quit(); + return 1; + } + + SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); + if (!renderer) { + fprintf(stderr, "SDL_CreateRenderer Error: %s\n", SDL_GetError()); + SDL_DestroyWindow(window); + SDL_Quit(); + return 1; + } + + bool running = true; + SDL_Event event; + int frame = 0; + Uint32 last_blink_time = SDL_GetTicks(); + Uint32 last_metric_update = SDL_GetTicks(); + int test_state = 0; // State counter for cycling through test scenarios + + int battery = 100; + double cpu_usage = 0.0; + double ram_usage = 0.0; + bool connected = true; + + while (running) { + while (SDL_PollEvent(&event)) { + if (event.type == SDL_QUIT) { + running = false; + } + } + + Uint32 current_time = SDL_GetTicks(); + if (current_time - last_metric_update >= METRIC_UPDATE_INTERVAL) { + if (test) { + // Cycle through different test scenarios + switch (test_state) { + case 0: + battery = 100; // Full battery (green eyes) + cpu_usage = 0.0; + ram_usage = 0.0; + connected = true; + break; + case 1: + battery = 50; + cpu_usage = 90.0; // High CPU (red eyes) + ram_usage = 0.0; + connected = true; + break; + case 2: + battery = 50; + cpu_usage = 0.0; + ram_usage = 90.0; // High RAM (yellow eyes) + connected = true; + break; + case 3: + battery = 50; + cpu_usage = 0.0; + ram_usage = 0.0; + connected = false; // No internet (grey body) + break; + default: + battery = 100; + cpu_usage = 0.0; + ram_usage = 0.0; + connected = true; + break; + } + test_state = (test_state + 1) % 4; + } else { + battery = get_battery_percentage(); + cpu_usage = get_cpu_usage(); + ram_usage = get_ram_usage(); + connected = is_connected(); + } + last_metric_update = current_time; + + if (verbose) { + printf("Battery: %d%%\n", battery); + printf("CPU Usage: %.2f%%\n", cpu_usage); + printf("RAM Usage: %.2f%%\n", ram_usage); + printf("Internet Connection: %s\n", connected ? "Connected" : "Disconnected"); + } + } + + bool green_eyes = (battery >= EYE_GREEN_CONDITION); + bool grey_body = !connected; + bool red_eyes = (cpu_usage >= CPU_USAGE_THRESHOLD); + bool yellow_eyes = (ram_usage >= RAM_USAGE_THRESHOLD); + bool sleepy_mode = (battery < BATTERY_THRESHOLD); + + // Ensure logging happens before updating test state + last_metric_update = current_time; + + if (test) { + // Cycle through different test scenarios + switch (test_state) { + case 0: + battery = 100; // Full battery (green eyes) + cpu_usage = 0.0; + ram_usage = 0.0; + connected = true; + break; + case 1: + battery = 50; + cpu_usage = 90.0; // High CPU (red eyes) + ram_usage = 0.0; + connected = true; + break; + case 2: + battery = 50; + cpu_usage = 0.0; + ram_usage = 90.0; // High RAM (yellow eyes) + connected = true; + break; + case 3: + battery = 50; + cpu_usage = 0.0; + ram_usage = 0.0; + connected = false; // No internet (grey body) + break; + } + test_state = (test_state + 1) % 4; + } + + if (current_time - last_blink_time >= BLINK_INTERVAL) { + frame = (frame + 1) % 2; // Toggle between frame 0 and 1 for blinking + last_blink_time = current_time; + } + + int current_grid[GRID_SIZE][GRID_SIZE]; + if (sleepy_mode) { + memcpy(current_grid, sleepy_cat, sizeof(current_grid)); // Use sleepy cat grid + } else { + memcpy(current_grid, cat_frames[frame], sizeof(current_grid)); // Use regular/blinking grid + } + + modify_grid(current_grid, grey_body, red_eyes && frame == 0, yellow_eyes && frame == 0, green_eyes && frame == 0); + draw_cat(renderer, current_grid); + + SDL_Delay(100); // Delay to control frame rate + } + + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); + SDL_Quit(); + + return 0; +} + diff --git a/pet_program.c.bak b/pet_program.c.bak new file mode 100644 index 0000000..53d14c5 --- /dev/null +++ b/pet_program.c.bak @@ -0,0 +1,394 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define WINDOW_WIDTH 200 +#define WINDOW_HEIGHT 200 +#define PIXEL_SIZE 8 // Size of each pixel in the pet's display grid +#define GRID_SIZE 25 // 25x25 grid for the cat pixel art +#define BATTERY_THRESHOLD 20 +#define EYE_GREEN_CONDITION 100 // Condition for green eyes when battery is fully charged +#define BLINK_INTERVAL 2500 // Interval in milliseconds for blinking +#define CPU_USAGE_THRESHOLD 80 +#define RAM_USAGE_THRESHOLD 80 +#define METRIC_UPDATE_INTERVAL 60000 // 1 minute in milliseconds +#define VERSION "1.0.0" + +// Function prototypes +int get_battery_percentage(); +double get_cpu_usage(); +double get_ram_usage(); +bool is_connected(); +void generate_colored_grid(int grid[GRID_SIZE][GRID_SIZE], SDL_Renderer *renderer, SDL_Color color); +void parse_arguments(int argc, char *argv[], bool *verbose, bool *test); +void modify_grid(int grid[GRID_SIZE][GRID_SIZE], bool grey_body, bool red_eyes, bool yellow_eyes, bool green_eyes); +void draw_cat(SDL_Renderer *renderer, int grid[GRID_SIZE][GRID_SIZE]); +void print_help(); +void print_version(); + +// Placeholder for cat pixel art frames and additional views +const int cat_frames[2][GRID_SIZE][GRID_SIZE] = { + // Frame 0: Default cat sitting (add pixel art) + { + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } + }, + // Frame 1: Blinking cat (add pixel art) + { + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } + + } +}; + +const int sleepy_cat[GRID_SIZE][GRID_SIZE] = { + // Sleepy cat pixel art (add pixel art) + {} +}; + +// Function to get battery percentage +int get_battery_percentage() { + FILE *fp = fopen("/sys/class/power_supply/BAT0/capacity", "r"); + if (!fp) { + fprintf(stderr, "Error reading battery percentage: %s\n", strerror(errno)); + return -1; + } + int battery; + fscanf(fp, "%d", &battery); + fclose(fp); + return battery; +} + +// Function to get CPU usage +double get_cpu_usage() { + static long prev_idle = 0, prev_total = 0; + long idle, total; + FILE *fp = fopen("/proc/stat", "r"); + if (!fp) { + fprintf(stderr, "Error reading CPU usage: %s\n", strerror(errno)); + return 0.0; + } + char buffer[256]; + fgets(buffer, sizeof(buffer), fp); + fclose(fp); + + long user, nice, system, idle_now, iowait, irq, softirq; + sscanf(buffer, "cpu %ld %ld %ld %ld %ld %ld %ld", &user, &nice, &system, &idle_now, &iowait, &irq, &softirq); + + idle = idle_now; + total = user + nice + system + idle_now + iowait + irq + softirq; + + double usage = (1.0 - (double)(idle - prev_idle) / (total - prev_total)) * 100.0; + + prev_idle = idle; + prev_total = total; + return usage; +} + +// Function to get RAM usage +double get_ram_usage() { + struct sysinfo info; + if (sysinfo(&info) != 0) { + fprintf(stderr, "Error reading RAM usage: %s\n", strerror(errno)); + return 0.0; + } + double used_ram = (double)(info.totalram - info.freeram) / info.totalram * 100.0; + return used_ram; +} + +// Function to check internet connection +bool is_connected() { + struct ifaddrs *ifaddr, *ifa; + bool connected = false; + + if (getifaddrs(&ifaddr) == -1) { + fprintf(stderr, "Error checking internet connection: %s\n", strerror(errno)); + return false; + } + + for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { + if (ifa->ifa_addr && ifa->ifa_addr->sa_family == AF_INET) { + connected = true; + break; + } + } + + freeifaddrs(ifaddr); + return connected; +} + +// Function to parse command line arguments +void parse_arguments(int argc, char *argv[], bool *verbose, bool *test) { + for (int i = 1; i < argc; i++) { + if (strcmp(argv[i], "--verbose") == 0) { + *verbose = true; + } else if (strcmp(argv[i], "--test") == 0) { + *verbose = true; + *test = true; + } else if (strcmp(argv[i], "--version") == 0) { + print_version(); + exit(0); + } else if (strcmp(argv[i], "--help") == 0) { + print_help(); + exit(0); + } else { + fprintf(stderr, "Unknown option: %s\n", argv[i]); + print_help(); + exit(1); + } + } +} + +// Function to print help message +void print_help() { + printf("Usage: pet_program [OPTIONS]\n"); + printf("Options:\n"); + printf(" --verbose Show detailed debug information\n"); + printf(" --test Simulate changing metrics for testing\n"); + printf(" --version Show program version\n"); + printf(" --help Show this help message\n"); +} + +// Function to print version +void print_version() { + printf("Pet Program Version %s\n", VERSION); +} + +// Function to modify grid for high CPU, RAM, or no internet +void modify_grid(int grid[GRID_SIZE][GRID_SIZE], bool grey_body, bool red_eyes, bool yellow_eyes, bool green_eyes) { + for (int y = 0; y < GRID_SIZE; y++) { + for (int x = 0; x < GRID_SIZE; x++) { + if (grey_body) { + if (grid[y][x] == 1) { + grid[y][x] = 2; // Grey for no internet + } + } else if (green_eyes) { + if (y >= 7 && y <= 8 && (x == 8 || x == 16)) { // Eye positions + grid[y][x] = 5; // Green for full battery + } + } else if (red_eyes || yellow_eyes) { + if (y >= 7 && y <= 8 && (x == 8 || x == 16)) { // Eye positions + grid[y][x] = (red_eyes ? 3 : 4); // Red for high CPU, Yellow for high RAM + } + } + } + } +} + +// Function to draw the cat with different colors based on system metrics +void draw_cat(SDL_Renderer *renderer, int grid[GRID_SIZE][GRID_SIZE]) { + SDL_Color color; + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); // Black background + SDL_RenderClear(renderer); + + for (int y = 0; y < GRID_SIZE; y++) { + for (int x = 0; x < GRID_SIZE; x++) { + switch (grid[y][x]) { + case 1: + color = (SDL_Color){255, 255, 255, 255}; // White + break; + case 2: + color = (SDL_Color){169, 169, 169, 255}; // Grey + break; + case 3: + color = (SDL_Color){255, 0, 0, 255}; // Red + break; + case 4: + color = (SDL_Color){255, 255, 0, 255}; // Yellow + break; + case 5: + color = (SDL_Color){0, 255, 0, 255}; // Green + break; + default: + continue; + } + SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, color.a); + SDL_Rect rect = {x * PIXEL_SIZE, y * PIXEL_SIZE, PIXEL_SIZE, PIXEL_SIZE}; + SDL_RenderFillRect(renderer, &rect); + } + } + SDL_RenderPresent(renderer); +} + +int main(int argc, char *argv[]) { + srand(time(NULL)); + bool verbose = false; + bool test = false; + parse_arguments(argc, argv, &verbose, &test); + + if (SDL_Init(SDL_INIT_VIDEO) != 0) { + fprintf(stderr, "SDL_Init Error: %s\n", SDL_GetError()); + return 1; + } + + SDL_Window *window = SDL_CreateWindow("Cat Pet", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_SHOWN); + if (!window) { + fprintf(stderr, "SDL_CreateWindow Error: %s\n", SDL_GetError()); + SDL_Quit(); + return 1; + } + + SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); + if (!renderer) { + fprintf(stderr, "SDL_CreateRenderer Error: %s\n", SDL_GetError()); + SDL_DestroyWindow(window); + SDL_Quit(); + return 1; + } + + bool running = true; + SDL_Event event; + int frame = 0; + Uint32 last_blink_time = SDL_GetTicks(); + Uint32 last_metric_update = SDL_GetTicks(); + int test_state = 0; // State counter for cycling through test scenarios + + int battery = 100; + double cpu_usage = 0.0; + double ram_usage = 0.0; + bool connected = true; + + while (running) { + while (SDL_PollEvent(&event)) { + if (event.type == SDL_QUIT) { + running = false; + } + } + + Uint32 current_time = SDL_GetTicks(); + if (current_time - last_metric_update >= METRIC_UPDATE_INTERVAL) { + if (test) { + // Cycle through different test scenarios + switch (test_state) { + case 0: + battery = 100; // Full battery (green eyes) + cpu_usage = 0.0; + ram_usage = 0.0; + connected = true; + break; + case 1: + battery = 50; + cpu_usage = 90.0; // High CPU (red eyes) + ram_usage = 0.0; + connected = true; + break; + case 2: + battery = 50; + cpu_usage = 0.0; + ram_usage = 90.0; // High RAM (yellow eyes) + connected = true; + break; + case 3: + battery = 50; + cpu_usage = 0.0; + ram_usage = 0.0; + connected = false; // No internet (grey body) + break; + default: + battery = 100; + cpu_usage = 0.0; + ram_usage = 0.0; + connected = true; + break; + } + test_state = (test_state + 1) % 4; + } else { + battery = get_battery_percentage(); + cpu_usage = get_cpu_usage(); + ram_usage = get_ram_usage(); + connected = is_connected(); + } + last_metric_update = current_time; + + if (verbose) { + printf("Battery: %d%%\n", battery); + printf("CPU Usage: %.2f%%\n", cpu_usage); + printf("RAM Usage: %.2f%%\n", ram_usage); + printf("Internet Connection: %s\n", connected ? "Connected" : "Disconnected"); + } + } + + bool green_eyes = (battery >= EYE_GREEN_CONDITION); + bool grey_body = !connected; + bool red_eyes = (cpu_usage >= CPU_USAGE_THRESHOLD); + bool yellow_eyes = (ram_usage >= RAM_USAGE_THRESHOLD); + bool sleepy_mode = (battery < BATTERY_THRESHOLD); + + if (current_time - last_blink_time >= BLINK_INTERVAL) { + frame = (frame + 1) % 2; // Toggle between frame 0 and 1 for blinking + last_blink_time = current_time; + } + + int current_grid[GRID_SIZE][GRID_SIZE]; + if (sleepy_mode) { + memcpy(current_grid, sleepy_cat, sizeof(current_grid)); // Use sleepy cat grid + } else { + memcpy(current_grid, cat_frames[frame], sizeof(current_grid)); // Use regular/blinking grid + } + + modify_grid(current_grid, grey_body, red_eyes && frame == 0, yellow_eyes && frame == 0, green_eyes && frame == 0); + draw_cat(renderer, current_grid); + + SDL_Delay(100); // Delay to control frame rate + } + + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); + SDL_Quit(); + + return 0; +} +