Junichi Katsu / Mbed 2 deprecated BLEControl

Dependencies:   FatFileSystem TB6612FNG2 mbed

Committer:
mbed_Cookbook_SE
Date:
Mon Nov 30 09:32:15 2015 +0000
Revision:
0:de03cbbcd0ff
??

Who changed what in which revision?

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