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-2005, 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 Contiki operating system.
marcelobarrosalmeida 1:acdf490d94a7 30 *
marcelobarrosalmeida 1:acdf490d94a7 31 * Author: Adam Dunkels <adam@sics.se>
marcelobarrosalmeida 1:acdf490d94a7 32 *
marcelobarrosalmeida 1:acdf490d94a7 33 * $Id: pt.h,v 1.7 2006/10/02 07:52:56 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 * \file
marcelobarrosalmeida 1:acdf490d94a7 43 * Protothreads implementation.
marcelobarrosalmeida 1:acdf490d94a7 44 * \author
marcelobarrosalmeida 1:acdf490d94a7 45 * Adam Dunkels <adam@sics.se>
marcelobarrosalmeida 1:acdf490d94a7 46 *
marcelobarrosalmeida 1:acdf490d94a7 47 */
marcelobarrosalmeida 1:acdf490d94a7 48
marcelobarrosalmeida 1:acdf490d94a7 49 #ifndef __PT_H__
marcelobarrosalmeida 1:acdf490d94a7 50 #define __PT_H__
marcelobarrosalmeida 1:acdf490d94a7 51
marcelobarrosalmeida 1:acdf490d94a7 52 #include "lc.h"
marcelobarrosalmeida 1:acdf490d94a7 53
marcelobarrosalmeida 1:acdf490d94a7 54 struct pt {
marcelobarrosalmeida 1:acdf490d94a7 55 lc_t lc;
marcelobarrosalmeida 1:acdf490d94a7 56 };
marcelobarrosalmeida 1:acdf490d94a7 57
marcelobarrosalmeida 1:acdf490d94a7 58 #define PT_WAITING 0
marcelobarrosalmeida 1:acdf490d94a7 59 #define PT_YIELDED 1
marcelobarrosalmeida 1:acdf490d94a7 60 #define PT_EXITED 2
marcelobarrosalmeida 1:acdf490d94a7 61 #define PT_ENDED 3
marcelobarrosalmeida 1:acdf490d94a7 62
marcelobarrosalmeida 1:acdf490d94a7 63 /**
marcelobarrosalmeida 1:acdf490d94a7 64 * \name Initialization
marcelobarrosalmeida 1:acdf490d94a7 65 * @{
marcelobarrosalmeida 1:acdf490d94a7 66 */
marcelobarrosalmeida 1:acdf490d94a7 67
marcelobarrosalmeida 1:acdf490d94a7 68 /**
marcelobarrosalmeida 1:acdf490d94a7 69 * Initialize a protothread.
marcelobarrosalmeida 1:acdf490d94a7 70 *
marcelobarrosalmeida 1:acdf490d94a7 71 * Initializes a protothread. Initialization must be done prior to
marcelobarrosalmeida 1:acdf490d94a7 72 * starting to execute the protothread.
marcelobarrosalmeida 1:acdf490d94a7 73 *
marcelobarrosalmeida 1:acdf490d94a7 74 * \param pt A pointer to the protothread control structure.
marcelobarrosalmeida 1:acdf490d94a7 75 *
marcelobarrosalmeida 1:acdf490d94a7 76 * \sa PT_SPAWN()
marcelobarrosalmeida 1:acdf490d94a7 77 *
marcelobarrosalmeida 1:acdf490d94a7 78 * \hideinitializer
marcelobarrosalmeida 1:acdf490d94a7 79 */
marcelobarrosalmeida 1:acdf490d94a7 80 #define PT_INIT(pt) LC_INIT((pt)->lc)
marcelobarrosalmeida 1:acdf490d94a7 81
marcelobarrosalmeida 1:acdf490d94a7 82 /** @} */
marcelobarrosalmeida 1:acdf490d94a7 83
marcelobarrosalmeida 1:acdf490d94a7 84 /**
marcelobarrosalmeida 1:acdf490d94a7 85 * \name Declaration and definition
marcelobarrosalmeida 1:acdf490d94a7 86 * @{
marcelobarrosalmeida 1:acdf490d94a7 87 */
marcelobarrosalmeida 1:acdf490d94a7 88
marcelobarrosalmeida 1:acdf490d94a7 89 /**
marcelobarrosalmeida 1:acdf490d94a7 90 * Declaration of a protothread.
marcelobarrosalmeida 1:acdf490d94a7 91 *
marcelobarrosalmeida 1:acdf490d94a7 92 * This macro is used to declare a protothread. All protothreads must
marcelobarrosalmeida 1:acdf490d94a7 93 * be declared with this macro.
marcelobarrosalmeida 1:acdf490d94a7 94 *
marcelobarrosalmeida 1:acdf490d94a7 95 * \param name_args The name and arguments of the C function
marcelobarrosalmeida 1:acdf490d94a7 96 * implementing the protothread.
marcelobarrosalmeida 1:acdf490d94a7 97 *
marcelobarrosalmeida 1:acdf490d94a7 98 * \hideinitializer
marcelobarrosalmeida 1:acdf490d94a7 99 */
marcelobarrosalmeida 1:acdf490d94a7 100 #define PT_THREAD(name_args) char name_args
marcelobarrosalmeida 1:acdf490d94a7 101
marcelobarrosalmeida 1:acdf490d94a7 102 /**
marcelobarrosalmeida 1:acdf490d94a7 103 * Declare the start of a protothread inside the C function
marcelobarrosalmeida 1:acdf490d94a7 104 * implementing the protothread.
marcelobarrosalmeida 1:acdf490d94a7 105 *
marcelobarrosalmeida 1:acdf490d94a7 106 * This macro is used to declare the starting point of a
marcelobarrosalmeida 1:acdf490d94a7 107 * protothread. It should be placed at the start of the function in
marcelobarrosalmeida 1:acdf490d94a7 108 * which the protothread runs. All C statements above the PT_BEGIN()
marcelobarrosalmeida 1:acdf490d94a7 109 * invokation will be executed each time the protothread is scheduled.
marcelobarrosalmeida 1:acdf490d94a7 110 *
marcelobarrosalmeida 1:acdf490d94a7 111 * \param pt A pointer to the protothread control structure.
marcelobarrosalmeida 1:acdf490d94a7 112 *
marcelobarrosalmeida 1:acdf490d94a7 113 * \hideinitializer
marcelobarrosalmeida 1:acdf490d94a7 114 */
marcelobarrosalmeida 1:acdf490d94a7 115 #define PT_BEGIN(pt) { char PT_YIELD_FLAG = 1; LC_RESUME((pt)->lc)
marcelobarrosalmeida 1:acdf490d94a7 116
marcelobarrosalmeida 1:acdf490d94a7 117 /**
marcelobarrosalmeida 1:acdf490d94a7 118 * Declare the end of a protothread.
marcelobarrosalmeida 1:acdf490d94a7 119 *
marcelobarrosalmeida 1:acdf490d94a7 120 * This macro is used for declaring that a protothread ends. It must
marcelobarrosalmeida 1:acdf490d94a7 121 * always be used together with a matching PT_BEGIN() macro.
marcelobarrosalmeida 1:acdf490d94a7 122 *
marcelobarrosalmeida 1:acdf490d94a7 123 * \param pt A pointer to the protothread control structure.
marcelobarrosalmeida 1:acdf490d94a7 124 *
marcelobarrosalmeida 1:acdf490d94a7 125 * \hideinitializer
marcelobarrosalmeida 1:acdf490d94a7 126 */
marcelobarrosalmeida 1:acdf490d94a7 127 #define PT_END(pt) LC_END((pt)->lc); PT_YIELD_FLAG = 0; \
marcelobarrosalmeida 1:acdf490d94a7 128 PT_INIT(pt); return PT_ENDED; }
marcelobarrosalmeida 1:acdf490d94a7 129
marcelobarrosalmeida 1:acdf490d94a7 130 /** @} */
marcelobarrosalmeida 1:acdf490d94a7 131
marcelobarrosalmeida 1:acdf490d94a7 132 /**
marcelobarrosalmeida 1:acdf490d94a7 133 * \name Blocked wait
marcelobarrosalmeida 1:acdf490d94a7 134 * @{
marcelobarrosalmeida 1:acdf490d94a7 135 */
marcelobarrosalmeida 1:acdf490d94a7 136
marcelobarrosalmeida 1:acdf490d94a7 137 /**
marcelobarrosalmeida 1:acdf490d94a7 138 * Block and wait until condition is true.
marcelobarrosalmeida 1:acdf490d94a7 139 *
marcelobarrosalmeida 1:acdf490d94a7 140 * This macro blocks the protothread until the specified condition is
marcelobarrosalmeida 1:acdf490d94a7 141 * true.
marcelobarrosalmeida 1:acdf490d94a7 142 *
marcelobarrosalmeida 1:acdf490d94a7 143 * \param pt A pointer to the protothread control structure.
marcelobarrosalmeida 1:acdf490d94a7 144 * \param condition The condition.
marcelobarrosalmeida 1:acdf490d94a7 145 *
marcelobarrosalmeida 1:acdf490d94a7 146 * \hideinitializer
marcelobarrosalmeida 1:acdf490d94a7 147 */
marcelobarrosalmeida 1:acdf490d94a7 148 #define PT_WAIT_UNTIL(pt, condition) \
marcelobarrosalmeida 1:acdf490d94a7 149 do { \
marcelobarrosalmeida 1:acdf490d94a7 150 LC_SET((pt)->lc); \
marcelobarrosalmeida 1:acdf490d94a7 151 if(!(condition)) { \
marcelobarrosalmeida 1:acdf490d94a7 152 return PT_WAITING; \
marcelobarrosalmeida 1:acdf490d94a7 153 } \
marcelobarrosalmeida 1:acdf490d94a7 154 } while(0)
marcelobarrosalmeida 1:acdf490d94a7 155
marcelobarrosalmeida 1:acdf490d94a7 156 /**
marcelobarrosalmeida 1:acdf490d94a7 157 * Block and wait while condition is true.
marcelobarrosalmeida 1:acdf490d94a7 158 *
marcelobarrosalmeida 1:acdf490d94a7 159 * This function blocks and waits while condition is true. See
marcelobarrosalmeida 1:acdf490d94a7 160 * PT_WAIT_UNTIL().
marcelobarrosalmeida 1:acdf490d94a7 161 *
marcelobarrosalmeida 1:acdf490d94a7 162 * \param pt A pointer to the protothread control structure.
marcelobarrosalmeida 1:acdf490d94a7 163 * \param cond The condition.
marcelobarrosalmeida 1:acdf490d94a7 164 *
marcelobarrosalmeida 1:acdf490d94a7 165 * \hideinitializer
marcelobarrosalmeida 1:acdf490d94a7 166 */
marcelobarrosalmeida 1:acdf490d94a7 167 #define PT_WAIT_WHILE(pt, cond) PT_WAIT_UNTIL((pt), !(cond))
marcelobarrosalmeida 1:acdf490d94a7 168
marcelobarrosalmeida 1:acdf490d94a7 169 /** @} */
marcelobarrosalmeida 1:acdf490d94a7 170
marcelobarrosalmeida 1:acdf490d94a7 171 /**
marcelobarrosalmeida 1:acdf490d94a7 172 * \name Hierarchical protothreads
marcelobarrosalmeida 1:acdf490d94a7 173 * @{
marcelobarrosalmeida 1:acdf490d94a7 174 */
marcelobarrosalmeida 1:acdf490d94a7 175
marcelobarrosalmeida 1:acdf490d94a7 176 /**
marcelobarrosalmeida 1:acdf490d94a7 177 * Block and wait until a child protothread completes.
marcelobarrosalmeida 1:acdf490d94a7 178 *
marcelobarrosalmeida 1:acdf490d94a7 179 * This macro schedules a child protothread. The current protothread
marcelobarrosalmeida 1:acdf490d94a7 180 * will block until the child protothread completes.
marcelobarrosalmeida 1:acdf490d94a7 181 *
marcelobarrosalmeida 1:acdf490d94a7 182 * \note The child protothread must be manually initialized with the
marcelobarrosalmeida 1:acdf490d94a7 183 * PT_INIT() function before this function is used.
marcelobarrosalmeida 1:acdf490d94a7 184 *
marcelobarrosalmeida 1:acdf490d94a7 185 * \param pt A pointer to the protothread control structure.
marcelobarrosalmeida 1:acdf490d94a7 186 * \param thread The child protothread with arguments
marcelobarrosalmeida 1:acdf490d94a7 187 *
marcelobarrosalmeida 1:acdf490d94a7 188 * \sa PT_SPAWN()
marcelobarrosalmeida 1:acdf490d94a7 189 *
marcelobarrosalmeida 1:acdf490d94a7 190 * \hideinitializer
marcelobarrosalmeida 1:acdf490d94a7 191 */
marcelobarrosalmeida 1:acdf490d94a7 192 #define PT_WAIT_THREAD(pt, thread) PT_WAIT_WHILE((pt), PT_SCHEDULE(thread))
marcelobarrosalmeida 1:acdf490d94a7 193
marcelobarrosalmeida 1:acdf490d94a7 194 /**
marcelobarrosalmeida 1:acdf490d94a7 195 * Spawn a child protothread and wait until it exits.
marcelobarrosalmeida 1:acdf490d94a7 196 *
marcelobarrosalmeida 1:acdf490d94a7 197 * This macro spawns a child protothread and waits until it exits. The
marcelobarrosalmeida 1:acdf490d94a7 198 * macro can only be used within a protothread.
marcelobarrosalmeida 1:acdf490d94a7 199 *
marcelobarrosalmeida 1:acdf490d94a7 200 * \param pt A pointer to the protothread control structure.
marcelobarrosalmeida 1:acdf490d94a7 201 * \param child A pointer to the child protothread's control structure.
marcelobarrosalmeida 1:acdf490d94a7 202 * \param thread The child protothread with arguments
marcelobarrosalmeida 1:acdf490d94a7 203 *
marcelobarrosalmeida 1:acdf490d94a7 204 * \hideinitializer
marcelobarrosalmeida 1:acdf490d94a7 205 */
marcelobarrosalmeida 1:acdf490d94a7 206 #define PT_SPAWN(pt, child, thread) \
marcelobarrosalmeida 1:acdf490d94a7 207 do { \
marcelobarrosalmeida 1:acdf490d94a7 208 PT_INIT((child)); \
marcelobarrosalmeida 1:acdf490d94a7 209 PT_WAIT_THREAD((pt), (thread)); \
marcelobarrosalmeida 1:acdf490d94a7 210 } while(0)
marcelobarrosalmeida 1:acdf490d94a7 211
marcelobarrosalmeida 1:acdf490d94a7 212 /** @} */
marcelobarrosalmeida 1:acdf490d94a7 213
marcelobarrosalmeida 1:acdf490d94a7 214 /**
marcelobarrosalmeida 1:acdf490d94a7 215 * \name Exiting and restarting
marcelobarrosalmeida 1:acdf490d94a7 216 * @{
marcelobarrosalmeida 1:acdf490d94a7 217 */
marcelobarrosalmeida 1:acdf490d94a7 218
marcelobarrosalmeida 1:acdf490d94a7 219 /**
marcelobarrosalmeida 1:acdf490d94a7 220 * Restart the protothread.
marcelobarrosalmeida 1:acdf490d94a7 221 *
marcelobarrosalmeida 1:acdf490d94a7 222 * This macro will block and cause the running protothread to restart
marcelobarrosalmeida 1:acdf490d94a7 223 * its execution at the place of the PT_BEGIN() call.
marcelobarrosalmeida 1:acdf490d94a7 224 *
marcelobarrosalmeida 1:acdf490d94a7 225 * \param pt A pointer to the protothread control structure.
marcelobarrosalmeida 1:acdf490d94a7 226 *
marcelobarrosalmeida 1:acdf490d94a7 227 * \hideinitializer
marcelobarrosalmeida 1:acdf490d94a7 228 */
marcelobarrosalmeida 1:acdf490d94a7 229 #define PT_RESTART(pt) \
marcelobarrosalmeida 1:acdf490d94a7 230 do { \
marcelobarrosalmeida 1:acdf490d94a7 231 PT_INIT(pt); \
marcelobarrosalmeida 1:acdf490d94a7 232 return PT_WAITING; \
marcelobarrosalmeida 1:acdf490d94a7 233 } while(0)
marcelobarrosalmeida 1:acdf490d94a7 234
marcelobarrosalmeida 1:acdf490d94a7 235 /**
marcelobarrosalmeida 1:acdf490d94a7 236 * Exit the protothread.
marcelobarrosalmeida 1:acdf490d94a7 237 *
marcelobarrosalmeida 1:acdf490d94a7 238 * This macro causes the protothread to exit. If the protothread was
marcelobarrosalmeida 1:acdf490d94a7 239 * spawned by another protothread, the parent protothread will become
marcelobarrosalmeida 1:acdf490d94a7 240 * unblocked and can continue to run.
marcelobarrosalmeida 1:acdf490d94a7 241 *
marcelobarrosalmeida 1:acdf490d94a7 242 * \param pt A pointer to the protothread control structure.
marcelobarrosalmeida 1:acdf490d94a7 243 *
marcelobarrosalmeida 1:acdf490d94a7 244 * \hideinitializer
marcelobarrosalmeida 1:acdf490d94a7 245 */
marcelobarrosalmeida 1:acdf490d94a7 246 #define PT_EXIT(pt) \
marcelobarrosalmeida 1:acdf490d94a7 247 do { \
marcelobarrosalmeida 1:acdf490d94a7 248 PT_INIT(pt); \
marcelobarrosalmeida 1:acdf490d94a7 249 return PT_EXITED; \
marcelobarrosalmeida 1:acdf490d94a7 250 } while(0)
marcelobarrosalmeida 1:acdf490d94a7 251
marcelobarrosalmeida 1:acdf490d94a7 252 /** @} */
marcelobarrosalmeida 1:acdf490d94a7 253
marcelobarrosalmeida 1:acdf490d94a7 254 /**
marcelobarrosalmeida 1:acdf490d94a7 255 * \name Calling a protothread
marcelobarrosalmeida 1:acdf490d94a7 256 * @{
marcelobarrosalmeida 1:acdf490d94a7 257 */
marcelobarrosalmeida 1:acdf490d94a7 258
marcelobarrosalmeida 1:acdf490d94a7 259 /**
marcelobarrosalmeida 1:acdf490d94a7 260 * Schedule a protothread.
marcelobarrosalmeida 1:acdf490d94a7 261 *
marcelobarrosalmeida 1:acdf490d94a7 262 * This function shedules a protothread. The return value of the
marcelobarrosalmeida 1:acdf490d94a7 263 * function is non-zero if the protothread is running or zero if the
marcelobarrosalmeida 1:acdf490d94a7 264 * protothread has exited.
marcelobarrosalmeida 1:acdf490d94a7 265 *
marcelobarrosalmeida 1:acdf490d94a7 266 * \param f The call to the C function implementing the protothread to
marcelobarrosalmeida 1:acdf490d94a7 267 * be scheduled
marcelobarrosalmeida 1:acdf490d94a7 268 *
marcelobarrosalmeida 1:acdf490d94a7 269 * \hideinitializer
marcelobarrosalmeida 1:acdf490d94a7 270 */
marcelobarrosalmeida 1:acdf490d94a7 271 #define PT_SCHEDULE(f) ((f) < PT_EXITED)
marcelobarrosalmeida 1:acdf490d94a7 272
marcelobarrosalmeida 1:acdf490d94a7 273 /** @} */
marcelobarrosalmeida 1:acdf490d94a7 274
marcelobarrosalmeida 1:acdf490d94a7 275 /**
marcelobarrosalmeida 1:acdf490d94a7 276 * \name Yielding from a protothread
marcelobarrosalmeida 1:acdf490d94a7 277 * @{
marcelobarrosalmeida 1:acdf490d94a7 278 */
marcelobarrosalmeida 1:acdf490d94a7 279
marcelobarrosalmeida 1:acdf490d94a7 280 /**
marcelobarrosalmeida 1:acdf490d94a7 281 * Yield from the current protothread.
marcelobarrosalmeida 1:acdf490d94a7 282 *
marcelobarrosalmeida 1:acdf490d94a7 283 * This function will yield the protothread, thereby allowing other
marcelobarrosalmeida 1:acdf490d94a7 284 * processing to take place in the system.
marcelobarrosalmeida 1:acdf490d94a7 285 *
marcelobarrosalmeida 1:acdf490d94a7 286 * \param pt A pointer to the protothread control structure.
marcelobarrosalmeida 1:acdf490d94a7 287 *
marcelobarrosalmeida 1:acdf490d94a7 288 * \hideinitializer
marcelobarrosalmeida 1:acdf490d94a7 289 */
marcelobarrosalmeida 1:acdf490d94a7 290 #define PT_YIELD(pt) \
marcelobarrosalmeida 1:acdf490d94a7 291 do { \
marcelobarrosalmeida 1:acdf490d94a7 292 PT_YIELD_FLAG = 0; \
marcelobarrosalmeida 1:acdf490d94a7 293 LC_SET((pt)->lc); \
marcelobarrosalmeida 1:acdf490d94a7 294 if(PT_YIELD_FLAG == 0) { \
marcelobarrosalmeida 1:acdf490d94a7 295 return PT_YIELDED; \
marcelobarrosalmeida 1:acdf490d94a7 296 } \
marcelobarrosalmeida 1:acdf490d94a7 297 } while(0)
marcelobarrosalmeida 1:acdf490d94a7 298
marcelobarrosalmeida 1:acdf490d94a7 299 /**
marcelobarrosalmeida 1:acdf490d94a7 300 * \brief Yield from the protothread until a condition occurs.
marcelobarrosalmeida 1:acdf490d94a7 301 * \param pt A pointer to the protothread control structure.
marcelobarrosalmeida 1:acdf490d94a7 302 * \param cond The condition.
marcelobarrosalmeida 1:acdf490d94a7 303 *
marcelobarrosalmeida 1:acdf490d94a7 304 * This function will yield the protothread, until the
marcelobarrosalmeida 1:acdf490d94a7 305 * specified condition evaluates to true.
marcelobarrosalmeida 1:acdf490d94a7 306 *
marcelobarrosalmeida 1:acdf490d94a7 307 *
marcelobarrosalmeida 1:acdf490d94a7 308 * \hideinitializer
marcelobarrosalmeida 1:acdf490d94a7 309 */
marcelobarrosalmeida 1:acdf490d94a7 310 #define PT_YIELD_UNTIL(pt, cond) \
marcelobarrosalmeida 1:acdf490d94a7 311 do { \
marcelobarrosalmeida 1:acdf490d94a7 312 PT_YIELD_FLAG = 0; \
marcelobarrosalmeida 1:acdf490d94a7 313 LC_SET((pt)->lc); \
marcelobarrosalmeida 1:acdf490d94a7 314 if((PT_YIELD_FLAG == 0) || !(cond)) { \
marcelobarrosalmeida 1:acdf490d94a7 315 return PT_YIELDED; \
marcelobarrosalmeida 1:acdf490d94a7 316 } \
marcelobarrosalmeida 1:acdf490d94a7 317 } while(0)
marcelobarrosalmeida 1:acdf490d94a7 318
marcelobarrosalmeida 1:acdf490d94a7 319 /** @} */
marcelobarrosalmeida 1:acdf490d94a7 320
marcelobarrosalmeida 1:acdf490d94a7 321 #endif /* __PT_H__ */
marcelobarrosalmeida 1:acdf490d94a7 322
marcelobarrosalmeida 1:acdf490d94a7 323 /** @} */