Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
BT.cpp@4:6f32ed1480a4, 2020-01-08 (annotated)
- Committer:
- MwadimeMakokha
- Date:
- Wed Jan 08 11:31:58 2020 +0000
- Revision:
- 4:6f32ed1480a4
- Parent:
- 3:936c6d909891
Add comments
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MwadimeMakokha | 1:940070f92554 | 1 | #include "BT.h" |
MwadimeMakokha | 1:940070f92554 | 2 | Serial* BT::modemSerial =0; |
MwadimeMakokha | 1:940070f92554 | 3 | BT::BT(Serial &port){ |
MwadimeMakokha | 1:940070f92554 | 4 | modemSerial = &port; |
MwadimeMakokha | 3:936c6d909891 | 5 | //Test if the modem is good |
MwadimeMakokha | 2:83d03d7148a5 | 6 | send_bt_cmd("ATE0"); |
MwadimeMakokha | 2:83d03d7148a5 | 7 | get_response(1000,false); |
MwadimeMakokha | 3:936c6d909891 | 8 | DEBUG_PRINTLN("%s",modem_response); |
MwadimeMakokha | 3:936c6d909891 | 9 | //Power the device and unpair all devices |
MwadimeMakokha | 3:936c6d909891 | 10 | power_bt_device(1); |
MwadimeMakokha | 3:936c6d909891 | 11 | bt_unpair_device(); |
MwadimeMakokha | 1:940070f92554 | 12 | } |
MwadimeMakokha | 4:6f32ed1480a4 | 13 | /* |
MwadimeMakokha | 4:6f32ed1480a4 | 14 | @brief Get the bluetooth status -> The modem response contains the status |
MwadimeMakokha | 4:6f32ed1480a4 | 15 | */ |
MwadimeMakokha | 1:940070f92554 | 16 | void BT::get_bt_status(){ |
MwadimeMakokha | 4:6f32ed1480a4 | 17 | send_bt_cmd("AT+BTSTATUS?"); |
MwadimeMakokha | 1:940070f92554 | 18 | get_response(1000,true); |
MwadimeMakokha | 1:940070f92554 | 19 | DEBUG_PRINTLN("%s",modem_response); |
MwadimeMakokha | 2:83d03d7148a5 | 20 | } |
MwadimeMakokha | 2:83d03d7148a5 | 21 | |
MwadimeMakokha | 4:6f32ed1480a4 | 22 | /* |
MwadimeMakokha | 4:6f32ed1480a4 | 23 | @brief power the bt funtionality on/off depending on the params passed |
MwadimeMakokha | 4:6f32ed1480a4 | 24 | @params bool on/off -> determines if bt powered on or off |
MwadimeMakokha | 4:6f32ed1480a4 | 25 | */ |
MwadimeMakokha | 1:940070f92554 | 26 | void BT::power_bt_device(bool on){ |
MwadimeMakokha | 1:940070f92554 | 27 | if(on)send_bt_cmd("AT+BTPOWER=1"); |
MwadimeMakokha | 1:940070f92554 | 28 | else send_bt_cmd("AT+BTPOWER=0"); |
MwadimeMakokha | 1:940070f92554 | 29 | get_response(1000,false); |
MwadimeMakokha | 1:940070f92554 | 30 | DEBUG_PRINTLN("%s",modem_response); |
MwadimeMakokha | 1:940070f92554 | 31 | } |
MwadimeMakokha | 2:83d03d7148a5 | 32 | |
MwadimeMakokha | 4:6f32ed1480a4 | 33 | /* |
MwadimeMakokha | 4:6f32ed1480a4 | 34 | @brief scan for the devices for the time passed in the params and gets the phone id from the mac_address |
MwadimeMakokha | 4:6f32ed1480a4 | 35 | @params waiting time for scanning |
MwadimeMakokha | 4:6f32ed1480a4 | 36 | @retval phone id |
MwadimeMakokha | 4:6f32ed1480a4 | 37 | */ |
MwadimeMakokha | 2:83d03d7148a5 | 38 | char BT::bt_scan(uint32_t timeout){ |
MwadimeMakokha | 2:83d03d7148a5 | 39 | char id; |
MwadimeMakokha | 2:83d03d7148a5 | 40 | if(timeout>60000){ |
MwadimeMakokha | 2:83d03d7148a5 | 41 | int cmd_rounds = timeout/10000; |
MwadimeMakokha | 2:83d03d7148a5 | 42 | for(int k=0;k<cmd_rounds;k++){ |
MwadimeMakokha | 2:83d03d7148a5 | 43 | send_bt_cmd("AT+BTSCAN=1,10"); |
MwadimeMakokha | 2:83d03d7148a5 | 44 | get_response(10000,true); |
MwadimeMakokha | 1:940070f92554 | 45 | DEBUG_PRINTLN("%s",modem_response); |
MwadimeMakokha | 1:940070f92554 | 46 | char* mac_address = get_phone_mac_addr(); |
MwadimeMakokha | 2:83d03d7148a5 | 47 | id = get_phone_id(mac_address); |
MwadimeMakokha | 2:83d03d7148a5 | 48 | if(id != '0') break ; |
MwadimeMakokha | 2:83d03d7148a5 | 49 | } |
MwadimeMakokha | 2:83d03d7148a5 | 50 | } |
MwadimeMakokha | 2:83d03d7148a5 | 51 | return id; |
MwadimeMakokha | 1:940070f92554 | 52 | } |
MwadimeMakokha | 2:83d03d7148a5 | 53 | |
MwadimeMakokha | 4:6f32ed1480a4 | 54 | /* |
MwadimeMakokha | 4:6f32ed1480a4 | 55 | @brief pair with device of the id given |
MwadimeMakokha | 4:6f32ed1480a4 | 56 | @params id of the phone to be paired |
MwadimeMakokha | 4:6f32ed1480a4 | 57 | */ |
MwadimeMakokha | 1:940070f92554 | 58 | void BT::bt_pair_device(char id){ |
MwadimeMakokha | 4:6f32ed1480a4 | 59 | DEBUG_PRINTLN("ID returned"); |
MwadimeMakokha | 1:940070f92554 | 60 | modemSerial->printf("AT+BTPAIR=0,%c\n\r",id); |
MwadimeMakokha | 2:83d03d7148a5 | 61 | get_response(5000,true); |
MwadimeMakokha | 1:940070f92554 | 62 | DEBUG_PRINTLN("%s",modem_response); |
MwadimeMakokha | 2:83d03d7148a5 | 63 | char* passkey = get_phone_passkey(); |
MwadimeMakokha | 2:83d03d7148a5 | 64 | if(passkey != "error"){ |
MwadimeMakokha | 2:83d03d7148a5 | 65 | send_bt_cmd("AT+BTPAIR=1,1"); |
MwadimeMakokha | 2:83d03d7148a5 | 66 | get_response(3000,true); |
MwadimeMakokha | 2:83d03d7148a5 | 67 | } |
MwadimeMakokha | 2:83d03d7148a5 | 68 | else{ |
MwadimeMakokha | 2:83d03d7148a5 | 69 | DEBUG_PRINTLN("Error"); |
MwadimeMakokha | 2:83d03d7148a5 | 70 | } |
MwadimeMakokha | 1:940070f92554 | 71 | } |
MwadimeMakokha | 2:83d03d7148a5 | 72 | |
MwadimeMakokha | 4:6f32ed1480a4 | 73 | /* |
MwadimeMakokha | 4:6f32ed1480a4 | 74 | @brief provide mac address of the bt phone |
MwadimeMakokha | 4:6f32ed1480a4 | 75 | @retval mac_address |
MwadimeMakokha | 4:6f32ed1480a4 | 76 | */ |
MwadimeMakokha | 1:940070f92554 | 77 | char* BT::get_phone_mac_addr(){ |
MwadimeMakokha | 4:6f32ed1480a4 | 78 | //TODO: Get mac address from MQTT event |
MwadimeMakokha | 3:936c6d909891 | 79 | return mac_addr_1; |
MwadimeMakokha | 4:6f32ed1480a4 | 80 | } |
MwadimeMakokha | 3:936c6d909891 | 81 | |
MwadimeMakokha | 4:6f32ed1480a4 | 82 | /* |
MwadimeMakokha | 4:6f32ed1480a4 | 83 | @brief get the device bt id |
MwadimeMakokha | 4:6f32ed1480a4 | 84 | @params mac_address of the device |
MwadimeMakokha | 4:6f32ed1480a4 | 85 | @retval device bt id |
MwadimeMakokha | 4:6f32ed1480a4 | 86 | */ |
MwadimeMakokha | 1:940070f92554 | 87 | char BT::get_phone_id(char* addr){ |
MwadimeMakokha | 1:940070f92554 | 88 | char id=0; |
MwadimeMakokha | 1:940070f92554 | 89 | bool id_found=false; |
MwadimeMakokha | 1:940070f92554 | 90 | char* dev_addr; |
MwadimeMakokha | 1:940070f92554 | 91 | int comma_count =0; |
MwadimeMakokha | 1:940070f92554 | 92 | int arr_index =0; |
MwadimeMakokha | 1:940070f92554 | 93 | while(modem_response[arr_index] != 0){ |
MwadimeMakokha | 1:940070f92554 | 94 | if(comma_count==1)id = modem_response[arr_index++]; |
MwadimeMakokha | 1:940070f92554 | 95 | if(comma_count==3){ |
MwadimeMakokha | 1:940070f92554 | 96 | for(int k=0;k<17;k++){ |
MwadimeMakokha | 1:940070f92554 | 97 | dev_addr[k] = modem_response[arr_index+k]; |
MwadimeMakokha | 1:940070f92554 | 98 | } |
MwadimeMakokha | 1:940070f92554 | 99 | if(strcmp(dev_addr,addr) == 0){ |
MwadimeMakokha | 1:940070f92554 | 100 | DEBUG_PRINTLN("id = %c",id); |
MwadimeMakokha | 1:940070f92554 | 101 | id_found = true; |
MwadimeMakokha | 1:940070f92554 | 102 | break; |
MwadimeMakokha | 1:940070f92554 | 103 | } |
MwadimeMakokha | 1:940070f92554 | 104 | } |
MwadimeMakokha | 1:940070f92554 | 105 | if(modem_response[arr_index]==',')comma_count++; |
MwadimeMakokha | 1:940070f92554 | 106 | if(modem_response[arr_index]=='\n')comma_count=0; |
MwadimeMakokha | 1:940070f92554 | 107 | arr_index++; |
MwadimeMakokha | 1:940070f92554 | 108 | } |
MwadimeMakokha | 1:940070f92554 | 109 | return id_found?id:'0'; |
MwadimeMakokha | 1:940070f92554 | 110 | } |
MwadimeMakokha | 1:940070f92554 | 111 | |
MwadimeMakokha | 4:6f32ed1480a4 | 112 | /* |
MwadimeMakokha | 4:6f32ed1480a4 | 113 | @brief get the passkey during pairing |
MwadimeMakokha | 4:6f32ed1480a4 | 114 | @retval the pairing passkeys |
MwadimeMakokha | 4:6f32ed1480a4 | 115 | */ |
MwadimeMakokha | 2:83d03d7148a5 | 116 | char* BT::get_phone_passkey(){ |
MwadimeMakokha | 2:83d03d7148a5 | 117 | int arr_index = 0; |
MwadimeMakokha | 2:83d03d7148a5 | 118 | char* passkey=new char[7]; |
MwadimeMakokha | 2:83d03d7148a5 | 119 | bool passkey_found=false; |
MwadimeMakokha | 2:83d03d7148a5 | 120 | int comma_count = 0; |
MwadimeMakokha | 2:83d03d7148a5 | 121 | while(modem_response[arr_index] !=0){ |
MwadimeMakokha | 2:83d03d7148a5 | 122 | if(comma_count == 2){ |
MwadimeMakokha | 2:83d03d7148a5 | 123 | int i =0; |
MwadimeMakokha | 2:83d03d7148a5 | 124 | while(modem_response[arr_index+i] != 0){ |
MwadimeMakokha | 2:83d03d7148a5 | 125 | passkey[i] = modem_response[arr_index+i]; |
MwadimeMakokha | 2:83d03d7148a5 | 126 | i++; |
MwadimeMakokha | 2:83d03d7148a5 | 127 | } |
MwadimeMakokha | 2:83d03d7148a5 | 128 | passkey[i] = 0; |
MwadimeMakokha | 2:83d03d7148a5 | 129 | passkey_found = true; |
MwadimeMakokha | 2:83d03d7148a5 | 130 | break; |
MwadimeMakokha | 2:83d03d7148a5 | 131 | } |
MwadimeMakokha | 2:83d03d7148a5 | 132 | if(modem_response[arr_index]==',')comma_count++; |
MwadimeMakokha | 2:83d03d7148a5 | 133 | arr_index++; |
MwadimeMakokha | 2:83d03d7148a5 | 134 | } |
MwadimeMakokha | 2:83d03d7148a5 | 135 | if(passkey_found){ |
MwadimeMakokha | 2:83d03d7148a5 | 136 | return passkey; |
MwadimeMakokha | 2:83d03d7148a5 | 137 | } |
MwadimeMakokha | 2:83d03d7148a5 | 138 | DEBUG_PRINTLN("Error"); |
MwadimeMakokha | 2:83d03d7148a5 | 139 | return "error"; |
MwadimeMakokha | 2:83d03d7148a5 | 140 | } |
MwadimeMakokha | 2:83d03d7148a5 | 141 | |
MwadimeMakokha | 4:6f32ed1480a4 | 142 | /* |
MwadimeMakokha | 4:6f32ed1480a4 | 143 | @brief unpair bt device |
MwadimeMakokha | 4:6f32ed1480a4 | 144 | */ |
MwadimeMakokha | 2:83d03d7148a5 | 145 | void BT::bt_unpair_device(){ |
MwadimeMakokha | 2:83d03d7148a5 | 146 | send_bt_cmd("AT+BTUNPAIR=0"); |
MwadimeMakokha | 2:83d03d7148a5 | 147 | get_response(1000,false); |
MwadimeMakokha | 2:83d03d7148a5 | 148 | } |
MwadimeMakokha | 2:83d03d7148a5 | 149 | |
MwadimeMakokha | 4:6f32ed1480a4 | 150 | /* |
MwadimeMakokha | 4:6f32ed1480a4 | 151 | @brief connect to bt device |
MwadimeMakokha | 4:6f32ed1480a4 | 152 | */ |
MwadimeMakokha | 3:936c6d909891 | 153 | void BT::bt_connect_device(char id){ |
MwadimeMakokha | 3:936c6d909891 | 154 | modemSerial->printf("AT+BTCONNECT=%c,10\n\r",id); |
MwadimeMakokha | 3:936c6d909891 | 155 | get_response(2000,true); |
MwadimeMakokha | 2:83d03d7148a5 | 156 | DEBUG_PRINTLN("%s",modem_response); |
MwadimeMakokha | 2:83d03d7148a5 | 157 | } |
MwadimeMakokha | 2:83d03d7148a5 | 158 | |
MwadimeMakokha | 4:6f32ed1480a4 | 159 | /* |
MwadimeMakokha | 4:6f32ed1480a4 | 160 | @brief disconnect bt device |
MwadimeMakokha | 4:6f32ed1480a4 | 161 | */ |
MwadimeMakokha | 3:936c6d909891 | 162 | void BT::bt_disconnect_device(char id){ |
MwadimeMakokha | 3:936c6d909891 | 163 | modemSerial->printf("AT+BTDISCONN=%c",id); |
MwadimeMakokha | 3:936c6d909891 | 164 | get_response(2000,true); |
MwadimeMakokha | 3:936c6d909891 | 165 | DEBUG_PRINTLN("%s",modem_response); |
MwadimeMakokha | 3:936c6d909891 | 166 | } |
MwadimeMakokha | 4:6f32ed1480a4 | 167 | |
MwadimeMakokha | 4:6f32ed1480a4 | 168 | /* |
MwadimeMakokha | 4:6f32ed1480a4 | 169 | @brief gets the bt device available profiles |
MwadimeMakokha | 4:6f32ed1480a4 | 170 | */ |
MwadimeMakokha | 3:936c6d909891 | 171 | void BT::bt_get_profile_id(char id){ |
MwadimeMakokha | 2:83d03d7148a5 | 172 | modemSerial->printf("AT+BTGETPROF=%c\n\r",id); |
MwadimeMakokha | 2:83d03d7148a5 | 173 | get_response(2000,true); |
MwadimeMakokha | 2:83d03d7148a5 | 174 | DEBUG_PRINTLN("%s",modem_response); |
MwadimeMakokha | 2:83d03d7148a5 | 175 | } |
MwadimeMakokha | 2:83d03d7148a5 | 176 | |
MwadimeMakokha | 2:83d03d7148a5 | 177 | void BT::send_bt_cmd(char* cmd){ |
MwadimeMakokha | 1:940070f92554 | 178 | modemSerial->printf(cmd); |
MwadimeMakokha | 1:940070f92554 | 179 | modemSerial->printf("\n\r"); |
MwadimeMakokha | 1:940070f92554 | 180 | } |
MwadimeMakokha | 2:83d03d7148a5 | 181 | void BT::get_response(uint32_t timeout,bool is_multiline){ |
MwadimeMakokha | 1:940070f92554 | 182 | int arr_index=0; |
MwadimeMakokha | 1:940070f92554 | 183 | while(timeout){ |
MwadimeMakokha | 1:940070f92554 | 184 | if(arr_index >= 254) break; |
MwadimeMakokha | 1:940070f92554 | 185 | while(modemSerial->readable()){ |
MwadimeMakokha | 1:940070f92554 | 186 | char c = modemSerial->getc(); |
MwadimeMakokha | 1:940070f92554 | 187 | if(c == '\r') continue; |
MwadimeMakokha | 1:940070f92554 | 188 | if(c=='\n' && arr_index==0){ |
MwadimeMakokha | 1:940070f92554 | 189 | continue; |
MwadimeMakokha | 1:940070f92554 | 190 | } |
MwadimeMakokha | 1:940070f92554 | 191 | if(c=='\n' && !is_multiline){ |
MwadimeMakokha | 1:940070f92554 | 192 | break; |
MwadimeMakokha | 1:940070f92554 | 193 | } |
MwadimeMakokha | 1:940070f92554 | 194 | modem_response[arr_index] = c; |
MwadimeMakokha | 1:940070f92554 | 195 | arr_index++; |
MwadimeMakokha | 1:940070f92554 | 196 | } |
MwadimeMakokha | 1:940070f92554 | 197 | timeout--; |
MwadimeMakokha | 1:940070f92554 | 198 | wait_ms(1); |
MwadimeMakokha | 1:940070f92554 | 199 | } |
MwadimeMakokha | 1:940070f92554 | 200 | modem_response[arr_index] = 0; |
MwadimeMakokha | 3:936c6d909891 | 201 | } |
MwadimeMakokha | 3:936c6d909891 | 202 | char* BT::get_response(){ |
MwadimeMakokha | 3:936c6d909891 | 203 | return modem_response; |
MwadimeMakokha | 1:940070f92554 | 204 | } |