watch using the RSSI of Bluetooth

Dependencies:   BaseUsbHost ConfigFile EthernetInterface HTTPClient-long mbed-rtos mbed

Committer:
va009039
Date:
Sun Jan 20 09:22:31 2013 +0000
Revision:
0:600fe65e7c88
first commit

Who changed what in which revision?

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