Drivers for the mini robot designed for Princeton's MAE 433 course.
Dependencies: mbed-dsp mbed-rtos mbed
Dependents: MAE433_Library_Tester RobotBalancerv2
HC06Bluetooth.cpp@0:9afc272fa65f, 2016-06-24 (annotated)
- Committer:
- Electrotiger
- Date:
- Fri Jun 24 21:03:20 2016 +0000
- Revision:
- 0:9afc272fa65f
- Child:
- 5:e00cc0dab1c7
First Commit;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Electrotiger | 0:9afc272fa65f | 1 | /* |
Electrotiger | 0:9afc272fa65f | 2 | * HC06Bluetooth.cpp |
Electrotiger | 0:9afc272fa65f | 3 | * |
Electrotiger | 0:9afc272fa65f | 4 | * Created on: Jun 4, 2016 |
Electrotiger | 0:9afc272fa65f | 5 | * Author: Developer |
Electrotiger | 0:9afc272fa65f | 6 | */ |
Electrotiger | 0:9afc272fa65f | 7 | |
Electrotiger | 0:9afc272fa65f | 8 | #include <HC06Bluetooth.hpp> |
Electrotiger | 0:9afc272fa65f | 9 | #include <algorithm> |
Electrotiger | 0:9afc272fa65f | 10 | |
Electrotiger | 0:9afc272fa65f | 11 | /* Static methods used to help configure the Baudrate. */ |
Electrotiger | 0:9afc272fa65f | 12 | |
Electrotiger | 0:9afc272fa65f | 13 | // WARNING: DO NOT CHANGE THESE VALUES, AS THEY ARE USED TO INDEX INTO AN ARRAY FOR IMPLEMENTATION. |
Electrotiger | 0:9afc272fa65f | 14 | enum Baudrate {B1200, B2400, B4800, B9600, B19200, B38400, B57600, B115200, B230400, B460800, B921600, B1382400, END}; |
Electrotiger | 0:9afc272fa65f | 15 | const char* BaudATString[] = {"AT+BAUD1", "AT+BAUD2", "AT+BAUD3", "AT+BAUD4", "AT+BAUD5", "AT+BAUD6", "AT+BAUD7", "AT+BAUD8", "AT+BAUD9", "AT+BAUDA", "AT+BAUDB", "AT+BAUDC"}; |
Electrotiger | 0:9afc272fa65f | 16 | const int32_t BaudATReplyLength[] = {6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 8, 9}; |
Electrotiger | 0:9afc272fa65f | 17 | //const char* BaudATReplyPattern[] = {"OK1200", "OK2400", "OK4800","OK9600","OK19200","OK38400","OK57600","OK115200","OK230400","OK460800","OK921600","OK1382400"}; |
Electrotiger | 0:9afc272fa65f | 18 | const int32_t BaudValue[] = {1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600, 1382400}; |
Electrotiger | 0:9afc272fa65f | 19 | |
Electrotiger | 0:9afc272fa65f | 20 | /* HC06 Bluetooth Class Implementation: */ |
Electrotiger | 0:9afc272fa65f | 21 | HC06Bluetooth::HC06Bluetooth(PinName TX, PinName RX, void (*lineCallbackFunc) (const char* readString), void (*charCallbackFunc) (char readChar)) |
Electrotiger | 0:9afc272fa65f | 22 | : btSerialObj(TX, RX), lineCallbackFunc(lineCallbackFunc), charCallbackFunc(charCallbackFunc) { |
Electrotiger | 0:9afc272fa65f | 23 | btSerialObj.baud(115200); |
Electrotiger | 0:9afc272fa65f | 24 | |
Electrotiger | 0:9afc272fa65f | 25 | // Set the interrupt to be called when a byte is received. |
Electrotiger | 0:9afc272fa65f | 26 | if ((lineCallbackFunc != NULL) || (charCallbackFunc != NULL)) { |
Electrotiger | 0:9afc272fa65f | 27 | btSerialObj.attach(this, &HC06Bluetooth::receiveByteISR); |
Electrotiger | 0:9afc272fa65f | 28 | } |
Electrotiger | 0:9afc272fa65f | 29 | } |
Electrotiger | 0:9afc272fa65f | 30 | |
Electrotiger | 0:9afc272fa65f | 31 | void HC06Bluetooth::runSetup(std::string deviceName, std::string PIN) { |
Electrotiger | 0:9afc272fa65f | 32 | int numCharsReceived = 0; |
Electrotiger | 0:9afc272fa65f | 33 | // Detatch the interrupt. |
Electrotiger | 0:9afc272fa65f | 34 | btSerialObj.attach(NULL); |
Electrotiger | 0:9afc272fa65f | 35 | /* Sweep through a list of Baud rates until we find the one that the device has previously been set to. */ |
Electrotiger | 0:9afc272fa65f | 36 | bool baudFound = false; |
Electrotiger | 0:9afc272fa65f | 37 | Timer timeOut; |
Electrotiger | 0:9afc272fa65f | 38 | timeOut.start(); |
Electrotiger | 0:9afc272fa65f | 39 | // For every baud rate in the list: |
Electrotiger | 0:9afc272fa65f | 40 | for (int i = 0; (i < END) && (!baudFound); i++) { |
Electrotiger | 0:9afc272fa65f | 41 | // Set the communication baud rate to it. |
Electrotiger | 0:9afc272fa65f | 42 | btSerialObj.baud(BaudValue[i]); |
Electrotiger | 0:9afc272fa65f | 43 | // Send the test command "AT" to the device. |
Electrotiger | 0:9afc272fa65f | 44 | btSerialObj.puts("AT"); |
Electrotiger | 0:9afc272fa65f | 45 | // While the time out has not been reached: |
Electrotiger | 0:9afc272fa65f | 46 | for(timeOut.reset(); timeOut.read_ms() < 1000; ) { |
Electrotiger | 0:9afc272fa65f | 47 | // If the serial object is readable, make sure the read character matches the reply string "OK". |
Electrotiger | 0:9afc272fa65f | 48 | if (btSerialObj.readable() && !baudFound) { |
Electrotiger | 0:9afc272fa65f | 49 | baudFound = true; |
Electrotiger | 0:9afc272fa65f | 50 | break; |
Electrotiger | 0:9afc272fa65f | 51 | } |
Electrotiger | 0:9afc272fa65f | 52 | } |
Electrotiger | 0:9afc272fa65f | 53 | } |
Electrotiger | 0:9afc272fa65f | 54 | // Flush whatever's in the input buffer. |
Electrotiger | 0:9afc272fa65f | 55 | while(btSerialObj.readable()) { |
Electrotiger | 0:9afc272fa65f | 56 | btSerialObj.getc(); |
Electrotiger | 0:9afc272fa65f | 57 | } |
Electrotiger | 0:9afc272fa65f | 58 | //Overwrite the Baud rate to 115200. |
Electrotiger | 0:9afc272fa65f | 59 | btSerialObj.puts(BaudATString[B115200]); |
Electrotiger | 0:9afc272fa65f | 60 | btSerialObj.baud(BaudValue[B115200]); |
Electrotiger | 0:9afc272fa65f | 61 | // Wait for the 8 character reply "OK115200" |
Electrotiger | 0:9afc272fa65f | 62 | for(numCharsReceived = 0 ; numCharsReceived < BaudATReplyLength[B115200]; numCharsReceived++) { |
Electrotiger | 0:9afc272fa65f | 63 | //while(!btSerialObj.readable()); |
Electrotiger | 0:9afc272fa65f | 64 | btSerialObj.getc(); |
Electrotiger | 0:9afc272fa65f | 65 | } |
Electrotiger | 0:9afc272fa65f | 66 | |
Electrotiger | 0:9afc272fa65f | 67 | // Set the name of the device. |
Electrotiger | 0:9afc272fa65f | 68 | btSerialObj.puts(("AT+NAME" + deviceName.substr(0,20)).c_str()); |
Electrotiger | 0:9afc272fa65f | 69 | // Wait for the 6 character reply "OKname" |
Electrotiger | 0:9afc272fa65f | 70 | for(numCharsReceived = 0 ; numCharsReceived < 6; numCharsReceived++) { |
Electrotiger | 0:9afc272fa65f | 71 | while(!btSerialObj.readable()); |
Electrotiger | 0:9afc272fa65f | 72 | btSerialObj.getc(); |
Electrotiger | 0:9afc272fa65f | 73 | } |
Electrotiger | 0:9afc272fa65f | 74 | |
Electrotiger | 0:9afc272fa65f | 75 | //Set the password of the device. |
Electrotiger | 0:9afc272fa65f | 76 | btSerialObj.puts(("AT+PIN" + PIN.substr(0, 4)).c_str()); |
Electrotiger | 0:9afc272fa65f | 77 | // Wait for the 8 character reply "OKsetpin" |
Electrotiger | 0:9afc272fa65f | 78 | for(numCharsReceived = 0 ; numCharsReceived < 8; numCharsReceived++) { |
Electrotiger | 0:9afc272fa65f | 79 | while(!btSerialObj.readable()); |
Electrotiger | 0:9afc272fa65f | 80 | btSerialObj.getc(); |
Electrotiger | 0:9afc272fa65f | 81 | } |
Electrotiger | 0:9afc272fa65f | 82 | // Reattach the interrupt. |
Electrotiger | 0:9afc272fa65f | 83 | btSerialObj.attach(this, &HC06Bluetooth::receiveByteISR); |
Electrotiger | 0:9afc272fa65f | 84 | } |
Electrotiger | 0:9afc272fa65f | 85 | |
Electrotiger | 0:9afc272fa65f | 86 | HC06Bluetooth::~HC06Bluetooth() { |
Electrotiger | 0:9afc272fa65f | 87 | // TODO Auto-generated destructor stub |
Electrotiger | 0:9afc272fa65f | 88 | } |
Electrotiger | 0:9afc272fa65f | 89 | |
Electrotiger | 0:9afc272fa65f | 90 | void HC06Bluetooth::print(const char* buffer) { |
Electrotiger | 0:9afc272fa65f | 91 | btSerialObj.puts(buffer); |
Electrotiger | 0:9afc272fa65f | 92 | } |
Electrotiger | 0:9afc272fa65f | 93 | |
Electrotiger | 0:9afc272fa65f | 94 | void HC06Bluetooth::print(char c) { |
Electrotiger | 0:9afc272fa65f | 95 | btSerialObj.putc(c); |
Electrotiger | 0:9afc272fa65f | 96 | } |
Electrotiger | 0:9afc272fa65f | 97 | |
Electrotiger | 0:9afc272fa65f | 98 | void HC06Bluetooth::receiveByteISR() { |
Electrotiger | 0:9afc272fa65f | 99 | while(btSerialObj.readable()) { |
Electrotiger | 0:9afc272fa65f | 100 | // Get the character from the input. |
Electrotiger | 0:9afc272fa65f | 101 | char receivedChar = btSerialObj.getc(); |
Electrotiger | 0:9afc272fa65f | 102 | |
Electrotiger | 0:9afc272fa65f | 103 | // Call the character callback function if it is not null. |
Electrotiger | 0:9afc272fa65f | 104 | if (charCallbackFunc != NULL) { |
Electrotiger | 0:9afc272fa65f | 105 | charCallbackFunc(receivedChar); |
Electrotiger | 0:9afc272fa65f | 106 | } |
Electrotiger | 0:9afc272fa65f | 107 | |
Electrotiger | 0:9afc272fa65f | 108 | // If the character is a newline or carriage return, then call the line callback function. |
Electrotiger | 0:9afc272fa65f | 109 | if ((receivedChar == '\n') || (receivedChar == '\r')) { |
Electrotiger | 0:9afc272fa65f | 110 | // Terminate the buffer with a null character, since that is what strings end with. |
Electrotiger | 0:9afc272fa65f | 111 | receivedChar = '\0'; |
Electrotiger | 0:9afc272fa65f | 112 | dataReceivedBuffer[dataReceivedBufferPos] = receivedChar; |
Electrotiger | 0:9afc272fa65f | 113 | // Copy data from the buffer to a copy. |
Electrotiger | 0:9afc272fa65f | 114 | std::copy(dataReceivedBuffer, dataReceivedBuffer + dataReceivedBufferPos, dataReceivedBufferCopy); |
Electrotiger | 0:9afc272fa65f | 115 | // Reset the buffer position. |
Electrotiger | 0:9afc272fa65f | 116 | dataReceivedBufferPos = 0; |
Electrotiger | 0:9afc272fa65f | 117 | // Call the callback function. |
Electrotiger | 0:9afc272fa65f | 118 | if (lineCallbackFunc != NULL) { |
Electrotiger | 0:9afc272fa65f | 119 | lineCallbackFunc((const char*)dataReceivedBuffer); |
Electrotiger | 0:9afc272fa65f | 120 | } |
Electrotiger | 0:9afc272fa65f | 121 | } |
Electrotiger | 0:9afc272fa65f | 122 | // Otherwise, just place it in the buffer and move on. |
Electrotiger | 0:9afc272fa65f | 123 | else { |
Electrotiger | 0:9afc272fa65f | 124 | dataReceivedBuffer[dataReceivedBufferPos] = receivedChar; |
Electrotiger | 0:9afc272fa65f | 125 | dataReceivedBufferPos++; |
Electrotiger | 0:9afc272fa65f | 126 | } |
Electrotiger | 0:9afc272fa65f | 127 | } |
Electrotiger | 0:9afc272fa65f | 128 | } |
Electrotiger | 0:9afc272fa65f | 129 |