コード例 #1
0
        public byte[] XPLMGetDatab(uint XPLMDataRefHandle)
        {
            if (XPLMDataRefHandle == 0)
            {
                return(null);
            }

            XPLMDataStruct.XPLMData data = connector.Write(XPLMCommandStruct.XPLMCommandList.CMD_XPLMGetDatab, "", XPLMDataRefHandle, new XPLMDataStruct.XPLMData());
            if ((data.Data != null) && (data.DataLength > 0) && (data.DataType == XPLMDataStruct.XPLMDataTypeList.dtype_byte_array))
            {
                return(data.Data.Take(data.DataLength).ToArray());
            }

            return(null);
        }
コード例 #2
0
        public byte[] XPLMGetDatab(string XPLMDataRefName)
        {
            if (string.IsNullOrEmpty(XPLMDataRefName))
            {
                return(null);
            }

            XPLMDataStruct.XPLMData data = connector.Write(XPLMCommandStruct.XPLMCommandList.CMD_XPLMGetDatab, XPLMDataRefName, 0, new XPLMDataStruct.XPLMData());
            if ((data.Data != null) && (data.DataLength > 0) && (data.DataType == XPLMDataStruct.XPLMDataTypeList.dtype_byte_array))
            {
                return(data.Data.Take(data.DataLength).ToArray());
            }

            return(null);
        }
コード例 #3
0
        public void XPLMSetDatab(uint XPLMDataRefHandle, byte[] value)
        {
            if (XPLMDataRefHandle == 0)
            {
                return;
            }

            XPLMDataStruct.XPLMData data = new XPLMDataStruct.XPLMData();
            data.DataLength = value.Count();
            data.DataType   = XPLMDataStruct.XPLMDataTypeList.dtype_byte_array;
            data.Data       = new byte[65565];

            Buffer.BlockCopy(value, 0, data.Data, 0, value.Count());

            connector.Write(XPLMCommandStruct.XPLMCommandList.CMD_XPLMSetDatavi, "", XPLMDataRefHandle, data);
        }
コード例 #4
0
        public void XPLMSetDatab(string XPLMDataRefName, byte[] value)
        {
            if (string.IsNullOrEmpty(XPLMDataRefName))
            {
                return;
            }

            XPLMDataStruct.XPLMData data = new XPLMDataStruct.XPLMData();
            data.DataLength = value.Count();
            data.DataType   = XPLMDataStruct.XPLMDataTypeList.dtype_byte_array;
            data.Data       = new byte[65565];

            Buffer.BlockCopy(value, 0, data.Data, 0, value.Count());

            connector.Write(XPLMCommandStruct.XPLMCommandList.CMD_XPLMSetDatavi, XPLMDataRefName, 0, data);
        }
コード例 #5
0
        public void XPLMSetDatad(uint XPLMDataRefHandle, double value)
        {
            if (XPLMDataRefHandle == 0)
            {
                return;
            }

            XPLMDataStruct.XPLMData data = new XPLMDataStruct.XPLMData();
            data.DataLength = 8;
            data.DataType   = XPLMDataStruct.XPLMDataTypeList.dtype_double;
            data.Data       = new byte[65565];

            byte[] doubleval = BitConverter.GetBytes(value);
            Buffer.BlockCopy(doubleval, 0, data.Data, 0, 8);
            connector.Write(XPLMCommandStruct.XPLMCommandList.CMD_XPLMSetDatad, "", XPLMDataRefHandle, data);
        }
コード例 #6
0
        public double XPLMGetDatad(string XPLMDataRefName)
        {
            if (string.IsNullOrEmpty(XPLMDataRefName))
            {
                return(0);
            }

            XPLMDataStruct.XPLMData data = connector.Write(XPLMCommandStruct.XPLMCommandList.CMD_XPLMGetDatad, XPLMDataRefName, 0, new XPLMDataStruct.XPLMData());
            if ((data.Data != null) && (data.DataLength > 0) && (data.DataType == XPLMDataStruct.XPLMDataTypeList.dtype_float))
            {
                double i = BitConverter.ToDouble(data.Data, 0);
                return(i);
            }

            return(0);
        }
コード例 #7
0
        public double XPLMGetDatad(uint XPLMDataRefHandle)
        {
            if (XPLMDataRefHandle == 0)
            {
                return(0);
            }

            XPLMDataStruct.XPLMData data = connector.Write(XPLMCommandStruct.XPLMCommandList.CMD_XPLMGetDataf, "", XPLMDataRefHandle, new XPLMDataStruct.XPLMData());
            if ((data.Data != null) && (data.DataLength > 0) && (data.DataType == XPLMDataStruct.XPLMDataTypeList.dtype_float))
            {
                double i = BitConverter.ToDouble(data.Data, 0);
                return(i);
            }

            return(0);
        }
コード例 #8
0
        /// <summary>
        /// This Routines return 1 if you can set data to given DataRef
        /// </summary>
        /// <param name="XPLMDataRefHandle">DataRef Handle</param>
        /// <returns>0 = false; 1 = true</returns>
        public int XPLMGetDatai(uint XPLMDataRefHandle)
        {
            if (XPLMDataRefHandle == 0)
            {
                return(0);
            }

            XPLMDataStruct.XPLMData data = connector.Write(XPLMCommandStruct.XPLMCommandList.CMD_XPLMGetDatai, "", XPLMDataRefHandle, new XPLMDataStruct.XPLMData());
            if ((data.Data != null) && (data.DataLength > 0) && (data.DataType == XPLMDataStruct.XPLMDataTypeList.dtype_int))
            {
                Int16 i = BitConverter.ToInt16(data.Data, 0);
                return(i);
            }

            return(0);
        }
コード例 #9
0
        /// <summary>
        /// This Routines return 1 if you can set data to given DataRef
        /// </summary>
        /// <param name="XPLMDataRef">DataRefName</param>
        /// <returns>0 = false; 1 = true</returns>
        public int XPLMGetDatai(string XPLMDataRefName)
        {
            if (string.IsNullOrEmpty(XPLMDataRefName))
            {
                return(0);
            }

            XPLMDataStruct.XPLMData data = connector.Write(XPLMCommandStruct.XPLMCommandList.CMD_XPLMGetDatai, XPLMDataRefName, 0, new XPLMDataStruct.XPLMData());
            if ((data.Data != null) && (data.DataLength > 0) && (data.DataType == XPLMDataStruct.XPLMDataTypeList.dtype_int))
            {
                Int16 i = BitConverter.ToInt16(data.Data, 0);
                return(i);
            }

            return(0);
        }
コード例 #10
0
        public void XPLMSetDatad(string XPLMDataRefName, double value)
        {
            if (string.IsNullOrEmpty(XPLMDataRefName))
            {
                return;
            }

            XPLMDataStruct.XPLMData data = new XPLMDataStruct.XPLMData();
            data.DataLength = 8;
            data.DataType   = XPLMDataStruct.XPLMDataTypeList.dtype_double;
            data.Data       = new byte[65565];

            byte[] doubleval = BitConverter.GetBytes(value);
            Buffer.BlockCopy(doubleval, 0, data.Data, 0, 8);
            connector.Write(XPLMCommandStruct.XPLMCommandList.CMD_XPLMSetDatad, XPLMDataRefName, 0, data);
        }
コード例 #11
0
        /// <summary>
        /// This Routines return 1 if you can set data to given DataRef
        /// </summary>
        /// <param name="XPLMDataRef">DataRefName</param>
        /// <returns>0 = false; 1 = true</returns>
        public uint XPLMFindDataRef(string XPLMDataRefName)
        {
            if (string.IsNullOrEmpty(XPLMDataRefName))
            {
                return(0);
            }

            XPLMDataStruct.XPLMData data = connector.Write(XPLMCommandStruct.XPLMCommandList.CMD_XPLMFindDataRef, XPLMDataRefName, 0, new XPLMDataStruct.XPLMData());
            if ((data.Data != null) && (data.DataLength > 0) && (data.DataType == XPLMDataStruct.XPLMDataTypeList.dtype_handle))
            {
                UInt32 i = BitConverter.ToUInt32(data.Data, 0);
                return(i);
            }

            return(0);
        }
コード例 #12
0
        public void XPLMSetDatavi(uint XPLMDataRefHandle, Int16[] value)
        {
            if (XPLMDataRefHandle == 0)
            {
                return;
            }

            XPLMDataStruct.XPLMData data = new XPLMDataStruct.XPLMData();
            data.DataLength = 2 * value.Count();
            data.DataType   = XPLMDataStruct.XPLMDataTypeList.dtype_int_array;
            data.Data       = new byte[65565];

            for (int x = 0; x < value.Count(); x++)
            {
                byte[] intval = BitConverter.GetBytes(value[x]);
                Buffer.BlockCopy(intval, 0, data.Data, x * 2, 2);
            }
            connector.Write(XPLMCommandStruct.XPLMCommandList.CMD_XPLMSetDatavi, "", XPLMDataRefHandle, data);
        }
コード例 #13
0
        public void XPLMSetDatavf(string XPLMDataRefName, Single[] value)
        {
            if (string.IsNullOrEmpty(XPLMDataRefName))
            {
                return;
            }

            XPLMDataStruct.XPLMData data = new XPLMDataStruct.XPLMData();
            data.DataLength = 4 * value.Count();
            data.DataType   = XPLMDataStruct.XPLMDataTypeList.dtype_float_array;
            data.Data       = new byte[65565];

            for (int x = 0; x < value.Count(); x++)
            {
                byte[] floatval = BitConverter.GetBytes(value[x]);
                Buffer.BlockCopy(floatval, 0, data.Data, x * 4, 4);
            }
            connector.Write(XPLMCommandStruct.XPLMCommandList.CMD_XPLMSetDatavf, XPLMDataRefName, 0, data);
        }
コード例 #14
0
        public Int16[] XPLMGetDatavi(uint XPLMDataRefHandle)
        {
            if (XPLMDataRefHandle == 0)
            {
                return(null);
            }

            XPLMDataStruct.XPLMData data = connector.Write(XPLMCommandStruct.XPLMCommandList.CMD_XPLMGetDatavi, "", XPLMDataRefHandle, new XPLMDataStruct.XPLMData());
            if ((data.Data != null) && (data.DataLength > 0) && (data.DataType == XPLMDataStruct.XPLMDataTypeList.dtype_int_array))
            {
                Int16[] i = new Int16[data.DataLength / 2];
                for (int x = 0; x < data.DataLength / 2; x++)
                {
                    i[x] = BitConverter.ToInt16(data.Data, x * 2);
                }
                return(i);
            }

            return(null);
        }
コード例 #15
0
        public float[] XPLMGetDatavf(uint XPLMDataRefHandle)
        {
            if (XPLMDataRefHandle == 0)
            {
                return(null);
            }

            XPLMDataStruct.XPLMData data = connector.Write(XPLMCommandStruct.XPLMCommandList.CMD_XPLMGetDatavf, "", XPLMDataRefHandle, new XPLMDataStruct.XPLMData());
            if ((data.Data != null) && (data.DataLength > 0) && (data.DataType == XPLMDataStruct.XPLMDataTypeList.dtype_float_array))
            {
                float[] i = new float[data.DataLength / 4];
                for (int x = 0; x < data.DataLength / 4; x++)
                {
                    i[x] = BitConverter.ToSingle(data.Data, x * 4);
                }
                return(i);
            }

            return(null);
        }
コード例 #16
0
        } // Write

        /// <summary>
        /// reads the data from shared memory an copy it to struct
        /// </summary>
        /// <returns>struct with data</returns>
        private XPLMDataStruct.XPLMData ReadData()
        {
            try{
                // define buffer
                byte[] byteArray = new byte[Marshal.SizeOf(typeof(XPLMDataStruct.XPLMData))];
                // read daza from shared memory
                mmfa_data.ReadArray <byte>(0, byteArray, 0, Marshal.SizeOf(typeof(XPLMDataStruct.XPLMData)));
                // get handle of buffer
                GCHandle handle = GCHandle.Alloc(byteArray, GCHandleType.Pinned);
                // copy buffer to struct
                XPLMDataStruct.XPLMData data = (XPLMDataStruct.XPLMData)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(XPLMDataStruct.XPLMData));
                // free handle
                handle.Free();
                // return data
                return(data);
            }
            catch
            {
                // on error null
                return(new XPLMDataStruct.XPLMData());
            }
        } // ReadData
コード例 #17
0
        } // open

        /// <summary>
        /// writes a command to shared memory
        /// XPLMDataRef or XPLMDataRefHandle can be used.
        /// If both will given then only XPLMDataRefHandle is used.
        /// </summary>
        /// <param name="cmd">command</param>
        /// <param name="XPLMDataRef">data ref name string</param>
        /// <param name="XPLMDataRefHandle">data ref handle</param>
        /// <param name="data">data for command i.g. write values</param>
        /// <returns>struct with return data from command</returns>
        public XPLMDataStruct.XPLMData Write(XPLMCommandStruct.XPLMCommandList cmd, string XPLMDataRef, uint XPLMDataRefHandle, XPLMDataStruct.XPLMData data)
        {
            try{
                // connector should be initialized and open
                if (!initialized)
                {
                    throw new Exception("XLMPConnetor is not initialized!");
                }

                if (!opened)
                {
                    throw new Exception("XLMPConnetor is not opened!");
                }



                XPLMCommandStruct.XPLMCommand newCommand = new XPLMCommandStruct.XPLMCommand();
                // create command
                newCommand.Command = cmd;
                if (XPLMDataRefHandle > 0)
                {
                    newCommand.XPLMDataRefName   = "";
                    newCommand.XPLMDataRefHandle = XPLMDataRefHandle;
                }
                else
                {
                    newCommand.XPLMDataRefName   = XPLMDataRef;
                    newCommand.XPLMDataRefHandle = 0;
                }
                // convert struct command to byte array
                byte[] byteArray = ConvertStructToByteArray(newCommand);

                // data available?
                if (data.DataLength > 0)
                {
                    // convert struct data to array byte
                    byte[] dataByteArray = ConvertStructToByteArray(data);

                    // write data to shared memory
                    lock_data.WaitOne();
                    mmfa_data.WriteArray(0, dataByteArray, 0, dataByteArray.Length);
                    lock_data.ReleaseMutex();
                }
                else
                {
                    data = new XPLMDataStruct.XPLMData();
                }

                // write command to shared memory
                lock_command.WaitOne();
                mmfa_command.WriteArray(0, byteArray, 0, byteArray.Length);
                lock_command.ReleaseMutex();

                // set event to indicate the plugin that a command is send
                command_eventwaithandle.Set();

                // no reply by set commands
                if (data.DataLength == 0)
                {
                    // wait for reply until timeout
                    int timeout_index = 0;
                    while (timeout_index < Timeout)
                    {
                        // ask if reply event is set from plugin
                        var isNewDataAvailable = data_eventwaithandle.WaitOne(1000);
                        // data available?
                        if (isNewDataAvailable)
                        {
                            // read data
                            data = this.ReadData();
                            // reset event
                            data_eventwaithandle.Reset();
                            // break while
                            break;
                        }
                        // raise timeout index
                        timeout_index++;
                    }
                }

                // return data
                return(data);
            }
            catch
            {
                // on error null
                return(new XPLMDataStruct.XPLMData());
            }
        } // Write