20 myControlFunction(sourceControlFunction),
21 txFlags(static_cast<std::uint32_t>(
TransmitFlags::NumberOfFlags), process_flags, this)
25 if (
auto pgnRequestProtocol = sourceControlFunction->get_pgn_request_protocol().lock())
27 pgnRequestProtocol->register_pgn_request_callback(
static_cast<std::uint32_t
>(CANLibParameterGroupNumber::ControlFunctionFunctionalities),
pgn_request_handler,
this);
31 LOG_ERROR(
"[DP]: Failed to register PGN request callback for ControlFunctionFunctionalities due to the protocol being expired");
37 if (
auto pgnRequestProtocol =
myControlFunction->get_pgn_request_protocol().lock())
39 pgnRequestProtocol->remove_pgn_request_callback(
static_cast<std::uint32_t
>(CANLibParameterGroupNumber::ControlFunctionFunctionalities),
pgn_request_handler,
this);
53 newFunctionality.
generation = functionalityGeneration;
58 if (Functionalities::MinimumControlFunction == functionality)
60 LOG_WARNING(
"[DP]: You are disabling minimum control function functionality reporting! This is not recommended.");
82 std::uint8_t retVal = 0;
88 retVal = existingFunctionality->generation;
97 auto existingFunctionality =
get_functionality(Functionalities::MinimumControlFunction);
100 (option < MinimumControlFunctionOptions::Reserved))
102 existingFunctionality->set_bit_in_option(0,
static_cast<std::uint8_t
>(option), optionState);
118 (option < AuxOOptions::Reserved))
120 existingFunctionality->set_bit_in_option(0,
static_cast<std::uint8_t
>(option), optionState);
136 (option < AuxOOptions::Reserved))
138 existingFunctionality->set_bit_in_option(0,
static_cast<std::uint8_t
>(option), optionState);
154 (option < AuxNOptions::Reserved))
156 existingFunctionality->set_bit_in_option(option > AuxNOptions::SupportsType7Function ? 1 : 0,
157 option > AuxNOptions::SupportsType7Function ?
static_cast<std::uint8_t
>(
static_cast<std::uint16_t
>(option) >> 8) :
static_cast<std::uint8_t
>(option),
174 (option < AuxNOptions::Reserved))
176 existingFunctionality->set_bit_in_option(option > AuxNOptions::SupportsType7Function ? 1 : 0,
177 option > AuxNOptions::SupportsType7Function ?
static_cast<std::uint8_t
>(
static_cast<std::uint16_t
>(option) >> 8) :
static_cast<std::uint8_t
>(option),
191 auto existingFunctionality =
get_functionality(Functionalities::TaskControllerGeoServer);
194 (option < TaskControllerGeoServerOptions::Reserved))
196 existingFunctionality->set_bit_in_option(0,
static_cast<std::uint8_t
>(option), optionState);
209 auto existingFunctionality =
get_functionality(Functionalities::TaskControllerGeoClient);
212 (numberOfControlChannels > 0))
214 existingFunctionality->serializedValue.at(0) = numberOfControlChannels;
221 auto existingFunctionality =
get_functionality(Functionalities::TaskControllerGeoClient);
222 std::uint8_t retVal = 0;
226 retVal = existingFunctionality->serializedValue.at(0);
235 auto existingFunctionality =
get_functionality(Functionalities::TaskControllerSectionControlServer);
238 (numberOfSupportedBooms > 0) &&
239 (numberOfSupportedSections > 0))
241 existingFunctionality->serializedValue.at(0) = numberOfSupportedBooms;
242 existingFunctionality->serializedValue.at(1) = numberOfSupportedSections;
249 auto existingFunctionality =
get_functionality(Functionalities::TaskControllerSectionControlServer);
250 std::uint8_t retVal = 0;
254 retVal = existingFunctionality->serializedValue.at(0);
262 auto existingFunctionality =
get_functionality(Functionalities::TaskControllerSectionControlServer);
263 std::uint8_t retVal = 0;
267 retVal = existingFunctionality->serializedValue.at(1);
276 auto existingFunctionality =
get_functionality(Functionalities::TaskControllerSectionControlClient);
279 (numberOfSupportedBooms > 0) &&
280 (numberOfSupportedSections > 0))
282 existingFunctionality->serializedValue.at(0) = numberOfSupportedBooms;
283 existingFunctionality->serializedValue.at(1) = numberOfSupportedSections;
290 auto existingFunctionality =
get_functionality(Functionalities::TaskControllerSectionControlClient);
291 std::uint8_t retVal = 0;
295 retVal = existingFunctionality->serializedValue.at(0);
303 auto existingFunctionality =
get_functionality(Functionalities::TaskControllerSectionControlClient);
304 std::uint8_t retVal = 0;
308 retVal = existingFunctionality->serializedValue.at(1);
317 auto existingFunctionality =
get_functionality(Functionalities::BasicTractorECUServer);
320 (option < BasicTractorECUOptions::Reserved))
322 existingFunctionality->set_bit_in_option(0,
static_cast<std::uint8_t
>(option), optionState);
331 if (BasicTractorECUOptions::TECUNotMeetingCompleteClass1Requirements == option)
334 auto existingFunctionality =
get_functionality(Functionalities::BasicTractorECUServer);
338 retVal = (0 == existingFunctionality->serializedValue.at(0));
352 auto existingFunctionality =
get_functionality(Functionalities::BasicTractorECUImplementClient);
355 (option < BasicTractorECUOptions::Reserved))
357 existingFunctionality->set_bit_in_option(0,
static_cast<std::uint8_t
>(option), optionState);
366 if (BasicTractorECUOptions::TECUNotMeetingCompleteClass1Requirements == option)
369 auto existingFunctionality =
get_functionality(Functionalities::BasicTractorECUImplementClient);
373 retVal = (0 == existingFunctionality->serializedValue.at(0));
387 auto existingFunctionality =
get_functionality(Functionalities::TractorImplementManagementServer);
391 if (TractorImplementManagementOptions::NoOptions != option)
397 LOG_DEBUG(
"[DP]: Can't set the No Options TIM option, disable the other ones instead.");
406 if (TractorImplementManagementOptions::NoOptions == option)
409 auto existingFunctionality =
get_functionality(Functionalities::TractorImplementManagementServer);
413 for (
const auto ¤tByte : existingFunctionality->serializedValue)
415 retVal &= (0 == currentByte);
430 auto existingFunctionality =
get_functionality(Functionalities::TractorImplementManagementServer);
434 existingFunctionality->set_bit_in_option(auxValveIndex / 4, 1 << (2 * (auxValveIndex % 4)), stateSupported);
435 existingFunctionality->set_bit_in_option(auxValveIndex / 4, 1 << (2 * (auxValveIndex % 4) + 1), flowSupported);
444 auto existingFunctionality =
get_functionality(Functionalities::TractorImplementManagementServer);
448 retVal = existingFunctionality->get_bit_in_option(auxValveIndex / 4, 1 << (2 * (auxValveIndex % 4)));
458 auto existingFunctionality =
get_functionality(Functionalities::TractorImplementManagementServer);
462 retVal = existingFunctionality->get_bit_in_option(auxValveIndex / 4, 1 << (2 * (auxValveIndex % 4) + 1));
471 auto existingFunctionality =
get_functionality(Functionalities::TractorImplementManagementClient);
483 if (TractorImplementManagementOptions::NoOptions == option)
486 auto existingFunctionality =
get_functionality(Functionalities::TractorImplementManagementClient);
490 for (
const auto ¤tByte : existingFunctionality->serializedValue)
492 retVal &= (0 == currentByte);
500 if (optionBit < std::numeric_limits<std::uint8_t>::digits)
518 auto existingFunctionality =
get_functionality(Functionalities::TractorImplementManagementClient);
522 existingFunctionality->set_bit_in_option(auxValveIndex / 4, 1 << (2 * (auxValveIndex % 4)), stateSupported);
523 existingFunctionality->set_bit_in_option(auxValveIndex / 4, 1 << (2 * (auxValveIndex % 4) + 1), flowSupported);
532 auto existingFunctionality =
get_functionality(Functionalities::TractorImplementManagementClient);
536 retVal = existingFunctionality->get_bit_in_option(auxValveIndex / 4, 1 << (2 * (auxValveIndex % 4)));
546 auto existingFunctionality =
get_functionality(Functionalities::TractorImplementManagementClient);
550 retVal = existingFunctionality->get_bit_in_option(auxValveIndex / 4, 1 << (2 * (auxValveIndex % 4) + 1));
561 functionality(functionalityToStore)
567 switch (functionality)
569 case Functionalities::MinimumControlFunction:
570 case Functionalities::UniversalTerminalServer:
571 case Functionalities::UniversalTerminalWorkingSet:
572 case Functionalities::AuxOInputs:
573 case Functionalities::AuxOFunctions:
574 case Functionalities::TaskControllerBasicServer:
575 case Functionalities::TaskControllerBasicClient:
576 case Functionalities::TaskControllerGeoServer:
577 case Functionalities::TaskControllerGeoClient:
578 case Functionalities::BasicTractorECUServer:
579 case Functionalities::BasicTractorECUImplementClient:
580 case Functionalities::FileServer:
581 case Functionalities::FileServerClient:
583 serializedValue.resize(1);
584 serializedValue.at(0) = 0x00;
588 case Functionalities::AuxNInputs:
589 case Functionalities::AuxNFunctions:
591 serializedValue.resize(2);
592 serializedValue.at(0) = 0x00;
593 serializedValue.at(1) = 0x00;
597 case Functionalities::TaskControllerSectionControlServer:
598 case Functionalities::TaskControllerSectionControlClient:
600 serializedValue.resize(2);
601 serializedValue.at(0) = 0x01;
602 serializedValue.at(1) = 0x01;
606 case Functionalities::TractorImplementManagementServer:
607 case Functionalities::TractorImplementManagementClient:
609 LOG_WARNING(
"[DP]: You have configured TIM as a CF functionality, but the library doesn't support TIM at this time. Do you have an external TIM implementation?");
610 serializedValue.resize(15);
611 std::fill(serializedValue.begin(), serializedValue.end(), 0x00);
617 LOG_ERROR(
"[DP]: An invalid control function functionality was added. It's values will be ignored.");
625 if ((byteIndex < serializedValue.size()) && (bit < std::numeric_limits<std::uint8_t>::max()))
629 serializedValue.at(byteIndex) = (serializedValue.at(byteIndex) | bit);
633 serializedValue.at(byteIndex) = (serializedValue.at(byteIndex) & ~(bit));
642 if ((byteIndex < serializedValue.size()) && (bit < std::numeric_limits<std::uint8_t>::max()))
644 retVal = (0 != (serializedValue.at(byteIndex) & (bit)));
663 retVal = existingFunctionality->get_bit_in_option(byteIndex, option);
673 messageData.push_back(0xFF);
678 messageData.push_back(
static_cast<std::uint8_t
>(functionality.functionality));
679 messageData.push_back(functionality.generation);
680 messageData.push_back(
static_cast<std::uint8_t
>(functionality.serializedValue.size()));
682 for (
const auto &dataByte : functionality.serializedValue)
684 messageData.push_back(dataByte);
690 messageData.push_back(0xFF);
696 std::uint8_t retVal = 0xFF;
700 case TractorImplementManagementOptions::FrontPTODisengagementIsSupported:
701 case TractorImplementManagementOptions::FrontPTOEngagementCCWIsSupported:
702 case TractorImplementManagementOptions::FrontPTOengagementCWIsSupported:
703 case TractorImplementManagementOptions::FrontPTOspeedCCWIsSupported:
704 case TractorImplementManagementOptions::FrontPTOspeedCWIsSupported:
710 case TractorImplementManagementOptions::RearPTODisengagementIsSupported:
711 case TractorImplementManagementOptions::RearPTOEngagementCCWIsSupported:
712 case TractorImplementManagementOptions::RearPTOEngagementCWIsSupported:
713 case TractorImplementManagementOptions::RearPTOSpeedCCWIsSupported:
714 case TractorImplementManagementOptions::RearPTOSpeedCWIsSupported:
720 case TractorImplementManagementOptions::FrontHitchMotionIsSupported:
721 case TractorImplementManagementOptions::FrontHitchPositionIsSupported:
727 case TractorImplementManagementOptions::RearHitchMotionIsSupported:
728 case TractorImplementManagementOptions::RearHitchPositionIsSupported:
734 case TractorImplementManagementOptions::VehicleSpeedInForwardDirectionIsSupported:
735 case TractorImplementManagementOptions::VehicleSpeedInReverseDirectionIsSupported:
736 case TractorImplementManagementOptions::VehicleSpeedStartMotionIsSupported:
737 case TractorImplementManagementOptions::VehicleSpeedStopMotionIsSupported:
738 case TractorImplementManagementOptions::VehicleSpeedForwardSetByServerIsSupported:
739 case TractorImplementManagementOptions::VehicleSpeedReverseSetByServerIsSupported:
740 case TractorImplementManagementOptions::VehicleSpeedChangeDirectionIsSupported:
746 case TractorImplementManagementOptions::GuidanceCurvatureIsSupported:
763 std::uint8_t retVal = 0xFF;
767 case TractorImplementManagementOptions::FrontPTODisengagementIsSupported:
768 case TractorImplementManagementOptions::RearPTODisengagementIsSupported:
769 case TractorImplementManagementOptions::FrontHitchMotionIsSupported:
770 case TractorImplementManagementOptions::RearHitchMotionIsSupported:
771 case TractorImplementManagementOptions::VehicleSpeedInForwardDirectionIsSupported:
772 case TractorImplementManagementOptions::GuidanceCurvatureIsSupported:
778 case TractorImplementManagementOptions::FrontPTOEngagementCCWIsSupported:
779 case TractorImplementManagementOptions::RearPTOEngagementCCWIsSupported:
780 case TractorImplementManagementOptions::VehicleSpeedInReverseDirectionIsSupported:
786 case TractorImplementManagementOptions::FrontHitchPositionIsSupported:
787 case TractorImplementManagementOptions::RearHitchPositionIsSupported:
788 case TractorImplementManagementOptions::VehicleSpeedStartMotionIsSupported:
794 case TractorImplementManagementOptions::FrontPTOengagementCWIsSupported:
795 case TractorImplementManagementOptions::RearPTOEngagementCWIsSupported:
796 case TractorImplementManagementOptions::VehicleSpeedStopMotionIsSupported:
802 case TractorImplementManagementOptions::FrontPTOspeedCCWIsSupported:
803 case TractorImplementManagementOptions::RearPTOSpeedCCWIsSupported:
804 case TractorImplementManagementOptions::VehicleSpeedForwardSetByServerIsSupported:
810 case TractorImplementManagementOptions::FrontPTOspeedCWIsSupported:
811 case TractorImplementManagementOptions::RearPTOSpeedCWIsSupported:
812 case TractorImplementManagementOptions::VehicleSpeedReverseSetByServerIsSupported:
818 case TractorImplementManagementOptions::VehicleSpeedChangeDirectionIsSupported:
834 std::shared_ptr<ControlFunction>,
839 assert(
nullptr != parentPointer);
843 if (
static_cast<std::uint32_t
>(CANLibParameterGroupNumber::ControlFunctionFunctionalities) == parameterGroupNumber)
854 assert(
nullptr != parentPointer);
856 bool transmitSuccessful =
true;
860 std::vector<std::uint8_t> messageBuffer;
863 messageBuffer.data(),
864 messageBuffer.size(),
865 targetInterface->myControlFunction,
869 if (!transmitSuccessful)
871 targetInterface->txFlags.set_flag(flag);
Defines some PGNs that are used in the library or are very common.
A class that acts as a logging sink. The intent is that someone could make their own derived class of...
static CANNetworkManager CANNetwork
Static singleton of the one network manager. Use this to access stack functionality.
bool send_can_message(std::uint32_t parameterGroupNumber, const std::uint8_t *dataBuffer, std::uint32_t dataLength, std::shared_ptr< InternalControlFunction > sourceControlFunction, std::shared_ptr< ControlFunction > destinationControlFunction=nullptr, CANIdentifier::CANPriority priority=CANIdentifier::CANPriority::PriorityDefault6, TransmitCompleteCallback txCompleteCallback=nullptr, void *parentPointer=nullptr, DataChunkCallback frameChunkCallback=nullptr)
This is the main way to send a CAN message of any length.
Stores the raw byte data associated with a functionality based on what the user has enabled and what ...
void configure_default_data()
Sets up default data associated to the functionality the object is representing.
bool get_bit_in_option(std::uint8_t byteIndex, std::uint8_t bit)
A helper function to get a particular bit's value in the specified option byte.
void set_bit_in_option(std::uint8_t byteIndex, std::uint8_t bit, bool value)
A helper function to set a particular option bit to some value within an option byte.
FunctionalityData(Functionalities functionalityToStore)
Constructor for a FunctionalityData object.
std::uint8_t generation
The generation of the functionality supported.
Manages the control function functionalities message.
void set_tractor_implement_management_client_option_state(TractorImplementManagementOptions option, bool optionState)
Sets a tractor implement management (TIM) client functionality option to a new state.
TractorImplementManagementOptions
This parameter reports which TIM options are supported by a TIM server or an implement working set ma...
bool get_functionality_is_supported(Functionalities functionality)
Returns if a functionality was previously configured with set_functionality_is_supported.
BasicTractorECUOptions
This parameter reports which tractor ECU class and functionality options are supported by an implemen...
std::uint8_t get_task_controller_section_control_client_number_supported_sections()
Gets the number of supported sections for the TC section control client functionality.
ProcessingFlags txFlags
Handles retries for sending the CF functionalities message.
std::list< FunctionalityData >::iterator get_functionality(Functionalities functionalityToRetrieve)
Checks for the existence of a functionality in the list of previously configured functionalities and ...
std::list< FunctionalityData > supportedFunctionalities
A list of all configured functionalities and their data.
TaskControllerGeoServerOptions
This option byte reports which task controller geo functionality options are supported by an implemen...
void set_functionality_is_supported(Functionalities functionality, std::uint8_t functionalityGeneration, bool isSupported)
Adds or removes a supported functionality.
std::uint8_t get_task_controller_section_control_client_number_supported_booms()
Gets the number of supported booms for the TC section control client functionality.
void set_basic_tractor_ECU_server_option_state(BasicTractorECUOptions option, bool optionState)
Sets a tractor ECU server functionality option to a new state.
static void process_flags(std::uint32_t flag, void *parentPointer)
Processes set transmit flags to send messages.
void set_task_controller_section_control_client_option_state(std::uint8_t numberOfSupportedBooms, std::uint8_t numberOfSupportedSections)
Sets a task controller section control client's options.
static bool pgn_request_handler(std::uint32_t parameterGroupNumber, std::shared_ptr< ControlFunction > requestingControlFunction, bool &acknowledge, AcknowledgementType &acknowledgeType, void *parentPointer)
Handles PGN requests for the control function functionalities message.
bool get_tractor_implement_management_client_option_state(TractorImplementManagementOptions option)
Gets the state of a TIM client functionality option.
bool get_functionality_byte_option(Functionalities functionality, std::uint8_t byteIndex, std::uint8_t option)
A wrapper to to get an option from the first byte of a functionalities' data.
bool get_aux_N_inputs_option_state(AuxNOptions option)
Gets the state of an AUX-N inputs functionality option.
bool get_tractor_implement_management_server_aux_valve_flow_supported(std::uint8_t auxValveIndex)
Returns if a particular aux valve's flow control is supported in the TIM server functionality.
void set_aux_O_inputs_option_state(AuxOOptions option, bool optionState)
Sets an AUX-O inputs functionality option to a new state.
std::uint8_t get_task_controller_section_control_server_number_supported_sections()
Gets the number of supported sections for the TC section control server functionality.
bool get_basic_tractor_ECU_server_option_state(BasicTractorECUOptions option)
Gets the state of a basic tractor ECU server functionality option.
std::uint8_t get_tim_option_byte_index(TractorImplementManagementOptions option) const
Returns the byte index of the specified TIM option in the CF Functionalities message data associated ...
void set_task_controller_geo_client_option(std::uint8_t numberOfControlChannels)
Sets a task controller geo client's only functionality option, which is the number of control channel...
bool get_aux_N_functions_option_state(AuxNOptions option)
Gets the state of an AUX-N functions functionality option.
void set_aux_N_functions_option_state(AuxNOptions option, bool optionState)
Sets an AUX-N functions functionality option to a new state.
void set_tractor_implement_management_client_aux_valve_option(std::uint8_t auxValveIndex, bool stateSupported, bool flowSupported)
Sets a tractor implement management (TIM) client aux valve's functionality options to a new state.
std::uint8_t get_task_controller_geo_client_option()
Gets the state of the only TC GEO client functionality option, which is the number of control channel...
Mutex functionalitiesMutex
Since messages come in on a different thread than the main app (probably), this mutex protects the fu...
Functionalities
Enumerates the different functionalities that an ISOBUS ECU can report in the control function functi...
std::uint8_t get_tim_option_bit_index(TractorImplementManagementOptions option) const
Returns the bit offset of a specified TIM functionality option into the TIM client and server functio...
void set_tractor_implement_management_server_aux_valve_option(std::uint8_t auxValveIndex, bool stateSupported, bool flowSupported)
Sets a tractor implement management (TIM) server aux valve's functionality options to a new state.
void set_task_controller_section_control_server_option_state(std::uint8_t numberOfSupportedBooms, std::uint8_t numberOfSupportedSections)
Sets a task controller section control server's options.
static constexpr std::uint8_t NUMBER_TIM_AUX_VALVES
The max number of TIM aux valves.
ControlFunctionFunctionalities(std::shared_ptr< InternalControlFunction > sourceControlFunction)
Constructor for a ControlFunctionFunctionalities object.
bool get_tractor_implement_management_server_aux_valve_state_supported(std::uint8_t auxValveIndex)
Returns if a particular aux valve's state control is supported in the TIM server functionality.
bool get_aux_O_functions_option_state(AuxOOptions option)
Gets the state of an AUX-O functions functionality option.
std::shared_ptr< InternalControlFunction > myControlFunction
The control function to send messages as.
bool get_tractor_implement_management_client_aux_valve_state_supported(std::uint8_t auxValveIndex)
Returns if a particular aux valve's state control is supported in the TIM client functionality.
bool get_tractor_implement_management_client_aux_valve_flow_supported(std::uint8_t auxValveIndex)
Returns if a particular aux valve's flow control is supported in the TIM client functionality.
bool get_minimum_control_function_option_state(MinimumControlFunctionOptions option)
Returns the current state of the specified minimum control function functionality option.
void set_task_controller_geo_server_option_state(TaskControllerGeoServerOptions option, bool optionState)
Sets a task controller geo server functionality option to a new state.
std::uint8_t get_task_controller_section_control_server_number_supported_booms()
Gets the number of supported booms for the TC section control server functionality.
void set_minimum_control_function_option_state(MinimumControlFunctionOptions option, bool optionState)
Sets a minimum control function functionality option to a new state.
bool get_basic_tractor_ECU_implement_client_option_state(BasicTractorECUOptions option)
Gets the state of a basic tractor ECU implement client functionality option.
MinimumControlFunctionOptions
This parameter reports which minimum control function functionality options are supported.
~ControlFunctionFunctionalities()
Destructor for a ControlFunctionFunctionalities object.
AuxNOptions
This parameter reports which auxiliary control type 2 functionality type functions are supported by a...
bool get_aux_O_inputs_option_state(AuxOOptions option)
Gets the state of an AUX-O inputs functionality option.
bool get_tractor_implement_management_server_option_state(TractorImplementManagementOptions option)
Gets the state of a basic tractor implement management client functionality option.
void set_basic_tractor_ECU_implement_client_option_state(BasicTractorECUOptions option, bool optionState)
Sets a tractor ECU client functionality option to a new state.
void set_aux_O_functions_option_state(AuxOOptions option, bool optionState)
Sets an AUX-O functions functionality option to a new state.
void set_tractor_implement_management_server_option_state(TractorImplementManagementOptions option, bool optionState)
Sets a tractor implement management (TIM) server functionality option to a new state.
void get_message_content(std::vector< std::uint8_t > &messageData)
Populates a vector with the message data needed to send PGN 0xFC8E.
AuxOOptions
This parameter reports which auxiliary control type 1 functionality type functions are supported by a...
std::uint8_t get_functionality_generation(Functionalities functionality)
Returns the generation that was set for the specified functionality when set_functionality_is_support...
void set_aux_N_inputs_option_state(AuxNOptions option, bool optionState)
Sets an AUX-N inputs functionality option to a new state.
void update()
The diagnostic protocol will call this update function, make sure to call DiagnosticProtocol::update(...
bool get_task_controller_geo_server_option_state(TaskControllerGeoServerOptions option)
Gets the state of a TC GEO server functionality option.
TransmitFlags
Enumerates a set of flags representing messages to be transmitted by this interfaces.
@ ControlFunctionFunctionalitiesMessage
A flag to send the CF Functionalities message.
Defines a class that manages the control function functionalities message data. (PGN 64654,...
This namespace encompasses all of the ISO11783 stack's functionality to reduce global namespace pollu...
constexpr std::uint8_t CAN_DATA_LENGTH
The length of a classical CAN frame.
AcknowledgementType
The types of acknowledgement that can be sent in the Ack PGN.