Last active
July 7, 2018 10:10
-
-
Save linuxgnuru/d68e358ea932be1d435610cb687e01f0 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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