Server - Slight fixes to coke handler to cope with the machine being dodge
[tpg/opendispense2.git] / src / server / handler_coke.c
index 12e2431..fffa7b6 100644 (file)
@@ -21,7 +21,7 @@
 #include <pthread.h>
 
 #define READ_TIMEOUT   2       // 2 seconds for ReadChar
-#define TRACE_COKE     1
+#define TRACE_COKE     0
 
 #if TRACE_COKE
 # define TRACE(v...) do{printf("%s: ",__func__);printf(v);}while(0)
@@ -53,13 +53,14 @@ char        *gsCoke_SerialPort = "/dev/ttyS0";
 regex_t        gCoke_StatusRegex;
  int   gaCoke_CachedStatus[7];
 pthread_mutex_t        gCoke_Mutex = PTHREAD_MUTEX_INITIALIZER;
+time_t gtCoke_LastDispenseTime;
 
 // == CODE ===
 int Coke_InitHandler()
 {
        CompileRegex(&gCoke_StatusRegex, "^slot\\s+([0-9]+)\\s+([^:]+):([a-zA-Z]+)\\s*", REG_EXTENDED);
        
-       printf("connecting to coke machine...\n");
+       printf("Connecting to coke machine on '%s'\n", gsCoke_SerialPort);
        
        giCoke_SerialFD = InitSerial(gsCoke_SerialPort, 9600);
        if( giCoke_SerialFD == -1 ) {
@@ -72,23 +73,28 @@ int Coke_InitHandler()
                // Reset the slot names.
                // - Dunno why this is needed, but the machine plays silly
                //   sometimes.
-               Writef("n0 Slot0\n");
+               Writef("\r\n\r\n");
+               WaitForColon();
+               Writef("n0 Slot0\r\n");
                if( !WaitForColon() )
                {
-                       Writef("n1 Slot1\n");
+                       Writef("n1 Slot1\r\n");
                        WaitForColon();
-                       Writef("n2 Slot2\n");
+                       Writef("n2 Slot2\r\n");
                        WaitForColon();
-                       Writef("n3 Slot3\n");
+                       Writef("n3 Slot3\r\n");
                        WaitForColon();
-                       Writef("n4 Slot4\n");
+                       Writef("n4 Slot4\r\n");
                        WaitForColon();
-                       Writef("n5 Slot5\n");
+                       Writef("n5 Slot5\r\n");
+                       WaitForColon();
+                       Writef("n6 Coke\r\n");
                        WaitForColon();
-                       Writef("n6 Coke\n");
                        
                        Coke_int_UpdateSlotStatuses();
                }
+               else
+                       fprintf(stderr, "Coke machine timed out.\n");
        }
        
        AddPeriodicFunction(Coke_int_UpdateSlotStatuses);
@@ -153,7 +159,8 @@ void Coke_int_UpdateSlotStatuses(void)
        
        for( i = 0; i <= 6; i ++ )
        {
-               len = ReadLine(sizeof tmp, tmp);
+               // Read until non-blank line
+               while( (len = ReadLine(sizeof tmp, tmp)) == 0 ) ;
                if( len == -1 ) {
                        TRACE("Read failed on slot %i\n", i);
                        goto ret;       // I give up :(
@@ -181,7 +188,11 @@ int Coke_CanDispense(int UNUSED(User), int Item)
        // Can't dispense if the machine is not connected
        if( giCoke_SerialFD == -1 )
                return -2;
-       
+
+       // HACK!
+       // 2011-10-21: The sensors in slot 1 and 3 a bad, just ignore the sensor result
+       if( Item == 1 || Item == 3 )    return 0;
+
        return gaCoke_CachedStatus[Item];
 }
 
@@ -199,6 +210,14 @@ int Coke_DoDispense(int UNUSED(User), int Item)
        // Can't dispense if the machine is not connected
        if( giCoke_SerialFD == -1 )
                return -2;
+
+       // Make sure there are not two dispenses within n seconds
+       if( time(NULL) - gtCoke_LastDispenseTime < 10 )
+       {
+               printf("Wait %li seconds?\n", 10 - (time(NULL) - gtCoke_LastDispenseTime));
+               sleep( 10 - (time(NULL) - gtCoke_LastDispenseTime) );
+               printf("wait done\n");
+       }
        
        // LOCK
        pthread_mutex_lock(&gCoke_Mutex);
@@ -266,6 +285,8 @@ int Coke_DoDispense(int UNUSED(User), int Item)
                char buf[512];
                read(giCoke_SerialFD, buf, 512);        // Flush
        }
+
+       gtCoke_LastDispenseTime = time(NULL);
        
        // Release and return
        pthread_mutex_unlock(&gCoke_Mutex);
@@ -289,7 +310,10 @@ char ReadChar()
        FD_SET(giCoke_SerialFD, &readfs);
        
        ret = select(giCoke_SerialFD+1, &readfs, NULL, NULL, &timeout);
-       if( ret == 0 )  return 0;       // Timeout
+       if( ret == 0 ) {
+               fprintf(stderr, "ReadChar: Timeout of %is expired\n", READ_TIMEOUT);
+               return 0;       // Timeout
+       }
        if( ret != 1 ) {
                printf("ReadChar: select return %i\n", ret);
                return 0;

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