Page 1 of 2 12 LastLast
Results 1 to 20 of 21

Thread: Pro Link - More than 2 inputs?

  1. #1
    Advanced Tuner
    Join Date
    Mar 2020
    Posts
    219

    Pro Link - More than 2 inputs?

    I have the MPVI2 with the Pro Link, and am currently using one of the 2 analog inputs for my WB input. I am wanting to add more inputs for some transducers for extra channels for my dyno. I would like to see live data on Fuel Pressure, and Trans Line Pressure for sure. Possibly some others as needed in different scenarios

  2. #2
    HP Tuners Owner Keith@HPTuners's Avatar
    Join Date
    Sep 2002
    Location
    Chicago, IL
    Posts
    6,344
    While we don't have a product to solve this need at the moment, we are working on a solution!
    We got this guy Not Sure, ...

  3. #3
    Advanced Tuner
    Join Date
    Jul 2020
    Location
    VIC Australia
    Posts
    515
    Any ETA Keith? DLP-IO8 support would be killer. I'm using it with other tuning software that supports it and can get read rates of around 20Hz for all 8 channels. Not can bus fast but plenty fast enough for analog sensors.

    Dead easy to implement. This is the code I wrote to get it up and running on some custom software I created. Feel free to use it. I have it called in a background worker thread generated from the main UI.

    Code:
    // ----------------------------------
    // Includes
    // ----------------------------------
    using System.Threading.Tasks;
    using System.IO.Ports;
    using System.Diagnostics;
    
    
    // ----------------------------------
    // Declerations
    // ----------------------------------
    private enum dlpStateMachineStates : int
    {
        DLP_IDLE,
        DLP_OPEN_PORT,
        DLP_SEND_PING_AND_WAIT_FOR_RESPONSE,
        DLP_SEND_SETUP,
        DLP_CLEAR_DATA_BUFFERS,
        DLP_REQUEST_DATA,
        DLP_WAIT_FOR_DATA_RECEIVED,
        DLP_READ_DATA,
        DLP_UPDATE_DISPLAY_CHANNELS
    };
    
    
    int dlp_Fail_Counts;
    const int MAX_DLP_COM_RETRIES = 10;         // 10 * 20ms = 0.2s, after this time the com routine will timeout
    const int COM_LONG_WAIT_MS = 100;
    const int COM_SHORT_WAIT_MS = 20;            // 2 x this value is basically how fast we will read the DLP-IO8. Value as low as 10 has worked in testing 
    const int DLP_READ_BYTES = 16;              // changing these will break the code
    string dlpComPortNumber = "";
    byte[] dlpByteRx = new byte[16];
    
    
    Stopwatch stopWatch_DLP = new Stopwatch();      // used for data rate calculation
    
    
    
    
    dlpStateMachineStates _dlpStateMachineStates;    // DLP-IO8 state machine
    
    
     // --------------------------------------------------------------------------------------------------------
     // Setup connection to DLP-IO8 and continuously read all 8 channels of data.
     // Scale output according to user transform
     // Call this method from a background worker / run async
     // --------------------------------------------------------------------------------------------------------
     private void dlpStateMachine()
    {
        try
        {
            switch (_dlpStateMachineStates)
            {
                // ------------------------------------------------------------------------------------------------
                // IDLE
                // ------------------------------------------------------------------------------------------------
                case dlpStateMachineStates.DLP_IDLE:
                    if (serialPort_DLP.IsOpen == true)
                    {
                        serialPort_DLP.Close();
                    }
                    break;
    
    
    
    
                // ------------------------------------------------------------------------------------------------
                // OPEN COM PORT
                // ------------------------------------------------------------------------------------------------
                case dlpStateMachineStates.DLP_OPEN_PORT:
                    if (dlpComPortNumber.Contains("COM"))
                    {
                        try
                        {
                            serialPort_DLP.PortName = dlpComPortNumber;
                            serialPort_DLP.BaudRate = 115200;
                            serialPort_DLP.DataBits = 8;
                            serialPort_DLP.Parity = Parity.None;
                            serialPort_DLP.Open();
                        }
                        catch (Exception err)
                        {
                            MessageBox.Show(err.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            backgroundWorker_DLP.CancelAsync();
                        }
                    }
    
    
    
    
                    if (serialPort_DLP.IsOpen)
                    {
                        this.Invoke(new MethodInvoker(delegate { btn_Connect_To_DLP.Visible = false; }));
                        _dlpStateMachineStates = dlpStateMachineStates.DLP_SEND_PING_AND_WAIT_FOR_RESPONSE; 
                    }
                    break;
    
    
    
    
                // ------------------------------------------------------------------------------------------------
                // SEND PING "'" AND WAIT FOR PING RESPONSE "Q" aka (char)81
                // ------------------------------------------------------------------------------------------------
                case dlpStateMachineStates.DLP_SEND_PING_AND_WAIT_FOR_RESPONSE:
                    //
                    // every time the ping is sent, wait for a short delay and then check the receive buffer
                    // for a response. If we get it and it's correct ("Q") then move on. If we don't get it
                    // wait for a bit longer more then loop around and try again. If after a few loops we still
                    // don't get a response then raise 'Can't connect to DLP' error to the user and get out of
                    // this code
                    //
                    for (int j = 1; j < MAX_DLP_COM_RETRIES; j++)
                    {
                        serialPort_DLP.Write("'");
                        System.Threading.Thread.Sleep(COM_LONG_WAIT_MS);
    
    
                        // check here that the ping repsonse "Q" is sent back
                        if (serialPort_DLP.BytesToRead > 0 && serialPort_DLP.ReadByte() == 81)
                        {
                            System.Threading.Thread.Sleep(COM_LONG_WAIT_MS); // Small delay before firing off setup byte
                            _dlpStateMachineStates = dlpStateMachineStates.DLP_SEND_SETUP; 
                            break; // exit, all good
                        }
                    }
                    if (_dlpStateMachineStates != dlpStateMachineStates.DLP_SEND_SETUP)
                    {
                        MessageBox.Show("DLP-IO8 not found.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        backgroundWorker_DLP.CancelAsync();
                    }
                    break;
    
    
    
    
                // ------------------------------------------------------------------------------------------------
                // SEND SETUP BYTE "\" aka (char)92
                // ------------------------------------------------------------------------------------------------
                //
                // puts dlp into binary mode. If this setup byte is not sent, then the DLP defaults to ascii mode
                //
                case dlpStateMachineStates.DLP_SEND_SETUP:
                    serialPort_DLP.Write(Convert.ToString((char)92));
                    System.Threading.Thread.Sleep(COM_LONG_WAIT_MS);
                    _dlpStateMachineStates = dlpStateMachineStates.DLP_REQUEST_DATA;
                    break;
    
    
    
    
                // ------------------------------------------------------------------------------------------------
                // CLEAR DATA BUFFERS
                // ------------------------------------------------------------------------------------------------
                //
                // flush the Rx buffer
                //
                case dlpStateMachineStates.DLP_CLEAR_DATA_BUFFERS:
                    serialPort_DLP.DiscardInBuffer();
                    break;
    
    
    
    
                // ------------------------------------------------------------------------------------------------
                // REQUEST DATA
                // ------------------------------------------------------------------------------------------------
                //
                // Send the data request for all 8 channels. Each channel has its own request character. They
                // can be sent all at once or 1 at a time if you want to read each channel in turn 1 by 1
                //
                case dlpStateMachineStates.DLP_REQUEST_DATA:
                    stopWatch_DLP.Restart();
                    serialPort_DLP.Write("ZXCVBNM,");
                    System.Threading.Thread.Sleep(COM_SHORT_WAIT_MS);
                    _dlpStateMachineStates = dlpStateMachineStates.DLP_READ_DATA;
                    break;
    
    
    
    
                // ------------------------------------------------------------------------------------------------
                // READ DATA
                // ------------------------------------------------------------------------------------------------
                //
                // Check the data buffers have filled up to 16 bytes which is the size of the receive repsonse
                // when all 8 channels are selected to be read. If we get nothing, then wait a short time and
                // loop around again. If we have looped a few times and still got nothing then send the statemachine
                // back to send another data request and increment a counter. If this counter keeps getting
                // incremented then raise an error that the dlp receive request has timed out and exit the
                // statemachine
                //
                case dlpStateMachineStates.DLP_READ_DATA:
                    for (int j = 1; j < MAX_DLP_COM_RETRIES; j++) // go around 10x and check the buffer each time
                    {
                        if (serialPort_DLP.BytesToRead >= DLP_READ_BYTES)
                        {
                            serialPort_DLP.Read(dlpByteRx, 0, DLP_READ_BYTES);
                            System.Threading.Thread.Sleep(COM_SHORT_WAIT_MS);
                            dlp_Fail_Counts = 0;
                            _dlpStateMachineStates = dlpStateMachineStates.DLP_UPDATE_DISPLAY_CHANNELS;
                            break; // exit, all good
                        }
                        System.Threading.Thread.Sleep(COM_SHORT_WAIT_MS);
                    }
                    // nothing received. Increment counter and set statemachine to go around again. If counter is > retry count then error 
                    // to user and get out of this code
                    if (_dlpStateMachineStates != dlpStateMachineStates.DLP_UPDATE_DISPLAY_CHANNELS)
                    {
                        _dlpStateMachineStates = dlpStateMachineStates.DLP_REQUEST_DATA; // got nothing, send the data request again
                        dlp_Fail_Counts++;
                    }
                    if (dlp_Fail_Counts >= MAX_DLP_COM_RETRIES)
                    {
                        MessageBox.Show("DLP-IO8 receive data timed out.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        backgroundWorker_DLP.CancelAsync();
                    }
                    break;
    
    
    
    
                // ------------------------------------------------------------------------------------------------
                // UPDATE GUI ELEMENTS
                // ------------------------------------------------------------------------------------------------
                //
                // Your data sir, pack it up and send it to the scanner. Do what you will
                //
    
    
    
    
                case dlpStateMachineStates.DLP_UPDATE_DISPLAY_CHANNELS:
                    int[] i = new int[8];
                    double[] d = new double[8];
    
    
                    // combine the bytes into an integer. Each integer is the respective data channel
                    // of the DLP
    
    
                    i[0] = dlpByteRx[1] | dlpByteRx[0] << 8;
                    i[1] = dlpByteRx[3] | dlpByteRx[2] << 8;
                    i[2] = dlpByteRx[5] | dlpByteRx[4] << 8;
                    i[3] = dlpByteRx[7] | dlpByteRx[6] << 8;
                    i[4] = dlpByteRx[9] | dlpByteRx[8] << 8;
                    i[5] = dlpByteRx[11] | dlpByteRx[10] << 8;
                    i[6] = dlpByteRx[13] | dlpByteRx[12] << 8;
                    i[7] = dlpByteRx[15] | dlpByteRx[14] << 8;
    
    
    
    
                    // scale the ad count into what ever the user has entered for the transfrom
                    d[0] = (double)i[0] / 1024 * d_Scalar[0] + d_Offset[0];
                    d[1] = (double)i[1] / 1024 * d_Scalar[1] + d_Offset[1];
                    d[2] = (double)i[2] / 1024 * d_Scalar[2] + d_Offset[2];
                    d[3] = (double)i[3] / 1024 * d_Scalar[3] + d_Offset[3];
                    d[4] = (double)i[4] / 1024 * d_Scalar[4] + d_Offset[4];
                    d[5] = (double)i[5] / 1024 * d_Scalar[5] + d_Offset[5];
                    d[6] = (double)i[6] / 1024 * d_Scalar[6] + d_Offset[6];
                    d[7] = (double)i[7] / 1024 * d_Scalar[7] + d_Offset[7];
    
    
    
    
    
    
                    // Get how long it took to run on receive cycle and update the GUI rate calculation
                    stopWatch_DLP.Stop();
                    double dataRate_DLP_Hz = Math.Round(1000 / (double)stopWatch_DLP.ElapsedMilliseconds);
                    this.Invoke(new MethodInvoker(delegate { tBox_DataRate_DLP.Text = Convert.ToString(dataRate_DLP_Hz) + " Hz"; })); // convert to Hz
    
    
                    // All done here, head back and request another packet of data again
                    _dlpStateMachineStates = dlpStateMachineStates.DLP_REQUEST_DATA;
                    break;
            }
        }
        catch (Exception err)
        {
            MessageBox.Show("DLP State Machine Error." + "\r\n" + "Reason:" + "\r\n" + err.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            backgroundWorker_DLP.CancelAsync();
        }
    }
    Last edited by hjtrbo; 5 Days Ago at 09:13 PM.

  4. #4
    Advanced Tuner TheMechanic's Avatar
    Join Date
    Jan 2014
    Location
    SoCal
    Posts
    501
    You could use EGR and evap pressure sensor. That would make a total of four

  5. #5
    Advanced Tuner
    Join Date
    Jul 2020
    Location
    VIC Australia
    Posts
    515
    evap pressure is needed for the fan control on E38 and E67

  6. #6
    Advanced Tuner
    Join Date
    Mar 2020
    Posts
    219
    Mechanic, my uses are based around my shop and dyno. Pinning into those pin outs each time would be a pain, but doable in a last resort scenario I suppose.

    Theres no reason HPT doesnt support multiple inputs/other device inputs. It just goes back to cornering a product to sell.

  7. #7
    Advanced Tuner
    Join Date
    Jul 2020
    Location
    VIC Australia
    Posts
    515
    Quote Originally Posted by village_idiot View Post

    Theres no reason HPT doesnt support multiple inputs/other device inputs. It just goes back to cornering a product to sell.
    The bit that I don't get is there is no obvious technical reason why they can't support more external I/O.

  8. #8
    Advanced Tuner TheMechanic's Avatar
    Join Date
    Jan 2014
    Location
    SoCal
    Posts
    501
    Quote Originally Posted by hjtrbo View Post
    evap pressure is needed for the fan control on E38 and E67
    Refresh my memory. Why do we need EVAP for fan control?

  9. #9
    HP Tuners Owner Keith@HPTuners's Avatar
    Join Date
    Sep 2002
    Location
    Chicago, IL
    Posts
    6,344
    Quote Originally Posted by hjtrbo View Post
    Any ETA Keith? DLP-IO8 support would be killer. I'm using it with other tuning software that supports it and can get read rates of around 20Hz for all 8 channels. Not can bus fast but plenty fast enough for analog sensors.

    Dead easy to implement. This is the code I wrote to get it up and running on some custom software I created. Feel free to use it. I have it called in a background worker thread generated from the main UI.

    Code:
    // ----------------------------------
    // Includes
    // ----------------------------------
    using System.Threading.Tasks;
    using System.IO.Ports;
    using System.Diagnostics;
    
    
    // ----------------------------------
    // Declerations
    // ----------------------------------
    private enum dlpStateMachineStates : int
    {
        DLP_IDLE,
        DLP_OPEN_PORT,
        DLP_SEND_PING_AND_WAIT_FOR_RESPONSE,
        DLP_SEND_SETUP,
        DLP_CLEAR_DATA_BUFFERS,
        DLP_REQUEST_DATA,
        DLP_WAIT_FOR_DATA_RECEIVED,
        DLP_READ_DATA,
        DLP_UPDATE_DISPLAY_CHANNELS
    };
    
    
    int dlp_Fail_Counts;
    const int MAX_DLP_COM_RETRIES = 10;         // 10 * 20ms = 0.2s, after this time the com routine will timeout
    const int COM_LONG_WAIT_MS = 100;
    const int COM_SHORT_WAIT_MS = 20;            // 2 x this value is basically how fast we will read the DLP-IO8. Value as low as 10 has worked in testing 
    const int DLP_READ_BYTES = 16;              // changing these will break the code
    string dlpComPortNumber = "";
    byte[] dlpByteRx = new byte[16];
    
    
    Stopwatch stopWatch_DLP = new Stopwatch();      // used for data rate calculation
    
    
    
    
    dlpStateMachineStates _dlpStateMachineStates;    // DLP-IO8 state machine
    
    
     // --------------------------------------------------------------------------------------------------------
     // Setup connection to DLP-IO8 and continuously read all 8 channels of data.
     // Scale output according to user transform
     // Call this method from a background worker / run async
     // --------------------------------------------------------------------------------------------------------
     private void dlpStateMachine()
    {
        try
        {
            switch (_dlpStateMachineStates)
            {
                // ------------------------------------------------------------------------------------------------
                // IDLE
                // ------------------------------------------------------------------------------------------------
                case dlpStateMachineStates.DLP_IDLE:
                    if (serialPort_DLP.IsOpen == true)
                    {
                        serialPort_DLP.Close();
                    }
                    break;
    
    
    
    
                // ------------------------------------------------------------------------------------------------
                // OPEN COM PORT
                // ------------------------------------------------------------------------------------------------
                case dlpStateMachineStates.DLP_OPEN_PORT:
                    if (dlpComPortNumber.Contains("COM"))
                    {
                        try
                        {
                            serialPort_DLP.PortName = dlpComPortNumber;
                            serialPort_DLP.BaudRate = 115200;
                            serialPort_DLP.DataBits = 8;
                            serialPort_DLP.Parity = Parity.None;
                            serialPort_DLP.Open();
                        }
                        catch (Exception err)
                        {
                            MessageBox.Show(err.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            backgroundWorker_DLP.CancelAsync();
                        }
                    }
    
    
    
    
                    if (serialPort_DLP.IsOpen)
                    {
                        this.Invoke(new MethodInvoker(delegate { btn_Connect_To_DLP.Visible = false; }));
                        _dlpStateMachineStates = dlpStateMachineStates.DLP_SEND_PING_AND_WAIT_FOR_RESPONSE; 
                    }
                    break;
    
    
    
    
                // ------------------------------------------------------------------------------------------------
                // SEND PING "'" AND WAIT FOR PING RESPONSE "Q" aka (char)81
                // ------------------------------------------------------------------------------------------------
                case dlpStateMachineStates.DLP_SEND_PING_AND_WAIT_FOR_RESPONSE:
                    //
                    // every time the ping is sent, wait for a short delay and then check the receive buffer
                    // for a response. If we get it and it's correct ("Q") then move on. If we don't get it
                    // wait for a bit longer more then loop around and try again. If after a few loops we still
                    // don't get a response then raise 'Can't connect to DLP' error to the user and get out of
                    // this code
                    //
                    for (int j = 1; j < MAX_DLP_COM_RETRIES; j++)
                    {
                        serialPort_DLP.Write("'");
                        System.Threading.Thread.Sleep(COM_LONG_WAIT_MS);
    
    
                        // check here that the ping repsonse "Q" is sent back
                        if (serialPort_DLP.BytesToRead > 0 && serialPort_DLP.ReadByte() == 81)
                        {
                            System.Threading.Thread.Sleep(COM_LONG_WAIT_MS); // Small delay before firing off setup byte
                            _dlpStateMachineStates = dlpStateMachineStates.DLP_SEND_SETUP; 
                            break; // exit, all good
                        }
                    }
                    if (_dlpStateMachineStates != dlpStateMachineStates.DLP_SEND_SETUP)
                    {
                        MessageBox.Show("DLP-IO8 not found.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        backgroundWorker_DLP.CancelAsync();
                    }
                    break;
    
    
    
    
                // ------------------------------------------------------------------------------------------------
                // SEND SETUP BYTE "\" aka (char)92
                // ------------------------------------------------------------------------------------------------
                //
                // puts dlp into binary mode. If this setup byte is not sent, then the DLP defaults to ascii mode
                //
                case dlpStateMachineStates.DLP_SEND_SETUP:
                    serialPort_DLP.Write(Convert.ToString((char)92));
                    System.Threading.Thread.Sleep(COM_LONG_WAIT_MS);
                    _dlpStateMachineStates = dlpStateMachineStates.DLP_REQUEST_DATA;
                    break;
    
    
    
    
                // ------------------------------------------------------------------------------------------------
                // CLEAR DATA BUFFERS
                // ------------------------------------------------------------------------------------------------
                //
                // flush the Rx buffer
                //
                case dlpStateMachineStates.DLP_CLEAR_DATA_BUFFERS:
                    serialPort_DLP.DiscardInBuffer();
                    break;
    
    
    
    
                // ------------------------------------------------------------------------------------------------
                // REQUEST DATA
                // ------------------------------------------------------------------------------------------------
                //
                // Send the data request for all 8 channels. Each channel has its own request character. They
                // can be sent all at once or 1 at a time if you want to read each channel in turn 1 by 1
                //
                case dlpStateMachineStates.DLP_REQUEST_DATA:
                    stopWatch_DLP.Restart();
                    serialPort_DLP.Write("ZXCVBNM,");
                    System.Threading.Thread.Sleep(COM_SHORT_WAIT_MS);
                    _dlpStateMachineStates = dlpStateMachineStates.DLP_READ_DATA;
                    break;
    
    
    
    
                // ------------------------------------------------------------------------------------------------
                // READ DATA
                // ------------------------------------------------------------------------------------------------
                //
                // Check the data buffers have filled up to 16 bytes which is the size of the receive repsonse
                // when all 8 channels are selected to be read. If we get nothing, then wait a short time and
                // loop around again. If we have looped a few times and still got nothing then send the statemachine
                // back to send another data request and increment a counter. If this counter keeps getting
                // incremented then raise an error that the dlp receive request has timed out and exit the
                // statemachine
                //
                case dlpStateMachineStates.DLP_READ_DATA:
                    for (int j = 1; j < MAX_DLP_COM_RETRIES; j++) // go around 10x and check the buffer each time
                    {
                        if (serialPort_DLP.BytesToRead >= DLP_READ_BYTES)
                        {
                            serialPort_DLP.Read(dlpByteRx, 0, DLP_READ_BYTES);
                            System.Threading.Thread.Sleep(COM_SHORT_WAIT_MS);
                            dlp_Fail_Counts = 0;
                            _dlpStateMachineStates = dlpStateMachineStates.DLP_UPDATE_DISPLAY_CHANNELS;
                            break; // exit, all good
                        }
                        System.Threading.Thread.Sleep(COM_SHORT_WAIT_MS);
                    }
                    // nothing received. Increment counter and set statemachine to go around again. If counter is > retry count then error 
                    // to user and get out of this code
                    if (_dlpStateMachineStates != dlpStateMachineStates.DLP_UPDATE_DISPLAY_CHANNELS)
                    {
                        _dlpStateMachineStates = dlpStateMachineStates.DLP_REQUEST_DATA; // got nothing, send the data request again
                        dlp_Fail_Counts++;
                    }
                    if (dlp_Fail_Counts >= MAX_DLP_COM_RETRIES)
                    {
                        MessageBox.Show("DLP-IO8 receive data timed out.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        backgroundWorker_DLP.CancelAsync();
                    }
                    break;
    
    
    
    
                // ------------------------------------------------------------------------------------------------
                // UPDATE GUI ELEMENTS
                // ------------------------------------------------------------------------------------------------
                //
                // Your data sir, pack it up and send it to the scanner. Do what you will
                //
    
    
    
    
                case dlpStateMachineStates.DLP_UPDATE_DISPLAY_CHANNELS:
                    int[] i = new int[8];
                    double[] d = new double[8];
    
    
                    // combine the bytes into an integer. Each integer is the respective data channel
                    // of the DLP
    
    
                    i[0] = dlpByteRx[1] | dlpByteRx[0] << 8;
                    i[1] = dlpByteRx[3] | dlpByteRx[2] << 8;
                    i[2] = dlpByteRx[5] | dlpByteRx[4] << 8;
                    i[3] = dlpByteRx[7] | dlpByteRx[6] << 8;
                    i[4] = dlpByteRx[9] | dlpByteRx[8] << 8;
                    i[5] = dlpByteRx[11] | dlpByteRx[10] << 8;
                    i[6] = dlpByteRx[13] | dlpByteRx[12] << 8;
                    i[7] = dlpByteRx[15] | dlpByteRx[14] << 8;
    
    
    
    
                    // scale the ad count into what ever the user has entered for the transfrom
                    d[0] = (double)i[0] / 1024 * d_Scalar[0] + d_Offset[0];
                    d[1] = (double)i[1] / 1024 * d_Scalar[1] + d_Offset[1];
                    d[2] = (double)i[2] / 1024 * d_Scalar[2] + d_Offset[2];
                    d[3] = (double)i[3] / 1024 * d_Scalar[3] + d_Offset[3];
                    d[4] = (double)i[4] / 1024 * d_Scalar[4] + d_Offset[4];
                    d[5] = (double)i[5] / 1024 * d_Scalar[5] + d_Offset[5];
                    d[6] = (double)i[6] / 1024 * d_Scalar[6] + d_Offset[6];
                    d[7] = (double)i[7] / 1024 * d_Scalar[7] + d_Offset[7];
    
    
    
    
    
    
                    // Get how long it took to run on receive cycle and update the GUI rate calculation
                    stopWatch_DLP.Stop();
                    double dataRate_DLP_Hz = Math.Round(1000 / (double)stopWatch_DLP.ElapsedMilliseconds);
                    this.Invoke(new MethodInvoker(delegate { tBox_DataRate_DLP.Text = Convert.ToString(dataRate_DLP_Hz) + " Hz"; })); // convert to Hz
    
    
                    // All done here, head back and request another packet of data again
                    _dlpStateMachineStates = dlpStateMachineStates.DLP_REQUEST_DATA;
                    break;
            }
        }
        catch (Exception err)
        {
            MessageBox.Show("DLP State Machine Error." + "\r\n" + "Reason:" + "\r\n" + err.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            backgroundWorker_DLP.CancelAsync();
        }
    }
    No ETA yet.

    Can you describe all 8 sensors you're monitoring?
    What are you measuring, what is the input type and range, what is the output signal and range of the sensor?
    We got this guy Not Sure, ...

  10. #10
    Advanced Tuner
    Join Date
    Mar 2020
    Posts
    219
    Keith, I can try to gather all of that info, but some of the potential things I would like to monitor...

    Transmission Line Pressure (This one would be very common for me)
    Fuel Pressure (Gen 3 GM mostly...verifying whether injector size or fuel supply is the cause of high Injector Duty Cycle)
    ^^^ These would be a very common log for me

    Coolant Pressure (Sanity check for coolant system over pressure symptoms)
    Exhaust manifold pressure (Think turbo pressure ratios)


    In my scenario, just having 2 would tide me over pretty well. Having 3-4 would be great. Can I use the CAN input for my AEM 30-0310 leaving both of my Analog Inputs available? Then, I could put a quick connect on them and change them as necessary after coming up with a good config for each sensor I would need

  11. #11
    Advanced Tuner dhoagland's Avatar
    Join Date
    Jun 2015
    Location
    Aubrey TX
    Posts
    787
    I wasn't just imagining things...
    The 2 was originally going to support an expander hub.
    Attached Images Attached Images
    2011 Camaro 2SS Convertible L99 Bone Stock for now
    2003 Dodge 2500 5.9 Cummins QC 4x4. Airaid, 2nd Gen Intake, Grid Heater Delete, D-Tech 62/65/12, Magnaflow. Bully Dog: Propane Injection, Triple Dog W/Outlook Crazy Larry. Edge EZ, BD Flow-Max, 48RE: Sonnax Sure Cure/Transgo combination, Derale turbulator, billet input, Triple Disc, Super servo, 4 ring Accumulator. :beer

  12. #12
    Advanced Tuner
    Join Date
    Jul 2020
    Location
    VIC Australia
    Posts
    515
    Sounds like 0-5V inputs would solve all your needs.
    And a special input that supports reading frequency and pulse width duty cycle would be a nice bonus.

  13. #13
    Advanced Tuner
    Join Date
    Jul 2020
    Location
    VIC Australia
    Posts
    515
    Quote Originally Posted by dhoagland View Post
    I wasn't just imagining things...
    The 2 was originally going to support an expander hub.
    Sigh, that would have been mint.

  14. #14
    Advanced Tuner
    Join Date
    Mar 2020
    Posts
    219
    Dhoagland yes theres been am expander hub -coming soon- for 4-5 years that I know of

  15. #15
    Hub was a main selling point for me personally. Not sure about shops. But shoot did the average DIY?er get played on that.

  16. #16
    Advanced Tuner dhoagland's Avatar
    Join Date
    Jun 2015
    Location
    Aubrey TX
    Posts
    787
    Quote Originally Posted by village_idiot View Post
    Dhoagland yes theres been am expander hub -coming soon- for 4-5 years that I know of
    LOL...
    I don't want to bash HP in anyway, I love the product.
    I'm sure there are good reasons why this hasn't been made available.

    I would rather not have something, than have something that is half ass'd and problematic..
    2011 Camaro 2SS Convertible L99 Bone Stock for now
    2003 Dodge 2500 5.9 Cummins QC 4x4. Airaid, 2nd Gen Intake, Grid Heater Delete, D-Tech 62/65/12, Magnaflow. Bully Dog: Propane Injection, Triple Dog W/Outlook Crazy Larry. Edge EZ, BD Flow-Max, 48RE: Sonnax Sure Cure/Transgo combination, Derale turbulator, billet input, Triple Disc, Super servo, 4 ring Accumulator. :beer

  17. #17
    Advanced Tuner
    Join Date
    Jul 2020
    Location
    VIC Australia
    Posts
    515
    Quote Originally Posted by dhoagland View Post
    I would rather not have something, than have something that is half ass'd and problematic..
    Biting my tongue not to write what I want lol.

  18. #18
    I will rephrase, I am
    happy with my purchase.

  19. #19
    Advanced Tuner
    Join Date
    Jul 2020
    Location
    VIC Australia
    Posts
    515
    Not sure around the US laws but in Australia, companies aren't allowed to say things like 'coming soon' on a product page or advertisement but then 5 years later still not have delivered. It's potentially misleading conduct and if found to be so under Australian consumer law you could very well be entitled to refund of the pro feature set component of the MPVI2 purchase. In reality, no one will do that. We just grit our teeth and keep tuning.

  20. #20
    Advanced Tuner
    Join Date
    Mar 2020
    Posts
    219
    Does anybody know if I can wire my AEM 30-0310 to the CAN inputs (leaving me 2 available analog inputs)?