Generic driver for the RWD RFID Modules from IB Technology.

Dependents:   RSEDP_DPDemo

Committer:
donatien
Date:
Tue Jul 13 16:11:29 2010 +0000
Revision:
2:37fafd1e1a20
Parent:
1:e96aaf4d5c55
Child:
3:60db4ab4dafe

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
donatien 2:37fafd1e1a20 1
donatien 2:37fafd1e1a20 2 /*
donatien 2:37fafd1e1a20 3 Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com)
donatien 2:37fafd1e1a20 4
donatien 2:37fafd1e1a20 5 Permission is hereby granted, free of charge, to any person obtaining a copy
donatien 2:37fafd1e1a20 6 of this software and associated documentation files (the "Software"), to deal
donatien 2:37fafd1e1a20 7 in the Software without restriction, including without limitation the rights
donatien 2:37fafd1e1a20 8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
donatien 2:37fafd1e1a20 9 copies of the Software, and to permit persons to whom the Software is
donatien 2:37fafd1e1a20 10 furnished to do so, subject to the following conditions:
donatien 2:37fafd1e1a20 11
donatien 2:37fafd1e1a20 12 The above copyright notice and this permission notice shall be included in
donatien 2:37fafd1e1a20 13 all copies or substantial portions of the Software.
donatien 2:37fafd1e1a20 14
donatien 2:37fafd1e1a20 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
donatien 2:37fafd1e1a20 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
donatien 2:37fafd1e1a20 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
donatien 2:37fafd1e1a20 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
donatien 2:37fafd1e1a20 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
donatien 2:37fafd1e1a20 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
donatien 2:37fafd1e1a20 21 THE SOFTWARE.
donatien 2:37fafd1e1a20 22 */
donatien 2:37fafd1e1a20 23
donatien 0:a893227b988a 24 #include "RWDModule.h"
donatien 0:a893227b988a 25
donatien 0:a893227b988a 26 RWDModule::RWDModule(PinName tx, PinName rx, PinName cts) : m_serial(tx, rx), m_cts(cts),
donatien 0:a893227b988a 27 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 28 {
donatien 2:37fafd1e1a20 29 //Setup interrupts
donatien 2:37fafd1e1a20 30 m_serial.attach(this, &RWDModule::intTx, Serial::TxIrq); //Serial port writeable
donatien 2:37fafd1e1a20 31 m_serial.attach(this, &RWDModule::intRx, Serial::RxIrq); //Serial port readable
donatien 2:37fafd1e1a20 32 m_cts.fall(this, &RWDModule::intClearToSend); //Clear To Send: can send a command
donatien 0:a893227b988a 33 }
donatien 0:a893227b988a 34
donatien 0:a893227b988a 35 RWDModule::~RWDModule()
donatien 0:a893227b988a 36 {
donatien 0:a893227b988a 37
donatien 0:a893227b988a 38 }
donatien 0:a893227b988a 39
donatien 2:37fafd1e1a20 40 void RWDModule::command(uint8_t cmd, const uint8_t* params, int paramsLen, uint8_t* resp, size_t respLen, uint8_t ackOk, size_t ackOkMask) //Ack Byte is not included in the resp buf
donatien 0:a893227b988a 41 {
donatien 2:37fafd1e1a20 42 if(!ready()) //If reader is not ready, does not submit another command yet
donatien 0:a893227b988a 43 return;
donatien 2:37fafd1e1a20 44
donatien 2:37fafd1e1a20 45 //Setup command
donatien 0:a893227b988a 46 m_cmd = cmd;
donatien 2:37fafd1e1a20 47
donatien 2:37fafd1e1a20 48 //Setup parameters
donatien 2:37fafd1e1a20 49 m_paramsBuf = (uint8_t*) params;
donatien 0:a893227b988a 50 m_paramsLen = paramsLen;
donatien 2:37fafd1e1a20 51
donatien 2:37fafd1e1a20 52 //Setup response
donatien 0:a893227b988a 53 m_respBuf = resp;
donatien 0:a893227b988a 54 m_respLen = respLen;
donatien 2:37fafd1e1a20 55
donatien 2:37fafd1e1a20 56 //Pos in buf is 0
donatien 0:a893227b988a 57 m_pos = 0;
donatien 2:37fafd1e1a20 58
donatien 2:37fafd1e1a20 59 //Setup ack requirements
donatien 0:a893227b988a 60 m_ackOk = ackOk;
donatien 0:a893227b988a 61 m_ackOkMask = ackOkMask;
donatien 2:37fafd1e1a20 62
donatien 0:a893227b988a 63 m_state = CMD_QUEUED;
donatien 0:a893227b988a 64 }
donatien 0:a893227b988a 65
donatien 0:a893227b988a 66 bool RWDModule::ready()
donatien 0:a893227b988a 67 {
donatien 0:a893227b988a 68 return (m_state==READY);
donatien 0:a893227b988a 69 }
donatien 0:a893227b988a 70
donatien 2:37fafd1e1a20 71 bool RWDModule::result(uint8_t* pAck /*= NULL*/)
donatien 0:a893227b988a 72 {
donatien 2:37fafd1e1a20 73 if(!ready()) //Has command returned yet?
donatien 0:a893227b988a 74 return false;
donatien 2:37fafd1e1a20 75 if(pAck) //If pointer is passed, return reader's ack
donatien 0:a893227b988a 76 *pAck = m_ack;
donatien 2:37fafd1e1a20 77 return ((m_ack & m_ackOkMask) == m_ackOk); //Return whether the reader returned an error or OK ack
donatien 0:a893227b988a 78 }
donatien 0:a893227b988a 79
donatien 0:a893227b988a 80 void RWDModule::intClearToSend()
donatien 0:a893227b988a 81 {
donatien 1:e96aaf4d5c55 82 //Start sending command when Clear To Send falls
donatien 2:37fafd1e1a20 83 if(m_state == CMD_QUEUED) //Is there a command to be sent?
donatien 0:a893227b988a 84 {
donatien 0:a893227b988a 85 m_state = SENDING_CMD;
donatien 0:a893227b988a 86 intTx(); //Start sending command
donatien 0:a893227b988a 87 }
donatien 0:a893227b988a 88 }
donatien 0:a893227b988a 89
donatien 0:a893227b988a 90
donatien 0:a893227b988a 91 void RWDModule::intTx()
donatien 0:a893227b988a 92 {
donatien 0:a893227b988a 93 if(m_state != SENDING_CMD)
donatien 0:a893227b988a 94 return;
donatien 1:e96aaf4d5c55 95 if(m_pos==0) //Must send command-byte first
donatien 1:e96aaf4d5c55 96 m_serial.putc((char)m_cmd);
donatien 2:37fafd1e1a20 97 while(true) //Send payload
donatien 0:a893227b988a 98 {
donatien 2:37fafd1e1a20 99 if(m_pos >= m_paramsLen) //Payload sent completely?
donatien 0:a893227b988a 100 {
donatien 0:a893227b988a 101 m_pos = 0;
donatien 2:37fafd1e1a20 102 m_state = WAITING_FOR_ACK; //Next step
donatien 0:a893227b988a 103 return;
donatien 0:a893227b988a 104 }
donatien 2:37fafd1e1a20 105 m_serial.putc((char)m_paramsBuf[m_pos]); //Send payload byte
donatien 0:a893227b988a 106 m_pos++;
donatien 0:a893227b988a 107 }
donatien 0:a893227b988a 108 }
donatien 0:a893227b988a 109
donatien 0:a893227b988a 110 void RWDModule::intRx()
donatien 0:a893227b988a 111 {
donatien 1:e96aaf4d5c55 112 if(m_state == WAITING_FOR_ACK) //Get answer
donatien 0:a893227b988a 113 {
donatien 2:37fafd1e1a20 114 m_ack = m_serial.getc(); //Get Ack
donatien 2:37fafd1e1a20 115 if( (m_ack & m_ackOkMask) != m_ackOk ) //Check if an error is returned
donatien 0:a893227b988a 116 {
donatien 2:37fafd1e1a20 117 m_state = READY; //If yes, transfer is completed and result() will return false
donatien 0:a893227b988a 118 return;
donatien 0:a893227b988a 119 }
donatien 0:a893227b988a 120 if(m_respLen)
donatien 0:a893227b988a 121 {
donatien 2:37fafd1e1a20 122 m_state = RECEIVING_ACK; //Ack OK, now need to get response
donatien 0:a893227b988a 123 }
donatien 0:a893227b988a 124 else
donatien 0:a893227b988a 125 {
donatien 2:37fafd1e1a20 126 m_state = READY; //Ack OK, end of transfer
donatien 0:a893227b988a 127 return;
donatien 0:a893227b988a 128 }
donatien 0:a893227b988a 129 }
donatien 2:37fafd1e1a20 130 if(m_state != RECEIVING_ACK) //Error, should not happen
donatien 0:a893227b988a 131 {
donatien 0:a893227b988a 132 while(m_serial.readable())
donatien 0:a893227b988a 133 m_serial.getc(); //Dump these bytes
donatien 0:a893227b988a 134 return;
donatien 0:a893227b988a 135 }
donatien 1:e96aaf4d5c55 136 while(m_serial.readable()) //Read payload
donatien 0:a893227b988a 137 {
donatien 2:37fafd1e1a20 138 m_respBuf[m_pos] = (uint8_t) m_serial.getc(); //Read byte and put it in resp buf
donatien 0:a893227b988a 139 m_pos++;
donatien 0:a893227b988a 140 if(m_pos >= m_respLen)
donatien 0:a893227b988a 141 {
donatien 0:a893227b988a 142 m_pos = 0;
donatien 2:37fafd1e1a20 143 m_state = READY; //End of transfer, response retrieved with success
donatien 0:a893227b988a 144 }
donatien 0:a893227b988a 145 }
donatien 0:a893227b988a 146 }