Driver for the JY-MCU v1.06 HC-06 Bluetooth module.

Dependents:   DISCO-F746NG_rtos_test MbedTableControl

Committer:
Weimen Li
Date:
Mon Aug 08 15:03:13 2016 -0400
Revision:
20:13283edd1aba
Parent:
19:41da4bfc4d4d
Child:
21:cce827364df1
Integrated RTOS threading into receiveByteISR. This should ensure that the ISR executes quickly, so it is always ready to receive the next character, even if the client's receiveLine function takes a long time to run.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Electrotiger 16:1030b80a28f4 1 /**
Electrotiger 16:1030b80a28f4 2 * @file HC06Bluetooth.hpp
Electrotiger 16:1030b80a28f4 3 * @date June 4th, 2016
Electrotiger 16:1030b80a28f4 4 * @author Weimen Li
Electrotiger 16:1030b80a28f4 5 * @class HC06Bluetooth
Electrotiger 16:1030b80a28f4 6 * @brief This class creates an object representing the HC06 Bluetooth Module
Electrotiger 16:1030b80a28f4 7 * The baud rate for the device is configured to be 115200.
Electrotiger 10:b0a0a82a9ff5 8 */
Electrotiger 10:b0a0a82a9ff5 9
Electrotiger 10:b0a0a82a9ff5 10
Electrotiger 16:1030b80a28f4 11 #ifndef HC06BLUETOOTH_H_
Electrotiger 16:1030b80a28f4 12 #define HC06BLUETOOTH_H_
Electrotiger 16:1030b80a28f4 13 #include "mbed.h"
Weimen Li 20:13283edd1aba 14 #include "rtos.h"
Electrotiger 16:1030b80a28f4 15 #include <string>
Weimen Li 18:85c0f6580cd8 16 #include <queue>
Electrotiger 15:6a0aeaa39291 17
Weimen Li 20:13283edd1aba 18 const uint32_t SIG_BT_BYTE = (1 << 2);
Electrotiger 16:1030b80a28f4 19 // WARNING: DO NOT CHANGE THESE VALUES, AS THEY ARE USED TO INDEX INTO AN ARRAY FOR IMPLEMENTATION.
Electrotiger 16:1030b80a28f4 20 enum Baudrate {B1200, B2400, B4800, B9600, B19200, B38400, B57600, B115200, B230400, B460800, B921600, B1382400, END};
Electrotiger 10:b0a0a82a9ff5 21
Electrotiger 16:1030b80a28f4 22 class HC06Bluetooth {
Electrotiger 16:1030b80a28f4 23 public: // Public methods.
Electrotiger 16:1030b80a28f4 24 /**
Electrotiger 16:1030b80a28f4 25 * @brief Constructor for the HC06_Bluetooth class.
Electrotiger 16:1030b80a28f4 26 * @param TX The pin that the TX line is attached to.
Electrotiger 16:1030b80a28f4 27 * @param RX The pin that the RX line is attached to.
Electrotiger 16:1030b80a28f4 28 * @param deviceName The name that you want your system to be identified as when you connect to it i.e. "Weimen's MAE433Robot"
Electrotiger 16:1030b80a28f4 29 * @param password A 4-digit numeric PIN that you want your device to connect with. It defaults to "1234".
Electrotiger 16:1030b80a28f4 30 * @param lineCallbackFunc The callback function that will be called once a newline character is encountered on the receiving data.
Electrotiger 16:1030b80a28f4 31 * The callback function takes as an argument a string containing the line that has been read.
Electrotiger 16:1030b80a28f4 32 * @remark The callback function is run within within an interrupt service routine, so it should be written to be safe for ISRs.
Electrotiger 16:1030b80a28f4 33 * @param charCallbackFunc A function that will be called once a new character has been read. It should return void and take as an argument
Electrotiger 16:1030b80a28f4 34 * the character that has been read.
Electrotiger 16:1030b80a28f4 35 * @remark The callback function is run within within an interrupt service routine, so it should be written to be safe for ISRs.
Electrotiger 16:1030b80a28f4 36 */
Electrotiger 16:1030b80a28f4 37 HC06Bluetooth(PinName TX, PinName RX, Baudrate baudrate = B115200, void (*lineCallbackFunc) (const char* readString, size_t strlen) = NULL, void (*charCallbackFunc) (char readChar) = NULL);
Electrotiger 16:1030b80a28f4 38 virtual ~HC06Bluetooth();
Electrotiger 16:1030b80a28f4 39 /**
Electrotiger 16:1030b80a28f4 40 * @brief Run the setup routine to configure the device name and the device pin.
Electrotiger 16:1030b80a28f4 41 * @remark: You only need to run this once during the entire time you have the module, since the device name and PIN are saved
Electrotiger 16:1030b80a28f4 42 * by the module itself! However, you may run the function again if you would like to change the deviceName or PIN.
Electrotiger 16:1030b80a28f4 43 * @param deviceName The name of the device, as a string. It must only contain alphanumeric characters - no spaces allowed.
Electrotiger 16:1030b80a28f4 44 * @param PIN The device PIN.
Electrotiger 16:1030b80a28f4 45 */
Electrotiger 16:1030b80a28f4 46 void runSetup(std::string deviceName, std::string PIN = "1234");
Electrotiger 16:1030b80a28f4 47 /**
Electrotiger 16:1030b80a28f4 48 * @brief Print information in buffer to the output.
Electrotiger 16:1030b80a28f4 49 * @param buffer A null-terminated buffer containing the data you want to send.
Electrotiger 16:1030b80a28f4 50 */
Electrotiger 16:1030b80a28f4 51 void print(const char *buffer);
Weimen Li 19:41da4bfc4d4d 52 void print(std::string s) {
Weimen Li 19:41da4bfc4d4d 53 print(s.c_str());
Weimen Li 19:41da4bfc4d4d 54 }
Electrotiger 16:1030b80a28f4 55 /**
Electrotiger 16:1030b80a28f4 56 * @brief Print information in buffer to the output followed by a newline
Electrotiger 16:1030b80a28f4 57 * @param buffer A null-terminated buffer containing the data you want to send.
Electrotiger 16:1030b80a28f4 58 */
Electrotiger 16:1030b80a28f4 59 void println(const char *buffer);
Weimen Li 19:41da4bfc4d4d 60 void println(std::string s) {
Weimen Li 19:41da4bfc4d4d 61 println(s.c_str());
Weimen Li 19:41da4bfc4d4d 62 }
Electrotiger 16:1030b80a28f4 63 /**
Electrotiger 16:1030b80a28f4 64 * @brief Print a character to output.
Electrotiger 16:1030b80a28f4 65 * @param char The character you want to print to output.
Electrotiger 16:1030b80a28f4 66 */
Electrotiger 16:1030b80a28f4 67 void print(char c);
Electrotiger 10:b0a0a82a9ff5 68
Electrotiger 16:1030b80a28f4 69 private:
Electrotiger 16:1030b80a28f4 70 RawSerial btSerialObj;
Electrotiger 16:1030b80a28f4 71 Baudrate baudrate;
Electrotiger 16:1030b80a28f4 72 void receiveByteISR();
Weimen Li 20:13283edd1aba 73 void receiveByteThread();
Weimen Li 20:13283edd1aba 74 Thread receiveByteThreadObj;
Electrotiger 16:1030b80a28f4 75 /// Pointer to a callback function the client provides when a line is received.
Electrotiger 16:1030b80a28f4 76 void (*lineCallbackFunc) (const char*, size_t strlen);
Electrotiger 16:1030b80a28f4 77 /// Pointer to a callback function the client provides when a character is received.
Electrotiger 16:1030b80a28f4 78 void (*charCallbackFunc) (char);
Weimen Li 18:85c0f6580cd8 79 std::queue<char> dataReceivedBuffer;
Weimen Li 18:85c0f6580cd8 80 std::queue<char> dataReceivedBufferCopy;
Weimen Li 18:85c0f6580cd8 81 std::vector<char> dataReceivedToClient;
Electrotiger 16:1030b80a28f4 82 };
Electrotiger 10:b0a0a82a9ff5 83
Electrotiger 16:1030b80a28f4 84 #endif /* HC06BLUETOOTH_H_ */