RN41 Bluetooth Module Library

RN41 Bluetooth Module Library.

This library only contains the basic features, more will be implemented upon request

Committer:
NoLiver92
Date:
Wed Oct 28 15:48:39 2015 +0000
Revision:
0:796e127c0dd1
Initial Commit

Who changed what in which revision?

UserRevisionLine numberNew 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 }