Implemented `dispense acct <name> =`
[tpg/opendispense2.git] / src / server / handler_coke.c
index a6b3cb9..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 ===
@@ -65,6 +68,10 @@ int Coke_CanDispense(int UNUSED(User), int Item)
        if( giCoke_SerialFD == -1 )
                return -2;
        
+       #if TRACE_COKE
+       printf("Coke_CanDispense: Flushing");
+       #endif
+       
        // Flush the input buffer
        {
                char    tmpbuf[512];
@@ -74,6 +81,9 @@ int Coke_CanDispense(int UNUSED(User), int Item)
        // 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 );
 
@@ -84,10 +94,17 @@ int Coke_CanDispense(int UNUSED(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);
@@ -104,6 +121,10 @@ int Coke_CanDispense(int UNUSED(User), int Item)
                }
                return -1;
        }
+       
+       #if TRACE_COKE
+       printf("Coke_CanDispense: wait for the prompt again");
+       #endif
 
        // Eat rest of response
        WaitForColon();
@@ -119,6 +140,10 @@ int Coke_CanDispense(int UNUSED(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;
@@ -141,18 +166,27 @@ int Coke_DoDispense(int UNUSED(User), int Item)
        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);
@@ -170,6 +204,10 @@ int Coke_DoDispense(int UNUSED(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 ) {
@@ -191,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