BTstack for Nucleo F401RE/FRDM-KL46Z example program

Dependencies:   F401RE-USBHost mbed

The usage is the same as KL46Z-BTstack_example.
使い方はKL46Z-BTstack_exampleと同じです。
/media/uploads/va009039/f401re-btstack.jpg

Committer:
va009039
Date:
Mon Jun 09 09:03:25 2014 +0000
Revision:
0:a05a07cd6fdf
first commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 0:a05a07cd6fdf 1 /*
va009039 0:a05a07cd6fdf 2 * Copyright (C) 2009-2012 by Matthias Ringwald
va009039 0:a05a07cd6fdf 3 *
va009039 0:a05a07cd6fdf 4 * Redistribution and use in source and binary forms, with or without
va009039 0:a05a07cd6fdf 5 * modification, are permitted provided that the following conditions
va009039 0:a05a07cd6fdf 6 * are met:
va009039 0:a05a07cd6fdf 7 *
va009039 0:a05a07cd6fdf 8 * 1. Redistributions of source code must retain the above copyright
va009039 0:a05a07cd6fdf 9 * notice, this list of conditions and the following disclaimer.
va009039 0:a05a07cd6fdf 10 * 2. Redistributions in binary form must reproduce the above copyright
va009039 0:a05a07cd6fdf 11 * notice, this list of conditions and the following disclaimer in the
va009039 0:a05a07cd6fdf 12 * documentation and/or other materials provided with the distribution.
va009039 0:a05a07cd6fdf 13 * 3. Neither the name of the copyright holders nor the names of
va009039 0:a05a07cd6fdf 14 * contributors may be used to endorse or promote products derived
va009039 0:a05a07cd6fdf 15 * from this software without specific prior written permission.
va009039 0:a05a07cd6fdf 16 * 4. Any redistribution, use, or modification is done solely for
va009039 0:a05a07cd6fdf 17 * personal benefit and not for any commercial purpose or for
va009039 0:a05a07cd6fdf 18 * monetary gain.
va009039 0:a05a07cd6fdf 19 *
va009039 0:a05a07cd6fdf 20 * THIS SOFTWARE IS PROVIDED BY MATTHIAS RINGWALD AND CONTRIBUTORS
va009039 0:a05a07cd6fdf 21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
va009039 0:a05a07cd6fdf 22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
va009039 0:a05a07cd6fdf 23 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS
va009039 0:a05a07cd6fdf 24 * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
va009039 0:a05a07cd6fdf 25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
va009039 0:a05a07cd6fdf 26 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
va009039 0:a05a07cd6fdf 27 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
va009039 0:a05a07cd6fdf 28 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
va009039 0:a05a07cd6fdf 29 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
va009039 0:a05a07cd6fdf 30 * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
va009039 0:a05a07cd6fdf 31 * SUCH DAMAGE.
va009039 0:a05a07cd6fdf 32 *
va009039 0:a05a07cd6fdf 33 * Please inquire about commercial licensing options at btstack@ringwald.ch
va009039 0:a05a07cd6fdf 34 *
va009039 0:a05a07cd6fdf 35 */
va009039 0:a05a07cd6fdf 36
va009039 0:a05a07cd6fdf 37 #include <string.h>
va009039 0:a05a07cd6fdf 38 #include <stdlib.h>
va009039 0:a05a07cd6fdf 39
va009039 0:a05a07cd6fdf 40 #include "remote_device_db.h"
va009039 0:a05a07cd6fdf 41 #include "btstack_memory.h"
va009039 0:a05a07cd6fdf 42 #include "debug.h"
va009039 0:a05a07cd6fdf 43
va009039 0:a05a07cd6fdf 44 #include <btstack/utils.h>
va009039 0:a05a07cd6fdf 45 #include <btstack/linked_list.h>
va009039 0:a05a07cd6fdf 46
va009039 0:a05a07cd6fdf 47 // This lists should be only accessed by tests.
va009039 0:a05a07cd6fdf 48 linked_list_t db_mem_link_keys = NULL;
va009039 0:a05a07cd6fdf 49 linked_list_t db_mem_names = NULL;
va009039 0:a05a07cd6fdf 50 static linked_list_t db_mem_services = NULL;
va009039 0:a05a07cd6fdf 51
va009039 0:a05a07cd6fdf 52 // Device info
va009039 0:a05a07cd6fdf 53 static void db_open(void){
va009039 0:a05a07cd6fdf 54 }
va009039 0:a05a07cd6fdf 55
va009039 0:a05a07cd6fdf 56 static void db_close(void){
va009039 0:a05a07cd6fdf 57 }
va009039 0:a05a07cd6fdf 58
va009039 0:a05a07cd6fdf 59 static db_mem_device_t * get_item(linked_list_t list, bd_addr_t *bd_addr) {
va009039 0:a05a07cd6fdf 60 linked_item_t *it;
va009039 0:a05a07cd6fdf 61 for (it = (linked_item_t *) list; it ; it = it->next){
va009039 0:a05a07cd6fdf 62 db_mem_device_t * item = (db_mem_device_t *) it;
va009039 0:a05a07cd6fdf 63 if (BD_ADDR_CMP(item->bd_addr, *bd_addr) == 0) {
va009039 0:a05a07cd6fdf 64 return item;
va009039 0:a05a07cd6fdf 65 }
va009039 0:a05a07cd6fdf 66 }
va009039 0:a05a07cd6fdf 67 return NULL;
va009039 0:a05a07cd6fdf 68 }
va009039 0:a05a07cd6fdf 69
va009039 0:a05a07cd6fdf 70 static int get_name(bd_addr_t *bd_addr, device_name_t *device_name) {
va009039 0:a05a07cd6fdf 71 db_mem_device_name_t * item = (db_mem_device_name_t *) get_item(db_mem_names, bd_addr);
va009039 0:a05a07cd6fdf 72
va009039 0:a05a07cd6fdf 73 if (!item) return 0;
va009039 0:a05a07cd6fdf 74
va009039 0:a05a07cd6fdf 75 strncpy((char*)device_name, item->device_name, MAX_NAME_LEN);
va009039 0:a05a07cd6fdf 76
va009039 0:a05a07cd6fdf 77 linked_list_remove(&db_mem_names, (linked_item_t *) item);
va009039 0:a05a07cd6fdf 78 linked_list_add(&db_mem_names, (linked_item_t *) item);
va009039 0:a05a07cd6fdf 79
va009039 0:a05a07cd6fdf 80 return 1;
va009039 0:a05a07cd6fdf 81 }
va009039 0:a05a07cd6fdf 82
va009039 0:a05a07cd6fdf 83 static int get_link_key(bd_addr_t *bd_addr, link_key_t *link_key) {
va009039 0:a05a07cd6fdf 84 db_mem_device_link_key_t * item = (db_mem_device_link_key_t *) get_item(db_mem_link_keys, bd_addr);
va009039 0:a05a07cd6fdf 85
va009039 0:a05a07cd6fdf 86 if (!item) return 0;
va009039 0:a05a07cd6fdf 87
va009039 0:a05a07cd6fdf 88 memcpy(link_key, item->link_key, LINK_KEY_LEN);
va009039 0:a05a07cd6fdf 89
va009039 0:a05a07cd6fdf 90 linked_list_remove(&db_mem_link_keys, (linked_item_t *) item);
va009039 0:a05a07cd6fdf 91 linked_list_add(&db_mem_link_keys, (linked_item_t *) item);
va009039 0:a05a07cd6fdf 92
va009039 0:a05a07cd6fdf 93 return 1;
va009039 0:a05a07cd6fdf 94 }
va009039 0:a05a07cd6fdf 95
va009039 0:a05a07cd6fdf 96 static void delete_link_key(bd_addr_t *bd_addr){
va009039 0:a05a07cd6fdf 97 db_mem_device_t * item = get_item(db_mem_link_keys, bd_addr);
va009039 0:a05a07cd6fdf 98
va009039 0:a05a07cd6fdf 99 if (!item) return;
va009039 0:a05a07cd6fdf 100
va009039 0:a05a07cd6fdf 101 linked_list_remove(&db_mem_link_keys, (linked_item_t *) item);
va009039 0:a05a07cd6fdf 102 btstack_memory_db_mem_device_link_key_free(item);
va009039 0:a05a07cd6fdf 103 }
va009039 0:a05a07cd6fdf 104
va009039 0:a05a07cd6fdf 105
va009039 0:a05a07cd6fdf 106 static void put_link_key(bd_addr_t *bd_addr, link_key_t *link_key){
va009039 0:a05a07cd6fdf 107 db_mem_device_link_key_t * existingRecord = (db_mem_device_link_key_t *) get_item(db_mem_link_keys, bd_addr);
va009039 0:a05a07cd6fdf 108
va009039 0:a05a07cd6fdf 109 if (existingRecord){
va009039 0:a05a07cd6fdf 110 memcpy(existingRecord->link_key, link_key, LINK_KEY_LEN);
va009039 0:a05a07cd6fdf 111 return;
va009039 0:a05a07cd6fdf 112 }
va009039 0:a05a07cd6fdf 113
va009039 0:a05a07cd6fdf 114 // Record not found, create new one for this device
va009039 0:a05a07cd6fdf 115 db_mem_device_link_key_t * newItem = (db_mem_device_link_key_t*) btstack_memory_db_mem_device_link_key_get();
va009039 0:a05a07cd6fdf 116 if (!newItem){
va009039 0:a05a07cd6fdf 117 newItem = (db_mem_device_link_key_t*)linked_list_get_last_item(&db_mem_link_keys);
va009039 0:a05a07cd6fdf 118 }
va009039 0:a05a07cd6fdf 119
va009039 0:a05a07cd6fdf 120 if (!newItem) return;
va009039 0:a05a07cd6fdf 121
va009039 0:a05a07cd6fdf 122 memcpy(newItem->device.bd_addr, bd_addr, sizeof(bd_addr_t));
va009039 0:a05a07cd6fdf 123 memcpy(newItem->link_key, link_key, LINK_KEY_LEN);
va009039 0:a05a07cd6fdf 124 linked_list_add(&db_mem_link_keys, (linked_item_t *) newItem);
va009039 0:a05a07cd6fdf 125 }
va009039 0:a05a07cd6fdf 126
va009039 0:a05a07cd6fdf 127 static void delete_name(bd_addr_t *bd_addr){
va009039 0:a05a07cd6fdf 128 db_mem_device_t * item = get_item(db_mem_names, bd_addr);
va009039 0:a05a07cd6fdf 129
va009039 0:a05a07cd6fdf 130 if (!item) return;
va009039 0:a05a07cd6fdf 131
va009039 0:a05a07cd6fdf 132 linked_list_remove(&db_mem_names, (linked_item_t *) item);
va009039 0:a05a07cd6fdf 133 btstack_memory_db_mem_device_name_free(item);
va009039 0:a05a07cd6fdf 134 }
va009039 0:a05a07cd6fdf 135
va009039 0:a05a07cd6fdf 136 static void put_name(bd_addr_t *bd_addr, device_name_t *device_name){
va009039 0:a05a07cd6fdf 137 db_mem_device_name_t * existingRecord = (db_mem_device_name_t *) get_item(db_mem_names, bd_addr);
va009039 0:a05a07cd6fdf 138
va009039 0:a05a07cd6fdf 139 if (existingRecord){
va009039 0:a05a07cd6fdf 140 strncpy(existingRecord->device_name, (const char*) device_name, MAX_NAME_LEN);
va009039 0:a05a07cd6fdf 141 return;
va009039 0:a05a07cd6fdf 142 }
va009039 0:a05a07cd6fdf 143
va009039 0:a05a07cd6fdf 144 // Record not found, create a new one for this device
va009039 0:a05a07cd6fdf 145 db_mem_device_name_t * newItem = (db_mem_device_name_t *) btstack_memory_db_mem_device_name_get();
va009039 0:a05a07cd6fdf 146 if (!newItem) {
va009039 0:a05a07cd6fdf 147 newItem = (db_mem_device_name_t*)linked_list_get_last_item(&db_mem_names);
va009039 0:a05a07cd6fdf 148 };
va009039 0:a05a07cd6fdf 149
va009039 0:a05a07cd6fdf 150 if (!newItem) return;
va009039 0:a05a07cd6fdf 151
va009039 0:a05a07cd6fdf 152 memcpy(newItem->device.bd_addr, bd_addr, sizeof(bd_addr_t));
va009039 0:a05a07cd6fdf 153 strncpy(newItem->device_name, (const char*) device_name, MAX_NAME_LEN);
va009039 0:a05a07cd6fdf 154 linked_list_add(&db_mem_names, (linked_item_t *) newItem);
va009039 0:a05a07cd6fdf 155 }
va009039 0:a05a07cd6fdf 156
va009039 0:a05a07cd6fdf 157
va009039 0:a05a07cd6fdf 158 // MARK: PERSISTENT RFCOMM CHANNEL ALLOCATION
va009039 0:a05a07cd6fdf 159
va009039 0:a05a07cd6fdf 160 static uint8_t persistent_rfcomm_channel(char *serviceName){
va009039 0:a05a07cd6fdf 161 linked_item_t *it;
va009039 0:a05a07cd6fdf 162 db_mem_service_t * item;
va009039 0:a05a07cd6fdf 163 uint8_t max_channel = 1;
va009039 0:a05a07cd6fdf 164
va009039 0:a05a07cd6fdf 165 for (it = (linked_item_t *) db_mem_services; it ; it = it->next){
va009039 0:a05a07cd6fdf 166 item = (db_mem_service_t *) it;
va009039 0:a05a07cd6fdf 167 if (strncmp(item->service_name, serviceName, MAX_NAME_LEN) == 0) {
va009039 0:a05a07cd6fdf 168 // Match found
va009039 0:a05a07cd6fdf 169 return item->channel;
va009039 0:a05a07cd6fdf 170 }
va009039 0:a05a07cd6fdf 171
va009039 0:a05a07cd6fdf 172 // TODO prevent overflow
va009039 0:a05a07cd6fdf 173 if (item->channel >= max_channel) max_channel = item->channel + 1;
va009039 0:a05a07cd6fdf 174 }
va009039 0:a05a07cd6fdf 175
va009039 0:a05a07cd6fdf 176 // Allocate new persistant channel
va009039 0:a05a07cd6fdf 177 db_mem_service_t * newItem = (db_mem_service_t *) btstack_memory_db_mem_service_get();
va009039 0:a05a07cd6fdf 178
va009039 0:a05a07cd6fdf 179 if (!newItem) return 0;
va009039 0:a05a07cd6fdf 180
va009039 0:a05a07cd6fdf 181 strncpy(newItem->service_name, serviceName, MAX_NAME_LEN);
va009039 0:a05a07cd6fdf 182 newItem->channel = max_channel;
va009039 0:a05a07cd6fdf 183 linked_list_add(&db_mem_services, (linked_item_t *) newItem);
va009039 0:a05a07cd6fdf 184 return max_channel;
va009039 0:a05a07cd6fdf 185 }
va009039 0:a05a07cd6fdf 186
va009039 0:a05a07cd6fdf 187
va009039 0:a05a07cd6fdf 188 const remote_device_db_t remote_device_db_memory = {
va009039 0:a05a07cd6fdf 189 db_open,
va009039 0:a05a07cd6fdf 190 db_close,
va009039 0:a05a07cd6fdf 191 get_link_key,
va009039 0:a05a07cd6fdf 192 put_link_key,
va009039 0:a05a07cd6fdf 193 delete_link_key,
va009039 0:a05a07cd6fdf 194 get_name,
va009039 0:a05a07cd6fdf 195 put_name,
va009039 0:a05a07cd6fdf 196 delete_name,
va009039 0:a05a07cd6fdf 197 persistent_rfcomm_channel
va009039 0:a05a07cd6fdf 198 };