diff --git a/IR_Encoder.cpp b/IR_Encoder.cpp index e4de370..7f2800b 100644 --- a/IR_Encoder.cpp +++ b/IR_Encoder.cpp @@ -6,7 +6,7 @@ #define TestOut 13 IR_Encoder::IR_Encoder(uint16_t addr, uint8_t pin, uint8_t tune = 0, IR_Decoder* decPair) { - sendBuffer = new uint8_t[dataByteSizeMax] { 0 }; + // sendBuffer = new uint8_t[dataByteSizeMax] { 0 }; ir_out = pin; pinMode(ir_out, OUTPUT); addrSelf = addr; @@ -21,7 +21,7 @@ IR_Encoder::IR_Encoder(uint16_t addr, uint8_t pin, uint8_t tune = 0, IR_Decoder* IR_Encoder::~IR_Encoder() { delete [] bitHigh; delete [] bitLow; - delete [] sendBuffer; + // delete [] sendBuffer; }; void IR_Encoder::sendData(uint16_t addrTo, uint8_t* data, uint8_t len, bool needAccept = false) { @@ -32,99 +32,87 @@ void IR_Encoder::sendData(uint16_t addrTo, uint8_t* data, uint8_t len, bool nee } void IR_Encoder::sendACK(uint16_t addrTo, uint8_t addInfo, bool forAll = false) { - uint8_t* ptr = new uint8_t[msgBytes + addrBytes + crcBytes] { 0 }; - - ptr[0] = IR_MSG_ACCEPT << 5; - ptr[0] |= addInfo & IR_MASK_MSG_INFO; + memset(sendBuffer, 0x00, dataByteSizeMax); + sendBuffer[0] = IR_MSG_ACCEPT << 5; + sendBuffer[0] |= addInfo & IR_MASK_MSG_INFO; // addr_self if (!forAll) { - ptr[1] = addrSelf >> 8 & 0xFF; - ptr[2] = addrSelf & 0xFF; + sendBuffer[1] = addrSelf >> 8 & 0xFF; + sendBuffer[2] = addrSelf & 0xFF; } // data crc - ptr[3] = crc8(ptr, 0, 3, poly1) & 0xFF; - ptr[4] = crc8(ptr, 0, 4, poly2) & 0xFF; + sendBuffer[3] = crc8(sendBuffer, 0, 3, poly1) & 0xFF; + sendBuffer[4] = crc8(sendBuffer, 0, 4, poly2) & 0xFF; - rawSend(ptr, msgBytes + addrBytes + crcBytes); - - // освобождение ресурсов - delete ptr; - ptr = nullptr; + rawSend(sendBuffer, msgBytes + addrBytes + crcBytes); } void IR_Encoder::sendRequest(uint16_t addrTo, uint8_t addInfo) { - uint8_t* ptr = new uint8_t[msgBytes + addrBytes + crcBytes] { 0 }; - - ptr[0] = IR_MSG_REQUEST << 5; - ptr[0] |= addInfo & IR_MASK_MSG_INFO; + memset(sendBuffer, 0x00, dataByteSizeMax); + sendBuffer[0] = IR_MSG_REQUEST << 5; + sendBuffer[0] |= addInfo & IR_MASK_MSG_INFO; // addr_self - ptr[1] = addrSelf >> 8 & 0xFF; - ptr[2] = addrSelf & 0xFF; + sendBuffer[1] = addrSelf >> 8 & 0xFF; + sendBuffer[2] = addrSelf & 0xFF; //addr_to - ptr[3] = addrTo >> 8 & 0xFF; - ptr[4] = addrTo & 0xFF; + sendBuffer[3] = addrTo >> 8 & 0xFF; + sendBuffer[4] = addrTo & 0xFF; // data crc - ptr[5] = crc8(ptr, 0, 5, poly1) & 0xFF; - ptr[6] = crc8(ptr, 0, 6, poly2) & 0xFF; + sendBuffer[5] = crc8(sendBuffer, 0, 5, poly1) & 0xFF; + sendBuffer[6] = crc8(sendBuffer, 0, 6, poly2) & 0xFF; - rawSend(ptr, msgBytes + addrBytes + addrBytes + crcBytes); - - // освобождение ресурсов - delete ptr; - ptr = nullptr; + rawSend(sendBuffer, msgBytes + addrBytes + addrBytes + crcBytes); } void IR_Encoder::_sendData(uint16_t addrTo, uint8_t* data, uint8_t len, uint8_t msgType) { + memset(sendBuffer, 0x00, dataByteSizeMax); uint8_t packSize = msgBytes + addrBytes + addrBytes + len + crcBytes; uint8_t dataStart = msgBytes + addrBytes + addrBytes; - // создание массива для отправки - uint8_t* ptr = new uint8_t[packSize] { 0 }; - //memset(ptr, 0, sizeof(ptr)); - // формирование массива // msg_type - ptr[0] = msgType; + sendBuffer[0] = msgType; // addr_self - ptr[1] = addrSelf >> 8 & 0xFF; - ptr[2] = addrSelf & 0xFF; + sendBuffer[1] = addrSelf >> 8 & 0xFF; + sendBuffer[2] = addrSelf & 0xFF; // addr_to - ptr[3] = addrTo >> 8 & 0xFF; - ptr[4] = addrTo & 0xFF; + sendBuffer[3] = addrTo >> 8 & 0xFF; + sendBuffer[4] = addrTo & 0xFF; for (uint16_t i = dataStart; i < dataStart + len; i++) { - ptr[i] = ((uint8_t*)data)[i - dataStart]; + sendBuffer[i] = ((uint8_t*)data)[i - dataStart]; } // data crc - ptr[packSize - crcBytes] = crc8(ptr, 0, packSize - crcBytes, poly1) & 0xFF; - ptr[packSize - crcBytes + 1] = crc8(ptr, 0, packSize - crcBytes + 1, poly2) & 0xFF; + sendBuffer[packSize - crcBytes] = crc8(sendBuffer, 0, packSize - crcBytes, poly1) & 0xFF; + sendBuffer[packSize - crcBytes + 1] = crc8(sendBuffer, 0, packSize - crcBytes + 1, poly2) & 0xFF; if (decoder != nullptr) { decoder->isWaitingAccept = ((msgType >> 5) & IR_MASK_MSG_TYPE == IR_MSG_DATA_ACCEPT); decoder->addrWaitingFrom = addrTo; } // отправка - rawSend(ptr, packSize); - - // освобождение ресурсов - delete ptr; - ptr = nullptr; + rawSend(sendBuffer, packSize); } void IR_Encoder::rawSend(uint8_t* ptr, uint8_t len) { + if(isSending){ + //TODO: Обработка повторной отправки + return; + } + digitalToggle(9); digitalToggle(9); - memset(sendBuffer, 0x00, dataByteSizeMax); - memcpy(sendBuffer, ptr, len); + // memset(sendBuffer, 0x00, dataByteSizeMax); + // memcpy(sendBuffer, ptr, len); sendLen = len; // *sendBuffer = 0b10010011; isSending = true; diff --git a/IR_Encoder.h b/IR_Encoder.h index f5652e9..3070a86 100644 --- a/IR_Encoder.h +++ b/IR_Encoder.h @@ -52,7 +52,8 @@ private: }; uint8_t sendLen; - uint8_t* sendBuffer; /// @brief Буффер данных для отправки + uint8_t sendBuffer[dataByteSizeMax] { 0 }; /// @brief Буффер данных для отправки + // uint8_t volatile bool isSending = false; // volatile bool genState = HIGH;