#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)
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 ) {
// Reset the slot names.
// - Dunno why this is needed, but the machine plays silly
// sometimes.
- Writef("n0 Slot0\n");
+ 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);
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 :(
// 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);
char buf[512];
read(giCoke_SerialFD, buf, 512); // Flush
}
+
+ gtCoke_LastDispenseTime = time(NULL);
// Release and return
pthread_mutex_unlock(&gCoke_Mutex);