Skip to content

Commit 13593af

Browse files
committed
feat: make pgn request protocol use the new message handler
1 parent bccc405 commit 13593af

16 files changed

+94
-112
lines changed

examples/pgn_requests/main.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -143,13 +143,13 @@ int main()
143143
}
144144

145145
// Register a callback to handle PROPA PGN Requests
146-
TestInternalECU->get_pgn_request_protocol().lock()->register_pgn_request_callback(static_cast<std::uint32_t>(isobus::CANLibParameterGroupNumber::ProprietaryA), example_proprietary_a_pgn_request_handler, nullptr);
146+
TestInternalECU->get_pgn_request_protocol()->register_pgn_request_callback(static_cast<std::uint32_t>(isobus::CANLibParameterGroupNumber::ProprietaryA), example_proprietary_a_pgn_request_handler, nullptr);
147147

148148
// Now, if you send a PGN request for EF00 to our internal control function, the stack will acknowledge it. Other requests will be NACK'ed (negative acknowledged)
149149
// NOTE the device you send from MUST have address claimed.
150150

151151
// Now we'll set up a callback to handle requests for repetition rate for the PROPA PGN
152-
TestInternalECU->get_pgn_request_protocol().lock()->register_request_for_repetition_rate_callback(static_cast<std::uint32_t>(isobus::CANLibParameterGroupNumber::ProprietaryA), example_proprietary_a_request_for_repetition_rate_handler, nullptr);
152+
TestInternalECU->get_pgn_request_protocol()->register_request_for_repetition_rate_callback(static_cast<std::uint32_t>(isobus::CANLibParameterGroupNumber::ProprietaryA), example_proprietary_a_request_for_repetition_rate_handler, nullptr);
153153

154154
// Now we'll get a callback when someone requests a repetition rate for PROPA.
155155
// The application (not the stack) must handle these requests, as the CAN stack does not know what data to send when responding.
@@ -159,7 +159,7 @@ int main()
159159

160160
// This is how you would request a PGN from someone else. In this example, we request it from the broadcast address.
161161
// Generally you'd want to replace nullptr with your partner control function as its a little nicer than just asking everyone on the bus for a PGN
162-
isobus::ParameterGroupNumberRequestProtocol::request_parameter_group_number(static_cast<std::uint32_t>(isobus::CANLibParameterGroupNumber::ProprietaryA), TestInternalECU, nullptr);
162+
TestInternalECU->get_pgn_request_protocol()->request_parameter_group_number(static_cast<std::uint32_t>(isobus::CANLibParameterGroupNumber::ProprietaryA), nullptr);
163163

164164
while (running)
165165
{

examples/seeder_example/seeder.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
#include "isobus/hardware_integration/available_can_drivers.hpp"
1212
#include "isobus/hardware_integration/can_hardware_interface.hpp"
13+
#include "isobus/isobus/can_network_manager.hpp"
1314
#include "isobus/isobus/isobus_diagnostic_protocol.hpp"
1415
#include "isobus/isobus/isobus_standard_data_description_indices.hpp"
1516
#include "isobus/isobus/isobus_task_controller_client.hpp"

isobus/include/isobus/isobus/can_internal_control_function.hpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,12 @@ namespace isobus
7676

7777
/// @brief Gets the PGN request protocol for this ICF
7878
/// @returns The PGN request protocol for this ICF
79-
std::weak_ptr<ParameterGroupNumberRequestProtocol> get_pgn_request_protocol() const;
79+
std::shared_ptr<ParameterGroupNumberRequestProtocol> get_pgn_request_protocol() const;
80+
81+
/// @brief Sets the PGN request protocol for this ICF, only use this if you have advanced needs.
82+
/// Normally, when you create the internal control function via the network manager, it will set this for you.
83+
/// @param[in] protocol The PGN request protocol for this ICF
84+
void set_pgn_request_protocol(std::shared_ptr<ParameterGroupNumberRequestProtocol> protocol);
8085

8186
/// @brief Validates that a CAN message has not caused an address violation for this ICF.
8287
/// If a violation is found, a re-claim will be executed for as is required by ISO 11783-5,
@@ -88,10 +93,6 @@ namespace isobus
8893
/// @returns true if the message caused an address violation, otherwise false
8994
bool process_rx_message_for_address_violation(const CANMessage &message);
9095

91-
protected:
92-
friend class CANNetworkManager; ///< Allow the network manager to access the pgn request protocol
93-
std::shared_ptr<ParameterGroupNumberRequestProtocol> pgnRequestProtocol; ///< The PGN request protocol for this ICF
94-
9596
private:
9697
/// @brief Sends the PGN request for the address claim PGN
9798
/// @returns true if the message was sent, otherwise false
@@ -119,6 +120,7 @@ namespace isobus
119120
std::uint8_t preferredAddress; ///< The address we'd prefer to claim as (we may not get it)
120121
std::uint8_t randomClaimDelay_ms; ///< The random delay before claiming an address as required by the ISO11783 standard
121122
EventDispatcher<std::uint8_t> addressClaimedDispatcher; ///< The event dispatcher for when an address is claimed
123+
std::shared_ptr<ParameterGroupNumberRequestProtocol> pgnRequestProtocol = nullptr; ///< The PGN request protocol for this ICF
122124
};
123125

124126
} // namespace isobus

isobus/include/isobus/isobus/can_message_handling.hpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,14 +68,12 @@ namespace isobus
6868
virtual ~CANMessagingConsumer() = default;
6969

7070
/// @brief Processes incoming CAN messages
71-
/// @param message The incoming CAN message to process
7271
virtual void process_rx_message(const CANMessage &)
7372
{
7473
// Override this function in the derived class, if you want to process incoming messages
7574
}
7675

7776
/// @brief Processes outgoing CAN messages
78-
/// @param message The outgoing CAN message to process
7977
virtual void process_tx_message(const CANMessage &)
8078
{
8179
// Override this function in the derived class, if you want to process outgoing messages

isobus/include/isobus/isobus/can_parameter_group_number_request_protocol.hpp

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,30 +13,23 @@
1313

1414
#include "isobus/isobus/can_badge.hpp"
1515
#include "isobus/isobus/can_control_function.hpp"
16-
#include "isobus/isobus/can_network_manager.hpp"
16+
#include "isobus/isobus/can_message_handling.hpp"
1717

1818
#include <memory>
1919

2020
namespace isobus
2121
{
22-
//================================================================================================
23-
/// @class ParameterGroupNumberRequestProtocol
24-
///
2522
/// @brief A protocol that handles PGN requests
2623
/// @details The purpose of this protocol is to simplify and standardize how PGN requests
2724
/// are made and responded to. It provides a way to easily send a PGN request or a request for
2825
/// repetition rate, as well as methods to receive PGN requests.
29-
//================================================================================================
30-
class ParameterGroupNumberRequestProtocol
26+
class ParameterGroupNumberRequestProtocol : public CANMessagingConsumer
3127
{
3228
public:
3329
/// @brief The constructor for this protocol
3430
/// @param[in] internalControlFunction The internal control function that owns this protocol and will be used to send messages
3531
explicit ParameterGroupNumberRequestProtocol(std::shared_ptr<InternalControlFunction> internalControlFunction);
3632

37-
/// @brief The destructor for this protocol
38-
~ParameterGroupNumberRequestProtocol();
39-
4033
/// @brief Remove the copy constructor
4134
ParameterGroupNumberRequestProtocol(const ParameterGroupNumberRequestProtocol &) = delete;
4235

@@ -45,19 +38,17 @@ namespace isobus
4538

4639
/// @brief Sends a PGN request to the specified control function
4740
/// @param[in] pgn The PGN to request
48-
/// @param[in] source The internal control function to send from
4941
/// @param[in] destination The control function to request `pgn` from
5042
/// @returns `true` if the request was successfully sent
51-
static bool request_parameter_group_number(std::uint32_t pgn, std::shared_ptr<InternalControlFunction> source, std::shared_ptr<ControlFunction> destination);
43+
bool request_parameter_group_number(std::uint32_t pgn, std::shared_ptr<ControlFunction> destination);
5244

5345
/// @brief Sends a PGN request for repetition rate
5446
/// @details Use this if you want the destination CF to send you the specified PGN at some fixed interval
5547
/// @param[in] pgn The PGN to request
5648
/// @param[in] repetitionRate_ms The repetition rate to request in milliseconds
57-
/// @param[in] source The internal control function to send from
5849
/// @param[in] destination The control function to send the request to
5950
/// @returns `true` if the request was sent
60-
static bool request_repetition_rate(std::uint32_t pgn, std::uint16_t repetitionRate_ms, std::shared_ptr<InternalControlFunction> source, std::shared_ptr<ControlFunction> destination);
51+
bool request_repetition_rate(std::uint32_t pgn, std::uint16_t repetitionRate_ms, std::shared_ptr<ControlFunction> destination);
6152

6253
/// @brief Registers for a callback on receipt of a PGN request
6354
/// @param[in] pgn The PGN you want to handle in the callback
@@ -142,12 +133,7 @@ namespace isobus
142133

143134
/// @brief A generic way for a protocol to process a received message
144135
/// @param[in] message A received CAN message
145-
void process_message(const CANMessage &message);
146-
147-
/// @brief A generic way for a protocol to process a received message
148-
/// @param[in] message A received CAN message
149-
/// @param[in] parent Provides the context to the actual TP manager object
150-
static void process_message(const CANMessage &message, void *parent);
136+
void process_rx_message(const CANMessage &message) override;
151137

152138
/// @brief Sends a message using the acknowledgement PGN
153139
/// @param[in] type The type of acknowledgement to send (Ack, vs Nack, etc)

isobus/include/isobus/isobus/isobus_functionalities.hpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@
2323

2424
namespace isobus
2525
{
26-
class DiagnosticProtocol; // Forward declaration
27-
2826
/// @brief Manages the control function functionalities message
2927
class ControlFunctionFunctionalities
3028
{

isobus/src/can_internal_control_function.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "isobus/isobus/can_internal_control_function.hpp"
1212

1313
#include "isobus/isobus/can_constants.hpp"
14+
#include "isobus/isobus/can_network_manager.hpp"
1415
#include "isobus/isobus/can_parameter_group_number_request_protocol.hpp"
1516
#include "isobus/isobus/can_stack_logger.hpp"
1617
#include "isobus/utility/system_timing.hpp"
@@ -300,11 +301,16 @@ namespace isobus
300301
return addressClaimedDispatcher;
301302
}
302303

303-
std::weak_ptr<ParameterGroupNumberRequestProtocol> InternalControlFunction::get_pgn_request_protocol() const
304+
std::shared_ptr<ParameterGroupNumberRequestProtocol> InternalControlFunction::get_pgn_request_protocol() const
304305
{
305306
return pgnRequestProtocol;
306307
}
307308

309+
void InternalControlFunction::set_pgn_request_protocol(std::shared_ptr<ParameterGroupNumberRequestProtocol> protocol)
310+
{
311+
pgnRequestProtocol = protocol;
312+
}
313+
308314
bool InternalControlFunction::send_request_to_claim() const
309315
{
310316
const auto parameterGroupNumber = static_cast<std::uint32_t>(CANLibParameterGroupNumber::AddressClaim);

isobus/src/can_network_manager.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ namespace isobus
5252
std::shared_ptr<InternalControlFunction> CANNetworkManager::create_internal_control_function(NAME desiredName, std::uint8_t CANPort, std::uint8_t preferredAddress)
5353
{
5454
auto controlFunction = std::make_shared<InternalControlFunction>(desiredName, preferredAddress, CANPort);
55-
controlFunction->pgnRequestProtocol.reset(new ParameterGroupNumberRequestProtocol(controlFunction));
55+
controlFunction->set_pgn_request_protocol(std::make_shared<ParameterGroupNumberRequestProtocol>(controlFunction));
56+
messageHandler.add_consumer(controlFunction->get_pgn_request_protocol());
5657
internalControlFunctions.push_back(controlFunction);
5758
heartBeatInterfaces.at(CANPort)->on_new_internal_control_function(controlFunction);
5859
return controlFunction;
@@ -68,7 +69,7 @@ namespace isobus
6869
void CANNetworkManager::deactivate_control_function(std::shared_ptr<InternalControlFunction> controlFunction)
6970
{
7071
// We need to unregister the control function from the interfaces managed by the network manager first.
71-
controlFunction->pgnRequestProtocol.reset();
72+
controlFunction->set_pgn_request_protocol(nullptr);
7273
heartBeatInterfaces.at(controlFunction->get_can_port())->on_destroyed_internal_control_function(controlFunction);
7374
internalControlFunctions.erase(std::remove(internalControlFunctions.begin(), internalControlFunctions.end(), controlFunction), internalControlFunctions.end());
7475
deactivate_control_function(std::static_pointer_cast<ControlFunction>(controlFunction));

isobus/src/can_parameter_group_number_request_protocol.cpp

Lines changed: 21 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -23,32 +23,24 @@ namespace isobus
2323
myControlFunction(internalControlFunction)
2424
{
2525
assert(nullptr != myControlFunction && "ParameterGroupNumberRequestProtocol::ParameterGroupNumberRequestProtocol() called with nullptr internalControlFunction");
26-
CANNetworkManager::CANNetwork.add_protocol_parameter_group_number_callback(static_cast<std::uint32_t>(CANLibParameterGroupNumber::ParameterGroupNumberRequest), process_message, this);
27-
CANNetworkManager::CANNetwork.add_protocol_parameter_group_number_callback(static_cast<std::uint32_t>(CANLibParameterGroupNumber::RequestForRepetitionRate), process_message, this);
2826
}
2927

30-
ParameterGroupNumberRequestProtocol::~ParameterGroupNumberRequestProtocol()
31-
{
32-
CANNetworkManager::CANNetwork.remove_protocol_parameter_group_number_callback(static_cast<std::uint32_t>(CANLibParameterGroupNumber::ParameterGroupNumberRequest), process_message, this);
33-
CANNetworkManager::CANNetwork.remove_protocol_parameter_group_number_callback(static_cast<std::uint32_t>(CANLibParameterGroupNumber::RequestForRepetitionRate), process_message, this);
34-
}
35-
36-
bool ParameterGroupNumberRequestProtocol::request_parameter_group_number(std::uint32_t pgn, std::shared_ptr<InternalControlFunction> source, std::shared_ptr<ControlFunction> destination)
28+
bool ParameterGroupNumberRequestProtocol::request_parameter_group_number(std::uint32_t pgn, std::shared_ptr<ControlFunction> destination)
3729
{
3830
std::array<std::uint8_t, PGN_REQUEST_LENGTH> buffer;
3931

4032
buffer[0] = static_cast<std::uint8_t>(pgn & 0xFF);
4133
buffer[1] = static_cast<std::uint8_t>((pgn >> 8) & 0xFF);
4234
buffer[2] = static_cast<std::uint8_t>((pgn >> 16) & 0xFF);
4335

44-
return CANNetworkManager::CANNetwork.send_can_message(static_cast<std::uint32_t>(CANLibParameterGroupNumber::ParameterGroupNumberRequest),
45-
buffer.data(),
46-
PGN_REQUEST_LENGTH,
47-
source,
48-
destination);
36+
return send_can_message(static_cast<std::uint32_t>(CANLibParameterGroupNumber::ParameterGroupNumberRequest),
37+
buffer.data(),
38+
PGN_REQUEST_LENGTH,
39+
myControlFunction,
40+
destination);
4941
}
5042

51-
bool ParameterGroupNumberRequestProtocol::request_repetition_rate(std::uint32_t pgn, std::uint16_t repetitionRate_ms, std::shared_ptr<InternalControlFunction> source, std::shared_ptr<ControlFunction> destination)
43+
bool ParameterGroupNumberRequestProtocol::request_repetition_rate(std::uint32_t pgn, std::uint16_t repetitionRate_ms, std::shared_ptr<ControlFunction> destination)
5244
{
5345
std::array<std::uint8_t, CAN_DATA_LENGTH> buffer;
5446

@@ -61,11 +53,11 @@ namespace isobus
6153
buffer[6] = 0xFF;
6254
buffer[7] = 0xFF;
6355

64-
return CANNetworkManager::CANNetwork.send_can_message(static_cast<std::uint32_t>(CANLibParameterGroupNumber::RequestForRepetitionRate),
65-
buffer.data(),
66-
CAN_DATA_LENGTH,
67-
source,
68-
destination);
56+
return send_can_message(static_cast<std::uint32_t>(CANLibParameterGroupNumber::RequestForRepetitionRate),
57+
buffer.data(),
58+
CAN_DATA_LENGTH,
59+
myControlFunction,
60+
destination);
6961
}
7062

7163
bool ParameterGroupNumberRequestProtocol::register_pgn_request_callback(std::uint32_t pgn, PGNRequestCallback callback, void *parentPointer)
@@ -162,18 +154,16 @@ namespace isobus
162154
return ((obj.callbackFunction == this->callbackFunction) && (obj.pgn == this->pgn) && (obj.parent == this->parent));
163155
}
164156

165-
void ParameterGroupNumberRequestProtocol::process_message(const CANMessage &message)
157+
void ParameterGroupNumberRequestProtocol::process_rx_message(const CANMessage &message)
166158
{
167-
if (((nullptr == message.get_destination_control_function()) &&
168-
(BROADCAST_CAN_ADDRESS == message.get_identifier().get_destination_address())) ||
169-
(message.get_destination_control_function() == myControlFunction))
159+
if (message.is_broadcast() || message.is_destination(myControlFunction))
170160
{
171161
switch (message.get_identifier().get_parameter_group_number())
172162
{
173163
case static_cast<std::uint32_t>(CANLibParameterGroupNumber::RequestForRepetitionRate):
174164
{
175165
// Can't send this request to global, and must be 8 bytes. Ignore illegal message formats
176-
if ((CAN_DATA_LENGTH == message.get_data_length()) && (nullptr != message.get_destination_control_function()))
166+
if ((CAN_DATA_LENGTH == message.get_data_length()) && message.is_destination(myControlFunction))
177167
{
178168
std::uint32_t requestedPGN = message.get_uint24_at(0);
179169
std::uint16_t requestedRate = message.get_uint16_at(3);
@@ -235,7 +225,7 @@ namespace isobus
235225
}
236226
}
237227

238-
if ((!anyCallbackProcessed) && (nullptr != message.get_destination_control_function()))
228+
if ((!anyCallbackProcessed) && message.is_destination(myControlFunction))
239229
{
240230
send_acknowledgement(AcknowledgementType::Negative,
241231
requestedPGN,
@@ -258,14 +248,6 @@ namespace isobus
258248
}
259249
}
260250

261-
void ParameterGroupNumberRequestProtocol::process_message(const CANMessage &message, void *parent)
262-
{
263-
if (nullptr != parent)
264-
{
265-
reinterpret_cast<ParameterGroupNumberRequestProtocol *>(parent)->process_message(message);
266-
}
267-
}
268-
269251
bool ParameterGroupNumberRequestProtocol::send_acknowledgement(AcknowledgementType type, std::uint32_t parameterGroupNumber, std::shared_ptr<ControlFunction> destination) const
270252
{
271253
bool retVal = false;
@@ -283,11 +265,11 @@ namespace isobus
283265
buffer[6] = static_cast<std::uint8_t>((parameterGroupNumber >> 8) & 0xFF);
284266
buffer[7] = static_cast<std::uint8_t>((parameterGroupNumber >> 16) & 0xFF);
285267

286-
retVal = CANNetworkManager::CANNetwork.send_can_message(static_cast<std::uint32_t>(CANLibParameterGroupNumber::Acknowledge),
287-
buffer.data(),
288-
CAN_DATA_LENGTH,
289-
myControlFunction,
290-
nullptr);
268+
retVal = send_can_message(static_cast<std::uint32_t>(CANLibParameterGroupNumber::Acknowledge),
269+
buffer.data(),
270+
CAN_DATA_LENGTH,
271+
myControlFunction,
272+
nullptr);
291273
}
292274
return retVal;
293275
}

0 commit comments

Comments
 (0)