#define RC_STATE(value) value & 0x1 #define RC_DEVICE(value) (value >> 1) & 0x1F #define RC_GROUP(value) (value >> 6) & 0x1F namespace RcDecoder { struct RcSwitch { bool state; char group; byte device; }; RcSwitch decode(unsigned long value) { value = value >> 2; unsigned long res = 0; for (int i = 0; i < 12; i++) { res |= ((value & 1) ^ 1) << i; value = value >> 2; } RcSwitch decoded; decoded.state = RC_STATE(res); decoded.group = RC_GROUP(res); switch (RC_DEVICE(res)) { case 0b10000: decoded.device = 1; break; case 0b01000: decoded.device = 2; break; case 0b00100: decoded.device = 3; break; case 0b00010: decoded.device = 4; break; case 0b00001: decoded.device = 5; break; } return decoded; } }