diff options
Diffstat (limited to 'bindings/csharp/Device.cs')
-rw-r--r-- | bindings/csharp/Device.cs | 262 |
1 files changed, 262 insertions, 0 deletions
diff --git a/bindings/csharp/Device.cs b/bindings/csharp/Device.cs new file mode 100644 index 0000000..8d7fa82 --- /dev/null +++ b/bindings/csharp/Device.cs @@ -0,0 +1,262 @@ +/* + * libiio - Library for interfacing industrial I/O (IIO) devices + * + * Copyright (C) 2015 Analog Devices, Inc. + * Author: Paul Cercueil <paul.cercueil@analog.com> + * + * 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; +using System.Text; +using System.Threading.Tasks; + +namespace iio +{ + /// <summary><see cref="iio.Device"/> class: + /// Contains the representation of an IIO device.</summary> + public class Device + { + private class DeviceAttr : Attr + { + private IntPtr dev; + + [DllImport("libiio.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern int iio_device_attr_read(IntPtr dev, [In()] string name, [Out()] StringBuilder val, uint len); + + [DllImport("libiio.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern int iio_device_attr_write(IntPtr dev, [In()] string name, [In()] string val); + + public DeviceAttr(IntPtr dev, string name) : base(name) + { + this.dev = dev; + } + + public override string read() + { + StringBuilder builder = new StringBuilder(1024); + int err = iio_device_attr_read(dev, name, builder, 1024); + if (err < 0) + throw new Exception("Unable to read device attribute " + err); + return builder.ToString(); + } + + public override void write(string str) + { + int err = iio_device_attr_write(dev, name, str); + if (err < 0) + throw new Exception("Unable to write device attribute " + err); + } + } + + private class DeviceDebugAttr : Attr + { + private IntPtr dev; + + [DllImport("libiio.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern int iio_device_debug_attr_read(IntPtr dev, [In()] string name, [Out()] StringBuilder val, uint len); + + [DllImport("libiio.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern int iio_device_debug_attr_write(IntPtr dev, [In()] string name, [In()] string val); + + public DeviceDebugAttr(IntPtr dev, string name) : base(name) + { + this.dev = dev; + } + + public override string read() + { + StringBuilder builder = new StringBuilder(1024); + int err = iio_device_debug_attr_read(dev, name, builder, 1024); + if (err < 0) + throw new Exception("Unable to read debug attribute " + err); + return builder.ToString(); + } + + public override void write(string str) + { + int err = iio_device_debug_attr_write(dev, name, str); + if (err < 0) + throw new Exception("Unable to write debug attribute " + err); + } + } + + private Context ctx; + + [DllImport("libiio.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern IntPtr iio_device_get_id(IntPtr dev); + + [DllImport("libiio.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern IntPtr iio_device_get_name(IntPtr dev); + + [DllImport("libiio.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern uint iio_device_get_channels_count(IntPtr dev); + + [DllImport("libiio.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern IntPtr iio_device_get_channel(IntPtr dev, uint index); + + [DllImport("libiio.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern uint iio_device_get_attrs_count(IntPtr dev); + + [DllImport("libiio.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern uint iio_device_get_debug_attrs_count(IntPtr dev); + + [DllImport("libiio.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern IntPtr iio_device_get_attr(IntPtr dev, uint index); + + [DllImport("libiio.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern IntPtr iio_device_get_debug_attr(IntPtr dev, uint index); + + [DllImport("libiio.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern int iio_device_get_trigger(IntPtr dev, IntPtr triggerptr); + + [DllImport("libiio.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern int iio_device_set_trigger(IntPtr dev, IntPtr trigger); + + [DllImport("libiio.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern int iio_device_get_sample_size(IntPtr dev); + + [DllImport("libiio.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern int iio_device_reg_write(IntPtr dev, uint addr, uint value); + + [DllImport("libiio.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern int iio_device_reg_read(IntPtr dev, uint addr, ref uint value); + + internal IntPtr dev; + + /// <summary>An identifier of this device.</summary> + /// <remarks>The identifier is only valid in this IIO context</remarks> + public readonly string id; + + /// <summary>The name of this device.</summary> + public readonly string name; + + /// <summary>A <c>list</c> of all the attributes that this device has.</summary> + public readonly List<Attr> attrs; + + /// <summary>A <c>list</c> of all the debug attributes that this device has.</summary> + public readonly List<Attr> debug_attrs; + + /// <summary>A <c>list</c> of all the <see cref="iio.Channel"/> objects that this device possesses.</summary> + public readonly List<Channel> channels; + + internal Device(Context ctx, IntPtr dev) + { + this.ctx = ctx; + this.dev = dev; + channels = new List<Channel>(); + attrs = new List<Attr>(); + debug_attrs = new List<Attr>(); + + uint nb_channels = iio_device_get_channels_count(dev), + nb_attrs = iio_device_get_attrs_count(dev), + nb_debug_attrs = iio_device_get_debug_attrs_count(dev); + + for (uint i = 0; i < nb_channels; i++) + channels.Add(new Channel(iio_device_get_channel(dev, i))); + + for (uint i = 0; i < nb_attrs; i++) + attrs.Add(new DeviceAttr(dev, Marshal.PtrToStringAnsi(iio_device_get_attr(dev, i)))); + for (uint i = 0; i < nb_debug_attrs; i++) + debug_attrs.Add(new DeviceDebugAttr(dev, Marshal.PtrToStringAnsi(iio_device_get_debug_attr(dev, i)))); + + id = Marshal.PtrToStringAnsi(iio_device_get_id(dev)); + + IntPtr name_ptr = iio_device_get_name(dev); + if (name_ptr == IntPtr.Zero) + name = ""; + else + name = Marshal.PtrToStringAnsi(name_ptr); + } + + /// <summary>Get the <see cref="iio.Channel"/> object of the specified name.</summary> + /// <param name="name">Name or ID of the channel to look for</param> + /// <exception cref="System.Exception">The IIO device with the specified + /// name or ID could not be found in the current context.</exception> + public Channel get_channel(string name) + { + foreach (Channel each in channels) { + if (each.name.CompareTo(name) == 0 || + each.id.CompareTo(name) == 0) + return each; + } + + throw new Exception("Channel " + name + " not found"); + } + + /// <summary>Affect a trigger to this device.</summary> + /// <param name="trig">A valid instance of the <see cref="iio.Trigger"/> class.</param> + /// <exception cref="System.Exception">The trigger could not be set.</exception> + public void set_trigger(Trigger trig) + { + int err = iio_device_set_trigger(this.dev, trig == null ? IntPtr.Zero : trig.dev); + if (err < 0) + throw new Exception("Unable to set trigger: err=" + err); + } + + /// <summary>Get the current trigger affected to this device.</summary> + /// <returns>An instance of the <see cref="iio.Trigger"/> class.</returns> + /// <exception cref="System.Exception">The instance could not be retrieved.</exception> + public Trigger get_trigger() + { + IntPtr ptr = (IntPtr)0; + int err = iio_device_get_trigger(this.dev, ptr); + if (err < 0) + throw new Exception("Unable to get trigger: err=" + err); + + ptr = Marshal.ReadIntPtr(ptr); + + foreach (Trigger trig in ctx.devices) { + if (trig.dev == ptr) + return trig; + } + + return null; + } + + /// <summary>Get the current sample size of the device.</summary> + /// <remarks>The sample size varies each time channels get enabled or disabled.</remarks> + /// <exception cref="System.Exception">Internal error. Please report any bug.</exception> + public uint get_sample_size() + { + int ret = iio_device_get_sample_size(dev); + if (ret < 0) + throw new Exception("Internal error. Please report any bug."); + return (uint) ret; + } + /// <summary>Set a value to one register of this device.</summary> + /// <param name="addr">The address of the register concerned.</param> + /// <param name="value">The value that will be used for this register.</param> + /// <exception cref="System.Exception">The register could not be written.</exception> + public void reg_write(uint addr, uint value) + { + int err = iio_device_reg_write(dev, addr, value); + if (err < 0) + throw new Exception("Unable to write register"); + } + + /// <summary>Read the content of a register of this device.</summary> + /// <param name="addr">The address of the register concerned.</param> + /// <exception cref="System.Exception">The register could not be read.</exception> + public uint reg_read(uint addr) + { + uint value = 0; + int err = iio_device_reg_read(dev, addr, ref value); + if (err < 0) + throw new Exception("Unable to read register"); + return value; + } + } +} |