48 lines
1.5 KiB
C++
48 lines
1.5 KiB
C++
// SPDX-License-Identifier: MIT
|
|
/**
|
|
Copyright (c) 2015 - 2022 Beckhoff Automation GmbH & Co. KG
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "AmsConnection.h"
|
|
#include <unordered_set>
|
|
|
|
namespace Beckhoff
|
|
{
|
|
namespace Ads
|
|
{
|
|
struct AmsRouter : Router {
|
|
AmsRouter(AmsNetId netId = AmsNetId {});
|
|
|
|
uint16_t OpenPort();
|
|
long ClosePort(uint16_t port);
|
|
long GetAmsAddr(uint16_t port, AmsAddr* pAddr);
|
|
void SetAmsNetId(AmsNetId netId);
|
|
long GetTimeout(uint16_t port, uint32_t& timeout);
|
|
long SetTimeout(uint16_t port, uint32_t timeout);
|
|
long AddNotification(AmsRequest& request, uint32_t* pNotification, std::shared_ptr<Notification> notify);
|
|
long DelNotification(uint16_t port, const AmsAddr* pAddr, uint32_t hNotification);
|
|
|
|
[[deprecated]]
|
|
long ConnectTarget(AmsNetId ams, const IpV4& ip);
|
|
long ConnectTarget(AmsNetId ams, const std::string& host);
|
|
void DisconnectTarget(const AmsNetId& ams);
|
|
AmsConnection* GetConnection(const AmsNetId& pAddr);
|
|
long SendAdsRequest(AmsRequest& request);
|
|
|
|
private:
|
|
AmsNetId localAmsNetId;
|
|
std::recursive_mutex mutex;
|
|
std::condition_variable_any connection_attempt_events;
|
|
std::map<AmsNetId, std::tuple<> > connection_attempts;
|
|
std::unordered_set<std::unique_ptr<AmsConnection> > connections;
|
|
std::map<AmsNetId, AmsConnection*> connection_mapping;
|
|
|
|
void AwaitConnectionAttempts(const AmsNetId& ams, std::unique_lock<std::recursive_mutex>& lock);
|
|
void DeleteIfLastConnection(const AmsConnection* conn);
|
|
|
|
std::array<AmsPort, NUM_PORTS_MAX> ports;
|
|
};
|
|
}
|
|
} |