+// combine function for IsRadioTokenRequested (GetNow) interface
+typedef bool token_requested_t __attribute__((combine(rcombine)));
+token_requested_t rcombine(token_requested_t r1, token_requested_t r2)
+{
+ return r1 || r2;
+}
+
+#ifdef TKN154_DEBUG
+
+ /******************************************************************
+ * ATTENTION! Debugging over serial is a lot of overhead. To
+ * keep it simple, here are the rules you have to follow when
+ * using the dbg_serial() macro:
+ *
+ * - dbg_serial() is used like dbg(), i.e. you pass it at least
+ * two strings, the first one describing the component/file,
+ * the second is a format string (like in printf())
+ * - following the second string, there may be zero up to
+ * two parameters -- these must be (cast to) uint32_t and
+ * the format specifier must be "%lu", e.g.
+ * dbg_serial("MyComponentP", "Value: %lu\n", (uint32_t) val);
+ * - both strings must be constants (pointers always valid)
+ * - no data is sent over serial, unless dbg_serial_flush() is
+ * called; try to call it when the system is idle or at least
+ * when no time-critical operations are pending; on TelosB
+ * you can also press the user button to trigger a flush
+ * - on the PC use the printf java client to display the debug
+ * output (see tinyos-2.x/apps/tests/TestPrintf/README.txt);
+ * the output format is component:line-in-source-code:text
+ *
+ * The ASSERT(X) macro is used to test for errors. If X evaluates
+ * to zero, then 3 leds start blinking simulataneously (about 2Hz)
+ * and the node *continuously* outputs over serial the filename/line
+ * where the (first) ASSERT has failed. This means, even if your
+ * TelosB was not attached to your PC while the ASSERT failed you
+ * can typically still pull the information out later.
+ *
+ * When TKN154_DEBUG is not defined (which is the default), then
+ * dbg_serial() maps to dbg(), i.e. is completely removed unless
+ * the platform is TOSSIM, and in the ASSERT(X) statement X is
+ * evaluated/executed, but the result is ignored.
+ **/
+
+ /* -> functions are defined in DebugP.nc */
+ void tkn154_assert(bool val, const char *filename, uint16_t line, const char *func);
+ void tkn154_dbg_serial(const char *filename, uint16_t line, ...);
+ void tkn154_dbg_serial_flush();
+ #define ASSERT(X) tkn154_assert(X, __FILE__,__LINE__,__FUNCTION__)
+ #define dbg_serial(m, ...) tkn154_dbg_serial(m, __LINE__,__VA_ARGS__)
+ #define dbg_serial_flush() tkn154_dbg_serial_flush()
+#else
+ // Note: in an ASSERT(X) the X must always be evaluated/executed!
+ #define ASSERT(X) while(!(X)){ break;}
+ #define dbg_serial(m, ...) dbg(m, __VA_ARGS__)
+ #define dbg_serial_flush()
+#endif