Based on myBlueUSB reference ver. http://mbed.org/users/networker/programs/myBlueUSB/lsm1ui

Dependencies:   mbed myUSBHost AvailableMemory rfcomm myBlueUSB sdp

Committer:
kenbumono
Date:
Tue Jul 05 08:25:59 2011 +0000
Revision:
0:8d8481ed6d49

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenbumono 0:8d8481ed6d49 1 #ifndef NEIGHBOURHOOD_H
kenbumono 0:8d8481ed6d49 2 #define NEIGHBOURHOOD_H
kenbumono 0:8d8481ed6d49 3
kenbumono 0:8d8481ed6d49 4 #include <list>
kenbumono 0:8d8481ed6d49 5 #include "hci.h"
kenbumono 0:8d8481ed6d49 6
kenbumono 0:8d8481ed6d49 7 //#define STRICT_MRU
kenbumono 0:8d8481ed6d49 8
kenbumono 0:8d8481ed6d49 9 /******************************************************************************************
kenbumono 0:8d8481ed6d49 10 call 'read' as part of the startup
kenbumono 0:8d8481ed6d49 11 on HCI_READ-STORED-LINK-KEY -COMPLETED event, call 'set_cap'
kenbumono 0:8d8481ed6d49 12 on RETURN_LINK_KEYS_EVENT call 'add' for each key with init=true
kenbumono 0:8d8481ed6d49 13 on LINK_KEY_NOTIFICATION_EVENT call 'add' with init=false (default)
kenbumono 0:8d8481ed6d49 14 on LINK_KEY_REQUEST_EVENT call 'get' and send the proper reply
kenbumono 0:8d8481ed6d49 15 call 'write' as part of shutdown
kenbumono 0:8d8481ed6d49 16
kenbumono 0:8d8481ed6d49 17 a simpler approach could be to check for a link if it exists (single read) and try to add it.
kenbumono 0:8d8481ed6d49 18 when it fails just delete all.
kenbumono 0:8d8481ed6d49 19 ********************************************************************************************/
kenbumono 0:8d8481ed6d49 20
kenbumono 0:8d8481ed6d49 21 #define HCI_DELETE_STORED_LINK_KEY 0x0C12
kenbumono 0:8d8481ed6d49 22 #define HCI_WRITE_STORED_LINK_KEY 0x0C11
kenbumono 0:8d8481ed6d49 23 #define HCI_READ_STORED_LINK_KEY 0x0C0D
kenbumono 0:8d8481ed6d49 24
kenbumono 0:8d8481ed6d49 25 void printf(const BD_ADDR* addr);
kenbumono 0:8d8481ed6d49 26
kenbumono 0:8d8481ed6d49 27 class neighbourhood {
kenbumono 0:8d8481ed6d49 28 static const int lksize = 16;
kenbumono 0:8d8481ed6d49 29 struct item {
kenbumono 0:8d8481ed6d49 30 BD_ADDR a;
kenbumono 0:8d8481ed6d49 31 unsigned char lk[lksize];
kenbumono 0:8d8481ed6d49 32 bool used;
kenbumono 0:8d8481ed6d49 33 item (BD_ADDR *ad, const unsigned char *k, bool d) {
kenbumono 0:8d8481ed6d49 34 memcpy(&a, ad, sizeof(BD_ADDR));
kenbumono 0:8d8481ed6d49 35 memcpy(lk, k, lksize);
kenbumono 0:8d8481ed6d49 36 used=d;
kenbumono 0:8d8481ed6d49 37 }
kenbumono 0:8d8481ed6d49 38 };
kenbumono 0:8d8481ed6d49 39 int cap, initsize, used;
kenbumono 0:8d8481ed6d49 40 list<item> keys;
kenbumono 0:8d8481ed6d49 41 bool dirty;
kenbumono 0:8d8481ed6d49 42 HCI *hci;
kenbumono 0:8d8481ed6d49 43 void delete_link_key(BD_ADDR *a) {
kenbumono 0:8d8481ed6d49 44 unsigned char param[sizeof(BD_ADDR)+1];
kenbumono 0:8d8481ed6d49 45 memcpy(param, a, sizeof(BD_ADDR));
kenbumono 0:8d8481ed6d49 46 param[sizeof(BD_ADDR)] = 0;
kenbumono 0:8d8481ed6d49 47 hci->SendCmd(HCI_DELETE_STORED_LINK_KEY, param, sizeof(param));
kenbumono 0:8d8481ed6d49 48 }
kenbumono 0:8d8481ed6d49 49 void write_link_keys(unsigned char param[]) {
kenbumono 0:8d8481ed6d49 50 hci->SendCmd(HCI_WRITE_STORED_LINK_KEY, param, param[0]*(sizeof(BD_ADDR)+lksize)+1);
kenbumono 0:8d8481ed6d49 51 }
kenbumono 0:8d8481ed6d49 52 public:
kenbumono 0:8d8481ed6d49 53 neighbourhood(HCI *h): hci(h) {
kenbumono 0:8d8481ed6d49 54 dirty = false;
kenbumono 0:8d8481ed6d49 55 used = 0;
kenbumono 0:8d8481ed6d49 56 cap=0;
kenbumono 0:8d8481ed6d49 57 initsize=0;
kenbumono 0:8d8481ed6d49 58 }
kenbumono 0:8d8481ed6d49 59 void read() {
kenbumono 0:8d8481ed6d49 60 unsigned char param[sizeof(BD_ADDR)+1];
kenbumono 0:8d8481ed6d49 61 memset(param, 0, sizeof(BD_ADDR));
kenbumono 0:8d8481ed6d49 62 param[sizeof(BD_ADDR)] = 1;
kenbumono 0:8d8481ed6d49 63 hci->SendCmd(HCI_READ_STORED_LINK_KEY, param, sizeof(param));
kenbumono 0:8d8481ed6d49 64 }
kenbumono 0:8d8481ed6d49 65 void write();
kenbumono 0:8d8481ed6d49 66 void set_cap(int c, int s) {
kenbumono 0:8d8481ed6d49 67 cap = c;
kenbumono 0:8d8481ed6d49 68 initsize = s;
kenbumono 0:8d8481ed6d49 69 printf("Neighbourhood: capacity=%d, used=%d\n", c, s);
kenbumono 0:8d8481ed6d49 70 }
kenbumono 0:8d8481ed6d49 71 int get(BD_ADDR *a, unsigned char *key);
kenbumono 0:8d8481ed6d49 72 int add(BD_ADDR *a, const unsigned char *key, bool init=false);
kenbumono 0:8d8481ed6d49 73 };
kenbumono 0:8d8481ed6d49 74
kenbumono 0:8d8481ed6d49 75 extern neighbourhood *neighbors;
kenbumono 0:8d8481ed6d49 76
kenbumono 0:8d8481ed6d49 77 #endif