Generic driver for the RWD RFID Modules from IB Technology.

Dependents:   RSEDP_DPDemo

Committer:
donatien
Date:
Mon Jul 12 09:31:45 2010 +0000
Revision:
0:a893227b988a
Child:
1:e96aaf4d5c55

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
donatien 0:a893227b988a 1 #include "RWDModule.h"
donatien 0:a893227b988a 2
donatien 0:a893227b988a 3 RWDModule::RWDModule(PinName tx, PinName rx, PinName cts) : m_serial(tx, rx), m_cts(cts),
donatien 0:a893227b988a 4 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)
donatien 0:a893227b988a 5 {
donatien 0:a893227b988a 6 m_serial.attach(this, &RWDModule::intTx, Serial::TxIrq);
donatien 0:a893227b988a 7 m_serial.attach(this, &RWDModule::intRx, Serial::RxIrq);
donatien 0:a893227b988a 8 m_cts.fall(this, &RWDModule::intClearToSend);
donatien 0:a893227b988a 9 }
donatien 0:a893227b988a 10
donatien 0:a893227b988a 11 RWDModule::~RWDModule()
donatien 0:a893227b988a 12 {
donatien 0:a893227b988a 13
donatien 0:a893227b988a 14 }
donatien 0:a893227b988a 15
donatien 0:a893227b988a 16 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
donatien 0:a893227b988a 17 {
donatien 0:a893227b988a 18 if(!ready())
donatien 0:a893227b988a 19 return;
donatien 0:a893227b988a 20 m_cmd = cmd;
donatien 0:a893227b988a 21 m_paramsBuf = (byte*) params;
donatien 0:a893227b988a 22 m_paramsLen = paramsLen;
donatien 0:a893227b988a 23 m_respBuf = resp;
donatien 0:a893227b988a 24 m_respLen = respLen;
donatien 0:a893227b988a 25 m_pos = 0;
donatien 0:a893227b988a 26 m_ackOk = ackOk;
donatien 0:a893227b988a 27 m_ackOkMask = ackOkMask;
donatien 0:a893227b988a 28 m_state = CMD_QUEUED;
donatien 0:a893227b988a 29 }
donatien 0:a893227b988a 30
donatien 0:a893227b988a 31 bool RWDModule::ready()
donatien 0:a893227b988a 32 {
donatien 0:a893227b988a 33 #if 0
donatien 0:a893227b988a 34 static int lastState;
donatien 0:a893227b988a 35 if(m_state != lastState)
donatien 0:a893227b988a 36 {
donatien 0:a893227b988a 37 printf("State %d\n", m_state);
donatien 0:a893227b988a 38 lastState = m_state;
donatien 0:a893227b988a 39 if(m_state==RECEIVING_ACK)
donatien 0:a893227b988a 40 printf("Ack %02x\n", m_ack);
donatien 0:a893227b988a 41 }
donatien 0:a893227b988a 42 #endif
donatien 0:a893227b988a 43 return (m_state==READY);
donatien 0:a893227b988a 44 }
donatien 0:a893227b988a 45
donatien 0:a893227b988a 46 bool RWDModule::result(byte* pAck /*= NULL*/)
donatien 0:a893227b988a 47 {
donatien 0:a893227b988a 48 if(!ready())
donatien 0:a893227b988a 49 return false;
donatien 0:a893227b988a 50 if(pAck)
donatien 0:a893227b988a 51 *pAck = m_ack;
donatien 0:a893227b988a 52 return ((m_ack & m_ackOkMask) == m_ackOk);
donatien 0:a893227b988a 53 }
donatien 0:a893227b988a 54
donatien 0:a893227b988a 55 void RWDModule::intClearToSend()
donatien 0:a893227b988a 56 {
donatien 0:a893227b988a 57 if(m_state == CMD_QUEUED)
donatien 0:a893227b988a 58 {
donatien 0:a893227b988a 59 m_state = SENDING_CMD;
donatien 0:a893227b988a 60 intTx(); //Start sending command
donatien 0:a893227b988a 61 }
donatien 0:a893227b988a 62 }
donatien 0:a893227b988a 63
donatien 0:a893227b988a 64
donatien 0:a893227b988a 65 void RWDModule::intTx()
donatien 0:a893227b988a 66 {
donatien 0:a893227b988a 67 if(m_state != SENDING_CMD)
donatien 0:a893227b988a 68 return;
donatien 0:a893227b988a 69 m_serial.putc((char)m_cmd);
donatien 0:a893227b988a 70 // printf("%02x ",(char)m_cmd);
donatien 0:a893227b988a 71 while(true)
donatien 0:a893227b988a 72 {
donatien 0:a893227b988a 73 if(m_pos >= m_paramsLen)
donatien 0:a893227b988a 74 {
donatien 0:a893227b988a 75 m_pos = 0;
donatien 0:a893227b988a 76 m_state = WAITING_FOR_ACK;
donatien 0:a893227b988a 77 return;
donatien 0:a893227b988a 78 }
donatien 0:a893227b988a 79 m_serial.putc((char)m_paramsBuf[m_pos]);
donatien 0:a893227b988a 80 // printf("%02x ",(char)m_paramsBuf[m_pos]);
donatien 0:a893227b988a 81 m_pos++;
donatien 0:a893227b988a 82 }
donatien 0:a893227b988a 83 }
donatien 0:a893227b988a 84
donatien 0:a893227b988a 85 void RWDModule::intRx()
donatien 0:a893227b988a 86 {
donatien 0:a893227b988a 87 if(m_state == WAITING_FOR_ACK)
donatien 0:a893227b988a 88 {
donatien 0:a893227b988a 89 m_ack = m_serial.getc();
donatien 0:a893227b988a 90 if( (m_ack & m_ackOkMask) != m_ackOk )
donatien 0:a893227b988a 91 {
donatien 0:a893227b988a 92 m_state = READY;
donatien 0:a893227b988a 93 return;
donatien 0:a893227b988a 94 }
donatien 0:a893227b988a 95 if(m_respLen)
donatien 0:a893227b988a 96 {
donatien 0:a893227b988a 97 m_state = RECEIVING_ACK;
donatien 0:a893227b988a 98 }
donatien 0:a893227b988a 99 else
donatien 0:a893227b988a 100 {
donatien 0:a893227b988a 101 m_state = READY;
donatien 0:a893227b988a 102 return;
donatien 0:a893227b988a 103 }
donatien 0:a893227b988a 104 }
donatien 0:a893227b988a 105 if(m_state != RECEIVING_ACK)
donatien 0:a893227b988a 106 {
donatien 0:a893227b988a 107 while(m_serial.readable())
donatien 0:a893227b988a 108 m_serial.getc(); //Dump these bytes
donatien 0:a893227b988a 109 return;
donatien 0:a893227b988a 110 }
donatien 0:a893227b988a 111 while(m_serial.readable())
donatien 0:a893227b988a 112 {
donatien 0:a893227b988a 113 m_respBuf[m_pos] = (byte) m_serial.getc();
donatien 0:a893227b988a 114 m_pos++;
donatien 0:a893227b988a 115 if(m_pos >= m_respLen)
donatien 0:a893227b988a 116 {
donatien 0:a893227b988a 117 m_pos = 0;
donatien 0:a893227b988a 118 m_state = READY;
donatien 0:a893227b988a 119 }
donatien 0:a893227b988a 120 }
donatien 0:a893227b988a 121 }