aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlonkaars <loek@pipeframe.xyz>2021-10-08 11:36:55 +0200
committerlonkaars <loek@pipeframe.xyz>2021-10-08 11:36:55 +0200
commitbeb92a1862367ffeb84728f09808f17776023fb7 (patch)
treef3a6bedb77a7778bdb038ef81cdc78953a0d466f
parentd481e9ede60072a6c0f666c0e5dfb5962c759f4f (diff)
meer commentaar en "werkende" keyboard scan
-rw-r--r--main/constants.h40
-rw-r--r--main/main.ino180
2 files changed, 137 insertions, 83 deletions
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();
}
+