Subversion Repositories f9daq

Rev

Blame | Last modification | View Log | RSS feed

using RGiesecke.DllExport;
using System;
using System.Text;
using System.Runtime.InteropServices;

using AitMduManager;

/*
#region Assembly AitMduManager, Version=1.2.0.0, Culture=neutral, PublicKeyToken=null
// AitMduManager.dll
#endregion
*/


// https://blogs.msdn.microsoft.com/jaredpar/2008/11/05/dereference-a-double-intptr/    


namespace NativeExports
{
    class Program
    {

        static MduManager SD4 = new MduManager();

        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static int SD4_BlockError()
        {
            return SD4.BlockError;
        }

        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static void SD4_SetBlockTimeout(uint a)
        {
            SD4.BlockTimeout = a;
        }

        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static uint SD4_GetBlockTimeout()
        {
            return SD4.BlockTimeout;
        }

        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static long SD4_BlockTransferTime()
        {
            return SD4.BlockTransferTime;
        }

        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static uint SD4_GetDriverTimeout()
        {
            return SD4.DriverTimeout;
        }

        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static void SD4_SetDriverTimeout(uint tout)
        {
            SD4.DriverTimeout = tout;
        }

        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static IntPtr SD4_Version()
        {
            return Marshal.StringToHGlobalAnsi(SD4.Version);
        }

        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static int SD4_WordsTransferred()
        {
            return SD4.WordsTransferred;
        }

        /*

        public event EventHandler DeviceAttached;
        public event EventHandler DeviceRemoved;
        public event EventHandler FirmwareStatusChanged;
        */


        static IntPtr SD4_ArrayToIntPtr(int[] retval)
        {
            int len = retval.Length * Marshal.SizeOf(typeof(int));
            SD4_AllocateMemory(len);
            Marshal.Copy(retval, 0, _unmanagedMemory, retval.Length);
            return _unmanagedMemory;
        }

        static IntPtr SD4_ArrayToIntPtr(ushort[] retval)
        {
            int len = retval.Length * Marshal.SizeOf(typeof(ushort));
            SD4_AllocateMemory(len);
            Marshal.Copy((short[])(object) retval, 0, _unmanagedMemory, retval.Length);
            return _unmanagedMemory;
        }

        static IntPtr SD4_ArrayToIntPtr(uint[] retval)
        {
            int len = retval.Length * Marshal.SizeOf(typeof(uint));
            SD4_AllocateMemory(len);
            Marshal.Copy((int[])(object) retval, 0, _unmanagedMemory, retval.Length);
            return _unmanagedMemory;
        }

        static IntPtr SD4_ArrayToIntPtr(byte[] retval)
        {
            int len = retval.Length * Marshal.SizeOf(typeof(byte));
            SD4_AllocateMemory(len);
            Marshal.Copy(retval, 0, _unmanagedMemory, retval.Length);
            return _unmanagedMemory;
        }

        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static IntPtr SD4_FindDevices( ref int len)
        {
            uint[] devices = SD4.FindDevices();
            if (devices == null)
            {
                len = 0;
                return IntPtr.Zero;
            }
            else
            {
                len = devices.Length;
                return SD4_ArrayToIntPtr(devices);
            }

        }

        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static int SD4_GetDeviceCount()
        {
            return SD4.GetDeviceCount();
        }

        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static IntPtr SD4_GetDeviceList( ref int len)
        {
            uint[] devices = SD4.GetDeviceList();
            if (devices == null)
            {
                len = 0;
                return IntPtr.Zero;
            }
            else
            {
                len = devices.Length;
                return SD4_ArrayToIntPtr(devices);
            }
        }


        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static IntPtr SD4_GetUsbFirmwareVersionByDevice(uint deviceId)
        {
            return Marshal.StringToHGlobalAnsi(SD4.GetUsbFirmwareVersion(deviceId));
        }

        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static IntPtr SD4_GetUsbFirmwareVersion(int index)
        {
            return Marshal.StringToHGlobalAnsi(SD4.GetUsbFirmwareVersion(index));
        }


        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static bool SD4_IsDeviceAttached(uint deviceId)
        {
            return SD4.IsDeviceAttached(deviceId);
        }

        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static bool SD4_ProgramFpgaFirmwareByDevice(uint deviceId, IntPtr data, int len)
        {
            byte[] fpgaFirmware = new byte[len];
            Marshal.Copy(data, fpgaFirmware, 0, len);
            return SD4.ProgramFpgaFirmware(deviceId, fpgaFirmware);
        }

        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static bool SD4_ProgramFpgaFirmware(int index, IntPtr data, int len)
        {
            byte[] fpgaFirmware = new byte[len];
            Marshal.Copy(data, fpgaFirmware, 0, len);
            return SD4.ProgramFpgaFirmware(index, fpgaFirmware);
        }

        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static bool SD4_ProgramUsbFirmware(int index, IntPtr data, int len)
        {
            byte[] usbFirmware = new byte[len];
            Marshal.Copy(data, usbFirmware, 0, len);
            return SD4.ProgramUsbFirmware(index, usbFirmware);
        }

        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static ushort SD4_Read(uint deviceId, int address)
        {
            return SD4.Read(deviceId, address);
        }

       

        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static IntPtr SD4_ReadByteArray(uint deviceId, int address, int requested_elements , ref int len)
        {
            SD4_AllocateByteBuffer(requested_elements);
            SD4.Read(deviceId, address, SD4_ByteBuffer);
            _unmanagedMemory = SD4_ArrayToIntPtr(SD4_ByteBuffer);
            len = _unmanagedMemoryLength;
            return _unmanagedMemory;
        }

        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static IntPtr SD4_ReadUShortArray(uint deviceId, int address, int requested_elements, ref int len)
        {
/*
            System.Console.WriteLine("SD4_ReadUShortArray");
            System.Console.WriteLine(deviceId);
            System.Console.WriteLine(address);
            System.Console.WriteLine(requested_elements);
*/

           
            SD4_AllocateUshortBuffer(requested_elements);
            SD4.Read(deviceId, address, SD4_UShortBuffer);
            _unmanagedMemory = SD4_ArrayToIntPtr(SD4_UShortBuffer);
            len = _unmanagedMemoryLength;
            return _unmanagedMemory;
        }

        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static void SD4_ReconfigureByDevice(uint deviceId)
        {
            SD4.Reconfigure(deviceId);
        }

        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static void SD4_Reconfigure(int index)
        {
            SD4.Reconfigure(index);
        }

        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static void SD4_ReconnectByDevice(uint deviceId)
        {
            SD4.Reconnect(deviceId);
        }

        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static void SD4_Reconnect(int index)
        {
            SD4.Reconnect(index);
        }

        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static void SD4_ResetFpga(int index)
        {
            SD4.ResetFpga(index);
        }

        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static void SD4_ResetFpgaByDevice(uint deviceId)
        {
            SD4.ResetFpga(deviceId);
        }

        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static void SD4_ResetUsb(int index)
        {
            SD4.ResetUsb(index);
        }

        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static void SD4_ResetUsbByDevice(uint deviceId)
        {
            SD4.ResetUsb(deviceId);
        }

        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static void SD4_Write(uint deviceId, int address, ushort data)
        {
            SD4.Write(deviceId, address, data);
        }

        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static int SD4_WriteArray(uint deviceId, int address, IntPtr data, int len)
        {          
            ushort[] udata = new ushort[len];
            Marshal.Copy( data, (int[])(object) udata,0, len);
            return SD4.Write(deviceId, address, udata);
        }
        /*
        public sealed class DeviceChangedEventArgs : EventArgs
        {
            public DeviceChangedEventArgs();

            public uint DeviceId { get; set; }
            public int DeviceIndex { get; set; }
        }
        public sealed class FirmwareStatusEventArgs : EventArgs
        {
            public FirmwareStatusEventArgs();

            public uint DeviceId { get; set; }
            public int DeviceIndex { get; set; }
            public string FirmwareStatus { get; set; }
        }
        */




        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static int NE_Ptr2String(IntPtr c, int len)
        {            
            string d = Marshal.PtrToStringAnsi(c);
            Console.WriteLine(d);
            return 0;
        }


        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static int NE_Ptr2ByteArray(IntPtr c, int len)
        {
            System.Console.WriteLine(len);
            byte[] b = new byte[len];
            Marshal.Copy(c, b, 0, len);
            foreach (byte element in b)
            {
                System.Console.WriteLine(element);
            }
            System.Console.WriteLine();
            return b.Length;
        }

        //-----------------------------------
        // http://stackoverflow.com/questions/14934016/unmanaged-exports-with-arrays
        // https://github.com/kbilsted/NotepadPlusPlusPluginPack.Net/blob/master/Visual%20Studio%20Project%20Template%20C%23/PluginInfrastructure/UnmanagedExports.cs
        static IntPtr _unmanagedMemory = IntPtr.Zero;
        static int _unmanagedMemoryLength = 0;

        static void SD4_AllocateMemory(int len)
        {

            if (_unmanagedMemoryLength < len)
            {
                if (_unmanagedMemory != IntPtr.Zero)
                    Marshal.FreeHGlobal(_unmanagedMemory);
                _unmanagedMemory = Marshal.AllocHGlobal(len);
                _unmanagedMemoryLength = len;

            }
        }


        static ushort[] SD4_UShortBuffer = null;
        static ushort[] SD4_AllocateUshortBuffer(int len) {      
             if (SD4_UShortBuffer == null || SD4_UShortBuffer.Length < len) {
                    Array.Resize(ref SD4_UShortBuffer, len);
             }  
            return SD4_UShortBuffer;
        }

        static byte[] SD4_ByteBuffer = null;
        static byte[] SD4_AllocateByteBuffer(int len)
        {
            if (SD4_ByteBuffer == null || SD4_ByteBuffer.Length < len)
            {
                Array.Resize(ref SD4_ByteBuffer, len);
            }
            return SD4_ByteBuffer;
        }

        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static IntPtr NE_ByteArray2Ptr(ref IntPtr unmanagedArray, out int length)
        {
            var valueList = new[] { 1, 2, 3, 3, 2, 1, 12, 11, 10 };
            System.Console.WriteLine("NE_ByteArray2Ptr");

            foreach (var element in valueList)
            {
                System.Console.WriteLine(element);
            }
            System.Console.WriteLine();

            length = valueList.Length;
            int len = valueList.Length * Marshal.SizeOf(typeof(int));
            SD4_AllocateMemory(len);
            Marshal.Copy(valueList, 0, _unmanagedMemory, length);
            //
            //unmanagedArray = Marshal.AllocHGlobal(len);
            //Marshal.Copy(valueList, 0, unmanagedArray, length);
            return _unmanagedMemory;
        }

        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static int NE_ByteArray2Ptr1(ref IntPtr dest, ref int len)
        //static int NE_ByteArray2Ptr( ref byte[] src, ref int len)
        {
            len = 5;
            //Marshal.AllocHGlobal(len);
            byte[] src = new byte[len];
            for (int i = 0; i < len; i++)
            {
                src[i] = Convert.ToByte(i);
                //Marshal.WriteByte(dest, i, src[i] );
            }
            System.Console.WriteLine("NE_ByteArray2Ptr");
            System.Console.WriteLine(len);
            foreach (byte element in src)
            {
                System.Console.WriteLine(element);
            }
            System.Console.WriteLine();

            // Marshal.Copy(src, 0, dest, len);

            return src.Length;
        }



        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static int NE_String2Ptr(ref IntPtr c)
        {



            // Copy the array to unmanaged memory.
            //c = Marshal.StringToHGlobalAnsi(d);
            string inputStr = Marshal.PtrToStringAnsi(c);
            Console.ForegroundColor = ConsoleColor.Green;
            Console.WriteLine(inputStr);


            string outputStr = "NE_String2Ptr";
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine(outputStr);
            Console.ForegroundColor = ConsoleColor.White;

            // http://stackoverflow.com/questions/21378132/export-managed-c-sharp-function-to-return-changed-char-parameter-to-unmanaged-c            
            byte[] outputBytes = Encoding.Default.GetBytes(outputStr);
            //problemi   Marshal.Copy(outputBytes, 0, c, outputBytes.Length);


            return outputStr.Length;
        }

        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static IntPtr NE_String()
        {
            string d = "NE_String";


            // Copy the array to unmanaged memory.
            //c = Marshal.StringToHGlobalAnsi(d);

            Console.ForegroundColor = ConsoleColor.Green;
            Console.WriteLine(d);
            Console.ForegroundColor = ConsoleColor.White;

            return Marshal.StringToHGlobalAnsi(d);
        }

        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static IntPtr NE_UInt(ref int len)
        {
            len = 10;
            uint[] b = new uint[len];
            for (uint i = 0; i < len; i++)
            {
                b[i] = i;
            }
            //PrintBytes(b);
            IntPtr p = Marshal.AllocHGlobal(len * 4);
            Marshal.Copy((int[])(object)b, 0, p, len);
            return p;
        }


        [DllExport(CallingConvention = CallingConvention.Cdecl)]
        static void NE_Rainbow()
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.Write('R');
            Console.ForegroundColor = ConsoleColor.DarkRed;
            Console.Write('a');
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.Write('i');
            Console.ForegroundColor = ConsoleColor.Green;
            Console.Write('n');
            Console.ForegroundColor = ConsoleColor.Cyan;
            Console.Write('b');
            Console.ForegroundColor = ConsoleColor.Blue;
            Console.Write('o');
            Console.ForegroundColor = ConsoleColor.Magenta;
            Console.Write('w');

            Console.ResetColor();
            Console.WriteLine();
        }
    }
}