diff --git a/Firmware/Tests/test_runner.cpp b/Firmware/Tests/test_runner.cpp index dfaaf981..cd00e93f 100644 --- a/Firmware/Tests/test_runner.cpp +++ b/Firmware/Tests/test_runner.cpp @@ -13,6 +13,7 @@ using std::cout; using std::endl; + struct can_Message_t { uint32_t id = 0x000; // 11-bit max is 0x7ff, 29-bit max is 0x1FFFFFFF bool isExt = false; @@ -22,16 +23,18 @@ struct can_Message_t { }; struct can_Signal_t { - uint8_t startBit = 0; - uint8_t length = 16; - bool isIntel = true; - float factor = 1.0f; - float offset = 0.0f; + const uint8_t startBit; + const uint8_t length; + const bool isIntel; + const float factor; + const float offset; }; + + // Fetch a specific signal from the message template -T getSignal(can_Message_t msg, uint8_t startBit, uint8_t length, bool isIntel, float factor, float offset) { +T can_getSignal(can_Message_t msg, const uint8_t startBit, const uint8_t length, const bool isIntel, const float factor, const float offset) { uint64_t tempVal = 0; uint64_t mask = (1ULL << length) - 1; @@ -49,12 +52,45 @@ T getSignal(can_Message_t msg, uint8_t startBit, uint8_t length, bool isIntel, f return static_cast((retVal * factor) + offset); } +template +void can_setSignal(can_Message_t& msg, const T& val, const uint8_t startBit, const uint8_t length, const bool isIntel, const float factor, const float offset) { + T scaledVal = (val - offset) / factor; + uint64_t valAsBits = 0; + std::memcpy(&valAsBits, &scaledVal, sizeof(scaledVal)); + + uint64_t mask = (1ULL << length) - 1; + + if (isIntel) { + uint64_t data = 0; + std::memcpy(&data, msg.buf, sizeof(data)); + + data &= ~(mask << startBit); + data |= valAsBits << startBit; + + std::memcpy(msg.buf, &data, sizeof(data)); + } else { + uint64_t data = 0; + std::reverse(std::begin(msg.buf), std::end(msg.buf)); + std::memcpy(&data, msg.buf, sizeof(data)); + + data &= ~(mask << (64 - startBit - length)); + data |= valAsBits << (64 - startBit - length); + + std::memcpy(msg.buf, &data, sizeof(data)); + std::reverse(std::begin(msg.buf), std::end(msg.buf)); + } +} + // template // T can_getSignal(can_Message_t msg, can_Signal_t signal){ // return can_getSignal(msg, signal.startBit, signal.length, signal.isIntel, signal.factor, signal.offset); // } -TEST_SUITE("getSignal") { +TEST_CASE("fake"){ + cout << endl; +} + +TEST_SUITE("CAN Functions") { TEST_CASE("reverse") { can_Message_t rxmsg; rxmsg.id = 0x000; @@ -76,15 +112,39 @@ TEST_SUITE("getSignal") { auto val = 0x1234; std::memcpy(rxmsg.buf, &val, sizeof(val)); - val = getSignal(rxmsg, 0, 16, true, 1, 0); + val = can_getSignal(rxmsg, 0, 16, true, 1, 0); CHECK(val == 0x1234); - val = getSignal(rxmsg, 0, 16, false, 1, 0); + val = can_getSignal(rxmsg, 0, 16, false, 1, 0); CHECK(val == 0x3412); float myFloat = 1234.6789f; std::memcpy(rxmsg.buf, &myFloat, sizeof(myFloat)); - auto floatVal = getSignal(rxmsg, 0, 32, true, 1, 0); + auto floatVal = can_getSignal(rxmsg, 0, 32, true, 1, 0); CHECK(floatVal == 1234.6789f); } + + TEST_CASE("setSignal") { + can_Message_t txmsg; + + can_setSignal(txmsg, 0x1234, 0, 16, true, 1.0f, 0.0f); + CHECK(can_getSignal(txmsg, 0, 16, true, 1.0f, 0.0f) == 0x1234); + + can_setSignal(txmsg, 0xABCD, 16, 16, true, 1.0f, 0.0f); + CHECK(can_getSignal(txmsg, 0, 16, true, 1.0f, 0.0f) == 0x1234); + CHECK(can_getSignal(txmsg, 16, 16, true, 1.0f, 0.0f) == 0xABCD); + + can_setSignal(txmsg, 1234.5678f, 32, 32, true, 1.0f, 0.0f); + CHECK(can_getSignal(txmsg, 0, 16, true, 1.0f, 0.0f) == 0x1234); + CHECK(can_getSignal(txmsg, 16, 16, true, 1.0f, 0.0f) == 0xABCD); + CHECK(can_getSignal(txmsg, 32, 32, true, 1.0f, 0.0f)); + + can_setSignal(txmsg, 0x1234, 0, 16, false, 1.0f, 0.0f); + CHECK(can_getSignal(txmsg, 0, 16, false, 1.0f, 0.0f) == 0x1234); + CHECK(can_getSignal(txmsg, 16, 16, true, 1.0f, 0.0f) == 0xABCD); + CHECK(can_getSignal(txmsg, 32, 32, true, 1.0f, 0.0f)); + + can_setSignal(txmsg, 234981.0f, 12, 32, false, 2.0f, 1.1f); + CHECK(can_getSignal(txmsg, 12, 32, false, 2.0f, 1.1f) == 234981.0f); + } } \ No newline at end of file