|
@@ -31,10 +31,37 @@ uint8_t xorBytes(const uint8_t * const start, const uint16_t length);
|
|
*
|
|
*
|
|
*/
|
|
*/
|
|
|
|
|
|
|
|
+/*****
|
|
|
|
+ * Panasonic decode 19 bytes
|
|
|
|
+ *
|
|
|
|
+ * 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
|
|
|
|
+ * 30 deg 4004072000123C61 C560007007000091 000054 0011 1100 - 11100 1C 28
|
|
|
|
+ * 24 deg 4004072000120C61 C560007007000091 000078 0000 1100 - 10000 10 16
|
|
|
|
+ * 23 deg 4004072000127461 C560007007000091 000038 0111 0100 - 01110 E 14
|
|
|
|
+ * 22 deg 4004072000123461 C560007007000091 000058 0011 0100 - 01100 C 12
|
|
|
|
+ * 21.5 400407200012D461 C560007007000091 000098 1101 0100 - 01011 B 11
|
|
|
|
+ * 21 deg 4004072000125461 C560007007000091 000018 0101 0100 - 01010 A 10
|
|
|
|
+ * 16 deg 4004072000120461 C560007007000091 000070 0000 0100 - 00000 0 00
|
|
|
|
+ * 0220E00400482086 A306000EE0000089 00000E 0010 0010 17 grader
|
|
|
|
+ *
|
|
|
|
+ *
|
|
|
|
+ * Fan in byte ([8] >> 4)
|
|
|
|
+ * 10 = Auto
|
|
|
|
+ * 3 = F1
|
|
|
|
+ * 4 = F2
|
|
|
|
+ * 5 = F3
|
|
|
|
+ * 6 = F4
|
|
|
|
+ * 7 = F5
|
|
|
|
+ *
|
|
|
|
+ * Power in data->raw[5]&0x01
|
|
|
|
+ * 0 = OFF
|
|
|
|
+ * 1 = ON
|
|
|
|
+*/
|
|
|
|
|
|
|
|
|
|
-uint8_t data[kToshibaNumberOfBytes]; // Temp data during rx
|
|
|
|
-uint8_t dataTransfer[kToshibaNumberOfBytes]; // Send as pointer to receiver
|
|
|
|
|
|
+
|
|
|
|
+uint8_t data[kPanasonicNumberOfBytes]; // Temp data during rx
|
|
|
|
+uint8_t dataTransfer[kPanasonicNumberOfBytes]; // Send as pointer to receiver
|
|
|
|
|
|
enum
|
|
enum
|
|
{
|
|
{
|
|
@@ -55,7 +82,7 @@ void Toshiba_ir_ResetDecoder()
|
|
//ESP_LOGI("T", "Reset decoder");
|
|
//ESP_LOGI("T", "Reset decoder");
|
|
rx_numBits = 0;
|
|
rx_numBits = 0;
|
|
rx_state = UNKNOWN;
|
|
rx_state = UNKNOWN;
|
|
- memset(data,0,kToshibaNumberOfBytes);
|
|
|
|
|
|
+ memset(data,0,kPanasonicNumberOfBytes);
|
|
}
|
|
}
|
|
|
|
|
|
static void addBit(uint8_t value)
|
|
static void addBit(uint8_t value)
|
|
@@ -73,52 +100,61 @@ static void addBit(uint8_t value)
|
|
rx_numBits++;
|
|
rx_numBits++;
|
|
}
|
|
}
|
|
|
|
|
|
-#define START_PULSE_MIN (kToshibaAcHdrMark-200)
|
|
|
|
-#define START_PULSE_MAX (kToshibaAcHdrMark+200)
|
|
|
|
|
|
+#define HDR_MARK_MIN (kPanasonicAcHdrMark-200)
|
|
|
|
+#define HDR_MARK_MAX (kPanasonicAcHdrMark+200)
|
|
|
|
+
|
|
|
|
+#define HDR_SPACE_MIN (kPanasonicAcHdrSpace-200)
|
|
|
|
+#define HDR_SPACE_MAX (kPanasonicAcHdrSpace+200)
|
|
|
|
|
|
-#define T0_PULSE_MIN (kToshibaAcBitMark-100)
|
|
|
|
-#define T0_PULSE_MAX (kToshibaAcBitMark+100)
|
|
|
|
|
|
+#define T0_PULSE_MIN (kPanasonicAcBitMark-100)
|
|
|
|
+#define T0_PULSE_MAX (kPanasonicAcBitMark+100)
|
|
|
|
|
|
-#define SHORT_PULSE_MIN (kToshibaAcZeroSpace-100)
|
|
|
|
-#define SHORT_PULSE_MAX (kToshibaAcZeroSpace+100)
|
|
|
|
|
|
+#define SHORT_PULSE_MIN (kPanasonicAcZeroSpace-100)
|
|
|
|
+#define SHORT_PULSE_MAX (kPanasonicAcZeroSpace+100)
|
|
|
|
|
|
-#define LONG_PULSE_MIN (kToshibaAcOneSpace-100)
|
|
|
|
-#define LONG_PULSE_MAX (kToshibaAcOneSpace+100)
|
|
|
|
|
|
+#define LONG_PULSE_MIN (kPanasonicAcOneSpace-100)
|
|
|
|
+#define LONG_PULSE_MAX (kPanasonicAcOneSpace+100)
|
|
|
|
|
|
|
|
+#define GAP_PULSE_MIN (kPanasonicAcUsualGap-200)
|
|
|
|
+#define GAP_PULSE_MAX (kPanasonicAcUsualGap+200)
|
|
|
|
|
|
|
|
+
|
|
|
|
+// Pulse decoder
|
|
static int32_t rx_decode(uint32_t width)
|
|
static int32_t rx_decode(uint32_t width)
|
|
{
|
|
{
|
|
switch (rx_state) {
|
|
switch (rx_state) {
|
|
case UNKNOWN: // Start of frame A
|
|
case UNKNOWN: // Start of frame A
|
|
- if ( START_PULSE_MIN <= width && width <= START_PULSE_MAX )
|
|
|
|
|
|
+ if ( HDR_MARK_MIN <= width && width <= HDR_MARK_MAX )
|
|
{
|
|
{
|
|
rx_state = STARTER;
|
|
rx_state = STARTER;
|
|
- //ESP_LOGI("T", "->STARTER");
|
|
|
|
|
|
+ ESP_LOGI("T", "STARTER A");
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
|
|
+ ESP_LOGI("T", "Err STARTER A");
|
|
return -1; // error, reset
|
|
return -1; // error, reset
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
|
|
|
|
case STARTER: // Start of frame B
|
|
case STARTER: // Start of frame B
|
|
- if ( START_PULSE_MIN <= width && width <= START_PULSE_MAX )
|
|
|
|
|
|
+ if ( HDR_SPACE_MIN <= width && width <= HDR_SPACE_MAX )
|
|
{
|
|
{
|
|
rx_state = T0;
|
|
rx_state = T0;
|
|
- //ESP_LOGI("T", "STARTER");
|
|
|
|
|
|
+ ESP_LOGI("T", "STARTER B");
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
|
|
+ ESP_LOGI("T", "Err STARTER B");
|
|
return -1; // error, reset
|
|
return -1; // error, reset
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
|
|
|
|
|
|
|
|
- case T0: // First half of pulse : HIGH around 230us
|
|
|
|
|
|
+ case T0: // First half of pulse
|
|
|
|
|
|
- if(rx_numBits == kToshibaNumberOfBits)
|
|
|
|
|
|
+ if(rx_numBits == kPanasonicNumberOfBits)
|
|
{ // end of frame
|
|
{ // end of frame
|
|
- //ESP_LOGI("T", "END OF FRAME");
|
|
|
|
|
|
+ ESP_LOGI("T", "END OF FRAME");
|
|
rx_state = DONE;
|
|
rx_state = DONE;
|
|
return 1;
|
|
return 1;
|
|
}
|
|
}
|
|
@@ -129,6 +165,7 @@ static int32_t rx_decode(uint32_t width)
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
|
|
+ ESP_LOGI("T", "Err T0");
|
|
return -1; // error, reset
|
|
return -1; // error, reset
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
@@ -144,8 +181,16 @@ static int32_t rx_decode(uint32_t width)
|
|
addBit(1);
|
|
addBit(1);
|
|
//ESP_LOGI("T", "Long %u", rx_numBits);
|
|
//ESP_LOGI("T", "Long %u", rx_numBits);
|
|
}
|
|
}
|
|
|
|
+ else if( GAP_PULSE_MIN <= width && width <= GAP_PULSE_MAX )
|
|
|
|
+ {
|
|
|
|
+ ESP_LOGI("T", "GAP-Pulse. Restart");
|
|
|
|
+ rx_numBits = 0;
|
|
|
|
+ rx_state = UNKNOWN;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
else
|
|
else
|
|
{
|
|
{
|
|
|
|
+ ESP_LOGI("T", "Err T1");
|
|
return -1; // error, reset
|
|
return -1; // error, reset
|
|
}
|
|
}
|
|
rx_state = T0;
|
|
rx_state = T0;
|
|
@@ -164,6 +209,7 @@ uint8_t* nextPulseToshiba_ir(uint32_t width)
|
|
{
|
|
{
|
|
if (rx_state != DONE)
|
|
if (rx_state != DONE)
|
|
{
|
|
{
|
|
|
|
+ // Send the pulse to the decoder
|
|
switch (rx_decode(width))
|
|
switch (rx_decode(width))
|
|
{
|
|
{
|
|
case -1:
|
|
case -1:
|
|
@@ -172,15 +218,15 @@ uint8_t* nextPulseToshiba_ir(uint32_t width)
|
|
case 1:
|
|
case 1:
|
|
rx_state = DONE;
|
|
rx_state = DONE;
|
|
// Check checksum
|
|
// Check checksum
|
|
- if( xorBytes(data,8) == data[8] ) {
|
|
|
|
- memcpy(dataTransfer,data,kToshibaNumberOfBytes);
|
|
|
|
|
|
+ //if( xorBytes(data,8) == data[8] ) {
|
|
|
|
+ memcpy(dataTransfer,data,kPanasonicNumberOfBytes);
|
|
Toshiba_ir_ResetDecoder();
|
|
Toshiba_ir_ResetDecoder();
|
|
retVal = dataTransfer;
|
|
retVal = dataTransfer;
|
|
- }
|
|
|
|
|
|
+ /*}
|
|
else {
|
|
else {
|
|
ESP_LOGE("TOSHIBA", "WRONG CHKSUM");
|
|
ESP_LOGE("TOSHIBA", "WRONG CHKSUM");
|
|
Toshiba_ir_ResetDecoder();
|
|
Toshiba_ir_ResetDecoder();
|
|
- }
|
|
|
|
|
|
+ }*/
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|