From adf7487ad0f6d438a0a816db4241db3b7feaeb3e Mon Sep 17 00:00:00 2001 From: NaiJi Date: Thu, 17 Mar 2022 19:08:49 +0300 Subject: [PATCH] Implement shift(), encode() and index converter --- code.c.ino | 69 ++++++++++++++++++++++++++++++++++++++++++++------ enigma_types.h | 9 ++++--- 2 files changed, 67 insertions(+), 11 deletions(-) diff --git a/code.c.ino b/code.c.ino index 7bbe450..fd30723 100644 --- a/code.c.ino +++ b/code.c.ino @@ -6,6 +6,54 @@ PS2KeyAdvanced keyboard; +// Сконвертировать HEX значение клавиши +// в её алфавитный индекс; +// +// возвращает индекс буквы +size_t toKeyIndex(const String& value) +{ + size_t index = -1; + for (size_t i = 0; i < ALPHABET_SIZE; ++i) + { + if (key_values[i] == value) + { + index = i; + break; + } + } + + return index; +} + +// Взять текущий сдвиг в алфавите. +// Считается суммарно по всем дискам в положении +// на момент вызова; +// +// возвращает текущий индекс с применением сдвига +size_t shift(size_t index) +{ + for (size_t i = 0; i < WHEELS_AMOUNT; ++i) + { + index += key_shifts[i]; + } + + return index % ALPHABET_SIZE; +} + +// Зашифровать символ из алфавита +// по алгоритму энигмы; +// +// возвращает зашифрованный символ для вывода +// на экран +size_t encode(size_t index) +{ + // тут должно быть короче конвертирование по плагборду + const size_t new_index = shift(index); + // и вот тут тоже должноб ыть конвертирование по плагборду, ща +} + +///////////////////////////////////////////////////// + void setup() { keyboard.begin(DATAPIN, IRQPIN); @@ -14,12 +62,17 @@ void setup() void loop() { - if (keyboard.available()) - { - const uint16_t key = keyboard.read(); - if (key > 0) - { - const String value = String(key, HEX); - } - } + if (!keyboard.available()) + return; + + const uint16_t key = keyboard.read(); + if (key <= 0) + return; + + const String value = String(key, HEX); + const size_t index = toKeyIndex(value); + if (index == -1) + return; + + const size_t encoded_index = encode(index); } diff --git a/enigma_types.h b/enigma_types.h index d0cc905..e7189b6 100644 --- a/enigma_types.h +++ b/enigma_types.h @@ -1,5 +1,8 @@ +#define ALPHABET_SIZE 26 +#define WHEELS_AMOUNT 3 + // Латинский алфавит в HEX представлении -const String key_values[26] = +const String key_values[ALPHABET_SIZE] = { "51", // Code51 - q "57", // Code57 - w @@ -29,14 +32,14 @@ const String key_values[26] = "4D" // Code4D - m }; -// Сдвиг в алфавите для каждого из трёх "дисков". +// Сдвиг в алфавите для каждого из "дисков". // Обязан быть в отрезке [0; 25], так как полный круг // возвращает значение обратно в 0. // Таким образом, при конфигурации { 1, 2, 5 } и // нажатой ' d ' сначала произойдёт сдвиг на 1, ' d ' // станет ' f ', потом на 2, ' f ' станет ' h ', // в конце ещё сдвиг на 5 и ' h ' станет ' x '. -const size_t key_shifts[3] = +const size_t key_shifts[WHEELS_AMOUNT] = { 1, 2,