Skip to content
This repository was archived by the owner on Dec 1, 2020. It is now read-only.

Commit 4231b1c

Browse files
Merge branch 'develop' into feature/PM-429-use-sw-files-from-esm-repo
2 parents 26ba7e6 + 8fa120e commit 4231b1c

File tree

3 files changed

+46
-20
lines changed

3 files changed

+46
-20
lines changed

march_hardware/include/march_hardware/PDOmap.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@ namespace march
1616
struct IMCObject
1717
{
1818
uint16_t address; // in IMC memory (see IMC manual)
19-
uint16_t length; // bits (see IMC manual)
19+
uint8_t sub_index; // sub index corresponding to PDO register (see IMC manual)
20+
uint8_t length; // bits (see IMC manual)
2021
uint32_t combined_address; // combine the address(hex), sub-index(hex) and length(hex)
2122

22-
explicit IMCObject(uint16_t _address, uint16_t _length) : address(_address), length(_length)
23+
IMCObject(uint16_t _address, uint8_t _sub_index, uint8_t _length)
24+
: address(_address), sub_index(_sub_index), length(_length)
2325
{
24-
uint32_t MSword = ((address & 0xFFFF) << 16); // Shift 16 bits left for most significant word
25-
uint32_t LSword = (length & 0xFFFF);
26+
uint32_t MSword = (address << 16);
27+
uint32_t LSword = (sub_index << 8) | length;
2628

2729
combined_address = (MSword | LSword);
2830
}

march_hardware/src/PDOmap.cpp

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,22 @@
1010
namespace march
1111
{
1212
std::unordered_map<IMCObjectName, IMCObject> PDOmap::all_objects = {
13-
{ IMCObjectName::StatusWord, IMCObject(0x6041, 16) },
14-
{ IMCObjectName::ActualPosition, IMCObject(0x6064, 32) },
15-
{ IMCObjectName::ActualVelocity, IMCObject(0x6069, 32) },
16-
{ IMCObjectName::MotionErrorRegister, IMCObject(0x2000, 16) },
17-
{ IMCObjectName::DetailedErrorRegister, IMCObject(0x2002, 16) },
18-
{ IMCObjectName::DCLinkVoltage, IMCObject(0x2055, 16) },
19-
{ IMCObjectName::DriveTemperature, IMCObject(0x2058, 16) },
20-
{ IMCObjectName::ActualTorque, IMCObject(0x6077, 16) },
21-
{ IMCObjectName::CurrentLimit, IMCObject(0x207F, 16) },
22-
{ IMCObjectName::MotorPosition, IMCObject(0x2088, 32) },
23-
{ IMCObjectName::MotorVelocity, IMCObject(0x2087, 32) },
24-
{ IMCObjectName::ControlWord, IMCObject(0x6040, 16) },
25-
{ IMCObjectName::TargetPosition, IMCObject(0x607A, 32) },
26-
{ IMCObjectName::TargetTorque, IMCObject(0x6071, 16) },
27-
{ IMCObjectName::QuickStopDeceleration, IMCObject(0x6085, 32) },
28-
{ IMCObjectName::QuickStopOption, IMCObject(0x605A, 16) }
13+
{ IMCObjectName::StatusWord, IMCObject(0x6041, 0, 16) },
14+
{ IMCObjectName::ActualPosition, IMCObject(0x6064, 0, 32) },
15+
{ IMCObjectName::ActualVelocity, IMCObject(0x6069, 0, 32) },
16+
{ IMCObjectName::MotionErrorRegister, IMCObject(0x2000, 0, 16) },
17+
{ IMCObjectName::DetailedErrorRegister, IMCObject(0x2002, 0, 16) },
18+
{ IMCObjectName::DCLinkVoltage, IMCObject(0x2055, 0, 16) },
19+
{ IMCObjectName::DriveTemperature, IMCObject(0x2058, 0, 16) },
20+
{ IMCObjectName::ActualTorque, IMCObject(0x6077, 0, 16) },
21+
{ IMCObjectName::CurrentLimit, IMCObject(0x207F, 0, 16) },
22+
{ IMCObjectName::MotorPosition, IMCObject(0x2088, 0, 32) },
23+
{ IMCObjectName::MotorVelocity, IMCObject(0x2087, 0, 32) },
24+
{ IMCObjectName::ControlWord, IMCObject(0x6040, 0, 16) },
25+
{ IMCObjectName::TargetPosition, IMCObject(0x607A, 0, 32) },
26+
{ IMCObjectName::TargetTorque, IMCObject(0x6071, 0, 16) },
27+
{ IMCObjectName::QuickStopDeceleration, IMCObject(0x6085, 0, 32) },
28+
{ IMCObjectName::QuickStopOption, IMCObject(0x605A, 0, 16) }
2929
};
3030

3131
void PDOmap::addObject(IMCObjectName object_name)

march_hardware/test/TestPDOmap.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,27 @@ TEST_F(PDOTest, ObjectCounts)
5353
ASSERT_EQ(1u, misoByteOffsets.count(march::IMCObjectName::CurrentLimit));
5454
ASSERT_EQ(0u, misoByteOffsets.count(march::IMCObjectName::DCLinkVoltage));
5555
}
56+
57+
TEST_F(PDOTest, CombinedAddressConstruct)
58+
{
59+
march::PDOmap pdoMap;
60+
61+
auto status_word = pdoMap.all_objects.find(march::IMCObjectName::StatusWord);
62+
uint32_t combined_address = status_word->second.combined_address;
63+
64+
ASSERT_EQ(16u, (combined_address & 0xFF));
65+
ASSERT_EQ(0u, ((combined_address >> 8) & 0xFF));
66+
ASSERT_EQ(0x6041u, ((combined_address >> 16) & 0xFFFF));
67+
}
68+
69+
TEST_F(PDOTest, CombinedAdressConstructWithSubindexValue)
70+
{
71+
march::PDOmap pdoMap;
72+
73+
auto test_object = march::IMCObject(0x6060, 2, 16);
74+
uint32_t combined_address = test_object.combined_address;
75+
76+
ASSERT_EQ(16u, (combined_address & 0xFF));
77+
ASSERT_EQ(2u, ((combined_address >> 8) & 0xFF));
78+
ASSERT_EQ(0x6060u, ((combined_address >> 16) & 0xFFFF));
79+
}

0 commit comments

Comments
 (0)