/// <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); } }
/// <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); }