summaryrefslogtreecommitdiff
path: root/bindings/csharp/Device.cs
diff options
context:
space:
mode:
Diffstat (limited to 'bindings/csharp/Device.cs')
-rw-r--r--bindings/csharp/Device.cs262
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;
+ }
+ }
+}