X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=src%2Fserver%2Fhandler_door.c;h=190769aa739f03ed764d7d9e32077a9ddca51b20;hb=00f47de18c9b8462fc21ad16d89f257c96d2e6be;hp=99425268a648d634196d8f0c7653e611768e1b41;hpb=91d11fd7f9bf911c6abc59a18e17ec5890cee148;p=tpg%2Fopendispense2.git diff --git a/src/server/handler_door.c b/src/server/handler_door.c index 9942526..190769a 100644 --- a/src/server/handler_door.c +++ b/src/server/handler_door.c @@ -2,21 +2,25 @@ * OpenDispense 2 * UCC (University [of WA] Computer Club) Electronic Accounting System * - * handler_doror.c - Door Relay code + * handler_door.c - Door Relay code * * 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 -#define DEBUG 1 - -#define DOOR_UNLOCKED_DELAY 10 // 10 seconds before it re-locks +#define DOOR_UNLOCKED_DELAY 5 // Time in seconds before the door re-locks // === IMPORTS === @@ -24,6 +28,8 @@ int Door_InitHandler(); int Door_CanDispense(int User, int Item); int Door_DoDispense(int User, int Item); + int writes(int fd, const char *str); +char *ReadStatus(int FD); // === GLOBALS === tHandler gDoor_Handler = { @@ -32,12 +38,11 @@ tHandler gDoor_Handler = { Door_CanDispense, Door_DoDispense }; -char *gsDoor_Password = ""; -// int giDoor_SerialFD; +char *gsDoor_SerialPort; // Set from config in main.c // == CODE === int Door_InitHandler(void) -{ +{ return 0; } @@ -71,8 +76,7 @@ int Door_CanDispense(int User, int Item) */ int Door_DoDispense(int User, int Item) { - FILE *pipe; - char buf[512]; // Buffer flush location - the sewer :) + int door_serial_handle; #if DEBUG printf("Door_DoDispense: (User=%i,Item=%i)\n", User, Item); @@ -90,33 +94,35 @@ int Door_DoDispense(int User, int Item) return 1; } - // llogin or other - pipe = popen("llogin door -w -", "w"); - if( !pipe || pipe == (void*)-1 ) { - #if DEBUG - printf("Door_DoDispense: llogin failure\n"); - #endif + door_serial_handle = InitSerial(gsDoor_SerialPort, 115200); + if(door_serial_handle < 0) { + fprintf(stderr, "Unable to open door serial '%s'\n", gsDoor_SerialPort); + perror("Opening door port"); return -1; } - if( fread(buf, 512, 1, pipe) == 0 ) return -1; // Flush! - - // Send password - fputs(gsDoor_Password, pipe); - fputs("\n", pipe); - if( fread(buf, 512, 1, pipe) == 0 ) return -1; // Flush! - - // ATH1 - Unlock door - fputs("ATH1\n", pipe); - if( fread(buf, 512, 1, pipe) == 0 ) return -1; // Flush! - - // Wait before re-locking - sleep(DOOR_UNLOCKED_DELAY); - // Re-lock the door - fputs("ATH0\n", pipe); - if( fread(buf, 512, 1, pipe) == 0 ) return -1; // Flush! - - pclose(pipe); + // Disable local echo + { + struct termios info; + tcgetattr(door_serial_handle, &info); + info.c_cflag &= ~CLOCAL; + tcsetattr(door_serial_handle, TCSANOW, &info); + } + +// flush(door_serial_handle); + + writes(door_serial_handle, "4;"); + +#if 0 + char *status = ReadStatus(door_serial_handle); + if( !status ) return -1; + if( strcmp(status, "Opening door") != 0 ) { + fprintf(stderr, "Unknown/unexpected door status '%s'\n", status); + return -1; + } +#endif + + close(door_serial_handle); #if DEBUG printf("Door_DoDispense: User %i opened door\n", User); @@ -125,4 +131,35 @@ int Door_DoDispense(int User, int Item) return 0; } +int writes(int fd, const char *str) +{ + int len = strlen(str); + + if( len != write(fd, str, len) ) + { + return 1; + } + return 0; +} + +char *ReadStatus(int FD) +{ + char tmpbuf[32]; + int len; + len = read(FD, tmpbuf, sizeof(tmpbuf)-1); + tmpbuf[len] = 0; + char *msg = strchr(tmpbuf, ','); + if( !msg ) { + fprintf(stderr, "Door returned malformed data (no ',')\n"); + return NULL; + } + msg ++; + char *end = strchr(tmpbuf, ';'); + if( !end ) { + fprintf(stderr, "Door returned malformed data (no ';')\n"); + return NULL; + } + *end = '\0'; + return strdup(msg); +}