Implement FlexRay transmit, configuration, and cold start

This commit is contained in:
Paul Hollinsky
2019-11-12 20:38:47 -05:00
parent 3396f5dcce
commit 37778d7891
20 changed files with 1042 additions and 77 deletions
+29 -6
View File
@@ -197,6 +197,7 @@ bool Device::open() {
handleInternalMessage(message);
}));
forEachExtension([](const std::shared_ptr<DeviceExtension>& ext) { ext->onDeviceOpen(); return true; });
return true;
}
@@ -213,7 +214,8 @@ bool Device::close() {
com->removeMessageCallback(internalHandlerCallbackID);
internalHandlerCallbackID = 0;
forEachExtension([](const std::shared_ptr<DeviceExtension>& ext) { ext->onDeviceClose(); return true; });
return com->close();
}
@@ -242,7 +244,8 @@ bool Device::goOnline() {
}
online = true;
forEachExtension([](const std::shared_ptr<DeviceExtension>& ext) { ext->onGoOnline(); return true; });
return true;
}
@@ -272,6 +275,7 @@ bool Device::goOffline() {
online = false;
forEachExtension([](const std::shared_ptr<DeviceExtension>& ext) { ext->onGoOffline(); return true; });
return true;
}
@@ -293,6 +297,16 @@ bool Device::transmit(std::shared_ptr<Message> message) {
return false;
}
bool extensionHookedTransmit = false;
bool transmitStatusFromExtension = false;
forEachExtension([&](const std::shared_ptr<DeviceExtension>& ext) {
if(!ext->transmitHook(message, transmitStatusFromExtension))
extensionHookedTransmit = true;
return !extensionHookedTransmit; // false breaks out of the loop early
});
if(extensionHookedTransmit)
return transmitStatusFromExtension;
std::vector<uint8_t> packet;
if(!com->encoder->encode(packet, message))
return false;
@@ -338,10 +352,18 @@ void Device::addExtension(std::shared_ptr<DeviceExtension>&& extension) {
extensions.push_back(extension);
}
void Device::forEachExtension(std::function<void(const std::shared_ptr<DeviceExtension>&)> fn) {
std::lock_guard<std::mutex> lk(extensionsLock);
for(const auto& ext : extensions)
fn(ext);
void Device::forEachExtension(std::function<bool(const std::shared_ptr<DeviceExtension>&)> fn) {
std::vector<std::shared_ptr<DeviceExtension>> extensionsCopy;
{
std::lock_guard<std::mutex> lk(extensionsLock);
extensionsCopy = extensions;
}
for(const auto& ext : extensionsCopy) {
if(!fn(ext))
break;
}
}
void Device::handleInternalMessage(std::shared_ptr<Message> message) {
@@ -354,6 +376,7 @@ void Device::handleInternalMessage(std::shared_ptr<Message> message) {
}
forEachExtension([&](const std::shared_ptr<DeviceExtension>& ext) {
ext->handleMessage(message);
return true; // false breaks out early
});
}