Exemplo n.º 1
0
        /// <summary>
        /// Called when new data has arrived from a peer via the specified Link.
        /// </summary>
        /// <param name="link"></param>
        /// <param name="contract"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        unsafe virtual protected VscResult ReceiveCallback(VscLink link, VscContract contract, VscUpdateData data)
        {
            {
                VscResult retRes;
                var       node = VsConnectNode.GetInstanceFromLink(link);

                retRes = ShouldProcessCallback(node, link);

                if (!retRes.IsError())
                {
                    VscSchema schema          = vsc_Api_V3_t.Contract_GetSchema(contract);
                    var       numSchemaFields = vsc_Api_V3_t.Schema_GetNumFields(schema);
                    var       localRole       = vsc_Api_V3_t.Contract_GetLocalRole(contract);


                    Check(localRole == VscRole.SENDER);
                    Check(localRole == VscRole.SENDER);
                    Check(schema != IntPtr.Zero);
                    Check((IntPtr)vsc_Api_V3_t.UpdateData_GetSchema(data) == (IntPtr)schema);


                    for (int fieldIndex = 0; fieldIndex < numSchemaFields; ++fieldIndex)
                    {
                        var field     = vsc_Api_V3_t.Schema_GetField(schema, fieldIndex);
                        var arraySize = vsc_Api_V3_t.Field_GetNumElements(field);
                        Check(arraySize > 0);
                        var vsVar = ToObject(vsc_Api_V3_t.Field_GetAppData(field)) as VSVarBase;

                        if (vsVar != null && vsVar.Direction == VsVarDirection.Input)
                        {
                            double *fieldValue = (double *)vsc_Api_V3_t.UpdateData_GetFieldValue(data, fieldIndex);
                            Check(fieldValue != null);

                            if (vsVar.VariableType == typeof(double))
                            {
                                ((VsConnectVar <double>)vsVar).Value = *fieldValue;
                            }
                            if (vsVar.VariableType == typeof(double[]))
                            {
                                double[] values = new double[arraySize];
                                for (int index = 0; index < arraySize; index++)
                                {
                                    values[index] = fieldValue[index];
                                }
                                ((VsConnectVar <double[]>)vsVar).Value = values;
                            }
                        }
                    }
                    retRes = VscResult.OK;
                }

                return(retRes);
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Called by VS Connect when it needs new data to send.
        /// </summary>
        /// <param name="link"></param>
        /// <param name="contract"></param>
        /// <param name="out_data"></param>
        /// <returns></returns>
        unsafe virtual protected VscResult SendCallback(VscLink link, VscContract contract, VscUpdateData out_data)
        {
            VscResult retRes;

            var node = VsConnectNode.GetInstanceFromLink(link);

            retRes = ShouldProcessCallback(node, link);

            if (!retRes.IsError())
            {
                VscSchema schema          = vsc_Api_V3_t.Contract_GetSchema(contract);
                var       numSchemaFields = vsc_Api_V3_t.Schema_GetNumFields(schema);
                var       localRole       = vsc_Api_V3_t.Contract_GetLocalRole(contract);

                Check(localRole == VscRole.SENDER);
                Check(schema != IntPtr.Zero);
                Check((IntPtr)vsc_Api_V3_t.UpdateData_GetSchema(out_data) == (IntPtr)schema);

                retRes = VscResult.OK;
                for (int fieldIndex = 0; VscResult.OK == retRes && fieldIndex < numSchemaFields; ++fieldIndex)
                {
                    var     field      = vsc_Api_V3_t.Schema_GetField(schema, fieldIndex);
                    double *fieldValue = (double *)vsc_Api_V3_t.UpdateData_GetFieldValue(out_data, fieldIndex);

                    var vsVar = ToObject(vsc_Api_V3_t.Field_GetAppData(field)) as VSVarBase;


                    Check(fieldValue != null);

                    if (vsVar == null)
                    {
                        vsc_Api_V3_t.InvalidateDouble(fieldValue);
                    }
                    else
                    {
                        var arraySize   = vsc_Api_V3_t.Field_GetNumElements(field);
                        var vscDataType = vsc_Api_V3_t.Field_GetDataType(field);
                        var dataSize    = vsc_Api_V3_t.Field_GetElementSizeInBits(field);

                        Check(vscDataType == VscDataType.FLOAT);
                        Check(64 == dataSize);
                        Check(arraySize > 0);

                        if (vsVar.VariableType == typeof(double))
                        {
                            *fieldValue = ((VsConnectVar <double>)vsVar).Value;
                        }
                        if (vsVar.VariableType == typeof(double[]))
                        {
                            int index = 0;
                            foreach (var value in ((VsConnectVar <double[]>)vsVar).Value)
                            {
                                fieldValue[index] = value;
                                index++;
                            }
                        }
                    }
                }
            }

            return(retRes);
        }