Tasmota/lib/lib_basic/IRremoteESP8266-2.7.13/src/ir_EliteScreens.cpp
2020-11-25 19:41:51 +01:00

82 lines
2.9 KiB
C++

// Copyright 2020 David Conran
/// @file
/// @brief Elite Screens protocol support
/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1306
/// @see https://elitescreens.com/kcfinder/upload/files/FAQ/ir_commands.pdf
// Supports:
// Brand: Elite Screens, Model: Spectrum series
// Brand: Elite Screens, Model: VMAX2 / VMAX2 Plus series
// Brand: Elite Screens, Model: VMAX Plus4 series
// Brand: Elite Screens, Model: Home2 / Home3 series
// Brand: Elite Screens, Model: CineTension2 / CineTension3 series
// Brand: Elite Screens, Model: ZSP-IR-B / ZSP-IR-W remote
// Known Elite Screens commands:
// 0xFEA3387 (STOP)
// 0xFDA2256 (UP)
// 0xFBA1136 (DOWN)
#include "IRrecv.h"
#include "IRsend.h"
#include "IRutils.h"
// Constants
const uint16_t kEliteScreensOne = 470;
const uint16_t kEliteScreensZero = 1214;
const uint16_t kEliteScreensGap = 29200;
#if SEND_ELITESCREENS
/// Send an Elite Screens formatted message.
/// Status: BETA / Probably Working.
/// @param[in] data The message to be sent.
/// @param[in] nbits The number of bits of message to be sent.
/// @param[in] repeat The number of times the command is to be repeated.
void IRsend::sendElitescreens(uint64_t data, uint16_t nbits, uint16_t repeat) {
// Protocol uses a constant bit time encoding.
sendGeneric(0, 0, // No header.
kEliteScreensOne, kEliteScreensZero,
kEliteScreensZero, kEliteScreensOne,
0, kEliteScreensGap, data, nbits, 38000, true, repeat, 50);
}
#endif
#if DECODE_ELITESCREENS
/// Decode the supplied Elite Screens message.
/// Status: STABLE / Confirmed working.
/// @param[in,out] results Ptr to the data to decode & where to store the decode
/// result.
/// @param[in] offset The starting index to use when attempting to decode the
/// raw data. Typically/Defaults to kStartOffset.
/// @param[in] nbits The number of data bits to expect.
/// @param[in] strict Flag indicating if we should perform strict matching.
/// @return A boolean. True if it can decode it, false if it can't.
bool IRrecv::decodeElitescreens(decode_results *results, uint16_t offset,
const uint16_t nbits, const bool strict) {
// Compliance check.
if (strict && nbits != kEliteScreensBits) return false;
uint64_t data = 0;
// Data + Footer
if (!matchGenericConstBitTime(results->rawbuf + offset, &data,
results->rawlen - offset, nbits,
// Header (None)
0, 0,
// Data
kEliteScreensOne, kEliteScreensZero,
// Footer (None)
0, kEliteScreensGap, true)) return false;
// Success
results->decode_type = decode_type_t::ELITESCREENS;
results->bits = nbits;
results->value = data;
results->address = 0;
results->command = 0;
results->repeat = false;
return true;
}
#endif