Generic driver for the RWD RFID Modules from IB Technology.
Diff: RWDModule.cpp
- Revision:
- 0:a893227b988a
- Child:
- 1:e96aaf4d5c55
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/RWDModule.cpp Mon Jul 12 09:31:45 2010 +0000 @@ -0,0 +1,121 @@ +#include "RWDModule.h" + +RWDModule::RWDModule(PinName tx, PinName rx, PinName cts) : m_serial(tx, rx), m_cts(cts), +m_cmd(0), m_paramsBuf(NULL), m_respBuf(NULL), m_pos(0), m_paramsLen(0), m_respLen(0), m_ackOk(0), m_ackOkMask(0), m_ack(0), m_state(READY) +{ + m_serial.attach(this, &RWDModule::intTx, Serial::TxIrq); + m_serial.attach(this, &RWDModule::intRx, Serial::RxIrq); + m_cts.fall(this, &RWDModule::intClearToSend); +} + +RWDModule::~RWDModule() +{ + +} + +void RWDModule::command(byte cmd, const byte* params, int paramsLen, byte* resp, int respLen, byte ackOk, byte ackOkMask) //Ack Byte is not included in the resp buf +{ + if(!ready()) + return; + m_cmd = cmd; + m_paramsBuf = (byte*) params; + m_paramsLen = paramsLen; + m_respBuf = resp; + m_respLen = respLen; + m_pos = 0; + m_ackOk = ackOk; + m_ackOkMask = ackOkMask; + m_state = CMD_QUEUED; +} + +bool RWDModule::ready() +{ +#if 0 + static int lastState; + if(m_state != lastState) + { + printf("State %d\n", m_state); + lastState = m_state; + if(m_state==RECEIVING_ACK) + printf("Ack %02x\n", m_ack); + } +#endif + return (m_state==READY); +} + +bool RWDModule::result(byte* pAck /*= NULL*/) +{ + if(!ready()) + return false; + if(pAck) + *pAck = m_ack; + return ((m_ack & m_ackOkMask) == m_ackOk); +} + +void RWDModule::intClearToSend() +{ + if(m_state == CMD_QUEUED) + { + m_state = SENDING_CMD; + intTx(); //Start sending command + } +} + + +void RWDModule::intTx() +{ + if(m_state != SENDING_CMD) + return; + m_serial.putc((char)m_cmd); +// printf("%02x ",(char)m_cmd); + while(true) + { + if(m_pos >= m_paramsLen) + { + m_pos = 0; + m_state = WAITING_FOR_ACK; + return; + } + m_serial.putc((char)m_paramsBuf[m_pos]); +// printf("%02x ",(char)m_paramsBuf[m_pos]); + m_pos++; + } +} + +void RWDModule::intRx() +{ + if(m_state == WAITING_FOR_ACK) + { + m_ack = m_serial.getc(); + if( (m_ack & m_ackOkMask) != m_ackOk ) + { + m_state = READY; + return; + } + if(m_respLen) + { + m_state = RECEIVING_ACK; + } + else + { + m_state = READY; + return; + } + } + if(m_state != RECEIVING_ACK) + { + while(m_serial.readable()) + m_serial.getc(); //Dump these bytes + return; + } + while(m_serial.readable()) + { + m_respBuf[m_pos] = (byte) m_serial.getc(); + m_pos++; + if(m_pos >= m_respLen) + { + m_pos = 0; + m_state = READY; + } + } +}