RN41 Bluetooth Module Library
RN41 Bluetooth Module Library.
This library only contains the basic features, more will be implemented upon request
RN41.cpp@0:796e127c0dd1, 2015-10-28 (annotated)
- Committer:
- NoLiver92
- Date:
- Wed Oct 28 15:48:39 2015 +0000
- Revision:
- 0:796e127c0dd1
Initial Commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
NoLiver92 | 0:796e127c0dd1 | 1 | #include "RN41.h" |
NoLiver92 | 0:796e127c0dd1 | 2 | #include <string> |
NoLiver92 | 0:796e127c0dd1 | 3 | |
NoLiver92 | 0:796e127c0dd1 | 4 | RN41::RN41(PinName tx, PinName rx) : _RN41(tx, rx){ |
NoLiver92 | 0:796e127c0dd1 | 5 | _baud = 115200; |
NoLiver92 | 0:796e127c0dd1 | 6 | _RN41.baud(_baud); |
NoLiver92 | 0:796e127c0dd1 | 7 | _commandMode = false; |
NoLiver92 | 0:796e127c0dd1 | 8 | } |
NoLiver92 | 0:796e127c0dd1 | 9 | |
NoLiver92 | 0:796e127c0dd1 | 10 | //Resets The Device |
NoLiver92 | 0:796e127c0dd1 | 11 | //Also Exits Command Mode |
NoLiver92 | 0:796e127c0dd1 | 12 | //Device Must Be Reset After A Config Change To Take Effect |
NoLiver92 | 0:796e127c0dd1 | 13 | bool RN41::reset(){ |
NoLiver92 | 0:796e127c0dd1 | 14 | enterCommandMode(); |
NoLiver92 | 0:796e127c0dd1 | 15 | sendString("R,1\r\n"); |
NoLiver92 | 0:796e127c0dd1 | 16 | if(getString() == "Reboot!\r\n"){ |
NoLiver92 | 0:796e127c0dd1 | 17 | _commandMode = false; |
NoLiver92 | 0:796e127c0dd1 | 18 | return true; |
NoLiver92 | 0:796e127c0dd1 | 19 | }else{ |
NoLiver92 | 0:796e127c0dd1 | 20 | return false; |
NoLiver92 | 0:796e127c0dd1 | 21 | } |
NoLiver92 | 0:796e127c0dd1 | 22 | } |
NoLiver92 | 0:796e127c0dd1 | 23 | |
NoLiver92 | 0:796e127c0dd1 | 24 | //Sets Device Name |
NoLiver92 | 0:796e127c0dd1 | 25 | //Maximum 20 characters |
NoLiver92 | 0:796e127c0dd1 | 26 | bool RN41::setDeviceName(string name){ |
NoLiver92 | 0:796e127c0dd1 | 27 | enterCommandMode(); |
NoLiver92 | 0:796e127c0dd1 | 28 | sendString("SN," + name + "\r\n"); |
NoLiver92 | 0:796e127c0dd1 | 29 | if(getString() == "AOK\r\n"){ |
NoLiver92 | 0:796e127c0dd1 | 30 | reset(); |
NoLiver92 | 0:796e127c0dd1 | 31 | return true; |
NoLiver92 | 0:796e127c0dd1 | 32 | }else{ |
NoLiver92 | 0:796e127c0dd1 | 33 | return false; |
NoLiver92 | 0:796e127c0dd1 | 34 | } |
NoLiver92 | 0:796e127c0dd1 | 35 | } |
NoLiver92 | 0:796e127c0dd1 | 36 | |
NoLiver92 | 0:796e127c0dd1 | 37 | //Set Authentication Mode |
NoLiver92 | 0:796e127c0dd1 | 38 | //Available Modes: |
NoLiver92 | 0:796e127c0dd1 | 39 | //0 - Open Mode |
NoLiver92 | 0:796e127c0dd1 | 40 | //1 - SSP Keyboard I/O Mode |
NoLiver92 | 0:796e127c0dd1 | 41 | //2 - SSP "Just Works" Mode |
NoLiver92 | 0:796e127c0dd1 | 42 | //4 - Pin Code |
NoLiver92 | 0:796e127c0dd1 | 43 | //Default Mode: 1 |
NoLiver92 | 0:796e127c0dd1 | 44 | bool RN41::setAuthenticationMode(int authMode){ |
NoLiver92 | 0:796e127c0dd1 | 45 | enterCommandMode(); |
NoLiver92 | 0:796e127c0dd1 | 46 | if(authMode < 0 or authMode > 4 or authMode == 3){ |
NoLiver92 | 0:796e127c0dd1 | 47 | return false; |
NoLiver92 | 0:796e127c0dd1 | 48 | } |
NoLiver92 | 0:796e127c0dd1 | 49 | char buf[1]; |
NoLiver92 | 0:796e127c0dd1 | 50 | sprintf(buf,"SA,%d\r\n", authMode); |
NoLiver92 | 0:796e127c0dd1 | 51 | string msg = buf; |
NoLiver92 | 0:796e127c0dd1 | 52 | sendString(msg); |
NoLiver92 | 0:796e127c0dd1 | 53 | if(getString() == "AOK\r\n"){ |
NoLiver92 | 0:796e127c0dd1 | 54 | reset(); |
NoLiver92 | 0:796e127c0dd1 | 55 | return true; |
NoLiver92 | 0:796e127c0dd1 | 56 | }else{ |
NoLiver92 | 0:796e127c0dd1 | 57 | return false; |
NoLiver92 | 0:796e127c0dd1 | 58 | } |
NoLiver92 | 0:796e127c0dd1 | 59 | } |
NoLiver92 | 0:796e127c0dd1 | 60 | |
NoLiver92 | 0:796e127c0dd1 | 61 | //Sets Device Mode |
NoLiver92 | 0:796e127c0dd1 | 62 | //Available Modes: |
NoLiver92 | 0:796e127c0dd1 | 63 | //0 - Slave Mode |
NoLiver92 | 0:796e127c0dd1 | 64 | //1 - Master Mode |
NoLiver92 | 0:796e127c0dd1 | 65 | //2 - Trigger Mode |
NoLiver92 | 0:796e127c0dd1 | 66 | //3 - Auto-Connect Master Mode |
NoLiver92 | 0:796e127c0dd1 | 67 | //4 - Auto-Connect DTR Mode |
NoLiver92 | 0:796e127c0dd1 | 68 | //5 - Auto-Connect Any Mode |
NoLiver92 | 0:796e127c0dd1 | 69 | //6 - Pairing Mode |
NoLiver92 | 0:796e127c0dd1 | 70 | //Default Mode: 4 |
NoLiver92 | 0:796e127c0dd1 | 71 | bool RN41::setMode(int mode){ |
NoLiver92 | 0:796e127c0dd1 | 72 | enterCommandMode(); |
NoLiver92 | 0:796e127c0dd1 | 73 | if(mode < 0 or mode > 6){ |
NoLiver92 | 0:796e127c0dd1 | 74 | return false; |
NoLiver92 | 0:796e127c0dd1 | 75 | } |
NoLiver92 | 0:796e127c0dd1 | 76 | char buf[1]; |
NoLiver92 | 0:796e127c0dd1 | 77 | sprintf(buf,"SM,%d\r\n", mode); |
NoLiver92 | 0:796e127c0dd1 | 78 | string msg = buf; |
NoLiver92 | 0:796e127c0dd1 | 79 | sendString(msg); |
NoLiver92 | 0:796e127c0dd1 | 80 | if(getString() == "AOK\r\n"){ |
NoLiver92 | 0:796e127c0dd1 | 81 | reset(); |
NoLiver92 | 0:796e127c0dd1 | 82 | return true; |
NoLiver92 | 0:796e127c0dd1 | 83 | }else{ |
NoLiver92 | 0:796e127c0dd1 | 84 | return false; |
NoLiver92 | 0:796e127c0dd1 | 85 | } |
NoLiver92 | 0:796e127c0dd1 | 86 | } |
NoLiver92 | 0:796e127c0dd1 | 87 | |
NoLiver92 | 0:796e127c0dd1 | 88 | //Gets Bluetooth Address |
NoLiver92 | 0:796e127c0dd1 | 89 | //returns the 12 didgite MAC ID |
NoLiver92 | 0:796e127c0dd1 | 90 | string RN41::getBluetoothAddress(){ |
NoLiver92 | 0:796e127c0dd1 | 91 | enterCommandMode(); |
NoLiver92 | 0:796e127c0dd1 | 92 | sendString("GB\r\n"); |
NoLiver92 | 0:796e127c0dd1 | 93 | string result = getString(); |
NoLiver92 | 0:796e127c0dd1 | 94 | string address = result.substr(0, result.length() - 2); |
NoLiver92 | 0:796e127c0dd1 | 95 | exitCommandMode(); |
NoLiver92 | 0:796e127c0dd1 | 96 | return address; |
NoLiver92 | 0:796e127c0dd1 | 97 | } |
NoLiver92 | 0:796e127c0dd1 | 98 | |
NoLiver92 | 0:796e127c0dd1 | 99 | //Gets Connection Status |
NoLiver92 | 0:796e127c0dd1 | 100 | //0,0,0 = Not Connected |
NoLiver92 | 0:796e127c0dd1 | 101 | //1,0,0 = Connected |
NoLiver92 | 0:796e127c0dd1 | 102 | bool RN41::getConnectionStatus(){ |
NoLiver92 | 0:796e127c0dd1 | 103 | enterCommandMode(); |
NoLiver92 | 0:796e127c0dd1 | 104 | sendString("GK\r\n"); |
NoLiver92 | 0:796e127c0dd1 | 105 | if(getString() == "1,0,0\r\n"){ |
NoLiver92 | 0:796e127c0dd1 | 106 | exitCommandMode(); |
NoLiver92 | 0:796e127c0dd1 | 107 | return true; |
NoLiver92 | 0:796e127c0dd1 | 108 | }else{ |
NoLiver92 | 0:796e127c0dd1 | 109 | exitCommandMode(); |
NoLiver92 | 0:796e127c0dd1 | 110 | return false; |
NoLiver92 | 0:796e127c0dd1 | 111 | } |
NoLiver92 | 0:796e127c0dd1 | 112 | } |
NoLiver92 | 0:796e127c0dd1 | 113 | |
NoLiver92 | 0:796e127c0dd1 | 114 | //Get The Device's Firmware Version |
NoLiver92 | 0:796e127c0dd1 | 115 | string RN41::getFirmwareVersion(){ |
NoLiver92 | 0:796e127c0dd1 | 116 | enterCommandMode(); |
NoLiver92 | 0:796e127c0dd1 | 117 | sendString("V\r\n"); |
NoLiver92 | 0:796e127c0dd1 | 118 | string version = getString(); |
NoLiver92 | 0:796e127c0dd1 | 119 | exitCommandMode(); |
NoLiver92 | 0:796e127c0dd1 | 120 | return version; |
NoLiver92 | 0:796e127c0dd1 | 121 | } |
NoLiver92 | 0:796e127c0dd1 | 122 | |
NoLiver92 | 0:796e127c0dd1 | 123 | bool RN41::sendMessage(string message, char terminationChar){ |
NoLiver92 | 0:796e127c0dd1 | 124 | if(_commandMode){return false;} |
NoLiver92 | 0:796e127c0dd1 | 125 | string msg = message + terminationChar; |
NoLiver92 | 0:796e127c0dd1 | 126 | _RN41.printf("%s", msg); |
NoLiver92 | 0:796e127c0dd1 | 127 | return true; |
NoLiver92 | 0:796e127c0dd1 | 128 | } |
NoLiver92 | 0:796e127c0dd1 | 129 | |
NoLiver92 | 0:796e127c0dd1 | 130 | string RN41::recieveMessage(char terminationChar){ |
NoLiver92 | 0:796e127c0dd1 | 131 | return getString(terminationChar); |
NoLiver92 | 0:796e127c0dd1 | 132 | if(_commandMode){return "*ERROR*";} |
NoLiver92 | 0:796e127c0dd1 | 133 | } |
NoLiver92 | 0:796e127c0dd1 | 134 | |
NoLiver92 | 0:796e127c0dd1 | 135 | //Private Functions Below |
NoLiver92 | 0:796e127c0dd1 | 136 | |
NoLiver92 | 0:796e127c0dd1 | 137 | //Enter Command Mode |
NoLiver92 | 0:796e127c0dd1 | 138 | bool RN41::enterCommandMode(){ |
NoLiver92 | 0:796e127c0dd1 | 139 | if(_commandMode == true){ |
NoLiver92 | 0:796e127c0dd1 | 140 | return true; |
NoLiver92 | 0:796e127c0dd1 | 141 | } |
NoLiver92 | 0:796e127c0dd1 | 142 | sendString("$$$"); |
NoLiver92 | 0:796e127c0dd1 | 143 | if(getString() == "CMD\r\n"){ |
NoLiver92 | 0:796e127c0dd1 | 144 | _commandMode = true; |
NoLiver92 | 0:796e127c0dd1 | 145 | return true; |
NoLiver92 | 0:796e127c0dd1 | 146 | }else{ |
NoLiver92 | 0:796e127c0dd1 | 147 | return false; |
NoLiver92 | 0:796e127c0dd1 | 148 | } |
NoLiver92 | 0:796e127c0dd1 | 149 | } |
NoLiver92 | 0:796e127c0dd1 | 150 | |
NoLiver92 | 0:796e127c0dd1 | 151 | //Exit Command Mode |
NoLiver92 | 0:796e127c0dd1 | 152 | bool RN41::exitCommandMode(){ |
NoLiver92 | 0:796e127c0dd1 | 153 | if(_commandMode == false){ |
NoLiver92 | 0:796e127c0dd1 | 154 | return true; |
NoLiver92 | 0:796e127c0dd1 | 155 | } |
NoLiver92 | 0:796e127c0dd1 | 156 | sendString("---\r\n"); |
NoLiver92 | 0:796e127c0dd1 | 157 | if(getString() == "END\r\n"){ |
NoLiver92 | 0:796e127c0dd1 | 158 | _commandMode = false; |
NoLiver92 | 0:796e127c0dd1 | 159 | return true; |
NoLiver92 | 0:796e127c0dd1 | 160 | }else{ |
NoLiver92 | 0:796e127c0dd1 | 161 | return false; |
NoLiver92 | 0:796e127c0dd1 | 162 | } |
NoLiver92 | 0:796e127c0dd1 | 163 | } |
NoLiver92 | 0:796e127c0dd1 | 164 | |
NoLiver92 | 0:796e127c0dd1 | 165 | void RN41::sendString(string msg){ |
NoLiver92 | 0:796e127c0dd1 | 166 | _RN41.printf("%s",msg); |
NoLiver92 | 0:796e127c0dd1 | 167 | } |
NoLiver92 | 0:796e127c0dd1 | 168 | |
NoLiver92 | 0:796e127c0dd1 | 169 | bool RN41::readable(){ |
NoLiver92 | 0:796e127c0dd1 | 170 | if(_RN41.readable()){return true;}else{return false;} |
NoLiver92 | 0:796e127c0dd1 | 171 | } |
NoLiver92 | 0:796e127c0dd1 | 172 | |
NoLiver92 | 0:796e127c0dd1 | 173 | string RN41::getString(){ |
NoLiver92 | 0:796e127c0dd1 | 174 | string msg = ""; |
NoLiver92 | 0:796e127c0dd1 | 175 | char prev = ' '; |
NoLiver92 | 0:796e127c0dd1 | 176 | char curr = ' '; |
NoLiver92 | 0:796e127c0dd1 | 177 | while(1){ |
NoLiver92 | 0:796e127c0dd1 | 178 | if(_RN41.readable()){ |
NoLiver92 | 0:796e127c0dd1 | 179 | prev = curr; |
NoLiver92 | 0:796e127c0dd1 | 180 | curr = getChar(); |
NoLiver92 | 0:796e127c0dd1 | 181 | msg += curr; |
NoLiver92 | 0:796e127c0dd1 | 182 | if(prev=='\r' and curr=='\n'){ |
NoLiver92 | 0:796e127c0dd1 | 183 | break; |
NoLiver92 | 0:796e127c0dd1 | 184 | } |
NoLiver92 | 0:796e127c0dd1 | 185 | } |
NoLiver92 | 0:796e127c0dd1 | 186 | } |
NoLiver92 | 0:796e127c0dd1 | 187 | |
NoLiver92 | 0:796e127c0dd1 | 188 | return msg; |
NoLiver92 | 0:796e127c0dd1 | 189 | } |
NoLiver92 | 0:796e127c0dd1 | 190 | |
NoLiver92 | 0:796e127c0dd1 | 191 | string RN41::getString(char terminationChar){ |
NoLiver92 | 0:796e127c0dd1 | 192 | string msg = ""; |
NoLiver92 | 0:796e127c0dd1 | 193 | char curr = ' '; |
NoLiver92 | 0:796e127c0dd1 | 194 | while(1){ |
NoLiver92 | 0:796e127c0dd1 | 195 | if(_RN41.readable()){ |
NoLiver92 | 0:796e127c0dd1 | 196 | curr = getChar(); |
NoLiver92 | 0:796e127c0dd1 | 197 | msg += curr; |
NoLiver92 | 0:796e127c0dd1 | 198 | if(curr == terminationChar){ |
NoLiver92 | 0:796e127c0dd1 | 199 | break; |
NoLiver92 | 0:796e127c0dd1 | 200 | } |
NoLiver92 | 0:796e127c0dd1 | 201 | } |
NoLiver92 | 0:796e127c0dd1 | 202 | } |
NoLiver92 | 0:796e127c0dd1 | 203 | return msg; |
NoLiver92 | 0:796e127c0dd1 | 204 | } |
NoLiver92 | 0:796e127c0dd1 | 205 | |
NoLiver92 | 0:796e127c0dd1 | 206 | char RN41::getChar(){ |
NoLiver92 | 0:796e127c0dd1 | 207 | return _RN41.getc(); |
NoLiver92 | 0:796e127c0dd1 | 208 | } |