watch using the RSSI of Bluetooth
Dependencies: BaseUsbHost ConfigFile EthernetInterface HTTPClient-long mbed-rtos mbed
Diff: main.cpp
- Revision:
- 0:600fe65e7c88
diff -r 000000000000 -r 600fe65e7c88 main.cpp --- /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); + } +}