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>`
**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.

View File

@ -1,6 +1,8 @@
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define POLLING_TIME 1
#define CURGOV "/sys/devices/system/cpu/cpufreq/policy0/scaling_governor"
#define FREQS "/sys/devices/system/cpu/cpufreq/policy0/scaling_available_frequencies"
#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");
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 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 */
FILE* govfile = fopen(CURGOV, "r");
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, " also check that you're running this program\n");
fprintf(stderr, " as root\n");
return 2;
return 3;
}
/* assign content of govfile to a temporary char array */
char* gov = malloc(sizeof(char) * 20);
@ -135,7 +143,7 @@ int main(int argc, char** argv){
/* free memory and close file */
free(gov);
fclose(govfile);
return 3;
return 4;
}
/* free memory and close file */
free(gov);
@ -147,7 +155,7 @@ int main(int argc, char** argv){
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 4;
return 5;
}
/* assign content of freqsfile to a temporary char array */
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, " in your kernel and that the program is\n");
fprintf(stderr, " running as root\n");
return 5;
return 6;
}
/* assign content of curmaxfile to a temporary char array */
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, " in your kernel and that the program is\n");
fprintf(stderr, " running as root\n");
return 6;
return 7;
}
FILE* curtempfile;
/* 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);
getfilec(curtempfile, temperature);
newlinetonullbyte(temperature);
/* check if current temp is higher than max and step down */
if (stringtoint(temperature, stringlength(temperature)) >= maxtemp
&& curstep < stepc - 1){
curstep++;
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]);
fclose(curmaxfile);
}
/* check if current temp is lower than min and step down */
if (stringtoint(temperature, stringlength(temperature)) <= mintemp
&& curstep > 0){
curstep--;
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]);
fclose(curmaxfile);
}
free(temperature);
fclose(curtempfile);
sleep(POLLING_TIME);
}
/* cleanup for graceful exit */
free(steps);