Implement shift(), encode() and index converter
This commit is contained in:
parent
4536cebb65
commit
adf7487ad0
69
code.c.ino
69
code.c.ino
|
@ -6,6 +6,54 @@
|
||||||
|
|
||||||
PS2KeyAdvanced keyboard;
|
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()
|
void setup()
|
||||||
{
|
{
|
||||||
keyboard.begin(DATAPIN, IRQPIN);
|
keyboard.begin(DATAPIN, IRQPIN);
|
||||||
|
@ -14,12 +62,17 @@ void setup()
|
||||||
|
|
||||||
void loop()
|
void loop()
|
||||||
{
|
{
|
||||||
if (keyboard.available())
|
if (!keyboard.available())
|
||||||
{
|
return;
|
||||||
const uint16_t key = keyboard.read();
|
|
||||||
if (key > 0)
|
const uint16_t key = keyboard.read();
|
||||||
{
|
if (key <= 0)
|
||||||
const String value = String(key, HEX);
|
return;
|
||||||
}
|
|
||||||
}
|
const String value = String(key, HEX);
|
||||||
|
const size_t index = toKeyIndex(value);
|
||||||
|
if (index == -1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
const size_t encoded_index = encode(index);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
|
#define ALPHABET_SIZE 26
|
||||||
|
#define WHEELS_AMOUNT 3
|
||||||
|
|
||||||
// Латинский алфавит в HEX представлении
|
// Латинский алфавит в HEX представлении
|
||||||
const String key_values[26] =
|
const String key_values[ALPHABET_SIZE] =
|
||||||
{
|
{
|
||||||
"51", // Code51 - q
|
"51", // Code51 - q
|
||||||
"57", // Code57 - w
|
"57", // Code57 - w
|
||||||
|
@ -29,14 +32,14 @@ const String key_values[26] =
|
||||||
"4D" // Code4D - m
|
"4D" // Code4D - m
|
||||||
};
|
};
|
||||||
|
|
||||||
// Сдвиг в алфавите для каждого из трёх "дисков".
|
// Сдвиг в алфавите для каждого из "дисков".
|
||||||
// Обязан быть в отрезке [0; 25], так как полный круг
|
// Обязан быть в отрезке [0; 25], так как полный круг
|
||||||
// возвращает значение обратно в 0.
|
// возвращает значение обратно в 0.
|
||||||
// Таким образом, при конфигурации { 1, 2, 5 } и
|
// Таким образом, при конфигурации { 1, 2, 5 } и
|
||||||
// нажатой ' d ' сначала произойдёт сдвиг на 1, ' d '
|
// нажатой ' d ' сначала произойдёт сдвиг на 1, ' d '
|
||||||
// станет ' f ', потом на 2, ' f ' станет ' h ',
|
// станет ' f ', потом на 2, ' f ' станет ' h ',
|
||||||
// в конце ещё сдвиг на 5 и ' h ' станет ' x '.
|
// в конце ещё сдвиг на 5 и ' h ' станет ' x '.
|
||||||
const size_t key_shifts[3] =
|
const size_t key_shifts[WHEELS_AMOUNT] =
|
||||||
{
|
{
|
||||||
1,
|
1,
|
||||||
2,
|
2,
|
||||||
|
|
Loading…
Reference in New Issue