From beb92a1862367ffeb84728f09808f17776023fb7 Mon Sep 17 00:00:00 2001 From: lonkaars Date: Fri, 8 Oct 2021 11:36:55 +0200 Subject: meer commentaar en "werkende" keyboard scan --- main/constants.h | 40 +++++++++++++ main/main.ino | 180 ++++++++++++++++++++++++++++++------------------------- 2 files changed, 137 insertions(+), 83 deletions(-) create mode 100644 main/constants.h diff --git a/main/constants.h b/main/constants.h new file mode 100644 index 0000000..6a623c6 --- /dev/null +++ b/main/constants.h @@ -0,0 +1,40 @@ +#define SERIAL_BAUD 115200 +#define MAX_CODE_LEN 1024 + +#define BUZZ_HAPPY 1000 +#define BUZZ_SAD 700 + +#define PINOUT_KBM7 4 +#define PINOUT_KBM6 5 +#define PINOUT_KBM5 6 +#define PINOUT_KBM4 7 +#define PINOUT_KBM3 12 +#define PINOUT_KBM2 8 +#define PINOUT_KBM1 9 +#define PINOUT_LED_Y A5 +#define PINOUT_LED_R A4 +#define PINOUT_LED_G A3 +#define PINOUT_BUZZ A2 +#define PINOUT_SET A1 +#define PINOUT_RELAIS A0 + +#define KB_ROW_1 PINOUT_KBM2 +#define KB_ROW_2 PINOUT_KBM3 +#define KB_ROW_3 PINOUT_KBM5 +#define KB_ROW_4 PINOUT_KBM7 +#define KB_COL_1 PINOUT_KBM1 +#define KB_COL_2 PINOUT_KBM4 +#define KB_COL_3 PINOUT_KBM6 + +#define KB_KEY_1 0 +#define KB_KEY_2 1 +#define KB_KEY_3 2 +#define KB_KEY_4 3 +#define KB_KEY_5 4 +#define KB_KEY_6 5 +#define KB_KEY_7 6 +#define KB_KEY_8 7 +#define KB_KEY_9 8 +#define KB_KEY_C 9 +#define KB_KEY_0 10 +#define KB_KEY_E 11 diff --git a/main/main.ino b/main/main.ino index cb80a4c..d4b765b 100644 --- a/main/main.ino +++ b/main/main.ino @@ -1,47 +1,31 @@ -#define SERIAL_BAUD 115200 -#define MAX_CODE_LEN 1024 - -#define BUZZ_HAPPY 1000 -#define BUZZ_SAD 700 - -#define PINOUT_KBM7 4 -#define PINOUT_KBM6 5 -#define PINOUT_KBM5 6 -#define PINOUT_KBM4 7 -#define PINOUT_KBM3 12 -#define PINOUT_KBM2 8 -#define PINOUT_KBM1 9 -#define PINOUT_LED_Y A5 -#define PINOUT_LED_R A4 -#define PINOUT_LED_G A3 -#define PINOUT_BUZZ A2 -#define PINOUT_SET A1 -#define PINOUT_RELAIS A0 - -#define KB_ROW_1 PINOUT_KBM2 -#define KB_ROW_2 PINOUT_KBM3 -#define KB_ROW_3 PINOUT_KBM5 -#define KB_ROW_4 PINOUT_KBM7 -#define KB_COL_1 PINOUT_KBM1 -#define KB_COL_2 PINOUT_KBM4 -#define KB_COL_3 PINOUT_KBM6 - -#define KB_KEY_1 0 -#define KB_KEY_2 1 -#define KB_KEY_3 2 -#define KB_KEY_4 3 -#define KB_KEY_5 4 -#define KB_KEY_6 5 -#define KB_KEY_7 6 -#define KB_KEY_8 7 -#define KB_KEY_9 8 -#define KB_KEY_C 9 -#define KB_KEY_0 10 -#define KB_KEY_E 11 +#include "constants.h" + +/** KB -> arduino pin mapping + * 0 (1) -> 8 & 9 + * 1 (2) -> 8 & 7 + * 2 (3) -> 8 & 5 + * 3 (4) -> 12 & 9 + * 4 (5) -> 12 & 7 + * 5 (6) -> 12 & 5 + * 6 (7) -> 6 & 9 + * 7 (8) -> 6 & 7 + * 8 (9) -> 6 & 5 + * 9 (C) -> 4 & 9 + * 10 (0) -> 4 & 7 + * 11 (E) -> 4 & 5 + */ int kb_rows[] = { KB_ROW_1, KB_ROW_2, KB_ROW_3, KB_ROW_4 }; int kb_cols[] = { KB_COL_1, KB_COL_2, KB_COL_3 }; +#define LED_R 0 +#define LED_G 1 +#define LED_Y 2 + +int led_pinouts[] = { PINOUT_LED_R, PINOUT_LED_G, PINOUT_LED_Y }; +unsigned long led_timings[] = { 0, 0, 0 }; +bool led_status[] = { 0, 0, 0 }; + unsigned char kb[12], kb_old[12]; unsigned char correct_code[] = { 0, 0, 0, 0 }; @@ -69,14 +53,23 @@ void setup() { pinMode(KB_ROW_3, OUTPUT); pinMode(KB_ROW_4, OUTPUT); - // Overige outputs + // alle rijen moeten standaard HIGH zijn voor de scan + digitalWrite(KB_ROW_1, HIGH); + digitalWrite(KB_ROW_2, HIGH); + digitalWrite(KB_ROW_3, HIGH); + digitalWrite(KB_ROW_4, HIGH); + + // LED's pinMode(PINOUT_LED_G, OUTPUT); pinMode(PINOUT_LED_R, OUTPUT); pinMode(PINOUT_LED_Y, OUTPUT); + + // Overige outputs pinMode(PINOUT_RELAIS, OUTPUT); pinMode(PINOUT_BUZZ, OUTPUT); } +/** @brief scan het toetsenbord en stop alles in `kb[12]` */ void kb_scan() { // kopieer kb naar kb_old memcpy(&kb_old, kb, sizeof(kb_old)); @@ -85,42 +78,18 @@ void kb_scan() { memset(&kb, 0, sizeof(kb)); for (int row = 0; row < 4; row++) { - Serial.print("Pin "); - Serial.print(kb_rows[row], DEC); - Serial.print(" is now high\n"); - digitalWrite(kb_rows[row], HIGH); + digitalWrite(kb_rows[row], LOW); for (int col = 0; col < 3; col++) { - // Serial.print("checking pin "); - // Serial.print(kb_cols[col], DEC); - // Serial.print(" -> "); - // Serial.print(kb_rows[row], DEC); - // Serial.print(" ...\n"); - - // Serial.print("kb["); - // Serial.print(3 * row + col, DEC); - // Serial.print("] (c"); - // Serial.print(kb_cols[col], DEC); - // Serial.print(", r"); - // Serial.print(kb_rows[row], DEC); - // Serial.print(")\n"); + // index hack om 2d coordinaten in een 1d array op te slaan kb[3 * row + col] = !digitalRead(kb_cols[col]); - - Serial.print("Pin "); - Serial.print(kb_cols[col], DEC); - Serial.print(" is now "); - Serial.print(digitalRead(kb_cols[col]), DEC); - Serial.print("\n"); } - digitalWrite(kb_rows[row], LOW); - Serial.print("Pin "); - Serial.print(kb_rows[row], DEC); - Serial.print(" is now low\n"); - delay(10); + digitalWrite(kb_rows[row], HIGH); } } +/** @brief debug functie die een getallen array als JSON print */ void debug_print_arr(unsigned char x[12]) { Serial.print("["); for(int i = 0; i < 12; i++) { @@ -130,6 +99,10 @@ void debug_print_arr(unsigned char x[12]) { Serial.print("]\n"); } +/** + * @brief functie die uitgevoerd wordt als + * de verkeerde code is ingevoerd + */ void wrong_code_routine() { tone(PINOUT_BUZZ, BUZZ_SAD); digitalWrite(PINOUT_LED_R, HIGH); @@ -140,6 +113,10 @@ void wrong_code_routine() { noTone(PINOUT_BUZZ); } +/** + * @brief functie die uitgevoerd wordt als + * de juiste code is ingevoerd + */ void unlock_routine() { tone(PINOUT_BUZZ, BUZZ_HAPPY); digitalWrite(PINOUT_RELAIS, HIGH); @@ -152,15 +129,19 @@ void unlock_routine() { noTone(PINOUT_BUZZ); } +/** + * @brief event handler voor het toetsenbord + * (voert elke keer uit wanneer de toestand van een toets verandert) + */ void kb_onevent(kb_event ev) { - if (!ev.down) return; + if (!ev.down) return; // alleen uit naar aan events boeien (voor nu) + // korte pieptoon als een nummertoets of *clear* wordt ingedrukt if (ev.key != KB_KEY_E) tone(PINOUT_BUZZ, BUZZ_HAPPY, 200); - Serial.println(ev.key, DEC); - switch (ev.key) { case KB_KEY_C: { + Serial.println("C"); // TODO: kijk of sizeof() werkt voor arrays memset(&code, 0, sizeof(code)); codei = 0; @@ -169,6 +150,7 @@ void kb_onevent(kb_event ev) { } case KB_KEY_E: { + Serial.println("E"); //TODO: array length int correct_code_len = 3; bool correct = true; @@ -186,7 +168,7 @@ void kb_onevent(kb_event ev) { // debug Serial.print(correct, DEC); - // kijk mama geen haakjes + // kijk mama zonder haakjes! if (correct) unlock_routine(); else @@ -197,7 +179,7 @@ void kb_onevent(kb_event ev) { // Overige toetsen (nummers) default: { - //TODO: NON BLOCKING LED VOOR ALLE LEDS + led_set_timeout(LED_Y, 200); // bereken getal op toets // (key + 1 voor alle toetsen behalve 0) @@ -206,36 +188,68 @@ void kb_onevent(kb_event ev) { // voeg getal toe aan het einde van de code code[codei] = num; codei++; + + Serial.print("adding "); + Serial.print(num, DEC); + Serial.print(" to code\n"); } } } +/** + * @brief voert `kb_onevent` uit + * wanneer de toestand van een toets verandert + */ void kb_event_gen() { for(int i = 0; i < 12; i++) { // ga door naar de volgende iteratie // als de toetsen niet veranderd zijn if (kb[i] == kb_old[i]) continue; + // maak en vul struct met informatie kb_event event = { .key = (unsigned char) i, .down = kb[i], .timestamp = millis() }; + // voer on_event handler uit kb_onevent(event); } } +/** + * @brief zet een led aan voor `duration_millis` milliseconden (non-blocking) + * @param led `LED_?` constante voor led kleur + * @param duration_millis aantal milliseconden dat de led aan moet zijn + */ +void led_set_timeout(unsigned int led, unsigned long duration_millis) { + led_timings[led] = millis() + duration_millis; + led_status[led] = 1; + digitalWrite(led_pinouts[led], HIGH); +} + +/** @brief led update functie (voor event loop) */ +void led_update() { + unsigned long current_time = millis(); + + for (int i = 0; i < 3; i++) { + // negeer huidige led als die timer nog niet voorbij is + if (led_timings[i] > current_time) continue; + + // negeer huidige led als die al uit is + if (led_status[i] == 0) continue; + + // zet huidige led uit + led_status[i] = 0; + digitalWrite(led_pinouts[i], LOW); + } +} + +/** @brief arduino `loop` functie, wordt gebruikt als event loop */ void loop() { - // unlock_routine(); - // delay(3e3); - // wrong_code_routine(); - // delay(10e3); kb_scan(); kb_event_gen(); - // debug_print_arr(kb); - // Serial.print("time "); - // Serial.print(millis(), DEC); - // Serial.print("\n"); - // delay(1e3); + led_update(); } + -- cgit v1.2.3