diff --git a/bindings/csharp/CMakeLists.txt b/bindings/csharp/CMakeLists.txt index e17ffdf86..a5a954809 100644 --- a/bindings/csharp/CMakeLists.txt +++ b/bindings/csharp/CMakeLists.txt @@ -44,6 +44,7 @@ if (MCS_EXECUTABLE) ${CMAKE_CURRENT_SOURCE_DIR}/IOBuffer.cs ${CMAKE_CURRENT_SOURCE_DIR}/Trigger.cs ${CMAKE_CURRENT_SOURCE_DIR}/IioLib.cs + ${CMAKE_CURRENT_SOURCE_DIR}/ScanContext.cs ${LIBIIO_CS_INFO} ) diff --git a/bindings/csharp/ScanContext.cs b/bindings/csharp/ScanContext.cs new file mode 100644 index 000000000..313890f4d --- /dev/null +++ b/bindings/csharp/ScanContext.cs @@ -0,0 +1,93 @@ +/* + * libiio - Library for interfacing industrial I/O (IIO) devices + * + * Copyright (C) 2020 Analog Devices, Inc. + * Author: Cristian Iacob + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * */ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; + +namespace iio +{ + /// class: + /// Class for getting information about the available contexts. + public class ScanContext + { + private IntPtr scan_block; + + [DllImport("libiio.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern IntPtr iio_create_scan_block([In] string backend, uint flags); + + [DllImport("libiio.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern IntPtr iio_scan_block_get_info(IntPtr blk, uint index); + + [DllImport("libiio.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern IntPtr iio_context_info_get_description(IntPtr info); + + [DllImport("libiio.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern IntPtr iio_context_info_get_uri(IntPtr info); + + [DllImport("libiio.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern long iio_scan_block_scan(IntPtr blk); + + /// + /// Gets the uri and the description of all available contexts with USB backend. + /// + /// a containing the context's uri as key and its description as value. + public Dictionary get_usb_backend_contexts() + { + this.scan_block = iio_create_scan_block("usb", 0); + return get_contexts_info(); + } + + // + /// Gets the uri and the description of all available contexts with local backend. + /// + /// a containing the context's uri as key and its description as value. + public Dictionary get_local_backend_contexts() + { + this.scan_block = iio_create_scan_block("local", 0); + return get_contexts_info(); + } + + // + /// Gets the uri and the description of all available contexts from dns_sd backend. + /// + /// a containing the context's uri as key and its description as value. + public Dictionary get_dns_sd_backend_contexts() + { + this.scan_block = iio_create_scan_block("ip", 0); + return get_contexts_info(); + } + + private Dictionary get_contexts_info() + { + uint contexts_count = (uint)iio_scan_block_scan(this.scan_block); + Dictionary contexts_info = new Dictionary(); + + for (uint i = 0; i < contexts_count; i++) + { + IntPtr info = iio_scan_block_get_info(this.scan_block, i); + string uri = Marshal.PtrToStringAnsi(iio_context_info_get_uri(info)); + string description = Marshal.PtrToStringAnsi(iio_context_info_get_description(info)); + contexts_info[uri] = description; + } + + return contexts_info; + } + } +}