Fixed coke handler regex, added init for handlers
authorJohn Hodge <[email protected]>
Sat, 20 Nov 2010 19:03:51 +0000 (03:03 +0800)
committerJohn Hodge <[email protected]>
Sat, 20 Nov 2010 19:03:51 +0000 (03:03 +0800)
src/server/handler_coke.c
src/server/itemdb.c
src/server/main.c

index 493212e..13f25c0 100644 (file)
@@ -9,6 +9,7 @@
  */
 #include "common.h"
 #include <stdio.h>
+#include <string.h>
 #include <unistd.h>
 #include <sys/stat.h>
 #include <fcntl.h>
@@ -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;
 }
index 0cb932d..87ced4e 100644 (file)
@@ -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
  */
index 76e720b..5022fd6 100644 (file)
@@ -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;
 }

UCC git Repository :: git.ucc.asn.au