mirror of
https://github.com/odriverobotics/ODrive.git
synced 2026-09-26 03:23:39 +08:00
Add tests for can_setSignal
This commit is contained in:
@@ -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 <typename T>
|
||||
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<T>((retVal * factor) + offset);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
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<typename T>
|
||||
// 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<uint16_t>(rxmsg, 0, 16, true, 1, 0);
|
||||
val = can_getSignal<uint16_t>(rxmsg, 0, 16, true, 1, 0);
|
||||
CHECK(val == 0x1234);
|
||||
|
||||
val = getSignal<uint16_t>(rxmsg, 0, 16, false, 1, 0);
|
||||
val = can_getSignal<uint16_t>(rxmsg, 0, 16, false, 1, 0);
|
||||
CHECK(val == 0x3412);
|
||||
|
||||
float myFloat = 1234.6789f;
|
||||
std::memcpy(rxmsg.buf, &myFloat, sizeof(myFloat));
|
||||
auto floatVal = getSignal<float>(rxmsg, 0, 32, true, 1, 0);
|
||||
auto floatVal = can_getSignal<float>(rxmsg, 0, 32, true, 1, 0);
|
||||
CHECK(floatVal == 1234.6789f);
|
||||
}
|
||||
|
||||
TEST_CASE("setSignal") {
|
||||
can_Message_t txmsg;
|
||||
|
||||
can_setSignal<uint16_t>(txmsg, 0x1234, 0, 16, true, 1.0f, 0.0f);
|
||||
CHECK(can_getSignal<uint16_t>(txmsg, 0, 16, true, 1.0f, 0.0f) == 0x1234);
|
||||
|
||||
can_setSignal<uint16_t>(txmsg, 0xABCD, 16, 16, true, 1.0f, 0.0f);
|
||||
CHECK(can_getSignal<uint16_t>(txmsg, 0, 16, true, 1.0f, 0.0f) == 0x1234);
|
||||
CHECK(can_getSignal<uint16_t>(txmsg, 16, 16, true, 1.0f, 0.0f) == 0xABCD);
|
||||
|
||||
can_setSignal<float>(txmsg, 1234.5678f, 32, 32, true, 1.0f, 0.0f);
|
||||
CHECK(can_getSignal<uint16_t>(txmsg, 0, 16, true, 1.0f, 0.0f) == 0x1234);
|
||||
CHECK(can_getSignal<uint16_t>(txmsg, 16, 16, true, 1.0f, 0.0f) == 0xABCD);
|
||||
CHECK(can_getSignal<float>(txmsg, 32, 32, true, 1.0f, 0.0f));
|
||||
|
||||
can_setSignal<uint16_t>(txmsg, 0x1234, 0, 16, false, 1.0f, 0.0f);
|
||||
CHECK(can_getSignal<uint16_t>(txmsg, 0, 16, false, 1.0f, 0.0f) == 0x1234);
|
||||
CHECK(can_getSignal<uint16_t>(txmsg, 16, 16, true, 1.0f, 0.0f) == 0xABCD);
|
||||
CHECK(can_getSignal<float>(txmsg, 32, 32, true, 1.0f, 0.0f));
|
||||
|
||||
can_setSignal<float>(txmsg, 234981.0f, 12, 32, false, 2.0f, 1.1f);
|
||||
CHECK(can_getSignal<float>(txmsg, 12, 32, false, 2.0f, 1.1f) == 234981.0f);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user