Generic driver for the RWD RFID Modules from IB Technology.

Dependents:   RSEDP_DPDemo

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;
+    }
+  }
+}