Files
ACSreader/reader.c
2019-01-31 10:14:33 +01:00

133 lines
4.0 KiB
C

#define _GNU_SOURCE
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <syslog.h>
#include <string.h>
#include "runtime.h"
#include "config.h"
#include "web.h"
#include "gpio.h"
#include "serial.h"
#include "mf700.h"
#include "log.h"
#include "info.h"
#include "jsontypes.h"
#include "inputs.h"
#include "reader.h"
#include "relay.h"
#include "display.h"
void readerrequest(struct reader_t *reader, struct config_t *config){
server_credential_request(reader, config);
#ifdef TEST
printf("Cardnumber: %d\n", reader->cardnumber);
printf("Opentime: %d\n", reader->opentime);
printf("State: %d\n", reader->state);
//printf("server: %s\n", reader->config->serveraddress);
#endif
if(reader->state == ACCESSGRANTED){
if(mf700_controlcommand(&reader->fd, (unsigned int)reader->opentime, GREENLED1BEEP) == ERROR){
exitprogram(EXIT_FAILURE);
}
if(relay_switch(RELAY_ON, reader->opentime, config) == ERROR){
exitprogram(EXIT_FAILURE);
}
char *log;
if(asprintf(&log, "CARD ID %d", reader->cardnumber) > 0){
clear_display();
write_display(line[1], 0, 0, log);
write_display(line[2], 0, 0, "access granted");
display_timer(reader->opentime);
}
free(log);
if(asprintf(&log, "%d - access granted", reader->cardnumber) > 0 ){
writesyslog(LOG_INFO, log);
}
free(log);
}
else if(reader->state == ACCESSDENIED){
if(mf700_controlcommand(&reader->fd, 2, REDLED3BEEPS) == ERROR){
exitprogram(EXIT_FAILURE);
}
char *log;
if(asprintf(&log, "CARD ID %d", reader->cardnumber) > 0){
clear_display();
write_display(line[1], 0, 0, log);
write_display(line[2], 0, 0, "access denied");
display_timer(3);
}
free(log);
if(asprintf(&log, "%d - access denied", reader->cardnumber) > 0 ){
writesyslog(LOG_INFO, log);
}
free(log);
}
else if (reader->state == UNKNOWNERROR || reader->state == CONNECTIONTIMEOUT || reader->state == RESOLVEERROR || reader->state == SERVERERROR || reader->state == CREDENTIALERROR){
if(mf700_controlcommand(&reader->fd, 0, EVERYLEDON) == ERROR){
exitprogram(EXIT_FAILURE);
}
if(mf700_controlcommand(&reader->fd, 5, BUZZER3TIME) == ERROR){
exitprogram(EXIT_FAILURE);
}
char *log;
char *ln1, *ln2;
int len = 0;
switch(reader->state){
case UNKNOWNERROR:
len = asprintf(&log, "Unknown error");
asprintf(&ln1, "Unknown error");
asprintf(&ln2, "%s", config->serveraddress);
break;
case CONNECTIONTIMEOUT:
len = asprintf(&log, "Connection timeout to server: %s", config->serveraddress);
asprintf(&ln1, "Connection timout");
asprintf(&ln2, "%s", config->serveraddress);
break;
case RESOLVEERROR:
len = asprintf(&log, "Can't resolve server address: %s", config->serveraddress);
asprintf(&ln1, "Resolve error");
asprintf(&ln2, "%s", config->serveraddress);
break;
case SERVERERROR:
len = asprintf(&log, "Error in ACS server: %s", config->serveraddress);
asprintf(&ln1, "Error in server");
asprintf(&ln2, "%s", config->serveraddress);
break;
case CREDENTIALERROR:
len = asprintf(&log, "Error in credential: %s", config->serveraddress);
asprintf(&ln1, "Error in credential");
asprintf(&ln2, "%s", config->serveraddress);
break;
default:
len = asprintf(&log, "switch default - server errors");
asprintf(&ln1, "Switch default server");
asprintf(&ln2, "cannot happen !");
}
if(len > 0){
clear_display();
write_display(line[1], 0, 0, ln1);
write_display(line[2], 0, 0, ln2);
writesyslog(LOG_ERR, log);
display_timer(5);
}
free(ln1);
free(ln2);
free(log);
}else{
char *log;
if(asprintf(&log, "Unknown state from server: %d\n", reader->state) > 0 ){
writesyslog(LOG_ERR, log);
}
free(log);
}
}