Generic driver for the RWD RFID Modules from IB Technology.
RWDModule.cpp@0:a893227b988a, 2010-07-12 (annotated)
- Committer:
- donatien
- Date:
- Mon Jul 12 09:31:45 2010 +0000
- Revision:
- 0:a893227b988a
- Child:
- 1:e96aaf4d5c55
Who changed what in which revision?
User | Revision | Line number | New 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 | } |