Tasmota/lib/IRremoteESP8266-2.5.2.03/src/ir_Trotec.cpp
Theo Arends 0924dfcfb7 Update IRRemoteESP8266 library
Update IRRemoteESP8266 library from 2.2.1 to 2.5.2
2018-11-20 15:53:56 +01:00

128 lines
3.0 KiB
C++

// Copyright 2017 stufisher
#include "ir_Trotec.h"
#include "IRremoteESP8266.h"
#include "IRutils.h"
// Constants
const uint16_t kTrotecHdrMark = 5952;
const uint16_t kTrotecHdrSpace = 7364;
const uint16_t kTrotecOneMark = 592;
const uint16_t kTrotecOneSpace = 1560;
const uint16_t kTrotecZeroMark = 592;
const uint16_t kTrotecZeroSpace = 592;
const uint16_t kTrotecGap = 6184;
const uint16_t kTrotecGapEnd = 1500; // made up value
#if SEND_TROTEC
void IRsend::sendTrotec(unsigned char data[], uint16_t nbytes,
uint16_t repeat) {
if (nbytes < kTrotecStateLength) return;
for (uint16_t r = 0; r <= repeat; r++) {
sendGeneric(kTrotecHdrMark, kTrotecHdrSpace, kTrotecOneMark,
kTrotecOneSpace, kTrotecZeroMark, kTrotecZeroSpace,
kTrotecOneMark, kTrotecGap, data, nbytes, 36, false,
0, // Repeats handled elsewhere
50);
// More footer
enableIROut(36);
mark(kTrotecOneMark);
space(kTrotecGapEnd);
}
}
#endif // SEND_TROTEC
IRTrotecESP::IRTrotecESP(uint16_t pin) : _irsend(pin) { stateReset(); }
void IRTrotecESP::begin() { _irsend.begin(); }
#if SEND_TROTEC
void IRTrotecESP::send() {
checksum();
_irsend.sendTrotec(trotec);
}
#endif // SEND_TROTEC
void IRTrotecESP::checksum() {
uint8_t sum = 0;
uint8_t i;
for (i = 2; i < 8; i++) sum += trotec[i];
trotec[8] = sum & 0xFF;
}
void IRTrotecESP::stateReset() {
for (uint8_t i = 2; i < kTrotecStateLength; i++) trotec[i] = 0x0;
trotec[0] = kTrotecIntro1;
trotec[1] = kTrotecIntro2;
setPower(false);
setTemp(kTrotecDefTemp);
setSpeed(kTrotecFanMed);
setMode(kTrotecAuto);
}
uint8_t* IRTrotecESP::getRaw() {
checksum();
return trotec;
}
void IRTrotecESP::setPower(bool state) {
if (state)
trotec[2] |= (kTrotecOn << 3);
else
trotec[2] &= ~(kTrotecOn << 3);
}
uint8_t IRTrotecESP::getPower() { return trotec[2] & (kTrotecOn << 3); }
void IRTrotecESP::setSpeed(uint8_t speed) {
trotec[2] = (trotec[2] & 0xcf) | (speed << 4);
}
uint8_t IRTrotecESP::getSpeed() { return trotec[2] & 0x30; }
void IRTrotecESP::setMode(uint8_t mode) {
trotec[2] = (trotec[2] & 0xfc) | mode;
}
uint8_t IRTrotecESP::getMode() { return trotec[2] & 0x03; }
void IRTrotecESP::setTemp(uint8_t temp) {
if (temp < kTrotecMinTemp)
temp = kTrotecMinTemp;
else if (temp > kTrotecMaxTemp)
temp = kTrotecMaxTemp;
trotec[3] = (trotec[3] & 0x80) | (temp - kTrotecMinTemp);
}
uint8_t IRTrotecESP::getTemp() { return trotec[3] & 0x7f; }
void IRTrotecESP::setSleep(bool sleep) {
if (sleep)
trotec[3] |= (kTrotecSleepOn << 7);
else
trotec[3] &= ~(kTrotecSleepOn << 7);
}
bool IRTrotecESP::getSleep(void) { return trotec[3] & (kTrotecSleepOn << 7); }
void IRTrotecESP::setTimer(uint8_t timer) {
if (timer > kTrotecMaxTimer) timer = kTrotecMaxTimer;
if (timer) {
trotec[5] |= (kTrotecTimerOn << 6);
trotec[6] = timer;
} else {
trotec[5] &= ~(kTrotecTimerOn << 6);
trotec[6] = 0;
}
}
uint8_t IRTrotecESP::getTimer() { return trotec[6]; }