From 4b597ccec76234944c19a9fb5d4f5d63e5671807 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Sun, 21 Nov 2010 03:03:51 +0800 Subject: [PATCH] Fixed coke handler regex, added init for handlers --- src/server/handler_coke.c | 24 +++++++++++++++++------- src/server/itemdb.c | 10 ++++++++++ src/server/main.c | 8 ++++++-- 3 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/server/handler_coke.c b/src/server/handler_coke.c index 493212e..13f25c0 100644 --- a/src/server/handler_coke.c +++ b/src/server/handler_coke.c @@ -9,6 +9,7 @@ */ #include "common.h" #include +#include #include #include #include @@ -36,27 +37,33 @@ regex_t gCoke_StatusRegex; int Coke_InitHandler() { giCoke_SerialFD = open(gsCoke_SerialPort, O_RDWR); - regcomp(&gCoke_StatusRegex, "^$", REG_EXTENDED); + regcomp(&gCoke_StatusRegex, "^slot\\s+(\\d)\\s+([^:]+):([a-zA-Z]+)\\s*", REG_EXTENDED); return 0; } int Coke_CanDispense(int User, int Item) { - char tmp[32]; + char tmp[32], *status; regmatch_t matches[4]; // Sanity please if( Item < 0 || Item > 6 ) return -1; // Ask the coke machine - sprintf(tmp, "s%i", Item); + sprintf(tmp, "s%i\n", Item); write(giCoke_SerialFD, tmp, 2); // Read the response read(giCoke_SerialFD, tmp, sizeof(tmp)-1); regexec(&gCoke_StatusRegex, tmp, sizeof(matches)/sizeof(matches[0]), matches, 0); - printf("s%i response '%s'\n", Item, tmp); + tmp[ matches[3].rm_eo ] = '\0'; + status = &tmp[ matches[3].rm_so ]; + + printf("Machine responded slot status '%s'\n", status); + + if( strcmp(status, "full") == 0 ) + return 1; return 0; } @@ -66,21 +73,24 @@ int Coke_CanDispense(int User, int Item) */ int Coke_DoDispense(int User, int Item) { - char tmp[32]; + char tmp[32], *status; regmatch_t matches[4]; // Sanity please if( Item < 0 || Item > 6 ) return -1; // Dispense - sprintf(tmp, "d%i", Item); + sprintf(tmp, "d%i\n", Item); write(giCoke_SerialFD, tmp, 2); // Get status read(giCoke_SerialFD, tmp, sizeof(tmp)-1); regexec(&gCoke_StatusRegex, tmp, sizeof(matches)/sizeof(matches[0]), matches, 0); - printf("d%i response '%s'\n", Item, tmp); + tmp[ matches[3].rm_eo ] = '\0'; + status = &tmp[ matches[3].rm_so ]; + + printf("Machine responded slot status '%s'\n", status); return 0; } diff --git a/src/server/itemdb.c b/src/server/itemdb.c index 0cb932d..87ced4e 100644 --- a/src/server/itemdb.c +++ b/src/server/itemdb.c @@ -30,6 +30,16 @@ tHandler *gaHandlers[] = {&gPseudo_Handler, &gCoke_Handler}; char *gsItemListFile = DEFAULT_ITEM_FILE; // === CODE === +void Init_Handlers() +{ + int i; + for( i = 0; i < giNumHandlers; i ++ ) + { + if( gaHandlers[i]->Init ) + gaHandlers[i]->Init(0, NULL); // TODO: Arguments + } +} + /** * \brief Read the item list from disk */ diff --git a/src/server/main.c b/src/server/main.c index 76e720b..5022fd6 100644 --- a/src/server/main.c +++ b/src/server/main.c @@ -15,6 +15,7 @@ // === IMPORTS === extern void Init_Cokebank(const char *Argument); // cokebank.c +extern void Init_Handlers(void); extern void Load_Itemlist(void); extern void Server_Start(void); extern int giServer_Port; @@ -70,13 +71,16 @@ int main(int argc, char *argv[]) } } - Init_Cokebank(gsCokebankPath); + signal(SIGINT, sigint_handler); + Init_Cokebank(gsCokebankPath); + + Init_Handlers(); + Load_Itemlist(); Server_Start(); - signal(SIGINT, sigint_handler); return 0; } -- 2.20.1