mirror of
https://github.com/intrepidcs/libicsneo.git
synced 2026-08-05 01:18:36 +02:00
Implement FlexRay transmit, configuration, and cold start
This commit is contained in:
@@ -1,11 +1,28 @@
|
||||
#include "icsneo/device/extensions/flexray/extension.h"
|
||||
#include "icsneo/device/device.h"
|
||||
#include "icsneo/communication/message/flexray/flexraymessage.h"
|
||||
|
||||
using namespace icsneo;
|
||||
|
||||
FlexRay::Extension::Extension(Device& device, uint8_t controllerCount) : DeviceExtension(device) {
|
||||
for(uint8_t i = 0; i < controllerCount; i++)
|
||||
controllers.emplace_back(std::make_shared<FlexRay::Controller>(device, i));
|
||||
FlexRay::Extension::Extension(Device& device, const std::vector<Network>& controllerNetworks) : DeviceExtension(device) {
|
||||
for(uint8_t i = 0; i < controllerNetworks.size(); i++)
|
||||
controllers.emplace_back(std::make_shared<FlexRay::Controller>(device, i, controllerNetworks[i]));
|
||||
}
|
||||
|
||||
void FlexRay::Extension::onGoOnline() {
|
||||
for(auto& controller : controllers) {
|
||||
if(controller->getStartWhenGoingOnline())
|
||||
controller->getReady();
|
||||
}
|
||||
for(auto& controller : controllers) {
|
||||
if(controller->getStartWhenGoingOnline())
|
||||
controller->start();
|
||||
}
|
||||
}
|
||||
|
||||
void FlexRay::Extension::onGoOffline() {
|
||||
for(auto& controller : controllers)
|
||||
controller->halt();
|
||||
}
|
||||
|
||||
void FlexRay::Extension::handleMessage(const std::shared_ptr<Message>& message) {
|
||||
@@ -28,4 +45,23 @@ void FlexRay::Extension::handleMessage(const std::shared_ptr<Message>& message)
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool FlexRay::Extension::transmitHook(const std::shared_ptr<Message>& message, bool& success) {
|
||||
if(!message || message->network.getType() != Network::Type::FlexRay)
|
||||
return true; // Don't hook non-FlexRay messages
|
||||
|
||||
success = false;
|
||||
|
||||
std::shared_ptr<FlexRayMessage> frmsg = std::dynamic_pointer_cast<FlexRayMessage>(message);
|
||||
if(!frmsg)
|
||||
return false;
|
||||
|
||||
for(auto& controller : controllers) {
|
||||
if(controller->getNetwork() != message->network)
|
||||
continue;
|
||||
success |= controller->transmit(frmsg);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
Reference in New Issue
Block a user