arduino_digicode_brute_forc.../src/pin_handler.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);
}