68 lines
1.5 KiB
C
68 lines
1.5 KiB
C
#include "pin_handler.h"
|
|
|
|
#include <err.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
static void set_data(size_t *wire, size_t id_mat, short state, size_t *pointer)
|
|
{
|
|
// set multiple rows or cols at the same time resulting in a undefined
|
|
// behavior, the result is then voided
|
|
if (state && *wire != 0 && *wire != id_mat)
|
|
{
|
|
*pointer = 0;
|
|
return;
|
|
}
|
|
|
|
if (state)
|
|
*wire = id_mat;
|
|
else
|
|
*wire = 0;
|
|
}
|
|
|
|
static void read_digit(char *sequence, size_t *pointer, size_t *row,
|
|
size_t *col)
|
|
{
|
|
if (*row == 0 || *col == 0)
|
|
return;
|
|
|
|
const char keyboard[4][4] = {
|
|
{ '1', '2', '3', 'A' },
|
|
{ '4', '5', '6', 'B' },
|
|
{ '7', '8', '9', 'C' },
|
|
{ '*', '0', '#', 'D' },
|
|
};
|
|
|
|
sequence[*pointer] = keyboard[*row - 1][*col - 1];
|
|
*pointer += 1;
|
|
sequence[*pointer + 1] = 0;
|
|
|
|
if (keyboard[*row - 1][*col - 1] == '#')
|
|
{
|
|
if (DEBUG_LEVEL >= 1)
|
|
printf("full sequence: %s\n", sequence);
|
|
if (!strcmp(CODE, sequence))
|
|
{
|
|
errx(0, "Code found: %s\n", sequence);
|
|
}
|
|
else
|
|
*pointer = 0;
|
|
}
|
|
}
|
|
|
|
void set_pin(int id, short state, size_t *row, size_t *col, char *sequence,
|
|
size_t *pointer)
|
|
{
|
|
if (DEBUG_LEVEL >= 2)
|
|
printf("set pin %i, state: %u\n", id, state);
|
|
if (id <= 4)
|
|
{
|
|
set_data(row, id, state, pointer);
|
|
}
|
|
else
|
|
{
|
|
set_data(col, id - 4, state, pointer);
|
|
}
|
|
read_digit(sequence, pointer, row, col);
|
|
}
|