power_app.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <fcntl.h>
  6. #include <sys/select.h>
  7. #include <errno.h>
  8. #define DEVICE_PATH "/dev/power"
  9. #define BUFFER_SIZE 256
  10. int main() {
  11. int fd;
  12. fd_set read_fds;
  13. struct timeval timeout;
  14. char buffer[BUFFER_SIZE];
  15. int ret;
  16. fd = open(DEVICE_PATH, O_RDONLY | O_NONBLOCK);
  17. if (fd < 0) {
  18. perror("open device failed");
  19. return EXIT_FAILURE;
  20. }
  21. printf("Waiting for data from %s (select mode)...\n", DEVICE_PATH);
  22. while (1) {
  23. FD_ZERO(&read_fds);
  24. FD_SET(fd, &read_fds);
  25. timeout.tv_sec = 5;
  26. timeout.tv_usec = 0;
  27. ret = select(fd + 1, &read_fds, NULL, NULL, &timeout);
  28. if (ret < 0) {
  29. perror("select error");
  30. close(fd);
  31. return EXIT_FAILURE;
  32. } else if (ret == 0) {
  33. printf("select timeout after 5 seconds, continue waiting...\n");
  34. continue;
  35. }
  36. if (FD_ISSET(fd, &read_fds)) {
  37. memset(buffer, 0, BUFFER_SIZE);
  38. ret = read(fd, buffer, BUFFER_SIZE - 1);
  39. if (ret < 0) {
  40. if (errno != EAGAIN) {
  41. perror("read error");
  42. }
  43. continue;
  44. } else if (ret == 0) {
  45. printf("device closed? ret=0\n");
  46. break;
  47. } else {
  48. printf("Received %d bytes: %s\n", ret, buffer);
  49. if (strstr(buffer, "battery") != NULL) {
  50. printf(" -> Battery related data\n");
  51. }
  52. }
  53. }
  54. }
  55. close(fd);
  56. return EXIT_SUCCESS;
  57. }