From 681acbf5ce3969fdd01a11a026d5d2fabb496af7 Mon Sep 17 00:00:00 2001 From: klein panic Date: Sun, 29 Sep 2024 02:33:35 -0400 Subject: [PATCH] initial commit --- build/Makefile | 23 ++++++++++++++ build/battery_saver | Bin 0 -> 16864 bytes include/brightness_control.h | 6 ++++ include/cpu_control.h | 6 ++++ include/service_control.h | 7 +++++ include/utils.h | 8 +++++ obj/brightness_control.o | Bin 0 -> 1800 bytes obj/cpu_control.o | Bin 0 -> 1928 bytes obj/main.o | Bin 0 -> 3304 bytes obj/service_control.o | Bin 0 -> 1640 bytes obj/utils.o | Bin 0 -> 2464 bytes src/brightness_control.c | 16 ++++++++++ src/cpu_control.c | 19 +++++++++++ src/main.c | 59 +++++++++++++++++++++++++++++++++++ src/service_control.c | 11 +++++++ src/utils.c | 24 ++++++++++++++ 16 files changed, 179 insertions(+) create mode 100644 build/Makefile create mode 100755 build/battery_saver create mode 100644 include/brightness_control.h create mode 100644 include/cpu_control.h create mode 100644 include/service_control.h create mode 100644 include/utils.h create mode 100644 obj/brightness_control.o create mode 100644 obj/cpu_control.o create mode 100644 obj/main.o create mode 100644 obj/service_control.o create mode 100644 obj/utils.o create mode 100644 src/brightness_control.c create mode 100644 src/cpu_control.c create mode 100644 src/main.c create mode 100644 src/service_control.c create mode 100644 src/utils.c diff --git a/build/Makefile b/build/Makefile new file mode 100644 index 0000000..a2b1c08 --- /dev/null +++ b/build/Makefile @@ -0,0 +1,23 @@ +# Variables +CC = gcc +CFLAGS = -Wall -I../include +SRC = ../src +OBJ = ../obj +BIN = battery_saver +OBJS = $(OBJ)/main.o $(OBJ)/cpu_control.o $(OBJ)/brightness_control.o $(OBJ)/service_control.o $(OBJ)/utils.o +DEPS = ../include/cpu_control.h ../include/brightness_control.h ../include/service_control.h ../include/utils.h + +# Targets +$(BIN): $(OBJS) + $(CC) $(CFLAGS) -o $(BIN) $(OBJS) + +$(OBJ)/%.o: $(SRC)/%.c $(DEPS) + mkdir -p $(OBJ) + $(CC) $(CFLAGS) -c $< -o $@ + +# Clean up build +clean: + rm -rf $(OBJ)/*.o $(BIN) + +# Phony targets +.PHONY: clean diff --git a/build/battery_saver b/build/battery_saver new file mode 100755 index 0000000000000000000000000000000000000000..5318efcfc884bc594ee7ddfb86bb105619b7d386 GIT binary patch literal 16864 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 VFfcF(;?REp>ZnAxN(cj8KLF7fo$det literal 0 HcmV?d00001 diff --git a/obj/utils.o b/obj/utils.o new file mode 100644 index 0000000000000000000000000000000000000000..e7f97253e29de70f1ca6305af03ea200134236b6 GIT binary patch literal 2464 zcmb<-^>JfjWMqH=Mg}_u1P><4z>vU(U^{@B4h*~uJPe^8oliZQ-za!=*1quQWd+H2 zbRL7Vj=zA2xc=~HuKmGKqU+He`og2z^@m3oq@`F%wQ6 z23rTS23a3m3}OtNi)1uhj94WTVh=MUGU%5j7U}2Yr|TyrmXxFxRmK-5mZcWy<>aR` zs1|cExFu%hq^2m8u$El+?1! zI%OJ>N)PmeDK$00*nenDy;Ls~&mW?o4eLt1i9esL;8L26M^eh~v$5T>xWvbZEQ z7wj>9Fv-Bc!~hB>28KWXAwUvM{2xU4zamteg@FMasxbA|P;rSsd5Ve0Fk{AExYq#oJ)wNP=G`W`5ME0hMQM>c;CR2-)M0F-|cN`urRn|}c+4pV;) z%D(}nLF$psSAdFx)PpdT%K#~>A@L3phowgbz2eH;lEfqiz2cH02%Q0A6{Y4R>XoEc zlrZR}B$gyH=p_{wGw2oNLpaI#xw)x%B@B9b`6a1(?tY=V#U+W!*$jGMZK)aYX+?>- zsWAH~r9u7zl?9+Qg=`kgU-yv(85odqIz$4L-#}pnQx6ekV0gg{VLbpD&cMI`3VRR} zl;%J(5+H(sfk6#wCR908lz~AWq!`XaFwli{7#J8pW|FJl5Nbat?hv*xFepGRdW)(LG>f60kM^#`ax`D4AT!21Lc2^7`k!|s6Yfv zA(RG%6_g34f*2SWu*KgAXi*RI7byNfdO;YZ5f*>g>;}m_OKLsz1=< m4y1npR1j9KfW$x;WFLrzVL@nl3**D+A5ixv!UUi+x_$uM(OFdh literal 0 HcmV?d00001 diff --git a/src/brightness_control.c b/src/brightness_control.c new file mode 100644 index 0000000..d894803 --- /dev/null +++ b/src/brightness_control.c @@ -0,0 +1,16 @@ +#include +#include +#include "brightness_control.h" + +int adjust_brightness(int value) { + FILE *brightness = fopen("/sys/class/backlight/intel_backlight/brightness", "w"); + if (brightness) { + fprintf(brightness, "%d", value); + fclose(brightness); + return 0; + } else { + perror("Failed to adjust brightness"); + return 1; + } +} + diff --git a/src/cpu_control.c b/src/cpu_control.c new file mode 100644 index 0000000..45fb9ad --- /dev/null +++ b/src/cpu_control.c @@ -0,0 +1,19 @@ +#include +#include +#include // Add this for sysconf() +#include "cpu_control.h" + +void set_cpu_governor(const char *governor) { + int cpu_count = sysconf(_SC_NPROCESSORS_ONLN); + for (int i = 0; i < cpu_count; i++) { + char path[64]; + sprintf(path, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_governor", i); + FILE *f = fopen(path, "w"); + if (f) { + fprintf(f, "%s", governor); + fclose(f); + } else { + perror("Failed to set CPU governor"); + } + } +} diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..09f9acc --- /dev/null +++ b/src/main.c @@ -0,0 +1,59 @@ +#include +#include +#include +#include "cpu_control.h" +#include "brightness_control.h" +#include "service_control.h" +#include "utils.h" + +void print_usage() { + printf("Usage: battery_saver --enable | --disable | --status\n"); + printf("--enable : Enable battery saving mode\n"); + printf("--disable : Disable battery saving mode and restore settings\n"); + printf("--status : Display current battery saving mode status\n"); +} + +int main(int argc, char *argv[]) { + int opt; + int enable = 0, disable = 0, status = 0; + + struct option long_options[] = { + {"enable", no_argument, &enable, 1}, + {"disable", no_argument, &disable, 1}, + {"status", no_argument, &status, 1}, + {0, 0, 0, 0} + }; + + if (argc < 2) { + print_usage(); + return 1; + } + + while ((opt = getopt_long(argc, argv, "", long_options, NULL)) != -1) { + if (opt == '?') { + print_usage(); + return 1; + } + } + + if (enable) { + set_cpu_governor("powersave"); + adjust_brightness(20); // Set to 20% brightness + disable_services(); + log_status("Battery saving mode enabled."); + printf("Battery saving mode enabled.\n"); + } else if (disable) { + set_cpu_governor("ondemand"); + adjust_brightness(100); // Restore brightness to 100% + enable_services(); + log_status("Battery saving mode disabled."); + printf("Battery saving mode disabled.\n"); + } else if (status) { + print_status(); + } else { + print_usage(); // Fallback to usage message if no valid option + return 1; + } + + return 0; +} diff --git a/src/service_control.c b/src/service_control.c new file mode 100644 index 0000000..c3b3791 --- /dev/null +++ b/src/service_control.c @@ -0,0 +1,11 @@ +#include +#include +#include "service_control.h" + +int disable_services() { + return system("nmcli radio wifi off && rfkill block bluetooth"); +} + +int enable_services() { + return system("nmcli radio wifi on && rfkill unblock bluetooth"); +} diff --git a/src/utils.c b/src/utils.c new file mode 100644 index 0000000..2edf385 --- /dev/null +++ b/src/utils.c @@ -0,0 +1,24 @@ +#include +#include +#include "utils.h" + +void log_status(const char *message) { + FILE *logfile = fopen("/var/log/battery_saver.log", "a"); + if (logfile) { + fprintf(logfile, "%s\n", message); + fclose(logfile); + } else { + perror("Failed to write to log"); + } +} + +void print_status() { + printf("CPU Governor: "); + system("cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor"); + printf("Brightness: "); + system("cat /sys/class/backlight/intel_backlight/brightness"); + printf("WiFi Status: "); + system("nmcli radio wifi"); +} + +