X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=src%2Fserver%2Fhandler_door.c;h=90c65fb501bc69cec575e25f5dc2dd22726a150a;hb=f53b34c3dc40410c70c8df7fdb3577e1a2c24256;hp=1ffcc857feb599bdb05d0ce9ac03cc4ae05f984d;hpb=dce0ef0f3c15f9e38e57d4a14c904c339affac4e;p=tpg%2Fopendispense2.git diff --git a/src/server/handler_door.c b/src/server/handler_door.c index 1ffcc85..90c65fb 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 === @@ -20,6 +29,7 @@ int Door_InitHandler(); int Door_CanDispense(int User, int Item); int Door_DoDispense(int User, int Item); + int writes(int fd, const char *str); // === GLOBALS === tHandler gDoor_Handler = { @@ -28,17 +38,11 @@ tHandler gDoor_Handler = { Door_CanDispense, Door_DoDispense }; -//char *gsDoor_SerialPort = "/dev/ttyS0"; -// int giDoor_SerialFD; +char *gsDoor_SerialPort = "/dev/ttyS3"; // == CODE === -int Door_InitHandler() +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; } @@ -46,8 +50,23 @@ int Door_InitHandler() */ 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; + } + + #if DEBUG + printf("Door_CanDispense: User %i can open the door\n", User); + #endif return 0; } @@ -57,15 +76,74 @@ int Door_CanDispense(int User, int Item) */ int Door_DoDispense(int User, int Item) { - + 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; + } + + door_serial_handle = InitSerial(gsDoor_SerialPort, 1200); + if(door_serial_handle < 0) { + fprintf(stderr, "Unable to open door serial '%s'\n", gsDoor_SerialPort); + perror("Opening door port"); + return -1; + } + + { + struct termios info; + tcgetattr(door_serial_handle, &info); +// info.c_iflag &= ~IGNCR; // Ignore \r + info.c_cflag &= ~CLOCAL; + tcsetattr(door_serial_handle, TCSANOW, &info); + } + + writes(door_serial_handle, "\r\r"); + sleep(1); + + if( writes(door_serial_handle, "ATH1\r") ) { + fprintf(stderr, "Unable to open door (sending ATH1)\n"); + perror("Sending ATH1"); + return -1; + } + + // Wait before re-locking + sleep(DOOR_UNLOCKED_DELAY); + + if( writes(door_serial_handle, "ATH0\r") ) { + fprintf(stderr, "Oh, hell! Door not re-locking, big error (sending ATH0 failed)\n"); + perror("Sending ATH0"); + return -1; + } + + close(door_serial_handle); - // llogin or other + #if DEBUG + printf("Door_DoDispense: User %i opened door\n", User); + #endif return 0; } +int writes(int fd, const char *str) +{ + int len = strlen(str); + + if( len != write(fd, str, len) ) + { + return 1; + } + return 0; +}