plc4net/api/PlcDriverManager.cs (47 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using org.apache.plc4net.api;
using org.apache.plc4net.api.authentication;
using org.apache.plc4net.exceptions;
namespace org.apache.plc4net
{
/// <summary>
/// Manages connections to PLCs
/// </summary>
public class PlcDriverManager
{
/// <summary>
/// Singleton instance of the manager
/// </summary>
private static PlcDriverManager _instance;
/// <summary>
/// Get the singleton instance
/// </summary>
public static PlcDriverManager Instance => _instance ?? (_instance = new PlcDriverManager());
/// <summary>
/// Dictionary for the drivers
/// </summary>
private readonly Dictionary<string, IPlcDriver> _drivers;
/// <summary>
/// Private constructor for the singleton driver manager.
/// </summary>
private PlcDriverManager()
{
_drivers = new Dictionary<string, IPlcDriver>();
/*
* TODO: Implement some mechanism to provide drivers -> MEF?
*/
}
/// <summary>
/// Get the connection to the a PLC identified by the URL
/// </summary>
/// <param name="url">URL including the schema to connect to the PLC</param>
/// <param name="authentication">Authentication to use</param>
/// <returns>Created PLC connection</returns>
public async Task<IPlcConnection> GetConnection(string url, IPlcAuthentication authentication)
{
var plcDriver = GetDriver(url);
var connection = await plcDriver.ConnectAsync(url, authentication);
//TODO: Does the driver method already connect or is a separate connect needed?
//TODO: Should we do it like this?
if (!connection.IsConnected)
{
await connection.ConnectAsync();
}
return connection;
}
public IPlcDriver GetDriver(string url)
{
try
{
Uri plcUri = new Uri(url);
var proto = plcUri.Scheme;
_drivers.TryGetValue(proto, out var plcDriver);
if (plcDriver == null)
{
throw new PlcConnectionException($"Unknown driver for protocol '{proto}'");
}
return plcDriver;
}
catch (UriFormatException invalidUriException)
{
throw new PlcConnectionException($"Provided connection string '{url}' is invalid", invalidUriException);
}
}
}
}