libicsneo/include/icsneo/device/tree/plasion/plasion.h

101 lines
3.0 KiB
C++

#ifndef __PLASION_H_
#define __PLASION_H_
#ifdef __cplusplus
#include "icsneo/device/device.h"
#include "icsneo/communication/multichannelcommunication.h"
#include "icsneo/device/extensions/flexray/extension.h"
namespace icsneo {
class Plasion : public Device {
public:
static const std::vector<Network>& GetSupportedNetworks() {
static std::vector<Network> supportedNetworks = {
Network::NetID::DWCAN_01,
Network::NetID::DWCAN_08,
Network::NetID::DWCAN_02,
Network::NetID::DWCAN_03,
Network::NetID::DWCAN_04,
Network::NetID::DWCAN_05,
Network::NetID::DWCAN_06,
Network::NetID::DWCAN_07,
Network::NetID::LSFTCAN_01,
Network::NetID::LSFTCAN_02,
Network::NetID::SWCAN_01,
Network::NetID::SWCAN_02,
Network::NetID::ETHERNET_01,
Network::NetID::LIN_01,
Network::NetID::LIN_02,
Network::NetID::LIN_03,
Network::NetID::LIN_04,
Network::NetID::FLEXRAY_01
};
return supportedNetworks;
}
// Until VNET support is added, assume we have one FIRE 2 VNET or FlexRay VNETZ as the main
size_t getEthernetActivationLineCount() const override { return 1; }
bool supportsComponentVersions() const override { return true; }
protected:
using Device::Device;
// TODO This is done so that Plasion can still transmit it's basic networks, awaiting slave VNET support
virtual bool isSupportedRXNetwork(const Network&) const override { return true; }
virtual bool isSupportedTXNetwork(const Network&) const override { return true; }
virtual void setupExtensions() override {
std::vector<Network> flexRayControllers;
flexRayControllers.push_back(Network::NetID::FLEXRAY_01);
flexRayControllers.push_back(Network::NetID::FLEXRAY_01); // TODO Becomes FlexRay2 if not in coldstart mode
addExtension(std::make_shared<FlexRay::Extension>(*this, flexRayControllers));
}
void setupSupportedRXNetworks(std::vector<Network>& rxNetworks) override {
for(auto& netid : GetSupportedNetworks())
rxNetworks.emplace_back(netid);
// TODO Check configuration for FlexRay ColdStart mode, disable FlexRay 2 if so
}
virtual std::vector<std::shared_ptr<FlexRay::Controller>> getFlexRayControllers() const override {
// TODO Check configuration for FlexRay Enabled
auto extension = getExtension<FlexRay::Extension>();
if(!extension)
return Device::getFlexRayControllers();
std::vector<std::shared_ptr<FlexRay::Controller>> ret;
if(auto ctrl1 = extension->getController(0))
ret.push_back(std::move(ctrl1));
// TODO Check configuration for FlexRay ColdStart mode, FlexRay2 -> FlexRay if so
if(auto ctrl2 = extension->getController(1))
ret.push_back(std::move(ctrl2));
return ret;
}
void handleDeviceStatus(const std::shared_ptr<RawMessage>& message) override {
if(message->data.size() < sizeof(fire2vnet_status_t))
return;
std::lock_guard<std::mutex> lk(ioMutex);
const fire2vnet_status_t* status = reinterpret_cast<const fire2vnet_status_t*>(message->data.data());
ethActivationStatus = status->ethernetActivationLineEnabled;
}
bool supportsWiVI() const override { return true; }
};
}
#endif // __cplusplus
#endif