Contiki 2.6

timetable.h

Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2008, Swedish Institute of Computer Science.
00003  * All rights reserved.
00004  *
00005  * Redistribution and use in source and binary forms, with or without
00006  * modification, are permitted provided that the following conditions
00007  * are met:
00008  * 1. Redistributions of source code must retain the above copyright
00009  *    notice, this list of conditions and the following disclaimer.
00010  * 2. Redistributions in binary form must reproduce the above copyright
00011  *    notice, this list of conditions and the following disclaimer in the
00012  *    documentation and/or other materials provided with the distribution.
00013  * 3. Neither the name of the Institute nor the names of its contributors
00014  *    may be used to endorse or promote products derived from this software
00015  *    without specific prior written permission.
00016  *
00017  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
00018  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00020  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
00021  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00022  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
00023  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
00024  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00025  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
00026  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
00027  * SUCH DAMAGE.
00028  *
00029  * This file is part of the Contiki operating system.
00030  *
00031  * $Id: timetable.h,v 1.2 2008/02/28 22:11:30 oliverschmidt Exp $
00032  */
00033 
00034 /**
00035  * \file
00036  *         A brief description of what this file is.
00037  * \author
00038  *         Adam Dunkels <adam@sics.se>
00039  */
00040 
00041 #ifndef __TIMETABLE_H__
00042 #define __TIMETABLE_H__
00043 
00044 #include "sys/cc.h"
00045 #include "sys/rtimer.h"
00046 
00047 
00048 struct timetable_timestamp {
00049   const char *id;
00050   rtimer_clock_t time;
00051 #if TIMETABLE_WITH_TYPE
00052   uint8_t type;
00053 #endif /* TIMETABLE_WITH_TYPE */
00054 };
00055 struct timetable {
00056   struct timetable_timestamp *timestamps;
00057   const int size;
00058   unsigned int * const ptr;
00059 };
00060 
00061 #define TIMETABLE_NONSTATIC(name)                                              \
00062 struct timetable_timestamp CC_CONCAT(name,_timestamps)[CC_CONCAT(name,_size)]; \
00063 unsigned int CC_CONCAT(name,_ptr);                                             \
00064 struct timetable name = {                                                      \
00065   CC_CONCAT(name,_timestamps),                                                 \
00066     CC_CONCAT(name,_size),                                                     \
00067     &CC_CONCAT(name,_ptr)}
00068 
00069 #define TIMETABLE_STATIC(name)                                                        \
00070 static struct timetable_timestamp CC_CONCAT(name,_timestamps)[CC_CONCAT(name,_size)]; \
00071 static unsigned int CC_CONCAT(name,_ptr);                                             \
00072 static struct timetable name = {                                                      \
00073   CC_CONCAT(name,_timestamps),                                                        \
00074     CC_CONCAT(name,_size),                                                            \
00075     &CC_CONCAT(name,_ptr)}
00076 
00077 #define TIMETABLE_DECLARE(name)                                                        \
00078 extern unsigned int CC_CONCAT(name,_ptr);                                              \
00079 extern struct timetable_timestamp CC_CONCAT(name, _timestamps)[CC_CONCAT(name,_size)]; \
00080 extern struct timetable name
00081 
00082 #define TIMETABLE(name) TIMETABLE_STATIC(name)
00083 
00084 #define TIMETABLE_TIMESTAMP(name, str)                                   \
00085 do {                                                                     \
00086   CC_CONCAT(name,_timestamps)[CC_CONCAT(name,_ptr)].id = str;            \
00087   CC_CONCAT(name,_timestamps)[CC_CONCAT(name,_ptr)].time = RTIMER_NOW(); \
00088   CC_CONCAT(name,_ptr) = (CC_CONCAT(name,_ptr) + 1) %                    \
00089     CC_CONCAT(name,_size);                                               \
00090 } while(0)
00091 
00092 #if TIMETABLE_WITH_TYPE
00093 #define TIMETABLE_TIMESTAMP_TYPE(name, str, t)                           \
00094 do {                                                                     \
00095   CC_CONCAT(name,_timestamps)[CC_CONCAT(name,_ptr)].id = str;            \
00096   CC_CONCAT(name,_timestamps)[CC_CONCAT(name,_ptr)].type = t;            \
00097   CC_CONCAT(name,_timestamps)[CC_CONCAT(name,_ptr)].time = RTIMER_NOW(); \
00098   CC_CONCAT(name,_ptr) = (CC_CONCAT(name,_ptr) + 1) %                    \
00099     CC_CONCAT(name,_size);                                               \
00100 } while(0)
00101 #else /* TIMETABLE_WITH_TYPE */
00102 #define TIMETABLE_TIMESTAMP_TYPE(name, str, t) TIMETABLE_TIMESTAMP(name, str)
00103 #endif /* TIMETABLE_WITH_TYPE */
00104 
00105 
00106 #define TIMETABLE_RESUME(name,num) \
00107         TIMETABLE_TIMESTAMP(CC_CONCAT(name,_timestamps[num].id))
00108 
00109 #define TIMETABLE_COND_TIMESTAMP(cond,name,id)          \
00110                             do { if(cond) {             \
00111                               TIMETABLE_TIMESTAMP(id);  \
00112                             } while(0)
00113 
00114 #define TIMETABLE_COND_RESUME(cond,name,num) \
00115         TIMETABLE_COND_TIMESTAMP(cond,name,  \
00116                                  CC_CONCAT(name,_timestamps[num].id))
00117 
00118 #define TIMETABLE_ENTRY(name, num) CC_CONCAT(name,_timestamps)[num]
00119 #define TIMETABLE_PTR(name) CC_CONCAT(name,_ptr)
00120 
00121 /**
00122  * The time for taking a timestamp.
00123  */
00124 extern rtimer_clock_t timetable_timestamp_time;
00125 
00126 
00127 struct timetable_timestamp *timetable_entry(struct timetable *t,
00128                                             int num);
00129 int timetable_ptr(struct timetable *t);
00130  
00131 void timetable_clear(struct timetable *t);
00132 rtimer_clock_t timetable_timediff(struct timetable *t,
00133                                   const char *id1, const char *id2);
00134 void timetable_init(void);
00135 
00136 void timetable_print(struct timetable *t);
00137 
00138 #include "sys/timetable-aggregate.h"
00139 
00140 #endif /* __TIMETABLE_H__ */