local fix version of myBlueUSB (http://mbed.org/users/networker/code/myBlueUSB/). - merge deleted files which are required to compile. - enable echo back of received data via RFCOMM.

Dependencies:   AvailableMemory FatFileSystem mbed myUSBHost

neigbourhood/neighbourhood.h

Committer:
nobukuma
Date:
2013-12-07
Revision:
0:003889bc474f

File content as of revision 0:003889bc474f:

#ifndef NEIGHBOURHOOD_H
#define NEIGHBOURHOOD_H

#include <list>
#include "hci.h"

//#define STRICT_MRU

/******************************************************************************************
call 'read' as part of the startup
on HCI_READ-STORED-LINK-KEY -COMPLETED event,  call 'set_cap'
on RETURN_LINK_KEYS_EVENT call 'add' for each key with init=true
on LINK_KEY_NOTIFICATION_EVENT call 'add' with init=false (default)
on LINK_KEY_REQUEST_EVENT call 'get' and send the proper reply
call 'write' as part of shutdown

a simpler approach could be to check for a link if it exists (single read) and try to add it.
when it fails just delete all.
********************************************************************************************/

#define HCI_DELETE_STORED_LINK_KEY  0x0C12
#define HCI_WRITE_STORED_LINK_KEY   0x0C11
#define HCI_READ_STORED_LINK_KEY    0x0C0D

void printf(const BD_ADDR* addr);

class neighbourhood {
    static const int lksize = 16;
    struct item {
        BD_ADDR a;
        unsigned char lk[lksize];
        bool used;
        item (BD_ADDR *ad, const unsigned char *k, bool d) {
            memcpy(&a, ad, sizeof(BD_ADDR));
            memcpy(lk, k, lksize);
            used=d;
        }
    };
    int cap, initsize, used;
    list<item> keys;
    bool dirty;
    HCI *hci;
    void delete_link_key(BD_ADDR *a) {
        unsigned char param[sizeof(BD_ADDR)+1];
        memcpy(param, a, sizeof(BD_ADDR));
        param[sizeof(BD_ADDR)] = 0;
        hci->SendCmd(HCI_DELETE_STORED_LINK_KEY, param, sizeof(param));
    }
    void write_link_keys(unsigned char param[]) {
        hci->SendCmd(HCI_WRITE_STORED_LINK_KEY, param, param[0]*(sizeof(BD_ADDR)+lksize)+1);
    }
public:
    neighbourhood(HCI *h): hci(h) {
        dirty = false;
        used = 0;
        cap=0;
        initsize=0;
    }
    void read() {
        unsigned char param[sizeof(BD_ADDR)+1];
        memset(param, 0, sizeof(BD_ADDR));
        param[sizeof(BD_ADDR)] = 1;
        hci->SendCmd(HCI_READ_STORED_LINK_KEY, param, sizeof(param));
    }
    void write();
    void set_cap(int c, int s) {
        cap = c;
        initsize = s;
        printf("Neighbourhood: capacity=%d, used=%d\n", c, s);
    }
    int get(BD_ADDR *a, unsigned char *key);
    int add(BD_ADDR *a, const unsigned char *key, bool init=false);
};

extern neighbourhood *neighbors;

#endif