|
@@ -10,17 +10,31 @@
|
|
|
|
|
|
#ifdef IR_TRANSMIT
|
|
#ifdef IR_TRANSMIT
|
|
|
|
|
|
|
|
+extern uint8_t bitReverse(uint8_t b);
|
|
|
|
+
|
|
// RMT values
|
|
// RMT values
|
|
#define RMT_TX_CHANNEL RMT_CHANNEL_0
|
|
#define RMT_TX_CHANNEL RMT_CHANNEL_0
|
|
#define RMT_TX_GPIO GPIO_NUM_26
|
|
#define RMT_TX_GPIO GPIO_NUM_26
|
|
// channel clock period = 1 uS
|
|
// channel clock period = 1 uS
|
|
#define RMT_CLK_DIV 80
|
|
#define RMT_CLK_DIV 80
|
|
|
|
|
|
-// Variable that holds the IR protocol transmission. 1 start bit, 72 data bits and one stop bit
|
|
|
|
-rmt_item32_t toshiba_rmt[1 + 72 + 1 + 1];
|
|
|
|
|
|
+// Variable that holds the IR protocol transmission. 1 start bit, 8*8+19*8 data bits and one stop bit
|
|
|
|
+#define RMT_BITS (1+64+1+1+152+1+1) // 221 bits in total
|
|
|
|
+rmt_item32_t toshiba_rmt[RMT_BITS];
|
|
|
|
|
|
QueueHandle_t toshibaTxQueue = NULL;
|
|
QueueHandle_t toshibaTxQueue = NULL;
|
|
|
|
|
|
|
|
+void copyDataToRmtArray( const uint8_t rmtStartBit, const uint8_t* data, const uint8_t noOfBytes, const bool reverseByte) {
|
|
|
|
+ for(uint8_t b=0;b<noOfBytes*8;b++) {
|
|
|
|
+ uint8_t byteNo = b / 8;
|
|
|
|
+ uint8_t byte = (reverseByte) ? bitReverse(data[byteNo]) : data[byteNo];
|
|
|
|
+ uint8_t shiftBits = b % 8;
|
|
|
|
+ uint8_t bit_data = (1u << (7-shiftBits)) & byte;
|
|
|
|
+ uint32_t space = bit_data ? kPanasonicAcOneSpace : kPanasonicAcZeroSpace;
|
|
|
|
+ toshiba_rmt[b+rmtStartBit].val = (kPanasonicAcBitMark << 0) | (1 << 15) | (space << 16);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
void toshibaTxTask(void *pvParameter)
|
|
void toshibaTxTask(void *pvParameter)
|
|
{
|
|
{
|
|
ESP_LOGI("IR_TRANSMIT", "toshibaTxTask() starting.");
|
|
ESP_LOGI("IR_TRANSMIT", "toshibaTxTask() starting.");
|
|
@@ -32,14 +46,14 @@ void toshibaTxTask(void *pvParameter)
|
|
ESP_LOGI("IR_TRANSMIT","Received a TX from MQTT");
|
|
ESP_LOGI("IR_TRANSMIT","Received a TX from MQTT");
|
|
|
|
|
|
uint8_t irPair = 1;
|
|
uint8_t irPair = 1;
|
|
- for(uint8_t b=0;b<kToshibaNumberOfBits;b++) {
|
|
|
|
|
|
+ for(uint8_t b=0;b<kPanasonicNumberOfBits;b++) {
|
|
|
|
|
|
uint8_t byteNo = b / 8;
|
|
uint8_t byteNo = b / 8;
|
|
uint8_t shiftBits = b % 8;
|
|
uint8_t shiftBits = b % 8;
|
|
uint8_t bit_data = (1u << (7-shiftBits)) & data[byteNo];
|
|
uint8_t bit_data = (1u << (7-shiftBits)) & data[byteNo];
|
|
- uint32_t space = bit_data ? kToshibaAcOneSpace : kToshibaAcZeroSpace;
|
|
|
|
|
|
+ uint32_t space = bit_data ? kPanasonicAcOneSpace : kPanasonicAcZeroSpace;
|
|
|
|
|
|
- toshiba_rmt[irPair].val = (kToshibaAcBitMark << 0) | (1 << 15) | (space << 16); // Header of IR Transmit
|
|
|
|
|
|
+ toshiba_rmt[irPair].val = (kPanasonicAcBitMark << 0) | (1 << 15) | (space << 16); // Header of IR Transmit
|
|
|
|
|
|
irPair++;
|
|
irPair++;
|
|
}
|
|
}
|
|
@@ -83,18 +97,35 @@ void initIrTransmit() {
|
|
|
|
|
|
//ESP_ERROR_CHECK( rmt_driver_install(rmt_tx.channel, 0, 0) );
|
|
//ESP_ERROR_CHECK( rmt_driver_install(rmt_tx.channel, 0, 0) );
|
|
|
|
|
|
- // Init the ir data field
|
|
|
|
- toshiba_rmt[0].val = (kToshibaAcHdrMark << 0) | (1 << 15) | (kToshibaAcHdrSpace << 16); // Header of IR Transmit
|
|
|
|
- toshiba_rmt[73].val = (kToshibaAcBitMark << 0) | (1 << 15) | (kToshibaAcZeroSpace << 16); // Header of IR Transmit
|
|
|
|
- toshiba_rmt[74].val = (1 << 16); // End marker
|
|
|
|
-
|
|
|
|
- // 0x47503FC
|
|
|
|
- // 0x1FE823A
|
|
|
|
-
|
|
|
|
- for(int i=1;i<73;i++) {
|
|
|
|
-
|
|
|
|
- toshiba_rmt[i].val = (kToshibaAcBitMark << 0) | (1 << 15) | (kToshibaAcZeroSpace << 16); // Header of IR Transmit
|
|
|
|
- }
|
|
|
|
|
|
+ // Init the ir default Panasonic IR data field
|
|
|
|
+ /**
|
|
|
|
+ * The IR is divided into 2 parts
|
|
|
|
+ * 0 Start
|
|
|
|
+ * 1 64 fixed bits
|
|
|
|
+ * 65 A gap
|
|
|
|
+ * 66 Start (again)
|
|
|
|
+ * 67 152 bits with data
|
|
|
|
+ * 219 Stop
|
|
|
|
+ * 220 End-marker (Not sent)
|
|
|
|
+ *
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+ toshiba_rmt[0].val = (kPanasonicAcHdrMark << 0) | (1 << 15) | (kPanasonicAcHdrSpace << 16);
|
|
|
|
+ toshiba_rmt[65].val = (kPanasonicAcBitMark << 0) | (1 << 15) | (kPanasonicAcUsualGap << 16);
|
|
|
|
+ toshiba_rmt[66].val = (kPanasonicAcHdrMark << 0) | (1 << 15) | (kPanasonicAcHdrSpace << 16);
|
|
|
|
+ toshiba_rmt[219].val = (kPanasonicAcBitMark << 0) | (1 << 15) | (kPanasonicAcZeroSpace << 16);
|
|
|
|
+ toshiba_rmt[220].val = (1 << 16); // RMT End marker
|
|
|
|
+
|
|
|
|
+ // Setup the fixed 64 bits: 0x4004072000000060 (Sent like this)
|
|
|
|
+ const uint8_t fixedData[8]={0x40,0x04,0x07,0x20,0x0,0x00,0x0,0x60};
|
|
|
|
+ //memcpy(data,(void *)&fixedData[0],8); // Copy the fixed data
|
|
|
|
+ copyDataToRmtArray(1,fixedData,8,false);
|
|
|
|
+
|
|
|
|
+ // Setup the the real 152 data bits
|
|
|
|
+ const uint8_t confData[19]={0x02,0x20,0xE0,0x04,0x00,0x49,0x31,0x86,
|
|
|
|
+ 0xA3,0x06,0x00,0x0E,0xE0,0x00,0x00,0x89,
|
|
|
|
+ 0x00,0x00,0x20 };
|
|
|
|
+ copyDataToRmtArray(67,confData,19,true);
|
|
|
|
|
|
toshibaTxQueue = xQueueCreate( 5, kPanasonicNumberOfBytes );
|
|
toshibaTxQueue = xQueueCreate( 5, kPanasonicNumberOfBytes );
|
|
xTaskCreatePinnedToCore(toshibaTxTask, "toshibaTxTask", 1024*10, NULL, 2, NULL,0);
|
|
xTaskCreatePinnedToCore(toshibaTxTask, "toshibaTxTask", 1024*10, NULL, 2, NULL,0);
|