diff --git a/README.md b/README.md
index 8c5b3e0..240cfb2 100644
--- a/README.md
+++ b/README.md
@@ -46,6 +46,18 @@ dtoverlay=i2c-rtc,ds3231
```
Reference [this walk through](https://pimylifeup.com/raspberry-pi-rtc/) for more info
+Set GPIO pins
+```bash
+pinctrl set 6 pd
+pinctrl set 12 pd
+pinctrl set 13 pd
+pinctrl set 16 pd
+pinctrl set 19 pd
+pinctrl set 20 pd
+pinctrl set 22 pd
+pinctrl set 27 pd
+```
+
### Configuration
To add a config, create a text file in the ~/.totp directory (if it doesn't exist then create it). The name of the file will be what is populated on the device.
Ex: "google.txt" will be displayed as "google"
diff --git a/c/src/p2fa.c b/c/src/p2fa.c
index dfb0f06..21f4236 100644
--- a/c/src/p2fa.c
+++ b/c/src/p2fa.c
@@ -46,12 +46,13 @@ ButtonMap button_map[] = {
#define NUM_BUTTONS 8
struct gpiod_chip *chip;
-struct gpiod_line_bulk lines;
struct gpiod_line *line_pointers[NUM_BUTTONS];
int last_button_state[NUM_BUTTONS] = {0};
struct timespec last_press_time[NUM_BUTTONS];
+int isBlocking = 0;
+
void closeP2FA() {
EPD_2in13_V4_Init();
EPD_2in13_V4_Clear();
@@ -75,6 +76,10 @@ int computeWidth(char* text, sFONT *font) {
return font->Width * strlen(text);
}
+void setBlocking(int bool) {
+ isBlocking = bool;
+}
+
int readButtons() {
for (int i = 0; i < NUM_BUTTONS; i++) {
int value = gpiod_line_get_value(line_pointers[i]);
@@ -105,6 +110,9 @@ int readButtons() {
int getBtn() {
while (1) {
int key = readButtons();
+ if (!isBlocking) {
+ return key;
+ }
if (key != -1) {
return key;
}
@@ -115,13 +123,14 @@ int getBtn() {
//TODO Put display to sleep after so many refreshes
void code(UWORD *blackImage, char* confName) {
- //int ch;
+ setBlocking(0);
+ int ch;
while(1) {
- // ch = getch();
- // if (ch != ERR) {
- // if (ch == 'q') break;
- // Debug("Key Pressed: %c\n", ch);
- // }
+ ch = getBtn();
+ if (ch != -1) {
+ Debug("Key Pressed: %c\n", ch);
+ if (ch == 'q') break;
+ }
Paint_NewImage(blackImage, EPD_2in13_V4_WIDTH, EPD_2in13_V4_HEIGHT, 90, WHITE);
EPD_2in13_V4_Init();
@@ -153,10 +162,10 @@ void code(UWORD *blackImage, char* confName) {
int progBarEndIndex;
int lastI = 30 * 1000;
for (int i = getTimeRemainingMS(30);; i = getTimeRemainingMS(30)) {
- //ch = getch();
- //if (ch != ERR) {
- // if (ch == 'q') return;
- //}
+ ch = getBtn();
+ if (ch != -1) {
+ if (ch == 'q') return;
+ }
if (i > lastI) break;
startTime = clock();
@@ -203,7 +212,12 @@ void config(UWORD *blackImage, char* configName) {
EPD_2in13_V4_Display(blackImage);
- //int ch = getch();
+ setBlocking(1);
+ int ch;
+ while(1) {
+ ch = getBtn();
+ if (ch == 'b') break;
+ }
}
void drawTotpHome(UWORD *blackImage, char** configNames, int *length) {
@@ -239,27 +253,27 @@ void totpHome(UWORD *blackImage) {
int ch;
while (1) {
- //timeout(-1);
- ch = 'q'; //getch();
- if (!ch) {
+ setBlocking(1);
+ ch = getBtn();
+ if (ch != -1) {
switch(ch) {
- // case KEY_UP:
- // if (i > 0) i--;
- // Paint_ClearWindows(115, 5 + (i + 1) * 20, 122, 17 + (i + 1) * 20, WHITE);
- // break;
- // case KEY_DOWN:
- // if (i < length - 1) i++;
- // Paint_ClearWindows(115, 5 + (i - 1) * 20, 122, 17 + (i - 1) * 20, WHITE);
- // break;
- case '\n':
+ case 'u':
+ if (i > 0) i--;
+ Paint_ClearWindows(115, 5 + (i + 1) * 20, 122, 17 + (i + 1) * 20, WHITE);
+ break;
+ case 'd':
+ if (i < length - 1) i++;
+ Paint_ClearWindows(115, 5 + (i - 1) * 20, 122, 17 + (i - 1) * 20, WHITE);
+ break;
+ case 's':
code(blackImage, configNames[i]);
drawTotpHome(blackImage, configNames, &length);
break;
- case 'c':
+ case 'a':
config(blackImage, configNames[i]);
drawTotpHome(blackImage, configNames, &length);
break;
- case 'q':
+ case 'b':
return;
}
}
@@ -316,16 +330,10 @@ int main() {
gpiod_chip_close(chip);
exit(EXIT_FAILURE);
}
- gpiod_line_bulk_init(&lines);
}
// End Init GPIO
- printf("Monitoring buttons. Press Ctrl+C to exit.\n");
- while (1) {
- printf("Button: %c\n", (char)getBtn());
- }
-
- //drawLoop();
+ drawLoop();
closeP2FA();
return 0;