Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mtc Nucleo board connection #115

Open
wants to merge 31 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 13 commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
34e1877
Started frequency sender
TomLonergan03 Feb 12, 2022
0c753ff
Added STM CAN data frame
TomLonergan03 Feb 12, 2022
f4ac389
STM CAN sender
TomLonergan03 Feb 12, 2022
9c46d21
Rename stm to nucleo
TomLonergan03 Feb 12, 2022
0a16c38
Moved nucleo management to new class
TomLonergan03 Feb 12, 2022
dea68a6
Splitting out can sender from transceiver
TomLonergan03 Feb 12, 2022
cd8c79b
Split sender and transceiver
TomLonergan03 Feb 13, 2022
8d64707
Added nucleo frequency sender
TomLonergan03 Feb 13, 2022
b3dccab
Fixes
TomLonergan03 Feb 27, 2022
df754b2
Revert logger changes
TomLonergan03 Mar 3, 2022
49067e8
replaced int division with rounding
TomLonergan03 Mar 3, 2022
7d3024c
Moved nucleo manager to unique ptr
TomLonergan03 Mar 11, 2022
492b3bd
Nucleo manager owns own logger
TomLonergan03 Mar 11, 2022
59e4882
Changed all loggers to new style
TomLonergan03 Mar 14, 2022
546f159
Removed unused is_sending from non-fake can system
TomLonergan03 Mar 14, 2022
0084ef8
Can sender owns can instance, transceiver inherits from sender
TomLonergan03 Mar 15, 2022
3538b73
Moved nucleo_manager_ construction
TomLonergan03 Mar 15, 2022
966a5b2
Can transceiver is dead, long live can receiver
TomLonergan03 Mar 15, 2022
fbf3c25
Renamed CAN interfaces
TomLonergan03 Mar 15, 2022
dc8ad4a
Reorder and cleanup can ids
TomLonergan03 Mar 22, 2022
01f1fe1
Consts
TomLonergan03 Mar 22, 2022
e3fb1ab
Clarified casting
TomLonergan03 Mar 22, 2022
0744837
Arrays start at 0
TomLonergan03 Mar 22, 2022
b926539
Moved include statements
TomLonergan03 Mar 24, 2022
c6fb226
Fixes
TomLonergan03 Mar 24, 2022
bf038ca
Removed unused ids
TomLonergan03 Mar 24, 2022
b7948a3
Minor fixes
TomLonergan03 Apr 5, 2022
07c6652
Fix merge conflicts
TomLonergan03 Apr 5, 2022
42799b4
Merge branch 'master' into mtc-frequency_gen
TomLonergan03 May 10, 2022
3d4e3a8
Spelling
TomLonergan03 May 10, 2022
f3dd33f
Fixing merge issues
TomLonergan03 May 10, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 3 additions & 53 deletions src/propulsion/can/can_sender.cpp
Original file line number Diff line number Diff line change
@@ -1,65 +1,15 @@
#include "can_sender.hpp"

#include <utils/timer.hpp>

namespace hyped::propulsion {

CanSender::CanSender(utils::Logger &log, const uint8_t node_id, IController &controller)
: log_(log),
node_id_(node_id),
can_(utils::io::Can::getInstance()),
controller_(controller)
CanSender::CanSender(utils::Logger &log, utils::io::Can &can) : log_(log), can_(can)
TomLonergan03 marked this conversation as resolved.
Show resolved Hide resolved
{
is_sending_ = false;
can_.start();
}

bool CanSender::sendMessage(utils::io::can::Frame &message)
TomLonergan03 marked this conversation as resolved.
Show resolved Hide resolved
{
log_.info("Sending Message");
can_.send(message);
is_sending_ = true;
const auto now = utils::Timer::getTimeMicros();
while (is_sending_) {
if ((utils::Timer::getTimeMicros() - now) > kTimeout) {
// TODO(Iain): Test the latency and set the TIMEOUT to a reasonable value.
log_.error("Sender timeout reached");
return false;
}
}
return true;
}

void CanSender::registerController()
{
can_.registerProcessor(this);
}

void CanSender::processNewData(utils::io::can::Frame &message)
{
is_sending_ = false;
uint32_t id = message.id;
if (id == kEmgyTransmit + node_id_) {
controller_.processEmergencyMessage(message);
} else if (id == kSdoTransmit + node_id_) {
controller_.processSdoMessage(message);
} else if (id == kNmtTransmit + node_id_) {
controller_.processNmtMessage(message);
} else {
log_.error("Controller %d: CAN message not recognised", node_id_);
}
}

bool CanSender::hasId(uint32_t id, bool)
{
for (uint32_t cobId : canIds) {
if (cobId + node_id_ == id) { return true; }
}
return false;
}

bool CanSender::getIsSending()
{
return is_sending_;
bool sendSuccessful = can_.send(message);
return sendSuccessful;
TomLonergan03 marked this conversation as resolved.
Show resolved Hide resolved
}
} // namespace hyped::propulsion
48 changes: 3 additions & 45 deletions src/propulsion/can/can_sender.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,60 +2,18 @@

#include "sender_interface.hpp"

#include <atomic>
#include <iostream>

#include <propulsion/controller_interface.hpp>
#include <utils/concurrent/thread.hpp>
#include <utils/io/can.hpp>
#include <utils/logger.hpp>

namespace hyped::propulsion {

class CanSender : public utils::io::CanProccesor, public ISender {
class CanSender {
public:
/**
* @brief Initialise the CanSender with the logger, the id and the controller as an attribute,
* to access it's attributes
*/
CanSender(utils::Logger &log, const uint8_t node_id, IController &controller);

/**
* @brief Sends CAN messages
*/
bool sendMessage(utils::io::can::Frame &message) override;

/**
* @brief Registers the controller to process incoming CAN messages
*/
void registerController() override;
CanSender(utils::Logger &log, utils::io::Can &can);

/**
* @brief This function processes incoming CAN messages
*/
void processNewData(utils::io::can::Frame &message) override;

/**
* @brief If this function returns true, the CAN message is ment for this CAN node
*/
bool hasId(uint32_t id, bool extended) override;

/**
* @brief Return if the can_sender is sending a CAN message right now
*/
bool getIsSending() override;
bool sendMessage(utils::io::can::Frame &message);

private:
utils::Logger &log_;
uint8_t node_id_;
utils::io::Can &can_;
std::atomic<bool> is_sending_;
TomLonergan03 marked this conversation as resolved.
Show resolved Hide resolved
IController &controller_;

static constexpr uint32_t kEmgyTransmit = 0x80;
static constexpr uint32_t kSdoTransmit = 0x580;
static constexpr uint32_t kNmtTransmit = 0x700;
static constexpr uint64_t kTimeout = 70000; // us
};

} // namespace hyped::propulsion
56 changes: 56 additions & 0 deletions src/propulsion/can/can_transceiver.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
#include "can_transceiver.hpp"

namespace hyped::propulsion {

CanTransceiver::CanTransceiver(utils::Logger &log, const uint8_t node_id, IController &controller)
: log_(log),
node_id_(node_id),
can_(utils::io::Can::getInstance()),
sender_(log_, can_),
controller_(controller)
{
is_sending_ = false;
can_.start();
}

bool CanTransceiver::sendMessage(utils::io::can::Frame &message)
{
log_.info("Sending Message");
bool messageSuccess = sender_.sendMessage(message);
is_sending_ = true;
return messageSuccess;
}

void CanTransceiver::registerController()
{
can_.registerProcessor(this);
}

void CanTransceiver::processNewData(utils::io::can::Frame &message)
{
is_sending_ = false;
uint32_t id = message.id;
if (id == kEmgyTransmit + node_id_) {
controller_.processEmergencyMessage(message);
} else if (id == kSdoTransmit + node_id_) {
controller_.processSdoMessage(message);
} else if (id == kNmtTransmit + node_id_) {
controller_.processNmtMessage(message);
} else {
log_.error("Controller %d: CAN message not recognised", node_id_);
}
}

bool CanTransceiver::hasId(uint32_t id, bool)
{
for (uint32_t cobId : canIds) {
if (cobId + node_id_ == id) { return true; }
}
return false;
}

bool CanTransceiver::getIsSending()
{
return is_sending_;
}
} // namespace hyped::propulsion
63 changes: 63 additions & 0 deletions src/propulsion/can/can_transceiver.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
#pragma once

#include "can_sender.hpp"
#include "sender_interface.hpp"

#include <atomic>
#include <iostream>

#include <propulsion/controller_interface.hpp>
#include <utils/concurrent/thread.hpp>
#include <utils/io/can.hpp>
#include <utils/logger.hpp>

namespace hyped::propulsion {

class CanTransceiver : public utils::io::CanProccesor, public ISender {
TomLonergan03 marked this conversation as resolved.
Show resolved Hide resolved
public:
/**
* @brief Initialise the CanTransceiver with the logger, the id and the controller as an
* attribute, to access it's attributes
*/
CanTransceiver(utils::Logger &log, const uint8_t node_id, IController &controller);

/**
* @brief Sends CAN messages
*/
bool sendMessage(utils::io::can::Frame &message) override;

/**
* @brief Registers the controller to process incoming CAN messages
*/
void registerController() override;

/**
* @brief This function processes incoming CAN messages
*/
void processNewData(utils::io::can::Frame &message) override;

/**
* @brief If this function returns true, the CAN message is ment for this CAN node
*/
bool hasId(uint32_t id, bool extended) override;

/**
* @brief Return if the can_sender is sending a CAN message right now
*/
bool getIsSending() override;

private:
utils::Logger &log_;
uint8_t node_id_;
utils::io::Can &can_;
std::atomic<bool> is_sending_;
IController &controller_;
CanSender sender_;

static constexpr uint32_t kEmgyTransmit = 0x80;
static constexpr uint32_t kSdoTransmit = 0x580;
static constexpr uint32_t kNmtTransmit = 0x700;
static constexpr uint64_t kTimeout = 70000; // us
};

} // namespace hyped::propulsion
33 changes: 17 additions & 16 deletions src/propulsion/can/sender_interface.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,23 @@ namespace hyped {
namespace propulsion {

// Types of CANopen messages, these are used for CAN ID's
constexpr uint32_t kEmgyTransmit = 0x80;
constexpr uint32_t kSdoReceive = 0x600;
constexpr uint32_t kSdoTransmit = 0x580;
constexpr uint32_t kNmtReceive = 0x000;
constexpr uint32_t kNmtTransmit = 0x700;
constexpr uint32_t kPdo1Transmit = 0x180;
constexpr uint32_t kPdo1Receive = 0x200;
constexpr uint32_t kPdo2Transmit = 0x280;
constexpr uint32_t kPdo2Receive = 0x300;
constexpr uint32_t kPdo3Transmit = 0x380;
constexpr uint32_t kPdo3Receive = 0x400;
constexpr uint32_t kPdo4Transmit = 0x480;
constexpr uint32_t kPdo4Receive = 0x500;

constexpr uint32_t canIds[13]{0x80, 0x600, 0x580, 0x000, 0x700, 0x180, 0x200,
0x280, 0x300, 0x380, 0x400, 0x480, 0x500};
constexpr uint32_t kEmgyTransmit = 0x80;
constexpr uint32_t kSdoReceive = 0x600;
constexpr uint32_t kSdoTransmit = 0x580;
constexpr uint32_t kNmtReceive = 0x000;
constexpr uint32_t kNmtTransmit = 0x700;
constexpr uint32_t kPdo1Transmit = 0x180;
constexpr uint32_t kPdo1Receive = 0x200;
constexpr uint32_t kPdo2Transmit = 0x280;
constexpr uint32_t kPdo2Receive = 0x300;
constexpr uint32_t kPdo3Transmit = 0x380;
constexpr uint32_t kPdo3Receive = 0x400;
constexpr uint32_t kPdo4Transmit = 0x480;
constexpr uint32_t kPdo4Receive = 0x500;
constexpr uint32_t kNucleoTransmit = 0x900; // currently lowest priority, might change

constexpr uint32_t canIds[14]{0x80, 0x600, 0x580, 0x000, 0x700, 0x180, 0x200,
0x280, 0x300, 0x380, 0x400, 0x480, 0x500, 0x900};

class ISender {
public:
Expand Down
12 changes: 6 additions & 6 deletions src/propulsion/controller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ Controller::Controller(utils::Logger &log, uint8_t id)
actual_torque_(0),
motor_temperature_(0),
controller_temperature_(0),
sender_(log, node_id_, *this)
transceiver_(log, node_id_, *this)
{
sdo_message_.id = kSdoReceive + node_id_;
sdo_message_.extended = false;
Expand All @@ -33,7 +33,7 @@ bool Controller::sendControllerMessage(const ControllerMessage message_template)

void Controller::registerController()
{
sender_.registerController();
transceiver_.registerController();
}

void Controller::configure()
Expand All @@ -54,7 +54,7 @@ void Controller::enterOperational()
nmt_message_.data[1] = node_id_;

log_.info("Controller %d: Sending NMT Operational command", node_id_);
sender_.sendMessage(nmt_message_);
transceiver_.sendMessage(nmt_message_);
// leave time for the controller to enter NMT Operational
utils::concurrent::Thread::sleep(100);

Expand Down Expand Up @@ -105,7 +105,7 @@ void Controller::sendTargetVelocity(const int32_t target_velocity)
sdo_message_.data[6] = (target_velocity >> 16) & 0xFF;
sdo_message_.data[7] = (target_velocity >> 24) & 0xFF;

sender_.sendMessage(sdo_message_);
transceiver_.sendMessage(sdo_message_);
}

void Controller::sendTargetTorque(const int16_t target_torque)
Expand Down Expand Up @@ -161,7 +161,7 @@ void Controller::updateControllerTemp()

void Controller::sendSdoMessage(utils::io::can::Frame &message)
{
if (!sender_.sendMessage(message)) {
if (!transceiver_.sendMessage(message)) {
log_.error("Controller %d: No response from controller", node_id_);
throwCriticalFailure();
}
Expand All @@ -181,7 +181,7 @@ void Controller::requestStateTransition(utils::io::can::Frame &message, Controll
// Wait for max of 3 seconds, checking if the state has changed every second
// If it hasn't changed by the end then throw critical failure.
for (state_count = 0; state_count < 3; state_count++) {
sender_.sendMessage(message);
transceiver_.sendMessage(message);
utils::concurrent::Thread::sleep(1000);
checkState();
if (state_ == state) { return; }
Expand Down
5 changes: 3 additions & 2 deletions src/propulsion/controller.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
#include <atomic>

#include <data/data.hpp>
#include <propulsion/can/can_sender.hpp>
#include <propulsion/can/can_transceiver.hpp>
#include <utils/io/can.hpp>
#include <utils/logger.hpp>
#include <utils/system.hpp>
Expand Down Expand Up @@ -49,6 +49,7 @@ class Controller : public IController {
* @param target_velocity - in rpm (calculated in speed calculator)
*/
void sendTargetVelocity(int32_t target_velocity) override;
TomLonergan03 marked this conversation as resolved.
Show resolved Hide resolved

/**
* @brief Send the target torque to the motor controller.
*
Expand Down Expand Up @@ -174,7 +175,7 @@ class Controller : public IController {
std::atomic<int16_t> actual_torque_;
std::atomic<uint8_t> motor_temperature_;
std::atomic<uint8_t> controller_temperature_;
CanSender sender_;
CanTransceiver transceiver_;
utils::io::can::Frame sdo_message_;
utils::io::can::Frame nmt_message_;

Expand Down
20 changes: 20 additions & 0 deletions src/propulsion/nucleo_manager.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#include "nucleo_manager.hpp"

namespace hyped::propulsion {

NucleoManager::NucleoManager() : log_("NUCLEOMANAGER"), sender_(log_, utils::io::Can::getInstance())
TomLonergan03 marked this conversation as resolved.
Show resolved Hide resolved
{
can_frame_.id = kNucleoTransmit;
can_frame_.extended = false;
can_frame_.len = 4;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

const?

}

void NucleoManager::sendNucleoFrequency(const uint32_t target_frequency)
{
can_frame_.data[1] = target_frequency & 0xFF;
TomLonergan03 marked this conversation as resolved.
Show resolved Hide resolved
can_frame_.data[2] = (target_frequency >> 8) & 0xFF;
can_frame_.data[3] = (target_frequency >> 16) & 0xFF;
can_frame_.data[4] = (target_frequency >> 24) & 0xFF;
sender_.sendMessage(can_frame_);
}
} // namespace hyped::propulsion
Loading