map/das-dn/third_party/AdsLib/AmsRouter.h
2024-12-09 09:41:04 +08:00

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;
};
}
}