Advertisement
Guest User

Untitled

a guest
Dec 9th, 2022
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.20 KB | None | 0 0
  1. // control charging of battery on apple M1
  2. // tested on macbook pro 2021 model
  3. // works on linux
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <sys/types.h>
  8. #include <sys/stat.h>
  9. #include <unistd.h>
  10. #include <errno.h>
  11. #include <syslog.h>
  12.  
  13. enum charge_mode {
  14. CHARGE_AUTO,
  15. CHARGE_INHIBIT_CHARGE,
  16. CHARGE_FORCE_DISCHARGE,
  17. };
  18.  
  19. static const char *chargemodes[] = {
  20. "auto",
  21. "inhibit-charge",
  22. "force-discharge",
  23. };
  24.  
  25. #define CAPACITY_FILE \
  26. "/sys/class/power_supply/macsmc-battery/capacity"
  27. #define CHARGE_BEHAVIOR_FILE \
  28. "/sys/class/power_supply/macsmc-battery/charge_behaviour"
  29.  
  30. #define LOWER_CHARGE 70
  31. #define UPPER_CHARGE 90
  32.  
  33. static enum charge_mode last_mode = -1;
  34.  
  35. static void set_charge_mode(enum charge_mode mode)
  36. {
  37. char *logname = "charge-ctl";
  38. FILE *cb;
  39.  
  40. if (mode == last_mode)
  41. return;
  42.  
  43. cb = fopen(CHARGE_BEHAVIOR_FILE, "w");
  44. if (!cb) {
  45. perror("fopen");
  46. exit(EXIT_FAILURE);
  47. }
  48. fprintf(cb, "%s", chargemodes[mode]);
  49. fclose(cb);
  50. last_mode = mode;
  51. openlog(logname, LOG_PID, LOG_USER);
  52. syslog(LOG_USER | LOG_INFO, chargemodes[mode]);
  53. }
  54.  
  55. int main(int argc, char **argv)
  56. {
  57. int option, limit = UPPER_CHARGE;
  58. pid_t pid, sid;
  59.  
  60. while ((option = getopt(argc, argv, "l:uh")) != -1) {
  61. switch (option) {
  62. case 'h':
  63. puts("help");
  64. puts("-l limit capacity");
  65. exit(EXIT_SUCCESS);
  66. case 'l':
  67. limit = atoi(optarg);
  68. printf("limit: %d\n", limit);
  69. break;
  70. default: /* '?' */
  71. puts("unknown option");
  72. exit(EXIT_FAILURE);
  73. }
  74. }
  75.  
  76. pid = fork();
  77. if (pid < 0)
  78. exit(EXIT_FAILURE);
  79. if (pid > 0)
  80. exit(EXIT_SUCCESS);
  81.  
  82. umask(0);
  83. sid = setsid();
  84. if (sid < 0)
  85. exit(EXIT_FAILURE);
  86.  
  87. if ((chdir("/")) < 0)
  88. exit(EXIT_FAILURE);
  89.  
  90. close(STDIN_FILENO);
  91. close(STDOUT_FILENO);
  92. close(STDERR_FILENO);
  93.  
  94. while (1) {
  95. FILE *capfile;
  96. char cap[6];
  97. int icap;
  98.  
  99. capfile = fopen(CAPACITY_FILE, "r");
  100. fgets(cap, 5, capfile);
  101. fclose(capfile);
  102. icap = atoi(cap);
  103. if (icap < LOWER_CHARGE)
  104. set_charge_mode(CHARGE_AUTO);
  105. else if (icap > limit)
  106. set_charge_mode(CHARGE_FORCE_DISCHARGE);
  107. else
  108. set_charge_mode(CHARGE_INHIBIT_CHARGE);
  109.  
  110. sleep(30);
  111. }
  112.  
  113. exit(EXIT_SUCCESS);
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement