Generic communication interface between the wireless board (mote) and the sensor board. Any kind of sensor board can be connected to the mote using this specification given it provides a SPI peripheral, one input pin with interrupt capability and one digital output. The sensor board must implement a special register set from which all required information can be retrieved. Protocol: http://is.gd/wuQorh Github: http://is.gd/ySj1L9

Dependencies:   mbed-src

Committer:
marcelobarrosalmeida
Date:
Tue Apr 08 16:34:20 2014 +0000
Revision:
1:acdf490d94a7
Adding accel to sensor list

Who changed what in which revision?

UserRevisionLine numberNew contents of line
marcelobarrosalmeida 1:acdf490d94a7 1 /*
marcelobarrosalmeida 1:acdf490d94a7 2 * Copyright (c) 2004, Swedish Institute of Computer Science.
marcelobarrosalmeida 1:acdf490d94a7 3 * All rights reserved.
marcelobarrosalmeida 1:acdf490d94a7 4 *
marcelobarrosalmeida 1:acdf490d94a7 5 * Redistribution and use in source and binary forms, with or without
marcelobarrosalmeida 1:acdf490d94a7 6 * modification, are permitted provided that the following conditions
marcelobarrosalmeida 1:acdf490d94a7 7 * are met:
marcelobarrosalmeida 1:acdf490d94a7 8 * 1. Redistributions of source code must retain the above copyright
marcelobarrosalmeida 1:acdf490d94a7 9 * notice, this list of conditions and the following disclaimer.
marcelobarrosalmeida 1:acdf490d94a7 10 * 2. Redistributions in binary form must reproduce the above copyright
marcelobarrosalmeida 1:acdf490d94a7 11 * notice, this list of conditions and the following disclaimer in the
marcelobarrosalmeida 1:acdf490d94a7 12 * documentation and/or other materials provided with the distribution.
marcelobarrosalmeida 1:acdf490d94a7 13 * 3. Neither the name of the Institute nor the names of its contributors
marcelobarrosalmeida 1:acdf490d94a7 14 * may be used to endorse or promote products derived from this software
marcelobarrosalmeida 1:acdf490d94a7 15 * without specific prior written permission.
marcelobarrosalmeida 1:acdf490d94a7 16 *
marcelobarrosalmeida 1:acdf490d94a7 17 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
marcelobarrosalmeida 1:acdf490d94a7 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
marcelobarrosalmeida 1:acdf490d94a7 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
marcelobarrosalmeida 1:acdf490d94a7 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
marcelobarrosalmeida 1:acdf490d94a7 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
marcelobarrosalmeida 1:acdf490d94a7 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
marcelobarrosalmeida 1:acdf490d94a7 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
marcelobarrosalmeida 1:acdf490d94a7 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
marcelobarrosalmeida 1:acdf490d94a7 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
marcelobarrosalmeida 1:acdf490d94a7 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
marcelobarrosalmeida 1:acdf490d94a7 27 * SUCH DAMAGE.
marcelobarrosalmeida 1:acdf490d94a7 28 *
marcelobarrosalmeida 1:acdf490d94a7 29 * This file is part of the protothreads library.
marcelobarrosalmeida 1:acdf490d94a7 30 *
marcelobarrosalmeida 1:acdf490d94a7 31 * Author: Adam Dunkels <adam@sics.se>
marcelobarrosalmeida 1:acdf490d94a7 32 *
marcelobarrosalmeida 1:acdf490d94a7 33 * $Id: pt-sem.h,v 1.2 2005/02/24 10:36:59 adam Exp $
marcelobarrosalmeida 1:acdf490d94a7 34 */
marcelobarrosalmeida 1:acdf490d94a7 35
marcelobarrosalmeida 1:acdf490d94a7 36 /**
marcelobarrosalmeida 1:acdf490d94a7 37 * \addtogroup pt
marcelobarrosalmeida 1:acdf490d94a7 38 * @{
marcelobarrosalmeida 1:acdf490d94a7 39 */
marcelobarrosalmeida 1:acdf490d94a7 40
marcelobarrosalmeida 1:acdf490d94a7 41 /**
marcelobarrosalmeida 1:acdf490d94a7 42 * \defgroup ptsem Protothread semaphores
marcelobarrosalmeida 1:acdf490d94a7 43 * @{
marcelobarrosalmeida 1:acdf490d94a7 44 *
marcelobarrosalmeida 1:acdf490d94a7 45 * This module implements counting semaphores on top of
marcelobarrosalmeida 1:acdf490d94a7 46 * protothreads. Semaphores are a synchronization primitive that
marcelobarrosalmeida 1:acdf490d94a7 47 * provide two operations: "wait" and "signal". The "wait" operation
marcelobarrosalmeida 1:acdf490d94a7 48 * checks the semaphore counter and blocks the thread if the counter
marcelobarrosalmeida 1:acdf490d94a7 49 * is zero. The "signal" operation increases the semaphore counter but
marcelobarrosalmeida 1:acdf490d94a7 50 * does not block. If another thread has blocked waiting for the
marcelobarrosalmeida 1:acdf490d94a7 51 * semaphore that is signalled, the blocked thread will become
marcelobarrosalmeida 1:acdf490d94a7 52 * runnable again.
marcelobarrosalmeida 1:acdf490d94a7 53 *
marcelobarrosalmeida 1:acdf490d94a7 54 * Semaphores can be used to implement other, more structured,
marcelobarrosalmeida 1:acdf490d94a7 55 * synchronization primitives such as monitors and message
marcelobarrosalmeida 1:acdf490d94a7 56 * queues/bounded buffers (see below).
marcelobarrosalmeida 1:acdf490d94a7 57 *
marcelobarrosalmeida 1:acdf490d94a7 58 * The following example shows how the producer-consumer problem, also
marcelobarrosalmeida 1:acdf490d94a7 59 * known as the bounded buffer problem, can be solved using
marcelobarrosalmeida 1:acdf490d94a7 60 * protothreads and semaphores. Notes on the program follow after the
marcelobarrosalmeida 1:acdf490d94a7 61 * example.
marcelobarrosalmeida 1:acdf490d94a7 62 *
marcelobarrosalmeida 1:acdf490d94a7 63 \code
marcelobarrosalmeida 1:acdf490d94a7 64 #include "pt-sem.h"
marcelobarrosalmeida 1:acdf490d94a7 65
marcelobarrosalmeida 1:acdf490d94a7 66 #define NUM_ITEMS 32
marcelobarrosalmeida 1:acdf490d94a7 67 #define BUFSIZE 8
marcelobarrosalmeida 1:acdf490d94a7 68
marcelobarrosalmeida 1:acdf490d94a7 69 static struct pt_sem mutex, full, empty;
marcelobarrosalmeida 1:acdf490d94a7 70
marcelobarrosalmeida 1:acdf490d94a7 71 PT_THREAD(producer(struct pt *pt))
marcelobarrosalmeida 1:acdf490d94a7 72 {
marcelobarrosalmeida 1:acdf490d94a7 73 static int produced;
marcelobarrosalmeida 1:acdf490d94a7 74
marcelobarrosalmeida 1:acdf490d94a7 75 PT_BEGIN(pt);
marcelobarrosalmeida 1:acdf490d94a7 76
marcelobarrosalmeida 1:acdf490d94a7 77 for(produced = 0; produced < NUM_ITEMS; ++produced) {
marcelobarrosalmeida 1:acdf490d94a7 78
marcelobarrosalmeida 1:acdf490d94a7 79 PT_SEM_WAIT(pt, &full);
marcelobarrosalmeida 1:acdf490d94a7 80
marcelobarrosalmeida 1:acdf490d94a7 81 PT_SEM_WAIT(pt, &mutex);
marcelobarrosalmeida 1:acdf490d94a7 82 add_to_buffer(produce_item());
marcelobarrosalmeida 1:acdf490d94a7 83 PT_SEM_SIGNAL(pt, &mutex);
marcelobarrosalmeida 1:acdf490d94a7 84
marcelobarrosalmeida 1:acdf490d94a7 85 PT_SEM_SIGNAL(pt, &empty);
marcelobarrosalmeida 1:acdf490d94a7 86 }
marcelobarrosalmeida 1:acdf490d94a7 87
marcelobarrosalmeida 1:acdf490d94a7 88 PT_END(pt);
marcelobarrosalmeida 1:acdf490d94a7 89 }
marcelobarrosalmeida 1:acdf490d94a7 90
marcelobarrosalmeida 1:acdf490d94a7 91 PT_THREAD(consumer(struct pt *pt))
marcelobarrosalmeida 1:acdf490d94a7 92 {
marcelobarrosalmeida 1:acdf490d94a7 93 static int consumed;
marcelobarrosalmeida 1:acdf490d94a7 94
marcelobarrosalmeida 1:acdf490d94a7 95 PT_BEGIN(pt);
marcelobarrosalmeida 1:acdf490d94a7 96
marcelobarrosalmeida 1:acdf490d94a7 97 for(consumed = 0; consumed < NUM_ITEMS; ++consumed) {
marcelobarrosalmeida 1:acdf490d94a7 98
marcelobarrosalmeida 1:acdf490d94a7 99 PT_SEM_WAIT(pt, &empty);
marcelobarrosalmeida 1:acdf490d94a7 100
marcelobarrosalmeida 1:acdf490d94a7 101 PT_SEM_WAIT(pt, &mutex);
marcelobarrosalmeida 1:acdf490d94a7 102 consume_item(get_from_buffer());
marcelobarrosalmeida 1:acdf490d94a7 103 PT_SEM_SIGNAL(pt, &mutex);
marcelobarrosalmeida 1:acdf490d94a7 104
marcelobarrosalmeida 1:acdf490d94a7 105 PT_SEM_SIGNAL(pt, &full);
marcelobarrosalmeida 1:acdf490d94a7 106 }
marcelobarrosalmeida 1:acdf490d94a7 107
marcelobarrosalmeida 1:acdf490d94a7 108 PT_END(pt);
marcelobarrosalmeida 1:acdf490d94a7 109 }
marcelobarrosalmeida 1:acdf490d94a7 110
marcelobarrosalmeida 1:acdf490d94a7 111 PT_THREAD(driver_thread(struct pt *pt))
marcelobarrosalmeida 1:acdf490d94a7 112 {
marcelobarrosalmeida 1:acdf490d94a7 113 static struct pt pt_producer, pt_consumer;
marcelobarrosalmeida 1:acdf490d94a7 114
marcelobarrosalmeida 1:acdf490d94a7 115 PT_BEGIN(pt);
marcelobarrosalmeida 1:acdf490d94a7 116
marcelobarrosalmeida 1:acdf490d94a7 117 PT_SEM_INIT(&empty, 0);
marcelobarrosalmeida 1:acdf490d94a7 118 PT_SEM_INIT(&full, BUFSIZE);
marcelobarrosalmeida 1:acdf490d94a7 119 PT_SEM_INIT(&mutex, 1);
marcelobarrosalmeida 1:acdf490d94a7 120
marcelobarrosalmeida 1:acdf490d94a7 121 PT_INIT(&pt_producer);
marcelobarrosalmeida 1:acdf490d94a7 122 PT_INIT(&pt_consumer);
marcelobarrosalmeida 1:acdf490d94a7 123
marcelobarrosalmeida 1:acdf490d94a7 124 PT_WAIT_THREAD(pt, producer(&pt_producer) &
marcelobarrosalmeida 1:acdf490d94a7 125 consumer(&pt_consumer));
marcelobarrosalmeida 1:acdf490d94a7 126
marcelobarrosalmeida 1:acdf490d94a7 127 PT_END(pt);
marcelobarrosalmeida 1:acdf490d94a7 128 }
marcelobarrosalmeida 1:acdf490d94a7 129 \endcode
marcelobarrosalmeida 1:acdf490d94a7 130 *
marcelobarrosalmeida 1:acdf490d94a7 131 * The program uses three protothreads: one protothread that
marcelobarrosalmeida 1:acdf490d94a7 132 * implements the consumer, one thread that implements the producer,
marcelobarrosalmeida 1:acdf490d94a7 133 * and one protothread that drives the two other protothreads. The
marcelobarrosalmeida 1:acdf490d94a7 134 * program uses three semaphores: "full", "empty" and "mutex". The
marcelobarrosalmeida 1:acdf490d94a7 135 * "mutex" semaphore is used to provide mutual exclusion for the
marcelobarrosalmeida 1:acdf490d94a7 136 * buffer, the "empty" semaphore is used to block the consumer is the
marcelobarrosalmeida 1:acdf490d94a7 137 * buffer is empty, and the "full" semaphore is used to block the
marcelobarrosalmeida 1:acdf490d94a7 138 * producer is the buffer is full.
marcelobarrosalmeida 1:acdf490d94a7 139 *
marcelobarrosalmeida 1:acdf490d94a7 140 * The "driver_thread" holds two protothread state variables,
marcelobarrosalmeida 1:acdf490d94a7 141 * "pt_producer" and "pt_consumer". It is important to note that both
marcelobarrosalmeida 1:acdf490d94a7 142 * these variables are declared as <i>static</i>. If the static
marcelobarrosalmeida 1:acdf490d94a7 143 * keyword is not used, both variables are stored on the stack. Since
marcelobarrosalmeida 1:acdf490d94a7 144 * protothreads do not store the stack, these variables may be
marcelobarrosalmeida 1:acdf490d94a7 145 * overwritten during a protothread wait operation. Similarly, both
marcelobarrosalmeida 1:acdf490d94a7 146 * the "consumer" and "producer" protothreads declare their local
marcelobarrosalmeida 1:acdf490d94a7 147 * variables as static, to avoid them being stored on the stack.
marcelobarrosalmeida 1:acdf490d94a7 148 *
marcelobarrosalmeida 1:acdf490d94a7 149 *
marcelobarrosalmeida 1:acdf490d94a7 150 */
marcelobarrosalmeida 1:acdf490d94a7 151
marcelobarrosalmeida 1:acdf490d94a7 152 /**
marcelobarrosalmeida 1:acdf490d94a7 153 * \file
marcelobarrosalmeida 1:acdf490d94a7 154 * Couting semaphores implemented on protothreads
marcelobarrosalmeida 1:acdf490d94a7 155 * \author
marcelobarrosalmeida 1:acdf490d94a7 156 * Adam Dunkels <adam@sics.se>
marcelobarrosalmeida 1:acdf490d94a7 157 *
marcelobarrosalmeida 1:acdf490d94a7 158 */
marcelobarrosalmeida 1:acdf490d94a7 159
marcelobarrosalmeida 1:acdf490d94a7 160 #ifndef __PT_SEM_H__
marcelobarrosalmeida 1:acdf490d94a7 161 #define __PT_SEM_H__
marcelobarrosalmeida 1:acdf490d94a7 162
marcelobarrosalmeida 1:acdf490d94a7 163 #include "pt.h"
marcelobarrosalmeida 1:acdf490d94a7 164
marcelobarrosalmeida 1:acdf490d94a7 165 struct pt_sem {
marcelobarrosalmeida 1:acdf490d94a7 166 unsigned int count;
marcelobarrosalmeida 1:acdf490d94a7 167 };
marcelobarrosalmeida 1:acdf490d94a7 168
marcelobarrosalmeida 1:acdf490d94a7 169 /**
marcelobarrosalmeida 1:acdf490d94a7 170 * Initialize a semaphore
marcelobarrosalmeida 1:acdf490d94a7 171 *
marcelobarrosalmeida 1:acdf490d94a7 172 * This macro initializes a semaphore with a value for the
marcelobarrosalmeida 1:acdf490d94a7 173 * counter. Internally, the semaphores use an "unsigned int" to
marcelobarrosalmeida 1:acdf490d94a7 174 * represent the counter, and therefore the "count" argument should be
marcelobarrosalmeida 1:acdf490d94a7 175 * within range of an unsigned int.
marcelobarrosalmeida 1:acdf490d94a7 176 *
marcelobarrosalmeida 1:acdf490d94a7 177 * \param s (struct pt_sem *) A pointer to the pt_sem struct
marcelobarrosalmeida 1:acdf490d94a7 178 * representing the semaphore
marcelobarrosalmeida 1:acdf490d94a7 179 *
marcelobarrosalmeida 1:acdf490d94a7 180 * \param c (unsigned int) The initial count of the semaphore.
marcelobarrosalmeida 1:acdf490d94a7 181 * \hideinitializer
marcelobarrosalmeida 1:acdf490d94a7 182 */
marcelobarrosalmeida 1:acdf490d94a7 183 #define PT_SEM_INIT(s, c) (s)->count = c
marcelobarrosalmeida 1:acdf490d94a7 184
marcelobarrosalmeida 1:acdf490d94a7 185 /**
marcelobarrosalmeida 1:acdf490d94a7 186 * Wait for a semaphore
marcelobarrosalmeida 1:acdf490d94a7 187 *
marcelobarrosalmeida 1:acdf490d94a7 188 * This macro carries out the "wait" operation on the semaphore. The
marcelobarrosalmeida 1:acdf490d94a7 189 * wait operation causes the protothread to block while the counter is
marcelobarrosalmeida 1:acdf490d94a7 190 * zero. When the counter reaches a value larger than zero, the
marcelobarrosalmeida 1:acdf490d94a7 191 * protothread will continue.
marcelobarrosalmeida 1:acdf490d94a7 192 *
marcelobarrosalmeida 1:acdf490d94a7 193 * \param pt (struct pt *) A pointer to the protothread (struct pt) in
marcelobarrosalmeida 1:acdf490d94a7 194 * which the operation is executed.
marcelobarrosalmeida 1:acdf490d94a7 195 *
marcelobarrosalmeida 1:acdf490d94a7 196 * \param s (struct pt_sem *) A pointer to the pt_sem struct
marcelobarrosalmeida 1:acdf490d94a7 197 * representing the semaphore
marcelobarrosalmeida 1:acdf490d94a7 198 *
marcelobarrosalmeida 1:acdf490d94a7 199 * \hideinitializer
marcelobarrosalmeida 1:acdf490d94a7 200 */
marcelobarrosalmeida 1:acdf490d94a7 201 #define PT_SEM_WAIT(pt, s) \
marcelobarrosalmeida 1:acdf490d94a7 202 do { \
marcelobarrosalmeida 1:acdf490d94a7 203 PT_WAIT_UNTIL(pt, (s)->count > 0); \
marcelobarrosalmeida 1:acdf490d94a7 204 --(s)->count; \
marcelobarrosalmeida 1:acdf490d94a7 205 } while(0)
marcelobarrosalmeida 1:acdf490d94a7 206
marcelobarrosalmeida 1:acdf490d94a7 207 /**
marcelobarrosalmeida 1:acdf490d94a7 208 * Signal a semaphore
marcelobarrosalmeida 1:acdf490d94a7 209 *
marcelobarrosalmeida 1:acdf490d94a7 210 * This macro carries out the "signal" operation on the semaphore. The
marcelobarrosalmeida 1:acdf490d94a7 211 * signal operation increments the counter inside the semaphore, which
marcelobarrosalmeida 1:acdf490d94a7 212 * eventually will cause waiting protothreads to continue executing.
marcelobarrosalmeida 1:acdf490d94a7 213 *
marcelobarrosalmeida 1:acdf490d94a7 214 * \param pt (struct pt *) A pointer to the protothread (struct pt) in
marcelobarrosalmeida 1:acdf490d94a7 215 * which the operation is executed.
marcelobarrosalmeida 1:acdf490d94a7 216 *
marcelobarrosalmeida 1:acdf490d94a7 217 * \param s (struct pt_sem *) A pointer to the pt_sem struct
marcelobarrosalmeida 1:acdf490d94a7 218 * representing the semaphore
marcelobarrosalmeida 1:acdf490d94a7 219 *
marcelobarrosalmeida 1:acdf490d94a7 220 * \hideinitializer
marcelobarrosalmeida 1:acdf490d94a7 221 */
marcelobarrosalmeida 1:acdf490d94a7 222 #define PT_SEM_SIGNAL(pt, s) ++(s)->count
marcelobarrosalmeida 1:acdf490d94a7 223
marcelobarrosalmeida 1:acdf490d94a7 224 #endif /* __PT_SEM_H__ */
marcelobarrosalmeida 1:acdf490d94a7 225
marcelobarrosalmeida 1:acdf490d94a7 226 /** @} */
marcelobarrosalmeida 1:acdf490d94a7 227 /** @} */
marcelobarrosalmeida 1:acdf490d94a7 228