watch using the RSSI of Bluetooth

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

Revision:
0:600fe65e7c88
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun Jan 20 09:22:31 2013 +0000
@@ -0,0 +1,142 @@
+#include "mbed.h"
+#include "EthernetInterface.h"
+#include "BaseUsbHost.h"
+//#define DEBUG
+#include "BaseUsbHostDebug.h"
+#define TEST
+#include "BaseUsbHostTest.h"
+#include "UsbBt2.h"
+#include "CosmClient.h"
+#include "MyThread.h"
+#include "ConfigFile.h"
+
+#define CFG_FILE "/local/mimamori.cfg"
+
+LocalFileSystem local("local");
+Serial pc(USBTX, USBRX);
+EthernetInterface eth;
+ConfigFile cfg;
+CosmClient client;
+
+BD_ADDR addr;
+#define RSSI_NONE (-129)
+int rssi = RSSI_NONE;
+
+class bt_client : public MyThread {
+public:
+    bt_client(bthci* hci):m_hci(hci) {
+    }
+private:
+    virtual void run() {
+        inquiry_with_rssi_info rssi_info;
+        hci_event* event;
+        int max_period_length = 25;
+        int min_period_length = 20;
+        int inquiry_length = 15;
+        int rc = m_hci->cmdSend(HCI_OP_RESET);
+        TEST_ASSERT(rc == USB_OK);
+        for(int n = 0; ; n++) {
+            int r = m_hci->eventReceive(m_buf_int, sizeof(m_buf_int));
+            if (r > 0) {
+                //DBG("%p eventReceive %d\n", this, r);
+                //DBG_HEX(m_buf_int, r);
+                event = reinterpret_cast<hci_event*>(m_buf_int);
+                switch(event->evt) {
+                    case HCI_EV_CMD_COMPLETE:
+                        DBG("\nHCI_EV_CMD_COMPLETE\n");
+                        switch(event->c.op) {
+                            case HCI_OP_RESET:
+                                rc = m_hci->cmdSend(HCI_OP_WRITE_INQUIRY_MODE, "B", 0x01); // with RSSI
+                                TEST_ASSERT(rc == USB_OK);
+                                break;
+                            case HCI_OP_WRITE_INQUIRY_MODE:
+                                rc = m_hci->cmdSend(HCI_OP_PERIODIC_INQUIRY, "HHBBBBB", 
+                                                    max_period_length, min_period_length, 0x33, 0x8B, 0x9E, inquiry_length, 0);
+                                TEST_ASSERT(rc == USB_OK);
+                                break;
+                            default:
+                                DBG_HEX(m_buf_int, r);
+                                break;
+                        }
+                        break;
+                    case HCI_EV_INQUIRY_RESULT_WITH_RSSI:
+                        //DBG("\nHCI_EV_INQUIRY_RESULT_WITH_RSSI\n");
+                        rssi_info = *reinterpret_cast<inquiry_with_rssi_info*>(event->c.data);
+                        DBG_HEX((uint8_t*)&rssi_info, sizeof(inquiry_with_rssi_info));
+                        if (memcmp(&rssi_info.bdaddr, &addr, 6) == 0) {
+                            rssi = rssi_info.rssi;
+                            DBG("rssi=%d\n", rssi);
+                        }
+                        break;
+                    default:
+                        DBG_HEX(m_buf_int, r);
+                        break;
+                }
+            }
+        }
+    }
+    bthci* m_hci;
+    uint8_t m_buf_int[250];
+};
+
+void no_memory () {
+  error("Failed to allocate memory!\n");
+}
+
+int main() {
+    pc.baud(921600);
+    printf("%s\n", __FILE__);
+    set_new_handler(no_memory);
+    
+    if(!cfg.read(CFG_FILE)) {
+        error("can not read %s\n", CFG_FILE);
+    }
+    char buf[128];
+    if (!cfg.getValue("apikey", buf, sizeof(buf))) {
+        error("apikey?\n");
+    }
+    client.setApikey(buf);
+    if (!cfg.getValue("feedid", buf, sizeof(buf))) {
+        error("feedid?\n");
+    }
+    client.setFeedID(buf);
+
+    if (!cfg.getValue("bdaddr", buf, sizeof(buf))) {
+        error("bdaddr?\n");
+    }
+    addr.set(buf);
+
+    eth.init(); //Use DHCP
+    eth.connect();
+
+    BaseUsbHost* usbHost = new BaseUsbHost();
+    ControlEp* ctlEp = new ControlEp; // root hub
+    bthci* bt_dongle1 = NULL;
+    if (bthci::check(ctlEp)) {
+        bt_dongle1 = new bthci(ctlEp);
+    } else if (UsbHub::check(ctlEp)) {
+        UsbHub* hub = new UsbHub(ctlEp);
+        for(vector<ControlEp*>::iterator it = hub->PortEp.begin(); it != hub->PortEp.end(); ++it) {
+            if (bthci::check(*it)) {
+                bt_dongle1 = new bthci(*it);
+                break;
+            }
+        }
+    }
+    if (bt_dongle1 == NULL) {
+        error("USB Bluetooth not found\n");
+    }
+    bt_client* bt_th = new bt_client(bt_dongle1);
+    bt_th->set_stack(DEFAULT_STACK_SIZE);
+    bt_th->start();
+    for(int n = 0; ; n++) {
+        printf("%d Bluetooth rssi: %d stack used: %d/%d bytes\n", n, rssi, bt_th->stack_used(), bt_th->stack_size());
+
+        client.clear();
+        client.add("0", rssi);
+        client.update();
+        rssi = RSSI_NONE;
+    
+        Thread::wait(40*1000);
+    }
+}