watch using the RSSI of Bluetooth
Dependencies: BaseUsbHost ConfigFile EthernetInterface HTTPClient-long mbed-rtos mbed
main.cpp@0:600fe65e7c88, 2013-01-20 (annotated)
- Committer:
- va009039
- Date:
- Sun Jan 20 09:22:31 2013 +0000
- Revision:
- 0:600fe65e7c88
first commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
va009039 | 0:600fe65e7c88 | 1 | #include "mbed.h" |
va009039 | 0:600fe65e7c88 | 2 | #include "EthernetInterface.h" |
va009039 | 0:600fe65e7c88 | 3 | #include "BaseUsbHost.h" |
va009039 | 0:600fe65e7c88 | 4 | //#define DEBUG |
va009039 | 0:600fe65e7c88 | 5 | #include "BaseUsbHostDebug.h" |
va009039 | 0:600fe65e7c88 | 6 | #define TEST |
va009039 | 0:600fe65e7c88 | 7 | #include "BaseUsbHostTest.h" |
va009039 | 0:600fe65e7c88 | 8 | #include "UsbBt2.h" |
va009039 | 0:600fe65e7c88 | 9 | #include "CosmClient.h" |
va009039 | 0:600fe65e7c88 | 10 | #include "MyThread.h" |
va009039 | 0:600fe65e7c88 | 11 | #include "ConfigFile.h" |
va009039 | 0:600fe65e7c88 | 12 | |
va009039 | 0:600fe65e7c88 | 13 | #define CFG_FILE "/local/mimamori.cfg" |
va009039 | 0:600fe65e7c88 | 14 | |
va009039 | 0:600fe65e7c88 | 15 | LocalFileSystem local("local"); |
va009039 | 0:600fe65e7c88 | 16 | Serial pc(USBTX, USBRX); |
va009039 | 0:600fe65e7c88 | 17 | EthernetInterface eth; |
va009039 | 0:600fe65e7c88 | 18 | ConfigFile cfg; |
va009039 | 0:600fe65e7c88 | 19 | CosmClient client; |
va009039 | 0:600fe65e7c88 | 20 | |
va009039 | 0:600fe65e7c88 | 21 | BD_ADDR addr; |
va009039 | 0:600fe65e7c88 | 22 | #define RSSI_NONE (-129) |
va009039 | 0:600fe65e7c88 | 23 | int rssi = RSSI_NONE; |
va009039 | 0:600fe65e7c88 | 24 | |
va009039 | 0:600fe65e7c88 | 25 | class bt_client : public MyThread { |
va009039 | 0:600fe65e7c88 | 26 | public: |
va009039 | 0:600fe65e7c88 | 27 | bt_client(bthci* hci):m_hci(hci) { |
va009039 | 0:600fe65e7c88 | 28 | } |
va009039 | 0:600fe65e7c88 | 29 | private: |
va009039 | 0:600fe65e7c88 | 30 | virtual void run() { |
va009039 | 0:600fe65e7c88 | 31 | inquiry_with_rssi_info rssi_info; |
va009039 | 0:600fe65e7c88 | 32 | hci_event* event; |
va009039 | 0:600fe65e7c88 | 33 | int max_period_length = 25; |
va009039 | 0:600fe65e7c88 | 34 | int min_period_length = 20; |
va009039 | 0:600fe65e7c88 | 35 | int inquiry_length = 15; |
va009039 | 0:600fe65e7c88 | 36 | int rc = m_hci->cmdSend(HCI_OP_RESET); |
va009039 | 0:600fe65e7c88 | 37 | TEST_ASSERT(rc == USB_OK); |
va009039 | 0:600fe65e7c88 | 38 | for(int n = 0; ; n++) { |
va009039 | 0:600fe65e7c88 | 39 | int r = m_hci->eventReceive(m_buf_int, sizeof(m_buf_int)); |
va009039 | 0:600fe65e7c88 | 40 | if (r > 0) { |
va009039 | 0:600fe65e7c88 | 41 | //DBG("%p eventReceive %d\n", this, r); |
va009039 | 0:600fe65e7c88 | 42 | //DBG_HEX(m_buf_int, r); |
va009039 | 0:600fe65e7c88 | 43 | event = reinterpret_cast<hci_event*>(m_buf_int); |
va009039 | 0:600fe65e7c88 | 44 | switch(event->evt) { |
va009039 | 0:600fe65e7c88 | 45 | case HCI_EV_CMD_COMPLETE: |
va009039 | 0:600fe65e7c88 | 46 | DBG("\nHCI_EV_CMD_COMPLETE\n"); |
va009039 | 0:600fe65e7c88 | 47 | switch(event->c.op) { |
va009039 | 0:600fe65e7c88 | 48 | case HCI_OP_RESET: |
va009039 | 0:600fe65e7c88 | 49 | rc = m_hci->cmdSend(HCI_OP_WRITE_INQUIRY_MODE, "B", 0x01); // with RSSI |
va009039 | 0:600fe65e7c88 | 50 | TEST_ASSERT(rc == USB_OK); |
va009039 | 0:600fe65e7c88 | 51 | break; |
va009039 | 0:600fe65e7c88 | 52 | case HCI_OP_WRITE_INQUIRY_MODE: |
va009039 | 0:600fe65e7c88 | 53 | rc = m_hci->cmdSend(HCI_OP_PERIODIC_INQUIRY, "HHBBBBB", |
va009039 | 0:600fe65e7c88 | 54 | max_period_length, min_period_length, 0x33, 0x8B, 0x9E, inquiry_length, 0); |
va009039 | 0:600fe65e7c88 | 55 | TEST_ASSERT(rc == USB_OK); |
va009039 | 0:600fe65e7c88 | 56 | break; |
va009039 | 0:600fe65e7c88 | 57 | default: |
va009039 | 0:600fe65e7c88 | 58 | DBG_HEX(m_buf_int, r); |
va009039 | 0:600fe65e7c88 | 59 | break; |
va009039 | 0:600fe65e7c88 | 60 | } |
va009039 | 0:600fe65e7c88 | 61 | break; |
va009039 | 0:600fe65e7c88 | 62 | case HCI_EV_INQUIRY_RESULT_WITH_RSSI: |
va009039 | 0:600fe65e7c88 | 63 | //DBG("\nHCI_EV_INQUIRY_RESULT_WITH_RSSI\n"); |
va009039 | 0:600fe65e7c88 | 64 | rssi_info = *reinterpret_cast<inquiry_with_rssi_info*>(event->c.data); |
va009039 | 0:600fe65e7c88 | 65 | DBG_HEX((uint8_t*)&rssi_info, sizeof(inquiry_with_rssi_info)); |
va009039 | 0:600fe65e7c88 | 66 | if (memcmp(&rssi_info.bdaddr, &addr, 6) == 0) { |
va009039 | 0:600fe65e7c88 | 67 | rssi = rssi_info.rssi; |
va009039 | 0:600fe65e7c88 | 68 | DBG("rssi=%d\n", rssi); |
va009039 | 0:600fe65e7c88 | 69 | } |
va009039 | 0:600fe65e7c88 | 70 | break; |
va009039 | 0:600fe65e7c88 | 71 | default: |
va009039 | 0:600fe65e7c88 | 72 | DBG_HEX(m_buf_int, r); |
va009039 | 0:600fe65e7c88 | 73 | break; |
va009039 | 0:600fe65e7c88 | 74 | } |
va009039 | 0:600fe65e7c88 | 75 | } |
va009039 | 0:600fe65e7c88 | 76 | } |
va009039 | 0:600fe65e7c88 | 77 | } |
va009039 | 0:600fe65e7c88 | 78 | bthci* m_hci; |
va009039 | 0:600fe65e7c88 | 79 | uint8_t m_buf_int[250]; |
va009039 | 0:600fe65e7c88 | 80 | }; |
va009039 | 0:600fe65e7c88 | 81 | |
va009039 | 0:600fe65e7c88 | 82 | void no_memory () { |
va009039 | 0:600fe65e7c88 | 83 | error("Failed to allocate memory!\n"); |
va009039 | 0:600fe65e7c88 | 84 | } |
va009039 | 0:600fe65e7c88 | 85 | |
va009039 | 0:600fe65e7c88 | 86 | int main() { |
va009039 | 0:600fe65e7c88 | 87 | pc.baud(921600); |
va009039 | 0:600fe65e7c88 | 88 | printf("%s\n", __FILE__); |
va009039 | 0:600fe65e7c88 | 89 | set_new_handler(no_memory); |
va009039 | 0:600fe65e7c88 | 90 | |
va009039 | 0:600fe65e7c88 | 91 | if(!cfg.read(CFG_FILE)) { |
va009039 | 0:600fe65e7c88 | 92 | error("can not read %s\n", CFG_FILE); |
va009039 | 0:600fe65e7c88 | 93 | } |
va009039 | 0:600fe65e7c88 | 94 | char buf[128]; |
va009039 | 0:600fe65e7c88 | 95 | if (!cfg.getValue("apikey", buf, sizeof(buf))) { |
va009039 | 0:600fe65e7c88 | 96 | error("apikey?\n"); |
va009039 | 0:600fe65e7c88 | 97 | } |
va009039 | 0:600fe65e7c88 | 98 | client.setApikey(buf); |
va009039 | 0:600fe65e7c88 | 99 | if (!cfg.getValue("feedid", buf, sizeof(buf))) { |
va009039 | 0:600fe65e7c88 | 100 | error("feedid?\n"); |
va009039 | 0:600fe65e7c88 | 101 | } |
va009039 | 0:600fe65e7c88 | 102 | client.setFeedID(buf); |
va009039 | 0:600fe65e7c88 | 103 | |
va009039 | 0:600fe65e7c88 | 104 | if (!cfg.getValue("bdaddr", buf, sizeof(buf))) { |
va009039 | 0:600fe65e7c88 | 105 | error("bdaddr?\n"); |
va009039 | 0:600fe65e7c88 | 106 | } |
va009039 | 0:600fe65e7c88 | 107 | addr.set(buf); |
va009039 | 0:600fe65e7c88 | 108 | |
va009039 | 0:600fe65e7c88 | 109 | eth.init(); //Use DHCP |
va009039 | 0:600fe65e7c88 | 110 | eth.connect(); |
va009039 | 0:600fe65e7c88 | 111 | |
va009039 | 0:600fe65e7c88 | 112 | BaseUsbHost* usbHost = new BaseUsbHost(); |
va009039 | 0:600fe65e7c88 | 113 | ControlEp* ctlEp = new ControlEp; // root hub |
va009039 | 0:600fe65e7c88 | 114 | bthci* bt_dongle1 = NULL; |
va009039 | 0:600fe65e7c88 | 115 | if (bthci::check(ctlEp)) { |
va009039 | 0:600fe65e7c88 | 116 | bt_dongle1 = new bthci(ctlEp); |
va009039 | 0:600fe65e7c88 | 117 | } else if (UsbHub::check(ctlEp)) { |
va009039 | 0:600fe65e7c88 | 118 | UsbHub* hub = new UsbHub(ctlEp); |
va009039 | 0:600fe65e7c88 | 119 | for(vector<ControlEp*>::iterator it = hub->PortEp.begin(); it != hub->PortEp.end(); ++it) { |
va009039 | 0:600fe65e7c88 | 120 | if (bthci::check(*it)) { |
va009039 | 0:600fe65e7c88 | 121 | bt_dongle1 = new bthci(*it); |
va009039 | 0:600fe65e7c88 | 122 | break; |
va009039 | 0:600fe65e7c88 | 123 | } |
va009039 | 0:600fe65e7c88 | 124 | } |
va009039 | 0:600fe65e7c88 | 125 | } |
va009039 | 0:600fe65e7c88 | 126 | if (bt_dongle1 == NULL) { |
va009039 | 0:600fe65e7c88 | 127 | error("USB Bluetooth not found\n"); |
va009039 | 0:600fe65e7c88 | 128 | } |
va009039 | 0:600fe65e7c88 | 129 | bt_client* bt_th = new bt_client(bt_dongle1); |
va009039 | 0:600fe65e7c88 | 130 | bt_th->set_stack(DEFAULT_STACK_SIZE); |
va009039 | 0:600fe65e7c88 | 131 | bt_th->start(); |
va009039 | 0:600fe65e7c88 | 132 | for(int n = 0; ; n++) { |
va009039 | 0:600fe65e7c88 | 133 | printf("%d Bluetooth rssi: %d stack used: %d/%d bytes\n", n, rssi, bt_th->stack_used(), bt_th->stack_size()); |
va009039 | 0:600fe65e7c88 | 134 | |
va009039 | 0:600fe65e7c88 | 135 | client.clear(); |
va009039 | 0:600fe65e7c88 | 136 | client.add("0", rssi); |
va009039 | 0:600fe65e7c88 | 137 | client.update(); |
va009039 | 0:600fe65e7c88 | 138 | rssi = RSSI_NONE; |
va009039 | 0:600fe65e7c88 | 139 | |
va009039 | 0:600fe65e7c88 | 140 | Thread::wait(40*1000); |
va009039 | 0:600fe65e7c88 | 141 | } |
va009039 | 0:600fe65e7c88 | 142 | } |