| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 | #ifndef MACROS_H#define MACROS_H#include <avr/interrupt.h> //for cli() and sei()#define  FORCE_INLINE __attribute__((always_inline)) inline#define _UNUSED __attribute__((unused))#ifndef CRITICAL_SECTION_START  #define CRITICAL_SECTION_START  unsigned char _sreg = SREG; cli();  #define CRITICAL_SECTION_END    SREG = _sreg;#endif //CRITICAL_SECTION_START// Macros to make a string from a macro#define STRINGIFY_(M) #M#define STRINGIFY(M) STRINGIFY_(M)// Macros for bit masks#undef _BV#define _BV(n) (1<<(n))#define TEST(n,b) (!!((n)&_BV(b)))#define SET_BIT_TO(N,B,TF) do{ if (TF) SBI(N,B); else CBI(N,B); }while(0)#ifndef SBI  #define SBI(A,B) (A |= (1 << (B)))#endif#ifndef CBI  #define CBI(A,B) (A &= ~(1 << (B)))#endif#define TBI(N,B) (N ^= _BV(B))// Macros to chain up to 12 conditions#define _DO_1(W,C,A)       (_##W##_1(A))#define _DO_2(W,C,A,B)     (_##W##_1(A) C _##W##_1(B))#define _DO_3(W,C,A,V...)  (_##W##_1(A) C _DO_2(W,C,V))#define _DO_4(W,C,A,V...)  (_##W##_1(A) C _DO_3(W,C,V))#define _DO_5(W,C,A,V...)  (_##W##_1(A) C _DO_4(W,C,V))#define _DO_6(W,C,A,V...)  (_##W##_1(A) C _DO_5(W,C,V))#define _DO_7(W,C,A,V...)  (_##W##_1(A) C _DO_6(W,C,V))#define _DO_8(W,C,A,V...)  (_##W##_1(A) C _DO_7(W,C,V))#define _DO_9(W,C,A,V...)  (_##W##_1(A) C _DO_8(W,C,V))#define _DO_10(W,C,A,V...) (_##W##_1(A) C _DO_9(W,C,V))#define _DO_11(W,C,A,V...) (_##W##_1(A) C _DO_10(W,C,V))#define _DO_12(W,C,A,V...) (_##W##_1(A) C _DO_11(W,C,V))#define __DO_N(W,C,N,V...) _DO_##N(W,C,V)#define _DO_N(W,C,N,V...)  __DO_N(W,C,N,V)#define DO(W,C,V...)       _DO_N(W,C,NUM_ARGS(V),V)// Macros to support option testing#define _CAT(a,V...) a##V#define CAT(a,V...) _CAT(a,V)#define _ISENA_     ~,1#define _ISENA_1    ~,1#define _ISENA_0x1  ~,1#define _ISENA_true ~,1#define _ISENA(V...)        IS_PROBE(V)#define _ENA_1(O)           _ISENA(CAT(_IS,CAT(ENA_, O)))#define _DIS_1(O)           NOT(_ENA_1(O))#define ENABLED(V...)       DO(ENA,&&,V)#define DISABLED(V...)      DO(DIS,&&,V)#define TERN(O,A,B)         _TERN(_ENA_1(O),B,A)    // OPTION converted to '0' or '1'#define TERN0(O,A)          _TERN(_ENA_1(O),0,A)    // OPTION converted to A or '0'#define TERN1(O,A)          _TERN(_ENA_1(O),1,A)    // OPTION converted to A or '1'#define TERN_(O,A)          _TERN(_ENA_1(O),,A)     // OPTION converted to A or '<nul>'#define _TERN(E,V...)       __TERN(_CAT(T_,E),V)    // Prepend 'T_' to get 'T_0' or 'T_1'#define __TERN(T,V...)      ___TERN(_CAT(_NO,T),V)  // Prepend '_NO' to get '_NOT_0' or '_NOT_1'#define ___TERN(P,V...)     THIRD(P,V)              // If first argument has a comma, A. Else B.// Use NUM_ARGS(__VA_ARGS__) to get the number of variadic arguments#define _NUM_ARGS(_,Z,Y,X,W,V,U,T,S,R,Q,P,O,N,M,L,K,J,I,H,G,F,E,D,C,B,A,OUT,...) OUT#define NUM_ARGS(V...) _NUM_ARGS(0,V,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0)//// Primitives supporting precompiler REPEAT//#define FIRST(a,...)     a#define SECOND(a,b,...)  b#define THIRD(a,b,c,...) c#define IS_PROBE(V...) SECOND(V, 0)     // Get the second item passed, or 0#define NOT(x) IS_PROBE(_CAT(_NOT_, x)) // NOT('0') gets '1'. Anything else gets '0'.#endif //MACROS_H
 |