Implemented `dispense acct <name> =`
[tpg/opendispense2.git] / src / server / handler_coke.c
index 030740c..62ea17f 100644 (file)
@@ -18,6 +18,9 @@
 #include <fcntl.h>
 #include <regex.h>
 
+#define READ_TIMEOUT   2       // 2 seconds for ReadChar
+#define TRACE_COKE     1
+
 // === IMPORTS ===
 
 // === PROTOTYPES ===
@@ -52,7 +55,7 @@ int Coke_InitHandler()
        return 0;
 }
 
-int Coke_CanDispense(int User, int Item)
+int Coke_CanDispense(int UNUSED(User), int Item)
 {
        char    tmp[40], *status;
        regmatch_t      matches[4];
@@ -61,8 +64,26 @@ int Coke_CanDispense(int User, int Item)
        // Sanity please
        if( Item < 0 || Item > 6 )      return -1;      // -EYOURBAD
        
+       // Can't dispense if the machine is not connected
+       if( giCoke_SerialFD == -1 )
+               return -2;
+       
+       #if TRACE_COKE
+       printf("Coke_CanDispense: Flushing");
+       #endif
+       
+       // Flush the input buffer
+       {
+               char    tmpbuf[512];
+               read(giCoke_SerialFD, tmpbuf, sizeof(tmpbuf));
+       }
+       
+       // Wait for a prompt
        ret = 0;
        do {
+               #if TRACE_COKE
+               printf("Coke_DoDispense: sending 'd7'");
+               #endif
                write(giCoke_SerialFD, "d7\r\n", 4);
        } while( WaitForColon() && ret++ < 3 );
 
@@ -73,10 +94,17 @@ int Coke_CanDispense(int User, int Item)
 
        // TODO: Handle "not ok" response to D7
        
+       #if TRACE_COKE
+       printf("Coke_CanDispense: sending 's%i'", Item);
+       #endif
+       
        // Ask the coke machine
        sprintf(tmp, "s%i\r\n", Item);
        write(giCoke_SerialFD, tmp, 4);
 
+       #if TRACE_COKE
+       printf("Coke_CanDispense: reading response");
+       #endif
        // Read from the machine (ignoring empty lines)
        while( (ret = ReadLine(sizeof(tmp)-1, tmp)) == 0 );
        printf("ret = %i, tmp = '%s'\n", ret, tmp);
@@ -93,6 +121,10 @@ int Coke_CanDispense(int User, int Item)
                }
                return -1;
        }
+       
+       #if TRACE_COKE
+       printf("Coke_CanDispense: wait for the prompt again");
+       #endif
 
        // Eat rest of response
        WaitForColon();
@@ -108,6 +140,10 @@ int Coke_CanDispense(int User, int Item)
        status = &tmp[ matches[3].rm_so ];
 
        printf("Machine responded slot status '%s'\n", status);
+       
+       #if TRACE_COKE
+       printf("Coke_CanDispense: done");
+       #endif
 
        if( strcmp(status, "full") == 0 )
                return 0;
@@ -118,7 +154,7 @@ int Coke_CanDispense(int User, int Item)
 /**
  * \brief Actually do a dispense from the coke machine
  */
-int Coke_DoDispense(int User, int Item)
+int Coke_DoDispense(int UNUSED(User), int Item)
 {
        char    tmp[32];
         int    i, ret;
@@ -126,12 +162,31 @@ int Coke_DoDispense(int User, int Item)
        // Sanity please
        if( Item < 0 || Item > 6 )      return -1;
 
+       // Can't dispense if the machine is not connected
+       if( giCoke_SerialFD == -1 )
+               return -2;
+       
+       #if TRACE_COKE
+       printf("Coke_DoDispense: flushing input");
+       #endif
+       // Flush the input buffer
+       {
+               char    tmpbuf[512];
+               read(giCoke_SerialFD, tmpbuf, sizeof(tmpbuf));
+       }
+       
        // Wait for prompt
        i = 0;
        do {
+               #if TRACE_COKE
+               printf("Coke_DoDispense: sending 'd7'");
+               #endif
                write(Item, "d7\r\n", 4);
        } while( WaitForColon() && i++ < 3 );
 
+       #if TRACE_COKE
+       printf("Coke_DoDispense: sending 'd%i'", Item);
+       #endif
        // Dispense
        sprintf(tmp, "d%i\r\n", Item);
        write(giCoke_SerialFD, tmp, 4);
@@ -149,6 +204,10 @@ int Coke_DoDispense(int User, int Item)
        if( ret == -1 ) return -1;
 
        WaitForColon(); // Eat up rest of response
+       
+       #if TRACE_COKE
+       printf("Coke_DoDispense: done");
+       #endif
 
        // TODO: Regex
        if( strcmp(tmp, "ok") == 0 ) {
@@ -170,7 +229,7 @@ char ReadChar()
         int    ret;
        struct timeval  timeout;
        
-       timeout.tv_sec = 5;     // 5 second timeout
+       timeout.tv_sec = READ_TIMEOUT;
        timeout.tv_usec = 0;
        
        FD_ZERO(&readfs);

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