diff options
18 files changed, 219 insertions, 44 deletions
diff --git a/Software/DB/PPC/Tango.mdf b/Software/DB/PPC/Tango.mdf Binary files differindex 7e41561c2..82f79b115 100644 --- a/Software/DB/PPC/Tango.mdf +++ b/Software/DB/PPC/Tango.mdf diff --git a/Software/DB/PPC/Tango_log.ldf b/Software/DB/PPC/Tango_log.ldf Binary files differindex 9d05c6dbf..3e094bf75 100644 --- a/Software/DB/PPC/Tango_log.ldf +++ b/Software/DB/PPC/Tango_log.ldf diff --git a/Software/DB/Tango.mdf b/Software/DB/Tango.mdf Binary files differindex dd6d320e3..f51d1ef53 100644 --- a/Software/DB/Tango.mdf +++ b/Software/DB/Tango.mdf diff --git a/Software/DB/Tango_log.ldf b/Software/DB/Tango_log.ldf Binary files differindex ee59bb247..efb7ce79e 100644 --- a/Software/DB/Tango_log.ldf +++ b/Software/DB/Tango_log.ldf diff --git a/Software/Visual_Studio/FSE/Tango.FSE.UI/DataStore/RemoteDataStoreCollection.cs b/Software/Visual_Studio/FSE/Tango.FSE.UI/DataStore/RemoteDataStoreCollection.cs index 4cf64a688..78e2bcfb1 100644 --- a/Software/Visual_Studio/FSE/Tango.FSE.UI/DataStore/RemoteDataStoreCollection.cs +++ b/Software/Visual_Studio/FSE/Tango.FSE.UI/DataStore/RemoteDataStoreCollection.cs @@ -136,6 +136,11 @@ namespace Tango.FSE.UI.DataStore public IDataStoreItem GetItem(string key, object defaultValue) { + if (defaultValue is IMessage defaultValueMessage) + { + defaultValue = DataStoreProtoObject.FromMessage(defaultValueMessage); + } + var result = _machineProvider.MachineOperator.SendGenericRequest<RemoteDataStoreGetItemRequest, RemoteDataStoreGetItemResponse>(new RemoteDataStoreGetItemRequest() { Collection = Name, diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/DataStore/DefaultDataStoreService.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/DataStore/DefaultDataStoreService.cs index bf0eadae1..ddc0f6cdb 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.Common/DataStore/DefaultDataStoreService.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/DataStore/DefaultDataStoreService.cs @@ -16,6 +16,7 @@ using Tango.PPC.Common.Connection; using Tango.PPC.Common.ExternalBridge; using Tango.Transport; using Tango.Core.ExtensionMethods; +using Newtonsoft.Json.Linq; namespace Tango.PPC.Common.DataStore { @@ -59,6 +60,11 @@ namespace Tango.PPC.Common.DataStore [ExternalBridgeRequestHandlerMethod(typeof(RemoteDataStoreGetRequest), RequestHandlerLoggingMode.LogRequestName)] public async Task OnRemoteDataStoreGetRequest(RemoteDataStoreGetRequest request, String token, ExternalBridgeReceiver receiver) { + if (request.DefaultValue is JObject obj) + { + request.DefaultValue = DataStoreProtoObject.FromJObject(obj); + } + var item = GetManager().GetCollection(request.Collection).GetItem(request.Key, request.DefaultValue); await receiver.SendGenericResponse(new RemoteDataStoreGetResponse() { @@ -70,6 +76,11 @@ namespace Tango.PPC.Common.DataStore [ExternalBridgeRequestHandlerMethod(typeof(RemoteDataStoreGetItemRequest), RequestHandlerLoggingMode.LogRequestName)] public async Task OnRemoteDataStoreGetItemRequest(RemoteDataStoreGetItemRequest request, String token, ExternalBridgeReceiver receiver) { + if (request.DefaultValue is JObject obj) + { + request.DefaultValue = DataStoreProtoObject.FromJObject(obj); + } + var item = GetManager().GetCollection(request.Collection).GetItem(request.Key, request.DefaultValue); await receiver.SendGenericResponse(new RemoteDataStoreGetItemResponse() { diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownType.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownType.cs index f55838db3..8010dc689 100644 --- a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownType.cs +++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownType.cs @@ -1,4 +1,5 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections; using System.Collections.Generic; using System.Drawing; @@ -43,6 +44,13 @@ namespace Tango.Scripting.Editors.Intellisense } public List<KnownTypeField> Fields { get; set; } + public static List<Assembly> ExtensionMethodsAssemblies { get; set; } + + static KnownType() + { + ExtensionMethodsAssemblies = new List<Assembly>(); + } + public KnownType(Type type) { Summary = "Loading documentation..."; @@ -131,11 +139,24 @@ namespace Tango.Scripting.Editors.Intellisense methods.AddRange(inter.GetRuntimeMethods().Where(x => x.IsPublic && !x.IsSpecialName).ToList()); } methods = methods.Distinct().ToList(); + + if (!methods.Exists(x => x.Name == "ToString")) + { + methods.Add(typeof(Object).GetMethod("ToString")); + } } //TODO: Separate extension methods! methods.AddRange(Type.GetExtensionMethods(Type.Assembly).ToList()); + if (Type.Namespace.StartsWith("Tango")) + { + foreach (var asm in ExtensionMethodsAssemblies.Where(x => x != Type.Assembly)) + { + methods.AddRange(Type.GetExtensionMethods(asm).ToList()); + } + } + if (typeof(IEnumerable).IsAssignableFrom(Type)) { var linqMethods = typeof(System.Linq.Enumerable).GetMethods(BindingFlags.Static | BindingFlags.Public).ToList(); @@ -152,7 +173,7 @@ namespace Tango.Scripting.Editors.Intellisense m.Name = method.Name; m.ReturnType = method.ReturnType; m.ReturnTypeFriendlyName = method.ReturnType.GetFriendlyName(); - m.IsStatic = method.IsStatic; + m.IsStatic = method.IsStatic && !method.IsDefined(typeof(System.Runtime.CompilerServices.ExtensionAttribute), false); if (method.IsGenericMethod) { diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/ScriptEditor.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/ScriptEditor.cs index 9ff78912f..e65ff671d 100644 --- a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/ScriptEditor.cs +++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/ScriptEditor.cs @@ -1808,6 +1808,7 @@ namespace Tango.Scripting.Editors _isLoadingTypes = true; var assemblies = ReferenceAssemblies.ToList(); + KnownType.ExtensionMethodsAssemblies = assemblies.ToList(); var usings = _current_usings.ToList(); Thread t = new Thread(() => diff --git a/Software/Visual_Studio/Tango.Core/ExtensionMethods/TypeExtensions.cs b/Software/Visual_Studio/Tango.Core/ExtensionMethods/TypeExtensions.cs index 66978ec19..44297b277 100644 --- a/Software/Visual_Studio/Tango.Core/ExtensionMethods/TypeExtensions.cs +++ b/Software/Visual_Studio/Tango.Core/ExtensionMethods/TypeExtensions.cs @@ -10,6 +10,19 @@ using System.Threading.Tasks; /// </summary> public static class TypeExtensions { + private class AssemblyExtensionMethods + { + public Assembly Assembly { get; set; } + public List<MethodInfo> Methods { get; set; } + + public AssemblyExtensionMethods() + { + Methods = new List<MethodInfo>(); + } + } + + private static List<AssemblyExtensionMethods> _extensionMethodsCache = new List<AssemblyExtensionMethods>(); + /// <summary> /// Gets all the extension methods registered in the specified assembly. /// </summary> @@ -18,14 +31,61 @@ public static class TypeExtensions /// <returns></returns> public static IEnumerable<MethodInfo> GetExtensionMethods(this Type type, Assembly extensionsAssembly) { - var query = from t in extensionsAssembly.GetTypes() - where !t.IsGenericType && !t.IsNested - from m in t.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic) - where m.IsDefined(typeof(System.Runtime.CompilerServices.ExtensionAttribute), false) - where m.GetParameters()[0].ParameterType == type - select m; + if (type.Name == "CalculateRequest") + { + + } + + var asmMethods = _extensionMethodsCache.FirstOrDefault(x => x.Assembly == extensionsAssembly); + + if (asmMethods == null) + { + var query = from t in extensionsAssembly.GetTypes() + where !t.IsGenericType && !t.IsNested + from m in t.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic) + where m.IsDefined(typeof(System.Runtime.CompilerServices.ExtensionAttribute), false) + select m; + + asmMethods = new AssemblyExtensionMethods(); + asmMethods.Assembly = extensionsAssembly; + asmMethods.Methods = query.ToList(); + _extensionMethodsCache.Add(asmMethods); + } + + List<MethodInfo> methods = new List<MethodInfo>(); + + asmMethods.Methods.Where(x => x.GetParameters()[0].ParameterType.IsAssignableFrom(type)); + + foreach (var method in asmMethods.Methods) + { + var parameter = method.GetParameters()[0]; + + if (parameter.ParameterType.IsGenericParameter) + { + var constraints = parameter.ParameterType.GetGenericParameterConstraints().ToList(); + + if (constraints.Count > 0) + { + if (constraints[0].IsAssignableFrom(type)) + { + methods.Add(method); + } + else if (constraints[0].GetInterfaces().Any(x => x.IsAssignableFrom(type))) + { + methods.Add(method); + } + } + } + else + { + if (parameter.ParameterType.IsAssignableFrom(type)) + { + methods.Add(method); + } + } + } - return query; + return methods; } /// <summary> diff --git a/Software/Visual_Studio/Tango.Core/Tango.Core.csproj b/Software/Visual_Studio/Tango.Core/Tango.Core.csproj index 582fa9712..813a31443 100644 --- a/Software/Visual_Studio/Tango.Core/Tango.Core.csproj +++ b/Software/Visual_Studio/Tango.Core/Tango.Core.csproj @@ -155,7 +155,7 @@ <Compile Include="ExtensionMethods\INotifyPropertyChangedExtensions.cs" /> <Compile Include="ExtensionMethods\ObservableCollectionExtensions.cs" /> <Compile Include="ExtensionMethods\IEnumerableExtensions.cs" /> - <Compile Include="ExtensionMethods\IMessageExtensions.cs" /> + <None Include="ExtensionMethods\IMessageExtensions.cs" /> <Compile Include="ExtensionMethods\IParameterizedExtensions.cs" /> <Compile Include="ExtensionMethods\ObjectExtensions.cs" /> <Compile Include="ExtensionMethods\ProcessExtensions.cs" /> @@ -220,7 +220,7 @@ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <ProjectExtensions> <VisualStudio> - <UserProperties BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UseGlobalSettings="False" BuildVersion_StartDate="2000/1/1" /> + <UserProperties BuildVersion_StartDate="2000/1/1" BuildVersion_UseGlobalSettings="False" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" /> </VisualStudio> </ProjectExtensions> <Import Project="..\packages\System.Data.SQLite.Core.1.0.108.0\build\net46\System.Data.SQLite.Core.targets" Condition="Exists('..\packages\System.Data.SQLite.Core.1.0.108.0\build\net46\System.Data.SQLite.Core.targets')" /> diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/Tango.DataStore.Remote.csproj b/Software/Visual_Studio/Tango.DataStore.Remote/Tango.DataStore.Remote.csproj index 2b05d6af3..4d0d04054 100644 --- a/Software/Visual_Studio/Tango.DataStore.Remote/Tango.DataStore.Remote.csproj +++ b/Software/Visual_Studio/Tango.DataStore.Remote/Tango.DataStore.Remote.csproj @@ -76,7 +76,6 @@ </ProjectReference> </ItemGroup> <ItemGroup> - <None Include="app.config" /> <None Include="packages.config" /> </ItemGroup> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> diff --git a/Software/Visual_Studio/Tango.DataStore/DataStoreHelper.cs b/Software/Visual_Studio/Tango.DataStore/DataStoreHelper.cs index 3cf24bdd0..96a905120 100644 --- a/Software/Visual_Studio/Tango.DataStore/DataStoreHelper.cs +++ b/Software/Visual_Studio/Tango.DataStore/DataStoreHelper.cs @@ -35,7 +35,11 @@ namespace Tango.DataStore /// <exception cref="System.NotSupportedException"></exception> public static DataType GetDataType(Type type) { - if (type == typeof(Int32)) + if (type == typeof(int)) + { + return DataType.Int32; + } + else if (type == typeof(Int64)) { return DataType.Int32; } @@ -72,35 +76,6 @@ namespace Tango.DataStore } /// <summary> - /// Gets the CLR type by specified data store data type. - /// </summary> - /// <param name="type">The type.</param> - /// <returns></returns> - /// <exception cref="System.NotSupportedException">The specified data type is not supported.</exception> - //public static Type GetType(DataType type) - //{ - // switch (type) - // { - // case DataType.Boolean: - // return typeof(bool); - // case DataType.Bytes: - // return typeof(byte[]); - // case DataType.Double: - // return typeof(double); - // case DataType.Float: - // return typeof(float); - // case DataType.Int32: - // return typeof(Int32); - // case DataType.String: - // return typeof(String); - // case DataType.Proto: - // return typeof(DataStoreProtoObject); - // } - - // throw new NotSupportedException("The specified data type is not supported."); - //} - - /// <summary> /// Formats the data store item as a string. /// </summary> /// <param name="item">The item.</param> diff --git a/Software/Visual_Studio/Tango.DataStore/DataStoreProtoObject.cs b/Software/Visual_Studio/Tango.DataStore/DataStoreProtoObject.cs index ec4cf1057..6661c2017 100644 --- a/Software/Visual_Studio/Tango.DataStore/DataStoreProtoObject.cs +++ b/Software/Visual_Studio/Tango.DataStore/DataStoreProtoObject.cs @@ -1,5 +1,6 @@ using Google.Protobuf; using Newtonsoft.Json; +using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.IO; @@ -59,6 +60,11 @@ namespace Tango.DataStore return proto; } + public static DataStoreProtoObject FromJObject(JObject obj) + { + return (obj.ToObject<DataStoreProtoObject>()); + } + public static DataStoreProtoObject FromPMRDataStoreItem(DataStoreItem item) { DataStoreProtoObject proto = new DataStoreProtoObject(); diff --git a/Software/Visual_Studio/Tango.DataStore/ExtensionMethods.cs b/Software/Visual_Studio/Tango.DataStore/ExtensionMethods.cs new file mode 100644 index 000000000..acc381a61 --- /dev/null +++ b/Software/Visual_Studio/Tango.DataStore/ExtensionMethods.cs @@ -0,0 +1,16 @@ +using Google.Protobuf; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.DataStore; + +public static class ExtensionMethods +{ + public static DataStoreProtoObject ToDataStoreProtoObject(IMessage message) + { + return DataStoreProtoObject.FromMessage(message); + } +} + diff --git a/Software/Visual_Studio/Tango.DataStore/Tango.DataStore.csproj b/Software/Visual_Studio/Tango.DataStore/Tango.DataStore.csproj index 8035af7b4..c12abe9e8 100644 --- a/Software/Visual_Studio/Tango.DataStore/Tango.DataStore.csproj +++ b/Software/Visual_Studio/Tango.DataStore/Tango.DataStore.csproj @@ -54,6 +54,7 @@ </Compile> <Compile Include="DataStoreHelper.cs" /> <Compile Include="DataStoreProtoObject.cs" /> + <Compile Include="ExtensionMethods.cs" /> <Compile Include="IDataStoreItem.cs" /> <Compile Include="DataType.cs" /> <Compile Include="IDataStoreCollection.cs" /> @@ -61,7 +62,6 @@ <Compile Include="Properties\AssemblyInfo.cs" /> </ItemGroup> <ItemGroup> - <None Include="app.config" /> <None Include="packages.config" /> </ItemGroup> <ItemGroup> diff --git a/Software/Visual_Studio/Tango.Emulations/Emulators/MachineEmulator.cs b/Software/Visual_Studio/Tango.Emulations/Emulators/MachineEmulator.cs index e5296ab4c..6b49ca4eb 100644 --- a/Software/Visual_Studio/Tango.Emulations/Emulators/MachineEmulator.cs +++ b/Software/Visual_Studio/Tango.Emulations/Emulators/MachineEmulator.cs @@ -2060,6 +2060,59 @@ namespace Tango.Emulations.Emulators LogManager.Log(ex, "Failed."); } } + + { + try + { + LogManager.Log("Testing int default..."); + + var res = await Transporter.SendRequest<GetDataStoreItemRequest, GetDataStoreItemResponse>(new GetDataStoreItemRequest() + { + Collection = "TEST", + Key = "intDefault", + DefaultItem = new PMR.DataStore.DataStoreItem() + { + DataType = DataType.Int32, + Int32Value = 10, + }, + }); + + LogManager.Log(res.Container.Error != ErrorCode.None ? "Get Failed." : "Passed."); + LogManager.Log(res.ToJsonString()); + } + catch (Exception ex) + { + LogManager.Log(ex, "Failed."); + } + } + + { + try + { + LogManager.Log("Testing proto default..."); + + var res = await Transporter.SendRequest<GetDataStoreItemRequest, GetDataStoreItemResponse>(new GetDataStoreItemRequest() + { + Collection = "TEST", + Key = "protoDefault", + DefaultItem = new PMR.DataStore.DataStoreItem() + { + DataType = DataType.Proto, + BytesValue = (new CalculateRequest() { A = 10, B = 15 }).ToByteString(), + ProtoType = MessageType.CalculateRequest, + }, + }); + + LogManager.Log(res.Container.Error != ErrorCode.None ? "Get Failed." : "Passed."); + + LogManager.Log(CalculateRequest.Parser.ParseFrom(res.Message.Item.BytesValue).ToJsonString()); + LogManager.Log(res.ToJsonString()); + } + catch (Exception ex) + { + LogManager.Log(ex, "Failed."); + } + } } #endregion diff --git a/Software/Visual_Studio/Tango.PMR/ExtensionMethods/IMessageExtensions.cs b/Software/Visual_Studio/Tango.PMR/ExtensionMethods/IMessageExtensions.cs new file mode 100644 index 000000000..84acb51d2 --- /dev/null +++ b/Software/Visual_Studio/Tango.PMR/ExtensionMethods/IMessageExtensions.cs @@ -0,0 +1,27 @@ +using Google.Protobuf; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + + +public static class IMessageExtensions +{ + /// <summary> + /// Serializes this PMR message to byte array. + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="message">The message.</param> + /// <returns></returns> + public static byte[] ToBytes<T>(this T message) where T : IMessage<T> + { + using (MemoryStream ms = new MemoryStream()) + { + message.WriteTo(ms); + return ms.ToArray(); + } + } +} + diff --git a/Software/Visual_Studio/Tango.PMR/Tango.PMR.csproj b/Software/Visual_Studio/Tango.PMR/Tango.PMR.csproj index 7b3a7c397..bb44ef591 100644 --- a/Software/Visual_Studio/Tango.PMR/Tango.PMR.csproj +++ b/Software/Visual_Studio/Tango.PMR/Tango.PMR.csproj @@ -189,6 +189,7 @@ <Compile Include="Exports\JobFileLiquidVolume.cs" /> <Compile Include="Exports\JobFileSegment.cs" /> <Compile Include="ExtensionMethods.cs" /> + <Compile Include="ExtensionMethods\IMessageExtensions.cs" /> <Compile Include="ExtensionMethods\VersionPackageDescriptorExtensions.cs" /> <Compile Include="FirmwareUpgrade\ActivateVersionRequest.cs" /> <Compile Include="FirmwareUpgrade\ActivateVersionResponse.cs" /> @@ -482,7 +483,7 @@ </PropertyGroup> <ProjectExtensions> <VisualStudio> - <UserProperties BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UseGlobalSettings="False" BuildVersion_StartDate="2000/1/1" /> + <UserProperties BuildVersion_StartDate="2000/1/1" BuildVersion_UseGlobalSettings="False" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" /> </VisualStudio> </ProjectExtensions> </Project>
\ No newline at end of file |
