|
80 | 80 | // NEOPIXEL RG generator for NEOPIXEL_SIGNAL |
81 | 81 | #define NeoRGB(red,green,blue) (((uint32_t)(red & 0xff)<<16) | ((uint32_t)(green & 0xff)<<8) | (uint32_t)(blue & 0xff)) |
82 | 82 |
|
| 83 | +// Collection of macros to assist variadic exrail macros |
| 84 | +// in particular RANDOMCALL and RANDOMFOLLOW |
| 85 | +// Count the number of arguments |
| 86 | +#define FOR_EACH_NARG(...) FOR_EACH_NARG_HELPER(__VA_ARGS__,8,7, 6,5,4, 3, 2, 1, 0) |
| 87 | +#define FOR_EACH_NARG_HELPER(_1, _2, _3, _4, _5, _6, _7, _8, N, ...) N |
| 88 | +// Force proper expansion (extra indirection to resolve `##`) |
| 89 | +#define _CONCAT_(a, b) a##b |
| 90 | +#define _EXPAND_(a) a |
| 91 | + |
| 92 | +#define ZC0() |
| 93 | +#define ZC1(_1) CALL(_1) |
| 94 | +#define ZC2(_1,_2) CALL(_1) CALL(_2) |
| 95 | +#define ZC3(_1,_2,_3) CALL(_1) CALL(_2) CALL(_3) |
| 96 | +#define ZC4(_1,_2,_3,_4) CALL(_1) CALL(_2) CALL(_3) CALL(_4) |
| 97 | +#define ZC5(_1,_2,_3,_4,_5) CALL(_1) CALL(_2) CALL(_3) CALL(_4) CALL(_5) |
| 98 | +#define ZC6(_1,_2,_3,_4,_5,_6) CALL(_1) CALL(_2) CALL(_3) CALL(_4) CALL(_5) CALL(_6) |
| 99 | +#define ZC7(_1,_2,_3,_4,_5,_6,_7) CALL(_1) CALL(_2) CALL(_3) CALL(_4) CALL(_5) CALL(_6) CALL(_7) |
| 100 | +#define ZC8(_1,_2,_3,_4,_5,_6,_7,_8) CALL(_1) CALL(_2) CALL(_3) CALL(_4) CALL(_5) CALL(_6) CALL(_7) CALL(_8) |
| 101 | +#define ZCRIP(count) _EXPAND_(_CONCAT_(ZC,count)) |
| 102 | + |
| 103 | + |
83 | 104 | // Pass 1 Implements aliases |
84 | 105 | #include "EXRAIL2MacroReset.h" |
85 | 106 | #undef ALIAS |
@@ -596,6 +617,12 @@ int RMFT2::onLCCLookup[RMFT2::countLCCLookup]; |
596 | 617 | #define POWERON OPCODE_POWERON,0,0, |
597 | 618 | #define PRINT(msg) OPCODE_PRINT,V(__COUNTER__ - StringMacroTracker2), |
598 | 619 | #define PARSE(msg) PRINT(msg) |
| 620 | +#define RANDOM_CALL(...) \ |
| 621 | + OPCODE_RANDOM_CALL,V(FOR_EACH_NARG(__VA_ARGS__)), \ |
| 622 | + ZCRIP(FOR_EACH_NARG(__VA_ARGS__))(__VA_ARGS__) |
| 623 | +#define RANDOM_FOLLOW(...) \ |
| 624 | + OPCODE_RANDOM_FOLLOW,V(FOR_EACH_NARG(__VA_ARGS__)), \ |
| 625 | + ZCRIP(FOR_EACH_NARG(__VA_ARGS__))(__VA_ARGS__) |
599 | 626 | #define READ_LOCO OPCODE_READ_LOCO1,0,0,OPCODE_READ_LOCO2,0,0, |
600 | 627 | #define RED(signal_id) OPCODE_RED,V(signal_id), |
601 | 628 | #define RESERVE(blockid) OPCODE_RESERVE,V(blockid), |
|
0 commit comments