Second sketch -- PC logging version
I had to trim my case statements to fit here.
Both work as long the Leonardo USB to Serial Adapter is connected to a PC.
PC logging version
int led = 13;
byte globalCRC[2];
void setup()
{
Serial.begin(19200);
Serial1.begin(19200);
pinMode(led, OUTPUT);
}
void loop()
{
int i;
int len;
boolean mainDoorStatus;
boolean cashDoor;
boolean cashBox;
boolean standDoor;
boolean changeLight;
byte curCredits[2] = {0x01, 0x1A};
byte serByte;
byte PC;
byte lastPoll;
byte bonus[9]={
0x01, 0x8A, 0x00, 0x05, 0x00, 0x00, 0x00, 0x2E, 0xDD };
byte gDisable[4]={
0x01, 0x01, 0x51, 0x08 };
byte gEnable[4]={
0x01, 0x02, 0xCA, 0x3A };
if (Serial.available()>0)
{
PC=Serial.read();
switch(PC)
{
case 0x44:
Serial.print("Disable machine requested by tech\n\r");
sendCommand(gDisable,4);
break;
case 0x45:
Serial.print("Enable machine requested by tech\n\r");
sendCommand(gEnable,4);
break;
default:
break;
}
}
UCSR1C = 0b00000110;
UCSR1B = 0b10011101; // turn 9th bit on
Serial1.write(0x80);
//delay(1);
//UCSR1B = 0b10011101;
Serial1.write(0x81);
delay(1);
UCSR1B = 0b10011100; // turn 9th bit off
delay(10);
serByte=0;
if (Serial1.available()>0) serByte=Serial1.read();
if (serByte>0)
{
if (serByte != lastPoll)
{
lastPoll = serByte;
}
else serByte=0;
}
// debugging code
// if (serByte>0 && serByte!=0x1F)
// {
// Serial.print("RX: ");
// Serial.print(serByte,HEX);
// Serial.print("\n\r");
// }
switch (serByte)
{
case 0x00:
break;
case 0x01:
Serial.print ("0x01 Ack\n\r");
break;
case 0x11:
if (mainDoorStatus==false)
{
digitalWrite(led,HIGH);
Serial.print("0x11 Main door opened\n\r");
mainDoorStatus=true;
}
break;
case 0x12:
if (mainDoorStatus==true)
{
digitalWrite(led,LOW);
Serial.print("0x11 Main door closed\n\r");
mainDoorStatus==false;
}
break;
case 0x13:
if (standDoor==false)
{
digitalWrite(led,HIGH);
Serial.print("0x13 Stand door opened\n\r");
standDoor=true;
}
break;
case 0x14:
if (standDoor==true)
{
digitalWrite(led,LOW);
Serial.print("0x14 Stand door closed\n\r");
standDoor=false;
}
break;
case 0x19:
if (cashDoor==false)
{
digitalWrite(led,HIGH);
Serial.print("0x19 Cashbox door opened\n\r");
cashDoor=true;
}
break;
case 0x1A:
if (cashDoor==true)
{
digitalWrite(led,LOW);
Serial.print("0x1A Cashbox door closed\n\r");
cashDoor=false;
}
break;
case 0x1B:
if (cashBox==false)
{
digitalWrite(led,HIGH);
Serial.print("0x1B Cashbox was removed\n\r");
cashBox=true;
}
break;
case 0x1C:
if (cashBox==true)
{
digitalWrite(led,LOW);
Serial.print("0x1C Cashbox was installed\n\r");
cashBox=false;
}
break;
case 0x1F:
break;
case 0x20:
Serial.print("0x20 General tilt\r\n");
break;
case 0x26:
Serial.print("0x26 Player initiated cash out\r\n");
case 0x3D:
Serial.print("0x3D A cash out ticket has been printed\r\n");
getTicketInfo(0);
break;
case 0x3F:
Serial.print("0x3F Validation ID not configured.\r\n");
break;
case 0x51:
handPay(0);
break;
case 0x57:
Serial.print("0x57 System Validation requested\n\r");
printTicket(0);
break;
case 0x66:
Serial.print("0x66 Cash out button pressed\n\r");
case 0x67:
Serial.print("0x67 Ticket Inserted.\n\r");
redeemTicket(0);
break;
case 0x68:
Serial.print ("0x68 Ticket transfer complete\n\r");
transferComplete(0);
break;
case 0x71:
if (changeLight==false)
{
Serial.print("0x71 Change light on.\n\r");
digitalWrite(led,HIGH);
changeLight=true;
}
break;
case 0x72:
if (changeLight==true)
{
Serial.print("0x72 Change light off.\n\r");
digitalWrite(led,LOW);
changeLight=false;
sendCommand(bonus,9);
delay(10);
sendCommand(curCredits,2);
for (int i=0; i<9; i++)
{
serByte=Serial1.read();
}
}
break;
case 0x7C:
Serial.print("0x7C Legacy bounus pay has occured\n\r");
break;
default:
break;
}
delay(30);
}
void handPay(int dummy)
{
int i;
byte temp[24];
temp[0]=0x01;
temp[1]=0x1B;
sendCommand(temp,2);
for (i=0; i<24; i++)
{
temp[i]=Serial1.read();
}
Serial.print("0x57 Handpay is pending\n\r");
}
void getTicketInfo(int dummy)
{
int i;
byte getVal[5]={
0x01, 0x4D, 0x00, 0xC2, 0xAC };
sendCommand(getVal,5);
delay(50);
for (i=0; i<Serial1.available(); i++)
{
getVal[0]=Serial1.read(); // read the data and discard it.
}
}
void printTicket(int dummy)
{
int i;
byte sysVal[13];
sysVal[0]=0x01;
sysVal[1]=0x57;
sendCommand(sysVal,2);
delay(50);
for (i=0; i<10;i++)
{
sysVal[i]=Serial1.read();
}
sysVal[1]=0x58;
sysVal[2]=0x01;
for (i=10; i>5; i--)
{
sysVal[i]=sysVal[i-3];
}
for (i=3;i<6;i++)
{
sysVal[i]=0x00;
}
computeCRC(sysVal,11);
sysVal[11]=globalCRC[0];
sysVal[12]=globalCRC[1];
Serial.print("Printed cashout ticket.\n\r");
sendCommand(sysVal,13);
delay(20);
for (i=0; i<5; i++)
{
sysVal[i]=Serial1.read();
}
}
void redeemTicket(int dummy)
{
int i;
byte ticket[21];
ticket[0]=0x01;
ticket[1]=0x70;
Serial.print("0x67 Ticket Inserted.\n\r");
Serial.print(" Ticket redeemed.\n\r");
sendCommand(ticket,2);
delay(50);
for (i=0;i<21; i++)
{
ticket[i]=Serial1.read();
}
Serial.print("\n\r");
ticket[1]=0x71;
for (i=4; i<9; i++)
{
ticket[i]=ticket[i+10];
}
computeCRC(ticket,19);
ticket[19]=globalCRC[0];
ticket[20]=globalCRC[1];
sendCommand(ticket,21);
delay(50);
for (i=0; i<21; i++)
{
ticket[i]=Serial1.read();
}
}
void transferComplete(int dummy)
{
byte transComplete[6]={
0x01, 0x71, 0x01, 0xFF, 0x1F, 0xD0 };
sendCommand(transComplete,6);
delay(20);
for (int i=0; i<21;i++)
{
transComplete[0]=Serial1.read();
}
}
void sendCommand(byte temp[], int len)
{
UCSR1B = 0b10011101;
Serial1.write(temp[0]);
delay(1);
UCSR1B = 0b10011100;
for (int i=1; i<len;i++)
{
Serial1.write(temp[i]);
delay(1);
}
}
void computeCRC(byte val[], int len)
{
globalCRC[0]=0;
globalCRC[1]=0;
long crc;
long q;
byte c;
crc = 0;
for (int i = 0; i < len; i++)
{
c = val[i];
q = (crc ^ c) & 0x0f;
crc = (crc >> 4) ^ (q * 0x1081);
q = (crc ^ (c >> 4)) & 0xf;
crc = (crc >> 4) ^ (q * 0x1081);
}
globalCRC[0]=crc & 0xff;
globalCRC[1]=crc >> 8;
} // End of ComputeCRC