Skip to content

Commit

Permalink
8-bit burst mode keycode read/write (cf. #4)
Browse files Browse the repository at this point in the history
  • Loading branch information
twystd committed Oct 9, 2023
1 parent 002cc2e commit 6ea8085
Show file tree
Hide file tree
Showing 20 changed files with 79 additions and 46 deletions.
4 changes: 2 additions & 2 deletions TODO.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
- [x] 4-bit burst mode write
- [x] 4-bit burst mode read
- [x] controller passcodes
- [ ] 8-bit burst mode write
- [ ] 8-bit burst mode read
- [x] 8-bit burst mode write
- [x] 8-bit burst mode read
- [ ] card + PIN writer
- [ ] card + PIN read

Expand Down
1 change: 1 addition & 0 deletions pico/controller/pico/base/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ add_executable(wiegand-controller
${CORE}/src/uart.c
${CORE}/src/sys.c
${CORE}/src/read.c
${CORE}/src/keypad.c
${CORE}/src/led.c
${CORE}/src/buzzer.c
${CORE}/src/relays.c
Expand Down
1 change: 1 addition & 0 deletions pico/controller/pico/usb/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ add_executable(wiegand-controller-usb
${CORE}/src/usb.c
${CORE}/src/sys.c
${CORE}/src/read.c
${CORE}/src/keypad.c
${CORE}/src/led.c
${CORE}/src/buzzer.c
${CORE}/src/relays.c
Expand Down
1 change: 1 addition & 0 deletions pico/controller/picow/base/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ add_executable(wiegand-controller-picow
${CORE}/src/uart.c
${CORE}/src/sys.c
${CORE}/src/read.c
${CORE}/src/keypad.c
${CORE}/src/led.c
${CORE}/src/buzzer.c
${CORE}/src/relays.c
Expand Down
1 change: 1 addition & 0 deletions pico/controller/picow/wifi+usb/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ add_executable(wiegand-controller-wifi-usb
${CORE}/src/buzzer.c
${COMMON}/src/cli.c
${CORE}/src/common.c
${CORE}/src/keypad.c
${CORE}/src/led.c
${CORE}/src/logd.c
${CORE}/src/read.c
Expand Down
1 change: 1 addition & 0 deletions pico/controller/picow/wifi/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ add_executable(wiegand-controller-wifi
${CORE}/src/uart.c
${CORE}/src/sys.c
${CORE}/src/read.c
${CORE}/src/keypad.c
${CORE}/src/led.c
${CORE}/src/buzzer.c
${CORE}/src/relays.c
Expand Down
18 changes: 18 additions & 0 deletions pico/core/include/keypad.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#pragma once

#include <stdint.h>

typedef struct keycode {
char digit;
uint32_t code4;
uint32_t code8;
} keycode;

enum KEYPADMODE {
BITS4 = 4,
BITS8 = 8,
};

extern enum KEYPADMODE keypadmode;
extern const keycode KEYCODES[];
extern const int KEYCODES_SIZE;
20 changes: 20 additions & 0 deletions pico/core/src/keypad.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#include <keypad.h>

enum KEYPADMODE keypadmode = BITS4;

const keycode KEYCODES[] = {
{'0', 0, 0x00f0},
{'1', 1, 0x00e1},
{'2', 2, 0x00d2},
{'3', 3, 0x00c3},
{'4', 4, 0x00b4},
{'5', 5, 0x00a5},
{'6', 6, 0x0096},
{'7', 7, 0x0087},
{'8', 8, 0x0078},
{'9', 9, 0x0069},
{'*', 10, 0x005a},
{'#', 11, 0x004b},
};

const int KEYCODES_SIZE = sizeof(KEYCODES) / sizeof(keycode);
35 changes: 22 additions & 13 deletions pico/core/src/read.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include "pico/util/queue.h"

#include <common.h>
#include <keypad.h>
#include <led.h>
#include <logd.h>
#include <read.h>
Expand All @@ -29,7 +30,6 @@ int64_t rxii(alarm_id_t, void *);
int64_t keycode_timeout(alarm_id_t, void *);
void on_keycode(char *, int);

const char DIGITS[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '*', '#'};
const uint32_t KEYCODE_TIMEOUT = 5000; // ms

void read_initialise(enum MODE mode) {
Expand Down Expand Up @@ -68,23 +68,27 @@ void on_keypad_digit(uint32_t v) {
code.alarm = 0;
}

int keycode = v & 0x0000000f;
int keycode = v & 0x000000ff;

if (keycode < sizeof(DIGITS)) {
char digit = DIGITS[keycode];
for (int i = 0; i < KEYCODES_SIZE; i++) {
if (KEYCODES[i].code4 == keycode || KEYCODES[i].code8 == keycode) {
char digit = KEYCODES[i].digit;

if (digit == '*' || digit == '#') {
on_keycode(code.code, code.index);
code.index = 0;
} else if (code.index < sizeof(code.code)) {
code.code[code.index++] = digit;

if (code.index >= sizeof(code.code)) {
if (digit == '*' || digit == '#') {
on_keycode(code.code, code.index);
code.index = 0;
} else {
code.alarm = add_alarm_in_ms(KEYCODE_TIMEOUT, keycode_timeout, &code, true);
} else if (code.index < sizeof(code.code)) {
code.code[code.index++] = digit;

if (code.index >= sizeof(code.code)) {
on_keycode(code.code, code.index);
code.index = 0;
} else {
code.alarm = add_alarm_in_ms(KEYCODE_TIMEOUT, keycode_timeout, &code, true);
}
}

break;
}
}
}
Expand Down Expand Up @@ -133,6 +137,11 @@ int64_t rxii(alarm_id_t id, void *data) {
if (!queue_is_full(&queue)) {
queue_try_add(&queue, &v);
}
} else if (b->count == 8) {
uint32_t v = MSG_KEYPAD_DIGIT | (b->word & 0x000000ff);
if (!queue_is_full(&queue)) {
queue_try_add(&queue, &v);
}
} else {
blink(CARD_TIMEOUT);
}
Expand Down
33 changes: 2 additions & 31 deletions pico/core/src/write.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,40 +4,13 @@
#include <WRITE.pio.h>
#include <buzzer.h>
#include <common.h>
#include <keypad.h>
#include <logd.h>
#include <write.h>

typedef struct writer {
} writer;

typedef struct keycode {
char digit;
uint32_t code4;
uint32_t code8;
} keycode;

enum KEYPADMODE {
BITS4 = 4,
BITS8 = 8,
};

enum KEYPADMODE keypadmode = BITS4;

const keycode KEYCODES[] = {
{'0', 0, 0x00f0},
{'1', 1, 0x00e1},
{'2', 2, 0x00d2},
{'3', 3, 0x00c3},
{'4', 4, 0x00b4},
{'5', 5, 0x00a5},
{'6', 6, 0x0096},
{'7', 7, 0x0087},
{'8', 8, 0x0078},
{'9', 9, 0x0069},
{'*', 10, 0x005a},
{'#', 11, 0x004b},
};

/* Initialises the WRITER PIO.
*
*/
Expand Down Expand Up @@ -78,9 +51,7 @@ bool write_card(uint32_t facility_code, uint32_t card) {
*
*/
bool write_keycode(char digit) {
int N = sizeof(KEYCODES) / sizeof(keycode);

for (int i = 0; i < N; i++) {
for (int i = 0; i < KEYCODES_SIZE; i++) {
if (KEYCODES[i].digit == digit) {
if (keypadmode == BITS8) {
writer_program_put(PIO_WRITER, SM_WRITER, KEYCODES[i].code8, 8);
Expand Down
1 change: 1 addition & 0 deletions pico/emulator/pico/base/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ add_executable(wiegand-emulator
${CORE}/src/sys.c
${CORE}/src/read.c
${CORE}/src/write.c
${CORE}/src/keypad.c
${CORE}/src/led.c
${CORE}/src/buzzer.c
${CORE}/src/relays.c
Expand Down
1 change: 1 addition & 0 deletions pico/emulator/pico/usb/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ add_executable(wiegand-emulator-usb
${CORE}/src/sys.c
${CORE}/src/read.c
${CORE}/src/write.c
${CORE}/src/keypad.c
${CORE}/src/led.c
${CORE}/src/buzzer.c
${CORE}/src/relays.c
Expand Down
1 change: 1 addition & 0 deletions pico/emulator/picow/base/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ add_executable(wiegand-emulator-picow
${CORE}/src/sys.c
${CORE}/src/read.c
${CORE}/src/write.c
${CORE}/src/keypad.c
${CORE}/src/led.c
${CORE}/src/buzzer.c
${CORE}/src/relays.c
Expand Down
1 change: 1 addition & 0 deletions pico/emulator/picow/wifi+usb/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ add_executable(wiegand-emulator-wifi-usb
${CORE}/src/sys.c
${CORE}/src/read.c
${CORE}/src/write.c
${CORE}/src/keypad.c
${CORE}/src/led.c
${CORE}/src/buzzer.c
${CORE}/src/relays.c
Expand Down
1 change: 1 addition & 0 deletions pico/emulator/picow/wifi/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ add_executable(wiegand-emulator-wifi
${CORE}/src/sys.c
${CORE}/src/read.c
${CORE}/src/write.c
${CORE}/src/keypad.c
${CORE}/src/led.c
${CORE}/src/buzzer.c
${CORE}/src/relays.c
Expand Down
1 change: 1 addition & 0 deletions pico/reference/pico/base/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ add_executable(wiegand
${CORE}/src/sys.c
${CORE}/src/read.c
${CORE}/src/write.c
${CORE}/src/keypad.c
${CORE}/src/led.c
${CORE}/src/buzzer.c
${CORE}/src/relays.c
Expand Down
1 change: 1 addition & 0 deletions pico/reference/pico/usb/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ add_executable(wiegand_usb
${CORE}/src/sys.c
${CORE}/src/read.c
${CORE}/src/write.c
${CORE}/src/keypad.c
${CORE}/src/led.c
${CORE}/src/buzzer.c
${CORE}/src/relays.c
Expand Down
1 change: 1 addition & 0 deletions pico/reference/picow/base/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ add_executable(wiegand_picow
${CORE}/src/sys.c
${CORE}/src/read.c
${CORE}/src/write.c
${CORE}/src/keypad.c
${CORE}/src/led.c
${CORE}/src/buzzer.c
${CORE}/src/relays.c
Expand Down
1 change: 1 addition & 0 deletions pico/reference/picow/wifi+usb/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ add_executable(wiegand_wifi_usb
${CORE}/src/sys.c
${CORE}/src/read.c
${CORE}/src/write.c
${CORE}/src/keypad.c
${CORE}/src/led.c
${CORE}/src/buzzer.c
${CORE}/src/relays.c
Expand Down
1 change: 1 addition & 0 deletions pico/reference/picow/wifi/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ add_executable(wiegand_wifi
${CORE}/src/sys.c
${CORE}/src/read.c
${CORE}/src/write.c
${CORE}/src/keypad.c
${CORE}/src/led.c
${CORE}/src/buzzer.c
${CORE}/src/relays.c
Expand Down

0 comments on commit 6ea8085

Please sign in to comment.