No longer uses dynamic memory allocation

No longer uses dynamic memory allocation (bugged on arduino)
Added support for jubeat wavepass reader
fixed bug with jubeat ledboard
main
Nadeflore 2013-09-26 19:15:22 +02:00
parent f37c3b8576
commit 082eabb63f
10 changed files with 134 additions and 115 deletions

View File

@ -19,6 +19,8 @@ iidx 19-20 (2 new wavepass readers)
jubeat 1 - knit (one old slotted reader (no keypad) + one led board (game won't boot if the led board is not present)
jubeat copious - saucer (one new reader (no keypad) + one led board (game won't boot if the led board is not present)
DDR (2 old readers in sd, 2 new readers in HD)
drum mania (1 old reader)

View File

@ -24,7 +24,6 @@ void LedBoard::init()
void LedBoard::update()
{
}

View File

@ -12,6 +12,6 @@ public:
public:
private:
byte ledStatus[];
byte ledStatus[18];
};

View File

@ -10,7 +10,7 @@ RR10::RR10()
pinset = false;
}
void RR10::setPins(HardwareSerial* serialid)
void RR10::setPins(int sensor, HardwareSerial* serialid)
{
rfSerial = serialid;
rfSerial->begin(115200); //the only possible baud rate for this module

View File

@ -8,7 +8,7 @@ class RR10 : public RfidModule
{
public:
RR10();
void setPins(HardwareSerial* serialid);
void setPins(int sensor, HardwareSerial* serialid);
void read();
void update();
boolean isCardPresent();

View File

@ -11,7 +11,7 @@ Reader::Reader()
}
//cmd61 is used to specify behaviour on command 0x61
void Reader::setrCode(char* rCode, boolean cmd61_s)
void Reader::setrCode(char* rCode, byte cmd61_s)
{
setVersion((byte[]) {0x03, 0x00, 0x00, 0x00}, 0x00, (byte[]) {0x01, 0x06, 0x00}, rCode);
cmd61 = cmd61_s;
@ -191,7 +191,7 @@ void Reader::getStatus(byte* buf)
buf[1] = 0x10;
}
else{
buf[0] = 0x04;
buf[0] = 0x01;
}
}
@ -253,7 +253,7 @@ short Reader::processRequest(byte* request, byte* answer)
if(rfmodule->isCardPresent())
{
answer[6] = 0x10; // light up front sensor (just in case)
answer[5] = 0x01; // if 2 -> action loop on 31 (if 0 too btw)
answer[5] = 0x01; // if 2 -> action loop on 31
}
break;
@ -317,10 +317,20 @@ short Reader::processRequest(byte* request, byte* answer)
rfmodule->read();
if(cmd61)// for pop'n music and jubeat, should not return any data, for iidx and sdvx, should return one byte of data with value 0x01
// for pop'n music, should not return any data, for iidx and sdvx, should return one byte of data with value 0x01 for jubeat, should return at least 2 data (something seems wrong here)
switch(cmd61)
{
case 1:
answer[4] = 1;
answer[5] = 0x01;
break;
case 2:
answer[4] = 2;
answer[5] = 0x00;
answer[6] = 0x00;
break;
default:
answer[4] = 0;
}

View File

@ -10,7 +10,7 @@ class Reader : public Node
{
public:
Reader(); //contructor
void setrCode(char* rCode, boolean cmd61 = false);
void setrCode(char* rCode, byte cmd61 = 0);
void init();
void update(); //update things like keypadstate and rfid
@ -39,7 +39,7 @@ private:
short colPins[3]; // matrix has 3 cols...
short rowPins[4]; // ...and 4 rows
boolean cmd61; //used to specify behaviour on command 0x61
byte cmd61; //used to specify behaviour on command 0x61
boolean new_reader; //set to true in case new wave pass card reader behaviour is requested from game
Cipher crypt;

View File

@ -7,6 +7,7 @@
class RfidModule
{
public:
virtual void setPins(int sensor, HardwareSerial* serialid);
virtual void read();
virtual void update();
virtual boolean isCardPresent();

View File

@ -31,7 +31,56 @@ unsigned long lastRecv;
byte nbnodes; // nodes count (currently supports 1 or 2)
byte node_id; //id of first node (may be != 1 when used with other physical nodes)
Node *nodes[MAX_NODES];
Node *nodes[MAX_NODES];//nodes array
//nodes delaraction (static allocation)
#if GAMETYPE == 0 //pop'n music with card dispenser
Reader nod1;//first reader
CardDispenser nod2("PCDA"); //card dispenser
#elif GAMETYPE == 1 //1 reader
Reader nod1;//first reader
#elif GAMETYPE == 2 //2 readers
Reader nod1;//first reader
Reader nod2;//second reader
#elif GAMETYPE == 3 // reader + leboard
Reader nod1;//first reader
LedBoard nod2("LEDB");//led board
#else // reader + ioboard
Reader nod1;//first reader
IoBoard nod2("KFCA");//io board
#endif
//1P rfid module allocation
#if RFID_MODULE1 == 1
SL015M mod1;
#else
RR10 mod1;
#endif
//2P rfid module allocation
#if GAMETYPE == 2
#if RFID_MODULE2 == 1
SL015M mod2;
#else
RR10 mod2;
#endif
#endif
//
@ -41,110 +90,68 @@ Node *nodes[MAX_NODES];
//
void setup()
{
// init nodes depending on game type
// set nodes configuration
// init first reader used in all games types
Reader* read1 = new Reader();
//set first rfid module
mod1.setPins(R1_DET,&R1_SER);
nod1.setRfidModule(&mod1);
//rfid module, 2 modules model are supported, configure the module to use
switch(RFID_MODULE1)
{
case 1:
{
SL015M* mod1 = new SL015M();
mod1->setPins(R1_DET,&R1_SER);
read1->setRfidModule(mod1);
break;
}
case 2:
{
RR10* mod1 = new RR10();
mod1->setPins(&R1_SER);
read1->setRfidModule(mod1);
break;
}
}
#if GAMETYPE == 0 //pop'n music with card dispenser
nod1.setrCode("ICCA",0);
nod1.setkeypadpins(K1_A,K1_B,K1_C,K1_1,K1_2,K1_3,K1_4);//3cols,4rows
nodes[0] = &nod1;
nodes[1] = &nod2;
nbnodes = 2;
#elif GAMETYPE == 1 //1 reader
nod1.setrCode("ICCA",0);
nod1.setkeypadpins(K1_A,K1_B,K1_C,K1_1,K1_2,K1_3,K1_4);//3cols,4rows
nodes[0] = &nod1;
nbnodes = 1;
#elif GAMETYPE == 2 //2 readers
//1p reader
nod1.setrCode("ICCA",1);
nod1.setkeypadpins(K1_A,K1_B,K1_C,K1_1,K1_2,K1_3,K1_4);//3cols,4rows
nodes[0] = &nod1;
//set rfid module 2
mod2.setPins(R2_DET,&R2_SER);
nod2.setRfidModule(&mod2);
//2p reader
nod2.setrCode("ICCA",1);
nod2.setkeypadpins(K2_A,K2_B,K2_C,K2_1,K2_2,K2_3,K2_4);//3cols,4rows
nodes[1] = &nod2;
nbnodes = 2;
#elif GAMETYPE == 3 // reader + leboard
nod1.setrCode("ICCB",2);
nodes[0] = &nod1;
nodes[1] = &nod2;
nbnodes = 2;
switch(gametype)
{
case 4: //Sound voltex, set an IoBoard + a Reader
{
//1st node IOBOARD
IoBoard* iob = new IoBoard("KFCA");
nodes[1] = iob;
#else // reader + ioboard
//2nd node reader
read1->setrCode("ICCA",true);
//keypad
read1->setkeypadpins(K1_A,K1_B,K1_C,K1_1,K1_2,K1_3,K1_4);//3cols,4rows
//1p reader
nod1.setrCode("ICCA",1);
nod1.setkeypadpins(K1_A,K1_B,K1_C,K1_1,K1_2,K1_3,K1_4);//3cols,4rows
nodes[0] = &nod1;
nodes[1] = &nod2;
nodes[0] = read1;
break;
}
nbnodes = 2;
#endif
case 3://jubeat, set a reader (without keypad) + a LedBoard
{
read1->setrCode("ICCB");
nodes[0] = read1;
nodes[1] = new LedBoard("LED"); // jubeat ledboard node
break;
}
case 2://2readers game, Set reader 2 as node 2
{
Reader* read2 = new Reader();
read2->setrCode("ICCA",true);
read2->setkeypadpins(K2_A,K2_B,K2_C,K2_1,K2_2,K2_3,K2_4);//3cols,4rows
//rfid module
switch(RFID_MODULE2)
{
case 1:
{
SL015M* mod2 = new SL015M();
mod2->setPins(R2_DET,&R2_SER);
read2->setRfidModule(mod2);
break;
}
case 2:
{
RR10* mod2 = new RR10();
mod2->setPins(&R2_SER);
read2->setRfidModule(mod2);
break;
}
}
}
case 1: //1 Reader game, set reader 1 as node 1
{
read1->setrCode("ICCA",gametype == 2);
//keypad
read1->setkeypadpins(K1_A,K1_B,K1_C,K1_1,K1_2,K1_3,K1_4);//3cols,4rows
nodes[0] = read1;
break;
}
case 0: // pop'n music with card dispenser, 1 reader + 1 card dispenser
{
read1->setrCode("ICCA");
//keypad
read1->setkeypadpins(K1_A,K1_B,K1_C,K1_1,K1_2,K1_3,K1_4);//3cols,4rows
nodes[0] = read1;
nodes[1] = new CardDispenser("PCDA");
break;
}
}
//set how many nodes are emulated by this board
if(gametype == 1)
nbnodes = 1;
else
nbnodes = 2;
}
@ -348,7 +355,7 @@ void sendAnswer(byte* answer)
//checksum calc done, let's send it
//delay if needed
if(gametype !=4) //delay only if game is not sound voltex
if(GAMETYPE !=4) //delay only if game is not sound voltex
{
unsigned long now = millis();
if((now - lastSent) < MINTIME && (now - lastSent) > 0) // Check If last packet was too early

View File

@ -1,7 +1,7 @@
#ifndef CONFIG_H
#define CONFIG_H
#define gametype 1 //0:pop'n with card dispenser 1: pop'n, drummania(1 reader) 2:iidx/ddr/gf(2readers) 3:jubeat (1reader+Ledboard) 4: sdvx (1reader+ioboard)
#define GAMETYPE 1 //0:pop'n with card dispenser 1: pop'n, drummania(1 reader) 2:iidx/ddr/gf(2readers) 3:jubeat (1reader+Ledboard) 4: sdvx (1reader+ioboard)
#define RFID_BAUD 115200 //Baud rate for RFID Module