Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Lighting USB OpenDMX FTD2XX DMXking

Tags:

c#

pinvoke

dmx512

Couple of quick questions. I have a DMX king USB lighting controller that I'm trying to control.

It's based on the Open DMX protocol (from Entec) who make available a c# class. I've got the device plugged into an RGB can, and if I test the USB device with their driver, it connects to COM4 and when I switch their software into transmit mode, I can then set individual DMX channels.

Using their OpenDMX class, with a few modifications (the core is the same, i've just added some extra error checking, I can locate the device, query it's information etc. When I open the device I get a handle. I can write to that device with FT_Write but no matter what I do, no lights actually come on.

Here's a few relevant code snippets:

public static byte[] buffer;

[DllImport("FTD2XX.dll")]
public static extern FT_STATUS FT_Open(UInt32 uiPort, ref uint ftHandle);
[DllImport("FTD2XX.dll")]
public static extern FT_STATUS FT_Write(uint ftHandle, IntPtr lpBuffer, UInt32 dwBytesToRead, ref UInt32 lpdwBytesWritten);

public static void writeData()
{
    while (!done)
    {
        try
        {
            initOpenDMX();
            status = FT_SetBreakOn(handle);
            status = FT_SetBreakOff(handle);
            bytesWritten = write(handle, buffer, buffer.Length);
            if (bytesWritten == 0)
            {
                break;
            }

            System.Threading.Thread.Sleep(25);
        }
        catch (Exception)
        {
            break;
        }
    }
    Connected = false;
    done = false;
}

All the status come back as FT_Ok, and bytesWritten comes back as 512 (the number of channels on this USB controller)

I keep thinking I've missed something like setting the device into a transmit mode or similar (it only has one DMX socket)

public static void initOpenDMX()
{
    status = FT_ResetDevice(handle);
    status = FT_SetDivisor(handle, (char)12); // set baud rate
    status = FT_SetDataCharacteristics(handle, BITS_8, STOP_BITS_2, PARITY_NONE);
    status = FT_SetFlowControl(handle, (char)FLOW_NONE, 0, 0);
    status = FT_ClrRts(handle);
    status = FT_SetLatencyTimer(handle, (byte)40);
    status = FT_Purge(handle, PURGE_TX);
    status = FT_Purge(handle, PURGE_RX);
}

I've also tried the Entec OpenDMX class without any modifications from me and it doesn't seem to do anything either.

Just want to stress that their control software is working fine, so the light and controller are compatible. I think something is missing in the way I'm using FTD2xx. There's no errors coming through (everything is FT_OK) so this suggests the DLL is working - especially since I can query the device using the FT_ListDevices and FT_GetDeviceInfo methods.

Any ideas?

Gareth

like image 456
agrath Avatar asked Dec 12 '22 13:12

agrath


1 Answers

To resolve this, I emailed the manufacturer. It turned out that the device wasn't OpenDMX, in fact it was a DMXProUSB The protocol was pretty similar, and it was based on the FTDI chip which is why the code partly worked, but it has a microcontroller in it. I converted the C++ example controller file to C# and got it all working. If this ever comes up again, I am happy to share the resulting c# code for the DMXProUSB however with no support. I have emailed the code to the manfacturer (dmxking) and have placed a copy on github: https://github.com/agrath/Sniper.Lighting.Dmx

Thanks for your help

like image 157
agrath Avatar answered Dec 15 '22 03:12

agrath