From c60843f9ff7c13d6d8833619d65706d570605ced Mon Sep 17 00:00:00 2001 From: klein panic Date: Fri, 10 Jan 2025 13:49:44 -0500 Subject: [PATCH] updated metricpet --- .gitignore | 1 + LICENSE | 22 ++ Makefile | 20 ++ README.md | 78 ++++++- blackcat.jpg | Bin 13336 -> 0 bytes blackcat.txt | 54 ----- cat_lay.jpeg | Bin 5998 -> 0 bytes image_to_grid_convert | Bin 16640 -> 0 bytes image_to_grid_convert.c | 71 ------ metricpet | Bin 0 -> 26504 bytes metricpet.c | 503 +++++++++++++++++++++++++++++----------- pet_program | Bin 30312 -> 0 bytes pet_program.c | 458 ------------------------------------ pet_program.c.bak | 394 ------------------------------- 14 files changed, 487 insertions(+), 1114 deletions(-) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 Makefile delete mode 100644 blackcat.jpg delete mode 100644 blackcat.txt delete mode 100644 cat_lay.jpeg delete mode 100755 image_to_grid_convert delete mode 100644 image_to_grid_convert.c create mode 100755 metricpet delete mode 100755 pet_program delete mode 100644 pet_program.c delete mode 100644 pet_program.c.bak diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2bfa6a4 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +tests/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..bce361a --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) [year] [fullname] + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..c35c3b7 --- /dev/null +++ b/Makefile @@ -0,0 +1,20 @@ +CC = gcc +CFLAGS = -Wall -Wextra -O3 `sdl2-config --cflags` +LDFLAGS = `sdl2-config --libs` -lSDL2_image +TARGET = metricpet +SRC = metricpet.c +BIN_DIR = /usr/local/bin + +all: $(TARGET) + +$(TARGET): $(SRC) + $(CC) $(CFLAGS) $(SRC) -o $(TARGET) $(LDFLAGS) + +clean: + rm -f $(TARGET) + +install: $(TARGET) + sudo mv $(TARGET) $(BIN_DIR) + +.PHONY: all clean install + diff --git a/README.md b/README.md index e50deaf..53b2266 100644 --- a/README.md +++ b/README.md @@ -1 +1,77 @@ -# metriccat +# MetricPet + +**MetricPet** is a fun, visual terminal program that displays a pixel-art pet cat whose appearance changes dynamically based on your system's metrics. The cat will display different moods and eye colors based on CPU usage, RAM usage, battery percentage, and internet connection status. + +## Features + +- **Dynamic Appearance**: The cat changes its eye color or body color based on system metrics: + - **Green Eyes**: Full battery. + - **Red Eyes**: High CPU usage. + - **Yellow Eyes**: High RAM usage. + - **Grey Body**: No internet connection. +- **Blinking Animation**: The cat blinks every few seconds. +- **Test Mode**: Simulates different system conditions to visualize how the pet reacts. +- **Verbose Mode**: Shows detailed debug information about current system metrics. + +## Installation + +1. Clone the repository and navigate to the directory. +2. Build and install the program using the following commands: + ```bash + make + sudo make install + ``` + This will move the compiled binary to `/usr/local/bin`, making it accessible from anywhere. + +3. To clean up the build files, run: + ```bash + make clean + ``` + +## Usage + +```bash +metricpet [OPTIONS] +``` + +### Available Options + +- `--verbose`: Show detailed debug information about system metrics. +- `--test`: Simulate changing metrics to see how the pet reacts. +- `--version`: Display the program version. +- `--help`: Display the help message. + +## Example + +```bash +metricpet --verbose +``` + +This command will display the pet while showing detailed metric information in the terminal. + +```bash +metricpet --test +``` + +This command will simulate high CPU, high RAM, low battery, and no internet states in sequence. + +## Requirements + +- SDL2 library +- SDL2_image library + +You can install these libraries using the following commands: + +### On Debian/Ubuntu: + +```bash +sudo apt update +sudo apt install libsdl2-dev libsdl2-image-dev +``` + +### On Arch Linux: + +```bash +sudo pacman -S sdl2 sdl2_image +``` +--- diff --git a/blackcat.jpg b/blackcat.jpg deleted file mode 100644 index 0e8a465e051e69b9c012a5cfba3e92a0898a6777..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13336 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 FCII*sDgFQe diff --git a/blackcat.txt b/blackcat.txt deleted file mode 100644 index 2f3988b..0000000 --- a/blackcat.txt +++ /dev/null @@ -1,54 +0,0 @@ -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 deleted file mode 100644 index ba8ecbfbb751be2f8c0f95bdca12bc3a996075b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5998 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 amR>$LJL_fm6xRThJ_TAAgD_YA|4jfA!sw#_ diff --git a/image_to_grid_convert b/image_to_grid_convert deleted file mode 100755 index 1b096a0055c54d59bc06e8fffc7475945a5fb3e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16640 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 T)2{^Ts53AyNTF#!<1zpMmFGgo diff --git a/image_to_grid_convert.c b/image_to_grid_convert.c deleted file mode 100644 index 22488d2..0000000 --- a/image_to_grid_convert.c +++ /dev/null @@ -1,71 +0,0 @@ -#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 b/metricpet new file mode 100755 index 0000000000000000000000000000000000000000..4a275b0804896e4217268c31c75fd30c483affdd GIT binary patch literal 26504 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 yOF#-i`2*&55FdtTL_%01umM&G7qmPJ%7Rd!VP #include #include +#include +#include #include +#include -#define WINDOW_WIDTH 64 -#define WINDOW_HEIGHT 64 +#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 CONNECTION_CHECK_CMD "ping -c 1 google.com > /dev/null 2>&1" +#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" -// Pet mood states -typedef enum { HAPPY, NEUTRAL, SAD, ANGRY, SWEATING, TIRED, CONFUSED } Mood; +// 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(); -// 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} +// 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 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} + // 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 } + } }; -// Function to get CPU usage (simplified) +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; - double usage = 0.0; - - FILE *file = fopen("/proc/stat", "r"); - if (file == NULL) { - perror("Failed to open /proc/stat"); + 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_time; - fscanf(file, "cpu %ld %ld %ld %ld", &user, &nice, &system, &idle_time); - fclose(file); + 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_time; - total = user + nice + system + idle; + idle = idle_now; + total = user + nice + system + idle_now + iowait + irq + softirq; - 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; - } + 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 percentage +// Function to get RAM usage double get_ram_usage() { - long total, free, available; - FILE *file = fopen("/proc/meminfo", "r"); - if (file == NULL) { - perror("Failed to open /proc/meminfo"); + struct sysinfo info; + if (sysinfo(&info) != 0) { + fprintf(stderr, "Error reading RAM usage: %s\n", strerror(errno)); 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; + double used_ram = (double)(info.totalram - info.freeram) / info.totalram * 100.0; + return used_ram; } // Function to check internet connection bool is_connected() { - return system(CONNECTION_CHECK_CMD) == 0; -} + struct ifaddrs *ifaddr, *ifa; + bool connected = false; -// 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); + if (getifaddrs(&ifaddr) == -1) { + fprintf(stderr, "Error checking internet connection: %s\n", strerror(errno)); + return false; + } - 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); - } + 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); } -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[]) { + srand(time(NULL)); bool verbose = false; - if (argc > 1 && strcmp(argv[1], "--verbose") == 0) { - verbose = true; - } + 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()); @@ -164,14 +305,14 @@ int main(int argc, char *argv[]) { } SDL_Window *window = SDL_CreateWindow("Cat Pet", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_SHOWN); - if (window == NULL) { + 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 == NULL) { + if (!renderer) { fprintf(stderr, "SDL_CreateRenderer Error: %s\n", SDL_GetError()); SDL_DestroyWindow(window); SDL_Quit(); @@ -181,6 +322,14 @@ int main(int argc, char *argv[]) { 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)) { @@ -189,33 +338,115 @@ int main(int argc, char *argv[]) { } } - double cpu_usage = get_cpu_usage(); - double ram_usage = get_ram_usage(); - int battery = get_battery_percentage(); - bool connected = is_connected(); + 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; - 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; + 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 { - mood = HAPPY; + memcpy(current_grid, cat_frames[frame], sizeof(current_grid)); // Use regular/blinking grid } - if (verbose) { - print_verbose_info(mood, cpu_usage, ram_usage, battery, connected); - } + modify_grid(current_grid, grey_body, red_eyes && frame == 0, yellow_eyes && frame == 0, green_eyes && frame == 0); + draw_cat(renderer, current_grid); - draw_pet(renderer, mood, frame); - frame++; - SDL_Delay(500); + SDL_Delay(100); // Delay to control frame rate } SDL_DestroyRenderer(renderer); diff --git a/pet_program b/pet_program deleted file mode 100755 index 7f8f8cc05216bc6f7006fb4362dff32c53c6a261..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30312 zcmb<-^>JfjWMqH=W(GS35YIsfBH{p{7*^y#84L^z4h$9yybKNu@(gkeYzzzxEMPH+ zJWM@|zQF_$htV7mE(0@Ep9F}(z`%e`%Rtq^XpoygLLeGsABc?&AK-(C!e|Bo2p^=6 z6~u({Vd5})D%8I)8YT|X2e!`uq?v(%0gZm61QCbP$ofEGb08KXe;^l?4uJZ*0ZPO4 zfr1O9?*dfc1*kq4{Q=}41_lNg4GT|@8$s9tY92bR0I{9{Mx*PCfa*i1U7-44G{_E+ zQ1H`|6c8KT9vB~H4~&M{7Xa0_A^>Cx0|Po;0ug3_(I7iOLV-_9Qb6GXViSX5(HsP| z4_7=mfC3zpexWopcp3C_GLy_q^m9^lb29TvD|9O?%yi96^osNKjKJ1|+y$}&l&0MM zLK&DE7!H8MVERF95e5cuItR&bn`)eDyg+_#`dXjqeZ_i(mzch81E~R-0n!6f12PyC z4N#|mxM2ON3=H5r3G#o3<3dIT76vVlm zg%Pl<1674eon>HPfF^kq34a{ohZwP|kHsPW2ZuRFaENchA>N6@{7M|^d2y&;fSy8*pM*pFJr45?aH!YDA#ROBd;<>gBpmj} z;83rILtFue_+=d8p!@|ZgOC$?77q2GyogQxb{y(;7#QGXDzf>%7#SD@7$g}43Xw$_ z7^)Z<7@$=KiUcncNWBz;1Dg5(u)X{Y+0fjq2r2{^7#Kns85jf^q!<*S>S5(8Bh(yp zdl};6({uCl;)_cXi%R0-8R9)deB)D6i&E1wi%U|ALVTTb^7B$d5|eULA#zw{f?a&# zJ@Yb47(fi?qSVBa)S%QnkTFGIq2SaK2;ZeBvD`U7Cm$m0l3H9+lwS#vN`;B#Bvyho zxu=%678OC22IS}DxR#~nL9Br22q;P|hKU50LT!hd8J?M!l3xxs2cp?&F<27fSPa!}nK?N@smUb_Y3ZpY#S8_dCB+P>6`3UrY54`Ic?>0)xv31rmBpEP zY55HC@j01E$H@Tn^q%1kNfFV7#Br`2B zC8emCAwE8}s3N+VQ}~HbaIY2(lds$%;79U6FAct!8Fn{1=mE33``7642)n1 zqZt{P89)^iNDhQq!74!NKo}$fqS+W28CV$@89+2h3}gn#1W^6P3U1SY@+&A~2xn&U zGBB_)2!Ycx1A{o2&&nVJpyewV|3E%OA1E8DL6~6j1d=!}SOh{`KoUnTS8gDQBbNsc zki=CWMu16JJ_ofoG{GWJq5wj(gJTB529X>{;?N)f2{Q;FiG$i2U_ns(8%Z40E`ffyp08;>uu=QGyyF z;L-es!=sz^Y&-*lN9%zSrvDc_nvZZCh8z9g^i(_p!++H?@eB<7@(v9DRYCj=ko?OB z|NsC0uX-q+fguCbY$5dAR}1Uj^cWikO!R!2CrZKB#DU zIRVU{1>%E>l$Q-){v;3|RFu3d0Q0**d{7bcG6BqQ0`Wmb$IAdPzY4?$6&Wub!2BW* zA5>JlGywCnKzvXU@lpZIPXh5lMfOVpFh2^!2Ne}B8NmD?5Fb=Ty!`MFz;pGJ|-wMPB6$LL3fcZusKBx$IxdF`A0`Wmv|K$QOUkStqW%-vAzs$D`MFW*h^9 zM=$Fn5M}wJMAW03)h!m1{5bzV;FoUzDLxFPJ$h|3K?-|KlR%W_Kab829tYpqdmQ}1 z?7?`<d|a_Du#i9!K3qO z36Dp&En6G|!wb#-|Np;8`Tzg_F;>wy1_s91!~F6n`d^m+|NlSKqw}dp^BVz=UREC~ zkO{{;dRg7Ttm7}t{{8>&(dqibqq+76L#f$|Z-4&(?`G&c{=)VzNaB!3H|u7Q3wwEO zz&g%(bRORU^5zSlfB*mQ0Hw3ndLF%@Up%^9e|TW3N&}e>lIlGEV%6XO|GQnkoIDJ6 zQRABgMsRR$w}d&032epj7Yo65!yIMtA`#}O6@Orkl7l$vHdrshQQQCi|DVSH{=iFD zklEd#KRkL{L5Y1IXc)qy^Z1KxAfut~k^1}pzfW%~D6xC=?mYo=X>TtmD|qxyy#eNd z^@0nU-mNSC{r?~4(YqCt7eMq55Z|}+pl9a~k6zOu_yt%)tr-~7_%%*^;*U86;`>@NFnr>V zJot%U(Di{wx9bOwPS%^zAfsJhcyzK}iv~#xxIRep;IBK7=E0wL02*)2M;bhOT^m4w zDf#FB|JDN~rY{csf~Few->?X(1)0^$TWw1rF*99Kkp({KzFL<;b zsNjZq=D=%7kIq9L7hg3$VD#Wb`0*2e!~w7#sA8}ePhcnp3!nPLA8``d_wiOB??fH~ z`S!;regW4XnEraBaLn~PgGVpO|HohK{r&%c^N;_fW-lK9gnCZv7tC`DqChE^_nvzW2LJ(mFL`FOX z(SQ7f*zf=U`M0@#hXwu{gU;GF9-XBRJUT;fcy#(+IPUrfT!ncsGB9+z{_&XM(JOKk zltDeZT_1o_O*ex_uc$rPrPn}_R`LrJX{9_K-L5x|F)+U5#;Z{Pq0t(mQ5dSxquccY zNdIXDd=_6f0|gP-;@>~P7K?yG=mjSu1H*ohJ6{|Ig)dH*FF+Wu3&ntR2ABa&I1Lc+ z=w|&A0gkJ9usMi?*!vS2S1&*{#(q#3zOelH|9`XVAI5IiKh~~q_A+-WU&oO2!%8EKSWn z82MX+peciRoyS?4!0jgqu+29ZO5&Pp|FH4*aWFD4G}r#&;P3y(0Al^%DB)_Z{UN~L z`VN|UNU{Um=Gwvl^4$Z5l4yt>pm9=&9kbBv=px4sP`mGSa6|1Kh7wE%HMvIfq|j(fCntG^s-u*FfeqpFo6mgQ5_Qo1`oyy{~sK4{qp~q>(~FsT)+K4 z=KB5rYxiTWUsfJ-{krm)>$jC)5mTrdhGVYZ7{DURP!W(Wh=|}Z*DnlEbHE}KK;<6) zwjcc4T)**eJHfxr^(+6j3;f$$zwmGS0P?hB=MRv-H-7~+D}Ee&z})HjpxgBinDOMe z>kCj*`?%{H5arPu3aaF8cyxk`qJ}S^j1G&3`~N_^Ka7xgI0~xyyIpU9jMn(_|357M zH@+$0VqoapJLfB?7T7xB>;M0d@@w*!|NlFWzgY9-|NmpI+Zc|yZe{T3_1)^x8@kP- z8?3Io6{M;2_zR0)|Nrj?4W_*C`vNKqOAKD9egPQ=s=>WOzy;MCBT$KnD5#!%`Tu_h zsCargg_VK9aVIDZIqo7-Un*rfkNZdC$OmpJeq3{FqAsJ z$by?X0b*(L}%=`TRf2Zr07t_G> zhvTkqKuP?#>x&cyP`l;*0Z`5T0Nh647j(UG%=J3s%Lo<*hVE8S-^v!$yenln=K7z( zqZcd!vU1fYP#BlqdEp2)bWgYI9&OhTw(+kR82H;RF)}dlZ*$$+a)7_(3%I~|!_40@ z8OG{g0bwzfBsAB)VdC$f0pT;0a5vY!VJuO9+0FpUV))$G3{e4^b_2Dz9vgz%AcC%_ zzIdH*-1P-W3CwQ~Kx(%`)q*|x+7?|2Of5*7;k6vzV4BeF`ldI4vGc;gAMyuZ$T1#j ze#ESKs5A7bx)`3 z2mWoY+d!cR>iu-PzUTziU$q9HL=3IJHhlmWQlO?}-T{wZ)_kZWC{e$d3X!}4Zen`$ zvZf+SR($yXzoGUzLkXuxFKe6u1H)@}k6zYzuo93pNnjS#8t)JP|2NmZNamk^pu=@H z|2Eg_tq1t09%%l+$iMAChwH9})Lo3Arr(1!etocE{F4uKxb6fA-2e%B8!#|{g?2R8 zz7Xc0cc8;{JKTrhbaDZb2AKI{`zz9wSDCr2M79`DpGZla{#TVPdoD2+Qa^0>! z5J^QIlvEf&N#zGP7``;rZf7Xb@aSz_04f4|MXi(=7kg|$7?-sQ^F(jz!6SRi6ffJ2cmccpxSqVg*!nd&BdhT0vtWluEJ?!+y7fqz@+E~urj3IkMW_D%)+qTBTVv`%RG@&EsRP%OP@ zdIxgPe+K^6^`PzySjq7hHt)cx7+jcbc>DkVi{EddEy$CH!Cgd@(I-&pHHt?=U^E0q zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!ns1X97Rap4U0gWyUb_{brsqTd71JQ)^g4Dn; zA+^ZzFg-9DSq_;ElZVmBa)j70J*3iv%te+b)@+y_n0gqW7#gMrM8njB*vJ?p4&%ev zAes~m(hpJ(qCps$4dNqXm>h^E7Q^&|)Wg{LXk>LDHZd4x9!M>Wjg1D$gD|ojh))d0 zrUxbl(hp-}qe1e-U~GDc5hKQIWHrQ?iLM4&KQU}{{UAO}ABc^PVREF>=;q+!lWH!y zdR*ori=*oym5*!|J~pZ5BCE$|F1j4DK4RJEW)R{NYc8@nLS~}NBkLuGjjo>yS(^n%pDFd?n_$Z~|(Fg>Kwgv>>jC)I42dSo*Qv0-|UX^ zT^z(G7UMGqSq{VonF*p{7{n(ABddq8@zEeNVe%k0F&L&E8x7KrO&lf$k|zek)RRgR zV>YrHQq2dcN7hda8>EL6OpKY>)DUY2Hoc^X5n~T2=3!Gyj2$2~*z^)B2GUO~Ce}=3 zb;OztQ-`dVST;;Au{5#f!qgFKF0wk9UServy~MJKH5;amSaV_OVEV|VVdh|?$u*PO z`mnhTBt~s}u$c$4XB3Zyz-S1JhQMeDjE2By2#kinXb4a*1d13K81#!Pi}jOp5{rxV z3-ZfTi{gt*3kq^7^_?6;4D^!|3lftvOF(BHflo?NC`wIC$;?YvNJ=azNiC{WC`c_z zPR%PxOi#5^P%Y+SP)%XbFDS}S)-NteEMY*^;~WsGP+AOE3iU>EL8*d*YEB9+jAlrX zqc5r<5Id4HQj@bm4$I6dNiE7tEm26$&&x|q2Ax*|aha}eS!z)d=-?Aw-ICPe5(cn9 zG3Y!KUEPe-oC1c>yzIRE@;rt70)(zmhxe3q6b6< zXXcjXB$lKqBxfY%rGq?`n_5zonOv-pmS3a*Qk$8V4%SzeS_JX{NRxts0@yy7E1^;h zV09qxK^4K&m1JZVD}cpwQ;R{KWH8h-&@*5NNG(wafci8HYCI@n877?h|NrLc|Nmc~ z{{R2)>Hq)v&;0+dc;^3q(1ARllX(=t5djHn=fo0)fK_hWAgclCgUCUS&q*yp zmUV)pFDnJr6jfC&22j$0Mun=LQ5r}Hln~H_oFP%3n!@0cSqzQ;)D#9!SdxIsXXfWY zoC%2lF!{kAOff`4jt^`IgU}2i4vf;w)}S-tKpXWd_W%EXfPsObmrqUeu->z83PezgNgUi=2GBC_O`Tsxoj4ZhOWY{1!fGi!wqaiRF0;3@?8Umvs zFd71*Aut*OqaiS~LjZP;CG6ZvP}3OXqx(<>lmefv2@(e#dW&i2KR{=7#KhY$$`|v?En2A;vWVE2C&k9P<{tg z|9>bS9?np{0aX4cln-?t$mjvVu=C^5EjI(5WXHh3;0C3`pmZ9PE`!o-Pq`Wlpe2Bp72X*SRac?=8;Vo+KQN}EAxHz*wjrPH8v8I*2=($k>yGAO+bN*{yL z*P!$>DE$pevw=?J1KAIy)u1#iJYeU$x;r~tDQLK)CS@k(DHs~*8R;458k%TAnK0Fu zG${UA7(Rjym_d;Qr6)px;SR8R5e8U! z01^Y?<>31pF#Wp~tX_)20BSEd(=aeF9E6Hnpo!xOhjU={!VE8hK(?V`Y~cnPn*g0q z54%qQrUP`|IU|D@1A6)go$bWPAOSB&VCwn6=WWAy2pTk=gckH*Nn;%9uP}pL16G1U zK+f|<5dw1(ahQYaoN~}u2e$LYo5AMrGu(g{)Znoa1_p+i%%F41B^el?;SaWyfq|h1 ztRBWg&SSPG0FQ|=Ffe35#fza87pz_>1B)XW3}tqJ#rYY|K>Y> z;}G9~L;L_(oS#7xl+hR%7{FtP3=9m{!Qw~;Lzypeh|dM5XMP6Qy)e+`0s}Kx9I6?K z62l>`%nUlWUXVcndXGv6)LnWY^-MgVL-3JIVPG%;sb|7GN8bUY9z`XD6NE!N87$7v z;0=v0@E9ip1498=9HJMQYysJe<$V3=%pfOX=A$KGam@4kSK=^#4-WCmIK-br%|}1i z|1%EtEG(e>g6ty*TMR7D&#)UB?%-2m7#J8-SRnCoz!{q4i5EgIMh$Yp?(z(^$fwuMJ0xMpi}x2lQQE=64M!yi%N=1 zO4HKxk{LiZ6hJOIh%d>FPX=9e06I`VB|knrCqF4MCqAVlzoQl+xVXN{0A&Bwl=GUSm#ska?5>V%PFfJ5ufZYfHI_DoTFNAbw z0{rp?$XpTZUIyq511Uv`_UiPsYPfv zC7|dAU$+2q6GSom+J^Y}l;ZsOjKsW@oK%L~{FKbJ%J}r6Oo;iYcS*RUf-al@#~$WY z4sgqiO~6ir-$_xBSX7)EpIDS$nwy$eQVhC~A-*UvHy%8L$^f~n0j}B5gaLdNL_BQT z59DIdtQ`0v3Ai#?_(J>wxv(NVwIm)on;Vaq&4pYkfua$9y#(aG2)LX%1LQ&pxB$!+ z_%#^Gi6xN4SMgGzPx!0!1(A8VnSH%;I>&Y##Jd3={>B>o8D+;^RS= zPat1AQCw1#oLhjR2oy?KZVrK7tAU~v`4$V%WgRGz;5$4}L_ndMTu=&)t>T>2)PhQI z5`{z)XyO(58V$H!V+OqUqoCgK0oP@Ye#r{r_71ojsL5DwS7FdAuFNe-Ok&V0E-8Z0 z888-jLcM@NFE76&RWCiSRIi{YzaX`!q!LLesWdYuMK?1AD&*+osS7Fx!OAldi!&JX zQY!O`D{~=qNf85B29{QlIq^jddPS)@i69M7RzXe)gC3|nW6&$eDbY*MFJaItNv$Yh z&;yl+40=WRpqOUROU-~JviOXYA_Nbj6;c#Jbimjtm3fJ|naKLLml?V}SZV&|wCg_szkq0jY(tK{V*j0npe1Oh4?NGZ+o(pMliDFs$DL zK^BMzejJ!?*wc^I`6XjnBYn z8;~VP<1^^)2i5zaArzQ?*!T^M=73rVaw910VEUoW28K)q$X#eK{jl*M7!4c$fjR>; zjSpjjX;8NXG}Z#s4;x>B(P3a!i18(uIv8EYzyLbV9`1kG_zjFsfa*tgKUA0jbWa$_ zi!k$G<3}(W*3JiATmaI8?tjp|VIciZAW6_XIw&xaXz)dE(C`O^8M^+3;Qlbef3Wd8 z7!4cef*KFLlM%)S(V)41P`tq0rvM$7fzhCT6i6KmL#1KHGl2U0$odVSoh}#+b1zIk zj1QwXpt&E`kATrWFbkmupm72CYp2*#pDq_Fsa!A7;NoAVejMJ_9lwA_OL3;Rfa~Fff3|H$azC zK!=gw<1w&%4bj!Z_%Ir@P6l*|1x!C|{PqO&o=KQGn0+ulj0PR<3Q9XL{jl*A*gci7 z`zS&A2V@3JA1oeML;Vla54%U{Ks-n_0|V?XLkJH#*a{nTWnf_Vi>4no{`&%|A9PkW zOfQIr*$<=H7$JL2VfMqvK|lo?XdD5g2?@jW!Gw4iA#Q@{huy~{0M(D4UeNi1Q2U|X zUYM~AF#VtlHsFF#zk>L%WC5aKX$K?@!v;|MXFvlUbdd*W3>@ZuP+0;}3(6lbw}bdF 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 deleted file mode 100644 index 53d14c5..0000000 --- a/pet_program.c.bak +++ /dev/null @@ -1,394 +0,0 @@ -#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; -} -