X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=src%2Fserver%2Fhandler_door.c;h=3359ed16fa11952151269a5bcaa39f3b990d8a09;hb=aab09714f5780d2d7eeb7f1f94a624e0535bdb22;hp=1341679d5050b963fab8a7b4d4e9a18e83038263;hpb=d5281ab72f8a105cdc849e4efa602f9fa5c33170;p=tpg%2Fopendispense2.git diff --git a/src/server/handler_door.c b/src/server/handler_door.c index 1341679..3359ed1 100644 --- a/src/server/handler_door.c +++ b/src/server/handler_door.c @@ -7,12 +7,21 @@ * This file is licenced under the 3-clause BSD Licence. See the file * COPYING for full details. */ +#define DEBUG 1 +#define USE_POPEN 0 + #include "common.h" #include #include #include #include #include +#include +#include +#include +#include + +#define DOOR_UNLOCKED_DELAY 5 // Time in seconds before the door re-locks // === IMPORTS === @@ -28,18 +37,11 @@ tHandler gDoor_Handler = { Door_CanDispense, Door_DoDispense }; -char *gsDoor_Password; -char *gsDoor_Command; -// int giDoor_SerialFD; +char *gsDoor_SerialPort = "/dev/ttyS3"; // == CODE === int Door_InitHandler(void) { -// printf("connecting to door...\n"); -// giDoor_SerialFD = open(gsDoor_SerialPort, O_RDWR); -// if( giDoor_SerialFD == -1 ) { -// fprintf(stderr, "ERROR: Unable to open coke serial port ('%s')\n", gsDoor_SerialPort); -// } return 0; } @@ -47,14 +49,23 @@ int Door_InitHandler(void) */ int Door_CanDispense(int User, int Item) { + #if DEBUG + printf("Door_CanDispense: (User=%i,Item=%i)\n", User, Item); + #endif // Sanity please - if( Item == 0 ) return -1; + if( Item != 0 ) return -1; if( !(Bank_GetFlags(User) & USER_FLAG_DOORGROUP) ) + { + #if DEBUG + printf("Door_CanDispense: User %i not in door\n", User); + #endif return 1; - - gsDoor_Command = malloc(sizeof("llogin door -w ")+strlen(gsDoor_Password)); - sprintf(gsDoor_Command, "llogin door -w %s", gsDoor_Password); + } + + #if DEBUG + printf("Door_CanDispense: User %i can open the door\n", User); + #endif return 0; } @@ -64,26 +75,47 @@ int Door_CanDispense(int User, int Item) */ int Door_DoDispense(int User, int Item) { - FILE *pipe; + int door_serial_handle; + + #if DEBUG + printf("Door_DoDispense: (User=%i,Item=%i)\n", User, Item); + #endif + // Sanity please if( Item != 0 ) return -1; // Check if user is in door if( !(Bank_GetFlags(User) & USER_FLAG_DOORGROUP) ) + { + #if DEBUG + printf("Door_CanDispense: User %i not in door\n", User); + #endif return 1; + } - // llogin or other - pipe = popen(gsDoor_Command, "w"); - if( !pipe || pipe == (void*)-1 ) + door_serial_handle = InitSerial(gsDoor_SerialPort, 1200); + + if( write(door_serial_handle, "ATH1\n", 5) != 5 ) { + fprintf(stderr, "Unable to open door (sending ATH1)\n"); + perror("Sending ATH1"); return -1; + } - fputs("ATH1F", pipe); - sleep(1); - fputs("ATH10", pipe); + // Wait before re-locking + sleep(DOOR_UNLOCKED_DELAY); + + if( write(door_serial_handle, "ATH0\n", 5) != 5 ) { + fprintf(stderr, "Oh, hell! Door not re-locking, big error (sending ATH0 failed)\n"); + perror("Sending ATH0"); + return -1; + } + + close(door_serial_handle); - pclose(pipe); + #if DEBUG + printf("Door_DoDispense: User %i opened door\n", User); + #endif return 0; } -