BTstack Bluetooth stack

Dependencies:   mbed USBHost

USBホストライブラリを変更しました。

  • Bluetoothマウス(VGP-BMS33)での動作を確認しました。mouse_demo.cpp
Committer:
va009039
Date:
Fri Mar 22 22:35:57 2013 +0000
Revision:
2:871b41f4789e
Parent:
0:1ed23ab1345f
change to single thread

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 0:1ed23ab1345f 1 /*
va009039 0:1ed23ab1345f 2 * Copyright (C) 2009-2012 by Matthias Ringwald
va009039 0:1ed23ab1345f 3 *
va009039 0:1ed23ab1345f 4 * Redistribution and use in source and binary forms, with or without
va009039 0:1ed23ab1345f 5 * modification, are permitted provided that the following conditions
va009039 0:1ed23ab1345f 6 * are met:
va009039 0:1ed23ab1345f 7 *
va009039 0:1ed23ab1345f 8 * 1. Redistributions of source code must retain the above copyright
va009039 0:1ed23ab1345f 9 * notice, this list of conditions and the following disclaimer.
va009039 0:1ed23ab1345f 10 * 2. Redistributions in binary form must reproduce the above copyright
va009039 0:1ed23ab1345f 11 * notice, this list of conditions and the following disclaimer in the
va009039 0:1ed23ab1345f 12 * documentation and/or other materials provided with the distribution.
va009039 0:1ed23ab1345f 13 * 3. Neither the name of the copyright holders nor the names of
va009039 0:1ed23ab1345f 14 * contributors may be used to endorse or promote products derived
va009039 0:1ed23ab1345f 15 * from this software without specific prior written permission.
va009039 0:1ed23ab1345f 16 * 4. Any redistribution, use, or modification is done solely for
va009039 0:1ed23ab1345f 17 * personal benefit and not for any commercial purpose or for
va009039 0:1ed23ab1345f 18 * monetary gain.
va009039 0:1ed23ab1345f 19 *
va009039 0:1ed23ab1345f 20 * THIS SOFTWARE IS PROVIDED BY MATTHIAS RINGWALD AND CONTRIBUTORS
va009039 0:1ed23ab1345f 21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
va009039 0:1ed23ab1345f 22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
va009039 0:1ed23ab1345f 23 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS
va009039 0:1ed23ab1345f 24 * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
va009039 0:1ed23ab1345f 25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
va009039 0:1ed23ab1345f 26 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
va009039 0:1ed23ab1345f 27 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
va009039 0:1ed23ab1345f 28 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
va009039 0:1ed23ab1345f 29 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
va009039 0:1ed23ab1345f 30 * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
va009039 0:1ed23ab1345f 31 * SUCH DAMAGE.
va009039 0:1ed23ab1345f 32 *
va009039 0:1ed23ab1345f 33 * Please inquire about commercial licensing options at btstack@ringwald.ch
va009039 0:1ed23ab1345f 34 *
va009039 0:1ed23ab1345f 35 */
va009039 0:1ed23ab1345f 36
va009039 0:1ed23ab1345f 37 /*
va009039 0:1ed23ab1345f 38 * run_loop_embedded.c
va009039 0:1ed23ab1345f 39 *
va009039 0:1ed23ab1345f 40 * For this run loop, we assume that there's no global way to wait for a list
va009039 0:1ed23ab1345f 41 * of data sources to get ready. Instead, each data source has to queried
va009039 0:1ed23ab1345f 42 * individually. Calling ds->isReady() before calling ds->process() doesn't
va009039 0:1ed23ab1345f 43 * make sense, so we just poll each data source round robin.
va009039 0:1ed23ab1345f 44 *
va009039 0:1ed23ab1345f 45 * To support an idle state, where an MCU could go to sleep, the process function
va009039 0:1ed23ab1345f 46 * has to return if it has to called again as soon as possible
va009039 0:1ed23ab1345f 47 *
va009039 0:1ed23ab1345f 48 * After calling process() on every data source and evaluating the pending timers,
va009039 0:1ed23ab1345f 49 * the idle hook gets called if no data source did indicate that it needs to be
va009039 0:1ed23ab1345f 50 * called right away.
va009039 0:1ed23ab1345f 51 *
va009039 0:1ed23ab1345f 52 */
va009039 0:1ed23ab1345f 53
va009039 0:1ed23ab1345f 54
va009039 0:1ed23ab1345f 55 #include <btstack/run_loop.h>
va009039 0:1ed23ab1345f 56 #include <btstack/linked_list.h>
va009039 0:1ed23ab1345f 57 #include <btstack/hal_tick.h>
va009039 0:1ed23ab1345f 58 #include <btstack/hal_cpu.h>
va009039 0:1ed23ab1345f 59
va009039 0:1ed23ab1345f 60 #include "run_loop_private.h"
va009039 0:1ed23ab1345f 61 #include "debug.h"
va009039 0:1ed23ab1345f 62
va009039 0:1ed23ab1345f 63 #include <stddef.h> // NULL
va009039 0:1ed23ab1345f 64
va009039 0:1ed23ab1345f 65 // the run loop
va009039 0:1ed23ab1345f 66 static linked_list_t data_sources;
va009039 0:1ed23ab1345f 67
va009039 0:1ed23ab1345f 68 static linked_list_t timers;
va009039 0:1ed23ab1345f 69
va009039 0:1ed23ab1345f 70 #ifdef HAVE_TICK
va009039 0:1ed23ab1345f 71 static uint32_t system_ticks;
va009039 0:1ed23ab1345f 72 #endif
va009039 0:1ed23ab1345f 73
va009039 0:1ed23ab1345f 74 static int trigger_event_received = 0;
va009039 0:1ed23ab1345f 75
va009039 0:1ed23ab1345f 76 /**
va009039 0:1ed23ab1345f 77 * trigger run loop iteration
va009039 0:1ed23ab1345f 78 */
va009039 0:1ed23ab1345f 79 void embedded_trigger(void){
va009039 0:1ed23ab1345f 80 trigger_event_received = 1;
va009039 0:1ed23ab1345f 81 }
va009039 0:1ed23ab1345f 82
va009039 0:1ed23ab1345f 83 /**
va009039 0:1ed23ab1345f 84 * Add data_source to run_loop
va009039 0:1ed23ab1345f 85 */
va009039 0:1ed23ab1345f 86 void embedded_add_data_source(data_source_t *ds){
va009039 0:1ed23ab1345f 87 linked_list_add(&data_sources, (linked_item_t *) ds);
va009039 0:1ed23ab1345f 88 }
va009039 0:1ed23ab1345f 89
va009039 0:1ed23ab1345f 90 /**
va009039 0:1ed23ab1345f 91 * Remove data_source from run loop
va009039 0:1ed23ab1345f 92 */
va009039 0:1ed23ab1345f 93 int embedded_remove_data_source(data_source_t *ds){
va009039 0:1ed23ab1345f 94 return linked_list_remove(&data_sources, (linked_item_t *) ds);
va009039 0:1ed23ab1345f 95 }
va009039 0:1ed23ab1345f 96
va009039 0:1ed23ab1345f 97 /**
va009039 0:1ed23ab1345f 98 * Add timer to run_loop (keep list sorted)
va009039 0:1ed23ab1345f 99 */
va009039 0:1ed23ab1345f 100 void embedded_add_timer(timer_source_t *ts){
va009039 0:1ed23ab1345f 101 #ifdef HAVE_TICK
va009039 0:1ed23ab1345f 102 linked_item_t *it;
va009039 0:1ed23ab1345f 103 for (it = (linked_item_t *) &timers; it->next ; it = it->next){
va009039 0:1ed23ab1345f 104 if (ts->timeout < ((timer_source_t *) it->next)->timeout) {
va009039 0:1ed23ab1345f 105 break;
va009039 0:1ed23ab1345f 106 }
va009039 0:1ed23ab1345f 107 }
va009039 0:1ed23ab1345f 108 ts->item.next = it->next;
va009039 0:1ed23ab1345f 109 it->next = (linked_item_t *) ts;
va009039 0:1ed23ab1345f 110 // log_info("Added timer %x at %u\n", (int) ts, (unsigned int) ts->timeout.tv_sec);
va009039 0:1ed23ab1345f 111 // embedded_dump_timer();
va009039 0:1ed23ab1345f 112 #endif
va009039 0:1ed23ab1345f 113 }
va009039 0:1ed23ab1345f 114
va009039 0:1ed23ab1345f 115 /**
va009039 0:1ed23ab1345f 116 * Remove timer from run loop
va009039 0:1ed23ab1345f 117 */
va009039 0:1ed23ab1345f 118 int embedded_remove_timer(timer_source_t *ts){
va009039 0:1ed23ab1345f 119 #ifdef HAVE_TICK
va009039 0:1ed23ab1345f 120 // log_info("Removed timer %x at %u\n", (int) ts, (unsigned int) ts->timeout.tv_sec);
va009039 0:1ed23ab1345f 121 return linked_list_remove(&timers, (linked_item_t *) ts);
va009039 0:1ed23ab1345f 122 #else
va009039 0:1ed23ab1345f 123 return 0;
va009039 0:1ed23ab1345f 124 #endif
va009039 0:1ed23ab1345f 125 }
va009039 0:1ed23ab1345f 126
va009039 0:1ed23ab1345f 127 void embedded_dump_timer(void){
va009039 0:1ed23ab1345f 128 #ifdef HAVE_TICK
va009039 0:1ed23ab1345f 129 #ifdef ENABLE_LOG_INFO
va009039 0:1ed23ab1345f 130 linked_item_t *it;
va009039 0:1ed23ab1345f 131 int i = 0;
va009039 0:1ed23ab1345f 132 for (it = (linked_item_t *) timers; it ; it = it->next){
va009039 0:1ed23ab1345f 133 timer_source_t *ts = (timer_source_t*) it;
va009039 0:1ed23ab1345f 134 log_info("timer %u, timeout %u\n", i, (unsigned int) ts->timeout);
va009039 0:1ed23ab1345f 135 }
va009039 0:1ed23ab1345f 136 #endif
va009039 0:1ed23ab1345f 137 #endif
va009039 0:1ed23ab1345f 138 }
va009039 0:1ed23ab1345f 139
va009039 0:1ed23ab1345f 140 /**
va009039 0:1ed23ab1345f 141 * Execute run_loop
va009039 0:1ed23ab1345f 142 */
va009039 0:1ed23ab1345f 143 void embedded_execute(void) {
va009039 0:1ed23ab1345f 144 data_source_t *ds;
va009039 0:1ed23ab1345f 145
va009039 0:1ed23ab1345f 146 while (1) {
va009039 0:1ed23ab1345f 147
va009039 0:1ed23ab1345f 148 // process data sources
va009039 0:1ed23ab1345f 149 data_source_t *next;
va009039 0:1ed23ab1345f 150 for (ds = (data_source_t *) data_sources; ds != NULL ; ds = next){
va009039 0:1ed23ab1345f 151 next = (data_source_t *) ds->item.next; // cache pointer to next data_source to allow data source to remove itself
va009039 0:1ed23ab1345f 152 ds->process(ds);
va009039 0:1ed23ab1345f 153 }
va009039 0:1ed23ab1345f 154
va009039 0:1ed23ab1345f 155 #ifdef HAVE_TICK
va009039 0:1ed23ab1345f 156 // process timers
va009039 0:1ed23ab1345f 157 while (timers) {
va009039 0:1ed23ab1345f 158 timer_source_t *ts = (timer_source_t *) timers;
va009039 0:1ed23ab1345f 159 if (ts->timeout > system_ticks) break;
va009039 0:1ed23ab1345f 160 run_loop_remove_timer(ts);
va009039 0:1ed23ab1345f 161 ts->process(ts);
va009039 0:1ed23ab1345f 162 }
va009039 0:1ed23ab1345f 163 #endif
va009039 0:1ed23ab1345f 164
va009039 0:1ed23ab1345f 165 // disable IRQs and check if run loop iteration has been requested. if not, go to sleep
va009039 0:1ed23ab1345f 166 hal_cpu_disable_irqs();
va009039 0:1ed23ab1345f 167 if (trigger_event_received){
va009039 0:1ed23ab1345f 168 hal_cpu_enable_irqs_and_sleep();
va009039 0:1ed23ab1345f 169 continue;
va009039 0:1ed23ab1345f 170 }
va009039 0:1ed23ab1345f 171 hal_cpu_enable_irqs();
va009039 0:1ed23ab1345f 172 }
va009039 0:1ed23ab1345f 173 }
va009039 0:1ed23ab1345f 174
va009039 0:1ed23ab1345f 175 #ifdef HAVE_TICK
va009039 0:1ed23ab1345f 176 static void embedded_tick_handler(void){
va009039 0:1ed23ab1345f 177 system_ticks++;
va009039 0:1ed23ab1345f 178 trigger_event_received = 1;
va009039 0:1ed23ab1345f 179 }
va009039 0:1ed23ab1345f 180
va009039 0:1ed23ab1345f 181 uint32_t embedded_get_ticks(void){
va009039 0:1ed23ab1345f 182 return system_ticks;
va009039 0:1ed23ab1345f 183 }
va009039 0:1ed23ab1345f 184
va009039 0:1ed23ab1345f 185 uint32_t embedded_ticks_for_ms(uint32_t time_in_ms){
va009039 0:1ed23ab1345f 186 return time_in_ms / hal_tick_get_tick_period_in_ms();
va009039 0:1ed23ab1345f 187 }
va009039 0:1ed23ab1345f 188
va009039 0:1ed23ab1345f 189 // set timer
va009039 0:1ed23ab1345f 190 void run_loop_set_timer(timer_source_t *ts, uint32_t timeout_in_ms){
va009039 0:1ed23ab1345f 191 uint32_t ticks = embedded_ticks_for_ms(timeout_in_ms);
va009039 0:1ed23ab1345f 192 if (ticks == 0) ticks++;
va009039 0:1ed23ab1345f 193 ts->timeout = system_ticks + ticks;
va009039 0:1ed23ab1345f 194 }
va009039 0:1ed23ab1345f 195 #endif
va009039 0:1ed23ab1345f 196
va009039 0:1ed23ab1345f 197 void embedded_init(void){
va009039 0:1ed23ab1345f 198
va009039 0:1ed23ab1345f 199 data_sources = NULL;
va009039 0:1ed23ab1345f 200
va009039 0:1ed23ab1345f 201 #ifdef HAVE_TICK
va009039 0:1ed23ab1345f 202 timers = NULL;
va009039 0:1ed23ab1345f 203 system_ticks = 0;
va009039 0:1ed23ab1345f 204 hal_tick_init();
va009039 0:1ed23ab1345f 205 hal_tick_set_handler(&embedded_tick_handler);
va009039 0:1ed23ab1345f 206 #endif
va009039 0:1ed23ab1345f 207 }
va009039 0:1ed23ab1345f 208
va009039 0:1ed23ab1345f 209 extern const run_loop_t run_loop_embedded;
va009039 0:1ed23ab1345f 210 const run_loop_t run_loop_embedded = {
va009039 0:1ed23ab1345f 211 &embedded_init,
va009039 0:1ed23ab1345f 212 &embedded_add_data_source,
va009039 0:1ed23ab1345f 213 &embedded_remove_data_source,
va009039 0:1ed23ab1345f 214 &embedded_add_timer,
va009039 0:1ed23ab1345f 215 &embedded_remove_timer,
va009039 0:1ed23ab1345f 216 &embedded_execute,
va009039 0:1ed23ab1345f 217 &embedded_dump_timer
va009039 0:1ed23ab1345f 218 };