Fixing crappy code in coke handler, debug in others
[tpg/opendispense2.git] / src / server / handler_coke.c
index a6b3cb9..decdf4d 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,33 +68,49 @@ int Coke_CanDispense(int UNUSED(User), int Item)
        if( giCoke_SerialFD == -1 )
                return -2;
        
-       // Flush the input buffer
-       {
-               char    tmpbuf[512];
-               read(giCoke_SerialFD, tmpbuf, sizeof(tmpbuf));
-       }
+       #if TRACE_COKE
+       printf("Coke_CanDispense: Flushing\n");
+       #endif
+       
        
        // Wait for a prompt
        ret = 0;
-       do {
+       while( WaitForColon() && ret < 3 )
+       {
+               // Flush the input buffer
+               char    tmpbuf[512];
+               read(giCoke_SerialFD, tmpbuf, sizeof(tmpbuf));
+               #if TRACE_COKE
+               printf("Coke_CanDispense: sending 'd7'\n");
+               #endif
                write(giCoke_SerialFD, "d7\r\n", 4);
-       } while( WaitForColon() && ret++ < 3 );
+               ret ++;
+       }
 
-       if( ret == 3 ) {
+       if( !(ret < 3) ) {
                fprintf(stderr, "Coke machine timed out\n");
                return -2;      // -EMYBAD
        }
 
        // TODO: Handle "not ok" response to D7
        
+       #if TRACE_COKE
+       printf("Coke_CanDispense: sending 's%i'\n", 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\n");
+       #endif
        // Read from the machine (ignoring empty lines)
        while( (ret = ReadLine(sizeof(tmp)-1, tmp)) == 0 );
        printf("ret = %i, tmp = '%s'\n", ret, tmp);
-       if( tmp[0] == ':' ) {
+       // Read back-echoed lines
+       while( tmp[0] == ':' || tmp[1] != 'l' )
+       {
                ret = ReadLine(sizeof(tmp)-1, tmp);
                printf("ret = %i, tmp = '%s'\n", ret, tmp);
        }
@@ -104,6 +123,10 @@ int Coke_CanDispense(int UNUSED(User), int Item)
                }
                return -1;
        }
+       
+       #if TRACE_COKE
+       printf("Coke_CanDispense: wait for the prompt again\n");
+       #endif
 
        // Eat rest of response
        WaitForColon();
@@ -119,6 +142,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;
@@ -132,7 +159,7 @@ int Coke_CanDispense(int UNUSED(User), int Item)
 int Coke_DoDispense(int UNUSED(User), int Item)
 {
        char    tmp[32];
-        int    i, ret;
+        int    ret;
 
        // Sanity please
        if( Item < 0 || Item > 6 )      return -1;
@@ -141,35 +168,44 @@ int Coke_DoDispense(int UNUSED(User), int Item)
        if( giCoke_SerialFD == -1 )
                return -2;
        
-       // Flush the input buffer
+       #if TRACE_COKE
+       printf("Coke_DoDispense: flushing input\n");
+       #endif
+       
+       // Wait for prompt
+       ret = 0;
+       while( WaitForColon() && ret < 3 )
        {
+               // 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'\n");
+               #endif
                write(Item, "d7\r\n", 4);
-       } while( WaitForColon() && i++ < 3 );
+       }
 
+       #if TRACE_COKE
+       printf("Coke_DoDispense: sending 'd%i'\n", Item);
+       #endif
        // Dispense
        sprintf(tmp, "d%i\r\n", Item);
        write(giCoke_SerialFD, tmp, 4);
        
-       // Read empty lines
-       while( (ret = ReadLine(sizeof(tmp)-1, tmp)) == -1 );
-       if( ret == -1 ) return -1;
-       // Read d%i
-       while( tmp[0] == ':' ) {
+       // Read empty lines and echo-backs
+       do {
                ret = ReadLine(sizeof(tmp)-1, tmp);
                if( ret == -1 ) return -1;
-       }
-       // Get status
-       ret = ReadLine(sizeof(tmp)-1, tmp);
-       if( ret == -1 ) return -1;
+               #if TRACE_COKE
+               printf("Coke_DoDispense: read %i '%s'\n", ret, tmp);
+               #endif
+       } while( ret == 0 || tmp[0] == ':' || tmp[0] == 'd' );
 
        WaitForColon(); // Eat up rest of response
+       
+       #if TRACE_COKE
+       printf("Coke_DoDispense: done\n");
+       #endif
 
        // TODO: Regex
        if( strcmp(tmp, "ok") == 0 ) {
@@ -191,7 +227,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