Skip to content

Instantly share code, notes, and snippets.

@linuxgnuru
Last active July 7, 2018 10:10
Show Gist options
  • Save linuxgnuru/d68e358ea932be1d435610cb687e01f0 to your computer and use it in GitHub Desktop.
Save linuxgnuru/d68e358ea932be1d435610cb687e01f0 to your computer and use it in GitHub Desktop.
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <signal.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <linux/input.h>
#include <linux/uinput.h>
#include <wiringPi.h>
#define die(str, args...) do { \
perror(str); \
exit(EXIT_FAILURE); \
} while (0)
const char MATRIX[4][4] = {
{ '1','2','3','A' },
{ '4','5','6','B' },
{ '7','8','9','C' },
{ '*','0','#','D' }
};
// Pins for keypad
const int ROW[] = { 0, 1, 2, 3 };
const int COL[] = { 4, 5, 6, 7 };
// Pins for LEDs
const int okPin = 21;
const int noPin = 22;
// Password
const char pass[5] = { '1', '7', '0', '1', 'D' };
// device
int fd;
const int butPin = 29;
// catch signals and clean up GPIO
static void sDie(int sig)
{
char buf[80];
int i;
digitalWrite(okPin, LOW);
digitalWrite(noPin, LOW);
for (i = 0; i < 4; i++) digitalWrite(COL[i], LOW);
if (sig != 0 && sig != 2) (void)fprintf(stderr, "caught signal %d\n", sig);
if (sig == 2) (void)fprintf(stderr, "Exiting due to Ctrl + C\n");
ioctl(fd, UI_DEV_DESTROY);
close(fd);
exit(0);
}
int main(int argc, char **argv)
{
int i, j, k;
struct uinput_user_dev uidev;
struct input_event ev;
int dx, dy;
int pNum = 0;
int loopFlag = 1;
int numTries = 0;
char buf[80];
char new_m[2];
// note: we're assuming BSD-style reliable signals here
(void)signal(SIGINT, sDie);
(void)signal(SIGHUP, sDie);
if (wiringPiSetup() == -1)
{
fprintf(stderr, "oops: %s\n", strerror(errno));
return EXIT_FAILURE;
}
pinMode(okPin, OUTPUT);
pinMode(noPin, OUTPUT);
digitalWrite(okPin, LOW);
digitalWrite(noPin, LOW);
for (i = 0; i < 4; i++)
pinMode(COL[i], OUTPUT);
for (i = 0; i < 4; i++)
{
pinMode(ROW[i], INPUT);
pullUpDnControl(ROW[i], PUD_UP);
}
fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK);
if (fd < 0)
{
sprintf(buf, "[%d, %s] error: open", __LINE__, __FILE__);
die(buf);
}
ioctl(fd, UI_SET_EVBIT, EV_KEY);
ioctl(fd, UI_SET_KEYBIT, KEY_M);
ioctl(fd, UI_SET_KEYBIT, KEY_I);
ioctl(fd, UI_SET_KEYBIT, KEY_C);
ioctl(fd, UI_SET_KEYBIT, KEY_LEFTSHIFT);
ioctl(fd, UI_SET_KEYBIT, KEY_1);
ioctl(fd, UI_SET_KEYBIT, KEY_E);
ioctl(fd, UI_SET_KEYBIT, KEY_Y);
ioctl(fd, UI_SET_KEYBIT, KEY_M);
ioctl(fd, UI_SET_KEYBIT, KEY_ENTER);
memset(&uidev, 0, sizeof(uidev));
snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "Wiggins-KeyPass");
uidev.id.bustype = BUS_USB;
uidev.id.vendor = 0x1234;
uidev.id.product = 0xfedc;
uidev.id.version = 1;
write(fd, &uidev, sizeof(uidev));
ioctl(fd, UI_DEV_CREATE);
sleep(2);
//srand(time(NULL));
while (loopFlag)
{
for (i = 0; i < 4; i++)
{
digitalWrite(COL[i], LOW);
for (j = 0; j < 4; j++)
{
if (digitalRead(ROW[j]) == LOW)
{
new_m[0] = MATRIX[j][i];
new_m[1] = '\0';
printf("%s\n", new_m);
if (MATRIX[j][i] == '#' || MATRIX[j][i] == '*')
{
digitalWrite(okPin, LOW);
digitalWrite(noPin, LOW);
numTries = 0;
pNum = 0;
}
else
{
if (MATRIX[j][i] == pass[pNum])
pNum++;
else
{
pNum = 0;
digitalWrite(noPin, HIGH);
new_m[0] = 'E';
new_m[1] = '\0';
printf("%s\n", new_m);
numTries++;
}
if (pNum >= 5 && digitalRead(noPin) != HIGH)
loopFlag = 0;
}
while (digitalRead(ROW[j]) == LOW)
delay(20);
}
}
digitalWrite(COL[i], HIGH);
}
}
memset(&ev, 0, sizeof(struct input_event));
ev.type = EV_KEY; ev.code = KEY_M ev.value = 1;
write(fd, &ev, sizeof(struct input_event));
memset(&ev, 0, sizeof(struct input_event));
ev.type = EV_KEY; ev.code = KEY_I ev.value = 1;
write(fd, &ev, sizeof(struct input_event));
memset(&ev, 0, sizeof(struct input_event));
ev.type = EV_KEY; ev.code = KEY_C ev.value = 1;
write(fd, &ev, sizeof(struct input_event));
memset(&ev, 0, sizeof(struct input_event));
ev.type = EV_KEY; ev.code = KEY_LEFTSHIFT; ev.value = 1;
write(fd, &ev, sizeof(struct input_event));
memset(&ev, 0, sizeof(struct input_event));
ev.type = EV_KEY; ev.code = KEY_1; ev.value = 1;
write(fd, &ev, sizeof(struct input_event));
memset(&ev, 0, sizeof(struct input_event));
ev.type = EV_KEY; ev.code = KEY_LEFTSHIFT; ev.value = 0;
write(fd, &ev, sizeof(struct input_event));
memset(&ev, 0, sizeof(struct input_event));
ev.type = EV_KEY; ev.code = KEY_E ev.value = 1;
write(fd, &ev, sizeof(struct input_event));
memset(&ev, 0, sizeof(struct input_event));
ev.type = EV_KEY; ev.code = KEY_Y ev.value = 1;
write(fd, &ev, sizeof(struct input_event));
memset(&ev, 0, sizeof(struct input_event));
ev.type = EV_KEY; ev.code = KEY_M ev.value = 1;
write(fd, &ev, sizeof(struct input_event));
memset(&ev, 0, sizeof(struct input_event));
ev.type = EV_KEY; ev.code = KEY_ENTER; ev.value = 1;
write(fd, &ev, sizeof(struct input_event));
usleep(15000);
memset(&ev, 0, sizeof(struct input_event));
ev.type = EV_SYN; ev.code = 0; ev.value = 0;
write(fd, &ev, sizeof(struct input_event));
//sleep(2);
ioctl(fd, UI_DEV_DESTROY);
close(fd);
//digitalWrite(okPin, HIGH);
//delay(2000);
digitalWrite(okPin, LOW);
return EXIT_SUCCESS;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment