diff options
author | Jakob Kaivo <jkk@xcc.kaivo.net> | 2018-11-15 15:32:39 -0500 |
---|---|---|
committer | Jakob Kaivo <jkk@xcc.kaivo.net> | 2018-11-15 15:32:39 -0500 |
commit | 33b9c3fd557ce618f903d3473ab3df47496f3f4d (patch) | |
tree | 71e64f265a4333df29ea4a9187b1119d6cb7ec66 | |
parent | b94d852b748d7836c301a86d0fee83533d97ea3b (diff) |
serialize button queue to avoid screen update races
-rw-r--r-- | freeonebook.c | 88 |
1 files changed, 53 insertions, 35 deletions
diff --git a/freeonebook.c b/freeonebook.c index 3e2a008..3cdf0c3 100644 --- a/freeonebook.c +++ b/freeonebook.c @@ -1,4 +1,5 @@ #include <limits.h> +#include <pthread.h> #include <stdio.h> #include <string.h> #include <stdlib.h> @@ -9,6 +10,11 @@ #define SDPATH "/run/media/mmcblk0p1" +#define LOWBATTERY_L "/home/root/SplashScreen/epdc_lowbatL.pgm" +#define LOWBATTERY_R "/home/root/SplashScreen/epdc_lowbatR.pgm" + +static int fifo[2]; + void halt(void) { fflush(NULL); @@ -29,7 +35,8 @@ void poweroff(int reason) printf("shutting down (%d)\n", reason); if (reason == GPIO_LOWBATTERY) { - printf("low battery\n"); + fb_loadimage(RIGHT_SCREEN, LOWBATTERY_R); + fb_loadimage(LEFT_SCREEN, LOWBATTERY_L); } exit(0); @@ -37,37 +44,10 @@ void poweroff(int reason) void buttonpress(int button) { - switch (button) { - case BUTTON_SPECIAL: - printf("special\n"); - break; - - case BUTTON_NEXTCHAPTER: - printf("next chapter\n"); - break; - - case BUTTON_PREVBOOK: - printf("previous book\n"); - break; - - case BUTTON_NEXTBOOK: - printf("next book\n"); - break; - - case BUTTON_PREVPAGE: - printf("previous page\n"); - break; - - case BUTTON_NEXTPAGE: - printf("next page\n"); - break; - - default: - printf("button %d pressed\n", button); - } - - fflush(NULL); - sync(); + static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; + pthread_mutex_lock(&mutex); + write(fifo[1], &button, sizeof(button)); + pthread_mutex_unlock(&mutex); } int main(int argc, char *argv[]) @@ -77,6 +57,8 @@ int main(int argc, char *argv[]) printf("registering atexit() handler\n"); atexit(halt); + pipe(fifo); + printf("adding watchers\n"); gpio_watch(GPIO_LOWBATTERY, poweroff); gpio_watch(GPIO_SHUTDOWN, poweroff); @@ -89,11 +71,47 @@ int main(int argc, char *argv[]) printf("initializing framebuffer\n"); fb_init(); - fb_loadimage(RIGHT_SCREEN, SDPATH "/right.gray"); - fb_loadimage(LEFT_SCREEN, SDPATH "/left.gray"); + system("ls -lA "SDPATH"/grid.png"); + //fb_loadimage(RIGHT_SCREEN, SDPATH "/image.gray"); + fb_loadimage(RIGHT_SCREEN, SDPATH "/grid.png"); + //fb_loadimage(RIGHT_SCREEN, SDPATH "/right.gray"); + //fb_loadimage(LEFT_SCREEN, SDPATH "/left.gray"); for (;;) { - sleep(INT_MAX); + int button = 0; + read(fifo[0], &button, sizeof(button)); + + switch (button) { + case BUTTON_SPECIAL: + printf("special\n"); + break; + + case BUTTON_NEXTCHAPTER: + printf("next chapter\n"); + break; + + case BUTTON_PREVBOOK: + printf("previous book\n"); + break; + + case BUTTON_NEXTBOOK: + printf("next book\n"); + break; + + case BUTTON_PREVPAGE: + printf("previous page\n"); + break; + + case BUTTON_NEXTPAGE: + printf("next page\n"); + break; + + default: + printf("button %d pressed\n", button); + } + + fflush(NULL); + sync(); } return 0; |