added sleep, some error checking and details to README.md

This commit is contained in:
celso 2022-11-19 14:44:35 -03:00
parent a31d04c2e8
commit a4290beb57
2 changed files with 33 additions and 6 deletions

View File

@ -38,6 +38,8 @@ You must provide the temperature at which you wish to step down the maximum freq
`homemade_speedstep <max temp> <min temp>` `homemade_speedstep <max temp> <min temp>`
**Important**: max temp and min temp must be passed as 5 digit integers, like so: 82ºC = 82000
--- ---
**Recomendation**: add a service to your init script that runs this program at startup in the background so you don't need to keep a terminal emulator open running it. **Recomendation**: add a service to your init script that runs this program at startup in the background so you don't need to keep a terminal emulator open running it.

View File

@ -1,6 +1,8 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h>
#define POLLING_TIME 1
#define CURGOV "/sys/devices/system/cpu/cpufreq/policy0/scaling_governor" #define CURGOV "/sys/devices/system/cpu/cpufreq/policy0/scaling_governor"
#define FREQS "/sys/devices/system/cpu/cpufreq/policy0/scaling_available_frequencies" #define FREQS "/sys/devices/system/cpu/cpufreq/policy0/scaling_available_frequencies"
#define MAXSPDPATH "/sys/devices/system/cpu/cpufreq/policy0/scaling_max_freq" #define MAXSPDPATH "/sys/devices/system/cpu/cpufreq/policy0/scaling_max_freq"
@ -113,9 +115,15 @@ int main(int argc, char** argv){
fprintf(stderr, " see homemade_speedstep --help\n"); fprintf(stderr, " see homemade_speedstep --help\n");
return 1; return 1;
} }
/* set maxtemp and mintemp TODO: check for integer and difference */ /* set maxtemp and mintemp TODO: check for integer */
const int maxtemp = stringtoint(argv[1], stringlength(argv[1])); const int maxtemp = stringtoint(argv[1], stringlength(argv[1]));
const int mintemp = stringtoint(argv[2], stringlength(argv[2])); const int mintemp = stringtoint(argv[2], stringlength(argv[2]));
/* check that the values are, at the very least, different
and that max is higher than min */
if (maxtemp <= mintemp){
fprintf(stderr, "error: maxtemp must be higher than mintemp\n");
return 2;
}
/* try to open scaling_current_governor, exit on fail */ /* try to open scaling_current_governor, exit on fail */
FILE* govfile = fopen(CURGOV, "r"); FILE* govfile = fopen(CURGOV, "r");
if (govfile == NULL){ if (govfile == NULL){
@ -124,7 +132,7 @@ int main(int argc, char** argv){
fprintf(stderr, " and the userspace governor in your kernel\n"); fprintf(stderr, " and the userspace governor in your kernel\n");
fprintf(stderr, " also check that you're running this program\n"); fprintf(stderr, " also check that you're running this program\n");
fprintf(stderr, " as root\n"); fprintf(stderr, " as root\n");
return 2; return 3;
} }
/* assign content of govfile to a temporary char array */ /* assign content of govfile to a temporary char array */
char* gov = malloc(sizeof(char) * 20); char* gov = malloc(sizeof(char) * 20);
@ -135,7 +143,7 @@ int main(int argc, char** argv){
/* free memory and close file */ /* free memory and close file */
free(gov); free(gov);
fclose(govfile); fclose(govfile);
return 3; return 4;
} }
/* free memory and close file */ /* free memory and close file */
free(gov); free(gov);
@ -147,7 +155,7 @@ int main(int argc, char** argv){
fprintf(stderr, " check that you have support for cpufreq\n"); fprintf(stderr, " check that you have support for cpufreq\n");
fprintf(stderr, " in your kernel and that the program is\n"); fprintf(stderr, " in your kernel and that the program is\n");
fprintf(stderr, " running as root\n"); fprintf(stderr, " running as root\n");
return 4; return 5;
} }
/* assign content of freqsfile to a temporary char array */ /* assign content of freqsfile to a temporary char array */
char* freqsfilec = malloc(sizeof(char) * 200); char* freqsfilec = malloc(sizeof(char) * 200);
@ -170,7 +178,7 @@ int main(int argc, char** argv){
fprintf(stderr, " check that you have support for cpufreq\n"); fprintf(stderr, " check that you have support for cpufreq\n");
fprintf(stderr, " in your kernel and that the program is\n"); fprintf(stderr, " in your kernel and that the program is\n");
fprintf(stderr, " running as root\n"); fprintf(stderr, " running as root\n");
return 5; return 6;
} }
/* assign content of curmaxfile to a temporary char array */ /* assign content of curmaxfile to a temporary char array */
char *curmaxfreq = malloc(sizeof(char) * 20); char *curmaxfreq = malloc(sizeof(char) * 20);
@ -193,7 +201,7 @@ int main(int argc, char** argv){
fprintf(stderr, " check that you have support for cpufreq\n"); fprintf(stderr, " check that you have support for cpufreq\n");
fprintf(stderr, " in your kernel and that the program is\n"); fprintf(stderr, " in your kernel and that the program is\n");
fprintf(stderr, " running as root\n"); fprintf(stderr, " running as root\n");
return 6; return 7;
} }
FILE* curtempfile; FILE* curtempfile;
/* from here onwards an infinite while loop should start */ /* from here onwards an infinite while loop should start */
@ -201,22 +209,39 @@ int main(int argc, char** argv){
char* temperature = malloc(sizeof(char) * 8); char* temperature = malloc(sizeof(char) * 8);
getfilec(curtempfile, temperature); getfilec(curtempfile, temperature);
newlinetonullbyte(temperature); newlinetonullbyte(temperature);
/* check if current temp is higher than max and step down */
if (stringtoint(temperature, stringlength(temperature)) >= maxtemp if (stringtoint(temperature, stringlength(temperature)) >= maxtemp
&& curstep < stepc - 1){ && curstep < stepc - 1){
curstep++; curstep++;
curmaxfile = fopen(MAXSPDPATH, "w"); curmaxfile = fopen(MAXSPDPATH, "w");
if (curmaxfile == NULL){
fprintf(stderr, "error: couldn't open scaling_maximum_frequency\n");
fprintf(stderr, " check that you have support for cpufreq\n");
fprintf(stderr, " in your kernel and that the program is\n");
fprintf(stderr, " running as root\n");
return 6;
}
fprintf(curmaxfile, "%s\n", steps[curstep]); fprintf(curmaxfile, "%s\n", steps[curstep]);
fclose(curmaxfile); fclose(curmaxfile);
} }
/* check if current temp is lower than min and step down */
if (stringtoint(temperature, stringlength(temperature)) <= mintemp if (stringtoint(temperature, stringlength(temperature)) <= mintemp
&& curstep > 0){ && curstep > 0){
curstep--; curstep--;
curmaxfile = fopen(MAXSPDPATH, "w"); curmaxfile = fopen(MAXSPDPATH, "w");
if (curmaxfile == NULL){
fprintf(stderr, "error: couldn't open scaling_maximum_frequency\n");
fprintf(stderr, " check that you have support for cpufreq\n");
fprintf(stderr, " in your kernel and that the program is\n");
fprintf(stderr, " running as root\n");
return 6;
}
fprintf(curmaxfile, "%s\n", steps[curstep]); fprintf(curmaxfile, "%s\n", steps[curstep]);
fclose(curmaxfile); fclose(curmaxfile);
} }
free(temperature); free(temperature);
fclose(curtempfile); fclose(curtempfile);
sleep(POLLING_TIME);
} }
/* cleanup for graceful exit */ /* cleanup for graceful exit */
free(steps); free(steps);