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 #include "Utils.h"
kenbumono 0:8d8481ed6d49 2 #include "neighbourhood.h"
kenbumono 0:8d8481ed6d49 3
kenbumono 0:8d8481ed6d49 4 neighbourhood *neighbors = 0;
kenbumono 0:8d8481ed6d49 5
kenbumono 0:8d8481ed6d49 6 int neighbourhood::get(BD_ADDR *a, unsigned char *key) {
kenbumono 0:8d8481ed6d49 7 for (list<item>::iterator i = keys.begin(); i != keys.end(); i++)
kenbumono 0:8d8481ed6d49 8 if (memcmp(a, &(*i).a, sizeof(BD_ADDR)) == 0) {
kenbumono 0:8d8481ed6d49 9 memcpy(key, (*i).lk, lksize);
kenbumono 0:8d8481ed6d49 10 #ifdef STRICT_MRU
kenbumono 0:8d8481ed6d49 11 if (i != keys.begin()) {
kenbumono 0:8d8481ed6d49 12 keys.push_front(*i);
kenbumono 0:8d8481ed6d49 13 keys.erase(i);
kenbumono 0:8d8481ed6d49 14 dirty = true;
kenbumono 0:8d8481ed6d49 15 }
kenbumono 0:8d8481ed6d49 16 #endif
kenbumono 0:8d8481ed6d49 17 return 1;
kenbumono 0:8d8481ed6d49 18 }
kenbumono 0:8d8481ed6d49 19 return 0;
kenbumono 0:8d8481ed6d49 20 }
kenbumono 0:8d8481ed6d49 21
kenbumono 0:8d8481ed6d49 22 int neighbourhood::add(BD_ADDR *a, const unsigned char *key, bool init) {
kenbumono 0:8d8481ed6d49 23 for (list<item>::iterator i = keys.begin(); i != keys.end(); i++)
kenbumono 0:8d8481ed6d49 24 if (memcmp(a, &(*i).a, sizeof(BD_ADDR)) == 0) {
kenbumono 0:8d8481ed6d49 25 memcpy((*i).lk, key, lksize); //assume key has changed, update key
kenbumono 0:8d8481ed6d49 26 (*i).used = true;
kenbumono 0:8d8481ed6d49 27 return 1;
kenbumono 0:8d8481ed6d49 28 }
kenbumono 0:8d8481ed6d49 29 //new key
kenbumono 0:8d8481ed6d49 30 printf("Neighbourhood: "); printf(a); printf("\n");
kenbumono 0:8d8481ed6d49 31 if (keys.size() < cap) {
kenbumono 0:8d8481ed6d49 32 keys.push_back(item(a, key, !init));//append as long as there is space
kenbumono 0:8d8481ed6d49 33 } else {
kenbumono 0:8d8481ed6d49 34 keys.push_front(item(a, key, true));//otherwise prepend
kenbumono 0:8d8481ed6d49 35 dirty = true;
kenbumono 0:8d8481ed6d49 36 }
kenbumono 0:8d8481ed6d49 37 return 0;
kenbumono 0:8d8481ed6d49 38 }
kenbumono 0:8d8481ed6d49 39
kenbumono 0:8d8481ed6d49 40 void neighbourhood::write() {
kenbumono 0:8d8481ed6d49 41 int n = 0;
kenbumono 0:8d8481ed6d49 42 static const int maxkey = 11;
kenbumono 0:8d8481ed6d49 43 unsigned char param[maxkey*(lksize+sizeof(BD_ADDR))+1];
kenbumono 0:8d8481ed6d49 44 int k = keys.size()-cap;
kenbumono 0:8d8481ed6d49 45 list<item>::iterator i = keys.begin();
kenbumono 0:8d8481ed6d49 46 while (i != keys.end()) {
kenbumono 0:8d8481ed6d49 47 if (k>0) {
kenbumono 0:8d8481ed6d49 48 if (!(*i).used) {
kenbumono 0:8d8481ed6d49 49 delete_link_key(&(*i).a);//try to make some room
kenbumono 0:8d8481ed6d49 50 keys.erase(i);
kenbumono 0:8d8481ed6d49 51 k--;
kenbumono 0:8d8481ed6d49 52 } else
kenbumono 0:8d8481ed6d49 53 i++;
kenbumono 0:8d8481ed6d49 54 } else
kenbumono 0:8d8481ed6d49 55 break;
kenbumono 0:8d8481ed6d49 56 }
kenbumono 0:8d8481ed6d49 57 //hci->delete_link_keys();
kenbumono 0:8d8481ed6d49 58 unsigned char *p = &param[1];
kenbumono 0:8d8481ed6d49 59 for (list<item>::iterator i = keys.begin(); i != keys.end() && n<maxkey; i++, n++) {
kenbumono 0:8d8481ed6d49 60 memcpy(p, &(*i).a, sizeof(BD_ADDR));
kenbumono 0:8d8481ed6d49 61 p += sizeof(BD_ADDR);
kenbumono 0:8d8481ed6d49 62 memcpy(p, (*i).lk, lksize);
kenbumono 0:8d8481ed6d49 63 p += lksize;
kenbumono 0:8d8481ed6d49 64 }
kenbumono 0:8d8481ed6d49 65 param[0] = n;
kenbumono 0:8d8481ed6d49 66 if (n > 0)
kenbumono 0:8d8481ed6d49 67 write_link_keys(param);
kenbumono 0:8d8481ed6d49 68 }
kenbumono 0:8d8481ed6d49 69