From 5b415a213d03fa267db63c148589a79447159c68 Mon Sep 17 00:00:00 2001 From: hhvrc Date: Wed, 22 Jan 2025 17:17:34 +0100 Subject: [PATCH 1/4] Clean up encoders Merge petrainer encoders --- include/radio/rmt/CaiXianlinEncoder.h | 5 +- include/radio/rmt/Petrainer998DREncoder.h | 12 ---- include/radio/rmt/PetrainerEncoder.h | 6 +- include/radio/rmt/T330Encoder.h | 5 +- src/radio/rmt/CaiXianlinEncoder.cpp | 24 +++---- src/radio/rmt/MainEncoder.cpp | 35 +++++++++-- src/radio/rmt/Petrainer998DREncoder.cpp | 61 ------------------ src/radio/rmt/PetrainerEncoder.cpp | 76 ++++++++++++++++------- src/radio/rmt/T330Encoder.cpp | 36 +++++++---- 9 files changed, 128 insertions(+), 132 deletions(-) delete mode 100644 include/radio/rmt/Petrainer998DREncoder.h delete mode 100644 src/radio/rmt/Petrainer998DREncoder.cpp diff --git a/include/radio/rmt/CaiXianlinEncoder.h b/include/radio/rmt/CaiXianlinEncoder.h index 36ef4da6..7d801006 100644 --- a/include/radio/rmt/CaiXianlinEncoder.h +++ b/include/radio/rmt/CaiXianlinEncoder.h @@ -8,5 +8,6 @@ namespace OpenShock::Rmt::CaiXianlinEncoder { size_t GetBufferSize(); - bool FillBuffer(rmt_data_t* data, uint16_t shockerId, uint8_t channelId, ShockerCommandType type, uint8_t intensity); -} + uint64_t MakePayload(uint16_t shockerId, uint8_t channel, ShockerCommandType type, uint8_t intensity); + void EncodePayload(rmt_data_t* data, uint64_t payload); +} // namespace OpenShock::Rmt::CaiXianlinEncoder diff --git a/include/radio/rmt/Petrainer998DREncoder.h b/include/radio/rmt/Petrainer998DREncoder.h deleted file mode 100644 index 717966fd..00000000 --- a/include/radio/rmt/Petrainer998DREncoder.h +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once - -#include "ShockerCommandType.h" - -#include - -#include - -namespace OpenShock::Rmt::Petrainer998DREncoder { - size_t GetBufferSize(); - bool FillBuffer(rmt_data_t* data, uint16_t shockerId, ShockerCommandType type, uint8_t intensity); -} diff --git a/include/radio/rmt/PetrainerEncoder.h b/include/radio/rmt/PetrainerEncoder.h index e55b8275..e4ee324f 100644 --- a/include/radio/rmt/PetrainerEncoder.h +++ b/include/radio/rmt/PetrainerEncoder.h @@ -8,5 +8,7 @@ namespace OpenShock::Rmt::PetrainerEncoder { size_t GetBufferSize(); - bool FillBuffer(rmt_data_t* data, uint16_t shockerId, ShockerCommandType type, uint8_t intensity); -} + uint64_t MakePayload(uint16_t shockerId, uint8_t channel, ShockerCommandType type, uint8_t intensity); + void EncodeType1Payload(rmt_data_t* data, uint64_t payload); + void EncodeType2Payload(rmt_data_t* data, uint64_t payload); +} // namespace OpenShock::Rmt::PetrainerEncoder diff --git a/include/radio/rmt/T330Encoder.h b/include/radio/rmt/T330Encoder.h index 87368778..6f6b7122 100644 --- a/include/radio/rmt/T330Encoder.h +++ b/include/radio/rmt/T330Encoder.h @@ -8,5 +8,6 @@ namespace OpenShock::Rmt::T330Encoder { size_t GetBufferSize(); - bool FillBuffer(rmt_data_t* data, uint16_t shockerId, ShockerCommandType type, uint8_t intensity); -} + uint64_t MakePayload(uint16_t shockerId, uint8_t channel, ShockerCommandType type, uint8_t intensity); + void EncodePayload(rmt_data_t* data, uint64_t payload); +} // namespace OpenShock::Rmt::T330Encoder diff --git a/src/radio/rmt/CaiXianlinEncoder.cpp b/src/radio/rmt/CaiXianlinEncoder.cpp index 419d8b71..b028f70c 100644 --- a/src/radio/rmt/CaiXianlinEncoder.cpp +++ b/src/radio/rmt/CaiXianlinEncoder.cpp @@ -22,11 +22,8 @@ size_t Rmt::CaiXianlinEncoder::GetBufferSize() return 44; } -bool Rmt::CaiXianlinEncoder::FillBuffer(rmt_data_t* sequence, uint16_t shockerId, uint8_t channelId, ShockerCommandType type, uint8_t intensity) +uint64_t Rmt::CaiXianlinEncoder::MakePayload(uint16_t shockerId, uint8_t channel, ShockerCommandType type, uint8_t intensity) { - // Intensity must be between 0 and 99 - intensity = std::min(intensity, static_cast(99)); - uint8_t typeVal = 0; switch (type) { case ShockerCommandType::Shock: @@ -40,11 +37,14 @@ bool Rmt::CaiXianlinEncoder::FillBuffer(rmt_data_t* sequence, uint16_t shockerId intensity = 0; // Sound intensity must be 0 for some shockers, otherwise it wont work, or they soft lock until restarted break; default: - return false; // Invalid type + return 0; // Invalid type } - // Payload layout: [shockerId:16][channelId:4][type:4][intensity:8] - uint32_t payload = (static_cast(shockerId) << 16) | (static_cast(channelId & 0xF) << 12) | (static_cast(typeVal & 0xF) << 8) | static_cast(intensity); + // Intensity must be between 0 and 99 + intensity = std::min(intensity, static_cast(99)); + + // Payload layout: [shockerId:16][channel:4][type:4][intensity:8] + uint32_t payload = (static_cast(shockerId) << 16) | (static_cast(channel & 0xF) << 12) | (static_cast(typeVal & 0xF) << 8) | static_cast(intensity); // Calculate the checksum of the payload uint8_t checksum = Checksum::Sum8(payload); @@ -53,11 +53,11 @@ bool Rmt::CaiXianlinEncoder::FillBuffer(rmt_data_t* sequence, uint16_t shockerId uint64_t data = (static_cast(payload) << 8) | static_cast(checksum); // Shift the data left by 3 bits to add the postamble (3 bits of 0) - data <<= 3; + return data << 3; +} - // Generate the sequence +void Rmt::CaiXianlinEncoder::EncodePayload(rmt_data_t* sequence, uint64_t payload) +{ sequence[0] = kRmtPreamble; - Rmt::Internal::EncodeBits<43>(sequence + 1, data, kRmtOne, kRmtZero); - - return true; + Rmt::Internal::EncodeBits<43>(sequence + 1, payload, kRmtOne, kRmtZero); } diff --git a/src/radio/rmt/MainEncoder.cpp b/src/radio/rmt/MainEncoder.cpp index 79cafd50..375ae755 100644 --- a/src/radio/rmt/MainEncoder.cpp +++ b/src/radio/rmt/MainEncoder.cpp @@ -4,7 +4,6 @@ const char* const TAG = "RmtMainEncoder"; #include "Logging.h" #include "radio/rmt/CaiXianlinEncoder.h" -#include "radio/rmt/Petrainer998DREncoder.h" #include "radio/rmt/PetrainerEncoder.h" #include "radio/rmt/T330Encoder.h" @@ -16,7 +15,6 @@ static size_t getSequenceBufferSize(ShockerModelType shockerModelType) case ShockerModelType::CaiXianlin: return Rmt::CaiXianlinEncoder::GetBufferSize(); case ShockerModelType::Petrainer998DR: - return Rmt::Petrainer998DREncoder::GetBufferSize(); case ShockerModelType::Petrainer: return Rmt::PetrainerEncoder::GetBufferSize(); default: @@ -39,11 +37,38 @@ bool Rmt::MainEncoder::fillSequence(ShockerCommandType commandType, uint8_t inte { switch (m_shockerModel) { case ShockerModelType::CaiXianlin: - return Rmt::CaiXianlinEncoder::FillBuffer(m_data, m_shockerId, 0, commandType, intensity) && Rmt::CaiXianlinEncoder::FillBuffer(m_data + m_size, m_shockerId, 0, ShockerCommandType::Vibrate, 0); + { + uint64_t payload = Rmt::CaiXianlinEncoder::MakePayload(m_shockerId, 0, commandType, intensity); + uint64_t terminator = Rmt::CaiXianlinEncoder::MakePayload(m_shockerId, 0, ShockerCommandType::Vibrate, 0); + if (payload == 0 || terminator == 0) return false; + + Rmt::CaiXianlinEncoder::EncodePayload(m_data, payload); + Rmt::CaiXianlinEncoder::EncodePayload(m_data + m_size, terminator); + + return true; + } case ShockerModelType::Petrainer: - return Rmt::PetrainerEncoder::FillBuffer(m_data, m_shockerId, commandType, intensity) && Rmt::PetrainerEncoder::FillBuffer(m_data + m_size, m_shockerId, ShockerCommandType::Vibrate, 0); case ShockerModelType::Petrainer998DR: - return Rmt::Petrainer998DREncoder::FillBuffer(m_data, m_shockerId, commandType, intensity) && Rmt::Petrainer998DREncoder::FillBuffer(m_data + m_size, m_shockerId, ShockerCommandType::Vibrate, 0); + { + uint64_t payload = Rmt::PetrainerEncoder::MakePayload(m_shockerId, 1, commandType, intensity); + uint64_t terminator = Rmt::PetrainerEncoder::MakePayload(m_shockerId, 1, ShockerCommandType::Vibrate, 0); + if (payload == 0 || terminator == 0) return false; + + switch (m_shockerModel) { + case ShockerModelType::Petrainer: + Rmt::PetrainerEncoder::EncodeType1Payload(m_data, payload); + Rmt::PetrainerEncoder::EncodeType1Payload(m_data + m_size, terminator); + break; + case ShockerModelType::Petrainer998DR: + Rmt::PetrainerEncoder::EncodeType2Payload(m_data, payload); + Rmt::PetrainerEncoder::EncodeType2Payload(m_data + m_size, terminator); + break; + default: + return false; + } + + return true; + } default: OS_LOGE(TAG, "Unknown shocker model: %u", m_shockerModel); return false; diff --git a/src/radio/rmt/Petrainer998DREncoder.cpp b/src/radio/rmt/Petrainer998DREncoder.cpp deleted file mode 100644 index 2572bb8b..00000000 --- a/src/radio/rmt/Petrainer998DREncoder.cpp +++ /dev/null @@ -1,61 +0,0 @@ -#include "radio/rmt/Petrainer998DREncoder.h" - -#include "radio/rmt/internal/Shared.h" - -#include "Checksum.h" - -#include - -const rmt_data_t kRmtPreamble = {1500, 1, 750, 0}; -const rmt_data_t kRmtOne = {750, 1, 250, 0}; -const rmt_data_t kRmtZero = {250, 1, 750, 0}; -const rmt_data_t kRmtPostamble = {250, 1, 3750, 0}; // Some subvariants expect a quiet period between commands, this is a last 1 bit followed by a very long pause - -using namespace OpenShock; - -size_t Rmt::Petrainer998DREncoder::GetBufferSize() -{ - return 42; -} - -bool Rmt::Petrainer998DREncoder::FillBuffer(rmt_data_t* sequence, uint16_t shockerId, ShockerCommandType type, uint8_t intensity) -{ - // Intensity must be between 0 and 100 - intensity = std::min(intensity, static_cast(100)); - - int typeShift = 0; - switch (type) { - case ShockerCommandType::Shock: - typeShift = 0; - break; - case ShockerCommandType::Vibrate: - typeShift = 1; - break; - case ShockerCommandType::Sound: - typeShift = 2; - break; - case ShockerCommandType::Light: - typeShift = 3; - break; - default: - return false; // Invalid type - } - - uint8_t typeVal = 1 << typeShift; - uint8_t typeInvert = Checksum::ReverseInverseNibble(typeVal); - - // TODO: Channel argument? - uint8_t channel = 0b1000; // Can be [1000] for CH1 or [1111] for CH2, 4 bits wide - uint8_t channelInvert = Checksum::ReverseInverseNibble(channel); - - // Payload layout: [channel:4][typeVal:4][shockerID:16][intensity:8][typeInvert:4][channelInvert:4] (40 bits) - uint64_t data - = (static_cast(channel & 0xF) << 36 | static_cast(typeVal & 0xF) << 32 | static_cast(shockerId & 0xFFFF) << 16 | static_cast(intensity & 0xFF) << 8 | static_cast(typeInvert & 0xF) << 4 | static_cast(channelInvert & 0xF)); - - // Generate the sequence - sequence[0] = kRmtPreamble; - Rmt::Internal::EncodeBits<40>(sequence + 1, data, kRmtOne, kRmtZero); - sequence[41] = kRmtPostamble; - - return true; -} diff --git a/src/radio/rmt/PetrainerEncoder.cpp b/src/radio/rmt/PetrainerEncoder.cpp index 64afa549..b083f3af 100644 --- a/src/radio/rmt/PetrainerEncoder.cpp +++ b/src/radio/rmt/PetrainerEncoder.cpp @@ -2,12 +2,21 @@ #include "radio/rmt/internal/Shared.h" +#include "Checksum.h" + #include -const rmt_data_t kRmtPreamble = {750, 1, 750, 0}; -const rmt_data_t kRmtOne = {200, 1, 1500, 0}; -const rmt_data_t kRmtZero = {200, 1, 750, 0}; -const rmt_data_t kRmtPostamble = {200, 1, 7000, 0}; +// Base +const rmt_data_t kV1RmtPreamble = {750, 1, 750, 0}; +const rmt_data_t kV1RmtOne = {200, 1, 1500, 0}; +const rmt_data_t kV1RmtZero = {200, 1, 750, 0}; +const rmt_data_t kV1RmtPostamble = {200, 1, 7000, 0}; + +// 998DR Type 1 +const rmt_data_t kV2RmtPreamble = {1500, 1, 750, 0}; +const rmt_data_t kV2RmtOne = {750, 1, 250, 0}; +const rmt_data_t kV2RmtZero = {250, 1, 750, 0}; +const rmt_data_t kV2RmtPostamble = {250, 1, 3750, 0}; // Some subvariants expect a quiet period between commands, this is a last 1 bit followed by a very long pause using namespace OpenShock; @@ -16,39 +25,60 @@ size_t Rmt::PetrainerEncoder::GetBufferSize() return 42; } -bool Rmt::PetrainerEncoder::FillBuffer(rmt_data_t* sequence, uint16_t shockerId, ShockerCommandType type, uint8_t intensity) +uint64_t Rmt::PetrainerEncoder::MakePayload(uint16_t shockerId, uint8_t channel, ShockerCommandType type, uint8_t intensity) { - // Intensity must be between 0 and 100 - intensity = std::min(intensity, static_cast(100)); - - uint8_t nShift = 0; + uint8_t typeVal = 0; switch (type) { case ShockerCommandType::Shock: - nShift = 0; + typeVal = 0b0001; break; case ShockerCommandType::Vibrate: - nShift = 1; + typeVal = 0b0010; break; case ShockerCommandType::Sound: - nShift = 2; + typeVal = 0b0100; + break; + case ShockerCommandType::Light: + typeVal = 0b1000; + break; + default: + return 0; // Invalid command type + } + + uint8_t channelVal = 0; + switch (channel) { + case 1: + typeVal = 0b1000; + break; + case 2: + typeVal = 0b1111; break; default: - return false; // Invalid type + return 0; // Invalid channel } - // Type is 0x80 | (0x01 << nShift) - uint8_t typeVal = (0x80 | (0x01 << nShift)) & 0xFF; + // Intensity must be between 0 and 100 + intensity = std::min(intensity, static_cast(100)); - // TypeSum is NOT(0x01 | (0x80 >> nShift)) - uint8_t typeSum = (~(0x01 | (0x80 >> nShift))) & 0xFF; + uint8_t channelInvert = Checksum::ReverseInverseNibble(channelVal); + uint8_t typeInvert = Checksum::ReverseInverseNibble(typeVal); - // Payload layout: [methodBit:8][shockerId:16][intensity:8][methodChecksum:8] - uint64_t data = (static_cast(typeVal) << 32) | (static_cast(shockerId) << 16) | (static_cast(intensity) << 8) | static_cast(typeSum); + // Payload layout: [channel:4][type:4][shockerID:16][intensity:8][typeInvert:4][channelInvert:4] (40 bits) + return static_cast(channelVal) << 36 | static_cast(typeVal) << 32 | static_cast(shockerId) << 16 | static_cast(intensity) << 8 | static_cast(typeInvert) << 4 | static_cast(channelInvert); +} +void Rmt::PetrainerEncoder::EncodeType1Payload(rmt_data_t* sequence, uint64_t payload) +{ // Generate the sequence - sequence[0] = kRmtPreamble; - Rmt::Internal::EncodeBits<40>(sequence + 1, data, kRmtOne, kRmtZero); - sequence[41] = kRmtPostamble; + sequence[0] = kV1RmtPreamble; + Rmt::Internal::EncodeBits<40>(sequence + 1, payload, kV1RmtOne, kV1RmtZero); + sequence[41] = kV1RmtPostamble; +} - return true; +void Rmt::PetrainerEncoder::EncodeType2Payload(rmt_data_t* sequence, uint64_t payload) +{ + // Generate the sequence + sequence[0] = kV2RmtPreamble; + Rmt::Internal::EncodeBits<40>(sequence + 1, payload, kV2RmtOne, kV2RmtZero); + sequence[41] = kV2RmtPostamble; } diff --git a/src/radio/rmt/T330Encoder.cpp b/src/radio/rmt/T330Encoder.cpp index e361e73e..84d01523 100644 --- a/src/radio/rmt/T330Encoder.cpp +++ b/src/radio/rmt/T330Encoder.cpp @@ -16,11 +16,8 @@ size_t Rmt::T330Encoder::GetBufferSize() return 43; } -bool Rmt::T330Encoder::FillBuffer(rmt_data_t* sequence, uint16_t shockerId, ShockerCommandType type, uint8_t intensity) +uint64_t Rmt::T330Encoder::MakePayload(uint16_t shockerId, uint8_t channel, ShockerCommandType type, uint8_t intensity) { - // Intensity must be between 0 and 100 - intensity = std::min(intensity, static_cast(100)); - uint8_t typeVal = 0; switch (type) { case ShockerCommandType::Shock: @@ -37,19 +34,32 @@ bool Rmt::T330Encoder::FillBuffer(rmt_data_t* sequence, uint16_t shockerId, Shoc return false; // Invalid type } - uint8_t channelId = 0; // CH1 is 0b0000 and CH2 is 0b1110 on my remote but other values probably work. + uint8_t channelVal = 0; // CH1 is 0b0000 and CH2 is 0b1110 on my remote but other values probably work. + switch (channel) { + case 1: + channelVal = 0b0000; + break; + case 2: + channelVal = 0b1110; + break; + default: + return false; // Invalid channel + } - // Payload layout: [channelId:4][typeU:4][transmitterId:16][intensity:8][typeL:4][channelId:4] - uint64_t data = (static_cast(channelId & 0xF) << 36) | (static_cast(typeVal & 0xF0) << 28) | (static_cast(shockerId) << 16) | (static_cast(intensity) << 8) | (static_cast(typeVal & 0xF) << 4) - | static_cast(channelId & 0xF); + // Intensity must be between 0 and 100 + intensity = std::min(intensity, static_cast(100)); + + // Payload layout: [channel:4][typeU:4][transmitterId:16][intensity:8][typeL:4][channel:4] + uint64_t payload = (static_cast(channelVal & 0xF) << 36) | (static_cast(typeVal & 0xF0) << 28) | (static_cast(shockerId) << 16) | (static_cast(intensity) << 8) | (static_cast(typeVal & 0xF) << 4) + | static_cast(channelVal & 0xF); // Shift the data left by 1 bit to append a zero - data <<= 1; + return payload << 1; +} - // Generate the sequence +void Rmt::T330Encoder::EncodePayload(rmt_data_t* sequence, uint64_t payload) +{ sequence[0] = kRmtPreamble; - Rmt::Internal::EncodeBits<41>(sequence + 1, data, kRmtOne, kRmtZero); + Rmt::Internal::EncodeBits<41>(sequence + 1, payload, kRmtOne, kRmtZero); sequence[42] = kRmtPostamble; - - return true; } From 5c8b915aa5fdc3d3978a3753007837dc832326fc Mon Sep 17 00:00:00 2001 From: hhvrc Date: Wed, 22 Jan 2025 17:22:25 +0100 Subject: [PATCH 2/4] Remove unnecessary bit-masking --- src/radio/rmt/CaiXianlinEncoder.cpp | 2 +- src/radio/rmt/T330Encoder.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/radio/rmt/CaiXianlinEncoder.cpp b/src/radio/rmt/CaiXianlinEncoder.cpp index b028f70c..90d479a9 100644 --- a/src/radio/rmt/CaiXianlinEncoder.cpp +++ b/src/radio/rmt/CaiXianlinEncoder.cpp @@ -44,7 +44,7 @@ uint64_t Rmt::CaiXianlinEncoder::MakePayload(uint16_t shockerId, uint8_t channel intensity = std::min(intensity, static_cast(99)); // Payload layout: [shockerId:16][channel:4][type:4][intensity:8] - uint32_t payload = (static_cast(shockerId) << 16) | (static_cast(channel & 0xF) << 12) | (static_cast(typeVal & 0xF) << 8) | static_cast(intensity); + uint32_t payload = (static_cast(shockerId) << 16) | (static_cast(channel & 0xF) << 12) | (static_cast(typeVal) << 8) | static_cast(intensity); // Calculate the checksum of the payload uint8_t checksum = Checksum::Sum8(payload); diff --git a/src/radio/rmt/T330Encoder.cpp b/src/radio/rmt/T330Encoder.cpp index 84d01523..a16cf3e8 100644 --- a/src/radio/rmt/T330Encoder.cpp +++ b/src/radio/rmt/T330Encoder.cpp @@ -50,8 +50,8 @@ uint64_t Rmt::T330Encoder::MakePayload(uint16_t shockerId, uint8_t channel, Shoc intensity = std::min(intensity, static_cast(100)); // Payload layout: [channel:4][typeU:4][transmitterId:16][intensity:8][typeL:4][channel:4] - uint64_t payload = (static_cast(channelVal & 0xF) << 36) | (static_cast(typeVal & 0xF0) << 28) | (static_cast(shockerId) << 16) | (static_cast(intensity) << 8) | (static_cast(typeVal & 0xF) << 4) - | static_cast(channelVal & 0xF); + uint64_t payload = (static_cast(channelVal) << 36) | (static_cast(typeVal & 0xF0) << 28) | (static_cast(shockerId) << 16) | (static_cast(intensity) << 8) | (static_cast(typeVal & 0xF) << 4) + | static_cast(channelVal); // Shift the data left by 1 bit to append a zero return payload << 1; From 7313c3a7bf2ba11b4ec80f90e334392a9f2e690c Mon Sep 17 00:00:00 2001 From: hhvrc Date: Wed, 22 Jan 2025 17:27:01 +0100 Subject: [PATCH 3/4] Fix T330 MakePayload return value on error --- src/radio/rmt/T330Encoder.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/radio/rmt/T330Encoder.cpp b/src/radio/rmt/T330Encoder.cpp index a16cf3e8..d2e67331 100644 --- a/src/radio/rmt/T330Encoder.cpp +++ b/src/radio/rmt/T330Encoder.cpp @@ -31,7 +31,7 @@ uint64_t Rmt::T330Encoder::MakePayload(uint16_t shockerId, uint8_t channel, Shoc intensity = 0; // The remote always sends 0, I don't know what happens if you send something else. break; default: - return false; // Invalid type + return 0; // Invalid type } uint8_t channelVal = 0; // CH1 is 0b0000 and CH2 is 0b1110 on my remote but other values probably work. @@ -43,7 +43,7 @@ uint64_t Rmt::T330Encoder::MakePayload(uint16_t shockerId, uint8_t channel, Shoc channelVal = 0b1110; break; default: - return false; // Invalid channel + return 0; // Invalid channel } // Intensity must be between 0 and 100 From 90cf1e30f97f3f03527058c7423ba51600b70914 Mon Sep 17 00:00:00 2001 From: hhvrc Date: Wed, 22 Jan 2025 17:30:34 +0100 Subject: [PATCH 4/4] Remove unnecessary const ref params on EncodeBits func --- include/radio/rmt/internal/Shared.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/radio/rmt/internal/Shared.h b/include/radio/rmt/internal/Shared.h index 23bd6fb7..f2786cf7 100644 --- a/include/radio/rmt/internal/Shared.h +++ b/include/radio/rmt/internal/Shared.h @@ -8,7 +8,7 @@ namespace OpenShock::Rmt::Internal { template - constexpr void EncodeBits(rmt_data_t* sequence, T data, const rmt_data_t& rmtOne, const rmt_data_t& rmtZero) + constexpr void EncodeBits(rmt_data_t* sequence, T data, rmt_data_t rmtOne, rmt_data_t rmtZero) { static_assert(std::is_unsigned::value, "T must be an unsigned integer"); static_assert(N > 0, "N must be greater than 0");