diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..5df9cb86 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,2 @@ +github: rickedb +buy_me_a_coffee: rickedb diff --git a/.github/workflows/dotnetcore.yml b/.github/workflows/dotnetcore.yml index bfe6fb00..707186f9 100644 --- a/.github/workflows/dotnetcore.yml +++ b/.github/workflows/dotnetcore.yml @@ -1,6 +1,6 @@ name: dotnetcore -on: +on: pull_request: types: [opened, synchronize] push: @@ -15,7 +15,7 @@ jobs: - name: Setup .NET Core uses: actions/setup-dotnet@master with: - dotnet-version: | + dotnet-version: | 3.1.x 6.0.x 8.0.x @@ -29,7 +29,7 @@ jobs: - name: Setup .NET Core uses: actions/setup-dotnet@master with: - dotnet-version: | + dotnet-version: | 3.1.x 6.0.x 8.0.x @@ -37,4 +37,4 @@ jobs: - name: Build and run .net core tests run: | dotnet build src/MIDTesters.Core/MIDTesters.Core.csproj - dotnet test src/MIDTesters.Core/MIDTesters.Core.csproj \ No newline at end of file + dotnet test src/MIDTesters.Core/MIDTesters.Core.csproj diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d2d31a46..f2d3b578 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,7 +13,7 @@ jobs: - name: Setup .NET Core uses: actions/setup-dotnet@master with: - dotnet-version: | + dotnet-version: | 3.1.x 6.0.x 8.0.x @@ -27,7 +27,7 @@ jobs: - name: Setup .NET Core uses: actions/setup-dotnet@master with: - dotnet-version: | + dotnet-version: | 3.1.x 6.0.x 8.0.x @@ -48,4 +48,4 @@ jobs: - name: Publish NuGet run: | dotnet build src/OpenProtocolInterpreter/OpenProtocolInterpreter.csproj --configuration release - nuget push src/OpenProtocolInterpreter/bin/release/OpenProtocolInterpreter.6.1.2.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate \ No newline at end of file + nuget push src/OpenProtocolInterpreter/bin/release/OpenProtocolInterpreter.6.2.0.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate diff --git a/.gitignore b/.gitignore index 38077a5a..92156c41 100644 --- a/.gitignore +++ b/.gitignore @@ -31,6 +31,7 @@ publishprofiles/ # MSTest test Results [Tt]est[Rr]esult*/ [Bb]uild[Ll]og.* +BenchmarkDotNet.Artifacts/ # NUNIT *.VisualState.xml diff --git a/.vscode/settings.json b/.vscode/settings.json index 6f871fb6..651bdec5 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,8 +1,13 @@ { - "dotnet.defaultSolution": "OpenProtocolInterpreter.sln", - "omnisharp.useModernNet": true, - "omnisharp.enableRoslynAnalyzers": true, - "omnisharp.enableEditorConfigSupport": true, - "omnisharp.enableDecompilationSupport": true, - "dotnet.completion.showCompletionItemsFromUnimportedNamespaces": true + "dotnet.defaultSolution": "OpenProtocolInterpreter.slnx", + "omnisharp.useModernNet": true, + "omnisharp.enableRoslynAnalyzers": true, + "omnisharp.enableEditorConfigSupport": true, + "omnisharp.enableDecompilationSupport": true, + "dotnet.completion.showCompletionItemsFromUnimportedNamespaces": true, + "chat.tools.terminal.autoApprove": { + "dotnet build": true, + "dotnet test": true + }, + "dotnet.preferCSharpExtension": false } diff --git a/OpenProtocolInterpreter.slnx b/OpenProtocolInterpreter.slnx index ec628101..1171772d 100644 --- a/OpenProtocolInterpreter.slnx +++ b/OpenProtocolInterpreter.slnx @@ -1,4 +1,5 @@ + diff --git a/README.md b/README.md index 49023b88..009b12e7 100644 --- a/README.md +++ b/README.md @@ -1,35 +1,37 @@ -Open Protocol Interpreter - -

- - Buy me a coffee - - - - - - - - - MIT - -

- - +Open Protocol Interpreter + +[![Version](https://img.shields.io/nuget/vpre/OpenProtocolInterpreter.svg)](https://www.nuget.org/packages/OpenProtocolInterpreter) +[![Downloads](https://img.shields.io/nuget/dt/OpenProtocolInterpreter.svg)](https://www.nuget.org/packages/OpenProtocolInterpreter) +[![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/rickedb/OpenProtocolInterpreter/release.yml?branch=master)](https://github.com/Rickedb/OpenProtocolInterpreter/actions/workflows/release.yml) +[![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/Rickedb/OpenProtocolIntepreter/master/LICENSE) +[![Sponsors](https://img.shields.io/github/sponsors/rickedb?style=social)](https://github.com/sponsors/rickedb) + > OpenProtocol communication utility - 1. [What is Open Protocol at all?](#what-is-open-protocol-at-all) + 1. [What is Open Protocol at all?](#what-is-open-protocol-at-all) 2. [What is OpenProtocolInterpreter?](#what-is-openprotocolinterpreter) - 3. [How does it work?](#how-does-it-work) - 4. [Usage examples](#lets-see-some-examples-of-usage) - 5. [Available on package managers](#get-it-on-nuget) - 6. [Advanced section](#advanced-section) + 3. [Get it on NuGet](#get-it-on-nuget) + 4. [How does it work?](#how-does-it-work) + 5. [Usage examples](#lets-see-some-examples-of-usage) + * [Parsing a package](#parsing-a-package) + * [Packing a MID](#packing-a-mid) + * [Replies and acknowledges](#replies-and-acknowledges) + 6. [Anatomy of a MID](#anatomy-of-a-mid) + * [Data field attributes](#data-field-attributes) + * [Available attributes](#available-attributes) + * [Revisions](#revisions) + 7. [Advanced section](#advanced-section) + * [MIDs identifying customization](#mids-identifying-customization) + * [Extra data (MID 0006, 0008 and 0009)](#extra-data-mid-0006-0008-and-0009) + * [MIDs overriding](#mids-overriding) + * [Adding MIDs that are not in documentation](#adding-mids-that-are-not-in-documentation) * [How it was built?](#how-it-was-built) - * [Customization](#mids-identifying-customization) * [Advanced example](#advanced-example) -7. [Tips](#tips) -8. [Contribute to the project](#contribute-to-the-project) -9. [Still unavailable mids](#list-of-still-unavailable-mids) + 8. [Tips](#tips) + 9. [Supported frameworks](#supported-frameworks) +10. [Contribute to the project](#contribute-to-the-project) +11. [Sponsor the project](#sponsor-the-project) +12. [Still unavailable mids](#list-of-still-unavailable-mids) ## What is Open Protocol at all? @@ -44,13 +46,18 @@ Most common Tightening Controllers from Atlas Copco company are **PowerFocus4000 OpenProtocolInterpreter is a **library that converts the ugly string** that came from Open Protocol packages, which is commonly called **MID**, to an **object**. *"Substringing"* packages is such a boring thing to do, so let OpenProtocolIntepreter do it for you! -**[If you're curious, just take a look at their documentation.](https://github.com/Rickedb/OpenProtocolIntepreter/blob/master/docs/OpenProtocol_Specification.pdf)** +**[If you're curious, just take a look at their documentation.](docs/OpenProtocol_Specification.pdf)** + +## Get it on [NuGet](https://www.nuget.org/packages/OpenProtocolInterpreter)! +``` +Install-Package OpenProtocolInterpreter +``` ## How does it work? It's simple, you give us your byte[] or string package and we deliver you an object, simple as that! -For example, let's imagine you received the following string package: +For example, let's imagine you received the following string package: ``` csharp string package = "00240005001 0018"; ``` @@ -58,83 +65,212 @@ It's **MID 5**, so OpenProtocolIntepreter will return a **Mid0005** class for yo ## Let's see some examples of usage -A simple usage: +### Parsing a package + +`MidInterpreter` starts empty: you must tell it which MIDs it should know about before parsing anything. +`UseAllMessages()` is the "give me everything" shortcut — see [MIDs identifying customization](#mids-identifying-customization) to narrow it down. ``` csharp -var interpreter = new MidInterpreter(); -var midPackage = @"00260004001 001802"; +var interpreter = new MidInterpreter().UseAllMessages(); + +var midPackage = "00260004001 001802"; var myMid04 = interpreter.Parse(midPackage); -//MID 0004 is an error mid which contains which MID Failed and its error code -//Int value of the Failed Mid -int myFailedMid = myMid04.FailedMid; -//An enum with Error Code -Error errorCode = myMid04.ErrorCode; -``` + +//MID 0004 is an error mid which contains which MID failed and its error code +int myFailedMid = myMid04.FailedMid; // 18 +Error errorCode = myMid04.ErrorCode; // Error.ParameterSetIdNotPresent +``` + +Everything a MID carries is a plain, settable property, so you can read it straight away. +`byte[]` packages are accepted by the very same overloads: + +``` csharp +byte[] rawPackage = socket.Receive(); +var mid = interpreter.Parse(rawPackage); // returns Mid, use it when you don't know what is coming +var mid04 = interpreter.Parse(rawPackage); +``` + +> Use `Parse(package)` when you don't know which MID will arrive and `Parse(package)` when you do. +> The generic overload throws `InvalidCastException` when the package turns out to be another MID. + +### Packing a MID It can generate an object from a string, but can it make it to the other way?? FOR SURE! + ``` csharp -var jobUploadRequest = new Mid0032(1, 2); //Job id 1, revision 2 +var jobUploadRequest = new Mid0032(revision: 2) { JobId = 1 }; var package = jobUploadRequest.Pack(); //Generated package => 00240032002 0001 -``` -## Get it on [NuGet](https://www.nuget.org/packages/OpenProtocolInterpreter)! +var bytes = jobUploadRequest.PackBytes(); // same content, encoded with Mid.DefaultEncoding (ASCII) +var terminated = jobUploadRequest.PackWithNul(); // appends the NUL character some controllers expect ``` -Install-Package OpenProtocolInterpreter + +The header length is recalculated for you on every `Pack()`, based on the revision in `Header.Revision`. +Every MID exposes a parameterless constructor (revision 1) and a `Mid(Header header)` constructor; the ones that +have more than one documented revision also expose `Mid(int revision)`. + +### Replies and acknowledges + +MIDs advertise their relationships through marker interfaces, so it might help you to remember which MID answers which or even give a shortcut for you: + +``` csharp +Mid0062 ack = new Mid0061(2).GetAcknowledge(); // IAcknowledgeable, keeps the source revision +Mid0033 reply = new Mid0032(2).GetReply(); // IAnswerableBy ``` +## Anatomy of a MID + +### Data field attributes + +A MID has **each property is decorated with a data field attribute** describing where that value lives inside the package. Which also represents the string index/position of the package accordingly with Open Protocol documentation. E.g.: + +``` csharp +public class Mid0004 : Mid, ICommunication, IController +{ + public const int MID = 4; + + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 4, HasPrefix = false)] + [Int32DataFieldDefinition(revision: 2, field: 1, Index = 20, Size = 4, HasPrefix = false)] + public int FailedMid { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 2, Index = 24, Size = 2, HasPrefix = false)] + [Int32DataFieldDefinition(revision: 2, field: 2, Index = 24, Size = 3, HasPrefix = false)] + public Error ErrorCode { get; set; } + + public Mid0004() : this(DEFAULT_REVISION) { } + public Mid0004(Header header) : base(header) { } + public Mid0004(int revision) : this(new Header { Mid = MID, Revision = revision }) { } +} +``` + +Every attribute accepts: + +| Member | Meaning | +| - | - | +| `revision` | Revision this definition belongs to. | +| `field` | Data field id/sequence/index inside the revision. | +| `Index` | Offset of the value inside the package, counted from the start of the package (the header takes the first 20 chars). | +| `Size` | Length of the value. Fixed automatically by some attributes that has fixed size (booleans, timestamps). | +| `HasPrefix` | `true` when the package carries the two digit field id right before the value. | +| `PaddingChar` | Char used to pad the value to its full size when packing. | +| `PaddingOrientation` | Defines if char filling `RightPadded` or `LeftPadded` | + +Parsing and packing both flow through the same definitions: on `Parse` the slice is read, converted and **written back into the property**; on `Pack` the property value is read, converted and written into the package. + +### Available attributes + +| Attribute | Property type | Notes | +| - | - | - | +| `BooleanDataFieldDefinition` | `bool` | `Size` forced to 1 | +| `StringDataFieldDefinition` | `string` | Defaultly right padded with `' '`| +| `Int32DataFieldDefinition` | `int`, `int`-backed `enum` | left padded with `'0'` | +| `Int64DataFieldDefinition` | `long`, `long`-backed `enum` | left padded with `'0'` | +| `DecimalDataFieldDefinition` | `decimal` | left padded with `'0'` | +| `TruncatedDecimalDataFieldDefinition` | `decimal` | `DecimalPoints` (default 2) implicit decimal places | +| `TimestampDataFieldDefinition` | `DateTime` | `Size` forced to 19, `YYYY-MM-DD:HH:MM:SS` | +| `Int32CollectionDefinition` | `List` | requires `EachFieldSize` | +| `EnumCollectionDefinition` | `List` where `T : Enum` | one char per entry | +| `VariableDataFieldCollectionDefinition` | `List` | the variable data fields block | + +### Revisions + +At parse/pack time only the definitions up to `Header.StandardizedRevision` are used so we can avoid confusion with revision `0` since when zero or blank it represents revision `1`. + ## Advanced Section! Now we will get real! Put one thing in mind, in real world we will always need to build something more complex than the dummies examples we give to you. **With this in mind, this section is for you:** -#### How it was built? - -It used to rely on **Chain Of Responsabilities** design pattern, but since we had some problems with instance references, it changed! -For now, instead of iterating through all Mids of the same category, it relies on a Dictionary, which every category knows which mid it attends, once it found it creates a new Instance via System.Reflection and parse it. - #### MIDs Identifying Customization -We have several MIDs inside Open Protocol documentation, but do you really need all of them? +We have several MIDs inside Open Protocol documentation, but do you really need all of them? The answer is... **NO!** You will probably need only to use a range of MIDs, with this in mind, we did something to make things faster. You can tell us which MIDs we should considerate! -> *NOTE: You can register only mids you need to call "Parse" method - Here is an example: ``` csharp -string package = "00260004001 001802"; var myCustomInterpreter = new MidInterpreter() - .UseAllMessages(new Type[] - { - typeof(Mid0001), - typeof(Mid0002), - typeof(Mid0003), - typeof(Mid0004), - typeof(Mid0106) - }); + .UseAllMessages(new Type[] + { + typeof(Mid0001), + typeof(Mid0002), + typeof(Mid0003), + typeof(Mid0004), + typeof(Mid0106) + }); + //Will work: -var myMid04 = myCustomInterpreter.Parse(package); -//Won't work, will throw NotImplementedException: -var myMid30 = myCustomInterpreter.Parse(package); -//Won't work, will throw InvalidCastException: -var myMid01 = myCustomInterpreter.Parse(package); +var myMid04 = myCustomInterpreter.Parse("00260004001 001802"); + +//Won't work, will throw NotImplementedException, MID 0030 was never registered: +var unknown = myCustomInterpreter.Parse("00220030001 01"); +``` + +You can also register a whole category at once, and filter it by your role in the communication: + +``` csharp +var interpreter = new MidInterpreter() + .UseCommunicationMessages(InterpreterMode.Integrator) + .UseTighteningMessages(InterpreterMode.Integrator) + .UseAlarmMessages(InterpreterMode.Integrator); ``` -When you don't know which package will come, use ``` Parse ``` overload, not ``` Parse ```. If you want, take a look at the sample on this repository. -> If necessary, there is a new overload where you can define if you're the controller or the integrator, which will automatically handle implemented mids + +`InterpreterMode.Integrator` keeps only the MIDs a controller can send you, `InterpreterMode.Controller` keeps +only the ones an integrator can send, and `InterpreterMode.Both` (the default) keeps everything. +There is one `Use...Messages` extension per category, all of them accepting a mode, an `IEnumerable` or an +`IDictionary` (see [MIDs overriding](#mids-overriding)). + +#### Extra data (MID 0006, 0008 and 0009) + +MIDs 0006 (request), 0008 (subscription) and 0009 (unsubscription) carry a free form payload whose layout +depends on the MID being requested/subscribed. Those payloads are modelled by `ExtraData` classes, which use the very same data field attributes as a MID: + +``` csharp +var subscription = new Mid0008(); +subscription.SetExtraData(new Mid1201ExtraDataSubscription +{ + SendAlternatives = 1, + DataIdentifierTimestamp = new DateTime(2026, 8, 7, 13, 45, 0), + SendObjectData = true +}); + +var package = subscription.Pack(); +//Generated package => 00590008001 12010013000000000012026-08-07:13:45:001 +``` + +`SetExtraData` fills `SubscriptionMid`, `WantedRevision`, `ExtraDataLength` and `ExtraData` for you. +On the receiving side, parse the container MID first and then hand its raw `ExtraData` to the matching class: + +``` csharp +var mid08 = interpreter.Parse(package); +var extraData = (Mid1201ExtraDataSubscription)new Mid1201ExtraDataSubscription(mid08.WantedRevision) + .Parse(mid08.ExtraData); + +int alternatives = extraData.SendAlternatives; +DateTime timestamp = extraData.DataIdentifierTimestamp; +``` + +A MID may declare one `ExtraData` per kind, since request (`IExtraDataRequest`), subscription (`IExtraDataSubscription`) and unsubscription (`IExtraDataUnsubscription`) payloads don't necessarily share the same content. + +> If necessary you can add `ExtraData` manually as plain string. #### MIDs Overriding -Maybe you have a totally crazy controller that does not implement the Mid as the documentation says or you might want to inject your own Mid inheriting another Mid, +Maybe you have a totally crazy controller that does not implement the Mid as the documentation says or you might want to inject your own Mid inheriting another Mid, so you can customize it and add more properties to handle some conversions. Anyway, if you need that, it's possible to override! Here is an example: ``` csharp //This will override Mid 81 with my custom Mid -var _midInterpreter new MidInterpreter().UseAllMessages() - .UseTimeMessages(new Dictionary() { { 81, typeof(OverridedMid0081) } }); +var interpreter = new MidInterpreter() + .UseAllMessages() + .UseTimeMessages(new Dictionary { { Mid0081.MID, typeof(OverridedMid0081) } }); + +var mid = interpreter.Parse("00390081001 2026-08-07:13:45:00"); +//mid is an OverridedMid0081 public class OverridedMid0081 : Mid0081 @@ -147,67 +283,45 @@ public class OverridedMid0081 : Mid0081 public OverridedMid0081() { - - } - public override string Pack() - { - Time = TestCustomMid.Now; - return base.Pack(); } } ``` +> Your type must expose a parameterless constructor — that's the one the interpreter compiles and calls. + #### Adding MIDs that are not in documentation Maybe your controller is weird and have unknown MID numbers, MIDs that are not in the documentation and you want to inject into MidInterpreter, there is a way: ``` csharp -var _midInterpreter new MidInterpreter().UseAllMessages() - .UseCustomMessage(new Dictionary() { { 83, typeof(NewMid0083) } }); +var interpreter = new MidInterpreter() + .UseAllMessages() + .UseCustomMessage(new Dictionary { { NewMid0083.MID, typeof(NewMid0083) } }); public class NewMid0083 : Mid { - private readonly IValueConverter _dateConverter; - private const int LAST_REVISION = 1; public const int MID = 83; - public DateTime Time - { - get => GetField(1, (int)DataFields.TIME).GetValue(_dateConverter.Convert); - set => GetField(1, (int)DataFields.TIME).SetValue(_dateConverter.Convert, value); - } - public string TimeZone - { - get => GetField(1, (int)DataFields.TIMEZONE).Value; - set => GetField(1, (int)DataFields.TIMEZONE).SetValue(value); - } + [TimestampDataFieldDefinition(revision: 1, field: 1, Index = 20, HasPrefix = false)] + public DateTime Time { get; set; } - public NewMid0083() : base(MID, LAST_REVISION) - { - _dateConverter = new DateConverter(); - } + [StringDataFieldDefinition(revision: 1, field: 2, Index = 39, Size = 2, HasPrefix = false)] + public string TimeZone { get; set; } - protected override Dictionary> RegisterDatafields() + public NewMid0083() : base(MID, DEFAULT_REVISION) { - return new Dictionary>() - { - { - 1, new List() - { - new DataField((int)DataFields.TIME, 20, 19), - new DataField((int)DataFields.TIMEZONE, 41, 2) - } - } - }; + } - public enum DataFields + public NewMid0083(Header header) : base(header) { - TIME, - TIMEZONE + } } + +//new NewMid0083 { Time = new DateTime(2026, 8, 7, 13, 45, 0), TimeZone = "BR" }.Pack() +// => 00410083001 2026-08-07:13:45:00BR ``` > **NOTE:** Custom messages might not perform as fast as other MIDs because they don't have optimizations for finding it @@ -217,9 +331,9 @@ public class NewMid0083 : Mid Declared a delegate: ``` csharp -protected delegate void ReceivedCommandActionDelegate(ReceivedMIDEventArgs e); +protected delegate void ReceivedCommandActionDelegate(ReceivedMidEventArgs e); ``` -**ReceivedMIDEventArgs class**: +**ReceivedMidEventArgs class**: ``` csharp public class ReceivedMidEventArgs : EventArgs { @@ -253,48 +367,47 @@ protected void OnPackageReceived(string message) var mid = Interpreter.Parse(message); //Get Registered delegate for the MID that was identified - var action = OnReceivedMid.FirstOrDefault(x => x.Key == mid.GetType()); - - if (action.Equals(default(KeyValuePair))) - return; //Stop if there is no delegate registered for the message that arrived - - action.Value(new ReceivedMidEventArgs() { ReceivedMid = mid }); //Call delegate - } - catch (Exception ex) - { - Console.log(ex.Message); - } + if (!OnReceivedMid.TryGetValue(mid.GetType(), out var action)) + return; //Stop if there is no delegate registered for the message that arrived + + action(new ReceivedMidEventArgs { ReceivedMid = mid }); //Call delegate + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } } ``` -This would call the registered delegate which you're sure what mid it is. -For example when a **MID_0061** (last tightening) pop up, the **onTighteningReceived** delegate will be called: +This would call the registered delegate which you're sure what mid it is. +For example when a **MID_0061** (last tightening) pop up, the **OnTighteningReceived** delegate will be called: ``` csharp protected void OnTighteningReceived(ReceivedMidEventArgs e) { try { - Mid0061 tighteningMid = e.ReceivedMID as Mid0061; //Casting to the right mid + var tighteningMid = (Mid0061)e.ReceivedMid; //Casting to the right mid //This method just send the ack from tightening mid - BuildAndSendAcknowledge(tighteningMid); - Console.log("TIGHTENING ARRIVED") - } - catch (Exception ex) - { - Console.log(ex.Message); - } + BuildAndSendAcknowledge(tighteningMid); + Console.WriteLine("TIGHTENING ARRIVED"); + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } } -protected void BuildAndSendAcknowledge(Mid mid) +protected void BuildAndSendAcknowledge(Mid0061 mid) { - TcpClient.GetStream().Write(new Mid0062().Pack()); //Send acknowledge to controller + var ack = mid.GetAcknowledge(); //Mid0062, on the same revision as the received mid + TcpClient.GetStream().Write(ack.PackBytes()); //Send acknowledge to controller } ``` ### Tips -> Instantiate the **MIDIdentifier** class just once and keep working with it! +> Instantiate the **MidInterpreter** class just once and keep working with it! Template lookups are cached per instance. > **Controller Implementation Tip:** Always **TRY** to register used MIDs, not all Tightening Controllers use every available MID. @@ -302,16 +415,31 @@ protected void BuildAndSendAcknowledge(Mid mid) ### Contribute to the project -Lot's of effort were given to this project and by seen people using it motivated me a lot to improve it more and more. +Bug reports, controllers that behave differently from the specification and new MIDs are all very welcome. +Fork it, add your MID next to its category (with its tests in `src/MIDTesters.Core`) and open a pull request. +The [Still unavailable MIDs](#list-of-still-unavailable-mids) table below is a good place to pick something up. + +### Sponsor the project + +OpenProtocolInterpreter is built and maintained on free time, and the hardware it talks to isn't exactly the +kind of thing you keep on your desk. If this library saved you a few days of *"substringing"* packages — or if +your company ships something on top of it — consider sponsoring its development: + +[![Sponsor on GitHub](https://img.shields.io/badge/Sponsor-GitHub%20Sponsors-ea4aaa?logo=githubsponsors&logoColor=white)](https://github.com/sponsors/rickedb) +[![Buy me a coffee](https://img.shields.io/badge/Buy%20me%20a%20coffee-ffdd00?logo=buymeacoffee&logoColor=black)](https://www.buymeacoffee.com/rickedb) + +* **[GitHub Sponsors](https://github.com/sponsors/rickedb)** — one-off or monthly, and it shows up right here on the repository. +* **[Buy me a coffee](https://www.buymeacoffee.com/rickedb)** — for a quick thank you. -Does it help you a lot? That's awesome and very rewarding! -But if you wish, you can support and help to motivate the constant improving of this library by contributing in [OpenCollective](https://opencollective.com/open-protocol-interpreter). +Sponsoring keeps new MIDs, new specification revisions and bug fixes coming. Not in a position to sponsor? +Starring the repository, reporting a controller that misbehaves or sending a pull request helps just as much. ### List of still unavailable Mids | MID | Description | Notes | | - | - | - | | 0007 | Reserved | Reserved by Atlas Copco | +| 0025 | Parameter user set download request | | | 0049 | Pairing Status Acknowledge | | | 0700 | Tightening data download status for radio tools | | | 0900 | Result traces curve | | @@ -322,9 +450,6 @@ But if you wish, you can support and help to motivate the constant improving of | 1901 | Selector socket control | | | 2100 | Device command | | | 2500 | Program data download | | -| 2501 | Program data upload reply | | -| 2502 | Password request | | -| 2503 | Password response | | | 2600 | Mode ID upload request | | | 2601 | Mode ID upload reply | | | 2602 | Mode data upload request | | diff --git a/docs/OpenProtocolSpecification_Release_2.20.1.pdf b/docs/OpenProtocol_Specification.pdf similarity index 100% rename from docs/OpenProtocolSpecification_Release_2.20.1.pdf rename to docs/OpenProtocol_Specification.pdf diff --git a/media/icon.png b/media/icon.png index 508640ee..f2dd5363 100644 Binary files a/media/icon.png and b/media/icon.png differ diff --git a/media/logo.png b/media/logo.png index 5f46bebe..25718e17 100644 Binary files a/media/logo.png and b/media/logo.png differ diff --git a/src/MIDTesters.Core/Alarm/TestMid0070.cs b/src/MIDTesters.Core/Alarm/TestMid0070.cs index 5a0a854c..0f73e592 100644 --- a/src/MIDTesters.Core/Alarm/TestMid0070.cs +++ b/src/MIDTesters.Core/Alarm/TestMid0070.cs @@ -29,5 +29,14 @@ public void Mid0070ByteAllRevisions() Assert.IsTrue(mid.Header.NoAckFlag); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Pack")] + public void Mid0070PackAllRevisions() + { + string pack = @"002000700021 "; + + AssertBuildAndParse(pack, new Mid0070(2, noAckFlag: true)); + } } } diff --git a/src/MIDTesters.Core/Alarm/TestMid0071.cs b/src/MIDTesters.Core/Alarm/TestMid0071.cs index 103ab7a8..9d0ba5c0 100644 --- a/src/MIDTesters.Core/Alarm/TestMid0071.cs +++ b/src/MIDTesters.Core/Alarm/TestMid0071.cs @@ -1,6 +1,8 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenProtocolInterpreter.Alarm; +using System; +using OpenProtocolInterpreter; namespace MIDTesters.Alarm { [TestClass] @@ -14,10 +16,10 @@ public void Mid0071Revision1() string pack = @"00530071001 01E851021031042017-12-01:20:12:45"; var mid = _midInterpreter.Parse(pack); - Assert.IsNotNull(mid.ErrorCode); - Assert.IsNotNull(mid.ControllerReadyStatus); - Assert.IsNotNull(mid.ToolReadyStatus); - Assert.IsNotNull(mid.Time); + Assert.AreEqual("E851", mid.ErrorCode); + Assert.IsTrue(mid.ControllerReadyStatus); + Assert.IsTrue(mid.ToolReadyStatus); + Assert.AreEqual(new DateTime(2017, 12, 1, 20, 12, 45), mid.Time); AssertEqualPackages(pack, mid); } @@ -29,10 +31,10 @@ public void Mid0071ByteRevision1() byte[] bytes = GetAsciiBytes(pack); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.ErrorCode); - Assert.IsNotNull(mid.ControllerReadyStatus); - Assert.IsNotNull(mid.ToolReadyStatus); - Assert.IsNotNull(mid.Time); + Assert.AreEqual("E851", mid.ErrorCode); + Assert.IsTrue(mid.ControllerReadyStatus); + Assert.IsTrue(mid.ToolReadyStatus); + Assert.AreEqual(new DateTime(2017, 12, 1, 20, 12, 45), mid.Time); AssertEqualPackages(bytes, mid); } @@ -40,14 +42,13 @@ public void Mid0071ByteRevision1() [TestCategory("Revision 2"), TestCategory("ASCII")] public void Mid0071Revision2() { - string pack = @"01060071002 01E1021021031042017-12-01:20:12:4505Alarm Text "; + string pack = @"00540071002 01E1021021031042017-12-01:20:12:45"; var mid = _midInterpreter.Parse(pack); - Assert.IsNotNull(mid.ErrorCode); - Assert.IsNotNull(mid.ControllerReadyStatus); - Assert.IsNotNull(mid.ToolReadyStatus); - Assert.IsNotNull(mid.Time); - Assert.IsNotNull(mid.AlarmText); + Assert.AreEqual("E1021", mid.ErrorCode); + Assert.IsTrue(mid.ControllerReadyStatus); + Assert.IsTrue(mid.ToolReadyStatus); + Assert.AreEqual(new DateTime(2017, 12, 1, 20, 12, 45), mid.Time); AssertEqualPackages(pack, mid); } @@ -55,16 +56,93 @@ public void Mid0071Revision2() [TestCategory("Revision 2"), TestCategory("ByteArray")] public void Mid0071ByteRevision2() { - string pack = @"01060071002 01E1021021031042017-12-01:20:12:4505Alarm Text "; + string pack = @"00540071002 01E1021021031042017-12-01:20:12:45"; byte[] bytes = GetAsciiBytes(pack); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.ErrorCode); - Assert.IsNotNull(mid.ControllerReadyStatus); - Assert.IsNotNull(mid.ToolReadyStatus); - Assert.IsNotNull(mid.Time); - Assert.IsNotNull(mid.AlarmText); + Assert.AreEqual("E1021", mid.ErrorCode); + Assert.IsTrue(mid.ControllerReadyStatus); + Assert.IsTrue(mid.ToolReadyStatus); + Assert.AreEqual(new DateTime(2017, 12, 1, 20, 12, 45), mid.Time); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 3"), TestCategory("ASCII")] + public void Mid0071Revision3() + { + string pack = @"01090071003 01E1021021031042017-12-01:20:12:4505106Alarm Text "; + var mid = _midInterpreter.Parse(pack); + + Assert.AreEqual("E1021", mid.ErrorCode); + Assert.IsTrue(mid.ControllerReadyStatus); + Assert.IsTrue(mid.ToolReadyStatus); + Assert.AreEqual(new DateTime(2017, 12, 1, 20, 12, 45), mid.Time); + Assert.AreEqual("Alarm Text ", mid.AlarmText); + AssertEqualPackages(pack, mid); + } + + [TestMethod] + [TestCategory("Revision 3"), TestCategory("ByteArray")] + public void Mid0071ByteRevision3() + { + string pack = @"01090071003 01E1021021031042017-12-01:20:12:4505106Alarm Text "; + byte[] bytes = GetAsciiBytes(pack); + var mid = _midInterpreter.Parse(bytes); + + Assert.AreEqual("E1021", mid.ErrorCode); + Assert.IsTrue(mid.ControllerReadyStatus); + Assert.IsTrue(mid.ToolReadyStatus); + Assert.AreEqual(new DateTime(2017, 12, 1, 20, 12, 45), mid.Time); + Assert.AreEqual("Alarm Text ", mid.AlarmText); + AssertEqualPackages(bytes, mid); + } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0071PackRevision1() + { + string pack = @"00530071001 01E851021031042017-12-01:20:12:45"; + + AssertBuildAndParse(pack, new Mid0071(1) + { + ErrorCode = "E851", + ControllerReadyStatus = true, + ToolReadyStatus = true, + Time = new DateTime(2017, 12, 1, 20, 12, 45) + }); + } + + [TestMethod] + [TestCategory("Revision 2"), TestCategory("Pack")] + public void Mid0071PackRevision2() + { + string pack = @"00540071002 01E1021021031042017-12-01:20:12:45"; + + AssertBuildAndParse(pack, new Mid0071(2) + { + ErrorCode = "E1021", + ControllerReadyStatus = true, + ToolReadyStatus = true, + Time = new DateTime(2017, 12, 1, 20, 12, 45) + }); + } + + [TestMethod] + [TestCategory("Revision 3"), TestCategory("Pack")] + public void Mid0071PackRevision3() + { + string pack = @"01090071003 01E1021021031042017-12-01:20:12:4505106Alarm Text "; + + AssertBuildAndParse(pack, new Mid0071(3) + { + ErrorCode = "E1021", + ControllerReadyStatus = true, + ToolReadyStatus = true, + Time = new DateTime(2017, 12, 1, 20, 12, 45), + ToolHealth = ToolHealth.Ok, + AlarmText = "Alarm Text" + }); + } } } diff --git a/src/MIDTesters.Core/Alarm/TestMid0072.cs b/src/MIDTesters.Core/Alarm/TestMid0072.cs index c5349f25..803e33b1 100644 --- a/src/MIDTesters.Core/Alarm/TestMid0072.cs +++ b/src/MIDTesters.Core/Alarm/TestMid0072.cs @@ -29,5 +29,14 @@ public void Mid0072ByteAllRevisions() Assert.AreEqual(typeof(Mid0072), mid.GetType()); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Pack")] + public void Mid0072PackAllRevisions() + { + string pack = @"00200072002 "; + + AssertBuildAndParse(pack, new Mid0072(2)); + } } } diff --git a/src/MIDTesters.Core/Alarm/TestMid0073.cs b/src/MIDTesters.Core/Alarm/TestMid0073.cs index 799fe970..ef5b9808 100644 --- a/src/MIDTesters.Core/Alarm/TestMid0073.cs +++ b/src/MIDTesters.Core/Alarm/TestMid0073.cs @@ -29,5 +29,14 @@ public void Mid0073ByteAllRevisions() Assert.AreEqual(typeof(Mid0073), mid.GetType()); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Pack")] + public void Mid0073PackAllRevisions() + { + string pack = @"00200073002 "; + + AssertBuildAndParse(pack, new Mid0073(2)); + } } } diff --git a/src/MIDTesters.Core/Alarm/TestMid0074.cs b/src/MIDTesters.Core/Alarm/TestMid0074.cs index b41f608c..65e3ff02 100644 --- a/src/MIDTesters.Core/Alarm/TestMid0074.cs +++ b/src/MIDTesters.Core/Alarm/TestMid0074.cs @@ -14,8 +14,7 @@ public void Mid0074Revision1() string pack = @"00240074001 E851"; var mid = _midInterpreter.Parse(pack); - Assert.IsNotNull(mid.ErrorCode); - Assert.AreEqual(4, mid.ErrorCode.Length); + Assert.AreEqual("E851", mid.ErrorCode); AssertEqualPackages(pack, mid); } @@ -27,8 +26,7 @@ public void Mid0074ByteRevision1() byte[] bytes = GetAsciiBytes(pack); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.ErrorCode); - Assert.AreEqual(4, mid.ErrorCode.Length); + Assert.AreEqual("E851", mid.ErrorCode); AssertEqualPackages(bytes, mid); } @@ -39,8 +37,7 @@ public void Mid0074Revision2() string pack = @"00250074002 E8514"; var mid = _midInterpreter.Parse(pack); - Assert.IsNotNull(mid.ErrorCode); - Assert.AreEqual(5, mid.ErrorCode.Length); + Assert.AreEqual("E8514", mid.ErrorCode); AssertEqualPackages(pack, mid); } @@ -52,9 +49,32 @@ public void Mid0074ByteRevision2() byte[] bytes = GetAsciiBytes(pack); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.ErrorCode); - Assert.AreEqual(5, mid.ErrorCode.Length); + Assert.AreEqual("E8514", mid.ErrorCode); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0074PackRevision1() + { + string pack = @"00240074001 E851"; + + AssertBuildAndParse(pack, new Mid0074(1) + { + ErrorCode = "E851" + }); + } + + [TestMethod] + [TestCategory("Revision 2"), TestCategory("Pack")] + public void Mid0074PackRevision2() + { + string pack = @"00250074002 E8514"; + + AssertBuildAndParse(pack, new Mid0074(2) + { + ErrorCode = "E8514" + }); + } } } diff --git a/src/MIDTesters.Core/Alarm/TestMid0075.cs b/src/MIDTesters.Core/Alarm/TestMid0075.cs index 633aa4b8..8d4d0e2d 100644 --- a/src/MIDTesters.Core/Alarm/TestMid0075.cs +++ b/src/MIDTesters.Core/Alarm/TestMid0075.cs @@ -29,5 +29,14 @@ public void Mid0075ByteAllRevisions() Assert.AreEqual(typeof(Mid0075), mid.GetType()); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Pack")] + public void Mid0075PackAllRevisions() + { + string pack = @"00200075001 "; + + AssertBuildAndParse(pack, new Mid0075(1)); + } } } diff --git a/src/MIDTesters.Core/Alarm/TestMid0076.cs b/src/MIDTesters.Core/Alarm/TestMid0076.cs index 7baa6704..53b6f38f 100644 --- a/src/MIDTesters.Core/Alarm/TestMid0076.cs +++ b/src/MIDTesters.Core/Alarm/TestMid0076.cs @@ -1,5 +1,7 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; using OpenProtocolInterpreter.Alarm; +using System; namespace MIDTesters.Alarm { @@ -14,11 +16,11 @@ public void Mid0076Revision1() string pack = @"00560076001 01102E851031041052017-01-25:10:20:20"; var mid = _midInterpreter.Parse(pack); - Assert.IsNotNull(mid.AlarmStatus); - Assert.IsNotNull(mid.ErrorCode); - Assert.IsNotNull(mid.ControllerReadyStatus); - Assert.IsNotNull(mid.ToolReadyStatus); - Assert.IsNotNull(mid.Time); + Assert.IsTrue(mid.AlarmStatus); + Assert.AreEqual("E851", mid.ErrorCode); + Assert.IsTrue(mid.ControllerReadyStatus); + Assert.IsTrue(mid.ToolReadyStatus); + Assert.AreEqual(new DateTime(2017, 1, 25, 10, 20, 20), mid.Time); AssertEqualPackages(pack, mid); } @@ -30,11 +32,11 @@ public void Mid0076ByteRevision1() byte[] bytes = GetAsciiBytes(pack); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.AlarmStatus); - Assert.IsNotNull(mid.ErrorCode); - Assert.IsNotNull(mid.ControllerReadyStatus); - Assert.IsNotNull(mid.ToolReadyStatus); - Assert.IsNotNull(mid.Time); + Assert.IsTrue(mid.AlarmStatus); + Assert.AreEqual("E851", mid.ErrorCode); + Assert.IsTrue(mid.ControllerReadyStatus); + Assert.IsTrue(mid.ToolReadyStatus); + Assert.AreEqual(new DateTime(2017, 1, 25, 10, 20, 20), mid.Time); AssertEqualPackages(bytes, mid); } @@ -45,11 +47,11 @@ public void Mid0076Revision2() string pack = @"00570076002 01102 E851031041052017-01-25:10:20:20"; var mid = _midInterpreter.Parse(pack); - Assert.IsNotNull(mid.AlarmStatus); - Assert.IsNotNull(mid.ErrorCode); - Assert.IsNotNull(mid.ControllerReadyStatus); - Assert.IsNotNull(mid.ToolReadyStatus); - Assert.IsNotNull(mid.Time); + Assert.IsTrue(mid.AlarmStatus); + Assert.AreEqual(" E851", mid.ErrorCode); + Assert.IsTrue(mid.ControllerReadyStatus); + Assert.IsTrue(mid.ToolReadyStatus); + Assert.AreEqual(new DateTime(2017, 1, 25, 10, 20, 20), mid.Time); AssertEqualPackages(pack, mid); } @@ -61,11 +63,11 @@ public void Mid0076ByteRevision2() byte[] bytes = GetAsciiBytes(pack); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.AlarmStatus); - Assert.IsNotNull(mid.ErrorCode); - Assert.IsNotNull(mid.ControllerReadyStatus); - Assert.IsNotNull(mid.ToolReadyStatus); - Assert.IsNotNull(mid.Time); + Assert.IsTrue(mid.AlarmStatus); + Assert.AreEqual(" E851", mid.ErrorCode); + Assert.IsTrue(mid.ControllerReadyStatus); + Assert.IsTrue(mid.ToolReadyStatus); + Assert.AreEqual(new DateTime(2017, 1, 25, 10, 20, 20), mid.Time); AssertEqualPackages(bytes, mid); } @@ -76,12 +78,12 @@ public void Mid0076Revision3() string pack = @"00600076003 01102 E851031041052017-01-25:10:20:20061"; var mid = _midInterpreter.Parse(pack); - Assert.IsNotNull(mid.AlarmStatus); - Assert.IsNotNull(mid.ErrorCode); - Assert.IsNotNull(mid.ControllerReadyStatus); - Assert.IsNotNull(mid.ToolReadyStatus); - Assert.IsNotNull(mid.Time); - Assert.IsNotNull(mid.ToolHealth); + Assert.IsTrue(mid.AlarmStatus); + Assert.AreEqual(" E851", mid.ErrorCode); + Assert.IsTrue(mid.ControllerReadyStatus); + Assert.IsTrue(mid.ToolReadyStatus); + Assert.AreEqual(new DateTime(2017, 1, 25, 10, 20, 20), mid.Time); + Assert.AreEqual(ToolHealth.Ok, mid.ToolHealth); AssertEqualPackages(pack, mid); } @@ -93,13 +95,62 @@ public void Mid0076ByteRevision3() byte[] bytes = GetAsciiBytes(pack); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.AlarmStatus); - Assert.IsNotNull(mid.ErrorCode); - Assert.IsNotNull(mid.ControllerReadyStatus); - Assert.IsNotNull(mid.ToolReadyStatus); - Assert.IsNotNull(mid.Time); - Assert.IsNotNull(mid.ToolHealth); + Assert.IsTrue(mid.AlarmStatus); + Assert.AreEqual(" E851", mid.ErrorCode); + Assert.IsTrue(mid.ControllerReadyStatus); + Assert.IsTrue(mid.ToolReadyStatus); + Assert.AreEqual(new DateTime(2017, 1, 25, 10, 20, 20), mid.Time); + Assert.AreEqual(ToolHealth.Ok, mid.ToolHealth); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0076PackRevision1() + { + string pack = @"00560076001 01102E851031041052017-01-25:10:20:20"; + + AssertBuildAndParse(pack, new Mid0076(1) + { + AlarmStatus = true, + ErrorCode = "E851", + ControllerReadyStatus = true, + ToolReadyStatus = true, + Time = new DateTime(2017, 1, 25, 10, 20, 20) + }); + } + + [TestMethod] + [TestCategory("Revision 2"), TestCategory("Pack")] + public void Mid0076PackRevision2() + { + string pack = @"00570076002 01102 E851031041052017-01-25:10:20:20"; + + AssertBuildAndParse(pack, new Mid0076(2) + { + AlarmStatus = true, + ErrorCode = " E851", + ControllerReadyStatus = true, + ToolReadyStatus = true, + Time = new DateTime(2017, 1, 25, 10, 20, 20) + }); + } + + [TestMethod] + [TestCategory("Revision 3"), TestCategory("Pack")] + public void Mid0076PackRevision3() + { + string pack = @"00600076003 01102 E851031041052017-01-25:10:20:20061"; + + AssertBuildAndParse(pack, new Mid0076(3) + { + AlarmStatus = true, + ErrorCode = " E851", + ControllerReadyStatus = true, + ToolReadyStatus = true, + Time = new DateTime(2017, 1, 25, 10, 20, 20), + ToolHealth = ToolHealth.Ok + }); + } } } diff --git a/src/MIDTesters.Core/Alarm/TestMid0077.cs b/src/MIDTesters.Core/Alarm/TestMid0077.cs index e29ef62b..9263da8e 100644 --- a/src/MIDTesters.Core/Alarm/TestMid0077.cs +++ b/src/MIDTesters.Core/Alarm/TestMid0077.cs @@ -29,5 +29,14 @@ public void Mid0077ByteAllRevisions() Assert.AreEqual(typeof(Mid0077), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Pack")] + public void Mid0077PackAllRevisions() + { + string pack = @"00200077 "; + + AssertBuildAndParse(pack, new Mid0077(), true); + } } } diff --git a/src/MIDTesters.Core/Alarm/TestMid0078.cs b/src/MIDTesters.Core/Alarm/TestMid0078.cs index 96db85a9..e2c5557c 100644 --- a/src/MIDTesters.Core/Alarm/TestMid0078.cs +++ b/src/MIDTesters.Core/Alarm/TestMid0078.cs @@ -29,5 +29,14 @@ public void Mid0078ByteAllRevisions() Assert.AreEqual(typeof(Mid0078), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Pack")] + public void Mid0078PackAllRevisions() + { + string pack = @"00200078 "; + + AssertBuildAndParse(pack, new Mid0078(), true); + } } } diff --git a/src/MIDTesters.Core/Alarm/TestMid1000.cs b/src/MIDTesters.Core/Alarm/TestMid1000.cs index 7bafbe3d..b012d933 100644 --- a/src/MIDTesters.Core/Alarm/TestMid1000.cs +++ b/src/MIDTesters.Core/Alarm/TestMid1000.cs @@ -1,6 +1,9 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; using OpenProtocolInterpreter.Alarm; +using System; +using System.Collections.Generic; namespace MIDTesters.Alarm { [TestClass] @@ -14,10 +17,27 @@ public void Mid1000Revision1() string pack = "00911000001 ABCDE2017-12-01:20:12:4500201700009040000000ALARMTEXT017010010100000001"; var mid = _midInterpreter.Parse(pack); - Assert.IsNotNull(mid.AlarmCode); - Assert.IsNotNull(mid.Time); - Assert.IsNotNull(mid.AlarmDataFields); + Assert.AreEqual("ABCDE", mid.AlarmCode); + Assert.AreEqual(new DateTime(2017, 12, 1, 20, 12, 45), mid.Time); Assert.AreEqual(2, mid.NumberOfDataFields); + Assert.AreEqual(2, mid.AlarmDataFields.Count); + + var alarmText = mid.AlarmDataFields[0]; + Assert.AreEqual(1700, alarmText.ParameterId); + Assert.AreEqual(9, alarmText.Length); + Assert.AreEqual(DataTypeDefinition.String, alarmText.DataType); + Assert.AreEqual(DataUnitType.NoUnit, alarmText.Unit); + Assert.AreEqual(0, alarmText.StepNumber); + Assert.AreEqual("ALARMTEXT", alarmText.DataValue); + + var alarmFlag = mid.AlarmDataFields[1]; + Assert.AreEqual(1701, alarmFlag.ParameterId); + Assert.AreEqual(1, alarmFlag.Length); + Assert.AreEqual(DataTypeDefinition.UnsignedInteger, alarmFlag.DataType); + Assert.AreEqual(DataUnitType.NoUnit, alarmFlag.Unit); + Assert.AreEqual(0, alarmFlag.StepNumber); + Assert.AreEqual("1", alarmFlag.DataValue); + AssertEqualPackages(pack, mid); } @@ -25,15 +45,51 @@ public void Mid1000Revision1() [TestCategory("Revision 1"), TestCategory("ByteArray")] public void Mid1000ByteRevision1() { - string pack = "00911000001 ABCDE2017-12-01:20:12:4500201700009040000000ALARMTEXT017010010100000001"; + string pack = "00911000001 ABCDE2017-12-01:20:12:4500201700009040000000TEXTALARM017010010100000002"; byte[] bytes = GetAsciiBytes(pack); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.AlarmCode); - Assert.IsNotNull(mid.Time); - Assert.IsNotNull(mid.AlarmDataFields); + Assert.AreEqual("ABCDE", mid.AlarmCode); + Assert.AreEqual(new DateTime(2017, 12, 1, 20, 12, 45), mid.Time); Assert.AreEqual(2, mid.NumberOfDataFields); + Assert.AreEqual(2, mid.AlarmDataFields.Count); + + var alarmText = mid.AlarmDataFields[0]; + Assert.AreEqual(1700, alarmText.ParameterId); + Assert.AreEqual(9, alarmText.Length); + Assert.AreEqual(DataTypeDefinition.String, alarmText.DataType); + Assert.AreEqual(DataUnitType.NoUnit, alarmText.Unit); + Assert.AreEqual(0, alarmText.StepNumber); + Assert.AreEqual("TEXTALARM", alarmText.DataValue); + + var alarmFlag = mid.AlarmDataFields[1]; + Assert.AreEqual(1701, alarmFlag.ParameterId); + Assert.AreEqual(1, alarmFlag.Length); + Assert.AreEqual(DataTypeDefinition.UnsignedInteger, alarmFlag.DataType); + Assert.AreEqual(DataUnitType.NoUnit, alarmFlag.Unit); + Assert.AreEqual(0, alarmFlag.StepNumber); + Assert.AreEqual("2", alarmFlag.DataValue); + AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid1000PackRevision1() + { + string pack = "00911000001 ABCDE2017-12-01:20:12:4500201700009040000000ALARMTEXT017010010100000001"; + + AssertBuildAndParse(pack, new Mid1000(1) + { + AlarmCode = "ABCDE", + Time = new DateTime(2017, 12, 1, 20, 12, 45), + NumberOfDataFields = 2, + AlarmDataFields = new List() + { + new VariableDataField() { ParameterId = 1700, Length = 9, DataType = DataTypeDefinition.String, Unit = DataUnitType.NoUnit, StepNumber = 0, DataValue = "ALARMTEXT" }, + new VariableDataField() { ParameterId = 1701, Length = 1, DataType = DataTypeDefinition.UnsignedInteger, Unit = DataUnitType.NoUnit, StepNumber = 0, DataValue = "1" } + } + }); + } } } diff --git a/src/MIDTesters.Core/Alarm/TestMid1001.cs b/src/MIDTesters.Core/Alarm/TestMid1001.cs index 6f11c29e..d864dcdf 100644 --- a/src/MIDTesters.Core/Alarm/TestMid1001.cs +++ b/src/MIDTesters.Core/Alarm/TestMid1001.cs @@ -29,5 +29,14 @@ public void Mid1001ByteAllRevisions() Assert.AreEqual(typeof(Mid1001), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Pack")] + public void Mid1001PackAllRevisions() + { + string pack = @"00201001 "; + + AssertBuildAndParse(pack, new Mid1001(), true); + } } } diff --git a/src/MIDTesters.Core/ApplicationController/TestMid0270.cs b/src/MIDTesters.Core/ApplicationController/TestMid0270.cs index e44a9f07..b8e2cf32 100644 --- a/src/MIDTesters.Core/ApplicationController/TestMid0270.cs +++ b/src/MIDTesters.Core/ApplicationController/TestMid0270.cs @@ -29,5 +29,14 @@ public void Mid0270ByteRevision1() Assert.AreEqual(typeof(Mid0270), mid.GetType()); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0270PackRevision1() + { + string package = "00200270001 "; + + AssertBuildAndParse(package, new Mid0270()); + } } } diff --git a/src/MIDTesters.Core/ApplicationSelector/TestMid0250.cs b/src/MIDTesters.Core/ApplicationSelector/TestMid0250.cs index e244baab..090dd90f 100644 --- a/src/MIDTesters.Core/ApplicationSelector/TestMid0250.cs +++ b/src/MIDTesters.Core/ApplicationSelector/TestMid0250.cs @@ -31,5 +31,14 @@ public void Mid0250ByteRevision1() Assert.IsTrue(mid.Header.NoAckFlag); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0250PackRevision1() + { + string package = "00200250 1 "; + + AssertBuildAndParse(package, new Mid0250(noAckFlag: true), true); + } } } diff --git a/src/MIDTesters.Core/ApplicationSelector/TestMid0251.cs b/src/MIDTesters.Core/ApplicationSelector/TestMid0251.cs index 1523ce2e..569cc6f0 100644 --- a/src/MIDTesters.Core/ApplicationSelector/TestMid0251.cs +++ b/src/MIDTesters.Core/ApplicationSelector/TestMid0251.cs @@ -1,5 +1,6 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenProtocolInterpreter.ApplicationSelector; +using System.Collections.Generic; namespace MIDTesters.ApplicationSelector { @@ -15,9 +16,21 @@ public void Mid0251Revision1() var mid = _midInterpreter.Parse(package); Assert.IsTrue(mid.Header.NoAckFlag); - Assert.IsNotNull(mid.DeviceId); - Assert.IsNotNull(mid.NumberOfSockets); - Assert.IsNotNull(mid.SocketStatus); + Assert.AreEqual(50, mid.DeviceId); + Assert.AreEqual(10, mid.NumberOfSockets); + CollectionAssert.AreEqual(new List + { + false, + true, + false, + true, + true, + false, + true, + true, + true, + false + }, mid.SocketStatus); AssertEqualPackages(package, mid, true); } @@ -29,10 +42,37 @@ public void Mid0251ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.DeviceId); - Assert.IsNotNull(mid.NumberOfSockets); - Assert.IsNotNull(mid.SocketStatus); + Assert.AreEqual(50, mid.DeviceId); + Assert.AreEqual(10, mid.NumberOfSockets); + CollectionAssert.AreEqual(new List + { + false, + true, + false, + true, + true, + false, + true, + true, + true, + false + }, mid.SocketStatus); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0251PackRevision1() + { + string package = "00400251 1 01500210030101101110"; + + AssertBuildAndParse(package, new Mid0251() + { + Header = { NoAckFlag = true }, + DeviceId = 50, + NumberOfSockets = 10, + SocketStatus = new List() { false, true, false, true, true, false, true, true, true, false } + }, true); + } } } diff --git a/src/MIDTesters.Core/ApplicationSelector/TestMid0252.cs b/src/MIDTesters.Core/ApplicationSelector/TestMid0252.cs index 5d49289c..2ce1cd4e 100644 --- a/src/MIDTesters.Core/ApplicationSelector/TestMid0252.cs +++ b/src/MIDTesters.Core/ApplicationSelector/TestMid0252.cs @@ -29,5 +29,14 @@ public void Mid0252ByteRevision1() Assert.AreEqual(typeof(Mid0252), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0252PackRevision1() + { + string package = "00200252 "; + + AssertBuildAndParse(package, new Mid0252(), true); + } } } diff --git a/src/MIDTesters.Core/ApplicationSelector/TestMid0253.cs b/src/MIDTesters.Core/ApplicationSelector/TestMid0253.cs index 882f5e67..5c6403a7 100644 --- a/src/MIDTesters.Core/ApplicationSelector/TestMid0253.cs +++ b/src/MIDTesters.Core/ApplicationSelector/TestMid0253.cs @@ -29,5 +29,14 @@ public void Mid0253ByteRevision1() Assert.AreEqual(typeof(Mid0253), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0253PackRevision1() + { + string package = "00200253 "; + + AssertBuildAndParse(package, new Mid0253(), true); + } } } diff --git a/src/MIDTesters.Core/ApplicationSelector/TestMid0254.cs b/src/MIDTesters.Core/ApplicationSelector/TestMid0254.cs index 5380f173..dd814606 100644 --- a/src/MIDTesters.Core/ApplicationSelector/TestMid0254.cs +++ b/src/MIDTesters.Core/ApplicationSelector/TestMid0254.cs @@ -1,5 +1,7 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; using OpenProtocolInterpreter.ApplicationSelector; +using System.Collections.Generic; namespace MIDTesters.ApplicationSelector { @@ -14,8 +16,10 @@ public void Mid0254Revision1() string package = "00340254 01110201221022"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.DeviceId); - Assert.IsNotNull(mid.GreenLights); + Assert.AreEqual(11, mid.DeviceId); + CollectionAssert.AreEqual( + new List { LightCommand.Off, LightCommand.Steady, LightCommand.Flashing, LightCommand.Flashing, LightCommand.Steady, LightCommand.Off, LightCommand.Flashing, LightCommand.Flashing }, + mid.GreenLights); AssertEqualPackages(package, mid, true); } @@ -27,9 +31,36 @@ public void Mid0254ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.DeviceId); - Assert.IsNotNull(mid.GreenLights); + Assert.AreEqual(11, mid.DeviceId); + CollectionAssert.AreEqual(new List + { + LightCommand.Off, + LightCommand.Steady, + LightCommand.Flashing, + LightCommand.Flashing, + LightCommand.Steady, + LightCommand.Off, + LightCommand.Flashing, + LightCommand.Flashing + }, mid.GreenLights); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0254PackRevision1() + { + string package = "00340254 01110201221022"; + + AssertBuildAndParse(package, new Mid0254() + { + DeviceId = 11, + GreenLights = new List() + { + LightCommand.Off, LightCommand.Steady, LightCommand.Flashing, LightCommand.Flashing, + LightCommand.Steady, LightCommand.Off, LightCommand.Flashing, LightCommand.Flashing + } + }, true); + } } } diff --git a/src/MIDTesters.Core/ApplicationSelector/TestMid0255.cs b/src/MIDTesters.Core/ApplicationSelector/TestMid0255.cs index 3d0a277d..5cef2769 100644 --- a/src/MIDTesters.Core/ApplicationSelector/TestMid0255.cs +++ b/src/MIDTesters.Core/ApplicationSelector/TestMid0255.cs @@ -1,5 +1,7 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; using OpenProtocolInterpreter.ApplicationSelector; +using System.Collections.Generic; namespace MIDTesters.ApplicationSelector { @@ -14,8 +16,18 @@ public void Mid0255Revision1() string package = "00340255 01510221112022"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.DeviceId); - Assert.IsNotNull(mid.RedLights); + Assert.AreEqual(51, mid.DeviceId); + CollectionAssert.AreEqual(new List + { + LightCommand.Flashing, + LightCommand.Steady, + LightCommand.Steady, + LightCommand.Steady, + LightCommand.Flashing, + LightCommand.Off, + LightCommand.Flashing, + LightCommand.Flashing + }, mid.RedLights); AssertEqualPackages(package, mid, true); } @@ -27,9 +39,36 @@ public void Mid0255ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.DeviceId); - Assert.IsNotNull(mid.RedLights); + Assert.AreEqual(51, mid.DeviceId); + CollectionAssert.AreEqual(new List + { + LightCommand.Flashing, + LightCommand.Steady, + LightCommand.Steady, + LightCommand.Steady, + LightCommand.Flashing, + LightCommand.Off, + LightCommand.Flashing, + LightCommand.Flashing + }, mid.RedLights); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0255PackRevision1() + { + string package = "00340255 01510221112022"; + + AssertBuildAndParse(package, new Mid0255() + { + DeviceId = 51, + RedLights = new List() + { + LightCommand.Flashing, LightCommand.Steady, LightCommand.Steady, LightCommand.Steady, + LightCommand.Flashing, LightCommand.Off, LightCommand.Flashing, LightCommand.Flashing + } + }, true); + } } } diff --git a/src/MIDTesters.Core/ApplicationToolLocationSystem/TestMid0260.cs b/src/MIDTesters.Core/ApplicationToolLocationSystem/TestMid0260.cs index 5d9406f9..2f468829 100644 --- a/src/MIDTesters.Core/ApplicationToolLocationSystem/TestMid0260.cs +++ b/src/MIDTesters.Core/ApplicationToolLocationSystem/TestMid0260.cs @@ -29,5 +29,14 @@ public void Mid0260ByteRevision1() Assert.AreEqual(typeof(Mid0260), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0260PackRevision1() + { + string package = "00200260 "; + + AssertBuildAndParse(package, new Mid0260(), true); + } } } diff --git a/src/MIDTesters.Core/ApplicationToolLocationSystem/TestMid0261.cs b/src/MIDTesters.Core/ApplicationToolLocationSystem/TestMid0261.cs index ff2e734d..dd23d33b 100644 --- a/src/MIDTesters.Core/ApplicationToolLocationSystem/TestMid0261.cs +++ b/src/MIDTesters.Core/ApplicationToolLocationSystem/TestMid0261.cs @@ -31,5 +31,14 @@ public void Mid0261ByteRevision1() Assert.IsTrue(mid.Header.NoAckFlag); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0261PackRevision1() + { + string package = "00200261 1 "; + + AssertBuildAndParse(package, new Mid0261(noAckFlag: true), true); + } } } diff --git a/src/MIDTesters.Core/ApplicationToolLocationSystem/TestMid0262.cs b/src/MIDTesters.Core/ApplicationToolLocationSystem/TestMid0262.cs index c3ef80ef..0b6b3a24 100644 --- a/src/MIDTesters.Core/ApplicationToolLocationSystem/TestMid0262.cs +++ b/src/MIDTesters.Core/ApplicationToolLocationSystem/TestMid0262.cs @@ -14,7 +14,7 @@ public void Mid0262Revision1() string package = "00300262001 013200078D"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.ToolTagId); + Assert.AreEqual("3200078D", mid.ToolTagId); AssertEqualPackages(package, mid); } @@ -26,8 +26,20 @@ public void Mid0262ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.ToolTagId); + Assert.AreEqual("3200078D", mid.ToolTagId); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0262PackRevision1() + { + string package = "00300262001 013200078D"; + + AssertBuildAndParse(package, new Mid0262() + { + ToolTagId = "3200078D" + }); + } } } diff --git a/src/MIDTesters.Core/ApplicationToolLocationSystem/TestMid0263.cs b/src/MIDTesters.Core/ApplicationToolLocationSystem/TestMid0263.cs index 64687345..fd5e1717 100644 --- a/src/MIDTesters.Core/ApplicationToolLocationSystem/TestMid0263.cs +++ b/src/MIDTesters.Core/ApplicationToolLocationSystem/TestMid0263.cs @@ -29,5 +29,14 @@ public void Mid0263ByteRevision1() Assert.AreEqual(typeof(Mid0263), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0263PackRevision1() + { + string package = "00200263 "; + + AssertBuildAndParse(package, new Mid0263(), true); + } } } diff --git a/src/MIDTesters.Core/ApplicationToolLocationSystem/TestMid0264.cs b/src/MIDTesters.Core/ApplicationToolLocationSystem/TestMid0264.cs index c9e6321e..d326f9d8 100644 --- a/src/MIDTesters.Core/ApplicationToolLocationSystem/TestMid0264.cs +++ b/src/MIDTesters.Core/ApplicationToolLocationSystem/TestMid0264.cs @@ -29,5 +29,14 @@ public void Mid0264ByteRevision1() Assert.AreEqual(typeof(Mid0264), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0264PackRevision1() + { + string package = "00200264 "; + + AssertBuildAndParse(package, new Mid0264(), true); + } } } diff --git a/src/MIDTesters.Core/ApplicationToolLocationSystem/TestMid0265.cs b/src/MIDTesters.Core/ApplicationToolLocationSystem/TestMid0265.cs index 46d9669d..7158a224 100644 --- a/src/MIDTesters.Core/ApplicationToolLocationSystem/TestMid0265.cs +++ b/src/MIDTesters.Core/ApplicationToolLocationSystem/TestMid0265.cs @@ -1,4 +1,5 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; using OpenProtocolInterpreter.ApplicationToolLocationSystem; namespace MIDTesters.ApplicationToolLocationSystem @@ -14,8 +15,8 @@ public void Mid0265Revision1() string package = "00340265001 013200078D0202"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.ToolTagId); - Assert.IsNotNull(mid.ToolStatus); + Assert.AreEqual("3200078D", mid.ToolTagId); + Assert.AreEqual(ToolStatus.Inoperable, mid.ToolStatus); AssertEqualPackages(package, mid); } @@ -27,9 +28,22 @@ public void Mid0265ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.ToolTagId); - Assert.IsNotNull(mid.ToolStatus); + Assert.AreEqual("3200078D", mid.ToolTagId); + Assert.AreEqual(ToolStatus.Inoperable, mid.ToolStatus); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0265PackRevision1() + { + string package = "00340265001 013200078D0202"; + + AssertBuildAndParse(package, new Mid0265() + { + ToolTagId = "3200078D", + ToolStatus = ToolStatus.Inoperable + }); + } } } diff --git a/src/MIDTesters.Core/AutomaticManualMode/TestMid0400.cs b/src/MIDTesters.Core/AutomaticManualMode/TestMid0400.cs index 5c61e97a..e14c2f97 100644 --- a/src/MIDTesters.Core/AutomaticManualMode/TestMid0400.cs +++ b/src/MIDTesters.Core/AutomaticManualMode/TestMid0400.cs @@ -31,5 +31,14 @@ public void Mid0400ByteRevision1() Assert.IsTrue(mid.Header.NoAckFlag); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0400PackRevision1() + { + string package = "00200400 1 "; + + AssertBuildAndParse(package, new Mid0400(noAckFlag: true), true); + } } } diff --git a/src/MIDTesters.Core/AutomaticManualMode/TestMid0401.cs b/src/MIDTesters.Core/AutomaticManualMode/TestMid0401.cs index 40c61900..8f66b601 100644 --- a/src/MIDTesters.Core/AutomaticManualMode/TestMid0401.cs +++ b/src/MIDTesters.Core/AutomaticManualMode/TestMid0401.cs @@ -14,7 +14,7 @@ public void Mid0401Revision1() string package = "00210401 1 1"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.ManualAutomaticMode); + Assert.IsTrue(mid.ManualAutomaticMode); AssertEqualPackages(package, mid, true); } @@ -26,8 +26,21 @@ public void Mid0401ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.ManualAutomaticMode); + Assert.IsTrue(mid.ManualAutomaticMode); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0401PackRevision1() + { + string package = "00210401 1 1"; + + AssertBuildAndParse(package, new Mid0401() + { + Header = { NoAckFlag = true }, + ManualAutomaticMode = true + }, true); + } } } diff --git a/src/MIDTesters.Core/AutomaticManualMode/TestMid0402.cs b/src/MIDTesters.Core/AutomaticManualMode/TestMid0402.cs index 2305c9e3..40799294 100644 --- a/src/MIDTesters.Core/AutomaticManualMode/TestMid0402.cs +++ b/src/MIDTesters.Core/AutomaticManualMode/TestMid0402.cs @@ -29,5 +29,14 @@ public void Mid0402ByteRevision1() Assert.AreEqual(typeof(Mid0402), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0402PackRevision1() + { + string package = "00200402 "; + + AssertBuildAndParse(package, new Mid0402(), true); + } } } diff --git a/src/MIDTesters.Core/AutomaticManualMode/TestMid0403.cs b/src/MIDTesters.Core/AutomaticManualMode/TestMid0403.cs index 0adb4741..1eafd083 100644 --- a/src/MIDTesters.Core/AutomaticManualMode/TestMid0403.cs +++ b/src/MIDTesters.Core/AutomaticManualMode/TestMid0403.cs @@ -29,5 +29,14 @@ public void Mid0403ByteRevision1() Assert.AreEqual(typeof(Mid0403), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0403PackRevision1() + { + string package = "00200403 "; + + AssertBuildAndParse(package, new Mid0403(), true); + } } } diff --git a/src/MIDTesters.Core/AutomaticManualMode/TestMid0410.cs b/src/MIDTesters.Core/AutomaticManualMode/TestMid0410.cs index 7b8e1a6f..5ac40d81 100644 --- a/src/MIDTesters.Core/AutomaticManualMode/TestMid0410.cs +++ b/src/MIDTesters.Core/AutomaticManualMode/TestMid0410.cs @@ -29,5 +29,14 @@ public void Mid0410ByteRevision1() Assert.AreEqual(typeof(Mid0410), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0410PackRevision1() + { + string package = "00200410 "; + + AssertBuildAndParse(package, new Mid0410(), true); + } } } diff --git a/src/MIDTesters.Core/AutomaticManualMode/TestMid0411.cs b/src/MIDTesters.Core/AutomaticManualMode/TestMid0411.cs index 92e92db6..de8b10c3 100644 --- a/src/MIDTesters.Core/AutomaticManualMode/TestMid0411.cs +++ b/src/MIDTesters.Core/AutomaticManualMode/TestMid0411.cs @@ -14,8 +14,8 @@ public void Mid0411Revision1() string package = "00240411 0105"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.AutoDisableSetting); - Assert.IsNotNull(mid.CurrentBatch); + Assert.AreEqual(1, mid.AutoDisableSetting); + Assert.AreEqual(5, mid.CurrentBatch); AssertEqualPackages(package, mid, true); } @@ -27,9 +27,22 @@ public void Mid0411ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.AutoDisableSetting); - Assert.IsNotNull(mid.CurrentBatch); + Assert.AreEqual(1, mid.AutoDisableSetting); + Assert.AreEqual(5, mid.CurrentBatch); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0411PackRevision1() + { + string package = "00240411 0105"; + + AssertBuildAndParse(package, new Mid0411() + { + AutoDisableSetting = 1, + CurrentBatch = 5 + }, true); + } } } diff --git a/src/MIDTesters.Core/Communication/TestMid0001.cs b/src/MIDTesters.Core/Communication/TestMid0001.cs index 4d3d1f0f..e292ab4b 100644 --- a/src/MIDTesters.Core/Communication/TestMid0001.cs +++ b/src/MIDTesters.Core/Communication/TestMid0001.cs @@ -37,7 +37,7 @@ public void Mid0001Revision7() var package = "00230001007 011"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.OptionalKeepAlive); + Assert.IsTrue(mid.OptionalKeepAlive); AssertEqualPackages(package, mid); } @@ -49,8 +49,29 @@ public void Mid0001ByteRevision7() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.OptionalKeepAlive); + Assert.IsTrue(mid.OptionalKeepAlive); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Pack")] + public void Mid0001PackAllRevisions() + { + var package = "00200001003 "; + + AssertBuildAndParse(package, new Mid0001(3)); + } + + [TestMethod] + [TestCategory("Revision 7"), TestCategory("Pack")] + public void Mid0001PackRevision7() + { + var package = "00230001007 011"; + + AssertBuildAndParse(package, new Mid0001(7) + { + OptionalKeepAlive = true + }); + } } } diff --git a/src/MIDTesters.Core/Communication/TestMid0002.cs b/src/MIDTesters.Core/Communication/TestMid0002.cs index d3db436b..14a6f40f 100644 --- a/src/MIDTesters.Core/Communication/TestMid0002.cs +++ b/src/MIDTesters.Core/Communication/TestMid0002.cs @@ -1,5 +1,6 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenProtocolInterpreter.Communication; +using OpenProtocolInterpreter; namespace MIDTesters.Communication { @@ -14,9 +15,9 @@ public void Mid0002Revision1() string pack = @"00570002001 010001020103Airbag1 "; var mid = _midInterpreter.Parse(pack); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.ControllerName); + Assert.AreEqual(1, mid.CellId); + Assert.AreEqual(1, mid.ChannelId); + Assert.AreEqual("Airbag1", mid.ControllerName.TrimEnd()); AssertEqualPackages(pack, mid); } @@ -28,9 +29,9 @@ public void Mid0002ByteRevision1() byte[] bytes = GetAsciiBytes(pack); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.ControllerName); + Assert.AreEqual(1, mid.CellId); + Assert.AreEqual(1, mid.ChannelId); + Assert.AreEqual("Airbag1", mid.ControllerName.TrimEnd()); AssertEqualPackages(bytes, mid); } @@ -41,10 +42,10 @@ public void Mid0002Revision2() string pack = @"00620002002 010001020103Airbag1 04ACT"; var mid = _midInterpreter.Parse(pack); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.ControllerName); - Assert.IsNotNull(mid.SupplierCode); + Assert.AreEqual(1, mid.CellId); + Assert.AreEqual(1, mid.ChannelId); + Assert.AreEqual("Airbag1", mid.ControllerName.TrimEnd()); + Assert.AreEqual("ACT", mid.SupplierCode); AssertEqualPackages(pack, mid); } @@ -56,10 +57,10 @@ public void Mid0002ByteRevision2() byte[] bytes = GetAsciiBytes(pack); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.ControllerName); - Assert.IsNotNull(mid.SupplierCode); + Assert.AreEqual(1, mid.CellId); + Assert.AreEqual(1, mid.ChannelId); + Assert.AreEqual("Airbag1", mid.ControllerName.TrimEnd()); + Assert.AreEqual("ACT", mid.SupplierCode); AssertEqualPackages(bytes, mid); } @@ -70,13 +71,13 @@ public void Mid0002Revision3() string pack = @"01250002003 010001020103Airbag1 04ACT05OpenProtocolVersion06Version 19.0.0.0 07Version 01.0.0.0 "; var mid = _midInterpreter.Parse(pack); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.ControllerName); - Assert.IsNotNull(mid.SupplierCode); - Assert.IsNotNull(mid.OpenProtocolVersion); - Assert.IsNotNull(mid.ControllerSoftwareVersion); - Assert.IsNotNull(mid.ToolSoftwareVersion); + Assert.AreEqual(1, mid.CellId); + Assert.AreEqual(1, mid.ChannelId); + Assert.AreEqual("Airbag1", mid.ControllerName.TrimEnd()); + Assert.AreEqual("ACT", mid.SupplierCode); + Assert.AreEqual("OpenProtocolVersion", mid.OpenProtocolVersion); + Assert.AreEqual("Version 19.0.0.0", mid.ControllerSoftwareVersion.TrimEnd()); + Assert.AreEqual("Version 01.0.0.0", mid.ToolSoftwareVersion.TrimEnd()); AssertEqualPackages(pack, mid); } @@ -88,13 +89,13 @@ public void Mid0002ByteRevision3() byte[] bytes = GetAsciiBytes(pack); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.ControllerName); - Assert.IsNotNull(mid.SupplierCode); - Assert.IsNotNull(mid.OpenProtocolVersion); - Assert.IsNotNull(mid.ControllerSoftwareVersion); - Assert.IsNotNull(mid.ToolSoftwareVersion); + Assert.AreEqual(1, mid.CellId); + Assert.AreEqual(1, mid.ChannelId); + Assert.AreEqual("Airbag1", mid.ControllerName.TrimEnd()); + Assert.AreEqual("ACT", mid.SupplierCode); + Assert.AreEqual("OpenProtocolVersion", mid.OpenProtocolVersion); + Assert.AreEqual("Version 19.0.0.0", mid.ControllerSoftwareVersion.TrimEnd()); + Assert.AreEqual("Version 01.0.0.0", mid.ToolSoftwareVersion.TrimEnd()); AssertEqualPackages(bytes, mid); } @@ -105,15 +106,15 @@ public void Mid0002Revision4() string pack = @"01630002004 010001020103Airbag1 04ACT05OpenProtocolVersion06Version 19.0.0.0 07Version 01.0.0.0 08RBUType 09Serial "; var mid = _midInterpreter.Parse(pack); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.ControllerName); - Assert.IsNotNull(mid.SupplierCode); - Assert.IsNotNull(mid.OpenProtocolVersion); - Assert.IsNotNull(mid.ControllerSoftwareVersion); - Assert.IsNotNull(mid.ToolSoftwareVersion); - Assert.IsNotNull(mid.RBUType); - Assert.IsNotNull(mid.ControllerSerialNumber); + Assert.AreEqual(1, mid.CellId); + Assert.AreEqual(1, mid.ChannelId); + Assert.AreEqual("Airbag1", mid.ControllerName.TrimEnd()); + Assert.AreEqual("ACT", mid.SupplierCode); + Assert.AreEqual("OpenProtocolVersion", mid.OpenProtocolVersion); + Assert.AreEqual("Version 19.0.0.0", mid.ControllerSoftwareVersion.TrimEnd()); + Assert.AreEqual("Version 01.0.0.0", mid.ToolSoftwareVersion.TrimEnd()); + Assert.AreEqual("RBUType", mid.RBUType.TrimEnd()); + Assert.AreEqual("Serial", mid.ControllerSerialNumber.TrimEnd()); AssertEqualPackages(pack, mid); } @@ -125,15 +126,15 @@ public void Mid0002ByteRevision4() byte[] bytes = GetAsciiBytes(pack); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.ControllerName); - Assert.IsNotNull(mid.SupplierCode); - Assert.IsNotNull(mid.OpenProtocolVersion); - Assert.IsNotNull(mid.ControllerSoftwareVersion); - Assert.IsNotNull(mid.ToolSoftwareVersion); - Assert.IsNotNull(mid.RBUType); - Assert.IsNotNull(mid.ControllerSerialNumber); + Assert.AreEqual(1, mid.CellId); + Assert.AreEqual(1, mid.ChannelId); + Assert.AreEqual("Airbag1", mid.ControllerName.TrimEnd()); + Assert.AreEqual("ACT", mid.SupplierCode); + Assert.AreEqual("OpenProtocolVersion", mid.OpenProtocolVersion); + Assert.AreEqual("Version 19.0.0.0", mid.ControllerSoftwareVersion.TrimEnd()); + Assert.AreEqual("Version 01.0.0.0", mid.ToolSoftwareVersion.TrimEnd()); + Assert.AreEqual("RBUType", mid.RBUType.TrimEnd()); + Assert.AreEqual("Serial", mid.ControllerSerialNumber.TrimEnd()); AssertEqualPackages(bytes, mid); } @@ -144,17 +145,17 @@ public void Mid0002Revision5() string pack = @"01730002005 010001020103Airbag1 04ACT05OpenProtocolVersion06Version 19.0.0.0 07Version 01.0.0.0 08RBUType 09Serial 1000211002"; var mid = _midInterpreter.Parse(pack); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.ControllerName); - Assert.IsNotNull(mid.SupplierCode); - Assert.IsNotNull(mid.OpenProtocolVersion); - Assert.IsNotNull(mid.ControllerSoftwareVersion); - Assert.IsNotNull(mid.ToolSoftwareVersion); - Assert.IsNotNull(mid.RBUType); - Assert.IsNotNull(mid.ControllerSerialNumber); - Assert.IsNotNull(mid.SystemType); - Assert.IsNotNull(mid.SystemSubType); + Assert.AreEqual(1, mid.CellId); + Assert.AreEqual(1, mid.ChannelId); + Assert.AreEqual("Airbag1", mid.ControllerName.TrimEnd()); + Assert.AreEqual("ACT", mid.SupplierCode); + Assert.AreEqual("OpenProtocolVersion", mid.OpenProtocolVersion); + Assert.AreEqual("Version 19.0.0.0", mid.ControllerSoftwareVersion.TrimEnd()); + Assert.AreEqual("Version 01.0.0.0", mid.ToolSoftwareVersion.TrimEnd()); + Assert.AreEqual("RBUType", mid.RBUType.TrimEnd()); + Assert.AreEqual("Serial", mid.ControllerSerialNumber.TrimEnd()); + Assert.AreEqual(SystemType.PowerMacs4000, mid.SystemType); + Assert.AreEqual(SystemSubType.SystemRunningPresses, mid.SystemSubType); AssertEqualPackages(pack, mid); } @@ -166,17 +167,17 @@ public void Mid0002ByteRevision5() byte[] bytes = GetAsciiBytes(pack); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.ControllerName); - Assert.IsNotNull(mid.SupplierCode); - Assert.IsNotNull(mid.OpenProtocolVersion); - Assert.IsNotNull(mid.ControllerSoftwareVersion); - Assert.IsNotNull(mid.ToolSoftwareVersion); - Assert.IsNotNull(mid.RBUType); - Assert.IsNotNull(mid.ControllerSerialNumber); - Assert.IsNotNull(mid.SystemType); - Assert.IsNotNull(mid.SystemSubType); + Assert.AreEqual(1, mid.CellId); + Assert.AreEqual(1, mid.ChannelId); + Assert.AreEqual("Airbag1", mid.ControllerName.TrimEnd()); + Assert.AreEqual("ACT", mid.SupplierCode); + Assert.AreEqual("OpenProtocolVersion", mid.OpenProtocolVersion); + Assert.AreEqual("Version 19.0.0.0", mid.ControllerSoftwareVersion.TrimEnd()); + Assert.AreEqual("Version 01.0.0.0", mid.ToolSoftwareVersion.TrimEnd()); + Assert.AreEqual("RBUType", mid.RBUType.TrimEnd()); + Assert.AreEqual("Serial", mid.ControllerSerialNumber.TrimEnd()); + Assert.AreEqual(SystemType.PowerMacs4000, mid.SystemType); + Assert.AreEqual(SystemSubType.SystemRunningPresses, mid.SystemSubType); AssertEqualPackages(bytes, mid); } @@ -187,22 +188,22 @@ public void Mid0002Revision6() string pack = @"02210002006 010001020103Airbag1 04ACT05OpenProtocolVersion06Version 19.0.0.0 07Version 01.0.0.0 08RBUType 09Serial 100021100212013114429496729515Station Or Cell Name 16A"; var mid = _midInterpreter.Parse(pack); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.ControllerName); - Assert.IsNotNull(mid.SupplierCode); - Assert.IsNotNull(mid.OpenProtocolVersion); - Assert.IsNotNull(mid.ControllerSoftwareVersion); - Assert.IsNotNull(mid.ToolSoftwareVersion); - Assert.IsNotNull(mid.RBUType); - Assert.IsNotNull(mid.ControllerSerialNumber); - Assert.IsNotNull(mid.SystemType); - Assert.IsNotNull(mid.SystemSubType); - Assert.IsNotNull(mid.SequenceNumberSupport); - Assert.IsNotNull(mid.LinkingHandlingSupport); - Assert.AreNotEqual(0, mid.StationCellId); - Assert.IsNotNull(mid.StationCellName); - Assert.IsNotNull(mid.ClientId); + Assert.AreEqual(1, mid.CellId); + Assert.AreEqual(1, mid.ChannelId); + Assert.AreEqual("Airbag1", mid.ControllerName.TrimEnd()); + Assert.AreEqual("ACT", mid.SupplierCode); + Assert.AreEqual("OpenProtocolVersion", mid.OpenProtocolVersion); + Assert.AreEqual("Version 19.0.0.0", mid.ControllerSoftwareVersion.TrimEnd()); + Assert.AreEqual("Version 01.0.0.0", mid.ToolSoftwareVersion.TrimEnd()); + Assert.AreEqual("RBUType", mid.RBUType.TrimEnd()); + Assert.AreEqual("Serial", mid.ControllerSerialNumber.TrimEnd()); + Assert.AreEqual(SystemType.PowerMacs4000, mid.SystemType); + Assert.AreEqual(SystemSubType.SystemRunningPresses, mid.SystemSubType); + Assert.IsFalse(mid.SequenceNumberSupport); + Assert.IsTrue(mid.LinkingHandlingSupport); + Assert.AreEqual(4294967295L, mid.StationCellId); + Assert.AreEqual("Station Or Cell Name", mid.StationCellName.TrimEnd()); + Assert.AreEqual("A", mid.ClientId); AssertEqualPackages(pack, mid); } @@ -214,22 +215,22 @@ public void Mid0002ByteRevision6() byte[] bytes = GetAsciiBytes(pack); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.ControllerName); - Assert.IsNotNull(mid.SupplierCode); - Assert.IsNotNull(mid.OpenProtocolVersion); - Assert.IsNotNull(mid.ControllerSoftwareVersion); - Assert.IsNotNull(mid.ToolSoftwareVersion); - Assert.IsNotNull(mid.RBUType); - Assert.IsNotNull(mid.ControllerSerialNumber); - Assert.IsNotNull(mid.SystemType); - Assert.IsNotNull(mid.SystemSubType); - Assert.IsNotNull(mid.SequenceNumberSupport); - Assert.IsNotNull(mid.LinkingHandlingSupport); - Assert.AreNotEqual(0, mid.StationCellId); - Assert.IsNotNull(mid.StationCellName); - Assert.IsNotNull(mid.ClientId); + Assert.AreEqual(1, mid.CellId); + Assert.AreEqual(1, mid.ChannelId); + Assert.AreEqual("Airbag1", mid.ControllerName.TrimEnd()); + Assert.AreEqual("ACT", mid.SupplierCode); + Assert.AreEqual("OpenProtocolVersion", mid.OpenProtocolVersion); + Assert.AreEqual("Version 19.0.0.0", mid.ControllerSoftwareVersion.TrimEnd()); + Assert.AreEqual("Version 01.0.0.0", mid.ToolSoftwareVersion.TrimEnd()); + Assert.AreEqual("RBUType", mid.RBUType.TrimEnd()); + Assert.AreEqual("Serial", mid.ControllerSerialNumber.TrimEnd()); + Assert.AreEqual(SystemType.PowerMacs4000, mid.SystemType); + Assert.AreEqual(SystemSubType.SystemRunningPresses, mid.SystemSubType); + Assert.IsFalse(mid.SequenceNumberSupport); + Assert.IsTrue(mid.LinkingHandlingSupport); + Assert.AreEqual(4294967295L, mid.StationCellId); + Assert.AreEqual("Station Or Cell Name", mid.StationCellName.TrimEnd()); + Assert.AreEqual("A", mid.ClientId); AssertEqualPackages(bytes, mid); } @@ -240,23 +241,23 @@ public void Mid0002Revision7() string pack = @"02240002007 010001020103Airbag1 04ACT05OpenProtocolVersion06Version 19.0.0.0 07Version 01.0.0.0 08RBUType 09Serial 100021100212013114429496729515Station Or Cell Name 16A171"; var mid = _midInterpreter.Parse(pack); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.ControllerName); - Assert.IsNotNull(mid.SupplierCode); - Assert.IsNotNull(mid.OpenProtocolVersion); - Assert.IsNotNull(mid.ControllerSoftwareVersion); - Assert.IsNotNull(mid.ToolSoftwareVersion); - Assert.IsNotNull(mid.RBUType); - Assert.IsNotNull(mid.ControllerSerialNumber); - Assert.IsNotNull(mid.SystemType); - Assert.IsNotNull(mid.SystemSubType); - Assert.IsNotNull(mid.SequenceNumberSupport); - Assert.IsNotNull(mid.LinkingHandlingSupport); - Assert.AreNotEqual(0, mid.StationCellId); - Assert.IsNotNull(mid.StationCellName); - Assert.IsNotNull(mid.ClientId); - Assert.IsNotNull(mid.OptionalKeepAlive); + Assert.AreEqual(1, mid.CellId); + Assert.AreEqual(1, mid.ChannelId); + Assert.AreEqual("Airbag1", mid.ControllerName.TrimEnd()); + Assert.AreEqual("ACT", mid.SupplierCode); + Assert.AreEqual("OpenProtocolVersion", mid.OpenProtocolVersion); + Assert.AreEqual("Version 19.0.0.0", mid.ControllerSoftwareVersion.TrimEnd()); + Assert.AreEqual("Version 01.0.0.0", mid.ToolSoftwareVersion.TrimEnd()); + Assert.AreEqual("RBUType", mid.RBUType.TrimEnd()); + Assert.AreEqual("Serial", mid.ControllerSerialNumber.TrimEnd()); + Assert.AreEqual(SystemType.PowerMacs4000, mid.SystemType); + Assert.AreEqual(SystemSubType.SystemRunningPresses, mid.SystemSubType); + Assert.IsFalse(mid.SequenceNumberSupport); + Assert.IsTrue(mid.LinkingHandlingSupport); + Assert.AreEqual(4294967295L, mid.StationCellId); + Assert.AreEqual("Station Or Cell Name", mid.StationCellName.TrimEnd()); + Assert.AreEqual("A", mid.ClientId); + Assert.IsTrue(mid.OptionalKeepAlive); AssertEqualPackages(pack, mid); } @@ -268,24 +269,168 @@ public void Mid0002ByteRevision7() byte[] bytes = GetAsciiBytes(pack); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.ControllerName); - Assert.IsNotNull(mid.SupplierCode); - Assert.IsNotNull(mid.OpenProtocolVersion); - Assert.IsNotNull(mid.ControllerSoftwareVersion); - Assert.IsNotNull(mid.ToolSoftwareVersion); - Assert.IsNotNull(mid.RBUType); - Assert.IsNotNull(mid.ControllerSerialNumber); - Assert.IsNotNull(mid.SystemType); - Assert.IsNotNull(mid.SystemSubType); - Assert.IsNotNull(mid.SequenceNumberSupport); - Assert.IsNotNull(mid.LinkingHandlingSupport); - Assert.AreNotEqual(0, mid.StationCellId); - Assert.IsNotNull(mid.StationCellName); - Assert.IsNotNull(mid.ClientId); - Assert.IsNotNull(mid.OptionalKeepAlive); + Assert.AreEqual(1, mid.CellId); + Assert.AreEqual(1, mid.ChannelId); + Assert.AreEqual("Airbag1", mid.ControllerName.TrimEnd()); + Assert.AreEqual("ACT", mid.SupplierCode); + Assert.AreEqual("OpenProtocolVersion", mid.OpenProtocolVersion); + Assert.AreEqual("Version 19.0.0.0", mid.ControllerSoftwareVersion.TrimEnd()); + Assert.AreEqual("Version 01.0.0.0", mid.ToolSoftwareVersion.TrimEnd()); + Assert.AreEqual("RBUType", mid.RBUType.TrimEnd()); + Assert.AreEqual("Serial", mid.ControllerSerialNumber.TrimEnd()); + Assert.AreEqual(SystemType.PowerMacs4000, mid.SystemType); + Assert.AreEqual(SystemSubType.SystemRunningPresses, mid.SystemSubType); + Assert.IsFalse(mid.SequenceNumberSupport); + Assert.IsTrue(mid.LinkingHandlingSupport); + Assert.AreEqual(4294967295L, mid.StationCellId); + Assert.AreEqual("Station Or Cell Name", mid.StationCellName.TrimEnd()); + Assert.AreEqual("A", mid.ClientId); + Assert.IsTrue(mid.OptionalKeepAlive); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0002PackRevision1() + { + string pack = @"00570002001 010001020103Airbag1 "; + + AssertBuildAndParse(pack, new Mid0002(1) + { + CellId = 1, + ChannelId = 1, + ControllerName = "Airbag1" + }); + } + + [TestMethod] + [TestCategory("Revision 2"), TestCategory("Pack")] + public void Mid0002PackRevision2() + { + string pack = @"00620002002 010001020103Airbag1 04ACT"; + + AssertBuildAndParse(pack, new Mid0002(2) + { + CellId = 1, + ChannelId = 1, + ControllerName = "Airbag1", + SupplierCode = "ACT" + }); + } + + [TestMethod] + [TestCategory("Revision 3"), TestCategory("Pack")] + public void Mid0002PackRevision3() + { + string pack = @"01250002003 010001020103Airbag1 04ACT05OpenProtocolVersion06Version 19.0.0.0 07Version 01.0.0.0 "; + + AssertBuildAndParse(pack, new Mid0002(3) + { + CellId = 1, + ChannelId = 1, + ControllerName = "Airbag1", + SupplierCode = "ACT", + OpenProtocolVersion = "OpenProtocolVersion", + ControllerSoftwareVersion = "Version 19.0.0.0", + ToolSoftwareVersion = "Version 01.0.0.0" + }); + } + + [TestMethod] + [TestCategory("Revision 4"), TestCategory("Pack")] + public void Mid0002PackRevision4() + { + string pack = @"01630002004 010001020103Airbag1 04ACT05OpenProtocolVersion06Version 19.0.0.0 07Version 01.0.0.0 08RBUType 09Serial "; + + AssertBuildAndParse(pack, new Mid0002(4) + { + CellId = 1, + ChannelId = 1, + ControllerName = "Airbag1", + SupplierCode = "ACT", + OpenProtocolVersion = "OpenProtocolVersion", + ControllerSoftwareVersion = "Version 19.0.0.0", + ToolSoftwareVersion = "Version 01.0.0.0", + RBUType = "RBUType", + ControllerSerialNumber = "Serial" + }); + } + + [TestMethod] + [TestCategory("Revision 5"), TestCategory("Pack")] + public void Mid0002PackRevision5() + { + string pack = @"01730002005 010001020103Airbag1 04ACT05OpenProtocolVersion06Version 19.0.0.0 07Version 01.0.0.0 08RBUType 09Serial 1000211002"; + + AssertBuildAndParse(pack, new Mid0002(5) + { + CellId = 1, + ChannelId = 1, + ControllerName = "Airbag1", + SupplierCode = "ACT", + OpenProtocolVersion = "OpenProtocolVersion", + ControllerSoftwareVersion = "Version 19.0.0.0", + ToolSoftwareVersion = "Version 01.0.0.0", + RBUType = "RBUType", + ControllerSerialNumber = "Serial", + SystemType = SystemType.PowerMacs4000, + SystemSubType = SystemSubType.SystemRunningPresses + }); + } + + [TestMethod] + [TestCategory("Revision 6"), TestCategory("Pack")] + public void Mid0002PackRevision6() + { + string pack = @"02210002006 010001020103Airbag1 04ACT05OpenProtocolVersion06Version 19.0.0.0 07Version 01.0.0.0 08RBUType 09Serial 100021100212013114429496729515Station Or Cell Name 16A"; + + AssertBuildAndParse(pack, new Mid0002(6) + { + CellId = 1, + ChannelId = 1, + ControllerName = "Airbag1", + SupplierCode = "ACT", + OpenProtocolVersion = "OpenProtocolVersion", + ControllerSoftwareVersion = "Version 19.0.0.0", + ToolSoftwareVersion = "Version 01.0.0.0", + RBUType = "RBUType", + ControllerSerialNumber = "Serial", + SystemType = SystemType.PowerMacs4000, + SystemSubType = SystemSubType.SystemRunningPresses, + SequenceNumberSupport = false, + LinkingHandlingSupport = true, + StationCellId = 4294967295L, + StationCellName = "Station Or Cell Name", + ClientId = "A" + }); + } + + [TestMethod] + [TestCategory("Revision 7"), TestCategory("Pack")] + public void Mid0002PackRevision7() + { + string pack = @"02240002007 010001020103Airbag1 04ACT05OpenProtocolVersion06Version 19.0.0.0 07Version 01.0.0.0 08RBUType 09Serial 100021100212013114429496729515Station Or Cell Name 16A171"; + + AssertBuildAndParse(pack, new Mid0002(7) + { + CellId = 1, + ChannelId = 1, + ControllerName = "Airbag1", + SupplierCode = "ACT", + OpenProtocolVersion = "OpenProtocolVersion", + ControllerSoftwareVersion = "Version 19.0.0.0", + ToolSoftwareVersion = "Version 01.0.0.0", + RBUType = "RBUType", + ControllerSerialNumber = "Serial", + SystemType = SystemType.PowerMacs4000, + SystemSubType = SystemSubType.SystemRunningPresses, + SequenceNumberSupport = false, + LinkingHandlingSupport = true, + StationCellId = 4294967295L, + StationCellName = "Station Or Cell Name", + ClientId = "A", + OptionalKeepAlive = true + }); + } } } diff --git a/src/MIDTesters.Core/Communication/TestMid0003.cs b/src/MIDTesters.Core/Communication/TestMid0003.cs index 26e9239d..c9b7f9ce 100644 --- a/src/MIDTesters.Core/Communication/TestMid0003.cs +++ b/src/MIDTesters.Core/Communication/TestMid0003.cs @@ -27,5 +27,14 @@ public void Mid0003ByteRevision1() AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0003PackRevision1() + { + string pack = @"00200003001 "; + + AssertBuildAndParse(pack, new Mid0003()); + } } } diff --git a/src/MIDTesters.Core/Communication/TestMid0004.cs b/src/MIDTesters.Core/Communication/TestMid0004.cs index 800a81b0..051ca64b 100644 --- a/src/MIDTesters.Core/Communication/TestMid0004.cs +++ b/src/MIDTesters.Core/Communication/TestMid0004.cs @@ -1,5 +1,6 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenProtocolInterpreter.Communication; +using OpenProtocolInterpreter; namespace MIDTesters.Communication { @@ -14,8 +15,8 @@ public void Mid0004Revision1() string pack = @"00260004 001802"; var mid = _midInterpreter.Parse(pack); - Assert.IsNotNull(mid.FailedMid); - Assert.IsNotNull(mid.ErrorCode); + Assert.AreEqual(18, mid.FailedMid); + Assert.AreEqual(Error.ParameterSetIdNotPresent, mid.ErrorCode); AssertEqualPackages(pack, mid, true); } @@ -27,8 +28,8 @@ public void Mid0004ByteRevision1() byte[] bytes = GetAsciiBytes(pack); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.FailedMid); - Assert.IsNotNull(mid.ErrorCode); + Assert.AreEqual(18, mid.FailedMid); + Assert.AreEqual(Error.ParameterSetIdNotPresent, mid.ErrorCode); AssertEqualPackages(bytes, mid, true); } @@ -39,8 +40,8 @@ public void Mid0004Revision2() string pack = @"00270004002 0018021"; var mid = _midInterpreter.Parse(pack); - Assert.IsNotNull(mid.FailedMid); - Assert.IsNotNull(mid.ErrorCode); + Assert.AreEqual(18, mid.FailedMid); + Assert.AreEqual(Error.JobNotRunning, mid.ErrorCode); AssertEqualPackages(pack, mid); } @@ -52,9 +53,35 @@ public void Mid0004ByteRevision2() byte[] bytes = GetAsciiBytes(pack); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.FailedMid); - Assert.IsNotNull(mid.ErrorCode); + Assert.AreEqual(18, mid.FailedMid); + Assert.AreEqual(Error.JobNotRunning, mid.ErrorCode); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0004PackRevision1() + { + string pack = @"00260004 001802"; + + AssertBuildAndParse(pack, new Mid0004(1) + { + FailedMid = 18, + ErrorCode = Error.ParameterSetIdNotPresent + }, true); + } + + [TestMethod] + [TestCategory("Revision 2"), TestCategory("Pack")] + public void Mid0004PackRevision2() + { + string pack = @"00270004002 0018021"; + + AssertBuildAndParse(pack, new Mid0004(2) + { + FailedMid = 18, + ErrorCode = Error.JobNotRunning + }); + } } } diff --git a/src/MIDTesters.Core/Communication/TestMid0005.cs b/src/MIDTesters.Core/Communication/TestMid0005.cs index b294268d..c046c59a 100644 --- a/src/MIDTesters.Core/Communication/TestMid0005.cs +++ b/src/MIDTesters.Core/Communication/TestMid0005.cs @@ -14,7 +14,7 @@ public void Mid0005Revision1() string pack = @"00240005 0018"; var mid = _midInterpreter.Parse(pack); - Assert.IsNotNull(mid.MidAccepted); + Assert.AreEqual(18, mid.MidAccepted); AssertEqualPackages(pack, mid, true); } @@ -26,8 +26,20 @@ public void Mid0005ByteRevision1() byte[] bytes = GetAsciiBytes(pack); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.MidAccepted); + Assert.AreEqual(18, mid.MidAccepted); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0005PackRevision1() + { + string pack = @"00240005 0018"; + + AssertBuildAndParse(pack, new Mid0005(1) + { + MidAccepted = 18 + }, true); + } } } diff --git a/src/MIDTesters.Core/Communication/TestMid0006.cs b/src/MIDTesters.Core/Communication/TestMid0006.cs index c100bee8..27a92304 100644 --- a/src/MIDTesters.Core/Communication/TestMid0006.cs +++ b/src/MIDTesters.Core/Communication/TestMid0006.cs @@ -1,4 +1,5 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; using OpenProtocolInterpreter.Communication; namespace MIDTesters.Communication @@ -15,10 +16,10 @@ public void Mid0006Revision1() var mid = _midInterpreter.Parse(pack); Assert.AreEqual(typeof(Mid0006), mid.GetType()); - Assert.IsNotNull(mid.RequestedMid); - Assert.IsNotNull(mid.WantedRevision); - Assert.IsNotNull(mid.ExtraDataLength); - Assert.IsNotNull(mid.ExtraData); + Assert.AreEqual(18, mid.RequestedMid); + Assert.AreEqual(2, mid.WantedRevision); + Assert.AreEqual(14, mid.ExtraDataLength); + Assert.AreEqual("lengthequals14", mid.ExtraData); AssertEqualPackages(pack, mid, true); } @@ -31,11 +32,25 @@ public void Mid0006ByteRevision1() var mid = _midInterpreter.Parse(bytes); Assert.AreEqual(typeof(Mid0006), mid.GetType()); - Assert.IsNotNull(mid.RequestedMid); - Assert.IsNotNull(mid.WantedRevision); - Assert.IsNotNull(mid.ExtraDataLength); - Assert.IsNotNull(mid.ExtraData); + Assert.AreEqual(18, mid.RequestedMid); + Assert.AreEqual(2, mid.WantedRevision); + Assert.AreEqual(14, mid.ExtraDataLength); + Assert.AreEqual("lengthequals14", mid.ExtraData); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0006PackRevision1() + { + string pack = @"00430006 001800214lengthequals14"; + + AssertBuildAndParse(pack, new Mid0006() + { + RequestedMid = 18, + WantedRevision = 2, + ExtraData = "lengthequals14" + }, true); + } } } diff --git a/src/MIDTesters.Core/Communication/TestMid0008.cs b/src/MIDTesters.Core/Communication/TestMid0008.cs index 89439739..a05c9fbe 100644 --- a/src/MIDTesters.Core/Communication/TestMid0008.cs +++ b/src/MIDTesters.Core/Communication/TestMid0008.cs @@ -14,10 +14,10 @@ public void Mid0008Revision1() string pack = @"00430008 002200214lengthequals14"; var mid = _midInterpreter.Parse(pack); - Assert.IsNotNull(mid.SubscriptionMid); - Assert.IsNotNull(mid.WantedRevision); - Assert.IsNotNull(mid.ExtraDataLength); - Assert.IsNotNull(mid.ExtraData); + Assert.AreEqual(22, mid.SubscriptionMid); + Assert.AreEqual(2, mid.WantedRevision); + Assert.AreEqual(14, mid.ExtraDataLength); + Assert.AreEqual("lengthequals14", mid.ExtraData); AssertEqualPackages(pack, mid, true); } @@ -29,11 +29,25 @@ public void Mid0008ByteRevision1() byte[] bytes = GetAsciiBytes(pack); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.SubscriptionMid); - Assert.IsNotNull(mid.WantedRevision); - Assert.IsNotNull(mid.ExtraDataLength); - Assert.IsNotNull(mid.ExtraData); + Assert.AreEqual(22, mid.SubscriptionMid); + Assert.AreEqual(2, mid.WantedRevision); + Assert.AreEqual(14, mid.ExtraDataLength); + Assert.AreEqual("lengthequals14", mid.ExtraData); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0008PackRevision1() + { + string pack = @"00430008 002200214lengthequals14"; + + AssertBuildAndParse(pack, new Mid0008() + { + SubscriptionMid = 22, + WantedRevision = 2, + ExtraData = "lengthequals14" + }, true); + } } } diff --git a/src/MIDTesters.Core/Communication/TestMid0009.cs b/src/MIDTesters.Core/Communication/TestMid0009.cs index f346e6a6..131e9808 100644 --- a/src/MIDTesters.Core/Communication/TestMid0009.cs +++ b/src/MIDTesters.Core/Communication/TestMid0009.cs @@ -14,10 +14,10 @@ public void Mid0009Revision1() string pack = @"00430009 002200214lengthequals14"; var mid = _midInterpreter.Parse(pack); - Assert.IsNotNull(mid.UnsubscriptionMid); - Assert.IsNotNull(mid.ExtraDataRevision); - Assert.IsNotNull(mid.ExtraDataLength); - Assert.IsNotNull(mid.ExtraData); + Assert.AreEqual(22, mid.UnsubscriptionMid); + Assert.AreEqual(2, mid.ExtraDataRevision); + Assert.AreEqual(14, mid.ExtraDataLength); + Assert.AreEqual("lengthequals14", mid.ExtraData); AssertEqualPackages(pack, mid, true); } @@ -29,11 +29,25 @@ public void Mid0009ByteRevision1() byte[] bytes = GetAsciiBytes(pack); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.UnsubscriptionMid); - Assert.IsNotNull(mid.ExtraDataRevision); - Assert.IsNotNull(mid.ExtraDataLength); - Assert.IsNotNull(mid.ExtraData); + Assert.AreEqual(22, mid.UnsubscriptionMid); + Assert.AreEqual(2, mid.ExtraDataRevision); + Assert.AreEqual(14, mid.ExtraDataLength); + Assert.AreEqual("lengthequals14", mid.ExtraData); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0009PackRevision1() + { + string pack = @"00430009 002200214lengthequals14"; + + AssertBuildAndParse(pack, new Mid0009() + { + UnsubscriptionMid = 22, + ExtraDataRevision = 2, + ExtraData = "lengthequals14" + }, true); + } } } diff --git a/src/MIDTesters.Core/Converters/BooleanConverterTest.cs b/src/MIDTesters.Core/Converters/BooleanConverterTest.cs index 7603dd24..78339411 100644 --- a/src/MIDTesters.Core/Converters/BooleanConverterTest.cs +++ b/src/MIDTesters.Core/Converters/BooleanConverterTest.cs @@ -3,7 +3,7 @@ using System.Threading; using System.Threading.Tasks; -namespace MIDTesters.Core.Converters +namespace MIDTesters.Converters { [TestClass] [TestCategory("Converters")] diff --git a/src/MIDTesters.Core/Converters/ByteConverterTest.cs b/src/MIDTesters.Core/Converters/ByteConverterTest.cs index a769489a..24ad2668 100644 --- a/src/MIDTesters.Core/Converters/ByteConverterTest.cs +++ b/src/MIDTesters.Core/Converters/ByteConverterTest.cs @@ -4,7 +4,7 @@ using System.Threading.Tasks; using System.Threading; -namespace MIDTesters.Core.Converters +namespace MIDTesters.Converters { [TestClass] [TestCategory("Converters")] diff --git a/src/MIDTesters.Core/Converters/DateTimeConverterTest.cs b/src/MIDTesters.Core/Converters/DateTimeConverterTest.cs index f7c893ea..8c5faf54 100644 --- a/src/MIDTesters.Core/Converters/DateTimeConverterTest.cs +++ b/src/MIDTesters.Core/Converters/DateTimeConverterTest.cs @@ -4,7 +4,7 @@ using System.Threading; using System.Threading.Tasks; -namespace MIDTesters.Core.Converters +namespace MIDTesters.Converters { [TestClass] [TestCategory("Converters")] diff --git a/src/MIDTesters.Core/Converters/DecimalConverterTest.cs b/src/MIDTesters.Core/Converters/DecimalConverterTest.cs index f8d0ca44..b44dfa90 100644 --- a/src/MIDTesters.Core/Converters/DecimalConverterTest.cs +++ b/src/MIDTesters.Core/Converters/DecimalConverterTest.cs @@ -3,7 +3,7 @@ using System.Threading; using System.Threading.Tasks; -namespace MIDTesters.Core.Converters +namespace MIDTesters.Converters { [TestClass] [TestCategory("Converters")] diff --git a/src/MIDTesters.Core/Converters/Int32ConverterTest.cs b/src/MIDTesters.Core/Converters/Int32ConverterTest.cs index 06c7405f..168ba220 100644 --- a/src/MIDTesters.Core/Converters/Int32ConverterTest.cs +++ b/src/MIDTesters.Core/Converters/Int32ConverterTest.cs @@ -3,7 +3,7 @@ using System.Threading; using System.Threading.Tasks; -namespace MIDTesters.Core.Converters +namespace MIDTesters.Converters { [TestClass] [TestCategory("Converters")] diff --git a/src/MIDTesters.Core/Converters/Int64ConverterTest.cs b/src/MIDTesters.Core/Converters/Int64ConverterTest.cs index 93bd89fd..9bde847e 100644 --- a/src/MIDTesters.Core/Converters/Int64ConverterTest.cs +++ b/src/MIDTesters.Core/Converters/Int64ConverterTest.cs @@ -3,7 +3,7 @@ using System.Threading; using System.Threading.Tasks; -namespace MIDTesters.Core.Converters +namespace MIDTesters.Converters { [TestClass] [TestCategory("Converters")] diff --git a/src/MIDTesters.Core/Converters/PaddingConverterTest.cs b/src/MIDTesters.Core/Converters/PaddingConverterTest.cs index 79a9b1e5..6b1a3d1d 100644 --- a/src/MIDTesters.Core/Converters/PaddingConverterTest.cs +++ b/src/MIDTesters.Core/Converters/PaddingConverterTest.cs @@ -1,7 +1,7 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenProtocolInterpreter; -namespace MIDTesters.Core.Converters +namespace MIDTesters.Converters { [TestClass] [TestCategory("Converters")] diff --git a/src/MIDTesters.Core/Converters/TruncatedDecimalConverterTest.cs b/src/MIDTesters.Core/Converters/TruncatedDecimalConverterTest.cs index 0c6cc426..825c50d8 100644 --- a/src/MIDTesters.Core/Converters/TruncatedDecimalConverterTest.cs +++ b/src/MIDTesters.Core/Converters/TruncatedDecimalConverterTest.cs @@ -3,7 +3,7 @@ using System.Threading; using System.Threading.Tasks; -namespace MIDTesters.Core.Converters +namespace MIDTesters.Converters { [TestClass] [TestCategory("Converters")] diff --git a/src/MIDTesters.Core/IOInterface/TestMid0200.cs b/src/MIDTesters.Core/IOInterface/TestMid0200.cs index 465c14ec..71369d90 100644 --- a/src/MIDTesters.Core/IOInterface/TestMid0200.cs +++ b/src/MIDTesters.Core/IOInterface/TestMid0200.cs @@ -1,5 +1,6 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenProtocolInterpreter.IOInterface; +using OpenProtocolInterpreter; namespace MIDTesters.IOInterface { @@ -14,16 +15,16 @@ public void Mid0200Revision1() string package = "00300200 1231231230"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.StatusRelayOne); - Assert.IsNotNull(mid.StatusRelayTwo); - Assert.IsNotNull(mid.StatusRelayThree); - Assert.IsNotNull(mid.StatusRelayFour); - Assert.IsNotNull(mid.StatusRelayFive); - Assert.IsNotNull(mid.StatusRelaySix); - Assert.IsNotNull(mid.StatusRelaySeven); - Assert.IsNotNull(mid.StatusRelayEight); - Assert.IsNotNull(mid.StatusRelayNine); - Assert.IsNotNull(mid.StatusRelayTen); + Assert.AreEqual(RelayStatus.On, mid.StatusRelayOne); + Assert.AreEqual(RelayStatus.Flashing, mid.StatusRelayTwo); + Assert.AreEqual(RelayStatus.KeepCurrentStatus, mid.StatusRelayThree); + Assert.AreEqual(RelayStatus.On, mid.StatusRelayFour); + Assert.AreEqual(RelayStatus.Flashing, mid.StatusRelayFive); + Assert.AreEqual(RelayStatus.KeepCurrentStatus, mid.StatusRelaySix); + Assert.AreEqual(RelayStatus.On, mid.StatusRelaySeven); + Assert.AreEqual(RelayStatus.Flashing, mid.StatusRelayEight); + Assert.AreEqual(RelayStatus.KeepCurrentStatus, mid.StatusRelayNine); + Assert.AreEqual(RelayStatus.Off, mid.StatusRelayTen); AssertEqualPackages(package, mid, true); } @@ -35,17 +36,38 @@ public void Mid0200ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.StatusRelayOne); - Assert.IsNotNull(mid.StatusRelayTwo); - Assert.IsNotNull(mid.StatusRelayThree); - Assert.IsNotNull(mid.StatusRelayFour); - Assert.IsNotNull(mid.StatusRelayFive); - Assert.IsNotNull(mid.StatusRelaySix); - Assert.IsNotNull(mid.StatusRelaySeven); - Assert.IsNotNull(mid.StatusRelayEight); - Assert.IsNotNull(mid.StatusRelayNine); - Assert.IsNotNull(mid.StatusRelayTen); + Assert.AreEqual(RelayStatus.On, mid.StatusRelayOne); + Assert.AreEqual(RelayStatus.Flashing, mid.StatusRelayTwo); + Assert.AreEqual(RelayStatus.KeepCurrentStatus, mid.StatusRelayThree); + Assert.AreEqual(RelayStatus.On, mid.StatusRelayFour); + Assert.AreEqual(RelayStatus.Flashing, mid.StatusRelayFive); + Assert.AreEqual(RelayStatus.KeepCurrentStatus, mid.StatusRelaySix); + Assert.AreEqual(RelayStatus.On, mid.StatusRelaySeven); + Assert.AreEqual(RelayStatus.Flashing, mid.StatusRelayEight); + Assert.AreEqual(RelayStatus.KeepCurrentStatus, mid.StatusRelayNine); + Assert.AreEqual(RelayStatus.Off, mid.StatusRelayTen); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0200PackRevision1() + { + string package = "00300200 1231231230"; + + AssertBuildAndParse(package, new Mid0200() + { + StatusRelayOne = RelayStatus.On, + StatusRelayTwo = RelayStatus.Flashing, + StatusRelayThree = RelayStatus.KeepCurrentStatus, + StatusRelayFour = RelayStatus.On, + StatusRelayFive = RelayStatus.Flashing, + StatusRelaySix = RelayStatus.KeepCurrentStatus, + StatusRelaySeven = RelayStatus.On, + StatusRelayEight = RelayStatus.Flashing, + StatusRelayNine = RelayStatus.KeepCurrentStatus, + StatusRelayTen = RelayStatus.Off + }, true); + } } } diff --git a/src/MIDTesters.Core/IOInterface/TestMid0210.cs b/src/MIDTesters.Core/IOInterface/TestMid0210.cs index fe034936..87481642 100644 --- a/src/MIDTesters.Core/IOInterface/TestMid0210.cs +++ b/src/MIDTesters.Core/IOInterface/TestMid0210.cs @@ -31,5 +31,14 @@ public void Mid0210ByteRevision1() Assert.IsTrue(mid.Header.NoAckFlag); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0210PackRevision1() + { + string package = "00200210 1 "; + + AssertBuildAndParse(package, new Mid0210(noAckFlag: true), true); + } } } diff --git a/src/MIDTesters.Core/IOInterface/TestMid0211.cs b/src/MIDTesters.Core/IOInterface/TestMid0211.cs index 8acea432..03dd47f9 100644 --- a/src/MIDTesters.Core/IOInterface/TestMid0211.cs +++ b/src/MIDTesters.Core/IOInterface/TestMid0211.cs @@ -15,14 +15,14 @@ public void Mid0211Revision1() var mid = _midInterpreter.Parse(package); Assert.IsTrue(mid.Header.NoAckFlag); - Assert.IsNotNull(mid.StatusDigInOne); - Assert.IsNotNull(mid.StatusDigInTwo); - Assert.IsNotNull(mid.StatusDigInThree); - Assert.IsNotNull(mid.StatusDigInFour); - Assert.IsNotNull(mid.StatusDigInFive); - Assert.IsNotNull(mid.StatusDigInSix); - Assert.IsNotNull(mid.StatusDigInSeven); - Assert.IsNotNull(mid.StatusDigInEight); + Assert.IsTrue(mid.StatusDigInOne); + Assert.IsFalse(mid.StatusDigInTwo); + Assert.IsTrue(mid.StatusDigInThree); + Assert.IsFalse(mid.StatusDigInFour); + Assert.IsTrue(mid.StatusDigInFive); + Assert.IsFalse(mid.StatusDigInSix); + Assert.IsTrue(mid.StatusDigInSeven); + Assert.IsTrue(mid.StatusDigInEight); AssertEqualPackages(package, mid, true); } @@ -35,15 +35,35 @@ public void Mid0211ByteRevision1() var mid = _midInterpreter.Parse(bytes); Assert.IsTrue(mid.Header.NoAckFlag); - Assert.IsNotNull(mid.StatusDigInOne); - Assert.IsNotNull(mid.StatusDigInTwo); - Assert.IsNotNull(mid.StatusDigInThree); - Assert.IsNotNull(mid.StatusDigInFour); - Assert.IsNotNull(mid.StatusDigInFive); - Assert.IsNotNull(mid.StatusDigInSix); - Assert.IsNotNull(mid.StatusDigInSeven); - Assert.IsNotNull(mid.StatusDigInEight); + Assert.IsTrue(mid.StatusDigInOne); + Assert.IsFalse(mid.StatusDigInTwo); + Assert.IsTrue(mid.StatusDigInThree); + Assert.IsFalse(mid.StatusDigInFour); + Assert.IsTrue(mid.StatusDigInFive); + Assert.IsFalse(mid.StatusDigInSix); + Assert.IsTrue(mid.StatusDigInSeven); + Assert.IsTrue(mid.StatusDigInEight); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0211PackRevision1() + { + string package = "00280211 1 10101011"; + + AssertBuildAndParse(package, new Mid0211() + { + Header = { NoAckFlag = true }, + StatusDigInOne = true, + StatusDigInTwo = false, + StatusDigInThree = true, + StatusDigInFour = false, + StatusDigInFive = true, + StatusDigInSix = false, + StatusDigInSeven = true, + StatusDigInEight = true + }, true); + } } } diff --git a/src/MIDTesters.Core/IOInterface/TestMid0212.cs b/src/MIDTesters.Core/IOInterface/TestMid0212.cs index ba0c6231..91a18bf0 100644 --- a/src/MIDTesters.Core/IOInterface/TestMid0212.cs +++ b/src/MIDTesters.Core/IOInterface/TestMid0212.cs @@ -29,5 +29,14 @@ public void Mid0212ByteRevision1() Assert.AreEqual(typeof(Mid0212), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0212PackRevision1() + { + string package = "00200212 "; + + AssertBuildAndParse(package, new Mid0212(), true); + } } } diff --git a/src/MIDTesters.Core/IOInterface/TestMid0213.cs b/src/MIDTesters.Core/IOInterface/TestMid0213.cs index 7256d8f6..9e9c5b20 100644 --- a/src/MIDTesters.Core/IOInterface/TestMid0213.cs +++ b/src/MIDTesters.Core/IOInterface/TestMid0213.cs @@ -29,5 +29,14 @@ public void Mid0213ByteRevision1() Assert.AreEqual(typeof(Mid0213), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0213PackRevision1() + { + string package = "00200213 "; + + AssertBuildAndParse(package, new Mid0213(), true); + } } } diff --git a/src/MIDTesters.Core/IOInterface/TestMid0214.cs b/src/MIDTesters.Core/IOInterface/TestMid0214.cs index 4cd06126..8ace127b 100644 --- a/src/MIDTesters.Core/IOInterface/TestMid0214.cs +++ b/src/MIDTesters.Core/IOInterface/TestMid0214.cs @@ -14,7 +14,7 @@ public void Mid0214AllRevisions() string package = "00220214002 10"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.DeviceNumber); + Assert.AreEqual(10, mid.DeviceNumber); AssertEqualPackages(package, mid); } @@ -26,8 +26,20 @@ public void Mid0214ByteAllRevisions() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.DeviceNumber); + Assert.AreEqual(10, mid.DeviceNumber); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Pack")] + public void Mid0214PackAllRevisions() + { + string package = "00220214002 10"; + + AssertBuildAndParse(package, new Mid0214(2) + { + DeviceNumber = 10 + }); + } } } diff --git a/src/MIDTesters.Core/IOInterface/TestMid0215.cs b/src/MIDTesters.Core/IOInterface/TestMid0215.cs index 0707194d..ad58419b 100644 --- a/src/MIDTesters.Core/IOInterface/TestMid0215.cs +++ b/src/MIDTesters.Core/IOInterface/TestMid0215.cs @@ -1,6 +1,8 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenProtocolInterpreter.IOInterface; +using System.Collections.Generic; +using OpenProtocolInterpreter; namespace MIDTesters.IOInterface { [TestClass] @@ -14,9 +16,7 @@ public void Mid0215Revision1() string package = "00920215001 010302001000210031004010012000300140010300110020003100410051006100700080"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.IODeviceId); - Assert.IsNotNull(mid.Relays); - Assert.IsNotNull(mid.DigitalInputs); + Assert.AreEqual(3, mid.IODeviceId); Assert.AreEqual(8, mid.Relays.Count); Assert.AreEqual(8, mid.DigitalInputs.Count); @@ -31,9 +31,7 @@ public void Mid0215ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.IODeviceId); - Assert.IsNotNull(mid.Relays); - Assert.IsNotNull(mid.DigitalInputs); + Assert.AreEqual(3, mid.IODeviceId); Assert.AreEqual(8, mid.Relays.Count); Assert.AreEqual(8, mid.DigitalInputs.Count); @@ -44,18 +42,15 @@ public void Mid0215ByteRevision1() [TestCategory("Revision 2"), TestCategory("ASCII")] public void Mid0215Revision2() { - string package = "00920215002 010302070300100021003100400051006000710407050011002000310041005100610070"; + string package = @"00920215002 010302070300100021003100400051006000710407050011002000310041005100610070"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.IODeviceId); - Assert.IsNotNull(mid.Relays); - Assert.IsNotNull(mid.DigitalInputs); + Assert.AreEqual(3, mid.IODeviceId); + Assert.AreEqual(7, mid.NumberOfRelays); Assert.AreEqual(7, mid.Relays.Count); + Assert.AreEqual(7, mid.NumberOfDigitalInputs); Assert.AreEqual(7, mid.DigitalInputs.Count); - Assert.IsNotNull(mid.NumberOfDigitalInputs); - Assert.IsNotNull(mid.NumberOfRelays); - AssertEqualPackages(package, mid); } @@ -67,16 +62,81 @@ public void Mid0215ByteRevision2() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.IODeviceId); - Assert.IsNotNull(mid.Relays); - Assert.IsNotNull(mid.DigitalInputs); + Assert.AreEqual(3, mid.IODeviceId); Assert.AreEqual(7, mid.Relays.Count); Assert.AreEqual(7, mid.DigitalInputs.Count); - - Assert.IsNotNull(mid.NumberOfDigitalInputs); - Assert.IsNotNull(mid.NumberOfRelays); + Assert.AreEqual(7, mid.NumberOfRelays); + Assert.AreEqual(7, mid.NumberOfDigitalInputs); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0215PackRevision1() + { + string package = "00920215001 010302001000210031004010012000300140010300110020003100410051006100700080"; + + AssertBuildAndParse(package, new Mid0215(1) + { + IODeviceId = 3, + Relays = new List() + { + new Relay(RelayNumber.Ok, false), + new Relay(RelayNumber.Nok, true), + new Relay(RelayNumber.Low, true), + new Relay(RelayNumber.High, false), + new Relay(RelayNumber.ExternalControlled8, true), + new Relay((RelayNumber)200, false), + new Relay(RelayNumber.TrackingDisabled, true), + new Relay((RelayNumber)400, true) + }, + DigitalInputs = new List() + { + new DigitalInput(DigitalInputNumber.ResetBatch, true), + new DigitalInput(DigitalInputNumber.UnlockTool, false), + new DigitalInput(DigitalInputNumber.ToolDisableNo, true), + new DigitalInput(DigitalInputNumber.ToolDisableNc, true), + new DigitalInput(DigitalInputNumber.ToolTighteningDisable, true), + new DigitalInput(DigitalInputNumber.ToolLooseningDisable, true), + new DigitalInput(DigitalInputNumber.RemoteStartPulse, false), + new DigitalInput(DigitalInputNumber.RemoteStartCont, false) + } + }); + } + + [TestMethod] + [TestCategory("Revision 2"), TestCategory("Pack")] + public void Mid0215PackRevision2() + { + string package = @"00920215002 010302070300100021003100400051006000710407050011002000310041005100610070"; + + AssertBuildAndParse(package, new Mid0215(2) + { + IODeviceId = 3, + NumberOfRelays = 7, + Relays = new List() + { + new Relay(RelayNumber.Ok, false), + new Relay(RelayNumber.Nok, true), + new Relay(RelayNumber.Low, true), + new Relay(RelayNumber.High, false), + new Relay(RelayNumber.LowTorque, true), + new Relay(RelayNumber.HighTorque, false), + new Relay(RelayNumber.LowAngle, true) + }, + NumberOfDigitalInputs = 7, + DigitalInputs = new List() + { + new DigitalInput(DigitalInputNumber.ResetBatch, true), + new DigitalInput(DigitalInputNumber.UnlockTool, false), + new DigitalInput(DigitalInputNumber.ToolDisableNo, true), + new DigitalInput(DigitalInputNumber.ToolDisableNc, true), + new DigitalInput(DigitalInputNumber.ToolTighteningDisable, true), + new DigitalInput(DigitalInputNumber.ToolLooseningDisable, true), + new DigitalInput(DigitalInputNumber.RemoteStartPulse, false) + } + }); + } } } diff --git a/src/MIDTesters.Core/IOInterface/TestMid0216.cs b/src/MIDTesters.Core/IOInterface/TestMid0216.cs index 083ac9fa..1f03819e 100644 --- a/src/MIDTesters.Core/IOInterface/TestMid0216.cs +++ b/src/MIDTesters.Core/IOInterface/TestMid0216.cs @@ -1,4 +1,5 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; using OpenProtocolInterpreter.IOInterface; namespace MIDTesters.IOInterface @@ -14,7 +15,7 @@ public void Mid0216Revision1() string package = "00230216 1 026"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.RelayNumber); + Assert.AreEqual(RelayNumber.ToolRunning, mid.RelayNumber); AssertEqualPackages(package, mid, true); } @@ -26,8 +27,20 @@ public void Mid0216ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.RelayNumber); + Assert.AreEqual(RelayNumber.ToolRunning, mid.RelayNumber); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0216PackRevision1() + { + string package = "00230216 1 026"; + + AssertBuildAndParse(package, new Mid0216(noAckFlag: true) + { + RelayNumber = RelayNumber.ToolRunning + }, true); + } } } diff --git a/src/MIDTesters.Core/IOInterface/TestMid0217.cs b/src/MIDTesters.Core/IOInterface/TestMid0217.cs index 7859b1ce..c98ebf0b 100644 --- a/src/MIDTesters.Core/IOInterface/TestMid0217.cs +++ b/src/MIDTesters.Core/IOInterface/TestMid0217.cs @@ -1,4 +1,5 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; using OpenProtocolInterpreter.IOInterface; namespace MIDTesters.IOInterface @@ -14,8 +15,8 @@ public void Mid0217Revision1() string package = "00280217 1 01026021"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.RelayNumber); - Assert.IsNotNull(mid.RelayStatus); + Assert.AreEqual(RelayNumber.ToolRunning, mid.RelayNumber); + Assert.IsTrue(mid.RelayStatus); AssertEqualPackages(package, mid, true); } @@ -27,9 +28,23 @@ public void Mid0217ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.RelayNumber); - Assert.IsNotNull(mid.RelayStatus); + Assert.AreEqual(RelayNumber.ToolRunning, mid.RelayNumber); + Assert.IsTrue(mid.RelayStatus); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0217PackRevision1() + { + string package = "00280217 1 01026021"; + + AssertBuildAndParse(package, new Mid0217() + { + Header = { NoAckFlag = true }, + RelayNumber = RelayNumber.ToolRunning, + RelayStatus = true + }, true); + } } } diff --git a/src/MIDTesters.Core/IOInterface/TestMid0218.cs b/src/MIDTesters.Core/IOInterface/TestMid0218.cs index d3f8cb3c..5bbd5483 100644 --- a/src/MIDTesters.Core/IOInterface/TestMid0218.cs +++ b/src/MIDTesters.Core/IOInterface/TestMid0218.cs @@ -29,5 +29,14 @@ public void Mid0218ByteRevision1() Assert.AreEqual(typeof(Mid0218), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0218PackRevision1() + { + string package = "00200218 "; + + AssertBuildAndParse(package, new Mid0218(), true); + } } } diff --git a/src/MIDTesters.Core/IOInterface/TestMid0219.cs b/src/MIDTesters.Core/IOInterface/TestMid0219.cs index cc0af51d..ce8ca4d9 100644 --- a/src/MIDTesters.Core/IOInterface/TestMid0219.cs +++ b/src/MIDTesters.Core/IOInterface/TestMid0219.cs @@ -1,4 +1,5 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; using OpenProtocolInterpreter.IOInterface; namespace MIDTesters.IOInterface @@ -14,7 +15,7 @@ public void Mid0219Revision1() string package = "00230219 102"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.RelayNumber); + Assert.AreEqual(RelayNumber.ExternalControlled10, mid.RelayNumber); AssertEqualPackages(package, mid, true); } @@ -26,8 +27,20 @@ public void Mid0219ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.RelayNumber); + Assert.AreEqual(RelayNumber.ExternalControlled10, mid.RelayNumber); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0219PackRevision1() + { + string package = "00230219 102"; + + AssertBuildAndParse(package, new Mid0219() + { + RelayNumber = RelayNumber.ExternalControlled10 + }, true); + } } } diff --git a/src/MIDTesters.Core/IOInterface/TestMid0220.cs b/src/MIDTesters.Core/IOInterface/TestMid0220.cs index 964bc829..b3e70df5 100644 --- a/src/MIDTesters.Core/IOInterface/TestMid0220.cs +++ b/src/MIDTesters.Core/IOInterface/TestMid0220.cs @@ -1,4 +1,5 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; using OpenProtocolInterpreter.IOInterface; namespace MIDTesters.IOInterface @@ -14,7 +15,7 @@ public void Mid0220Revision1() string package = "00230220 120"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.DigitalInputNumber); + Assert.AreEqual(DigitalInputNumber.ForcedCcwOnce, mid.DigitalInputNumber); AssertEqualPackages(package, mid, true); } @@ -26,8 +27,20 @@ public void Mid0220ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.DigitalInputNumber); + Assert.AreEqual(DigitalInputNumber.ForcedCcwOnce, mid.DigitalInputNumber); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0220PackRevision1() + { + string package = "00230220 120"; + + AssertBuildAndParse(package, new Mid0220() + { + DigitalInputNumber = DigitalInputNumber.ForcedCcwOnce + }, true); + } } } diff --git a/src/MIDTesters.Core/IOInterface/TestMid0221.cs b/src/MIDTesters.Core/IOInterface/TestMid0221.cs index 23d0ffab..0d15ec48 100644 --- a/src/MIDTesters.Core/IOInterface/TestMid0221.cs +++ b/src/MIDTesters.Core/IOInterface/TestMid0221.cs @@ -1,4 +1,5 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; using OpenProtocolInterpreter.IOInterface; namespace MIDTesters.IOInterface @@ -14,8 +15,8 @@ public void Mid0221Revision1() string package = "00280221 01120021"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.DigitalInputNumber); - Assert.IsNotNull(mid.DigitalInputStatus); + Assert.AreEqual(DigitalInputNumber.ForcedCcwOnce, mid.DigitalInputNumber); + Assert.IsTrue(mid.DigitalInputStatus); AssertEqualPackages(package, mid, true); } @@ -27,9 +28,22 @@ public void Mid0221ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.DigitalInputNumber); - Assert.IsNotNull(mid.DigitalInputStatus); + Assert.AreEqual(DigitalInputNumber.ForcedCcwOnce, mid.DigitalInputNumber); + Assert.IsTrue(mid.DigitalInputStatus); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0221PackRevision1() + { + string package = "00280221 01120021"; + + AssertBuildAndParse(package, new Mid0221() + { + DigitalInputNumber = DigitalInputNumber.ForcedCcwOnce, + DigitalInputStatus = true + }, true); + } } } diff --git a/src/MIDTesters.Core/IOInterface/TestMid0222.cs b/src/MIDTesters.Core/IOInterface/TestMid0222.cs index c9d94aad..7ea1f623 100644 --- a/src/MIDTesters.Core/IOInterface/TestMid0222.cs +++ b/src/MIDTesters.Core/IOInterface/TestMid0222.cs @@ -29,5 +29,14 @@ public void Mid0222ByteRevision1() Assert.AreEqual(typeof(Mid0222), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0222PackRevision1() + { + string package = "00200222 "; + + AssertBuildAndParse(package, new Mid0222(), true); + } } } diff --git a/src/MIDTesters.Core/IOInterface/TestMid0223.cs b/src/MIDTesters.Core/IOInterface/TestMid0223.cs index fb5fa02a..2f1da974 100644 --- a/src/MIDTesters.Core/IOInterface/TestMid0223.cs +++ b/src/MIDTesters.Core/IOInterface/TestMid0223.cs @@ -1,4 +1,5 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; using OpenProtocolInterpreter.IOInterface; namespace MIDTesters.IOInterface @@ -14,7 +15,7 @@ public void Mid0223Revision1() string package = "00230223 066"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.DigitalInputNumber); + Assert.AreEqual(DigitalInputNumber.IdCard, mid.DigitalInputNumber); AssertEqualPackages(package, mid, true); } @@ -26,8 +27,20 @@ public void Mid0223ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.DigitalInputNumber); + Assert.AreEqual(DigitalInputNumber.IdCard, mid.DigitalInputNumber); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0223PackRevision1() + { + string package = "00230223 066"; + + AssertBuildAndParse(package, new Mid0223() + { + DigitalInputNumber = DigitalInputNumber.IdCard + }, true); + } } } diff --git a/src/MIDTesters.Core/IOInterface/TestMid0224.cs b/src/MIDTesters.Core/IOInterface/TestMid0224.cs index 2e8434f6..17d62ed3 100644 --- a/src/MIDTesters.Core/IOInterface/TestMid0224.cs +++ b/src/MIDTesters.Core/IOInterface/TestMid0224.cs @@ -1,4 +1,5 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; using OpenProtocolInterpreter.IOInterface; namespace MIDTesters.IOInterface @@ -14,7 +15,7 @@ public void Mid0224Revision1() string package = "00230224 065"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.DigitalInputNumber); + Assert.AreEqual(DigitalInputNumber.ClickWrench4, mid.DigitalInputNumber); AssertEqualPackages(package, mid, true); } @@ -26,8 +27,20 @@ public void Mid0224ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.DigitalInputNumber); + Assert.AreEqual(DigitalInputNumber.ClickWrench4, mid.DigitalInputNumber); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0224PackRevision1() + { + string package = "00230224 065"; + + AssertBuildAndParse(package, new Mid0224() + { + DigitalInputNumber = DigitalInputNumber.ClickWrench4 + }, true); + } } } diff --git a/src/MIDTesters.Core/IOInterface/TestMid0225.cs b/src/MIDTesters.Core/IOInterface/TestMid0225.cs index 7bb705aa..b2a98909 100644 --- a/src/MIDTesters.Core/IOInterface/TestMid0225.cs +++ b/src/MIDTesters.Core/IOInterface/TestMid0225.cs @@ -1,4 +1,5 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; using OpenProtocolInterpreter.IOInterface; namespace MIDTesters.IOInterface @@ -14,7 +15,7 @@ public void Mid0225Revision1() string package = "00230225 055"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.DigitalInputNumber); + Assert.AreEqual(DigitalInputNumber.EndOfCycle, mid.DigitalInputNumber); AssertEqualPackages(package, mid, true); } @@ -26,8 +27,20 @@ public void Mid0225ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.DigitalInputNumber); + Assert.AreEqual(DigitalInputNumber.EndOfCycle, mid.DigitalInputNumber); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0225PackRevision1() + { + string package = "00230225 055"; + + AssertBuildAndParse(package, new Mid0225() + { + DigitalInputNumber = DigitalInputNumber.EndOfCycle + }, true); + } } } diff --git a/src/MIDTesters.Core/Job/Advanced/TestMid0120.cs b/src/MIDTesters.Core/Job/Advanced/TestMid0120.cs index 18f00627..37f0b187 100644 --- a/src/MIDTesters.Core/Job/Advanced/TestMid0120.cs +++ b/src/MIDTesters.Core/Job/Advanced/TestMid0120.cs @@ -31,5 +31,14 @@ public void Mid0120ByteRevision1() Assert.IsTrue(mid.Header.NoAckFlag); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0120PackRevision1() + { + string package = "00200120 1 "; + + AssertBuildAndParse(package, new Mid0120(noAckFlag: true), true); + } } } diff --git a/src/MIDTesters.Core/Job/Advanced/TestMid0121.cs b/src/MIDTesters.Core/Job/Advanced/TestMid0121.cs index 557e6bed..d3075c33 100644 --- a/src/MIDTesters.Core/Job/Advanced/TestMid0121.cs +++ b/src/MIDTesters.Core/Job/Advanced/TestMid0121.cs @@ -31,5 +31,17 @@ public void Mid0121ByteRevision1() Assert.IsTrue(mid.Header.NoAckFlag); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0121PackRevision1() + { + string package = "00200121 1 "; + + AssertBuildAndParse(package, new Mid0121() + { + Header = { NoAckFlag = true } + }, true); + } } } diff --git a/src/MIDTesters.Core/Job/Advanced/TestMid0122.cs b/src/MIDTesters.Core/Job/Advanced/TestMid0122.cs index 6acc0c4b..c45f2973 100644 --- a/src/MIDTesters.Core/Job/Advanced/TestMid0122.cs +++ b/src/MIDTesters.Core/Job/Advanced/TestMid0122.cs @@ -31,5 +31,17 @@ public void Mid0122ByteRevision1() Assert.IsTrue(mid.Header.NoAckFlag); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0122PackRevision1() + { + string package = "00200122 1 "; + + AssertBuildAndParse(package, new Mid0122() + { + Header = { NoAckFlag = true } + }, true); + } } } diff --git a/src/MIDTesters.Core/Job/Advanced/TestMid0123.cs b/src/MIDTesters.Core/Job/Advanced/TestMid0123.cs index d2e8d8e6..fbbb06ee 100644 --- a/src/MIDTesters.Core/Job/Advanced/TestMid0123.cs +++ b/src/MIDTesters.Core/Job/Advanced/TestMid0123.cs @@ -31,5 +31,17 @@ public void Mid0123ByteRevision1() Assert.IsTrue(mid.Header.NoAckFlag); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0123PackRevision1() + { + string package = "00200123 1 "; + + AssertBuildAndParse(package, new Mid0123() + { + Header = { NoAckFlag = true } + }, true); + } } } diff --git a/src/MIDTesters.Core/Job/Advanced/TestMid0124.cs b/src/MIDTesters.Core/Job/Advanced/TestMid0124.cs index fdc9e38e..5463beaa 100644 --- a/src/MIDTesters.Core/Job/Advanced/TestMid0124.cs +++ b/src/MIDTesters.Core/Job/Advanced/TestMid0124.cs @@ -31,5 +31,17 @@ public void Mid0124ByteRevision1() Assert.IsTrue(mid.Header.NoAckFlag); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0124PackRevision1() + { + string package = "00200124 1 "; + + AssertBuildAndParse(package, new Mid0124() + { + Header = { NoAckFlag = true } + }, true); + } } } diff --git a/src/MIDTesters.Core/Job/Advanced/TestMid0125.cs b/src/MIDTesters.Core/Job/Advanced/TestMid0125.cs index d4cdfe84..4ba4508e 100644 --- a/src/MIDTesters.Core/Job/Advanced/TestMid0125.cs +++ b/src/MIDTesters.Core/Job/Advanced/TestMid0125.cs @@ -29,5 +29,14 @@ public void Mid0125ByteRevision1() Assert.AreEqual(typeof(Mid0125), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0125PackRevision1() + { + string package = "00200125 "; + + AssertBuildAndParse(package, new Mid0125(), true); + } } } diff --git a/src/MIDTesters.Core/Job/Advanced/TestMid0126.cs b/src/MIDTesters.Core/Job/Advanced/TestMid0126.cs index fbbc665a..f2417805 100644 --- a/src/MIDTesters.Core/Job/Advanced/TestMid0126.cs +++ b/src/MIDTesters.Core/Job/Advanced/TestMid0126.cs @@ -29,5 +29,14 @@ public void Mid0126ByteRevision1() Assert.AreEqual(typeof(Mid0126), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0126PackRevision1() + { + string package = "00200126 "; + + AssertBuildAndParse(package, new Mid0126(), true); + } } } diff --git a/src/MIDTesters.Core/Job/Advanced/TestMid0127.cs b/src/MIDTesters.Core/Job/Advanced/TestMid0127.cs index 0a61ed2b..1aa125b6 100644 --- a/src/MIDTesters.Core/Job/Advanced/TestMid0127.cs +++ b/src/MIDTesters.Core/Job/Advanced/TestMid0127.cs @@ -29,5 +29,14 @@ public void Mid0127ByteRevision1() Assert.AreEqual(typeof(Mid0127), mid.GetType()); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0127PackRevision1() + { + string package = "00200127001 "; + + AssertBuildAndParse(package, new Mid0127()); + } } } diff --git a/src/MIDTesters.Core/Job/Advanced/TestMid0128.cs b/src/MIDTesters.Core/Job/Advanced/TestMid0128.cs index 22426340..2dcce0ce 100644 --- a/src/MIDTesters.Core/Job/Advanced/TestMid0128.cs +++ b/src/MIDTesters.Core/Job/Advanced/TestMid0128.cs @@ -29,5 +29,14 @@ public void Mid0128ByteRevision1() Assert.AreEqual(typeof(Mid0128), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0128PackRevision1() + { + string package = "00200128 "; + + AssertBuildAndParse(package, new Mid0128(), true); + } } } diff --git a/src/MIDTesters.Core/Job/Advanced/TestMid0129.cs b/src/MIDTesters.Core/Job/Advanced/TestMid0129.cs index 6a9e84ea..26aaed32 100644 --- a/src/MIDTesters.Core/Job/Advanced/TestMid0129.cs +++ b/src/MIDTesters.Core/Job/Advanced/TestMid0129.cs @@ -37,8 +37,8 @@ public void Mid0129Revision2() string package = "00290129002 010302123"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.ParameterSetId); + Assert.AreEqual(3, mid.ChannelId); + Assert.AreEqual(123, mid.ParameterSetId); AssertEqualPackages(package, mid); } @@ -50,9 +50,31 @@ public void Mid0129ByteRevision2() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.ParameterSetId); + Assert.AreEqual(3, mid.ChannelId); + Assert.AreEqual(123, mid.ParameterSetId); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0129PackRevision1() + { + string package = "00200129 "; + + AssertBuildAndParse(package, new Mid0129(1), true); + } + + [TestMethod] + [TestCategory("Revision 2"), TestCategory("Pack")] + public void Mid0129PackRevision2() + { + string package = "00290129002 010302123"; + + AssertBuildAndParse(package, new Mid0129(2) + { + ChannelId = 3, + ParameterSetId = 123 + }); + } } } diff --git a/src/MIDTesters.Core/Job/Advanced/TestMid0130.cs b/src/MIDTesters.Core/Job/Advanced/TestMid0130.cs index c6788966..630696ae 100644 --- a/src/MIDTesters.Core/Job/Advanced/TestMid0130.cs +++ b/src/MIDTesters.Core/Job/Advanced/TestMid0130.cs @@ -14,7 +14,7 @@ public void Mid0130Revision1() string package = "00210130 1"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.JobOffStatus); + Assert.IsTrue(mid.JobOffStatus); AssertEqualPackages(package, mid, true); } @@ -26,8 +26,20 @@ public void Mid0130ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.JobOffStatus); + Assert.IsTrue(mid.JobOffStatus); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0130PackRevision1() + { + string package = "00210130 1"; + + AssertBuildAndParse(package, new Mid0130() + { + JobOffStatus = true + }, true); + } } } diff --git a/src/MIDTesters.Core/Job/Advanced/TestMid0131.cs b/src/MIDTesters.Core/Job/Advanced/TestMid0131.cs index c345aa71..066f1584 100644 --- a/src/MIDTesters.Core/Job/Advanced/TestMid0131.cs +++ b/src/MIDTesters.Core/Job/Advanced/TestMid0131.cs @@ -29,5 +29,14 @@ public void Mid0131ByteRevision1() Assert.AreEqual(typeof(Mid0131), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0131PackRevision1() + { + string package = "00200131 "; + + AssertBuildAndParse(package, new Mid0131(), true); + } } } diff --git a/src/MIDTesters.Core/Job/Advanced/TestMid0132.cs b/src/MIDTesters.Core/Job/Advanced/TestMid0132.cs index c7d0798f..1196999d 100644 --- a/src/MIDTesters.Core/Job/Advanced/TestMid0132.cs +++ b/src/MIDTesters.Core/Job/Advanced/TestMid0132.cs @@ -29,5 +29,14 @@ public void Mid0132ByteRevision1() Assert.AreEqual(typeof(Mid0132), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0132PackRevision1() + { + string package = "00200132 "; + + AssertBuildAndParse(package, new Mid0132(), true); + } } } diff --git a/src/MIDTesters.Core/Job/Advanced/TestMid0133.cs b/src/MIDTesters.Core/Job/Advanced/TestMid0133.cs index bd48c2d6..5853cb38 100644 --- a/src/MIDTesters.Core/Job/Advanced/TestMid0133.cs +++ b/src/MIDTesters.Core/Job/Advanced/TestMid0133.cs @@ -29,5 +29,14 @@ public void Mid0133ByteRevision1() Assert.AreEqual(typeof(Mid0133), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0133PackRevision1() + { + string package = "00200133 "; + + AssertBuildAndParse(package, new Mid0133(), true); + } } } diff --git a/src/MIDTesters.Core/Job/Advanced/TestMid0140.cs b/src/MIDTesters.Core/Job/Advanced/TestMid0140.cs index 42ba4dec..f57022bc 100644 --- a/src/MIDTesters.Core/Job/Advanced/TestMid0140.cs +++ b/src/MIDTesters.Core/Job/Advanced/TestMid0140.cs @@ -3,7 +3,8 @@ using OpenProtocolInterpreter.Job.Advanced; using System.Threading; -namespace MIDTesters.Core.Job.Advanced +using System.Collections.Generic; +namespace MIDTesters.Job.Advanced { [TestClass] [TestCategory("Job"), TestCategory("Advanced Job")] @@ -17,20 +18,19 @@ public void Mid0140Revision1() var mid = _midInterpreter.Parse(package); Assert.AreEqual(typeof(Mid0140), mid.GetType()); - Assert.AreNotEqual(0, mid.JobId); - Assert.AreNotEqual(string.Empty, mid.JobName); - Assert.AreNotEqual(0, mid.NumberOfParameterSets); - Assert.IsNotNull(mid.JobList); - Assert.AreNotEqual(0, mid.JobList.Count); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual("Job 1", mid.JobName.TrimEnd()); + Assert.AreEqual(2, mid.NumberOfParameterSets); + Assert.AreEqual(2, mid.JobList.Count); Assert.AreEqual(ForcedOrder.ForcedOrder, mid.ForcedOrder); Assert.IsTrue(mid.LockAtJobDone); Assert.AreEqual(ToolLoosening.EnableOnlyOnNokTightenings, mid.ToolLoosening); Assert.IsTrue(mid.RepeatJob); Assert.AreEqual(BatchMode.BothOkAndNok, mid.BatchMode); Assert.IsTrue(mid.DecrementBatchAtOkLoosening); - Assert.AreNotEqual(0, mid.MaxTimeForFirstTightening); - Assert.AreNotEqual(0, mid.MaxTimeToCompleteJob); - Assert.AreNotEqual(0, mid.DisplayResultAtAutoSelect); + Assert.AreEqual(100, mid.MaxTimeForFirstTightening); + Assert.AreEqual(10000, mid.MaxTimeToCompleteJob); + Assert.AreEqual(90, mid.DisplayResultAtAutoSelect); Assert.IsTrue(mid.UsingLineControl); Assert.AreEqual(IdentifierPart.Other, mid.IdentifierResultPart); Assert.IsTrue(mid.ResultOfNonTightenings); @@ -48,20 +48,19 @@ public void Mid0140ByteRevision1() var mid = _midInterpreter.Parse(bytes); Assert.AreEqual(typeof(Mid0140), mid.GetType()); - Assert.AreNotEqual(0, mid.JobId); - Assert.AreNotEqual(string.Empty, mid.JobName); - Assert.AreNotEqual(0, mid.NumberOfParameterSets); - Assert.IsNotNull(mid.JobList); - Assert.AreNotEqual(0, mid.JobList.Count); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual("Job 1", mid.JobName.TrimEnd()); + Assert.AreEqual(2, mid.NumberOfParameterSets); + Assert.AreEqual(2, mid.JobList.Count); Assert.AreEqual(ForcedOrder.ForcedOrder, mid.ForcedOrder); Assert.IsTrue(mid.LockAtJobDone); Assert.AreEqual(ToolLoosening.EnableOnlyOnNokTightenings, mid.ToolLoosening); Assert.IsTrue(mid.RepeatJob); Assert.AreEqual(BatchMode.BothOkAndNok, mid.BatchMode); Assert.IsTrue(mid.DecrementBatchAtOkLoosening); - Assert.AreNotEqual(0, mid.MaxTimeForFirstTightening); - Assert.AreNotEqual(0, mid.MaxTimeToCompleteJob); - Assert.AreNotEqual(0, mid.DisplayResultAtAutoSelect); + Assert.AreEqual(100, mid.MaxTimeForFirstTightening); + Assert.AreEqual(10000, mid.MaxTimeToCompleteJob); + Assert.AreEqual(90, mid.DisplayResultAtAutoSelect); Assert.IsTrue(mid.UsingLineControl); Assert.AreEqual(IdentifierPart.Other, mid.IdentifierResultPart); Assert.IsTrue(mid.ResultOfNonTightenings); @@ -76,28 +75,27 @@ public void Mid0140Revision2() { string package = "02250140002 01000102Job 1 03020415:045:0:22:02:10:0107:Job Action 1 :01;15:045:0:12:12:13:0407:Job Action 2 :02;05106107208109110111112010013100001400901511611711811912000120"; var mid = _midInterpreter.Parse(package); - + Assert.AreEqual(typeof(Mid0140), mid.GetType()); - Assert.AreNotEqual(0, mid.JobId); - Assert.AreNotEqual(string.Empty, mid.JobName); - Assert.AreNotEqual(0, mid.NumberOfParameterSets); - Assert.IsNotNull(mid.JobList); - Assert.AreNotEqual(0, mid.JobList.Count); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual("Job 1", mid.JobName.TrimEnd()); + Assert.AreEqual(2, mid.NumberOfParameterSets); + Assert.AreEqual(2, mid.JobList.Count); Assert.AreEqual(ForcedOrder.ForcedOrder, mid.ForcedOrder); Assert.IsTrue(mid.LockAtJobDone); Assert.AreEqual(ToolLoosening.EnableOnlyOnNokTightenings, mid.ToolLoosening); Assert.IsTrue(mid.RepeatJob); Assert.AreEqual(BatchMode.BothOkAndNok, mid.BatchMode); Assert.IsTrue(mid.DecrementBatchAtOkLoosening); - Assert.AreNotEqual(0, mid.MaxTimeForFirstTightening); - Assert.AreNotEqual(0, mid.MaxTimeToCompleteJob); - Assert.AreNotEqual(0, mid.DisplayResultAtAutoSelect); + Assert.AreEqual(100, mid.MaxTimeForFirstTightening); + Assert.AreEqual(10000, mid.MaxTimeToCompleteJob); + Assert.AreEqual(90, mid.DisplayResultAtAutoSelect); Assert.IsTrue(mid.UsingLineControl); Assert.AreEqual(IdentifierPart.Other, mid.IdentifierResultPart); Assert.IsTrue(mid.ResultOfNonTightenings); Assert.IsTrue(mid.ResetAllIdentifiersAtJobDone); Assert.AreEqual(Reserved.G, mid.Reserved); - Assert.AreNotEqual(0, mid.JobSequenceNumber); + Assert.AreEqual(120, mid.JobSequenceNumber); AssertEqualPackages(package, mid); } @@ -110,9 +108,9 @@ public void Mid0140ByteRevision2() var mid = _midInterpreter.Parse(bytes); Assert.AreEqual(typeof(Mid0140), mid.GetType()); - Assert.AreNotEqual(0, mid.JobId); - Assert.AreNotEqual(string.Empty, mid.JobName); - Assert.AreNotEqual(0, mid.NumberOfParameterSets); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual("Job 1", mid.JobName.TrimEnd()); + Assert.AreEqual(2, mid.NumberOfParameterSets); AssertEqualPackages(bytes, mid); } @@ -124,23 +122,22 @@ public void Mid0140Revision3() var mid = _midInterpreter.Parse(package); Assert.AreEqual(typeof(Mid0140), mid.GetType()); - Assert.AreNotEqual(0, mid.JobId); - Assert.AreNotEqual(string.Empty, mid.JobName); - Assert.AreNotEqual(0, mid.NumberOfParameterSets); - Assert.IsNotNull(mid.JobList); - Assert.AreNotEqual(0, mid.JobList.Count); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual("Job 1", mid.JobName.TrimEnd()); + Assert.AreEqual(2, mid.NumberOfParameterSets); + Assert.AreEqual(2, mid.JobList.Count); Assert.AreEqual(ForcedOrder.ForcedOrder, mid.ForcedOrder); Assert.IsTrue(mid.LockAtJobDone); Assert.IsTrue(mid.RepeatJob); - Assert.AreNotEqual(0, mid.MaxTimeForFirstTightening); - Assert.AreNotEqual(0, mid.MaxTimeToCompleteJob); - Assert.AreNotEqual(0, mid.DisplayResultAtAutoSelect); + Assert.AreEqual(100, mid.MaxTimeForFirstTightening); + Assert.AreEqual(900, mid.MaxTimeToCompleteJob); + Assert.AreEqual(90, mid.DisplayResultAtAutoSelect); Assert.IsTrue(mid.UsingLineControl); Assert.AreEqual(IdentifierPart.Other, mid.IdentifierResultPart); Assert.IsTrue(mid.ResultOfNonTightenings); Assert.IsTrue(mid.ResetAllIdentifiersAtJobDone); Assert.AreEqual(Reserved.G, mid.Reserved); - Assert.AreNotEqual(0, mid.JobSequenceNumber); + Assert.AreEqual(5000, mid.JobSequenceNumber); AssertEqualPackages(package, mid); } @@ -153,23 +150,22 @@ public void Mid0140ByteRevision3() var mid = _midInterpreter.Parse(bytes); Assert.AreEqual(typeof(Mid0140), mid.GetType()); - Assert.AreNotEqual(0, mid.JobId); - Assert.AreNotEqual(string.Empty, mid.JobName); - Assert.AreNotEqual(0, mid.NumberOfParameterSets); - Assert.IsNotNull(mid.JobList); - Assert.AreNotEqual(0, mid.JobList.Count); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual("Job 1", mid.JobName.TrimEnd()); + Assert.AreEqual(2, mid.NumberOfParameterSets); + Assert.AreEqual(2, mid.JobList.Count); Assert.AreEqual(ForcedOrder.ForcedOrder, mid.ForcedOrder); Assert.IsTrue(mid.LockAtJobDone); Assert.IsTrue(mid.RepeatJob); - Assert.AreNotEqual(0, mid.MaxTimeForFirstTightening); - Assert.AreNotEqual(0, mid.MaxTimeToCompleteJob); - Assert.AreNotEqual(0, mid.DisplayResultAtAutoSelect); + Assert.AreEqual(100, mid.MaxTimeForFirstTightening); + Assert.AreEqual(900, mid.MaxTimeToCompleteJob); + Assert.AreEqual(90, mid.DisplayResultAtAutoSelect); Assert.IsTrue(mid.UsingLineControl); Assert.AreEqual(IdentifierPart.Other, mid.IdentifierResultPart); Assert.IsTrue(mid.ResultOfNonTightenings); Assert.IsTrue(mid.ResetAllIdentifiersAtJobDone); Assert.AreEqual(Reserved.G, mid.Reserved); - Assert.AreNotEqual(0, mid.JobSequenceNumber); + Assert.AreEqual(5000, mid.JobSequenceNumber); AssertEqualPackages(bytes, mid); } @@ -181,23 +177,22 @@ public void Mid0140Revision4() var mid = _midInterpreter.Parse(package); Assert.AreEqual(typeof(Mid0140), mid.GetType()); - Assert.AreNotEqual(0, mid.JobId); - Assert.AreNotEqual(string.Empty, mid.JobName); - Assert.AreNotEqual(0, mid.NumberOfParameterSets); - Assert.IsNotNull(mid.JobList); - Assert.AreNotEqual(0, mid.JobList.Count); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual("Job 1", mid.JobName.TrimEnd()); + Assert.AreEqual(2, mid.NumberOfParameterSets); + Assert.AreEqual(2, mid.JobList.Count); Assert.AreEqual(ForcedOrder.ForcedOrder, mid.ForcedOrder); Assert.IsTrue(mid.LockAtJobDone); Assert.IsTrue(mid.RepeatJob); - Assert.AreNotEqual(0, mid.MaxTimeForFirstTightening); - Assert.AreNotEqual(0, mid.MaxTimeToCompleteJob); - Assert.AreNotEqual(0, mid.DisplayResultAtAutoSelect); + Assert.AreEqual(100, mid.MaxTimeForFirstTightening); + Assert.AreEqual(900, mid.MaxTimeToCompleteJob); + Assert.AreEqual(90, mid.DisplayResultAtAutoSelect); Assert.IsTrue(mid.UsingLineControl); Assert.AreEqual(IdentifierPart.Other, mid.IdentifierResultPart); Assert.IsTrue(mid.ResultOfNonTightenings); Assert.IsTrue(mid.ResetAllIdentifiersAtJobDone); Assert.AreEqual(Reserved.G, mid.Reserved); - Assert.AreNotEqual(0, mid.JobSequenceNumber); + Assert.AreEqual(5000, mid.JobSequenceNumber); AssertEqualPackages(package, mid); } @@ -210,24 +205,220 @@ public void Mid0140ByteRevision4() var mid = _midInterpreter.Parse(bytes); Assert.AreEqual(typeof(Mid0140), mid.GetType()); - Assert.AreNotEqual(0, mid.JobId); - Assert.AreNotEqual(string.Empty, mid.JobName); - Assert.AreNotEqual(0, mid.NumberOfParameterSets); - Assert.IsNotNull(mid.JobList); - Assert.AreNotEqual(0, mid.JobList.Count); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual("Job 1", mid.JobName.TrimEnd()); + Assert.AreEqual(2, mid.NumberOfParameterSets); + Assert.AreEqual(2, mid.JobList.Count); + Assert.AreEqual(ForcedOrder.ForcedOrder, mid.ForcedOrder); + Assert.IsTrue(mid.LockAtJobDone); + Assert.IsTrue(mid.RepeatJob); + Assert.AreEqual(100, mid.MaxTimeForFirstTightening); + Assert.AreEqual(900, mid.MaxTimeToCompleteJob); + Assert.AreEqual(90, mid.DisplayResultAtAutoSelect); + Assert.IsTrue(mid.UsingLineControl); + Assert.AreEqual(IdentifierPart.Other, mid.IdentifierResultPart); + Assert.IsTrue(mid.ResultOfNonTightenings); + Assert.IsTrue(mid.ResetAllIdentifiersAtJobDone); + Assert.AreEqual(Reserved.G, mid.Reserved); + Assert.AreEqual(5000, mid.JobSequenceNumber); + AssertEqualPackages(bytes, mid); + } + + [TestMethod] + [TestCategory("Revision 999"), TestCategory("ASCII")] + public void Mid0140Revision999() + { + string package = "01500140999 01000102Job 1 03020414:045:0:22:02:10;01:013:1:10:01:05;0510610720810911011111201001310000140090151161171181191"; + var mid = _midInterpreter.Parse(package); + + Assert.AreEqual(typeof(Mid0140), mid.GetType()); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual("Job 1", mid.JobName.TrimEnd()); + Assert.AreEqual(2, mid.NumberOfParameterSets); + Assert.AreEqual(2, mid.JobList.Count); + Assert.AreEqual(ForcedOrder.ForcedOrder, mid.ForcedOrder); + Assert.IsTrue(mid.LockAtJobDone); + Assert.AreEqual(ToolLoosening.EnableOnlyOnNokTightenings, mid.ToolLoosening); + Assert.IsTrue(mid.RepeatJob); + Assert.AreEqual(BatchMode.BothOkAndNok, mid.BatchMode); + Assert.IsTrue(mid.DecrementBatchAtOkLoosening); + Assert.AreEqual(100, mid.MaxTimeForFirstTightening); + Assert.AreEqual(10000, mid.MaxTimeToCompleteJob); + Assert.AreEqual(90, mid.DisplayResultAtAutoSelect); + Assert.IsTrue(mid.UsingLineControl); + Assert.AreEqual(IdentifierPart.Other, mid.IdentifierResultPart); + Assert.IsTrue(mid.ResultOfNonTightenings); + Assert.IsTrue(mid.ResetAllIdentifiersAtJobDone); + Assert.AreEqual(Reserved.G, mid.Reserved); + AssertEqualPackages(package, mid); + } + + [TestMethod] + [TestCategory("Revision 999"), TestCategory("ByteArray")] + public void Mid0140ByteRevision999() + { + string package = "01500140999 01000102Job 1 03020414:045:0:22:02:10;01:013:1:10:01:05;0510610720810911011111201001310000140090151161171181191"; + byte[] bytes = GetAsciiBytes(package); + var mid = _midInterpreter.Parse(bytes); + + Assert.AreEqual(typeof(Mid0140), mid.GetType()); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual("Job 1", mid.JobName.TrimEnd()); + Assert.AreEqual(2, mid.NumberOfParameterSets); + Assert.AreEqual(2, mid.JobList.Count); Assert.AreEqual(ForcedOrder.ForcedOrder, mid.ForcedOrder); Assert.IsTrue(mid.LockAtJobDone); + Assert.AreEqual(ToolLoosening.EnableOnlyOnNokTightenings, mid.ToolLoosening); Assert.IsTrue(mid.RepeatJob); - Assert.AreNotEqual(0, mid.MaxTimeForFirstTightening); - Assert.AreNotEqual(0, mid.MaxTimeToCompleteJob); - Assert.AreNotEqual(0, mid.DisplayResultAtAutoSelect); + Assert.AreEqual(BatchMode.BothOkAndNok, mid.BatchMode); + Assert.IsTrue(mid.DecrementBatchAtOkLoosening); + Assert.AreEqual(100, mid.MaxTimeForFirstTightening); + Assert.AreEqual(10000, mid.MaxTimeToCompleteJob); + Assert.AreEqual(90, mid.DisplayResultAtAutoSelect); Assert.IsTrue(mid.UsingLineControl); Assert.AreEqual(IdentifierPart.Other, mid.IdentifierResultPart); Assert.IsTrue(mid.ResultOfNonTightenings); Assert.IsTrue(mid.ResetAllIdentifiersAtJobDone); Assert.AreEqual(Reserved.G, mid.Reserved); - Assert.AreNotEqual(0, mid.JobSequenceNumber); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0140PackRevision1() + { + string package = "01440140 01000102Job 1 03020414:045:0:22:02;01:013:1:10:01;0510610720810911011111201001310000140090151161171181191"; + + AssertBuildAndParse(package, BuildMid0140(1, new List() + { + new AdvancedJob() { ChannelId = 14, ProgramId = 45, AutoSelect = AutoSelect.None, BatchSize = 22, MaxCoherentNok = 2 }, + new AdvancedJob() { ChannelId = 1, ProgramId = 13, AutoSelect = AutoSelect.AutoNextChange, BatchSize = 10, MaxCoherentNok = 1 } + }), true); + } + + [TestMethod] + [TestCategory("Revision 2"), TestCategory("Pack")] + public void Mid0140PackRevision2() + { + string package = "02250140002 01000102Job 1 03020415:045:0:22:02:10:0107:Job Action 1 :01;15:045:0:12:12:13:0407:Job Action 2 :02;05106107208109110111112010013100001400901511611711811912000120"; + + var mid = BuildMid0140(2, new List() + { + new AdvancedJob() { ChannelId = 15, ProgramId = 45, AutoSelect = AutoSelect.None, BatchSize = 22, MaxCoherentNok = 2, BatchCounter = 10, IdentifierNumber = 107, JobStepName = "Job Action 1", JobStepType = 1 }, + new AdvancedJob() { ChannelId = 15, ProgramId = 45, AutoSelect = AutoSelect.None, BatchSize = 12, MaxCoherentNok = 12, BatchCounter = 13, IdentifierNumber = 407, JobStepName = "Job Action 2", JobStepType = 2 } + }); + mid.JobSequenceNumber = 120; + + AssertBuildAndParse(package, mid); + } + + [TestMethod] + [TestCategory("Revision 3"), TestCategory("Pack")] + public void Mid0140PackRevision3() + { + string package = "02350140003 01000102Job 1 03020415:045:10:22:02:10:0107:Job Action 1 :01:2:1:1:2:2;15:041:10:12:12:13:0407:Job Action 2 :02:2:1:1:2:2;05106107108010009009001000901111211311411511605000"; + + AssertBuildAndParse(package, BuildMid0140Revision3Onwards(3, new List() + { + BuildAdvancedJobRevision3(programId: 45, batchSize: 22, maxCoherentNok: 2, batchCounter: 10, identifierNumber: 107, jobStepName: "Job Action 1", jobStepType: 1), + BuildAdvancedJobRevision3(programId: 41, batchSize: 12, maxCoherentNok: 12, batchCounter: 13, identifierNumber: 407, jobStepName: "Job Action 2", jobStepType: 2) + })); + } + + [TestMethod] + [TestCategory("Revision 4"), TestCategory("Pack")] + public void Mid0140PackRevision4() + { + string package = "02430140004 01000102Job 1 03020415:045:10:0022:02:0010:0107:Job Action 1 :01:2:1:1:2:2;15:041:10:0016:12:0013:0407:Job Action 2 :02:2:1:1:2:2;05106107108010009009001000901111211311411511605000"; + + AssertBuildAndParse(package, BuildMid0140Revision3Onwards(4, new List() + { + BuildAdvancedJobRevision3(programId: 45, batchSize: 22, maxCoherentNok: 2, batchCounter: 10, identifierNumber: 107, jobStepName: "Job Action 1", jobStepType: 1), + BuildAdvancedJobRevision3(programId: 41, batchSize: 16, maxCoherentNok: 12, batchCounter: 13, identifierNumber: 407, jobStepName: "Job Action 2", jobStepType: 2) + })); + } + + [TestMethod] + [TestCategory("Revision 999"), TestCategory("Pack")] + public void Mid0140PackRevision999() + { + string package = "01500140999 01000102Job 1 03020414:045:0:22:02:10;01:013:1:10:01:05;0510610720810911011111201001310000140090151161171181191"; + + AssertBuildAndParse(package, BuildMid0140(999, new List() + { + new AdvancedJob() { ChannelId = 14, ProgramId = 45, AutoSelect = AutoSelect.None, BatchSize = 22, MaxCoherentNok = 2, BatchCounter = 10 }, + new AdvancedJob() { ChannelId = 1, ProgramId = 13, AutoSelect = AutoSelect.AutoNextChange, BatchSize = 10, MaxCoherentNok = 1, BatchCounter = 5 } + })); + } + + private static Mid0140 BuildMid0140(int revision, List jobList) + { + return new Mid0140(revision) + { + JobId = 1, + JobName = "Job 1", + NumberOfParameterSets = 2, + JobList = jobList, + ForcedOrder = ForcedOrder.ForcedOrder, + LockAtJobDone = true, + ToolLoosening = ToolLoosening.EnableOnlyOnNokTightenings, + RepeatJob = true, + BatchMode = BatchMode.BothOkAndNok, + BatchStatusAtIncrement = true, + DecrementBatchAtOkLoosening = true, + MaxTimeForFirstTightening = 100, + MaxTimeToCompleteJob = 10000, + DisplayResultAtAutoSelect = 90, + UsingLineControl = true, + IdentifierResultPart = IdentifierPart.Other, + ResultOfNonTightenings = true, + ResetAllIdentifiersAtJobDone = true, + Reserved = Reserved.G + }; + } + + private static Mid0140 BuildMid0140Revision3Onwards(int revision, List jobList) + { + return new Mid0140(revision) + { + JobId = 1, + JobName = "Job 1", + NumberOfParameterSets = 2, + JobList = jobList, + ForcedOrder = ForcedOrder.ForcedOrder, + LockAtJobDone = true, + RepeatJob = true, + MaxTimeForFirstTightening = 100, + MaxTimeToCompleteJob = 900, + DisplayResultAtAutoSelect = 90, + UsingLineControl = true, + IdentifierResultPart = IdentifierPart.Other, + ResultOfNonTightenings = true, + ResetAllIdentifiersAtJobDone = true, + Reserved = Reserved.G, + JobSequenceNumber = 5000 + }; + } + + private static AdvancedJob BuildAdvancedJobRevision3(int programId, int batchSize, int maxCoherentNok, int batchCounter, int identifierNumber, string jobStepName, int jobStepType) + { + return new AdvancedJob() + { + ChannelId = 15, + ProgramId = programId, + AutoSelect = AutoSelect.ToolDisplay, + BatchSize = batchSize, + MaxCoherentNok = maxCoherentNok, + BatchCounter = batchCounter, + IdentifierNumber = identifierNumber, + JobStepName = jobStepName, + JobStepType = jobStepType, + ToolLoosening = ToolLoosening.EnableOnlyOnNokTightenings, + JobBatchMode = BatchMode.BothOkAndNok, + BatchStatusAtIncrement = BatchStatusAtIncrement.Nok, + DecrementBatchAfterLoosening = DecrementBatchAfterLoosening.AfterOk, + CurrentBatchStatus = CurrentBatchStatus.Nok + }; + } } } diff --git a/src/MIDTesters.Core/Job/TestMid0030.cs b/src/MIDTesters.Core/Job/TestMid0030.cs index 651c298c..d9067c73 100644 --- a/src/MIDTesters.Core/Job/TestMid0030.cs +++ b/src/MIDTesters.Core/Job/TestMid0030.cs @@ -29,5 +29,14 @@ public void Mid0030ByteAllRevisions() Assert.AreEqual(typeof(Mid0030), mid.GetType()); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Pack")] + public void Mid0030PackAllRevisions() + { + string package = "00200030002 "; + + AssertBuildAndParse(package, new Mid0030(2)); + } } } diff --git a/src/MIDTesters.Core/Job/TestMid0031.cs b/src/MIDTesters.Core/Job/TestMid0031.cs index 2dc90c5f..5eb81de9 100644 --- a/src/MIDTesters.Core/Job/TestMid0031.cs +++ b/src/MIDTesters.Core/Job/TestMid0031.cs @@ -1,5 +1,6 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenProtocolInterpreter.Job; +using System.Collections.Generic; namespace MIDTesters.Job { @@ -14,8 +15,8 @@ public void Mid0031Revision1() string package = "00300031001 0401020304"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.TotalJobs); - Assert.IsNotNull(mid.JobIds); + Assert.AreEqual(4, mid.TotalJobs); + Assert.AreEqual(4, mid.JobIds.Count); AssertEqualPackages(package, mid); } @@ -27,8 +28,8 @@ public void Mid0031ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.TotalJobs); - Assert.IsNotNull(mid.JobIds); + Assert.AreEqual(4, mid.TotalJobs); + Assert.AreEqual(4, mid.JobIds.Count); AssertEqualPackages(bytes, mid); } @@ -39,8 +40,8 @@ public void Mid0031Revision2() string package = "00640031002 00100001000200030004000500100015001100120019"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.TotalJobs); - Assert.IsNotNull(mid.JobIds); + Assert.AreEqual(10, mid.TotalJobs); + Assert.AreEqual(10, mid.JobIds.Count); AssertEqualPackages(package, mid); } @@ -52,9 +53,35 @@ public void Mid0031ByteRevision2() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.TotalJobs); - Assert.IsNotNull(mid.JobIds); + Assert.AreEqual(10, mid.TotalJobs); + Assert.AreEqual(10, mid.JobIds.Count); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0031PackRevision1() + { + string package = "00300031001 0401020304"; + + AssertBuildAndParse(package, new Mid0031(1) + { + TotalJobs = 4, + JobIds = new List() { 1, 2, 3, 4 } + }); + } + + [TestMethod] + [TestCategory("Revision 2"), TestCategory("Pack")] + public void Mid0031PackRevision2() + { + string package = "00640031002 00100001000200030004000500100015001100120019"; + + AssertBuildAndParse(package, new Mid0031(2) + { + TotalJobs = 10, + JobIds = new List() { 1, 2, 3, 4, 5, 10, 15, 11, 12, 19 } + }); + } } } diff --git a/src/MIDTesters.Core/Job/TestMid0032.cs b/src/MIDTesters.Core/Job/TestMid0032.cs index 9238f527..9e45e5a8 100644 --- a/src/MIDTesters.Core/Job/TestMid0032.cs +++ b/src/MIDTesters.Core/Job/TestMid0032.cs @@ -14,7 +14,7 @@ public void Mid0032Revision1() string package = "00220032001 04"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.JobId); + Assert.AreEqual(4, mid.JobId); AssertEqualPackages(package, mid); } @@ -26,7 +26,7 @@ public void Mid0032ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.JobId); + Assert.AreEqual(4, mid.JobId); AssertEqualPackages(bytes, mid); } @@ -37,7 +37,7 @@ public void Mid0032Revision2() string package = "00240032002 0002"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.JobId); + Assert.AreEqual(2, mid.JobId); AssertEqualPackages(package, mid); } @@ -49,7 +49,7 @@ public void Mid0032ByteRevision2() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.JobId); + Assert.AreEqual(2, mid.JobId); AssertEqualPackages(bytes, mid); } @@ -60,7 +60,7 @@ public void Mid0032Revision3() string package = "00240032003 0003"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.JobId); + Assert.AreEqual(3, mid.JobId); AssertEqualPackages(package, mid); } @@ -72,7 +72,7 @@ public void Mid0032ByteRevision3() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.JobId); + Assert.AreEqual(3, mid.JobId); AssertEqualPackages(bytes, mid); } @@ -83,7 +83,7 @@ public void Mid0032Revision4() string package = "00240032004 0003"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.JobId); + Assert.AreEqual(3, mid.JobId); AssertEqualPackages(package, mid); } @@ -95,8 +95,56 @@ public void Mid0032ByteRevision4() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.JobId); + Assert.AreEqual(3, mid.JobId); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0032PackRevision1() + { + string package = "00220032001 04"; + + AssertBuildAndParse(package, new Mid0032(1) + { + JobId = 4 + }); + } + + [TestMethod] + [TestCategory("Revision 2"), TestCategory("Pack")] + public void Mid0032PackRevision2() + { + string package = "00240032002 0002"; + + AssertBuildAndParse(package, new Mid0032(2) + { + JobId = 2 + }); + } + + [TestMethod] + [TestCategory("Revision 3"), TestCategory("Pack")] + public void Mid0032PackRevision3() + { + string package = "00240032003 0003"; + + AssertBuildAndParse(package, new Mid0032(3) + { + JobId = 3 + }); + } + + [TestMethod] + [TestCategory("Revision 4"), TestCategory("Pack")] + public void Mid0032PackRevision4() + { + string package = "00240032004 0003"; + + AssertBuildAndParse(package, new Mid0032(4) + { + JobId = 3 + }); + } } } diff --git a/src/MIDTesters.Core/Job/TestMid0033.cs b/src/MIDTesters.Core/Job/TestMid0033.cs index 30f02b58..d6551d4e 100644 --- a/src/MIDTesters.Core/Job/TestMid0033.cs +++ b/src/MIDTesters.Core/Job/TestMid0033.cs @@ -1,5 +1,8 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; using OpenProtocolInterpreter.Job; +using System.Collections.Generic; +using JobParameterSet = OpenProtocolInterpreter.Job.ParameterSet; namespace MIDTesters.Job { @@ -14,19 +17,19 @@ public void Mid0033Revision1() string package = "01150033001 010402My Job 4 031045000057000406107108109110211112021315:011:1:02;11:015:1:02;"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.JobName); - Assert.IsNotNull(mid.ForcedOrder); - Assert.IsNotNull(mid.MaxTimeForFirstTightening); - Assert.IsNotNull(mid.MaxTimeToCompleteJob); - Assert.IsNotNull(mid.JobBatchMode); - Assert.IsNotNull(mid.LockAtJobDone); - Assert.IsNotNull(mid.UseLineControl); - Assert.IsNotNull(mid.RepeatJob); - Assert.IsNotNull(mid.ToolLoosening); - Assert.IsNotNull(mid.Reserved); - Assert.IsNotNull(mid.NumberOfParameterSets); - Assert.IsNotNull(mid.ParameterSetList); + Assert.AreEqual(4, mid.JobId); + Assert.AreEqual("My Job 4", mid.JobName.TrimEnd()); + Assert.AreEqual(ForcedOrder.ForcedOrder, mid.ForcedOrder); + Assert.AreEqual(5000, mid.MaxTimeForFirstTightening); + Assert.AreEqual(70004, mid.MaxTimeToCompleteJob); + Assert.AreEqual(JobBatchMode.OkAndNokTightenings, mid.JobBatchMode); + Assert.IsTrue(mid.LockAtJobDone); + Assert.IsTrue(mid.UseLineControl); + Assert.IsTrue(mid.RepeatJob); + Assert.AreEqual(ToolLoosening.EnableOnlyOnNokTightenings, mid.ToolLoosening); + Assert.AreEqual(Reserved.G, mid.Reserved); + Assert.AreEqual(2, mid.NumberOfParameterSets); + Assert.AreEqual(2, mid.ParameterSetList.Count); AssertEqualPackages(package, mid); } @@ -38,19 +41,19 @@ public void Mid0033ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.JobName); - Assert.IsNotNull(mid.ForcedOrder); - Assert.IsNotNull(mid.MaxTimeForFirstTightening); - Assert.IsNotNull(mid.MaxTimeToCompleteJob); - Assert.IsNotNull(mid.JobBatchMode); - Assert.IsNotNull(mid.LockAtJobDone); - Assert.IsNotNull(mid.UseLineControl); - Assert.IsNotNull(mid.RepeatJob); - Assert.IsNotNull(mid.ToolLoosening); - Assert.IsNotNull(mid.Reserved); - Assert.IsNotNull(mid.NumberOfParameterSets); - Assert.IsNotNull(mid.ParameterSetList); + Assert.AreEqual(4, mid.JobId); + Assert.AreEqual("My Job 4", mid.JobName.TrimEnd()); + Assert.AreEqual(ForcedOrder.ForcedOrder, mid.ForcedOrder); + Assert.AreEqual(5000, mid.MaxTimeForFirstTightening); + Assert.AreEqual(70004, mid.MaxTimeToCompleteJob); + Assert.AreEqual(JobBatchMode.OkAndNokTightenings, mid.JobBatchMode); + Assert.IsTrue(mid.LockAtJobDone); + Assert.IsTrue(mid.UseLineControl); + Assert.IsTrue(mid.RepeatJob); + Assert.AreEqual(ToolLoosening.EnableOnlyOnNokTightenings, mid.ToolLoosening); + Assert.AreEqual(Reserved.G, mid.Reserved); + Assert.AreEqual(2, mid.NumberOfParameterSets); + Assert.AreEqual(2, mid.ParameterSetList.Count); AssertEqualPackages(bytes, mid); } @@ -61,19 +64,19 @@ public void Mid0033Revision2() string package = "01170033002 01000402My Job 4 031045000057000406107108109110211112021315:011:1:02;11:015:1:02;"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.JobName); - Assert.IsNotNull(mid.ForcedOrder); - Assert.IsNotNull(mid.MaxTimeForFirstTightening); - Assert.IsNotNull(mid.MaxTimeToCompleteJob); - Assert.IsNotNull(mid.JobBatchMode); - Assert.IsNotNull(mid.LockAtJobDone); - Assert.IsNotNull(mid.UseLineControl); - Assert.IsNotNull(mid.RepeatJob); - Assert.IsNotNull(mid.ToolLoosening); - Assert.IsNotNull(mid.Reserved); - Assert.IsNotNull(mid.NumberOfParameterSets); - Assert.IsNotNull(mid.ParameterSetList); + Assert.AreEqual(4, mid.JobId); + Assert.AreEqual("My Job 4", mid.JobName.TrimEnd()); + Assert.AreEqual(ForcedOrder.ForcedOrder, mid.ForcedOrder); + Assert.AreEqual(5000, mid.MaxTimeForFirstTightening); + Assert.AreEqual(70004, mid.MaxTimeToCompleteJob); + Assert.AreEqual(JobBatchMode.OkAndNokTightenings, mid.JobBatchMode); + Assert.IsTrue(mid.LockAtJobDone); + Assert.IsTrue(mid.UseLineControl); + Assert.IsTrue(mid.RepeatJob); + Assert.AreEqual(ToolLoosening.EnableOnlyOnNokTightenings, mid.ToolLoosening); + Assert.AreEqual(Reserved.G, mid.Reserved); + Assert.AreEqual(2, mid.NumberOfParameterSets); + Assert.AreEqual(2, mid.ParameterSetList.Count); AssertEqualPackages(package, mid); } @@ -85,19 +88,19 @@ public void Mid0033ByteRevision2() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.JobName); - Assert.IsNotNull(mid.ForcedOrder); - Assert.IsNotNull(mid.MaxTimeForFirstTightening); - Assert.IsNotNull(mid.MaxTimeToCompleteJob); - Assert.IsNotNull(mid.JobBatchMode); - Assert.IsNotNull(mid.LockAtJobDone); - Assert.IsNotNull(mid.UseLineControl); - Assert.IsNotNull(mid.RepeatJob); - Assert.IsNotNull(mid.ToolLoosening); - Assert.IsNotNull(mid.Reserved); - Assert.IsNotNull(mid.NumberOfParameterSets); - Assert.IsNotNull(mid.ParameterSetList); + Assert.AreEqual(4, mid.JobId); + Assert.AreEqual("My Job 4", mid.JobName.TrimEnd()); + Assert.AreEqual(ForcedOrder.ForcedOrder, mid.ForcedOrder); + Assert.AreEqual(5000, mid.MaxTimeForFirstTightening); + Assert.AreEqual(70004, mid.MaxTimeToCompleteJob); + Assert.AreEqual(JobBatchMode.OkAndNokTightenings, mid.JobBatchMode); + Assert.IsTrue(mid.LockAtJobDone); + Assert.IsTrue(mid.UseLineControl); + Assert.IsTrue(mid.RepeatJob); + Assert.AreEqual(ToolLoosening.EnableOnlyOnNokTightenings, mid.ToolLoosening); + Assert.AreEqual(Reserved.G, mid.Reserved); + Assert.AreEqual(2, mid.NumberOfParameterSets); + Assert.AreEqual(2, mid.ParameterSetList.Count); AssertEqualPackages(bytes, mid); } @@ -108,19 +111,19 @@ public void Mid0033Revision3() string package = "01810033003 01000402My Job 4 031045000057000406107108109110211112021315:011:1:02:02:Job Step 1 Name :03;11:015:1:02:01:Job Step 2 Name :05;"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.JobName); - Assert.IsNotNull(mid.ForcedOrder); - Assert.IsNotNull(mid.MaxTimeForFirstTightening); - Assert.IsNotNull(mid.MaxTimeToCompleteJob); - Assert.IsNotNull(mid.JobBatchMode); - Assert.IsNotNull(mid.LockAtJobDone); - Assert.IsNotNull(mid.UseLineControl); - Assert.IsNotNull(mid.RepeatJob); - Assert.IsNotNull(mid.ToolLoosening); - Assert.IsNotNull(mid.Reserved); - Assert.IsNotNull(mid.NumberOfParameterSets); - Assert.IsNotNull(mid.ParameterSetList); + Assert.AreEqual(4, mid.JobId); + Assert.AreEqual("My Job 4", mid.JobName.TrimEnd()); + Assert.AreEqual(ForcedOrder.ForcedOrder, mid.ForcedOrder); + Assert.AreEqual(5000, mid.MaxTimeForFirstTightening); + Assert.AreEqual(70004, mid.MaxTimeToCompleteJob); + Assert.AreEqual(JobBatchMode.OkAndNokTightenings, mid.JobBatchMode); + Assert.IsTrue(mid.LockAtJobDone); + Assert.IsTrue(mid.UseLineControl); + Assert.IsTrue(mid.RepeatJob); + Assert.AreEqual(ToolLoosening.EnableOnlyOnNokTightenings, mid.ToolLoosening); + Assert.AreEqual(Reserved.G, mid.Reserved); + Assert.AreEqual(2, mid.NumberOfParameterSets); + Assert.AreEqual(2, mid.ParameterSetList.Count); AssertEqualPackages(package, mid); } @@ -132,19 +135,19 @@ public void Mid0033ByteRevision3() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.JobName); - Assert.IsNotNull(mid.ForcedOrder); - Assert.IsNotNull(mid.MaxTimeForFirstTightening); - Assert.IsNotNull(mid.MaxTimeToCompleteJob); - Assert.IsNotNull(mid.JobBatchMode); - Assert.IsNotNull(mid.LockAtJobDone); - Assert.IsNotNull(mid.UseLineControl); - Assert.IsNotNull(mid.RepeatJob); - Assert.IsNotNull(mid.ToolLoosening); - Assert.IsNotNull(mid.Reserved); - Assert.IsNotNull(mid.NumberOfParameterSets); - Assert.IsNotNull(mid.ParameterSetList); + Assert.AreEqual(4, mid.JobId); + Assert.AreEqual("My Job 4", mid.JobName.TrimEnd()); + Assert.AreEqual(ForcedOrder.ForcedOrder, mid.ForcedOrder); + Assert.AreEqual(5000, mid.MaxTimeForFirstTightening); + Assert.AreEqual(70004, mid.MaxTimeToCompleteJob); + Assert.AreEqual(JobBatchMode.OkAndNokTightenings, mid.JobBatchMode); + Assert.IsTrue(mid.LockAtJobDone); + Assert.IsTrue(mid.UseLineControl); + Assert.IsTrue(mid.RepeatJob); + Assert.AreEqual(ToolLoosening.EnableOnlyOnNokTightenings, mid.ToolLoosening); + Assert.AreEqual(Reserved.G, mid.Reserved); + Assert.AreEqual(2, mid.NumberOfParameterSets); + Assert.AreEqual(2, mid.ParameterSetList.Count); AssertEqualPackages(bytes, mid); } @@ -155,19 +158,19 @@ public void Mid0033Revision4() string package = "01910033004 01000402My Job 4 031045000057000406107108109110211112021315:011:1:02:0002:Job Step 1 Name :03:05;11:015:1:02:0001:Job Step 2 Name :05:02;"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.JobName); - Assert.IsNotNull(mid.ForcedOrder); - Assert.IsNotNull(mid.MaxTimeForFirstTightening); - Assert.IsNotNull(mid.MaxTimeToCompleteJob); - Assert.IsNotNull(mid.JobBatchMode); - Assert.IsNotNull(mid.LockAtJobDone); - Assert.IsNotNull(mid.UseLineControl); - Assert.IsNotNull(mid.RepeatJob); - Assert.IsNotNull(mid.ToolLoosening); - Assert.IsNotNull(mid.Reserved); - Assert.IsNotNull(mid.NumberOfParameterSets); - Assert.IsNotNull(mid.ParameterSetList); + Assert.AreEqual(4, mid.JobId); + Assert.AreEqual("My Job 4", mid.JobName.TrimEnd()); + Assert.AreEqual(ForcedOrder.ForcedOrder, mid.ForcedOrder); + Assert.AreEqual(5000, mid.MaxTimeForFirstTightening); + Assert.AreEqual(70004, mid.MaxTimeToCompleteJob); + Assert.AreEqual(JobBatchMode.OkAndNokTightenings, mid.JobBatchMode); + Assert.IsTrue(mid.LockAtJobDone); + Assert.IsTrue(mid.UseLineControl); + Assert.IsTrue(mid.RepeatJob); + Assert.AreEqual(ToolLoosening.EnableOnlyOnNokTightenings, mid.ToolLoosening); + Assert.AreEqual(Reserved.G, mid.Reserved); + Assert.AreEqual(2, mid.NumberOfParameterSets); + Assert.AreEqual(2, mid.ParameterSetList.Count); AssertEqualPackages(package, mid); } @@ -179,19 +182,19 @@ public void Mid0033ByteRevision4() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.JobName); - Assert.IsNotNull(mid.ForcedOrder); - Assert.IsNotNull(mid.MaxTimeForFirstTightening); - Assert.IsNotNull(mid.MaxTimeToCompleteJob); - Assert.IsNotNull(mid.JobBatchMode); - Assert.IsNotNull(mid.LockAtJobDone); - Assert.IsNotNull(mid.UseLineControl); - Assert.IsNotNull(mid.RepeatJob); - Assert.IsNotNull(mid.ToolLoosening); - Assert.IsNotNull(mid.Reserved); - Assert.IsNotNull(mid.NumberOfParameterSets); - Assert.IsNotNull(mid.ParameterSetList); + Assert.AreEqual(4, mid.JobId); + Assert.AreEqual("My Job 4", mid.JobName.TrimEnd()); + Assert.AreEqual(ForcedOrder.ForcedOrder, mid.ForcedOrder); + Assert.AreEqual(5000, mid.MaxTimeForFirstTightening); + Assert.AreEqual(70004, mid.MaxTimeToCompleteJob); + Assert.AreEqual(JobBatchMode.OkAndNokTightenings, mid.JobBatchMode); + Assert.IsTrue(mid.LockAtJobDone); + Assert.IsTrue(mid.UseLineControl); + Assert.IsTrue(mid.RepeatJob); + Assert.AreEqual(ToolLoosening.EnableOnlyOnNokTightenings, mid.ToolLoosening); + Assert.AreEqual(Reserved.G, mid.Reserved); + Assert.AreEqual(2, mid.NumberOfParameterSets); + Assert.AreEqual(2, mid.ParameterSetList.Count); AssertEqualPackages(bytes, mid); } @@ -202,19 +205,19 @@ public void Mid0033Revision5() string package = "01950033005 01000402My Job 4 031045000057000406107108109110211112021315:011:1:0002:0002:Job Step 1 Name :03:05;11:015:1:0002:0001:Job Step 2 Name :05:02;"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.JobName); - Assert.IsNotNull(mid.ForcedOrder); - Assert.IsNotNull(mid.MaxTimeForFirstTightening); - Assert.IsNotNull(mid.MaxTimeToCompleteJob); - Assert.IsNotNull(mid.JobBatchMode); - Assert.IsNotNull(mid.LockAtJobDone); - Assert.IsNotNull(mid.UseLineControl); - Assert.IsNotNull(mid.RepeatJob); - Assert.IsNotNull(mid.ToolLoosening); - Assert.IsNotNull(mid.Reserved); - Assert.IsNotNull(mid.NumberOfParameterSets); - Assert.IsNotNull(mid.ParameterSetList); + Assert.AreEqual(4, mid.JobId); + Assert.AreEqual("My Job 4", mid.JobName.TrimEnd()); + Assert.AreEqual(ForcedOrder.ForcedOrder, mid.ForcedOrder); + Assert.AreEqual(5000, mid.MaxTimeForFirstTightening); + Assert.AreEqual(70004, mid.MaxTimeToCompleteJob); + Assert.AreEqual(JobBatchMode.OkAndNokTightenings, mid.JobBatchMode); + Assert.IsTrue(mid.LockAtJobDone); + Assert.IsTrue(mid.UseLineControl); + Assert.IsTrue(mid.RepeatJob); + Assert.AreEqual(ToolLoosening.EnableOnlyOnNokTightenings, mid.ToolLoosening); + Assert.AreEqual(Reserved.G, mid.Reserved); + Assert.AreEqual(2, mid.NumberOfParameterSets); + Assert.AreEqual(2, mid.ParameterSetList.Count); AssertEqualPackages(package, mid); } @@ -226,20 +229,106 @@ public void Mid0033ByteRevision5() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.JobName); - Assert.IsNotNull(mid.ForcedOrder); - Assert.IsNotNull(mid.MaxTimeForFirstTightening); - Assert.IsNotNull(mid.MaxTimeToCompleteJob); - Assert.IsNotNull(mid.JobBatchMode); - Assert.IsNotNull(mid.LockAtJobDone); - Assert.IsNotNull(mid.UseLineControl); - Assert.IsNotNull(mid.RepeatJob); - Assert.IsNotNull(mid.ToolLoosening); - Assert.IsNotNull(mid.Reserved); - Assert.IsNotNull(mid.NumberOfParameterSets); - Assert.IsNotNull(mid.ParameterSetList); + Assert.AreEqual(4, mid.JobId); + Assert.AreEqual("My Job 4", mid.JobName.TrimEnd()); + Assert.AreEqual(ForcedOrder.ForcedOrder, mid.ForcedOrder); + Assert.AreEqual(5000, mid.MaxTimeForFirstTightening); + Assert.AreEqual(70004, mid.MaxTimeToCompleteJob); + Assert.AreEqual(JobBatchMode.OkAndNokTightenings, mid.JobBatchMode); + Assert.IsTrue(mid.LockAtJobDone); + Assert.IsTrue(mid.UseLineControl); + Assert.IsTrue(mid.RepeatJob); + Assert.AreEqual(ToolLoosening.EnableOnlyOnNokTightenings, mid.ToolLoosening); + Assert.AreEqual(Reserved.G, mid.Reserved); + Assert.AreEqual(2, mid.NumberOfParameterSets); + Assert.AreEqual(2, mid.ParameterSetList.Count); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0033PackRevision1() + { + string package = "01150033001 010402My Job 4 031045000057000406107108109110211112021315:011:1:02;11:015:1:02;"; + + AssertBuildAndParse(package, BuildMid0033(1, new List() + { + new JobParameterSet() { ChannelId = 15, TypeId = 11, AutoValue = true, BatchSize = 2 }, + new JobParameterSet() { ChannelId = 11, TypeId = 15, AutoValue = true, BatchSize = 2 } + })); + } + + [TestMethod] + [TestCategory("Revision 2"), TestCategory("Pack")] + public void Mid0033PackRevision2() + { + string package = "01170033002 01000402My Job 4 031045000057000406107108109110211112021315:011:1:02;11:015:1:02;"; + + AssertBuildAndParse(package, BuildMid0033(2, new List() + { + new JobParameterSet() { ChannelId = 15, TypeId = 11, AutoValue = true, BatchSize = 2 }, + new JobParameterSet() { ChannelId = 11, TypeId = 15, AutoValue = true, BatchSize = 2 } + })); + } + + [TestMethod] + [TestCategory("Revision 3"), TestCategory("Pack")] + public void Mid0033PackRevision3() + { + string package = "01810033003 01000402My Job 4 031045000057000406107108109110211112021315:011:1:02:02:Job Step 1 Name :03;11:015:1:02:01:Job Step 2 Name :05;"; + +#pragma warning disable CS0618 // Socket is the revision 3 layout of the field + AssertBuildAndParse(package, BuildMid0033(3, new List() + { + new JobParameterSet() { ChannelId = 15, TypeId = 11, AutoValue = true, BatchSize = 2, Socket = 2, JobStepName = "Job Step 1 Name", JobStepType = 3 }, + new JobParameterSet() { ChannelId = 11, TypeId = 15, AutoValue = true, BatchSize = 2, Socket = 1, JobStepName = "Job Step 2 Name", JobStepType = 5 } + })); +#pragma warning restore CS0618 + } + + [TestMethod] + [TestCategory("Revision 4"), TestCategory("Pack")] + public void Mid0033PackRevision4() + { + string package = "01910033004 01000402My Job 4 031045000057000406107108109110211112021315:011:1:02:0002:Job Step 1 Name :03:05;11:015:1:02:0001:Job Step 2 Name :05:02;"; + + AssertBuildAndParse(package, BuildMid0033(4, new List() + { + new JobParameterSet() { ChannelId = 15, TypeId = 11, AutoValue = true, BatchSize = 2, IdentifierNumber = 2, JobStepName = "Job Step 1 Name", JobStepType = 3, MaxCoherentNok = 5 }, + new JobParameterSet() { ChannelId = 11, TypeId = 15, AutoValue = true, BatchSize = 2, IdentifierNumber = 1, JobStepName = "Job Step 2 Name", JobStepType = 5, MaxCoherentNok = 2 } + })); + } + + [TestMethod] + [TestCategory("Revision 5"), TestCategory("Pack")] + public void Mid0033PackRevision5() + { + string package = "01950033005 01000402My Job 4 031045000057000406107108109110211112021315:011:1:0002:0002:Job Step 1 Name :03:05;11:015:1:0002:0001:Job Step 2 Name :05:02;"; + + AssertBuildAndParse(package, BuildMid0033(5, new List() + { + new JobParameterSet() { ChannelId = 15, TypeId = 11, AutoValue = true, BatchSize = 2, IdentifierNumber = 2, JobStepName = "Job Step 1 Name", JobStepType = 3, MaxCoherentNok = 5 }, + new JobParameterSet() { ChannelId = 11, TypeId = 15, AutoValue = true, BatchSize = 2, IdentifierNumber = 1, JobStepName = "Job Step 2 Name", JobStepType = 5, MaxCoherentNok = 2 } + })); + } + + private static Mid0033 BuildMid0033(int revision, List parameterSets) + { + return new Mid0033(revision) + { + JobId = 4, + JobName = "My Job 4", + ForcedOrder = ForcedOrder.ForcedOrder, + MaxTimeForFirstTightening = 5000, + MaxTimeToCompleteJob = 70004, + JobBatchMode = JobBatchMode.OkAndNokTightenings, + LockAtJobDone = true, + UseLineControl = true, + RepeatJob = true, + ToolLoosening = ToolLoosening.EnableOnlyOnNokTightenings, + Reserved = Reserved.G, + ParameterSetList = parameterSets + }; + } } } diff --git a/src/MIDTesters.Core/Job/TestMid0034.cs b/src/MIDTesters.Core/Job/TestMid0034.cs index e7d5283e..a4f68e0d 100644 --- a/src/MIDTesters.Core/Job/TestMid0034.cs +++ b/src/MIDTesters.Core/Job/TestMid0034.cs @@ -29,5 +29,14 @@ public void Mid0034ByteAllRevisions() Assert.AreEqual(typeof(Mid0034), mid.GetType()); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Pack")] + public void Mid0034PackAllRevisions() + { + string package = "00200034001 "; + + AssertBuildAndParse(package, new Mid0034()); + } } } diff --git a/src/MIDTesters.Core/Job/TestMid0035.cs b/src/MIDTesters.Core/Job/TestMid0035.cs index 985c85aa..3dc89e9e 100644 --- a/src/MIDTesters.Core/Job/TestMid0035.cs +++ b/src/MIDTesters.Core/Job/TestMid0035.cs @@ -1,5 +1,7 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; using OpenProtocolInterpreter.Job; +using System; namespace MIDTesters.Job { @@ -14,12 +16,12 @@ public void Mid0035Revision1() string package = "00630035001 0101020030040008050003062001-12-01:20:12:45"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.JobStatus); - Assert.IsNotNull(mid.JobBatchMode); - Assert.IsNotNull(mid.JobBatchSize); - Assert.IsNotNull(mid.JobBatchCounter); - Assert.IsNotNull(mid.TimeStamp); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual(JobStatus.NotCompleted, mid.JobStatus); + Assert.AreEqual(JobBatchMode.OnlyOkTightenings, mid.JobBatchMode); + Assert.AreEqual(8, mid.JobBatchSize); + Assert.AreEqual(3, mid.JobBatchCounter); + Assert.AreEqual(new DateTime(2001, 12, 1, 20, 12, 45), mid.TimeStamp); AssertEqualPackages(package, mid); } @@ -31,12 +33,12 @@ public void Mid0035ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.JobStatus); - Assert.IsNotNull(mid.JobBatchMode); - Assert.IsNotNull(mid.JobBatchSize); - Assert.IsNotNull(mid.JobBatchCounter); - Assert.IsNotNull(mid.TimeStamp); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual(JobStatus.NotCompleted, mid.JobStatus); + Assert.AreEqual(JobBatchMode.OnlyOkTightenings, mid.JobBatchMode); + Assert.AreEqual(8, mid.JobBatchSize); + Assert.AreEqual(3, mid.JobBatchCounter); + Assert.AreEqual(new DateTime(2001, 12, 1, 20, 12, 45), mid.TimeStamp); AssertEqualPackages(bytes, mid); } @@ -47,12 +49,12 @@ public void Mid0035Revision2() string package = "00650035002 010001020030040008050003062001-12-01:20:12:45"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.JobStatus); - Assert.IsNotNull(mid.JobBatchMode); - Assert.IsNotNull(mid.JobBatchSize); - Assert.IsNotNull(mid.JobBatchCounter); - Assert.IsNotNull(mid.TimeStamp); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual(JobStatus.NotCompleted, mid.JobStatus); + Assert.AreEqual(JobBatchMode.OnlyOkTightenings, mid.JobBatchMode); + Assert.AreEqual(8, mid.JobBatchSize); + Assert.AreEqual(3, mid.JobBatchCounter); + Assert.AreEqual(new DateTime(2001, 12, 1, 20, 12, 45), mid.TimeStamp); AssertEqualPackages(package, mid); } @@ -64,12 +66,12 @@ public void Mid0035ByteRevision2() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.JobStatus); - Assert.IsNotNull(mid.JobBatchMode); - Assert.IsNotNull(mid.JobBatchSize); - Assert.IsNotNull(mid.JobBatchCounter); - Assert.IsNotNull(mid.TimeStamp); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual(JobStatus.NotCompleted, mid.JobStatus); + Assert.AreEqual(JobBatchMode.OnlyOkTightenings, mid.JobBatchMode); + Assert.AreEqual(8, mid.JobBatchSize); + Assert.AreEqual(3, mid.JobBatchCounter); + Assert.AreEqual(new DateTime(2001, 12, 1, 20, 12, 45), mid.TimeStamp); AssertEqualPackages(bytes, mid); } @@ -80,15 +82,15 @@ public void Mid0035Revision3() string package = "00790035003 010001020030040008050003062001-12-01:20:12:4507120080100912"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.JobStatus); - Assert.IsNotNull(mid.JobBatchMode); - Assert.IsNotNull(mid.JobBatchSize); - Assert.IsNotNull(mid.JobBatchCounter); - Assert.IsNotNull(mid.TimeStamp); - Assert.IsNotNull(mid.JobCurrentStep); - Assert.IsNotNull(mid.JobTotalNumberOfSteps); - Assert.IsNotNull(mid.JobStepType); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual(JobStatus.NotCompleted, mid.JobStatus); + Assert.AreEqual(JobBatchMode.OnlyOkTightenings, mid.JobBatchMode); + Assert.AreEqual(8, mid.JobBatchSize); + Assert.AreEqual(3, mid.JobBatchCounter); + Assert.AreEqual(new DateTime(2001, 12, 1, 20, 12, 45), mid.TimeStamp); + Assert.AreEqual(120, mid.JobCurrentStep); + Assert.AreEqual(10, mid.JobTotalNumberOfSteps); + Assert.AreEqual(12, mid.JobStepType); AssertEqualPackages(package, mid); } @@ -100,15 +102,15 @@ public void Mid0035ByteRevision3() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.JobStatus); - Assert.IsNotNull(mid.JobBatchMode); - Assert.IsNotNull(mid.JobBatchSize); - Assert.IsNotNull(mid.JobBatchCounter); - Assert.IsNotNull(mid.TimeStamp); - Assert.IsNotNull(mid.JobCurrentStep); - Assert.IsNotNull(mid.JobTotalNumberOfSteps); - Assert.IsNotNull(mid.JobStepType); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual(JobStatus.NotCompleted, mid.JobStatus); + Assert.AreEqual(JobBatchMode.OnlyOkTightenings, mid.JobBatchMode); + Assert.AreEqual(8, mid.JobBatchSize); + Assert.AreEqual(3, mid.JobBatchCounter); + Assert.AreEqual(new DateTime(2001, 12, 1, 20, 12, 45), mid.TimeStamp); + Assert.AreEqual(120, mid.JobCurrentStep); + Assert.AreEqual(10, mid.JobTotalNumberOfSteps); + Assert.AreEqual(12, mid.JobStepType); AssertEqualPackages(bytes, mid); } @@ -119,16 +121,16 @@ public void Mid0035Revision4() string package = "00830035004 010001020030040008050003062001-12-01:20:12:45071200801009121001"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.JobStatus); - Assert.IsNotNull(mid.JobBatchMode); - Assert.IsNotNull(mid.JobBatchSize); - Assert.IsNotNull(mid.JobBatchCounter); - Assert.IsNotNull(mid.TimeStamp); - Assert.IsNotNull(mid.JobCurrentStep); - Assert.IsNotNull(mid.JobTotalNumberOfSteps); - Assert.IsNotNull(mid.JobStepType); - Assert.IsNotNull(mid.JobTighteningStatus); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual(JobStatus.NotCompleted, mid.JobStatus); + Assert.AreEqual(JobBatchMode.OnlyOkTightenings, mid.JobBatchMode); + Assert.AreEqual(8, mid.JobBatchSize); + Assert.AreEqual(3, mid.JobBatchCounter); + Assert.AreEqual(new DateTime(2001, 12, 1, 20, 12, 45), mid.TimeStamp); + Assert.AreEqual(120, mid.JobCurrentStep); + Assert.AreEqual(10, mid.JobTotalNumberOfSteps); + Assert.AreEqual(12, mid.JobStepType); + Assert.AreEqual(JobTighteningStatus.Nok, mid.JobTighteningStatus); AssertEqualPackages(package, mid); } @@ -140,16 +142,16 @@ public void Mid0035ByteRevision4() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.JobStatus); - Assert.IsNotNull(mid.JobBatchMode); - Assert.IsNotNull(mid.JobBatchSize); - Assert.IsNotNull(mid.JobBatchCounter); - Assert.IsNotNull(mid.TimeStamp); - Assert.IsNotNull(mid.JobCurrentStep); - Assert.IsNotNull(mid.JobTotalNumberOfSteps); - Assert.IsNotNull(mid.JobStepType); - Assert.IsNotNull(mid.JobTighteningStatus); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual(JobStatus.NotCompleted, mid.JobStatus); + Assert.AreEqual(JobBatchMode.OnlyOkTightenings, mid.JobBatchMode); + Assert.AreEqual(8, mid.JobBatchSize); + Assert.AreEqual(3, mid.JobBatchCounter); + Assert.AreEqual(new DateTime(2001, 12, 1, 20, 12, 45), mid.TimeStamp); + Assert.AreEqual(120, mid.JobCurrentStep); + Assert.AreEqual(10, mid.JobTotalNumberOfSteps); + Assert.AreEqual(12, mid.JobStepType); + Assert.AreEqual(JobTighteningStatus.Nok, mid.JobTighteningStatus); AssertEqualPackages(bytes, mid); } @@ -160,21 +162,21 @@ public void Mid0035Revision5() string package = "01980035005 010001020030040008050003062001-12-01:20:12:45071200801009121001111234512VINVINN12345678912345678913IdentifierResultPart2xxxx14IdentifierResultPart3xxxx15IdentifierResultPart4xxxx"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.JobStatus); - Assert.IsNotNull(mid.JobBatchMode); - Assert.IsNotNull(mid.JobBatchSize); - Assert.IsNotNull(mid.JobBatchCounter); - Assert.IsNotNull(mid.TimeStamp); - Assert.IsNotNull(mid.JobCurrentStep); - Assert.IsNotNull(mid.JobTotalNumberOfSteps); - Assert.IsNotNull(mid.JobStepType); - Assert.IsNotNull(mid.JobTighteningStatus); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual(JobStatus.NotCompleted, mid.JobStatus); + Assert.AreEqual(JobBatchMode.OnlyOkTightenings, mid.JobBatchMode); + Assert.AreEqual(8, mid.JobBatchSize); + Assert.AreEqual(3, mid.JobBatchCounter); + Assert.AreEqual(new DateTime(2001, 12, 1, 20, 12, 45), mid.TimeStamp); + Assert.AreEqual(120, mid.JobCurrentStep); + Assert.AreEqual(10, mid.JobTotalNumberOfSteps); + Assert.AreEqual(12, mid.JobStepType); + Assert.AreEqual(JobTighteningStatus.Nok, mid.JobTighteningStatus); + Assert.AreEqual(12345, mid.JobSequenceNumber); + Assert.AreEqual("VINVINN123456789123456789", mid.VinNumber); + Assert.AreEqual("IdentifierResultPart2xxxx", mid.IdentifierResultPart2); + Assert.AreEqual("IdentifierResultPart3xxxx", mid.IdentifierResultPart3); + Assert.AreEqual("IdentifierResultPart4xxxx", mid.IdentifierResultPart4); AssertEqualPackages(package, mid); } @@ -186,22 +188,123 @@ public void Mid0035ByteRevision5() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.JobStatus); - Assert.IsNotNull(mid.JobBatchMode); - Assert.IsNotNull(mid.JobBatchSize); - Assert.IsNotNull(mid.JobBatchCounter); - Assert.IsNotNull(mid.TimeStamp); - Assert.IsNotNull(mid.JobCurrentStep); - Assert.IsNotNull(mid.JobTotalNumberOfSteps); - Assert.IsNotNull(mid.JobStepType); - Assert.IsNotNull(mid.JobTighteningStatus); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual(JobStatus.NotCompleted, mid.JobStatus); + Assert.AreEqual(JobBatchMode.OnlyOkTightenings, mid.JobBatchMode); + Assert.AreEqual(8, mid.JobBatchSize); + Assert.AreEqual(3, mid.JobBatchCounter); + Assert.AreEqual(new DateTime(2001, 12, 1, 20, 12, 45), mid.TimeStamp); + Assert.AreEqual(120, mid.JobCurrentStep); + Assert.AreEqual(10, mid.JobTotalNumberOfSteps); + Assert.AreEqual(12, mid.JobStepType); + Assert.AreEqual(JobTighteningStatus.Nok, mid.JobTighteningStatus); + Assert.AreEqual(12345, mid.JobSequenceNumber); + Assert.AreEqual("VINVINN123456789123456789", mid.VinNumber); + Assert.AreEqual("IdentifierResultPart2xxxx", mid.IdentifierResultPart2); + Assert.AreEqual("IdentifierResultPart3xxxx", mid.IdentifierResultPart3); + Assert.AreEqual("IdentifierResultPart4xxxx", mid.IdentifierResultPart4); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0035PackRevision1() + { + string package = "00630035001 0101020030040008050003062001-12-01:20:12:45"; + + AssertBuildAndParse(package, new Mid0035(1) + { + JobId = 1, + JobStatus = JobStatus.NotCompleted, + JobBatchMode = JobBatchMode.OnlyOkTightenings, + JobBatchSize = 8, + JobBatchCounter = 3, + TimeStamp = new DateTime(2001, 12, 1, 20, 12, 45) + }); + } + + [TestMethod] + [TestCategory("Revision 2"), TestCategory("Pack")] + public void Mid0035PackRevision2() + { + string package = "00650035002 010001020030040008050003062001-12-01:20:12:45"; + + AssertBuildAndParse(package, new Mid0035(2) + { + JobId = 1, + JobStatus = JobStatus.NotCompleted, + JobBatchMode = JobBatchMode.OnlyOkTightenings, + JobBatchSize = 8, + JobBatchCounter = 3, + TimeStamp = new DateTime(2001, 12, 1, 20, 12, 45) + }); + } + + [TestMethod] + [TestCategory("Revision 3"), TestCategory("Pack")] + public void Mid0035PackRevision3() + { + string package = "00790035003 010001020030040008050003062001-12-01:20:12:4507120080100912"; + + AssertBuildAndParse(package, new Mid0035(3) + { + JobId = 1, + JobStatus = JobStatus.NotCompleted, + JobBatchMode = JobBatchMode.OnlyOkTightenings, + JobBatchSize = 8, + JobBatchCounter = 3, + TimeStamp = new DateTime(2001, 12, 1, 20, 12, 45), + JobCurrentStep = 120, + JobTotalNumberOfSteps = 10, + JobStepType = 12 + }); + } + + [TestMethod] + [TestCategory("Revision 4"), TestCategory("Pack")] + public void Mid0035PackRevision4() + { + string package = "00830035004 010001020030040008050003062001-12-01:20:12:45071200801009121001"; + + AssertBuildAndParse(package, new Mid0035(4) + { + JobId = 1, + JobStatus = JobStatus.NotCompleted, + JobBatchMode = JobBatchMode.OnlyOkTightenings, + JobBatchSize = 8, + JobBatchCounter = 3, + TimeStamp = new DateTime(2001, 12, 1, 20, 12, 45), + JobCurrentStep = 120, + JobTotalNumberOfSteps = 10, + JobStepType = 12, + JobTighteningStatus = JobTighteningStatus.Nok + }); + } + + [TestMethod] + [TestCategory("Revision 5"), TestCategory("Pack")] + public void Mid0035PackRevision5() + { + string package = "01980035005 010001020030040008050003062001-12-01:20:12:45071200801009121001111234512VINVINN12345678912345678913IdentifierResultPart2xxxx14IdentifierResultPart3xxxx15IdentifierResultPart4xxxx"; + + AssertBuildAndParse(package, new Mid0035(5) + { + JobId = 1, + JobStatus = JobStatus.NotCompleted, + JobBatchMode = JobBatchMode.OnlyOkTightenings, + JobBatchSize = 8, + JobBatchCounter = 3, + TimeStamp = new DateTime(2001, 12, 1, 20, 12, 45), + JobCurrentStep = 120, + JobTotalNumberOfSteps = 10, + JobStepType = 12, + JobTighteningStatus = JobTighteningStatus.Nok, + JobSequenceNumber = 12345, + VinNumber = "VINVINN123456789123456789", + IdentifierResultPart2 = "IdentifierResultPart2xxxx", + IdentifierResultPart3 = "IdentifierResultPart3xxxx", + IdentifierResultPart4 = "IdentifierResultPart4xxxx" + }); + } } } diff --git a/src/MIDTesters.Core/Job/TestMid0036.cs b/src/MIDTesters.Core/Job/TestMid0036.cs index 91546d09..ca60da8e 100644 --- a/src/MIDTesters.Core/Job/TestMid0036.cs +++ b/src/MIDTesters.Core/Job/TestMid0036.cs @@ -29,5 +29,14 @@ public void Mid0036ByteAllRevisions() Assert.AreEqual(typeof(Mid0036), mid.GetType()); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Pack")] + public void Mid0036PackAllRevisions() + { + string package = "00200036001 "; + + AssertBuildAndParse(package, new Mid0036()); + } } } diff --git a/src/MIDTesters.Core/Job/TestMid0037.cs b/src/MIDTesters.Core/Job/TestMid0037.cs index e399f14a..5bea56d4 100644 --- a/src/MIDTesters.Core/Job/TestMid0037.cs +++ b/src/MIDTesters.Core/Job/TestMid0037.cs @@ -29,5 +29,14 @@ public void Mid0037ByteAllRevisions() Assert.AreEqual(typeof(Mid0037), mid.GetType()); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Pack")] + public void Mid0037PackAllRevisions() + { + string package = "00200037001 "; + + AssertBuildAndParse(package, new Mid0037()); + } } } diff --git a/src/MIDTesters.Core/Job/TestMid0038.cs b/src/MIDTesters.Core/Job/TestMid0038.cs index bc412f1b..827f33ec 100644 --- a/src/MIDTesters.Core/Job/TestMid0038.cs +++ b/src/MIDTesters.Core/Job/TestMid0038.cs @@ -54,15 +54,27 @@ public void Mid0038ByteRevision2() } [TestMethod] - [TestCategory("Revision 2"), TestCategory("ByteArray")] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0038PackRevision1() + { + string package = "00220038001 01"; + + AssertBuildAndParse(package, new Mid0038(1) + { + JobId = 1 + }); + } + + [TestMethod] + [TestCategory("Revision 2"), TestCategory("Pack")] public void Mid0038PackRevision2() { - var mid = new Mid0038(2); - mid.JobId = 1; - var actual = mid.PackBytes(); - var package = "00240038002 0001"; + string package = "00240038002 0001"; - CollectionAssert.AreEqual(GetAsciiBytes(package), actual); + AssertBuildAndParse(package, new Mid0038(2) + { + JobId = 1 + }); } } } diff --git a/src/MIDTesters.Core/Job/TestMid0039.cs b/src/MIDTesters.Core/Job/TestMid0039.cs index de70ac17..8113ec38 100644 --- a/src/MIDTesters.Core/Job/TestMid0039.cs +++ b/src/MIDTesters.Core/Job/TestMid0039.cs @@ -14,7 +14,7 @@ public void Mid0039Revision1() string package = "00220039001 01"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.JobId); + Assert.AreEqual(1, mid.JobId); AssertEqualPackages(package, mid); } @@ -26,7 +26,7 @@ public void Mid0039ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.JobId); + Assert.AreEqual(1, mid.JobId); AssertEqualPackages(bytes, mid); } @@ -37,7 +37,7 @@ public void Mid0039Revision2() string package = "00240039002 0003"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.JobId); + Assert.AreEqual(3, mid.JobId); AssertEqualPackages(package, mid); } @@ -49,8 +49,32 @@ public void Mid0039ByteRevision2() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.JobId); + Assert.AreEqual(3, mid.JobId); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0039PackRevision1() + { + string package = "00220039001 01"; + + AssertBuildAndParse(package, new Mid0039(1) + { + JobId = 1 + }); + } + + [TestMethod] + [TestCategory("Revision 2"), TestCategory("Pack")] + public void Mid0039PackRevision2() + { + string package = "00240039002 0003"; + + AssertBuildAndParse(package, new Mid0039(2) + { + JobId = 3 + }); + } } } diff --git a/src/MIDTesters.Core/KeepAlive/TestMid9999.cs b/src/MIDTesters.Core/KeepAlive/TestMid9999.cs index f3084416..bcdf0c29 100644 --- a/src/MIDTesters.Core/KeepAlive/TestMid9999.cs +++ b/src/MIDTesters.Core/KeepAlive/TestMid9999.cs @@ -29,5 +29,16 @@ public void Mid9999ByteRevision1() Assert.AreEqual(typeof(Mid9999), mid.GetType()); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid9999PackRevision1() + { + string package = "00209999 "; + + AssertBuildAndParse(package, new Mid9999(1) + { + }, true); + } } } diff --git a/src/MIDTesters.Core/LinkCommunication/TestMid9997.cs b/src/MIDTesters.Core/LinkCommunication/TestMid9997.cs index a04ec3fd..04c0ddd4 100644 --- a/src/MIDTesters.Core/LinkCommunication/TestMid9997.cs +++ b/src/MIDTesters.Core/LinkCommunication/TestMid9997.cs @@ -14,7 +14,7 @@ public void Mid9997Revision1() string package = "00249997001 0061"; var mid = _midInterpreter.Parse(package); - Assert.AreNotEqual(0, mid.MidNumber); + Assert.AreEqual(61, mid.MidNumber); AssertEqualPackages(package, mid); } @@ -26,8 +26,20 @@ public void Mid9997ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.AreNotEqual(0, mid.MidNumber); + Assert.AreEqual(65, mid.MidNumber); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid9997PackRevision1() + { + string package = "00249997001 0061"; + + AssertBuildAndParse(package, new Mid9997() + { + MidNumber = 61 + }); + } } } diff --git a/src/MIDTesters.Core/LinkCommunication/TestMid9998.cs b/src/MIDTesters.Core/LinkCommunication/TestMid9998.cs index 309798b6..567eb355 100644 --- a/src/MIDTesters.Core/LinkCommunication/TestMid9998.cs +++ b/src/MIDTesters.Core/LinkCommunication/TestMid9998.cs @@ -1,4 +1,5 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; using OpenProtocolInterpreter.LinkCommunication; namespace MIDTesters.LinkCommunication @@ -14,8 +15,8 @@ public void Mid9998Revision1() string package = "00289998 00610003"; var mid = _midInterpreter.Parse(package); - Assert.AreNotEqual(0, mid.MidNumber); - Assert.IsNotNull(mid.ErrorCode); + Assert.AreEqual(61, mid.MidNumber); + Assert.AreEqual(LinkCommunicationError.InvalidSequenceNumber, mid.ErrorCode); AssertEqualPackages(package, mid, true); } @@ -27,9 +28,22 @@ public void Mid9998ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.AreNotEqual(0, mid.MidNumber); - Assert.IsNotNull(mid.ErrorCode); + Assert.AreEqual(61, mid.MidNumber); + Assert.AreEqual(LinkCommunicationError.InvalidSequenceNumber, mid.ErrorCode); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid9998PackRevision1() + { + string package = "00289998 00610003"; + + AssertBuildAndParse(package, new Mid9998() + { + MidNumber = 61, + ErrorCode = LinkCommunicationError.InvalidSequenceNumber + }, true); + } } } diff --git a/src/MIDTesters.Core/MIDsTests.cs b/src/MIDTesters.Core/MIDsTests.cs deleted file mode 100644 index b3092e6d..00000000 --- a/src/MIDTesters.Core/MIDsTests.cs +++ /dev/null @@ -1,69 +0,0 @@ -using OpenProtocolInterpreter; -using OpenProtocolInterpreter.Communication; -using OpenProtocolInterpreter.MotorTuning; -using OpenProtocolInterpreter.Tightening; -using System; -using System.Diagnostics; - -namespace MIDTesters -{ - //[Microsoft.VisualStudio.TestTools.UnitTesting.TestClass] - public class MIDsTests - { - //[Microsoft.VisualStudio.TestTools.UnitTesting.TestMethod] - public void TestProcessingTime() - { - long total = 0; - string mid61 = "02310061001 010001020103airbag7 04KPOL3456JKLO897 " + - "05000600307000008000009010011112000840130014001400120015000739160000017099991800000" + - "1900000202001-06-02:09:54:09212001-05-29:12:34:3322123345675 "; - //CustomMids - var watch = Stopwatch.StartNew(); - var myTEmplate = new MidInterpreter() - .UseAllMessages(new Type[] - { - typeof(Mid0001), - typeof(Mid0002), - typeof(Mid0003), - typeof(Mid0004), - typeof(Mid0061), - typeof(Mid0500), - typeof(Mid0501), - typeof(Mid0502), - typeof(Mid0503), - typeof(Mid0504) - }); - watch.Stop(); - Debug.WriteLine("[CustomMIDs] Elapsed time to construct MidInterpreter: " + new TimeSpan(watch.ElapsedTicks)); - - for (int i = 0; i < 1000000; i++) - { - - watch.Restart(); - var myMid106 = myTEmplate.Parse(mid61); - watch.Stop(); - total += watch.ElapsedTicks; - } - Debug.WriteLine($"[CustomMIDs] Total Elapsed: " + new TimeSpan(total)); - Debug.WriteLine($"[CustomMIDs] Average Elapsed Time: " + new TimeSpan(total / 1000000)); - - //All MIDs - watch.Start(); - myTEmplate = new MidInterpreter().UseAllMessages(); - watch.Stop(); - Debug.WriteLine("[AllMIDs] Elapsed time to construct MidInterpreter: " + new TimeSpan(watch.ElapsedTicks)); - - total = 0; - for (int i = 0; i < 1000000; i++) - { - watch.Restart(); - var myMid500 = myTEmplate.Parse(mid61); - watch.Stop(); - total += watch.ElapsedTicks; - } - - Debug.WriteLine($"[AllMIDs] Total Elapsed: " + new TimeSpan(total)); - Debug.WriteLine($"[AllMIDs] Average Elapsed Time: " + new TimeSpan(total / 1000000)); - } - } -} diff --git a/src/MIDTesters.Core/MidTester.cs b/src/MIDTesters.Core/MidTester.cs index 2737c9e2..3acfc628 100644 --- a/src/MIDTesters.Core/MidTester.cs +++ b/src/MIDTesters.Core/MidTester.cs @@ -1,8 +1,10 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; +using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenProtocolInterpreter; using System; +using System.Collections; using System.Collections.Generic; using System.Linq; +using System.Reflection; using System.Text; [assembly: Parallelize(Workers = 4, Scope = ExecutionScope.MethodLevel)] @@ -10,6 +12,8 @@ namespace MIDTesters { public abstract class MidTester { + private const int MaxComparisonDepth = 4; + protected readonly MidInterpreter _midInterpreter; public MidTester() @@ -45,5 +49,121 @@ protected void AssertEqualPackages(IReadOnlyCollection expected, Mid mid, mid.Header.StationId = mid.Header.SpindleId = null; CollectionAssert.AreEqual(expected.ToArray(), mid.PackBytes()); } + + /// + /// Packs a mid built from its properties (instead of parsed from a package) and asserts both + /// the string and the byte array representations match . + /// + protected void AssertPackedFromProperties(string expected, Mid built, bool useEmptyRevision = false) + { + if (useEmptyRevision) + { + built.Header.Revision = 0; + } + + built.Header.StationId = built.Header.SpindleId = null; + Assert.AreEqual(expected, built.Pack()); + CollectionAssert.AreEqual(GetAsciiBytes(expected), built.PackBytes()); + } + + /// + /// Reverse of the usual parse/re-pack test: packs a mid built from its properties, asserts the + /// package matches, then parses that package back and asserts every data field bound property + /// of the parsed mid holds the same value as the built one. + /// + protected TMid AssertBuildAndParse(string expected, TMid built, bool useEmptyRevision = false) where TMid : Mid + { + AssertPackedFromProperties(expected, built, useEmptyRevision); + + var parsed = _midInterpreter.Parse(expected); + AssertEqualDataFieldProperties(built, parsed, built.Header.StandardizedRevision); + return parsed; + } + + /// + /// Compares every public property decorated with a up to + /// between two instances, recursing into the collections a mid may hold. + /// + protected static void AssertEqualDataFieldProperties(object expected, object actual, int revision) + { + Assert.IsNotNull(actual, $"Expected an instance of {expected.GetType().Name} but got null"); + + foreach (var property in GetDataFieldProperties(expected.GetType(), revision)) + { + AssertEqualValues(property.GetValue(expected), + property.GetValue(actual), + $"{expected.GetType().Name}.{property.Name}", + 0); + } + } + + private static IEnumerable GetDataFieldProperties(Type type, int revision) + { + return type.GetProperties(BindingFlags.Public | BindingFlags.Instance) + .Where(x => x.GetCustomAttributes() + .Any(a => a.Revision <= revision)); + } + + private static void AssertEqualValues(object expected, object actual, string path, int depth) + { + if (expected is string || actual is string) + { + // Setting a property keeps the value as given while parsing hands back the padded field, + // so only the content is compared here. The padding itself is already covered by the + // exact package assertion made before the parse leg runs. + Assert.AreEqual((expected as string)?.Trim() ?? string.Empty, + (actual as string)?.Trim() ?? string.Empty, + $"{path} does not match"); + return; + } + + if (expected == null && actual == null) + return; + + Assert.IsNotNull(expected, $"{path}: built value is null but parsed value is '{actual}'"); + Assert.IsNotNull(actual, $"{path}: parsed value is null but built value is '{expected}'"); + + if (IsComparableValue(expected.GetType())) + { + Assert.AreEqual(expected, actual, $"{path} does not match"); + return; + } + + if (expected is IEnumerable expectedItems && actual is IEnumerable actualItems) + { + AssertEqualCollections(expectedItems, actualItems, path, depth); + return; + } + + if (depth >= MaxComparisonDepth) + return; + + foreach (var property in expected.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance)) + { + if (property.GetIndexParameters().Length > 0) + continue; + + AssertEqualValues(property.GetValue(expected), + property.GetValue(actual), + $"{path}.{property.Name}", + depth + 1); + } + } + + private static void AssertEqualCollections(IEnumerable expected, IEnumerable actual, string path, int depth) + { + var expectedList = expected.Cast().ToList(); + var actualList = actual.Cast().ToList(); + + Assert.AreEqual(expectedList.Count, actualList.Count, $"{path} has a different number of entries"); + + for (int i = 0; i < expectedList.Count; i++) + { + AssertEqualValues(expectedList[i], actualList[i], $"{path}[{i}]", depth + 1); + } + } + + private static bool IsComparableValue(Type type) + => type.IsPrimitive || type.IsEnum || type == typeof(string) || type == typeof(decimal) || type == typeof(DateTime); } } diff --git a/src/MIDTesters.Core/MotorTuning/TestMid0500.cs b/src/MIDTesters.Core/MotorTuning/TestMid0500.cs index 382a4e8f..8cc88b7a 100644 --- a/src/MIDTesters.Core/MotorTuning/TestMid0500.cs +++ b/src/MIDTesters.Core/MotorTuning/TestMid0500.cs @@ -29,5 +29,14 @@ public void Mid0500ByteRevision1() Assert.AreEqual(typeof(Mid0500), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0500PackRevision1() + { + string package = "00200500 "; + + AssertBuildAndParse(package, new Mid0500(), true); + } } } diff --git a/src/MIDTesters.Core/MotorTuning/TestMid0501.cs b/src/MIDTesters.Core/MotorTuning/TestMid0501.cs index f047e870..52e43de3 100644 --- a/src/MIDTesters.Core/MotorTuning/TestMid0501.cs +++ b/src/MIDTesters.Core/MotorTuning/TestMid0501.cs @@ -14,7 +14,7 @@ public void Mid0501Revision1() string package = "00230501 011"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.MotorTuneResult); + Assert.IsTrue(mid.MotorTuneResult); AssertEqualPackages(package, mid, true); } @@ -26,8 +26,20 @@ public void Mid0501ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.MotorTuneResult); + Assert.IsTrue(mid.MotorTuneResult); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0501PackRevision1() + { + string package = "00230501 011"; + + AssertBuildAndParse(package, new Mid0501() + { + MotorTuneResult = true + }, true); + } } } diff --git a/src/MIDTesters.Core/MotorTuning/TestMid0502.cs b/src/MIDTesters.Core/MotorTuning/TestMid0502.cs index 429a8cf1..e943f3c8 100644 --- a/src/MIDTesters.Core/MotorTuning/TestMid0502.cs +++ b/src/MIDTesters.Core/MotorTuning/TestMid0502.cs @@ -29,5 +29,14 @@ public void Mid0502ByteRevision1() Assert.AreEqual(typeof(Mid0502), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0502PackRevision1() + { + string package = "00200502 "; + + AssertBuildAndParse(package, new Mid0502(), true); + } } } diff --git a/src/MIDTesters.Core/MotorTuning/TestMid0503.cs b/src/MIDTesters.Core/MotorTuning/TestMid0503.cs index 48445d53..561cadc4 100644 --- a/src/MIDTesters.Core/MotorTuning/TestMid0503.cs +++ b/src/MIDTesters.Core/MotorTuning/TestMid0503.cs @@ -29,5 +29,14 @@ public void Mid0503ByteRevision1() Assert.AreEqual(typeof(Mid0503), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0503PackRevision1() + { + string package = "00200503 "; + + AssertBuildAndParse(package, new Mid0503(), true); + } } } diff --git a/src/MIDTesters.Core/MotorTuning/TestMid0504.cs b/src/MIDTesters.Core/MotorTuning/TestMid0504.cs index 632d51bd..5ac775d2 100644 --- a/src/MIDTesters.Core/MotorTuning/TestMid0504.cs +++ b/src/MIDTesters.Core/MotorTuning/TestMid0504.cs @@ -29,5 +29,14 @@ public void Mid0504ByteRevision1() Assert.AreEqual(typeof(Mid0504), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0504PackRevision1() + { + string package = "00200504 "; + + AssertBuildAndParse(package, new Mid0504(), true); + } } } diff --git a/src/MIDTesters.Core/MultiSpindle/TestMid0090.cs b/src/MIDTesters.Core/MultiSpindle/TestMid0090.cs index 51e39642..02bb97ee 100644 --- a/src/MIDTesters.Core/MultiSpindle/TestMid0090.cs +++ b/src/MIDTesters.Core/MultiSpindle/TestMid0090.cs @@ -31,5 +31,14 @@ public void Mid0090ByteRevision1() Assert.IsTrue(mid.Header.NoAckFlag); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Pack")] + public void Mid0090PackAllRevisions() + { + string pack = @"00200090 1 "; + + AssertBuildAndParse(pack, new Mid0090(noAckFlag: true), true); + } } } diff --git a/src/MIDTesters.Core/MultiSpindle/TestMid0091.cs b/src/MIDTesters.Core/MultiSpindle/TestMid0091.cs index 905738bc..d22b9385 100644 --- a/src/MIDTesters.Core/MultiSpindle/TestMid0091.cs +++ b/src/MIDTesters.Core/MultiSpindle/TestMid0091.cs @@ -1,6 +1,8 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenProtocolInterpreter.MultiSpindle; +using System.Collections.Generic; namespace MIDTesters.MultiSpindle { [TestClass] @@ -14,11 +16,11 @@ public void Mid0091AllRevisions() string pack = @"00670091 1 01020265535032017-01-25:10:20:20041050101102031"; var mid = _midInterpreter.Parse(pack); - Assert.IsNotNull(mid.NumberOfSpindles); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.Time); - Assert.IsNotNull(mid.SyncOverallStatus); - Assert.IsNotNull(mid.SpindlesStatus); + Assert.AreEqual(2, mid.NumberOfSpindles); + Assert.AreEqual(65535, mid.SyncTighteningId); + Assert.AreEqual(new DateTime(2017, 1, 25, 10, 20, 20), mid.Time); + Assert.IsTrue(mid.SyncOverallStatus); + Assert.AreEqual(2, mid.SpindlesStatus.Count); AssertEqualPackages(pack, mid, true); } @@ -30,12 +32,33 @@ public void Mid0091ByteAllRevisions() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.NumberOfSpindles); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.Time); - Assert.IsNotNull(mid.SyncOverallStatus); - Assert.IsNotNull(mid.SpindlesStatus); + Assert.AreEqual(2, mid.NumberOfSpindles); + Assert.AreEqual(65535, mid.SyncTighteningId); + Assert.AreEqual(new DateTime(2017, 1, 25, 10, 20, 20), mid.Time); + Assert.IsTrue(mid.SyncOverallStatus); + Assert.AreEqual(2, mid.SpindlesStatus.Count); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Pack")] + public void Mid0091PackAllRevisions() + { + string pack = @"00670091 1 01020265535032017-01-25:10:20:20041050101102031"; + + AssertBuildAndParse(pack, new Mid0091() + { + Header = { NoAckFlag = true }, + NumberOfSpindles = 2, + SyncTighteningId = 65535, + Time = new DateTime(2017, 1, 25, 10, 20, 20), + SyncOverallStatus = true, + SpindlesStatus = new List() + { + new SpindleStatus() { SpindleNumber = 1, ChannelId = 1, SyncOverallStatus = true }, + new SpindleStatus() { SpindleNumber = 2, ChannelId = 3, SyncOverallStatus = true } + } + }, true); + } } } diff --git a/src/MIDTesters.Core/MultiSpindle/TestMid0092.cs b/src/MIDTesters.Core/MultiSpindle/TestMid0092.cs index 0dcb5aba..1a5b2229 100644 --- a/src/MIDTesters.Core/MultiSpindle/TestMid0092.cs +++ b/src/MIDTesters.Core/MultiSpindle/TestMid0092.cs @@ -29,5 +29,14 @@ public void Mid0092ByteAllRevisions() Assert.AreEqual(typeof(Mid0092), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Pack")] + public void Mid0092PackAllRevisions() + { + string pack = @"00200092 "; + + AssertBuildAndParse(pack, new Mid0092(), true); + } } } diff --git a/src/MIDTesters.Core/MultiSpindle/TestMid0093.cs b/src/MIDTesters.Core/MultiSpindle/TestMid0093.cs index ff89a480..21b3d574 100644 --- a/src/MIDTesters.Core/MultiSpindle/TestMid0093.cs +++ b/src/MIDTesters.Core/MultiSpindle/TestMid0093.cs @@ -29,5 +29,14 @@ public void Mid0093ByteAllRevisions() Assert.AreEqual(typeof(Mid0093), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Pack")] + public void Mid0093PackAllRevisions() + { + string pack = @"00200093 "; + + AssertBuildAndParse(pack, new Mid0093(), true); + } } } diff --git a/src/MIDTesters.Core/MultiSpindle/TestMid0100.cs b/src/MIDTesters.Core/MultiSpindle/TestMid0100.cs index 82a53157..992f83c0 100644 --- a/src/MIDTesters.Core/MultiSpindle/TestMid0100.cs +++ b/src/MIDTesters.Core/MultiSpindle/TestMid0100.cs @@ -38,7 +38,7 @@ public void Mid0100Revision2() var mid = _midInterpreter.Parse(pack); Assert.AreEqual(typeof(Mid0100), mid.GetType()); - Assert.IsNotNull(mid.DataNumberSystem); + Assert.AreEqual(123456789L, mid.DataNumberSystem); AssertEqualPackages(pack, mid); } @@ -51,7 +51,7 @@ public void Mid0100ByteRevision2() var mid = _midInterpreter.Parse(bytes); Assert.AreEqual(typeof(Mid0100), mid.GetType()); - Assert.IsNotNull(mid.DataNumberSystem); + Assert.AreEqual(123456789L, mid.DataNumberSystem); AssertEqualPackages(bytes, mid); } @@ -63,8 +63,8 @@ public void Mid0100Revision3() var mid = _midInterpreter.Parse(pack); Assert.AreEqual(typeof(Mid0100), mid.GetType()); - Assert.IsNotNull(mid.DataNumberSystem); - Assert.IsNotNull(mid.SendOnlyNewData); + Assert.AreEqual(123456789L, mid.DataNumberSystem); + Assert.IsTrue(mid.SendOnlyNewData); AssertEqualPackages(pack, mid); } @@ -77,9 +77,43 @@ public void Mid0100ByteRevision3() var mid = _midInterpreter.Parse(bytes); Assert.AreEqual(typeof(Mid0100), mid.GetType()); - Assert.IsNotNull(mid.DataNumberSystem); - Assert.IsNotNull(mid.SendOnlyNewData); + Assert.AreEqual(123456789L, mid.DataNumberSystem); + Assert.IsTrue(mid.SendOnlyNewData); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0100PackRevision1() + { + string pack = @"00200100001 "; + + AssertBuildAndParse(pack, new Mid0100(1)); + } + + [TestMethod] + [TestCategory("Revision 2"), TestCategory("Pack")] + public void Mid0100PackRevision2() + { + string pack = @"00300100002 0123456789"; + + AssertBuildAndParse(pack, new Mid0100(2) + { + DataNumberSystem = 123456789L + }); + } + + [TestMethod] + [TestCategory("Revision 3"), TestCategory("Pack")] + public void Mid0100PackRevision3() + { + string pack = @"00310100003 01234567891"; + + AssertBuildAndParse(pack, new Mid0100(3) + { + DataNumberSystem = 123456789L, + SendOnlyNewData = true + }); + } } } diff --git a/src/MIDTesters.Core/MultiSpindle/TestMid0101.cs b/src/MIDTesters.Core/MultiSpindle/TestMid0101.cs index 8e300f37..ecf75b31 100644 --- a/src/MIDTesters.Core/MultiSpindle/TestMid0101.cs +++ b/src/MIDTesters.Core/MultiSpindle/TestMid0101.cs @@ -1,6 +1,9 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; using OpenProtocolInterpreter.MultiSpindle; +using System.Collections.Generic; namespace MIDTesters.MultiSpindle { [TestClass] @@ -11,28 +14,28 @@ public class TestMid0101 : DefaultMidTests [TestCategory("Revision 1"), TestCategory("Revision 2"), TestCategory("Revision 3"), TestCategory("ASCII")] public void Mid0101Revisions1To3() { - var pack = "01920101001 010102BM3GA02111900601 030304003050001060001071080006800900092010000800110000012000151300000142019-11-14:14:08:05152019-11-25:11:22:41160091317118010111000809100000"; + var pack = "02100101001 010202BM3GA02111900601 030304003050001060001071080006800900092010000800110000012000151300000142019-11-14:14:08:05152019-11-25:11:22:41160091317118010111000809100000020111000809100000"; var mid = _midInterpreter.Parse(pack); Assert.AreEqual(typeof(Mid0101), mid.GetType()); - Assert.IsNotNull(mid.NumberOfSpindlesOrPresses); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueOrForceMinLimit); - Assert.IsNotNull(mid.TorqueOrForceMaxLimit); - Assert.IsNotNull(mid.TorqueOrForceFinalTarget); - Assert.IsNotNull(mid.AngleOrStrokeMinLimit); - Assert.IsNotNull(mid.AngleOrStrokeMaxLimit); - Assert.IsNotNull(mid.FinalAngleOrStrokeTarget); - Assert.IsNotNull(mid.LastChangeInParameterSet); - Assert.IsNotNull(mid.TimeStamp); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.SyncOverallStatus); - Assert.IsNotNull(mid.SpindlesOrPressesStatus); + Assert.AreEqual(2, mid.NumberOfSpindlesOrPresses); + Assert.AreEqual("BM3GA02111900601", mid.VinNumber.TrimEnd()); + Assert.AreEqual(3, mid.JobId); + Assert.AreEqual(3, mid.ParameterSetId); + Assert.AreEqual(1, mid.BatchSize); + Assert.AreEqual(1, mid.BatchCounter); + Assert.AreEqual(BatchStatus.Ok, mid.BatchStatus); + Assert.AreEqual(6.80m, mid.TorqueOrForceMinLimit); + Assert.AreEqual(9.20m, mid.TorqueOrForceMaxLimit); + Assert.AreEqual(8.00m, mid.TorqueOrForceFinalTarget); + Assert.AreEqual(0.00m, mid.AngleOrStrokeMinLimit); + Assert.AreEqual(0.15m, mid.AngleOrStrokeMaxLimit); + Assert.AreEqual(0.00m, mid.FinalAngleOrStrokeTarget); + Assert.AreEqual(new DateTime(2019, 11, 14, 14, 8, 5), mid.LastChangeInParameterSet); + Assert.AreEqual(new DateTime(2019, 11, 25, 11, 22, 41), mid.TimeStamp); + Assert.AreEqual(913, mid.SyncTighteningId); + Assert.IsTrue(mid.SyncOverallStatus); + Assert.AreEqual(2, mid.SpindlesOrPressesStatus.Count); AssertEqualPackages(pack, mid); } @@ -40,29 +43,29 @@ public void Mid0101Revisions1To3() [TestCategory("Revision 1"), TestCategory("Revision 2"), TestCategory("Revision 3"), TestCategory("ByteArray")] public void Mid0101ByteRevisions1To3() { - string package = "01920101001 010102BM3GA02111900601 030304003050001060001071080006800900092010000800110000012000151300000142019-11-14:14:08:05152019-11-25:11:22:41160091317118010111000809100000"; + string package = "02100101001 010202BM3GA02111900601 030304003050001060001071080006800900092010000800110000012000151300000142019-11-14:14:08:05152019-11-25:11:22:41160091317118010111000809100000020111000809100000"; byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); Assert.AreEqual(typeof(Mid0101), mid.GetType()); - Assert.IsNotNull(mid.NumberOfSpindlesOrPresses); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueOrForceMinLimit); - Assert.IsNotNull(mid.TorqueOrForceMaxLimit); - Assert.IsNotNull(mid.TorqueOrForceFinalTarget); - Assert.IsNotNull(mid.AngleOrStrokeMinLimit); - Assert.IsNotNull(mid.AngleOrStrokeMaxLimit); - Assert.IsNotNull(mid.FinalAngleOrStrokeTarget); - Assert.IsNotNull(mid.LastChangeInParameterSet); - Assert.IsNotNull(mid.TimeStamp); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.SyncOverallStatus); - Assert.IsNotNull(mid.SpindlesOrPressesStatus); + Assert.AreEqual(2, mid.NumberOfSpindlesOrPresses); + Assert.AreEqual("BM3GA02111900601", mid.VinNumber.TrimEnd()); + Assert.AreEqual(3, mid.JobId); + Assert.AreEqual(3, mid.ParameterSetId); + Assert.AreEqual(1, mid.BatchSize); + Assert.AreEqual(1, mid.BatchCounter); + Assert.AreEqual(BatchStatus.Ok, mid.BatchStatus); + Assert.AreEqual(6.80m, mid.TorqueOrForceMinLimit); + Assert.AreEqual(9.20m, mid.TorqueOrForceMaxLimit); + Assert.AreEqual(8.00m, mid.TorqueOrForceFinalTarget); + Assert.AreEqual(0.00m, mid.AngleOrStrokeMinLimit); + Assert.AreEqual(0.15m, mid.AngleOrStrokeMaxLimit); + Assert.AreEqual(0.00m, mid.FinalAngleOrStrokeTarget); + Assert.AreEqual(new DateTime(2019, 11, 14, 14, 8, 5), mid.LastChangeInParameterSet); + Assert.AreEqual(new DateTime(2019, 11, 25, 11, 22, 41), mid.TimeStamp); + Assert.AreEqual(913, mid.SyncTighteningId); + Assert.IsTrue(mid.SyncOverallStatus); + Assert.AreEqual(2, mid.SpindlesOrPressesStatus.Count); AssertEqualPackages(bytes, mid); } @@ -70,29 +73,29 @@ public void Mid0101ByteRevisions1To3() [TestCategory("Revision 4"), TestCategory("ASCII")] public void Mid0101Revision4() { - var pack = "01970101004 010102BM3GA02111900601 030304003050001060001071080006800900092010000800110000012000151300000142019-11-14:14:08:05152019-11-25:11:22:4116009131711801011100080910000019002"; + var pack = "02150101004 010202BM3GA02111900601 030304003050001060001071080006800900092010000800110000012000151300000142019-11-14:14:08:05152019-11-25:11:22:4116009131711801011100080910000002011100080910000019002"; var mid = _midInterpreter.Parse(pack); Assert.AreEqual(typeof(Mid0101), mid.GetType()); - Assert.IsNotNull(mid.NumberOfSpindlesOrPresses); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueOrForceMinLimit); - Assert.IsNotNull(mid.TorqueOrForceMaxLimit); - Assert.IsNotNull(mid.TorqueOrForceFinalTarget); - Assert.IsNotNull(mid.AngleOrStrokeMinLimit); - Assert.IsNotNull(mid.AngleOrStrokeMaxLimit); - Assert.IsNotNull(mid.FinalAngleOrStrokeTarget); - Assert.IsNotNull(mid.LastChangeInParameterSet); - Assert.IsNotNull(mid.TimeStamp); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.SyncOverallStatus); - Assert.IsNotNull(mid.SpindlesOrPressesStatus); - Assert.IsNotNull(mid.SystemSubType); + Assert.AreEqual(2, mid.NumberOfSpindlesOrPresses); + Assert.AreEqual("BM3GA02111900601", mid.VinNumber.TrimEnd()); + Assert.AreEqual(3, mid.JobId); + Assert.AreEqual(3, mid.ParameterSetId); + Assert.AreEqual(1, mid.BatchSize); + Assert.AreEqual(1, mid.BatchCounter); + Assert.AreEqual(BatchStatus.Ok, mid.BatchStatus); + Assert.AreEqual(6.80m, mid.TorqueOrForceMinLimit); + Assert.AreEqual(9.20m, mid.TorqueOrForceMaxLimit); + Assert.AreEqual(8.00m, mid.TorqueOrForceFinalTarget); + Assert.AreEqual(0.00m, mid.AngleOrStrokeMinLimit); + Assert.AreEqual(0.15m, mid.AngleOrStrokeMaxLimit); + Assert.AreEqual(0.00m, mid.FinalAngleOrStrokeTarget); + Assert.AreEqual(new DateTime(2019, 11, 14, 14, 8, 5), mid.LastChangeInParameterSet); + Assert.AreEqual(new DateTime(2019, 11, 25, 11, 22, 41), mid.TimeStamp); + Assert.AreEqual(913, mid.SyncTighteningId); + Assert.IsTrue(mid.SyncOverallStatus); + Assert.AreEqual(2, mid.SpindlesOrPressesStatus.Count); + Assert.AreEqual(SystemSubType.SystemRunningPresses, mid.SystemSubType); AssertEqualPackages(pack, mid); } @@ -100,30 +103,30 @@ public void Mid0101Revision4() [TestCategory("Revision 4"), TestCategory("ByteArray")] public void Mid0101ByteRevision4() { - var package = "01970101004 010102BM3GA02111900601 030304003050001060001071080006800900092010000800110000012000151300000142019-11-14:14:08:05152019-11-25:11:22:4116009131711801011100080910000019002"; + var package = "02150101004 010202BM3GA02111900601 030304003050001060001071080006800900092010000800110000012000151300000142019-11-14:14:08:05152019-11-25:11:22:4116009131711801011100080910000002011100080910000019002"; byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); Assert.AreEqual(typeof(Mid0101), mid.GetType()); - Assert.IsNotNull(mid.NumberOfSpindlesOrPresses); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueOrForceMinLimit); - Assert.IsNotNull(mid.TorqueOrForceMaxLimit); - Assert.IsNotNull(mid.TorqueOrForceFinalTarget); - Assert.IsNotNull(mid.AngleOrStrokeMinLimit); - Assert.IsNotNull(mid.AngleOrStrokeMaxLimit); - Assert.IsNotNull(mid.FinalAngleOrStrokeTarget); - Assert.IsNotNull(mid.LastChangeInParameterSet); - Assert.IsNotNull(mid.TimeStamp); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.SyncOverallStatus); - Assert.IsNotNull(mid.SpindlesOrPressesStatus); - Assert.IsNotNull(mid.SystemSubType); + Assert.AreEqual(2, mid.NumberOfSpindlesOrPresses); + Assert.AreEqual("BM3GA02111900601", mid.VinNumber.TrimEnd()); + Assert.AreEqual(3, mid.JobId); + Assert.AreEqual(3, mid.ParameterSetId); + Assert.AreEqual(1, mid.BatchSize); + Assert.AreEqual(1, mid.BatchCounter); + Assert.AreEqual(BatchStatus.Ok, mid.BatchStatus); + Assert.AreEqual(6.80m, mid.TorqueOrForceMinLimit); + Assert.AreEqual(9.20m, mid.TorqueOrForceMaxLimit); + Assert.AreEqual(8.00m, mid.TorqueOrForceFinalTarget); + Assert.AreEqual(0.00m, mid.AngleOrStrokeMinLimit); + Assert.AreEqual(0.15m, mid.AngleOrStrokeMaxLimit); + Assert.AreEqual(0.00m, mid.FinalAngleOrStrokeTarget); + Assert.AreEqual(new DateTime(2019, 11, 14, 14, 8, 5), mid.LastChangeInParameterSet); + Assert.AreEqual(new DateTime(2019, 11, 25, 11, 22, 41), mid.TimeStamp); + Assert.AreEqual(913, mid.SyncTighteningId); + Assert.IsTrue(mid.SyncOverallStatus); + Assert.AreEqual(2, mid.SpindlesOrPressesStatus.Count); + Assert.AreEqual(SystemSubType.SystemRunningPresses, mid.SystemSubType); AssertEqualPackages(bytes, mid); } @@ -131,30 +134,30 @@ public void Mid0101ByteRevision4() [TestCategory("Revision 5"), TestCategory("ASCII")] public void Mid0101Revision5() { - var pack = "02040101005 010102BM3GA02111900601 030304003050001060001071080006800900092010000800110000012000151300000142019-11-14:14:08:05152019-11-25:11:22:41160091317118010111000809100000190022000021"; + var pack = "02220101005 010202BM3GA02111900601 030304003050001060001071080006800900092010000800110000012000151300000142019-11-14:14:08:05152019-11-25:11:22:41160091317118010111000809100000020111000809100000190022000021"; var mid = _midInterpreter.Parse(pack); Assert.AreEqual(typeof(Mid0101), mid.GetType()); - Assert.IsNotNull(mid.NumberOfSpindlesOrPresses); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueOrForceMinLimit); - Assert.IsNotNull(mid.TorqueOrForceMaxLimit); - Assert.IsNotNull(mid.TorqueOrForceFinalTarget); - Assert.IsNotNull(mid.AngleOrStrokeMinLimit); - Assert.IsNotNull(mid.AngleOrStrokeMaxLimit); - Assert.IsNotNull(mid.FinalAngleOrStrokeTarget); - Assert.IsNotNull(mid.LastChangeInParameterSet); - Assert.IsNotNull(mid.TimeStamp); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.SyncOverallStatus); - Assert.IsNotNull(mid.SpindlesOrPressesStatus); - Assert.IsNotNull(mid.SystemSubType); - Assert.IsNotNull(mid.JobSequenceNumber); + Assert.AreEqual(2, mid.NumberOfSpindlesOrPresses); + Assert.AreEqual("BM3GA02111900601", mid.VinNumber.TrimEnd()); + Assert.AreEqual(3, mid.JobId); + Assert.AreEqual(3, mid.ParameterSetId); + Assert.AreEqual(1, mid.BatchSize); + Assert.AreEqual(1, mid.BatchCounter); + Assert.AreEqual(BatchStatus.Ok, mid.BatchStatus); + Assert.AreEqual(6.80m, mid.TorqueOrForceMinLimit); + Assert.AreEqual(9.20m, mid.TorqueOrForceMaxLimit); + Assert.AreEqual(8.00m, mid.TorqueOrForceFinalTarget); + Assert.AreEqual(0.00m, mid.AngleOrStrokeMinLimit); + Assert.AreEqual(0.15m, mid.AngleOrStrokeMaxLimit); + Assert.AreEqual(0.00m, mid.FinalAngleOrStrokeTarget); + Assert.AreEqual(new DateTime(2019, 11, 14, 14, 8, 5), mid.LastChangeInParameterSet); + Assert.AreEqual(new DateTime(2019, 11, 25, 11, 22, 41), mid.TimeStamp); + Assert.AreEqual(913, mid.SyncTighteningId); + Assert.IsTrue(mid.SyncOverallStatus); + Assert.AreEqual(2, mid.SpindlesOrPressesStatus.Count); + Assert.AreEqual(SystemSubType.SystemRunningPresses, mid.SystemSubType); + Assert.AreEqual(21, mid.JobSequenceNumber); AssertEqualPackages(pack, mid); } @@ -162,31 +165,31 @@ public void Mid0101Revision5() [TestCategory("Revision 5"), TestCategory("ByteArray")] public void Mid0101ByteRevision5() { - var package = "02040101005 010102BM3GA02111900601 030304003050001060001071080006800900092010000800110000012000151300000142019-11-14:14:08:05152019-11-25:11:22:41160091317118010111000809100000190022000021"; + var package = "02220101005 010202BM3GA02111900601 030304003050001060001071080006800900092010000800110000012000151300000142019-11-14:14:08:05152019-11-25:11:22:41160091317118010111000809100000020111000809100000190022000021"; byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); Assert.AreEqual(typeof(Mid0101), mid.GetType()); - Assert.IsNotNull(mid.NumberOfSpindlesOrPresses); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueOrForceMinLimit); - Assert.IsNotNull(mid.TorqueOrForceMaxLimit); - Assert.IsNotNull(mid.TorqueOrForceFinalTarget); - Assert.IsNotNull(mid.AngleOrStrokeMinLimit); - Assert.IsNotNull(mid.AngleOrStrokeMaxLimit); - Assert.IsNotNull(mid.FinalAngleOrStrokeTarget); - Assert.IsNotNull(mid.LastChangeInParameterSet); - Assert.IsNotNull(mid.TimeStamp); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.SyncOverallStatus); - Assert.IsNotNull(mid.SpindlesOrPressesStatus); - Assert.IsNotNull(mid.SystemSubType); - Assert.IsNotNull(mid.JobSequenceNumber); + Assert.AreEqual(2, mid.NumberOfSpindlesOrPresses); + Assert.AreEqual("BM3GA02111900601", mid.VinNumber.TrimEnd()); + Assert.AreEqual(3, mid.JobId); + Assert.AreEqual(3, mid.ParameterSetId); + Assert.AreEqual(1, mid.BatchSize); + Assert.AreEqual(1, mid.BatchCounter); + Assert.AreEqual(BatchStatus.Ok, mid.BatchStatus); + Assert.AreEqual(6.80m, mid.TorqueOrForceMinLimit); + Assert.AreEqual(9.20m, mid.TorqueOrForceMaxLimit); + Assert.AreEqual(8.00m, mid.TorqueOrForceFinalTarget); + Assert.AreEqual(0.00m, mid.AngleOrStrokeMinLimit); + Assert.AreEqual(0.15m, mid.AngleOrStrokeMaxLimit); + Assert.AreEqual(0.00m, mid.FinalAngleOrStrokeTarget); + Assert.AreEqual(new DateTime(2019, 11, 14, 14, 8, 5), mid.LastChangeInParameterSet); + Assert.AreEqual(new DateTime(2019, 11, 25, 11, 22, 41), mid.TimeStamp); + Assert.AreEqual(913, mid.SyncTighteningId); + Assert.IsTrue(mid.SyncOverallStatus); + Assert.AreEqual(2, mid.SpindlesOrPressesStatus.Count); + Assert.AreEqual(SystemSubType.SystemRunningPresses, mid.SystemSubType); + Assert.AreEqual(21, mid.JobSequenceNumber); AssertEqualPackages(bytes, mid); } @@ -194,31 +197,30 @@ public void Mid0101ByteRevision5() [TestCategory("Revision 6"), TestCategory("ASCII")] public void Mid0101Revision6() { - var pack = "02040101006 010102BM3GA02111900601 030304003050001060001071080006800900092010000800110000012-00151300000142019-11-14:14:08:05152019-11-25:11:22:41160091317118010111000809100000190022000021"; + var pack = "02220101006 010202BM3GA02111900601 030304003050001060001071080006800900092010000800110000012-00151300000142019-11-14:14:08:05152019-11-25:11:22:41160091317118010111000809100000020111000809100000190022000021"; var mid = _midInterpreter.Parse(pack); Assert.AreEqual(typeof(Mid0101), mid.GetType()); - Assert.IsNotNull(mid.NumberOfSpindlesOrPresses); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueOrForceMinLimit); - Assert.IsNotNull(mid.TorqueOrForceMaxLimit); - Assert.IsNotNull(mid.TorqueOrForceFinalTarget); - Assert.IsNotNull(mid.AngleOrStrokeMinLimit); - Assert.IsNotNull(mid.AngleOrStrokeMaxLimit); - Assert.IsTrue(mid.AngleOrStrokeMaxLimit < 0); - Assert.IsNotNull(mid.FinalAngleOrStrokeTarget); - Assert.IsNotNull(mid.LastChangeInParameterSet); - Assert.IsNotNull(mid.TimeStamp); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.SyncOverallStatus); - Assert.IsNotNull(mid.SpindlesOrPressesStatus); - Assert.IsNotNull(mid.SystemSubType); - Assert.IsNotNull(mid.JobSequenceNumber); + Assert.AreEqual(2, mid.NumberOfSpindlesOrPresses); + Assert.AreEqual("BM3GA02111900601", mid.VinNumber.TrimEnd()); + Assert.AreEqual(3, mid.JobId); + Assert.AreEqual(3, mid.ParameterSetId); + Assert.AreEqual(1, mid.BatchSize); + Assert.AreEqual(1, mid.BatchCounter); + Assert.AreEqual(BatchStatus.Ok, mid.BatchStatus); + Assert.AreEqual(6.80m, mid.TorqueOrForceMinLimit); + Assert.AreEqual(9.20m, mid.TorqueOrForceMaxLimit); + Assert.AreEqual(8.00m, mid.TorqueOrForceFinalTarget); + Assert.AreEqual(0.00m, mid.AngleOrStrokeMinLimit); + Assert.AreEqual(-0.15m, mid.AngleOrStrokeMaxLimit); + Assert.AreEqual(0.00m, mid.FinalAngleOrStrokeTarget); + Assert.AreEqual(new DateTime(2019, 11, 14, 14, 8, 5), mid.LastChangeInParameterSet); + Assert.AreEqual(new DateTime(2019, 11, 25, 11, 22, 41), mid.TimeStamp); + Assert.AreEqual(913, mid.SyncTighteningId); + Assert.IsTrue(mid.SyncOverallStatus); + Assert.AreEqual(2, mid.SpindlesOrPressesStatus.Count); + Assert.AreEqual(SystemSubType.SystemRunningPresses, mid.SystemSubType); + Assert.AreEqual(21, mid.JobSequenceNumber); AssertEqualPackages(pack, mid); } @@ -226,33 +228,95 @@ public void Mid0101Revision6() [TestCategory("Revision 6"), TestCategory("ByteArray")] public void Mid0101ByteRevision6() { - var package = "02040101006 010102BM3GA02111900601 030304003050001060001071080006800900092010000800110000012-00151300000142019-11-14:14:08:05152019-11-25:11:22:41160091317118010111000809100000190022000021"; + var package = "02220101006 010202BM3GA02111900601 030304003050001060001071080006800900092010000800110000012-00151300000142019-11-14:14:08:05152019-11-25:11:22:41160091317118010111000809100000020111000809100000190022000021"; byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); Assert.AreEqual(typeof(Mid0101), mid.GetType()); - Assert.IsNotNull(mid.NumberOfSpindlesOrPresses); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueOrForceMinLimit); - Assert.IsNotNull(mid.TorqueOrForceMaxLimit); - Assert.IsNotNull(mid.TorqueOrForceFinalTarget); - Assert.IsNotNull(mid.AngleOrStrokeMinLimit); - Assert.IsNotNull(mid.AngleOrStrokeMaxLimit); - Assert.IsTrue(mid.AngleOrStrokeMaxLimit < 0); - Assert.IsNotNull(mid.FinalAngleOrStrokeTarget); - Assert.IsNotNull(mid.LastChangeInParameterSet); - Assert.IsNotNull(mid.TimeStamp); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.SyncOverallStatus); - Assert.IsNotNull(mid.SpindlesOrPressesStatus); - Assert.IsNotNull(mid.SystemSubType); - Assert.IsNotNull(mid.JobSequenceNumber); + Assert.AreEqual(2, mid.NumberOfSpindlesOrPresses); + Assert.AreEqual("BM3GA02111900601", mid.VinNumber.TrimEnd()); + Assert.AreEqual(3, mid.JobId); + Assert.AreEqual(3, mid.ParameterSetId); + Assert.AreEqual(1, mid.BatchSize); + Assert.AreEqual(1, mid.BatchCounter); + Assert.AreEqual(BatchStatus.Ok, mid.BatchStatus); + Assert.AreEqual(6.80m, mid.TorqueOrForceMinLimit); + Assert.AreEqual(9.20m, mid.TorqueOrForceMaxLimit); + Assert.AreEqual(8.00m, mid.TorqueOrForceFinalTarget); + Assert.AreEqual(0.00m, mid.AngleOrStrokeMinLimit); + Assert.AreEqual(-0.15m, mid.AngleOrStrokeMaxLimit); + Assert.AreEqual(0.00m, mid.FinalAngleOrStrokeTarget); + Assert.AreEqual(new DateTime(2019, 11, 14, 14, 8, 5), mid.LastChangeInParameterSet); + Assert.AreEqual(new DateTime(2019, 11, 25, 11, 22, 41), mid.TimeStamp); + Assert.AreEqual(913, mid.SyncTighteningId); + Assert.IsTrue(mid.SyncOverallStatus); + Assert.AreEqual(2, mid.SpindlesOrPressesStatus.Count); + Assert.AreEqual(SystemSubType.SystemRunningPresses, mid.SystemSubType); + Assert.AreEqual(21, mid.JobSequenceNumber); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Pack")] + public void Mid0101PackRevisions1To3() + { + var pack = "02100101001 010202BM3GA02111900601 030304003050001060001071080006800900092010000800110000012000151300000142019-11-14:14:08:05152019-11-25:11:22:41160091317118010111000809100000020111000809100000"; + + AssertBuildAndParse(pack, BuildMid0101(1)); + } + + [TestMethod] + [TestCategory("Revision 4"), TestCategory("Pack")] + public void Mid0101PackRevision4() + { + var pack = "02150101004 010202BM3GA02111900601 030304003050001060001071080006800900092010000800110000012000151300000142019-11-14:14:08:05152019-11-25:11:22:4116009131711801011100080910000002011100080910000019002"; + + var mid = BuildMid0101(4); + mid.SystemSubType = SystemSubType.SystemRunningPresses; + + AssertBuildAndParse(pack, mid); + } + + [TestMethod] + [TestCategory("Revision 5"), TestCategory("Pack")] + public void Mid0101PackRevision5() + { + var pack = "02220101005 010202BM3GA02111900601 030304003050001060001071080006800900092010000800110000012000151300000142019-11-14:14:08:05152019-11-25:11:22:41160091317118010111000809100000020111000809100000190022000021"; + + var mid = BuildMid0101(5); + mid.SystemSubType = SystemSubType.SystemRunningPresses; + mid.JobSequenceNumber = 21; + + AssertBuildAndParse(pack, mid); + } + + private static Mid0101 BuildMid0101(int revision) + { + return new Mid0101(revision) + { + NumberOfSpindlesOrPresses = 2, + VinNumber = "BM3GA02111900601", + JobId = 3, + ParameterSetId = 3, + BatchSize = 1, + BatchCounter = 1, + BatchStatus = BatchStatus.Ok, + TorqueOrForceMinLimit = 6.80m, + TorqueOrForceMaxLimit = 9.20m, + TorqueOrForceFinalTarget = 8.00m, + AngleOrStrokeMinLimit = 0.00m, + AngleOrStrokeMaxLimit = 0.15m, + FinalAngleOrStrokeTarget = 0.00m, + LastChangeInParameterSet = new DateTime(2019, 11, 14, 14, 8, 5), + TimeStamp = new DateTime(2019, 11, 25, 11, 22, 41), + SyncTighteningId = 913, + SyncOverallStatus = true, + SpindlesOrPressesStatus = new List() + { + new SpindleOrPressStatus() { SpindleOrPressNumber = 1, ChannelId = 1, OverallStatus = true, TorqueOrForceStatus = TighteningValueStatus.Ok, TorqueOrForce = 8.09m, AngleOrStrokeStatus = true, AngleOrStroke = 0 }, + new SpindleOrPressStatus() { SpindleOrPressNumber = 2, ChannelId = 1, OverallStatus = true, TorqueOrForceStatus = TighteningValueStatus.Ok, TorqueOrForce = 8.09m, AngleOrStrokeStatus = true, AngleOrStroke = 0 } + } + }; + } } } diff --git a/src/MIDTesters.Core/MultiSpindle/TestMid0102.cs b/src/MIDTesters.Core/MultiSpindle/TestMid0102.cs index 8f2cc775..3b1634fb 100644 --- a/src/MIDTesters.Core/MultiSpindle/TestMid0102.cs +++ b/src/MIDTesters.Core/MultiSpindle/TestMid0102.cs @@ -29,5 +29,14 @@ public void Mid0102ByteRevision1() Assert.AreEqual(typeof(Mid0102), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0102PackRevision1() + { + string pack = @"00200102 "; + + AssertBuildAndParse(pack, new Mid0102(), true); + } } } diff --git a/src/MIDTesters.Core/MultiSpindle/TestMid0103.cs b/src/MIDTesters.Core/MultiSpindle/TestMid0103.cs index 2f326ffe..f4223722 100644 --- a/src/MIDTesters.Core/MultiSpindle/TestMid0103.cs +++ b/src/MIDTesters.Core/MultiSpindle/TestMid0103.cs @@ -29,5 +29,14 @@ public void Mid0102ByteRevision1() Assert.AreEqual(typeof(Mid0103), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0103PackRevision1() + { + string pack = @"00200103 "; + + AssertBuildAndParse(pack, new Mid0103(), true); + } } } diff --git a/src/MIDTesters.Core/MultiSpindle/TestMid0104.cs b/src/MIDTesters.Core/MultiSpindle/TestMid0104.cs index e95ec455..9ab64f79 100644 --- a/src/MIDTesters.Core/MultiSpindle/TestMid0104.cs +++ b/src/MIDTesters.Core/MultiSpindle/TestMid0104.cs @@ -1,7 +1,7 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenProtocolInterpreter.MultiSpindle; -namespace MIDTesters.Core.MultiSpindle +namespace MIDTesters.MultiSpindle { [TestClass] [TestCategory("MultiSpindle")] @@ -14,7 +14,7 @@ public void Mid0104Revision1() string pack = @"00320104 013009021015"; var mid = _midInterpreter.Parse(pack); - Assert.AreNotEqual(0, mid.RequestedResultIndex); + Assert.AreEqual(3009021015L, mid.RequestedResultIndex); AssertEqualPackages(pack, mid, true); } @@ -26,8 +26,20 @@ public void Mid0104ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.AreNotEqual(0, mid.RequestedResultIndex); + Assert.AreEqual(3009021015L, mid.RequestedResultIndex); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0104PackRevision1() + { + string pack = @"00320104 013009021015"; + + AssertBuildAndParse(pack, new Mid0104() + { + RequestedResultIndex = 3009021015L + }, true); + } } } diff --git a/src/MIDTesters.Core/MultipleIdentifiers/TestMid0150.cs b/src/MIDTesters.Core/MultipleIdentifiers/TestMid0150.cs index 45774ed2..fbeb26f3 100644 --- a/src/MIDTesters.Core/MultipleIdentifiers/TestMid0150.cs +++ b/src/MIDTesters.Core/MultipleIdentifiers/TestMid0150.cs @@ -16,7 +16,7 @@ public void Mid0150Revision1() var mid = _midInterpreter.Parse(package); var mid0150 = new Mid0150() { IdentifierData = identifier }; - Assert.IsNotNull(mid.IdentifierData); + Assert.AreEqual("My identifier less than 100", mid.IdentifierData); AssertEqualPackages(package, mid0150); } @@ -30,7 +30,7 @@ public void Mid0150ByteRevision1() var mid = _midInterpreter.Parse(bytes); var mid0150 = new Mid0150() { IdentifierData = identifier }; - Assert.IsNotNull(mid.IdentifierData); + Assert.AreEqual("My identifier less than 100", mid.IdentifierData); AssertEqualPackages(bytes, mid0150); } @@ -40,8 +40,19 @@ public void Mid0150ShouldTruncateIdentifier() string identifier = "the phrase the quick brown fox jumps over the lazy dog should test all the letter keys in your keyboard"; //103 characters var mid0150 = new Mid0150() { IdentifierData = identifier }; - Assert.IsNotNull(mid0150.IdentifierData); Assert.IsTrue(mid0150.Pack().Length == 120); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0150PackRevision1() + { + string package = "00470150001 My identifier less than 100"; + + AssertBuildAndParse(package, new Mid0150() + { + IdentifierData = "My identifier less than 100" + }); + } } } diff --git a/src/MIDTesters.Core/MultipleIdentifiers/TestMid0151.cs b/src/MIDTesters.Core/MultipleIdentifiers/TestMid0151.cs new file mode 100644 index 00000000..5131e96d --- /dev/null +++ b/src/MIDTesters.Core/MultipleIdentifiers/TestMid0151.cs @@ -0,0 +1,42 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter.MultipleIdentifiers; + +namespace MIDTesters.MultipleIdentifiers +{ + [TestClass] + [TestCategory("MultipleIdentifiers")] + public class TestMid0151 : DefaultMidTests + { + [TestMethod] + [TestCategory("Revision 1"), TestCategory("ASCII")] + public void Mid0151Revision1() + { + string package = "00200151001 "; + var mid = _midInterpreter.Parse(package); + + Assert.AreEqual(typeof(Mid0151), mid.GetType()); + AssertEqualPackages(package, mid); + } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("ByteArray")] + public void Mid0151ByteRevision1() + { + string package = "00200151001 "; + byte[] bytes = GetAsciiBytes(package); + var mid = _midInterpreter.Parse(bytes); + + Assert.AreEqual(typeof(Mid0151), mid.GetType()); + AssertEqualPackages(bytes, mid); + } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0151PackRevision1() + { + string package = "00200151001 "; + + AssertBuildAndParse(package, new Mid0151()); + } + } +} diff --git a/src/MIDTesters.Core/MultipleIdentifiers/TestMid0152.cs b/src/MIDTesters.Core/MultipleIdentifiers/TestMid0152.cs index d1f684dc..8f6a0073 100644 --- a/src/MIDTesters.Core/MultipleIdentifiers/TestMid0152.cs +++ b/src/MIDTesters.Core/MultipleIdentifiers/TestMid0152.cs @@ -1,4 +1,5 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; using OpenProtocolInterpreter.MultipleIdentifiers; namespace MIDTesters.MultipleIdentifiers @@ -14,10 +15,22 @@ public void Mid0152Revision1() string package = "01480152001 0110101Result part 1 0220003Result part 2 0330104Result part 3 0440105Result part 4 "; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.FirstIdentifierStatus); - Assert.IsNotNull(mid.SecondIdentifierStatus); - Assert.IsNotNull(mid.ThirdIdentifierStatus); - Assert.IsNotNull(mid.FourthIdentifierStatus); + Assert.AreEqual(1, mid.FirstIdentifierStatus.IdentifierTypeNumber); + Assert.IsTrue(mid.FirstIdentifierStatus.IncludedInWorkOrder); + Assert.AreEqual(StatusInWorkOrder.Accepted, mid.FirstIdentifierStatus.StatusInWorkOrder); + Assert.AreEqual("Result part 1", mid.FirstIdentifierStatus.ResultPart.TrimEnd()); + Assert.AreEqual(2, mid.SecondIdentifierStatus.IdentifierTypeNumber); + Assert.IsFalse(mid.SecondIdentifierStatus.IncludedInWorkOrder); + Assert.AreEqual(StatusInWorkOrder.Reset, mid.SecondIdentifierStatus.StatusInWorkOrder); + Assert.AreEqual("Result part 2", mid.SecondIdentifierStatus.ResultPart.TrimEnd()); + Assert.AreEqual(3, mid.ThirdIdentifierStatus.IdentifierTypeNumber); + Assert.IsTrue(mid.ThirdIdentifierStatus.IncludedInWorkOrder); + Assert.AreEqual(StatusInWorkOrder.Next, mid.ThirdIdentifierStatus.StatusInWorkOrder); + Assert.AreEqual("Result part 3", mid.ThirdIdentifierStatus.ResultPart.TrimEnd()); + Assert.AreEqual(4, mid.FourthIdentifierStatus.IdentifierTypeNumber); + Assert.IsTrue(mid.FourthIdentifierStatus.IncludedInWorkOrder); + Assert.AreEqual(StatusInWorkOrder.Initial, mid.FourthIdentifierStatus.StatusInWorkOrder); + Assert.AreEqual("Result part 4", mid.FourthIdentifierStatus.ResultPart.TrimEnd()); AssertEqualPackages(package, mid); } @@ -29,11 +42,38 @@ public void Mid0152ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.FirstIdentifierStatus); - Assert.IsNotNull(mid.SecondIdentifierStatus); - Assert.IsNotNull(mid.ThirdIdentifierStatus); - Assert.IsNotNull(mid.FourthIdentifierStatus); + Assert.AreEqual(1, mid.FirstIdentifierStatus.IdentifierTypeNumber); + Assert.IsTrue(mid.FirstIdentifierStatus.IncludedInWorkOrder); + Assert.AreEqual(StatusInWorkOrder.Accepted, mid.FirstIdentifierStatus.StatusInWorkOrder); + Assert.AreEqual("Result part 1", mid.FirstIdentifierStatus.ResultPart.TrimEnd()); + Assert.AreEqual(2, mid.SecondIdentifierStatus.IdentifierTypeNumber); + Assert.IsFalse(mid.SecondIdentifierStatus.IncludedInWorkOrder); + Assert.AreEqual(StatusInWorkOrder.Reset, mid.SecondIdentifierStatus.StatusInWorkOrder); + Assert.AreEqual("Result part 2", mid.SecondIdentifierStatus.ResultPart.TrimEnd()); + Assert.AreEqual(3, mid.ThirdIdentifierStatus.IdentifierTypeNumber); + Assert.IsTrue(mid.ThirdIdentifierStatus.IncludedInWorkOrder); + Assert.AreEqual(StatusInWorkOrder.Next, mid.ThirdIdentifierStatus.StatusInWorkOrder); + Assert.AreEqual("Result part 3", mid.ThirdIdentifierStatus.ResultPart.TrimEnd()); + Assert.AreEqual(4, mid.FourthIdentifierStatus.IdentifierTypeNumber); + Assert.IsTrue(mid.FourthIdentifierStatus.IncludedInWorkOrder); + Assert.AreEqual(StatusInWorkOrder.Initial, mid.FourthIdentifierStatus.StatusInWorkOrder); + Assert.AreEqual("Result part 4", mid.FourthIdentifierStatus.ResultPart.TrimEnd()); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0152PackRevision1() + { + string package = "01480152001 0110101Result part 1 0220003Result part 2 0330104Result part 3 0440105Result part 4 "; + + AssertBuildAndParse(package, new Mid0152() + { + FirstIdentifierStatus = new IdentifierStatus() { IdentifierTypeNumber = 1, IncludedInWorkOrder = true, StatusInWorkOrder = StatusInWorkOrder.Accepted, ResultPart = "Result part 1" }, + SecondIdentifierStatus = new IdentifierStatus() { IdentifierTypeNumber = 2, IncludedInWorkOrder = false, StatusInWorkOrder = StatusInWorkOrder.Reset, ResultPart = "Result part 2" }, + ThirdIdentifierStatus = new IdentifierStatus() { IdentifierTypeNumber = 3, IncludedInWorkOrder = true, StatusInWorkOrder = StatusInWorkOrder.Next, ResultPart = "Result part 3" }, + FourthIdentifierStatus = new IdentifierStatus() { IdentifierTypeNumber = 4, IncludedInWorkOrder = true, StatusInWorkOrder = StatusInWorkOrder.Initial, ResultPart = "Result part 4" } + }); + } } } diff --git a/src/MIDTesters.Core/MultipleIdentifiers/TestMid0153.cs b/src/MIDTesters.Core/MultipleIdentifiers/TestMid0153.cs index 2084dc1b..3a3c2bb2 100644 --- a/src/MIDTesters.Core/MultipleIdentifiers/TestMid0153.cs +++ b/src/MIDTesters.Core/MultipleIdentifiers/TestMid0153.cs @@ -29,5 +29,14 @@ public void Mid0153ByteRevision1() Assert.AreEqual(typeof(Mid0153), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0153PackRevision1() + { + string package = "00200153 "; + + AssertBuildAndParse(package, new Mid0153(), true); + } } } diff --git a/src/MIDTesters.Core/MultipleIdentifiers/TestMid0154.cs b/src/MIDTesters.Core/MultipleIdentifiers/TestMid0154.cs index 59e3fbc4..dcdfd4af 100644 --- a/src/MIDTesters.Core/MultipleIdentifiers/TestMid0154.cs +++ b/src/MIDTesters.Core/MultipleIdentifiers/TestMid0154.cs @@ -29,5 +29,14 @@ public void Mid0154ByteRevision1() Assert.AreEqual(typeof(Mid0154), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0154PackRevision1() + { + string package = "00200154 "; + + AssertBuildAndParse(package, new Mid0154(), true); + } } } diff --git a/src/MIDTesters.Core/MultipleIdentifiers/TestMid0155.cs b/src/MIDTesters.Core/MultipleIdentifiers/TestMid0155.cs index 7a99ce07..92fe9c9d 100644 --- a/src/MIDTesters.Core/MultipleIdentifiers/TestMid0155.cs +++ b/src/MIDTesters.Core/MultipleIdentifiers/TestMid0155.cs @@ -29,5 +29,14 @@ public void Mid0155ByteRevision1() Assert.AreEqual(typeof(Mid0155), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0155PackRevision1() + { + string package = "00200155 "; + + AssertBuildAndParse(package, new Mid0155(), true); + } } } diff --git a/src/MIDTesters.Core/MultipleIdentifiers/TestMid0156.cs b/src/MIDTesters.Core/MultipleIdentifiers/TestMid0156.cs index 697c7439..6362b120 100644 --- a/src/MIDTesters.Core/MultipleIdentifiers/TestMid0156.cs +++ b/src/MIDTesters.Core/MultipleIdentifiers/TestMid0156.cs @@ -29,5 +29,14 @@ public void Mid0156ByteRevision1() Assert.AreEqual(typeof(Mid0156), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0156PackRevision1() + { + string package = "00200156 "; + + AssertBuildAndParse(package, new Mid0156(), true); + } } } diff --git a/src/MIDTesters.Core/MultipleIdentifiers/TestMid0157.cs b/src/MIDTesters.Core/MultipleIdentifiers/TestMid0157.cs index a2d609df..80804c6a 100644 --- a/src/MIDTesters.Core/MultipleIdentifiers/TestMid0157.cs +++ b/src/MIDTesters.Core/MultipleIdentifiers/TestMid0157.cs @@ -29,5 +29,14 @@ public void Mid0157ByteRevision1() Assert.AreEqual(typeof(Mid0157), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0157PackRevision1() + { + string package = "00200157 "; + + AssertBuildAndParse(package, new Mid0157(), true); + } } } diff --git a/src/MIDTesters.Core/OpenProtocolCommandsDisabled/TestMid0420.cs b/src/MIDTesters.Core/OpenProtocolCommandsDisabled/TestMid0420.cs index 3b4275e0..daac9412 100644 --- a/src/MIDTesters.Core/OpenProtocolCommandsDisabled/TestMid0420.cs +++ b/src/MIDTesters.Core/OpenProtocolCommandsDisabled/TestMid0420.cs @@ -31,5 +31,14 @@ public void Mid0420ByteRevision1() Assert.IsTrue(mid.Header.NoAckFlag); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0420PackRevision1() + { + string package = "00200420 1 "; + + AssertBuildAndParse(package, new Mid0420(noAckFlag: true), true); + } } } diff --git a/src/MIDTesters.Core/OpenProtocolCommandsDisabled/TestMid0421.cs b/src/MIDTesters.Core/OpenProtocolCommandsDisabled/TestMid0421.cs index 7081d9cb..40bb41ac 100644 --- a/src/MIDTesters.Core/OpenProtocolCommandsDisabled/TestMid0421.cs +++ b/src/MIDTesters.Core/OpenProtocolCommandsDisabled/TestMid0421.cs @@ -14,7 +14,7 @@ public void Mid0421Revision1() string package = "00210421 1"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.DigitalInputStatus); + Assert.IsTrue(mid.DigitalInputStatus); AssertEqualPackages(package, mid, true); } @@ -26,8 +26,20 @@ public void Mid0421ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.DigitalInputStatus); + Assert.IsTrue(mid.DigitalInputStatus); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0421PackRevision1() + { + string package = "00210421 1"; + + AssertBuildAndParse(package, new Mid0421() + { + DigitalInputStatus = true + }, true); + } } } diff --git a/src/MIDTesters.Core/OpenProtocolCommandsDisabled/TestMid0422.cs b/src/MIDTesters.Core/OpenProtocolCommandsDisabled/TestMid0422.cs index e81a6664..0d23ff08 100644 --- a/src/MIDTesters.Core/OpenProtocolCommandsDisabled/TestMid0422.cs +++ b/src/MIDTesters.Core/OpenProtocolCommandsDisabled/TestMid0422.cs @@ -29,5 +29,14 @@ public void Mid0422ByteRevision1() Assert.AreEqual(typeof(Mid0422), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0422PackRevision1() + { + string package = "00200422 "; + + AssertBuildAndParse(package, new Mid0422(), true); + } } } diff --git a/src/MIDTesters.Core/OpenProtocolCommandsDisabled/TestMid0423.cs b/src/MIDTesters.Core/OpenProtocolCommandsDisabled/TestMid0423.cs index 8afcbd68..79e12a78 100644 --- a/src/MIDTesters.Core/OpenProtocolCommandsDisabled/TestMid0423.cs +++ b/src/MIDTesters.Core/OpenProtocolCommandsDisabled/TestMid0423.cs @@ -29,5 +29,14 @@ public void Mid0423ByteRevision1() Assert.AreEqual(typeof(Mid0423), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0423PackRevision1() + { + string package = "00200423 "; + + AssertBuildAndParse(package, new Mid0423(), true); + } } } diff --git a/src/MIDTesters.Core/PLCUserData/TestMid0240.cs b/src/MIDTesters.Core/PLCUserData/TestMid0240.cs index 6ad4b586..085183a6 100644 --- a/src/MIDTesters.Core/PLCUserData/TestMid0240.cs +++ b/src/MIDTesters.Core/PLCUserData/TestMid0240.cs @@ -14,7 +14,7 @@ public void Mid0240Revision1() string package = "00470240 My identifier less than 200"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.UserData); + Assert.AreEqual("My identifier less than 200", mid.UserData); AssertEqualPackages(package, mid, true); } @@ -26,7 +26,7 @@ public void Mid0240ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.UserData); + Assert.AreEqual("My identifier less than 200", mid.UserData); AssertEqualPackages(bytes, mid, true); } @@ -37,8 +37,20 @@ public void Mid0240ShouldTrucanteUserData() userData += userData; //double it to get 208 characters var mid0240 = new Mid0240() { UserData = userData }; - Assert.IsNotNull(mid0240.UserData); + Assert.AreEqual(208, mid0240.UserData.Length); Assert.IsTrue(mid0240.Pack().Length == 220); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0240PackRevision1() + { + string package = "00470240 My identifier less than 200"; + + AssertBuildAndParse(package, new Mid0240() + { + UserData = "My identifier less than 200" + }, true); + } } } diff --git a/src/MIDTesters.Core/PLCUserData/TestMid0241.cs b/src/MIDTesters.Core/PLCUserData/TestMid0241.cs index 502824b4..d61f1ec6 100644 --- a/src/MIDTesters.Core/PLCUserData/TestMid0241.cs +++ b/src/MIDTesters.Core/PLCUserData/TestMid0241.cs @@ -29,5 +29,14 @@ public void Mid0241ByteRevision1() Assert.IsTrue(mid.Header.NoAckFlag); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0241PackRevision1() + { + string package = "00200241 1 "; + + AssertBuildAndParse(package, new Mid0241(noAckFlag: true), true); + } } } diff --git a/src/MIDTesters.Core/PLCUserData/TestMid0242.cs b/src/MIDTesters.Core/PLCUserData/TestMid0242.cs index b5541b93..88d8939b 100644 --- a/src/MIDTesters.Core/PLCUserData/TestMid0242.cs +++ b/src/MIDTesters.Core/PLCUserData/TestMid0242.cs @@ -15,7 +15,7 @@ public void Mid0242Revision1() var mid = _midInterpreter.Parse(package); Assert.IsTrue(mid.Header.NoAckFlag); - Assert.IsNotNull(mid.UserData); + Assert.AreEqual("My identifier less than", mid.UserData); AssertEqualPackages(package, mid, true); } @@ -28,8 +28,21 @@ public void Mid0242ByteRevision1() var mid = _midInterpreter.Parse(bytes); Assert.IsTrue(mid.Header.NoAckFlag); - Assert.IsNotNull(mid.UserData); + Assert.AreEqual("My identifier less than", mid.UserData); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0242PackRevision1() + { + string package = "00430242 1 My identifier less than"; + + AssertBuildAndParse(package, new Mid0242() + { + Header = { NoAckFlag = true }, + UserData = "My identifier less than" + }, true); + } } } diff --git a/src/MIDTesters.Core/PLCUserData/TestMid0243.cs b/src/MIDTesters.Core/PLCUserData/TestMid0243.cs index dcc2bbdb..dcc86f16 100644 --- a/src/MIDTesters.Core/PLCUserData/TestMid0243.cs +++ b/src/MIDTesters.Core/PLCUserData/TestMid0243.cs @@ -29,5 +29,14 @@ public void Mid0243ByteRevision1() Assert.AreEqual(typeof(Mid0243), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0243PackRevision1() + { + string package = "00200243 "; + + AssertBuildAndParse(package, new Mid0243(), true); + } } } diff --git a/src/MIDTesters.Core/PLCUserData/TestMid0244.cs b/src/MIDTesters.Core/PLCUserData/TestMid0244.cs index 6c7e586b..58abdbb0 100644 --- a/src/MIDTesters.Core/PLCUserData/TestMid0244.cs +++ b/src/MIDTesters.Core/PLCUserData/TestMid0244.cs @@ -29,5 +29,14 @@ public void Mid0244ByteRevision1() Assert.AreEqual(typeof(Mid0244), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0244PackRevision1() + { + string package = "00200244 "; + + AssertBuildAndParse(package, new Mid0244(), true); + } } } diff --git a/src/MIDTesters.Core/PLCUserData/TestMid0245.cs b/src/MIDTesters.Core/PLCUserData/TestMid0245.cs index 72f076af..305bcbea 100644 --- a/src/MIDTesters.Core/PLCUserData/TestMid0245.cs +++ b/src/MIDTesters.Core/PLCUserData/TestMid0245.cs @@ -14,8 +14,8 @@ public void Mid0245Revision1() string package = "00460245 022My identifier less than"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.Offset); - Assert.IsNotNull(mid.UserData); + Assert.AreEqual(22, mid.Offset); + Assert.AreEqual("My identifier less than", mid.UserData); AssertEqualPackages(package, mid, true); } @@ -27,8 +27,8 @@ public void Mid0245ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.Offset); - Assert.IsNotNull(mid.UserData); + Assert.AreEqual(22, mid.Offset); + Assert.AreEqual("My identifier less than", mid.UserData); AssertEqualPackages(bytes, mid, true); } @@ -39,9 +39,22 @@ public void Mid0245ShouldTruncateUserData() userData += userData; //double it to get 208 characters var mid0245 = new Mid0245(2) { Offset = 0, UserData = userData }; - Assert.IsNotNull(mid0245.Offset); - Assert.IsNotNull(mid0245.UserData); + Assert.AreEqual(0, mid0245.Offset); + Assert.AreEqual(208, mid0245.UserData.Length); Assert.IsTrue(mid0245.Pack().Length == 223); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0245PackRevision1() + { + string package = "00460245 022My identifier less than"; + + AssertBuildAndParse(package, new Mid0245(1) + { + Offset = 22, + UserData = "My identifier less than" + }, true); + } } } diff --git a/src/MIDTesters.Core/ParameterSet/TestMid0010.cs b/src/MIDTesters.Core/ParameterSet/TestMid0010.cs index 4902d7c5..e296be0b 100644 --- a/src/MIDTesters.Core/ParameterSet/TestMid0010.cs +++ b/src/MIDTesters.Core/ParameterSet/TestMid0010.cs @@ -29,5 +29,14 @@ public void Mid0010ByteAllRevisions() Assert.AreEqual(typeof(Mid0010), mid.GetType()); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Pack")] + public void Mid0010PackAllRevisions() + { + string package = "00200010002 "; + + AssertBuildAndParse(package, new Mid0010(2)); + } } } diff --git a/src/MIDTesters.Core/ParameterSet/TestMid0011.cs b/src/MIDTesters.Core/ParameterSet/TestMid0011.cs index 754d9a4e..a406674a 100644 --- a/src/MIDTesters.Core/ParameterSet/TestMid0011.cs +++ b/src/MIDTesters.Core/ParameterSet/TestMid0011.cs @@ -1,6 +1,7 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenProtocolInterpreter.ParameterSet; +using System.Collections.Generic; namespace MIDTesters.ParameterSet { [TestClass] @@ -14,8 +15,8 @@ public void Mid0011Revision1() string pack = @"00290011 002001002"; var mid = _midInterpreter.Parse(pack); - Assert.IsNotNull(mid.TotalParameterSets); - Assert.IsNotNull(mid.ParameterSets); + Assert.AreEqual(2, mid.TotalParameterSets); + Assert.AreEqual(2, mid.ParameterSets.Count); AssertEqualPackages(pack, mid, true); } @@ -27,8 +28,8 @@ public void Mid0011ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.TotalParameterSets); - Assert.IsNotNull(mid.ParameterSets); + Assert.AreEqual(2, mid.TotalParameterSets); + Assert.AreEqual(2, mid.ParameterSets.Count); AssertEqualPackages(bytes, mid, true); } @@ -38,9 +39,22 @@ public void Mid0011Revision1MaxParameters() string pack = @"30200011 999001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002002001002001002001002001003005"; var mid = _midInterpreter.Parse(pack); - Assert.IsNotNull(mid.TotalParameterSets); - Assert.IsNotNull(mid.ParameterSets); + Assert.AreEqual(999, mid.TotalParameterSets); + Assert.AreEqual(999, mid.ParameterSets.Count); AssertEqualPackages(pack, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0011PackRevision1() + { + string package = "00290011 002001002"; + + AssertBuildAndParse(package, new Mid0011() + { + TotalParameterSets = 2, + ParameterSets = new List() { 1, 2 } + }, true); + } } } diff --git a/src/MIDTesters.Core/ParameterSet/TestMid0012.cs b/src/MIDTesters.Core/ParameterSet/TestMid0012.cs index 464056a1..396f0bd8 100644 --- a/src/MIDTesters.Core/ParameterSet/TestMid0012.cs +++ b/src/MIDTesters.Core/ParameterSet/TestMid0012.cs @@ -14,7 +14,7 @@ public void Mid0012Revision1() string pack = @"00230012 002"; var mid = _midInterpreter.Parse(pack); - Assert.IsNotNull(mid.ParameterSetId); + Assert.AreEqual(2, mid.ParameterSetId); AssertEqualPackages(pack, mid, true); } @@ -26,7 +26,7 @@ public void Mid0012ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.ParameterSetId); + Assert.AreEqual(2, mid.ParameterSetId); AssertEqualPackages(bytes, mid, true); } @@ -37,7 +37,7 @@ public void Mid0012Revision2() string pack = @"00230012002 002"; var mid = _midInterpreter.Parse(pack); - Assert.IsNotNull(mid.ParameterSetId); + Assert.AreEqual(2, mid.ParameterSetId); AssertEqualPackages(pack, mid); } @@ -49,7 +49,7 @@ public void Mid0012ByteRevision2() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.ParameterSetId); + Assert.AreEqual(2, mid.ParameterSetId); AssertEqualPackages(bytes, mid); } @@ -60,8 +60,8 @@ public void Mid0012Revision3() string pack = @"00310012003 00212345678"; var mid = _midInterpreter.Parse(pack); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.ParameterSetFileVersion); + Assert.AreEqual(2, mid.ParameterSetId); + Assert.AreEqual(12345678, mid.ParameterSetFileVersion); AssertEqualPackages(pack, mid); } @@ -73,8 +73,8 @@ public void Mid0012ByteRevision3() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.ParameterSetFileVersion); + Assert.AreEqual(2, mid.ParameterSetId); + Assert.AreEqual(12345678, mid.ParameterSetFileVersion); AssertEqualPackages(bytes, mid); } @@ -85,8 +85,8 @@ public void Mid0012Revision4() string pack = @"00310012004 00212345678"; var mid = _midInterpreter.Parse(pack); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.ParameterSetFileVersion); + Assert.AreEqual(2, mid.ParameterSetId); + Assert.AreEqual(12345678, mid.ParameterSetFileVersion); AssertEqualPackages(pack, mid); } @@ -98,9 +98,59 @@ public void Mid0012ByteRevision4() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.ParameterSetFileVersion); + Assert.AreEqual(2, mid.ParameterSetId); + Assert.AreEqual(12345678, mid.ParameterSetFileVersion); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0012PackRevision1() + { + string package = "00230012 002"; + + AssertBuildAndParse(package, new Mid0012(1) + { + ParameterSetId = 2 + }, true); + } + + [TestMethod] + [TestCategory("Revision 2"), TestCategory("Pack")] + public void Mid0012PackRevision2() + { + string package = @"00230012002 002"; + + AssertBuildAndParse(package, new Mid0012(2) + { + ParameterSetId = 2 + }); + } + + [TestMethod] + [TestCategory("Revision 3"), TestCategory("Pack")] + public void Mid0012PackRevision3() + { + string package = "00310012003 00212345678"; + + AssertBuildAndParse(package, new Mid0012(3) + { + ParameterSetId = 2, + ParameterSetFileVersion = 12345678 + }); + } + + [TestMethod] + [TestCategory("Revision 4"), TestCategory("Pack")] + public void Mid0012PackRevision4() + { + string package = @"00310012004 00212345678"; + + AssertBuildAndParse(package, new Mid0012(4) + { + ParameterSetId = 2, + ParameterSetFileVersion = 12345678 + }); + } } } diff --git a/src/MIDTesters.Core/ParameterSet/TestMid0013.cs b/src/MIDTesters.Core/ParameterSet/TestMid0013.cs index 0ce19d6d..ac39823d 100644 --- a/src/MIDTesters.Core/ParameterSet/TestMid0013.cs +++ b/src/MIDTesters.Core/ParameterSet/TestMid0013.cs @@ -1,4 +1,6 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; using OpenProtocolInterpreter.ParameterSet; namespace MIDTesters.ParameterSet @@ -14,16 +16,16 @@ public void Mid0013Revision1() string pack = @"01040013 0100102Airbag1 0310403050012000600150007001400080036009007201000480"; var mid = _midInterpreter.Parse(pack); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.ParameterSetName); - Assert.IsNotNull(mid.RotationDirection); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.MinTorque); - Assert.IsNotNull(mid.MaxTorque); - Assert.IsNotNull(mid.TorqueFinalTarget); - Assert.IsNotNull(mid.MinAngle); - Assert.IsNotNull(mid.MaxAngle); - Assert.IsNotNull(mid.AngleFinalTarget); + Assert.AreEqual(1, mid.ParameterSetId); + Assert.AreEqual("Airbag1", mid.ParameterSetName.TrimEnd()); + Assert.AreEqual(RotationDirection.Clockwise, mid.RotationDirection); + Assert.AreEqual(3, mid.BatchSize); + Assert.AreEqual(12.00m, mid.MinTorque); + Assert.AreEqual(15.00m, mid.MaxTorque); + Assert.AreEqual(14.00m, mid.TorqueFinalTarget); + Assert.AreEqual(360, mid.MinAngle); + Assert.AreEqual(720, mid.MaxAngle); + Assert.AreEqual(480, mid.AngleFinalTarget); AssertEqualPackages(pack, mid, true); } @@ -35,16 +37,16 @@ public void Mid0013ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.ParameterSetName); - Assert.IsNotNull(mid.RotationDirection); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.MinTorque); - Assert.IsNotNull(mid.MaxTorque); - Assert.IsNotNull(mid.TorqueFinalTarget); - Assert.IsNotNull(mid.MinAngle); - Assert.IsNotNull(mid.MaxAngle); - Assert.IsNotNull(mid.AngleFinalTarget); + Assert.AreEqual(1, mid.ParameterSetId); + Assert.AreEqual("Airbag1", mid.ParameterSetName.TrimEnd()); + Assert.AreEqual(RotationDirection.Clockwise, mid.RotationDirection); + Assert.AreEqual(3, mid.BatchSize); + Assert.AreEqual(12.00m, mid.MinTorque); + Assert.AreEqual(15.00m, mid.MaxTorque); + Assert.AreEqual(14.00m, mid.TorqueFinalTarget); + Assert.AreEqual(360, mid.MinAngle); + Assert.AreEqual(720, mid.MaxAngle); + Assert.AreEqual(480, mid.AngleFinalTarget); AssertEqualPackages(bytes, mid, true); } @@ -55,18 +57,18 @@ public void Mid0013Revision2() string pack = @"01200013002 0100102Airbag1 03104030500120006001500070014000800360090072010004801102021112017854"; var mid = _midInterpreter.Parse(pack); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.ParameterSetName); - Assert.IsNotNull(mid.RotationDirection); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.MinTorque); - Assert.IsNotNull(mid.MaxTorque); - Assert.IsNotNull(mid.TorqueFinalTarget); - Assert.IsNotNull(mid.MinAngle); - Assert.IsNotNull(mid.MaxAngle); - Assert.IsNotNull(mid.AngleFinalTarget); - Assert.IsNotNull(mid.FirstTarget); - Assert.IsNotNull(mid.StartFinalAngle); + Assert.AreEqual(1, mid.ParameterSetId); + Assert.AreEqual("Airbag1", mid.ParameterSetName.TrimEnd()); + Assert.AreEqual(RotationDirection.Clockwise, mid.RotationDirection); + Assert.AreEqual(3, mid.BatchSize); + Assert.AreEqual(12.00m, mid.MinTorque); + Assert.AreEqual(15.00m, mid.MaxTorque); + Assert.AreEqual(14.00m, mid.TorqueFinalTarget); + Assert.AreEqual(360, mid.MinAngle); + Assert.AreEqual(720, mid.MaxAngle); + Assert.AreEqual(480, mid.AngleFinalTarget); + Assert.AreEqual(202.11m, mid.FirstTarget); + Assert.AreEqual(178.54m, mid.StartFinalAngle); AssertEqualPackages(pack, mid); } @@ -78,18 +80,18 @@ public void Mid0013ByteRevision2() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.ParameterSetName); - Assert.IsNotNull(mid.RotationDirection); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.MinTorque); - Assert.IsNotNull(mid.MaxTorque); - Assert.IsNotNull(mid.TorqueFinalTarget); - Assert.IsNotNull(mid.MinAngle); - Assert.IsNotNull(mid.MaxAngle); - Assert.IsNotNull(mid.AngleFinalTarget); - Assert.IsNotNull(mid.FirstTarget); - Assert.IsNotNull(mid.StartFinalAngle); + Assert.AreEqual(1, mid.ParameterSetId); + Assert.AreEqual("Airbag1", mid.ParameterSetName.TrimEnd()); + Assert.AreEqual(RotationDirection.Clockwise, mid.RotationDirection); + Assert.AreEqual(3, mid.BatchSize); + Assert.AreEqual(12.00m, mid.MinTorque); + Assert.AreEqual(15.00m, mid.MaxTorque); + Assert.AreEqual(14.00m, mid.TorqueFinalTarget); + Assert.AreEqual(360, mid.MinAngle); + Assert.AreEqual(720, mid.MaxAngle); + Assert.AreEqual(480, mid.AngleFinalTarget); + Assert.AreEqual(202.11m, mid.FirstTarget); + Assert.AreEqual(178.54m, mid.StartFinalAngle); AssertEqualPackages(bytes, mid); } @@ -100,19 +102,19 @@ public void Mid0013Revision5() string pack = @"01410013005 0100102Airbag1 03104030500120006001500070014000800360090072010004801102021112017854132001-05-29:12:34:33"; var mid = _midInterpreter.Parse(pack); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.ParameterSetName); - Assert.IsNotNull(mid.RotationDirection); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.MinTorque); - Assert.IsNotNull(mid.MaxTorque); - Assert.IsNotNull(mid.TorqueFinalTarget); - Assert.IsNotNull(mid.MinAngle); - Assert.IsNotNull(mid.MaxAngle); - Assert.IsNotNull(mid.AngleFinalTarget); - Assert.IsNotNull(mid.FirstTarget); - Assert.IsNotNull(mid.StartFinalAngle); - Assert.IsNotNull(mid.LastChangeInParameterSet); + Assert.AreEqual(1, mid.ParameterSetId); + Assert.AreEqual("Airbag1", mid.ParameterSetName.TrimEnd()); + Assert.AreEqual(RotationDirection.Clockwise, mid.RotationDirection); + Assert.AreEqual(3, mid.BatchSize); + Assert.AreEqual(12.00m, mid.MinTorque); + Assert.AreEqual(15.00m, mid.MaxTorque); + Assert.AreEqual(14.00m, mid.TorqueFinalTarget); + Assert.AreEqual(360, mid.MinAngle); + Assert.AreEqual(720, mid.MaxAngle); + Assert.AreEqual(480, mid.AngleFinalTarget); + Assert.AreEqual(202.11m, mid.FirstTarget); + Assert.AreEqual(178.54m, mid.StartFinalAngle); + Assert.AreEqual(new DateTime(2001, 5, 29, 12, 34, 33), mid.LastChangeInParameterSet); AssertEqualPackages(pack, mid); } @@ -124,20 +126,73 @@ public void Mid0013ByteRevision5() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.ParameterSetName); - Assert.IsNotNull(mid.RotationDirection); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.MinTorque); - Assert.IsNotNull(mid.MaxTorque); - Assert.IsNotNull(mid.TorqueFinalTarget); - Assert.IsNotNull(mid.MinAngle); - Assert.IsNotNull(mid.MaxAngle); - Assert.IsNotNull(mid.AngleFinalTarget); - Assert.IsNotNull(mid.FirstTarget); - Assert.IsNotNull(mid.StartFinalAngle); - Assert.IsNotNull(mid.LastChangeInParameterSet); + Assert.AreEqual(1, mid.ParameterSetId); + Assert.AreEqual("Airbag1", mid.ParameterSetName.TrimEnd()); + Assert.AreEqual(RotationDirection.Clockwise, mid.RotationDirection); + Assert.AreEqual(3, mid.BatchSize); + Assert.AreEqual(12.00m, mid.MinTorque); + Assert.AreEqual(15.00m, mid.MaxTorque); + Assert.AreEqual(14.00m, mid.TorqueFinalTarget); + Assert.AreEqual(360, mid.MinAngle); + Assert.AreEqual(720, mid.MaxAngle); + Assert.AreEqual(480, mid.AngleFinalTarget); + Assert.AreEqual(202.11m, mid.FirstTarget); + Assert.AreEqual(178.54m, mid.StartFinalAngle); + Assert.AreEqual(new DateTime(2001, 5, 29, 12, 34, 33), mid.LastChangeInParameterSet); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0013PackRevision1() + { + string package = "01040013 0100102Airbag1 0310403050012000600150007001400080036009007201000480"; + + AssertBuildAndParse(package, BuildMid0013(1), true); + } + + [TestMethod] + [TestCategory("Revision 2"), TestCategory("Pack")] + public void Mid0013PackRevision2() + { + string package = @"01200013002 0100102Airbag1 03104030500120006001500070014000800360090072010004801102021112017854"; + + var mid = BuildMid0013(2); + mid.FirstTarget = 202.11m; + mid.StartFinalAngle = 178.54m; + + AssertBuildAndParse(package, mid); + } + + [TestMethod] + [TestCategory("Revision 5"), TestCategory("Pack")] + public void Mid0013PackRevision5() + { + string package = @"01410013005 0100102Airbag1 03104030500120006001500070014000800360090072010004801102021112017854132001-05-29:12:34:33"; + + var mid = BuildMid0013(5); + mid.FirstTarget = 202.11m; + mid.StartFinalAngle = 178.54m; + mid.LastChangeInParameterSet = new DateTime(2001, 5, 29, 12, 34, 33); + + AssertBuildAndParse(package, mid); + } + + private static Mid0013 BuildMid0013(int revision) + { + return new Mid0013(revision) + { + ParameterSetId = 1, + ParameterSetName = "Airbag1", + RotationDirection = RotationDirection.Clockwise, + BatchSize = 3, + MinTorque = 12, + MaxTorque = 15, + TorqueFinalTarget = 14, + MinAngle = 360, + MaxAngle = 720, + AngleFinalTarget = 480 + }; + } } } diff --git a/src/MIDTesters.Core/ParameterSet/TestMid0014.cs b/src/MIDTesters.Core/ParameterSet/TestMid0014.cs index 362fc751..5d93a2a9 100644 --- a/src/MIDTesters.Core/ParameterSet/TestMid0014.cs +++ b/src/MIDTesters.Core/ParameterSet/TestMid0014.cs @@ -29,5 +29,14 @@ public void Mid0014ByteRevision1() Assert.AreEqual(typeof(Mid0014), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0014PackRevision1() + { + string package = "00200014 "; + + AssertBuildAndParse(package, new Mid0014(), true); + } } } diff --git a/src/MIDTesters.Core/ParameterSet/TestMid0015.cs b/src/MIDTesters.Core/ParameterSet/TestMid0015.cs index 713dc422..8ce3fc4a 100644 --- a/src/MIDTesters.Core/ParameterSet/TestMid0015.cs +++ b/src/MIDTesters.Core/ParameterSet/TestMid0015.cs @@ -1,4 +1,6 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; using OpenProtocolInterpreter.ParameterSet; namespace MIDTesters.ParameterSet @@ -14,8 +16,8 @@ public void Mid0015Revision1() string package = "00420015001 0022017-06-02:09:54:09"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.LastChangeInParameterSet); + Assert.AreEqual(2, mid.ParameterSetId); + Assert.AreEqual(new DateTime(2017, 6, 2, 9, 54, 9), mid.LastChangeInParameterSet); AssertEqualPackages(package, mid); } @@ -27,8 +29,8 @@ public void Mid0015ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.LastChangeInParameterSet); + Assert.AreEqual(2, mid.ParameterSetId); + Assert.AreEqual(new DateTime(2017, 6, 2, 9, 54, 9), mid.LastChangeInParameterSet); AssertEqualPackages(bytes, mid); } @@ -39,19 +41,19 @@ public void Mid0015Revision2() string package = "01410015002 0100202Airbag parameter 032017-06-02:09:54:0904205040600510107010009080050050900001109999911003601200123413001006"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.ParameterSetName); - Assert.IsNotNull(mid.LastChangeInParameterSet); - Assert.IsNotNull(mid.RotationDirection); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.MinTorque); - Assert.IsNotNull(mid.MaxTorque); - Assert.IsNotNull(mid.TorqueFinalTarget); - Assert.IsNotNull(mid.MinAngle); - Assert.IsNotNull(mid.MaxAngle); - Assert.IsNotNull(mid.AngleFinalTarget); - Assert.IsNotNull(mid.FirstTarget); - Assert.IsNotNull(mid.StartFinalAngle); + Assert.AreEqual(2, mid.ParameterSetId); + Assert.AreEqual("Airbag parameter", mid.ParameterSetName.TrimEnd()); + Assert.AreEqual(new DateTime(2017, 6, 2, 9, 54, 9), mid.LastChangeInParameterSet); + Assert.AreEqual(RotationDirection.Counterclockwise, mid.RotationDirection); + Assert.AreEqual(4, mid.BatchSize); + Assert.AreEqual(51.01m, mid.MinTorque); + Assert.AreEqual(100.09m, mid.MaxTorque); + Assert.AreEqual(50.05m, mid.TorqueFinalTarget); + Assert.AreEqual(1, mid.MinAngle); + Assert.AreEqual(99999, mid.MaxAngle); + Assert.AreEqual(360, mid.AngleFinalTarget); + Assert.AreEqual(12.34m, mid.FirstTarget); + Assert.AreEqual(10.06m, mid.StartFinalAngle); AssertEqualPackages(package, mid); } @@ -63,21 +65,57 @@ public void Mid0015ByteRevision2() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.ParameterSetName); - Assert.IsNotNull(mid.LastChangeInParameterSet); - Assert.IsNotNull(mid.RotationDirection); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.MinTorque); - Assert.IsNotNull(mid.MaxTorque); - Assert.IsNotNull(mid.TorqueFinalTarget); - Assert.IsNotNull(mid.MinAngle); - Assert.IsNotNull(mid.MaxAngle); - Assert.IsNotNull(mid.AngleFinalTarget); - Assert.IsNotNull(mid.FirstTarget); - Assert.IsNotNull(mid.StartFinalAngle); + Assert.AreEqual(2, mid.ParameterSetId); + Assert.AreEqual("Airbag parameter", mid.ParameterSetName.TrimEnd()); + Assert.AreEqual(new DateTime(2017, 6, 2, 9, 54, 9), mid.LastChangeInParameterSet); + Assert.AreEqual(RotationDirection.Counterclockwise, mid.RotationDirection); + Assert.AreEqual(4, mid.BatchSize); + Assert.AreEqual(51.01m, mid.MinTorque); + Assert.AreEqual(100.09m, mid.MaxTorque); + Assert.AreEqual(50.05m, mid.TorqueFinalTarget); + Assert.AreEqual(1, mid.MinAngle); + Assert.AreEqual(99999, mid.MaxAngle); + Assert.AreEqual(360, mid.AngleFinalTarget); + Assert.AreEqual(12.34m, mid.FirstTarget); + Assert.AreEqual(10.06m, mid.StartFinalAngle); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0015PackRevision1() + { + string package = "00420015001 0022017-06-02:09:54:09"; + + AssertBuildAndParse(package, new Mid0015(1) + { + ParameterSetId = 2, + LastChangeInParameterSet = new DateTime(2017, 6, 2, 9, 54, 9) + }); + } + + [TestMethod] + [TestCategory("Revision 2"), TestCategory("Pack")] + public void Mid0015PackRevision2() + { + string package = "01410015002 0100202Airbag parameter 032017-06-02:09:54:0904205040600510107010009080050050900001109999911003601200123413001006"; + + AssertBuildAndParse(package, new Mid0015(2) + { + ParameterSetId = 2, + LastChangeInParameterSet = new DateTime(2017, 6, 2, 9, 54, 9), + ParameterSetName = "Airbag parameter", + RotationDirection = RotationDirection.Counterclockwise, + BatchSize = 4, + MinTorque = 51.01m, + MaxTorque = 100.09m, + TorqueFinalTarget = 50.05m, + MinAngle = 1, + MaxAngle = 99999, + AngleFinalTarget = 360, + FirstTarget = 12.34m, + StartFinalAngle = 10.06m + }); + } } } - diff --git a/src/MIDTesters.Core/ParameterSet/TestMid0016.cs b/src/MIDTesters.Core/ParameterSet/TestMid0016.cs index 7c3fd72c..fabcbcbc 100644 --- a/src/MIDTesters.Core/ParameterSet/TestMid0016.cs +++ b/src/MIDTesters.Core/ParameterSet/TestMid0016.cs @@ -29,5 +29,14 @@ public void Mid0016ByteRevision1() Assert.AreEqual(typeof(Mid0016), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0016PackRevision1() + { + string package = "00200016 "; + + AssertBuildAndParse(package, new Mid0016(1), true); + } } } diff --git a/src/MIDTesters.Core/ParameterSet/TestMid0017.cs b/src/MIDTesters.Core/ParameterSet/TestMid0017.cs index 89f64d80..e633ff80 100644 --- a/src/MIDTesters.Core/ParameterSet/TestMid0017.cs +++ b/src/MIDTesters.Core/ParameterSet/TestMid0017.cs @@ -29,5 +29,14 @@ public void Mid0017ByteRevision1() Assert.AreEqual(typeof(Mid0017), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0017PackRevision1() + { + string package = "00200017 "; + + AssertBuildAndParse(package, new Mid0017(), true); + } } } diff --git a/src/MIDTesters.Core/ParameterSet/TestMid0018.cs b/src/MIDTesters.Core/ParameterSet/TestMid0018.cs index e9755ed5..7098fbcf 100644 --- a/src/MIDTesters.Core/ParameterSet/TestMid0018.cs +++ b/src/MIDTesters.Core/ParameterSet/TestMid0018.cs @@ -14,7 +14,7 @@ public void Mid0018Revision1() string package = "00230018001 022"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.ParameterSetId); + Assert.AreEqual(22, mid.ParameterSetId); AssertEqualPackages(package, mid); } @@ -26,8 +26,20 @@ public void Mid0018ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.ParameterSetId); + Assert.AreEqual(22, mid.ParameterSetId); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0018PackRevision1() + { + string package = "00230018001 022"; + + AssertBuildAndParse(package, new Mid0018() + { + ParameterSetId = 22 + }); + } } } diff --git a/src/MIDTesters.Core/ParameterSet/TestMid0019.cs b/src/MIDTesters.Core/ParameterSet/TestMid0019.cs index 5750551e..9a94ae8b 100644 --- a/src/MIDTesters.Core/ParameterSet/TestMid0019.cs +++ b/src/MIDTesters.Core/ParameterSet/TestMid0019.cs @@ -1,6 +1,7 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenProtocolInterpreter.ParameterSet; +using OpenProtocolInterpreter; namespace MIDTesters.ParameterSet { [TestClass] @@ -14,8 +15,8 @@ public void Mid0019Revision1() string package = "00250019 77750"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.BatchSize); + Assert.AreEqual(777, mid.ParameterSetId); + Assert.AreEqual(50, mid.BatchSize); AssertEqualPackages(package, mid, true); } @@ -27,8 +28,8 @@ public void Mid0019ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.BatchSize); + Assert.AreEqual(777, mid.ParameterSetId); + Assert.AreEqual(50, mid.BatchSize); AssertEqualPackages(bytes, mid, true); } @@ -39,8 +40,8 @@ public void Mid0019Revision2() string package = "00270019002 7770050"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.BatchSize); + Assert.AreEqual(777, mid.ParameterSetId); + Assert.AreEqual(50, mid.BatchSize); AssertEqualPackages(package, mid); } @@ -52,9 +53,35 @@ public void Mid0019ByteRevision2() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.BatchSize); + Assert.AreEqual(777, mid.ParameterSetId); + Assert.AreEqual(50, mid.BatchSize); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0019PackRevision1() + { + string package = "00250019 77750"; + + AssertBuildAndParse(package, new Mid0019() + { + ParameterSetId = 777, + BatchSize = 50 + }, true); + } + + [TestMethod] + [TestCategory("Revision 2"), TestCategory("Pack")] + public void Mid0019PackRevision2() + { + string package = "00270019002 7770050"; + + AssertBuildAndParse(package, new Mid0019(new Header() { Mid = Mid0019.MID, Revision = 2 }) + { + ParameterSetId = 777, + BatchSize = 50 + }); + } } } diff --git a/src/MIDTesters.Core/ParameterSet/TestMid0020.cs b/src/MIDTesters.Core/ParameterSet/TestMid0020.cs index 438d6a3f..f11c3b40 100644 --- a/src/MIDTesters.Core/ParameterSet/TestMid0020.cs +++ b/src/MIDTesters.Core/ParameterSet/TestMid0020.cs @@ -14,7 +14,7 @@ public void Mid0020Revision1() string package = "00230020 054"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.ParameterSetId); + Assert.AreEqual(54, mid.ParameterSetId); AssertEqualPackages(package, mid, true); } @@ -26,8 +26,20 @@ public void Mid0020ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.ParameterSetId); + Assert.AreEqual(54, mid.ParameterSetId); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0020PackRevision1() + { + string package = "00230020 054"; + + AssertBuildAndParse(package, new Mid0020() + { + ParameterSetId = 54 + }, true); + } } } diff --git a/src/MIDTesters.Core/ParameterSet/TestMid0021.cs b/src/MIDTesters.Core/ParameterSet/TestMid0021.cs index c06fbbac..ad1ad1eb 100644 --- a/src/MIDTesters.Core/ParameterSet/TestMid0021.cs +++ b/src/MIDTesters.Core/ParameterSet/TestMid0021.cs @@ -31,5 +31,14 @@ public void Mid0021ByteRevision1() Assert.IsTrue(mid.Header.NoAckFlag); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0021PackRevision1() + { + string package = "00200021 1 "; + + AssertBuildAndParse(package, new Mid0021(noAckFlag: true), true); + } } } diff --git a/src/MIDTesters.Core/ParameterSet/TestMid0022.cs b/src/MIDTesters.Core/ParameterSet/TestMid0022.cs index cce1cf5d..7fa5cf80 100644 --- a/src/MIDTesters.Core/ParameterSet/TestMid0022.cs +++ b/src/MIDTesters.Core/ParameterSet/TestMid0022.cs @@ -15,7 +15,7 @@ public void Mid0022Revision1() var mid = _midInterpreter.Parse(package); Assert.IsTrue(mid.Header.NoAckFlag); - Assert.IsNotNull(mid.RelayStatus); + Assert.IsTrue(mid.RelayStatus); AssertEqualPackages(package, mid, true); } @@ -28,8 +28,21 @@ public void Mid0022ByteRevision1() var mid = _midInterpreter.Parse(bytes); Assert.IsTrue(mid.Header.NoAckFlag); - Assert.IsNotNull(mid.RelayStatus); + Assert.IsTrue(mid.RelayStatus); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0022PackRevision1() + { + string package = "00210022 1 1"; + + AssertBuildAndParse(package, new Mid0022() + { + Header = { NoAckFlag = true }, + RelayStatus = true + }, true); + } } } diff --git a/src/MIDTesters.Core/ParameterSet/TestMid0023.cs b/src/MIDTesters.Core/ParameterSet/TestMid0023.cs index 68d6a64e..8b26315d 100644 --- a/src/MIDTesters.Core/ParameterSet/TestMid0023.cs +++ b/src/MIDTesters.Core/ParameterSet/TestMid0023.cs @@ -29,5 +29,14 @@ public void Mid0023ByteRevision1() Assert.AreEqual(typeof(Mid0023), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0023PackRevision1() + { + string package = "00200023 "; + + AssertBuildAndParse(package, new Mid0023(), true); + } } } diff --git a/src/MIDTesters.Core/ParameterSet/TestMid0024.cs b/src/MIDTesters.Core/ParameterSet/TestMid0024.cs index ae509f8d..f08ed054 100644 --- a/src/MIDTesters.Core/ParameterSet/TestMid0024.cs +++ b/src/MIDTesters.Core/ParameterSet/TestMid0024.cs @@ -29,5 +29,14 @@ public void Mid0024ByteRevision1() Assert.AreEqual(typeof(Mid0024), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0024PackRevision1() + { + string package = "00200024 "; + + AssertBuildAndParse(package, new Mid0024(), true); + } } } diff --git a/src/MIDTesters.Core/ParameterSet/TestMid2501.cs b/src/MIDTesters.Core/ParameterSet/TestMid2501.cs new file mode 100644 index 00000000..738e6d30 --- /dev/null +++ b/src/MIDTesters.Core/ParameterSet/TestMid2501.cs @@ -0,0 +1,63 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; +using OpenProtocolInterpreter.Communication; +using OpenProtocolInterpreter.ParameterSet; + +namespace MIDTesters.ParameterSet +{ + [TestClass] + [TestCategory("ParameterSet")] + public class TestMid2501 : DefaultMidTests + { + // [TestMethod] + // [TestCategory("Revision 1"), TestCategory("ASCII")] + // public void Mid2501Revision1() + // { + // string package = "00272501001 0010001"; + // var mid = _midInterpreter.Parse(package); + + // Assert.AreEqual(10, mid.ProgramId); + // Assert.AreEqual(NodeType.ParameterSet, mid.NodeType); + // AssertEqualPackages(package, mid); + // } + + // [TestMethod] + // [TestCategory("Revision 1"), TestCategory("ByteArray")] + // public void Mid2501ByteRevision1() + // { + // string package = "00272501001 0010001"; + // byte[] bytes = GetAsciiBytes(package); + // var mid = _midInterpreter.Parse(bytes); + + // Assert.AreEqual(10, mid.ProgramId); + // Assert.AreEqual(NodeType.ParameterSet, mid.NodeType); + // AssertEqualPackages(bytes, mid); + // } + + // [TestMethod] + // [TestCategory("Revision 1"), TestCategory("ASCII")] + // public void Mid2501ExtraDataRevision1() + // { + // string package = "00360006001 2501001070010001"; + // var mid = _midInterpreter.Parse(package); + // var extraDataMid = _midInterpreter.ParseExtra(mid); + // Assert.AreEqual(10, extraDataMid.ProgramId); + // Assert.AreEqual(NodeType.ParameterSet, extraDataMid.NodeType); + // AssertEqualPackages(package, mid); + // } + + // [TestMethod] + // [TestCategory("Revision 1"), TestCategory("ByteArray")] + // public void Mid2501ExtraDataByteRevision1() + // { + // string package = "00360006001 2501001070010001"; + // byte[] bytes = GetAsciiBytes(package); + // var mid = _midInterpreter.Parse(bytes); + // var extraDataMid = _midInterpreter.ParseExtra(mid); + + // Assert.AreEqual(10, extraDataMid.ProgramId); + // Assert.AreEqual(NodeType.ParameterSet, extraDataMid.NodeType); + // AssertEqualPackages(bytes, mid); + // } + } +} diff --git a/src/MIDTesters.Core/ParameterSet/TestMid2504.cs b/src/MIDTesters.Core/ParameterSet/TestMid2504.cs index 73216cd1..458a868a 100644 --- a/src/MIDTesters.Core/ParameterSet/TestMid2504.cs +++ b/src/MIDTesters.Core/ParameterSet/TestMid2504.cs @@ -1,4 +1,5 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter.Communication; using OpenProtocolInterpreter.ParameterSet; namespace MIDTesters.ParameterSet @@ -14,7 +15,7 @@ public void Mid2504Revision1() string package = "00232504001 010"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.ParameterSetId); + Assert.AreEqual(10, mid.ParameterSetId); AssertEqualPackages(package, mid); } @@ -26,8 +27,20 @@ public void Mid2504ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.ParameterSetId); + Assert.AreEqual(10, mid.ParameterSetId); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid2504PackRevision1() + { + string package = "00232504001 010"; + + AssertBuildAndParse(package, new Mid2504() + { + ParameterSetId = 10 + }); + } } } diff --git a/src/MIDTesters.Core/ParameterSet/TestMid2505.cs b/src/MIDTesters.Core/ParameterSet/TestMid2505.cs index 1b8d8047..af916e89 100644 --- a/src/MIDTesters.Core/ParameterSet/TestMid2505.cs +++ b/src/MIDTesters.Core/ParameterSet/TestMid2505.cs @@ -1,7 +1,10 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter.Communication; using OpenProtocolInterpreter.ParameterSet; -namespace MIDTesters.Core.ParameterSet +using OpenProtocolInterpreter; +using System.Collections.Generic; +namespace MIDTesters.ParameterSet { [TestClass] [TestCategory("ParameterSet")] @@ -16,7 +19,6 @@ public void Mid2505Revision1() Assert.AreEqual(10, mid.ParameterSetId); Assert.AreEqual(2, mid.NumberOfParameterDataFields); - Assert.IsNotNull(mid.VariableDataFields); Assert.AreEqual(2, mid.VariableDataFields.Count); AssertEqualPackages(package, mid); } @@ -29,8 +31,53 @@ public void Mid2505ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.ParameterSetId); + Assert.AreEqual(10, mid.ParameterSetId); AssertEqualPackages(bytes, mid); } + + // [TestMethod] + // [TestCategory("Revision 1"), TestCategory("ASCII")] + // public void Mid2505ExtraDataRevision1() + // { + // string package = "00910006001 25050016201000201000003010000000005010030190500000002022-08-12:13:33:22"; + // var mid = _midInterpreter.Parse(package); + + // var extraDataMid = _midInterpreter.ParseExtra(mid); + // Assert.AreEqual(10, extraDataMid.ParameterSetId); + // Assert.AreEqual(2, extraDataMid.NumberOfParameterDataFields); + // Assert.AreEqual(2, extraDataMid.VariableDataFields.Count); + // AssertEqualPackages(package, mid); + // } + + // [TestMethod] + // [TestCategory("Revision 1"), TestCategory("ByteArray")] + // public void Mid2505ExtraDataByteRevision1() + // { + // string package = "00350006001 250500106010000"; + // byte[] bytes = GetAsciiBytes(package); + // var mid = _midInterpreter.Parse(package); + + // var extraDataMid = _midInterpreter.ParseExtra(mid); + // Assert.AreEqual(10, extraDataMid.ParameterSetId); + // AssertEqualPackages(bytes, mid); + // } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid2505PackRevision1() + { + string package = "00822505001 01000201000003010000000005010030190500000002022-08-12:13:33:22"; + + AssertBuildAndParse(package, new Mid2505(1) + { + ParameterSetId = 10, + NumberOfParameterDataFields = 2, + VariableDataFields = new List() + { + new VariableDataField() { ParameterId = 1000, Length = 3, DataType = DataTypeDefinition.UnsignedInteger, Unit = DataUnitType.NoUnit, StepNumber = 0, DataValue = "005" }, + new VariableDataField() { ParameterId = 1003, Length = 19, DataType = DataTypeDefinition.Timestamp, Unit = DataUnitType.NoUnit, StepNumber = 0, DataValue = "2022-08-12:13:33:22" } + } + }); + } } } diff --git a/src/MIDTesters.Core/ParameterSet/TestMid2506.cs b/src/MIDTesters.Core/ParameterSet/TestMid2506.cs index 3ee7b155..94c0a0b8 100644 --- a/src/MIDTesters.Core/ParameterSet/TestMid2506.cs +++ b/src/MIDTesters.Core/ParameterSet/TestMid2506.cs @@ -1,7 +1,9 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; +using OpenProtocolInterpreter.Communication; using OpenProtocolInterpreter.ParameterSet; -namespace MIDTesters.Core.ParameterSet +namespace MIDTesters.ParameterSet { [TestClass] [TestCategory("ParameterSet")] @@ -14,8 +16,8 @@ public void Mid2506Revision1() string package = "00272506001 0030201"; var mid = _midInterpreter.Parse(package); - Assert.AreNotEqual(0, mid.ProgramId); - Assert.AreNotEqual(0, (int)mid.NodeType); + Assert.AreEqual(30, mid.ProgramId); + Assert.AreEqual(NodeType.MultistepTighteningProgram, mid.NodeType); AssertEqualPackages(package, mid); } @@ -27,9 +29,36 @@ public void Mid2506ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.AreNotEqual(0, mid.ProgramId); - Assert.AreNotEqual(0, (int)mid.NodeType); + Assert.AreEqual(30, mid.ProgramId); + Assert.AreEqual(NodeType.MultistepTighteningProgram, mid.NodeType); AssertEqualPackages(bytes, mid); } + + // [TestMethod] + // [TestCategory("Revision 1"), TestCategory("ASCII")] + // public void Mid2506ExtraDataRevision1() + // { + // string package = "00360006001 2506001070030201"; + // var mid = _midInterpreter.Parse(package); + + // var extraDataMid = _midInterpreter.ParseExtra(mid); + // Assert.AreEqual(30, extraDataMid.ProgramId); + // Assert.AreEqual(NodeType.MultistepTighteningProgram, extraDataMid.NodeType); + // AssertEqualPackages(package, mid); + // } + + // [TestMethod] + // [TestCategory("Revision 1"), TestCategory("ByteArray")] + // public void Mid2506ExtraDataByteRevision1() + // { + // string package = "00360006001 2506001070030201"; + // byte[] bytes = GetAsciiBytes(package); + // var mid = _midInterpreter.Parse(bytes); + + // var extraDataMid = _midInterpreter.ParseExtra(mid); + // Assert.AreEqual(30, extraDataMid.ProgramId); + // Assert.AreEqual(NodeType.MultistepTighteningProgram, extraDataMid.NodeType); + // AssertEqualPackages(bytes, mid); + // } } } diff --git a/src/MIDTesters.Core/PowerMACS/TestMid0105.cs b/src/MIDTesters.Core/PowerMACS/TestMid0105.cs index b89fdc2b..251b6898 100644 --- a/src/MIDTesters.Core/PowerMACS/TestMid0105.cs +++ b/src/MIDTesters.Core/PowerMACS/TestMid0105.cs @@ -61,7 +61,7 @@ public void Mid0105Revision3() var mid = _midInterpreter.Parse(pack); Assert.IsNotNull(mid.DataNumberSystem); - Assert.IsNotNull(mid.SendOnlyNewData); + Assert.IsTrue(mid.SendOnlyNewData); AssertEqualPackages(pack, mid); } @@ -74,7 +74,7 @@ public void Mid0105ByteRevision3() var mid = _midInterpreter.Parse(bytes); Assert.IsNotNull(mid.DataNumberSystem); - Assert.IsNotNull(mid.SendOnlyNewData); + Assert.IsTrue(mid.SendOnlyNewData); AssertEqualPackages(bytes, mid); } @@ -86,7 +86,7 @@ public void Mid0105Revision4() var mid = _midInterpreter.Parse(pack); Assert.IsNotNull(mid.DataNumberSystem); - Assert.IsNotNull(mid.SendOnlyNewData); + Assert.IsTrue(mid.SendOnlyNewData); AssertEqualPackages(pack, mid); } @@ -99,8 +99,55 @@ public void Mid0105ByteRevision4() var mid = _midInterpreter.Parse(bytes); Assert.IsNotNull(mid.DataNumberSystem); - Assert.IsNotNull(mid.SendOnlyNewData); + Assert.IsTrue(mid.SendOnlyNewData); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0105PackRevision1() + { + string pack = @"002001050011 "; + + AssertBuildAndParse(pack, new Mid0105(1, noAckFlag: true)); + } + + [TestMethod] + [TestCategory("Revision 2"), TestCategory("Pack")] + public void Mid0105PackRevision2() + { + string pack = @"003001050021 4294967295"; + + AssertBuildAndParse(pack, new Mid0105(2, noAckFlag: true) + { + DataNumberSystem = 4294967295L + }); + } + + [TestMethod] + [TestCategory("Revision 3"), TestCategory("Pack")] + public void Mid0105PackRevision3() + { + string pack = @"003101050031 42949672951"; + + AssertBuildAndParse(pack, new Mid0105(3, noAckFlag: true) + { + DataNumberSystem = 4294967295L, + SendOnlyNewData = true + }); + } + + [TestMethod] + [TestCategory("Revision 4"), TestCategory("Pack")] + public void Mid0105PackRevision4() + { + string pack = @"003101050041 32949672951"; + + AssertBuildAndParse(pack, new Mid0105(4, noAckFlag: true) + { + DataNumberSystem = 3294967295L, + SendOnlyNewData = true + }); + } } } diff --git a/src/MIDTesters.Core/PowerMACS/TestMid0106.cs b/src/MIDTesters.Core/PowerMACS/TestMid0106.cs index d6d359cc..0af4d571 100644 --- a/src/MIDTesters.Core/PowerMACS/TestMid0106.cs +++ b/src/MIDTesters.Core/PowerMACS/TestMid0106.cs @@ -1,6 +1,9 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; using OpenProtocolInterpreter.PowerMACS; +using System; +using System.Collections.Generic; namespace MIDTesters.PowerMACS { [TestClass] @@ -14,21 +17,21 @@ public void Mid0106Revision1() string pack = @"05050106 010502010300000381270401050231 062017-05-25:09:51:38071108Ap.320Nm Diant.P11 091101119BM384069HB066171 1204130114115116117329.9091835.854019360.00020310.000219999.002200.0000130214115116117328.73618-06.10219360.00020310.000219999.002200.0000130314115116117356.04518763.97619370.00020304.000219999.002200.0000130414115116117355.40718380.87219370.00020304.000219999.002200.00002302Data No Station I 100000027897Free No 1 I 100000000002"; var mid = _midInterpreter.Parse(pack); - Assert.IsNotNull(mid.TotalNumberOfMessages); - Assert.IsNotNull(mid.MessageNumber); - Assert.IsNotNull(mid.DataNumberSystem); - Assert.IsNotNull(mid.StationNumber); - Assert.IsNotNull(mid.StationName); - Assert.IsNotNull(mid.Time); - Assert.IsNotNull(mid.ModeNumber); - Assert.IsNotNull(mid.ModeName); - Assert.IsNotNull(mid.SimpleStatus); - Assert.IsNotNull(mid.PMStatus); - Assert.IsNotNull(mid.WpId); - Assert.IsNotNull(mid.NumberOfBolts); - Assert.IsNotNull(mid.BoltsData); - Assert.IsNotNull(mid.TotalSpecialValues); - Assert.IsNotNull(mid.SpecialValues); + Assert.AreEqual(5, mid.TotalNumberOfMessages); + Assert.AreEqual(1, mid.MessageNumber); + Assert.AreEqual(38127, mid.DataNumberSystem); + Assert.AreEqual(1, mid.StationNumber); + Assert.AreEqual("0231", mid.StationName.TrimEnd()); + Assert.AreEqual(new DateTime(2017, 5, 25, 9, 51, 38), mid.Time); + Assert.AreEqual(11, mid.ModeNumber); + Assert.AreEqual("Ap.320Nm Diant.P11", mid.ModeName.TrimEnd()); + Assert.IsTrue(mid.SimpleStatus); + Assert.AreEqual(PowerMacsStatus.Okr, mid.PMStatus); + Assert.AreEqual("9BM384069HB066171", mid.WpId.TrimEnd()); + Assert.AreEqual(4, mid.NumberOfBolts); + Assert.AreEqual(4, mid.BoltsData.Count); + Assert.AreEqual(2, mid.TotalSpecialValues); + Assert.AreEqual(2, mid.SpecialValues.Count); AssertEqualPackages(pack, mid, true); } @@ -40,22 +43,119 @@ public void Mid0106ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.TotalNumberOfMessages); - Assert.IsNotNull(mid.MessageNumber); - Assert.IsNotNull(mid.DataNumberSystem); - Assert.IsNotNull(mid.StationNumber); - Assert.IsNotNull(mid.StationName); - Assert.IsNotNull(mid.Time); - Assert.IsNotNull(mid.ModeNumber); - Assert.IsNotNull(mid.ModeName); - Assert.IsNotNull(mid.SimpleStatus); - Assert.IsNotNull(mid.PMStatus); - Assert.IsNotNull(mid.WpId); - Assert.IsNotNull(mid.NumberOfBolts); - Assert.IsNotNull(mid.BoltsData); - Assert.IsNotNull(mid.TotalSpecialValues); - Assert.IsNotNull(mid.SpecialValues); + Assert.AreEqual(5, mid.TotalNumberOfMessages); + Assert.AreEqual(1, mid.MessageNumber); + Assert.AreEqual(38127, mid.DataNumberSystem); + Assert.AreEqual(1, mid.StationNumber); + Assert.AreEqual("0231", mid.StationName.TrimEnd()); + Assert.AreEqual(new DateTime(2017, 5, 25, 9, 51, 38), mid.Time); + Assert.AreEqual(11, mid.ModeNumber); + Assert.AreEqual("Ap.320Nm Diant.P11", mid.ModeName.TrimEnd()); + Assert.IsTrue(mid.SimpleStatus); + Assert.AreEqual(PowerMacsStatus.Okr, mid.PMStatus); + Assert.AreEqual("9BM384069HB066171", mid.WpId.TrimEnd()); + Assert.AreEqual(4, mid.NumberOfBolts); + Assert.AreEqual(4, mid.BoltsData.Count); + Assert.AreEqual(2, mid.TotalSpecialValues); + Assert.AreEqual(2, mid.SpecialValues.Count); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0106PackRevision1() + { + string package = "05050106 010502010300000381270401050231 062017-05-25:09:51:38071108Ap.320Nm Diant.P11 091101119BM384069HB066171 1204130114115116117329.9091835.854019360.00020310.000219999.002200.0000130214115116117328.73618-06.10219360.00020310.000219999.002200.0000130314115116117356.04518763.97619370.00020304.000219999.002200.0000130414115116117355.40718380.87219370.00020304.000219999.002200.00002302Data No Station I 100000027897Free No 1 I 100000000002"; + + AssertBuildAndParse(package, new Mid0106(1) + { + TotalNumberOfMessages = 5, + MessageNumber = 1, + DataNumberSystem = 38127L, + StationNumber = 1, + StationName = "0231", + Time = new DateTime(2017, 5, 25, 9, 51, 38), + ModeNumber = 11, + ModeName = "Ap.320Nm Diant.P11", + SimpleStatus = true, + PMStatus = PowerMacsStatus.Okr, + WpId = "9BM384069HB066171", + NumberOfBolts = 4, + BoltsData = new List() + { + new BoltData() + { + OrdinalBoltNumber = 1, + SimpleBoltStatus = true, + TorqueStatus = TorqueStatus.BoltTorqueOk, + AngleStatus = AngleStatus.BoltAngleOk, + BoltTorque = 329.909m, + BoltAngle = 35.8540m, + BoltTorqueHighLimit = 360.000m, + BoltTorqueLowLimit = 310.000m, + BoltAngleHighLimit = 9999.00m, + BoltAngleLowLimit = 0.0000m + }, + new BoltData() + { + OrdinalBoltNumber = 2, + SimpleBoltStatus = true, + TorqueStatus = TorqueStatus.BoltTorqueOk, + AngleStatus = AngleStatus.BoltAngleOk, + BoltTorque = 328.736m, + BoltAngle = -6.102m, + BoltTorqueHighLimit = 360.000m, + BoltTorqueLowLimit = 310.000m, + BoltAngleHighLimit = 9999.00m, + BoltAngleLowLimit = 0.0000m + }, + new BoltData() + { + OrdinalBoltNumber = 3, + SimpleBoltStatus = true, + TorqueStatus = TorqueStatus.BoltTorqueOk, + AngleStatus = AngleStatus.BoltAngleOk, + BoltTorque = 356.045m, + BoltAngle = 763.976m, + BoltTorqueHighLimit = 370.000m, + BoltTorqueLowLimit = 304.000m, + BoltAngleHighLimit = 9999.00m, + BoltAngleLowLimit = 0.0000m + }, + new BoltData() + { + OrdinalBoltNumber = 4, + SimpleBoltStatus = true, + TorqueStatus = TorqueStatus.BoltTorqueOk, + AngleStatus = AngleStatus.BoltAngleOk, + BoltTorque = 355.407m, + BoltAngle = 380.872m, + BoltTorqueHighLimit = 370.000m, + BoltTorqueLowLimit = 304.000m, + BoltAngleHighLimit = 9999.00m, + BoltAngleLowLimit = 0.0000m + } + }, + SpecialValues = new List() + { + new SpecialValue() + { + VariableName = "Data No Station", + Type = "I", + Length = 10, + Value = "0000027897", + StepNumber = 0 + }, + new SpecialValue() + { + VariableName = "Free No 1", + Type = "I", + Length = 10, + Value = "0000000002", + StepNumber = 0 + } + } + }, true); + } } } diff --git a/src/MIDTesters.Core/PowerMACS/TestMid0107.cs b/src/MIDTesters.Core/PowerMACS/TestMid0107.cs index cf2045a3..70f64492 100644 --- a/src/MIDTesters.Core/PowerMACS/TestMid0107.cs +++ b/src/MIDTesters.Core/PowerMACS/TestMid0107.cs @@ -1,6 +1,9 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; using OpenProtocolInterpreter.PowerMACS; +using System; +using System.Collections.Generic; namespace MIDTesters.PowerMACS { [TestClass] @@ -14,21 +17,21 @@ public void Mid0107Revision1() string pack = @"03510107001 010202020300000381270401052017-05-25:09:51:3806000107My first bolt 08Ap.320Nm Diant.P11 09310 11E3211202Variable 1 I 1234567Variable 2 F 9999.9913002141Step Variable name 1I 765432101Step Variable name 2F 11.1234021501Special Value 1 S 13Got 13 digits01"; var mid = _midInterpreter.Parse(pack); - Assert.IsNotNull(mid.TotalNumberOfMessages); - Assert.IsNotNull(mid.MessageNumber); - Assert.IsNotNull(mid.DataNumberSystem); - Assert.IsNotNull(mid.StationNumber); - Assert.IsNotNull(mid.Time); - Assert.IsNotNull(mid.BoltNumber); - Assert.IsNotNull(mid.BoltName); - Assert.IsNotNull(mid.ProgramName); - Assert.IsNotNull(mid.PowerMacsStatus); - Assert.IsNotNull(mid.Errors); - Assert.IsNotNull(mid.CustomerErrorCode); - Assert.IsNotNull(mid.BoltResults); - Assert.IsNotNull(mid.StepResults); - Assert.IsNotNull(mid.AllStepDataSent); - Assert.IsNotNull(mid.SpecialValues); + Assert.AreEqual(2, mid.TotalNumberOfMessages); + Assert.AreEqual(2, mid.MessageNumber); + Assert.AreEqual(38127, mid.DataNumberSystem); + Assert.AreEqual(1, mid.StationNumber); + Assert.AreEqual(new DateTime(2017, 5, 25, 9, 51, 38), mid.Time); + Assert.AreEqual(1, mid.BoltNumber); + Assert.AreEqual("My first bolt", mid.BoltName.TrimEnd()); + Assert.AreEqual("Ap.320Nm Diant.P11", mid.ProgramName.TrimEnd()); + Assert.AreEqual(PowerMacsStatus.TermNok, mid.PowerMacsStatus); + Assert.AreEqual(" ", mid.Errors); + Assert.AreEqual("E321", mid.CustomerErrorCode); + Assert.AreEqual(2, mid.BoltResults.Count); + Assert.AreEqual(2, mid.StepResults.Count); + Assert.IsTrue(mid.AllStepDataSent); + Assert.AreEqual(1, mid.SpecialValues.Count); AssertEqualPackages(pack, mid); } @@ -40,22 +43,90 @@ public void Mid0107ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.TotalNumberOfMessages); - Assert.IsNotNull(mid.MessageNumber); - Assert.IsNotNull(mid.DataNumberSystem); - Assert.IsNotNull(mid.StationNumber); - Assert.IsNotNull(mid.Time); - Assert.IsNotNull(mid.BoltNumber); - Assert.IsNotNull(mid.BoltName); - Assert.IsNotNull(mid.ProgramName); - Assert.IsNotNull(mid.PowerMacsStatus); - Assert.IsNotNull(mid.Errors); - Assert.IsNotNull(mid.CustomerErrorCode); - Assert.IsNotNull(mid.BoltResults); - Assert.IsNotNull(mid.StepResults); - Assert.IsNotNull(mid.AllStepDataSent); - Assert.IsNotNull(mid.SpecialValues); + Assert.AreEqual(2, mid.TotalNumberOfMessages); + Assert.AreEqual(2, mid.MessageNumber); + Assert.AreEqual(38127, mid.DataNumberSystem); + Assert.AreEqual(1, mid.StationNumber); + Assert.AreEqual(new DateTime(2017, 5, 25, 9, 51, 38), mid.Time); + Assert.AreEqual(1, mid.BoltNumber); + Assert.AreEqual("My first bolt", mid.BoltName.TrimEnd()); + Assert.AreEqual("Ap.320Nm Diant.P11", mid.ProgramName.TrimEnd()); + Assert.AreEqual(PowerMacsStatus.TermNok, mid.PowerMacsStatus); + Assert.AreEqual(" ", mid.Errors); + Assert.AreEqual("E321", mid.CustomerErrorCode); + Assert.AreEqual(2, mid.BoltResults.Count); + Assert.AreEqual(2, mid.StepResults.Count); + Assert.IsTrue(mid.AllStepDataSent); + Assert.AreEqual(1, mid.SpecialValues.Count); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0107PackRevision1() + { + string package = "03510107001 010202020300000381270401052017-05-25:09:51:3806000107My first bolt 08Ap.320Nm Diant.P11 09310 11E3211202Variable 1 I 1234567Variable 2 F 9999.9913002141Step Variable name 1I 765432101Step Variable name 2F 11.1234021501Special Value 1 S 13Got 13 digits01"; + + AssertBuildAndParse(package, new Mid0107() + { + TotalNumberOfMessages = 2, + MessageNumber = 2, + DataNumberSystem = 38127L, + StationNumber = 1, + Time = new DateTime(2017, 5, 25, 9, 51, 38), + BoltNumber = 1, + BoltName = "My first bolt", + ProgramName = "Ap.320Nm Diant.P11", + PowerMacsStatus = PowerMacsStatus.TermNok, + Errors = "", + CustomerErrorCode = "E321", + NumberOfBoltResults = 2, + BoltResults = new List() + { + new BoltResult() + { + VariableName = "Variable 1", + Type = "I", + Value = 1234567 + }, + new BoltResult() + { + VariableName = "Variable 2", + Type = "F", + Value = 9999.99m + } + }, + NumberOfStepResults = 2, + AllStepDataSent = true, + StepResults = new List() + { + new StepResult() + { + VariableName = "Step Variable name 1", + Type = "I", + Value = 7654321, + StepNumber = 1 + }, + new StepResult() + { + VariableName = "Step Variable name 2", + Type = "F", + Value = 11.1234m, + StepNumber = 2 + } + }, + SpecialValues = new List() + { + new SpecialValue() + { + VariableName = "Special Value 1", + Type = "S", + Length = 13, + Value = "Got 13 digits", + StepNumber = 1 + } + } + }); + } } } diff --git a/src/MIDTesters.Core/PowerMACS/TestMid0108.cs b/src/MIDTesters.Core/PowerMACS/TestMid0108.cs index 5cec81c2..f7c1a465 100644 --- a/src/MIDTesters.Core/PowerMACS/TestMid0108.cs +++ b/src/MIDTesters.Core/PowerMACS/TestMid0108.cs @@ -14,7 +14,7 @@ public void Mid0108AllRevisions() string package = "00210108002 1"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.BoltData); + Assert.IsTrue(mid.BoltData); AssertEqualPackages(package, mid); } @@ -26,8 +26,20 @@ public void Mid0108ByteAllRevisions() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.BoltData); + Assert.IsTrue(mid.BoltData); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 2"), TestCategory("Pack")] + public void Mid0108PackAllRevisions() + { + string package = "00210108002 1"; + + AssertBuildAndParse(package, new Mid0108(2) + { + BoltData = true + }); + } } } diff --git a/src/MIDTesters.Core/PowerMACS/TestMid0109.cs b/src/MIDTesters.Core/PowerMACS/TestMid0109.cs index 9491f18e..6ce4f939 100644 --- a/src/MIDTesters.Core/PowerMACS/TestMid0109.cs +++ b/src/MIDTesters.Core/PowerMACS/TestMid0109.cs @@ -29,5 +29,16 @@ public void Mid0109ByteAllRevisions() Assert.AreEqual(typeof(Mid0109), mid.GetType()); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 2"), TestCategory("Pack")] + public void Mid0109PackAllRevisions() + { + string package = "00200109002 "; + + AssertBuildAndParse(package, new Mid0109(2) + { + }); + } } } diff --git a/src/MIDTesters.Core/Result/TestMid1201.cs b/src/MIDTesters.Core/Result/TestMid1201.cs index 2ab65e2a..b85942c9 100644 --- a/src/MIDTesters.Core/Result/TestMid1201.cs +++ b/src/MIDTesters.Core/Result/TestMid1201.cs @@ -1,30 +1,37 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; +using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenProtocolInterpreter.Result; -namespace MIDTesters.Core.Result +using OpenProtocolInterpreter; +using System; +using System.Collections.Generic; +namespace MIDTesters.Result { [TestClass] [TestCategory("Result")] public class TestMid1201 : DefaultMidTests { + private const string Revision1Package = "01581201 00200100000001532022-11-14:09:35:1000000300100001110012000301000003010000000005010030190500000002022-08-12:13:33:2201001006040000001TORQUE"; + private const string Revision2Package = "01621201002 00200100000001532022-11-14:09:35:10000000800300100001110012000301000003010000000005010030190500000002022-08-12:13:33:2201001006040000001TORQUE"; + private const string Revision3Package = "01771201003 00200100000001532022-11-14:09:35:10000000800300100300920011120093001204009400301000003010000000005010030190500000002022-08-12:13:33:2201001006040000001TORQUE"; + [TestMethod] [TestCategory("Revision 1"), TestCategory("ASCII")] public void Mid1201Revision1() { - string package = "00691201 00200100000001532022-11-14:09:35:1000000100100000"; - var mid = _midInterpreter.Parse(package); + var mid = _midInterpreter.Parse(Revision1Package); - AssertEqualPackages(package, mid, true); + AssertParsedMid1201(mid, revision: 1); + AssertEqualPackages(Revision1Package, mid, true); } [TestMethod] [TestCategory("Revision 1"), TestCategory("ByteArray")] public void Mid1201ByteRevision1() { - string package = "00691201 00200100000001532022-11-14:09:35:1000000100100000"; - byte[] bytes = GetAsciiBytes(package); + byte[] bytes = GetAsciiBytes(Revision1Package); var mid = _midInterpreter.Parse(bytes); + AssertParsedMid1201(mid, revision: 1); AssertEqualPackages(bytes, mid, true); } @@ -32,20 +39,20 @@ public void Mid1201ByteRevision1() [TestCategory("Revision 2"), TestCategory("ASCII")] public void Mid1201Revision2() { - string package = "00731201002 00200100000001532022-11-14:09:35:10000000800100100000"; - var mid = _midInterpreter.Parse(package); + var mid = _midInterpreter.Parse(Revision2Package); - AssertEqualPackages(package, mid); + AssertParsedMid1201(mid, revision: 2); + AssertEqualPackages(Revision2Package, mid); } [TestMethod] [TestCategory("Revision 2"), TestCategory("ByteArray")] public void Mid1201ByteRevision2() { - string package = "00731201002 00200100000001532022-11-14:09:35:10000000800100100000"; - byte[] bytes = GetAsciiBytes(package); + byte[] bytes = GetAsciiBytes(Revision2Package); var mid = _midInterpreter.Parse(bytes); + AssertParsedMid1201(mid, revision: 2); AssertEqualPackages(bytes, mid); } @@ -53,21 +60,156 @@ public void Mid1201ByteRevision2() [TestCategory("Revision 3"), TestCategory("ASCII")] public void Mid1201Revision3() { - string package = "00781201003 00200100000001532022-11-14:09:35:1000000080010010030092000"; - var mid = _midInterpreter.Parse(package); + var mid = _midInterpreter.Parse(Revision3Package); - AssertEqualPackages(package, mid); + AssertParsedMid1201(mid, revision: 3); + AssertEqualPackages(Revision3Package, mid); } [TestMethod] [TestCategory("Revision 3"), TestCategory("ByteArray")] public void Mid1201ByteRevision3() { - string package = "00781201003 00200100000001532022-11-14:09:35:1000000080010010030092000"; - byte[] bytes = GetAsciiBytes(package); + byte[] bytes = GetAsciiBytes(Revision3Package); var mid = _midInterpreter.Parse(bytes); + AssertParsedMid1201(mid, revision: 3); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid1201PackRevision1() + { + AssertBuildAndParse(Revision1Package, BuildMid1201(1), true); + } + + [TestMethod] + [TestCategory("Revision 2"), TestCategory("Pack")] + public void Mid1201PackRevision2() + { + var mid = BuildMid1201(2); + mid.RequestMid = 8; + + AssertBuildAndParse(Revision2Package, mid); + } + + [TestMethod] + [TestCategory("Revision 3"), TestCategory("Pack")] + public void Mid1201PackRevision3() + { + var mid = BuildMid1201(3); + mid.RequestMid = 8; + + AssertBuildAndParse(Revision3Package, mid); + } + + private static Mid1201 BuildMid1201(int revision) + { + return new Mid1201(revision) + { + TotalNumberOfMessages = 2, + MessageNumber = 1, + ResultDataIdentifier = 153, + Time = new DateTime(2022, 11, 14, 9, 35, 10), + ResultStatus = 0, + OperationType = OperationType.NonSynchronizedTightening, + ObjectDataList = BuildObjectDataList(revision), + VariableDataFields = BuildVariableDataFields() + }; + } + + /// + /// The object type and the reference object id only exist from revision 3 onwards, so they are left + /// at their default on the earlier revisions where they are not part of the message. + /// + private static List BuildObjectDataList(int revision) + { + if (revision < 3) + { + return new List() + { + new ObjectData() { Id = 10, Status = false }, + new ObjectData() { Id = 11, Status = true }, + new ObjectData() { Id = 12, Status = false } + }; + } + + return new List() + { + new ObjectData() { Id = 10, Status = false, ObjectType = ObjectType.TighteningSimulation, ReferenceObjectId = 92 }, + new ObjectData() { Id = 11, Status = true, ObjectType = ObjectType.TighteningProduction, ReferenceObjectId = 93 }, + new ObjectData() { Id = 12, Status = false, ObjectType = ObjectType.JointCheck, ReferenceObjectId = 94 } + }; + } + + private static List BuildVariableDataFields() + { + return new List() + { + new VariableDataField() { ParameterId = 1000, Length = 3, DataType = DataTypeDefinition.UnsignedInteger, Unit = DataUnitType.NoUnit, StepNumber = 0, DataValue = "005" }, + new VariableDataField() { ParameterId = 1003, Length = 19, DataType = DataTypeDefinition.Timestamp, Unit = DataUnitType.NoUnit, StepNumber = 0, DataValue = "2022-08-12:13:33:22" }, + new VariableDataField() { ParameterId = 1001, Length = 6, DataType = DataTypeDefinition.String, Unit = DataUnitType.NoUnit, StepNumber = 1, DataValue = "TORQUE" } + }; + } + + private static void AssertParsedMid1201(Mid1201 mid, int revision) + { + Assert.AreEqual(2, mid.TotalNumberOfMessages); + Assert.AreEqual(1, mid.MessageNumber); + Assert.AreEqual(153, mid.ResultDataIdentifier); + Assert.AreEqual(new DateTime(2022, 11, 14, 9, 35, 10), mid.Time); + Assert.AreEqual(0, mid.ResultStatus); + Assert.AreEqual(OperationType.NonSynchronizedTightening, mid.OperationType); + + if (revision > 1) + { + Assert.AreEqual(8, mid.RequestMid); + } + + Assert.AreEqual(3, mid.NumberOfObjects); + Assert.AreEqual(3, mid.ObjectDataList.Count); + Assert.AreEqual(10, mid.ObjectDataList[0].Id); + Assert.IsFalse(mid.ObjectDataList[0].Status); + Assert.AreEqual(11, mid.ObjectDataList[1].Id); + Assert.IsTrue(mid.ObjectDataList[1].Status); + Assert.AreEqual(12, mid.ObjectDataList[2].Id); + Assert.IsFalse(mid.ObjectDataList[2].Status); + + if (revision > 2) + { + Assert.AreEqual(ObjectType.TighteningSimulation, mid.ObjectDataList[0].ObjectType); + Assert.AreEqual(92, mid.ObjectDataList[0].ReferenceObjectId); + Assert.AreEqual(ObjectType.TighteningProduction, mid.ObjectDataList[1].ObjectType); + Assert.AreEqual(93, mid.ObjectDataList[1].ReferenceObjectId); + Assert.AreEqual(ObjectType.JointCheck, mid.ObjectDataList[2].ObjectType); + Assert.AreEqual(94, mid.ObjectDataList[2].ReferenceObjectId); + } + + Assert.AreEqual(3, mid.NumberOfDataFields); + Assert.AreEqual(3, mid.VariableDataFields.Count); + + var unsignedInteger = mid.VariableDataFields[0]; + Assert.AreEqual(1000, unsignedInteger.ParameterId); + Assert.AreEqual(3, unsignedInteger.Length); + Assert.AreEqual(DataTypeDefinition.UnsignedInteger, unsignedInteger.DataType); + Assert.AreEqual(DataUnitType.NoUnit, unsignedInteger.Unit); + Assert.AreEqual(0, unsignedInteger.StepNumber); + Assert.AreEqual("005", unsignedInteger.DataValue); + + var timestamp = mid.VariableDataFields[1]; + Assert.AreEqual(1003, timestamp.ParameterId); + Assert.AreEqual(19, timestamp.Length); + Assert.AreEqual(DataTypeDefinition.Timestamp, timestamp.DataType); + Assert.AreEqual(0, timestamp.StepNumber); + Assert.AreEqual("2022-08-12:13:33:22", timestamp.DataValue); + + var text = mid.VariableDataFields[2]; + Assert.AreEqual(1001, text.ParameterId); + Assert.AreEqual(6, text.Length); + Assert.AreEqual(DataTypeDefinition.String, text.DataType); + Assert.AreEqual(1, text.StepNumber); + Assert.AreEqual("TORQUE", text.DataValue); + } } } diff --git a/src/MIDTesters.Core/Result/TestMid1202.cs b/src/MIDTesters.Core/Result/TestMid1202.cs new file mode 100644 index 00000000..26670bcc --- /dev/null +++ b/src/MIDTesters.Core/Result/TestMid1202.cs @@ -0,0 +1,135 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; +using OpenProtocolInterpreter.Result; +using System.Collections.Generic; + +namespace MIDTesters.Result +{ + [TestClass] + [TestCategory("Result")] + public class TestMid1202 : DefaultMidTests + { + private const string Revision1Package = "01221202001 0020010000000153001000301000003010000000005010030190500000002022-08-12:13:33:2201001006040000001TORQUE"; + private const string Revision2Package = "01581202002 002001000000015300101b6d1a1e-4b3f-4b1a-9c2d-7f5e8a9b0c1d00301000003010000000005010030190500000002022-08-12:13:33:2201001006040000001TORQUE"; + private const string NodeGuid = "1b6d1a1e-4b3f-4b1a-9c2d-7f5e8a9b0c1d"; + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("ASCII")] + public void Mid1202Revision1() + { + var mid = _midInterpreter.Parse(Revision1Package); + + AssertParsedMid1202(mid, revision: 1); + AssertEqualPackages(Revision1Package, mid); + } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("ByteArray")] + public void Mid1202ByteRevision1() + { + byte[] bytes = GetAsciiBytes(Revision1Package); + var mid = _midInterpreter.Parse(bytes); + + AssertParsedMid1202(mid, revision: 1); + AssertEqualPackages(bytes, mid); + } + + [TestMethod] + [TestCategory("Revision 2"), TestCategory("ASCII")] + public void Mid1202Revision2() + { + var mid = _midInterpreter.Parse(Revision2Package); + + AssertParsedMid1202(mid, revision: 2); + AssertEqualPackages(Revision2Package, mid); + } + + [TestMethod] + [TestCategory("Revision 2"), TestCategory("ByteArray")] + public void Mid1202ByteRevision2() + { + byte[] bytes = GetAsciiBytes(Revision2Package); + var mid = _midInterpreter.Parse(bytes); + + AssertParsedMid1202(mid, revision: 2); + AssertEqualPackages(bytes, mid); + } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid1202PackRevision1() + { + AssertBuildAndParse(Revision1Package, BuildMid1202(1)); + } + + [TestMethod] + [TestCategory("Revision 2"), TestCategory("Pack")] + public void Mid1202PackRevision2() + { + var mid = BuildMid1202(2); + mid.NodeGuid = NodeGuid; + + AssertBuildAndParse(Revision2Package, mid); + } + + private static Mid1202 BuildMid1202(int revision) + { + return new Mid1202(new Header() { Mid = Mid1202.MID, Revision = revision }) + { + TotalNumberOfMessages = 2, + MessageNumber = 1, + ResultDataIdentifier = 153, + ObjectId = 10, + VariableDataFields = BuildVariableDataFields() + }; + } + + private static List BuildVariableDataFields() + { + return new List() + { + new VariableDataField() { ParameterId = 1000, Length = 3, DataType = DataTypeDefinition.UnsignedInteger, Unit = DataUnitType.NoUnit, StepNumber = 0, DataValue = "005" }, + new VariableDataField() { ParameterId = 1003, Length = 19, DataType = DataTypeDefinition.Timestamp, Unit = DataUnitType.NoUnit, StepNumber = 0, DataValue = "2022-08-12:13:33:22" }, + new VariableDataField() { ParameterId = 1001, Length = 6, DataType = DataTypeDefinition.String, Unit = DataUnitType.NoUnit, StepNumber = 1, DataValue = "TORQUE" } + }; + } + + private static void AssertParsedMid1202(Mid1202 mid, int revision) + { + Assert.AreEqual(2, mid.TotalNumberOfMessages); + Assert.AreEqual(1, mid.MessageNumber); + Assert.AreEqual(153, mid.ResultDataIdentifier); + Assert.AreEqual(10, mid.ObjectId); + + if (revision > 1) + { + Assert.AreEqual(NodeGuid, mid.NodeGuid); + } + + Assert.AreEqual(3, mid.NumberOfDataFields); + Assert.AreEqual(3, mid.VariableDataFields.Count); + + var unsignedInteger = mid.VariableDataFields[0]; + Assert.AreEqual(1000, unsignedInteger.ParameterId); + Assert.AreEqual(3, unsignedInteger.Length); + Assert.AreEqual(DataTypeDefinition.UnsignedInteger, unsignedInteger.DataType); + Assert.AreEqual(DataUnitType.NoUnit, unsignedInteger.Unit); + Assert.AreEqual(0, unsignedInteger.StepNumber); + Assert.AreEqual("005", unsignedInteger.DataValue); + + var timestamp = mid.VariableDataFields[1]; + Assert.AreEqual(1003, timestamp.ParameterId); + Assert.AreEqual(19, timestamp.Length); + Assert.AreEqual(DataTypeDefinition.Timestamp, timestamp.DataType); + Assert.AreEqual(0, timestamp.StepNumber); + Assert.AreEqual("2022-08-12:13:33:22", timestamp.DataValue); + + var text = mid.VariableDataFields[2]; + Assert.AreEqual(1001, text.ParameterId); + Assert.AreEqual(6, text.Length); + Assert.AreEqual(DataTypeDefinition.String, text.DataType); + Assert.AreEqual(1, text.StepNumber); + Assert.AreEqual("TORQUE", text.DataValue); + } + } +} diff --git a/src/MIDTesters.Core/Result/TestMid1203.cs b/src/MIDTesters.Core/Result/TestMid1203.cs new file mode 100644 index 00000000..082ea988 --- /dev/null +++ b/src/MIDTesters.Core/Result/TestMid1203.cs @@ -0,0 +1,42 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter.Result; + +namespace MIDTesters.Result +{ + [TestClass] + [TestCategory("Result")] + public class TestMid1203 : DefaultMidTests + { + private const string Revision1Package = "00201203001 "; + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("ASCII")] + public void Mid1203Revision1() + { + var mid = _midInterpreter.Parse(Revision1Package); + + Assert.AreEqual(typeof(Mid1203), mid.GetType()); + Assert.AreEqual(Mid1203.MID, mid.Header.Mid); + AssertEqualPackages(Revision1Package, mid); + } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("ByteArray")] + public void Mid1203ByteRevision1() + { + byte[] bytes = GetAsciiBytes(Revision1Package); + var mid = _midInterpreter.Parse(bytes); + + Assert.AreEqual(typeof(Mid1203), mid.GetType()); + Assert.AreEqual(Mid1203.MID, mid.Header.Mid); + AssertEqualPackages(bytes, mid); + } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid1203PackRevision1() + { + AssertBuildAndParse(Revision1Package, new Mid1203()); + } + } +} diff --git a/src/MIDTesters.Core/Statistic/TestMid0300.cs b/src/MIDTesters.Core/Statistic/TestMid0300.cs index a4870569..a1613352 100644 --- a/src/MIDTesters.Core/Statistic/TestMid0300.cs +++ b/src/MIDTesters.Core/Statistic/TestMid0300.cs @@ -1,4 +1,5 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; using OpenProtocolInterpreter.Statistic; namespace MIDTesters.Statistic @@ -14,8 +15,8 @@ public void Mid0300Revision1() string package = "00290300 010020202"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.HistogramType); + Assert.AreEqual(2, mid.ParameterSetId); + Assert.AreEqual(HistogramType.Current, mid.HistogramType); AssertEqualPackages(package, mid, true); } @@ -27,9 +28,22 @@ public void Mid0300ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.HistogramType); + Assert.AreEqual(2, mid.ParameterSetId); + Assert.AreEqual(HistogramType.Current, mid.HistogramType); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0300PackRevision1() + { + string package = "00290300 010020202"; + + AssertBuildAndParse(package, new Mid0300() + { + ParameterSetId = 2, + HistogramType = HistogramType.Current + }, true); + } } } diff --git a/src/MIDTesters.Core/Statistic/TestMid0301.cs b/src/MIDTesters.Core/Statistic/TestMid0301.cs index 08bb0f9f..22ee01ea 100644 --- a/src/MIDTesters.Core/Statistic/TestMid0301.cs +++ b/src/MIDTesters.Core/Statistic/TestMid0301.cs @@ -1,4 +1,5 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; using OpenProtocolInterpreter.Statistic; namespace MIDTesters.Statistic @@ -14,20 +15,20 @@ public void Mid0301Revision1() string package = "01070301 010020205031234560465432105999999061111072222083333094444105555116666127777138888149999"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.HistogramType); - Assert.IsNotNull(mid.SigmaHistogram); - Assert.IsNotNull(mid.MeanValueHistogram); - Assert.IsNotNull(mid.ClassRange); - Assert.IsNotNull(mid.FirstBar); - Assert.IsNotNull(mid.SecondBar); - Assert.IsNotNull(mid.ThirdBar); - Assert.IsNotNull(mid.FourthBar); - Assert.IsNotNull(mid.FifthBar); - Assert.IsNotNull(mid.SixthBar); - Assert.IsNotNull(mid.SeventhBar); - Assert.IsNotNull(mid.EighthBar); - Assert.IsNotNull(mid.NinethBar); + Assert.AreEqual(2, mid.ParameterSetId); + Assert.AreEqual(HistogramType.RundownAngle, mid.HistogramType); + Assert.AreEqual(1234.56m, mid.SigmaHistogram); + Assert.AreEqual(6543.21m, mid.MeanValueHistogram); + Assert.AreEqual(9999.99m, mid.ClassRange); + Assert.AreEqual(1111, mid.FirstBar); + Assert.AreEqual(2222, mid.SecondBar); + Assert.AreEqual(3333, mid.ThirdBar); + Assert.AreEqual(4444, mid.FourthBar); + Assert.AreEqual(5555, mid.FifthBar); + Assert.AreEqual(6666, mid.SixthBar); + Assert.AreEqual(7777, mid.SeventhBar); + Assert.AreEqual(8888, mid.EighthBar); + Assert.AreEqual(9999, mid.NinethBar); AssertEqualPackages(package, mid, true); } @@ -39,21 +40,46 @@ public void Mid0301ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.HistogramType); - Assert.IsNotNull(mid.SigmaHistogram); - Assert.IsNotNull(mid.MeanValueHistogram); - Assert.IsNotNull(mid.ClassRange); - Assert.IsNotNull(mid.FirstBar); - Assert.IsNotNull(mid.SecondBar); - Assert.IsNotNull(mid.ThirdBar); - Assert.IsNotNull(mid.FourthBar); - Assert.IsNotNull(mid.FifthBar); - Assert.IsNotNull(mid.SixthBar); - Assert.IsNotNull(mid.SeventhBar); - Assert.IsNotNull(mid.EighthBar); - Assert.IsNotNull(mid.NinethBar); + Assert.AreEqual(2, mid.ParameterSetId); + Assert.AreEqual(HistogramType.RundownAngle, mid.HistogramType); + Assert.AreEqual(1234.56m, mid.SigmaHistogram); + Assert.AreEqual(6543.21m, mid.MeanValueHistogram); + Assert.AreEqual(9999.99m, mid.ClassRange); + Assert.AreEqual(1111, mid.FirstBar); + Assert.AreEqual(2222, mid.SecondBar); + Assert.AreEqual(3333, mid.ThirdBar); + Assert.AreEqual(4444, mid.FourthBar); + Assert.AreEqual(5555, mid.FifthBar); + Assert.AreEqual(6666, mid.SixthBar); + Assert.AreEqual(7777, mid.SeventhBar); + Assert.AreEqual(8888, mid.EighthBar); + Assert.AreEqual(9999, mid.NinethBar); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0301PackRevision1() + { + string package = "01070301 010020205031234560465432105999999061111072222083333094444105555116666127777138888149999"; + + AssertBuildAndParse(package, new Mid0301() + { + ParameterSetId = 2, + HistogramType = HistogramType.RundownAngle, + SigmaHistogram = 1234.56m, + MeanValueHistogram = 6543.21m, + ClassRange = 9999.99m, + FirstBar = 1111, + SecondBar = 2222, + ThirdBar = 3333, + FourthBar = 4444, + FifthBar = 5555, + SixthBar = 6666, + SeventhBar = 7777, + EighthBar = 8888, + NinethBar = 9999 + }, true); + } } } diff --git a/src/MIDTesters.Core/TestCollectionInitialization.cs b/src/MIDTesters.Core/TestCollectionInitialization.cs new file mode 100644 index 00000000..d3b6fc65 --- /dev/null +++ b/src/MIDTesters.Core/TestCollectionInitialization.cs @@ -0,0 +1,92 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; + +namespace MIDTesters +{ + /// + /// Every and holding a collection must hand it back already + /// initialized, so callers may add items to a freshly built instance and packing never dereferences null. + /// + [TestClass] + [TestCategory("Default")] + public class TestCollectionInitialization + { + [TestMethod] + public void EveryMidInitializesItsCollections() + => AssertCollectionsAreInitialized(typeof(Mid)); + + [TestMethod] + public void EveryExtraDataInitializesItsCollections() + => AssertCollectionsAreInitialized(typeof(ExtraData)); + + private static void AssertCollectionsAreInitialized(Type baseType) + { + var failures = new List(); + var types = baseType.Assembly.GetTypes() + .Where(x => x.IsPublic && x.IsClass && !x.IsAbstract && baseType.IsAssignableFrom(x)) + .OrderBy(x => x.FullName); + + foreach (var type in types) + { + var collections = GetCollectionProperties(type).ToList(); + if (collections.Count == 0) + continue; + + foreach (var constructor in type.GetConstructors()) + { + if (!TryBuildArguments(constructor, out var arguments)) + continue; + + var instance = constructor.Invoke(arguments); + foreach (var property in collections.Where(x => x.GetValue(instance) == null)) + { + failures.Add($"{type.Name}.{property.Name} is null when built by {Describe(constructor)}"); + } + } + } + + Assert.AreEqual(0, failures.Count, $"{failures.Count} collection(s) are left uninitialized:{Environment.NewLine}{string.Join(Environment.NewLine, failures)}"); + } + + private static IEnumerable GetCollectionProperties(Type type) + { + return type.GetProperties(BindingFlags.Public | BindingFlags.Instance) + .Where(x => x.CanRead && x.CanWrite + && x.PropertyType != typeof(string) + && typeof(IEnumerable).IsAssignableFrom(x.PropertyType)); + } + + /// + /// Mids and extra datas are built either with no arguments, from a or from a + /// revision number. Any other constructor is skipped instead of guessing a value for it. + /// + private static bool TryBuildArguments(ConstructorInfo constructor, out object[] arguments) + { + var parameters = constructor.GetParameters(); + arguments = new object[parameters.Length]; + + for (int i = 0; i < parameters.Length; i++) + { + if (parameters[i].ParameterType == typeof(Header)) + arguments[i] = new Header(); + else if (parameters[i].ParameterType == typeof(int)) + arguments[i] = 1; + else + return false; + } + + return true; + } + + private static string Describe(ConstructorInfo constructor) + { + var parameters = constructor.GetParameters().Select(x => x.ParameterType.Name); + return $"{constructor.DeclaringType.Name}({string.Join(", ", parameters)})"; + } + } +} diff --git a/src/MIDTesters.Core/TestCustomMid.cs b/src/MIDTesters.Core/TestCustomMid.cs index 9b871895..a2b528ef 100644 --- a/src/MIDTesters.Core/TestCustomMid.cs +++ b/src/MIDTesters.Core/TestCustomMid.cs @@ -3,6 +3,9 @@ using OpenProtocolInterpreter.Time; using System; using System.Collections.Generic; +using System.Linq; +using System.Reflection.Metadata; +using System.Threading.Tasks; namespace MIDTesters { @@ -57,7 +60,7 @@ public string FormattedDate public OverridedMid0081() { - + } public override string Pack() @@ -72,39 +75,12 @@ public class NewMid0083 : Mid private const int LAST_REVISION = 1; public const int MID = 83; - public DateTime Time - { - get => GetField(1, (int)DataFields.TIME).GetValue(OpenProtocolConvert.ToDateTime); - set => GetField(1, (int)DataFields.TIME).SetValue(OpenProtocolConvert.ToString, value); - } - public string TimeZone - { - get => GetField(1, (int)DataFields.TIMEZONE).Value; - set => GetField(1, (int)DataFields.TIMEZONE).SetValue(value); - } - + [TimestampDataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 19)] + public DateTime Time { get; set; } + [StringDataFieldDefinition(revision: 1, field: 2, Index = 41, Size = 2)] + public string TimeZone { get; set; } public NewMid0083() : base(MID, LAST_REVISION) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - new DataField((int)DataFields.TIME, 20, 19), - new DataField((int)DataFields.TIMEZONE, 41, 2) - } - } - }; - } - - public enum DataFields - { - TIME, - TIMEZONE - } } } diff --git a/src/MIDTesters.Core/TestMidEncoding.cs b/src/MIDTesters.Core/TestMidEncoding.cs new file mode 100644 index 00000000..b1548fd6 --- /dev/null +++ b/src/MIDTesters.Core/TestMidEncoding.cs @@ -0,0 +1,123 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; +using OpenProtocolInterpreter.Communication; +using System.Text; + +namespace MIDTesters +{ + /// + /// is a global setting, so this class must never run alongside + /// the other tests, otherwise they would pack/parse their packages with the encoding set here. + /// + [TestClass] + [TestCategory("Encoding")] + [DoNotParallelize] + public class TestMidEncoding + { + private const string NonAsciiControllerName = "Estação"; + + private readonly MidInterpreter _midInterpreter; + + public TestMidEncoding() + { + _midInterpreter = new MidInterpreter().UseAllMessages(); + } + + [TestCleanup] + public void RestoreDefaultEncoding() => Mid.DefaultEncoding = Encoding.ASCII; + + private static Mid0002 BuildMid() => new(revision: 1) + { + CellId = 1, + ChannelId = 1, + ControllerName = NonAsciiControllerName + }; + + [TestMethod] + public void TestDefaultEncodingIsAscii() + { + Assert.AreEqual(Encoding.ASCII, Mid.DefaultEncoding); + } + + [TestMethod] + public void TestDefaultEncodingNullFallbackToAscii() + { + Mid.DefaultEncoding = null; + Assert.AreEqual(Encoding.ASCII, Mid.DefaultEncoding); + } + + [TestMethod] + public void TestPackBytesUsesDefaultEncoding() + { + var mid = BuildMid(); + var package = mid.Pack(); + + Mid.DefaultEncoding = Encoding.Latin1; + + CollectionAssert.AreEqual(Encoding.Latin1.GetBytes(package), mid.PackBytes()); + } + + [TestMethod] + public void TestPackBytesWithNulUsesDefaultEncoding() + { + var mid = BuildMid(); + var package = mid.Pack(); + + Mid.DefaultEncoding = Encoding.Latin1; + + CollectionAssert.AreEqual(Encoding.Latin1.GetBytes(package + '\0'), mid.PackBytesWithNul()); + } + + [TestMethod] + public void TestPackBytesWithGivenEncodingDoesNotChangeTheDefault() + { + var mid = BuildMid(); + var package = mid.Pack(); + + CollectionAssert.AreEqual(Encoding.UTF8.GetBytes(package), mid.PackBytes(Encoding.UTF8)); + CollectionAssert.AreEqual(Encoding.UTF8.GetBytes(package + '\0'), mid.PackBytesWithNul(Encoding.UTF8)); + Assert.AreEqual(Encoding.ASCII, Mid.DefaultEncoding); + CollectionAssert.AreEqual(Encoding.ASCII.GetBytes(package), mid.PackBytes()); + } + + [TestMethod] + public void TestParseUsesDefaultEncoding() + { + Mid.DefaultEncoding = Encoding.Latin1; + + var bytes = BuildMid().PackBytes(); + var parsed = _midInterpreter.Parse(bytes); + + Assert.AreEqual(NonAsciiControllerName, parsed.ControllerName.Trim()); + } + + [TestMethod] + public void TestParseWithGivenEncodingDoesNotChangeTheDefault() + { + var bytes = BuildMid().PackBytes(Encoding.Latin1); + + var parsed = _midInterpreter.Parse(bytes, Encoding.Latin1); + + Assert.AreEqual(NonAsciiControllerName, parsed.ControllerName.Trim()); + Assert.AreEqual(Encoding.ASCII, Mid.DefaultEncoding); + } + + [TestMethod] + public void TestParseFromMidInstanceUsesGivenEncoding() + { + var bytes = BuildMid().PackBytes(Encoding.Latin1); + + var parsed = (Mid0002)new Mid0002(revision: 1).Parse(bytes, Encoding.Latin1); + + Assert.AreEqual(NonAsciiControllerName, parsed.ControllerName.Trim()); + } + + [TestMethod] + public void TestAsciiEncodingReplacesNonAsciiCharacters() + { + var parsed = _midInterpreter.Parse(BuildMid().PackBytes()); + + Assert.AreEqual("Esta??o", parsed.ControllerName.Trim()); + } + } +} diff --git a/src/MIDTesters.Core/Tightening/TestMid0060.cs b/src/MIDTesters.Core/Tightening/TestMid0060.cs index f84b15db..f663f033 100644 --- a/src/MIDTesters.Core/Tightening/TestMid0060.cs +++ b/src/MIDTesters.Core/Tightening/TestMid0060.cs @@ -29,5 +29,16 @@ public void Mid0060ByteAllRevisions() Assert.AreEqual(typeof(Mid0060), mid.GetType()); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 998"), TestCategory("Pack")] + public void Mid0060PackAllRevisions() + { + string package = "00200060998 "; + + AssertBuildAndParse(package, new Mid0060(998) + { + }); + } } } diff --git a/src/MIDTesters.Core/Tightening/TestMid0061.cs b/src/MIDTesters.Core/Tightening/TestMid0061.cs index 700cae83..819eeeff 100644 --- a/src/MIDTesters.Core/Tightening/TestMid0061.cs +++ b/src/MIDTesters.Core/Tightening/TestMid0061.cs @@ -1,4 +1,6 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; +using System; using OpenProtocolInterpreter.Tightening; using System.Collections.Generic; @@ -16,29 +18,29 @@ public void Mid0061Revision1() var mid = _midInterpreter.Parse(pack); Assert.AreEqual(typeof(Mid0061), mid.GetType()); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.TorqueControllerName); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.TorqueMinLimit); - Assert.IsNotNull(mid.TorqueMaxLimit); - Assert.IsNotNull(mid.TorqueFinalTarget); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.AngleMinLimit); - Assert.IsNotNull(mid.AngleMaxLimit); - Assert.IsNotNull(mid.AngleFinalTarget); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.LastChangeInParameterSet); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TighteningId); + Assert.AreEqual(1, mid.CellId); + Assert.AreEqual(1, mid.ChannelId); + Assert.AreEqual("airbag7 ", mid.TorqueControllerName); + Assert.AreEqual("KPOL3456JKLO897 ", mid.VinNumber); + Assert.AreEqual(0, mid.JobId); + Assert.AreEqual(3, mid.ParameterSetId); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.IsFalse(mid.TighteningStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.AngleStatus); + Assert.AreEqual(8.40m, mid.TorqueMinLimit); + Assert.AreEqual(14m, mid.TorqueMaxLimit); + Assert.AreEqual(12m, mid.TorqueFinalTarget); + Assert.AreEqual(7.39m, mid.Torque); + Assert.AreEqual(0, mid.AngleMinLimit); + Assert.AreEqual(9999, mid.AngleMaxLimit); + Assert.AreEqual(0, mid.AngleFinalTarget); + Assert.AreEqual(0, mid.Angle); + Assert.AreEqual(new DateTime(2001, 6, 2, 9, 54, 9), mid.Timestamp); + Assert.AreEqual(new DateTime(2001, 5, 29, 12, 34, 33), mid.LastChangeInParameterSet); + Assert.AreEqual(BatchStatus.Ok, mid.BatchStatus); + Assert.AreEqual(345675, mid.TighteningId); AssertEqualPackages(pack, mid); } @@ -51,29 +53,29 @@ public void Mid0061ByteRevision1() var mid = _midInterpreter.Parse(bytes); Assert.AreEqual(typeof(Mid0061), mid.GetType()); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.TorqueControllerName); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.TorqueMinLimit); - Assert.IsNotNull(mid.TorqueMaxLimit); - Assert.IsNotNull(mid.TorqueFinalTarget); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.AngleMinLimit); - Assert.IsNotNull(mid.AngleMaxLimit); - Assert.IsNotNull(mid.AngleFinalTarget); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.LastChangeInParameterSet); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TighteningId); + Assert.AreEqual(1, mid.CellId); + Assert.AreEqual(1, mid.ChannelId); + Assert.AreEqual("airbag7 ", mid.TorqueControllerName); + Assert.AreEqual("KPOL3456JKLO897 ", mid.VinNumber); + Assert.AreEqual(0, mid.JobId); + Assert.AreEqual(3, mid.ParameterSetId); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.IsFalse(mid.TighteningStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.AngleStatus); + Assert.AreEqual(8.40m, mid.TorqueMinLimit); + Assert.AreEqual(14m, mid.TorqueMaxLimit); + Assert.AreEqual(12m, mid.TorqueFinalTarget); + Assert.AreEqual(7.39m, mid.Torque); + Assert.AreEqual(0, mid.AngleMinLimit); + Assert.AreEqual(9999, mid.AngleMaxLimit); + Assert.AreEqual(0, mid.AngleFinalTarget); + Assert.AreEqual(0, mid.Angle); + Assert.AreEqual(new DateTime(2001, 6, 2, 9, 54, 9), mid.Timestamp); + Assert.AreEqual(new DateTime(2001, 5, 29, 12, 34, 33), mid.LastChangeInParameterSet); + Assert.AreEqual(BatchStatus.Ok, mid.BatchStatus); + Assert.AreEqual(345675, mid.TighteningId); AssertEqualPackages(bytes, mid); } @@ -85,49 +87,52 @@ public void Mid0061Revision2() var mid = _midInterpreter.Parse(pack); Assert.AreEqual(typeof(Mid0061), mid.GetType()); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.TorqueControllerName); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(0, mid.CellId); + Assert.AreEqual(0, mid.ChannelId); + Assert.AreEqual("RA ST6.2 ETV100 ", mid.TorqueControllerName); + Assert.AreEqual(" ", mid.VinNumber); + Assert.AreEqual(0, mid.JobId); + Assert.AreEqual(1, mid.ParameterSetId); + Assert.AreEqual(Strategy.TorqueControlAndAngleMonitoring, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.IsFalse(mid.TighteningStatus); + Assert.AreEqual(BatchStatus.NotUsed, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.TorqueMinLimit); - Assert.IsNotNull(mid.TorqueMaxLimit); - Assert.IsNotNull(mid.TorqueFinalTarget); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.AngleMinLimit); - Assert.IsNotNull(mid.AngleMaxLimit); - Assert.IsNotNull(mid.AngleFinalTarget); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringMin); - Assert.IsNotNull(mid.CurrentMonitoringMax); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapMin); - Assert.IsNotNull(mid.SelftapMax); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMin); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMax); - Assert.IsNotNull(mid.PrevailTorque); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.LastChangeInParameterSet); + Assert.AreEqual(34m, mid.TorqueMinLimit); + Assert.AreEqual(46m, mid.TorqueMaxLimit); + Assert.AreEqual(40m, mid.TorqueFinalTarget); + Assert.AreEqual(5.05m, mid.Torque); + Assert.AreEqual(20, mid.AngleMinLimit); + Assert.AreEqual(420, mid.AngleMaxLimit); + Assert.AreEqual(0, mid.AngleFinalTarget); + Assert.AreEqual(0, mid.Angle); + Assert.AreEqual(100, mid.RundownAngleMin); + Assert.AreEqual(850, mid.RundownAngleMax); + Assert.AreEqual(4, mid.RundownAngle); + Assert.AreEqual(0, mid.CurrentMonitoringMin); + Assert.AreEqual(150, mid.CurrentMonitoringMax); + Assert.AreEqual(0, mid.CurrentMonitoringValue); + Assert.AreEqual(0m, mid.SelftapMin); + Assert.AreEqual(9999m, mid.SelftapMax); + Assert.AreEqual(0m, mid.SelftapTorque); + Assert.AreEqual(0m, mid.PrevailTorqueMonitoringMin); + Assert.AreEqual(0m, mid.PrevailTorqueMonitoringMax); + Assert.AreEqual(0m, mid.PrevailTorque); + Assert.AreEqual(184887, mid.TighteningId); + Assert.AreEqual(0, mid.JobSequenceNumber); + Assert.AreEqual(0, mid.SyncTighteningId); + Assert.AreEqual(" C0761275", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2020, 6, 25, 1, 4, 39), mid.Timestamp); + Assert.AreEqual(new DateTime(2020, 6, 24, 10, 48, 53), mid.LastChangeInParameterSet); AssertEqualPackages(pack, mid); } @@ -149,7 +154,7 @@ public void Mid0061ByteRevision2() { 0xAA, //1010 1010 0x03, //0000 0011 - 0x0A, //0000 1010 + 0x0A, //0000 1010 0xD1, //1101 0001 0x00, 0x00, @@ -171,49 +176,52 @@ public void Mid0061ByteRevision2() var mid = _midInterpreter.Parse(bytes.ToArray()); Assert.AreEqual(typeof(Mid0061), mid.GetType()); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.TorqueControllerName); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(1, mid.CellId); + Assert.AreEqual(1, mid.ChannelId); + Assert.AreEqual("airbag7 ", mid.TorqueControllerName); + Assert.AreEqual("KPOL3456JKLO897 ", mid.VinNumber); + Assert.AreEqual(6, mid.JobId); + Assert.AreEqual(3, mid.ParameterSetId); + Assert.AreEqual(Strategy.RotateSpindleReverse, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.IsFalse(mid.TighteningStatus); + Assert.AreEqual(BatchStatus.Nok, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.TorqueMinLimit); - Assert.IsNotNull(mid.TorqueMaxLimit); - Assert.IsNotNull(mid.TorqueFinalTarget); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.AngleMinLimit); - Assert.IsNotNull(mid.AngleMaxLimit); - Assert.IsNotNull(mid.AngleFinalTarget); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringMin); - Assert.IsNotNull(mid.CurrentMonitoringMax); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapMin); - Assert.IsNotNull(mid.SelftapMax); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMin); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMax); - Assert.IsNotNull(mid.PrevailTorque); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.LastChangeInParameterSet); + Assert.AreEqual(8.40m, mid.TorqueMinLimit); + Assert.AreEqual(14m, mid.TorqueMaxLimit); + Assert.AreEqual(12m, mid.TorqueFinalTarget); + Assert.AreEqual(7.39m, mid.Torque); + Assert.AreEqual(0, mid.AngleMinLimit); + Assert.AreEqual(9999, mid.AngleMaxLimit); + Assert.AreEqual(0, mid.AngleFinalTarget); + Assert.AreEqual(0, mid.Angle); + Assert.AreEqual(0, mid.RundownAngleMin); + Assert.AreEqual(9999, mid.RundownAngleMax); + Assert.AreEqual(5000, mid.RundownAngle); + Assert.AreEqual(0, mid.CurrentMonitoringMin); + Assert.AreEqual(50, mid.CurrentMonitoringMax); + Assert.AreEqual(45, mid.CurrentMonitoringValue); + Assert.AreEqual(0.10m, mid.SelftapMin); + Assert.AreEqual(1.25m, mid.SelftapMax); + Assert.AreEqual(5.48m, mid.SelftapTorque); + Assert.AreEqual(0.10m, mid.PrevailTorqueMonitoringMin); + Assert.AreEqual(9999m, mid.PrevailTorqueMonitoringMax); + Assert.AreEqual(5555m, mid.PrevailTorque); + Assert.AreEqual(4294967295, mid.TighteningId); + Assert.AreEqual(65500, mid.JobSequenceNumber); + Assert.AreEqual(60535, mid.SyncTighteningId); + Assert.AreEqual("ABCDEFG-123456", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2001, 6, 2, 9, 54, 9), mid.Timestamp); + Assert.AreEqual(new DateTime(2001, 5, 29, 12, 34, 33), mid.LastChangeInParameterSet); AssertEqualPackages(bytes, mid); } @@ -225,52 +233,55 @@ public void Mid0061Revision3() var mid = _midInterpreter.Parse(pack); Assert.AreEqual(typeof(Mid0061), mid.GetType()); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.TorqueControllerName); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(0, mid.CellId); + Assert.AreEqual(0, mid.ChannelId); + Assert.AreEqual("RA ST6.2 ETV100 ", mid.TorqueControllerName); + Assert.AreEqual(" ", mid.VinNumber); + Assert.AreEqual(0, mid.JobId); + Assert.AreEqual(1, mid.ParameterSetId); + Assert.AreEqual(Strategy.TorqueControlAndAngleMonitoring, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.IsFalse(mid.TighteningStatus); + Assert.AreEqual(BatchStatus.NotUsed, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.TorqueMinLimit); - Assert.IsNotNull(mid.TorqueMaxLimit); - Assert.IsNotNull(mid.TorqueFinalTarget); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.AngleMinLimit); - Assert.IsNotNull(mid.AngleMaxLimit); - Assert.IsNotNull(mid.AngleFinalTarget); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringMin); - Assert.IsNotNull(mid.CurrentMonitoringMax); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapMin); - Assert.IsNotNull(mid.SelftapMax); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMin); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMax); - Assert.IsNotNull(mid.PrevailTorque); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.LastChangeInParameterSet); - Assert.IsNotNull(mid.ParameterSetName); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); + Assert.AreEqual(34m, mid.TorqueMinLimit); + Assert.AreEqual(46m, mid.TorqueMaxLimit); + Assert.AreEqual(40m, mid.TorqueFinalTarget); + Assert.AreEqual(5.05m, mid.Torque); + Assert.AreEqual(20, mid.AngleMinLimit); + Assert.AreEqual(420, mid.AngleMaxLimit); + Assert.AreEqual(0, mid.AngleFinalTarget); + Assert.AreEqual(0, mid.Angle); + Assert.AreEqual(100, mid.RundownAngleMin); + Assert.AreEqual(850, mid.RundownAngleMax); + Assert.AreEqual(4, mid.RundownAngle); + Assert.AreEqual(0, mid.CurrentMonitoringMin); + Assert.AreEqual(150, mid.CurrentMonitoringMax); + Assert.AreEqual(0, mid.CurrentMonitoringValue); + Assert.AreEqual(0m, mid.SelftapMin); + Assert.AreEqual(9999m, mid.SelftapMax); + Assert.AreEqual(0m, mid.SelftapTorque); + Assert.AreEqual(0m, mid.PrevailTorqueMonitoringMin); + Assert.AreEqual(0m, mid.PrevailTorqueMonitoringMax); + Assert.AreEqual(0m, mid.PrevailTorque); + Assert.AreEqual(184887, mid.TighteningId); + Assert.AreEqual(0, mid.JobSequenceNumber); + Assert.AreEqual(0, mid.SyncTighteningId); + Assert.AreEqual(" C0761275", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2020, 6, 25, 1, 4, 39), mid.Timestamp); + Assert.AreEqual(new DateTime(2020, 6, 24, 10, 48, 53), mid.LastChangeInParameterSet); + Assert.AreEqual("Test Parameter Set ", mid.ParameterSetName); + Assert.AreEqual(TorqueValuesUnit.LbfFt, mid.TorqueValuesUnit); + Assert.AreEqual(ResultType.BypassParameterSetResult, mid.ResultType); AssertEqualPackages(pack, mid); } @@ -292,7 +303,7 @@ public void Mid0061ByteRevision3() { 0xAA, //1010 1010 0x03, //0000 0011 - 0x0A, //0000 1010 + 0x0A, //0000 1010 0xD1, //1101 0001 0x00, 0x00, @@ -314,52 +325,55 @@ public void Mid0061ByteRevision3() var mid = _midInterpreter.Parse(bytes.ToArray()); Assert.AreEqual(typeof(Mid0061), mid.GetType()); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.TorqueControllerName); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(1, mid.CellId); + Assert.AreEqual(1, mid.ChannelId); + Assert.AreEqual("airbag7 ", mid.TorqueControllerName); + Assert.AreEqual("KPOL3456JKLO897 ", mid.VinNumber); + Assert.AreEqual(6, mid.JobId); + Assert.AreEqual(3, mid.ParameterSetId); + Assert.AreEqual(Strategy.RotateSpindleReverse, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.IsFalse(mid.TighteningStatus); + Assert.AreEqual(BatchStatus.Nok, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.TorqueMinLimit); - Assert.IsNotNull(mid.TorqueMaxLimit); - Assert.IsNotNull(mid.TorqueFinalTarget); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.AngleMinLimit); - Assert.IsNotNull(mid.AngleMaxLimit); - Assert.IsNotNull(mid.AngleFinalTarget); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringMin); - Assert.IsNotNull(mid.CurrentMonitoringMax); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapMin); - Assert.IsNotNull(mid.SelftapMax); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMin); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMax); - Assert.IsNotNull(mid.PrevailTorque); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.LastChangeInParameterSet); - Assert.IsNotNull(mid.ParameterSetName); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); + Assert.AreEqual(8.40m, mid.TorqueMinLimit); + Assert.AreEqual(14m, mid.TorqueMaxLimit); + Assert.AreEqual(12m, mid.TorqueFinalTarget); + Assert.AreEqual(7.39m, mid.Torque); + Assert.AreEqual(0, mid.AngleMinLimit); + Assert.AreEqual(9999, mid.AngleMaxLimit); + Assert.AreEqual(0, mid.AngleFinalTarget); + Assert.AreEqual(0, mid.Angle); + Assert.AreEqual(0, mid.RundownAngleMin); + Assert.AreEqual(9999, mid.RundownAngleMax); + Assert.AreEqual(5000, mid.RundownAngle); + Assert.AreEqual(0, mid.CurrentMonitoringMin); + Assert.AreEqual(50, mid.CurrentMonitoringMax); + Assert.AreEqual(45, mid.CurrentMonitoringValue); + Assert.AreEqual(0.10m, mid.SelftapMin); + Assert.AreEqual(1.25m, mid.SelftapMax); + Assert.AreEqual(5.48m, mid.SelftapTorque); + Assert.AreEqual(0.10m, mid.PrevailTorqueMonitoringMin); + Assert.AreEqual(9999m, mid.PrevailTorqueMonitoringMax); + Assert.AreEqual(5555m, mid.PrevailTorque); + Assert.AreEqual(4294967295, mid.TighteningId); + Assert.AreEqual(65500, mid.JobSequenceNumber); + Assert.AreEqual(60535, mid.SyncTighteningId); + Assert.AreEqual("ABCDEFG-123456", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2001, 6, 2, 9, 54, 9), mid.Timestamp); + Assert.AreEqual(new DateTime(2001, 5, 29, 12, 34, 33), mid.LastChangeInParameterSet); + Assert.AreEqual("Test Parameter Set ", mid.ParameterSetName); + Assert.AreEqual(TorqueValuesUnit.LbfFt, mid.TorqueValuesUnit); + Assert.AreEqual(ResultType.BypassParameterSetResult, mid.ResultType); AssertEqualPackages(bytes, mid); } @@ -371,55 +385,58 @@ public void Mid0061Revision4() var mid = _midInterpreter.Parse(pack); Assert.AreEqual(typeof(Mid0061), mid.GetType()); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.TorqueControllerName); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(0, mid.CellId); + Assert.AreEqual(0, mid.ChannelId); + Assert.AreEqual("RA ST6.2 ETV100 ", mid.TorqueControllerName); + Assert.AreEqual(" ", mid.VinNumber); + Assert.AreEqual(0, mid.JobId); + Assert.AreEqual(1, mid.ParameterSetId); + Assert.AreEqual(Strategy.TorqueControlAndAngleMonitoring, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.IsFalse(mid.TighteningStatus); + Assert.AreEqual(BatchStatus.NotUsed, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.TorqueMinLimit); - Assert.IsNotNull(mid.TorqueMaxLimit); - Assert.IsNotNull(mid.TorqueFinalTarget); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.AngleMinLimit); - Assert.IsNotNull(mid.AngleMaxLimit); - Assert.IsNotNull(mid.AngleFinalTarget); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringMin); - Assert.IsNotNull(mid.CurrentMonitoringMax); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapMin); - Assert.IsNotNull(mid.SelftapMax); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMin); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMax); - Assert.IsNotNull(mid.PrevailTorque); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.LastChangeInParameterSet); - Assert.IsNotNull(mid.ParameterSetName); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); + Assert.AreEqual(34m, mid.TorqueMinLimit); + Assert.AreEqual(46m, mid.TorqueMaxLimit); + Assert.AreEqual(40m, mid.TorqueFinalTarget); + Assert.AreEqual(5.05m, mid.Torque); + Assert.AreEqual(20, mid.AngleMinLimit); + Assert.AreEqual(420, mid.AngleMaxLimit); + Assert.AreEqual(0, mid.AngleFinalTarget); + Assert.AreEqual(0, mid.Angle); + Assert.AreEqual(100, mid.RundownAngleMin); + Assert.AreEqual(850, mid.RundownAngleMax); + Assert.AreEqual(4, mid.RundownAngle); + Assert.AreEqual(0, mid.CurrentMonitoringMin); + Assert.AreEqual(150, mid.CurrentMonitoringMax); + Assert.AreEqual(0, mid.CurrentMonitoringValue); + Assert.AreEqual(0m, mid.SelftapMin); + Assert.AreEqual(9999m, mid.SelftapMax); + Assert.AreEqual(0m, mid.SelftapTorque); + Assert.AreEqual(0m, mid.PrevailTorqueMonitoringMin); + Assert.AreEqual(0m, mid.PrevailTorqueMonitoringMax); + Assert.AreEqual(0m, mid.PrevailTorque); + Assert.AreEqual(184887, mid.TighteningId); + Assert.AreEqual(0, mid.JobSequenceNumber); + Assert.AreEqual(0, mid.SyncTighteningId); + Assert.AreEqual(" C0761275", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2020, 6, 25, 1, 4, 39), mid.Timestamp); + Assert.AreEqual(new DateTime(2020, 6, 24, 10, 48, 53), mid.LastChangeInParameterSet); + Assert.AreEqual("Test Parameter Set ", mid.ParameterSetName); + Assert.AreEqual(TorqueValuesUnit.LbfFt, mid.TorqueValuesUnit); + Assert.AreEqual(ResultType.BypassParameterSetResult, mid.ResultType); + Assert.AreEqual("Identifier result part 2 ", mid.IdentifierResultPart2); + Assert.AreEqual("Identifier result part 3 ", mid.IdentifierResultPart3); + Assert.AreEqual("Identifier result part 4 ", mid.IdentifierResultPart4); AssertEqualPackages(pack, mid); } @@ -441,7 +458,7 @@ public void Mid0061ByteRevision4() { 0xAA, //1010 1010 0x03, //0000 0011 - 0x0A, //0000 1010 + 0x0A, //0000 1010 0xD1, //1101 0001 0x00, 0x00, @@ -463,55 +480,58 @@ public void Mid0061ByteRevision4() var mid = _midInterpreter.Parse(bytes.ToArray()); Assert.AreEqual(typeof(Mid0061), mid.GetType()); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.TorqueControllerName); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(1, mid.CellId); + Assert.AreEqual(1, mid.ChannelId); + Assert.AreEqual("airbag7 ", mid.TorqueControllerName); + Assert.AreEqual("KPOL3456JKLO897 ", mid.VinNumber); + Assert.AreEqual(6, mid.JobId); + Assert.AreEqual(3, mid.ParameterSetId); + Assert.AreEqual(Strategy.RotateSpindleReverse, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.IsFalse(mid.TighteningStatus); + Assert.AreEqual(BatchStatus.Nok, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.TorqueMinLimit); - Assert.IsNotNull(mid.TorqueMaxLimit); - Assert.IsNotNull(mid.TorqueFinalTarget); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.AngleMinLimit); - Assert.IsNotNull(mid.AngleMaxLimit); - Assert.IsNotNull(mid.AngleFinalTarget); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringMin); - Assert.IsNotNull(mid.CurrentMonitoringMax); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapMin); - Assert.IsNotNull(mid.SelftapMax); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMin); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMax); - Assert.IsNotNull(mid.PrevailTorque); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.LastChangeInParameterSet); - Assert.IsNotNull(mid.ParameterSetName); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); + Assert.AreEqual(8.40m, mid.TorqueMinLimit); + Assert.AreEqual(14m, mid.TorqueMaxLimit); + Assert.AreEqual(12m, mid.TorqueFinalTarget); + Assert.AreEqual(7.39m, mid.Torque); + Assert.AreEqual(0, mid.AngleMinLimit); + Assert.AreEqual(9999, mid.AngleMaxLimit); + Assert.AreEqual(0, mid.AngleFinalTarget); + Assert.AreEqual(0, mid.Angle); + Assert.AreEqual(0, mid.RundownAngleMin); + Assert.AreEqual(9999, mid.RundownAngleMax); + Assert.AreEqual(5000, mid.RundownAngle); + Assert.AreEqual(0, mid.CurrentMonitoringMin); + Assert.AreEqual(50, mid.CurrentMonitoringMax); + Assert.AreEqual(45, mid.CurrentMonitoringValue); + Assert.AreEqual(0.10m, mid.SelftapMin); + Assert.AreEqual(1.25m, mid.SelftapMax); + Assert.AreEqual(5.48m, mid.SelftapTorque); + Assert.AreEqual(0.10m, mid.PrevailTorqueMonitoringMin); + Assert.AreEqual(9999m, mid.PrevailTorqueMonitoringMax); + Assert.AreEqual(5555m, mid.PrevailTorque); + Assert.AreEqual(4294967295, mid.TighteningId); + Assert.AreEqual(65500, mid.JobSequenceNumber); + Assert.AreEqual(60535, mid.SyncTighteningId); + Assert.AreEqual("ABCDEFG-123456", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2001, 6, 2, 9, 54, 9), mid.Timestamp); + Assert.AreEqual(new DateTime(2001, 5, 29, 12, 34, 33), mid.LastChangeInParameterSet); + Assert.AreEqual("Test Parameter Set ", mid.ParameterSetName); + Assert.AreEqual(TorqueValuesUnit.LbfFt, mid.TorqueValuesUnit); + Assert.AreEqual(ResultType.BypassParameterSetResult, mid.ResultType); + Assert.AreEqual("Identifier result part 2 ", mid.IdentifierResultPart2); + Assert.AreEqual("Identifier result part 3 ", mid.IdentifierResultPart3); + Assert.AreEqual("Identifier result part 4 ", mid.IdentifierResultPart4); AssertEqualPackages(bytes, mid); } @@ -523,56 +543,59 @@ public void Mid0061Revision5() var mid = _midInterpreter.Parse(pack); Assert.AreEqual(typeof(Mid0061), mid.GetType()); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.TorqueControllerName); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(0, mid.CellId); + Assert.AreEqual(0, mid.ChannelId); + Assert.AreEqual("RA ST6.2 ETV100 ", mid.TorqueControllerName); + Assert.AreEqual(" ", mid.VinNumber); + Assert.AreEqual(0, mid.JobId); + Assert.AreEqual(1, mid.ParameterSetId); + Assert.AreEqual(Strategy.TorqueControlAndAngleMonitoring, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.IsFalse(mid.TighteningStatus); + Assert.AreEqual(BatchStatus.NotUsed, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.TorqueMinLimit); - Assert.IsNotNull(mid.TorqueMaxLimit); - Assert.IsNotNull(mid.TorqueFinalTarget); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.AngleMinLimit); - Assert.IsNotNull(mid.AngleMaxLimit); - Assert.IsNotNull(mid.AngleFinalTarget); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringMin); - Assert.IsNotNull(mid.CurrentMonitoringMax); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapMin); - Assert.IsNotNull(mid.SelftapMax); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMin); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMax); - Assert.IsNotNull(mid.PrevailTorque); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.LastChangeInParameterSet); - Assert.IsNotNull(mid.ParameterSetName); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); - Assert.IsNotNull(mid.CustomerTighteningErrorCode); + Assert.AreEqual(34m, mid.TorqueMinLimit); + Assert.AreEqual(46m, mid.TorqueMaxLimit); + Assert.AreEqual(40m, mid.TorqueFinalTarget); + Assert.AreEqual(5.05m, mid.Torque); + Assert.AreEqual(20, mid.AngleMinLimit); + Assert.AreEqual(420, mid.AngleMaxLimit); + Assert.AreEqual(0, mid.AngleFinalTarget); + Assert.AreEqual(0, mid.Angle); + Assert.AreEqual(100, mid.RundownAngleMin); + Assert.AreEqual(850, mid.RundownAngleMax); + Assert.AreEqual(4, mid.RundownAngle); + Assert.AreEqual(0, mid.CurrentMonitoringMin); + Assert.AreEqual(150, mid.CurrentMonitoringMax); + Assert.AreEqual(0, mid.CurrentMonitoringValue); + Assert.AreEqual(0m, mid.SelftapMin); + Assert.AreEqual(9999m, mid.SelftapMax); + Assert.AreEqual(0m, mid.SelftapTorque); + Assert.AreEqual(0m, mid.PrevailTorqueMonitoringMin); + Assert.AreEqual(0m, mid.PrevailTorqueMonitoringMax); + Assert.AreEqual(0m, mid.PrevailTorque); + Assert.AreEqual(184887, mid.TighteningId); + Assert.AreEqual(0, mid.JobSequenceNumber); + Assert.AreEqual(0, mid.SyncTighteningId); + Assert.AreEqual(" C0761275", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2020, 6, 25, 1, 4, 39), mid.Timestamp); + Assert.AreEqual(new DateTime(2020, 6, 24, 10, 48, 53), mid.LastChangeInParameterSet); + Assert.AreEqual("Test Parameter Set ", mid.ParameterSetName); + Assert.AreEqual(TorqueValuesUnit.LbfFt, mid.TorqueValuesUnit); + Assert.AreEqual(ResultType.BypassParameterSetResult, mid.ResultType); + Assert.AreEqual("Identifier result part 2 ", mid.IdentifierResultPart2); + Assert.AreEqual("Identifier result part 3 ", mid.IdentifierResultPart3); + Assert.AreEqual("Identifier result part 4 ", mid.IdentifierResultPart4); + Assert.AreEqual("E124", mid.CustomerTighteningErrorCode); AssertEqualPackages(pack, mid); } @@ -594,7 +617,7 @@ public void Mid0061ByteRevision5() { 0xAA, //1010 1010 0x03, //0000 0011 - 0x0A, //0000 1010 + 0x0A, //0000 1010 0xD1, //1101 0001 0x00, 0x00, @@ -616,56 +639,59 @@ public void Mid0061ByteRevision5() var mid = _midInterpreter.Parse(bytes.ToArray()); Assert.AreEqual(typeof(Mid0061), mid.GetType()); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.TorqueControllerName); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(1, mid.CellId); + Assert.AreEqual(1, mid.ChannelId); + Assert.AreEqual("airbag7 ", mid.TorqueControllerName); + Assert.AreEqual("KPOL3456JKLO897 ", mid.VinNumber); + Assert.AreEqual(6, mid.JobId); + Assert.AreEqual(3, mid.ParameterSetId); + Assert.AreEqual(Strategy.RotateSpindleReverse, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.IsFalse(mid.TighteningStatus); + Assert.AreEqual(BatchStatus.Nok, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.TorqueMinLimit); - Assert.IsNotNull(mid.TorqueMaxLimit); - Assert.IsNotNull(mid.TorqueFinalTarget); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.AngleMinLimit); - Assert.IsNotNull(mid.AngleMaxLimit); - Assert.IsNotNull(mid.AngleFinalTarget); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringMin); - Assert.IsNotNull(mid.CurrentMonitoringMax); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapMin); - Assert.IsNotNull(mid.SelftapMax); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMin); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMax); - Assert.IsNotNull(mid.PrevailTorque); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.LastChangeInParameterSet); - Assert.IsNotNull(mid.ParameterSetName); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); - Assert.IsNotNull(mid.CustomerTighteningErrorCode); + Assert.AreEqual(8.40m, mid.TorqueMinLimit); + Assert.AreEqual(14m, mid.TorqueMaxLimit); + Assert.AreEqual(12m, mid.TorqueFinalTarget); + Assert.AreEqual(7.39m, mid.Torque); + Assert.AreEqual(0, mid.AngleMinLimit); + Assert.AreEqual(9999, mid.AngleMaxLimit); + Assert.AreEqual(0, mid.AngleFinalTarget); + Assert.AreEqual(0, mid.Angle); + Assert.AreEqual(0, mid.RundownAngleMin); + Assert.AreEqual(9999, mid.RundownAngleMax); + Assert.AreEqual(5000, mid.RundownAngle); + Assert.AreEqual(0, mid.CurrentMonitoringMin); + Assert.AreEqual(50, mid.CurrentMonitoringMax); + Assert.AreEqual(45, mid.CurrentMonitoringValue); + Assert.AreEqual(0.10m, mid.SelftapMin); + Assert.AreEqual(1.25m, mid.SelftapMax); + Assert.AreEqual(5.48m, mid.SelftapTorque); + Assert.AreEqual(0.10m, mid.PrevailTorqueMonitoringMin); + Assert.AreEqual(9999m, mid.PrevailTorqueMonitoringMax); + Assert.AreEqual(5555m, mid.PrevailTorque); + Assert.AreEqual(4294967295, mid.TighteningId); + Assert.AreEqual(65500, mid.JobSequenceNumber); + Assert.AreEqual(60535, mid.SyncTighteningId); + Assert.AreEqual("ABCDEFG-123456", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2001, 6, 2, 9, 54, 9), mid.Timestamp); + Assert.AreEqual(new DateTime(2001, 5, 29, 12, 34, 33), mid.LastChangeInParameterSet); + Assert.AreEqual("Test Parameter Set ", mid.ParameterSetName); + Assert.AreEqual(TorqueValuesUnit.LbfFt, mid.TorqueValuesUnit); + Assert.AreEqual(ResultType.BypassParameterSetResult, mid.ResultType); + Assert.AreEqual("Identifier result part 2 ", mid.IdentifierResultPart2); + Assert.AreEqual("Identifier result part 3 ", mid.IdentifierResultPart3); + Assert.AreEqual("Identifier result part 4 ", mid.IdentifierResultPart4); + Assert.AreEqual("E124", mid.CustomerTighteningErrorCode); AssertEqualPackages(bytes, mid); } @@ -677,57 +703,60 @@ public void Mid0061Revision6() var mid = _midInterpreter.Parse(pack); Assert.AreEqual(typeof(Mid0061), mid.GetType()); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.TorqueControllerName); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(0, mid.CellId); + Assert.AreEqual(0, mid.ChannelId); + Assert.AreEqual("RA ST6.2 ETV100 ", mid.TorqueControllerName); + Assert.AreEqual(" ", mid.VinNumber); + Assert.AreEqual(0, mid.JobId); + Assert.AreEqual(1, mid.ParameterSetId); + Assert.AreEqual(Strategy.TorqueControlAndAngleMonitoring, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.IsFalse(mid.TighteningStatus); + Assert.AreEqual(BatchStatus.NotUsed, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.TorqueMinLimit); - Assert.IsNotNull(mid.TorqueMaxLimit); - Assert.IsNotNull(mid.TorqueFinalTarget); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.AngleMinLimit); - Assert.IsNotNull(mid.AngleMaxLimit); - Assert.IsNotNull(mid.AngleFinalTarget); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringMin); - Assert.IsNotNull(mid.CurrentMonitoringMax); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapMin); - Assert.IsNotNull(mid.SelftapMax); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMin); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMax); - Assert.IsNotNull(mid.PrevailTorque); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.LastChangeInParameterSet); - Assert.IsNotNull(mid.ParameterSetName); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); - Assert.IsNotNull(mid.CustomerTighteningErrorCode); - Assert.IsNotNull(mid.PrevailTorqueCompensateValue); + Assert.AreEqual(34m, mid.TorqueMinLimit); + Assert.AreEqual(46m, mid.TorqueMaxLimit); + Assert.AreEqual(40m, mid.TorqueFinalTarget); + Assert.AreEqual(5.05m, mid.Torque); + Assert.AreEqual(20, mid.AngleMinLimit); + Assert.AreEqual(420, mid.AngleMaxLimit); + Assert.AreEqual(0, mid.AngleFinalTarget); + Assert.AreEqual(0, mid.Angle); + Assert.AreEqual(100, mid.RundownAngleMin); + Assert.AreEqual(850, mid.RundownAngleMax); + Assert.AreEqual(4, mid.RundownAngle); + Assert.AreEqual(0, mid.CurrentMonitoringMin); + Assert.AreEqual(150, mid.CurrentMonitoringMax); + Assert.AreEqual(0, mid.CurrentMonitoringValue); + Assert.AreEqual(0m, mid.SelftapMin); + Assert.AreEqual(9999m, mid.SelftapMax); + Assert.AreEqual(0m, mid.SelftapTorque); + Assert.AreEqual(0m, mid.PrevailTorqueMonitoringMin); + Assert.AreEqual(0m, mid.PrevailTorqueMonitoringMax); + Assert.AreEqual(0m, mid.PrevailTorque); + Assert.AreEqual(184887, mid.TighteningId); + Assert.AreEqual(0, mid.JobSequenceNumber); + Assert.AreEqual(0, mid.SyncTighteningId); + Assert.AreEqual(" C0761275", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2020, 6, 25, 1, 4, 39), mid.Timestamp); + Assert.AreEqual(new DateTime(2020, 6, 24, 10, 48, 53), mid.LastChangeInParameterSet); + Assert.AreEqual("Test Parameter Set ", mid.ParameterSetName); + Assert.AreEqual(TorqueValuesUnit.LbfFt, mid.TorqueValuesUnit); + Assert.AreEqual(ResultType.BypassParameterSetResult, mid.ResultType); + Assert.AreEqual("Identifier result part 2 ", mid.IdentifierResultPart2); + Assert.AreEqual("Identifier result part 3 ", mid.IdentifierResultPart3); + Assert.AreEqual("Identifier result part 4 ", mid.IdentifierResultPart4); + Assert.AreEqual("E124", mid.CustomerTighteningErrorCode); + Assert.AreEqual(15m, mid.PrevailTorqueCompensateValue); Assert.IsNotNull(mid.TighteningErrorStatus2); AssertEqualPackages(pack, mid); } @@ -750,7 +779,7 @@ public void Mid0061ByteRevision6() { 0xAA, //1010 1010 0x03, //0000 0011 - 0x0A, //0000 1010 + 0x0A, //0000 1010 0xD1, //1101 0001 0x00, 0x00, @@ -763,7 +792,7 @@ public void Mid0061ByteRevision6() var tighteningErrorStatus2 = new byte[] //10 bytes long { 0xAA, //1010 1010 - 0x03, //0000 0011 + 0x03, //0000 0011 0x02, //0000 0010 0x00, //Reserved from bit 19 to rest 0x00, @@ -789,57 +818,60 @@ public void Mid0061ByteRevision6() var mid = _midInterpreter.Parse(bytes.ToArray()); Assert.AreEqual(typeof(Mid0061), mid.GetType()); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.TorqueControllerName); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(1, mid.CellId); + Assert.AreEqual(1, mid.ChannelId); + Assert.AreEqual("airbag7 ", mid.TorqueControllerName); + Assert.AreEqual("KPOL3456JKLO897 ", mid.VinNumber); + Assert.AreEqual(6, mid.JobId); + Assert.AreEqual(3, mid.ParameterSetId); + Assert.AreEqual(Strategy.RotateSpindleReverse, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.IsFalse(mid.TighteningStatus); + Assert.AreEqual(BatchStatus.Nok, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.TorqueMinLimit); - Assert.IsNotNull(mid.TorqueMaxLimit); - Assert.IsNotNull(mid.TorqueFinalTarget); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.AngleMinLimit); - Assert.IsNotNull(mid.AngleMaxLimit); - Assert.IsNotNull(mid.AngleFinalTarget); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringMin); - Assert.IsNotNull(mid.CurrentMonitoringMax); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapMin); - Assert.IsNotNull(mid.SelftapMax); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMin); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMax); - Assert.IsNotNull(mid.PrevailTorque); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.LastChangeInParameterSet); - Assert.IsNotNull(mid.ParameterSetName); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); - Assert.IsNotNull(mid.CustomerTighteningErrorCode); - Assert.IsNotNull(mid.PrevailTorqueCompensateValue); + Assert.AreEqual(8.40m, mid.TorqueMinLimit); + Assert.AreEqual(14m, mid.TorqueMaxLimit); + Assert.AreEqual(12m, mid.TorqueFinalTarget); + Assert.AreEqual(7.39m, mid.Torque); + Assert.AreEqual(0, mid.AngleMinLimit); + Assert.AreEqual(9999, mid.AngleMaxLimit); + Assert.AreEqual(0, mid.AngleFinalTarget); + Assert.AreEqual(0, mid.Angle); + Assert.AreEqual(0, mid.RundownAngleMin); + Assert.AreEqual(9999, mid.RundownAngleMax); + Assert.AreEqual(5000, mid.RundownAngle); + Assert.AreEqual(0, mid.CurrentMonitoringMin); + Assert.AreEqual(50, mid.CurrentMonitoringMax); + Assert.AreEqual(45, mid.CurrentMonitoringValue); + Assert.AreEqual(0.10m, mid.SelftapMin); + Assert.AreEqual(1.25m, mid.SelftapMax); + Assert.AreEqual(5.48m, mid.SelftapTorque); + Assert.AreEqual(0.10m, mid.PrevailTorqueMonitoringMin); + Assert.AreEqual(9999m, mid.PrevailTorqueMonitoringMax); + Assert.AreEqual(5555m, mid.PrevailTorque); + Assert.AreEqual(4294967295, mid.TighteningId); + Assert.AreEqual(65500, mid.JobSequenceNumber); + Assert.AreEqual(60535, mid.SyncTighteningId); + Assert.AreEqual("ABCDEFG-123456", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2001, 6, 2, 9, 54, 9), mid.Timestamp); + Assert.AreEqual(new DateTime(2001, 5, 29, 12, 34, 33), mid.LastChangeInParameterSet); + Assert.AreEqual("Test Parameter Set ", mid.ParameterSetName); + Assert.AreEqual(TorqueValuesUnit.LbfFt, mid.TorqueValuesUnit); + Assert.AreEqual(ResultType.BypassParameterSetResult, mid.ResultType); + Assert.AreEqual("Identifier result part 2 ", mid.IdentifierResultPart2); + Assert.AreEqual("Identifier result part 3 ", mid.IdentifierResultPart3); + Assert.AreEqual("Identifier result part 4 ", mid.IdentifierResultPart4); + Assert.AreEqual("E124", mid.CustomerTighteningErrorCode); + Assert.AreEqual(15m, mid.PrevailTorqueCompensateValue); Assert.IsNotNull(mid.TighteningErrorStatus2); AssertEqualPackages(bytes, mid); } @@ -852,60 +884,63 @@ public void Mid0061Revision7() var mid = _midInterpreter.Parse(pack); Assert.AreEqual(typeof(Mid0061), mid.GetType()); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.TorqueControllerName); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(0, mid.CellId); + Assert.AreEqual(0, mid.ChannelId); + Assert.AreEqual("RA ST6.2 ETV100 ", mid.TorqueControllerName); + Assert.AreEqual(" ", mid.VinNumber); + Assert.AreEqual(0, mid.JobId); + Assert.AreEqual(1, mid.ParameterSetId); + Assert.AreEqual(Strategy.TorqueControlAndAngleMonitoring, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.IsFalse(mid.TighteningStatus); + Assert.AreEqual(BatchStatus.NotUsed, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.TorqueMinLimit); - Assert.IsNotNull(mid.TorqueMaxLimit); - Assert.IsNotNull(mid.TorqueFinalTarget); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.AngleMinLimit); - Assert.IsNotNull(mid.AngleMaxLimit); - Assert.IsNotNull(mid.AngleFinalTarget); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringMin); - Assert.IsNotNull(mid.CurrentMonitoringMax); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapMin); - Assert.IsNotNull(mid.SelftapMax); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMin); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMax); - Assert.IsNotNull(mid.PrevailTorque); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.LastChangeInParameterSet); - Assert.IsNotNull(mid.ParameterSetName); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); - Assert.IsNotNull(mid.CustomerTighteningErrorCode); - Assert.IsNotNull(mid.PrevailTorqueCompensateValue); + Assert.AreEqual(34m, mid.TorqueMinLimit); + Assert.AreEqual(46m, mid.TorqueMaxLimit); + Assert.AreEqual(40m, mid.TorqueFinalTarget); + Assert.AreEqual(5.05m, mid.Torque); + Assert.AreEqual(20, mid.AngleMinLimit); + Assert.AreEqual(420, mid.AngleMaxLimit); + Assert.AreEqual(0, mid.AngleFinalTarget); + Assert.AreEqual(0, mid.Angle); + Assert.AreEqual(100, mid.RundownAngleMin); + Assert.AreEqual(850, mid.RundownAngleMax); + Assert.AreEqual(4, mid.RundownAngle); + Assert.AreEqual(0, mid.CurrentMonitoringMin); + Assert.AreEqual(150, mid.CurrentMonitoringMax); + Assert.AreEqual(0, mid.CurrentMonitoringValue); + Assert.AreEqual(0m, mid.SelftapMin); + Assert.AreEqual(9999m, mid.SelftapMax); + Assert.AreEqual(0m, mid.SelftapTorque); + Assert.AreEqual(0m, mid.PrevailTorqueMonitoringMin); + Assert.AreEqual(0m, mid.PrevailTorqueMonitoringMax); + Assert.AreEqual(0m, mid.PrevailTorque); + Assert.AreEqual(184887, mid.TighteningId); + Assert.AreEqual(0, mid.JobSequenceNumber); + Assert.AreEqual(0, mid.SyncTighteningId); + Assert.AreEqual(" C0761275", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2020, 6, 25, 1, 4, 39), mid.Timestamp); + Assert.AreEqual(new DateTime(2020, 6, 24, 10, 48, 53), mid.LastChangeInParameterSet); + Assert.AreEqual("Test Parameter Set ", mid.ParameterSetName); + Assert.AreEqual(TorqueValuesUnit.LbfFt, mid.TorqueValuesUnit); + Assert.AreEqual(ResultType.BypassParameterSetResult, mid.ResultType); + Assert.AreEqual("Identifier result part 2 ", mid.IdentifierResultPart2); + Assert.AreEqual("Identifier result part 3 ", mid.IdentifierResultPart3); + Assert.AreEqual("Identifier result part 4 ", mid.IdentifierResultPart4); + Assert.AreEqual("E124", mid.CustomerTighteningErrorCode); + Assert.AreEqual(15m, mid.PrevailTorqueCompensateValue); Assert.IsNotNull(mid.TighteningErrorStatus2); - Assert.IsNotNull(mid.CompensatedAngle); - Assert.IsNotNull(mid.FinalAngleDecimal); + Assert.AreEqual(100m, mid.CompensatedAngle); + Assert.AreEqual(9999m, mid.FinalAngleDecimal); AssertEqualPackages(pack, mid); } @@ -927,7 +962,7 @@ public void Mid0061ByteRevision7() { 0xAA, //1010 1010 0x03, //0000 0011 - 0x0A, //0000 1010 + 0x0A, //0000 1010 0xD1, //1101 0001 0x00, 0x00, @@ -940,7 +975,7 @@ public void Mid0061ByteRevision7() var tighteningErrorStatus2 = new byte[] //10 bytes long { 0xAA, //1010 1010 - 0x03, //0000 0011 + 0x03, //0000 0011 0x02, //0000 0010 0x00, //Reserved from bit 19 to rest 0x00, @@ -969,60 +1004,63 @@ public void Mid0061ByteRevision7() var mid = _midInterpreter.Parse(bytes.ToArray()); Assert.AreEqual(typeof(Mid0061), mid.GetType()); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.TorqueControllerName); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(1, mid.CellId); + Assert.AreEqual(1, mid.ChannelId); + Assert.AreEqual("airbag7 ", mid.TorqueControllerName); + Assert.AreEqual("KPOL3456JKLO897 ", mid.VinNumber); + Assert.AreEqual(6, mid.JobId); + Assert.AreEqual(3, mid.ParameterSetId); + Assert.AreEqual(Strategy.RotateSpindleReverse, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.IsFalse(mid.TighteningStatus); + Assert.AreEqual(BatchStatus.Nok, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.TorqueMinLimit); - Assert.IsNotNull(mid.TorqueMaxLimit); - Assert.IsNotNull(mid.TorqueFinalTarget); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.AngleMinLimit); - Assert.IsNotNull(mid.AngleMaxLimit); - Assert.IsNotNull(mid.AngleFinalTarget); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringMin); - Assert.IsNotNull(mid.CurrentMonitoringMax); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapMin); - Assert.IsNotNull(mid.SelftapMax); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMin); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMax); - Assert.IsNotNull(mid.PrevailTorque); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.LastChangeInParameterSet); - Assert.IsNotNull(mid.ParameterSetName); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); - Assert.IsNotNull(mid.CustomerTighteningErrorCode); - Assert.IsNotNull(mid.PrevailTorqueCompensateValue); + Assert.AreEqual(8.40m, mid.TorqueMinLimit); + Assert.AreEqual(14m, mid.TorqueMaxLimit); + Assert.AreEqual(12m, mid.TorqueFinalTarget); + Assert.AreEqual(7.39m, mid.Torque); + Assert.AreEqual(0, mid.AngleMinLimit); + Assert.AreEqual(9999, mid.AngleMaxLimit); + Assert.AreEqual(0, mid.AngleFinalTarget); + Assert.AreEqual(0, mid.Angle); + Assert.AreEqual(0, mid.RundownAngleMin); + Assert.AreEqual(9999, mid.RundownAngleMax); + Assert.AreEqual(5000, mid.RundownAngle); + Assert.AreEqual(0, mid.CurrentMonitoringMin); + Assert.AreEqual(50, mid.CurrentMonitoringMax); + Assert.AreEqual(45, mid.CurrentMonitoringValue); + Assert.AreEqual(0.10m, mid.SelftapMin); + Assert.AreEqual(1.25m, mid.SelftapMax); + Assert.AreEqual(5.48m, mid.SelftapTorque); + Assert.AreEqual(0.10m, mid.PrevailTorqueMonitoringMin); + Assert.AreEqual(9999m, mid.PrevailTorqueMonitoringMax); + Assert.AreEqual(5555m, mid.PrevailTorque); + Assert.AreEqual(4294967295, mid.TighteningId); + Assert.AreEqual(65500, mid.JobSequenceNumber); + Assert.AreEqual(60535, mid.SyncTighteningId); + Assert.AreEqual("ABCDEFG-123456", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2001, 6, 2, 9, 54, 9), mid.Timestamp); + Assert.AreEqual(new DateTime(2001, 5, 29, 12, 34, 33), mid.LastChangeInParameterSet); + Assert.AreEqual("Test Parameter Set ", mid.ParameterSetName); + Assert.AreEqual(TorqueValuesUnit.LbfFt, mid.TorqueValuesUnit); + Assert.AreEqual(ResultType.BypassParameterSetResult, mid.ResultType); + Assert.AreEqual("Identifier result part 2 ", mid.IdentifierResultPart2); + Assert.AreEqual("Identifier result part 3 ", mid.IdentifierResultPart3); + Assert.AreEqual("Identifier result part 4 ", mid.IdentifierResultPart4); + Assert.AreEqual("E124", mid.CustomerTighteningErrorCode); + Assert.AreEqual(15m, mid.PrevailTorqueCompensateValue); Assert.IsNotNull(mid.TighteningErrorStatus2); - Assert.IsNotNull(mid.CompensatedAngle); - Assert.IsNotNull(mid.FinalAngleDecimal); + Assert.AreEqual(100m, mid.CompensatedAngle); + Assert.AreEqual(9999m, mid.FinalAngleDecimal); AssertEqualPackages(bytes, mid); } @@ -1034,64 +1072,67 @@ public void Mid0061Revision8() var mid = _midInterpreter.Parse(pack); Assert.AreEqual(typeof(Mid0061), mid.GetType()); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.TorqueControllerName); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(0, mid.CellId); + Assert.AreEqual(0, mid.ChannelId); + Assert.AreEqual("RA ST6.2 ETV100 ", mid.TorqueControllerName); + Assert.AreEqual(" ", mid.VinNumber); + Assert.AreEqual(0, mid.JobId); + Assert.AreEqual(1, mid.ParameterSetId); + Assert.AreEqual(Strategy.TorqueControlAndAngleMonitoring, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.IsFalse(mid.TighteningStatus); + Assert.AreEqual(BatchStatus.NotUsed, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.TorqueMinLimit); - Assert.IsNotNull(mid.TorqueMaxLimit); - Assert.IsNotNull(mid.TorqueFinalTarget); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.AngleMinLimit); - Assert.IsNotNull(mid.AngleMaxLimit); - Assert.IsNotNull(mid.AngleFinalTarget); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringMin); - Assert.IsNotNull(mid.CurrentMonitoringMax); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapMin); - Assert.IsNotNull(mid.SelftapMax); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMin); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMax); - Assert.IsNotNull(mid.PrevailTorque); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.LastChangeInParameterSet); - Assert.IsNotNull(mid.ParameterSetName); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); - Assert.IsNotNull(mid.CustomerTighteningErrorCode); - Assert.IsNotNull(mid.PrevailTorqueCompensateValue); + Assert.AreEqual(34m, mid.TorqueMinLimit); + Assert.AreEqual(46m, mid.TorqueMaxLimit); + Assert.AreEqual(40m, mid.TorqueFinalTarget); + Assert.AreEqual(5.05m, mid.Torque); + Assert.AreEqual(20, mid.AngleMinLimit); + Assert.AreEqual(420, mid.AngleMaxLimit); + Assert.AreEqual(0, mid.AngleFinalTarget); + Assert.AreEqual(0, mid.Angle); + Assert.AreEqual(100, mid.RundownAngleMin); + Assert.AreEqual(850, mid.RundownAngleMax); + Assert.AreEqual(4, mid.RundownAngle); + Assert.AreEqual(0, mid.CurrentMonitoringMin); + Assert.AreEqual(150, mid.CurrentMonitoringMax); + Assert.AreEqual(0, mid.CurrentMonitoringValue); + Assert.AreEqual(0m, mid.SelftapMin); + Assert.AreEqual(9999m, mid.SelftapMax); + Assert.AreEqual(0m, mid.SelftapTorque); + Assert.AreEqual(0m, mid.PrevailTorqueMonitoringMin); + Assert.AreEqual(0m, mid.PrevailTorqueMonitoringMax); + Assert.AreEqual(0m, mid.PrevailTorque); + Assert.AreEqual(184887, mid.TighteningId); + Assert.AreEqual(0, mid.JobSequenceNumber); + Assert.AreEqual(0, mid.SyncTighteningId); + Assert.AreEqual(" C0761275", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2020, 6, 25, 1, 4, 39), mid.Timestamp); + Assert.AreEqual(new DateTime(2020, 6, 24, 10, 48, 53), mid.LastChangeInParameterSet); + Assert.AreEqual("Test Parameter Set ", mid.ParameterSetName); + Assert.AreEqual(TorqueValuesUnit.LbfFt, mid.TorqueValuesUnit); + Assert.AreEqual(ResultType.BypassParameterSetResult, mid.ResultType); + Assert.AreEqual("Identifier result part 2 ", mid.IdentifierResultPart2); + Assert.AreEqual("Identifier result part 3 ", mid.IdentifierResultPart3); + Assert.AreEqual("Identifier result part 4 ", mid.IdentifierResultPart4); + Assert.AreEqual("E124", mid.CustomerTighteningErrorCode); + Assert.AreEqual(15m, mid.PrevailTorqueCompensateValue); Assert.IsNotNull(mid.TighteningErrorStatus2); - Assert.IsNotNull(mid.CompensatedAngle); - Assert.IsNotNull(mid.FinalAngleDecimal); - Assert.AreNotEqual(0, mid.StartFinalAngle); - Assert.IsNotNull(mid.PostViewTorqueActivated); - Assert.AreNotEqual(0, mid.PostViewTorqueHigh); - Assert.AreNotEqual(0, mid.PostViewTorqueLow); + Assert.AreEqual(100m, mid.CompensatedAngle); + Assert.AreEqual(9999m, mid.FinalAngleDecimal); + Assert.AreEqual(10m, mid.StartFinalAngle); + Assert.AreEqual(PostViewTorque.OnlyPVTHOn, mid.PostViewTorqueActivated); + Assert.AreEqual(6521.43m, mid.PostViewTorqueHigh); + Assert.AreEqual(52.32m, mid.PostViewTorqueLow); AssertEqualPackages(pack, mid); } @@ -1113,7 +1154,7 @@ public void Mid0061ByteRevision8() { 0xAA, //1010 1010 0x03, //0000 0011 - 0x0A, //0000 1010 + 0x0A, //0000 1010 0xD1, //1101 0001 0x00, 0x00, @@ -1126,7 +1167,7 @@ public void Mid0061ByteRevision8() var tighteningErrorStatus2 = new byte[] //10 bytes long { 0xAA, //1010 1010 - 0x03, //0000 0011 + 0x03, //0000 0011 0x02, //0000 0010 0x00, //Reserved from bit 19 to rest 0x00, @@ -1155,64 +1196,67 @@ public void Mid0061ByteRevision8() var mid = _midInterpreter.Parse(bytes.ToArray()); Assert.AreEqual(typeof(Mid0061), mid.GetType()); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.TorqueControllerName); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(1, mid.CellId); + Assert.AreEqual(1, mid.ChannelId); + Assert.AreEqual("airbag7 ", mid.TorqueControllerName); + Assert.AreEqual("KPOL3456JKLO897 ", mid.VinNumber); + Assert.AreEqual(6, mid.JobId); + Assert.AreEqual(3, mid.ParameterSetId); + Assert.AreEqual(Strategy.RotateSpindleReverse, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.IsFalse(mid.TighteningStatus); + Assert.AreEqual(BatchStatus.Nok, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.TorqueMinLimit); - Assert.IsNotNull(mid.TorqueMaxLimit); - Assert.IsNotNull(mid.TorqueFinalTarget); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.AngleMinLimit); - Assert.IsNotNull(mid.AngleMaxLimit); - Assert.IsNotNull(mid.AngleFinalTarget); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringMin); - Assert.IsNotNull(mid.CurrentMonitoringMax); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapMin); - Assert.IsNotNull(mid.SelftapMax); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMin); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMax); - Assert.IsNotNull(mid.PrevailTorque); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.LastChangeInParameterSet); - Assert.IsNotNull(mid.ParameterSetName); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); - Assert.IsNotNull(mid.CustomerTighteningErrorCode); - Assert.IsNotNull(mid.PrevailTorqueCompensateValue); + Assert.AreEqual(8.40m, mid.TorqueMinLimit); + Assert.AreEqual(14m, mid.TorqueMaxLimit); + Assert.AreEqual(12m, mid.TorqueFinalTarget); + Assert.AreEqual(7.39m, mid.Torque); + Assert.AreEqual(0, mid.AngleMinLimit); + Assert.AreEqual(9999, mid.AngleMaxLimit); + Assert.AreEqual(0, mid.AngleFinalTarget); + Assert.AreEqual(0, mid.Angle); + Assert.AreEqual(0, mid.RundownAngleMin); + Assert.AreEqual(9999, mid.RundownAngleMax); + Assert.AreEqual(5000, mid.RundownAngle); + Assert.AreEqual(0, mid.CurrentMonitoringMin); + Assert.AreEqual(50, mid.CurrentMonitoringMax); + Assert.AreEqual(45, mid.CurrentMonitoringValue); + Assert.AreEqual(0.10m, mid.SelftapMin); + Assert.AreEqual(1.25m, mid.SelftapMax); + Assert.AreEqual(5.48m, mid.SelftapTorque); + Assert.AreEqual(0.10m, mid.PrevailTorqueMonitoringMin); + Assert.AreEqual(9999m, mid.PrevailTorqueMonitoringMax); + Assert.AreEqual(5555m, mid.PrevailTorque); + Assert.AreEqual(4294967295, mid.TighteningId); + Assert.AreEqual(65500, mid.JobSequenceNumber); + Assert.AreEqual(60535, mid.SyncTighteningId); + Assert.AreEqual("ABCDEFG-123456", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2001, 6, 2, 9, 54, 9), mid.Timestamp); + Assert.AreEqual(new DateTime(2001, 5, 29, 12, 34, 33), mid.LastChangeInParameterSet); + Assert.AreEqual("Test Parameter Set ", mid.ParameterSetName); + Assert.AreEqual(TorqueValuesUnit.LbfFt, mid.TorqueValuesUnit); + Assert.AreEqual(ResultType.BypassParameterSetResult, mid.ResultType); + Assert.AreEqual("Identifier result part 2 ", mid.IdentifierResultPart2); + Assert.AreEqual("Identifier result part 3 ", mid.IdentifierResultPart3); + Assert.AreEqual("Identifier result part 4 ", mid.IdentifierResultPart4); + Assert.AreEqual("E124", mid.CustomerTighteningErrorCode); + Assert.AreEqual(15m, mid.PrevailTorqueCompensateValue); Assert.IsNotNull(mid.TighteningErrorStatus2); - Assert.IsNotNull(mid.CompensatedAngle); - Assert.IsNotNull(mid.FinalAngleDecimal); - Assert.AreNotEqual(0, mid.StartFinalAngle); - Assert.IsNotNull(mid.PostViewTorqueActivated); - Assert.AreNotEqual(0, mid.PostViewTorqueHigh); - Assert.AreNotEqual(0, mid.PostViewTorqueLow); + Assert.AreEqual(100m, mid.CompensatedAngle); + Assert.AreEqual(9999m, mid.FinalAngleDecimal); + Assert.AreEqual(10m, mid.StartFinalAngle); + Assert.AreEqual(PostViewTorque.OnlyPVTHOn, mid.PostViewTorqueActivated); + Assert.AreEqual(6521.43m, mid.PostViewTorqueHigh); + Assert.AreEqual(52.32m, mid.PostViewTorqueLow); AssertEqualPackages(bytes, mid); } @@ -1224,67 +1268,70 @@ public void Mid0061Revision9() var mid = _midInterpreter.Parse(pack); Assert.AreEqual(typeof(Mid0061), mid.GetType()); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.TorqueControllerName); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(0, mid.CellId); + Assert.AreEqual(0, mid.ChannelId); + Assert.AreEqual("RA ST6.2 ETV100 ", mid.TorqueControllerName); + Assert.AreEqual(" ", mid.VinNumber); + Assert.AreEqual(0, mid.JobId); + Assert.AreEqual(1, mid.ParameterSetId); + Assert.AreEqual(Strategy.TorqueControlAndAngleMonitoring, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.IsFalse(mid.TighteningStatus); + Assert.AreEqual(BatchStatus.NotUsed, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.TorqueMinLimit); - Assert.IsNotNull(mid.TorqueMaxLimit); - Assert.IsNotNull(mid.TorqueFinalTarget); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.AngleMinLimit); - Assert.IsNotNull(mid.AngleMaxLimit); - Assert.IsNotNull(mid.AngleFinalTarget); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringMin); - Assert.IsNotNull(mid.CurrentMonitoringMax); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapMin); - Assert.IsNotNull(mid.SelftapMax); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMin); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMax); - Assert.IsNotNull(mid.PrevailTorque); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.LastChangeInParameterSet); - Assert.IsNotNull(mid.ParameterSetName); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); - Assert.IsNotNull(mid.CustomerTighteningErrorCode); - Assert.IsNotNull(mid.PrevailTorqueCompensateValue); + Assert.AreEqual(34m, mid.TorqueMinLimit); + Assert.AreEqual(46m, mid.TorqueMaxLimit); + Assert.AreEqual(40m, mid.TorqueFinalTarget); + Assert.AreEqual(5.05m, mid.Torque); + Assert.AreEqual(20, mid.AngleMinLimit); + Assert.AreEqual(420, mid.AngleMaxLimit); + Assert.AreEqual(0, mid.AngleFinalTarget); + Assert.AreEqual(0, mid.Angle); + Assert.AreEqual(100, mid.RundownAngleMin); + Assert.AreEqual(850, mid.RundownAngleMax); + Assert.AreEqual(4, mid.RundownAngle); + Assert.AreEqual(0, mid.CurrentMonitoringMin); + Assert.AreEqual(150, mid.CurrentMonitoringMax); + Assert.AreEqual(0, mid.CurrentMonitoringValue); + Assert.AreEqual(0m, mid.SelftapMin); + Assert.AreEqual(9999m, mid.SelftapMax); + Assert.AreEqual(0m, mid.SelftapTorque); + Assert.AreEqual(0m, mid.PrevailTorqueMonitoringMin); + Assert.AreEqual(0m, mid.PrevailTorqueMonitoringMax); + Assert.AreEqual(0m, mid.PrevailTorque); + Assert.AreEqual(184887, mid.TighteningId); + Assert.AreEqual(0, mid.JobSequenceNumber); + Assert.AreEqual(0, mid.SyncTighteningId); + Assert.AreEqual(" C0761275", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2020, 6, 25, 1, 4, 39), mid.Timestamp); + Assert.AreEqual(new DateTime(2020, 6, 24, 10, 48, 53), mid.LastChangeInParameterSet); + Assert.AreEqual("Test Parameter Set ", mid.ParameterSetName); + Assert.AreEqual(TorqueValuesUnit.LbfFt, mid.TorqueValuesUnit); + Assert.AreEqual(ResultType.BypassParameterSetResult, mid.ResultType); + Assert.AreEqual("Identifier result part 2 ", mid.IdentifierResultPart2); + Assert.AreEqual("Identifier result part 3 ", mid.IdentifierResultPart3); + Assert.AreEqual("Identifier result part 4 ", mid.IdentifierResultPart4); + Assert.AreEqual("E124", mid.CustomerTighteningErrorCode); + Assert.AreEqual(15m, mid.PrevailTorqueCompensateValue); Assert.IsNotNull(mid.TighteningErrorStatus2); - Assert.IsNotNull(mid.CompensatedAngle); - Assert.IsNotNull(mid.FinalAngleDecimal); - Assert.AreNotEqual(0, mid.StartFinalAngle); - Assert.IsNotNull(mid.PostViewTorqueActivated); - Assert.AreNotEqual(0, mid.PostViewTorqueHigh); - Assert.AreNotEqual(0, mid.PostViewTorqueLow); - Assert.AreNotEqual(0, mid.CurrentMonitoringAmpere); - Assert.AreNotEqual(0, mid.CurrentMonitoringAmpereMin); - Assert.AreNotEqual(0, mid.CurrentMonitoringAmpereMax); + Assert.AreEqual(100m, mid.CompensatedAngle); + Assert.AreEqual(9999m, mid.FinalAngleDecimal); + Assert.AreEqual(10m, mid.StartFinalAngle); + Assert.AreEqual(PostViewTorque.OnlyPVTHOn, mid.PostViewTorqueActivated); + Assert.AreEqual(6521.43m, mid.PostViewTorqueHigh); + Assert.AreEqual(52.32m, mid.PostViewTorqueLow); + Assert.AreEqual(1m, mid.CurrentMonitoringAmpere); + Assert.AreEqual(0.50m, mid.CurrentMonitoringAmpereMin); + Assert.AreEqual(1.50m, mid.CurrentMonitoringAmpereMax); AssertEqualPackages(pack, mid); } @@ -1306,7 +1353,7 @@ public void Mid0061ByteRevision9() { 0xAA, //1010 1010 0x03, //0000 0011 - 0x0A, //0000 1010 + 0x0A, //0000 1010 0xD1, //1101 0001 0x00, 0x00, @@ -1319,7 +1366,7 @@ public void Mid0061ByteRevision9() var tighteningErrorStatus2 = new byte[] //10 bytes long { 0xAA, //1010 1010 - 0x03, //0000 0011 + 0x03, //0000 0011 0x02, //0000 0010 0x00, //Reserved from bit 19 to rest 0x00, @@ -1348,67 +1395,70 @@ public void Mid0061ByteRevision9() var mid = _midInterpreter.Parse(bytes.ToArray()); Assert.AreEqual(typeof(Mid0061), mid.GetType()); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.TorqueControllerName); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(1, mid.CellId); + Assert.AreEqual(1, mid.ChannelId); + Assert.AreEqual("airbag7 ", mid.TorqueControllerName); + Assert.AreEqual("KPOL3456JKLO897 ", mid.VinNumber); + Assert.AreEqual(6, mid.JobId); + Assert.AreEqual(3, mid.ParameterSetId); + Assert.AreEqual(Strategy.RotateSpindleReverse, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.IsFalse(mid.TighteningStatus); + Assert.AreEqual(BatchStatus.Nok, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.TorqueMinLimit); - Assert.IsNotNull(mid.TorqueMaxLimit); - Assert.IsNotNull(mid.TorqueFinalTarget); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.AngleMinLimit); - Assert.IsNotNull(mid.AngleMaxLimit); - Assert.IsNotNull(mid.AngleFinalTarget); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringMin); - Assert.IsNotNull(mid.CurrentMonitoringMax); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapMin); - Assert.IsNotNull(mid.SelftapMax); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMin); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMax); - Assert.IsNotNull(mid.PrevailTorque); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.LastChangeInParameterSet); - Assert.IsNotNull(mid.ParameterSetName); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); - Assert.IsNotNull(mid.CustomerTighteningErrorCode); - Assert.IsNotNull(mid.PrevailTorqueCompensateValue); + Assert.AreEqual(8.40m, mid.TorqueMinLimit); + Assert.AreEqual(14m, mid.TorqueMaxLimit); + Assert.AreEqual(12m, mid.TorqueFinalTarget); + Assert.AreEqual(7.39m, mid.Torque); + Assert.AreEqual(0, mid.AngleMinLimit); + Assert.AreEqual(9999, mid.AngleMaxLimit); + Assert.AreEqual(0, mid.AngleFinalTarget); + Assert.AreEqual(0, mid.Angle); + Assert.AreEqual(0, mid.RundownAngleMin); + Assert.AreEqual(9999, mid.RundownAngleMax); + Assert.AreEqual(5000, mid.RundownAngle); + Assert.AreEqual(0, mid.CurrentMonitoringMin); + Assert.AreEqual(50, mid.CurrentMonitoringMax); + Assert.AreEqual(45, mid.CurrentMonitoringValue); + Assert.AreEqual(0.10m, mid.SelftapMin); + Assert.AreEqual(1.25m, mid.SelftapMax); + Assert.AreEqual(5.48m, mid.SelftapTorque); + Assert.AreEqual(0.10m, mid.PrevailTorqueMonitoringMin); + Assert.AreEqual(9999m, mid.PrevailTorqueMonitoringMax); + Assert.AreEqual(5555m, mid.PrevailTorque); + Assert.AreEqual(4294967295, mid.TighteningId); + Assert.AreEqual(65500, mid.JobSequenceNumber); + Assert.AreEqual(60535, mid.SyncTighteningId); + Assert.AreEqual("ABCDEFG-123456", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2001, 6, 2, 9, 54, 9), mid.Timestamp); + Assert.AreEqual(new DateTime(2001, 5, 29, 12, 34, 33), mid.LastChangeInParameterSet); + Assert.AreEqual("Test Parameter Set ", mid.ParameterSetName); + Assert.AreEqual(TorqueValuesUnit.LbfFt, mid.TorqueValuesUnit); + Assert.AreEqual(ResultType.BypassParameterSetResult, mid.ResultType); + Assert.AreEqual("Identifier result part 2 ", mid.IdentifierResultPart2); + Assert.AreEqual("Identifier result part 3 ", mid.IdentifierResultPart3); + Assert.AreEqual("Identifier result part 4 ", mid.IdentifierResultPart4); + Assert.AreEqual("E124", mid.CustomerTighteningErrorCode); + Assert.AreEqual(15m, mid.PrevailTorqueCompensateValue); Assert.IsNotNull(mid.TighteningErrorStatus2); - Assert.IsNotNull(mid.CompensatedAngle); - Assert.IsNotNull(mid.FinalAngleDecimal); - Assert.AreNotEqual(0, mid.StartFinalAngle); - Assert.IsNotNull(mid.PostViewTorqueActivated); - Assert.AreNotEqual(0, mid.PostViewTorqueHigh); - Assert.AreNotEqual(0, mid.PostViewTorqueLow); - Assert.AreNotEqual(0, mid.CurrentMonitoringAmpere); - Assert.AreNotEqual(0, mid.CurrentMonitoringAmpereMin); - Assert.AreNotEqual(0, mid.CurrentMonitoringAmpereMax); + Assert.AreEqual(100m, mid.CompensatedAngle); + Assert.AreEqual(9999m, mid.FinalAngleDecimal); + Assert.AreEqual(10m, mid.StartFinalAngle); + Assert.AreEqual(PostViewTorque.OnlyPVTHOn, mid.PostViewTorqueActivated); + Assert.AreEqual(6521.43m, mid.PostViewTorqueHigh); + Assert.AreEqual(52.32m, mid.PostViewTorqueLow); + Assert.AreEqual(1m, mid.CurrentMonitoringAmpere); + Assert.AreEqual(0.50m, mid.CurrentMonitoringAmpereMin); + Assert.AreEqual(1.50m, mid.CurrentMonitoringAmpereMax); AssertEqualPackages(bytes, mid); } @@ -1420,79 +1470,80 @@ public void Mid0061Revision10() var mid = _midInterpreter.Parse(pack); Assert.AreEqual(typeof(Mid0061), mid.GetType()); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.TorqueControllerName); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(0, mid.CellId); + Assert.AreEqual(0, mid.ChannelId); + Assert.AreEqual("RA ST6.2 ETV100 ", mid.TorqueControllerName); + Assert.AreEqual(" ", mid.VinNumber); + Assert.AreEqual(0, mid.JobId); + Assert.AreEqual(1, mid.ParameterSetId); + Assert.AreEqual(Strategy.TorqueControlAndAngleMonitoring, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.IsFalse(mid.TighteningStatus); + Assert.AreEqual(BatchStatus.NotUsed, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.TorqueMinLimit); - Assert.IsNotNull(mid.TorqueMaxLimit); - Assert.IsNotNull(mid.TorqueFinalTarget); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.AngleMinLimit); - Assert.IsNotNull(mid.AngleMaxLimit); - Assert.IsNotNull(mid.AngleFinalTarget); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringMin); - Assert.IsNotNull(mid.CurrentMonitoringMax); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapMin); - Assert.IsNotNull(mid.SelftapMax); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMin); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMax); - Assert.IsNotNull(mid.PrevailTorque); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.LastChangeInParameterSet); - Assert.IsNotNull(mid.ParameterSetName); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); - Assert.IsNotNull(mid.CustomerTighteningErrorCode); - Assert.IsNotNull(mid.PrevailTorqueCompensateValue); + Assert.AreEqual(34m, mid.TorqueMinLimit); + Assert.AreEqual(46m, mid.TorqueMaxLimit); + Assert.AreEqual(40m, mid.TorqueFinalTarget); + Assert.AreEqual(5.05m, mid.Torque); + Assert.AreEqual(20, mid.AngleMinLimit); + Assert.AreEqual(420, mid.AngleMaxLimit); + Assert.AreEqual(0, mid.AngleFinalTarget); + Assert.AreEqual(0, mid.Angle); + Assert.AreEqual(100, mid.RundownAngleMin); + Assert.AreEqual(850, mid.RundownAngleMax); + Assert.AreEqual(4, mid.RundownAngle); + Assert.AreEqual(0, mid.CurrentMonitoringMin); + Assert.AreEqual(150, mid.CurrentMonitoringMax); + Assert.AreEqual(0, mid.CurrentMonitoringValue); + Assert.AreEqual(0m, mid.SelftapMin); + Assert.AreEqual(9999m, mid.SelftapMax); + Assert.AreEqual(0m, mid.SelftapTorque); + Assert.AreEqual(0m, mid.PrevailTorqueMonitoringMin); + Assert.AreEqual(0m, mid.PrevailTorqueMonitoringMax); + Assert.AreEqual(0m, mid.PrevailTorque); + Assert.AreEqual(184887, mid.TighteningId); + Assert.AreEqual(0, mid.JobSequenceNumber); + Assert.AreEqual(0, mid.SyncTighteningId); + Assert.AreEqual(" C0761275", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2020, 6, 25, 1, 4, 39), mid.Timestamp); + Assert.AreEqual(new DateTime(2020, 6, 24, 10, 48, 53), mid.LastChangeInParameterSet); + Assert.AreEqual("Test Parameter Set ", mid.ParameterSetName); + Assert.AreEqual(TorqueValuesUnit.LbfFt, mid.TorqueValuesUnit); + Assert.AreEqual(ResultType.BypassParameterSetResult, mid.ResultType); + Assert.AreEqual("Identifier result part 2 ", mid.IdentifierResultPart2); + Assert.AreEqual("Identifier result part 3 ", mid.IdentifierResultPart3); + Assert.AreEqual("Identifier result part 4 ", mid.IdentifierResultPart4); + Assert.AreEqual("E124", mid.CustomerTighteningErrorCode); + Assert.AreEqual(15m, mid.PrevailTorqueCompensateValue); Assert.IsNotNull(mid.TighteningErrorStatus2); - Assert.IsNotNull(mid.CompensatedAngle); - Assert.IsNotNull(mid.FinalAngleDecimal); - Assert.AreNotEqual(0, mid.StartFinalAngle); - Assert.IsNotNull(mid.PostViewTorqueActivated); - Assert.AreNotEqual(0, mid.PostViewTorqueHigh); - Assert.AreNotEqual(0, mid.PostViewTorqueLow); - Assert.AreNotEqual(0, mid.CurrentMonitoringAmpere); - Assert.AreNotEqual(0, mid.CurrentMonitoringAmpereMin); - Assert.AreNotEqual(0, mid.CurrentMonitoringAmpereMax); - Assert.AreNotEqual(0, mid.AngleNumeratorScaleFactor); - Assert.AreNotEqual(0, mid.AngleDenominatorScaleFactor); - Assert.IsNotNull(mid.OverallAngleStatus); - Assert.AreNotEqual(0, mid.OverallAngleMin); - Assert.AreNotEqual(0, mid.OverallAngleMax); - Assert.AreNotEqual(0, mid.OverallAngle); - Assert.AreNotEqual(0, mid.PeakTorque); - Assert.AreNotEqual(0, mid.ResidualBreakawayTorque); - Assert.AreNotEqual(0, mid.StartRundownAngle); - Assert.AreNotEqual(0, mid.RundownAngleComplete); - Assert.AreNotEqual(0, mid.OverallAngle); - + Assert.AreEqual(100m, mid.CompensatedAngle); + Assert.AreEqual(9999m, mid.FinalAngleDecimal); + Assert.AreEqual(10m, mid.StartFinalAngle); + Assert.AreEqual(PostViewTorque.OnlyPVTHOn, mid.PostViewTorqueActivated); + Assert.AreEqual(6521.43m, mid.PostViewTorqueHigh); + Assert.AreEqual(52.32m, mid.PostViewTorqueLow); + Assert.AreEqual(1m, mid.CurrentMonitoringAmpere); + Assert.AreEqual(0.50m, mid.CurrentMonitoringAmpereMin); + Assert.AreEqual(1.50m, mid.CurrentMonitoringAmpereMax); + Assert.AreEqual(1, mid.AngleNumeratorScaleFactor); + Assert.AreEqual(1, mid.AngleDenominatorScaleFactor); + Assert.AreEqual(TighteningValueStatus.Ok, mid.OverallAngleStatus); + Assert.AreEqual(-20, mid.OverallAngleMin); + Assert.AreEqual(100, mid.OverallAngleMax); + Assert.AreEqual(120, mid.OverallAngle); + Assert.AreEqual(32.91m, mid.PeakTorque); + Assert.AreEqual(10.05m, mid.ResidualBreakawayTorque); + Assert.AreEqual(1.10m, mid.StartRundownAngle); + Assert.AreEqual(90m, mid.RundownAngleComplete); AssertEqualPackages(pack, mid); } @@ -1514,7 +1565,7 @@ public void Mid0061ByteRevision10() { 0xAA, //1010 1010 0x03, //0000 0011 - 0x0A, //0000 1010 + 0x0A, //0000 1010 0xD1, //1101 0001 0x00, 0x00, @@ -1527,7 +1578,7 @@ public void Mid0061ByteRevision10() var tighteningErrorStatus2 = new byte[] //10 bytes long { 0xAA, //1010 1010 - 0x03, //0000 0011 + 0x03, //0000 0011 0x02, //0000 0010 0x00, //Reserved from bit 19 to rest 0x00, @@ -1556,78 +1607,80 @@ public void Mid0061ByteRevision10() var mid = _midInterpreter.Parse(bytes.ToArray()); Assert.AreEqual(typeof(Mid0061), mid.GetType()); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.TorqueControllerName); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(1, mid.CellId); + Assert.AreEqual(1, mid.ChannelId); + Assert.AreEqual("airbag7 ", mid.TorqueControllerName); + Assert.AreEqual("KPOL3456JKLO897 ", mid.VinNumber); + Assert.AreEqual(6, mid.JobId); + Assert.AreEqual(3, mid.ParameterSetId); + Assert.AreEqual(Strategy.RotateSpindleReverse, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.IsFalse(mid.TighteningStatus); + Assert.AreEqual(BatchStatus.Nok, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.TorqueMinLimit); - Assert.IsNotNull(mid.TorqueMaxLimit); - Assert.IsNotNull(mid.TorqueFinalTarget); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.AngleMinLimit); - Assert.IsNotNull(mid.AngleMaxLimit); - Assert.IsNotNull(mid.AngleFinalTarget); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringMin); - Assert.IsNotNull(mid.CurrentMonitoringMax); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapMin); - Assert.IsNotNull(mid.SelftapMax); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMin); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMax); - Assert.IsNotNull(mid.PrevailTorque); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.LastChangeInParameterSet); - Assert.IsNotNull(mid.ParameterSetName); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); - Assert.IsNotNull(mid.CustomerTighteningErrorCode); - Assert.IsNotNull(mid.PrevailTorqueCompensateValue); + Assert.AreEqual(8.40m, mid.TorqueMinLimit); + Assert.AreEqual(14m, mid.TorqueMaxLimit); + Assert.AreEqual(12m, mid.TorqueFinalTarget); + Assert.AreEqual(7.39m, mid.Torque); + Assert.AreEqual(0, mid.AngleMinLimit); + Assert.AreEqual(9999, mid.AngleMaxLimit); + Assert.AreEqual(0, mid.AngleFinalTarget); + Assert.AreEqual(0, mid.Angle); + Assert.AreEqual(0, mid.RundownAngleMin); + Assert.AreEqual(9999, mid.RundownAngleMax); + Assert.AreEqual(5000, mid.RundownAngle); + Assert.AreEqual(0, mid.CurrentMonitoringMin); + Assert.AreEqual(50, mid.CurrentMonitoringMax); + Assert.AreEqual(45, mid.CurrentMonitoringValue); + Assert.AreEqual(0.10m, mid.SelftapMin); + Assert.AreEqual(1.25m, mid.SelftapMax); + Assert.AreEqual(5.48m, mid.SelftapTorque); + Assert.AreEqual(0.10m, mid.PrevailTorqueMonitoringMin); + Assert.AreEqual(9999m, mid.PrevailTorqueMonitoringMax); + Assert.AreEqual(5555m, mid.PrevailTorque); + Assert.AreEqual(4294967295, mid.TighteningId); + Assert.AreEqual(65500, mid.JobSequenceNumber); + Assert.AreEqual(60535, mid.SyncTighteningId); + Assert.AreEqual("ABCDEFG-123456", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2001, 6, 2, 9, 54, 9), mid.Timestamp); + Assert.AreEqual(new DateTime(2001, 5, 29, 12, 34, 33), mid.LastChangeInParameterSet); + Assert.AreEqual("Test Parameter Set ", mid.ParameterSetName); + Assert.AreEqual(TorqueValuesUnit.LbfFt, mid.TorqueValuesUnit); + Assert.AreEqual(ResultType.BypassParameterSetResult, mid.ResultType); + Assert.AreEqual("Identifier result part 2 ", mid.IdentifierResultPart2); + Assert.AreEqual("Identifier result part 3 ", mid.IdentifierResultPart3); + Assert.AreEqual("Identifier result part 4 ", mid.IdentifierResultPart4); + Assert.AreEqual("E124", mid.CustomerTighteningErrorCode); + Assert.AreEqual(15m, mid.PrevailTorqueCompensateValue); Assert.IsNotNull(mid.TighteningErrorStatus2); - Assert.IsNotNull(mid.CompensatedAngle); - Assert.IsNotNull(mid.FinalAngleDecimal); - Assert.AreNotEqual(0, mid.StartFinalAngle); - Assert.IsNotNull(mid.PostViewTorqueActivated); - Assert.AreNotEqual(0, mid.PostViewTorqueHigh); - Assert.AreNotEqual(0, mid.PostViewTorqueLow); - Assert.AreNotEqual(0, mid.CurrentMonitoringAmpere); - Assert.AreNotEqual(0, mid.CurrentMonitoringAmpereMin); - Assert.AreNotEqual(0, mid.CurrentMonitoringAmpereMax); - Assert.AreNotEqual(0, mid.AngleNumeratorScaleFactor); - Assert.AreNotEqual(0, mid.AngleDenominatorScaleFactor); - Assert.IsNotNull(mid.OverallAngleStatus); - Assert.AreNotEqual(0, mid.OverallAngleMin); - Assert.AreNotEqual(0, mid.OverallAngleMax); - Assert.AreNotEqual(0, mid.OverallAngle); - Assert.AreNotEqual(0, mid.PeakTorque); - Assert.AreNotEqual(0, mid.ResidualBreakawayTorque); - Assert.AreNotEqual(0, mid.StartRundownAngle); - Assert.AreNotEqual(0, mid.RundownAngleComplete); - Assert.AreNotEqual(0, mid.OverallAngle); + Assert.AreEqual(100m, mid.CompensatedAngle); + Assert.AreEqual(9999m, mid.FinalAngleDecimal); + Assert.AreEqual(10m, mid.StartFinalAngle); + Assert.AreEqual(PostViewTorque.OnlyPVTHOn, mid.PostViewTorqueActivated); + Assert.AreEqual(6521.43m, mid.PostViewTorqueHigh); + Assert.AreEqual(52.32m, mid.PostViewTorqueLow); + Assert.AreEqual(1m, mid.CurrentMonitoringAmpere); + Assert.AreEqual(0.50m, mid.CurrentMonitoringAmpereMin); + Assert.AreEqual(1.50m, mid.CurrentMonitoringAmpereMax); + Assert.AreEqual(1, mid.AngleNumeratorScaleFactor); + Assert.AreEqual(1, mid.AngleDenominatorScaleFactor); + Assert.AreEqual(TighteningValueStatus.Ok, mid.OverallAngleStatus); + Assert.AreEqual(-20, mid.OverallAngleMin); + Assert.AreEqual(100, mid.OverallAngleMax); + Assert.AreEqual(120, mid.OverallAngle); + Assert.AreEqual(32.91m, mid.PeakTorque); + Assert.AreEqual(10.05m, mid.ResidualBreakawayTorque); + Assert.AreEqual(1.10m, mid.StartRundownAngle); + Assert.AreEqual(90m, mid.RundownAngleComplete); AssertEqualPackages(bytes, mid); } @@ -1639,80 +1692,82 @@ public void Mid0061Revision11() var mid = _midInterpreter.Parse(pack); Assert.AreEqual(typeof(Mid0061), mid.GetType()); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.TorqueControllerName); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(0, mid.CellId); + Assert.AreEqual(0, mid.ChannelId); + Assert.AreEqual("RA ST6.2 ETV100 ", mid.TorqueControllerName); + Assert.AreEqual(" ", mid.VinNumber); + Assert.AreEqual(0, mid.JobId); + Assert.AreEqual(1, mid.ParameterSetId); + Assert.AreEqual(Strategy.TorqueControlAndAngleMonitoring, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.IsFalse(mid.TighteningStatus); + Assert.AreEqual(BatchStatus.NotUsed, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.TorqueMinLimit); - Assert.IsNotNull(mid.TorqueMaxLimit); - Assert.IsNotNull(mid.TorqueFinalTarget); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.AngleMinLimit); - Assert.IsNotNull(mid.AngleMaxLimit); - Assert.IsNotNull(mid.AngleFinalTarget); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringMin); - Assert.IsNotNull(mid.CurrentMonitoringMax); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapMin); - Assert.IsNotNull(mid.SelftapMax); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMin); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMax); - Assert.IsNotNull(mid.PrevailTorque); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.LastChangeInParameterSet); - Assert.IsNotNull(mid.ParameterSetName); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); - Assert.IsNotNull(mid.CustomerTighteningErrorCode); - Assert.IsNotNull(mid.PrevailTorqueCompensateValue); + Assert.AreEqual(34m, mid.TorqueMinLimit); + Assert.AreEqual(46m, mid.TorqueMaxLimit); + Assert.AreEqual(40m, mid.TorqueFinalTarget); + Assert.AreEqual(5.05m, mid.Torque); + Assert.AreEqual(20, mid.AngleMinLimit); + Assert.AreEqual(420, mid.AngleMaxLimit); + Assert.AreEqual(0, mid.AngleFinalTarget); + Assert.AreEqual(0, mid.Angle); + Assert.AreEqual(100, mid.RundownAngleMin); + Assert.AreEqual(850, mid.RundownAngleMax); + Assert.AreEqual(4, mid.RundownAngle); + Assert.AreEqual(0, mid.CurrentMonitoringMin); + Assert.AreEqual(150, mid.CurrentMonitoringMax); + Assert.AreEqual(0, mid.CurrentMonitoringValue); + Assert.AreEqual(0m, mid.SelftapMin); + Assert.AreEqual(9999m, mid.SelftapMax); + Assert.AreEqual(0m, mid.SelftapTorque); + Assert.AreEqual(0m, mid.PrevailTorqueMonitoringMin); + Assert.AreEqual(0m, mid.PrevailTorqueMonitoringMax); + Assert.AreEqual(0m, mid.PrevailTorque); + Assert.AreEqual(184887, mid.TighteningId); + Assert.AreEqual(0, mid.JobSequenceNumber); + Assert.AreEqual(0, mid.SyncTighteningId); + Assert.AreEqual(" C0761275", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2020, 6, 25, 1, 4, 39), mid.Timestamp); + Assert.AreEqual(new DateTime(2020, 6, 24, 10, 48, 53), mid.LastChangeInParameterSet); + Assert.AreEqual("Test Parameter Set ", mid.ParameterSetName); + Assert.AreEqual(TorqueValuesUnit.LbfFt, mid.TorqueValuesUnit); + Assert.AreEqual(ResultType.BypassParameterSetResult, mid.ResultType); + Assert.AreEqual("Identifier result part 2 ", mid.IdentifierResultPart2); + Assert.AreEqual("Identifier result part 3 ", mid.IdentifierResultPart3); + Assert.AreEqual("Identifier result part 4 ", mid.IdentifierResultPart4); + Assert.AreEqual("E124", mid.CustomerTighteningErrorCode); + Assert.AreEqual(15m, mid.PrevailTorqueCompensateValue); Assert.IsNotNull(mid.TighteningErrorStatus2); - Assert.IsNotNull(mid.CompensatedAngle); - Assert.IsNotNull(mid.FinalAngleDecimal); - Assert.AreNotEqual(0, mid.StartFinalAngle); - Assert.IsNotNull(mid.PostViewTorqueActivated); - Assert.AreNotEqual(0, mid.PostViewTorqueHigh); - Assert.AreNotEqual(0, mid.PostViewTorqueLow); - Assert.AreNotEqual(0, mid.CurrentMonitoringAmpere); - Assert.AreNotEqual(0, mid.CurrentMonitoringAmpereMin); - Assert.AreNotEqual(0, mid.CurrentMonitoringAmpereMax); - Assert.AreNotEqual(0, mid.AngleNumeratorScaleFactor); - Assert.AreNotEqual(0, mid.AngleDenominatorScaleFactor); - Assert.IsNotNull(mid.OverallAngleStatus); - Assert.AreNotEqual(0, mid.OverallAngleMin); - Assert.AreNotEqual(0, mid.OverallAngleMax); - Assert.AreNotEqual(0, mid.OverallAngle); - Assert.AreNotEqual(0, mid.PeakTorque); - Assert.AreNotEqual(0, mid.ResidualBreakawayTorque); - Assert.AreNotEqual(0, mid.StartRundownAngle); - Assert.AreNotEqual(0, mid.RundownAngleComplete); - Assert.AreNotEqual(0, mid.OverallAngle); - Assert.AreNotEqual(0, mid.ClickTorque); - Assert.AreNotEqual(0, mid.ClickAngle); + Assert.AreEqual(100m, mid.CompensatedAngle); + Assert.AreEqual(9999m, mid.FinalAngleDecimal); + Assert.AreEqual(10m, mid.StartFinalAngle); + Assert.AreEqual(PostViewTorque.OnlyPVTHOn, mid.PostViewTorqueActivated); + Assert.AreEqual(6521.43m, mid.PostViewTorqueHigh); + Assert.AreEqual(52.32m, mid.PostViewTorqueLow); + Assert.AreEqual(1m, mid.CurrentMonitoringAmpere); + Assert.AreEqual(0.50m, mid.CurrentMonitoringAmpereMin); + Assert.AreEqual(1.50m, mid.CurrentMonitoringAmpereMax); + Assert.AreEqual(1, mid.AngleNumeratorScaleFactor); + Assert.AreEqual(1, mid.AngleDenominatorScaleFactor); + Assert.AreEqual(TighteningValueStatus.Ok, mid.OverallAngleStatus); + Assert.AreEqual(-20, mid.OverallAngleMin); + Assert.AreEqual(100, mid.OverallAngleMax); + Assert.AreEqual(120, mid.OverallAngle); + Assert.AreEqual(32.91m, mid.PeakTorque); + Assert.AreEqual(10.05m, mid.ResidualBreakawayTorque); + Assert.AreEqual(1.10m, mid.StartRundownAngle); + Assert.AreEqual(90m, mid.RundownAngleComplete); + Assert.AreEqual(1.20m, mid.ClickTorque); + Assert.AreEqual(1, mid.ClickAngle); AssertEqualPackages(pack, mid); } @@ -1734,7 +1789,7 @@ public void Mid0061ByteRevision11() { 0xAA, //1010 1010 0x03, //0000 0011 - 0x0A, //0000 1010 + 0x0A, //0000 1010 0xD1, //1101 0001 0x00, 0x00, @@ -1747,7 +1802,7 @@ public void Mid0061ByteRevision11() var tighteningErrorStatus2 = new byte[] //10 bytes long { 0xAA, //1010 1010 - 0x03, //0000 0011 + 0x03, //0000 0011 0x02, //0000 0010 0x00, //Reserved from bit 19 to rest 0x00, @@ -1776,80 +1831,82 @@ public void Mid0061ByteRevision11() var mid = _midInterpreter.Parse(bytes.ToArray()); Assert.AreEqual(typeof(Mid0061), mid.GetType()); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.TorqueControllerName); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(1, mid.CellId); + Assert.AreEqual(1, mid.ChannelId); + Assert.AreEqual("airbag7 ", mid.TorqueControllerName); + Assert.AreEqual("KPOL3456JKLO897 ", mid.VinNumber); + Assert.AreEqual(6, mid.JobId); + Assert.AreEqual(3, mid.ParameterSetId); + Assert.AreEqual(Strategy.RotateSpindleReverse, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.IsFalse(mid.TighteningStatus); + Assert.AreEqual(BatchStatus.Nok, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.TorqueMinLimit); - Assert.IsNotNull(mid.TorqueMaxLimit); - Assert.IsNotNull(mid.TorqueFinalTarget); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.AngleMinLimit); - Assert.IsNotNull(mid.AngleMaxLimit); - Assert.IsNotNull(mid.AngleFinalTarget); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringMin); - Assert.IsNotNull(mid.CurrentMonitoringMax); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapMin); - Assert.IsNotNull(mid.SelftapMax); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMin); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMax); - Assert.IsNotNull(mid.PrevailTorque); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.LastChangeInParameterSet); - Assert.IsNotNull(mid.ParameterSetName); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); - Assert.IsNotNull(mid.CustomerTighteningErrorCode); - Assert.IsNotNull(mid.PrevailTorqueCompensateValue); + Assert.AreEqual(8.40m, mid.TorqueMinLimit); + Assert.AreEqual(14m, mid.TorqueMaxLimit); + Assert.AreEqual(12m, mid.TorqueFinalTarget); + Assert.AreEqual(7.39m, mid.Torque); + Assert.AreEqual(0, mid.AngleMinLimit); + Assert.AreEqual(9999, mid.AngleMaxLimit); + Assert.AreEqual(0, mid.AngleFinalTarget); + Assert.AreEqual(0, mid.Angle); + Assert.AreEqual(0, mid.RundownAngleMin); + Assert.AreEqual(9999, mid.RundownAngleMax); + Assert.AreEqual(5000, mid.RundownAngle); + Assert.AreEqual(0, mid.CurrentMonitoringMin); + Assert.AreEqual(50, mid.CurrentMonitoringMax); + Assert.AreEqual(45, mid.CurrentMonitoringValue); + Assert.AreEqual(0.10m, mid.SelftapMin); + Assert.AreEqual(1.25m, mid.SelftapMax); + Assert.AreEqual(5.48m, mid.SelftapTorque); + Assert.AreEqual(0.10m, mid.PrevailTorqueMonitoringMin); + Assert.AreEqual(9999m, mid.PrevailTorqueMonitoringMax); + Assert.AreEqual(5555m, mid.PrevailTorque); + Assert.AreEqual(4294967295, mid.TighteningId); + Assert.AreEqual(65500, mid.JobSequenceNumber); + Assert.AreEqual(60535, mid.SyncTighteningId); + Assert.AreEqual("ABCDEFG-123456", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2001, 6, 2, 9, 54, 9), mid.Timestamp); + Assert.AreEqual(new DateTime(2001, 5, 29, 12, 34, 33), mid.LastChangeInParameterSet); + Assert.AreEqual("Test Parameter Set ", mid.ParameterSetName); + Assert.AreEqual(TorqueValuesUnit.LbfFt, mid.TorqueValuesUnit); + Assert.AreEqual(ResultType.BypassParameterSetResult, mid.ResultType); + Assert.AreEqual("Identifier result part 2 ", mid.IdentifierResultPart2); + Assert.AreEqual("Identifier result part 3 ", mid.IdentifierResultPart3); + Assert.AreEqual("Identifier result part 4 ", mid.IdentifierResultPart4); + Assert.AreEqual("E124", mid.CustomerTighteningErrorCode); + Assert.AreEqual(15m, mid.PrevailTorqueCompensateValue); Assert.IsNotNull(mid.TighteningErrorStatus2); - Assert.IsNotNull(mid.CompensatedAngle); - Assert.IsNotNull(mid.FinalAngleDecimal); - Assert.AreNotEqual(0, mid.StartFinalAngle); - Assert.IsNotNull(mid.PostViewTorqueActivated); - Assert.AreNotEqual(0, mid.PostViewTorqueHigh); - Assert.AreNotEqual(0, mid.PostViewTorqueLow); - Assert.AreNotEqual(0, mid.CurrentMonitoringAmpere); - Assert.AreNotEqual(0, mid.CurrentMonitoringAmpereMin); - Assert.AreNotEqual(0, mid.CurrentMonitoringAmpereMax); - Assert.AreNotEqual(0, mid.AngleNumeratorScaleFactor); - Assert.AreNotEqual(0, mid.AngleDenominatorScaleFactor); - Assert.IsNotNull(mid.OverallAngleStatus); - Assert.AreNotEqual(0, mid.OverallAngleMin); - Assert.AreNotEqual(0, mid.OverallAngleMax); - Assert.AreNotEqual(0, mid.OverallAngle); - Assert.AreNotEqual(0, mid.PeakTorque); - Assert.AreNotEqual(0, mid.ResidualBreakawayTorque); - Assert.AreNotEqual(0, mid.StartRundownAngle); - Assert.AreNotEqual(0, mid.RundownAngleComplete); - Assert.AreNotEqual(0, mid.OverallAngle); - Assert.AreNotEqual(0, mid.ClickTorque); - Assert.AreNotEqual(0, mid.ClickAngle); + Assert.AreEqual(100m, mid.CompensatedAngle); + Assert.AreEqual(9999m, mid.FinalAngleDecimal); + Assert.AreEqual(10m, mid.StartFinalAngle); + Assert.AreEqual(PostViewTorque.OnlyPVTHOn, mid.PostViewTorqueActivated); + Assert.AreEqual(6521.43m, mid.PostViewTorqueHigh); + Assert.AreEqual(52.32m, mid.PostViewTorqueLow); + Assert.AreEqual(1m, mid.CurrentMonitoringAmpere); + Assert.AreEqual(0.50m, mid.CurrentMonitoringAmpereMin); + Assert.AreEqual(1.50m, mid.CurrentMonitoringAmpereMax); + Assert.AreEqual(1, mid.AngleNumeratorScaleFactor); + Assert.AreEqual(1, mid.AngleDenominatorScaleFactor); + Assert.AreEqual(TighteningValueStatus.Ok, mid.OverallAngleStatus); + Assert.AreEqual(-20, mid.OverallAngleMin); + Assert.AreEqual(100, mid.OverallAngleMax); + Assert.AreEqual(120, mid.OverallAngle); + Assert.AreEqual(32.91m, mid.PeakTorque); + Assert.AreEqual(10.05m, mid.ResidualBreakawayTorque); + Assert.AreEqual(1.10m, mid.StartRundownAngle); + Assert.AreEqual(90m, mid.RundownAngleComplete); + Assert.AreEqual(1.20m, mid.ClickTorque); + Assert.AreEqual(1, mid.ClickAngle); AssertEqualPackages(bytes, mid); } @@ -1861,61 +1918,65 @@ public void Mid0061Revision998() var mid = _midInterpreter.Parse(pack); Assert.AreEqual(typeof(Mid0061), mid.GetType()); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.TorqueControllerName); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(0, mid.CellId); + Assert.AreEqual(0, mid.ChannelId); + Assert.AreEqual("RA ST6.2 ETV100 ", mid.TorqueControllerName); + Assert.AreEqual(" ", mid.VinNumber); + Assert.AreEqual(0, mid.JobId); + Assert.AreEqual(1, mid.ParameterSetId); + Assert.AreEqual(Strategy.TorqueControlAndAngleMonitoring, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.IsFalse(mid.TighteningStatus); + Assert.AreEqual(BatchStatus.NotUsed, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.TorqueMinLimit); - Assert.IsNotNull(mid.TorqueMaxLimit); - Assert.IsNotNull(mid.TorqueFinalTarget); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.AngleMinLimit); - Assert.IsNotNull(mid.AngleMaxLimit); - Assert.IsNotNull(mid.AngleFinalTarget); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringMin); - Assert.IsNotNull(mid.CurrentMonitoringMax); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapMin); - Assert.IsNotNull(mid.SelftapMax); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMin); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMax); - Assert.IsNotNull(mid.PrevailTorque); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.LastChangeInParameterSet); - Assert.IsNotNull(mid.ParameterSetName); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); - Assert.IsNotNull(mid.CustomerTighteningErrorCode); - Assert.IsNotNull(mid.PrevailTorqueCompensateValue); + Assert.AreEqual(34m, mid.TorqueMinLimit); + Assert.AreEqual(46m, mid.TorqueMaxLimit); + Assert.AreEqual(40m, mid.TorqueFinalTarget); + Assert.AreEqual(5.05m, mid.Torque); + Assert.AreEqual(20, mid.AngleMinLimit); + Assert.AreEqual(420, mid.AngleMaxLimit); + Assert.AreEqual(0, mid.AngleFinalTarget); + Assert.AreEqual(0, mid.Angle); + Assert.AreEqual(100, mid.RundownAngleMin); + Assert.AreEqual(850, mid.RundownAngleMax); + Assert.AreEqual(4, mid.RundownAngle); + Assert.AreEqual(0, mid.CurrentMonitoringMin); + Assert.AreEqual(150, mid.CurrentMonitoringMax); + Assert.AreEqual(0, mid.CurrentMonitoringValue); + Assert.AreEqual(0m, mid.SelftapMin); + Assert.AreEqual(9999m, mid.SelftapMax); + Assert.AreEqual(0m, mid.SelftapTorque); + Assert.AreEqual(0m, mid.PrevailTorqueMonitoringMin); + Assert.AreEqual(0m, mid.PrevailTorqueMonitoringMax); + Assert.AreEqual(0m, mid.PrevailTorque); + Assert.AreEqual(184887, mid.TighteningId); + Assert.AreEqual(0, mid.JobSequenceNumber); + Assert.AreEqual(0, mid.SyncTighteningId); + Assert.AreEqual(" C0761275", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2020, 6, 25, 1, 4, 39), mid.Timestamp); + Assert.AreEqual(new DateTime(2020, 6, 24, 10, 48, 53), mid.LastChangeInParameterSet); + Assert.AreEqual("Test Parameter Set ", mid.ParameterSetName); + Assert.AreEqual(TorqueValuesUnit.LbfFt, mid.TorqueValuesUnit); + Assert.AreEqual(ResultType.BypassParameterSetResult, mid.ResultType); + Assert.AreEqual("Identifier result part 2 ", mid.IdentifierResultPart2); + Assert.AreEqual("Identifier result part 3 ", mid.IdentifierResultPart3); + Assert.AreEqual("Identifier result part 4 ", mid.IdentifierResultPart4); + Assert.AreEqual("E124", mid.CustomerTighteningErrorCode); + Assert.AreEqual(15m, mid.PrevailTorqueCompensateValue); Assert.IsNotNull(mid.TighteningErrorStatus2); - Assert.IsNotNull(mid.NumberOfStagesInMultistage); - Assert.IsNotNull(mid.NumberOfStageResults); + Assert.AreEqual(2, mid.NumberOfStagesInMultistage); + Assert.AreEqual(2, mid.NumberOfStageResults); Assert.IsNotNull(mid.StageResults); + Assert.AreEqual(2, mid.StageResults.Count); AssertEqualPackages(pack, mid); } @@ -1937,7 +1998,7 @@ public void Mid0061ByteRevision998() { 0xAA, //1010 1010 0x03, //0000 0011 - 0x0A, //0000 1010 + 0x0A, //0000 1010 0xD1, //1101 0001 0x00, 0x00, @@ -1950,7 +2011,7 @@ public void Mid0061ByteRevision998() var tighteningErrorStatus2 = new byte[] //10 bytes long { 0xAA, //1010 1010 - 0x03, //0000 0011 + 0x03, //0000 0011 0x02, //0000 0010 0x00, //Reserved from bit 19 to rest 0x00, @@ -1979,61 +2040,65 @@ public void Mid0061ByteRevision998() var mid = _midInterpreter.Parse(bytes.ToArray()); Assert.AreEqual(typeof(Mid0061), mid.GetType()); - Assert.IsNotNull(mid.CellId); - Assert.IsNotNull(mid.ChannelId); - Assert.IsNotNull(mid.TorqueControllerName); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(1, mid.CellId); + Assert.AreEqual(1, mid.ChannelId); + Assert.AreEqual("airbag7 ", mid.TorqueControllerName); + Assert.AreEqual("KPOL3456JKLO897 ", mid.VinNumber); + Assert.AreEqual(6, mid.JobId); + Assert.AreEqual(3, mid.ParameterSetId); + Assert.AreEqual(Strategy.RotateSpindleReverse, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.IsFalse(mid.TighteningStatus); + Assert.AreEqual(BatchStatus.Nok, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.TorqueMinLimit); - Assert.IsNotNull(mid.TorqueMaxLimit); - Assert.IsNotNull(mid.TorqueFinalTarget); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.AngleMinLimit); - Assert.IsNotNull(mid.AngleMaxLimit); - Assert.IsNotNull(mid.AngleFinalTarget); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringMin); - Assert.IsNotNull(mid.CurrentMonitoringMax); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapMin); - Assert.IsNotNull(mid.SelftapMax); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMin); - Assert.IsNotNull(mid.PrevailTorqueMonitoringMax); - Assert.IsNotNull(mid.PrevailTorque); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.LastChangeInParameterSet); - Assert.IsNotNull(mid.ParameterSetName); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); - Assert.IsNotNull(mid.CustomerTighteningErrorCode); - Assert.IsNotNull(mid.PrevailTorqueCompensateValue); + Assert.AreEqual(8.40m, mid.TorqueMinLimit); + Assert.AreEqual(14m, mid.TorqueMaxLimit); + Assert.AreEqual(12m, mid.TorqueFinalTarget); + Assert.AreEqual(7.39m, mid.Torque); + Assert.AreEqual(0, mid.AngleMinLimit); + Assert.AreEqual(9999, mid.AngleMaxLimit); + Assert.AreEqual(0, mid.AngleFinalTarget); + Assert.AreEqual(0, mid.Angle); + Assert.AreEqual(0, mid.RundownAngleMin); + Assert.AreEqual(9999, mid.RundownAngleMax); + Assert.AreEqual(5000, mid.RundownAngle); + Assert.AreEqual(0, mid.CurrentMonitoringMin); + Assert.AreEqual(50, mid.CurrentMonitoringMax); + Assert.AreEqual(45, mid.CurrentMonitoringValue); + Assert.AreEqual(0.10m, mid.SelftapMin); + Assert.AreEqual(1.25m, mid.SelftapMax); + Assert.AreEqual(5.48m, mid.SelftapTorque); + Assert.AreEqual(0.10m, mid.PrevailTorqueMonitoringMin); + Assert.AreEqual(9999m, mid.PrevailTorqueMonitoringMax); + Assert.AreEqual(5555m, mid.PrevailTorque); + Assert.AreEqual(4294967295, mid.TighteningId); + Assert.AreEqual(65500, mid.JobSequenceNumber); + Assert.AreEqual(60535, mid.SyncTighteningId); + Assert.AreEqual("ABCDEFG-123456", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2001, 6, 2, 9, 54, 9), mid.Timestamp); + Assert.AreEqual(new DateTime(2001, 5, 29, 12, 34, 33), mid.LastChangeInParameterSet); + Assert.AreEqual("Test Parameter Set ", mid.ParameterSetName); + Assert.AreEqual(TorqueValuesUnit.LbfFt, mid.TorqueValuesUnit); + Assert.AreEqual(ResultType.BypassParameterSetResult, mid.ResultType); + Assert.AreEqual("Identifier result part 2 ", mid.IdentifierResultPart2); + Assert.AreEqual("Identifier result part 3 ", mid.IdentifierResultPart3); + Assert.AreEqual("Identifier result part 4 ", mid.IdentifierResultPart4); + Assert.AreEqual("E124", mid.CustomerTighteningErrorCode); + Assert.AreEqual(15m, mid.PrevailTorqueCompensateValue); Assert.IsNotNull(mid.TighteningErrorStatus2); - Assert.IsNotNull(mid.NumberOfStagesInMultistage); - Assert.IsNotNull(mid.NumberOfStageResults); + Assert.AreEqual(2, mid.NumberOfStagesInMultistage); + Assert.AreEqual(2, mid.NumberOfStageResults); Assert.IsNotNull(mid.StageResults); + Assert.AreEqual(2, mid.StageResults.Count); AssertEqualPackages(bytes, mid); } @@ -2045,20 +2110,20 @@ public void Mid0061Revision999() var mid = _midInterpreter.Parse(pack); Assert.AreEqual(typeof(Mid0061), mid.GetType()); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.LastChangeInParameterSet); - Assert.IsNotNull(mid.TighteningId); + Assert.AreEqual("KPOL3456JKLO897 ", mid.VinNumber); + Assert.AreEqual(2, mid.JobId); + Assert.AreEqual(1, mid.ParameterSetId); + Assert.AreEqual(20, mid.BatchSize); + Assert.AreEqual(19, mid.BatchCounter); + Assert.AreEqual(BatchStatus.NotUsed, mid.BatchStatus); + Assert.IsTrue(mid.TighteningStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.AngleStatus); + Assert.AreEqual(5m, mid.Torque); + Assert.AreEqual(360, mid.Angle); + Assert.AreEqual(new DateTime(2001, 6, 2, 9, 54, 9), mid.Timestamp); + Assert.AreEqual(new DateTime(2000, 6, 2, 9, 54, 9), mid.LastChangeInParameterSet); + Assert.AreEqual(4294967295L, mid.TighteningId); AssertEqualPackages(pack, mid); } @@ -2072,21 +2137,1683 @@ public void Mid0061ByteRevision999() Assert.AreEqual(typeof(Mid0061), mid.GetType()); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.LastChangeInParameterSet); - Assert.IsNotNull(mid.TighteningId); + Assert.AreEqual("KPOL3456JKLO897 ", mid.VinNumber); + Assert.AreEqual(2, mid.JobId); + Assert.AreEqual(1, mid.ParameterSetId); + Assert.AreEqual(20, mid.BatchSize); + Assert.AreEqual(19, mid.BatchCounter); + Assert.AreEqual(BatchStatus.NotUsed, mid.BatchStatus); + Assert.IsTrue(mid.TighteningStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.AngleStatus); + Assert.AreEqual(5m, mid.Torque); + Assert.AreEqual(360, mid.Angle); + Assert.AreEqual(new DateTime(2001, 6, 2, 9, 54, 9), mid.Timestamp); + Assert.AreEqual(new DateTime(2000, 6, 2, 9, 54, 9), mid.LastChangeInParameterSet); + Assert.AreEqual(4294967295L, mid.TighteningId); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0061PackRevision1() + { + string package = "02310061001 010001020103airbag7 04KPOL3456JKLO897 050006003070000080000090100111120008401300140014001200150007391600000170999918000001900000202001-06-02:09:54:09212001-05-29:12:34:33221230000345675"; + + AssertBuildAndParse(package, new Mid0061(1) + { + CellId = 1, + ChannelId = 1, + TorqueControllerName = "airbag7", + VinNumber = "KPOL3456JKLO897", + JobId = 0, + ParameterSetId = 3, + BatchSize = 0, + BatchCounter = 0, + TighteningStatus = false, + TorqueStatus = TighteningValueStatus.Low, + AngleStatus = TighteningValueStatus.Ok, + TorqueMinLimit = 8.4m, + TorqueMaxLimit = 14m, + TorqueFinalTarget = 12m, + Torque = 7.39m, + AngleMinLimit = 0, + AngleMaxLimit = 9999, + AngleFinalTarget = 0, + Angle = 0, + Timestamp = new DateTime(2001, 6, 2, 9, 54, 9), + LastChangeInParameterSet = new DateTime(2001, 5, 29, 12, 34, 33), + BatchStatus = BatchStatus.Ok, + TighteningId = 345675L + }); + } + + [TestMethod] + [TestCategory("Revision 2"), TestCategory("Pack")] + public void Mid0061PackRevision2() + { + string package = "03850061002 010000020003RA ST6.2 ETV100 04 05000006001070208000670900001000001101221301401501611711811912000000081942100340022004600230040002400050525000202600420270000028000002900100300085031000043200033150340003500000036999900370000003800000039000000400000004100001848874200000430000044 C0761275452020-06-25:01:04:39462020-06-24:10:48:53"; + + AssertBuildAndParse(package, new Mid0061(2) + { + CellId = 0, + ChannelId = 0, + TorqueControllerName = "RA ST6.2 ETV100", + VinNumber = "", + JobId = 0, + ParameterSetId = 1, + BatchSize = 0, + BatchCounter = 0, + TighteningStatus = false, + TorqueStatus = TighteningValueStatus.Low, + AngleStatus = TighteningValueStatus.Low, + TorqueMinLimit = 34m, + TorqueMaxLimit = 46m, + TorqueFinalTarget = 40m, + Torque = 5.05m, + AngleMinLimit = 20, + AngleMaxLimit = 420, + AngleFinalTarget = 0, + Angle = 0, + Timestamp = new DateTime(2020, 6, 25, 1, 4, 39), + LastChangeInParameterSet = new DateTime(2020, 6, 24, 10, 48, 53), + BatchStatus = BatchStatus.NotUsed, + TighteningId = 184887L, + Strategy = Strategy.TorqueControlAndAngleMonitoring, + StrategyOptions = new StrategyOptions() + { + Torque = true, + Angle = true, + Batch = false, + PvtMonitoring = false, + PvtCompensate = false, + Selftap = false, + Rundown = true, + CM = false, + DsControl = false, + ClickWrench = false, + RbwMonitoring = false + }, + RundownAngleStatus = TighteningValueStatus.Low, + CurrentMonitoringStatus = TighteningValueStatus.Ok, + SelftapStatus = TighteningValueStatus.Ok, + PrevailTorqueMonitoringStatus = TighteningValueStatus.Ok, + PrevailTorqueCompensateStatus = TighteningValueStatus.Ok, + TighteningErrorStatus = new TighteningErrorStatus() + { + RundownAngleMaxShutOff = false, + RundownAngleMinShutOff = true, + TorqueMaxShutOff = false, + AngleMaxShutOff = false, + SelftapTorqueMaxShutOff = false, + SelftapTorqueMinShutOff = false, + PrevailTorqueMaxShutOff = false, + PrevailTorqueMinShutOff = false, + PrevailTorqueCompensateOverflow = false, + CurrentMonitoringMaxShutOff = false, + PostViewTorqueMinTorqueShutOff = false, + PostViewTorqueMaxTorqueShutOff = false, + PostViewTorqueAngleTooSmall = false, + TriggerLost = true, + TorqueLessThanTarget = false, + ToolHot = false, + MultistageAbort = false, + Rehit = false, + DsMeasureFailed = false, + CurrentLimitReached = false, + EndTimeOutShutOff = false, + RemoveFastenerLimitExceeded = false, + DisableDrive = false, + TransducerLost = false, + TransducerShorted = false, + TransducerCorrupt = false, + SyncTimeout = false, + DynamicCurrentMonitoringMin = false, + DynamicCurrentMonitoringMax = false, + AngleMaxMonitor = false, + YieldNutOff = false, + YieldTooFewSamples = false + }, + RundownAngleMin = 100, + RundownAngleMax = 850, + RundownAngle = 4, + CurrentMonitoringMin = 0, + CurrentMonitoringMax = 150, + CurrentMonitoringValue = 0, + SelftapMin = 0m, + SelftapMax = 9999m, + SelftapTorque = 0m, + PrevailTorqueMonitoringMin = 0m, + PrevailTorqueMonitoringMax = 0m, + PrevailTorque = 0m, + JobSequenceNumber = 0, + SyncTighteningId = 0, + ToolSerialNumber = " C0761275" + }); + } + + [TestMethod] + [TestCategory("Revision 3"), TestCategory("Pack")] + public void Mid0061PackRevision3() + { + string package = "04190061003 010000020003RA ST6.2 ETV100 04 05000006001070208000670900001000001101221301401501611711811912000000081942100340022004600230040002400050525000202600420270000028000002900100300085031000043200033150340003500000036999900370000003800000039000000400000004100001848874200000430000044 C0761275452020-06-25:01:04:39462020-06-24:10:48:5347Test Parameter Set 4824905"; + + AssertBuildAndParse(package, new Mid0061(3) + { + CellId = 0, + ChannelId = 0, + TorqueControllerName = "RA ST6.2 ETV100", + VinNumber = "", + JobId = 0, + ParameterSetId = 1, + BatchSize = 0, + BatchCounter = 0, + TighteningStatus = false, + TorqueStatus = TighteningValueStatus.Low, + AngleStatus = TighteningValueStatus.Low, + TorqueMinLimit = 34m, + TorqueMaxLimit = 46m, + TorqueFinalTarget = 40m, + Torque = 5.05m, + AngleMinLimit = 20, + AngleMaxLimit = 420, + AngleFinalTarget = 0, + Angle = 0, + Timestamp = new DateTime(2020, 6, 25, 1, 4, 39), + LastChangeInParameterSet = new DateTime(2020, 6, 24, 10, 48, 53), + BatchStatus = BatchStatus.NotUsed, + TighteningId = 184887L, + Strategy = Strategy.TorqueControlAndAngleMonitoring, + StrategyOptions = new StrategyOptions() + { + Torque = true, + Angle = true, + Batch = false, + PvtMonitoring = false, + PvtCompensate = false, + Selftap = false, + Rundown = true, + CM = false, + DsControl = false, + ClickWrench = false, + RbwMonitoring = false + }, + RundownAngleStatus = TighteningValueStatus.Low, + CurrentMonitoringStatus = TighteningValueStatus.Ok, + SelftapStatus = TighteningValueStatus.Ok, + PrevailTorqueMonitoringStatus = TighteningValueStatus.Ok, + PrevailTorqueCompensateStatus = TighteningValueStatus.Ok, + TighteningErrorStatus = new TighteningErrorStatus() + { + RundownAngleMaxShutOff = false, + RundownAngleMinShutOff = true, + TorqueMaxShutOff = false, + AngleMaxShutOff = false, + SelftapTorqueMaxShutOff = false, + SelftapTorqueMinShutOff = false, + PrevailTorqueMaxShutOff = false, + PrevailTorqueMinShutOff = false, + PrevailTorqueCompensateOverflow = false, + CurrentMonitoringMaxShutOff = false, + PostViewTorqueMinTorqueShutOff = false, + PostViewTorqueMaxTorqueShutOff = false, + PostViewTorqueAngleTooSmall = false, + TriggerLost = true, + TorqueLessThanTarget = false, + ToolHot = false, + MultistageAbort = false, + Rehit = false, + DsMeasureFailed = false, + CurrentLimitReached = false, + EndTimeOutShutOff = false, + RemoveFastenerLimitExceeded = false, + DisableDrive = false, + TransducerLost = false, + TransducerShorted = false, + TransducerCorrupt = false, + SyncTimeout = false, + DynamicCurrentMonitoringMin = false, + DynamicCurrentMonitoringMax = false, + AngleMaxMonitor = false, + YieldNutOff = false, + YieldTooFewSamples = false + }, + RundownAngleMin = 100, + RundownAngleMax = 850, + RundownAngle = 4, + CurrentMonitoringMin = 0, + CurrentMonitoringMax = 150, + CurrentMonitoringValue = 0, + SelftapMin = 0m, + SelftapMax = 9999m, + SelftapTorque = 0m, + PrevailTorqueMonitoringMin = 0m, + PrevailTorqueMonitoringMax = 0m, + PrevailTorque = 0m, + JobSequenceNumber = 0, + SyncTighteningId = 0, + ToolSerialNumber = " C0761275", + ParameterSetName = "Test Parameter Set", + TorqueValuesUnit = TorqueValuesUnit.LbfFt, + ResultType = ResultType.BypassParameterSetResult + }); + } + + [TestMethod] + [TestCategory("Revision 4"), TestCategory("Pack")] + public void Mid0061PackRevision4() + { + string package = "05000061004 010000020003RA ST6.2 ETV100 04 05000006001070208000670900001000001101221301401501611711811912000000081942100340022004600230040002400050525000202600420270000028000002900100300085031000043200033150340003500000036999900370000003800000039000000400000004100001848874200000430000044 C0761275452020-06-25:01:04:39462020-06-24:10:48:5347Test Parameter Set 482490550Identifier result part 2 51Identifier result part 3 52Identifier result part 4 "; + + AssertBuildAndParse(package, new Mid0061(4) + { + CellId = 0, + ChannelId = 0, + TorqueControllerName = "RA ST6.2 ETV100", + VinNumber = "", + JobId = 0, + ParameterSetId = 1, + BatchSize = 0, + BatchCounter = 0, + TighteningStatus = false, + TorqueStatus = TighteningValueStatus.Low, + AngleStatus = TighteningValueStatus.Low, + TorqueMinLimit = 34m, + TorqueMaxLimit = 46m, + TorqueFinalTarget = 40m, + Torque = 5.05m, + AngleMinLimit = 20, + AngleMaxLimit = 420, + AngleFinalTarget = 0, + Angle = 0, + Timestamp = new DateTime(2020, 6, 25, 1, 4, 39), + LastChangeInParameterSet = new DateTime(2020, 6, 24, 10, 48, 53), + BatchStatus = BatchStatus.NotUsed, + TighteningId = 184887L, + Strategy = Strategy.TorqueControlAndAngleMonitoring, + StrategyOptions = new StrategyOptions() + { + Torque = true, + Angle = true, + Batch = false, + PvtMonitoring = false, + PvtCompensate = false, + Selftap = false, + Rundown = true, + CM = false, + DsControl = false, + ClickWrench = false, + RbwMonitoring = false + }, + RundownAngleStatus = TighteningValueStatus.Low, + CurrentMonitoringStatus = TighteningValueStatus.Ok, + SelftapStatus = TighteningValueStatus.Ok, + PrevailTorqueMonitoringStatus = TighteningValueStatus.Ok, + PrevailTorqueCompensateStatus = TighteningValueStatus.Ok, + TighteningErrorStatus = new TighteningErrorStatus() + { + RundownAngleMaxShutOff = false, + RundownAngleMinShutOff = true, + TorqueMaxShutOff = false, + AngleMaxShutOff = false, + SelftapTorqueMaxShutOff = false, + SelftapTorqueMinShutOff = false, + PrevailTorqueMaxShutOff = false, + PrevailTorqueMinShutOff = false, + PrevailTorqueCompensateOverflow = false, + CurrentMonitoringMaxShutOff = false, + PostViewTorqueMinTorqueShutOff = false, + PostViewTorqueMaxTorqueShutOff = false, + PostViewTorqueAngleTooSmall = false, + TriggerLost = true, + TorqueLessThanTarget = false, + ToolHot = false, + MultistageAbort = false, + Rehit = false, + DsMeasureFailed = false, + CurrentLimitReached = false, + EndTimeOutShutOff = false, + RemoveFastenerLimitExceeded = false, + DisableDrive = false, + TransducerLost = false, + TransducerShorted = false, + TransducerCorrupt = false, + SyncTimeout = false, + DynamicCurrentMonitoringMin = false, + DynamicCurrentMonitoringMax = false, + AngleMaxMonitor = false, + YieldNutOff = false, + YieldTooFewSamples = false + }, + RundownAngleMin = 100, + RundownAngleMax = 850, + RundownAngle = 4, + CurrentMonitoringMin = 0, + CurrentMonitoringMax = 150, + CurrentMonitoringValue = 0, + SelftapMin = 0m, + SelftapMax = 9999m, + SelftapTorque = 0m, + PrevailTorqueMonitoringMin = 0m, + PrevailTorqueMonitoringMax = 0m, + PrevailTorque = 0m, + JobSequenceNumber = 0, + SyncTighteningId = 0, + ToolSerialNumber = " C0761275", + ParameterSetName = "Test Parameter Set", + TorqueValuesUnit = TorqueValuesUnit.LbfFt, + ResultType = ResultType.BypassParameterSetResult, + IdentifierResultPart2 = "Identifier result part 2", + IdentifierResultPart3 = "Identifier result part 3", + IdentifierResultPart4 = "Identifier result part 4" + }); + } + + [TestMethod] + [TestCategory("Revision 5"), TestCategory("Pack")] + public void Mid0061PackRevision5() + { + string package = "05060061005 010000020003RA ST6.2 ETV100 04 05000006001070208000670900001000001101221301401501611711811912000000081942100340022004600230040002400050525000202600420270000028000002900100300085031000043200033150340003500000036999900370000003800000039000000400000004100001848874200000430000044 C0761275452020-06-25:01:04:39462020-06-24:10:48:5347Test Parameter Set 482490550Identifier result part 2 51Identifier result part 3 52Identifier result part 4 53E124"; + + AssertBuildAndParse(package, new Mid0061(5) + { + CellId = 0, + ChannelId = 0, + TorqueControllerName = "RA ST6.2 ETV100", + VinNumber = "", + JobId = 0, + ParameterSetId = 1, + BatchSize = 0, + BatchCounter = 0, + TighteningStatus = false, + TorqueStatus = TighteningValueStatus.Low, + AngleStatus = TighteningValueStatus.Low, + TorqueMinLimit = 34m, + TorqueMaxLimit = 46m, + TorqueFinalTarget = 40m, + Torque = 5.05m, + AngleMinLimit = 20, + AngleMaxLimit = 420, + AngleFinalTarget = 0, + Angle = 0, + Timestamp = new DateTime(2020, 6, 25, 1, 4, 39), + LastChangeInParameterSet = new DateTime(2020, 6, 24, 10, 48, 53), + BatchStatus = BatchStatus.NotUsed, + TighteningId = 184887L, + Strategy = Strategy.TorqueControlAndAngleMonitoring, + StrategyOptions = new StrategyOptions() + { + Torque = true, + Angle = true, + Batch = false, + PvtMonitoring = false, + PvtCompensate = false, + Selftap = false, + Rundown = true, + CM = false, + DsControl = false, + ClickWrench = false, + RbwMonitoring = false + }, + RundownAngleStatus = TighteningValueStatus.Low, + CurrentMonitoringStatus = TighteningValueStatus.Ok, + SelftapStatus = TighteningValueStatus.Ok, + PrevailTorqueMonitoringStatus = TighteningValueStatus.Ok, + PrevailTorqueCompensateStatus = TighteningValueStatus.Ok, + TighteningErrorStatus = new TighteningErrorStatus() + { + RundownAngleMaxShutOff = false, + RundownAngleMinShutOff = true, + TorqueMaxShutOff = false, + AngleMaxShutOff = false, + SelftapTorqueMaxShutOff = false, + SelftapTorqueMinShutOff = false, + PrevailTorqueMaxShutOff = false, + PrevailTorqueMinShutOff = false, + PrevailTorqueCompensateOverflow = false, + CurrentMonitoringMaxShutOff = false, + PostViewTorqueMinTorqueShutOff = false, + PostViewTorqueMaxTorqueShutOff = false, + PostViewTorqueAngleTooSmall = false, + TriggerLost = true, + TorqueLessThanTarget = false, + ToolHot = false, + MultistageAbort = false, + Rehit = false, + DsMeasureFailed = false, + CurrentLimitReached = false, + EndTimeOutShutOff = false, + RemoveFastenerLimitExceeded = false, + DisableDrive = false, + TransducerLost = false, + TransducerShorted = false, + TransducerCorrupt = false, + SyncTimeout = false, + DynamicCurrentMonitoringMin = false, + DynamicCurrentMonitoringMax = false, + AngleMaxMonitor = false, + YieldNutOff = false, + YieldTooFewSamples = false + }, + RundownAngleMin = 100, + RundownAngleMax = 850, + RundownAngle = 4, + CurrentMonitoringMin = 0, + CurrentMonitoringMax = 150, + CurrentMonitoringValue = 0, + SelftapMin = 0m, + SelftapMax = 9999m, + SelftapTorque = 0m, + PrevailTorqueMonitoringMin = 0m, + PrevailTorqueMonitoringMax = 0m, + PrevailTorque = 0m, + JobSequenceNumber = 0, + SyncTighteningId = 0, + ToolSerialNumber = " C0761275", + ParameterSetName = "Test Parameter Set", + TorqueValuesUnit = TorqueValuesUnit.LbfFt, + ResultType = ResultType.BypassParameterSetResult, + IdentifierResultPart2 = "Identifier result part 2", + IdentifierResultPart3 = "Identifier result part 3", + IdentifierResultPart4 = "Identifier result part 4", + CustomerTighteningErrorCode = "E124" + }); + } + + [TestMethod] + [TestCategory("Revision 6"), TestCategory("Pack")] + public void Mid0061PackRevision6() + { + string package = "05260061006 010000020003RA ST6.2 ETV100 04 05000006001070208000670900001000001101221301401501611711811912000000081942100340022004600230040002400050525000202600420270000028000002900100300085031000043200033150340003500000036999900370000003800000039000000400000004100001848874200000430000044 C0761275452020-06-25:01:04:39462020-06-24:10:48:5347Test Parameter Set 482490550Identifier result part 2 51Identifier result part 3 52Identifier result part 4 53E12454001500550000000042"; + + AssertBuildAndParse(package, new Mid0061(6) + { + CellId = 0, + ChannelId = 0, + TorqueControllerName = "RA ST6.2 ETV100", + VinNumber = "", + JobId = 0, + ParameterSetId = 1, + BatchSize = 0, + BatchCounter = 0, + TighteningStatus = false, + TorqueStatus = TighteningValueStatus.Low, + AngleStatus = TighteningValueStatus.Low, + TorqueMinLimit = 34m, + TorqueMaxLimit = 46m, + TorqueFinalTarget = 40m, + Torque = 5.05m, + AngleMinLimit = 20, + AngleMaxLimit = 420, + AngleFinalTarget = 0, + Angle = 0, + Timestamp = new DateTime(2020, 6, 25, 1, 4, 39), + LastChangeInParameterSet = new DateTime(2020, 6, 24, 10, 48, 53), + BatchStatus = BatchStatus.NotUsed, + TighteningId = 184887L, + Strategy = Strategy.TorqueControlAndAngleMonitoring, + StrategyOptions = new StrategyOptions() + { + Torque = true, + Angle = true, + Batch = false, + PvtMonitoring = false, + PvtCompensate = false, + Selftap = false, + Rundown = true, + CM = false, + DsControl = false, + ClickWrench = false, + RbwMonitoring = false + }, + RundownAngleStatus = TighteningValueStatus.Low, + CurrentMonitoringStatus = TighteningValueStatus.Ok, + SelftapStatus = TighteningValueStatus.Ok, + PrevailTorqueMonitoringStatus = TighteningValueStatus.Ok, + PrevailTorqueCompensateStatus = TighteningValueStatus.Ok, + TighteningErrorStatus = new TighteningErrorStatus() + { + RundownAngleMaxShutOff = false, + RundownAngleMinShutOff = true, + TorqueMaxShutOff = false, + AngleMaxShutOff = false, + SelftapTorqueMaxShutOff = false, + SelftapTorqueMinShutOff = false, + PrevailTorqueMaxShutOff = false, + PrevailTorqueMinShutOff = false, + PrevailTorqueCompensateOverflow = false, + CurrentMonitoringMaxShutOff = false, + PostViewTorqueMinTorqueShutOff = false, + PostViewTorqueMaxTorqueShutOff = false, + PostViewTorqueAngleTooSmall = false, + TriggerLost = true, + TorqueLessThanTarget = false, + ToolHot = false, + MultistageAbort = false, + Rehit = false, + DsMeasureFailed = false, + CurrentLimitReached = false, + EndTimeOutShutOff = false, + RemoveFastenerLimitExceeded = false, + DisableDrive = false, + TransducerLost = false, + TransducerShorted = false, + TransducerCorrupt = false, + SyncTimeout = false, + DynamicCurrentMonitoringMin = false, + DynamicCurrentMonitoringMax = false, + AngleMaxMonitor = false, + YieldNutOff = false, + YieldTooFewSamples = false + }, + RundownAngleMin = 100, + RundownAngleMax = 850, + RundownAngle = 4, + CurrentMonitoringMin = 0, + CurrentMonitoringMax = 150, + CurrentMonitoringValue = 0, + SelftapMin = 0m, + SelftapMax = 9999m, + SelftapTorque = 0m, + PrevailTorqueMonitoringMin = 0m, + PrevailTorqueMonitoringMax = 0m, + PrevailTorque = 0m, + JobSequenceNumber = 0, + SyncTighteningId = 0, + ToolSerialNumber = " C0761275", + ParameterSetName = "Test Parameter Set", + TorqueValuesUnit = TorqueValuesUnit.LbfFt, + ResultType = ResultType.BypassParameterSetResult, + IdentifierResultPart2 = "Identifier result part 2", + IdentifierResultPart3 = "Identifier result part 3", + IdentifierResultPart4 = "Identifier result part 4", + CustomerTighteningErrorCode = "E124", + PrevailTorqueCompensateValue = 15m, + TighteningErrorStatus2 = new TighteningErrorStatus2() + { + DriveDeactivated = false, + ToolStall = true, + DriveHot = false, + GradientMonitoringHigh = true, + GradientMonitoringLow = false, + ReactionBarFailed = true, + SnugMax = false, + CycleAbort = false, + NeckingFailure = false, + EffectiveLoosening = false, + OverSpeed = false, + NoResidualTorque = false, + PositioningFail = false, + SnugMonLow = false, + SnugMonHigh = false, + DynamicMinCurrent = false, + DynamicMaxCurrent = false, + LatentResult = false, + Reserved = new byte[] + { + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + } + } + }); + } + + [TestMethod] + [TestCategory("Revision 7"), TestCategory("Pack")] + public void Mid0061PackRevision7() + { + string package = "05440061007 010000020003RA ST6.2 ETV100 04 05000006001070208000670900001000001101221301401501611711811912000000081942100340022004600230040002400050525000202600420270000028000002900100300085031000043200033150340003500000036999900370000003800000039000000400000004100001848874200000430000044 C0761275452020-06-25:01:04:39462020-06-24:10:48:5347Test Parameter Set 482490550Identifier result part 2 51Identifier result part 3 52Identifier result part 4 53E12454001500550000000042560010000570999900"; + + AssertBuildAndParse(package, new Mid0061(7) + { + CellId = 0, + ChannelId = 0, + TorqueControllerName = "RA ST6.2 ETV100", + VinNumber = "", + JobId = 0, + ParameterSetId = 1, + BatchSize = 0, + BatchCounter = 0, + TighteningStatus = false, + TorqueStatus = TighteningValueStatus.Low, + AngleStatus = TighteningValueStatus.Low, + TorqueMinLimit = 34m, + TorqueMaxLimit = 46m, + TorqueFinalTarget = 40m, + Torque = 5.05m, + AngleMinLimit = 20, + AngleMaxLimit = 420, + AngleFinalTarget = 0, + Angle = 0, + Timestamp = new DateTime(2020, 6, 25, 1, 4, 39), + LastChangeInParameterSet = new DateTime(2020, 6, 24, 10, 48, 53), + BatchStatus = BatchStatus.NotUsed, + TighteningId = 184887L, + Strategy = Strategy.TorqueControlAndAngleMonitoring, + StrategyOptions = new StrategyOptions() + { + Torque = true, + Angle = true, + Batch = false, + PvtMonitoring = false, + PvtCompensate = false, + Selftap = false, + Rundown = true, + CM = false, + DsControl = false, + ClickWrench = false, + RbwMonitoring = false + }, + RundownAngleStatus = TighteningValueStatus.Low, + CurrentMonitoringStatus = TighteningValueStatus.Ok, + SelftapStatus = TighteningValueStatus.Ok, + PrevailTorqueMonitoringStatus = TighteningValueStatus.Ok, + PrevailTorqueCompensateStatus = TighteningValueStatus.Ok, + TighteningErrorStatus = new TighteningErrorStatus() + { + RundownAngleMaxShutOff = false, + RundownAngleMinShutOff = true, + TorqueMaxShutOff = false, + AngleMaxShutOff = false, + SelftapTorqueMaxShutOff = false, + SelftapTorqueMinShutOff = false, + PrevailTorqueMaxShutOff = false, + PrevailTorqueMinShutOff = false, + PrevailTorqueCompensateOverflow = false, + CurrentMonitoringMaxShutOff = false, + PostViewTorqueMinTorqueShutOff = false, + PostViewTorqueMaxTorqueShutOff = false, + PostViewTorqueAngleTooSmall = false, + TriggerLost = true, + TorqueLessThanTarget = false, + ToolHot = false, + MultistageAbort = false, + Rehit = false, + DsMeasureFailed = false, + CurrentLimitReached = false, + EndTimeOutShutOff = false, + RemoveFastenerLimitExceeded = false, + DisableDrive = false, + TransducerLost = false, + TransducerShorted = false, + TransducerCorrupt = false, + SyncTimeout = false, + DynamicCurrentMonitoringMin = false, + DynamicCurrentMonitoringMax = false, + AngleMaxMonitor = false, + YieldNutOff = false, + YieldTooFewSamples = false + }, + RundownAngleMin = 100, + RundownAngleMax = 850, + RundownAngle = 4, + CurrentMonitoringMin = 0, + CurrentMonitoringMax = 150, + CurrentMonitoringValue = 0, + SelftapMin = 0m, + SelftapMax = 9999m, + SelftapTorque = 0m, + PrevailTorqueMonitoringMin = 0m, + PrevailTorqueMonitoringMax = 0m, + PrevailTorque = 0m, + JobSequenceNumber = 0, + SyncTighteningId = 0, + ToolSerialNumber = " C0761275", + ParameterSetName = "Test Parameter Set", + TorqueValuesUnit = TorqueValuesUnit.LbfFt, + ResultType = ResultType.BypassParameterSetResult, + IdentifierResultPart2 = "Identifier result part 2", + IdentifierResultPart3 = "Identifier result part 3", + IdentifierResultPart4 = "Identifier result part 4", + CustomerTighteningErrorCode = "E124", + PrevailTorqueCompensateValue = 15m, + TighteningErrorStatus2 = new TighteningErrorStatus2() + { + DriveDeactivated = false, + ToolStall = true, + DriveHot = false, + GradientMonitoringHigh = true, + GradientMonitoringLow = false, + ReactionBarFailed = true, + SnugMax = false, + CycleAbort = false, + NeckingFailure = false, + EffectiveLoosening = false, + OverSpeed = false, + NoResidualTorque = false, + PositioningFail = false, + SnugMonLow = false, + SnugMonHigh = false, + DynamicMinCurrent = false, + DynamicMaxCurrent = false, + LatentResult = false, + Reserved = new byte[] + { + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + } + }, + CompensatedAngle = 100m, + FinalAngleDecimal = 9999m + }); + } + + [TestMethod] + [TestCategory("Revision 8"), TestCategory("Pack")] + public void Mid0061PackRevision8() + { + string package = "05710061008 010000020003RA ST6.2 ETV100 04 05000006001070208000670900001000001101221301401501611711811912000000081942100340022004600230040002400050525000202600420270000028000002900100300085031000043200033150340003500000036999900370000003800000039000000400000004100001848874200000430000044 C0761275452020-06-25:01:04:39462020-06-24:10:48:5347Test Parameter Set 482490550Identifier result part 2 51Identifier result part 3 52Identifier result part 4 53E12454001500550000000042560010000570999900580010005926065214361005232"; + + AssertBuildAndParse(package, new Mid0061(8) + { + CellId = 0, + ChannelId = 0, + TorqueControllerName = "RA ST6.2 ETV100", + VinNumber = "", + JobId = 0, + ParameterSetId = 1, + BatchSize = 0, + BatchCounter = 0, + TighteningStatus = false, + TorqueStatus = TighteningValueStatus.Low, + AngleStatus = TighteningValueStatus.Low, + TorqueMinLimit = 34m, + TorqueMaxLimit = 46m, + TorqueFinalTarget = 40m, + Torque = 5.05m, + AngleMinLimit = 20, + AngleMaxLimit = 420, + AngleFinalTarget = 0, + Angle = 0, + Timestamp = new DateTime(2020, 6, 25, 1, 4, 39), + LastChangeInParameterSet = new DateTime(2020, 6, 24, 10, 48, 53), + BatchStatus = BatchStatus.NotUsed, + TighteningId = 184887L, + Strategy = Strategy.TorqueControlAndAngleMonitoring, + StrategyOptions = new StrategyOptions() + { + Torque = true, + Angle = true, + Batch = false, + PvtMonitoring = false, + PvtCompensate = false, + Selftap = false, + Rundown = true, + CM = false, + DsControl = false, + ClickWrench = false, + RbwMonitoring = false + }, + RundownAngleStatus = TighteningValueStatus.Low, + CurrentMonitoringStatus = TighteningValueStatus.Ok, + SelftapStatus = TighteningValueStatus.Ok, + PrevailTorqueMonitoringStatus = TighteningValueStatus.Ok, + PrevailTorqueCompensateStatus = TighteningValueStatus.Ok, + TighteningErrorStatus = new TighteningErrorStatus() + { + RundownAngleMaxShutOff = false, + RundownAngleMinShutOff = true, + TorqueMaxShutOff = false, + AngleMaxShutOff = false, + SelftapTorqueMaxShutOff = false, + SelftapTorqueMinShutOff = false, + PrevailTorqueMaxShutOff = false, + PrevailTorqueMinShutOff = false, + PrevailTorqueCompensateOverflow = false, + CurrentMonitoringMaxShutOff = false, + PostViewTorqueMinTorqueShutOff = false, + PostViewTorqueMaxTorqueShutOff = false, + PostViewTorqueAngleTooSmall = false, + TriggerLost = true, + TorqueLessThanTarget = false, + ToolHot = false, + MultistageAbort = false, + Rehit = false, + DsMeasureFailed = false, + CurrentLimitReached = false, + EndTimeOutShutOff = false, + RemoveFastenerLimitExceeded = false, + DisableDrive = false, + TransducerLost = false, + TransducerShorted = false, + TransducerCorrupt = false, + SyncTimeout = false, + DynamicCurrentMonitoringMin = false, + DynamicCurrentMonitoringMax = false, + AngleMaxMonitor = false, + YieldNutOff = false, + YieldTooFewSamples = false + }, + RundownAngleMin = 100, + RundownAngleMax = 850, + RundownAngle = 4, + CurrentMonitoringMin = 0, + CurrentMonitoringMax = 150, + CurrentMonitoringValue = 0, + SelftapMin = 0m, + SelftapMax = 9999m, + SelftapTorque = 0m, + PrevailTorqueMonitoringMin = 0m, + PrevailTorqueMonitoringMax = 0m, + PrevailTorque = 0m, + JobSequenceNumber = 0, + SyncTighteningId = 0, + ToolSerialNumber = " C0761275", + ParameterSetName = "Test Parameter Set", + TorqueValuesUnit = TorqueValuesUnit.LbfFt, + ResultType = ResultType.BypassParameterSetResult, + IdentifierResultPart2 = "Identifier result part 2", + IdentifierResultPart3 = "Identifier result part 3", + IdentifierResultPart4 = "Identifier result part 4", + CustomerTighteningErrorCode = "E124", + PrevailTorqueCompensateValue = 15m, + TighteningErrorStatus2 = new TighteningErrorStatus2() + { + DriveDeactivated = false, + ToolStall = true, + DriveHot = false, + GradientMonitoringHigh = true, + GradientMonitoringLow = false, + ReactionBarFailed = true, + SnugMax = false, + CycleAbort = false, + NeckingFailure = false, + EffectiveLoosening = false, + OverSpeed = false, + NoResidualTorque = false, + PositioningFail = false, + SnugMonLow = false, + SnugMonHigh = false, + DynamicMinCurrent = false, + DynamicMaxCurrent = false, + LatentResult = false, + Reserved = new byte[] + { + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + } + }, + CompensatedAngle = 100m, + FinalAngleDecimal = 9999m, + StartFinalAngle = 10m, + PostViewTorqueActivated = PostViewTorque.OnlyPVTHOn, + PostViewTorqueHigh = 6521.43m, + PostViewTorqueLow = 52.32m + }); + } + + [TestMethod] + [TestCategory("Revision 9"), TestCategory("Pack")] + public void Mid0061PackRevision9() + { + string package = "05920061009 010000020003RA ST6.2 ETV100 04 05000006001070208000670900001000001101221301401501611711811912000000081942100340022004600230040002400050525000202600420270000028000002900100300085031000043200033150340003500000036999900370000003800000039000000400000004100001848874200000430000044 C0761275452020-06-25:01:04:39462020-06-24:10:48:5347Test Parameter Set 482490550Identifier result part 2 51Identifier result part 3 52Identifier result part 4 53E12454001500550000000042560010000570999900580010005926065214361005232620010063000506400150"; + + AssertBuildAndParse(package, new Mid0061(9) + { + CellId = 0, + ChannelId = 0, + TorqueControllerName = "RA ST6.2 ETV100", + VinNumber = "", + JobId = 0, + ParameterSetId = 1, + BatchSize = 0, + BatchCounter = 0, + TighteningStatus = false, + TorqueStatus = TighteningValueStatus.Low, + AngleStatus = TighteningValueStatus.Low, + TorqueMinLimit = 34m, + TorqueMaxLimit = 46m, + TorqueFinalTarget = 40m, + Torque = 5.05m, + AngleMinLimit = 20, + AngleMaxLimit = 420, + AngleFinalTarget = 0, + Angle = 0, + Timestamp = new DateTime(2020, 6, 25, 1, 4, 39), + LastChangeInParameterSet = new DateTime(2020, 6, 24, 10, 48, 53), + BatchStatus = BatchStatus.NotUsed, + TighteningId = 184887L, + Strategy = Strategy.TorqueControlAndAngleMonitoring, + StrategyOptions = new StrategyOptions() + { + Torque = true, + Angle = true, + Batch = false, + PvtMonitoring = false, + PvtCompensate = false, + Selftap = false, + Rundown = true, + CM = false, + DsControl = false, + ClickWrench = false, + RbwMonitoring = false + }, + RundownAngleStatus = TighteningValueStatus.Low, + CurrentMonitoringStatus = TighteningValueStatus.Ok, + SelftapStatus = TighteningValueStatus.Ok, + PrevailTorqueMonitoringStatus = TighteningValueStatus.Ok, + PrevailTorqueCompensateStatus = TighteningValueStatus.Ok, + TighteningErrorStatus = new TighteningErrorStatus() + { + RundownAngleMaxShutOff = false, + RundownAngleMinShutOff = true, + TorqueMaxShutOff = false, + AngleMaxShutOff = false, + SelftapTorqueMaxShutOff = false, + SelftapTorqueMinShutOff = false, + PrevailTorqueMaxShutOff = false, + PrevailTorqueMinShutOff = false, + PrevailTorqueCompensateOverflow = false, + CurrentMonitoringMaxShutOff = false, + PostViewTorqueMinTorqueShutOff = false, + PostViewTorqueMaxTorqueShutOff = false, + PostViewTorqueAngleTooSmall = false, + TriggerLost = true, + TorqueLessThanTarget = false, + ToolHot = false, + MultistageAbort = false, + Rehit = false, + DsMeasureFailed = false, + CurrentLimitReached = false, + EndTimeOutShutOff = false, + RemoveFastenerLimitExceeded = false, + DisableDrive = false, + TransducerLost = false, + TransducerShorted = false, + TransducerCorrupt = false, + SyncTimeout = false, + DynamicCurrentMonitoringMin = false, + DynamicCurrentMonitoringMax = false, + AngleMaxMonitor = false, + YieldNutOff = false, + YieldTooFewSamples = false + }, + RundownAngleMin = 100, + RundownAngleMax = 850, + RundownAngle = 4, + CurrentMonitoringMin = 0, + CurrentMonitoringMax = 150, + CurrentMonitoringValue = 0, + SelftapMin = 0m, + SelftapMax = 9999m, + SelftapTorque = 0m, + PrevailTorqueMonitoringMin = 0m, + PrevailTorqueMonitoringMax = 0m, + PrevailTorque = 0m, + JobSequenceNumber = 0, + SyncTighteningId = 0, + ToolSerialNumber = " C0761275", + ParameterSetName = "Test Parameter Set", + TorqueValuesUnit = TorqueValuesUnit.LbfFt, + ResultType = ResultType.BypassParameterSetResult, + IdentifierResultPart2 = "Identifier result part 2", + IdentifierResultPart3 = "Identifier result part 3", + IdentifierResultPart4 = "Identifier result part 4", + CustomerTighteningErrorCode = "E124", + PrevailTorqueCompensateValue = 15m, + TighteningErrorStatus2 = new TighteningErrorStatus2() + { + DriveDeactivated = false, + ToolStall = true, + DriveHot = false, + GradientMonitoringHigh = true, + GradientMonitoringLow = false, + ReactionBarFailed = true, + SnugMax = false, + CycleAbort = false, + NeckingFailure = false, + EffectiveLoosening = false, + OverSpeed = false, + NoResidualTorque = false, + PositioningFail = false, + SnugMonLow = false, + SnugMonHigh = false, + DynamicMinCurrent = false, + DynamicMaxCurrent = false, + LatentResult = false, + Reserved = new byte[] + { + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + } + }, + CompensatedAngle = 100m, + FinalAngleDecimal = 9999m, + StartFinalAngle = 10m, + PostViewTorqueActivated = PostViewTorque.OnlyPVTHOn, + PostViewTorqueHigh = 6521.43m, + PostViewTorqueLow = 52.32m, + CurrentMonitoringAmpere = 1m, + CurrentMonitoringAmpereMin = 0.5m, + CurrentMonitoringAmpereMax = 1.5m + }); + } + + [TestMethod] + [TestCategory("Revision 10"), TestCategory("Pack")] + public void Mid0061PackRevision10() + { + string package = "06620061010 010000020003RA ST6.2 ETV100 04 05000006001070208000670900001000001101221301401501611711811912000000081942100340022004600230040002400050525000202600420270000028000002900100300085031000043200033150340003500000036999900370000003800000039000000400000004100001848874200000430000044 C0761275452020-06-25:01:04:39462020-06-24:10:48:5347Test Parameter Set 482490550Identifier result part 2 51Identifier result part 3 52Identifier result part 4 53E124540015005500000000425600100005709999005800100059260652143610052326200100630005064001506500001660000167168-00206900100700012071003291720010057300011074009000"; + + AssertBuildAndParse(package, new Mid0061(10) + { + CellId = 0, + ChannelId = 0, + TorqueControllerName = "RA ST6.2 ETV100", + VinNumber = "", + JobId = 0, + ParameterSetId = 1, + BatchSize = 0, + BatchCounter = 0, + TighteningStatus = false, + TorqueStatus = TighteningValueStatus.Low, + AngleStatus = TighteningValueStatus.Low, + TorqueMinLimit = 34m, + TorqueMaxLimit = 46m, + TorqueFinalTarget = 40m, + Torque = 5.05m, + AngleMinLimit = 20, + AngleMaxLimit = 420, + AngleFinalTarget = 0, + Angle = 0, + Timestamp = new DateTime(2020, 6, 25, 1, 4, 39), + LastChangeInParameterSet = new DateTime(2020, 6, 24, 10, 48, 53), + BatchStatus = BatchStatus.NotUsed, + TighteningId = 184887L, + Strategy = Strategy.TorqueControlAndAngleMonitoring, + StrategyOptions = new StrategyOptions() + { + Torque = true, + Angle = true, + Batch = false, + PvtMonitoring = false, + PvtCompensate = false, + Selftap = false, + Rundown = true, + CM = false, + DsControl = false, + ClickWrench = false, + RbwMonitoring = false + }, + RundownAngleStatus = TighteningValueStatus.Low, + CurrentMonitoringStatus = TighteningValueStatus.Ok, + SelftapStatus = TighteningValueStatus.Ok, + PrevailTorqueMonitoringStatus = TighteningValueStatus.Ok, + PrevailTorqueCompensateStatus = TighteningValueStatus.Ok, + TighteningErrorStatus = new TighteningErrorStatus() + { + RundownAngleMaxShutOff = false, + RundownAngleMinShutOff = true, + TorqueMaxShutOff = false, + AngleMaxShutOff = false, + SelftapTorqueMaxShutOff = false, + SelftapTorqueMinShutOff = false, + PrevailTorqueMaxShutOff = false, + PrevailTorqueMinShutOff = false, + PrevailTorqueCompensateOverflow = false, + CurrentMonitoringMaxShutOff = false, + PostViewTorqueMinTorqueShutOff = false, + PostViewTorqueMaxTorqueShutOff = false, + PostViewTorqueAngleTooSmall = false, + TriggerLost = true, + TorqueLessThanTarget = false, + ToolHot = false, + MultistageAbort = false, + Rehit = false, + DsMeasureFailed = false, + CurrentLimitReached = false, + EndTimeOutShutOff = false, + RemoveFastenerLimitExceeded = false, + DisableDrive = false, + TransducerLost = false, + TransducerShorted = false, + TransducerCorrupt = false, + SyncTimeout = false, + DynamicCurrentMonitoringMin = false, + DynamicCurrentMonitoringMax = false, + AngleMaxMonitor = false, + YieldNutOff = false, + YieldTooFewSamples = false + }, + RundownAngleMin = 100, + RundownAngleMax = 850, + RundownAngle = 4, + CurrentMonitoringMin = 0, + CurrentMonitoringMax = 150, + CurrentMonitoringValue = 0, + SelftapMin = 0m, + SelftapMax = 9999m, + SelftapTorque = 0m, + PrevailTorqueMonitoringMin = 0m, + PrevailTorqueMonitoringMax = 0m, + PrevailTorque = 0m, + JobSequenceNumber = 0, + SyncTighteningId = 0, + ToolSerialNumber = " C0761275", + ParameterSetName = "Test Parameter Set", + TorqueValuesUnit = TorqueValuesUnit.LbfFt, + ResultType = ResultType.BypassParameterSetResult, + IdentifierResultPart2 = "Identifier result part 2", + IdentifierResultPart3 = "Identifier result part 3", + IdentifierResultPart4 = "Identifier result part 4", + CustomerTighteningErrorCode = "E124", + PrevailTorqueCompensateValue = 15m, + TighteningErrorStatus2 = new TighteningErrorStatus2() + { + DriveDeactivated = false, + ToolStall = true, + DriveHot = false, + GradientMonitoringHigh = true, + GradientMonitoringLow = false, + ReactionBarFailed = true, + SnugMax = false, + CycleAbort = false, + NeckingFailure = false, + EffectiveLoosening = false, + OverSpeed = false, + NoResidualTorque = false, + PositioningFail = false, + SnugMonLow = false, + SnugMonHigh = false, + DynamicMinCurrent = false, + DynamicMaxCurrent = false, + LatentResult = false, + Reserved = new byte[] + { + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + } + }, + CompensatedAngle = 100m, + FinalAngleDecimal = 9999m, + StartFinalAngle = 10m, + PostViewTorqueActivated = PostViewTorque.OnlyPVTHOn, + PostViewTorqueHigh = 6521.43m, + PostViewTorqueLow = 52.32m, + CurrentMonitoringAmpere = 1m, + CurrentMonitoringAmpereMin = 0.5m, + CurrentMonitoringAmpereMax = 1.5m, + AngleNumeratorScaleFactor = 1, + AngleDenominatorScaleFactor = 1, + OverallAngleStatus = TighteningValueStatus.Ok, + OverallAngleMin = -20, + OverallAngleMax = 100, + OverallAngle = 120, + PeakTorque = 32.91m, + ResidualBreakawayTorque = 10.05m, + StartRundownAngle = 1.1m, + RundownAngleComplete = 90m + }); + } + + [TestMethod] + [TestCategory("Revision 11"), TestCategory("Pack")] + public void Mid0061PackRevision11() + { + string package = "06770061011 010000020003RA ST6.2 ETV100 04 05000006001070208000670900001000001101221301401501611711811912000000081942100340022004600230040002400050525000202600420270000028000002900100300085031000043200033150340003500000036999900370000003800000039000000400000004100001848874200000430000044 C0761275452020-06-25:01:04:39462020-06-24:10:48:5347Test Parameter Set 482490550Identifier result part 2 51Identifier result part 3 52Identifier result part 4 53E124540015005500000000425600100005709999005800100059260652143610052326200100630005064001506500001660000167168-00206900100700012071003291720010057300011074009000750001207600001"; + + AssertBuildAndParse(package, new Mid0061(11) + { + CellId = 0, + ChannelId = 0, + TorqueControllerName = "RA ST6.2 ETV100", + VinNumber = "", + JobId = 0, + ParameterSetId = 1, + BatchSize = 0, + BatchCounter = 0, + TighteningStatus = false, + TorqueStatus = TighteningValueStatus.Low, + AngleStatus = TighteningValueStatus.Low, + TorqueMinLimit = 34m, + TorqueMaxLimit = 46m, + TorqueFinalTarget = 40m, + Torque = 5.05m, + AngleMinLimit = 20, + AngleMaxLimit = 420, + AngleFinalTarget = 0, + Angle = 0, + Timestamp = new DateTime(2020, 6, 25, 1, 4, 39), + LastChangeInParameterSet = new DateTime(2020, 6, 24, 10, 48, 53), + BatchStatus = BatchStatus.NotUsed, + TighteningId = 184887L, + Strategy = Strategy.TorqueControlAndAngleMonitoring, + StrategyOptions = new StrategyOptions() + { + Torque = true, + Angle = true, + Batch = false, + PvtMonitoring = false, + PvtCompensate = false, + Selftap = false, + Rundown = true, + CM = false, + DsControl = false, + ClickWrench = false, + RbwMonitoring = false + }, + RundownAngleStatus = TighteningValueStatus.Low, + CurrentMonitoringStatus = TighteningValueStatus.Ok, + SelftapStatus = TighteningValueStatus.Ok, + PrevailTorqueMonitoringStatus = TighteningValueStatus.Ok, + PrevailTorqueCompensateStatus = TighteningValueStatus.Ok, + TighteningErrorStatus = new TighteningErrorStatus() + { + RundownAngleMaxShutOff = false, + RundownAngleMinShutOff = true, + TorqueMaxShutOff = false, + AngleMaxShutOff = false, + SelftapTorqueMaxShutOff = false, + SelftapTorqueMinShutOff = false, + PrevailTorqueMaxShutOff = false, + PrevailTorqueMinShutOff = false, + PrevailTorqueCompensateOverflow = false, + CurrentMonitoringMaxShutOff = false, + PostViewTorqueMinTorqueShutOff = false, + PostViewTorqueMaxTorqueShutOff = false, + PostViewTorqueAngleTooSmall = false, + TriggerLost = true, + TorqueLessThanTarget = false, + ToolHot = false, + MultistageAbort = false, + Rehit = false, + DsMeasureFailed = false, + CurrentLimitReached = false, + EndTimeOutShutOff = false, + RemoveFastenerLimitExceeded = false, + DisableDrive = false, + TransducerLost = false, + TransducerShorted = false, + TransducerCorrupt = false, + SyncTimeout = false, + DynamicCurrentMonitoringMin = false, + DynamicCurrentMonitoringMax = false, + AngleMaxMonitor = false, + YieldNutOff = false, + YieldTooFewSamples = false + }, + RundownAngleMin = 100, + RundownAngleMax = 850, + RundownAngle = 4, + CurrentMonitoringMin = 0, + CurrentMonitoringMax = 150, + CurrentMonitoringValue = 0, + SelftapMin = 0m, + SelftapMax = 9999m, + SelftapTorque = 0m, + PrevailTorqueMonitoringMin = 0m, + PrevailTorqueMonitoringMax = 0m, + PrevailTorque = 0m, + JobSequenceNumber = 0, + SyncTighteningId = 0, + ToolSerialNumber = " C0761275", + ParameterSetName = "Test Parameter Set", + TorqueValuesUnit = TorqueValuesUnit.LbfFt, + ResultType = ResultType.BypassParameterSetResult, + IdentifierResultPart2 = "Identifier result part 2", + IdentifierResultPart3 = "Identifier result part 3", + IdentifierResultPart4 = "Identifier result part 4", + CustomerTighteningErrorCode = "E124", + PrevailTorqueCompensateValue = 15m, + TighteningErrorStatus2 = new TighteningErrorStatus2() + { + DriveDeactivated = false, + ToolStall = true, + DriveHot = false, + GradientMonitoringHigh = true, + GradientMonitoringLow = false, + ReactionBarFailed = true, + SnugMax = false, + CycleAbort = false, + NeckingFailure = false, + EffectiveLoosening = false, + OverSpeed = false, + NoResidualTorque = false, + PositioningFail = false, + SnugMonLow = false, + SnugMonHigh = false, + DynamicMinCurrent = false, + DynamicMaxCurrent = false, + LatentResult = false, + Reserved = new byte[] + { + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + } + }, + CompensatedAngle = 100m, + FinalAngleDecimal = 9999m, + StartFinalAngle = 10m, + PostViewTorqueActivated = PostViewTorque.OnlyPVTHOn, + PostViewTorqueHigh = 6521.43m, + PostViewTorqueLow = 52.32m, + CurrentMonitoringAmpere = 1m, + CurrentMonitoringAmpereMin = 0.5m, + CurrentMonitoringAmpereMax = 1.5m, + AngleNumeratorScaleFactor = 1, + AngleDenominatorScaleFactor = 1, + OverallAngleStatus = TighteningValueStatus.Ok, + OverallAngleMin = -20, + OverallAngleMax = 100, + OverallAngle = 120, + PeakTorque = 32.91m, + ResidualBreakawayTorque = 10.05m, + StartRundownAngle = 1.1m, + RundownAngleComplete = 90m, + ClickTorque = 1.2m, + ClickAngle = 1 + }); + } + + [TestMethod] + [TestCategory("Revision 998"), TestCategory("Pack")] + public void Mid0061PackRevision998() + { + string package = "05580061998 010000020003RA ST6.2 ETV100 04 05000006001070208000670900001000001101221301401501611711811912000000081942100340022004600230040002400050525000202600420270000028000002900100300085031000043200033150340003500000036999900370000003800000039000000400000004100001848874200000430000044 C0761275452020-06-25:01:04:39462020-06-24:10:48:5347Test Parameter Set 482490550Identifier result part 2 51Identifier result part 3 52Identifier result part 4 53E1245400150055000000004256025702580200000010001200000080"; + + AssertBuildAndParse(package, new Mid0061(998) + { + CellId = 0, + ChannelId = 0, + TorqueControllerName = "RA ST6.2 ETV100", + VinNumber = "", + JobId = 0, + ParameterSetId = 1, + BatchSize = 0, + BatchCounter = 0, + TighteningStatus = false, + TorqueStatus = TighteningValueStatus.Low, + AngleStatus = TighteningValueStatus.Low, + TorqueMinLimit = 34m, + TorqueMaxLimit = 46m, + TorqueFinalTarget = 40m, + Torque = 5.05m, + AngleMinLimit = 20, + AngleMaxLimit = 420, + AngleFinalTarget = 0, + Angle = 0, + Timestamp = new DateTime(2020, 6, 25, 1, 4, 39), + LastChangeInParameterSet = new DateTime(2020, 6, 24, 10, 48, 53), + BatchStatus = BatchStatus.NotUsed, + TighteningId = 184887L, + Strategy = Strategy.TorqueControlAndAngleMonitoring, + StrategyOptions = new StrategyOptions() + { + Torque = true, + Angle = true, + Batch = false, + PvtMonitoring = false, + PvtCompensate = false, + Selftap = false, + Rundown = true, + CM = false, + DsControl = false, + ClickWrench = false, + RbwMonitoring = false + }, + RundownAngleStatus = TighteningValueStatus.Low, + CurrentMonitoringStatus = TighteningValueStatus.Ok, + SelftapStatus = TighteningValueStatus.Ok, + PrevailTorqueMonitoringStatus = TighteningValueStatus.Ok, + PrevailTorqueCompensateStatus = TighteningValueStatus.Ok, + TighteningErrorStatus = new TighteningErrorStatus() + { + RundownAngleMaxShutOff = false, + RundownAngleMinShutOff = true, + TorqueMaxShutOff = false, + AngleMaxShutOff = false, + SelftapTorqueMaxShutOff = false, + SelftapTorqueMinShutOff = false, + PrevailTorqueMaxShutOff = false, + PrevailTorqueMinShutOff = false, + PrevailTorqueCompensateOverflow = false, + CurrentMonitoringMaxShutOff = false, + PostViewTorqueMinTorqueShutOff = false, + PostViewTorqueMaxTorqueShutOff = false, + PostViewTorqueAngleTooSmall = false, + TriggerLost = true, + TorqueLessThanTarget = false, + ToolHot = false, + MultistageAbort = false, + Rehit = false, + DsMeasureFailed = false, + CurrentLimitReached = false, + EndTimeOutShutOff = false, + RemoveFastenerLimitExceeded = false, + DisableDrive = false, + TransducerLost = false, + TransducerShorted = false, + TransducerCorrupt = false, + SyncTimeout = false, + DynamicCurrentMonitoringMin = false, + DynamicCurrentMonitoringMax = false, + AngleMaxMonitor = false, + YieldNutOff = false, + YieldTooFewSamples = false + }, + RundownAngleMin = 100, + RundownAngleMax = 850, + RundownAngle = 4, + CurrentMonitoringMin = 0, + CurrentMonitoringMax = 150, + CurrentMonitoringValue = 0, + SelftapMin = 0m, + SelftapMax = 9999m, + SelftapTorque = 0m, + PrevailTorqueMonitoringMin = 0m, + PrevailTorqueMonitoringMax = 0m, + PrevailTorque = 0m, + JobSequenceNumber = 0, + SyncTighteningId = 0, + ToolSerialNumber = " C0761275", + ParameterSetName = "Test Parameter Set", + TorqueValuesUnit = TorqueValuesUnit.LbfFt, + ResultType = ResultType.BypassParameterSetResult, + IdentifierResultPart2 = "Identifier result part 2", + IdentifierResultPart3 = "Identifier result part 3", + IdentifierResultPart4 = "Identifier result part 4", + CustomerTighteningErrorCode = "E124", + PrevailTorqueCompensateValue = 15m, + TighteningErrorStatus2 = new TighteningErrorStatus2() + { + DriveDeactivated = false, + ToolStall = true, + DriveHot = false, + GradientMonitoringHigh = true, + GradientMonitoringLow = false, + ReactionBarFailed = true, + SnugMax = false, + CycleAbort = false, + NeckingFailure = false, + EffectiveLoosening = false, + OverSpeed = false, + NoResidualTorque = false, + PositioningFail = false, + SnugMonLow = false, + SnugMonHigh = false, + DynamicMinCurrent = false, + DynamicMaxCurrent = false, + LatentResult = false, + Reserved = new byte[] + { + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + } + }, + CompensatedAngle = 0m, + FinalAngleDecimal = 0m, + StartFinalAngle = 0m, + PostViewTorqueActivated = PostViewTorque.Off, + PostViewTorqueHigh = 0m, + PostViewTorqueLow = 0m, + CurrentMonitoringAmpere = 0m, + CurrentMonitoringAmpereMin = 0m, + CurrentMonitoringAmpereMax = 0m, + AngleNumeratorScaleFactor = 0, + AngleDenominatorScaleFactor = 0, + OverallAngleStatus = TighteningValueStatus.Low, + OverallAngleMin = 0, + OverallAngleMax = 0, + OverallAngle = 0, + PeakTorque = 0m, + ResidualBreakawayTorque = 0m, + StartRundownAngle = 0m, + RundownAngleComplete = 0m, + ClickTorque = 0m, + ClickAngle = 0, + SelectedIdentifierNumber = 0, + NumberOfStagesInMultistage = 2, + NumberOfStageResults = 2, + StageResults = new List() + { + new StageResult() + { + Torque = 200m, + Angle = 100 + }, + new StageResult() + { + Torque = 120m, + Angle = 80 + } + } + }); + } + + [TestMethod] + [TestCategory("Revision 999"), TestCategory("Pack")] + public void Mid0061PackRevision999() + { + string package = "01210061999 KPOL3456JKLO897 02001002000192111000500003602001-06-02:09:54:092000-06-02:09:54:094294967295"; + + AssertBuildAndParse(package, new Mid0061(999) + { + CellId = 0, + ChannelId = 0, + VinNumber = "KPOL3456JKLO897", + JobId = 2, + ParameterSetId = 1, + BatchSize = 20, + BatchCounter = 19, + TighteningStatus = true, + TorqueStatus = TighteningValueStatus.Ok, + AngleStatus = TighteningValueStatus.Ok, + TorqueMinLimit = 0m, + TorqueMaxLimit = 0m, + TorqueFinalTarget = 0m, + Torque = 5m, + AngleMinLimit = 0, + AngleMaxLimit = 0, + AngleFinalTarget = 0, + Angle = 360, + Timestamp = new DateTime(2001, 6, 2, 9, 54, 9), + LastChangeInParameterSet = new DateTime(2000, 6, 2, 9, 54, 9), + BatchStatus = BatchStatus.NotUsed, + TighteningId = 4294967295L, + Strategy = (Strategy)0, + RundownAngleStatus = TighteningValueStatus.Low, + CurrentMonitoringStatus = TighteningValueStatus.Low, + SelftapStatus = TighteningValueStatus.Low, + PrevailTorqueMonitoringStatus = TighteningValueStatus.Low, + PrevailTorqueCompensateStatus = TighteningValueStatus.Low, + RundownAngleMin = 0, + RundownAngleMax = 0, + RundownAngle = 0, + CurrentMonitoringMin = 0, + CurrentMonitoringMax = 0, + CurrentMonitoringValue = 0, + SelftapMin = 0m, + SelftapMax = 0m, + SelftapTorque = 0m, + PrevailTorqueMonitoringMin = 0m, + PrevailTorqueMonitoringMax = 0m, + PrevailTorque = 0m, + JobSequenceNumber = 0, + SyncTighteningId = 0, + TorqueValuesUnit = (TorqueValuesUnit)0, + ResultType = (ResultType)0, + PrevailTorqueCompensateValue = 0m, + CompensatedAngle = 0m, + FinalAngleDecimal = 0m, + StartFinalAngle = 0m, + PostViewTorqueActivated = PostViewTorque.Off, + PostViewTorqueHigh = 0m, + PostViewTorqueLow = 0m, + CurrentMonitoringAmpere = 0m, + CurrentMonitoringAmpereMin = 0m, + CurrentMonitoringAmpereMax = 0m, + AngleNumeratorScaleFactor = 0, + AngleDenominatorScaleFactor = 0, + OverallAngleStatus = TighteningValueStatus.Low, + OverallAngleMin = 0, + OverallAngleMax = 0, + OverallAngle = 0, + PeakTorque = 0m, + ResidualBreakawayTorque = 0m, + StartRundownAngle = 0m, + RundownAngleComplete = 0m, + ClickTorque = 0m, + ClickAngle = 0, + SelectedIdentifierNumber = 0, + NumberOfStagesInMultistage = 0, + NumberOfStageResults = 0 + }); + } } } diff --git a/src/MIDTesters.Core/Tightening/TestMid0062.cs b/src/MIDTesters.Core/Tightening/TestMid0062.cs index 6a94ef1c..b8d090f4 100644 --- a/src/MIDTesters.Core/Tightening/TestMid0062.cs +++ b/src/MIDTesters.Core/Tightening/TestMid0062.cs @@ -29,5 +29,16 @@ public void Mid0062ByteAllRevisions() Assert.AreEqual(typeof(Mid0062), mid.GetType()); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 5"), TestCategory("Pack")] + public void Mid0062PackAllRevisions() + { + string package = "00200062005 "; + + AssertBuildAndParse(package, new Mid0062(5) + { + }); + } } } diff --git a/src/MIDTesters.Core/Tightening/TestMid0063.cs b/src/MIDTesters.Core/Tightening/TestMid0063.cs index 5bd0437c..65edff38 100644 --- a/src/MIDTesters.Core/Tightening/TestMid0063.cs +++ b/src/MIDTesters.Core/Tightening/TestMid0063.cs @@ -29,5 +29,16 @@ public void Mid0063ByteAllRevisions() Assert.AreEqual(typeof(Mid0063), mid.GetType()); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 2"), TestCategory("Pack")] + public void Mid0063PackAllRevisions() + { + string package = "00200063002 "; + + AssertBuildAndParse(package, new Mid0063(2) + { + }); + } } } diff --git a/src/MIDTesters.Core/Tightening/TestMid0064.cs b/src/MIDTesters.Core/Tightening/TestMid0064.cs index d34b0a55..3b391940 100644 --- a/src/MIDTesters.Core/Tightening/TestMid0064.cs +++ b/src/MIDTesters.Core/Tightening/TestMid0064.cs @@ -15,7 +15,7 @@ public void Mid0064Revision1() var mid = _midInterpreter.Parse(package); Assert.AreEqual(typeof(Mid0064), mid.GetType()); - Assert.IsNotNull(mid.TighteningId); + Assert.AreEqual(123456789L, mid.TighteningId); AssertEqualPackages(package, mid); } @@ -28,7 +28,7 @@ public void Mid0064ByteRevision1() var mid = _midInterpreter.Parse(bytes); Assert.AreEqual(typeof(Mid0064), mid.GetType()); - Assert.IsNotNull(mid.TighteningId); + Assert.AreEqual(123456789L, mid.TighteningId); AssertEqualPackages(bytes, mid); } @@ -40,7 +40,7 @@ public void Mid0064Revision10() var mid = _midInterpreter.Parse(package); Assert.AreEqual(typeof(Mid0064), mid.GetType()); - Assert.IsNotNull(mid.TighteningId); + Assert.AreEqual(123456789L, mid.TighteningId); Assert.IsTrue(mid.OfflineResult); AssertEqualPackages(package, mid); } @@ -54,9 +54,34 @@ public void Mid0064ByteRevision10() var mid = _midInterpreter.Parse(bytes); Assert.AreEqual(typeof(Mid0064), mid.GetType()); - Assert.IsNotNull(mid.TighteningId); + Assert.AreEqual(123456789L, mid.TighteningId); Assert.IsTrue(mid.OfflineResult); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0064PackRevision1() + { + string package = "00300064001 0123456789"; + + AssertBuildAndParse(package, new Mid0064(1) + { + TighteningId = 123456789L + }); + } + + [TestMethod] + [TestCategory("Revision 10"), TestCategory("Pack")] + public void Mid0064PackRevision10() + { + string package = "00310064010 01234567891"; + + AssertBuildAndParse(package, new Mid0064(10) + { + TighteningId = 123456789L, + OfflineResult = true + }); + } } } diff --git a/src/MIDTesters.Core/Tightening/TestMid0065.cs b/src/MIDTesters.Core/Tightening/TestMid0065.cs index 232307d5..8a6b5757 100644 --- a/src/MIDTesters.Core/Tightening/TestMid0065.cs +++ b/src/MIDTesters.Core/Tightening/TestMid0065.cs @@ -1,4 +1,6 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; +using System; using OpenProtocolInterpreter.Tightening; using System.Collections.Generic; @@ -16,17 +18,17 @@ public void Mid0065Revision1() var mid = _midInterpreter.Parse(package); Assert.AreEqual(typeof(Mid0065), mid.GetType()); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.BatchStatus); + Assert.AreEqual(123456789L, mid.TighteningId); + Assert.AreEqual("AIRBAG ", mid.VinNumber); + Assert.AreEqual(1, mid.ParameterSetId); + Assert.AreEqual(2, mid.BatchCounter); + Assert.AreEqual(false, mid.TighteningStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(14.67m, mid.Torque); + Assert.AreEqual(46, mid.Angle); + Assert.AreEqual(new DateTime(2001,4,22,14,54,34), mid.Timestamp); + Assert.AreEqual(BatchStatus.NotUsed, mid.BatchStatus); AssertEqualPackages(package, mid); } @@ -39,17 +41,17 @@ public void Mid0065ByteRevision1() var mid = _midInterpreter.Parse(bytes); Assert.AreEqual(typeof(Mid0065), mid.GetType()); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.BatchStatus); + Assert.AreEqual(123456789L, mid.TighteningId); + Assert.AreEqual("AIRBAG ", mid.VinNumber); + Assert.AreEqual(1, mid.ParameterSetId); + Assert.AreEqual(2, mid.BatchCounter); + Assert.AreEqual(false, mid.TighteningStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(14.67m, mid.Torque); + Assert.AreEqual(46, mid.Angle); + Assert.AreEqual(new DateTime(2001,4,22,14,54,34), mid.Timestamp); + Assert.AreEqual(BatchStatus.NotUsed, mid.BatchStatus); AssertEqualPackages(bytes, mid); } @@ -61,33 +63,34 @@ public void Mid0065Revision2() var mid = _midInterpreter.Parse(package); Assert.AreEqual(typeof(Mid0065), mid.GetType()); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(123456789L, mid.TighteningId); + Assert.AreEqual("AIRBAG ", mid.VinNumber); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual(2, mid.ParameterSetId); + Assert.AreEqual(Strategy.RotateSpindleForward, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueMonitoringStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.AreEqual(false, mid.TighteningStatus); + Assert.AreEqual(BatchStatus.Nok, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); + Assert.AreEqual(10m, mid.Torque); + Assert.AreEqual(360, mid.Angle); + Assert.AreEqual(250, mid.RundownAngle); + Assert.AreEqual(2, mid.CurrentMonitoringValue); + Assert.AreEqual(2.15m, mid.SelftapTorque); + Assert.AreEqual(10.25m, mid.PrevailTorque); + Assert.AreEqual(12, mid.JobSequenceNumber); + Assert.AreEqual(65535, mid.SyncTighteningId); + Assert.AreEqual("ABCDEFG-123 ", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2019,1,5,9,0,5), mid.Timestamp); AssertEqualPackages(package, mid); } @@ -133,33 +136,34 @@ public void Mid0065ByteRevision2() var mid = _midInterpreter.Parse(bytes.ToArray()); Assert.AreEqual(typeof(Mid0065), mid.GetType()); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(123456789L, mid.TighteningId); + Assert.AreEqual("AIRBAG ", mid.VinNumber); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual(2, mid.ParameterSetId); + Assert.AreEqual(Strategy.RotateSpindleForward, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueMonitoringStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.AreEqual(false, mid.TighteningStatus); + Assert.AreEqual(BatchStatus.Nok, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); + Assert.AreEqual(10m, mid.Torque); + Assert.AreEqual(360, mid.Angle); + Assert.AreEqual(250, mid.RundownAngle); + Assert.AreEqual(2, mid.CurrentMonitoringValue); + Assert.AreEqual(2.15m, mid.SelftapTorque); + Assert.AreEqual(10.25m, mid.PrevailTorque); + Assert.AreEqual(12, mid.JobSequenceNumber); + Assert.AreEqual(65535, mid.SyncTighteningId); + Assert.AreEqual("ABCDEFG-123 ", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2019,1,5,9,0,5), mid.Timestamp); AssertEqualPackages(bytes, mid); } @@ -171,35 +175,36 @@ public void Mid0065Revision3() var mid = _midInterpreter.Parse(package); Assert.AreEqual(typeof(Mid0065), mid.GetType()); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(123456789L, mid.TighteningId); + Assert.AreEqual("AIRBAG ", mid.VinNumber); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual(2, mid.ParameterSetId); + Assert.AreEqual(Strategy.RotateSpindleForward, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueMonitoringStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.AreEqual(false, mid.TighteningStatus); + Assert.AreEqual(BatchStatus.Nok, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); + Assert.AreEqual(10m, mid.Torque); + Assert.AreEqual(360, mid.Angle); + Assert.AreEqual(250, mid.RundownAngle); + Assert.AreEqual(2, mid.CurrentMonitoringValue); + Assert.AreEqual(2.15m, mid.SelftapTorque); + Assert.AreEqual(10.25m, mid.PrevailTorque); + Assert.AreEqual(12, mid.JobSequenceNumber); + Assert.AreEqual(65535, mid.SyncTighteningId); + Assert.AreEqual("ABCDEFG-123 ", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2019,1,5,9,0,5), mid.Timestamp); + Assert.AreEqual(TorqueValuesUnit.Percentage, mid.TorqueValuesUnit); + Assert.AreEqual((ResultType)8, mid.ResultType); AssertEqualPackages(package, mid); } @@ -245,35 +250,36 @@ public void Mid0065ByteRevision3() var mid = _midInterpreter.Parse(bytes.ToArray()); Assert.AreEqual(typeof(Mid0065), mid.GetType()); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(123456789L, mid.TighteningId); + Assert.AreEqual("AIRBAG ", mid.VinNumber); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual(2, mid.ParameterSetId); + Assert.AreEqual(Strategy.RotateSpindleForward, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueMonitoringStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.AreEqual(false, mid.TighteningStatus); + Assert.AreEqual(BatchStatus.Nok, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); + Assert.AreEqual(10m, mid.Torque); + Assert.AreEqual(360, mid.Angle); + Assert.AreEqual(250, mid.RundownAngle); + Assert.AreEqual(2, mid.CurrentMonitoringValue); + Assert.AreEqual(2.15m, mid.SelftapTorque); + Assert.AreEqual(10.25m, mid.PrevailTorque); + Assert.AreEqual(12, mid.JobSequenceNumber); + Assert.AreEqual(65535, mid.SyncTighteningId); + Assert.AreEqual("ABCDEFG-123 ", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2019,1,5,9,0,5), mid.Timestamp); + Assert.AreEqual(TorqueValuesUnit.Percentage, mid.TorqueValuesUnit); + Assert.AreEqual((ResultType)8, mid.ResultType); AssertEqualPackages(bytes, mid); } @@ -285,38 +291,39 @@ public void Mid0065Revision4() var mid = _midInterpreter.Parse(package); Assert.AreEqual(typeof(Mid0065), mid.GetType()); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(123456789L, mid.TighteningId); + Assert.AreEqual("AIRBAG ", mid.VinNumber); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual(2, mid.ParameterSetId); + Assert.AreEqual(Strategy.RotateSpindleForward, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueMonitoringStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.AreEqual(false, mid.TighteningStatus); + Assert.AreEqual(BatchStatus.Nok, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); + Assert.AreEqual(10m, mid.Torque); + Assert.AreEqual(360, mid.Angle); + Assert.AreEqual(250, mid.RundownAngle); + Assert.AreEqual(2, mid.CurrentMonitoringValue); + Assert.AreEqual(2.15m, mid.SelftapTorque); + Assert.AreEqual(10.25m, mid.PrevailTorque); + Assert.AreEqual(12, mid.JobSequenceNumber); + Assert.AreEqual(65535, mid.SyncTighteningId); + Assert.AreEqual("ABCDEFG-123 ", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2019,1,5,9,0,5), mid.Timestamp); + Assert.AreEqual(TorqueValuesUnit.Percentage, mid.TorqueValuesUnit); + Assert.AreEqual((ResultType)8, mid.ResultType); + Assert.AreEqual("Identifier result part 2 ", mid.IdentifierResultPart2); + Assert.AreEqual("Identifier result part 3 ", mid.IdentifierResultPart3); + Assert.AreEqual("Identifier result part 4 ", mid.IdentifierResultPart4); AssertEqualPackages(package, mid); } @@ -362,38 +369,39 @@ public void Mid0065ByteRevision4() var mid = _midInterpreter.Parse(bytes.ToArray()); Assert.AreEqual(typeof(Mid0065), mid.GetType()); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(123456789L, mid.TighteningId); + Assert.AreEqual("AIRBAG ", mid.VinNumber); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual(2, mid.ParameterSetId); + Assert.AreEqual(Strategy.RotateSpindleForward, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueMonitoringStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.AreEqual(false, mid.TighteningStatus); + Assert.AreEqual(BatchStatus.Nok, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); + Assert.AreEqual(10m, mid.Torque); + Assert.AreEqual(360, mid.Angle); + Assert.AreEqual(250, mid.RundownAngle); + Assert.AreEqual(2, mid.CurrentMonitoringValue); + Assert.AreEqual(2.15m, mid.SelftapTorque); + Assert.AreEqual(10.25m, mid.PrevailTorque); + Assert.AreEqual(12, mid.JobSequenceNumber); + Assert.AreEqual(65535, mid.SyncTighteningId); + Assert.AreEqual("ABCDEFG-123 ", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2019,1,5,9,0,5), mid.Timestamp); + Assert.AreEqual(TorqueValuesUnit.Percentage, mid.TorqueValuesUnit); + Assert.AreEqual((ResultType)8, mid.ResultType); + Assert.AreEqual("Identifier result part 2 ", mid.IdentifierResultPart2); + Assert.AreEqual("Identifier result part 3 ", mid.IdentifierResultPart3); + Assert.AreEqual("Identifier result part 4 ", mid.IdentifierResultPart4); AssertEqualPackages(bytes, mid); } @@ -405,39 +413,40 @@ public void Mid0065Revision5() var mid = _midInterpreter.Parse(package); Assert.AreEqual(typeof(Mid0065), mid.GetType()); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(123456789L, mid.TighteningId); + Assert.AreEqual("AIRBAG ", mid.VinNumber); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual(2, mid.ParameterSetId); + Assert.AreEqual(Strategy.RotateSpindleForward, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueMonitoringStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.AreEqual(false, mid.TighteningStatus); + Assert.AreEqual(BatchStatus.Nok, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); - Assert.IsNotNull(mid.CustomerTighteningErrorCode); + Assert.AreEqual(10m, mid.Torque); + Assert.AreEqual(360, mid.Angle); + Assert.AreEqual(250, mid.RundownAngle); + Assert.AreEqual(2, mid.CurrentMonitoringValue); + Assert.AreEqual(2.15m, mid.SelftapTorque); + Assert.AreEqual(10.25m, mid.PrevailTorque); + Assert.AreEqual(12, mid.JobSequenceNumber); + Assert.AreEqual(65535, mid.SyncTighteningId); + Assert.AreEqual("ABCDEFG-123 ", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2019,1,5,9,0,5), mid.Timestamp); + Assert.AreEqual(TorqueValuesUnit.Percentage, mid.TorqueValuesUnit); + Assert.AreEqual((ResultType)8, mid.ResultType); + Assert.AreEqual("Identifier result part 2 ", mid.IdentifierResultPart2); + Assert.AreEqual("Identifier result part 3 ", mid.IdentifierResultPart3); + Assert.AreEqual("Identifier result part 4 ", mid.IdentifierResultPart4); + Assert.AreEqual("E124", mid.CustomerTighteningErrorCode); AssertEqualPackages(package, mid); } @@ -483,39 +492,40 @@ public void Mid0065ByteRevision5() var mid = _midInterpreter.Parse(bytes.ToArray()); Assert.AreEqual(typeof(Mid0065), mid.GetType()); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(123456789L, mid.TighteningId); + Assert.AreEqual("AIRBAG ", mid.VinNumber); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual(2, mid.ParameterSetId); + Assert.AreEqual(Strategy.RotateSpindleForward, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueMonitoringStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.AreEqual(false, mid.TighteningStatus); + Assert.AreEqual(BatchStatus.Nok, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); - Assert.IsNotNull(mid.CustomerTighteningErrorCode); + Assert.AreEqual(10m, mid.Torque); + Assert.AreEqual(360, mid.Angle); + Assert.AreEqual(250, mid.RundownAngle); + Assert.AreEqual(2, mid.CurrentMonitoringValue); + Assert.AreEqual(2.15m, mid.SelftapTorque); + Assert.AreEqual(10.25m, mid.PrevailTorque); + Assert.AreEqual(12, mid.JobSequenceNumber); + Assert.AreEqual(65535, mid.SyncTighteningId); + Assert.AreEqual("ABCDEFG-123 ", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2019,1,5,9,0,5), mid.Timestamp); + Assert.AreEqual(TorqueValuesUnit.Percentage, mid.TorqueValuesUnit); + Assert.AreEqual((ResultType)8, mid.ResultType); + Assert.AreEqual("Identifier result part 2 ", mid.IdentifierResultPart2); + Assert.AreEqual("Identifier result part 3 ", mid.IdentifierResultPart3); + Assert.AreEqual("Identifier result part 4 ", mid.IdentifierResultPart4); + Assert.AreEqual("E124", mid.CustomerTighteningErrorCode); AssertEqualPackages(bytes, mid); } @@ -527,40 +537,41 @@ public void Mid0065Revision6() var mid = _midInterpreter.Parse(package); Assert.AreEqual(typeof(Mid0065), mid.GetType()); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(123456789L, mid.TighteningId); + Assert.AreEqual("AIRBAG ", mid.VinNumber); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual(2, mid.ParameterSetId); + Assert.AreEqual(Strategy.RotateSpindleForward, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueMonitoringStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.AreEqual(false, mid.TighteningStatus); + Assert.AreEqual(BatchStatus.Nok, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); - Assert.IsNotNull(mid.CustomerTighteningErrorCode); - Assert.IsNotNull(mid.PrevailTorqueCompensateValue); + Assert.AreEqual(10m, mid.Torque); + Assert.AreEqual(360, mid.Angle); + Assert.AreEqual(250, mid.RundownAngle); + Assert.AreEqual(2, mid.CurrentMonitoringValue); + Assert.AreEqual(2.15m, mid.SelftapTorque); + Assert.AreEqual(10.25m, mid.PrevailTorque); + Assert.AreEqual(12, mid.JobSequenceNumber); + Assert.AreEqual(65535, mid.SyncTighteningId); + Assert.AreEqual("ABCDEFG-123 ", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2019,1,5,9,0,5), mid.Timestamp); + Assert.AreEqual(TorqueValuesUnit.Percentage, mid.TorqueValuesUnit); + Assert.AreEqual((ResultType)8, mid.ResultType); + Assert.AreEqual("Identifier result part 2 ", mid.IdentifierResultPart2); + Assert.AreEqual("Identifier result part 3 ", mid.IdentifierResultPart3); + Assert.AreEqual("Identifier result part 4 ", mid.IdentifierResultPart4); + Assert.AreEqual("E124", mid.CustomerTighteningErrorCode); + Assert.AreEqual(51m, mid.PrevailTorqueCompensateValue); Assert.IsNotNull(mid.TighteningErrorStatus2); AssertEqualPackages(package, mid); } @@ -622,40 +633,41 @@ public void Mid0065ByteRevision6() var mid = _midInterpreter.Parse(bytes.ToArray()); Assert.AreEqual(typeof(Mid0065), mid.GetType()); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(123456789L, mid.TighteningId); + Assert.AreEqual("AIRBAG ", mid.VinNumber); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual(2, mid.ParameterSetId); + Assert.AreEqual(Strategy.RotateSpindleForward, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueMonitoringStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.AreEqual(false, mid.TighteningStatus); + Assert.AreEqual(BatchStatus.Nok, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); - Assert.IsNotNull(mid.CustomerTighteningErrorCode); - Assert.IsNotNull(mid.PrevailTorqueCompensateValue); + Assert.AreEqual(10m, mid.Torque); + Assert.AreEqual(360, mid.Angle); + Assert.AreEqual(250, mid.RundownAngle); + Assert.AreEqual(2, mid.CurrentMonitoringValue); + Assert.AreEqual(2.15m, mid.SelftapTorque); + Assert.AreEqual(10.25m, mid.PrevailTorque); + Assert.AreEqual(12, mid.JobSequenceNumber); + Assert.AreEqual(65535, mid.SyncTighteningId); + Assert.AreEqual("ABCDEFG-123 ", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2019,1,5,9,0,5), mid.Timestamp); + Assert.AreEqual(TorqueValuesUnit.Percentage, mid.TorqueValuesUnit); + Assert.AreEqual((ResultType)8, mid.ResultType); + Assert.AreEqual("Identifier result part 2 ", mid.IdentifierResultPart2); + Assert.AreEqual("Identifier result part 3 ", mid.IdentifierResultPart3); + Assert.AreEqual("Identifier result part 4 ", mid.IdentifierResultPart4); + Assert.AreEqual("E124", mid.CustomerTighteningErrorCode); + Assert.AreEqual(51m, mid.PrevailTorqueCompensateValue); Assert.IsNotNull(mid.TighteningErrorStatus2); AssertEqualPackages(bytes, mid); } @@ -668,43 +680,44 @@ public void Mid0065Revision7() var mid = _midInterpreter.Parse(package); Assert.AreEqual(typeof(Mid0065), mid.GetType()); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(123456789L, mid.TighteningId); + Assert.AreEqual("AIRBAG ", mid.VinNumber); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual(2, mid.ParameterSetId); + Assert.AreEqual(Strategy.RotateSpindleForward, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueMonitoringStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.AreEqual(false, mid.TighteningStatus); + Assert.AreEqual(BatchStatus.Nok, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); - Assert.IsNotNull(mid.CustomerTighteningErrorCode); - Assert.IsNotNull(mid.PrevailTorqueCompensateValue); + Assert.AreEqual(10m, mid.Torque); + Assert.AreEqual(360, mid.Angle); + Assert.AreEqual(250, mid.RundownAngle); + Assert.AreEqual(2, mid.CurrentMonitoringValue); + Assert.AreEqual(2.15m, mid.SelftapTorque); + Assert.AreEqual(10.25m, mid.PrevailTorque); + Assert.AreEqual(12, mid.JobSequenceNumber); + Assert.AreEqual(65535, mid.SyncTighteningId); + Assert.AreEqual("ABCDEFG-123 ", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2019,1,5,9,0,5), mid.Timestamp); + Assert.AreEqual(TorqueValuesUnit.Percentage, mid.TorqueValuesUnit); + Assert.AreEqual((ResultType)8, mid.ResultType); + Assert.AreEqual("Identifier result part 2 ", mid.IdentifierResultPart2); + Assert.AreEqual("Identifier result part 3 ", mid.IdentifierResultPart3); + Assert.AreEqual("Identifier result part 4 ", mid.IdentifierResultPart4); + Assert.AreEqual("E124", mid.CustomerTighteningErrorCode); + Assert.AreEqual(51m, mid.PrevailTorqueCompensateValue); Assert.IsNotNull(mid.TighteningErrorStatus2); - Assert.AreNotEqual(0, mid.StationId); - Assert.IsNotNull(mid.StationName); + Assert.AreEqual(4294967295, mid.StationId); + Assert.AreEqual("Station Name ", mid.StationName); AssertEqualPackages(package, mid); } @@ -768,43 +781,44 @@ public void Mid0065ByteRevision7() var mid = _midInterpreter.Parse(bytes.ToArray()); Assert.AreEqual(typeof(Mid0065), mid.GetType()); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(123456789L, mid.TighteningId); + Assert.AreEqual("AIRBAG ", mid.VinNumber); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual(2, mid.ParameterSetId); + Assert.AreEqual(Strategy.RotateSpindleForward, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueMonitoringStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.AreEqual(false, mid.TighteningStatus); + Assert.AreEqual(BatchStatus.Nok, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); - Assert.IsNotNull(mid.CustomerTighteningErrorCode); - Assert.IsNotNull(mid.PrevailTorqueCompensateValue); + Assert.AreEqual(10m, mid.Torque); + Assert.AreEqual(360, mid.Angle); + Assert.AreEqual(250, mid.RundownAngle); + Assert.AreEqual(2, mid.CurrentMonitoringValue); + Assert.AreEqual(2.15m, mid.SelftapTorque); + Assert.AreEqual(10.25m, mid.PrevailTorque); + Assert.AreEqual(12, mid.JobSequenceNumber); + Assert.AreEqual(65535, mid.SyncTighteningId); + Assert.AreEqual("ABCDEFG-123 ", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2019,1,5,9,0,5), mid.Timestamp); + Assert.AreEqual(TorqueValuesUnit.Percentage, mid.TorqueValuesUnit); + Assert.AreEqual((ResultType)8, mid.ResultType); + Assert.AreEqual("Identifier result part 2 ", mid.IdentifierResultPart2); + Assert.AreEqual("Identifier result part 3 ", mid.IdentifierResultPart3); + Assert.AreEqual("Identifier result part 4 ", mid.IdentifierResultPart4); + Assert.AreEqual("E124", mid.CustomerTighteningErrorCode); + Assert.AreEqual(51m, mid.PrevailTorqueCompensateValue); Assert.IsNotNull(mid.TighteningErrorStatus2); - Assert.AreNotEqual(0, mid.StationId); - Assert.IsNotNull(mid.StationName); + Assert.AreEqual(4294967295, mid.StationId); + Assert.AreEqual("Station Name ", mid.StationName); AssertEqualPackages(bytes, mid); } @@ -816,47 +830,48 @@ public void Mid0065Revision8() var mid = _midInterpreter.Parse(package); Assert.AreEqual(typeof(Mid0065), mid.GetType()); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(123456789L, mid.TighteningId); + Assert.AreEqual("AIRBAG ", mid.VinNumber); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual(2, mid.ParameterSetId); + Assert.AreEqual(Strategy.RotateSpindleForward, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueMonitoringStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.AreEqual(false, mid.TighteningStatus); + Assert.AreEqual(BatchStatus.Nok, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); - Assert.IsNotNull(mid.CustomerTighteningErrorCode); - Assert.IsNotNull(mid.PrevailTorqueCompensateValue); + Assert.AreEqual(10m, mid.Torque); + Assert.AreEqual(360, mid.Angle); + Assert.AreEqual(250, mid.RundownAngle); + Assert.AreEqual(2, mid.CurrentMonitoringValue); + Assert.AreEqual(2.15m, mid.SelftapTorque); + Assert.AreEqual(10.25m, mid.PrevailTorque); + Assert.AreEqual(12, mid.JobSequenceNumber); + Assert.AreEqual(65535, mid.SyncTighteningId); + Assert.AreEqual("ABCDEFG-123 ", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2019,1,5,9,0,5), mid.Timestamp); + Assert.AreEqual(TorqueValuesUnit.Percentage, mid.TorqueValuesUnit); + Assert.AreEqual((ResultType)8, mid.ResultType); + Assert.AreEqual("Identifier result part 2 ", mid.IdentifierResultPart2); + Assert.AreEqual("Identifier result part 3 ", mid.IdentifierResultPart3); + Assert.AreEqual("Identifier result part 4 ", mid.IdentifierResultPart4); + Assert.AreEqual("E124", mid.CustomerTighteningErrorCode); + Assert.AreEqual(51m, mid.PrevailTorqueCompensateValue); Assert.IsNotNull(mid.TighteningErrorStatus2); - Assert.AreNotEqual(0, mid.StationId); - Assert.IsNotNull(mid.StationName); - Assert.AreNotEqual(0, mid.StartFinalAngle); - Assert.IsNotNull(mid.PostViewTorqueActivated); - Assert.AreNotEqual(0, mid.PostViewTorqueHigh); - Assert.AreNotEqual(0, mid.PostViewTorqueLow); + Assert.AreEqual(4294967295, mid.StationId); + Assert.AreEqual("Station Name ", mid.StationName); + Assert.AreEqual(10m, mid.StartFinalAngle); + Assert.AreEqual(PostViewTorque.OnlyPVTHOn, mid.PostViewTorqueActivated); + Assert.AreEqual(6521.43m, mid.PostViewTorqueHigh); + Assert.AreEqual(52.32m, mid.PostViewTorqueLow); AssertEqualPackages(package, mid); } @@ -920,47 +935,48 @@ public void Mid0065ByteRevision8() var mid = _midInterpreter.Parse(bytes.ToArray()); Assert.AreEqual(typeof(Mid0065), mid.GetType()); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(123456789L, mid.TighteningId); + Assert.AreEqual("AIRBAG ", mid.VinNumber); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual(2, mid.ParameterSetId); + Assert.AreEqual(Strategy.RotateSpindleForward, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueMonitoringStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.AreEqual(false, mid.TighteningStatus); + Assert.AreEqual(BatchStatus.Nok, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); - Assert.IsNotNull(mid.CustomerTighteningErrorCode); - Assert.IsNotNull(mid.PrevailTorqueCompensateValue); + Assert.AreEqual(10m, mid.Torque); + Assert.AreEqual(360, mid.Angle); + Assert.AreEqual(250, mid.RundownAngle); + Assert.AreEqual(2, mid.CurrentMonitoringValue); + Assert.AreEqual(2.15m, mid.SelftapTorque); + Assert.AreEqual(10.25m, mid.PrevailTorque); + Assert.AreEqual(12, mid.JobSequenceNumber); + Assert.AreEqual(65535, mid.SyncTighteningId); + Assert.AreEqual("ABCDEFG-123 ", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2019,1,5,9,0,5), mid.Timestamp); + Assert.AreEqual(TorqueValuesUnit.Percentage, mid.TorqueValuesUnit); + Assert.AreEqual((ResultType)8, mid.ResultType); + Assert.AreEqual("Identifier result part 2 ", mid.IdentifierResultPart2); + Assert.AreEqual("Identifier result part 3 ", mid.IdentifierResultPart3); + Assert.AreEqual("Identifier result part 4 ", mid.IdentifierResultPart4); + Assert.AreEqual("E124", mid.CustomerTighteningErrorCode); + Assert.AreEqual(51m, mid.PrevailTorqueCompensateValue); Assert.IsNotNull(mid.TighteningErrorStatus2); - Assert.AreNotEqual(0, mid.StationId); - Assert.IsNotNull(mid.StationName); - Assert.AreNotEqual(0, mid.StartFinalAngle); - Assert.IsNotNull(mid.PostViewTorqueActivated); - Assert.AreNotEqual(0, mid.PostViewTorqueHigh); - Assert.AreNotEqual(0, mid.PostViewTorqueLow); + Assert.AreEqual(4294967295, mid.StationId); + Assert.AreEqual("Station Name ", mid.StationName); + Assert.AreEqual(10m, mid.StartFinalAngle); + Assert.AreEqual(PostViewTorque.OnlyPVTHOn, mid.PostViewTorqueActivated); + Assert.AreEqual(6521.43m, mid.PostViewTorqueHigh); + Assert.AreEqual(52.32m, mid.PostViewTorqueLow); AssertEqualPackages(bytes, mid); } @@ -972,50 +988,51 @@ public void Mid0065Revision9() var mid = _midInterpreter.Parse(package); Assert.AreEqual(typeof(Mid0065), mid.GetType()); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(123456789L, mid.TighteningId); + Assert.AreEqual("AIRBAG ", mid.VinNumber); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual(2, mid.ParameterSetId); + Assert.AreEqual(Strategy.RotateSpindleForward, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueMonitoringStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.AreEqual(false, mid.TighteningStatus); + Assert.AreEqual(BatchStatus.Nok, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); - Assert.IsNotNull(mid.CustomerTighteningErrorCode); - Assert.IsNotNull(mid.PrevailTorqueCompensateValue); + Assert.AreEqual(10m, mid.Torque); + Assert.AreEqual(360, mid.Angle); + Assert.AreEqual(250, mid.RundownAngle); + Assert.AreEqual(2, mid.CurrentMonitoringValue); + Assert.AreEqual(2.15m, mid.SelftapTorque); + Assert.AreEqual(10.25m, mid.PrevailTorque); + Assert.AreEqual(12, mid.JobSequenceNumber); + Assert.AreEqual(65535, mid.SyncTighteningId); + Assert.AreEqual("ABCDEFG-123 ", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2019,1,5,9,0,5), mid.Timestamp); + Assert.AreEqual(TorqueValuesUnit.Percentage, mid.TorqueValuesUnit); + Assert.AreEqual((ResultType)8, mid.ResultType); + Assert.AreEqual("Identifier result part 2 ", mid.IdentifierResultPart2); + Assert.AreEqual("Identifier result part 3 ", mid.IdentifierResultPart3); + Assert.AreEqual("Identifier result part 4 ", mid.IdentifierResultPart4); + Assert.AreEqual("E124", mid.CustomerTighteningErrorCode); + Assert.AreEqual(51m, mid.PrevailTorqueCompensateValue); Assert.IsNotNull(mid.TighteningErrorStatus2); - Assert.AreNotEqual(0, mid.StationId); - Assert.IsNotNull(mid.StationName); - Assert.AreNotEqual(0, mid.StartFinalAngle); - Assert.IsNotNull(mid.PostViewTorqueActivated); - Assert.AreNotEqual(0, mid.PostViewTorqueHigh); - Assert.AreNotEqual(0, mid.PostViewTorqueLow); - Assert.AreNotEqual(0, mid.CurrentMonitoringAmpere); - Assert.AreNotEqual(0, mid.CurrentMonitoringAmpereMin); - Assert.AreNotEqual(0, mid.CurrentMonitoringAmpereMax); + Assert.AreEqual(4294967295, mid.StationId); + Assert.AreEqual("Station Name ", mid.StationName); + Assert.AreEqual(10m, mid.StartFinalAngle); + Assert.AreEqual(PostViewTorque.OnlyPVTHOn, mid.PostViewTorqueActivated); + Assert.AreEqual(6521.43m, mid.PostViewTorqueHigh); + Assert.AreEqual(52.32m, mid.PostViewTorqueLow); + Assert.AreEqual(1m, mid.CurrentMonitoringAmpere); + Assert.AreEqual(0.5m, mid.CurrentMonitoringAmpereMin); + Assert.AreEqual(1.5m, mid.CurrentMonitoringAmpereMax); AssertEqualPackages(package, mid); } @@ -1079,50 +1096,51 @@ public void Mid0065ByteRevision9() var mid = _midInterpreter.Parse(bytes.ToArray()); Assert.AreEqual(typeof(Mid0065), mid.GetType()); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(123456789L, mid.TighteningId); + Assert.AreEqual("AIRBAG ", mid.VinNumber); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual(2, mid.ParameterSetId); + Assert.AreEqual(Strategy.RotateSpindleForward, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueMonitoringStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.AreEqual(false, mid.TighteningStatus); + Assert.AreEqual(BatchStatus.Nok, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); - Assert.IsNotNull(mid.CustomerTighteningErrorCode); - Assert.IsNotNull(mid.PrevailTorqueCompensateValue); + Assert.AreEqual(10m, mid.Torque); + Assert.AreEqual(360, mid.Angle); + Assert.AreEqual(250, mid.RundownAngle); + Assert.AreEqual(2, mid.CurrentMonitoringValue); + Assert.AreEqual(2.15m, mid.SelftapTorque); + Assert.AreEqual(10.25m, mid.PrevailTorque); + Assert.AreEqual(12, mid.JobSequenceNumber); + Assert.AreEqual(65535, mid.SyncTighteningId); + Assert.AreEqual("ABCDEFG-123 ", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2019,1,5,9,0,5), mid.Timestamp); + Assert.AreEqual(TorqueValuesUnit.Percentage, mid.TorqueValuesUnit); + Assert.AreEqual((ResultType)8, mid.ResultType); + Assert.AreEqual("Identifier result part 2 ", mid.IdentifierResultPart2); + Assert.AreEqual("Identifier result part 3 ", mid.IdentifierResultPart3); + Assert.AreEqual("Identifier result part 4 ", mid.IdentifierResultPart4); + Assert.AreEqual("E124", mid.CustomerTighteningErrorCode); + Assert.AreEqual(51m, mid.PrevailTorqueCompensateValue); Assert.IsNotNull(mid.TighteningErrorStatus2); - Assert.AreNotEqual(0, mid.StationId); - Assert.IsNotNull(mid.StationName); - Assert.AreNotEqual(0, mid.StartFinalAngle); - Assert.IsNotNull(mid.PostViewTorqueActivated); - Assert.AreNotEqual(0, mid.PostViewTorqueHigh); - Assert.AreNotEqual(0, mid.PostViewTorqueLow); - Assert.AreNotEqual(0, mid.CurrentMonitoringAmpere); - Assert.AreNotEqual(0, mid.CurrentMonitoringAmpereMin); - Assert.AreNotEqual(0, mid.CurrentMonitoringAmpereMax); + Assert.AreEqual(4294967295, mid.StationId); + Assert.AreEqual("Station Name ", mid.StationName); + Assert.AreEqual(10m, mid.StartFinalAngle); + Assert.AreEqual(PostViewTorque.OnlyPVTHOn, mid.PostViewTorqueActivated); + Assert.AreEqual(6521.43m, mid.PostViewTorqueHigh); + Assert.AreEqual(52.32m, mid.PostViewTorqueLow); + Assert.AreEqual(1m, mid.CurrentMonitoringAmpere); + Assert.AreEqual(0.5m, mid.CurrentMonitoringAmpereMin); + Assert.AreEqual(1.5m, mid.CurrentMonitoringAmpereMax); AssertEqualPackages(bytes, mid); } @@ -1134,61 +1152,61 @@ public void Mid0065Revision10() var mid = _midInterpreter.Parse(pack); Assert.AreEqual(typeof(Mid0065), mid.GetType()); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(123456789L, mid.TighteningId); + Assert.AreEqual("AIRBAG ", mid.VinNumber); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual(2, mid.ParameterSetId); + Assert.AreEqual(Strategy.RotateSpindleForward, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueMonitoringStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.AreEqual(false, mid.TighteningStatus); + Assert.AreEqual(BatchStatus.Nok, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); - Assert.IsNotNull(mid.CustomerTighteningErrorCode); - Assert.IsNotNull(mid.PrevailTorqueCompensateValue); + Assert.AreEqual(10m, mid.Torque); + Assert.AreEqual(360, mid.Angle); + Assert.AreEqual(250, mid.RundownAngle); + Assert.AreEqual(2, mid.CurrentMonitoringValue); + Assert.AreEqual(2.15m, mid.SelftapTorque); + Assert.AreEqual(10.25m, mid.PrevailTorque); + Assert.AreEqual(12, mid.JobSequenceNumber); + Assert.AreEqual(65535, mid.SyncTighteningId); + Assert.AreEqual("ABCDEFG-123 ", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2019,1,5,9,0,5), mid.Timestamp); + Assert.AreEqual(TorqueValuesUnit.Percentage, mid.TorqueValuesUnit); + Assert.AreEqual((ResultType)8, mid.ResultType); + Assert.AreEqual("Identifier result part 2 ", mid.IdentifierResultPart2); + Assert.AreEqual("Identifier result part 3 ", mid.IdentifierResultPart3); + Assert.AreEqual("Identifier result part 4 ", mid.IdentifierResultPart4); + Assert.AreEqual("E124", mid.CustomerTighteningErrorCode); + Assert.AreEqual(51m, mid.PrevailTorqueCompensateValue); Assert.IsNotNull(mid.TighteningErrorStatus2); - Assert.AreNotEqual(0, mid.StationId); - Assert.IsNotNull(mid.StationName); - Assert.AreNotEqual(0, mid.StartFinalAngle); - Assert.IsNotNull(mid.PostViewTorqueActivated); - Assert.AreNotEqual(0, mid.PostViewTorqueHigh); - Assert.AreNotEqual(0, mid.PostViewTorqueLow); - Assert.AreNotEqual(0, mid.CurrentMonitoringAmpere); - Assert.AreNotEqual(0, mid.CurrentMonitoringAmpereMin); - Assert.AreNotEqual(0, mid.CurrentMonitoringAmpereMax); - Assert.AreNotEqual(0, mid.AngleNumeratorScaleFactor); - Assert.AreNotEqual(0, mid.AngleDenominatorScaleFactor); - Assert.IsNotNull(mid.OverallAngleStatus); - Assert.AreNotEqual(0, mid.OverallAngleMin); - Assert.AreNotEqual(0, mid.OverallAngleMax); - Assert.AreNotEqual(0, mid.OverallAngle); - Assert.AreNotEqual(0, mid.PeakTorque); - Assert.AreNotEqual(0, mid.ResidualBreakawayTorque); - Assert.AreNotEqual(0, mid.StartRundownAngle); - Assert.AreNotEqual(0, mid.RundownAngleComplete); - + Assert.AreEqual(4294967295, mid.StationId); + Assert.AreEqual("Station Name ", mid.StationName); + Assert.AreEqual(10m, mid.StartFinalAngle); + Assert.AreEqual(PostViewTorque.OnlyPVTHOn, mid.PostViewTorqueActivated); + Assert.AreEqual(6521.43m, mid.PostViewTorqueHigh); + Assert.AreEqual(52.32m, mid.PostViewTorqueLow); + Assert.AreEqual(1m, mid.CurrentMonitoringAmpere); + Assert.AreEqual(0.5m, mid.CurrentMonitoringAmpereMin); + Assert.AreEqual(1.5m, mid.CurrentMonitoringAmpereMax); + Assert.AreEqual(1, mid.AngleNumeratorScaleFactor); + Assert.AreEqual(1, mid.AngleDenominatorScaleFactor); + Assert.AreEqual(TighteningValueStatus.Ok, mid.OverallAngleStatus); + Assert.AreEqual(-20, mid.OverallAngleMin); + Assert.AreEqual(100, mid.OverallAngleMax); + Assert.AreEqual(120, mid.OverallAngle); + Assert.AreEqual(32.91m, mid.PeakTorque); + Assert.AreEqual(10.05m, mid.ResidualBreakawayTorque); + Assert.AreEqual(1.1m, mid.StartRundownAngle); + Assert.AreEqual(90m, mid.RundownAngleComplete); AssertEqualPackages(pack, mid); } @@ -1252,61 +1270,61 @@ public void Mid0065ByteRevision10() var mid = _midInterpreter.Parse(bytes.ToArray()); Assert.AreEqual(typeof(Mid0065), mid.GetType()); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(123456789L, mid.TighteningId); + Assert.AreEqual("AIRBAG ", mid.VinNumber); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual(2, mid.ParameterSetId); + Assert.AreEqual(Strategy.RotateSpindleForward, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueMonitoringStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.AreEqual(false, mid.TighteningStatus); + Assert.AreEqual(BatchStatus.Nok, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); - Assert.IsNotNull(mid.CustomerTighteningErrorCode); - Assert.IsNotNull(mid.PrevailTorqueCompensateValue); + Assert.AreEqual(10m, mid.Torque); + Assert.AreEqual(360, mid.Angle); + Assert.AreEqual(250, mid.RundownAngle); + Assert.AreEqual(2, mid.CurrentMonitoringValue); + Assert.AreEqual(2.15m, mid.SelftapTorque); + Assert.AreEqual(10.25m, mid.PrevailTorque); + Assert.AreEqual(12, mid.JobSequenceNumber); + Assert.AreEqual(65535, mid.SyncTighteningId); + Assert.AreEqual("ABCDEFG-123 ", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2019,1,5,9,0,5), mid.Timestamp); + Assert.AreEqual(TorqueValuesUnit.Percentage, mid.TorqueValuesUnit); + Assert.AreEqual((ResultType)8, mid.ResultType); + Assert.AreEqual("Identifier result part 2 ", mid.IdentifierResultPart2); + Assert.AreEqual("Identifier result part 3 ", mid.IdentifierResultPart3); + Assert.AreEqual("Identifier result part 4 ", mid.IdentifierResultPart4); + Assert.AreEqual("E124", mid.CustomerTighteningErrorCode); + Assert.AreEqual(51m, mid.PrevailTorqueCompensateValue); Assert.IsNotNull(mid.TighteningErrorStatus2); - Assert.AreNotEqual(0, mid.StationId); - Assert.IsNotNull(mid.StationName); - Assert.AreNotEqual(0, mid.StartFinalAngle); - Assert.IsNotNull(mid.PostViewTorqueActivated); - Assert.AreNotEqual(0, mid.PostViewTorqueHigh); - Assert.AreNotEqual(0, mid.PostViewTorqueLow); - Assert.AreNotEqual(0, mid.CurrentMonitoringAmpere); - Assert.AreNotEqual(0, mid.CurrentMonitoringAmpereMin); - Assert.AreNotEqual(0, mid.CurrentMonitoringAmpereMax); - Assert.AreNotEqual(0, mid.AngleNumeratorScaleFactor); - Assert.AreNotEqual(0, mid.AngleDenominatorScaleFactor); - Assert.IsNotNull(mid.OverallAngleStatus); - Assert.AreNotEqual(0, mid.OverallAngleMin); - Assert.AreNotEqual(0, mid.OverallAngleMax); - Assert.AreNotEqual(0, mid.OverallAngle); - Assert.AreNotEqual(0, mid.PeakTorque); - Assert.AreNotEqual(0, mid.ResidualBreakawayTorque); - Assert.AreNotEqual(0, mid.StartRundownAngle); - Assert.AreNotEqual(0, mid.RundownAngleComplete); - + Assert.AreEqual(4294967295, mid.StationId); + Assert.AreEqual("Station Name ", mid.StationName); + Assert.AreEqual(10m, mid.StartFinalAngle); + Assert.AreEqual(PostViewTorque.OnlyPVTHOn, mid.PostViewTorqueActivated); + Assert.AreEqual(6521.43m, mid.PostViewTorqueHigh); + Assert.AreEqual(52.32m, mid.PostViewTorqueLow); + Assert.AreEqual(1m, mid.CurrentMonitoringAmpere); + Assert.AreEqual(0.5m, mid.CurrentMonitoringAmpereMin); + Assert.AreEqual(1.5m, mid.CurrentMonitoringAmpereMax); + Assert.AreEqual(1, mid.AngleNumeratorScaleFactor); + Assert.AreEqual(1, mid.AngleDenominatorScaleFactor); + Assert.AreEqual(TighteningValueStatus.Ok, mid.OverallAngleStatus); + Assert.AreEqual(-20, mid.OverallAngleMin); + Assert.AreEqual(100, mid.OverallAngleMax); + Assert.AreEqual(120, mid.OverallAngle); + Assert.AreEqual(32.91m, mid.PeakTorque); + Assert.AreEqual(10.05m, mid.ResidualBreakawayTorque); + Assert.AreEqual(1.1m, mid.StartRundownAngle); + Assert.AreEqual(90m, mid.RundownAngleComplete); AssertEqualPackages(bytes, mid); } @@ -1318,63 +1336,63 @@ public void Mid0065Revision11() var mid = _midInterpreter.Parse(pack); Assert.AreEqual(typeof(Mid0065), mid.GetType()); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(123456789L, mid.TighteningId); + Assert.AreEqual("AIRBAG ", mid.VinNumber); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual(2, mid.ParameterSetId); + Assert.AreEqual(Strategy.RotateSpindleForward, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueMonitoringStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.AreEqual(false, mid.TighteningStatus); + Assert.AreEqual(BatchStatus.Nok, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); - Assert.IsNotNull(mid.CustomerTighteningErrorCode); - Assert.IsNotNull(mid.PrevailTorqueCompensateValue); + Assert.AreEqual(10m, mid.Torque); + Assert.AreEqual(360, mid.Angle); + Assert.AreEqual(250, mid.RundownAngle); + Assert.AreEqual(2, mid.CurrentMonitoringValue); + Assert.AreEqual(2.15m, mid.SelftapTorque); + Assert.AreEqual(10.25m, mid.PrevailTorque); + Assert.AreEqual(12, mid.JobSequenceNumber); + Assert.AreEqual(65535, mid.SyncTighteningId); + Assert.AreEqual("ABCDEFG-123 ", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2019,1,5,9,0,5), mid.Timestamp); + Assert.AreEqual(TorqueValuesUnit.Percentage, mid.TorqueValuesUnit); + Assert.AreEqual((ResultType)8, mid.ResultType); + Assert.AreEqual("Identifier result part 2 ", mid.IdentifierResultPart2); + Assert.AreEqual("Identifier result part 3 ", mid.IdentifierResultPart3); + Assert.AreEqual("Identifier result part 4 ", mid.IdentifierResultPart4); + Assert.AreEqual("E124", mid.CustomerTighteningErrorCode); + Assert.AreEqual(51m, mid.PrevailTorqueCompensateValue); Assert.IsNotNull(mid.TighteningErrorStatus2); - Assert.AreNotEqual(0, mid.StationId); - Assert.IsNotNull(mid.StationName); - Assert.AreNotEqual(0, mid.StartFinalAngle); - Assert.IsNotNull(mid.PostViewTorqueActivated); - Assert.AreNotEqual(0, mid.PostViewTorqueHigh); - Assert.AreNotEqual(0, mid.PostViewTorqueLow); - Assert.AreNotEqual(0, mid.CurrentMonitoringAmpere); - Assert.AreNotEqual(0, mid.CurrentMonitoringAmpereMin); - Assert.AreNotEqual(0, mid.CurrentMonitoringAmpereMax); - Assert.AreNotEqual(0, mid.AngleNumeratorScaleFactor); - Assert.AreNotEqual(0, mid.AngleDenominatorScaleFactor); - Assert.IsNotNull(mid.OverallAngleStatus); - Assert.AreNotEqual(0, mid.OverallAngleMin); - Assert.AreNotEqual(0, mid.OverallAngleMax); - Assert.AreNotEqual(0, mid.OverallAngle); - Assert.AreNotEqual(0, mid.PeakTorque); - Assert.AreNotEqual(0, mid.ResidualBreakawayTorque); - Assert.AreNotEqual(0, mid.StartRundownAngle); - Assert.AreNotEqual(0, mid.RundownAngleComplete); - Assert.AreNotEqual(0, mid.ClickTorque); - Assert.AreNotEqual(0, mid.ClickAngle); - + Assert.AreEqual(4294967295, mid.StationId); + Assert.AreEqual("Station Name ", mid.StationName); + Assert.AreEqual(10m, mid.StartFinalAngle); + Assert.AreEqual(PostViewTorque.OnlyPVTHOn, mid.PostViewTorqueActivated); + Assert.AreEqual(6521.43m, mid.PostViewTorqueHigh); + Assert.AreEqual(52.32m, mid.PostViewTorqueLow); + Assert.AreEqual(1m, mid.CurrentMonitoringAmpere); + Assert.AreEqual(0.5m, mid.CurrentMonitoringAmpereMin); + Assert.AreEqual(1.5m, mid.CurrentMonitoringAmpereMax); + Assert.AreEqual(1, mid.AngleNumeratorScaleFactor); + Assert.AreEqual(1, mid.AngleDenominatorScaleFactor); + Assert.AreEqual(TighteningValueStatus.Ok, mid.OverallAngleStatus); + Assert.AreEqual(-20, mid.OverallAngleMin); + Assert.AreEqual(100, mid.OverallAngleMax); + Assert.AreEqual(120, mid.OverallAngle); + Assert.AreEqual(32.91m, mid.PeakTorque); + Assert.AreEqual(10.05m, mid.ResidualBreakawayTorque); + Assert.AreEqual(1.1m, mid.StartRundownAngle); + Assert.AreEqual(90m, mid.RundownAngleComplete); + Assert.AreEqual(1.2m, mid.ClickTorque); + Assert.AreEqual(1, mid.ClickAngle); AssertEqualPackages(pack, mid); } @@ -1438,64 +1456,1262 @@ public void Mid0065ByteRevision11() var mid = _midInterpreter.Parse(bytes.ToArray()); Assert.AreEqual(typeof(Mid0065), mid.GetType()); - Assert.IsNotNull(mid.TighteningId); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.JobId); - Assert.IsNotNull(mid.ParameterSetId); - Assert.IsNotNull(mid.Strategy); + Assert.AreEqual(123456789L, mid.TighteningId); + Assert.AreEqual("AIRBAG ", mid.VinNumber); + Assert.AreEqual(1, mid.JobId); + Assert.AreEqual(2, mid.ParameterSetId); + Assert.AreEqual(Strategy.RotateSpindleForward, mid.Strategy); Assert.IsNotNull(mid.StrategyOptions); - Assert.IsNotNull(mid.BatchSize); - Assert.IsNotNull(mid.BatchCounter); - Assert.IsNotNull(mid.TighteningStatus); - Assert.IsNotNull(mid.BatchStatus); - Assert.IsNotNull(mid.TorqueStatus); - Assert.IsNotNull(mid.AngleStatus); - Assert.IsNotNull(mid.RundownAngleStatus); - Assert.IsNotNull(mid.CurrentMonitoringStatus); - Assert.IsNotNull(mid.SelftapStatus); - Assert.IsNotNull(mid.PrevailTorqueMonitoringStatus); - Assert.IsNotNull(mid.PrevailTorqueCompensateStatus); + Assert.AreEqual(0, mid.BatchSize); + Assert.AreEqual(0, mid.BatchCounter); + Assert.AreEqual(false, mid.TighteningStatus); + Assert.AreEqual(BatchStatus.Nok, mid.BatchStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.TorqueStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.AngleStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.RundownAngleStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.CurrentMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Low, mid.SelftapStatus); + Assert.AreEqual(TighteningValueStatus.High, mid.PrevailTorqueMonitoringStatus); + Assert.AreEqual(TighteningValueStatus.Ok, mid.PrevailTorqueCompensateStatus); Assert.IsNotNull(mid.TighteningErrorStatus); - Assert.IsNotNull(mid.Torque); - Assert.IsNotNull(mid.Angle); - Assert.IsNotNull(mid.RundownAngle); - Assert.IsNotNull(mid.CurrentMonitoringValue); - Assert.IsNotNull(mid.SelftapTorque); - Assert.IsNotNull(mid.JobSequenceNumber); - Assert.IsNotNull(mid.SyncTighteningId); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.Timestamp); - Assert.IsNotNull(mid.TorqueValuesUnit); - Assert.IsNotNull(mid.ResultType); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); - Assert.IsNotNull(mid.CustomerTighteningErrorCode); - Assert.IsNotNull(mid.PrevailTorqueCompensateValue); + Assert.AreEqual(10m, mid.Torque); + Assert.AreEqual(360, mid.Angle); + Assert.AreEqual(250, mid.RundownAngle); + Assert.AreEqual(2, mid.CurrentMonitoringValue); + Assert.AreEqual(2.15m, mid.SelftapTorque); + Assert.AreEqual(10.25m, mid.PrevailTorque); + Assert.AreEqual(12, mid.JobSequenceNumber); + Assert.AreEqual(65535, mid.SyncTighteningId); + Assert.AreEqual("ABCDEFG-123 ", mid.ToolSerialNumber); + Assert.AreEqual(new DateTime(2019,1,5,9,0,5), mid.Timestamp); + Assert.AreEqual(TorqueValuesUnit.Percentage, mid.TorqueValuesUnit); + Assert.AreEqual((ResultType)8, mid.ResultType); + Assert.AreEqual("Identifier result part 2 ", mid.IdentifierResultPart2); + Assert.AreEqual("Identifier result part 3 ", mid.IdentifierResultPart3); + Assert.AreEqual("Identifier result part 4 ", mid.IdentifierResultPart4); + Assert.AreEqual("E124", mid.CustomerTighteningErrorCode); + Assert.AreEqual(51m, mid.PrevailTorqueCompensateValue); Assert.IsNotNull(mid.TighteningErrorStatus2); - Assert.AreNotEqual(0, mid.StationId); - Assert.IsNotNull(mid.StationName); - Assert.AreNotEqual(0, mid.StartFinalAngle); - Assert.IsNotNull(mid.PostViewTorqueActivated); - Assert.AreNotEqual(0, mid.PostViewTorqueHigh); - Assert.AreNotEqual(0, mid.PostViewTorqueLow); - Assert.AreNotEqual(0, mid.CurrentMonitoringAmpere); - Assert.AreNotEqual(0, mid.CurrentMonitoringAmpereMin); - Assert.AreNotEqual(0, mid.CurrentMonitoringAmpereMax); - Assert.AreNotEqual(0, mid.AngleNumeratorScaleFactor); - Assert.AreNotEqual(0, mid.AngleDenominatorScaleFactor); - Assert.IsNotNull(mid.OverallAngleStatus); - Assert.AreNotEqual(0, mid.OverallAngleMin); - Assert.AreNotEqual(0, mid.OverallAngleMax); - Assert.AreNotEqual(0, mid.OverallAngle); - Assert.AreNotEqual(0, mid.PeakTorque); - Assert.AreNotEqual(0, mid.ResidualBreakawayTorque); - Assert.AreNotEqual(0, mid.StartRundownAngle); - Assert.AreNotEqual(0, mid.RundownAngleComplete); - Assert.AreNotEqual(0, mid.ClickTorque); - Assert.AreNotEqual(0, mid.ClickAngle); - + Assert.AreEqual(4294967295, mid.StationId); + Assert.AreEqual("Station Name ", mid.StationName); + Assert.AreEqual(10m, mid.StartFinalAngle); + Assert.AreEqual(PostViewTorque.OnlyPVTHOn, mid.PostViewTorqueActivated); + Assert.AreEqual(6521.43m, mid.PostViewTorqueHigh); + Assert.AreEqual(52.32m, mid.PostViewTorqueLow); + Assert.AreEqual(1m, mid.CurrentMonitoringAmpere); + Assert.AreEqual(0.5m, mid.CurrentMonitoringAmpereMin); + Assert.AreEqual(1.5m, mid.CurrentMonitoringAmpereMax); + Assert.AreEqual(1, mid.AngleNumeratorScaleFactor); + Assert.AreEqual(1, mid.AngleDenominatorScaleFactor); + Assert.AreEqual(TighteningValueStatus.Ok, mid.OverallAngleStatus); + Assert.AreEqual(-20, mid.OverallAngleMin); + Assert.AreEqual(100, mid.OverallAngleMax); + Assert.AreEqual(120, mid.OverallAngle); + Assert.AreEqual(32.91m, mid.PeakTorque); + Assert.AreEqual(10.05m, mid.ResidualBreakawayTorque); + Assert.AreEqual(1.1m, mid.StartRundownAngle); + Assert.AreEqual(90m, mid.RundownAngleComplete); + Assert.AreEqual(1.2m, mid.ClickTorque); + Assert.AreEqual(1, mid.ClickAngle); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0065PackRevision1() + { + string package = "01180065001 01012345678902AIRBAG 03001040002050060070080014670900046102001-04-22:14:54:34112"; + + AssertBuildAndParse(package, new Mid0065(1) + { + TighteningId = 123456789L, + VinNumber = "AIRBAG", + ParameterSetId = 1, + BatchCounter = 2, + TighteningStatus = false, + TorqueStatus = TighteningValueStatus.Low, + AngleStatus = TighteningValueStatus.Low, + Torque = 14.67m, + Angle = 46, + Timestamp = new DateTime(2001, 4, 22, 14, 54, 34), + BatchStatus = BatchStatus.NotUsed + }); + } + + [TestMethod] + [TestCategory("Revision 2"), TestCategory("Pack")] + public void Mid0065PackRevision2() + { + string package = "02260065002 01012345678902AIRBAG 030001040020510060093807000008000009010011112013214115016217118000004189819001000200036021002502200223000215240010252500012266553527ABCDEFG-123 282019-01-05:09:00:05"; + + AssertBuildAndParse(package, new Mid0065(2) + { + TighteningId = 123456789L, + VinNumber = "AIRBAG", + ParameterSetId = 2, + BatchCounter = 0, + TighteningStatus = false, + TorqueStatus = TighteningValueStatus.Ok, + AngleStatus = TighteningValueStatus.Low, + Torque = 10m, + Angle = 360, + Timestamp = new DateTime(2019, 1, 5, 9, 0, 5), + BatchStatus = BatchStatus.Nok, + JobId = 1, + Strategy = Strategy.RotateSpindleForward, + StrategyOptions = new StrategyOptions() + { + Torque = false, + Angle = true, + Batch = false, + PvtMonitoring = true, + PvtCompensate = false, + Selftap = true, + Rundown = false, + CM = true, + DsControl = true, + ClickWrench = true, + RbwMonitoring = false + }, + BatchSize = 0, + RundownAngleStatus = TighteningValueStatus.High, + CurrentMonitoringStatus = TighteningValueStatus.Ok, + SelftapStatus = TighteningValueStatus.Low, + PrevailTorqueMonitoringStatus = TighteningValueStatus.High, + PrevailTorqueCompensateStatus = TighteningValueStatus.Ok, + TighteningErrorStatus = new TighteningErrorStatus() + { + RundownAngleMaxShutOff = false, + RundownAngleMinShutOff = true, + TorqueMaxShutOff = false, + AngleMaxShutOff = true, + SelftapTorqueMaxShutOff = false, + SelftapTorqueMinShutOff = true, + PrevailTorqueMaxShutOff = false, + PrevailTorqueMinShutOff = true, + PrevailTorqueCompensateOverflow = true, + CurrentMonitoringMaxShutOff = true, + PostViewTorqueMinTorqueShutOff = false, + PostViewTorqueMaxTorqueShutOff = false, + PostViewTorqueAngleTooSmall = false, + TriggerLost = true, + TorqueLessThanTarget = false, + ToolHot = true, + MultistageAbort = false, + Rehit = false, + DsMeasureFailed = false, + CurrentLimitReached = false, + EndTimeOutShutOff = false, + RemoveFastenerLimitExceeded = false, + DisableDrive = false, + TransducerLost = false, + TransducerShorted = false, + TransducerCorrupt = false, + SyncTimeout = false, + DynamicCurrentMonitoringMin = false, + DynamicCurrentMonitoringMax = false, + AngleMaxMonitor = false, + YieldNutOff = false, + YieldTooFewSamples = false + }, + RundownAngle = 250, + CurrentMonitoringValue = 2, + SelftapTorque = 2.15m, + PrevailTorque = 10.25m, + JobSequenceNumber = 12, + SyncTighteningId = 65535, + ToolSerialNumber = "ABCDEFG-123" + }); + } + + [TestMethod] + [TestCategory("Revision 3"), TestCategory("Pack")] + public void Mid0065PackRevision3() + { + string package = "02330065003 01012345678902AIRBAG 030001040020510060093807000008000009010011112013214115016217118000004189819001000200036021002502200223000215240010252500012266553527ABCDEFG-123 282019-01-05:09:00:052973008"; + + AssertBuildAndParse(package, new Mid0065(3) + { + TighteningId = 123456789L, + VinNumber = "AIRBAG", + ParameterSetId = 2, + BatchCounter = 0, + TighteningStatus = false, + TorqueStatus = TighteningValueStatus.Ok, + AngleStatus = TighteningValueStatus.Low, + Torque = 10m, + Angle = 360, + Timestamp = new DateTime(2019, 1, 5, 9, 0, 5), + BatchStatus = BatchStatus.Nok, + JobId = 1, + Strategy = Strategy.RotateSpindleForward, + StrategyOptions = new StrategyOptions() + { + Torque = false, + Angle = true, + Batch = false, + PvtMonitoring = true, + PvtCompensate = false, + Selftap = true, + Rundown = false, + CM = true, + DsControl = true, + ClickWrench = true, + RbwMonitoring = false + }, + BatchSize = 0, + RundownAngleStatus = TighteningValueStatus.High, + CurrentMonitoringStatus = TighteningValueStatus.Ok, + SelftapStatus = TighteningValueStatus.Low, + PrevailTorqueMonitoringStatus = TighteningValueStatus.High, + PrevailTorqueCompensateStatus = TighteningValueStatus.Ok, + TighteningErrorStatus = new TighteningErrorStatus() + { + RundownAngleMaxShutOff = false, + RundownAngleMinShutOff = true, + TorqueMaxShutOff = false, + AngleMaxShutOff = true, + SelftapTorqueMaxShutOff = false, + SelftapTorqueMinShutOff = true, + PrevailTorqueMaxShutOff = false, + PrevailTorqueMinShutOff = true, + PrevailTorqueCompensateOverflow = true, + CurrentMonitoringMaxShutOff = true, + PostViewTorqueMinTorqueShutOff = false, + PostViewTorqueMaxTorqueShutOff = false, + PostViewTorqueAngleTooSmall = false, + TriggerLost = true, + TorqueLessThanTarget = false, + ToolHot = true, + MultistageAbort = false, + Rehit = false, + DsMeasureFailed = false, + CurrentLimitReached = false, + EndTimeOutShutOff = false, + RemoveFastenerLimitExceeded = false, + DisableDrive = false, + TransducerLost = false, + TransducerShorted = false, + TransducerCorrupt = false, + SyncTimeout = false, + DynamicCurrentMonitoringMin = false, + DynamicCurrentMonitoringMax = false, + AngleMaxMonitor = false, + YieldNutOff = false, + YieldTooFewSamples = false + }, + RundownAngle = 250, + CurrentMonitoringValue = 2, + SelftapTorque = 2.15m, + PrevailTorque = 10.25m, + JobSequenceNumber = 12, + SyncTighteningId = 65535, + ToolSerialNumber = "ABCDEFG-123", + TorqueValuesUnit = TorqueValuesUnit.Percentage, + ResultType = ResultType.ReferenceSetup + }); + } + + [TestMethod] + [TestCategory("Revision 4"), TestCategory("Pack")] + public void Mid0065PackRevision4() + { + string package = "03140065004 01012345678902AIRBAG 030001040020510060093807000008000009010011112013214115016217118000004189819001000200036021002502200223000215240010252500012266553527ABCDEFG-123 282019-01-05:09:00:05297300831Identifier result part 2 32Identifier result part 3 33Identifier result part 4 "; + + AssertBuildAndParse(package, new Mid0065(4) + { + TighteningId = 123456789L, + VinNumber = "AIRBAG", + ParameterSetId = 2, + BatchCounter = 0, + TighteningStatus = false, + TorqueStatus = TighteningValueStatus.Ok, + AngleStatus = TighteningValueStatus.Low, + Torque = 10m, + Angle = 360, + Timestamp = new DateTime(2019, 1, 5, 9, 0, 5), + BatchStatus = BatchStatus.Nok, + JobId = 1, + Strategy = Strategy.RotateSpindleForward, + StrategyOptions = new StrategyOptions() + { + Torque = false, + Angle = true, + Batch = false, + PvtMonitoring = true, + PvtCompensate = false, + Selftap = true, + Rundown = false, + CM = true, + DsControl = true, + ClickWrench = true, + RbwMonitoring = false + }, + BatchSize = 0, + RundownAngleStatus = TighteningValueStatus.High, + CurrentMonitoringStatus = TighteningValueStatus.Ok, + SelftapStatus = TighteningValueStatus.Low, + PrevailTorqueMonitoringStatus = TighteningValueStatus.High, + PrevailTorqueCompensateStatus = TighteningValueStatus.Ok, + TighteningErrorStatus = new TighteningErrorStatus() + { + RundownAngleMaxShutOff = false, + RundownAngleMinShutOff = true, + TorqueMaxShutOff = false, + AngleMaxShutOff = true, + SelftapTorqueMaxShutOff = false, + SelftapTorqueMinShutOff = true, + PrevailTorqueMaxShutOff = false, + PrevailTorqueMinShutOff = true, + PrevailTorqueCompensateOverflow = true, + CurrentMonitoringMaxShutOff = true, + PostViewTorqueMinTorqueShutOff = false, + PostViewTorqueMaxTorqueShutOff = false, + PostViewTorqueAngleTooSmall = false, + TriggerLost = true, + TorqueLessThanTarget = false, + ToolHot = true, + MultistageAbort = false, + Rehit = false, + DsMeasureFailed = false, + CurrentLimitReached = false, + EndTimeOutShutOff = false, + RemoveFastenerLimitExceeded = false, + DisableDrive = false, + TransducerLost = false, + TransducerShorted = false, + TransducerCorrupt = false, + SyncTimeout = false, + DynamicCurrentMonitoringMin = false, + DynamicCurrentMonitoringMax = false, + AngleMaxMonitor = false, + YieldNutOff = false, + YieldTooFewSamples = false + }, + RundownAngle = 250, + CurrentMonitoringValue = 2, + SelftapTorque = 2.15m, + PrevailTorque = 10.25m, + JobSequenceNumber = 12, + SyncTighteningId = 65535, + ToolSerialNumber = "ABCDEFG-123", + TorqueValuesUnit = TorqueValuesUnit.Percentage, + ResultType = ResultType.ReferenceSetup, + IdentifierResultPart2 = "Identifier result part 2", + IdentifierResultPart3 = "Identifier result part 3", + IdentifierResultPart4 = "Identifier result part 4" + }); + } + + [TestMethod] + [TestCategory("Revision 5"), TestCategory("Pack")] + public void Mid0065PackRevision5() + { + string package = "03200065005 01012345678902AIRBAG 030001040020510060093807000008000009010011112013214115016217118000004189819001000200036021002502200223000215240010252500012266553527ABCDEFG-123 282019-01-05:09:00:05297300831Identifier result part 2 32Identifier result part 3 33Identifier result part 4 34E124"; + + AssertBuildAndParse(package, new Mid0065(5) + { + TighteningId = 123456789L, + VinNumber = "AIRBAG", + ParameterSetId = 2, + BatchCounter = 0, + TighteningStatus = false, + TorqueStatus = TighteningValueStatus.Ok, + AngleStatus = TighteningValueStatus.Low, + Torque = 10m, + Angle = 360, + Timestamp = new DateTime(2019, 1, 5, 9, 0, 5), + BatchStatus = BatchStatus.Nok, + JobId = 1, + Strategy = Strategy.RotateSpindleForward, + StrategyOptions = new StrategyOptions() + { + Torque = false, + Angle = true, + Batch = false, + PvtMonitoring = true, + PvtCompensate = false, + Selftap = true, + Rundown = false, + CM = true, + DsControl = true, + ClickWrench = true, + RbwMonitoring = false + }, + BatchSize = 0, + RundownAngleStatus = TighteningValueStatus.High, + CurrentMonitoringStatus = TighteningValueStatus.Ok, + SelftapStatus = TighteningValueStatus.Low, + PrevailTorqueMonitoringStatus = TighteningValueStatus.High, + PrevailTorqueCompensateStatus = TighteningValueStatus.Ok, + TighteningErrorStatus = new TighteningErrorStatus() + { + RundownAngleMaxShutOff = false, + RundownAngleMinShutOff = true, + TorqueMaxShutOff = false, + AngleMaxShutOff = true, + SelftapTorqueMaxShutOff = false, + SelftapTorqueMinShutOff = true, + PrevailTorqueMaxShutOff = false, + PrevailTorqueMinShutOff = true, + PrevailTorqueCompensateOverflow = true, + CurrentMonitoringMaxShutOff = true, + PostViewTorqueMinTorqueShutOff = false, + PostViewTorqueMaxTorqueShutOff = false, + PostViewTorqueAngleTooSmall = false, + TriggerLost = true, + TorqueLessThanTarget = false, + ToolHot = true, + MultistageAbort = false, + Rehit = false, + DsMeasureFailed = false, + CurrentLimitReached = false, + EndTimeOutShutOff = false, + RemoveFastenerLimitExceeded = false, + DisableDrive = false, + TransducerLost = false, + TransducerShorted = false, + TransducerCorrupt = false, + SyncTimeout = false, + DynamicCurrentMonitoringMin = false, + DynamicCurrentMonitoringMax = false, + AngleMaxMonitor = false, + YieldNutOff = false, + YieldTooFewSamples = false + }, + RundownAngle = 250, + CurrentMonitoringValue = 2, + SelftapTorque = 2.15m, + PrevailTorque = 10.25m, + JobSequenceNumber = 12, + SyncTighteningId = 65535, + ToolSerialNumber = "ABCDEFG-123", + TorqueValuesUnit = TorqueValuesUnit.Percentage, + ResultType = ResultType.ReferenceSetup, + IdentifierResultPart2 = "Identifier result part 2", + IdentifierResultPart3 = "Identifier result part 3", + IdentifierResultPart4 = "Identifier result part 4", + CustomerTighteningErrorCode = "E124" + }); + } + + [TestMethod] + [TestCategory("Revision 6"), TestCategory("Pack")] + public void Mid0065PackRevision6() + { + string package = "03400065006 01012345678902AIRBAG 030001040020510060093807000008000009010011112013214115016217118000004189819001000200036021002502200223000215240010252500012266553527ABCDEFG-123 282019-01-05:09:00:05297300831Identifier result part 2 32Identifier result part 3 33Identifier result part 4 34E12435005100360000000042"; + + AssertBuildAndParse(package, new Mid0065(6) + { + TighteningId = 123456789L, + VinNumber = "AIRBAG", + ParameterSetId = 2, + BatchCounter = 0, + TighteningStatus = false, + TorqueStatus = TighteningValueStatus.Ok, + AngleStatus = TighteningValueStatus.Low, + Torque = 10m, + Angle = 360, + Timestamp = new DateTime(2019, 1, 5, 9, 0, 5), + BatchStatus = BatchStatus.Nok, + JobId = 1, + Strategy = Strategy.RotateSpindleForward, + StrategyOptions = new StrategyOptions() + { + Torque = false, + Angle = true, + Batch = false, + PvtMonitoring = true, + PvtCompensate = false, + Selftap = true, + Rundown = false, + CM = true, + DsControl = true, + ClickWrench = true, + RbwMonitoring = false + }, + BatchSize = 0, + RundownAngleStatus = TighteningValueStatus.High, + CurrentMonitoringStatus = TighteningValueStatus.Ok, + SelftapStatus = TighteningValueStatus.Low, + PrevailTorqueMonitoringStatus = TighteningValueStatus.High, + PrevailTorqueCompensateStatus = TighteningValueStatus.Ok, + TighteningErrorStatus = new TighteningErrorStatus() + { + RundownAngleMaxShutOff = false, + RundownAngleMinShutOff = true, + TorqueMaxShutOff = false, + AngleMaxShutOff = true, + SelftapTorqueMaxShutOff = false, + SelftapTorqueMinShutOff = true, + PrevailTorqueMaxShutOff = false, + PrevailTorqueMinShutOff = true, + PrevailTorqueCompensateOverflow = true, + CurrentMonitoringMaxShutOff = true, + PostViewTorqueMinTorqueShutOff = false, + PostViewTorqueMaxTorqueShutOff = false, + PostViewTorqueAngleTooSmall = false, + TriggerLost = true, + TorqueLessThanTarget = false, + ToolHot = true, + MultistageAbort = false, + Rehit = false, + DsMeasureFailed = false, + CurrentLimitReached = false, + EndTimeOutShutOff = false, + RemoveFastenerLimitExceeded = false, + DisableDrive = false, + TransducerLost = false, + TransducerShorted = false, + TransducerCorrupt = false, + SyncTimeout = false, + DynamicCurrentMonitoringMin = false, + DynamicCurrentMonitoringMax = false, + AngleMaxMonitor = false, + YieldNutOff = false, + YieldTooFewSamples = false + }, + RundownAngle = 250, + CurrentMonitoringValue = 2, + SelftapTorque = 2.15m, + PrevailTorque = 10.25m, + JobSequenceNumber = 12, + SyncTighteningId = 65535, + ToolSerialNumber = "ABCDEFG-123", + TorqueValuesUnit = TorqueValuesUnit.Percentage, + ResultType = ResultType.ReferenceSetup, + IdentifierResultPart2 = "Identifier result part 2", + IdentifierResultPart3 = "Identifier result part 3", + IdentifierResultPart4 = "Identifier result part 4", + CustomerTighteningErrorCode = "E124", + PrevailTorqueCompensateValue = 51m, + TighteningErrorStatus2 = new TighteningErrorStatus2() + { + DriveDeactivated = false, + ToolStall = true, + DriveHot = false, + GradientMonitoringHigh = true, + GradientMonitoringLow = false, + ReactionBarFailed = true, + SnugMax = false, + CycleAbort = false, + NeckingFailure = false, + EffectiveLoosening = false, + OverSpeed = false, + NoResidualTorque = false, + PositioningFail = false, + SnugMonLow = false, + SnugMonHigh = false, + DynamicMinCurrent = false, + DynamicMaxCurrent = false, + LatentResult = false, + Reserved = new byte[] + { + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + } + } + }); + } + + [TestMethod] + [TestCategory("Revision 7"), TestCategory("Pack")] + public void Mid0065PackRevision7() + { + string package = "03790065007 01012345678902AIRBAG 030001040020510060093807000008000009010011112013214115016217118000004189819001000200036021002502200223000215240010252500012266553527ABCDEFG-123 282019-01-05:09:00:05297300831Identifier result part 2 32Identifier result part 3 33Identifier result part 4 34E1243500510036000000004237429496729538Station Name "; + + AssertBuildAndParse(package, new Mid0065(7) + { + TighteningId = 123456789L, + VinNumber = "AIRBAG", + ParameterSetId = 2, + BatchCounter = 0, + TighteningStatus = false, + TorqueStatus = TighteningValueStatus.Ok, + AngleStatus = TighteningValueStatus.Low, + Torque = 10m, + Angle = 360, + Timestamp = new DateTime(2019, 1, 5, 9, 0, 5), + BatchStatus = BatchStatus.Nok, + JobId = 1, + Strategy = Strategy.RotateSpindleForward, + StrategyOptions = new StrategyOptions() + { + Torque = false, + Angle = true, + Batch = false, + PvtMonitoring = true, + PvtCompensate = false, + Selftap = true, + Rundown = false, + CM = true, + DsControl = true, + ClickWrench = true, + RbwMonitoring = false + }, + BatchSize = 0, + RundownAngleStatus = TighteningValueStatus.High, + CurrentMonitoringStatus = TighteningValueStatus.Ok, + SelftapStatus = TighteningValueStatus.Low, + PrevailTorqueMonitoringStatus = TighteningValueStatus.High, + PrevailTorqueCompensateStatus = TighteningValueStatus.Ok, + TighteningErrorStatus = new TighteningErrorStatus() + { + RundownAngleMaxShutOff = false, + RundownAngleMinShutOff = true, + TorqueMaxShutOff = false, + AngleMaxShutOff = true, + SelftapTorqueMaxShutOff = false, + SelftapTorqueMinShutOff = true, + PrevailTorqueMaxShutOff = false, + PrevailTorqueMinShutOff = true, + PrevailTorqueCompensateOverflow = true, + CurrentMonitoringMaxShutOff = true, + PostViewTorqueMinTorqueShutOff = false, + PostViewTorqueMaxTorqueShutOff = false, + PostViewTorqueAngleTooSmall = false, + TriggerLost = true, + TorqueLessThanTarget = false, + ToolHot = true, + MultistageAbort = false, + Rehit = false, + DsMeasureFailed = false, + CurrentLimitReached = false, + EndTimeOutShutOff = false, + RemoveFastenerLimitExceeded = false, + DisableDrive = false, + TransducerLost = false, + TransducerShorted = false, + TransducerCorrupt = false, + SyncTimeout = false, + DynamicCurrentMonitoringMin = false, + DynamicCurrentMonitoringMax = false, + AngleMaxMonitor = false, + YieldNutOff = false, + YieldTooFewSamples = false + }, + RundownAngle = 250, + CurrentMonitoringValue = 2, + SelftapTorque = 2.15m, + PrevailTorque = 10.25m, + JobSequenceNumber = 12, + SyncTighteningId = 65535, + ToolSerialNumber = "ABCDEFG-123", + TorqueValuesUnit = TorqueValuesUnit.Percentage, + ResultType = ResultType.ReferenceSetup, + IdentifierResultPart2 = "Identifier result part 2", + IdentifierResultPart3 = "Identifier result part 3", + IdentifierResultPart4 = "Identifier result part 4", + CustomerTighteningErrorCode = "E124", + PrevailTorqueCompensateValue = 51m, + TighteningErrorStatus2 = new TighteningErrorStatus2() + { + DriveDeactivated = false, + ToolStall = true, + DriveHot = false, + GradientMonitoringHigh = true, + GradientMonitoringLow = false, + ReactionBarFailed = true, + SnugMax = false, + CycleAbort = false, + NeckingFailure = false, + EffectiveLoosening = false, + OverSpeed = false, + NoResidualTorque = false, + PositioningFail = false, + SnugMonLow = false, + SnugMonHigh = false, + DynamicMinCurrent = false, + DynamicMaxCurrent = false, + LatentResult = false, + Reserved = new byte[] + { + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + } + }, + StationId = 4294967295L, + StationName = "Station Name" + }); + } + + [TestMethod] + [TestCategory("Revision 8"), TestCategory("Pack")] + public void Mid0065PackRevision8() + { + string package = "04060065008 01012345678902AIRBAG 030001040020510060093807000008000009010011112013214115016217118000004189819001000200036021002502200223000215240010252500012266553527ABCDEFG-123 282019-01-05:09:00:05297300831Identifier result part 2 32Identifier result part 3 33Identifier result part 4 34E1243500510036000000004237429496729538Station Name 390010004024165214342005232"; + + AssertBuildAndParse(package, new Mid0065(8) + { + TighteningId = 123456789L, + VinNumber = "AIRBAG", + ParameterSetId = 2, + BatchCounter = 0, + TighteningStatus = false, + TorqueStatus = TighteningValueStatus.Ok, + AngleStatus = TighteningValueStatus.Low, + Torque = 10m, + Angle = 360, + Timestamp = new DateTime(2019, 1, 5, 9, 0, 5), + BatchStatus = BatchStatus.Nok, + JobId = 1, + Strategy = Strategy.RotateSpindleForward, + StrategyOptions = new StrategyOptions() + { + Torque = false, + Angle = true, + Batch = false, + PvtMonitoring = true, + PvtCompensate = false, + Selftap = true, + Rundown = false, + CM = true, + DsControl = true, + ClickWrench = true, + RbwMonitoring = false + }, + BatchSize = 0, + RundownAngleStatus = TighteningValueStatus.High, + CurrentMonitoringStatus = TighteningValueStatus.Ok, + SelftapStatus = TighteningValueStatus.Low, + PrevailTorqueMonitoringStatus = TighteningValueStatus.High, + PrevailTorqueCompensateStatus = TighteningValueStatus.Ok, + TighteningErrorStatus = new TighteningErrorStatus() + { + RundownAngleMaxShutOff = false, + RundownAngleMinShutOff = true, + TorqueMaxShutOff = false, + AngleMaxShutOff = true, + SelftapTorqueMaxShutOff = false, + SelftapTorqueMinShutOff = true, + PrevailTorqueMaxShutOff = false, + PrevailTorqueMinShutOff = true, + PrevailTorqueCompensateOverflow = true, + CurrentMonitoringMaxShutOff = true, + PostViewTorqueMinTorqueShutOff = false, + PostViewTorqueMaxTorqueShutOff = false, + PostViewTorqueAngleTooSmall = false, + TriggerLost = true, + TorqueLessThanTarget = false, + ToolHot = true, + MultistageAbort = false, + Rehit = false, + DsMeasureFailed = false, + CurrentLimitReached = false, + EndTimeOutShutOff = false, + RemoveFastenerLimitExceeded = false, + DisableDrive = false, + TransducerLost = false, + TransducerShorted = false, + TransducerCorrupt = false, + SyncTimeout = false, + DynamicCurrentMonitoringMin = false, + DynamicCurrentMonitoringMax = false, + AngleMaxMonitor = false, + YieldNutOff = false, + YieldTooFewSamples = false + }, + RundownAngle = 250, + CurrentMonitoringValue = 2, + SelftapTorque = 2.15m, + PrevailTorque = 10.25m, + JobSequenceNumber = 12, + SyncTighteningId = 65535, + ToolSerialNumber = "ABCDEFG-123", + TorqueValuesUnit = TorqueValuesUnit.Percentage, + ResultType = ResultType.ReferenceSetup, + IdentifierResultPart2 = "Identifier result part 2", + IdentifierResultPart3 = "Identifier result part 3", + IdentifierResultPart4 = "Identifier result part 4", + CustomerTighteningErrorCode = "E124", + PrevailTorqueCompensateValue = 51m, + TighteningErrorStatus2 = new TighteningErrorStatus2() + { + DriveDeactivated = false, + ToolStall = true, + DriveHot = false, + GradientMonitoringHigh = true, + GradientMonitoringLow = false, + ReactionBarFailed = true, + SnugMax = false, + CycleAbort = false, + NeckingFailure = false, + EffectiveLoosening = false, + OverSpeed = false, + NoResidualTorque = false, + PositioningFail = false, + SnugMonLow = false, + SnugMonHigh = false, + DynamicMinCurrent = false, + DynamicMaxCurrent = false, + LatentResult = false, + Reserved = new byte[] + { + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + } + }, + StationId = 4294967295L, + StationName = "Station Name", + StartFinalAngle = 10m, + PostViewTorqueActivated = PostViewTorque.OnlyPVTHOn, + PostViewTorqueHigh = 6521.43m, + PostViewTorqueLow = 52.32m + }); + } + + [TestMethod] + [TestCategory("Revision 9"), TestCategory("Pack")] + public void Mid0065PackRevision9() + { + string package = "04270065009 01012345678902AIRBAG 030001040020510060093807000008000009010011112013214115016217118000004189819001000200036021002502200223000215240010252500012266553527ABCDEFG-123 282019-01-05:09:00:05297300831Identifier result part 2 32Identifier result part 3 33Identifier result part 4 34E1243500510036000000004237429496729538Station Name 390010004024165214342005232430010044000504500150"; + + AssertBuildAndParse(package, new Mid0065(9) + { + TighteningId = 123456789L, + VinNumber = "AIRBAG", + ParameterSetId = 2, + BatchCounter = 0, + TighteningStatus = false, + TorqueStatus = TighteningValueStatus.Ok, + AngleStatus = TighteningValueStatus.Low, + Torque = 10m, + Angle = 360, + Timestamp = new DateTime(2019, 1, 5, 9, 0, 5), + BatchStatus = BatchStatus.Nok, + JobId = 1, + Strategy = Strategy.RotateSpindleForward, + StrategyOptions = new StrategyOptions() + { + Torque = false, + Angle = true, + Batch = false, + PvtMonitoring = true, + PvtCompensate = false, + Selftap = true, + Rundown = false, + CM = true, + DsControl = true, + ClickWrench = true, + RbwMonitoring = false + }, + BatchSize = 0, + RundownAngleStatus = TighteningValueStatus.High, + CurrentMonitoringStatus = TighteningValueStatus.Ok, + SelftapStatus = TighteningValueStatus.Low, + PrevailTorqueMonitoringStatus = TighteningValueStatus.High, + PrevailTorqueCompensateStatus = TighteningValueStatus.Ok, + TighteningErrorStatus = new TighteningErrorStatus() + { + RundownAngleMaxShutOff = false, + RundownAngleMinShutOff = true, + TorqueMaxShutOff = false, + AngleMaxShutOff = true, + SelftapTorqueMaxShutOff = false, + SelftapTorqueMinShutOff = true, + PrevailTorqueMaxShutOff = false, + PrevailTorqueMinShutOff = true, + PrevailTorqueCompensateOverflow = true, + CurrentMonitoringMaxShutOff = true, + PostViewTorqueMinTorqueShutOff = false, + PostViewTorqueMaxTorqueShutOff = false, + PostViewTorqueAngleTooSmall = false, + TriggerLost = true, + TorqueLessThanTarget = false, + ToolHot = true, + MultistageAbort = false, + Rehit = false, + DsMeasureFailed = false, + CurrentLimitReached = false, + EndTimeOutShutOff = false, + RemoveFastenerLimitExceeded = false, + DisableDrive = false, + TransducerLost = false, + TransducerShorted = false, + TransducerCorrupt = false, + SyncTimeout = false, + DynamicCurrentMonitoringMin = false, + DynamicCurrentMonitoringMax = false, + AngleMaxMonitor = false, + YieldNutOff = false, + YieldTooFewSamples = false + }, + RundownAngle = 250, + CurrentMonitoringValue = 2, + SelftapTorque = 2.15m, + PrevailTorque = 10.25m, + JobSequenceNumber = 12, + SyncTighteningId = 65535, + ToolSerialNumber = "ABCDEFG-123", + TorqueValuesUnit = TorqueValuesUnit.Percentage, + ResultType = ResultType.ReferenceSetup, + IdentifierResultPart2 = "Identifier result part 2", + IdentifierResultPart3 = "Identifier result part 3", + IdentifierResultPart4 = "Identifier result part 4", + CustomerTighteningErrorCode = "E124", + PrevailTorqueCompensateValue = 51m, + TighteningErrorStatus2 = new TighteningErrorStatus2() + { + DriveDeactivated = false, + ToolStall = true, + DriveHot = false, + GradientMonitoringHigh = true, + GradientMonitoringLow = false, + ReactionBarFailed = true, + SnugMax = false, + CycleAbort = false, + NeckingFailure = false, + EffectiveLoosening = false, + OverSpeed = false, + NoResidualTorque = false, + PositioningFail = false, + SnugMonLow = false, + SnugMonHigh = false, + DynamicMinCurrent = false, + DynamicMaxCurrent = false, + LatentResult = false, + Reserved = new byte[] + { + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + } + }, + StationId = 4294967295L, + StationName = "Station Name", + StartFinalAngle = 10m, + PostViewTorqueActivated = PostViewTorque.OnlyPVTHOn, + PostViewTorqueHigh = 6521.43m, + PostViewTorqueLow = 52.32m, + CurrentMonitoringAmpere = 1m, + CurrentMonitoringAmpereMin = 0.5m, + CurrentMonitoringAmpereMax = 1.5m + }); + } + + [TestMethod] + [TestCategory("Revision 10"), TestCategory("Pack")] + public void Mid0065PackRevision10() + { + string package = "04970065010 01012345678902AIRBAG 030001040020510060093807000008000009010011112013214115016217118000004189819001000200036021002502200223000215240010252500012266553527ABCDEFG-123 282019-01-05:09:00:05297300831Identifier result part 2 32Identifier result part 3 33Identifier result part 4 34E1243500510036000000004237429496729538Station Name 3900100040241652143420052324300100440005045001504600001470000148149-00205000100510012052003291530010055400011055009000"; + + AssertBuildAndParse(package, new Mid0065(10) + { + TighteningId = 123456789L, + VinNumber = "AIRBAG", + ParameterSetId = 2, + BatchCounter = 0, + TighteningStatus = false, + TorqueStatus = TighteningValueStatus.Ok, + AngleStatus = TighteningValueStatus.Low, + Torque = 10m, + Angle = 360, + Timestamp = new DateTime(2019, 1, 5, 9, 0, 5), + BatchStatus = BatchStatus.Nok, + JobId = 1, + Strategy = Strategy.RotateSpindleForward, + StrategyOptions = new StrategyOptions() + { + Torque = false, + Angle = true, + Batch = false, + PvtMonitoring = true, + PvtCompensate = false, + Selftap = true, + Rundown = false, + CM = true, + DsControl = true, + ClickWrench = true, + RbwMonitoring = false + }, + BatchSize = 0, + RundownAngleStatus = TighteningValueStatus.High, + CurrentMonitoringStatus = TighteningValueStatus.Ok, + SelftapStatus = TighteningValueStatus.Low, + PrevailTorqueMonitoringStatus = TighteningValueStatus.High, + PrevailTorqueCompensateStatus = TighteningValueStatus.Ok, + TighteningErrorStatus = new TighteningErrorStatus() + { + RundownAngleMaxShutOff = false, + RundownAngleMinShutOff = true, + TorqueMaxShutOff = false, + AngleMaxShutOff = true, + SelftapTorqueMaxShutOff = false, + SelftapTorqueMinShutOff = true, + PrevailTorqueMaxShutOff = false, + PrevailTorqueMinShutOff = true, + PrevailTorqueCompensateOverflow = true, + CurrentMonitoringMaxShutOff = true, + PostViewTorqueMinTorqueShutOff = false, + PostViewTorqueMaxTorqueShutOff = false, + PostViewTorqueAngleTooSmall = false, + TriggerLost = true, + TorqueLessThanTarget = false, + ToolHot = true, + MultistageAbort = false, + Rehit = false, + DsMeasureFailed = false, + CurrentLimitReached = false, + EndTimeOutShutOff = false, + RemoveFastenerLimitExceeded = false, + DisableDrive = false, + TransducerLost = false, + TransducerShorted = false, + TransducerCorrupt = false, + SyncTimeout = false, + DynamicCurrentMonitoringMin = false, + DynamicCurrentMonitoringMax = false, + AngleMaxMonitor = false, + YieldNutOff = false, + YieldTooFewSamples = false + }, + RundownAngle = 250, + CurrentMonitoringValue = 2, + SelftapTorque = 2.15m, + PrevailTorque = 10.25m, + JobSequenceNumber = 12, + SyncTighteningId = 65535, + ToolSerialNumber = "ABCDEFG-123", + TorqueValuesUnit = TorqueValuesUnit.Percentage, + ResultType = ResultType.ReferenceSetup, + IdentifierResultPart2 = "Identifier result part 2", + IdentifierResultPart3 = "Identifier result part 3", + IdentifierResultPart4 = "Identifier result part 4", + CustomerTighteningErrorCode = "E124", + PrevailTorqueCompensateValue = 51m, + TighteningErrorStatus2 = new TighteningErrorStatus2() + { + DriveDeactivated = false, + ToolStall = true, + DriveHot = false, + GradientMonitoringHigh = true, + GradientMonitoringLow = false, + ReactionBarFailed = true, + SnugMax = false, + CycleAbort = false, + NeckingFailure = false, + EffectiveLoosening = false, + OverSpeed = false, + NoResidualTorque = false, + PositioningFail = false, + SnugMonLow = false, + SnugMonHigh = false, + DynamicMinCurrent = false, + DynamicMaxCurrent = false, + LatentResult = false, + Reserved = new byte[] + { + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + } + }, + StationId = 4294967295L, + StationName = "Station Name", + StartFinalAngle = 10m, + PostViewTorqueActivated = PostViewTorque.OnlyPVTHOn, + PostViewTorqueHigh = 6521.43m, + PostViewTorqueLow = 52.32m, + CurrentMonitoringAmpere = 1m, + CurrentMonitoringAmpereMin = 0.5m, + CurrentMonitoringAmpereMax = 1.5m, + AngleNumeratorScaleFactor = 1, + AngleDenominatorScaleFactor = 1, + OverallAngleStatus = TighteningValueStatus.Ok, + OverallAngleMin = -20, + OverallAngleMax = 100, + OverallAngle = 120, + PeakTorque = 32.91m, + ResidualBreakawayTorque = 10.05m, + StartRundownAngle = 1.1m, + RundownAngleComplete = 90m + }); + } + + [TestMethod] + [TestCategory("Revision 11"), TestCategory("Pack")] + public void Mid0065PackRevision11() + { + string package = "05120065011 01012345678902AIRBAG 030001040020510060093807000008000009010011112013214115016217118000004189819001000200036021002502200223000215240010252500012266553527ABCDEFG-123 282019-01-05:09:00:05297300831Identifier result part 2 32Identifier result part 3 33Identifier result part 4 34E1243500510036000000004237429496729538Station Name 3900100040241652143420052324300100440005045001504600001470000148149-00205000100510012052003291530010055400011055009000560001205700001"; + + AssertBuildAndParse(package, new Mid0065(11) + { + TighteningId = 123456789L, + VinNumber = "AIRBAG", + ParameterSetId = 2, + BatchCounter = 0, + TighteningStatus = false, + TorqueStatus = TighteningValueStatus.Ok, + AngleStatus = TighteningValueStatus.Low, + Torque = 10m, + Angle = 360, + Timestamp = new DateTime(2019, 1, 5, 9, 0, 5), + BatchStatus = BatchStatus.Nok, + JobId = 1, + Strategy = Strategy.RotateSpindleForward, + StrategyOptions = new StrategyOptions() + { + Torque = false, + Angle = true, + Batch = false, + PvtMonitoring = true, + PvtCompensate = false, + Selftap = true, + Rundown = false, + CM = true, + DsControl = true, + ClickWrench = true, + RbwMonitoring = false + }, + BatchSize = 0, + RundownAngleStatus = TighteningValueStatus.High, + CurrentMonitoringStatus = TighteningValueStatus.Ok, + SelftapStatus = TighteningValueStatus.Low, + PrevailTorqueMonitoringStatus = TighteningValueStatus.High, + PrevailTorqueCompensateStatus = TighteningValueStatus.Ok, + TighteningErrorStatus = new TighteningErrorStatus() + { + RundownAngleMaxShutOff = false, + RundownAngleMinShutOff = true, + TorqueMaxShutOff = false, + AngleMaxShutOff = true, + SelftapTorqueMaxShutOff = false, + SelftapTorqueMinShutOff = true, + PrevailTorqueMaxShutOff = false, + PrevailTorqueMinShutOff = true, + PrevailTorqueCompensateOverflow = true, + CurrentMonitoringMaxShutOff = true, + PostViewTorqueMinTorqueShutOff = false, + PostViewTorqueMaxTorqueShutOff = false, + PostViewTorqueAngleTooSmall = false, + TriggerLost = true, + TorqueLessThanTarget = false, + ToolHot = true, + MultistageAbort = false, + Rehit = false, + DsMeasureFailed = false, + CurrentLimitReached = false, + EndTimeOutShutOff = false, + RemoveFastenerLimitExceeded = false, + DisableDrive = false, + TransducerLost = false, + TransducerShorted = false, + TransducerCorrupt = false, + SyncTimeout = false, + DynamicCurrentMonitoringMin = false, + DynamicCurrentMonitoringMax = false, + AngleMaxMonitor = false, + YieldNutOff = false, + YieldTooFewSamples = false + }, + RundownAngle = 250, + CurrentMonitoringValue = 2, + SelftapTorque = 2.15m, + PrevailTorque = 10.25m, + JobSequenceNumber = 12, + SyncTighteningId = 65535, + ToolSerialNumber = "ABCDEFG-123", + TorqueValuesUnit = TorqueValuesUnit.Percentage, + ResultType = ResultType.ReferenceSetup, + IdentifierResultPart2 = "Identifier result part 2", + IdentifierResultPart3 = "Identifier result part 3", + IdentifierResultPart4 = "Identifier result part 4", + CustomerTighteningErrorCode = "E124", + PrevailTorqueCompensateValue = 51m, + TighteningErrorStatus2 = new TighteningErrorStatus2() + { + DriveDeactivated = false, + ToolStall = true, + DriveHot = false, + GradientMonitoringHigh = true, + GradientMonitoringLow = false, + ReactionBarFailed = true, + SnugMax = false, + CycleAbort = false, + NeckingFailure = false, + EffectiveLoosening = false, + OverSpeed = false, + NoResidualTorque = false, + PositioningFail = false, + SnugMonLow = false, + SnugMonHigh = false, + DynamicMinCurrent = false, + DynamicMaxCurrent = false, + LatentResult = false, + Reserved = new byte[] + { + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + } + }, + StationId = 4294967295L, + StationName = "Station Name", + StartFinalAngle = 10m, + PostViewTorqueActivated = PostViewTorque.OnlyPVTHOn, + PostViewTorqueHigh = 6521.43m, + PostViewTorqueLow = 52.32m, + CurrentMonitoringAmpere = 1m, + CurrentMonitoringAmpereMin = 0.5m, + CurrentMonitoringAmpereMax = 1.5m, + AngleNumeratorScaleFactor = 1, + AngleDenominatorScaleFactor = 1, + OverallAngleStatus = TighteningValueStatus.Ok, + OverallAngleMin = -20, + OverallAngleMax = 100, + OverallAngle = 120, + PeakTorque = 32.91m, + ResidualBreakawayTorque = 10.05m, + StartRundownAngle = 1.1m, + RundownAngleComplete = 90m, + ClickTorque = 1.2m, + ClickAngle = 1 + }); + } } } diff --git a/src/MIDTesters.Core/Tightening/TestMid0066.cs b/src/MIDTesters.Core/Tightening/TestMid0066.cs index 028c59dd..b6970a94 100644 --- a/src/MIDTesters.Core/Tightening/TestMid0066.cs +++ b/src/MIDTesters.Core/Tightening/TestMid0066.cs @@ -1,6 +1,7 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenProtocolInterpreter.Tightening; +using OpenProtocolInterpreter; namespace MIDTesters.Tightening { [TestClass] @@ -15,7 +16,6 @@ public void Mid0066Revision1() var mid = _midInterpreter.Parse(package); Assert.AreEqual(typeof(Mid0066), mid.GetType()); - Assert.IsNotNull(mid.NumberOfOfflineResults); Assert.AreEqual(14, mid.NumberOfOfflineResults); AssertEqualPackages(package, mid); } @@ -29,7 +29,6 @@ public void Mid0066ByteRevision1() var mid = _midInterpreter.Parse(bytes); Assert.AreEqual(typeof(Mid0066), mid.GetType()); - Assert.IsNotNull(mid.NumberOfOfflineResults); Assert.AreEqual(14, mid.NumberOfOfflineResults); AssertEqualPackages(package, mid); } @@ -42,8 +41,6 @@ public void Mid0066Revision2() var mid = _midInterpreter.Parse(package); Assert.AreEqual(typeof(Mid0066), mid.GetType()); - Assert.IsNotNull(mid.NumberOfOfflineResults); - Assert.IsNotNull(mid.NumberOfOfflineCurves); Assert.AreEqual(14, mid.NumberOfOfflineResults); Assert.AreEqual(11, mid.NumberOfOfflineCurves); AssertEqualPackages(package, mid); @@ -58,11 +55,34 @@ public void Mid0066ByteRevision2() var mid = _midInterpreter.Parse(bytes); Assert.AreEqual(typeof(Mid0066), mid.GetType()); - Assert.IsNotNull(mid.NumberOfOfflineResults); - Assert.IsNotNull(mid.NumberOfOfflineCurves); Assert.AreEqual(14, mid.NumberOfOfflineResults); Assert.AreEqual(11, mid.NumberOfOfflineCurves); AssertEqualPackages(package, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0066PackRevision1() + { + string package = "00240066001 0114"; + + AssertBuildAndParse(package, new Mid0066() + { + NumberOfOfflineResults = 14 + }); + } + + [TestMethod] + [TestCategory("Revision 2"), TestCategory("Pack")] + public void Mid0066PackRevision2() + { + string package = "00300066002 0101402011"; + + AssertBuildAndParse(package, new Mid0066(new Header() { Mid = Mid0066.MID, Revision = 2 }) + { + NumberOfOfflineResults = 14, + NumberOfOfflineCurves = 11 + }); + } } } diff --git a/src/MIDTesters.Core/Tightening/TestMid0067.cs b/src/MIDTesters.Core/Tightening/TestMid0067.cs new file mode 100644 index 00000000..8ce79942 --- /dev/null +++ b/src/MIDTesters.Core/Tightening/TestMid0067.cs @@ -0,0 +1,167 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter.Communication; +using OpenProtocolInterpreter.Tightening; +using System; +using System.Collections.Generic; + +using OpenProtocolInterpreter; +namespace MIDTesters.Tightening +{ + [TestClass] + [TestCategory("Tightening")] + public class TestMid0067 : DefaultMidTests + { + [TestMethod] + [TestCategory("Revision 1"), TestCategory("ASCII")] + public void Mid0067Revision1() + { + string package = "00820067001 0200000000012018-04-25:10:23:45100000000022018-04-25:10:24:010"; + var mid = _midInterpreter.Parse(package); + + Assert.AreEqual(typeof(Mid0067), mid.GetType()); + Assert.AreEqual(2, mid.NumberOfResults); + Assert.AreEqual(2, mid.Results.Count); + + Assert.AreEqual(1, mid.Results[0].Index); + Assert.AreEqual(new DateTime(2018, 4, 25, 10, 23, 45), mid.Results[0].StartTime); + Assert.AreEqual(1, mid.Results[0].Status); + + Assert.AreEqual(2, mid.Results[1].Index); + Assert.AreEqual(new DateTime(2018, 4, 25, 10, 24, 1), mid.Results[1].StartTime); + Assert.AreEqual(0, mid.Results[1].Status); + + AssertEqualPackages(package, mid); + } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("ByteArray")] + public void Mid0067ByteRevision1() + { + string package = "00820067001 0200000000012018-04-25:10:23:45100000000022018-04-25:10:24:010"; + byte[] bytes = GetAsciiBytes(package); + var mid = _midInterpreter.Parse(bytes); + + Assert.AreEqual(typeof(Mid0067), mid.GetType()); + Assert.AreEqual(2, mid.NumberOfResults); + Assert.AreEqual(2, mid.Results.Count); + Assert.AreEqual(1, mid.Results[0].Index); + Assert.AreEqual(2, mid.Results[1].Index); + AssertEqualPackages(bytes, mid); + } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("ASCII")] + public void Mid0067EmptyListRevision1() + { + string package = "00220067001 00"; + var mid = _midInterpreter.Parse(package); + + Assert.AreEqual(0, mid.NumberOfResults); + Assert.AreEqual(0, mid.Results.Count); + AssertEqualPackages(package, mid); + } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0067PackRevision1() + { + string package = "00820067001 0200000000012018-04-25:10:23:45100000000022018-04-25:10:24:010"; + + AssertBuildAndParse(package, new Mid0067() + { + Results = new List() + { + new ResultData() + { + Index = 1, + StartTime = new DateTime(2018, 4, 25, 10, 23, 45), + Status = 1 + }, + new ResultData() + { + Index = 2, + StartTime = new DateTime(2018, 4, 25, 10, 24, 1), + Status = 0 + } + } + }); + } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0067PackEnforcesNumberOfResultsRevision1() + { + string package = "00520067001 0100000000012018-04-25:10:23:451"; + var mid = new Mid0067() + { + NumberOfResults = 99, //Overwritten by the actual list size while packing + Results = new List() + { + new ResultData() + { + Index = 1, + StartTime = new DateTime(2018, 4, 25, 10, 23, 45), + Status = 1 + } + } + }; + + Assert.AreEqual(package, mid.Pack()); + Assert.AreEqual(1, mid.NumberOfResults); + } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("ASCII")] + public void Mid0067ExtraDataRequestRevision1() + { + string package = "00420006001 0067001130000000001010"; + var mid = _midInterpreter.Parse(package); + + var extraData = _midInterpreter.ParseExtraData(mid); + + Assert.AreEqual(Mid0006.MID, mid.Header.Mid); + Assert.AreEqual(Mid0067.MID, mid.RequestedMid); + Assert.AreEqual(1, mid.WantedRevision); + Assert.AreEqual(13, mid.ExtraDataLength); + Assert.AreEqual(1, extraData.StartIndex); + Assert.AreEqual(10, extraData.Count); + AssertEqualPackages(package, mid); + } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("ByteArray")] + public void Mid0067ExtraDataRequestByteRevision1() + { + string package = "00420006001 0067001130000000001010"; + byte[] bytes = GetAsciiBytes(package); + var mid = _midInterpreter.Parse(bytes); + + var extraData = _midInterpreter.ParseExtraData(mid); + + Assert.AreEqual(Mid0067.MID, mid.RequestedMid); + Assert.AreEqual(13, mid.ExtraDataLength); + Assert.AreEqual(1, extraData.StartIndex); + Assert.AreEqual(10, extraData.Count); + AssertEqualPackages(bytes, mid); + } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0067ExtraDataRequestPackRevision1() + { + string package = "00420006001 0067001130000000001010"; + var mid = new Mid0006(); + + mid.SetExtraData(new Mid0067ExtraData() + { + StartIndex = 1, + Count = 10 + }); + + Assert.AreEqual(Mid0067.MID, mid.RequestedMid); + Assert.AreEqual(13, mid.ExtraDataLength); + Assert.AreEqual("0000000001010", mid.ExtraData); + AssertEqualPackages(package, mid); + } + } +} diff --git a/src/MIDTesters.Core/Tightening/TestMid0902.cs b/src/MIDTesters.Core/Tightening/TestMid0902.cs index 2817a036..1db9ac01 100644 --- a/src/MIDTesters.Core/Tightening/TestMid0902.cs +++ b/src/MIDTesters.Core/Tightening/TestMid0902.cs @@ -1,7 +1,10 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenProtocolInterpreter.Tightening; +using System; -namespace MIDTesters.Core.Tightening +using System.Collections.Generic; +using OpenProtocolInterpreter; +namespace MIDTesters.Tightening { [TestClass] [TestCategory("Tightening")] @@ -15,14 +18,14 @@ public void Mid0902Revision1() var mid = _midInterpreter.Parse(package); Assert.AreEqual(typeof(Mid0902), mid.GetType()); - Assert.AreNotEqual(0, mid.Capacity); - Assert.AreNotEqual(0, mid.OldestSequenceNumber); - Assert.IsNotNull(mid.OldestTime); - Assert.AreNotEqual(0, mid.NewestSequenceNumber); - Assert.IsNotNull(mid.NewestTime); - Assert.AreNotEqual(0, mid.NumberOfPIDs); + Assert.AreEqual(2134L, mid.Capacity); + Assert.AreEqual(1L, mid.OldestSequenceNumber); + Assert.AreEqual(new DateTime(2022, 12, 21, 13, 2, 33), mid.OldestTime); + Assert.AreEqual(5819L, mid.NewestSequenceNumber); + Assert.AreEqual(new DateTime(2023, 12, 10, 12, 28, 54), mid.NewestTime); + Assert.AreEqual(2, mid.NumberOfPIDs); Assert.IsNotNull(mid.VariableDataFields); - Assert.AreNotEqual(0, mid.VariableDataFields.Count); + Assert.AreEqual(2, mid.VariableDataFields.Count); AssertEqualPackages(package, mid); } @@ -35,15 +38,53 @@ public void Mid0902ByteRevision1() var mid = _midInterpreter.Parse(bytes); Assert.AreEqual(typeof(Mid0902), mid.GetType()); - Assert.AreNotEqual(0, mid.Capacity); - Assert.AreNotEqual(0, mid.OldestSequenceNumber); - Assert.IsNotNull(mid.OldestTime); - Assert.AreNotEqual(0, mid.NewestSequenceNumber); - Assert.IsNotNull(mid.NewestTime); - Assert.AreNotEqual(0, mid.NumberOfPIDs); + Assert.AreEqual(2134L, mid.Capacity); + Assert.AreEqual(1L, mid.OldestSequenceNumber); + Assert.AreEqual(new DateTime(2022, 12, 21, 13, 2, 33), mid.OldestTime); + Assert.AreEqual(5819L, mid.NewestSequenceNumber); + Assert.AreEqual(new DateTime(2023, 12, 10, 12, 28, 54), mid.NewestTime); + Assert.AreEqual(2, mid.NumberOfPIDs); Assert.IsNotNull(mid.VariableDataFields); - Assert.AreNotEqual(0, mid.VariableDataFields.Count); + Assert.AreEqual(2, mid.VariableDataFields.Count); AssertEqualPackages(package, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0902PackRevision1() + { + string package = "01450902001 000000213400000000012022-12-21:13:02:3300000058192023-12-10:12:28:54002000050010600000001000100190500000002023-11-09:18:48:14"; + + AssertBuildAndParse(package, new Mid0902() + { + Capacity = 2134L, + OldestSequenceNumber = 1L, + OldestTime = new DateTime(2022, 12, 21, 13, 2, 33), + NewestSequenceNumber = 5819L, + NewestTime = new DateTime(2023, 12, 10, 12, 28, 54), + NumberOfPIDs = 2, + VariableDataFields = new List() + { + new VariableDataField() + { + ParameterId = 5, + Length = 1, + DataType = DataTypeDefinition.Boolean, + Unit = DataUnitType.NoUnit, + StepNumber = 0, + DataValue = "1" + }, + new VariableDataField() + { + ParameterId = 10, + Length = 19, + DataType = DataTypeDefinition.Timestamp, + Unit = DataUnitType.NoUnit, + StepNumber = 0, + DataValue = "2023-11-09:18:48:14" + } + } + }); + } } } diff --git a/src/MIDTesters.Core/Time/TestMid0080.cs b/src/MIDTesters.Core/Time/TestMid0080.cs index 16cf6cf2..28c98094 100644 --- a/src/MIDTesters.Core/Time/TestMid0080.cs +++ b/src/MIDTesters.Core/Time/TestMid0080.cs @@ -29,5 +29,14 @@ public void Mid0080ByteAllRevisions() Assert.AreEqual(typeof(Mid0080), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Pack")] + public void Mid0080PackAllRevisions() + { + string package = "00200080 "; + + AssertBuildAndParse(package, new Mid0080(), true); + } } } diff --git a/src/MIDTesters.Core/Time/TestMid0081.cs b/src/MIDTesters.Core/Time/TestMid0081.cs index afab20a2..2709143e 100644 --- a/src/MIDTesters.Core/Time/TestMid0081.cs +++ b/src/MIDTesters.Core/Time/TestMid0081.cs @@ -1,5 +1,6 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenProtocolInterpreter.Time; +using System; namespace MIDTesters.Time { @@ -14,7 +15,7 @@ public void Mid0081Revision1() string pack = @"00390081 2017-12-01:20:12:45"; var mid = _midInterpreter.Parse(pack); - Assert.IsNotNull(mid.Time); + Assert.AreEqual(new DateTime(2017, 12, 1, 20, 12, 45), mid.Time); AssertEqualPackages(pack, mid, true); } @@ -26,8 +27,20 @@ public void Mid0081ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.Time); + Assert.AreEqual(new DateTime(2017, 12, 1, 20, 12, 45), mid.Time); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0081PackRevision1() + { + string package = "00390081 2017-12-01:20:12:45"; + + AssertBuildAndParse(package, new Mid0081() + { + Time = new DateTime(2017, 12, 1, 20, 12, 45) + }, true); + } } } diff --git a/src/MIDTesters.Core/Time/TestMid0082.cs b/src/MIDTesters.Core/Time/TestMid0082.cs index 52f34b36..3b50b4cf 100644 --- a/src/MIDTesters.Core/Time/TestMid0082.cs +++ b/src/MIDTesters.Core/Time/TestMid0082.cs @@ -1,5 +1,6 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenProtocolInterpreter.Time; +using System; namespace MIDTesters.Time { @@ -14,7 +15,7 @@ public void Mid0082Revision1() string pack = @"00390082 2017-12-01:20:12:45"; var mid = _midInterpreter.Parse(pack); - Assert.IsNotNull(mid.Time); + Assert.AreEqual(new DateTime(2017, 12, 1, 20, 12, 45), mid.Time); AssertEqualPackages(pack, mid, true); } @@ -26,8 +27,20 @@ public void Mid0082ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.Time); + Assert.AreEqual(new DateTime(2017, 12, 1, 20, 12, 45), mid.Time); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0082PackRevision1() + { + string package = "00390082 2017-12-01:20:12:45"; + + AssertBuildAndParse(package, new Mid0082() + { + Time = new DateTime(2017, 12, 1, 20, 12, 45) + }, true); + } } } diff --git a/src/MIDTesters.Core/Tool/TestMid0040.cs b/src/MIDTesters.Core/Tool/TestMid0040.cs index 7cf42ef5..8d1b718b 100644 --- a/src/MIDTesters.Core/Tool/TestMid0040.cs +++ b/src/MIDTesters.Core/Tool/TestMid0040.cs @@ -37,7 +37,7 @@ public void Mid0040Revisions6And7() string package = "00260040007 010001"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.ToolNumber); + Assert.AreEqual(1, mid.ToolNumber); AssertEqualPackages(package, mid); } @@ -49,8 +49,31 @@ public void Mid0040ByteRevisions6And7() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.ToolNumber); + Assert.AreEqual(1, mid.ToolNumber); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 4"), TestCategory("Pack")] + public void Mid0040PackRevisions1To5() + { + string package = "00200040004 "; + + AssertBuildAndParse(package, new Mid0040(4) + { + }); + } + + [TestMethod] + [TestCategory("Revision 7"), TestCategory("Pack")] + public void Mid0040PackRevisions6And7() + { + string package = "00260040007 010001"; + + AssertBuildAndParse(package, new Mid0040(7) + { + ToolNumber = 1 + }); + } } } diff --git a/src/MIDTesters.Core/Tool/TestMid0041.cs b/src/MIDTesters.Core/Tool/TestMid0041.cs index ce786c87..76257f6d 100644 --- a/src/MIDTesters.Core/Tool/TestMid0041.cs +++ b/src/MIDTesters.Core/Tool/TestMid0041.cs @@ -1,4 +1,6 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; using OpenProtocolInterpreter.Tool; namespace MIDTesters.Tool @@ -14,10 +16,10 @@ public void Mid0041Revision1() string package = "00810041001 01ABCDEFG-123456024294967295032017-12-01:20:12:4504GFEDCBA-10"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.ToolNumberOfTightenings); - Assert.IsNotNull(mid.LastCalibrationDate); - Assert.IsNotNull(mid.ControllerSerialNumber); + Assert.AreEqual("ABCDEFG-123456", mid.ToolSerialNumber.TrimEnd()); + Assert.AreEqual(4294967295L, mid.ToolNumberOfTightenings); + Assert.AreEqual(new DateTime(2017, 12, 1, 20, 12, 45), mid.LastCalibrationDate); + Assert.AreEqual("GFEDCBA-10", mid.ControllerSerialNumber.TrimEnd()); AssertEqualPackages(package, mid); } @@ -29,10 +31,10 @@ public void Mid0041ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.ToolNumberOfTightenings); - Assert.IsNotNull(mid.LastCalibrationDate); - Assert.IsNotNull(mid.ControllerSerialNumber); + Assert.AreEqual("ABCDEFG-123456", mid.ToolSerialNumber.TrimEnd()); + Assert.AreEqual(4294967295L, mid.ToolNumberOfTightenings); + Assert.AreEqual(new DateTime(2017, 12, 1, 20, 12, 45), mid.LastCalibrationDate); + Assert.AreEqual("GFEDCBA-10", mid.ControllerSerialNumber.TrimEnd()); AssertEqualPackages(bytes, mid); } @@ -43,20 +45,19 @@ public void Mid0041Revision2() string package = "01560041002 01ABCDEFG-123456024294967295032017-12-01:20:12:4504GFEDCBA-1005002000062018-06-04:10:12:45074284967295081009551011111Version 1.0.0 "; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.ToolNumberOfTightenings); - Assert.IsNotNull(mid.LastCalibrationDate); - Assert.IsNotNull(mid.ControllerSerialNumber); - Assert.IsNotNull(mid.CalibrationValue); - Assert.IsNotNull(mid.LastServiceDate); - Assert.IsNotNull(mid.TighteningsSinceService); - Assert.IsNotNull(mid.ToolType); - Assert.IsNotNull(mid.MotorSize); - Assert.IsNotNull(mid.OpenEndData); - Assert.IsNotNull(mid.OpenEndData.UseOpenEnd); - Assert.IsNotNull(mid.OpenEndData.TighteningDirection); - Assert.IsNotNull(mid.OpenEndData.MotorRotation); - Assert.IsNotNull(mid.ControllerSoftwareVersion); + Assert.AreEqual("ABCDEFG-123456", mid.ToolSerialNumber.TrimEnd()); + Assert.AreEqual(4294967295L, mid.ToolNumberOfTightenings); + Assert.AreEqual(new DateTime(2017, 12, 1, 20, 12, 45), mid.LastCalibrationDate); + Assert.AreEqual("GFEDCBA-10", mid.ControllerSerialNumber.TrimEnd()); + Assert.AreEqual(20.00m, mid.CalibrationValue); + Assert.AreEqual(new DateTime(2018, 6, 4, 10, 12, 45), mid.LastServiceDate); + Assert.AreEqual(4284967295L, mid.TighteningsSinceService); + Assert.AreEqual(ToolType.STB_Tool, mid.ToolType); + Assert.AreEqual(55, mid.MotorSize); + Assert.IsTrue(mid.OpenEndData.UseOpenEnd); + Assert.AreEqual(TighteningDirection.Counterclockwise, mid.OpenEndData.TighteningDirection); + Assert.AreEqual(MotorRotation.Inverted, mid.OpenEndData.MotorRotation); + Assert.AreEqual("Version 1.0.0", mid.ControllerSoftwareVersion.TrimEnd()); AssertEqualPackages(package, mid); } @@ -68,20 +69,19 @@ public void Mid0041ByteRevision2() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.ToolNumberOfTightenings); - Assert.IsNotNull(mid.LastCalibrationDate); - Assert.IsNotNull(mid.ControllerSerialNumber); - Assert.IsNotNull(mid.CalibrationValue); - Assert.IsNotNull(mid.LastServiceDate); - Assert.IsNotNull(mid.TighteningsSinceService); - Assert.IsNotNull(mid.ToolType); - Assert.IsNotNull(mid.MotorSize); - Assert.IsNotNull(mid.OpenEndData); - Assert.IsNotNull(mid.OpenEndData.UseOpenEnd); - Assert.IsNotNull(mid.OpenEndData.TighteningDirection); - Assert.IsNotNull(mid.OpenEndData.MotorRotation); - Assert.IsNotNull(mid.ControllerSoftwareVersion); + Assert.AreEqual("ABCDEFG-123456", mid.ToolSerialNumber.TrimEnd()); + Assert.AreEqual(4294967295L, mid.ToolNumberOfTightenings); + Assert.AreEqual(new DateTime(2017, 12, 1, 20, 12, 45), mid.LastCalibrationDate); + Assert.AreEqual("GFEDCBA-10", mid.ControllerSerialNumber.TrimEnd()); + Assert.AreEqual(20.00m, mid.CalibrationValue); + Assert.AreEqual(new DateTime(2018, 6, 4, 10, 12, 45), mid.LastServiceDate); + Assert.AreEqual(4284967295L, mid.TighteningsSinceService); + Assert.AreEqual(ToolType.STB_Tool, mid.ToolType); + Assert.AreEqual(55, mid.MotorSize); + Assert.IsTrue(mid.OpenEndData.UseOpenEnd); + Assert.AreEqual(TighteningDirection.Counterclockwise, mid.OpenEndData.TighteningDirection); + Assert.AreEqual(MotorRotation.Inverted, mid.OpenEndData.MotorRotation); + Assert.AreEqual("Version 1.0.0", mid.ControllerSoftwareVersion.TrimEnd()); AssertEqualPackages(bytes, mid); } @@ -92,23 +92,22 @@ public void Mid0041Revision3() string package = "01800041003 01ABCDEFG-123456024294967295032017-12-01:20:12:4504GFEDCBA-1005002000062018-06-04:10:12:45074284967295081009551011111Version 1.0.0 120006001300123014004000"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.ToolNumberOfTightenings); - Assert.IsNotNull(mid.LastCalibrationDate); - Assert.IsNotNull(mid.ControllerSerialNumber); - Assert.IsNotNull(mid.CalibrationValue); - Assert.IsNotNull(mid.LastServiceDate); - Assert.IsNotNull(mid.TighteningsSinceService); - Assert.IsNotNull(mid.ToolType); - Assert.IsNotNull(mid.MotorSize); - Assert.IsNotNull(mid.OpenEndData); - Assert.IsNotNull(mid.OpenEndData.UseOpenEnd); - Assert.IsNotNull(mid.OpenEndData.TighteningDirection); - Assert.IsNotNull(mid.OpenEndData.MotorRotation); - Assert.IsNotNull(mid.ControllerSoftwareVersion); - Assert.IsNotNull(mid.ToolMaxTorque); - Assert.IsNotNull(mid.GearRatio); - Assert.IsNotNull(mid.ToolFullSpeed); + Assert.AreEqual("ABCDEFG-123456", mid.ToolSerialNumber.TrimEnd()); + Assert.AreEqual(4294967295L, mid.ToolNumberOfTightenings); + Assert.AreEqual(new DateTime(2017, 12, 1, 20, 12, 45), mid.LastCalibrationDate); + Assert.AreEqual("GFEDCBA-10", mid.ControllerSerialNumber.TrimEnd()); + Assert.AreEqual(20.00m, mid.CalibrationValue); + Assert.AreEqual(new DateTime(2018, 6, 4, 10, 12, 45), mid.LastServiceDate); + Assert.AreEqual(4284967295L, mid.TighteningsSinceService); + Assert.AreEqual(ToolType.STB_Tool, mid.ToolType); + Assert.AreEqual(55, mid.MotorSize); + Assert.IsTrue(mid.OpenEndData.UseOpenEnd); + Assert.AreEqual(TighteningDirection.Counterclockwise, mid.OpenEndData.TighteningDirection); + Assert.AreEqual(MotorRotation.Inverted, mid.OpenEndData.MotorRotation); + Assert.AreEqual("Version 1.0.0", mid.ControllerSoftwareVersion.TrimEnd()); + Assert.AreEqual(6.00m, mid.ToolMaxTorque); + Assert.AreEqual(12.30m, mid.GearRatio); + Assert.AreEqual(40.00m, mid.ToolFullSpeed); AssertEqualPackages(package, mid); } @@ -120,23 +119,22 @@ public void Mid0041ByteRevision3() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.ToolNumberOfTightenings); - Assert.IsNotNull(mid.LastCalibrationDate); - Assert.IsNotNull(mid.ControllerSerialNumber); - Assert.IsNotNull(mid.CalibrationValue); - Assert.IsNotNull(mid.LastServiceDate); - Assert.IsNotNull(mid.TighteningsSinceService); - Assert.IsNotNull(mid.ToolType); - Assert.IsNotNull(mid.MotorSize); - Assert.IsNotNull(mid.OpenEndData); - Assert.IsNotNull(mid.OpenEndData.UseOpenEnd); - Assert.IsNotNull(mid.OpenEndData.TighteningDirection); - Assert.IsNotNull(mid.OpenEndData.MotorRotation); - Assert.IsNotNull(mid.ControllerSoftwareVersion); - Assert.IsNotNull(mid.ToolMaxTorque); - Assert.IsNotNull(mid.GearRatio); - Assert.IsNotNull(mid.ToolFullSpeed); + Assert.AreEqual("ABCDEFG-123456", mid.ToolSerialNumber.TrimEnd()); + Assert.AreEqual(4294967295L, mid.ToolNumberOfTightenings); + Assert.AreEqual(new DateTime(2017, 12, 1, 20, 12, 45), mid.LastCalibrationDate); + Assert.AreEqual("GFEDCBA-10", mid.ControllerSerialNumber.TrimEnd()); + Assert.AreEqual(20.00m, mid.CalibrationValue); + Assert.AreEqual(new DateTime(2018, 6, 4, 10, 12, 45), mid.LastServiceDate); + Assert.AreEqual(4284967295L, mid.TighteningsSinceService); + Assert.AreEqual(ToolType.STB_Tool, mid.ToolType); + Assert.AreEqual(55, mid.MotorSize); + Assert.IsTrue(mid.OpenEndData.UseOpenEnd); + Assert.AreEqual(TighteningDirection.Counterclockwise, mid.OpenEndData.TighteningDirection); + Assert.AreEqual(MotorRotation.Inverted, mid.OpenEndData.MotorRotation); + Assert.AreEqual("Version 1.0.0", mid.ControllerSoftwareVersion.TrimEnd()); + Assert.AreEqual(6.00m, mid.ToolMaxTorque); + Assert.AreEqual(12.30m, mid.GearRatio); + Assert.AreEqual(40.00m, mid.ToolFullSpeed); AssertEqualPackages(bytes, mid); } @@ -147,24 +145,23 @@ public void Mid0041Revision4() string package = "01840041004 01ABCDEFG-123456024294967295032017-12-01:20:12:4504GFEDCBA-1005002000062018-06-04:10:12:45074284967295081009551011111Version 1.0.0 1200060013001230140040001503"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.ToolNumberOfTightenings); - Assert.IsNotNull(mid.LastCalibrationDate); - Assert.IsNotNull(mid.ControllerSerialNumber); - Assert.IsNotNull(mid.CalibrationValue); - Assert.IsNotNull(mid.LastServiceDate); - Assert.IsNotNull(mid.TighteningsSinceService); - Assert.IsNotNull(mid.ToolType); - Assert.IsNotNull(mid.MotorSize); - Assert.IsNotNull(mid.OpenEndData); - Assert.IsNotNull(mid.OpenEndData.UseOpenEnd); - Assert.IsNotNull(mid.OpenEndData.TighteningDirection); - Assert.IsNotNull(mid.OpenEndData.MotorRotation); - Assert.IsNotNull(mid.ControllerSoftwareVersion); - Assert.IsNotNull(mid.ToolMaxTorque); - Assert.IsNotNull(mid.GearRatio); - Assert.IsNotNull(mid.ToolFullSpeed); - Assert.IsNotNull(mid.PrimaryTool); + Assert.AreEqual("ABCDEFG-123456", mid.ToolSerialNumber.TrimEnd()); + Assert.AreEqual(4294967295L, mid.ToolNumberOfTightenings); + Assert.AreEqual(new DateTime(2017, 12, 1, 20, 12, 45), mid.LastCalibrationDate); + Assert.AreEqual("GFEDCBA-10", mid.ControllerSerialNumber.TrimEnd()); + Assert.AreEqual(20.00m, mid.CalibrationValue); + Assert.AreEqual(new DateTime(2018, 6, 4, 10, 12, 45), mid.LastServiceDate); + Assert.AreEqual(4284967295L, mid.TighteningsSinceService); + Assert.AreEqual(ToolType.STB_Tool, mid.ToolType); + Assert.AreEqual(55, mid.MotorSize); + Assert.IsTrue(mid.OpenEndData.UseOpenEnd); + Assert.AreEqual(TighteningDirection.Counterclockwise, mid.OpenEndData.TighteningDirection); + Assert.AreEqual(MotorRotation.Inverted, mid.OpenEndData.MotorRotation); + Assert.AreEqual("Version 1.0.0", mid.ControllerSoftwareVersion.TrimEnd()); + Assert.AreEqual(6.00m, mid.ToolMaxTorque); + Assert.AreEqual(12.30m, mid.GearRatio); + Assert.AreEqual(40.00m, mid.ToolFullSpeed); + Assert.AreEqual(PrimaryTool.IRC_W, mid.PrimaryTool); AssertEqualPackages(package, mid); } @@ -176,24 +173,23 @@ public void Mid0041ByteRevision4() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.ToolNumberOfTightenings); - Assert.IsNotNull(mid.LastCalibrationDate); - Assert.IsNotNull(mid.ControllerSerialNumber); - Assert.IsNotNull(mid.CalibrationValue); - Assert.IsNotNull(mid.LastServiceDate); - Assert.IsNotNull(mid.TighteningsSinceService); - Assert.IsNotNull(mid.ToolType); - Assert.IsNotNull(mid.MotorSize); - Assert.IsNotNull(mid.OpenEndData); - Assert.IsNotNull(mid.OpenEndData.UseOpenEnd); - Assert.IsNotNull(mid.OpenEndData.TighteningDirection); - Assert.IsNotNull(mid.OpenEndData.MotorRotation); - Assert.IsNotNull(mid.ControllerSoftwareVersion); - Assert.IsNotNull(mid.ToolMaxTorque); - Assert.IsNotNull(mid.GearRatio); - Assert.IsNotNull(mid.ToolFullSpeed); - Assert.IsNotNull(mid.PrimaryTool); + Assert.AreEqual("ABCDEFG-123456", mid.ToolSerialNumber.TrimEnd()); + Assert.AreEqual(4294967295L, mid.ToolNumberOfTightenings); + Assert.AreEqual(new DateTime(2017, 12, 1, 20, 12, 45), mid.LastCalibrationDate); + Assert.AreEqual("GFEDCBA-10", mid.ControllerSerialNumber.TrimEnd()); + Assert.AreEqual(20.00m, mid.CalibrationValue); + Assert.AreEqual(new DateTime(2018, 6, 4, 10, 12, 45), mid.LastServiceDate); + Assert.AreEqual(4284967295L, mid.TighteningsSinceService); + Assert.AreEqual(ToolType.STB_Tool, mid.ToolType); + Assert.AreEqual(55, mid.MotorSize); + Assert.IsTrue(mid.OpenEndData.UseOpenEnd); + Assert.AreEqual(TighteningDirection.Counterclockwise, mid.OpenEndData.TighteningDirection); + Assert.AreEqual(MotorRotation.Inverted, mid.OpenEndData.MotorRotation); + Assert.AreEqual("Version 1.0.0", mid.ControllerSoftwareVersion.TrimEnd()); + Assert.AreEqual(6.00m, mid.ToolMaxTorque); + Assert.AreEqual(12.30m, mid.GearRatio); + Assert.AreEqual(40.00m, mid.ToolFullSpeed); + Assert.AreEqual(PrimaryTool.IRC_W, mid.PrimaryTool); AssertEqualPackages(bytes, mid); } @@ -204,25 +200,24 @@ public void Mid0041Revision5() string package = "01980041005 01ABCDEFG-123456024294967295032017-12-01:20:12:4504GFEDCBA-1005002000062018-06-04:10:12:45074284967295081009551011111Version 1.0.0 120006001300123014004000150316Tool Model "; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.ToolNumberOfTightenings); - Assert.IsNotNull(mid.LastCalibrationDate); - Assert.IsNotNull(mid.ControllerSerialNumber); - Assert.IsNotNull(mid.CalibrationValue); - Assert.IsNotNull(mid.LastServiceDate); - Assert.IsNotNull(mid.TighteningsSinceService); - Assert.IsNotNull(mid.ToolType); - Assert.IsNotNull(mid.MotorSize); - Assert.IsNotNull(mid.OpenEndData); - Assert.IsNotNull(mid.OpenEndData.UseOpenEnd); - Assert.IsNotNull(mid.OpenEndData.TighteningDirection); - Assert.IsNotNull(mid.OpenEndData.MotorRotation); - Assert.IsNotNull(mid.ControllerSoftwareVersion); - Assert.IsNotNull(mid.ToolMaxTorque); - Assert.IsNotNull(mid.GearRatio); - Assert.IsNotNull(mid.ToolFullSpeed); - Assert.IsNotNull(mid.PrimaryTool); - Assert.IsNotNull(mid.ToolModel); + Assert.AreEqual("ABCDEFG-123456", mid.ToolSerialNumber.TrimEnd()); + Assert.AreEqual(4294967295L, mid.ToolNumberOfTightenings); + Assert.AreEqual(new DateTime(2017, 12, 1, 20, 12, 45), mid.LastCalibrationDate); + Assert.AreEqual("GFEDCBA-10", mid.ControllerSerialNumber.TrimEnd()); + Assert.AreEqual(20.00m, mid.CalibrationValue); + Assert.AreEqual(new DateTime(2018, 6, 4, 10, 12, 45), mid.LastServiceDate); + Assert.AreEqual(4284967295L, mid.TighteningsSinceService); + Assert.AreEqual(ToolType.STB_Tool, mid.ToolType); + Assert.AreEqual(55, mid.MotorSize); + Assert.IsTrue(mid.OpenEndData.UseOpenEnd); + Assert.AreEqual(TighteningDirection.Counterclockwise, mid.OpenEndData.TighteningDirection); + Assert.AreEqual(MotorRotation.Inverted, mid.OpenEndData.MotorRotation); + Assert.AreEqual("Version 1.0.0", mid.ControllerSoftwareVersion.TrimEnd()); + Assert.AreEqual(6.00m, mid.ToolMaxTorque); + Assert.AreEqual(12.30m, mid.GearRatio); + Assert.AreEqual(40.00m, mid.ToolFullSpeed); + Assert.AreEqual(PrimaryTool.IRC_W, mid.PrimaryTool); + Assert.AreEqual("Tool Model", mid.ToolModel.TrimEnd()); AssertEqualPackages(package, mid); } @@ -234,25 +229,24 @@ public void Mid0041ByteRevision5() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.ToolNumberOfTightenings); - Assert.IsNotNull(mid.LastCalibrationDate); - Assert.IsNotNull(mid.ControllerSerialNumber); - Assert.IsNotNull(mid.CalibrationValue); - Assert.IsNotNull(mid.LastServiceDate); - Assert.IsNotNull(mid.TighteningsSinceService); - Assert.IsNotNull(mid.ToolType); - Assert.IsNotNull(mid.MotorSize); - Assert.IsNotNull(mid.OpenEndData); - Assert.IsNotNull(mid.OpenEndData.UseOpenEnd); - Assert.IsNotNull(mid.OpenEndData.TighteningDirection); - Assert.IsNotNull(mid.OpenEndData.MotorRotation); - Assert.IsNotNull(mid.ControllerSoftwareVersion); - Assert.IsNotNull(mid.ToolMaxTorque); - Assert.IsNotNull(mid.GearRatio); - Assert.IsNotNull(mid.ToolFullSpeed); - Assert.IsNotNull(mid.PrimaryTool); - Assert.IsNotNull(mid.ToolModel); + Assert.AreEqual("ABCDEFG-123456", mid.ToolSerialNumber.TrimEnd()); + Assert.AreEqual(4294967295L, mid.ToolNumberOfTightenings); + Assert.AreEqual(new DateTime(2017, 12, 1, 20, 12, 45), mid.LastCalibrationDate); + Assert.AreEqual("GFEDCBA-10", mid.ControllerSerialNumber.TrimEnd()); + Assert.AreEqual(20.00m, mid.CalibrationValue); + Assert.AreEqual(new DateTime(2018, 6, 4, 10, 12, 45), mid.LastServiceDate); + Assert.AreEqual(4284967295L, mid.TighteningsSinceService); + Assert.AreEqual(ToolType.STB_Tool, mid.ToolType); + Assert.AreEqual(55, mid.MotorSize); + Assert.IsTrue(mid.OpenEndData.UseOpenEnd); + Assert.AreEqual(TighteningDirection.Counterclockwise, mid.OpenEndData.TighteningDirection); + Assert.AreEqual(MotorRotation.Inverted, mid.OpenEndData.MotorRotation); + Assert.AreEqual("Version 1.0.0", mid.ControllerSoftwareVersion.TrimEnd()); + Assert.AreEqual(6.00m, mid.ToolMaxTorque); + Assert.AreEqual(12.30m, mid.GearRatio); + Assert.AreEqual(40.00m, mid.ToolFullSpeed); + Assert.AreEqual(PrimaryTool.IRC_W, mid.PrimaryTool); + Assert.AreEqual("Tool Model", mid.ToolModel.TrimEnd()); AssertEqualPackages(bytes, mid); } @@ -263,27 +257,26 @@ public void Mid0041Revision6() string package = "02360041006 01ABCDEFG-123456024294967295032017-12-01:20:12:4504GFEDCBA-1005002000062018-06-04:10:12:45074284967295081009551011111Version 1.0.0 120006001300123014004000150316Tool Model 17000118Tool Article Number "; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.ToolNumberOfTightenings); - Assert.IsNotNull(mid.LastCalibrationDate); - Assert.IsNotNull(mid.ControllerSerialNumber); - Assert.IsNotNull(mid.CalibrationValue); - Assert.IsNotNull(mid.LastServiceDate); - Assert.IsNotNull(mid.TighteningsSinceService); - Assert.IsNotNull(mid.ToolType); - Assert.IsNotNull(mid.MotorSize); - Assert.IsNotNull(mid.OpenEndData); - Assert.IsNotNull(mid.OpenEndData.UseOpenEnd); - Assert.IsNotNull(mid.OpenEndData.TighteningDirection); - Assert.IsNotNull(mid.OpenEndData.MotorRotation); - Assert.IsNotNull(mid.ControllerSoftwareVersion); - Assert.IsNotNull(mid.ToolMaxTorque); - Assert.IsNotNull(mid.GearRatio); - Assert.IsNotNull(mid.ToolFullSpeed); - Assert.IsNotNull(mid.PrimaryTool); - Assert.IsNotNull(mid.ToolModel); - Assert.IsNotNull(mid.ToolNumber); - Assert.IsNotNull(mid.ToolArticleNumber); + Assert.AreEqual("ABCDEFG-123456", mid.ToolSerialNumber.TrimEnd()); + Assert.AreEqual(4294967295L, mid.ToolNumberOfTightenings); + Assert.AreEqual(new DateTime(2017, 12, 1, 20, 12, 45), mid.LastCalibrationDate); + Assert.AreEqual("GFEDCBA-10", mid.ControllerSerialNumber.TrimEnd()); + Assert.AreEqual(20.00m, mid.CalibrationValue); + Assert.AreEqual(new DateTime(2018, 6, 4, 10, 12, 45), mid.LastServiceDate); + Assert.AreEqual(4284967295L, mid.TighteningsSinceService); + Assert.AreEqual(ToolType.STB_Tool, mid.ToolType); + Assert.AreEqual(55, mid.MotorSize); + Assert.IsTrue(mid.OpenEndData.UseOpenEnd); + Assert.AreEqual(TighteningDirection.Counterclockwise, mid.OpenEndData.TighteningDirection); + Assert.AreEqual(MotorRotation.Inverted, mid.OpenEndData.MotorRotation); + Assert.AreEqual("Version 1.0.0", mid.ControllerSoftwareVersion.TrimEnd()); + Assert.AreEqual(6.00m, mid.ToolMaxTorque); + Assert.AreEqual(12.30m, mid.GearRatio); + Assert.AreEqual(40.00m, mid.ToolFullSpeed); + Assert.AreEqual(PrimaryTool.IRC_W, mid.PrimaryTool); + Assert.AreEqual("Tool Model", mid.ToolModel.TrimEnd()); + Assert.AreEqual(1, mid.ToolNumber); + Assert.AreEqual("Tool Article Number", mid.ToolArticleNumber.TrimEnd()); AssertEqualPackages(package, mid); } @@ -295,27 +288,26 @@ public void Mid0041ByteRevision6() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.ToolNumberOfTightenings); - Assert.IsNotNull(mid.LastCalibrationDate); - Assert.IsNotNull(mid.ControllerSerialNumber); - Assert.IsNotNull(mid.CalibrationValue); - Assert.IsNotNull(mid.LastServiceDate); - Assert.IsNotNull(mid.TighteningsSinceService); - Assert.IsNotNull(mid.ToolType); - Assert.IsNotNull(mid.MotorSize); - Assert.IsNotNull(mid.OpenEndData); - Assert.IsNotNull(mid.OpenEndData.UseOpenEnd); - Assert.IsNotNull(mid.OpenEndData.TighteningDirection); - Assert.IsNotNull(mid.OpenEndData.MotorRotation); - Assert.IsNotNull(mid.ControllerSoftwareVersion); - Assert.IsNotNull(mid.ToolMaxTorque); - Assert.IsNotNull(mid.GearRatio); - Assert.IsNotNull(mid.ToolFullSpeed); - Assert.IsNotNull(mid.PrimaryTool); - Assert.IsNotNull(mid.ToolModel); - Assert.IsNotNull(mid.ToolNumber); - Assert.IsNotNull(mid.ToolArticleNumber); + Assert.AreEqual("ABCDEFG-123456", mid.ToolSerialNumber.TrimEnd()); + Assert.AreEqual(4294967295L, mid.ToolNumberOfTightenings); + Assert.AreEqual(new DateTime(2017, 12, 1, 20, 12, 45), mid.LastCalibrationDate); + Assert.AreEqual("GFEDCBA-10", mid.ControllerSerialNumber.TrimEnd()); + Assert.AreEqual(20.00m, mid.CalibrationValue); + Assert.AreEqual(new DateTime(2018, 6, 4, 10, 12, 45), mid.LastServiceDate); + Assert.AreEqual(4284967295L, mid.TighteningsSinceService); + Assert.AreEqual(ToolType.STB_Tool, mid.ToolType); + Assert.AreEqual(55, mid.MotorSize); + Assert.IsTrue(mid.OpenEndData.UseOpenEnd); + Assert.AreEqual(TighteningDirection.Counterclockwise, mid.OpenEndData.TighteningDirection); + Assert.AreEqual(MotorRotation.Inverted, mid.OpenEndData.MotorRotation); + Assert.AreEqual("Version 1.0.0", mid.ControllerSoftwareVersion.TrimEnd()); + Assert.AreEqual(6.00m, mid.ToolMaxTorque); + Assert.AreEqual(12.30m, mid.GearRatio); + Assert.AreEqual(40.00m, mid.ToolFullSpeed); + Assert.AreEqual(PrimaryTool.IRC_W, mid.PrimaryTool); + Assert.AreEqual("Tool Model", mid.ToolModel.TrimEnd()); + Assert.AreEqual(1, mid.ToolNumber); + Assert.AreEqual("Tool Article Number", mid.ToolArticleNumber.TrimEnd()); AssertEqualPackages(bytes, mid); } @@ -326,30 +318,29 @@ public void Mid0041Revision7() string package = "02600041007 01ABCDEFG-123456024294967295032017-12-01:20:12:4504GFEDCBA-1005002000062018-06-04:10:12:45074284967295081009551011111Version 1.0.0 120006001300123014004000150316Tool Model 17000118Tool Article Number 190010002003200021013000"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.ToolNumberOfTightenings); - Assert.IsNotNull(mid.LastCalibrationDate); - Assert.IsNotNull(mid.ControllerSerialNumber); - Assert.IsNotNull(mid.CalibrationValue); - Assert.IsNotNull(mid.LastServiceDate); - Assert.IsNotNull(mid.TighteningsSinceService); - Assert.IsNotNull(mid.ToolType); - Assert.IsNotNull(mid.MotorSize); - Assert.IsNotNull(mid.OpenEndData); - Assert.IsNotNull(mid.OpenEndData.UseOpenEnd); - Assert.IsNotNull(mid.OpenEndData.TighteningDirection); - Assert.IsNotNull(mid.OpenEndData.MotorRotation); - Assert.IsNotNull(mid.ControllerSoftwareVersion); - Assert.IsNotNull(mid.ToolMaxTorque); - Assert.IsNotNull(mid.GearRatio); - Assert.IsNotNull(mid.ToolFullSpeed); - Assert.IsNotNull(mid.PrimaryTool); - Assert.IsNotNull(mid.ToolModel); - Assert.IsNotNull(mid.ToolNumber); - Assert.IsNotNull(mid.ToolArticleNumber); - Assert.IsNotNull(mid.RundownMinSpeed); - Assert.IsNotNull(mid.DownshiftMaxSpeed); - Assert.IsNotNull(mid.DownshiftMinSpeed); + Assert.AreEqual("ABCDEFG-123456", mid.ToolSerialNumber.TrimEnd()); + Assert.AreEqual(4294967295L, mid.ToolNumberOfTightenings); + Assert.AreEqual(new DateTime(2017, 12, 1, 20, 12, 45), mid.LastCalibrationDate); + Assert.AreEqual("GFEDCBA-10", mid.ControllerSerialNumber.TrimEnd()); + Assert.AreEqual(20.00m, mid.CalibrationValue); + Assert.AreEqual(new DateTime(2018, 6, 4, 10, 12, 45), mid.LastServiceDate); + Assert.AreEqual(4284967295L, mid.TighteningsSinceService); + Assert.AreEqual(ToolType.STB_Tool, mid.ToolType); + Assert.AreEqual(55, mid.MotorSize); + Assert.IsTrue(mid.OpenEndData.UseOpenEnd); + Assert.AreEqual(TighteningDirection.Counterclockwise, mid.OpenEndData.TighteningDirection); + Assert.AreEqual(MotorRotation.Inverted, mid.OpenEndData.MotorRotation); + Assert.AreEqual("Version 1.0.0", mid.ControllerSoftwareVersion.TrimEnd()); + Assert.AreEqual(6.00m, mid.ToolMaxTorque); + Assert.AreEqual(12.30m, mid.GearRatio); + Assert.AreEqual(40.00m, mid.ToolFullSpeed); + Assert.AreEqual(PrimaryTool.IRC_W, mid.PrimaryTool); + Assert.AreEqual("Tool Model", mid.ToolModel.TrimEnd()); + Assert.AreEqual(1, mid.ToolNumber); + Assert.AreEqual("Tool Article Number", mid.ToolArticleNumber.TrimEnd()); + Assert.AreEqual(10.00m, mid.RundownMinSpeed); + Assert.AreEqual(320.00m, mid.DownshiftMaxSpeed); + Assert.AreEqual(130.00m, mid.DownshiftMinSpeed); AssertEqualPackages(package, mid); } @@ -361,31 +352,236 @@ public void Mid0041ByteRevision7() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.ToolSerialNumber); - Assert.IsNotNull(mid.ToolNumberOfTightenings); - Assert.IsNotNull(mid.LastCalibrationDate); - Assert.IsNotNull(mid.ControllerSerialNumber); - Assert.IsNotNull(mid.CalibrationValue); - Assert.IsNotNull(mid.LastServiceDate); - Assert.IsNotNull(mid.TighteningsSinceService); - Assert.IsNotNull(mid.ToolType); - Assert.IsNotNull(mid.MotorSize); - Assert.IsNotNull(mid.OpenEndData); - Assert.IsNotNull(mid.OpenEndData.UseOpenEnd); - Assert.IsNotNull(mid.OpenEndData.TighteningDirection); - Assert.IsNotNull(mid.OpenEndData.MotorRotation); - Assert.IsNotNull(mid.ControllerSoftwareVersion); - Assert.IsNotNull(mid.ToolMaxTorque); - Assert.IsNotNull(mid.GearRatio); - Assert.IsNotNull(mid.ToolFullSpeed); - Assert.IsNotNull(mid.PrimaryTool); - Assert.IsNotNull(mid.ToolModel); - Assert.IsNotNull(mid.ToolNumber); - Assert.IsNotNull(mid.ToolArticleNumber); - Assert.IsNotNull(mid.RundownMinSpeed); - Assert.IsNotNull(mid.DownshiftMaxSpeed); - Assert.IsNotNull(mid.DownshiftMinSpeed); + Assert.AreEqual("ABCDEFG-123456", mid.ToolSerialNumber.TrimEnd()); + Assert.AreEqual(4294967295L, mid.ToolNumberOfTightenings); + Assert.AreEqual(new DateTime(2017, 12, 1, 20, 12, 45), mid.LastCalibrationDate); + Assert.AreEqual("GFEDCBA-10", mid.ControllerSerialNumber.TrimEnd()); + Assert.AreEqual(20.00m, mid.CalibrationValue); + Assert.AreEqual(new DateTime(2018, 6, 4, 10, 12, 45), mid.LastServiceDate); + Assert.AreEqual(4284967295L, mid.TighteningsSinceService); + Assert.AreEqual(ToolType.STB_Tool, mid.ToolType); + Assert.AreEqual(55, mid.MotorSize); + Assert.IsTrue(mid.OpenEndData.UseOpenEnd); + Assert.AreEqual(TighteningDirection.Counterclockwise, mid.OpenEndData.TighteningDirection); + Assert.AreEqual(MotorRotation.Inverted, mid.OpenEndData.MotorRotation); + Assert.AreEqual("Version 1.0.0", mid.ControllerSoftwareVersion.TrimEnd()); + Assert.AreEqual(6.00m, mid.ToolMaxTorque); + Assert.AreEqual(12.30m, mid.GearRatio); + Assert.AreEqual(40.00m, mid.ToolFullSpeed); + Assert.AreEqual(PrimaryTool.IRC_W, mid.PrimaryTool); + Assert.AreEqual("Tool Model", mid.ToolModel.TrimEnd()); + Assert.AreEqual(1, mid.ToolNumber); + Assert.AreEqual("Tool Article Number", mid.ToolArticleNumber.TrimEnd()); + Assert.AreEqual(10.00m, mid.RundownMinSpeed); + Assert.AreEqual(320.00m, mid.DownshiftMaxSpeed); + Assert.AreEqual(130.00m, mid.DownshiftMinSpeed); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0041PackRevision1() + { + string package = "00810041001 01ABCDEFG-123456024294967295032017-12-01:20:12:4504GFEDCBA-10"; + + AssertBuildAndParse(package, new Mid0041(1) + { + ToolSerialNumber = "ABCDEFG-123456", + ToolNumberOfTightenings = 4294967295L, + LastCalibrationDate = new DateTime(2017, 12, 1, 20, 12, 45), + ControllerSerialNumber = "GFEDCBA-10" + }); + } + + [TestMethod] + [TestCategory("Revision 2"), TestCategory("Pack")] + public void Mid0041PackRevision2() + { + string package = "01560041002 01ABCDEFG-123456024294967295032017-12-01:20:12:4504GFEDCBA-1005002000062018-06-04:10:12:45074284967295081009551011111Version 1.0.0 "; + + AssertBuildAndParse(package, new Mid0041(2) + { + ToolSerialNumber = "ABCDEFG-123456", + ToolNumberOfTightenings = 4294967295L, + LastCalibrationDate = new DateTime(2017, 12, 1, 20, 12, 45), + ControllerSerialNumber = "GFEDCBA-10", + CalibrationValue = 20m, + LastServiceDate = new DateTime(2018, 6, 4, 10, 12, 45), + TighteningsSinceService = 4284967295L, + ToolType = ToolType.STB_Tool, + MotorSize = 55, + OpenEndData = new OpenEndData() + { + UseOpenEnd = true, + TighteningDirection = TighteningDirection.Counterclockwise, + MotorRotation = MotorRotation.Inverted + }, + ControllerSoftwareVersion = "Version 1.0.0" + }); + } + + [TestMethod] + [TestCategory("Revision 3"), TestCategory("Pack")] + public void Mid0041PackRevision3() + { + string package = "01800041003 01ABCDEFG-123456024294967295032017-12-01:20:12:4504GFEDCBA-1005002000062018-06-04:10:12:45074284967295081009551011111Version 1.0.0 120006001300123014004000"; + + AssertBuildAndParse(package, new Mid0041(3) + { + ToolSerialNumber = "ABCDEFG-123456", + ToolNumberOfTightenings = 4294967295L, + LastCalibrationDate = new DateTime(2017, 12, 1, 20, 12, 45), + ControllerSerialNumber = "GFEDCBA-10", + CalibrationValue = 20m, + LastServiceDate = new DateTime(2018, 6, 4, 10, 12, 45), + TighteningsSinceService = 4284967295L, + ToolType = ToolType.STB_Tool, + MotorSize = 55, + OpenEndData = new OpenEndData() + { + UseOpenEnd = true, + TighteningDirection = TighteningDirection.Counterclockwise, + MotorRotation = MotorRotation.Inverted + }, + ControllerSoftwareVersion = "Version 1.0.0", + ToolMaxTorque = 6m, + GearRatio = 12.3m, + ToolFullSpeed = 40m + }); + } + + [TestMethod] + [TestCategory("Revision 4"), TestCategory("Pack")] + public void Mid0041PackRevision4() + { + string package = "01840041004 01ABCDEFG-123456024294967295032017-12-01:20:12:4504GFEDCBA-1005002000062018-06-04:10:12:45074284967295081009551011111Version 1.0.0 1200060013001230140040001503"; + + AssertBuildAndParse(package, new Mid0041(4) + { + ToolSerialNumber = "ABCDEFG-123456", + ToolNumberOfTightenings = 4294967295L, + LastCalibrationDate = new DateTime(2017, 12, 1, 20, 12, 45), + ControllerSerialNumber = "GFEDCBA-10", + CalibrationValue = 20m, + LastServiceDate = new DateTime(2018, 6, 4, 10, 12, 45), + TighteningsSinceService = 4284967295L, + ToolType = ToolType.STB_Tool, + MotorSize = 55, + OpenEndData = new OpenEndData() + { + UseOpenEnd = true, + TighteningDirection = TighteningDirection.Counterclockwise, + MotorRotation = MotorRotation.Inverted + }, + ControllerSoftwareVersion = "Version 1.0.0", + ToolMaxTorque = 6m, + GearRatio = 12.3m, + ToolFullSpeed = 40m, + PrimaryTool = PrimaryTool.IRC_W + }); + } + + [TestMethod] + [TestCategory("Revision 5"), TestCategory("Pack")] + public void Mid0041PackRevision5() + { + string package = "01980041005 01ABCDEFG-123456024294967295032017-12-01:20:12:4504GFEDCBA-1005002000062018-06-04:10:12:45074284967295081009551011111Version 1.0.0 120006001300123014004000150316Tool Model "; + + AssertBuildAndParse(package, new Mid0041(5) + { + ToolSerialNumber = "ABCDEFG-123456", + ToolNumberOfTightenings = 4294967295L, + LastCalibrationDate = new DateTime(2017, 12, 1, 20, 12, 45), + ControllerSerialNumber = "GFEDCBA-10", + CalibrationValue = 20m, + LastServiceDate = new DateTime(2018, 6, 4, 10, 12, 45), + TighteningsSinceService = 4284967295L, + ToolType = ToolType.STB_Tool, + MotorSize = 55, + OpenEndData = new OpenEndData() + { + UseOpenEnd = true, + TighteningDirection = TighteningDirection.Counterclockwise, + MotorRotation = MotorRotation.Inverted + }, + ControllerSoftwareVersion = "Version 1.0.0", + ToolMaxTorque = 6m, + GearRatio = 12.3m, + ToolFullSpeed = 40m, + PrimaryTool = PrimaryTool.IRC_W, + ToolModel = "Tool Model" + }); + } + + [TestMethod] + [TestCategory("Revision 6"), TestCategory("Pack")] + public void Mid0041PackRevision6() + { + string package = "02360041006 01ABCDEFG-123456024294967295032017-12-01:20:12:4504GFEDCBA-1005002000062018-06-04:10:12:45074284967295081009551011111Version 1.0.0 120006001300123014004000150316Tool Model 17000118Tool Article Number "; + + AssertBuildAndParse(package, new Mid0041(6) + { + ToolSerialNumber = "ABCDEFG-123456", + ToolNumberOfTightenings = 4294967295L, + LastCalibrationDate = new DateTime(2017, 12, 1, 20, 12, 45), + ControllerSerialNumber = "GFEDCBA-10", + CalibrationValue = 20m, + LastServiceDate = new DateTime(2018, 6, 4, 10, 12, 45), + TighteningsSinceService = 4284967295L, + ToolType = ToolType.STB_Tool, + MotorSize = 55, + OpenEndData = new OpenEndData() + { + UseOpenEnd = true, + TighteningDirection = TighteningDirection.Counterclockwise, + MotorRotation = MotorRotation.Inverted + }, + ControllerSoftwareVersion = "Version 1.0.0", + ToolMaxTorque = 6m, + GearRatio = 12.3m, + ToolFullSpeed = 40m, + PrimaryTool = PrimaryTool.IRC_W, + ToolModel = "Tool Model", + ToolNumber = 1, + ToolArticleNumber = "Tool Article Number" + }); + } + + [TestMethod] + [TestCategory("Revision 7"), TestCategory("Pack")] + public void Mid0041PackRevision7() + { + string package = "02600041007 01ABCDEFG-123456024294967295032017-12-01:20:12:4504GFEDCBA-1005002000062018-06-04:10:12:45074284967295081009551011111Version 1.0.0 120006001300123014004000150316Tool Model 17000118Tool Article Number 190010002003200021013000"; + + AssertBuildAndParse(package, new Mid0041(7) + { + ToolSerialNumber = "ABCDEFG-123456", + ToolNumberOfTightenings = 4294967295L, + LastCalibrationDate = new DateTime(2017, 12, 1, 20, 12, 45), + ControllerSerialNumber = "GFEDCBA-10", + CalibrationValue = 20m, + LastServiceDate = new DateTime(2018, 6, 4, 10, 12, 45), + TighteningsSinceService = 4284967295L, + ToolType = ToolType.STB_Tool, + MotorSize = 55, + OpenEndData = new OpenEndData() + { + UseOpenEnd = true, + TighteningDirection = TighteningDirection.Counterclockwise, + MotorRotation = MotorRotation.Inverted + }, + ControllerSoftwareVersion = "Version 1.0.0", + ToolMaxTorque = 6m, + GearRatio = 12.3m, + ToolFullSpeed = 40m, + PrimaryTool = PrimaryTool.IRC_W, + ToolModel = "Tool Model", + ToolNumber = 1, + ToolArticleNumber = "Tool Article Number", + RundownMinSpeed = 10m, + DownshiftMaxSpeed = 320m, + DownshiftMinSpeed = 130m + }); + } } } diff --git a/src/MIDTesters.Core/Tool/TestMid0042.cs b/src/MIDTesters.Core/Tool/TestMid0042.cs index 23532aa9..eeec966b 100644 --- a/src/MIDTesters.Core/Tool/TestMid0042.cs +++ b/src/MIDTesters.Core/Tool/TestMid0042.cs @@ -1,4 +1,5 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; using OpenProtocolInterpreter.Tool; namespace MIDTesters.Tool @@ -37,8 +38,8 @@ public void Mid0042Revision2() string package = "00300042002 0100420201"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.ToolNumber); - Assert.IsNotNull(mid.DisableType); + Assert.AreEqual(42, mid.ToolNumber); + Assert.AreEqual(DisableType.InhibitNok, mid.DisableType); AssertEqualPackages(package, mid); } @@ -50,9 +51,31 @@ public void Mid0042ByteRevision2() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.ToolNumber); - Assert.IsNotNull(mid.DisableType); + Assert.AreEqual(42, mid.ToolNumber); + Assert.AreEqual(DisableType.Disable, mid.DisableType); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0042PackRevision1() + { + string package = "00200042 "; + + AssertBuildAndParse(package, new Mid0042(1), true); + } + + [TestMethod] + [TestCategory("Revision 2"), TestCategory("Pack")] + public void Mid0042PackRevision2() + { + string package = "00300042002 0100420200"; + + AssertBuildAndParse(package, new Mid0042(2) + { + ToolNumber = 42, + DisableType = DisableType.Disable + }); + } } } diff --git a/src/MIDTesters.Core/Tool/TestMid0043.cs b/src/MIDTesters.Core/Tool/TestMid0043.cs index 353b2892..1ac61e60 100644 --- a/src/MIDTesters.Core/Tool/TestMid0043.cs +++ b/src/MIDTesters.Core/Tool/TestMid0043.cs @@ -37,7 +37,7 @@ public void Mid0043Revision2() string package = "00260043002 010042"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.ToolNumber); + Assert.AreEqual(42, mid.ToolNumber); AssertEqualPackages(package, mid); } @@ -49,8 +49,29 @@ public void Mid0043ByteRevision2() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.ToolNumber); + Assert.AreEqual(32, mid.ToolNumber); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0043PackRevision1() + { + string package = "00200043 "; + + AssertBuildAndParse(package, new Mid0043(1), true); + } + + [TestMethod] + [TestCategory("Revision 2"), TestCategory("Pack")] + public void Mid0043PackRevision2() + { + string package = "00260043002 010032"; + + AssertBuildAndParse(package, new Mid0043(2) + { + ToolNumber = 32 + }); + } } } diff --git a/src/MIDTesters.Core/Tool/TestMid0044.cs b/src/MIDTesters.Core/Tool/TestMid0044.cs index 48a9fe2a..6d0ffd98 100644 --- a/src/MIDTesters.Core/Tool/TestMid0044.cs +++ b/src/MIDTesters.Core/Tool/TestMid0044.cs @@ -29,5 +29,14 @@ public void Mid0044ByteAllRevisions() Assert.AreEqual(typeof(Mid0044), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Pack")] + public void Mid0044PackAllRevisions() + { + string package = "00200044 "; + + AssertBuildAndParse(package, new Mid0044(), true); + } } } diff --git a/src/MIDTesters.Core/Tool/TestMid0045.cs b/src/MIDTesters.Core/Tool/TestMid0045.cs index 6f456dd3..625b952c 100644 --- a/src/MIDTesters.Core/Tool/TestMid0045.cs +++ b/src/MIDTesters.Core/Tool/TestMid0045.cs @@ -1,4 +1,5 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; using OpenProtocolInterpreter.Tool; namespace MIDTesters.Tool @@ -14,8 +15,8 @@ public void Mid0045Revision1() string package = "00310045 01402003000"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.CalibrationValueUnit); - Assert.IsNotNull(mid.CalibrationValue); + Assert.AreEqual(CalibrationUnit.Kpm, mid.CalibrationValueUnit); + Assert.AreEqual(30.00m, mid.CalibrationValue); AssertEqualPackages(package, mid, true); } @@ -27,8 +28,8 @@ public void Mid0045ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.CalibrationValueUnit); - Assert.IsNotNull(mid.CalibrationValue); + Assert.AreEqual(CalibrationUnit.Kpm, mid.CalibrationValueUnit); + Assert.AreEqual(30.00m, mid.CalibrationValue); AssertEqualPackages(bytes, mid, true); } @@ -40,9 +41,9 @@ public void Mid0045Revision2() var mid = _midInterpreter.Parse(package); Assert.AreEqual(typeof(Mid0045), mid.GetType()); - Assert.IsNotNull(mid.CalibrationValueUnit); - Assert.IsNotNull(mid.CalibrationValue); - Assert.IsNotNull(mid.ChannelNumber); + Assert.AreEqual(CalibrationUnit.Kpm, mid.CalibrationValueUnit); + Assert.AreEqual(30.00m, mid.CalibrationValue); + Assert.AreEqual(1, mid.ChannelNumber); AssertEqualPackages(package, mid); } @@ -55,10 +56,37 @@ public void Mid0045ByteRevision2() var mid = _midInterpreter.Parse(bytes); Assert.AreEqual(typeof(Mid0045), mid.GetType()); - Assert.IsNotNull(mid.CalibrationValueUnit); - Assert.IsNotNull(mid.CalibrationValue); - Assert.IsNotNull(mid.ChannelNumber); + Assert.AreEqual(CalibrationUnit.Kpm, mid.CalibrationValueUnit); + Assert.AreEqual(30.00m, mid.CalibrationValue); + Assert.AreEqual(2, mid.ChannelNumber); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0045PackRevision1() + { + string package = "00310045 01402003000"; + + AssertBuildAndParse(package, new Mid0045(1) + { + CalibrationValueUnit = CalibrationUnit.Kpm, + CalibrationValue = 30 + }, true); + } + + [TestMethod] + [TestCategory("Revision 2"), TestCategory("Pack")] + public void Mid0045PackRevision2() + { + string package = "00350045002 014020030000301"; + + AssertBuildAndParse(package, new Mid0045(2) + { + CalibrationValueUnit = CalibrationUnit.Kpm, + CalibrationValue = 30, + ChannelNumber = 1 + }); + } } } diff --git a/src/MIDTesters.Core/Tool/TestMid0046.cs b/src/MIDTesters.Core/Tool/TestMid0046.cs index d5677b6a..4ad59ee7 100644 --- a/src/MIDTesters.Core/Tool/TestMid0046.cs +++ b/src/MIDTesters.Core/Tool/TestMid0046.cs @@ -1,4 +1,5 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; using OpenProtocolInterpreter.Tool; namespace MIDTesters.Tool @@ -14,7 +15,7 @@ public void Mid0046Revision1() string package = "00240046001 0102"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.PrimaryTool); + Assert.AreEqual(PrimaryTool.IRC_B, mid.PrimaryTool); AssertEqualPackages(package, mid); } @@ -26,8 +27,20 @@ public void Mid0046ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.PrimaryTool); + Assert.AreEqual(PrimaryTool.IRC_B, mid.PrimaryTool); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0046PackRevision1() + { + string package = "00240046001 0102"; + + AssertBuildAndParse(package, new Mid0046() + { + PrimaryTool = PrimaryTool.IRC_B + }); + } } } diff --git a/src/MIDTesters.Core/Tool/TestMid0047.cs b/src/MIDTesters.Core/Tool/TestMid0047.cs index 6d2d33de..ccb329c7 100644 --- a/src/MIDTesters.Core/Tool/TestMid0047.cs +++ b/src/MIDTesters.Core/Tool/TestMid0047.cs @@ -1,4 +1,5 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; using OpenProtocolInterpreter.Tool; namespace MIDTesters.Tool @@ -14,7 +15,7 @@ public void Mid0047Revision1() string package = "00240047001 0103"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.PairingHandlingType); + Assert.AreEqual(PairingHandlingType.FetchLatestPairingStatus, mid.PairingHandlingType); AssertEqualPackages(package, mid); } @@ -26,8 +27,20 @@ public void Mid0047ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.PairingHandlingType); + Assert.AreEqual(PairingHandlingType.FetchLatestPairingStatus, mid.PairingHandlingType); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0047PackRevision1() + { + string package = "00240047001 0103"; + + AssertBuildAndParse(package, new Mid0047() + { + PairingHandlingType = PairingHandlingType.FetchLatestPairingStatus + }); + } } } diff --git a/src/MIDTesters.Core/Tool/TestMid0048.cs b/src/MIDTesters.Core/Tool/TestMid0048.cs index 5e037e4d..c5d30e64 100644 --- a/src/MIDTesters.Core/Tool/TestMid0048.cs +++ b/src/MIDTesters.Core/Tool/TestMid0048.cs @@ -1,4 +1,6 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter; using OpenProtocolInterpreter.Tool; namespace MIDTesters.Tool @@ -14,8 +16,8 @@ public void Mid0048Revision1() string package = "00450048001 0107022017-12-01:20:12:45"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.PairingStatus); - Assert.IsNotNull(mid.TimeStamp); + Assert.AreEqual(PairingStatus.Denied, mid.PairingStatus); + Assert.AreEqual(new DateTime(2017, 12, 1, 20, 12, 45), mid.TimeStamp); AssertEqualPackages(package, mid); } @@ -27,9 +29,22 @@ public void Mid0047ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.PairingStatus); - Assert.IsNotNull(mid.TimeStamp); + Assert.AreEqual(PairingStatus.Denied, mid.PairingStatus); + Assert.AreEqual(new DateTime(2017, 12, 1, 20, 12, 45), mid.TimeStamp); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0048PackRevision1() + { + string package = "00450048001 0107022017-12-01:20:12:45"; + + AssertBuildAndParse(package, new Mid0048() + { + PairingStatus = PairingStatus.Denied, + TimeStamp = new DateTime(2017, 12, 1, 20, 12, 45) + }); + } } } diff --git a/src/MIDTesters.Core/Tool/TestMid0701.cs b/src/MIDTesters.Core/Tool/TestMid0701.cs index 7ef77579..9feeceaf 100644 --- a/src/MIDTesters.Core/Tool/TestMid0701.cs +++ b/src/MIDTesters.Core/Tool/TestMid0701.cs @@ -1,6 +1,7 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenProtocolInterpreter.Tool; +using System.Collections.Generic; namespace MIDTesters.Tool { [TestClass] @@ -14,8 +15,8 @@ public void Mid0701Revision1() string package = "02110701001 0020001Tool 1 Serial number Tool 1 Model Name Tool 1 Model Article Number 0002Tool 2 Serial number Tool 2 Model Name Tool 2 Model Article Number "; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.Tools); - Assert.AreNotEqual(0, mid.TotalTools); + Assert.AreEqual(2, mid.Tools.Count); + Assert.AreEqual(2, mid.TotalTools); AssertEqualPackages(package, mid); } @@ -27,9 +28,38 @@ public void Mid0701ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.Tools); - Assert.AreNotEqual(0, mid.TotalTools); + Assert.AreEqual(2, mid.Tools.Count); + Assert.AreEqual(2, mid.TotalTools); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0701PackRevision1() + { + string package = "02110701001 0020001Tool 1 Serial number Tool 1 Model Name Tool 1 Model Article Number 0002Tool 2 Serial number Tool 2 Model Name Tool 2 Model Article Number "; + + AssertBuildAndParse(package, new Mid0701() + { + TotalTools = 2, + Tools = new List() + { + new ToolData() + { + Number = 1, + SerialNumber = "Tool 1 Serial number", + ModelName = "Tool 1 Model Name", + ModelArticleNumber = "Tool 1 Model Article Number" + }, + new ToolData() + { + Number = 2, + SerialNumber = "Tool 2 Serial number", + ModelName = "Tool 2 Model Name", + ModelArticleNumber = "Tool 2 Model Article Number" + } + } + }); + } } } diff --git a/src/MIDTesters.Core/Tool/TestMid0702.cs b/src/MIDTesters.Core/Tool/TestMid0702.cs index 140a885e..4c2999b7 100644 --- a/src/MIDTesters.Core/Tool/TestMid0702.cs +++ b/src/MIDTesters.Core/Tool/TestMid0702.cs @@ -1,7 +1,10 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter.Communication; using OpenProtocolInterpreter.Tool; -namespace MIDTesters.Core.Tool +using OpenProtocolInterpreter; +using System.Collections.Generic; +namespace MIDTesters.Tool { [TestClass] [TestCategory("Tool")] @@ -9,29 +12,103 @@ public class TestMid0702 : DefaultMidTests { [TestMethod] [TestCategory("Revision 1"), TestCategory("ASCII")] - public void Mid0701Revision1() + public void Mid0702Revision1() { - string package = "01050702001 0100400301200012040000000QST50-150CTT01202012040000000SERIALNUMBER0120300201000000011"; + string package = "01000702001 00301200012040000000QST50-150CTT01202012040000000SERIALNUMBER0120300201000000011"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.ToolDataUpload); - Assert.AreEqual(3, mid.NumberOfToolParameters); - Assert.AreEqual(40, mid.ToolNumber); + Assert.AreEqual(3, mid.ToolDataUpload.Count); + Assert.AreEqual(3, mid.NumberOfToolPIDs); AssertEqualPackages(package, mid); } [TestMethod] [TestCategory("Revision 1"), TestCategory("ByteArray")] - public void Mid0701ByteRevision1() + public void Mid0702ByteRevision1() { - string package = "01050702001 0100400301200012040000000QST50-150CTT01202012040000000SERIALNUMBER0120300201000000011"; + string package = "01000702001 00301200012040000000QST50-150CTT01202012040000000SERIALNUMBER0120300201000000011"; byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.ToolDataUpload); - Assert.AreEqual(3, mid.NumberOfToolParameters); - Assert.AreEqual(40, mid.ToolNumber); + Assert.AreEqual(3, mid.ToolDataUpload.Count); + Assert.AreEqual(3, mid.NumberOfToolPIDs); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("ASCII")] + public void Mid0702ExtraDataRequestRevision1() + { + string package = "00350006001 070200106010003"; + var mid = _midInterpreter.Parse(package); + + var extraData = _midInterpreter.ParseExtraData(mid); + Assert.AreEqual(Mid0006.MID, mid.Header.Mid); + Assert.AreEqual(Mid0702.MID, mid.RequestedMid); + Assert.AreEqual(1, mid.WantedRevision); + Assert.AreEqual(6, mid.ExtraDataLength); + Assert.AreEqual(3, extraData.ToolNumber); + AssertEqualPackages(package, mid); + } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("ByteArray")] + public void Mid0702ExtraDataRequestByteRevision1() + { + string package = "00350006001 070200106010003"; + byte[] bytes = GetAsciiBytes(package); + var mid = _midInterpreter.Parse(bytes); + + var extraData = _midInterpreter.ParseExtraData(mid); + + Assert.AreEqual(Mid0702.MID, mid.RequestedMid); + Assert.AreEqual(1, mid.WantedRevision); + Assert.AreEqual(6, mid.ExtraDataLength); + Assert.AreEqual(3, extraData.ToolNumber); + AssertEqualPackages(bytes, mid); + } + + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0702PackRevision1() + { + string package = "01000702001 00301200012040000000QST50-150CTT01202012040000000SERIALNUMBER0120300201000000011"; + + AssertBuildAndParse(package, new Mid0702() + { + NumberOfToolPIDs = 3, + ToolDataUpload = new List() + { + new VariableDataField() + { + ParameterId = 1200, + Length = 12, + DataType = DataTypeDefinition.String, + Unit = DataUnitType.NoUnit, + StepNumber = 0, + DataValue = "QST50-150CTT" + }, + new VariableDataField() + { + ParameterId = 1202, + Length = 12, + DataType = DataTypeDefinition.String, + Unit = DataUnitType.NoUnit, + StepNumber = 0, + DataValue = "SERIALNUMBER" + }, + new VariableDataField() + { + ParameterId = 1203, + Length = 2, + DataType = DataTypeDefinition.UnsignedInteger, + Unit = DataUnitType.NoUnit, + StepNumber = 0, + DataValue = "11" + } + } + }); + } } } diff --git a/src/MIDTesters.Core/Tool/TestMid0703.cs b/src/MIDTesters.Core/Tool/TestMid0703.cs index 1f7be974..89914c27 100644 --- a/src/MIDTesters.Core/Tool/TestMid0703.cs +++ b/src/MIDTesters.Core/Tool/TestMid0703.cs @@ -1,7 +1,9 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenProtocolInterpreter.Tool; -namespace MIDTesters.Core.Tool +using System.Collections.Generic; +using OpenProtocolInterpreter; +namespace MIDTesters.Tool { [TestClass] [TestCategory("Tool")] @@ -9,12 +11,12 @@ public class TestMid0703 : DefaultMidTests { [TestMethod] [TestCategory("Revision 1"), TestCategory("ASCII")] - public void Mid0701Revision1() + public void Mid0703Revision1() { string package = "01050703001 0100400301200012040000000QST50-150CTT01202012040000000SERIALNUMBER0120300201000000011"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.CalibrationParameters); + Assert.AreEqual(3, mid.CalibrationParameters.Count); Assert.AreEqual(3, mid.NumberOfCalibrationParameters); Assert.AreEqual(40, mid.ToolNumber); AssertEqualPackages(package, mid); @@ -22,16 +24,59 @@ public void Mid0701Revision1() [TestMethod] [TestCategory("Revision 1"), TestCategory("ByteArray")] - public void Mid0701ByteRevision1() + public void Mid0703ByteRevision1() { string package = "01050703001 0100400301200012040000000QST50-150CTT01202012040000000SERIALNUMBER0120300201000000011"; byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.CalibrationParameters); + Assert.AreEqual(3, mid.CalibrationParameters.Count); Assert.AreEqual(3, mid.NumberOfCalibrationParameters); Assert.AreEqual(40, mid.ToolNumber); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0703PackRevision1() + { + string package = "01050703001 0100400301200012040000000QST50-150CTT01202012040000000SERIALNUMBER0120300201000000011"; + + AssertBuildAndParse(package, new Mid0703() + { + ToolNumber = 40, + NumberOfCalibrationParameters = 3, + CalibrationParameters = new List() + { + new VariableDataField() + { + ParameterId = 1200, + Length = 12, + DataType = DataTypeDefinition.String, + Unit = DataUnitType.NoUnit, + StepNumber = 0, + DataValue = "QST50-150CTT" + }, + new VariableDataField() + { + ParameterId = 1202, + Length = 12, + DataType = DataTypeDefinition.String, + Unit = DataUnitType.NoUnit, + StepNumber = 0, + DataValue = "SERIALNUMBER" + }, + new VariableDataField() + { + ParameterId = 1203, + Length = 2, + DataType = DataTypeDefinition.UnsignedInteger, + Unit = DataUnitType.NoUnit, + StepNumber = 0, + DataValue = "11" + } + } + }); + } } } diff --git a/src/MIDTesters.Core/Tool/TestMid0704.cs b/src/MIDTesters.Core/Tool/TestMid0704.cs index 09fc5eb5..4adefce8 100644 --- a/src/MIDTesters.Core/Tool/TestMid0704.cs +++ b/src/MIDTesters.Core/Tool/TestMid0704.cs @@ -1,7 +1,10 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenProtocolInterpreter.Communication; using OpenProtocolInterpreter.Tool; +using System.Collections.Generic; -namespace MIDTesters.Core.Tool +using OpenProtocolInterpreter; +namespace MIDTesters.Tool { [TestClass] [TestCategory("Tool")] @@ -14,9 +17,8 @@ public void Mid0704Revision1() string package = "00700704001 00201200012040000000QST50-150CTT012150010200000003"; var mid = _midInterpreter.Parse(package); - Assert.AreNotEqual(0, mid.NumberOfDataFields); - Assert.IsNotNull(mid.VariableDataFields); - Assert.AreNotEqual(0, mid.VariableDataFields.Count); + Assert.AreEqual(2, mid.NumberOfDataFields); + Assert.AreEqual(2, mid.VariableDataFields.Count); AssertEqualPackages(package, mid); } @@ -28,10 +30,222 @@ public void Mid0704ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.AreNotEqual(0, mid.NumberOfDataFields); - Assert.IsNotNull(mid.VariableDataFields); - Assert.AreNotEqual(0, mid.VariableDataFields.Count); + Assert.AreEqual(2, mid.NumberOfDataFields); + Assert.AreEqual(2, mid.VariableDataFields.Count); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("ASCII")] + public void Mid0704ExtraDataRequestRevision1() + { + string package = "00480006001 0704001190001002001213001215"; + var mid = _midInterpreter.Parse(package); + + var extraData = _midInterpreter.ParseExtraData(mid); + + Assert.AreEqual(Mid0006.MID, mid.Header.Mid); + Assert.AreEqual(Mid0704.MID, mid.RequestedMid); + Assert.AreEqual(1, mid.WantedRevision); + Assert.AreEqual(19, mid.ExtraDataLength); + Assert.AreEqual(1, extraData.ToolNumber); + Assert.AreEqual(2, extraData.TotalRequestedPIDs); + Assert.AreEqual(2, extraData.RequestedPIDs.Count); + Assert.AreEqual(1213, extraData.RequestedPIDs[0]); + Assert.AreEqual(1215, extraData.RequestedPIDs[1]); + AssertEqualPackages(package, mid); + } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("ByteArray")] + public void Mid0704ExtraDataRequestByteRevision1() + { + string package = "00480006001 0704001190001002001213001215"; + byte[] bytes = GetAsciiBytes(package); + var mid = _midInterpreter.Parse(bytes); + + var extraData = _midInterpreter.ParseExtraData(mid); + + Assert.AreEqual(Mid0704.MID, mid.RequestedMid); + Assert.AreEqual(19, mid.ExtraDataLength); + Assert.AreEqual(1, extraData.ToolNumber); + Assert.AreEqual(2, extraData.TotalRequestedPIDs); + Assert.AreEqual(2, extraData.RequestedPIDs.Count); + Assert.AreEqual(1213, extraData.RequestedPIDs[0]); + Assert.AreEqual(1215, extraData.RequestedPIDs[1]); + AssertEqualPackages(bytes, mid); + } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0704ExtraDataRequestPackRevision1() + { + string package = "00480006001 0704001190001002001213001215"; + var mid = new Mid0006(); + + mid.SetExtraData(new Mid0704ExtraDataRequest(1) + { + ToolNumber = 1, + RequestedPIDs = new List() { 1213, 1215 } + }); + + Assert.AreEqual(Mid0704.MID, mid.RequestedMid); + Assert.AreEqual(19, mid.ExtraDataLength); + Assert.AreEqual("0001002001213001215", mid.ExtraData); + AssertEqualPackages(package, mid); + } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("ASCII")] + public void Mid0704ExtraDataSubscriptionRevision1() + { + string package = "00540008001 0704001250001002001213005001215000"; + var mid = _midInterpreter.Parse(package); + + var extraData = _midInterpreter.ParseExtraData(mid); + + Assert.AreEqual(Mid0008.MID, mid.Header.Mid); + Assert.AreEqual(Mid0704.MID, mid.SubscriptionMid); + Assert.AreEqual(1, mid.WantedRevision); + Assert.AreEqual(25, mid.ExtraDataLength); + Assert.AreEqual(1, extraData.ToolNumber); + Assert.AreEqual(2, extraData.NumberOfPIDs); + Assert.AreEqual(2, extraData.PIDRestrictions.Count); + Assert.AreEqual(1213, extraData.PIDRestrictions[0].PID); + Assert.AreEqual(5, extraData.PIDRestrictions[0].Restriction); + Assert.AreEqual(1215, extraData.PIDRestrictions[1].PID); + Assert.AreEqual(0, extraData.PIDRestrictions[1].Restriction); + AssertEqualPackages(package, mid); + } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("ByteArray")] + public void Mid0704ExtraDataSubscriptionByteRevision1() + { + string package = "00540008001 0704001250001002001213005001215000"; + byte[] bytes = GetAsciiBytes(package); + var mid = _midInterpreter.Parse(bytes); + + var extraData = _midInterpreter.ParseExtraData(mid); + + Assert.AreEqual(Mid0704.MID, mid.SubscriptionMid); + Assert.AreEqual(25, mid.ExtraDataLength); + Assert.AreEqual(1, extraData.ToolNumber); + Assert.AreEqual(2, extraData.NumberOfPIDs); + Assert.AreEqual(2, extraData.PIDRestrictions.Count); + Assert.AreEqual(1213, extraData.PIDRestrictions[0].PID); + Assert.AreEqual(5, extraData.PIDRestrictions[0].Restriction); + Assert.AreEqual(1215, extraData.PIDRestrictions[1].PID); + Assert.AreEqual(0, extraData.PIDRestrictions[1].Restriction); + AssertEqualPackages(bytes, mid); + } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0704ExtraDataSubscriptionPackRevision1() + { + string package = "00540008001 0704001250001002001213005001215000"; + var mid = new Mid0008(); + + mid.SetExtraData(new Mid0704ExtraDataSubscription(1) + { + ToolNumber = 1, + PIDRestrictions = new List() + { + new PIDRestriction(1213, 5), + new PIDRestriction(1215, 0) + } + }); + + Assert.AreEqual(Mid0704.MID, mid.SubscriptionMid); + Assert.AreEqual(25, mid.ExtraDataLength); + Assert.AreEqual("0001002001213005001215000", mid.ExtraData); + AssertEqualPackages(package, mid); + } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("ASCII")] + public void Mid0704ExtraDataUnsubscriptionRevision1() + { + string package = "00330009001 0704001040001"; + var mid = _midInterpreter.Parse(package); + + var extraData = _midInterpreter.ParseExtraData(mid); + + Assert.AreEqual(Mid0009.MID, mid.Header.Mid); + Assert.AreEqual(Mid0704.MID, mid.UnsubscriptionMid); + Assert.AreEqual(1, mid.ExtraDataRevision); + Assert.AreEqual(4, mid.ExtraDataLength); + Assert.AreEqual(1, extraData.ToolNumber); + AssertEqualPackages(package, mid); + } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("ByteArray")] + public void Mid0704ExtraDataUnsubscriptionByteRevision1() + { + string package = "00330009001 0704001040001"; + byte[] bytes = GetAsciiBytes(package); + var mid = _midInterpreter.Parse(bytes); + + var extraData = _midInterpreter.ParseExtraData(mid); + + Assert.AreEqual(Mid0704.MID, mid.UnsubscriptionMid); + Assert.AreEqual(4, mid.ExtraDataLength); + Assert.AreEqual(1, extraData.ToolNumber); + AssertEqualPackages(bytes, mid); + } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0704ExtraDataUnsubscriptionPackRevision1() + { + string package = "00330009001 0704001040001"; + var mid = new Mid0009(); + + mid.SetExtraData(new Mid0704ExtraDataUnsubscription(1) + { + ToolNumber = 1 + }); + + Assert.AreEqual(Mid0704.MID, mid.UnsubscriptionMid); + Assert.AreEqual(4, mid.ExtraDataLength); + Assert.AreEqual("0001", mid.ExtraData); + AssertEqualPackages(package, mid); + } + + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0704PackRevision1() + { + string package = "00700704001 00201200012040000000QST50-150CTT012150010200000003"; + + AssertBuildAndParse(package, new Mid0704() + { + NumberOfDataFields = 2, + VariableDataFields = new List() + { + new VariableDataField() + { + ParameterId = 1200, + Length = 12, + DataType = DataTypeDefinition.String, + Unit = DataUnitType.NoUnit, + StepNumber = 0, + DataValue = "QST50-150CTT" + }, + new VariableDataField() + { + ParameterId = 1215, + Length = 1, + DataType = DataTypeDefinition.Integer, + Unit = DataUnitType.NoUnit, + StepNumber = 0, + DataValue = "3" + } + } + }); + } } } diff --git a/src/MIDTesters.Core/UserInterface/TestMid0110.cs b/src/MIDTesters.Core/UserInterface/TestMid0110.cs index 3725199c..e1d5c7c3 100644 --- a/src/MIDTesters.Core/UserInterface/TestMid0110.cs +++ b/src/MIDTesters.Core/UserInterface/TestMid0110.cs @@ -14,7 +14,7 @@ public void Mid0110Revision1() string package = "00240110001 TEST"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.UserText); + Assert.AreEqual("TEST", mid.UserText); AssertEqualPackages(package, mid); } @@ -26,8 +26,20 @@ public void Mid0110ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.UserText); + Assert.AreEqual("TEST", mid.UserText); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0110PackRevision1() + { + string package = "00240110001 TEST"; + + AssertBuildAndParse(package, new Mid0110() + { + UserText = "TEST" + }); + } } } diff --git a/src/MIDTesters.Core/UserInterface/TestMid0111.cs b/src/MIDTesters.Core/UserInterface/TestMid0111.cs index baa311ba..8513b685 100644 --- a/src/MIDTesters.Core/UserInterface/TestMid0111.cs +++ b/src/MIDTesters.Core/UserInterface/TestMid0111.cs @@ -1,5 +1,6 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenProtocolInterpreter.UserInterface; +using OpenProtocolInterpreter; namespace MIDTesters.UserInterface { @@ -14,12 +15,12 @@ public void Mid0111Revision1() string package = "01370111001 01200502103Header Text 04Line 2 Text 05Line 3 Text 06Line 4 Text "; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.TextDuration); - Assert.IsNotNull(mid.RemovalCondition); - Assert.IsNotNull(mid.Line1); - Assert.IsNotNull(mid.Line2); - Assert.IsNotNull(mid.Line3); - Assert.IsNotNull(mid.Line4); + Assert.AreEqual(2005, mid.TextDuration); + Assert.AreEqual(RemovalCondition.Acknowledge, mid.RemovalCondition); + Assert.AreEqual("Header Text", mid.Line1.TrimEnd()); + Assert.AreEqual("Line 2 Text", mid.Line2.TrimEnd()); + Assert.AreEqual("Line 3 Text", mid.Line3.TrimEnd()); + Assert.AreEqual("Line 4 Text", mid.Line4.TrimEnd()); AssertEqualPackages(package, mid); } @@ -31,13 +32,30 @@ public void Mid0111ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.TextDuration); - Assert.IsNotNull(mid.RemovalCondition); - Assert.IsNotNull(mid.Line1); - Assert.IsNotNull(mid.Line2); - Assert.IsNotNull(mid.Line3); - Assert.IsNotNull(mid.Line4); + Assert.AreEqual(2005, mid.TextDuration); + Assert.AreEqual(RemovalCondition.Acknowledge, mid.RemovalCondition); + Assert.AreEqual("Header Text", mid.Line1.TrimEnd()); + Assert.AreEqual("Line 2 Text", mid.Line2.TrimEnd()); + Assert.AreEqual("Line 3 Text", mid.Line3.TrimEnd()); + Assert.AreEqual("Line 4 Text", mid.Line4.TrimEnd()); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0111PackRevision1() + { + string package = "01370111001 01200502103Header Text 04Line 2 Text 05Line 3 Text 06Line 4 Text "; + + AssertBuildAndParse(package, new Mid0111() + { + TextDuration = 2005, + RemovalCondition = RemovalCondition.Acknowledge, + Line1 = "Header Text", + Line2 = "Line 2 Text", + Line3 = "Line 3 Text", + Line4 = "Line 4 Text" + }); + } } } diff --git a/src/MIDTesters.Core/UserInterface/TestMid0113.cs b/src/MIDTesters.Core/UserInterface/TestMid0113.cs index 121cd847..df976ef8 100644 --- a/src/MIDTesters.Core/UserInterface/TestMid0113.cs +++ b/src/MIDTesters.Core/UserInterface/TestMid0113.cs @@ -29,5 +29,14 @@ public void Mid0113ByteAllRevisions() Assert.AreEqual(typeof(Mid0113), mid.GetType()); AssertEqualPackages(bytes, mid, true); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0113PackRevision1() + { + string package = "00200113 "; + + AssertBuildAndParse(package, new Mid0113(), true); + } } } diff --git a/src/MIDTesters.Core/Vin/TestMid0050.cs b/src/MIDTesters.Core/Vin/TestMid0050.cs index dfd7b7c8..301cef64 100644 --- a/src/MIDTesters.Core/Vin/TestMid0050.cs +++ b/src/MIDTesters.Core/Vin/TestMid0050.cs @@ -14,7 +14,7 @@ public void Mid0050Revision1() string package = "00350050001 VehicleIdNumber"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.VinNumber); + Assert.AreEqual("VehicleIdNumber", mid.VinNumber); AssertEqualPackages(package, mid); } @@ -26,8 +26,20 @@ public void Mid0050ByteRevision1() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.VinNumber); + Assert.AreEqual("VehicleIdNumber", mid.VinNumber); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0050PackRevision1() + { + string package = "00350050001 VehicleIdNumber"; + + AssertBuildAndParse(package, new Mid0050() + { + VinNumber = "VehicleIdNumber" + }); + } } } diff --git a/src/MIDTesters.Core/Vin/TestMid0051.cs b/src/MIDTesters.Core/Vin/TestMid0051.cs index ea52839b..32b652c9 100644 --- a/src/MIDTesters.Core/Vin/TestMid0051.cs +++ b/src/MIDTesters.Core/Vin/TestMid0051.cs @@ -31,5 +31,14 @@ public void Mid0051ByteAllRevisions() Assert.IsTrue(mid.Header.NoAckFlag); AssertEqualPackages(bytes, mid); } + + [TestMethod] + [TestCategory("Pack")] + public void Mid0051PackAllRevisions() + { + string package = "002000510011 "; + + AssertBuildAndParse(package, new Mid0051(1, noAckFlag: true)); + } } } diff --git a/src/MIDTesters.Core/Vin/TestMid0052.cs b/src/MIDTesters.Core/Vin/TestMid0052.cs index f2f1c9cf..6890bd36 100644 --- a/src/MIDTesters.Core/Vin/TestMid0052.cs +++ b/src/MIDTesters.Core/Vin/TestMid0052.cs @@ -17,7 +17,7 @@ public void Mid0052Revision1VehicleIdLengthHigher() string package = "00470052001 VehicleIdNumberHigherThan25"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.VinNumber); + Assert.AreEqual("VehicleIdNumberHigherThan25", mid.VinNumber); AssertEqualPackages(package, mid); } @@ -29,7 +29,7 @@ public void Mid0052ByteRevision1VehicleIdLengthHigher() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.VinNumber); + Assert.AreEqual("VehicleIdNumberHigherThan25", mid.VinNumber); AssertEqualPackages(bytes, mid); } @@ -40,7 +40,7 @@ public void Mid0052Revision1VehicleIdLengthLower() string package = "00450052001 VehicleIdNumber \0"; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.VinNumber); + Assert.AreEqual("VehicleIdNumber", mid.VinNumber.TrimEnd('\0', ' ')); mid.Header.StationId = mid.Header.SpindleId = null; Assert.AreEqual(package, mid.PackWithNul()); } @@ -53,67 +53,65 @@ public void Mid0052ByteRevision1VehicleIdLengthLower() byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.VinNumber); + Assert.AreEqual("VehicleIdNumber", mid.VinNumber.TrimEnd('\0', ' ')); mid.Header.StationId = mid.Header.SpindleId = null; Assert.IsTrue(mid.PackBytesWithNul().SequenceEqual(bytes)); } [TestMethod] [TestCategory("Revision 2"), TestCategory("ASCII")] - public void Mid0052Revision2VehicleIdLengthHigher() + public void Mid0052Revision2() { - string package = "01300052002 01VehicleIdNumberHigherThan2502IdentifierPart2 03IdentifierPart3 04IdentifierPart4 "; + string package = "01280052002 01VehicleIdNumber 02IdentifierPart2 03IdentifierPart3 04IdentifierPart4 "; var mid = _midInterpreter.Parse(package); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); + Assert.AreEqual("VehicleIdNumber", mid.VinNumber.TrimEnd()); + Assert.AreEqual("IdentifierPart2", mid.IdentifierResultPart2.TrimEnd()); + Assert.AreEqual("IdentifierPart3", mid.IdentifierResultPart3.TrimEnd()); + Assert.AreEqual("IdentifierPart4", mid.IdentifierResultPart4.TrimEnd()); AssertEqualPackages(package, mid); } [TestMethod] [TestCategory("Revision 2"), TestCategory("ByteArray")] - public void Mid0052ByteRevision2VehicleIdLengthHigher() + public void Mid0052ByteRevision2() { - string package = "01300052002 01VehicleIdNumberHigherThan2502IdentifierPart2 03IdentifierPart3 04IdentifierPart4 "; + string package = "01280052002 01VehicleIdNumber 02IdentifierPart2 03IdentifierPart3 04IdentifierPart4 "; byte[] bytes = GetAsciiBytes(package); var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); + Assert.AreEqual("VehicleIdNumber", mid.VinNumber.TrimEnd()); + Assert.AreEqual("IdentifierPart2", mid.IdentifierResultPart2.TrimEnd()); + Assert.AreEqual("IdentifierPart3", mid.IdentifierResultPart3.TrimEnd()); + Assert.AreEqual("IdentifierPart4", mid.IdentifierResultPart4.TrimEnd()); AssertEqualPackages(bytes, mid); } [TestMethod] - [TestCategory("Revision 2"), TestCategory("ASCII")] - public void Mid0052Revision2VehicleIdLengthLower() + [TestCategory("Revision 1"), TestCategory("Pack")] + public void Mid0052PackRevision1() { - string package = "01280052002 01VehicleIdNumber 02IdentifierPart2 03IdentifierPart3 04IdentifierPart4 "; - var mid = _midInterpreter.Parse(package); + string package = "00470052001 VehicleIdNumberHigherThan25"; - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); - AssertEqualPackages(package, mid); + AssertBuildAndParse(package, new Mid0052(1) + { + VinNumber = "VehicleIdNumberHigherThan25" + }); } [TestMethod] - [TestCategory("Revision 2"), TestCategory("ByteArray")] - public void Mid0052ByteRevision2VehicleIdLengthLower() + [TestCategory("Revision 2"), TestCategory("Pack")] + public void Mid0052PackRevision2() { string package = "01280052002 01VehicleIdNumber 02IdentifierPart2 03IdentifierPart3 04IdentifierPart4 "; - byte[] bytes = GetAsciiBytes(package); - var mid = _midInterpreter.Parse(bytes); - Assert.IsNotNull(mid.VinNumber); - Assert.IsNotNull(mid.IdentifierResultPart2); - Assert.IsNotNull(mid.IdentifierResultPart3); - Assert.IsNotNull(mid.IdentifierResultPart4); - AssertEqualPackages(bytes, mid); + AssertBuildAndParse(package, new Mid0052(2) + { + VinNumber = "VehicleIdNumber", + IdentifierResultPart2 = "IdentifierPart2", + IdentifierResultPart3 = "IdentifierPart3", + IdentifierResultPart4 = "IdentifierPart4" + }); } } } diff --git a/src/MIDTesters.Core/Vin/TestMid0053.cs b/src/MIDTesters.Core/Vin/TestMid0053.cs index 3f73a199..026726c9 100644 --- a/src/MIDTesters.Core/Vin/TestMid0053.cs +++ b/src/MIDTesters.Core/Vin/TestMid0053.cs @@ -16,5 +16,14 @@ public void Mid0053AllRevisions() AssertEqualPackages(package, mid); } + + [TestMethod] + [TestCategory("Pack")] + public void Mid0053PackAllRevisions() + { + string package = "00200053001 "; + + AssertBuildAndParse(package, new Mid0053(1)); + } } } diff --git a/src/MIDTesters.Core/Vin/TestMid0054.cs b/src/MIDTesters.Core/Vin/TestMid0054.cs index bd525e5e..43e3f526 100644 --- a/src/MIDTesters.Core/Vin/TestMid0054.cs +++ b/src/MIDTesters.Core/Vin/TestMid0054.cs @@ -16,5 +16,14 @@ public void Mid0054AllRevisions() AssertEqualPackages(package, mid, true); } + + [TestMethod] + [TestCategory("Pack")] + public void Mid0054PackAllRevisions() + { + string package = "00200054 "; + + AssertBuildAndParse(package, new Mid0054(1), true); + } } } diff --git a/src/OpenProtocolInterpreter.Benchmarks/BenchmarkConfig.cs b/src/OpenProtocolInterpreter.Benchmarks/BenchmarkConfig.cs new file mode 100644 index 00000000..e660303d --- /dev/null +++ b/src/OpenProtocolInterpreter.Benchmarks/BenchmarkConfig.cs @@ -0,0 +1,28 @@ +namespace OpenProtocolInterpreter.Benchmarks +{ + using BenchmarkDotNet.Columns; + using BenchmarkDotNet.Configs; + using BenchmarkDotNet.Diagnosers; + using BenchmarkDotNet.Order; + using BenchmarkDotNet.Reports; + using Job = BenchmarkDotNet.Jobs.Job; + + internal static class BenchmarkConfig + { + public static IConfig Create() => Create(Job.Default); + + public static IConfig CreateQuick() => Create(Job.ShortRun); + + private static IConfig Create(Job job) + { + return ManualConfig.Create(DefaultConfig.Instance) + .AddJob(job) + .AddDiagnoser(MemoryDiagnoser.Default) + .AddColumn(RankColumn.Arabic) + .WithOrderer(new DefaultOrderer(SummaryOrderPolicy.Declared, MethodOrderPolicy.Declared)) + .WithSummaryStyle(SummaryStyle.Default + .WithRatioStyle(RatioStyle.Trend) + .WithMaxParameterColumnWidth(30)); + } + } +} diff --git a/src/OpenProtocolInterpreter.Benchmarks/InterpreterModeBenchmarks.cs b/src/OpenProtocolInterpreter.Benchmarks/InterpreterModeBenchmarks.cs new file mode 100644 index 00000000..7f23230a --- /dev/null +++ b/src/OpenProtocolInterpreter.Benchmarks/InterpreterModeBenchmarks.cs @@ -0,0 +1,58 @@ +using BenchmarkDotNet.Attributes; + +namespace OpenProtocolInterpreter.Benchmarks +{ + public class InterpreterModeBenchmarks + { + private MidInterpreter _interpreter; + private string _representative; + private string[] _incoming; + private byte[][] _incomingBytes; + + [Params(InterpreterMode.Both, InterpreterMode.Controller, InterpreterMode.Integrator)] + public InterpreterMode Mode { get; set; } + + [GlobalSetup] + public void Setup() + { + _representative = Packages.RepresentativeFor(Mode); + _incoming = Packages.IncomingFor(Mode); + _incomingBytes = Packages.ToBytes(_incoming); + + // Fail here rather than reporting a number for a mode that was silently rejecting its packages. + _interpreter = new MidInterpreter().UseAllMessages(Mode); + _interpreter.Parse(_representative); + foreach (var package in _incoming) + _interpreter.Parse(package); + } + + [Benchmark(Description = "Register all messages")] + public MidInterpreter Register() => new MidInterpreter().UseAllMessages(Mode); + + [Benchmark(Description = "Cold start (register + first parse)")] + public Mid ColdStart() => new MidInterpreter().UseAllMessages(Mode).Parse(_representative); + + [Benchmark(Description = "Parse (warm)")] + public Mid Parse() => _interpreter.Parse(_representative); + + [Benchmark(Description = "Parse session (warm, 4 packages)")] + public Mid ParseSession() + { + Mid last = null; + for (int i = 0; i < _incoming.Length; i++) + last = _interpreter.Parse(_incoming[i]); + + return last; + } + + [Benchmark(Description = "Parse session from bytes (warm, 4 packages)")] + public Mid ParseSessionBytes() + { + Mid last = null; + for (int i = 0; i < _incomingBytes.Length; i++) + last = _interpreter.Parse(_incomingBytes[i]); + + return last; + } + } +} diff --git a/src/OpenProtocolInterpreter.Benchmarks/OpenProtocolInterpreter.Benchmarks.csproj b/src/OpenProtocolInterpreter.Benchmarks/OpenProtocolInterpreter.Benchmarks.csproj new file mode 100644 index 00000000..3624c292 --- /dev/null +++ b/src/OpenProtocolInterpreter.Benchmarks/OpenProtocolInterpreter.Benchmarks.csproj @@ -0,0 +1,28 @@ + + + + Exe + net10.0 + latest + OpenProtocolInterpreter.Benchmarks + OpenProtocolInterpreter.Benchmarks + false + + + false + false + + + + + + + + + + + diff --git a/src/OpenProtocolInterpreter.Benchmarks/Packages.cs b/src/OpenProtocolInterpreter.Benchmarks/Packages.cs new file mode 100644 index 00000000..c4f58043 --- /dev/null +++ b/src/OpenProtocolInterpreter.Benchmarks/Packages.cs @@ -0,0 +1,102 @@ +using System.Text; + +namespace OpenProtocolInterpreter.Benchmarks +{ + /// + /// Open Protocol packages used across the benchmarks, taken from the test suite so every benchmark + /// measures a package that is known to parse. + /// + /// A mid travels in a single direction: mids marked with are sent by the + /// controller and consumed by an integrator, mids marked with travel the + /// other way. That is what filters on, so the packages are grouped by + /// direction here. + /// + /// + internal static class Packages + { + #region Controller originated (parsed by an integrator) + + public const string Mid0002Rev3 = "01250002003 010001020103Airbag1 04ACT05OpenProtocolVersion06Version 19.0.0.0 07Version 01.0.0.0 "; + public const string Mid0015Rev2 = "01410015002 0100202Airbag parameter 032017-06-02:09:54:0904205040600510107010009080050050900001109999911003601200123413001006"; + public const string Mid0035Rev3 = "00790035003 010001020030040008050003062001-12-01:20:12:4507120080100912"; + public const string Mid0061Rev1 = "02310061001 010001020103airbag7 04KPOL3456JKLO897 050006003070000080000090100111120008401300140014001200150007391600000170999918000001900000202001-06-02:09:54:09212001-05-29:12:34:33221230000345675"; + public const string Mid0061Rev11 = "06770061011 010000020003RA ST6.2 ETV100 04 05000006001070208000670900001000001101221301401501611711811912000000081942100340022004600230040002400050525000202600420270000028000002900100300085031000043200033150340003500000036999900370000003800000039000000400000004100001848874200000430000044 C0761275452020-06-25:01:04:39462020-06-24:10:48:5347Test Parameter Set 482490550Identifier result part 2 51Identifier result part 3 52Identifier result part 4 53E124540015005500000000425600100005709999005800100059260652143610052326200100630005064001506500001660000167168-00206900100700012071003291720010057300011074009000750001207600001"; + public const string Mid0071Rev3 = "01090071003 01E1021021031042017-12-01:20:12:4505106Alarm Text "; + public const string Mid0101Rev1 = "02100101001 010202BM3GA02111900601 030304003050001060001071080006800900092010000800110000012000151300000142019-11-14:14:08:05152019-11-25:11:22:41160091317118010111000809100000020111000809100000"; + + #endregion + + #region Integrator originated (parsed by a controller) + + /// Communication start, revision 7. 23 bytes. + public const string Mid0001Rev7 = "00230001007 011"; + + /// Communication stop, revision 1. 20 bytes, header only. + public const string Mid0003Rev1 = "00200003001 "; + + /// Vehicle id number download request. 35 bytes. + public const string Mid0050Rev1 = "00350050001 VehicleIdNumber"; + + /// Last tightening result data subscribe, all revisions. 20 bytes, header only. + public const string Mid0060Rev998 = "00200060998 "; + + /// Old tightening result upload request, revision 1. 30 bytes. + public const string Mid0064Rev1 = "00300064001 0123456789"; + + #endregion + + public static readonly string[] ControllerOriginated = + [ + Mid0002Rev3, + Mid0035Rev3, + Mid0061Rev1, + Mid0071Rev3 + ]; + + public static readonly string[] IntegratorOriginated = + [ + Mid0001Rev7, + Mid0003Rev1, + Mid0060Rev998, + Mid0064Rev1 + ]; + + public static readonly string[] BothDirections = + [ + Mid0001Rev7, + Mid0002Rev3, + Mid0060Rev998, + Mid0061Rev1 + ]; + + public static string[] IncomingFor(InterpreterMode mode) + { + return mode switch + { + InterpreterMode.Controller => IntegratorOriginated, + InterpreterMode.Integrator => ControllerOriginated, + _ => BothDirections + }; + } + + /// + /// Returns the single package used as the representative message of the given : + /// the tightening result for anyone reading a controller, the subscription that asks for it otherwise. + /// + public static string RepresentativeFor(InterpreterMode mode) + { + return mode == InterpreterMode.Controller ? Mid0060Rev998 : Mid0061Rev1; + } + + public static byte[] ToBytes(string package) => Encoding.ASCII.GetBytes(package); + + public static byte[][] ToBytes(string[] packages) + { + var bytes = new byte[packages.Length][]; + for (int i = 0; i < packages.Length; i++) + bytes[i] = ToBytes(packages[i]); + + return bytes; + } + } +} diff --git a/src/OpenProtocolInterpreter.Benchmarks/PackingBenchmarks.cs b/src/OpenProtocolInterpreter.Benchmarks/PackingBenchmarks.cs new file mode 100644 index 00000000..f7b824f8 --- /dev/null +++ b/src/OpenProtocolInterpreter.Benchmarks/PackingBenchmarks.cs @@ -0,0 +1,57 @@ +using BenchmarkDotNet.Attributes; +using OpenProtocolInterpreter.Communication; +using OpenProtocolInterpreter.KeepAlive; +using OpenProtocolInterpreter.Tightening; +using System.Text; + +namespace OpenProtocolInterpreter.Benchmarks +{ + /// + /// Measures the other half of the round trip: turning a mid back into the package that goes on the wire. + /// + /// Packing is what a driver does on every message it sends, and is + /// plus an encode, so the pair shows what the encode step costs on top. + /// + /// + public class PackingBenchmarks + { + private static readonly Encoding NonDefaultEncoding = Encoding.UTF8; + + private Mid9999 _keepAlive; + private Mid0001 _communicationStart; + private Mid0061 _tighteningResult; + private Mid0061 _wideTighteningResult; + + [GlobalSetup] + public void Setup() + { + var interpreter = new MidInterpreter().UseAllMessages(); + + _keepAlive = new Mid9999(); + _communicationStart = interpreter.Parse(Packages.Mid0001Rev7); + _tighteningResult = interpreter.Parse(Packages.Mid0061Rev1); + _wideTighteningResult = interpreter.Parse(Packages.Mid0061Rev11); + } + + [Benchmark(Description = "Pack Mid9999 (header only)")] + public string PackKeepAlive() => _keepAlive.Pack(); + + [Benchmark(Description = "Pack Mid0001 (23B)")] + public string PackCommunicationStart() => _communicationStart.Pack(); + + [Benchmark(Description = "Pack Mid0061 rev 1 (231B)", Baseline = true)] + public string PackTighteningResult() => _tighteningResult.Pack(); + + [Benchmark(Description = "Pack Mid0061 rev 11 (677B)")] + public string PackWideTighteningResult() => _wideTighteningResult.Pack(); + + [Benchmark(Description = "PackBytes Mid0061 rev 1 (default encoding)")] + public byte[] PackBytesTighteningResult() => _tighteningResult.PackBytes(); + + [Benchmark(Description = "PackBytes Mid0061 rev 1 (explicit encoding)")] + public byte[] PackBytesTighteningResultWithEncoding() => _tighteningResult.PackBytes(NonDefaultEncoding); + + [Benchmark(Description = "PackBytes Mid0061 rev 11 (default encoding)")] + public byte[] PackBytesWideTighteningResult() => _wideTighteningResult.PackBytes(); + } +} diff --git a/src/OpenProtocolInterpreter.Benchmarks/ParsingBenchmarks.cs b/src/OpenProtocolInterpreter.Benchmarks/ParsingBenchmarks.cs new file mode 100644 index 00000000..b69cdf02 --- /dev/null +++ b/src/OpenProtocolInterpreter.Benchmarks/ParsingBenchmarks.cs @@ -0,0 +1,60 @@ +using BenchmarkDotNet.Attributes; +using System.Collections.Generic; +using System.Text; + +namespace OpenProtocolInterpreter.Benchmarks +{ + public class ParsingBenchmarks + { + private static readonly Encoding NonDefaultEncoding = Encoding.UTF8; + + private MidInterpreter _interpreter; + private byte[] _bytes; + + [ParamsSource(nameof(PackageCases))] + public PackageCase Package { get; set; } + + public static IEnumerable PackageCases() + { + yield return new PackageCase("Mid0060 header", Packages.Mid0060Rev998); + yield return new PackageCase("Mid0035 r3", Packages.Mid0035Rev3); + yield return new PackageCase("Mid0061 r1", Packages.Mid0061Rev1); + yield return new PackageCase("Mid0101 r1 list", Packages.Mid0101Rev1); + yield return new PackageCase("Mid0061 r11", Packages.Mid0061Rev11); + } + + [GlobalSetup] + public void Setup() + { + _interpreter = new MidInterpreter().UseAllMessages(); + _bytes = Packages.ToBytes(Package.Value); + + // Materialize the templates so the first measured iteration is not the one paying for them. + _interpreter.Parse(Package.Value); + } + + [Benchmark(Description = "Parse(string)", Baseline = true)] + public Mid ParseString() => _interpreter.Parse(Package.Value); + + [Benchmark(Description = "Parse(byte[])")] + public Mid ParseBytes() => _interpreter.Parse(_bytes); + + [Benchmark(Description = "Parse(byte[], encoding)")] + public Mid ParseBytesWithEncoding() => _interpreter.Parse(_bytes, NonDefaultEncoding); + + public readonly struct PackageCase + { + public PackageCase(string name, string value) + { + Name = name; + Value = value; + } + + public string Name { get; } + + public string Value { get; } + + public override string ToString() => $"{Name} ({Value.Length}B)"; + } + } +} diff --git a/src/OpenProtocolInterpreter.Benchmarks/Program.cs b/src/OpenProtocolInterpreter.Benchmarks/Program.cs new file mode 100644 index 00000000..82ffa828 --- /dev/null +++ b/src/OpenProtocolInterpreter.Benchmarks/Program.cs @@ -0,0 +1,19 @@ +using BenchmarkDotNet.Configs; +using BenchmarkDotNet.Running; +using OpenProtocolInterpreter.Benchmarks; +using System; +using System.Linq; +using System.Reflection; + +var quick = args.Contains("--quick", StringComparer.OrdinalIgnoreCase); +var remaining = args.Where(x => !string.Equals(x, "--quick", StringComparison.OrdinalIgnoreCase)).ToList(); +IConfig config = quick ? BenchmarkConfig.CreateQuick() : BenchmarkConfig.Create(); + +string[] selectionArguments = ["--filter", "-f", "--list", "--help", "-h", "--version", "--info"]; +if (!remaining.Any(x => selectionArguments.Contains(x, StringComparer.OrdinalIgnoreCase))) +{ + remaining.Add("--filter"); + remaining.Add("*"); +} + +BenchmarkSwitcher.FromAssembly(Assembly.GetExecutingAssembly()).Run(remaining.ToArray(), config); diff --git a/src/OpenProtocolInterpreter.Benchmarks/README.md b/src/OpenProtocolInterpreter.Benchmarks/README.md new file mode 100644 index 00000000..a28f6d1c --- /dev/null +++ b/src/OpenProtocolInterpreter.Benchmarks/README.md @@ -0,0 +1,59 @@ +# OpenProtocolInterpreter.Benchmarks + +[BenchmarkDotNet](https://benchmarkdotnet.org/) suite for the library. It is a plain console app, kept apart +from `MIDTesters.Core` on purpose: a benchmark needs an optimized, non instrumented, single process host, +which is the opposite of what a test host gives you. + +## Running + +```bash +# everything, full precision (several minutes) +dotnet run -c Release --project src/OpenProtocolInterpreter.Benchmarks + +# one class +dotnet run -c Release --project src/OpenProtocolInterpreter.Benchmarks -- --filter '*InterpreterModeBenchmarks*' + +# short job, for checking the suite still runs after a change +dotnet run -c Release --project src/OpenProtocolInterpreter.Benchmarks -- --quick + +# list what is available +dotnet run -c Release --project src/OpenProtocolInterpreter.Benchmarks -- --list flat +``` + +`-c Release` is not optional; BenchmarkDotNet refuses to run a debug build. Everything other than `--quick` +is passed straight to BenchmarkDotNet, so its whole command line is available. + +Reports land in `BenchmarkDotNet.Artifacts/results` next to the binaries, including a GitHub flavoured +markdown table that can be pasted into an issue or a pull request. + +## What is measured + +| Class | Question it answers | +|---|---| +| `InterpreterModeBenchmarks` | What do `InterpreterMode.Both`, `Controller` and `Integrator` cost? | +| `RegistrationBenchmarks` | Is it worth registering only the mids I use instead of `UseAllMessages()`? | +| `ParsingBenchmarks` | What does a parse cost per package width, and what does the `byte[]` overload add? | +| `PackingBenchmarks` | What does building the outgoing package cost, and what does `PackBytes` add over `Pack`? | + +### Reading the interpreter mode results + +Only `Register all messages` is a like for like comparison across the three modes: it is the same call with +a different argument. The parse rows cannot be, because a mid travels in one direction only, so a +`Controller` interpreter physically never receives the packages an `Integrator` one does. Each mode is +therefore benchmarked against the traffic it actually sees (`Packages.IncomingFor`), and each row should be +read on its own. + +What the three columns do show is *where* a mode costs anything. Registration only wires up 24 lazy +templates and is mode independent. The mode is paid for on the first parse, when a template is materialized +and `Controller`/`Integrator` additionally filter out the mids of the opposite direction, work `Both` skips. + +## Adding a benchmark + +Sample packages live in `Packages.cs` and are copied from the test suite, so anything benchmarked is known +to parse. Add new ones there rather than inlining a raw string, and keep them grouped by direction +(`IController` mids are sent by the controller, `IIntegrator` mids by the integrator) so the mode benchmarks +keep working. + +Benchmark bodies must not assert. An assertion measures the assertion; correctness belongs in +`MIDTesters.Core`. Where a benchmark depends on a package parsing, check it once in `[GlobalSetup]` so a +broken sample fails the run instead of quietly reporting the cost of an exception. diff --git a/src/OpenProtocolInterpreter.Benchmarks/RegistrationBenchmarks.cs b/src/OpenProtocolInterpreter.Benchmarks/RegistrationBenchmarks.cs new file mode 100644 index 00000000..283b0a20 --- /dev/null +++ b/src/OpenProtocolInterpreter.Benchmarks/RegistrationBenchmarks.cs @@ -0,0 +1,55 @@ +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Configs; +using OpenProtocolInterpreter.Communication; +using OpenProtocolInterpreter.MotorTuning; +using OpenProtocolInterpreter.Tightening; +using System; + +namespace OpenProtocolInterpreter.Benchmarks +{ + [CategoriesColumn] + [GroupBenchmarksBy(BenchmarkLogicalGroupRule.ByCategory)] + public class RegistrationBenchmarks + { + private const string Registering = "Registering"; + private const string ColdStart = "Cold start"; + + private static readonly Type[] CuratedMids = + [ + typeof(Mid0001), + typeof(Mid0002), + typeof(Mid0003), + typeof(Mid0004), + typeof(Mid0061), + typeof(Mid0500), + typeof(Mid0501), + typeof(Mid0502), + typeof(Mid0503), + typeof(Mid0504) + ]; + + [BenchmarkCategory(Registering)] + [Benchmark(Description = "UseAllMessages()", Baseline = true)] + public MidInterpreter RegisterAll() => new MidInterpreter().UseAllMessages(); + + [BenchmarkCategory(Registering)] + [Benchmark(Description = "UseAllMessages(Type[]) - 10 mids")] + public MidInterpreter RegisterCurated() => new MidInterpreter().UseAllMessages(CuratedMids); + + [BenchmarkCategory(Registering)] + [Benchmark(Description = "UseTighteningMessages() only")] + public MidInterpreter RegisterSingleFamily() => new MidInterpreter().UseTighteningMessages(); + + [BenchmarkCategory(ColdStart)] + [Benchmark(Description = "UseAllMessages() + first parse", Baseline = true)] + public Mid ColdStartAll() => new MidInterpreter().UseAllMessages().Parse(Packages.Mid0061Rev1); + + [BenchmarkCategory(ColdStart)] + [Benchmark(Description = "UseAllMessages(Type[]) + first parse")] + public Mid ColdStartCurated() => new MidInterpreter().UseAllMessages(CuratedMids).Parse(Packages.Mid0061Rev1); + + [BenchmarkCategory(ColdStart)] + [Benchmark(Description = "UseTighteningMessages() + first parse")] + public Mid ColdStartSingleFamily() => new MidInterpreter().UseTighteningMessages().Parse(Packages.Mid0061Rev1); + } +} diff --git a/src/OpenProtocolInterpreter/Alarm/AlarmMessages.cs b/src/OpenProtocolInterpreter/Alarm/AlarmMessages.cs index afaa1bcd..f944d579 100644 --- a/src/OpenProtocolInterpreter/Alarm/AlarmMessages.cs +++ b/src/OpenProtocolInterpreter/Alarm/AlarmMessages.cs @@ -11,19 +11,19 @@ internal class AlarmMessages : MessagesTemplate { public AlarmMessages() : base() { - _templates = new Dictionary() + _templates = new Dictionary>() { - { Mid0070.MID, new MidCompiledInstance(typeof(Mid0070)) }, - { Mid0071.MID, new MidCompiledInstance(typeof(Mid0071)) }, - { Mid0072.MID, new MidCompiledInstance(typeof(Mid0072)) }, - { Mid0073.MID, new MidCompiledInstance(typeof(Mid0073)) }, - { Mid0074.MID, new MidCompiledInstance(typeof(Mid0074)) }, - { Mid0075.MID, new MidCompiledInstance(typeof(Mid0075)) }, - { Mid0076.MID, new MidCompiledInstance(typeof(Mid0076)) }, - { Mid0077.MID, new MidCompiledInstance(typeof(Mid0077)) }, - { Mid0078.MID, new MidCompiledInstance(typeof(Mid0078)) }, - { Mid1000.MID, new MidCompiledInstance(typeof(Mid1000)) }, - { Mid1001.MID, new MidCompiledInstance(typeof(Mid1001)) }, + { Mid0070.MID, new CompiledInstance(typeof(Mid0070)) }, + { Mid0071.MID, new CompiledInstance(typeof(Mid0071)) }, + { Mid0072.MID, new CompiledInstance(typeof(Mid0072)) }, + { Mid0073.MID, new CompiledInstance(typeof(Mid0073)) }, + { Mid0074.MID, new CompiledInstance(typeof(Mid0074)) }, + { Mid0075.MID, new CompiledInstance(typeof(Mid0075)) }, + { Mid0076.MID, new CompiledInstance(typeof(Mid0076)) }, + { Mid0077.MID, new CompiledInstance(typeof(Mid0077)) }, + { Mid0078.MID, new CompiledInstance(typeof(Mid0078)) }, + { Mid1000.MID, new CompiledInstance(typeof(Mid1000)) }, + { Mid1001.MID, new CompiledInstance(typeof(Mid1001)) }, }; } diff --git a/src/OpenProtocolInterpreter/Alarm/Mid0071.cs b/src/OpenProtocolInterpreter/Alarm/Mid0071.cs index 65491f21..f09b35d2 100644 --- a/src/OpenProtocolInterpreter/Alarm/Mid0071.cs +++ b/src/OpenProtocolInterpreter/Alarm/Mid0071.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Text; namespace OpenProtocolInterpreter.Alarm { @@ -13,32 +14,31 @@ public class Mid0071 : Mid, IAlarm, IController, IAcknowledgeable { public const int MID = 71; - public string ErrorCode - { - get => GetField(1, DataFields.ErrorCode).Value; - set => GetField(1, DataFields.ErrorCode).SetValue(value); - } - public bool ControllerReadyStatus - { - get => GetField(1, DataFields.ControllerReadyStatus).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(1, DataFields.ControllerReadyStatus).SetValue(OpenProtocolConvert.ToString, value); - } - public bool ToolReadyStatus - { - get => GetField(1, DataFields.ToolReadyStatus).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(1, DataFields.ToolReadyStatus).SetValue(OpenProtocolConvert.ToString, value); - } - public DateTime Time - { - get => GetField(1, DataFields.Time).GetValue(OpenProtocolConvert.ToDateTime); - set => GetField(1, DataFields.Time).SetValue(OpenProtocolConvert.ToString, value); - } - //Rev 2 - public string AlarmText - { - get => GetField(2, DataFields.AlarmText).Value; - set => GetField(2, DataFields.AlarmText).SetValue(value); - } + [StringDataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 4, PaddingOrientation = PaddingOrientation.LeftPadded)] + [StringDataFieldDefinition(revision: 2, field: 1, Index = 20, Size = 5, PaddingOrientation = PaddingOrientation.LeftPadded)] + [StringDataFieldDefinition(revision: 3, field: 1, Index = 20, Size = 5, PaddingOrientation = PaddingOrientation.LeftPadded)] + public string ErrorCode { get; set; } + + [BooleanDataFieldDefinition(revision: 1, field: 2, Index = 26)] + [BooleanDataFieldDefinition(revision: 2, field: 2, Index = 27)] + [BooleanDataFieldDefinition(revision: 3, field: 2, Index = 27)] + public bool ControllerReadyStatus { get; set; } + + [BooleanDataFieldDefinition(revision: 1, field: 3, Index = 29)] + [BooleanDataFieldDefinition(revision: 2, field: 3, Index = 30)] + [BooleanDataFieldDefinition(revision: 3, field: 3, Index = 30)] + public bool ToolReadyStatus { get; set; } + + [TimestampDataFieldDefinition(revision: 1, field: 4, Index = 32)] + [TimestampDataFieldDefinition(revision: 2, field: 4, Index = 33)] + [TimestampDataFieldDefinition(revision: 3, field: 4, Index = 33)] + public DateTime Time { get; set; } + + [Int32DataFieldDefinition(revision: 3, field: 5, Index = 54, Size = 1)] + public ToolHealth ToolHealth { get; set; } + + [StringDataFieldDefinition(revision: 3, field: 6, Index = 57, Size = 50)] + public string AlarmText { get; set; } public Mid0071() : this(DEFAULT_REVISION) { @@ -47,7 +47,6 @@ public Mid0071() : this(DEFAULT_REVISION) public Mid0071(Header header) : base(header) { - HandleRevision(); } public Mid0071(int revision) : this(new Header() @@ -59,65 +58,38 @@ public Mid0071(int revision) : this(new Header() } - public override Mid Parse(string package) + protected override string BuildHeader() { - Header = ProcessHeader(package); - HandleRevision(); - ProcessDataFields(package); - return this; + Header.Length = Header.DefaultSize; + foreach (var field in RevisionsByFields[Header.StandardizedRevision]) + { + Header.Length += field.TotalSize; + } + + return Header.ToString(); } - protected override Dictionary> RegisterDatafields() + public override string Pack() { - return new Dictionary>() - { - { - 1, new List() - { - DataField.String(DataFields.ErrorCode, 20, 4, PaddingOrientation.LeftPadded), - DataField.Boolean(DataFields.ControllerReadyStatus, 26), - DataField.Boolean(DataFields.ToolReadyStatus, 29), - DataField.Timestamp(DataFields.Time, 32) - } - }, - { - 2, new List() - { - DataField.String(DataFields.AlarmText, 54, 50), - } - } - }; + var header = BuildHeader(); + var builder = new StringBuilder(Header.Length); + builder.Append(header); + builder.Append(base.Pack(DataFieldsByRevision())); + return builder.ToString(); } - private void HandleRevision() + protected override void ProcessDataFields(ReadOnlySpan package) { - var errorCodeField = GetField(1, (int)DataFields.ErrorCode); - if (Header.Revision > 1) - { - errorCodeField.Size = 5; - } - else - { - errorCodeField.Size = 4; - } - - int index = errorCodeField.Index + errorCodeField.Size; - for (int i = DataFields.ControllerReadyStatus.GetHashCode(); i < RevisionsByFields[1].Count; i++) + foreach (var field in DataFieldsByRevision()) { - var field = GetField(1, i); - field.Index = 2 + index; - index = field.Index + field.Size; + ProcessDataField(field, package); } } - protected enum DataFields + private IEnumerable DataFieldsByRevision() { - ErrorCode, - ControllerReadyStatus, - ToolReadyStatus, - Time, - //Rev 2 - AlarmText + foreach (var field in RevisionsByFields[Header.StandardizedRevision]) + yield return field; } } } diff --git a/src/OpenProtocolInterpreter/Alarm/Mid0074.cs b/src/OpenProtocolInterpreter/Alarm/Mid0074.cs index 239f3eaf..634dc34c 100644 --- a/src/OpenProtocolInterpreter/Alarm/Mid0074.cs +++ b/src/OpenProtocolInterpreter/Alarm/Mid0074.cs @@ -1,8 +1,9 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.Text; namespace OpenProtocolInterpreter.Alarm { - /// /// Alarm acknowledged on controller /// The message is sent by the controller to inform the integrator that the current alarm has been acknowledged. @@ -13,11 +14,9 @@ public class Mid0074 : Mid, IAlarm, IController, IAcknowledgeable { public const int MID = 74; - public string ErrorCode - { - get => GetField(1, DataFields.ErrorCode).Value; - set => GetField(1, DataFields.ErrorCode).SetValue(value); - } + [StringDataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 4, HasPrefix = false, PaddingOrientation = PaddingOrientation.LeftPadded)] + [StringDataFieldDefinition(revision: 2, field: 1, Index = 20, Size = 5, HasPrefix = false, PaddingOrientation = PaddingOrientation.LeftPadded)] + public string ErrorCode { get; set; } public Mid0074() : this(DEFAULT_REVISION) { @@ -34,36 +33,38 @@ public Mid0074(int revision) : base(MID, revision) } - public override string Pack() + protected override string BuildHeader() { - RevisionsByFields[1][(int)DataFields.ErrorCode].Size = Header.Revision == 1 ? 4 : 5; - return base.Pack(); + Header.Length = Header.DefaultSize; + foreach (var field in RevisionsByFields[Header.StandardizedRevision]) + { + Header.Length += field.TotalSize; + } + + return Header.ToString(); } - public override Mid Parse(string package) + public override string Pack() { - Header = ProcessHeader(package); - RevisionsByFields[1][(int)DataFields.ErrorCode].Size = Header.Revision == 1 ? 4 : 5; - ProcessDataFields(package); - return this; + var header = BuildHeader(); + var builder = new StringBuilder(Header.Length); + builder.Append(header); + builder.Append(base.Pack(DataFieldsByRevision())); + return builder.ToString(); } - protected override Dictionary> RegisterDatafields() + protected override void ProcessDataFields(ReadOnlySpan package) { - return new Dictionary>() + foreach (var field in DataFieldsByRevision()) { - { - 1, new List() - { - DataField.String(DataFields.ErrorCode, 20, 4, PaddingOrientation.LeftPadded, false) - } - } - }; + ProcessDataField(field, package); + } } - protected enum DataFields + private IEnumerable DataFieldsByRevision() { - ErrorCode + foreach (var field in RevisionsByFields[Header.StandardizedRevision]) + yield return field; } } } diff --git a/src/OpenProtocolInterpreter/Alarm/Mid0076.cs b/src/OpenProtocolInterpreter/Alarm/Mid0076.cs index 1300d3fd..35a35847 100644 --- a/src/OpenProtocolInterpreter/Alarm/Mid0076.cs +++ b/src/OpenProtocolInterpreter/Alarm/Mid0076.cs @@ -1,11 +1,12 @@ -using System; +using System; using System.Collections.Generic; +using System.Text; namespace OpenProtocolInterpreter.Alarm { /// /// Alarm status - /// The alarm status is sent after an accepted subscription of the controller alarms. + /// The alarm status is sent after an accepted subscription of the controller alarms. /// This message is used to inform the integrator that an alarm is active on the controller at subscription time. /// Message sent by: Controller /// Answer: Alarm status acknowledge @@ -14,36 +15,33 @@ public class Mid0076 : Mid, IAlarm, IController, IAcknowledgeable { public const int MID = 76; - public bool AlarmStatus - { - get => GetField(1, DataFields.AlarmStatus).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(1, DataFields.AlarmStatus).SetValue(OpenProtocolConvert.ToString, value); - } - public string ErrorCode - { - get => GetField(1, DataFields.ErrorCode).Value; - set => GetField(1, DataFields.ErrorCode).SetValue(value); - } - public bool ControllerReadyStatus - { - get => GetField(1, DataFields.ControllerReadyStatus).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(1, DataFields.ControllerReadyStatus).SetValue(OpenProtocolConvert.ToString, value); - } - public bool ToolReadyStatus - { - get => GetField(1, DataFields.ToolReadyStatus).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(1, DataFields.ToolReadyStatus).SetValue(OpenProtocolConvert.ToString, value); - } - public DateTime Time - { - get => GetField(1, DataFields.Time).GetValue(OpenProtocolConvert.ToDateTime); - set => GetField(1, DataFields.Time).SetValue(OpenProtocolConvert.ToString, value); - } - public ToolHealth ToolHealth - { - get => (ToolHealth)GetField(3, DataFields.ToolHealth).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(3, DataFields.ToolHealth).SetValue(OpenProtocolConvert.ToString, value); - } + [BooleanDataFieldDefinition(revision: 1, field: 1, Index = 20)] + [BooleanDataFieldDefinition(revision: 2, field: 1, Index = 20)] + [BooleanDataFieldDefinition(revision: 3, field: 1, Index = 20)] + public bool AlarmStatus { get; set; } + + [StringDataFieldDefinition(revision: 1, field: 2, Index = 23, Size = 4, PaddingOrientation = PaddingOrientation.LeftPadded)] + [StringDataFieldDefinition(revision: 2, field: 2, Index = 23, Size = 5, PaddingOrientation = PaddingOrientation.LeftPadded)] + [StringDataFieldDefinition(revision: 3, field: 2, Index = 23, Size = 5, PaddingOrientation = PaddingOrientation.LeftPadded)] + public string ErrorCode { get; set; } + + [BooleanDataFieldDefinition(revision: 1, field: 3, Index = 29)] + [BooleanDataFieldDefinition(revision: 2, field: 3, Index = 30)] + [BooleanDataFieldDefinition(revision: 3, field: 3, Index = 30)] + public bool ControllerReadyStatus { get; set; } + + [BooleanDataFieldDefinition(revision: 1, field: 4, Index = 32)] + [BooleanDataFieldDefinition(revision: 2, field: 4, Index = 33)] + [BooleanDataFieldDefinition(revision: 3, field: 4, Index = 33)] + public bool ToolReadyStatus { get; set; } + + [TimestampDataFieldDefinition(revision: 1, field: 5, Index = 35)] + [TimestampDataFieldDefinition(revision: 2, field: 5, Index = 36)] + [TimestampDataFieldDefinition(revision: 3, field: 5, Index = 36)] + public DateTime Time { get; set; } + + [Int32DataFieldDefinition(revision: 3, field: 6, Index = 57, Size = 1)] + public ToolHealth ToolHealth { get; set; } public Mid0076() : this(DEFAULT_REVISION) { @@ -52,7 +50,7 @@ public Mid0076() : this(DEFAULT_REVISION) public Mid0076(Header header) : base(header) { - HandleRevision(); + } public Mid0076(int revision) : this(new Header() @@ -64,59 +62,38 @@ public Mid0076(int revision) : this(new Header() } - public override Mid Parse(string package) + protected override string BuildHeader() { - Header = ProcessHeader(package); - HandleRevision(); - ProcessDataFields(package); - return this; + Header.Length = Header.DefaultSize; + foreach (var field in RevisionsByFields[Header.StandardizedRevision]) + { + Header.Length += field.TotalSize; + } + + return Header.ToString(); } - protected override Dictionary> RegisterDatafields() + public override string Pack() { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Boolean(DataFields.AlarmStatus, 20), - DataField.String(DataFields.ErrorCode, 23, 4, PaddingOrientation.LeftPadded), - DataField.Boolean(DataFields.ControllerReadyStatus, 29), - DataField.Boolean(DataFields.ToolReadyStatus, 32), - DataField.Timestamp(DataFields.Time, 35) - } - }, - { - 3, new List() - { - DataField.Number(DataFields.ToolHealth, 57, 1), - } - } - }; + var header = BuildHeader(); + var builder = new StringBuilder(Header.Length); + builder.Append(header); + builder.Append(base.Pack(DataFieldsByRevision())); + return builder.ToString(); } - private void HandleRevision() + protected override void ProcessDataFields(ReadOnlySpan package) { - var errorCodeField = GetField(1, DataFields.ErrorCode); - errorCodeField.Size = Header.Revision > 1 ? 5 : 4; - - int index = errorCodeField.Index + errorCodeField.Size; - for (int i = (int)DataFields.ControllerReadyStatus; i < RevisionsByFields[1].Count; i++) + foreach (var field in DataFieldsByRevision()) { - var field = GetField(1, i); - field.Index = 2 + index; - index = field.Index + field.Size; + ProcessDataField(field, package); } } - protected enum DataFields + private IEnumerable DataFieldsByRevision() { - AlarmStatus, - ErrorCode, - ControllerReadyStatus, - ToolReadyStatus, - Time, - ToolHealth + foreach (var field in RevisionsByFields[Header.StandardizedRevision]) + yield return field; } } } diff --git a/src/OpenProtocolInterpreter/Alarm/Mid1000.cs b/src/OpenProtocolInterpreter/Alarm/Mid1000.cs index 19816e4f..819c9235 100644 --- a/src/OpenProtocolInterpreter/Alarm/Mid1000.cs +++ b/src/OpenProtocolInterpreter/Alarm/Mid1000.cs @@ -7,25 +7,24 @@ namespace OpenProtocolInterpreter.Alarm /// /// Alarm /// An alarm has appeared in the controller. The current alarm is uploaded from the controller to the integrator. - /// This MID replace the old alarm MID 0071. + /// This MID replace the old alarm . /// Message sent by: Controller - /// Answer: Alarm status acknowledge + /// Answer: Alarm acknowledge /// public class Mid1000 : Mid, IAlarm, IController, IAcknowledgeable { public const int MID = 1000; - public string AlarmCode - { - get => GetField(1, DataFields.AlarmCode).Value; - set => GetField(1, DataFields.AlarmCode).SetValue(value); - } - public DateTime Time - { - get => GetField(1, DataFields.Time).GetValue(OpenProtocolConvert.ToDateTime); - set => GetField(1, DataFields.Time).SetValue(OpenProtocolConvert.ToString, value); - } - public int NumberOfDataFields => AlarmDataFields.Count; + [StringDataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 5, HasPrefix = false, PaddingOrientation = PaddingOrientation.LeftPadded)] + public string AlarmCode { get; set; } + + [TimestampDataFieldDefinition(revision: 1, field: 2, Index = 25, HasPrefix = false)] + public DateTime Time { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 3, Index = 44, Size = 3, HasPrefix = false)] + public int NumberOfDataFields { get; set; } + + [VariableDataFieldCollectionDefinition(revision: 1, field: 4, Index = 47, HasPrefix = false)] public List AlarmDataFields { get; set; } public Mid1000() : this(DEFAULT_REVISION) @@ -44,48 +43,23 @@ public Mid1000(int revision) : this(new Header() Revision = revision }) { - + } public override string Pack() { - GetField(1, DataFields.NumberOfDataFields).SetValue(OpenProtocolConvert.ToString, AlarmDataFields.Count); - GetField(1, DataFields.EachAlarmDataField).SetValue(OpenProtocolConvert.ToString(AlarmDataFields)); + NumberOfDataFields = AlarmDataFields?.Count ?? 0; //Enforce list size even if modified + GetField(revision: 1, field: 4).Size = AlarmDataFields?.Sum(x => x.TotalSize) ?? 0; //Enforce size of variable data fields return base.Pack(); } - public override Mid Parse(string package) - { - Header = ProcessHeader(package); - var dataFieldsField = GetField(1, DataFields.EachAlarmDataField); - dataFieldsField.Size = Header.Length - dataFieldsField.Index; - ProcessDataFields(package); - AlarmDataFields = VariableDataField.ParseAll(dataFieldsField.Value).ToList(); - return this; - } - - protected override Dictionary> RegisterDatafields() + protected override void ProcessDataField(DataField dataField, ReadOnlySpan package) { - return new Dictionary>() + if (dataField.Field == 4) //AlarmDataFields { - { - 1, new List() - { - DataField.String(DataFields.AlarmCode, 20, 5, PaddingOrientation.RightPadded, false), - DataField.Timestamp(DataFields.Time, 25, false), - DataField.Number(DataFields.NumberOfDataFields, 44, 3, false), - DataField.Volatile(DataFields.EachAlarmDataField, 47, false) - } - } - }; - } - - protected enum DataFields - { - AlarmCode, - Time, - NumberOfDataFields, - EachAlarmDataField + dataField.Size = Header.Length - dataField.Index; + } + base.ProcessDataField(dataField, package); } } } diff --git a/src/OpenProtocolInterpreter/Alarm/Mid1001.cs b/src/OpenProtocolInterpreter/Alarm/Mid1001.cs index 2e87cc91..8e4d4b18 100644 --- a/src/OpenProtocolInterpreter/Alarm/Mid1001.cs +++ b/src/OpenProtocolInterpreter/Alarm/Mid1001.cs @@ -1,7 +1,7 @@ namespace OpenProtocolInterpreter.Alarm { /// - /// Alarm status acknowledge + /// Alarm acknowledge /// Acknowledge for Alarm /// Message sent by: Integrator /// Answer : None diff --git a/src/OpenProtocolInterpreter/ApplicationController/ApplicationControllerMessages.cs b/src/OpenProtocolInterpreter/ApplicationController/ApplicationControllerMessages.cs index 1ae5e836..de164a1c 100644 --- a/src/OpenProtocolInterpreter/ApplicationController/ApplicationControllerMessages.cs +++ b/src/OpenProtocolInterpreter/ApplicationController/ApplicationControllerMessages.cs @@ -11,9 +11,9 @@ internal class ApplicationControllerMessages : MessagesTemplate { public ApplicationControllerMessages() : base() { - _templates = new Dictionary() + _templates = new Dictionary>() { - { Mid0270.MID, new MidCompiledInstance(typeof(Mid0270)) } + { Mid0270.MID, new CompiledInstance(typeof(Mid0270)) } }; } diff --git a/src/OpenProtocolInterpreter/ApplicationSelector/ApplicationSelectorMessages.cs b/src/OpenProtocolInterpreter/ApplicationSelector/ApplicationSelectorMessages.cs index 0c65896a..7fedb7f1 100644 --- a/src/OpenProtocolInterpreter/ApplicationSelector/ApplicationSelectorMessages.cs +++ b/src/OpenProtocolInterpreter/ApplicationSelector/ApplicationSelectorMessages.cs @@ -11,14 +11,14 @@ internal class ApplicationSelectorMessages : MessagesTemplate { public ApplicationSelectorMessages() : base() { - _templates = new Dictionary() + _templates = new Dictionary>() { - { Mid0250.MID, new MidCompiledInstance(typeof(Mid0250)) }, - { Mid0251.MID, new MidCompiledInstance(typeof(Mid0251)) }, - { Mid0252.MID, new MidCompiledInstance(typeof(Mid0252)) }, - { Mid0253.MID, new MidCompiledInstance(typeof(Mid0253)) }, - { Mid0254.MID, new MidCompiledInstance(typeof(Mid0254)) }, - { Mid0255.MID, new MidCompiledInstance(typeof(Mid0255)) } + { Mid0250.MID, new CompiledInstance(typeof(Mid0250)) }, + { Mid0251.MID, new CompiledInstance(typeof(Mid0251)) }, + { Mid0252.MID, new CompiledInstance(typeof(Mid0252)) }, + { Mid0253.MID, new CompiledInstance(typeof(Mid0253)) }, + { Mid0254.MID, new CompiledInstance(typeof(Mid0254)) }, + { Mid0255.MID, new CompiledInstance(typeof(Mid0255)) } }; } diff --git a/src/OpenProtocolInterpreter/ApplicationSelector/Mid0251.cs b/src/OpenProtocolInterpreter/ApplicationSelector/Mid0251.cs index cc713022..83869e76 100644 --- a/src/OpenProtocolInterpreter/ApplicationSelector/Mid0251.cs +++ b/src/OpenProtocolInterpreter/ApplicationSelector/Mid0251.cs @@ -1,4 +1,6 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.Reflection; using System.Text; namespace OpenProtocolInterpreter.ApplicationSelector @@ -6,9 +8,9 @@ namespace OpenProtocolInterpreter.ApplicationSelector /// /// Selector socket info /// - /// This message is sent each time a socket is lifted or put back in position. - /// This MID contains the device ID of the selector the information is coming from, - /// the number of sockets of the selector device, and the current status of each socket + /// This message is sent each time a socket is lifted or put back in position. + /// This MID contains the device ID of the selector the information is coming from, + /// the number of sockets of the selector device, and the current status of each socket /// (lifted or not lifted). /// /// Message sent by: Controller @@ -18,16 +20,13 @@ public class Mid0251 : Mid, IApplicationSelector, IController, IAcknowledgeable< { public const int MID = 251; - public int DeviceId - { - get => GetField(1, DataFields.DeviceId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.DeviceId).SetValue(OpenProtocolConvert.ToString, value); - } - public int NumberOfSockets - { - get => GetField(1, DataFields.NumberOfSockets).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.NumberOfSockets).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 2)] + public int DeviceId { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 2, Index = 24, Size = 2)] + public int NumberOfSockets { get; set; } + + [SocketStatusListDefinition(revision: 1, field: 3, Index = 28)] public List SocketStatus { get; set; } public Mid0251() : this(new Header() @@ -46,59 +45,58 @@ public Mid0251(Header header) : base(header) public override string Pack() { - GetField(1, DataFields.SocketStatus).Size = NumberOfSockets; - GetField(1, DataFields.SocketStatus).Value = PackSocketStatus(); + NumberOfSockets = SocketStatus.Count; + GetField(nameof(SocketStatus)).Size = NumberOfSockets; return base.Pack(); } - public override Mid Parse(string package) + protected override void ProcessDataField(DataField dataField, ReadOnlySpan package) { - Header = ProcessHeader(package); - - GetField(1, DataFields.SocketStatus).Size = Header.Length - 30; - ProcessDataFields(package); - SocketStatus = ParseSocketStatus(GetField(1, DataFields.SocketStatus).Value); - return this; + if (dataField.Field == 3) + { + dataField.Size = NumberOfSockets; + } + base.ProcessDataField(dataField, package); } - protected virtual string PackSocketStatus() + private class SocketStatusListDefinitionAttribute : DataFieldDefinitionAttribute { - var builder = new StringBuilder(SocketStatus.Count); - foreach (var v in SocketStatus) - builder.Append(OpenProtocolConvert.ToString(v)); - - return builder.ToString(); - } + public SocketStatusListDefinitionAttribute(int revision) : base(revision) + { - protected virtual List ParseSocketStatus(string section) - { - var list = new List(); - foreach (var c in section) - list.Add(OpenProtocolConvert.ToBoolean(c.ToString())); + } + public SocketStatusListDefinitionAttribute(int field, int revision) : base(field, revision) + { - return list; - } + } - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() + internal override DataField Build(object owner, PropertyInfo propertyInfo, int index) { + return new DataField>(Field, index, Size, HasPrefix) { - 1, new List() - { - DataField.Number(DataFields.DeviceId, 20, 2), - DataField.Number(DataFields.NumberOfSockets, 24, 2), - DataField.Volatile(DataFields.SocketStatus, 28) - } - } - }; - } + DefaultConverter = PackSocketStatus, + DefaultParser = ParseSocketStatus + }.Bind(owner, propertyInfo); + } - protected enum DataFields - { - DeviceId, - NumberOfSockets, - SocketStatus + protected static string PackSocketStatus(char paddingChar, int size, PaddingOrientation orientation, List socketStatus) + { + var builder = new StringBuilder(socketStatus.Count); + foreach (var v in socketStatus) + builder.Append(OpenProtocolConvert.ToString(v)); + + return builder.ToString(); + } + + protected static List ParseSocketStatus(string section) + { + var span = section.AsSpan(); + var list = new List(span.Length); + for (int i = 0; i < span.Length; i++) + list.Add(OpenProtocolConvert.ToBoolean(span.Slice(i, 1))); + + return list; + } } } } diff --git a/src/OpenProtocolInterpreter/ApplicationSelector/Mid0254.cs b/src/OpenProtocolInterpreter/ApplicationSelector/Mid0254.cs index 86a1b29e..ff8db233 100644 --- a/src/OpenProtocolInterpreter/ApplicationSelector/Mid0254.cs +++ b/src/OpenProtocolInterpreter/ApplicationSelector/Mid0254.cs @@ -1,19 +1,21 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; +using System.Reflection; using System.Text; namespace OpenProtocolInterpreter.ApplicationSelector { /// /// Selector control green lights - /// - /// This message controls the selector green lights. - /// The green light can be set (steady), reset (off) or flash. + /// + /// This message controls the selector green lights. + /// The green light can be set (steady), reset (off) or flash. /// A command must be sent for each one of the selector positions (1-8). /// /// - /// Note: This MID only works when the selector is put in external controlled mode and - /// this is only possible when the selector is loaded with software 1.20 or later. + /// Note: This MID only works when the selector is put in external controlled mode and + /// this is only possible when the selector is loaded with software 1.20 or later. /// /// Message sent by: Integrator /// Answer: Command accepted or Command error, Faulty IO device ID @@ -24,11 +26,10 @@ public class Mid0254 : Mid, IApplicationSelector, IIntegrator, IAcceptableComman public IEnumerable DocumentedPossibleErrors => new Error[] { Error.FaultyIODeviceId }; - public int DeviceId - { - get => GetField(1, DataFields.DeviceId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.DeviceId).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 2)] + public int DeviceId { get; set; } + + [EnumCollectionDefinition(revision: 1, field: 2, Index = 24, Size = 8)] public List GreenLights { get; set; } public Mid0254() : this(new Header() @@ -44,56 +45,5 @@ public Mid0254(Header header) : base(header) { GreenLights ??= []; } - - public override string Pack() - { - GetField(1, DataFields.GreenLightCommand).Value = PackGreenLights(); - return base.Pack(); - } - - public override Mid Parse(string package) - { - base.Parse(package); - GreenLights = ParseGreenLights(GetField(1, DataFields.GreenLightCommand).Value).ToList(); - return this; - } - - protected virtual string PackGreenLights() - { - var builder = new StringBuilder(GreenLights.Count); - foreach (var e in GreenLights) - builder.Append(OpenProtocolConvert.ToString((int)e)); - - return builder.ToString(); - } - - protected virtual List ParseGreenLights(string value) - { - var list = new List(); - foreach (var c in value) - list.Add((LightCommand)OpenProtocolConvert.ToInt32(c.ToString())); - - return list; - } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.DeviceId, 20, 2), - new(DataFields.GreenLightCommand, 24, 8) - } - } - }; - } - - protected enum DataFields - { - DeviceId, - GreenLightCommand - } } } diff --git a/src/OpenProtocolInterpreter/ApplicationSelector/Mid0255.cs b/src/OpenProtocolInterpreter/ApplicationSelector/Mid0255.cs index 774aa843..fa0ee764 100644 --- a/src/OpenProtocolInterpreter/ApplicationSelector/Mid0255.cs +++ b/src/OpenProtocolInterpreter/ApplicationSelector/Mid0255.cs @@ -1,18 +1,18 @@ -using System.Collections.Generic; -using System.Text; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.ApplicationSelector { /// /// Selector control red lights /// - /// This message controls the selector red lights. - /// The green light can be set (steady), reset (off) or flash. + /// This message controls the selector red lights. + /// The green light can be set (steady), reset (off) or flash. /// A command must be sent for each one of the selector positions (1-8). /// /// - /// Note: This MID only works when the selector is put in external controlled mode and - /// this is only possible when the selector is loaded with software 1.20 or later. + /// Note: This MID only works when the selector is put in external controlled mode and + /// this is only possible when the selector is loaded with software 1.20 or later. /// /// Message sent by: Integrator /// Answer: Command accepted or Command error, Faulty IO device ID @@ -23,11 +23,9 @@ public class Mid0255 : Mid, IApplicationSelector, IIntegrator, IAcceptableComman public IEnumerable DocumentedPossibleErrors => new Error[] { Error.FaultyIODeviceId }; - public int DeviceId - { - get => GetField(1, DataFields.DeviceId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.DeviceId).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 2)] + public int DeviceId { get; set; } + [EnumCollectionDefinition(revision: 1, field: 2, Index = 24, Size = 8)] public List RedLights { get; set; } public Mid0255() : this(new Header() @@ -36,63 +34,12 @@ public Mid0255() : this(new Header() Revision = DEFAULT_REVISION }) { - + } public Mid0255(Header header) : base(header) { RedLights ??= []; } - - public override string Pack() - { - GetField(1, DataFields.RedLightCommand).Value = PackRedLights(); - return base.Pack(); - } - - public override Mid Parse(string package) - { - base.Parse(package); - RedLights = ParseRedLights(GetField(1, DataFields.RedLightCommand).Value); - return this; - } - - protected virtual string PackRedLights() - { - var builder = new StringBuilder(RedLights.Count); - foreach (var e in RedLights) - builder.Append(OpenProtocolConvert.ToString(e)); - - return builder.ToString(); - } - - protected virtual List ParseRedLights(string value) - { - var list = new List(); - foreach (var c in value) - list.Add((LightCommand)OpenProtocolConvert.ToInt32(c.ToString())); - - return list; - } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.DeviceId, 20, 2), - new(DataFields.RedLightCommand, 24, 8) - } - } - }; - } - - protected enum DataFields - { - DeviceId, - RedLightCommand - } } } diff --git a/src/OpenProtocolInterpreter/ApplicationToolLocationSystem/ApplicationToolLocationSystemMessages.cs b/src/OpenProtocolInterpreter/ApplicationToolLocationSystem/ApplicationToolLocationSystemMessages.cs index e5e6b24f..04828634 100644 --- a/src/OpenProtocolInterpreter/ApplicationToolLocationSystem/ApplicationToolLocationSystemMessages.cs +++ b/src/OpenProtocolInterpreter/ApplicationToolLocationSystem/ApplicationToolLocationSystemMessages.cs @@ -11,14 +11,14 @@ internal class ApplicationToolLocationSystemMessages : MessagesTemplate { public ApplicationToolLocationSystemMessages() : base() { - _templates = new Dictionary() + _templates = new Dictionary>() { - { Mid0260.MID, new MidCompiledInstance(typeof(Mid0260)) }, - { Mid0261.MID, new MidCompiledInstance(typeof(Mid0261)) }, - { Mid0262.MID, new MidCompiledInstance(typeof(Mid0262)) }, - { Mid0263.MID, new MidCompiledInstance(typeof(Mid0263)) }, - { Mid0264.MID, new MidCompiledInstance(typeof(Mid0264)) }, - { Mid0265.MID, new MidCompiledInstance(typeof(Mid0265)) } + { Mid0260.MID, new CompiledInstance(typeof(Mid0260)) }, + { Mid0261.MID, new CompiledInstance(typeof(Mid0261)) }, + { Mid0262.MID, new CompiledInstance(typeof(Mid0262)) }, + { Mid0263.MID, new CompiledInstance(typeof(Mid0263)) }, + { Mid0264.MID, new CompiledInstance(typeof(Mid0264)) }, + { Mid0265.MID, new CompiledInstance(typeof(Mid0265)) } }; } diff --git a/src/OpenProtocolInterpreter/ApplicationToolLocationSystem/Mid0262.cs b/src/OpenProtocolInterpreter/ApplicationToolLocationSystem/Mid0262.cs index 7406f2b4..8bf70d06 100644 --- a/src/OpenProtocolInterpreter/ApplicationToolLocationSystem/Mid0262.cs +++ b/src/OpenProtocolInterpreter/ApplicationToolLocationSystem/Mid0262.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.ApplicationToolLocationSystem { @@ -12,11 +13,8 @@ public class Mid0262 : Mid, IApplicationToolLocationSystem, IController, IAcknow { public const int MID = 262; - public string ToolTagId - { - get => GetField(1, DataFields.ToolTagId).Value; - set => GetField(1, DataFields.ToolTagId).SetValue(value); - } + [StringDataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 8)] + public string ToolTagId { get; set; } public Mid0262() : base(MID, DEFAULT_REVISION) { @@ -27,23 +25,5 @@ public Mid0262(Header header) : base(header) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.String(DataFields.ToolTagId, 20, 8) - } - } - }; - } - - protected enum DataFields - { - ToolTagId - } } } diff --git a/src/OpenProtocolInterpreter/ApplicationToolLocationSystem/Mid0265.cs b/src/OpenProtocolInterpreter/ApplicationToolLocationSystem/Mid0265.cs index cca95998..b4f00da7 100644 --- a/src/OpenProtocolInterpreter/ApplicationToolLocationSystem/Mid0265.cs +++ b/src/OpenProtocolInterpreter/ApplicationToolLocationSystem/Mid0265.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.ApplicationToolLocationSystem { @@ -14,16 +15,11 @@ public class Mid0265 : Mid, IApplicationToolLocationSystem, IIntegrator, IAccept public IEnumerable DocumentedPossibleErrors => new Error[] { Error.MidRevisionUnsupported }; - public string ToolTagId - { - get => GetField(1, DataFields.ToolTagId).Value; - set => GetField(1, DataFields.ToolTagId).SetValue(value); - } - public ToolStatus ToolStatus - { - get => (ToolStatus)GetField(1, DataFields.ToolStatus).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.ToolStatus).SetValue(OpenProtocolConvert.ToString, value); - } + [StringDataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 8)] + public string ToolTagId { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 2, Index = 30, Size = 2)] + public ToolStatus ToolStatus { get; set; } public Mid0265() : this(new Header() { @@ -38,25 +34,5 @@ public Mid0265(Header header) : base(header) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.String(DataFields.ToolTagId, 20, 8), - DataField.Number(DataFields.ToolStatus, 30, 2) - } - } - }; - } - - protected enum DataFields - { - ToolTagId, - ToolStatus - } } } diff --git a/src/OpenProtocolInterpreter/AutomaticManualMode/AutomaticManualModeMessages.cs b/src/OpenProtocolInterpreter/AutomaticManualMode/AutomaticManualModeMessages.cs index 07d63e8d..881ea0a0 100644 --- a/src/OpenProtocolInterpreter/AutomaticManualMode/AutomaticManualModeMessages.cs +++ b/src/OpenProtocolInterpreter/AutomaticManualMode/AutomaticManualModeMessages.cs @@ -11,14 +11,14 @@ internal class AutomaticManualModeMessages : MessagesTemplate { public AutomaticManualModeMessages() : base() { - _templates = new Dictionary() + _templates = new Dictionary>() { - { Mid0400.MID, new MidCompiledInstance(typeof(Mid0400)) }, - { Mid0401.MID, new MidCompiledInstance(typeof(Mid0401)) }, - { Mid0402.MID, new MidCompiledInstance(typeof(Mid0402)) }, - { Mid0403.MID, new MidCompiledInstance(typeof(Mid0403)) }, - { Mid0410.MID, new MidCompiledInstance(typeof(Mid0410)) }, - { Mid0411.MID, new MidCompiledInstance(typeof(Mid0411)) } + { Mid0400.MID, new CompiledInstance(typeof(Mid0400)) }, + { Mid0401.MID, new CompiledInstance(typeof(Mid0401)) }, + { Mid0402.MID, new CompiledInstance(typeof(Mid0402)) }, + { Mid0403.MID, new CompiledInstance(typeof(Mid0403)) }, + { Mid0410.MID, new CompiledInstance(typeof(Mid0410)) }, + { Mid0411.MID, new CompiledInstance(typeof(Mid0411)) } }; } diff --git a/src/OpenProtocolInterpreter/AutomaticManualMode/Mid0401.cs b/src/OpenProtocolInterpreter/AutomaticManualMode/Mid0401.cs index e5273e59..e0cc888d 100644 --- a/src/OpenProtocolInterpreter/AutomaticManualMode/Mid0401.cs +++ b/src/OpenProtocolInterpreter/AutomaticManualMode/Mid0401.cs @@ -1,11 +1,12 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.AutomaticManualMode { /// /// Automatic/Manual mode /// - /// The operation mode in the controller has changed. + /// The operation mode in the controller has changed. /// The message includes the new operational mode of the controller. /// /// Message sent by: Controller @@ -19,11 +20,8 @@ public class Mid0401 : Mid, IAutomaticManualMode, IController, IAcknowledgeable< /// Automatic Mode = false (0) /// Manual Mode = true (1) /// - public bool ManualAutomaticMode - { - get => GetField(1, DataFields.ManualAutomaticMode).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(1, DataFields.ManualAutomaticMode).SetValue(OpenProtocolConvert.ToString, value); - } + [BooleanDataFieldDefinition(revision: 1, field: 1, Index = 20, HasPrefix = false)] + public bool ManualAutomaticMode { get; set; } public Mid0401() : this(new Header() { @@ -37,23 +35,5 @@ public Mid0401() : this(new Header() public Mid0401(Header header) : base(header) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Boolean(DataFields.ManualAutomaticMode, 20, false) - } - } - }; - } - - protected enum DataFields - { - ManualAutomaticMode - } } } diff --git a/src/OpenProtocolInterpreter/AutomaticManualMode/Mid0411.cs b/src/OpenProtocolInterpreter/AutomaticManualMode/Mid0411.cs index 0cf5e0e9..2fb52e25 100644 --- a/src/OpenProtocolInterpreter/AutomaticManualMode/Mid0411.cs +++ b/src/OpenProtocolInterpreter/AutomaticManualMode/Mid0411.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.AutomaticManualMode { @@ -7,7 +8,7 @@ namespace OpenProtocolInterpreter.AutomaticManualMode /// /// Information about the setting of AutoDisable tightening in the controller. Also contains information about the currently running batch. /// The settings are reserved for single parameter sets with batch and are not available while running Job. - /// + /// /// /// Power Macs use: /// “OKs to disable station” is a parameter in Tools Talk PowerMACS and specifies the number of cycles with status OK or OKR that may be run while in Automatic mode before the station is automatically disabled. It is sent as two ASCII digits, a 0 means the function is not in use. @@ -32,48 +33,22 @@ public class Mid0411 : Mid, IAutomaticManualMode, IController { public const int MID = 411; - public int AutoDisableSetting - { - get => GetField(1, DataFields.AutoDisableSetting).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.AutoDisableSetting).SetValue(OpenProtocolConvert.ToString, value); - } - public int CurrentBatch - { - get => GetField(1, DataFields.CurrentBatch).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.CurrentBatch).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 2, HasPrefix = false)] + public int AutoDisableSetting { get; set; } + [Int32DataFieldDefinition(revision: 1, field: 2, Index = 22, Size = 2, HasPrefix = false)] + public int CurrentBatch { get; set; } public Mid0411() : this(new Header() { - Mid= MID, + Mid = MID, Revision = DEFAULT_REVISION }) { - - } - - public Mid0411(Header header) : base(header) - { - } - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.AutoDisableSetting, 20, 2, false), - DataField.Number(DataFields.CurrentBatch, 22, 2, false) - } - } - }; } - protected enum DataFields + public Mid0411(Header header) : base(header) { - AutoDisableSetting, - CurrentBatch } } } diff --git a/src/OpenProtocolInterpreter/Communication/CommunicationMessages.cs b/src/OpenProtocolInterpreter/Communication/CommunicationMessages.cs index f210b320..3fcef47c 100644 --- a/src/OpenProtocolInterpreter/Communication/CommunicationMessages.cs +++ b/src/OpenProtocolInterpreter/Communication/CommunicationMessages.cs @@ -11,16 +11,16 @@ internal class CommunicationMessages : MessagesTemplate { public CommunicationMessages() : base() { - _templates = new Dictionary() + _templates = new Dictionary>() { - { Mid0001.MID, new MidCompiledInstance(typeof(Mid0001)) }, - { Mid0002.MID, new MidCompiledInstance(typeof(Mid0002)) }, - { Mid0003.MID, new MidCompiledInstance(typeof(Mid0003)) }, - { Mid0004.MID, new MidCompiledInstance(typeof(Mid0004)) }, - { Mid0005.MID, new MidCompiledInstance(typeof(Mid0005)) }, - { Mid0006.MID, new MidCompiledInstance(typeof(Mid0006)) }, - { Mid0008.MID, new MidCompiledInstance(typeof(Mid0008)) }, - { Mid0009.MID, new MidCompiledInstance(typeof(Mid0009)) } + { Mid0001.MID, new CompiledInstance(typeof(Mid0001)) }, + { Mid0002.MID, new CompiledInstance(typeof(Mid0002)) }, + { Mid0003.MID, new CompiledInstance(typeof(Mid0003)) }, + { Mid0004.MID, new CompiledInstance(typeof(Mid0004)) }, + { Mid0005.MID, new CompiledInstance(typeof(Mid0005)) }, + { Mid0006.MID, new CompiledInstance(typeof(Mid0006)) }, + { Mid0008.MID, new CompiledInstance(typeof(Mid0008)) }, + { Mid0009.MID, new CompiledInstance(typeof(Mid0009)) } }; } diff --git a/src/OpenProtocolInterpreter/Communication/Mid0001.cs b/src/OpenProtocolInterpreter/Communication/Mid0001.cs index 5cb16c3f..523e2ea9 100644 --- a/src/OpenProtocolInterpreter/Communication/Mid0001.cs +++ b/src/OpenProtocolInterpreter/Communication/Mid0001.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.Communication { @@ -14,11 +15,14 @@ public class Mid0001 : Mid, ICommunication, IIntegrator, IAnswerableBy, public IEnumerable DocumentedPossibleErrors => new Error[] { Error.ClientAlreadyConnected, Error.MidRevisionUnsupported }; - public bool OptionalKeepAlive - { - get => GetField(7, DataFields.UseKeepAlive).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(7, DataFields.UseKeepAlive).SetValue(OpenProtocolConvert.ToString, value); - } + [BooleanDataFieldDefinition(revision: 7, field: 1)] + public bool OptionalKeepAlive { get; set; } + + [BooleanDataFieldDefinition(revision: 8, field: 2)] + public bool OptionalToolLockAtDisconnection { get; set; } + + [DecimalDataFieldDefinition(revision: 8, field: 3, Size = 4)] + public decimal OptionalEarlyLock { get; set; } public Mid0001() : this(DEFAULT_REVISION) { @@ -35,26 +39,6 @@ public Mid0001(int revision) : this(new Header() Revision = revision }) { - - } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 7, new List() - { - DataField.Boolean(DataFields.UseKeepAlive, 20) - } - } - }; - } - - protected enum DataFields - { - //Rev 7 - UseKeepAlive } } } diff --git a/src/OpenProtocolInterpreter/Communication/Mid0002.cs b/src/OpenProtocolInterpreter/Communication/Mid0002.cs index d0d81c68..414fb060 100644 --- a/src/OpenProtocolInterpreter/Communication/Mid0002.cs +++ b/src/OpenProtocolInterpreter/Communication/Mid0002.cs @@ -1,11 +1,12 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.Communication { /// /// Application Communication start acknowledge /// - /// When accepting the communication start the controller sends as reply, + /// When accepting the communication start the controller sends as reply, /// a Communication start acknowledge. This message contains some basic information about the /// controller, such as cell ID, channel ID, and name. /// @@ -16,68 +17,39 @@ public class Mid0002 : Mid, ICommunication, IController { public const int MID = 2; - public int CellId - { - get => GetField(1, DataFields.CellId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.CellId).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 4)] + public int CellId { get; set; } - public int ChannelId - { - get => GetField(1, DataFields.ChannelId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.ChannelId).SetValue(OpenProtocolConvert.ToString, value); - } - public string ControllerName - { - get => GetField(1, DataFields.ControllerName).Value; - set => GetField(1, DataFields.ControllerName).SetValue(value); - } + [Int32DataFieldDefinition(revision: 1, field: 2, Index = 26, Size = 2)] + public int ChannelId { get; set; } + + [StringDataFieldDefinition(revision: 1, field: 3, Index = 30, Size = 25)] + public string ControllerName { get; set; } //Rev 2 - public string SupplierCode - { - get => GetField(2, DataFields.SupplierCode).Value; - set => GetField(2, DataFields.SupplierCode).SetValue(value); - } + [StringDataFieldDefinition(revision: 2, field: 4, Index = 57, Size = 3)] + public string SupplierCode { get; set; } //Rev 3 - public string OpenProtocolVersion - { - get => GetField(3, DataFields.OpenProtocolVersion).Value; - set => GetField(3, DataFields.OpenProtocolVersion).SetValue(value); - } + [StringDataFieldDefinition(revision: 3, field: 5, Index = 62, Size = 19)] + public string OpenProtocolVersion { get; set; } - public string ControllerSoftwareVersion - { - get => GetField(3, DataFields.ControllerSoftwareVersion).Value; - set => GetField(3, DataFields.ControllerSoftwareVersion).SetValue(value); - } + [StringDataFieldDefinition(revision: 3, field: 6, Index = 83, Size = 19)] + public string ControllerSoftwareVersion { get; set; } - public string ToolSoftwareVersion - { - get => GetField(3, DataFields.ToolSoftwareVersion).Value; - set => GetField(3, DataFields.ToolSoftwareVersion).SetValue(value); - } + [StringDataFieldDefinition(revision: 3, field: 7, Index = 104, Size = 19)] + public string ToolSoftwareVersion { get; set; } //Rev 4 - public string RBUType - { - get => GetField(4, DataFields.RBUType).Value; - set => GetField(4, DataFields.RBUType).SetValue(value); - } + [StringDataFieldDefinition(revision: 4, field: 8, Index = 125, Size = 24)] + public string RBUType { get; set; } - public string ControllerSerialNumber - { - get => GetField(4, DataFields.ControllerSerialNumber).Value; - set => GetField(4, DataFields.ControllerSerialNumber).SetValue(value); - } + [StringDataFieldDefinition(revision: 4, field: 9, Index = 151, Size = 10)] + public string ControllerSerialNumber { get; set; } - //Rev 5 - public SystemType SystemType - { - get => (SystemType)GetField(5, DataFields.SystemType).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(5, DataFields.SystemType).SetValue(OpenProtocolConvert.ToString, value); - } + //Rev 5 + [Int32DataFieldDefinition(revision: 5, field: 10, Index = 163, Size = 3)] + public SystemType SystemType { get; set; } /// /// If no subtype exists it will be set to 000 @@ -87,61 +59,47 @@ public SystemType SystemType /// 001 = a normal tightening system /// 002 = a system running presses instead of spindles. /// - public SystemSubType SystemSubType - { - get => (SystemSubType)GetField(5, DataFields.SystemSubtype).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(5, DataFields.SystemSubtype).SetValue(OpenProtocolConvert.ToString, value); - } + + [Int32DataFieldDefinition(revision: 5, field: 11, Index = 168, Size = 3)] + public SystemSubType SystemSubType { get; set; } //Rev 6 - public bool SequenceNumberSupport - { - get => GetField(6, DataFields.SequenceNumberSupport).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(6, DataFields.SequenceNumberSupport).SetValue(OpenProtocolConvert.ToString, value); - } + [BooleanDataFieldDefinition(revision: 6, field: 12, Index = 173)] + public bool SequenceNumberSupport { get; set; } - public bool LinkingHandlingSupport - { - get => GetField(6, DataFields.LinkingHandlingSupport).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(6, DataFields.LinkingHandlingSupport).SetValue(OpenProtocolConvert.ToString, value); - } + [BooleanDataFieldDefinition(revision: 6, field: 13, Index = 176)] + public bool LinkingHandlingSupport { get; set; } /// /// Station ID for PF6000 /// Cell ID for PF4000 /// - public long StationCellId - { - get => GetField(6, DataFields.StationCellId).GetValue(OpenProtocolConvert.ToInt64); - set => GetField(6, DataFields.StationCellId).SetValue(OpenProtocolConvert.ToString, value); - } + [Int64DataFieldDefinition(revision: 6, field: 14, Index = 179, Size = 10)] + public long StationCellId { get; set; } /// /// Station ID for PF6000 /// Cell ID for PF4000 /// - public string StationCellName - { - get => GetField(6, DataFields.StationCellName).Value; - set => GetField(6, DataFields.StationCellName).SetValue(value); - } + [StringDataFieldDefinition(revision: 6, field: 15, Index = 191, Size = 25)] + public string StationCellName { get; set; } - public string ClientId - { - get => GetField(6, DataFields.ClientId).Value; - set => GetField(6, DataFields.ClientId).SetValue(value); - } + [StringDataFieldDefinition(revision: 6, field: 16, Index = 218, Size = 1)] + public string ClientId { get; set; } //Rev 7 /// - /// False = Use Keep alive (Keep alive is mandatory) + /// False = Use Keep alive (Keep alive is mandatory) /// True = Ignore Keep alive (Keep alive is optional) /// - public bool OptionalKeepAlive - { - get => GetField(7, DataFields.OptionalKeepAlive).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(7, DataFields.OptionalKeepAlive).SetValue(OpenProtocolConvert.ToString, value); - } + [BooleanDataFieldDefinition(revision: 7, field: 17, Index = 221)] + public bool OptionalKeepAlive { get; set; } + + [BooleanDataFieldDefinition(revision: 8, field: 18, Index = 224)] + public bool OptionalToolLockAtDisconnection { get; set; } + + [DecimalDataFieldDefinition(revision: 8, field: 19, Index = 227, Size = 1)] + public decimal OptionalEarlyLock { get; set; } public Mid0002() : this(DEFAULT_REVISION) { @@ -155,98 +113,11 @@ public Mid0002(Header header) : base(header) public Mid0002(int revision) : this(new Header() { - Mid= MID, + Mid = MID, Revision = revision }) { - - } - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.CellId, 20, 4), - DataField.Number(DataFields.ChannelId, 26, 2), - DataField.String(DataFields.ControllerName, 30, 25) - } - }, - { - 2, new List() - { - DataField.String(DataFields.SupplierCode, 57, 3) - } - }, - { - 3, new List() - { - DataField.String(DataFields.OpenProtocolVersion, 62, 19), - DataField.String(DataFields.ControllerSoftwareVersion, 83, 19), - DataField.String(DataFields.ToolSoftwareVersion, 104, 19) - } - }, - { - 4, new List() - { - DataField.String(DataFields.RBUType, 125, 24), - DataField.String(DataFields.ControllerSerialNumber, 151, 10) - } - }, - { - 5, new List() - { - DataField.Number(DataFields.SystemType, 163, 3), - DataField.Number(DataFields.SystemSubtype, 168, 3) - } - }, - { - 6, new List() - { - DataField.Boolean(DataFields.SequenceNumberSupport, 173), - DataField.Boolean(DataFields.LinkingHandlingSupport, 176), - DataField.Number(DataFields.StationCellId, 179, 10), - DataField.String(DataFields.StationCellName, 191, 25), - DataField.String(DataFields.ClientId, 218, 1) - } - }, - { - 7, new List() - { - DataField.Boolean(DataFields.OptionalKeepAlive, 221) - } - } - }; - } - - protected enum DataFields - { - //Rev 1 - CellId, - ChannelId, - ControllerName, - //Rev 2 - SupplierCode, - //Rev 3 - OpenProtocolVersion, - ControllerSoftwareVersion, - ToolSoftwareVersion, - //Rev 4 - RBUType, - ControllerSerialNumber, - //Rev 5 - SystemType, - SystemSubtype, - //Rev 6 - SequenceNumberSupport, - LinkingHandlingSupport, - StationCellId, - StationCellName, - ClientId, - //Rev 7 - OptionalKeepAlive } } } diff --git a/src/OpenProtocolInterpreter/Communication/Mid0004.cs b/src/OpenProtocolInterpreter/Communication/Mid0004.cs index b1878b3c..7ef93027 100644 --- a/src/OpenProtocolInterpreter/Communication/Mid0004.cs +++ b/src/OpenProtocolInterpreter/Communication/Mid0004.cs @@ -1,18 +1,21 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; namespace OpenProtocolInterpreter.Communication { /// /// Application Communication negative acknowledge /// - /// This message is used by the controller when a request, command or subscription for any reason has - /// not been performed. + /// This message is used by the controller when a request, command or subscription for any reason has + /// not been performed. /// The data field contains the message ID of the message request that failed as well as an error code. /// It can also be used by the integrator to acknowledge received subscribed data/events upload and will /// then do all the special subscription data acknowledges obsolete. /// /// - /// When using the communication acknowledgement of MID 0007 and together with sequence + /// When using the communication acknowledgement of MID 0007 and together with sequence /// numbering this is an application level message only. /// /// Message sent by: Controller @@ -22,16 +25,13 @@ public class Mid0004 : Mid, ICommunication, IController { public const int MID = 4; - public int FailedMid - { - get => GetField(1, DataFields.Mid).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.Mid).SetValue(OpenProtocolConvert.ToString, value); - } - public Error ErrorCode - { - get => (Error)GetField(1, DataFields.ErrorCode).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.ErrorCode).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 4, HasPrefix = false)] + [Int32DataFieldDefinition(revision: 2, field: 1, Index = 20, Size = 4, HasPrefix = false)] + public int FailedMid { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 2, Index = 24, Size = 2, HasPrefix = false)] + [Int32DataFieldDefinition(revision: 2, field: 2, Index = 24, Size = 3, HasPrefix = false)] + public Error ErrorCode { get; set; } public Mid0004() : this(DEFAULT_REVISION) { @@ -51,45 +51,37 @@ public Mid0004(int revision) : this(new Header() } - public override string Pack() + protected override string BuildHeader() { - HandleRevision(); - return base.Pack(); - } + if (RevisionsByFields.TryGetValue(Header.StandardizedRevision, out var dataFields)) + { + Header.Length = Header.DefaultSize + dataFields.Sum(x => x.TotalSize); + } - public override Mid Parse(string package) - { - Header = ProcessHeader(package); - HandleRevision(); - ProcessDataFields(package); - return this; + return Header.ToString(); } - private void HandleRevision() + public override string Pack() { - var errorCodeField = GetField(1, DataFields.ErrorCode); - errorCodeField.Size = Header.Revision > 1 ? 3 : 2; + if (!RevisionsByFields.TryGetValue(Header.StandardizedRevision, out var dataFields)) + { + throw new InvalidOperationException($"No data fields defined for revision {Header.StandardizedRevision}"); + } + + var builder = new StringBuilder(BuildHeader()); + builder.Append(base.Pack(dataFields)); + return builder.ToString(); } - protected override Dictionary> RegisterDatafields() + protected override void ProcessDataFields(ReadOnlySpan package) { - return new Dictionary>() + if (!RevisionsByFields.TryGetValue(Header.StandardizedRevision, out var dataFields)) { - { - 1, new List() - { - DataField.Number(DataFields.Mid, 20, 4, false), - DataField.Number(DataFields.ErrorCode, 24, 2, false) - } - } - }; - } - + throw new InvalidOperationException($"No data fields defined for revision {Header.StandardizedRevision}"); + } - protected enum DataFields - { - Mid, - ErrorCode + base.ProcessDataFields(dataFields, package); } + } } diff --git a/src/OpenProtocolInterpreter/Communication/Mid0005.cs b/src/OpenProtocolInterpreter/Communication/Mid0005.cs index 994aee2e..e63f914e 100644 --- a/src/OpenProtocolInterpreter/Communication/Mid0005.cs +++ b/src/OpenProtocolInterpreter/Communication/Mid0005.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.Communication { @@ -26,11 +27,8 @@ public class Mid0005 : Mid, ICommunication, IController { public const int MID = 5; - public int MidAccepted - { - get => GetField(1, DataFields.MidAccepted).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.MidAccepted).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 4, HasPrefix = false)] + public int MidAccepted { get; set; } public Mid0005() : this(DEFAULT_REVISION) { @@ -49,23 +47,5 @@ public Mid0005(int revision) : this(new Header() { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.MidAccepted, 20, 4, false) - } - } - }; - } - - protected enum DataFields - { - MidAccepted - } } } diff --git a/src/OpenProtocolInterpreter/Communication/Mid0006.cs b/src/OpenProtocolInterpreter/Communication/Mid0006.cs index dce6fd7e..f55c9051 100644 --- a/src/OpenProtocolInterpreter/Communication/Mid0006.cs +++ b/src/OpenProtocolInterpreter/Communication/Mid0006.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System; namespace OpenProtocolInterpreter.Communication { @@ -7,82 +7,70 @@ namespace OpenProtocolInterpreter.Communication /// /// Do a request for data. This message is used for ALL request handling. /// When used it substitutes the use of all MID special request messages. - /// + /// /// - /// NOTE! The Header Revision field is the revision of the itself NOT + /// NOTE! The Header Revision field is the revision of the itself NOT /// the revision of the data MID that is wanted to be uploaded. /// /// Message sent by: Integrator /// Answer: MID Requested for or Command error. Error described at each MID description. /// - public class Mid0006 : Mid, ICommunication, IIntegrator + public class Mid0006 : Mid, ICommunication, IIntegrator, IExtraDataContainer { public const int MID = 6; - public int RequestedMid - { - get => GetField(1, DataFields.RequestedMid).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.RequestedMid).SetValue(OpenProtocolConvert.ToString, value); - } - public int WantedRevision - { - get => GetField(1, DataFields.WantedRevision).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.WantedRevision).SetValue(OpenProtocolConvert.ToString, value); - } - public int ExtraDataLength - { - get => GetField(1, DataFields.ExtraDataLength).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.ExtraDataLength).SetValue(OpenProtocolConvert.ToString, value); - } - public string ExtraData - { - get => GetField(1, DataFields.ExtraData).Value; - set => GetField(1, DataFields.ExtraData).SetValue(value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 4, HasPrefix = false)] + public int RequestedMid { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 2, Index = 24, Size = 3, HasPrefix = false)] + public int WantedRevision { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 3, Index = 27, Size = 2, HasPrefix = false)] + public int ExtraDataLength { get; set; } + + [StringDataFieldDefinition(revision: 1, field: 4, Index = 29, Size = 0, HasPrefix = false)] + public string ExtraData { get; set; } public Mid0006() : this(new Header() { - Mid = MID, + Mid = MID, Revision = DEFAULT_REVISION }) { - + } public Mid0006(Header header) : base(header) { } - public override Mid Parse(string package) + public override string Pack() + { + ExtraDataLength = ExtraData?.Length ?? 0; + HandleExtraDataFieldSize(); + return base.Pack(); + } + + public void SetExtraData(TExtraData extraData) where TExtraData : ExtraData, IExtraDataRequest { - Header = ProcessHeader(package); - GetField(1, DataFields.ExtraData).Size = Header.Length - 29; - ProcessDataFields(package); - return this; + RequestedMid = extraData.Mid; + WantedRevision = extraData.Revision; + ExtraData = extraData.Pack(); + ExtraDataLength = ExtraData?.Length ?? 0; } - protected override Dictionary> RegisterDatafields() + protected override void ProcessDataField(DataField dataField, ReadOnlySpan package) { - return new Dictionary>() + base.ProcessDataField(dataField, package); + if (dataField.Field == 3) { - { - 1, new List() - { - DataField.Number(DataFields.RequestedMid, 20, 4, false), - DataField.Number(DataFields.WantedRevision, 24, 3, false), - DataField.Number(DataFields.ExtraDataLength, 27, 2, false), - DataField.Volatile(DataFields.ExtraData, 29, false) - } - } - }; + HandleExtraDataFieldSize(); + } } - protected enum DataFields + private void HandleExtraDataFieldSize() { - RequestedMid, - WantedRevision, - ExtraDataLength, - ExtraData + GetField(nameof(ExtraData)).Size = ExtraDataLength; } } -} \ No newline at end of file +} diff --git a/src/OpenProtocolInterpreter/Communication/Mid0008.cs b/src/OpenProtocolInterpreter/Communication/Mid0008.cs index 7da632b7..5919a577 100644 --- a/src/OpenProtocolInterpreter/Communication/Mid0008.cs +++ b/src/OpenProtocolInterpreter/Communication/Mid0008.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System; namespace OpenProtocolInterpreter.Communication { @@ -14,34 +14,25 @@ namespace OpenProtocolInterpreter.Communication /// /// Message sent by: Integrator /// - /// Answer: Command accepted with the MID subscribed for or Command error, + /// Answer: Command accepted with the MID subscribed for or Command error, /// MID revision unsupported or Invalid data code and the MID subscribed for /// /// - public class Mid0008 : Mid, ICommunication, IIntegrator + public class Mid0008 : Mid, ICommunication, IIntegrator, IExtraDataContainer { public const int MID = 8; - public string SubscriptionMid - { - get => GetField(1, DataFields.SubscriptionMid).Value; - set => GetField(1, DataFields.SubscriptionMid).SetValue(value); - } - public int WantedRevision - { - get => GetField(1, DataFields.WantedRevision).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.WantedRevision).SetValue(OpenProtocolConvert.ToString, value); - } - public int ExtraDataLength - { - get => GetField(1, DataFields.ExtraDataLength).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.ExtraDataLength).SetValue(OpenProtocolConvert.ToString, value); - } - public string ExtraData - { - get => GetField(1, DataFields.ExtraData).Value; - set => GetField(1, DataFields.ExtraData).SetValue(value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 4, HasPrefix = false)] + public int SubscriptionMid { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 2, Index = 24, Size = 3, HasPrefix = false)] + public int WantedRevision { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 3, Index = 27, Size = 2, HasPrefix = false)] + public int ExtraDataLength { get; set; } + + [StringDataFieldDefinition(revision: 1, field: 4, Index = 29, Size = 0, HasPrefix = false)] + public string ExtraData { get; set; } public Mid0008() : this(new Header() { @@ -49,43 +40,40 @@ public Mid0008() : this(new Header() Revision = DEFAULT_REVISION }) { - + } public Mid0008(Header header) : base(header) { } - public override Mid Parse(string package) + public void SetExtraData(TExtraData extraData) where TExtraData : ExtraData, IExtraDataSubscription + { + SubscriptionMid = extraData.Mid; + WantedRevision = extraData.Revision; + ExtraData = extraData.Pack(); + ExtraDataLength = ExtraData?.Length ?? 0; + } + + public override string Pack() { - Header = ProcessHeader(package); - GetField(1, DataFields.ExtraData).Size = Header.Length - 29; - ProcessDataFields(package); - return this; + ExtraDataLength = ExtraData?.Length ?? 0; + HandleExtraDataFieldSize(); + return base.Pack(); } - protected override Dictionary> RegisterDatafields() + protected override void ProcessDataField(DataField dataField, ReadOnlySpan package) { - return new Dictionary>() + base.ProcessDataField(dataField, package); + if (dataField.Field == 3) { - { - 1, new List() - { - DataField.Number(DataFields.SubscriptionMid, 20, 4, false), - DataField.Number(DataFields.WantedRevision, 24, 3, false), - DataField.Number(DataFields.ExtraDataLength, 27, 2, false), - DataField.Volatile(DataFields.ExtraData, 29, false) - } - } - }; + HandleExtraDataFieldSize(); + } } - protected enum DataFields + private void HandleExtraDataFieldSize() { - SubscriptionMid, - WantedRevision, - ExtraDataLength, - ExtraData + GetField(nameof(ExtraData)).Size = ExtraDataLength; } } } diff --git a/src/OpenProtocolInterpreter/Communication/Mid0009.cs b/src/OpenProtocolInterpreter/Communication/Mid0009.cs index de8d4f4a..daf6c867 100644 --- a/src/OpenProtocolInterpreter/Communication/Mid0009.cs +++ b/src/OpenProtocolInterpreter/Communication/Mid0009.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.Communication { @@ -14,35 +15,28 @@ namespace OpenProtocolInterpreter.Communication /// /// Message sent by: Integrator /// - /// Answer: Command accepted with the MID subscribed for or Command error, + /// Answer: Command accepted with the MID subscribed for or Command error, /// MID revision unsupported or Invalid data code and the MID subscribed for /// /// - public class Mid0009 : Mid, ICommunication, IIntegrator + public class Mid0009 : Mid, ICommunication, IIntegrator, IExtraDataContainer { + private int _extraDataRevision; public const int MID = 9; - public string UnsubscriptionMid - { - get => GetField(1, DataFields.UnsubscriptionMid).Value; - set => GetField(1, DataFields.UnsubscriptionMid).SetValue(value); - } - public int ExtraDataRevision - { - get => GetField(1, DataFields.ExtraDataRevision).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.ExtraDataRevision).SetValue(OpenProtocolConvert.ToString, value); - } - public int ExtraDataLength - { - get => GetField(1, DataFields.ExtraDataLength).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.ExtraDataLength).SetValue(OpenProtocolConvert.ToString, value); - } - public string ExtraData - { - get => GetField(1, DataFields.ExtraData).Value; - set => GetField(1, DataFields.ExtraData).SetValue(value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 4, HasPrefix = false)] + public int UnsubscriptionMid { get; set; } + [Int32DataFieldDefinition(revision: 1, field: 2, Index = 24, Size = 3, HasPrefix = false)] + public int ExtraDataRevision { get => _extraDataRevision; set => _extraDataRevision = value; } + + [Int32DataFieldDefinition(revision: 1, field: 3, Index = 27, Size = 2, HasPrefix = false)] + public int ExtraDataLength { get; set; } + + [StringDataFieldDefinition(revision: 1, field: 4, Index = 29, Size = 0, HasPrefix = false)] + public string ExtraData { get; set; } + + int IExtraDataContainer.WantedRevision { get => _extraDataRevision; set => _extraDataRevision = value; } public Mid0009() : this(new Header() { Mid = MID, @@ -56,36 +50,34 @@ public Mid0009(Header header) : base(header) { } - public override Mid Parse(string package) + public override string Pack() { - Header = ProcessHeader(package); - GetField(1, DataFields.ExtraData).Size = Header.Length - 29; - ProcessDataFields(package); - return this; + ExtraDataLength = ExtraData?.Length ?? 0; + HandleExtraDataFieldSize(); + return base.Pack(); } - protected override Dictionary> RegisterDatafields() + public void SetExtraData(TExtraData extraData) where TExtraData : ExtraData, IExtraDataUnsubscription + { + UnsubscriptionMid = extraData.Mid; + ExtraDataRevision = extraData.Revision; + ExtraData = extraData.Pack(); + ExtraDataLength = ExtraData?.Length ?? 0; + } + + + protected override void ProcessDataField(DataField dataField, ReadOnlySpan package) { - return new Dictionary>() + base.ProcessDataField(dataField, package); + if (dataField.Field == 3) { - { - 1, new List() - { - DataField.Number(DataFields.UnsubscriptionMid, 20, 4, false), - DataField.Number(DataFields.ExtraDataRevision, 24, 3, false), - DataField.Number(DataFields.ExtraDataLength, 27, 2, false), - DataField.Volatile(DataFields.ExtraData, 29, false) - } - } - }; + HandleExtraDataFieldSize(); + } } - protected enum DataFields + private void HandleExtraDataFieldSize() { - UnsubscriptionMid, - ExtraDataRevision, - ExtraDataLength, - ExtraData + GetField(nameof(ExtraData)).Size = ExtraDataLength; } } } diff --git a/src/OpenProtocolInterpreter/CustomMessages.cs b/src/OpenProtocolInterpreter/CustomMessages.cs index cde16ef4..45fceab8 100644 --- a/src/OpenProtocolInterpreter/CustomMessages.cs +++ b/src/OpenProtocolInterpreter/CustomMessages.cs @@ -1,19 +1,25 @@ using OpenProtocolInterpreter.Messages; using System; using System.Collections.Generic; +using System.Linq; namespace OpenProtocolInterpreter { internal class CustomMessages : MessagesTemplate { - public CustomMessages(IDictionary midTypes) + public CustomMessages(IDictionary types) { - foreach(var type in midTypes) + foreach (var type in types.Where(x => typeof(Mid).IsAssignableFrom(x.Value))) { - _templates.Add(type.Key, new MidCompiledInstance(type.Value)); + _templates.Add(type.Key, new CompiledInstance(type.Value)); + } + + foreach (var type in types.Where(x => typeof(ExtraData).IsAssignableFrom(x.Value))) + { + AddExtraDataTemplate(type.Key, new CompiledInstance(type.Value)); } } - public override bool IsAssignableTo(int mid) => _templates.ContainsKey(mid); + public override bool IsAssignableTo(int mid) => _templates.ContainsKey(mid); } } diff --git a/src/OpenProtocolInterpreter/DataField.cs b/src/OpenProtocolInterpreter/DataField.cs index d9f6cb05..fcf3496e 100644 --- a/src/OpenProtocolInterpreter/DataField.cs +++ b/src/OpenProtocolInterpreter/DataField.cs @@ -1,15 +1,16 @@ using System; +using System.Reflection; namespace OpenProtocolInterpreter { /// - /// Represents a single and raw Data Field in before being abstracted + /// Represents a single and raw Data Field in before being abstracted /// to a typed field inside a mid entity /// public class DataField { - private readonly char _paddingChar; - private readonly PaddingOrientation _paddingOrientation; + protected readonly char PaddingChar; + protected readonly PaddingOrientation PaddingOrientation; private object CachedValue; internal static DataField Default = new(-1, -1, -1); @@ -20,15 +21,13 @@ public class DataField public int Size { get; set; } public string Value { get; set; } public byte[] RawValue { get; set; } + public ReadOnlySpan Span => Value.AsSpan(); public int TotalSize => HasPrefix ? 2 + Size : Size; public DataField(int field, int index, int size, bool hasPrefix = true) + : this(field, index, size, ' ', PaddingOrientation.RightPadded, hasPrefix) { - HasPrefix = hasPrefix; - Field = field; - Index = index; - Size = size; - _paddingChar = ' '; + } public DataField(Enum field, int index, int size, bool hasPrefix = true) @@ -37,22 +36,22 @@ public DataField(Enum field, int index, int size, bool hasPrefix = true) } + public DataField(Enum field, int index, int size, char paddingChar, PaddingOrientation paddingOrientation = PaddingOrientation.RightPadded, bool hasPrefix = true) + : this(field.GetHashCode(), index, size, paddingChar, paddingOrientation, hasPrefix) + { + + } + public DataField(int field, int index, int size, char paddingChar, PaddingOrientation paddingOrientation = PaddingOrientation.RightPadded, bool hasPrefix = true) { - _paddingChar = paddingChar; - _paddingOrientation = paddingOrientation; + PaddingChar = paddingChar; + PaddingOrientation = paddingOrientation; HasPrefix = hasPrefix; Field = field; Index = index; Size = size; } - public DataField(Enum field, int index, int size, char paddingChar, PaddingOrientation paddingOrientation = PaddingOrientation.RightPadded, bool hasPrefix = true) - : this(field.GetHashCode(), index, size, paddingChar, paddingOrientation, hasPrefix) - { - - } - public virtual T GetValue(Func converter) { if (string.IsNullOrWhiteSpace(Value)) @@ -76,41 +75,120 @@ public virtual T GetValue(Func converter) public virtual void SetValue(Func converter, T value) { CachedValue = null; - Value = converter(_paddingChar, Size, _paddingOrientation, value); + Value = converter(PaddingChar, Size, PaddingOrientation, value); Size = Value.Length; } public virtual void SetRawValue(Func converter, T value) { CachedValue = null; - RawValue = converter(_paddingChar, Size, _paddingOrientation, value); + RawValue = converter(PaddingChar, Size, PaddingOrientation, value); Size = RawValue.Length; } public virtual void SetValue(string value) { - CachedValue = null; SetValue(OpenProtocolConvert.TruncatePadded, value); } - public static DataField String(int field, int index, int size, bool hasPrefix = true) - => new(field, index, size, ' ', PaddingOrientation.RightPadded, hasPrefix); - public static DataField String(int field, int index, int size, PaddingOrientation paddingOrientation, bool hasPrefix = true) - => new(field, index, size, ' ', paddingOrientation, hasPrefix); - public static DataField String(Enum field, int index, int size, bool hasPrefix = true) - => new(field, index, size, ' ', PaddingOrientation.RightPadded, hasPrefix); - public static DataField String(Enum field, int index, int size, PaddingOrientation paddingOrientation, bool hasPrefix = true) - => new(field, index, size, ' ', paddingOrientation, hasPrefix); + public virtual void SetValue(ReadOnlySpan value) + => SetValue(value.ToString()); + + public static DataField String(int field, int index, int size, bool hasPrefix = true) + => String(field, index, size, PaddingOrientation.RightPadded, hasPrefix); + public static DataField String(int field, int index, int size, PaddingOrientation paddingOrientation, bool hasPrefix = true) + { + return new DataField(field, index, size, ' ', paddingOrientation, hasPrefix) + { + DefaultConverter = (paddingChar, s, o, v) => OpenProtocolConvert.TruncatePadded(paddingChar, s, o, v?.ToString()), + DefaultParser = s => s + }; + } + + public static DataField String(Enum field, int index, int size, bool hasPrefix = true) + => String(field, index, size, PaddingOrientation.RightPadded, hasPrefix); + public static DataField String(Enum field, int index, int size, PaddingOrientation paddingOrientation, bool hasPrefix = true) + => String(field.GetHashCode(), index, size, paddingOrientation, hasPrefix); + + public static DataField Boolean(int field, int index, bool hasPrefix = true) + { + return new DataField(field, index, 1, hasPrefix) + { + DefaultConverter = OpenProtocolConvert.ToString, + DefaultParser = OpenProtocolConvert.ToBoolean + }; + } + + public static DataField Boolean(Enum field, int index, bool hasPrefix = true) + => Boolean(field.GetHashCode(), index, hasPrefix); + + public static DataField Timestamp(int field, int index, bool hasPrefix = true) + { + return new DataField(field, index, 19, hasPrefix) + { + DefaultConverter = OpenProtocolConvert.ToString, + DefaultParser = OpenProtocolConvert.ToDateTime + }; + } + public static DataField Timestamp(Enum field, int index, bool hasPrefix = true) + => Timestamp(field.GetHashCode(), index, hasPrefix); - public static DataField Boolean(int field, int index, bool hasPrefix = true) - => new(field, index, 1, hasPrefix); - public static DataField Boolean(Enum field, int index, bool hasPrefix = true) - => new(field, index, 1, hasPrefix); + public static DataField UnixTimestamp(int field, int index, bool hasPrefix = true) + { + return new DataField(field, index, 10, hasPrefix) + { + DefaultConverter = OpenProtocolConvert.ToString, + DefaultParser = OpenProtocolConvert.ToUnixDateTime + }; + } + public static DataField UnixTimestamp(Enum field, int index, bool hasPrefix = true) + => UnixTimestamp(field.GetHashCode(), index, hasPrefix); - public static DataField Timestamp(int field, int index, bool hasPrefix = true) - => new(field, index, 19, hasPrefix); - public static DataField Timestamp(Enum field, int index, bool hasPrefix = true) - => new(field, index, 19, hasPrefix); + public static DataField Decimal(int field, int index, int size, bool hasPrefix = true) + { + return new DataField(field, index, size, '0', PaddingOrientation.LeftPadded, hasPrefix) + { + DefaultConverter = OpenProtocolConvert.ToString, + DefaultParser = OpenProtocolConvert.ToDecimal + }; + } + public static DataField Decimal(Enum field, int index, int size, bool hasPrefix = true) + => Decimal(field.GetHashCode(), index, size, hasPrefix); + + public static DataField TruncatedDecimal(int field, int index, int size, int decimalPoints, bool hasPrefix = true) + { + return new DataField(field, index, size, '0', PaddingOrientation.LeftPadded, hasPrefix) + { + DefaultConverter = OpenProtocolConvert.TruncatedDecimalToString, + DefaultParser = (str) => OpenProtocolConvert.ToTruncatedDecimal(str, decimalPoints) + }; + } + public static DataField TruncatedDecimal(Enum field, int index, int size, int decimalPoints, bool hasPrefix = true) + => TruncatedDecimal(field.GetHashCode(), index, size, decimalPoints, hasPrefix); + + public static DataField Int32(int field, int index, int size, bool hasPrefix = true) + { + return new DataField(field, index, size, '0', PaddingOrientation.LeftPadded, hasPrefix) + { + DefaultConverter = OpenProtocolConvert.ToString, + DefaultParser = OpenProtocolConvert.ToInt32 + }; + } + + public static DataField Int32(Enum field, int index, int size, bool hasPrefix = true) + => Int32(field.GetHashCode(), index, size, hasPrefix); + + public static DataField Int64(int field, int index, int size, bool hasPrefix = true) + { + return new DataField(field, index, size, '0', PaddingOrientation.LeftPadded, hasPrefix) + { + DefaultConverter = OpenProtocolConvert.ToString, + DefaultParser = OpenProtocolConvert.ToInt64 + }; + } + + public static DataField Int64(Enum field, int index, int size, bool hasPrefix = true) + => Int64(field.GetHashCode(), index, size, hasPrefix); public static DataField Number(int field, int index, int size, bool hasPrefix = true) => new(field, index, size, '0', PaddingOrientation.LeftPadded, hasPrefix); @@ -131,4 +209,102 @@ public static DataField Volatile(Enum field, bool hasPrefix = true) private bool IsNotTypeOf() => !CachedValue.GetType().Equals(typeof(T)); } + + public class DataField : DataField, IBackedPropertyDataField + { + private object _owner; + private PropertyInfo _backingProperty; + protected internal Func DefaultConverter; + protected internal Func DefaultParser; + protected internal Func BackingPropertyConverter; + + public DataField(int field, int index, int size, bool hasPrefix = true) : base(field, index, size, hasPrefix) + { + } + + public DataField(Enum field, int index, int size, bool hasPrefix = true) : base(field, index, size, hasPrefix) + { + } + + public DataField(Enum field, int index, int size, char paddingChar, PaddingOrientation paddingOrientation = PaddingOrientation.RightPadded, bool hasPrefix = true) : base(field, index, size, paddingChar, paddingOrientation, hasPrefix) + { + } + + public DataField(int field, int index, int size, char paddingChar, PaddingOrientation paddingOrientation = PaddingOrientation.RightPadded, bool hasPrefix = true) : base(field, index, size, paddingChar, paddingOrientation, hasPrefix) + { + } + + public void SyncWithBackingPropertyIfBound() + { + var backingValue = _backingProperty?.GetValue(_owner); + if (backingValue is T propValue) + { + var value = DefaultConverter(PaddingChar, Size, PaddingOrientation, propValue); + base.SetValue(value); + } + else if (backingValue != null && BackingPropertyConverter != null) + { + var value = DefaultConverter(PaddingChar, Size, PaddingOrientation, BackingPropertyConverter(backingValue)); + base.SetValue(value); + } + } + + public override void SetValue(string value) + { + base.SetValue(value); + var parsedValue = DefaultParser(value); + SetBackingPropertyValueIfBound(parsedValue); + } + + private void SetBackingPropertyValueIfBound(object value) + { + if (_backingProperty != null && _owner != null) + _backingProperty.SetValue(_owner, value); + } + + protected internal DataField Bind(object owner, string propertyName) + => Bind(owner, owner.GetType().GetProperty(propertyName, BindingFlags.Public | BindingFlags.Instance)); + + protected internal DataField Bind(object owner, PropertyInfo propertyInfo) + { + _owner = owner; + _backingProperty = propertyInfo; + + return this; + } + } + + public interface IBackedPropertyDataField + { + void SyncWithBackingPropertyIfBound(); + } + + public struct DataFieldDefinition + { + public int Field { get; set; } + public int Revision { get; set; } + public int Index { get; set; } + public int Size { get; set; } + public char PaddingChar { get; set; } = ' '; + public PaddingOrientation PaddingOrientation { get; set; } = PaddingOrientation.RightPadded; + public bool HasPrefix { get; set; } = true; + public PropertyInfo BoundedPropertyInfo { get; private set; } + + public DataFieldDefinition() + { + } + + public DataFieldDefinition Bind(PropertyInfo propertyInfo) + { + BoundedPropertyInfo = propertyInfo; + return this; + } + +#if NET6_0_OR_GREATER + public override readonly int GetHashCode() + { + return HashCode.Combine(Field, Revision, Index, Size, PaddingChar, PaddingOrientation, HasPrefix); + } +#endif + } } diff --git a/src/OpenProtocolInterpreter/DataFieldDefinitionAttribute.cs b/src/OpenProtocolInterpreter/DataFieldDefinitionAttribute.cs new file mode 100644 index 00000000..85d74681 --- /dev/null +++ b/src/OpenProtocolInterpreter/DataFieldDefinitionAttribute.cs @@ -0,0 +1,331 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Reflection; +using System.Text; +namespace OpenProtocolInterpreter +{ + /// + /// Defines a data field specification in a MID. + /// + /// This attribute is used to decorate properties in a MID class to define how they should be parsed and formatted in the MID message. + /// + /// + [AttributeUsage(AttributeTargets.Property, AllowMultiple = true)] + public class DataFieldDefinitionAttribute : Attribute + { + public int Field { get; set; } + public int Revision { get; set; } + public int Index { get; set; } + public int Size { get; set; } + public char PaddingChar { get; set; } = ' '; + public PaddingOrientation PaddingOrientation { get; set; } = PaddingOrientation.RightPadded; + public bool HasPrefix { get; set; } = true; + + public DataFieldDefinitionAttribute(int revision) + { + Revision = revision; + } + public DataFieldDefinitionAttribute(int field, int revision) : this(revision) + { + if (field > 99 || field < 0) + { + throw new ArgumentOutOfRangeException(nameof(field), "Data field id must be between 0 and 99"); + } + Field = field; + } + + /// + /// Creates the data field and binds it to the decorated property of its owner ( or ). + /// + internal DataField CreateAndBind(object owner, PropertyInfo propertyInfo) + => CreateAndBind(owner, propertyInfo, Index); + internal DataField CreateAndBind(object owner, PropertyInfo propertyInfo, int index) + { + return Build(owner, propertyInfo, index); + } + + internal virtual DataField Build(object owner, PropertyInfo propertyInfo, int index) + { + return new DataField(Field, index, Size, PaddingChar, PaddingOrientation, HasPrefix); + } + + /// + /// Tells whether the decorated property is an enum whose underlying type is , + /// as happens when a property is decorated with an + /// . Such a property reads back as a boxed enum rather + /// than as a , so its data field needs a + /// to be packed. + /// + protected static bool IsEnumBackedBy(PropertyInfo propertyInfo) + { + return propertyInfo != null + && propertyInfo.PropertyType.IsEnum + && Enum.GetUnderlyingType(propertyInfo.PropertyType) == typeof(T); + } + } + public class BooleanDataFieldDefinitionAttribute : DataFieldDefinitionAttribute + { + public BooleanDataFieldDefinitionAttribute(int revision) : base(revision) + { + Size = 1; + } + public BooleanDataFieldDefinitionAttribute(int field, int revision) : base(field, revision) + { + Size = 1; + } + internal override DataField Build(object owner, PropertyInfo propertyInfo, int index) + { + return DataField.Boolean(Field, Index, HasPrefix) + .Bind(owner, propertyInfo); + } + } + public class StringDataFieldDefinitionAttribute : DataFieldDefinitionAttribute + { + public StringDataFieldDefinitionAttribute(int revision) : base(revision) + { + } + public StringDataFieldDefinitionAttribute(int field, int revision) : base(field, revision) + { + + } + internal override DataField Build(object owner, PropertyInfo propertyInfo, int index) + { + return DataField.String(Field, index, Size, PaddingOrientation, HasPrefix) + .Bind(owner, propertyInfo); + } + } + public class Int32DataFieldDefinitionAttribute : DataFieldDefinitionAttribute + { + public Int32DataFieldDefinitionAttribute(int revision) : base(revision) + { + PaddingChar = '0'; + PaddingOrientation = PaddingOrientation.LeftPadded; + } + public Int32DataFieldDefinitionAttribute(int field, int revision) : base(field, revision) + { + PaddingChar = '0'; + PaddingOrientation = PaddingOrientation.LeftPadded; + } + internal override DataField Build(object owner, PropertyInfo propertyInfo, int index) + { + var dataField = DataField.Int32(Field, index, Size, HasPrefix); + if (IsEnumBackedBy(propertyInfo)) + { + dataField.BackingPropertyConverter = Convert.ToInt32; + } + + return dataField.Bind(owner, propertyInfo); + } + } + public class Int64DataFieldDefinitionAttribute : DataFieldDefinitionAttribute + { + public Int64DataFieldDefinitionAttribute(int revision) : base(revision) + { + PaddingChar = '0'; + PaddingOrientation = PaddingOrientation.LeftPadded; + } + public Int64DataFieldDefinitionAttribute(int field, int revision) : base(field, revision) + { + PaddingChar = '0'; + PaddingOrientation = PaddingOrientation.LeftPadded; + } + internal override DataField Build(object owner, PropertyInfo propertyInfo, int index) + { + var dataField = DataField.Int64(Field, index, Size, HasPrefix); + if (IsEnumBackedBy(propertyInfo)) + { + dataField.BackingPropertyConverter = Convert.ToInt64; + } + + return dataField.Bind(owner, propertyInfo); + } + } + public class DecimalDataFieldDefinitionAttribute : DataFieldDefinitionAttribute + { + public DecimalDataFieldDefinitionAttribute(int revision) : base(revision) + { + PaddingChar = '0'; + PaddingOrientation = PaddingOrientation.LeftPadded; + } + public DecimalDataFieldDefinitionAttribute(int field, int revision) : base(field, revision) + { + PaddingChar = '0'; + PaddingOrientation = PaddingOrientation.LeftPadded; + } + internal override DataField Build(object owner, PropertyInfo propertyInfo, int index) + { + return DataField.Decimal(Field, index, Size, HasPrefix) + .Bind(owner, propertyInfo); + } + } + + public class TruncatedDecimalDataFieldDefinitionAttribute : DataFieldDefinitionAttribute + { + public int DecimalPoints { get; set; } + + public TruncatedDecimalDataFieldDefinitionAttribute(int revision) : base(revision) + { + DecimalPoints = 2; + PaddingChar = '0'; + PaddingOrientation = PaddingOrientation.LeftPadded; + } + public TruncatedDecimalDataFieldDefinitionAttribute(int field, int revision) : base(field, revision) + { + DecimalPoints = 2; + PaddingChar = '0'; + PaddingOrientation = PaddingOrientation.LeftPadded; + } + + internal override DataField Build(object owner, PropertyInfo propertyInfo, int index) + { + return DataField.TruncatedDecimal(Field, index, Size, DecimalPoints, HasPrefix) + .Bind(owner, propertyInfo); + } + } + + public class TimestampDataFieldDefinitionAttribute : DataFieldDefinitionAttribute + { + public TimestampDataFieldDefinitionAttribute(int revision) : base(revision) + { + Size = 19; + } + public TimestampDataFieldDefinitionAttribute(int field, int revision) : base(field, revision) + { + Size = 19; + } + internal override DataField Build(object owner, PropertyInfo propertyInfo, int index) + { + return DataField.Timestamp(Field, index, HasPrefix) + .Bind(owner, propertyInfo); + } + } + + public class UnixTimestampDataFieldDefinitionAttribute : DataFieldDefinitionAttribute + { + public UnixTimestampDataFieldDefinitionAttribute(int revision) : base(revision) + { + Size = 10; + } + public UnixTimestampDataFieldDefinitionAttribute(int field, int revision) : base(field, revision) + { + Size = 10; + } + internal override DataField Build(object owner, PropertyInfo propertyInfo, int index) + { + return DataField.Timestamp(Field, index, HasPrefix) + .Bind(owner, propertyInfo); + } + } + + public class VariableDataFieldCollectionDefinitionAttribute : DataFieldDefinitionAttribute + { + public VariableDataFieldCollectionDefinitionAttribute(int revision) : base(revision) + { + + } + public VariableDataFieldCollectionDefinitionAttribute(int field, int revision) : base(field, revision) + { + + } + + internal override DataField Build(object owner, PropertyInfo propertyInfo, int index) + { + return new DataField>(Field, index, Size, HasPrefix) + { + DefaultConverter = OpenProtocolConvert.ToString, + DefaultParser = VariableDataField.ParseAll + }.Bind(owner, propertyInfo); + } + } + + public class Int32CollectionDefinitionAttribute : DataFieldDefinitionAttribute + { + public int EachFieldSize { get; set; } + + public Int32CollectionDefinitionAttribute(int revision) : base(revision) + { + PaddingChar = '0'; + PaddingOrientation = PaddingOrientation.LeftPadded; + } + + public Int32CollectionDefinitionAttribute(int field, int revision) : base(field, revision) + { + PaddingChar = '0'; + PaddingOrientation = PaddingOrientation.LeftPadded; + } + + internal override DataField Build(object owner, PropertyInfo propertyInfo, int index) + { + if (EachFieldSize <= 0) + throw new InvalidOperationException("EachFieldSize must be greater than 0 for Int32CollectionDefinitionAttribute."); + + return new DataField>(Field, index, Size, PaddingChar, PaddingOrientation, HasPrefix) + { + DefaultConverter = PackList, + DefaultParser = ParseList + }.Bind(owner, propertyInfo); + } + + private string PackList(char paddingChar, int size, PaddingOrientation orientation, List list) + { + var builder = new StringBuilder(list.Count); + foreach (var e in list) + builder.Append(OpenProtocolConvert.ToString(paddingChar, EachFieldSize, orientation, e)); + + return builder.ToString(); + } + + private List ParseList(string value) + { + var span = value.AsSpan(); + var list = new List(); + for (int i = 0; i < span.Length; i += EachFieldSize) + { + var slice = span.Slice(i, EachFieldSize); + list.Add(OpenProtocolConvert.ToInt32(slice.ToString())); + } + + return list; + } + } + + public class EnumCollectionDefinitionAttribute : DataFieldDefinitionAttribute where T : Enum + { + public EnumCollectionDefinitionAttribute(int revision) : base(revision) + { + + } + public EnumCollectionDefinitionAttribute(int field, int revision) : base(field, revision) + { + + } + + internal override DataField Build(object owner, PropertyInfo propertyInfo, int index) + { + return new DataField>(Field, index, Size, HasPrefix) + { + DefaultConverter = PackEnums, + DefaultParser = ParseEnums + }.Bind(owner, propertyInfo); + } + + private static string PackEnums(char paddingChar, int size, PaddingOrientation orientation, List list) + { + var builder = new StringBuilder(list.Count); + foreach (var e in list) + builder.Append(OpenProtocolConvert.ToString((int)(object)e)); + + return builder.ToString(); + } + + private static List ParseEnums(string value) + { + var list = new List(); + foreach (var c in value) + list.Add((T)(object)OpenProtocolConvert.ToInt32(c.ToString())); + + return list; + } + } +} diff --git a/src/OpenProtocolInterpreter/DataTypes.cs b/src/OpenProtocolInterpreter/DataTypes.cs index d758e8fb..fb4de338 100644 --- a/src/OpenProtocolInterpreter/DataTypes.cs +++ b/src/OpenProtocolInterpreter/DataTypes.cs @@ -38,6 +38,7 @@ public string ValueSentInTelegram return _valueSent.ToString().PadLeft(2, '0'); } } + public string Type { get; set; } public int Length { get; set; } @@ -50,7 +51,7 @@ private DataType(int valueSent, string type, int length) public static implicit operator DataType(string type) { - return _dataTypesDefinition.FirstOrDefault(x=> x == type); + return _dataTypesDefinition.FirstOrDefault(x => x == type); } public static bool operator ==(DataType type, string type2) diff --git a/src/OpenProtocolInterpreter/Enums/ToolType.cs b/src/OpenProtocolInterpreter/Enums/ToolType.cs index b0d722c2..e8d84056 100644 --- a/src/OpenProtocolInterpreter/Enums/ToolType.cs +++ b/src/OpenProtocolInterpreter/Enums/ToolType.cs @@ -38,6 +38,9 @@ public enum ToolType ITP = 30, QSHIELD_C = 31, DeltaWrench = 32, - STRWrench = 33 + STRWrench = 33, + XPBM = 34, + ExBC = 35, + ExD = 36 } } diff --git a/src/OpenProtocolInterpreter/ExtraData.cs b/src/OpenProtocolInterpreter/ExtraData.cs new file mode 100644 index 00000000..5e4312c4 --- /dev/null +++ b/src/OpenProtocolInterpreter/ExtraData.cs @@ -0,0 +1,130 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; + +namespace OpenProtocolInterpreter +{ + public abstract class ExtraData + { + private static readonly ConcurrentDictionary _metadataCache = new(); + private readonly Lazy>> _lazyFields; + + protected internal Dictionary> RevisionsByFields => _lazyFields.Value; + + public abstract int Mid { get; } + public int Revision { get; set; } + public int StandardizedRevision => Revision > 0 ? Revision : 1; + + public ExtraData() : this(1) + { + + } + + public ExtraData(int revision) + { + Revision = revision; + _lazyFields = new Lazy>>(() => new SafeAccessRevisionsFields(RegisterDatafields())); + } + + public ExtraData Parse(string extraData) + => Parse(extraData.AsSpan()); + + public virtual ExtraData Parse(ReadOnlySpan package) + { + if (!RevisionsByFields.Any()) + return this; + + for (int i = 1; i <= StandardizedRevision; i++) + { + foreach (var dataField in RevisionsByFields[i]) + { + ProcessDataField(dataField, package); + } + } + + return this; + } + + public virtual string Pack() + { + if (!RevisionsByFields.TryGetValue(StandardizedRevision, out var dataFields)) + { + return string.Empty; + } + + var builder = new StringBuilder(); + foreach (var dataField in dataFields) + { + if (dataField is IBackedPropertyDataField backedPropertyDataField) + backedPropertyDataField.SyncWithBackingPropertyIfBound(); + + if (dataField.HasPrefix) + { + builder.Append(dataField.Field.ToString("D2")); + } + + builder.Append(dataField.Value); + } + + return builder.ToString(); + } + + protected virtual void ProcessDataField(DataField dataField, ReadOnlySpan package) + { + try + { + var value = dataField.HasPrefix ? package.Slice(2 + dataField.Index, dataField.Size) : package.Slice(dataField.Index, dataField.Size); + dataField.SetValue(value); + } + catch (ArgumentOutOfRangeException) + { + //Ignore failure + } + } + + protected virtual Dictionary> RegisterDatafields() + { + var metadata = _metadataCache.GetOrAdd(GetType(), static type => + { + var result = new List(); + var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance) + .Where(x => x.CustomAttributes.Any(a => typeof(DataFieldDefinitionAttribute).IsAssignableFrom(a.AttributeType))); + + foreach (var prop in properties) + { + var attributes = prop.GetCustomAttributes(); + if (!attributes.Any()) + continue; + + foreach (var attr in attributes) + { + result.Add(new DataFieldMetadata(attr.Index, attr, prop)); + } + } + return result.ToArray(); + }); + + var fields = new Dictionary>(); + foreach (var m in metadata) + { + if (!fields.TryGetValue(m.Attribute.Revision, out var revisionFields)) + fields.Add(m.Attribute.Revision, revisionFields = new List()); + revisionFields.Add(m.CreateAndBind(this)); + } + return fields; + } + + protected DataField GetField(int revision, int field) + { + if (!RevisionsByFields.TryGetValue(revision, out var fields)) + { + return DataField.Default; + } + + return fields.FirstOrDefault(x => x.Field == field) ?? DataField.Default; + } + } +} diff --git a/src/OpenProtocolInterpreter/Header.cs b/src/OpenProtocolInterpreter/Header.cs index c44e020e..77ca6aff 100644 --- a/src/OpenProtocolInterpreter/Header.cs +++ b/src/OpenProtocolInterpreter/Header.cs @@ -1,4 +1,5 @@ -using System.Text; +using System; +using System.Text; namespace OpenProtocolInterpreter { @@ -20,7 +21,7 @@ public sealed class Header public int Mid { get; set; } /// - /// The MID Revision is unique per MID and is used in case different versions are available for the same MID. + /// The MID Revision is unique per MID and is used in case different versions are available for the same MID. /// Using the revision number the integrator can subscribe or ask for different versions of the same MID. /// /// Note: The default MID Revision is 1. There is three different ways to get it, either send three spaces or 000 or 001. @@ -29,7 +30,7 @@ public sealed class Header public int Revision { get; set; } /// - /// The MID Revision is unique per MID and is used in case different versions are available for the same MID. + /// The MID Revision is unique per MID and is used in case different versions are available for the same MID. /// Using the revision number the integrator can subscribe or ask for different versions of the same MID. /// /// Note: Enforces the default MID Revision to 1 when it's either send three spaces or 000 or 001. @@ -98,6 +99,53 @@ public override string ToString() builder.Append(MessageNumber.HasValue ? MessageNumber.ToString() : " "); return builder.ToString(); } + + /// + /// Parses the header from a string representation of the MID message. + /// + /// The MID message as a string. + /// The parsed object. + public static Header Parse(string package) + => Parse(package.AsSpan()); + + /// + /// Parses the header from a read-only span of characters representing the MID message. + /// + /// The MID message as a read-only span of characters. + /// The parsed object. + public static Header Parse(ReadOnlySpan package) + { +#if NETSTANDARD2_0 + static bool IsNotEmptyOrZero(ReadOnlySpan package, out int value) + { + value = 0; + return !package.IsWhiteSpace() && int.TryParse(package.ToString(), out value) && value > 0; + } + static int ParseInt(ReadOnlySpan span) => int.Parse(span.ToString()); + static bool TryParseInt(ReadOnlySpan span, out int value) => int.TryParse(span.ToString(), out value); +#else + static bool IsNotEmptyOrZero(ReadOnlySpan package, out int value) + { + value = 0; + return !package.IsWhiteSpace() && int.TryParse(package, out value) && value > 0; + } + static int ParseInt(ReadOnlySpan span) => int.Parse(span); + static bool TryParseInt(ReadOnlySpan span, out int value) => int.TryParse(span, out value); +#endif + + return new Header + { + Length = ParseInt(package.Slice(0, 4)), + Mid = ParseInt(package.Slice(4, 4)), + Revision = IsNotEmptyOrZero(package.Slice(8, 3), out var revision) ? revision : 1, + NoAckFlag = !package.Slice(11, 1).IsWhiteSpace(), + StationId = TryParseInt(package.Slice(12, 2), out var stationId) ? stationId : 1, + SpindleId = TryParseInt(package.Slice(14, 2), out var spindleId) ? spindleId : 1, + SequenceNumber = IsNotEmptyOrZero(package.Slice(16, 2), out var sequenceNumber) ? sequenceNumber : default(int?), + NumberOfMessages = IsNotEmptyOrZero(package.Slice(18, 1), out var numberOfMessages) ? numberOfMessages : default(int?), + MessageNumber = IsNotEmptyOrZero(package.Slice(19, 1), out var messageNumber) ? messageNumber : default(int?) + }; + } } } diff --git a/src/OpenProtocolInterpreter/IAcceptableCommand.cs b/src/OpenProtocolInterpreter/IAcceptableCommand.cs deleted file mode 100644 index 8a58937d..00000000 --- a/src/OpenProtocolInterpreter/IAcceptableCommand.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace OpenProtocolInterpreter -{ - /// - /// Contract of every message that can be accepted with implements. - /// - public interface IAcceptableCommand - { - } -} diff --git a/src/OpenProtocolInterpreter/IAcknowledge.cs b/src/OpenProtocolInterpreter/IAcknowledge.cs deleted file mode 100644 index 235f8103..00000000 --- a/src/OpenProtocolInterpreter/IAcknowledge.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace OpenProtocolInterpreter -{ - /// - /// Contract which every acknowledge message implements. - /// - public interface IAcknowledge - { - } -} diff --git a/src/OpenProtocolInterpreter/IAcknowledgeable.cs b/src/OpenProtocolInterpreter/IAcknowledgeable.cs deleted file mode 100644 index 9409874a..00000000 --- a/src/OpenProtocolInterpreter/IAcknowledgeable.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace OpenProtocolInterpreter -{ - /// - /// Contract which every that might needs an acknowledge response implements. - /// - public interface IAcknowledgeable where TAckMid : Mid, IAcknowledge, new() - { - - } -} diff --git a/src/OpenProtocolInterpreter/IAnswerableBy.cs b/src/OpenProtocolInterpreter/IAnswerableBy.cs deleted file mode 100644 index 9c8dc152..00000000 --- a/src/OpenProtocolInterpreter/IAnswerableBy.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace OpenProtocolInterpreter -{ - /// - /// Contract of every message that can be answered by another mid which is not classified as an acknowledge. - /// - public interface IAnswerableBy where TAnswerMid : Mid - { - - } -} diff --git a/src/OpenProtocolInterpreter/IController.cs b/src/OpenProtocolInterpreter/IController.cs deleted file mode 100644 index e03a8f37..00000000 --- a/src/OpenProtocolInterpreter/IController.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace OpenProtocolInterpreter -{ - /// - /// Contract which every controller message implements. - /// - public interface IController - { - } -} diff --git a/src/OpenProtocolInterpreter/IDeclinableCommand.cs b/src/OpenProtocolInterpreter/IDeclinableCommand.cs deleted file mode 100644 index 8d970fee..00000000 --- a/src/OpenProtocolInterpreter/IDeclinableCommand.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.Collections.Generic; - -namespace OpenProtocolInterpreter -{ - /// - /// Contract which every message that can be declined with implements. - /// - public interface IDeclinableCommand - { - IEnumerable DocumentedPossibleErrors { get; } - } -} diff --git a/src/OpenProtocolInterpreter/IIntegrator.cs b/src/OpenProtocolInterpreter/IIntegrator.cs deleted file mode 100644 index 21cdc3ff..00000000 --- a/src/OpenProtocolInterpreter/IIntegrator.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace OpenProtocolInterpreter -{ - /// - /// Contract which every integrator message implements. - /// - public interface IIntegrator - { - } -} diff --git a/src/OpenProtocolInterpreter/IMarkerInterfaces.cs b/src/OpenProtocolInterpreter/IMarkerInterfaces.cs new file mode 100644 index 00000000..cbac3bf7 --- /dev/null +++ b/src/OpenProtocolInterpreter/IMarkerInterfaces.cs @@ -0,0 +1,103 @@ +using System.Collections.Generic; + +namespace OpenProtocolInterpreter +{ + /// + /// Contract which every controller message implements. + /// + public interface IController + { + } + + /// + /// Contract which every integrator message implements. + /// + public interface IIntegrator + { + } + + /// + /// Contract which every acknowledge message implements. + /// + public interface IAcknowledge + { + } + + /// + /// Contract which every that might needs an acknowledge response implements. + /// + public interface IAcknowledgeable where TAckMid : Mid, IAcknowledge, new() + { + + } + + /// + /// Contract of every message that can be answered by another mid which is not classified as an acknowledge. + /// + public interface IAnswerableBy where TAnswerMid : Mid + { + + } + + /// + /// Contract of every message that can be accepted with implements. + /// + public interface IAcceptableCommand + { + } + + /// + /// Contract which every message that can be declined with implements. + /// + public interface IDeclinableCommand + { + IEnumerable DocumentedPossibleErrors { get; } + } + + /// + /// Contract which every subscription message implements. + /// + public interface ISubscription + { + } + + /// + /// Contract which every unsubscription message implements. + /// + public interface IUnsubscription + { + } + + /// + /// Contract which every message that has extra data implements. + /// + public interface IExtraDataContainer + { + int WantedRevision { get; set; } + int ExtraDataLength { get; set; } + string ExtraData { get; set; } + } + + /// + /// Contract which a mid can be packed as extra data in , or . + /// + public interface IExtraDataSource + { + + } + + public interface IExtraDataRequest : IExtraDataSource + { + + } + + public interface IExtraDataSubscription : IExtraDataSource + { + + } + + public interface IExtraDataUnsubscription : IExtraDataSource + { + + } +} diff --git a/src/OpenProtocolInterpreter/IOInterface/DigitalInput.cs b/src/OpenProtocolInterpreter/IOInterface/DigitalInput.cs index 5402e168..d7d87d00 100644 --- a/src/OpenProtocolInterpreter/IOInterface/DigitalInput.cs +++ b/src/OpenProtocolInterpreter/IOInterface/DigitalInput.cs @@ -1,4 +1,8 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; namespace OpenProtocolInterpreter.IOInterface { @@ -10,6 +14,17 @@ public class DigitalInput public DigitalInputNumber Number { get; set; } public bool Status { get; set; } + public DigitalInput() + { + + } + + public DigitalInput(DigitalInputNumber number, bool status) + { + Number = number; + Status = status; + } + public string Pack() { return OpenProtocolConvert.ToString('0', 3, PaddingOrientation.LeftPadded, (int)Number) + @@ -17,28 +32,63 @@ public string Pack() } public static DigitalInput Parse(string section) + => Parse(section.AsSpan()); + + public static DigitalInput Parse(ReadOnlySpan section) { return new DigitalInput() { - Number = (DigitalInputNumber)OpenProtocolConvert.ToInt32(section.Substring(0, 3)), - Status = OpenProtocolConvert.ToBoolean(section.Substring(3, 1)) + Number = (DigitalInputNumber)OpenProtocolConvert.ToInt32(section.Slice(0, 3)), + Status = OpenProtocolConvert.ToBoolean(section.Slice(3, 1)) }; } public static IEnumerable ParseAll(string value) + => ParseAll(value.AsSpan()); + + public static IEnumerable ParseAll(ReadOnlySpan value) { - if(string.IsNullOrEmpty(value)) - { - yield break; - } + if (value.IsEmpty) + return Array.Empty(); + var result = new List(); const int sectionSize = 4; for (int i = 0; i < value.Length; i += sectionSize) + result.Add(Parse(value.Slice(i, sectionSize))); + return result; + } + } + + public class DigitalInputCollectionDefinitionAttribute : DataFieldDefinitionAttribute + { + public DigitalInputCollectionDefinitionAttribute(int revision) : base(revision) + { + + } + public DigitalInputCollectionDefinitionAttribute(int field, int revision) : base(field, revision) + { + + } + + internal override DataField Build(object owner, PropertyInfo propertyInfo, int index) + { + return new DataField>(Field, index, Size, HasPrefix) { - var section = value.Substring(i, sectionSize); - yield return Parse(section); - } + DefaultConverter = PackDigitalInputs, + DefaultParser = ParseDigitalInputs + }.Bind(owner, propertyInfo); + } + + private static string PackDigitalInputs(char paddingChar, int size, PaddingOrientation orientation, List digitalInputs) + { + var builder = new StringBuilder(digitalInputs.Count * 4); + foreach (var digitalInput in digitalInputs) + builder.Append(digitalInput.Pack()); + + return builder.ToString(); } + private static List ParseDigitalInputs(string value) + => DigitalInput.ParseAll(value).ToList(); } } diff --git a/src/OpenProtocolInterpreter/IOInterface/IOInterfaceMessages.cs b/src/OpenProtocolInterpreter/IOInterface/IOInterfaceMessages.cs index 2e80eb0b..87311913 100644 --- a/src/OpenProtocolInterpreter/IOInterface/IOInterfaceMessages.cs +++ b/src/OpenProtocolInterpreter/IOInterface/IOInterfaceMessages.cs @@ -11,25 +11,25 @@ internal class IOInterfaceMessages : MessagesTemplate { public IOInterfaceMessages() : base() { - _templates = new Dictionary() + _templates = new Dictionary>() { - { Mid0200.MID, new MidCompiledInstance(typeof(Mid0200)) }, - { Mid0210.MID, new MidCompiledInstance(typeof(Mid0210)) }, - { Mid0211.MID, new MidCompiledInstance(typeof(Mid0211)) }, - { Mid0212.MID, new MidCompiledInstance(typeof(Mid0212)) }, - { Mid0213.MID, new MidCompiledInstance(typeof(Mid0213)) }, - { Mid0214.MID, new MidCompiledInstance(typeof(Mid0214)) }, - { Mid0215.MID, new MidCompiledInstance(typeof(Mid0215)) }, - { Mid0216.MID, new MidCompiledInstance(typeof(Mid0216)) }, - { Mid0217.MID, new MidCompiledInstance(typeof(Mid0217)) }, - { Mid0218.MID, new MidCompiledInstance(typeof(Mid0218)) }, - { Mid0219.MID, new MidCompiledInstance(typeof(Mid0219)) }, - { Mid0220.MID, new MidCompiledInstance(typeof(Mid0220)) }, - { Mid0221.MID, new MidCompiledInstance(typeof(Mid0221)) }, - { Mid0222.MID, new MidCompiledInstance(typeof(Mid0222)) }, - { Mid0223.MID, new MidCompiledInstance(typeof(Mid0223)) }, - { Mid0224.MID, new MidCompiledInstance(typeof(Mid0224)) }, - { Mid0225.MID, new MidCompiledInstance(typeof(Mid0225)) } + { Mid0200.MID, new CompiledInstance(typeof(Mid0200)) }, + { Mid0210.MID, new CompiledInstance(typeof(Mid0210)) }, + { Mid0211.MID, new CompiledInstance(typeof(Mid0211)) }, + { Mid0212.MID, new CompiledInstance(typeof(Mid0212)) }, + { Mid0213.MID, new CompiledInstance(typeof(Mid0213)) }, + { Mid0214.MID, new CompiledInstance(typeof(Mid0214)) }, + { Mid0215.MID, new CompiledInstance(typeof(Mid0215)) }, + { Mid0216.MID, new CompiledInstance(typeof(Mid0216)) }, + { Mid0217.MID, new CompiledInstance(typeof(Mid0217)) }, + { Mid0218.MID, new CompiledInstance(typeof(Mid0218)) }, + { Mid0219.MID, new CompiledInstance(typeof(Mid0219)) }, + { Mid0220.MID, new CompiledInstance(typeof(Mid0220)) }, + { Mid0221.MID, new CompiledInstance(typeof(Mid0221)) }, + { Mid0222.MID, new CompiledInstance(typeof(Mid0222)) }, + { Mid0223.MID, new CompiledInstance(typeof(Mid0223)) }, + { Mid0224.MID, new CompiledInstance(typeof(Mid0224)) }, + { Mid0225.MID, new CompiledInstance(typeof(Mid0225)) } }; } diff --git a/src/OpenProtocolInterpreter/IOInterface/Mid0200.cs b/src/OpenProtocolInterpreter/IOInterface/Mid0200.cs index 252a4489..0c554543 100644 --- a/src/OpenProtocolInterpreter/IOInterface/Mid0200.cs +++ b/src/OpenProtocolInterpreter/IOInterface/Mid0200.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.IOInterface { @@ -15,56 +16,35 @@ public class Mid0200 : Mid, IIOInterface, IIntegrator, IAcceptableCommand { public const int MID = 200; - public RelayStatus StatusRelayOne - { - get => (RelayStatus)GetField(1, DataFields.StatusRelay1).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.StatusRelay1).SetValue(OpenProtocolConvert.ToString, value); - } - public RelayStatus StatusRelayTwo - { - get => (RelayStatus)GetField(1, DataFields.StatusRelay2).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.StatusRelay2).SetValue(OpenProtocolConvert.ToString, value); - } - public RelayStatus StatusRelayThree - { - get => (RelayStatus)GetField(1, DataFields.StatusRelay3).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.StatusRelay3).SetValue(OpenProtocolConvert.ToString, value); - } - public RelayStatus StatusRelayFour - { - get => (RelayStatus)GetField(1, DataFields.StatusRelay4).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.StatusRelay4).SetValue(OpenProtocolConvert.ToString, value); - } - public RelayStatus StatusRelayFive - { - get => (RelayStatus)GetField(1, DataFields.StatusRelay5).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.StatusRelay5).SetValue(OpenProtocolConvert.ToString, value); - } - public RelayStatus StatusRelaySix - { - get => (RelayStatus)GetField(1, DataFields.StatusRelay6).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.StatusRelay6).SetValue(OpenProtocolConvert.ToString, value); - } - public RelayStatus StatusRelaySeven - { - get => (RelayStatus)GetField(1, DataFields.StatusRelay7).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.StatusRelay7).SetValue(OpenProtocolConvert.ToString, value); - } - public RelayStatus StatusRelayEight - { - get => (RelayStatus)GetField(1, DataFields.StatusRelay8).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.StatusRelay8).SetValue(OpenProtocolConvert.ToString, value); - } - public RelayStatus StatusRelayNine - { - get => (RelayStatus)GetField(1, DataFields.StatusRelay9).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.StatusRelay9).SetValue(OpenProtocolConvert.ToString, value); - } - public RelayStatus StatusRelayTen - { - get => (RelayStatus)GetField(1, DataFields.StatusRelay10).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.StatusRelay10).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 1, HasPrefix = false)] + public RelayStatus StatusRelayOne { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 2, Index = 21, Size = 1, HasPrefix = false)] + public RelayStatus StatusRelayTwo { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 3, Index = 22, Size = 1, HasPrefix = false)] + public RelayStatus StatusRelayThree { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 4, Index = 23, Size = 1, HasPrefix = false)] + public RelayStatus StatusRelayFour { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 5, Index = 24, Size = 1, HasPrefix = false)] + public RelayStatus StatusRelayFive { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 6, Index = 25, Size = 1, HasPrefix = false)] + public RelayStatus StatusRelaySix { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 7, Index = 26, Size = 1, HasPrefix = false)] + public RelayStatus StatusRelaySeven { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 8, Index = 27, Size = 1, HasPrefix = false)] + public RelayStatus StatusRelayEight { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 9, Index = 28, Size = 1, HasPrefix = false)] + public RelayStatus StatusRelayNine { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 10, Index = 29, Size = 1, HasPrefix = false)] + public RelayStatus StatusRelayTen { get; set; } public Mid0200() : this(new Header() { @@ -78,41 +58,5 @@ public Mid0200() : this(new Header() public Mid0200(Header header) : base(header) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.StatusRelay1, 20, 1, false), - DataField.Number(DataFields.StatusRelay2, 21, 1, false), - DataField.Number(DataFields.StatusRelay3, 22, 1, false), - DataField.Number(DataFields.StatusRelay4, 23, 1, false), - DataField.Number(DataFields.StatusRelay5, 24, 1, false), - DataField.Number(DataFields.StatusRelay6, 25, 1, false), - DataField.Number(DataFields.StatusRelay7, 26, 1, false), - DataField.Number(DataFields.StatusRelay8, 27, 1, false), - DataField.Number(DataFields.StatusRelay9, 28, 1, false), - DataField.Number(DataFields.StatusRelay10, 29, 1, false) - } - } - }; - } - - protected enum DataFields - { - StatusRelay1, - StatusRelay2, - StatusRelay3, - StatusRelay4, - StatusRelay5, - StatusRelay6, - StatusRelay7, - StatusRelay8, - StatusRelay9, - StatusRelay10 - } } } diff --git a/src/OpenProtocolInterpreter/IOInterface/Mid0211.cs b/src/OpenProtocolInterpreter/IOInterface/Mid0211.cs index 22eb08c4..60f86bf3 100644 --- a/src/OpenProtocolInterpreter/IOInterface/Mid0211.cs +++ b/src/OpenProtocolInterpreter/IOInterface/Mid0211.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.IOInterface { @@ -15,46 +16,22 @@ public class Mid0211 : Mid, IIOInterface, IController, IAcknowledgeable { public const int MID = 211; - public bool StatusDigInOne - { - get => GetField(1, DataFields.StatusDigIn1).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(1, DataFields.StatusDigIn1).SetValue(OpenProtocolConvert.ToString, value); - } - public bool StatusDigInTwo - { - get => GetField(1, DataFields.StatusDigIn2).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(1, DataFields.StatusDigIn2).SetValue(OpenProtocolConvert.ToString, value); - } - public bool StatusDigInThree - { - get => GetField(1, DataFields.StatusDigIn3).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(1, DataFields.StatusDigIn3).SetValue(OpenProtocolConvert.ToString, value); - } - public bool StatusDigInFour - { - get => GetField(1, DataFields.StatusDigIn4).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(1, DataFields.StatusDigIn4).SetValue(OpenProtocolConvert.ToString, value); - } - public bool StatusDigInFive - { - get => GetField(1, DataFields.StatusDigIn5).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(1, DataFields.StatusDigIn5).SetValue(OpenProtocolConvert.ToString, value); - } - public bool StatusDigInSix - { - get => GetField(1, DataFields.StatusDigIn6).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(1, DataFields.StatusDigIn6).SetValue(OpenProtocolConvert.ToString, value); - } - public bool StatusDigInSeven - { - get => GetField(1, DataFields.StatusDigIn7).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(1, DataFields.StatusDigIn7).SetValue(OpenProtocolConvert.ToString, value); - } - public bool StatusDigInEight - { - get => GetField(1, DataFields.StatusDigIn8).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(1, DataFields.StatusDigIn8).SetValue(OpenProtocolConvert.ToString, value); - } + [BooleanDataFieldDefinition(revision: 1, field: 1, Index = 20, HasPrefix = false)] + public bool StatusDigInOne { get; set; } + [BooleanDataFieldDefinition(revision: 1, field: 2, Index = 21, HasPrefix = false)] + public bool StatusDigInTwo { get; set; } + [BooleanDataFieldDefinition(revision: 1, field: 3, Index = 22, HasPrefix = false)] + public bool StatusDigInThree { get; set; } + [BooleanDataFieldDefinition(revision: 1, field: 4, Index = 23, HasPrefix = false)] + public bool StatusDigInFour { get; set; } + [BooleanDataFieldDefinition(revision: 1, field: 5, Index = 24, HasPrefix = false)] + public bool StatusDigInFive { get; set; } + [BooleanDataFieldDefinition(revision: 1, field: 6, Index = 25, HasPrefix = false)] + public bool StatusDigInSix { get; set; } + [BooleanDataFieldDefinition(revision: 1, field: 7, Index = 26, HasPrefix = false)] + public bool StatusDigInSeven { get; set; } + [BooleanDataFieldDefinition(revision: 1, field: 8, Index = 27, HasPrefix = false)] + public bool StatusDigInEight { get; set; } public Mid0211() : this(new Header() { @@ -68,37 +45,5 @@ public Mid0211() : this(new Header() public Mid0211(Header header) : base(header) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Boolean(DataFields.StatusDigIn1, 20, false), - DataField.Boolean(DataFields.StatusDigIn2, 21, false), - DataField.Boolean(DataFields.StatusDigIn3, 22, false), - DataField.Boolean(DataFields.StatusDigIn4, 23, false), - DataField.Boolean(DataFields.StatusDigIn5, 24, false), - DataField.Boolean(DataFields.StatusDigIn6, 25, false), - DataField.Boolean(DataFields.StatusDigIn7, 26, false), - DataField.Boolean(DataFields.StatusDigIn8, 27, false) - } - } - }; - } - - protected enum DataFields - { - StatusDigIn1, - StatusDigIn2, - StatusDigIn3, - StatusDigIn4, - StatusDigIn5, - StatusDigIn6, - StatusDigIn7, - StatusDigIn8 - } } } diff --git a/src/OpenProtocolInterpreter/IOInterface/Mid0214.cs b/src/OpenProtocolInterpreter/IOInterface/Mid0214.cs index c7c80ec1..5cb03e42 100644 --- a/src/OpenProtocolInterpreter/IOInterface/Mid0214.cs +++ b/src/OpenProtocolInterpreter/IOInterface/Mid0214.cs @@ -1,13 +1,14 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.IOInterface { /// /// IO device status request /// - /// Request for the status of the relays and digital inputs at a device, e.g. an I/O expander. + /// Request for the status of the relays and digital inputs at a device, e.g. an I/O expander. /// The device is specified by a device number. - /// + /// /// Message sent by: Integrator /// /// Answer: IO device status or @@ -20,11 +21,8 @@ public class Mid0214 : Mid, IIOInterface, IIntegrator, IAnswerableBy, I public IEnumerable DocumentedPossibleErrors => new Error[] { Error.FaultyIODeviceId, Error.IODeviceNotConnected }; - public int DeviceNumber - { - get => GetField(1, DataFields.DeviceNumber).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.DeviceNumber).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 2, HasPrefix = false)] + public int DeviceNumber { get; set; } public Mid0214() : this(DEFAULT_REVISION) { @@ -41,23 +39,5 @@ public Mid0214(int revision) : this(new Header() }) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.DeviceNumber, 20, 2, false) - } - } - }; - } - - protected enum DataFields - { - DeviceNumber - } } } diff --git a/src/OpenProtocolInterpreter/IOInterface/Mid0215.cs b/src/OpenProtocolInterpreter/IOInterface/Mid0215.cs index 1bdcbf0b..c2d2765d 100644 --- a/src/OpenProtocolInterpreter/IOInterface/Mid0215.cs +++ b/src/OpenProtocolInterpreter/IOInterface/Mid0215.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using System.Text; @@ -22,24 +23,24 @@ public class Mid0215 : Mid, IIOInterface, IController { public const int MID = 215; - public int IODeviceId - { - get => GetField(Header.StandardizedRevision, DataFields.IODeviceId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(Header.StandardizedRevision, DataFields.IODeviceId).SetValue(OpenProtocolConvert.ToString, value); - } - public List Relays { get; set; } - public List DigitalInputs { get; set; } - //rev 2 - public int NumberOfRelays - { - get => GetField(2, DataFields.NumberOfRelays).GetValue(OpenProtocolConvert.ToInt32); - private set => GetField(2, DataFields.NumberOfRelays).SetValue(OpenProtocolConvert.ToString, value); - } - public int NumberOfDigitalInputs - { - get => GetField(2, DataFields.NumberOfDigitalInputs).GetValue(OpenProtocolConvert.ToInt32); - private set => GetField(2, DataFields.NumberOfDigitalInputs).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 2)] + [Int32DataFieldDefinition(revision: 2, field: 1, Index = 20, Size = 2)] + public int IODeviceId { get; set; } + + [RelayCollectionDefinition(revision: 1, field: 2, Index = 24, Size = 4 * 8)] + [RelayCollectionDefinition(revision: 2, field: 3, Index = 28, Size = 4 * 8)] + public List Relays { get; set; } = new List(); + + [DigitalInputCollectionDefinition(revision: 1, field: 3, Index = 58, Size = 4 * 8)] + [DigitalInputCollectionDefinition(revision: 2, field: 5, Index = 0, Size = 4 * 8)] + public List DigitalInputs { get; set; } = new List(); + + //At revision 2 number of relays/digital inputs comes before their lists + [Int32DataFieldDefinition(revision: 2, field: 2, Index = 24, Size = 2)] + public int NumberOfRelays { get; set; } + + [Int32DataFieldDefinition(revision: 2, field: 4, Index = 26, Size = 2)] + public int NumberOfDigitalInputs { get; set; } public Mid0215() : this(DEFAULT_REVISION) { @@ -63,13 +64,11 @@ public Mid0215(int revision) : this(new Header() protected override string BuildHeader() { - if (RevisionsByFields.Any()) + if (RevisionsByFields.TryGetValue(Header.StandardizedRevision, out var dataFields)) { - Header.Length = 20; - var revision = Header.StandardizedRevision; - foreach (var dataField in RevisionsByFields[revision]) - Header.Length += (dataField.HasPrefix ? 2 : 0) + dataField.Size; + Header.Length = Header.DefaultSize + dataFields.Sum(x => x.TotalSize); } + return Header.ToString(); } @@ -80,109 +79,77 @@ public override string Pack() NumberOfRelays = Relays.Count; NumberOfDigitalInputs = DigitalInputs.Count; - var relayListField = GetField(2, DataFields.RelayList); - relayListField.Size = NumberOfRelays * 4; - relayListField.Value = PackRelays(); - GetField(2, DataFields.NumberOfDigitalInputs).Index = relayListField.Index + relayListField.Size; - - GetField(2, DataFields.DigitalInputList).Index = GetField(2, DataFields.NumberOfDigitalInputs).Index + 2; - GetField(2, DataFields.DigitalInputList).Size = NumberOfDigitalInputs * 4; - GetField(2, DataFields.DigitalInputList).Value = PackDigitalInputs(); - } - else - { - GetField(1, DataFields.RelayList).Value = PackRelays(); - GetField(1, DataFields.DigitalInputList).Value = PackDigitalInputs(); - } - - var builder = new StringBuilder(BuildHeader()); - int prefixIndex = 1; - foreach (var field in RevisionsByFields[Header.StandardizedRevision]) - { - builder.Append(string.Concat(prefixIndex.ToString("D2"), field.Value)); - prefixIndex++; - } - return builder.ToString(); - } - - public override Mid Parse(string package) - { - Header = ProcessHeader(package); + var relaysField = GetField(revision: 2, field: 3); + relaysField.Size = NumberOfRelays * 4; - var revision = Header.StandardizedRevision; + var numberOfDigitalInputsField = GetField(revision: 2, field: 4); + numberOfDigitalInputsField.Index = relaysField.Index + relaysField.TotalSize; - var relayListField = GetField(revision, DataFields.RelayList); - var digitalListField = GetField(revision, DataFields.DigitalInputList); - if (revision > 1) - { - int numberOfRelays = OpenProtocolConvert.ToInt32(GetValue(GetField(2, DataFields.NumberOfRelays), package)); - relayListField.Size = numberOfRelays * 4; + var digitalInputsField = GetField(revision: 2, field: 5); + digitalInputsField.Index = numberOfDigitalInputsField.Index + numberOfDigitalInputsField.TotalSize; + digitalInputsField.Size = NumberOfDigitalInputs * 4; - var numberOfDigitalInputsField = GetField(2, DataFields.NumberOfDigitalInputs); - numberOfDigitalInputsField.Index = relayListField.Index + 2 + relayListField.Size; + var builder = new StringBuilder(BuildHeader()); - digitalListField.Index = numberOfDigitalInputsField.Index + 2 + numberOfDigitalInputsField.Size; - digitalListField.Size = Header.Length - 2 - digitalListField.Index; + var fields = RevisionsByFields[Header.StandardizedRevision].OrderBy(x => x.Field); + builder.Append(base.Pack(fields)); + return builder.ToString(); } + else + EnsureEightRelaysAndDigitalInputs(); - ProcessDataFields(package); - - Relays = Relay.ParseAll(relayListField.Value).ToList(); - DigitalInputs = DigitalInput.ParseAll(digitalListField.Value).ToList(); - return this; - } - - protected virtual string PackRelays() - { - var value = new StringBuilder(); - foreach (var relay in Relays) - value.Append(relay.Pack()); - - return value.ToString(); + return base.Pack(); } - protected virtual string PackDigitalInputs() + protected override void ProcessDataFields(ReadOnlySpan package) { - var value = new StringBuilder(); - foreach (var digitalInput in DigitalInputs) - value.Append(digitalInput.Pack()); + if (Header.StandardizedRevision == 1) + { + EnsureEightRelaysAndDigitalInputs(); + } - return value.ToString(); - } + var fields = RevisionsByFields[Header.StandardizedRevision].OrderBy(x => x.Field); + var enumerator = fields.GetEnumerator(); - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() + while (enumerator.MoveNext()) { + var field = enumerator.Current; + base.ProcessDataField(field, package); + if (Header.StandardizedRevision <= 1) + continue; + + if (field.Field == 2) + { + var relays = GetField(revision: 2, field: 3); + relays.Index = field.Index + field.TotalSize; + relays.Size = NumberOfRelays * 4; + } + else if (field.Field == 3) { - 1, new List() - { - DataField.Number(DataFields.IODeviceId, 20, 2), - new(DataFields.RelayList, 24, 32), - new(DataFields.DigitalInputList, 58, 32) - } - }, + var numberOfDigitalInputs = GetField(revision: 2, field: 4); + numberOfDigitalInputs.Index = field.Index + field.TotalSize; + } + else if (field.Field == 4) { - 2, new List() - { - DataField.Number(DataFields.IODeviceId, 20, 2), - DataField.Number(DataFields.NumberOfRelays, 24, 2), - DataField.Volatile(DataFields.RelayList, 28), - new(DataFields.NumberOfDigitalInputs, 0, 2, '0', PaddingOrientation.LeftPadded), - DataField.Volatile(DataFields.DigitalInputList) - } + var digitalInputs = GetField(revision: 2, field: 5); + digitalInputs.Index = field.Index + field.TotalSize; + digitalInputs.Size = NumberOfDigitalInputs * 4; } - }; + } } - protected enum DataFields + private void EnsureEightRelaysAndDigitalInputs() { - IODeviceId, - RelayList, - DigitalInputList, - //rev2 - NumberOfRelays, - NumberOfDigitalInputs + if (Relays.Count > 8 || DigitalInputs.Count > 8) + throw new InvalidOperationException("Revision 1 of MID 0215 can only have up to 8 relays and digital inputs."); + + GetField(nameof(Relays)).Size = 4 * 8; + for (int i = Relays.Count; i < 8; i++) + Relays.Add(new Relay(RelayNumber.Off, false)); + + GetField(nameof(DigitalInputs)).Size = 4 * 8; + for (int i = DigitalInputs.Count; i < 8; i++) + DigitalInputs.Add(new DigitalInput(DigitalInputNumber.Off, false)); } } } diff --git a/src/OpenProtocolInterpreter/IOInterface/Mid0216.cs b/src/OpenProtocolInterpreter/IOInterface/Mid0216.cs index 786b8c04..713e499b 100644 --- a/src/OpenProtocolInterpreter/IOInterface/Mid0216.cs +++ b/src/OpenProtocolInterpreter/IOInterface/Mid0216.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.IOInterface { @@ -11,7 +12,7 @@ namespace OpenProtocolInterpreter.IOInterface /// status to the subscriber. /// can only subscribe for one single relay function at a time, but still, Open Protocol supports /// keeping several relay function subscriptions simultaneously. - /// + /// /// Message sent by: Integrator /// Answer: Command accepted or Command error, The relay function subscription already exists /// @@ -21,11 +22,8 @@ public class Mid0216 : Mid, IIOInterface, IIntegrator, ISubscription, IAcceptabl public IEnumerable DocumentedPossibleErrors => new Error[] { Error.RelayFunctionSubscriptionAlreadyExists }; - public RelayNumber RelayNumber - { - get => (RelayNumber)GetField(1, DataFields.RelayNumber).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.RelayNumber).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 3, HasPrefix = false)] + public RelayNumber RelayNumber { get; set; } public Mid0216() : this(false) { @@ -43,25 +41,7 @@ public Mid0216(bool noAckFlag = false) : this(new Header() NoAckFlag = noAckFlag }) { - - } - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.RelayNumber, 20, 3, false) - } - } - }; - } - - protected enum DataFields - { - RelayNumber } } } diff --git a/src/OpenProtocolInterpreter/IOInterface/Mid0217.cs b/src/OpenProtocolInterpreter/IOInterface/Mid0217.cs index ef8b8d1e..ba79f94c 100644 --- a/src/OpenProtocolInterpreter/IOInterface/Mid0217.cs +++ b/src/OpenProtocolInterpreter/IOInterface/Mid0217.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.IOInterface { @@ -17,16 +18,10 @@ public class Mid0217 : Mid, IIOInterface, IController, IAcknowledgeable { public const int MID = 217; - public RelayNumber RelayNumber - { - get => (RelayNumber)GetField(1, DataFields.RelayNumber).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.RelayNumber).SetValue(OpenProtocolConvert.ToString, value); - } - public bool RelayStatus - { - get => GetField(1, DataFields.RelayStatus).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(1, DataFields.RelayStatus).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 3)] + public RelayNumber RelayNumber { get; set; } + [BooleanDataFieldDefinition(revision: 1, field: 2, Index = 25)] + public bool RelayStatus { get; set; } public Mid0217() : this(new Header() { @@ -40,26 +35,6 @@ public Mid0217() : this(new Header() public Mid0217(Header header) : base(header) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.RelayNumber, 20, 3), - DataField.Boolean(DataFields.RelayStatus, 25) - } - } - }; - } - - protected enum DataFields - { - RelayNumber, - RelayStatus - } } } diff --git a/src/OpenProtocolInterpreter/IOInterface/Mid0219.cs b/src/OpenProtocolInterpreter/IOInterface/Mid0219.cs index e096f11c..0526f40e 100644 --- a/src/OpenProtocolInterpreter/IOInterface/Mid0219.cs +++ b/src/OpenProtocolInterpreter/IOInterface/Mid0219.cs @@ -1,4 +1,6 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; namespace OpenProtocolInterpreter.IOInterface { @@ -6,7 +8,7 @@ namespace OpenProtocolInterpreter.IOInterface /// Relay function unsubscribe /// /// Unsubscribe for a single relay function. The data field consists of three ASCII digits, - /// the relay number, which corresponds to the specific relay function. The relay numbers can be + /// the relay number, which corresponds to the specific relay function. The relay numbers can be /// found in Table 101. /// /// Message sent by: Integrator @@ -18,11 +20,8 @@ public class Mid0219 : Mid, IIOInterface, IIntegrator, IUnsubscription, IAccepta public IEnumerable DocumentedPossibleErrors => new Error[] { Error.RelayFunctionSubscriptionDoesntExists }; - public RelayNumber RelayNumber - { - get => (RelayNumber)GetField(1, DataFields.RelayNumber).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.RelayNumber).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 3, HasPrefix = false)] + public RelayNumber RelayNumber { get; set; } public Mid0219() : this(new Header() { @@ -36,23 +35,5 @@ public Mid0219() : this(new Header() public Mid0219(Header header) : base(header) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.RelayNumber, 20, 3, false) - } - } - }; - } - - protected enum DataFields - { - RelayNumber - } } } diff --git a/src/OpenProtocolInterpreter/IOInterface/Mid0220.cs b/src/OpenProtocolInterpreter/IOInterface/Mid0220.cs index 94d3cead..7823f55c 100644 --- a/src/OpenProtocolInterpreter/IOInterface/Mid0220.cs +++ b/src/OpenProtocolInterpreter/IOInterface/Mid0220.cs @@ -1,17 +1,18 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.IOInterface { /// /// Digital input function subscribe /// - /// Subscribe for one single digital input function. The data field consists of three ASCII digits, + /// Subscribe for one single digital input function. The data field consists of three ASCII digits, /// the digital input function number. The digital input function numbers can be found in Table 80 above. - /// At a subscription of a tracking event, Digital input function upload immediately returns the + /// At a subscription of a tracking event, Digital input function upload immediately returns the /// current digital input function status to the subscriber. /// /// - /// can only subscribe for one single digital input function at a time, + /// can only subscribe for one single digital input function at a time, /// but still, Open Protocol supports keeping several digital input function subscriptions simultaneously. /// /// Message sent by: Integrator @@ -21,13 +22,10 @@ public class Mid0220 : Mid, IIOInterface, IIntegrator, ISubscription, IAcceptabl { public const int MID = 220; - public IEnumerable DocumentedPossibleErrors => new Error[] { }; + public IEnumerable DocumentedPossibleErrors => new Error[] { }; - public DigitalInputNumber DigitalInputNumber - { - get => (DigitalInputNumber)GetField(1, DataFields.DigitalInputNumber).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.DigitalInputNumber).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 3, HasPrefix = false)] + public DigitalInputNumber DigitalInputNumber { get; set; } public Mid0220() : this(false) { @@ -47,23 +45,5 @@ public Mid0220(bool noAckFlag = false) : this(new Header() { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.DigitalInputNumber, 20, 3, false) - } - } - }; - } - - protected enum DataFields - { - DigitalInputNumber - } } } diff --git a/src/OpenProtocolInterpreter/IOInterface/Mid0221.cs b/src/OpenProtocolInterpreter/IOInterface/Mid0221.cs index 3d63bfe2..31c3f3d5 100644 --- a/src/OpenProtocolInterpreter/IOInterface/Mid0221.cs +++ b/src/OpenProtocolInterpreter/IOInterface/Mid0221.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.IOInterface { @@ -8,7 +9,7 @@ namespace OpenProtocolInterpreter.IOInterface /// Upload of one specific digital input function status. See Table 80. /// For tracking event functions, Digital input function, is sent each time the digital input /// function’s status (state) is changed. For digital input functions which are not tracking events, the - /// upload is sent only when the digital input function is set high, + /// upload is sent only when the digital input function is set high, /// i.e. the data field “Digital input function status” will always be 1 for such functions. /// /// Message sent by: Controller @@ -18,16 +19,10 @@ public class Mid0221 : Mid, IIOInterface, IController, IAcknowledgeable { public const int MID = 221; - public DigitalInputNumber DigitalInputNumber - { - get => (DigitalInputNumber)GetField(1, DataFields.DigitalInputNumber).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.DigitalInputNumber).SetValue(OpenProtocolConvert.ToString, value); - } - public bool DigitalInputStatus - { - get => GetField(1, DataFields.DigitalInputStatus).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(1, DataFields.DigitalInputStatus).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 3)] + public DigitalInputNumber DigitalInputNumber { get; set; } + [BooleanDataFieldDefinition(revision: 1, field: 2, Index = 25)] + public bool DigitalInputStatus { get; set; } public Mid0221() : this(new Header() { @@ -40,25 +35,5 @@ public Mid0221() : this(new Header() public Mid0221(Header header) : base(header) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.DigitalInputNumber, 20, 3), - DataField.Boolean(DataFields.DigitalInputStatus, 25) - } - } - }; - } - - protected enum DataFields - { - DigitalInputNumber, - DigitalInputStatus - } } } diff --git a/src/OpenProtocolInterpreter/IOInterface/Mid0223.cs b/src/OpenProtocolInterpreter/IOInterface/Mid0223.cs index 539bb5c7..87a1c553 100644 --- a/src/OpenProtocolInterpreter/IOInterface/Mid0223.cs +++ b/src/OpenProtocolInterpreter/IOInterface/Mid0223.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.IOInterface { @@ -6,9 +7,9 @@ namespace OpenProtocolInterpreter.IOInterface /// Relay function unsubscribe /// /// Unsubscribe for a single relay function. The data field consists of three ASCII digits, - /// the relay number, which corresponds to the specific relay function. The relay numbers can be + /// the relay number, which corresponds to the specific relay function. The relay numbers can be /// found in Table 101. - /// + /// /// Message sent by: Integrator /// Answer: Command accepted or Command error, The relay function subscription does not exist /// @@ -18,11 +19,8 @@ public class Mid0223 : Mid, IIOInterface, IIntegrator, IUnsubscription, IAccepta public IEnumerable DocumentedPossibleErrors => new Error[] { Error.RelayFunctionSubscriptionDoesntExists }; - public DigitalInputNumber DigitalInputNumber - { - get => (DigitalInputNumber)GetField(1, DataFields.DigitalInputNumber).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.DigitalInputNumber).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 3, HasPrefix = false)] + public DigitalInputNumber DigitalInputNumber { get; set; } public Mid0223() : this(new Header() { @@ -36,23 +34,5 @@ public Mid0223() : this(new Header() public Mid0223(Header header) : base(header) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.DigitalInputNumber, 20, 3, false) - } - } - }; - } - - protected enum DataFields - { - DigitalInputNumber - } } } diff --git a/src/OpenProtocolInterpreter/IOInterface/Mid0224.cs b/src/OpenProtocolInterpreter/IOInterface/Mid0224.cs index e48f7f7c..460cf32e 100644 --- a/src/OpenProtocolInterpreter/IOInterface/Mid0224.cs +++ b/src/OpenProtocolInterpreter/IOInterface/Mid0224.cs @@ -1,11 +1,12 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.IOInterface { /// /// Set digital input function /// - /// Set the digital input function with the digital input number. + /// Set the digital input function with the digital input number. /// The digital input function numbers are defined in Table 80. /// /// Message sent by: Integrator @@ -17,11 +18,8 @@ public class Mid0224 : Mid, IIOInterface, IIntegrator, IAcceptableCommand, IDecl public IEnumerable DocumentedPossibleErrors => new Error[] { Error.InvalidData }; - public DigitalInputNumber DigitalInputNumber - { - get => (DigitalInputNumber)GetField(1, DataFields.DigitalInputNumber).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.DigitalInputNumber).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 3, HasPrefix = false)] + public DigitalInputNumber DigitalInputNumber { get; set; } public Mid0224() : this(new Header() { @@ -35,23 +33,5 @@ public Mid0224() : this(new Header() public Mid0224(Header header) : base(header) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.DigitalInputNumber, 20, 3, false) - } - } - }; - } - - protected enum DataFields - { - DigitalInputNumber - } } } diff --git a/src/OpenProtocolInterpreter/IOInterface/Mid0225.cs b/src/OpenProtocolInterpreter/IOInterface/Mid0225.cs index c4d8c82e..1104b228 100644 --- a/src/OpenProtocolInterpreter/IOInterface/Mid0225.cs +++ b/src/OpenProtocolInterpreter/IOInterface/Mid0225.cs @@ -1,16 +1,17 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.IOInterface { /// /// Reset digital input function /// - /// Reset the digital input function with the digital input number. + /// Reset the digital input function with the digital input number. /// The digital input function numbers are defined in Table 80. - /// + /// /// /// This MID will only affect the digital input functions of tracking type. - /// The digital input functions with the type flank cannot be reset (for example reset the reset + /// The digital input functions with the type flank cannot be reset (for example reset the reset /// batch digital input function will have no effect). /// /// Message sent by: Integrator @@ -22,11 +23,9 @@ public class Mid0225 : Mid, IIOInterface, IIntegrator, IAcceptableCommand, IDecl public IEnumerable DocumentedPossibleErrors => new Error[] { Error.InvalidData }; - public DigitalInputNumber DigitalInputNumber - { - get => (DigitalInputNumber)GetField(1, DataFields.DigitalInputNumber).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.DigitalInputNumber).SetValue(OpenProtocolConvert.ToString, value); - } + + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 3, HasPrefix = false)] + public DigitalInputNumber DigitalInputNumber { get; set; } public Mid0225() : this(new Header() { @@ -40,23 +39,5 @@ public Mid0225() : this(new Header() public Mid0225(Header header) : base(header) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.DigitalInputNumber, 20, 3, false) - } - } - }; - } - - protected enum DataFields - { - DigitalInputNumber - } } } diff --git a/src/OpenProtocolInterpreter/IOInterface/Relay.cs b/src/OpenProtocolInterpreter/IOInterface/Relay.cs index d8b15b9c..b2315f98 100644 --- a/src/OpenProtocolInterpreter/IOInterface/Relay.cs +++ b/src/OpenProtocolInterpreter/IOInterface/Relay.cs @@ -1,4 +1,8 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; namespace OpenProtocolInterpreter.IOInterface { @@ -10,6 +14,17 @@ public class Relay public RelayNumber Number { get; set; } public bool Status { get; set; } + public Relay() + { + + } + + public Relay(RelayNumber number, bool status) + { + Number = number; + Status = status; + } + public string Pack() { return OpenProtocolConvert.ToString('0', 3, PaddingOrientation.LeftPadded, (int)Number) + @@ -17,27 +32,63 @@ public string Pack() } public static Relay Parse(string section) + => Parse(section.AsSpan()); + + public static Relay Parse(ReadOnlySpan section) { return new Relay() { - Number = (RelayNumber)OpenProtocolConvert.ToInt32(section.Substring(0, 3)), - Status = OpenProtocolConvert.ToBoolean(section.Substring(3, 1)) + Number = (RelayNumber)OpenProtocolConvert.ToInt32(section.Slice(0, 3)), + Status = OpenProtocolConvert.ToBoolean(section.Slice(3, 1)) }; } public static IEnumerable ParseAll(string value) + => ParseAll(value.AsSpan()); + + public static IEnumerable ParseAll(ReadOnlySpan value) { - if(string.IsNullOrEmpty(value)) - { - yield break; - } + if (value.IsEmpty) + return Array.Empty(); + var result = new List(); const int sectionSize = 4; for (int i = 0; i < value.Length; i += sectionSize) + result.Add(Parse(value.Slice(i, sectionSize))); + return result; + } + } + + public class RelayCollectionDefinitionAttribute : DataFieldDefinitionAttribute + { + public RelayCollectionDefinitionAttribute(int revision) : base(revision) + { + + } + public RelayCollectionDefinitionAttribute(int field, int revision) : base(field, revision) + { + + } + + internal override DataField Build(object owner, PropertyInfo propertyInfo, int index) + { + return new DataField>(Field, index, Size, HasPrefix) { - var section = value.Substring(i, sectionSize); - yield return Parse(section); - } + DefaultConverter = PackRelays, + DefaultParser = ParseRelays + }.Bind(owner, propertyInfo); + } + + private static string PackRelays(char paddingChar, int size, PaddingOrientation orientation, List relays) + { + var builder = new StringBuilder(relays.Count * 4); + foreach (var relay in relays) + builder.Append(relay.Pack()); + + return builder.ToString(); } + + private static List ParseRelays(string value) + => Relay.ParseAll(value).ToList(); } } diff --git a/src/OpenProtocolInterpreter/ISubscription.cs b/src/OpenProtocolInterpreter/ISubscription.cs deleted file mode 100644 index 06fd69bc..00000000 --- a/src/OpenProtocolInterpreter/ISubscription.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace OpenProtocolInterpreter -{ - /// - /// Contract which every subscription message implements. - /// - public interface ISubscription - { - } -} diff --git a/src/OpenProtocolInterpreter/IUnsubscription.cs b/src/OpenProtocolInterpreter/IUnsubscription.cs deleted file mode 100644 index f66260c8..00000000 --- a/src/OpenProtocolInterpreter/IUnsubscription.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace OpenProtocolInterpreter -{ - /// - /// Contract which every unsubscription message implements. - /// - public interface IUnsubscription - { - } -} diff --git a/src/OpenProtocolInterpreter/Job/Advanced/AdvancedJob.cs b/src/OpenProtocolInterpreter/Job/Advanced/AdvancedJob.cs index 9a196bab..3615c4be 100644 --- a/src/OpenProtocolInterpreter/Job/Advanced/AdvancedJob.cs +++ b/src/OpenProtocolInterpreter/Job/Advanced/AdvancedJob.cs @@ -1,5 +1,7 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; +using System.Reflection; namespace OpenProtocolInterpreter.Job.Advanced { @@ -60,32 +62,35 @@ public string Pack(int revision) } public static AdvancedJob Parse(string section, int revision) + => Parse(section.AsSpan(), revision); + + public static AdvancedJob Parse(ReadOnlySpan section, int revision) { - var fields = section.Split(':'); + var remaining = section; var obj = new AdvancedJob() { - ChannelId = OpenProtocolConvert.ToInt32(fields[0]), - ProgramId = OpenProtocolConvert.ToInt32(fields[1]), - AutoSelect = (AutoSelect)OpenProtocolConvert.ToInt32(fields[2]), - BatchSize = OpenProtocolConvert.ToInt32(fields[3]), - MaxCoherentNok = OpenProtocolConvert.ToInt32(fields[4]) + ChannelId = OpenProtocolConvert.ToInt32(NextField(ref remaining, ':')), + ProgramId = OpenProtocolConvert.ToInt32(NextField(ref remaining, ':')), + AutoSelect = (AutoSelect)OpenProtocolConvert.ToInt32(NextField(ref remaining, ':')), + BatchSize = OpenProtocolConvert.ToInt32(NextField(ref remaining, ':')), + MaxCoherentNok = OpenProtocolConvert.ToInt32(NextField(ref remaining, ':')) }; if (revision > 1) { - obj.BatchCounter = OpenProtocolConvert.ToInt32(fields[5]); + obj.BatchCounter = OpenProtocolConvert.ToInt32(NextField(ref remaining, ':')); if (revision != 999) { - obj.IdentifierNumber = OpenProtocolConvert.ToInt32(fields[6]); - obj.JobStepName = fields[7]; - obj.JobStepType = OpenProtocolConvert.ToInt32(fields[8]); + obj.IdentifierNumber = OpenProtocolConvert.ToInt32(NextField(ref remaining, ':')); + obj.JobStepName = NextField(ref remaining, ':').ToString(); + obj.JobStepType = OpenProtocolConvert.ToInt32(NextField(ref remaining, ':')); if (revision > 2) { - obj.ToolLoosening = (ToolLoosening)OpenProtocolConvert.ToInt32(fields[9]); - obj.JobBatchMode = (BatchMode)OpenProtocolConvert.ToInt32(fields[10]); - obj.BatchStatusAtIncrement = (BatchStatusAtIncrement)OpenProtocolConvert.ToInt32(fields[11]); - obj.DecrementBatchAfterLoosening = (DecrementBatchAfterLoosening)OpenProtocolConvert.ToInt32(fields[12]); - obj.CurrentBatchStatus = (CurrentBatchStatus)OpenProtocolConvert.ToInt32(fields[13]); + obj.ToolLoosening = (ToolLoosening)OpenProtocolConvert.ToInt32(NextField(ref remaining, ':')); + obj.JobBatchMode = (BatchMode)OpenProtocolConvert.ToInt32(NextField(ref remaining, ':')); + obj.BatchStatusAtIncrement = (BatchStatusAtIncrement)OpenProtocolConvert.ToInt32(NextField(ref remaining, ':')); + obj.DecrementBatchAfterLoosening = (DecrementBatchAfterLoosening)OpenProtocolConvert.ToInt32(NextField(ref remaining, ':')); + obj.CurrentBatchStatus = (CurrentBatchStatus)OpenProtocolConvert.ToInt32(NextField(ref remaining, ':')); } } } @@ -94,30 +99,83 @@ public static AdvancedJob Parse(string section, int revision) } public static IEnumerable ParseAll(string section, int revision) + => ParseAll(section.AsSpan(), revision); + + public static IEnumerable ParseAll(ReadOnlySpan section, int revision) { - if (string.IsNullOrEmpty(section)) + if (section.IsEmpty) + return Array.Empty(); + + var result = new List(); + var remaining = section; + while (!remaining.IsEmpty) { - yield break; + var job = NextField(ref remaining, ';'); + if (!job.IsWhiteSpace()) + result.Add(Parse(job, revision)); } + return result; + } - var jobs = section.Split(';').ToList(); - jobs.RemoveAll(string.IsNullOrWhiteSpace); //remove last one which will probably be empty - foreach (var advancedJob in jobs) + private static ReadOnlySpan NextField(ref ReadOnlySpan remaining, char separator) + { + int idx = remaining.IndexOf(separator); + if (idx < 0) { - yield return Parse(advancedJob, revision); + var last = remaining; + remaining = ReadOnlySpan.Empty; + return last; } + + var field = remaining.Slice(0, idx); + remaining = remaining.Slice(idx + 1); + return field; } internal static int GetDefaultSize(int revision) { return revision switch { + 1 => 15, 2 => 52, 3 => 63, 4 => 67, 999 => 18, - _ => 15, + _ => 67, }; } } + + public class AdvancedJobCollectionDefinitionAttribute : DataFieldDefinitionAttribute + { + public AdvancedJobCollectionDefinitionAttribute(int revision) : base(revision) + { + + } + public AdvancedJobCollectionDefinitionAttribute(int field, int revision) : base(field, revision) + { + + } + + internal override DataField Build(object owner, PropertyInfo propertyInfo, int index) + { + return new DataField>(Field, index, Size, HasPrefix) + { + DefaultConverter = PackAdvancedJobs, + DefaultParser = ParseAdvancedJobs + }.Bind(owner, propertyInfo); + } + + private string PackAdvancedJobs(char paddingChar, int size, PaddingOrientation orientation, List advancedJobs) + { + var list = new List(); + foreach (var advancedJob in advancedJobs) + list.Add(advancedJob.Pack(Revision)); + + return string.Concat(string.Join(";", list), ";"); + } + + private List ParseAdvancedJobs(string value) + => AdvancedJob.ParseAll(value, Revision).ToList(); + } } diff --git a/src/OpenProtocolInterpreter/Job/Advanced/AdvancedJobMessages.cs b/src/OpenProtocolInterpreter/Job/Advanced/AdvancedJobMessages.cs index 512eae44..e121ea22 100644 --- a/src/OpenProtocolInterpreter/Job/Advanced/AdvancedJobMessages.cs +++ b/src/OpenProtocolInterpreter/Job/Advanced/AdvancedJobMessages.cs @@ -11,23 +11,23 @@ internal class AdvancedJobMessages : MessagesTemplate { public AdvancedJobMessages() : base() { - _templates = new Dictionary() + _templates = new Dictionary>() { - { Mid0120.MID, new MidCompiledInstance(typeof(Mid0120)) }, - { Mid0121.MID, new MidCompiledInstance(typeof(Mid0121)) }, - { Mid0122.MID, new MidCompiledInstance(typeof(Mid0122)) }, - { Mid0123.MID, new MidCompiledInstance(typeof(Mid0123)) }, - { Mid0124.MID, new MidCompiledInstance(typeof(Mid0124)) }, - { Mid0125.MID, new MidCompiledInstance(typeof(Mid0125)) }, - { Mid0126.MID, new MidCompiledInstance(typeof(Mid0126)) }, - { Mid0127.MID, new MidCompiledInstance(typeof(Mid0127)) }, - { Mid0128.MID, new MidCompiledInstance(typeof(Mid0128)) }, - { Mid0129.MID, new MidCompiledInstance(typeof(Mid0129)) }, - { Mid0130.MID, new MidCompiledInstance(typeof(Mid0130)) }, - { Mid0131.MID, new MidCompiledInstance(typeof(Mid0131)) }, - { Mid0132.MID, new MidCompiledInstance(typeof(Mid0132)) }, - { Mid0133.MID, new MidCompiledInstance(typeof(Mid0133)) }, - { Mid0140.MID, new MidCompiledInstance(typeof(Mid0140)) } + { Mid0120.MID, new CompiledInstance(typeof(Mid0120)) }, + { Mid0121.MID, new CompiledInstance(typeof(Mid0121)) }, + { Mid0122.MID, new CompiledInstance(typeof(Mid0122)) }, + { Mid0123.MID, new CompiledInstance(typeof(Mid0123)) }, + { Mid0124.MID, new CompiledInstance(typeof(Mid0124)) }, + { Mid0125.MID, new CompiledInstance(typeof(Mid0125)) }, + { Mid0126.MID, new CompiledInstance(typeof(Mid0126)) }, + { Mid0127.MID, new CompiledInstance(typeof(Mid0127)) }, + { Mid0128.MID, new CompiledInstance(typeof(Mid0128)) }, + { Mid0129.MID, new CompiledInstance(typeof(Mid0129)) }, + { Mid0130.MID, new CompiledInstance(typeof(Mid0130)) }, + { Mid0131.MID, new CompiledInstance(typeof(Mid0131)) }, + { Mid0132.MID, new CompiledInstance(typeof(Mid0132)) }, + { Mid0133.MID, new CompiledInstance(typeof(Mid0133)) }, + { Mid0140.MID, new CompiledInstance(typeof(Mid0140)) } }; } diff --git a/src/OpenProtocolInterpreter/Job/Advanced/Mid0129.cs b/src/OpenProtocolInterpreter/Job/Advanced/Mid0129.cs index 833064f4..eb0973e1 100644 --- a/src/OpenProtocolInterpreter/Job/Advanced/Mid0129.cs +++ b/src/OpenProtocolInterpreter/Job/Advanced/Mid0129.cs @@ -1,11 +1,12 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.Job.Advanced { /// /// Job batch increment /// - /// Decrement the Job batch if there is a current running Job. + /// Decrement the Job batch if there is a current running Job. /// Two revisions are available for this MID. /// The default revision or revision 1 does not contain any argument and always decrement the last /// tightening completed in a Job. @@ -21,16 +22,11 @@ public class Mid0129 : Mid, IAdvancedJob, IIntegrator, IAcceptableCommand, IDecl public IEnumerable DocumentedPossibleErrors => new Error[] { Error.JobBatchDecrementFailed }; - public int ChannelId - { - get => GetField(2, DataFields.ChannelId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.ChannelId).SetValue(OpenProtocolConvert.ToString, value); - } - public int ParameterSetId - { - get => GetField(2, DataFields.ParameterSetId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.ParameterSetId).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 2, field: 1, Index = 20, Size = 2)] + public int ChannelId { get; set; } + + [Int32DataFieldDefinition(revision: 2, field: 2, Index = 24, Size = 3)] + public int ParameterSetId { get; set; } public Mid0129() : this(DEFAULT_REVISION) { @@ -47,27 +43,7 @@ public Mid0129(int revision) : this(new Header() Revision = revision }) { - - } - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 2, new List() - { - DataField.Number(DataFields.ChannelId, 20, 2), - DataField.Number(DataFields.ParameterSetId, 24, 3) - } - } - }; - } - - protected enum DataFields - { - ChannelId, - ParameterSetId } } } diff --git a/src/OpenProtocolInterpreter/Job/Advanced/Mid0130.cs b/src/OpenProtocolInterpreter/Job/Advanced/Mid0130.cs index 17d80b40..e4c5223d 100644 --- a/src/OpenProtocolInterpreter/Job/Advanced/Mid0130.cs +++ b/src/OpenProtocolInterpreter/Job/Advanced/Mid0130.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.Job.Advanced { @@ -14,13 +15,10 @@ public class Mid0130 : Mid, IAdvancedJob, IIntegrator, IAcceptableCommand /// /// False => Set Job Off - /// True => Reset Job Off + /// True => Reset Job Off /// - public bool JobOffStatus - { - get => GetField(1, DataFields.JobOffStatus).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(1, DataFields.JobOffStatus).SetValue(OpenProtocolConvert.ToString, value); - } + [BooleanDataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 1, HasPrefix = false)] + public bool JobOffStatus { get; set; } public Mid0130() : this(new Header() { @@ -34,23 +32,5 @@ public Mid0130() : this(new Header() public Mid0130(Header header) : base(header) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Boolean(DataFields.JobOffStatus, 20, false), - } - } - }; - } - - protected enum DataFields - { - JobOffStatus - } } -} \ No newline at end of file +} diff --git a/src/OpenProtocolInterpreter/Job/Advanced/Mid0140.cs b/src/OpenProtocolInterpreter/Job/Advanced/Mid0140.cs index 54fd75e3..5322ca14 100644 --- a/src/OpenProtocolInterpreter/Job/Advanced/Mid0140.cs +++ b/src/OpenProtocolInterpreter/Job/Advanced/Mid0140.cs @@ -1,5 +1,7 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; +using System.Text; namespace OpenProtocolInterpreter.Job.Advanced { @@ -20,103 +22,135 @@ public class Mid0140 : Mid, IAdvancedJob, IIntegrator, IAcceptableCommand { public const int MID = 140; - public int JobId - { - get => GetField(Header.StandardizedRevision, DataFields.JobId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(Header.StandardizedRevision, DataFields.JobId).SetValue(OpenProtocolConvert.ToString, value); - } - public string JobName - { - get => GetField(Header.StandardizedRevision, DataFields.JobName).Value; - set => GetField(Header.StandardizedRevision, DataFields.JobName).SetValue(value); - } - public int NumberOfParameterSets - { - get => GetField(Header.StandardizedRevision, DataFields.NumberOfParameterSets).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(Header.StandardizedRevision, DataFields.NumberOfParameterSets).SetValue(OpenProtocolConvert.ToString, value); - } - public List JobList { get; set; } - public ForcedOrder ForcedOrder - { - get => (ForcedOrder)GetField(Header.StandardizedRevision, DataFields.ForcedOrder).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(Header.StandardizedRevision, DataFields.ForcedOrder).SetValue(OpenProtocolConvert.ToString, value); - } - public bool LockAtJobDone - { - get => GetField(Header.StandardizedRevision, DataFields.LockAtJobDone).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(Header.StandardizedRevision, DataFields.LockAtJobDone).SetValue(OpenProtocolConvert.ToString, value); - } - public ToolLoosening ToolLoosening - { - get => (ToolLoosening)GetField(Header.StandardizedRevision, DataFields.ToolLoosening).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(Header.StandardizedRevision, DataFields.ToolLoosening).SetValue(OpenProtocolConvert.ToString, value); - } - public bool RepeatJob - { - get => GetField(Header.StandardizedRevision, DataFields.RepeatJob).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(Header.StandardizedRevision, DataFields.RepeatJob).SetValue(OpenProtocolConvert.ToString, value); - } - public BatchMode BatchMode - { - get => (BatchMode)GetField(Header.StandardizedRevision, DataFields.JobBatchDone).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(Header.StandardizedRevision, DataFields.JobBatchDone).SetValue(OpenProtocolConvert.ToString, value); - } - public bool BatchStatusAtIncrement - { - get => GetField(Header.StandardizedRevision, DataFields.BatchStatusAtIncrement).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(Header.StandardizedRevision, DataFields.BatchStatusAtIncrement).SetValue(OpenProtocolConvert.ToString, value); - } - public bool DecrementBatchAtOkLoosening - { - get => GetField(Header.StandardizedRevision, DataFields.DecrementBatchAtOkLoosening).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(Header.StandardizedRevision, DataFields.DecrementBatchAtOkLoosening).SetValue(OpenProtocolConvert.ToString, value); - } - public int MaxTimeForFirstTightening - { - get => GetField(Header.StandardizedRevision, DataFields.MaxTimeForFirstTightening).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(Header.StandardizedRevision, DataFields.MaxTimeForFirstTightening).SetValue(OpenProtocolConvert.ToString, value); - } - public int MaxTimeToCompleteJob - { - get => GetField(Header.StandardizedRevision, DataFields.MaxTimeToCompleteJob).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(Header.StandardizedRevision, DataFields.MaxTimeToCompleteJob).SetValue(OpenProtocolConvert.ToString, value); - } - public int DisplayResultAtAutoSelect - { - get => GetField(Header.StandardizedRevision, DataFields.DisplayResultAtAutoSelect).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(Header.StandardizedRevision, DataFields.DisplayResultAtAutoSelect).SetValue(OpenProtocolConvert.ToString, value); - } - public bool UsingLineControl - { - get => GetField(Header.StandardizedRevision, DataFields.UseLineControl).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(Header.StandardizedRevision, DataFields.UseLineControl).SetValue(OpenProtocolConvert.ToString, value); - } - public IdentifierPart IdentifierResultPart - { - get => (IdentifierPart)GetField(Header.StandardizedRevision, DataFields.IdentifierResultPart).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(Header.StandardizedRevision, DataFields.IdentifierResultPart).SetValue(OpenProtocolConvert.ToString, value); - } - public bool ResultOfNonTightenings - { - get => GetField(Header.StandardizedRevision, DataFields.ResultOfNonTightenings).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(Header.StandardizedRevision, DataFields.ResultOfNonTightenings).SetValue(OpenProtocolConvert.ToString, value); - } - public bool ResetAllIdentifiersAtJobDone - { - get => GetField(Header.StandardizedRevision, DataFields.ResetAllIdentifiersAtJobDone).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(Header.StandardizedRevision, DataFields.ResetAllIdentifiersAtJobDone).SetValue(OpenProtocolConvert.ToString, value); - } - public Reserved Reserved - { - get => (Reserved)GetField(Header.StandardizedRevision, DataFields.Reserved).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(Header.StandardizedRevision, DataFields.Reserved).SetValue(OpenProtocolConvert.ToString, value); - } - - public int JobSequenceNumber - { - get => GetField(Header.StandardizedRevision, DataFields.JobSequenceNumber).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(Header.StandardizedRevision, DataFields.JobSequenceNumber).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 4)] + [Int32DataFieldDefinition(revision: 2, field: 1, Index = 20, Size = 4)] + [Int32DataFieldDefinition(revision: 3, field: 1, Index = 20, Size = 4)] + [Int32DataFieldDefinition(revision: 4, field: 1, Index = 20, Size = 4)] + [Int32DataFieldDefinition(revision: 999, field: 1, Index = 20, Size = 4)] + public int JobId { get; set; } + + [StringDataFieldDefinition(revision: 1, field: 2, Index = 26, Size = 25)] + [StringDataFieldDefinition(revision: 2, field: 2, Index = 26, Size = 25)] + [StringDataFieldDefinition(revision: 3, field: 2, Index = 26, Size = 25)] + [StringDataFieldDefinition(revision: 4, field: 2, Index = 26, Size = 25)] + [StringDataFieldDefinition(revision: 999, field: 2, Index = 26, Size = 25)] + public string JobName { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 3, Index = 53, Size = 2)] + [Int32DataFieldDefinition(revision: 2, field: 3, Index = 53, Size = 2)] + [Int32DataFieldDefinition(revision: 3, field: 3, Index = 53, Size = 2)] + [Int32DataFieldDefinition(revision: 4, field: 3, Index = 53, Size = 2)] + [Int32DataFieldDefinition(revision: 999, field: 3, Index = 53, Size = 2)] + public int NumberOfParameterSets { get; set; } + + [AdvancedJobCollectionDefinition(revision: 1, field: 4, Index = 57, Size = 0)] + [AdvancedJobCollectionDefinition(revision: 2, field: 4, Index = 57, Size = 0)] + [AdvancedJobCollectionDefinition(revision: 3, field: 4, Index = 57, Size = 0)] + [AdvancedJobCollectionDefinition(revision: 4, field: 4, Index = 57, Size = 0)] + [AdvancedJobCollectionDefinition(revision: 999, field: 4, Index = 57, Size = 0)] + public List JobList { get; set; } = new List(); + + [Int32DataFieldDefinition(revision: 1, field: 5, Index = 0, Size = 1)] + [Int32DataFieldDefinition(revision: 2, field: 5, Index = 0, Size = 1)] + [Int32DataFieldDefinition(revision: 3, field: 5, Index = 0, Size = 1)] + [Int32DataFieldDefinition(revision: 4, field: 5, Index = 0, Size = 1)] + [Int32DataFieldDefinition(revision: 999, field: 5, Index = 0, Size = 1)] + public ForcedOrder ForcedOrder { get; set; } + + [BooleanDataFieldDefinition(revision: 1, field: 6, Index = 0)] + [BooleanDataFieldDefinition(revision: 2, field: 6, Index = 0)] + [BooleanDataFieldDefinition(revision: 3, field: 6, Index = 0)] + [BooleanDataFieldDefinition(revision: 4, field: 6, Index = 0)] + [BooleanDataFieldDefinition(revision: 999, field: 6, Index = 0)] + public bool LockAtJobDone { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 7, Index = 0, Size = 1)] + [Int32DataFieldDefinition(revision: 2, field: 7, Index = 0, Size = 1)] + [Int32DataFieldDefinition(revision: 999, field: 7, Index = 0, Size = 1)] + public ToolLoosening ToolLoosening { get; set; } + + [BooleanDataFieldDefinition(revision: 1, field: 8, Index = 0)] + [BooleanDataFieldDefinition(revision: 2, field: 8, Index = 0)] + [BooleanDataFieldDefinition(revision: 3, field: 7, Index = 0)] + [BooleanDataFieldDefinition(revision: 4, field: 7, Index = 0)] + [BooleanDataFieldDefinition(revision: 999, field: 8, Index = 0)] + public bool RepeatJob { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 9, Index = 0, Size = 1)] + [Int32DataFieldDefinition(revision: 2, field: 9, Index = 0, Size = 1)] + [Int32DataFieldDefinition(revision: 999, field: 9, Index = 0, Size = 1)] + public BatchMode BatchMode { get; set; } + + [BooleanDataFieldDefinition(revision: 1, field: 10, Index = 0)] + [BooleanDataFieldDefinition(revision: 2, field: 10, Index = 0)] + [BooleanDataFieldDefinition(revision: 999, field: 10, Index = 0)] + public bool BatchStatusAtIncrement { get; set; } + + [BooleanDataFieldDefinition(revision: 1, field: 11, Index = 0)] + [BooleanDataFieldDefinition(revision: 2, field: 11, Index = 0)] + [BooleanDataFieldDefinition(revision: 999, field: 11, Index = 0)] + public bool DecrementBatchAtOkLoosening { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 12, Index = 0, Size = 4)] + [Int32DataFieldDefinition(revision: 2, field: 12, Index = 0, Size = 4)] + [Int32DataFieldDefinition(revision: 3, field: 8, Index = 0, Size = 4)] + [Int32DataFieldDefinition(revision: 4, field: 8, Index = 0, Size = 4)] + [Int32DataFieldDefinition(revision: 999, field: 12, Index = 0, Size = 4)] + public int MaxTimeForFirstTightening { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 13, Index = 0, Size = 5)] + [Int32DataFieldDefinition(revision: 2, field: 13, Index = 0, Size = 5)] + [Int32DataFieldDefinition(revision: 3, field: 9, Index = 0, Size = 5)] + [Int32DataFieldDefinition(revision: 4, field: 9, Index = 0, Size = 5)] + [Int32DataFieldDefinition(revision: 999, field: 13, Index = 0, Size = 5)] + public int MaxTimeToCompleteJob { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 14, Index = 0, Size = 4)] + [Int32DataFieldDefinition(revision: 2, field: 14, Index = 0, Size = 4)] + [Int32DataFieldDefinition(revision: 3, field: 10, Index = 0, Size = 4)] + [Int32DataFieldDefinition(revision: 4, field: 10, Index = 0, Size = 4)] + [Int32DataFieldDefinition(revision: 999, field: 14, Index = 0, Size = 4)] + public int DisplayResultAtAutoSelect { get; set; } + + [BooleanDataFieldDefinition(revision: 1, field: 15, Index = 0)] + [BooleanDataFieldDefinition(revision: 2, field: 15, Index = 0)] + [BooleanDataFieldDefinition(revision: 3, field: 11, Index = 0)] + [BooleanDataFieldDefinition(revision: 4, field: 11, Index = 0)] + [BooleanDataFieldDefinition(revision: 999, field: 15, Index = 0)] + public bool UsingLineControl { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 16, Index = 0, Size = 1)] + [Int32DataFieldDefinition(revision: 2, field: 16, Index = 0, Size = 1)] + [Int32DataFieldDefinition(revision: 3, field: 12, Index = 0, Size = 1)] + [Int32DataFieldDefinition(revision: 4, field: 12, Index = 0, Size = 1)] + [Int32DataFieldDefinition(revision: 999, field: 16, Index = 0, Size = 1)] + public IdentifierPart IdentifierResultPart { get; set; } + + [BooleanDataFieldDefinition(revision: 1, field: 17, Index = 0)] + [BooleanDataFieldDefinition(revision: 2, field: 17, Index = 0)] + [BooleanDataFieldDefinition(revision: 3, field: 13, Index = 0)] + [BooleanDataFieldDefinition(revision: 4, field: 13, Index = 0)] + [BooleanDataFieldDefinition(revision: 999, field: 17, Index = 0)] + public bool ResultOfNonTightenings { get; set; } + + [BooleanDataFieldDefinition(revision: 1, field: 18, Index = 0)] + [BooleanDataFieldDefinition(revision: 2, field: 18, Index = 0)] + [BooleanDataFieldDefinition(revision: 3, field: 14, Index = 0)] + [BooleanDataFieldDefinition(revision: 4, field: 14, Index = 0)] + [BooleanDataFieldDefinition(revision: 999, field: 18, Index = 0)] + public bool ResetAllIdentifiersAtJobDone { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 19, Index = 0, Size = 1)] + [Int32DataFieldDefinition(revision: 2, field: 19, Index = 0, Size = 1)] + [Int32DataFieldDefinition(revision: 3, field: 15, Index = 0, Size = 1)] + [Int32DataFieldDefinition(revision: 4, field: 15, Index = 0, Size = 1)] + [Int32DataFieldDefinition(revision: 999, field: 19, Index = 0, Size = 1)] + public Reserved Reserved { get; set; } + + [Int32DataFieldDefinition(revision: 2, field: 20, Index = 0, Size = 5)] + [Int32DataFieldDefinition(revision: 3, field: 16, Index = 0, Size = 5)] + [Int32DataFieldDefinition(revision: 4, field: 16, Index = 0, Size = 5)] + public int JobSequenceNumber { get; set; } public Mid0140() : this(DEFAULT_REVISION) { @@ -136,198 +170,61 @@ public Mid0140(int revision) : this(new Header() { } + protected override string BuildHeader() { - var revision = Header.StandardizedRevision; - Header.Length = 20 + RevisionsByFields[revision].Sum(x=> x.Size + (x.HasPrefix ? 2 : 0)); + Header.Length = Header.DefaultSize; + if (RevisionsByFields.Any()) + { + var fields = DataFieldsByRevision(); + Header.Length += fields.Sum(x => x.TotalSize); + } + return Header.ToString(); } public override string Pack() { - var revision = Header.StandardizedRevision; - ResetDataFields(revision); - var jobListField = GetField(revision, DataFields.JobList); - jobListField.Size = JobList.Count * AdvancedJob.GetDefaultSize(revision); - AdjustDataFieldsIndexes(jobListField.Index + jobListField.Size + 2, revision); - jobListField.Value = PackJobList(revision); - int prefixIndex = 1; - return string.Concat(BuildHeader(), base.Pack(revision, ref prefixIndex)); - } + var builder = new StringBuilder(); + NumberOfParameterSets = JobList?.Count ?? 0; //Enforce list size even if modified + GetField(revision: Header.StandardizedRevision, field: 4).Size = NumberOfParameterSets * AdvancedJob.GetDefaultSize(Header.StandardizedRevision); + var fields = DataFieldsByRevision().OrderBy(f => f.Index).ToList(); + builder.Append(BuildHeader()); + builder.Append(Pack(fields)); - public override Mid Parse(string package) - { - Header = ProcessHeader(package); - int length = Header.Length; - var revision = Header.StandardizedRevision; - ResetDataFields(revision); - var numberOfParameterSetsField = RevisionsByFields[revision].First(x => x.Field == (int)DataFields.NumberOfParameterSets); - var numberOfParameterSets = int.Parse(package.Substring(numberOfParameterSetsField.Index + 2, numberOfParameterSetsField.Size)); - var jobListField = GetField(revision, DataFields.JobList); - jobListField.Size = numberOfParameterSets * AdvancedJob.GetDefaultSize(revision); - AdjustDataFieldsIndexes(jobListField.Index + jobListField.Size + 2, revision); - base.ProcessDataFields(revision, package); - JobList = AdvancedJob.ParseAll(jobListField.Value, revision).ToList(); - return this; + return builder.ToString(); } - protected virtual string PackJobList(int revision) + protected override void ProcessDataFields(ReadOnlySpan package) { - var advancedJobsList = new List(); - - foreach (var job in JobList) + foreach (var field in DataFieldsByRevision()) { - advancedJobsList.Add(job.Pack(revision)); + ProcessDataField(field, package); } - - return string.Join(";", advancedJobsList) + ";"; } - private void AdjustDataFieldsIndexes(int currentIndex, int revision) + protected override void ProcessDataField(DataField dataField, ReadOnlySpan package) { - foreach (var field in RevisionsByFields[revision]) + if (dataField.Field == 4) //JobList { - if (field.Field > (int)DataFields.JobList) - { - field.Index = currentIndex; - currentIndex += 2 + field.Size; - } + dataField.Size = NumberOfParameterSets * AdvancedJob.GetDefaultSize(Header.StandardizedRevision); } - - } - - private void ResetDataFields(int revision) - { - //TODO: think of a better approach in case user repeats packing or parsing - var fields = RevisionsByFields[revision].Where(x => x.Field > (int)DataFields.JobList); - foreach (var field in fields) - field.Index = 0; + base.ProcessDataField(dataField, package); } - protected override Dictionary> RegisterDatafields() + private IEnumerable DataFieldsByRevision() { - //All the workarounds are made due to inconsistent "additions" from protocol, since there are many fields moved - //to JobList/Parameter list, the DataFields start to shuffle every revision - return new Dictionary>() + var previousField = default(DataField); + foreach (var dataField in RevisionsByFields[Header.StandardizedRevision].OrderBy(x => x.Field)) + { + if (previousField != null && dataField.Index == 0) { - { - 1, new List() - { - DataField.Number(DataFields.JobId, 20, 4), - DataField.String(DataFields.JobName, 26, 25), - DataField.Number(DataFields.NumberOfParameterSets, 53, 2), - DataField.Volatile(DataFields.JobList, 57), - DataField.Number(DataFields.ForcedOrder, 0, 1), - DataField.Boolean(DataFields.LockAtJobDone, 0), - DataField.Number(DataFields.ToolLoosening, 0, 1), - DataField.Boolean(DataFields.RepeatJob, 0), - DataField.Number(DataFields.JobBatchDone, 0, 1), - DataField.Boolean(DataFields.BatchStatusAtIncrement, 0), - DataField.Boolean(DataFields.DecrementBatchAtOkLoosening, 0), - DataField.Number(DataFields.MaxTimeForFirstTightening, 0, 4), - DataField.Number(DataFields.MaxTimeToCompleteJob, 0, 5), - DataField.Number(DataFields.DisplayResultAtAutoSelect, 0, 4), - DataField.Boolean(DataFields.UseLineControl, 0), - DataField.Number(DataFields.IdentifierResultPart, 0, 1), - DataField.Boolean(DataFields.ResultOfNonTightenings, 0), - DataField.Boolean(DataFields.ResetAllIdentifiersAtJobDone, 0), - DataField.Number(DataFields.Reserved, 0, 1) - } - }, - { - 2, new List() - { - DataField.Number(DataFields.JobId, 20, 4), - DataField.String(DataFields.JobName, 26, 25), - DataField.Number(DataFields.NumberOfParameterSets, 53, 2), - DataField.Volatile(DataFields.JobList, 57), - DataField.Number(DataFields.ForcedOrder, 0, 1), - DataField.Boolean(DataFields.LockAtJobDone, 0), - DataField.Number(DataFields.ToolLoosening, 0, 1), - DataField.Boolean(DataFields.RepeatJob, 0), - DataField.Number(DataFields.JobBatchDone, 0, 1), - DataField.Boolean(DataFields.BatchStatusAtIncrement, 0), - DataField.Boolean(DataFields.DecrementBatchAtOkLoosening, 0), - DataField.Number(DataFields.MaxTimeForFirstTightening, 0, 4), - DataField.Number(DataFields.MaxTimeToCompleteJob, 0, 5), - DataField.Number(DataFields.DisplayResultAtAutoSelect, 0, 4), - DataField.Boolean(DataFields.UseLineControl, 0), - DataField.Number(DataFields.IdentifierResultPart, 0, 1), - DataField.Boolean(DataFields.ResultOfNonTightenings, 0), - DataField.Boolean(DataFields.ResetAllIdentifiersAtJobDone, 0), - DataField.Number(DataFields.Reserved, 0, 1), - DataField.Number(DataFields.JobSequenceNumber, 0, 5), - } - }, - { - 3, new List() - { - DataField.Number(DataFields.JobId, 20, 4), - DataField.String(DataFields.JobName, 26, 25), - DataField.Number(DataFields.NumberOfParameterSets, 53, 2), - DataField.Volatile(DataFields.JobList, 57), - DataField.Number(DataFields.ForcedOrder, 0, 1), - DataField.Boolean(DataFields.LockAtJobDone, 0), - DataField.Boolean(DataFields.RepeatJob, 0), - DataField.Number(DataFields.MaxTimeForFirstTightening, 0, 4), - DataField.Number(DataFields.MaxTimeToCompleteJob, 0, 5), - DataField.Number(DataFields.DisplayResultAtAutoSelect, 0, 4), - DataField.Boolean(DataFields.UseLineControl, 0), - DataField.Number(DataFields.IdentifierResultPart, 0, 1), - DataField.Boolean(DataFields.ResultOfNonTightenings, 0), - DataField.Boolean(DataFields.ResetAllIdentifiersAtJobDone, 0), - DataField.Number(DataFields.Reserved, 0, 1), - DataField.Number(DataFields.JobSequenceNumber, 0, 5) - } - }, - { - 4, new List() - { - DataField.Number(DataFields.JobId, 20, 4), - DataField.String(DataFields.JobName, 26, 25), - DataField.Number(DataFields.NumberOfParameterSets, 53, 2), - DataField.Volatile(DataFields.JobList, 57), - DataField.Number(DataFields.ForcedOrder, 0, 1), - DataField.Boolean(DataFields.LockAtJobDone, 0), - DataField.Boolean(DataFields.RepeatJob, 0), - DataField.Number(DataFields.MaxTimeForFirstTightening, 0, 4), - DataField.Number(DataFields.MaxTimeToCompleteJob, 0, 5), - DataField.Number(DataFields.DisplayResultAtAutoSelect, 0, 4), - DataField.Boolean(DataFields.UseLineControl, 0), - DataField.Number(DataFields.IdentifierResultPart, 0, 1), - DataField.Boolean(DataFields.ResultOfNonTightenings, 0), - DataField.Boolean(DataFields.ResetAllIdentifiersAtJobDone, 0), - DataField.Number(DataFields.Reserved, 0, 1), - DataField.Number(DataFields.JobSequenceNumber, 0, 5) - } - } - }; - } + dataField.Index = previousField.Index + previousField.TotalSize; + } - protected enum DataFields - { - JobId, - JobName, - NumberOfParameterSets, - JobList, - ForcedOrder, - LockAtJobDone, - ToolLoosening, - RepeatJob, - JobBatchDone, - BatchStatusAtIncrement, - DecrementBatchAtOkLoosening, - MaxTimeForFirstTightening, - MaxTimeToCompleteJob, - DisplayResultAtAutoSelect, - UseLineControl, - IdentifierResultPart, - ResultOfNonTightenings, - ResetAllIdentifiersAtJobDone, - Reserved, - - //Rev 2 - JobSequenceNumber + previousField = dataField; + yield return dataField; + } } } } diff --git a/src/OpenProtocolInterpreter/Job/JobMessages.cs b/src/OpenProtocolInterpreter/Job/JobMessages.cs index 1c7f1e10..e3012e82 100644 --- a/src/OpenProtocolInterpreter/Job/JobMessages.cs +++ b/src/OpenProtocolInterpreter/Job/JobMessages.cs @@ -11,18 +11,18 @@ internal class JobMessages : MessagesTemplate { public JobMessages() : base() { - _templates = new Dictionary() + _templates = new Dictionary>() { - { Mid0030.MID, new MidCompiledInstance(typeof(Mid0030)) }, - { Mid0031.MID, new MidCompiledInstance(typeof(Mid0031)) }, - { Mid0032.MID, new MidCompiledInstance(typeof(Mid0032)) }, - { Mid0033.MID, new MidCompiledInstance(typeof(Mid0033)) }, - { Mid0034.MID, new MidCompiledInstance(typeof(Mid0034)) }, - { Mid0035.MID, new MidCompiledInstance(typeof(Mid0035)) }, - { Mid0036.MID, new MidCompiledInstance(typeof(Mid0036)) }, - { Mid0037.MID, new MidCompiledInstance(typeof(Mid0037)) }, - { Mid0038.MID, new MidCompiledInstance(typeof(Mid0038)) }, - { Mid0039.MID, new MidCompiledInstance(typeof(Mid0039)) } + { Mid0030.MID, new CompiledInstance(typeof(Mid0030)) }, + { Mid0031.MID, new CompiledInstance(typeof(Mid0031)) }, + { Mid0032.MID, new CompiledInstance(typeof(Mid0032)) }, + { Mid0033.MID, new CompiledInstance(typeof(Mid0033)) }, + { Mid0034.MID, new CompiledInstance(typeof(Mid0034)) }, + { Mid0035.MID, new CompiledInstance(typeof(Mid0035)) }, + { Mid0036.MID, new CompiledInstance(typeof(Mid0036)) }, + { Mid0037.MID, new CompiledInstance(typeof(Mid0037)) }, + { Mid0038.MID, new CompiledInstance(typeof(Mid0038)) }, + { Mid0039.MID, new CompiledInstance(typeof(Mid0039)) } }; } diff --git a/src/OpenProtocolInterpreter/Job/Mid0031.cs b/src/OpenProtocolInterpreter/Job/Mid0031.cs index a4509c47..ccaed4f4 100644 --- a/src/OpenProtocolInterpreter/Job/Mid0031.cs +++ b/src/OpenProtocolInterpreter/Job/Mid0031.cs @@ -1,4 +1,6 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.Linq; using System.Text; namespace OpenProtocolInterpreter.Job @@ -6,25 +8,23 @@ namespace OpenProtocolInterpreter.Job /// /// Job ID upload reply /// - /// The transmission of all the valid Job IDs of the controller. + /// The transmission of all the valid Job IDs of the controller. /// The data field contains the number of valid Jobs currently present in the controller, and the ID of each Job. - /// + /// /// Message sent by: Controller /// Answer: None /// public class Mid0031 : Mid, IJob, IController { - private int JobSize => Header.Revision > 1 ? 4 : 2; - public const int MID = 31; - public int TotalJobs - { - get => GetField(1, DataFields.NumberOfJobs).GetValue(OpenProtocolConvert.ToInt32); - private set => GetField(1, DataFields.NumberOfJobs).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 2, HasPrefix = false)] + [Int32DataFieldDefinition(revision: 2, field: 1, Index = 20, Size = 4, HasPrefix = false)] + public int TotalJobs { get; set; } - public List JobIds { get; set; } + [Int32CollectionDefinition(revision: 1, field: 2, Index = 22, Size = 2, EachFieldSize = 2, HasPrefix = false)] + [Int32CollectionDefinition(revision: 2, field: 2, Index = 24, Size = 4, EachFieldSize = 4, HasPrefix = false)] + public List JobIds { get; set; } = new List(); public Mid0031() : this(DEFAULT_REVISION) { @@ -34,7 +34,6 @@ public Mid0031() : this(DEFAULT_REVISION) public Mid0031(Header header) : base(header) { JobIds ??= []; - HandleRevisions(); } public Mid0031(int revision) : this(new Header() @@ -43,88 +42,43 @@ public Mid0031(int revision) : this(new Header() Revision = revision }) { - + } - public override string Pack() + protected override string BuildHeader() { - TotalJobs = JobIds.Count; - - var eachJobField = GetField(1, DataFields.EachJobId); - eachJobField.Size = JobSize * TotalJobs; - eachJobField.Value = PackJobIdList(); - return base.Pack(); + var fields = RevisionsByFields[Header.StandardizedRevision]; + Header.Length = Header.DefaultSize + fields.Sum(dataField => dataField.TotalSize); + return Header.ToString(); } - public override Mid Parse(string package) + public override Mid Parse(ReadOnlySpan package) { Header = ProcessHeader(package); - HandleRevisions(); - - var eachJobField = GetField(1, DataFields.EachJobId); - eachJobField.Size = Header.Length - eachJobField.Index; - base.Parse(package); - JobIds = ParseJobIdList(eachJobField.Value); + var fields = RevisionsByFields[Header.StandardizedRevision]; + ProcessDataFields(fields, package); return this; } - - protected virtual string PackJobIdList() + protected override void ProcessDataField(DataField dataField, ReadOnlySpan package) { - var builder = new StringBuilder(); - foreach (var jobId in JobIds) - builder.Append(OpenProtocolConvert.ToString('0', JobSize, PaddingOrientation.LeftPadded, jobId)); - - return builder.ToString(); - } - - protected virtual List ParseJobIdList(string section) - { - var list = new List(); - if (string.IsNullOrWhiteSpace(section)) + if (dataField.Field == 2) //JobIds { - return list; + var jobSize = Header.StandardizedRevision == 1 ? 2 : 4; + dataField.Size = TotalJobs * jobSize; } - - for (int i = 0; i < section.Length; i += JobSize) - { - list.Add(OpenProtocolConvert.ToInt32(section.Substring(i, JobSize))); - } - - return list; + base.ProcessDataField(dataField, package); } - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.NumberOfJobs, 20, 2, false), - DataField.Number(DataFields.EachJobId, 22, 2, false) - } - }, - }; - } - - private void HandleRevisions() + public override string Pack() { - if (Header.Revision > 1) - { - GetField(1, DataFields.NumberOfJobs).Size = 4; - GetField(1, DataFields.EachJobId).Index = 24; - } - else - { - GetField(1, DataFields.NumberOfJobs).Size = GetField(1, DataFields.EachJobId).Size = 2; - } - } + var jobSize = Header.StandardizedRevision == 1 ? 2 : 4; + GetField(nameof(JobIds)).Size = JobIds.Count * jobSize; + var fields = RevisionsByFields[Header.StandardizedRevision]; + var builder = new StringBuilder(BuildHeader()); - protected enum DataFields - { - NumberOfJobs, - EachJobId + builder.Append(Pack(fields)); + return builder.ToString(); } } } diff --git a/src/OpenProtocolInterpreter/Job/Mid0032.cs b/src/OpenProtocolInterpreter/Job/Mid0032.cs index 43831d93..1ad2c524 100644 --- a/src/OpenProtocolInterpreter/Job/Mid0032.cs +++ b/src/OpenProtocolInterpreter/Job/Mid0032.cs @@ -1,4 +1,6 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.Text; namespace OpenProtocolInterpreter.Job { @@ -14,11 +16,9 @@ public class Mid0032 : Mid, IJob, IIntegrator, IAnswerableBy, IDeclinab public IEnumerable DocumentedPossibleErrors => new Error[] { Error.JobIdNotPresent }; - public int JobId - { - get => GetField(1, DataFields.JobId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.JobId).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 2, HasPrefix = false)] + [Int32DataFieldDefinition(revision: 2, field: 1, Index = 20, Size = 4, HasPrefix = false)] + public int JobId { get; set; } public Mid0032() : this(DEFAULT_REVISION) { @@ -27,7 +27,7 @@ public Mid0032() : this(DEFAULT_REVISION) public Mid0032(Header header) : base(header) { - HandleRevision(); + } public Mid0032(int revision) : this(new Header() @@ -38,39 +38,44 @@ public Mid0032(int revision) : this(new Header() { } - public override Mid Parse(string package) + protected override string BuildHeader() { - Header = ProcessHeader(package); - HandleRevision(); - ProcessDataFields(package); - return this; - } - - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() + Header.Length = Header.DefaultSize; + var fromRevision = Header.StandardizedRevision > 1 ? 2 : 1; + for (int i = fromRevision; i <= Header.StandardizedRevision; i++) { + if (RevisionsByFields.TryGetValue(i, out var dataFields)) { - 1, new List() - { - DataField.Number(DataFields.JobId, 20, 2, false), - } + foreach (var dataField in dataFields) + Header.Length += dataField.TotalSize; } - }; + } + + return Header.ToString(); } - private void HandleRevision() + public override string Pack() { - if (Header.Revision == 1) - GetField(1, DataFields.JobId).Size = 2; - else - GetField(1, DataFields.JobId).Size = 4; + var builder = new StringBuilder(BuildHeader()); + + var fromRevision = Header.StandardizedRevision > 1 ? 2 : 1; + for (int i = fromRevision; i <= Header.StandardizedRevision; i++) + { + builder.Append(Pack(i)); + } + return builder.ToString(); } - protected enum DataFields + public override Mid Parse(ReadOnlySpan package) { - JobId + Header = ProcessHeader(package); + var fromRevision = Header.StandardizedRevision > 1 ? 2 : 1; + for (int i = fromRevision; i <= Header.StandardizedRevision; i++) + { + if (RevisionsByFields.TryGetValue(i, out var fields)) + ProcessDataFields(fields, package); + } + return this; } } -} \ No newline at end of file +} diff --git a/src/OpenProtocolInterpreter/Job/Mid0033.cs b/src/OpenProtocolInterpreter/Job/Mid0033.cs index dacce8e0..65aa47a6 100644 --- a/src/OpenProtocolInterpreter/Job/Mid0033.cs +++ b/src/OpenProtocolInterpreter/Job/Mid0033.cs @@ -1,5 +1,7 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; +using System.Text; namespace OpenProtocolInterpreter.Job { @@ -13,67 +15,60 @@ public class Mid0033 : Mid, IJob, IController { public const int MID = 33; - public int JobId - { - get => GetField(1, DataFields.JobId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.JobId).SetValue(OpenProtocolConvert.ToString, value); - } - public string JobName - { - get => GetField(1, DataFields.JobName).Value; - set => GetField(1, DataFields.JobName).SetValue(value); - } - public ForcedOrder ForcedOrder - { - get => (ForcedOrder)GetField(1, DataFields.ForcedOrder).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.ForcedOrder).SetValue(OpenProtocolConvert.ToString, value); - } - public int MaxTimeForFirstTightening - { - get => GetField(1, DataFields.MaxTimeForFirstTightening).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.MaxTimeForFirstTightening).SetValue(OpenProtocolConvert.ToString, value); - } - public int MaxTimeToCompleteJob - { - get => GetField(1, DataFields.MaxTimeToCompleteJob).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.MaxTimeToCompleteJob).SetValue(OpenProtocolConvert.ToString, value); - } - public JobBatchMode JobBatchMode - { - get => (JobBatchMode)GetField(1, DataFields.JobBatchDone).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.JobBatchDone).SetValue(OpenProtocolConvert.ToString, value); - } - public bool LockAtJobDone - { - get => GetField(1, DataFields.LockAtJobDone).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(1, DataFields.LockAtJobDone).SetValue(OpenProtocolConvert.ToString, value); - } - public bool UseLineControl - { - get => GetField(1, DataFields.UseLineControl).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(1, DataFields.UseLineControl).SetValue(OpenProtocolConvert.ToString, value); - } - public bool RepeatJob - { - get => GetField(1, DataFields.RepeatJob).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(1, DataFields.RepeatJob).SetValue(OpenProtocolConvert.ToString, value); - } - public ToolLoosening ToolLoosening - { - get => (ToolLoosening)GetField(1, DataFields.ToolLoosening).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.ToolLoosening).SetValue(OpenProtocolConvert.ToString, value); - } - public Reserved Reserved - { - get => (Reserved)GetField(1, DataFields.Reserved).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.Reserved).SetValue(OpenProtocolConvert.ToString, value); - } - public int NumberOfParameterSets - { - get => GetField(1, DataFields.NumberOfParameterSets).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.NumberOfParameterSets).SetValue(OpenProtocolConvert.ToString, value); - } - public List ParameterSetList { get; set; } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 2)] + [Int32DataFieldDefinition(revision: 2, field: 1, Index = 20, Size = 4)] + public int JobId { get; set; } + + [StringDataFieldDefinition(revision: 1, field: 2, Index = 24, Size = 25)] + [StringDataFieldDefinition(revision: 2, field: 2, Index = 26, Size = 25)] + public string JobName { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 3, Index = 51, Size = 1)] + [Int32DataFieldDefinition(revision: 2, field: 3, Index = 53, Size = 1)] + public ForcedOrder ForcedOrder { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 4, Index = 54, Size = 4)] + [Int32DataFieldDefinition(revision: 2, field: 4, Index = 56, Size = 4)] + public int MaxTimeForFirstTightening { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 5, Index = 60, Size = 5)] + [Int32DataFieldDefinition(revision: 2, field: 5, Index = 62, Size = 5)] + public int MaxTimeToCompleteJob { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 6, Index = 67, Size = 1)] + [Int32DataFieldDefinition(revision: 2, field: 6, Index = 69, Size = 1)] + public JobBatchMode JobBatchMode { get; set; } + + [BooleanDataFieldDefinition(revision: 1, field: 7, Index = 70, Size = 1)] + [BooleanDataFieldDefinition(revision: 2, field: 7, Index = 72, Size = 1)] + public bool LockAtJobDone { get; set; } + + [BooleanDataFieldDefinition(revision: 1, field: 8, Index = 73)] + [BooleanDataFieldDefinition(revision: 2, field: 8, Index = 75)] + public bool UseLineControl { get; set; } + + [BooleanDataFieldDefinition(revision: 1, field: 9, Index = 76)] + [BooleanDataFieldDefinition(revision: 2, field: 9, Index = 78)] + public bool RepeatJob { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 10, Index = 79, Size = 1)] + [Int32DataFieldDefinition(revision: 2, field: 10, Index = 81, Size = 1)] + public ToolLoosening ToolLoosening { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 11, Index = 82, Size = 1)] + [Int32DataFieldDefinition(revision: 2, field: 11, Index = 84, Size = 1)] + public Reserved Reserved { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 12, Index = 85, Size = 2)] + [Int32DataFieldDefinition(revision: 2, field: 12, Index = 87, Size = 2)] + public int NumberOfParameterSets { get; set; } + + [ParameterSetCollectionDefinition(revision: 1, field: 13, Index = 89, Size = 0)] + [ParameterSetCollectionDefinition(revision: 2, field: 13, Index = 91, Size = 0)] + [ParameterSetCollectionDefinition(revision: 3, field: 13, Index = 91, Size = 0)] + [ParameterSetCollectionDefinition(revision: 4, field: 13, Index = 91, Size = 0)] + [ParameterSetCollectionDefinition(revision: 5, field: 13, Index = 91, Size = 0)] + public List ParameterSetList { get; set; } = new List(); public Mid0033() : this(DEFAULT_REVISION) { @@ -93,101 +88,70 @@ public Mid0033(int revision) : this(new Header() { } - public override string Pack() + protected override string BuildHeader() { - HandleRevisions(); - NumberOfParameterSets = ParameterSetList.Count; + Header.Length = Header.DefaultSize; + var fromRevision = Header.StandardizedRevision > 1 ? 2 : 1; + for (int i = fromRevision; i <= Header.StandardizedRevision; i++) + { + if (RevisionsByFields.TryGetValue(i, out var dataFields)) + { + foreach (var dataField in dataFields) + { + if (dataField.Field == 13) //ParameterSetList + continue; + Header.Length += dataField.TotalSize; + } + } + } - var psetListField = GetField(1, DataFields.ParameterSetList); - psetListField.Size = ParameterSetList.Count * ParameterSet.Size(Header.Revision); - psetListField.Value = PackParameterSetList(); - return base.Pack(); + Header.Length += GetField(nameof(ParameterSetList)).TotalSize; + return Header.ToString(); } - public override Mid Parse(string package) + public override string Pack() { - Header = ProcessHeader(package); - HandleRevisions(); - var jobListField = GetField(1, DataFields.ParameterSetList); - jobListField.Size = Header.Length - jobListField.Index - 2; - base.Parse(package); - ParameterSetList = ParameterSet.ParseAll(jobListField.Value, Header.Revision).ToList(); - return this; + NumberOfParameterSets = ParameterSetList?.Count ?? 0; + GetField(nameof(ParameterSetList)).Size = NumberOfParameterSets * ParameterSet.Size(Header.StandardizedRevision); + var builder = new StringBuilder(BuildHeader()); + var fields = DataFieldsByRevision().ToList(); + builder.Append(base.Pack(fields)); + return builder.ToString(); } - protected virtual string PackParameterSetList() + protected override void ProcessDataFields(IEnumerable dataFields, ReadOnlySpan package) { - var packages = new List(); - foreach (var pset in ParameterSetList) - { - packages.Add(pset.Pack(Header.Revision)); - } - - return string.Join(";", packages) + ";"; + foreach (var dataField in DataFieldsByRevision()) + ProcessDataField(dataField, package); } - protected override Dictionary> RegisterDatafields() + private IEnumerable DataFieldsByRevision() { - return new Dictionary>() + var fromRevision = Header.StandardizedRevision > 1 ? 2 : 1; + for (int i = fromRevision; i <= Header.StandardizedRevision; i++) + { + if (RevisionsByFields.TryGetValue(i, out var dataFields)) { + foreach (var dataField in dataFields) { - 1, new List() - { - DataField.Number(DataFields.JobId, 20, 2), - DataField.String(DataFields.JobName, 24, 25), - DataField.Number(DataFields.ForcedOrder, 51, 1), - DataField.Number(DataFields.MaxTimeForFirstTightening, 54, 4), - DataField.Number(DataFields.MaxTimeToCompleteJob, 60, 5), - DataField.Number(DataFields.JobBatchDone, 67, 1), - DataField.Boolean(DataFields.LockAtJobDone, 70), - DataField.Boolean(DataFields.UseLineControl, 73), - DataField.Boolean(DataFields.RepeatJob, 76), - DataField.Number(DataFields.ToolLoosening, 79, 1), - DataField.Number(DataFields.Reserved, 82, 1), - DataField.Number(DataFields.NumberOfParameterSets, 85, 2), - DataField.Volatile(DataFields.ParameterSetList, 89) // defined at runtime - } - }, - }; - } + if (dataField.Field == 13) //ParameterSetList + continue; - private void HandleRevisions() - { - var jobIdField = GetField(1, DataFields.JobId); - if (Header.Revision > 1) - { - jobIdField.Size = 4; - } - else - { - jobIdField.Size = 2; + yield return dataField; + } + } } - int index = jobIdField.Index + jobIdField.Size; - for (int i = (int)DataFields.JobName; i < RevisionsByFields[1].Count; i++) - { - var field = GetField(1, i); - field.Index = 2 + index; - index = field.Index + field.Size; - } + yield return GetField(nameof(ParameterSetList)); } - - protected enum DataFields + protected override void ProcessDataField(DataField dataField, ReadOnlySpan package) { - JobId, - JobName, - ForcedOrder, - MaxTimeForFirstTightening, - MaxTimeToCompleteJob, - JobBatchDone, - LockAtJobDone, - UseLineControl, - RepeatJob, - ToolLoosening, - Reserved, - NumberOfParameterSets, - ParameterSetList + if (dataField.Field == 13) //ParameterSetList + { + dataField.Size = NumberOfParameterSets * ParameterSet.Size(Header.StandardizedRevision); + } + base.ProcessDataField(dataField, package); } } -} \ No newline at end of file +} diff --git a/src/OpenProtocolInterpreter/Job/Mid0035.cs b/src/OpenProtocolInterpreter/Job/Mid0035.cs index 687db0eb..a6627696 100644 --- a/src/OpenProtocolInterpreter/Job/Mid0035.cs +++ b/src/OpenProtocolInterpreter/Job/Mid0035.cs @@ -1,5 +1,7 @@ -using System; +using System; using System.Collections.Generic; +using System.Linq; +using System.Text; namespace OpenProtocolInterpreter.Job { @@ -15,88 +17,63 @@ public class Mid0035 : Mid, IJob, IController, IAcknowledgeable { public const int MID = 35; - public int JobId - { - get => GetField(1, DataFields.JobId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.JobId).SetValue(OpenProtocolConvert.ToString, value); - } - public JobStatus JobStatus - { - get => (JobStatus)GetField(1, DataFields.JobStatus).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.JobStatus).SetValue(OpenProtocolConvert.ToString, value); - } - public JobBatchMode JobBatchMode - { - get => (JobBatchMode)GetField(1, DataFields.JobBatchMode).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.JobBatchMode).SetValue(OpenProtocolConvert.ToString, value); - } - public int JobBatchSize - { - get => GetField(1, DataFields.JobBatchSize).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.JobBatchSize).SetValue(OpenProtocolConvert.ToString, value); - } - public int JobBatchCounter - { - get => GetField(1, DataFields.JobBatchCounter).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.JobBatchCounter).SetValue(OpenProtocolConvert.ToString, value); - } - public DateTime TimeStamp - { - get => GetField(1, DataFields.Timestamp).GetValue(OpenProtocolConvert.ToDateTime); - set => GetField(1, DataFields.Timestamp).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 2)] + [Int32DataFieldDefinition(revision: 2, field: 1, Index = 20, Size = 4)] + public int JobId { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 2, Index = 24, Size = 1)] + [Int32DataFieldDefinition(revision: 2, field: 2, Index = 26, Size = 1)] + public JobStatus JobStatus { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 3, Index = 27, Size = 1)] + [Int32DataFieldDefinition(revision: 2, field: 3, Index = 29, Size = 1)] + public JobBatchMode JobBatchMode { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 4, Index = 30, Size = 4)] + [Int32DataFieldDefinition(revision: 2, field: 4, Index = 32, Size = 4)] + public int JobBatchSize { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 5, Index = 36, Size = 4)] + [Int32DataFieldDefinition(revision: 2, field: 5, Index = 38, Size = 4)] + public int JobBatchCounter { get; set; } + + [TimestampDataFieldDefinition(revision: 1, field: 6, Index = 42)] + [TimestampDataFieldDefinition(revision: 2, field: 6, Index = 44)] + public DateTime TimeStamp { get; set; } + //Rev 3 - public int JobCurrentStep - { - get => GetField(3, DataFields.JobCurrentStep).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(3, DataFields.JobCurrentStep).SetValue(OpenProtocolConvert.ToString, value); - } - public int JobTotalNumberOfSteps - { - get => GetField(3, DataFields.JobTotalNumberOfSteps).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(3, DataFields.JobTotalNumberOfSteps).SetValue(OpenProtocolConvert.ToString, value); - } - public int JobStepType - { - get => GetField(3, DataFields.JobStepType).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(3, DataFields.JobStepType).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 3, field: 7, Index = 65, Size = 3)] + public int JobCurrentStep { get; set; } + + [Int32DataFieldDefinition(revision: 3, field: 8, Index = 70, Size = 3)] + public int JobTotalNumberOfSteps { get; set; } + + [Int32DataFieldDefinition(revision: 3, field: 9, Index = 75, Size = 2)] + public int JobStepType { get; set; } + //Rev 4 - public JobTighteningStatus JobTighteningStatus - { - get => (JobTighteningStatus)GetField(4, DataFields.JobTighteningStatus).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(4, DataFields.JobTighteningStatus).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 4, field: 10, Index = 79, Size = 2)] + public JobTighteningStatus JobTighteningStatus { get; set; } + //Rev 5 - public int JobSequenceNumber - { - get => GetField(5, DataFields.JobSequenceNumber).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(5, DataFields.JobSequenceNumber).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 5, field: 11, Index = 83, Size = 5)] + public int JobSequenceNumber { get; set; } - public string VinNumber - { - get => GetField(5, DataFields.VinNumber).Value; - set => GetField(5, DataFields.VinNumber).SetValue(value); - } + [StringDataFieldDefinition(revision: 5, field: 12, Index = 90, Size = 25)] + public string VinNumber { get; set; } - public string IdentifierResultPart2 - { - get => GetField(5, DataFields.IdentifierResultPart2).Value; - set => GetField(5, DataFields.IdentifierResultPart2).SetValue(value); - } + [StringDataFieldDefinition(revision: 5, field: 13, Index = 117, Size = 25)] + public string IdentifierResultPart2 { get; set; } - public string IdentifierResultPart3 - { - get => GetField(5, DataFields.IdentifierResultPart3).Value; - set => GetField(5, DataFields.IdentifierResultPart3).SetValue(value); - } + [StringDataFieldDefinition(revision: 5, field: 14, Index = 144, Size = 25)] + public string IdentifierResultPart3 { get; set; } - public string IdentifierResultPart4 - { - get => GetField(5, DataFields.IdentifierResultPart4).Value; - set => GetField(5, DataFields.IdentifierResultPart4).SetValue(value); - } + [StringDataFieldDefinition(revision: 5, field: 15, Index = 171, Size = 25)] + public string IdentifierResultPart4 { get; set; } + + //Rev 6 + [StringDataFieldDefinition(revision: 6, field: 16, Index = 198, Size = 25)] + public string JointId { get; set; } public Mid0035() : this(DEFAULT_REVISION) { @@ -116,105 +93,38 @@ public Mid0035(int revision) : this(new Header() } - public override string Pack() + protected override string BuildHeader() { - HandleRevision(); - return base.Pack(); + Header.Length = Header.DefaultSize + DataFieldsByRevision().Sum(x => x.TotalSize); + return Header.ToString(); } - public override Mid Parse(string package) + public override string Pack() { - Header = ProcessHeader(package); - HandleRevision(); - ProcessDataFields(package); - return this; + var builder = new StringBuilder(); + var fields = DataFieldsByRevision().OrderBy(x => x.Index).ToList(); + builder.Append(BuildHeader()); + builder.Append(base.Pack(fields)); + return builder.ToString(); } - protected override Dictionary> RegisterDatafields() + protected override void ProcessDataFields(ReadOnlySpan package) { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.JobId, 20, 2), - DataField.Number(DataFields.JobStatus, 24, 1), - DataField.Number(DataFields.JobBatchMode, 27, 1), - DataField.Number(DataFields.JobBatchSize, 30, 4), - DataField.Number(DataFields.JobBatchCounter, 36, 4), - DataField.Timestamp(DataFields.Timestamp, 42) - } - }, - { - 3, new List() - { - DataField.Number(DataFields.JobCurrentStep, 65, 3), - DataField.Number(DataFields.JobTotalNumberOfSteps, 70, 3), - DataField.Number(DataFields.JobStepType, 75, 2) - } - }, - { - 4, new List() - { - DataField.Number(DataFields.JobTighteningStatus, 79, 2) - } - }, - { - 5, new List() - { - DataField.Number(DataFields.JobSequenceNumber, 83, 5), - DataField.String(DataFields.VinNumber, 90, 25), - DataField.String(DataFields.IdentifierResultPart2, 117, 25), - DataField.String(DataFields.IdentifierResultPart3, 144, 25), - DataField.String(DataFields.IdentifierResultPart4, 171, 25), - } - } - }; + var fields = DataFieldsByRevision().OrderBy(x => x.Index).ToList(); + base.ProcessDataFields(fields, package); } - private void HandleRevision() + private IEnumerable DataFieldsByRevision() { - var jobIdField = GetField(1, DataFields.JobId); - if (Header.Revision > 1) - { - jobIdField.Size = 4; - } - else - { - jobIdField.Size = 2; - } + var fromRevision = Header.StandardizedRevision > 1 ? 2 : 1; + var toRevision = Header.StandardizedRevision; - int index = jobIdField.Index + jobIdField.Size; - for (int i = (int)DataFields.JobStatus; i < RevisionsByFields[1].Count; i++) + for (int i = fromRevision; i <= toRevision; i++) { - var field = GetField(1, i); - field.Index = 2 + index; - index = field.Index + field.Size; + foreach (var dataField in RevisionsByFields[i]) + yield return dataField; } } - - protected enum DataFields - { - //rev 1 and 2 - JobId, - JobStatus, - JobBatchMode, - JobBatchSize, - JobBatchCounter, - Timestamp, - //rev 3 - JobCurrentStep, - JobTotalNumberOfSteps, - JobStepType, - //rev 4 - JobTighteningStatus, - //rev5 - JobSequenceNumber, - VinNumber, - IdentifierResultPart2, - IdentifierResultPart3, - IdentifierResultPart4 - } } } diff --git a/src/OpenProtocolInterpreter/Job/Mid0038.cs b/src/OpenProtocolInterpreter/Job/Mid0038.cs index 1963ffb5..952c0456 100644 --- a/src/OpenProtocolInterpreter/Job/Mid0038.cs +++ b/src/OpenProtocolInterpreter/Job/Mid0038.cs @@ -1,4 +1,7 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; namespace OpenProtocolInterpreter.Job { @@ -14,20 +17,18 @@ public class Mid0038 : Mid, IJob, IIntegrator, IAcceptableCommand, IDeclinableCo public IEnumerable DocumentedPossibleErrors => new Error[] { Error.JobCannotBeSet, Error.InvalidData }; - public int JobId - { - get => GetField(1, DataFields.JobId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.JobId).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 2, HasPrefix = false)] + [Int32DataFieldDefinition(revision: 2, field: 1, Index = 20, Size = 4, HasPrefix = false)] + public int JobId { get; set; } public Mid0038() : this(DEFAULT_REVISION) { } - + public Mid0038(Header header) : base(header) { - + } public Mid0038(int revision) : this(new Header() @@ -38,51 +39,30 @@ public Mid0038(int revision) : this(new Header() { } - public override string Pack() - { - HandleRevision(); - return base.Pack(); - } - - public override Mid Parse(string package) - { - Header = ProcessHeader(package); - HandleRevision(); - ProcessDataFields(package); - return this; - } - - protected override Dictionary> RegisterDatafields() + protected override string BuildHeader() { - return new Dictionary>() + Header.Length = Header.DefaultSize; + if (RevisionsByFields.TryGetValue(Header.StandardizedRevision, out var dataFields)) { - { - 1, new List() - { - DataField.Number(DataFields.JobId, 20, GetJobIdSize(), false), - } - } - }; - } + Header.Length += dataFields.Sum(x => x.TotalSize); + } - private void HandleRevision() - { - var dataField = GetField(1, DataFields.JobId); - dataField.Size = GetJobIdSize(); + return Header.ToString(); } - private int GetJobIdSize() + public override string Pack() { - return Header.StandardizedRevision switch - { - <= 1 => 2, - _ => 4 - }; + var builder = new StringBuilder(BuildHeader()); + + builder.Append(base.Pack(RevisionsByFields[Header.StandardizedRevision])); + return builder.ToString(); } - protected enum DataFields + public override Mid Parse(ReadOnlySpan package) { - JobId + Header = ProcessHeader(package); + ProcessDataFields(RevisionsByFields[Header.StandardizedRevision], package); + return this; } } } diff --git a/src/OpenProtocolInterpreter/Job/Mid0039.cs b/src/OpenProtocolInterpreter/Job/Mid0039.cs index 544ff06c..9088f55e 100644 --- a/src/OpenProtocolInterpreter/Job/Mid0039.cs +++ b/src/OpenProtocolInterpreter/Job/Mid0039.cs @@ -1,4 +1,7 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; namespace OpenProtocolInterpreter.Job { @@ -14,11 +17,9 @@ public class Mid0039 : Mid, IJob, IIntegrator, IAcceptableCommand, IDeclinableCo public IEnumerable DocumentedPossibleErrors => new Error[] { Error.JobNotRunning, Error.InvalidData }; - public int JobId - { - get => GetField(1, DataFields.JobId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.JobId).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 2, HasPrefix = false)] + [Int32DataFieldDefinition(revision: 2, field: 1, Index = 20, Size = 4, HasPrefix = false)] + public int JobId { get; set; } public Mid0039() : this(DEFAULT_REVISION) { @@ -27,7 +28,7 @@ public Mid0039() : this(DEFAULT_REVISION) public Mid0039(Header header) : base(header) { - + } public Mid0039(int revision) : this(new Header() @@ -38,48 +39,30 @@ public Mid0039(int revision) : this(new Header() { } - public override string Pack() + protected override string BuildHeader() { - HandleRevisions(); - return base.Pack(); - } + Header.Length = Header.DefaultSize; + if (RevisionsByFields.TryGetValue(Header.StandardizedRevision, out var dataFields)) + { + Header.Length += dataFields.Sum(x => x.TotalSize); + } - public override Mid Parse(string package) - { - Header = ProcessHeader(package); - HandleRevisions(); - ProcessDataFields(package); - return this; + return Header.ToString(); } - protected override Dictionary> RegisterDatafields() + public override string Pack() { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.JobId, 20, 2, false), - } - } - }; - } + var builder = new StringBuilder(BuildHeader()); - private void HandleRevisions() - { - if (Header.Revision > 1) - { - GetField(1, DataFields.JobId).Size = 4; - } - else - { - GetField(1, DataFields.JobId).Size = 2; - } + builder.Append(base.Pack(RevisionsByFields[Header.StandardizedRevision])); + return builder.ToString(); } - protected enum DataFields + public override Mid Parse(ReadOnlySpan package) { - JobId + Header = ProcessHeader(package); + ProcessDataFields(RevisionsByFields[Header.StandardizedRevision], package); + return this; } } } diff --git a/src/OpenProtocolInterpreter/Job/ParameterSet.cs b/src/OpenProtocolInterpreter/Job/ParameterSet.cs index 813eb9eb..551ef71e 100644 --- a/src/OpenProtocolInterpreter/Job/ParameterSet.cs +++ b/src/OpenProtocolInterpreter/Job/ParameterSet.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Reflection; namespace OpenProtocolInterpreter.Job { @@ -54,29 +55,33 @@ public string Pack(int revision) } public static ParameterSet Parse(string section, int revision) + => Parse(section.AsSpan(), revision); + + public static ParameterSet Parse(ReadOnlySpan section, int revision) { - string[] fields = section.Split(':'); + var remaining = section; var pset = new ParameterSet() { - ChannelId = OpenProtocolConvert.ToInt32(fields[0]), - TypeId = OpenProtocolConvert.ToInt32(fields[1]), - AutoValue = OpenProtocolConvert.ToBoolean(fields[2]), - BatchSize = OpenProtocolConvert.ToInt32(fields[3]) + ChannelId = OpenProtocolConvert.ToInt32(NextField(ref remaining, ':')), + TypeId = OpenProtocolConvert.ToInt32(NextField(ref remaining, ':')), + AutoValue = OpenProtocolConvert.ToBoolean(NextField(ref remaining, ':')), + BatchSize = OpenProtocolConvert.ToInt32(NextField(ref remaining, ':')) }; if (revision > 2) { - pset.JobStepName = fields[5]; - pset.JobStepType = OpenProtocolConvert.ToInt32(fields[6]); + var socketOrIdentifierNumber = NextField(ref remaining, ':'); + pset.JobStepName = NextField(ref remaining, ':').ToString(); + pset.JobStepType = OpenProtocolConvert.ToInt32(NextField(ref remaining, ':')); if (revision > 3) { - pset.IdentifierNumber = OpenProtocolConvert.ToInt32(fields[4]); - pset.MaxCoherentNok = OpenProtocolConvert.ToInt32(fields[7]); + pset.IdentifierNumber = OpenProtocolConvert.ToInt32(socketOrIdentifierNumber); + pset.MaxCoherentNok = OpenProtocolConvert.ToInt32(NextField(ref remaining, ':')); } else { - pset.Socket = OpenProtocolConvert.ToInt32(fields[4]); + pset.Socket = OpenProtocolConvert.ToInt32(socketOrIdentifierNumber); } } @@ -84,27 +89,81 @@ public static ParameterSet Parse(string section, int revision) } public static IEnumerable ParseAll(string section, int revision) + => ParseAll(section.AsSpan(), revision); + + public static IEnumerable ParseAll(ReadOnlySpan section, int revision) { - if (string.IsNullOrWhiteSpace(section)) + if (section.IsWhiteSpace() || section.IsEmpty) + return Array.Empty(); + + var result = new List(); + var remaining = section; + while (!remaining.IsEmpty) { - yield break; + var psetData = NextField(ref remaining, ';'); + if (!psetData.IsWhiteSpace()) + result.Add(Parse(psetData, revision)); } + return result; + } - var parameterSets = section.Split(';').ToList(); - parameterSets.RemoveAll(string.IsNullOrWhiteSpace); //remove last one which will probably be empty - foreach (string psetData in parameterSets) + private static ReadOnlySpan NextField(ref ReadOnlySpan remaining, char separator) + { + int idx = remaining.IndexOf(separator); + if (idx < 0) { - yield return Parse(psetData, revision); + var last = remaining; + remaining = ReadOnlySpan.Empty; + return last; } + + var field = remaining.Slice(0, idx); + remaining = remaining.Slice(idx + 1); + return field; } public static int Size(int revision) => revision switch { + 1 => 12, + 2 => 12, 3 => 44, 4 => 49, 5 => 51, - _ => 12, + _ => 51, //Default will always be the last }; } + + public class ParameterSetCollectionDefinitionAttribute : DataFieldDefinitionAttribute + { + public ParameterSetCollectionDefinitionAttribute(int revision) : base(revision) + { + + } + public ParameterSetCollectionDefinitionAttribute(int field, int revision) : base(field, revision) + { + + } + + internal override DataField Build(object owner, PropertyInfo propertyInfo, int index) + { + return new DataField>(Field, index, Size, HasPrefix) + { + DefaultConverter = PackParameterSets, + DefaultParser = ParseParameterSets + }.Bind(owner, propertyInfo); + } + + private string PackParameterSets(char paddingChar, int size, PaddingOrientation orientation, List parameterSets) + { + var list = new List(); + foreach (var parameterSet in parameterSets) + list.Add(parameterSet.Pack(Revision)); + + return string.Concat(string.Join(";", list), ";"); + } + + private List ParseParameterSets(string value) + => ParameterSet.ParseAll(value, Revision).ToList(); + } } diff --git a/src/OpenProtocolInterpreter/LinkCommunication/LinkCommunicationMessages.cs b/src/OpenProtocolInterpreter/LinkCommunication/LinkCommunicationMessages.cs index 3fc4f96f..8f7a808d 100644 --- a/src/OpenProtocolInterpreter/LinkCommunication/LinkCommunicationMessages.cs +++ b/src/OpenProtocolInterpreter/LinkCommunication/LinkCommunicationMessages.cs @@ -8,10 +8,10 @@ internal class LinkCommunicationMessages : MessagesTemplate { public LinkCommunicationMessages() : base() { - _templates = new Dictionary() + _templates = new Dictionary>() { - { Mid9997.MID, new MidCompiledInstance(typeof(Mid9997)) }, - { Mid9998.MID, new MidCompiledInstance(typeof(Mid9998)) } + { Mid9997.MID, new CompiledInstance(typeof(Mid9997)) }, + { Mid9998.MID, new CompiledInstance(typeof(Mid9998)) } }; } diff --git a/src/OpenProtocolInterpreter/LinkCommunication/Mid9997.cs b/src/OpenProtocolInterpreter/LinkCommunication/Mid9997.cs index 61b8a32a..dba06de7 100644 --- a/src/OpenProtocolInterpreter/LinkCommunication/Mid9997.cs +++ b/src/OpenProtocolInterpreter/LinkCommunication/Mid9997.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.LinkCommunication { @@ -18,11 +19,8 @@ public class Mid9997 : Mid, ILinkCommunication, IIntegrator, IController { public const int MID = 9997; - public int MidNumber - { - get => GetField(1, DataFields.MidNumber).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.MidNumber).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 4, HasPrefix = false)] + public int MidNumber { get; set; } public Mid9997(Header header) : base(header) { @@ -35,23 +33,5 @@ public Mid9997() : this(new Header() }) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.MidNumber, 20, 4, false) - } - } - }; - } - - protected enum DataFields - { - MidNumber - } } } diff --git a/src/OpenProtocolInterpreter/LinkCommunication/Mid9998.cs b/src/OpenProtocolInterpreter/LinkCommunication/Mid9998.cs index 372e133a..f322a7be 100644 --- a/src/OpenProtocolInterpreter/LinkCommunication/Mid9998.cs +++ b/src/OpenProtocolInterpreter/LinkCommunication/Mid9998.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.LinkCommunication { @@ -18,16 +19,10 @@ public class Mid9998 : Mid, ILinkCommunication, IController, IIntegrator { public const int MID = 9998; - public int MidNumber - { - get => GetField(1, DataFields.MidNumber).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.MidNumber).SetValue(OpenProtocolConvert.ToString, value); - } - public LinkCommunicationError ErrorCode - { - get => (LinkCommunicationError)GetField(1, DataFields.ErrorCode).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.ErrorCode).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 4, HasPrefix = false)] + public int MidNumber { get; set; } + [Int32DataFieldDefinition(revision: 1, field: 2, Index = 24, Size = 4, HasPrefix = false)] + public LinkCommunicationError ErrorCode { get; set; } public Mid9998() : this(new Header() { @@ -35,31 +30,11 @@ public Mid9998() : this(new Header() Revision = DEFAULT_REVISION }) { - - } - public Mid9998(Header header) : base(header) - { } - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.MidNumber, 20, 4, false), - DataField.Number(DataFields.ErrorCode, 24, 4, false) - } - } - }; - } - - protected enum DataFields + public Mid9998(Header header) : base(header) { - MidNumber, - ErrorCode } } } diff --git a/src/OpenProtocolInterpreter/MID.cs b/src/OpenProtocolInterpreter/MID.cs deleted file mode 100644 index 69fe3281..00000000 --- a/src/OpenProtocolInterpreter/MID.cs +++ /dev/null @@ -1,221 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Text; - -namespace OpenProtocolInterpreter -{ - /// - /// Abstract class which every Mid should inherit, containing all of default data, such as data and methods. - /// - public abstract class Mid - { - protected const int DEFAULT_REVISION = 1; - - protected Dictionary> RevisionsByFields { get; } - public Header Header { get; set; } - - public Mid(Header header) - { - Header = header; - RevisionsByFields = new SafeAccessRevisionsFields(RegisterDatafields()); - } - - public Mid(int mid, int revision, bool noAckFlag = false) : this(new Header() - { - Mid = mid, - Revision = revision, - NoAckFlag = noAckFlag - }) - { - - } - - protected virtual byte[] BuildRawHeader() => ToBytes(BuildHeader()); - - protected virtual string BuildHeader() - { - if (RevisionsByFields.Any()) - { - Header.Length = Header.DefaultSize; - for (int i = 1; i <= Header.StandardizedRevision; i++) - { - if (RevisionsByFields.TryGetValue(i, out var dataFields)) - { - foreach (var dataField in dataFields) - Header.Length += (dataField.HasPrefix ? 2 : 0) + dataField.Size; - } - } - } - return Header.ToString(); - } - - public virtual string Pack() - { - var header = BuildHeader(); - if (!RevisionsByFields.Any()) - return header; - - var builder = new StringBuilder(header); - int prefixIndex = 1; - var revision = Header.StandardizedRevision; - for (int i = 1; i <= revision; i++) - { - builder.Append(Pack(i, ref prefixIndex)); - } - - return builder.ToString(); - } - - public virtual byte[] PackBytes() => Encoding.ASCII.GetBytes(Pack()); - - protected virtual string Pack(int revision, ref int prefixIndex) - { - if (!RevisionsByFields.TryGetValue(revision, out var dataFields)) - { - return string.Empty; - } - - return Pack(dataFields, ref prefixIndex); - } - - protected virtual string Pack(List dataFields, ref int prefixIndex) - { - var builder = new StringBuilder(); - foreach (var dataField in dataFields) - { - if (dataField.HasPrefix) - { - builder.Append(prefixIndex.ToString("D2")); - prefixIndex++; - } - - builder.Append(dataField.Value); - } - - return builder.ToString(); - } - - protected virtual Dictionary> RegisterDatafields() => new(); - - protected virtual Header ProcessHeader(string package) - { - if (package.Length < 20) - { - package = package.PadRight(20, ' '); - } - - static bool IsNotEmptyOrZero(string package, out int value) - { - value = 0; - return !string.IsNullOrWhiteSpace(package) && int.TryParse(package, out value) && value > 0; - } - - var header = new Header - { - Length = int.Parse(package.Substring(0, 4)), - Mid = int.Parse(package.Substring(4, 4)), - Revision = IsNotEmptyOrZero(package.Substring(8, 3), out var revision) ? revision : 1, - NoAckFlag = !string.IsNullOrWhiteSpace(package.Substring(11, 1)), - StationId = int.TryParse(package.Substring(12, 2), out var stationId) ? stationId : 1, - SpindleId = int.TryParse(package.Substring(14, 2), out var spindleId) ? spindleId : 1, - SequenceNumber = IsNotEmptyOrZero(package.Substring(16, 2), out var sequenceNumber) ? sequenceNumber : default(int?), - NumberOfMessages = IsNotEmptyOrZero(package.Substring(18, 1), out var numberOfMessages) ? numberOfMessages : default(int?), - MessageNumber = IsNotEmptyOrZero(package.Substring(19, 1), out var messageNumber) ? messageNumber : default(int?) - }; - - return header; - } - - public virtual Mid Parse(string package) - { - Header = ProcessHeader(package); - ProcessDataFields(package); - return this; - } - - public virtual Mid Parse(byte[] package) - { - var pack = ToAscii(package); - return Parse(pack); - } - - protected virtual void ProcessDataFields(string package) - { - if (!RevisionsByFields.Any()) - return; - - int revision = Header.Revision > 0 ? Header.Revision : 1; - for (int i = 1; i <= revision; i++) - { - ProcessDataFields(i, package); - } - } - - protected virtual void ProcessDataFields(int revision, string package) - { - if (RevisionsByFields.TryGetValue(revision, out var fields)) - { - ProcessDataFields(fields, package); - } - } - - protected virtual void ProcessDataFields(List dataFields, string package) - { - foreach (var dataField in dataFields) - dataField.Value = GetValue(dataField, package); - } - - protected string GetValue(DataField field, string package) - { - try - { - return field.HasPrefix ? package.Substring(2 + field.Index, field.Size) : package.Substring(field.Index, field.Size); - } - catch (ArgumentOutOfRangeException) - { - return null; - } - } - - protected byte[] GetValue(DataField field, byte[] package) - { - try - { - byte[] bytes = new byte[field.Size]; - var index = field.HasPrefix ? 2 + field.Index : field.Index; - int j = 0; - for (int i = index; i < index + field.Size; i++) - { - bytes[j] = package[i]; - j++; - } - - return bytes; - } - catch (ArgumentOutOfRangeException) - { - return null; - } - } - - protected DataField GetField(int revision, int field) - { - if (!RevisionsByFields.TryGetValue(revision, out var fields)) - { - return DataField.Default; - } - - return fields.FirstOrDefault(x => x.Field == field) ?? DataField.Default; - } - - protected DataField GetField(int revision, TEnum field) where TEnum : struct, Enum - => GetField(revision, field.GetHashCode()); - - protected static string ToAscii(byte[] bytes) => Encoding.ASCII.GetString(bytes); - - protected static byte[] ToBytes(string value) => Encoding.ASCII.GetBytes(value); - - } -} diff --git a/src/OpenProtocolInterpreter/Mid.cs b/src/OpenProtocolInterpreter/Mid.cs new file mode 100644 index 00000000..54e629ae --- /dev/null +++ b/src/OpenProtocolInterpreter/Mid.cs @@ -0,0 +1,369 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; + +namespace OpenProtocolInterpreter +{ + /// + /// Abstract class which every Mid should inherit, containing all of default data, such as data and methods. + /// + public abstract class Mid + { + private static readonly ConcurrentDictionary _metadataCache = new(); + private static Encoding _defaultEncoding = Encoding.ASCII; + + private readonly Lazy>> _lazyFields; + protected const int DEFAULT_REVISION = 1; + protected internal Dictionary> RevisionsByFields => _lazyFields.Value; + + /// + /// Encoding used whenever a package is converted from/to its byte array representation. + /// Defaults to , as stated by the Open Protocol specification. + /// + /// Setting it affects every MID, so it is meant to be set once during + /// startup, before any package is packed or parsed. Field positions of the specification are + /// counted in single byte characters, therefore ASCII compatible single byte encodings + /// (such as Latin1) are the ones able to preserve them. + /// + /// + public static Encoding DefaultEncoding + { + get => _defaultEncoding; + set => _defaultEncoding = value ?? Encoding.ASCII; + } + + /// + /// Header of the MID message containing standardized fields. + /// + public Header Header { get; set; } + + public Mid(Header header) + { + Header = header; + _lazyFields = new Lazy>>(() => new SafeAccessRevisionsFields(RegisterDatafields())); + } + + public Mid(int mid, int revision, bool noAckFlag = false) : this(new Header() + { + Mid = mid, + Revision = revision, + NoAckFlag = noAckFlag + }) + { + + } + + protected virtual byte[] BuildRawHeader() => ToBytes(BuildHeader()); + + protected virtual string BuildHeader() + { + if (RevisionsByFields.Any()) + { + Header.Length = Header.DefaultSize; + for (int i = 1; i <= Header.StandardizedRevision; i++) + { + if (RevisionsByFields.TryGetValue(i, out var dataFields)) + { + foreach (var dataField in dataFields) + Header.Length += dataField.TotalSize; + } + } + } + return Header.ToString(); + } + + /// + /// Packs the MID message into a string representation, including the header and all data fields for the current revision. + /// If the MID has no data fields, only the header will be packed. + /// + /// The string representing the packed MID message. + public virtual string Pack() + { + var header = BuildHeader(); + if (!RevisionsByFields.Any()) + return header; + + var builder = new StringBuilder(header); + var revision = Header.StandardizedRevision; + for (int rev = 1; rev <= revision; rev++) + { + builder.Append(Pack(rev)); + } + + return builder.ToString(); + } + + /// + /// Packs the MID message into a byte array representation, including the header and all data fields for the current revision. + /// If the MID has no data fields, only the header will be packed. + /// The byte array is encoded with . + /// + /// The byte array representing the packed MID message. + public virtual byte[] PackBytes() => PackBytes(DefaultEncoding); + + /// + /// Packs the MID message into a byte array representation, including the header and all data fields for the current revision. + /// If the MID has no data fields, only the header will be packed. + /// + /// Encoding used to convert the packed message into bytes. + /// The byte array representing the packed MID message in the given encoding. + public virtual byte[] PackBytes(Encoding encoding) => ToBytes(Pack(), encoding); + + protected virtual string Pack(int revision) + { + if (!RevisionsByFields.TryGetValue(revision, out var dataFields)) + { + return string.Empty; + } + + return Pack(dataFields); + } + + protected internal virtual string Pack(IEnumerable dataFields) + { + var builder = new StringBuilder(); + foreach (var dataField in dataFields) + { + if (dataField is IBackedPropertyDataField backedPropertyDataField) + backedPropertyDataField.SyncWithBackingPropertyIfBound(); + + if (dataField.HasPrefix) + { + builder.Append(dataField.Field.ToString("D2")); + } + + builder.Append(dataField.Value); + } + + return builder.ToString(); + } + + /// + /// Registers the data fields for the MID, ordered by their revision and field id. This method is called lazily when parsing or packing a MID to ensure revision defined at header. + /// Each data field should be decorated with a to define its specifications. + /// The field id in the attribute is used to order the fields in the same revision. + /// Mids with custom fields due to different revisions fields should override this method to handle them appropriately. + /// + /// A dictionary where the key is the revision number and the value is a list of data fields for that revision. + protected virtual Dictionary> RegisterDatafields() + { + var metadata = _metadataCache.GetOrAdd(GetType(), static type => + { + var result = new List(); + var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance) + .Where(x => x.CustomAttributes.Any(a => typeof(DataFieldDefinitionAttribute).IsAssignableFrom(a.AttributeType))); + + foreach (var prop in properties) + { + var attributes = prop.GetCustomAttributes(); + if (!attributes.Any()) + continue; + + foreach (var attr in attributes) + { + result.Add(new DataFieldMetadata(attr.Index, attr, prop)); + } + } + return result.ToArray(); + }); + + var fields = new Dictionary>(); + foreach (var m in metadata) + { + if (!fields.TryGetValue(m.Attribute.Revision, out var revisionFields)) + fields.Add(m.Attribute.Revision, revisionFields = new List()); + revisionFields.Add(m.CreateAndBind(this)); + } + return fields; + } + + /// + /// Processes the header of the MID message and fills the property. This method is called before processing the data fields. + /// + /// The MID message as a string. + /// The parsed object. + protected virtual Header ProcessHeader(string package) + => ProcessHeader(package.AsSpan()); + + /// + /// Processes the header of the MID message and fills the property. This method is called before processing the data fields. + /// + /// The MID message as a read-only span of characters. + /// The parsed object. + protected virtual Header ProcessHeader(ReadOnlySpan package) + { + if (package.Length < 20) + { + Span buffer = stackalloc char[20]; + package.CopyTo(buffer); + buffer.Slice(package.Length).Fill(' '); + return Header.Parse(buffer); + } + + return Header.Parse(package); + } + + /// + /// Parses the MID message from a string representation, filling the and data fields for the current revision. + /// + /// The MID message as a string. + /// The parsed object. + public virtual Mid Parse(string package) + => Parse(package.AsSpan()); + + /// + /// Parses the MID message from a read-only span of characters, filling the and data fields for the current revision. + /// + /// The MID message as a read-only span of characters. + /// The parsed object. + public virtual Mid Parse(ReadOnlySpan package) + { + Header = ProcessHeader(package); + ProcessDataFields(package); + return this; + } + + /// + /// Parses the MID message from a byte array representation, filling the and data fields for the current revision. + /// The byte array is decoded with . + /// + /// The MID message as a byte array. + /// The parsed object. + public virtual Mid Parse(byte[] package) => Parse(package, DefaultEncoding); + + /// + /// Parses the MID message from a byte array representation, filling the and data fields for the current revision. + /// + /// The MID message as a byte array. + /// Encoding used to decode the package. + /// The parsed object. + public virtual Mid Parse(byte[] package, Encoding encoding) + { + var pack = ToText(package, encoding); + return Parse(pack); + } + + protected virtual void ProcessDataFields(ReadOnlySpan package) + { + if (!RevisionsByFields.Any()) + return; + + int revision = Header.StandardizedRevision; + for (int i = 1; i <= revision; i++) + { + ProcessDataFields(i, package); + } + } + + protected virtual void ProcessDataFields(int revision, string package) + => ProcessDataFields(revision, package.AsSpan()); + + protected virtual void ProcessDataFields(int revision, ReadOnlySpan package) + { + if (RevisionsByFields.TryGetValue(revision, out var fields)) + { + ProcessDataFields(fields, package); + } + } + + protected virtual void ProcessDataFields(IEnumerable dataFields, ReadOnlySpan package) + { + foreach (var dataField in dataFields) + ProcessDataField(dataField, package); + } + + protected virtual void ProcessDataField(DataField dataField, ReadOnlySpan package) + => dataField.SetValue(GetValue(dataField, package)); + + protected ReadOnlySpan GetValue(DataField field, ReadOnlySpan package) + { + try + { + return field.HasPrefix ? package.Slice(2 + field.Index, field.Size) : package.Slice(field.Index, field.Size); + } + catch (ArgumentOutOfRangeException) + { + return ReadOnlySpan.Empty; + } + } + + protected byte[] GetValue(DataField field, byte[] package) + { + try + { + byte[] bytes = new byte[field.Size]; + var index = field.HasPrefix ? 2 + field.Index : field.Index; + int j = 0; + for (int i = index; i < index + field.Size; i++) + { + bytes[j] = package[i]; + j++; + } + + return bytes; + } + catch (ArgumentOutOfRangeException) + { + return null; + } + } + + protected DataField GetField(int revision, int field) + { + if (!RevisionsByFields.TryGetValue(revision, out var fields)) + { + return DataField.Default; + } + + return fields.FirstOrDefault(x => x.Field == field) ?? DataField.Default; + } + + protected DataField GetField(int revision, int field) + { + if (!RevisionsByFields.TryGetValue(revision, out var fields)) + { + throw new ArgumentException("No fields registered for the specified revision.", nameof(revision)); + } + + return (DataField)fields.FirstOrDefault(x => x.GetType() == typeof(DataField) && x.Field == field); + } + + protected DataField GetField(string propertyName) + { + var type = GetType(); + if (!_metadataCache.TryGetValue(type, out var metadata) && !_lazyFields.IsValueCreated) + { + _ = _lazyFields.Value; // Force initialization of the lazy fields to populate the metadata cache + _metadataCache.TryGetValue(type, out metadata); + } + + var dataField = metadata.First(x => x.Property.Name == propertyName); + return RevisionsByFields[Header.StandardizedRevision].First(x => x.Field == dataField.Attribute.Field); + } + + protected DataField GetField(int revision, TEnum field) where TEnum : struct, Enum + => GetField(revision, field.GetHashCode()); + + [Obsolete($"Packages are no longer necessarily ASCII encoded, use ToText(byte[]) which honors {nameof(DefaultEncoding)} instead.")] + protected static string ToAscii(byte[] bytes) => ToText(bytes, DefaultEncoding); + protected static string ToText(byte[] bytes) => ToText(bytes, DefaultEncoding); + protected static string ToText(byte[] bytes, Encoding encoding) => encoding.GetString(bytes); + protected static byte[] ToBytes(string value) => ToBytes(value, DefaultEncoding); + protected static byte[] ToBytes(string value, Encoding encoding) => encoding.GetBytes(value); + protected static Span ToBytesSpan(string value) => ToBytes(value.AsSpan()); + protected static Span ToBytes(ReadOnlySpan value) => ToBytes(value, DefaultEncoding); + protected static Span ToBytes(ReadOnlySpan value, Encoding encoding) + { +#if NETSTANDARD2_0 + return encoding.GetBytes(value.ToString()); +#else + var buffer = new byte[encoding.GetByteCount(value)]; + encoding.GetBytes(value, buffer); + return buffer; +#endif + } + } +} diff --git a/src/OpenProtocolInterpreter/MidExtensions.cs b/src/OpenProtocolInterpreter/MidExtensions.cs index 82f1bce6..07a19c3b 100644 --- a/src/OpenProtocolInterpreter/MidExtensions.cs +++ b/src/OpenProtocolInterpreter/MidExtensions.cs @@ -1,6 +1,8 @@ using OpenProtocolInterpreter.Communication; using System; +using System.Collections.Generic; using System.Linq; +using System.Text; namespace OpenProtocolInterpreter { @@ -31,13 +33,22 @@ public static string PackWithNul(this Mid mid) /// Mid instance /// Mid's package in bytes with NUL character public static byte[] PackBytesWithNul(this Mid mid) + => PackBytesWithNul(mid, Mid.DefaultEncoding); + + /// + /// then concatenate NUL charactor to it`s end + /// + /// Mid instance + /// Encoding used to convert the packed message into bytes + /// Mid's package in bytes with NUL character + public static byte[] PackBytesWithNul(this Mid mid, Encoding encoding) { if (mid == default) { return default; } - var bytes = mid.PackBytes(); + var bytes = mid.PackBytes(encoding); return bytes.Concat(new byte[] { 0x00 }).ToArray(); } @@ -50,7 +61,7 @@ public static byte[] PackBytesWithNul(this Mid mid) public static TAckMid GetAcknowledge(this IAcknowledgeable instance) where TAckMid : Mid, IAcknowledge, new() { var mid = new TAckMid(); - if(instance is Mid acknowledgeableMid) + if (instance is Mid acknowledgeableMid) mid.Header.Revision = acknowledgeableMid.Header.Revision; return mid; @@ -103,7 +114,7 @@ public static Mid0004 GetDeclineCommand(this TDeclinedMid mid, Err } /// - /// Assert that error code is a possible error for the current failed mid and generates a Communication Negative Acknowledge mid () + /// Assert that error code is a possible error for the current failed mid and generates a Communication Negative Acknowledge mid () /// instance for the failed mid and with the informed error code. /// /// instance and implementer diff --git a/src/OpenProtocolInterpreter/MidInterpreter.cs b/src/OpenProtocolInterpreter/MidInterpreter.cs index 704497b7..296ff808 100644 --- a/src/OpenProtocolInterpreter/MidInterpreter.cs +++ b/src/OpenProtocolInterpreter/MidInterpreter.cs @@ -1,13 +1,15 @@ -using OpenProtocolInterpreter.Messages; +using OpenProtocolInterpreter.Communication; +using OpenProtocolInterpreter.Messages; using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Text; namespace OpenProtocolInterpreter { /// - /// Responsible for building and parsing any incoming Mid. + /// Responsible for building and parsing any incoming Mid. /// Message templates initialization must be done with methods. /// public class MidInterpreter @@ -15,19 +17,52 @@ public class MidInterpreter private readonly Dictionary> _messagesTemplates; private readonly SortedDictionary _midTemplates; + /// + /// Creates an interpreter with no message template registered. + /// + /// Templates must be registered before parsing any package + /// + /// public MidInterpreter() { _messagesTemplates = new Dictionary>(); _midTemplates = new SortedDictionary(); } + /// + /// Packs a mid into its string representation. + /// + /// The mid to pack. + /// The string representation of the mid. public static string Pack(Mid mid) => mid.Pack(); + /// + /// Packs a mid into its byte array representation using . + /// + /// The mid to pack. + /// The byte array representation of the mid. public static byte[] PackBytes(Mid mid) => mid.PackBytes(); + /// + /// Packs a mid into its byte array representation using the given . + /// + /// The mid to pack. + /// Encoding used to convert the packed mid into bytes. + /// The byte array representation of the mid. + public static byte[] PackBytes(Mid mid, Encoding encoding) => mid.PackBytes(encoding); + + /// + /// Parses a package into its corresponding instance. + /// + /// The package to parse. + /// The parsed mid instance. public Mid Parse(string package) { +#if NETSTANDARD2_0 int mid = int.Parse(package.Substring(4, 4)); +#else + int mid = int.Parse(package.AsSpan(4, 4)); +#endif var instance = TryParseStandaloneMid(mid); if (instance != default) return instance; @@ -36,9 +71,104 @@ public Mid Parse(string package) return template.ProcessPackage(mid, package); } + /// + /// Parses the extra data of a request into the expected . + /// + /// The expected extra data type of the requested mid. + /// The mid containing the extra data to parse. + /// The parsed extra data. + /// Thrown when the parsed extra data is not a . + /// Thrown when no registered message template handles the requested mid. + public TExtraData ParseExtraData(Mid0006 mid) where TExtraData : ExtraData, IExtraDataRequest + { + var instance = ParseExtraData(mid); + if (instance is TExtraData extraData) + return extraData; + + throw new InvalidCastException($"Extra data cannot be casted to {typeof(TExtraData).Name}"); + } + + /// + /// Parses the extra data of a subscription into the expected . + /// + /// The expected extra data type of the subscribed mid. + /// The mid containing the extra data to parse. + /// The parsed extra data. + /// Thrown when the parsed extra data is not a . + /// Thrown when no registered message template handles the subscribed mid. + public TExtraData ParseExtraData(Mid0008 mid) where TExtraData : ExtraData, IExtraDataSubscription + { + var instance = ParseExtraData(mid); + if (instance is TExtraData extraData) + return extraData; + + throw new InvalidCastException($"Extra data cannot be casted to {typeof(TExtraData).Name}"); + } + + /// + /// Parses the extra data of a unsubscription into the expected . + /// + /// The expected extra data type of the unsubscribed mid. + /// The mid containing the extra data to parse. + /// The parsed extra data. + /// Thrown when the parsed extra data is not a . + /// Thrown when no registered message template handles the unsubscribed mid. + public TExtraData ParseExtraData(Mid0009 mid) where TExtraData : ExtraData, IExtraDataUnsubscription + { + var expectedExtraData = ParseExtraData(mid); + if (expectedExtraData is TExtraData extraData) + return extraData; + + throw new InvalidCastException($"Extra data cannot be casted to {typeof(TExtraData).Name}"); + } + + /// + /// Parses the extra data of any extra data container mid into the expected . + /// + /// The type of the mid carrying the extra data. + /// The expected extra data type of the contained mid. + /// The mid containing the extra data to parse. + /// The parsed extra data. + /// Thrown when the parsed extra data is not a . + /// Thrown when is not a supported extra data container, or when no registered message template handles the contained mid. + public TExtraData ParseExtraData(TMid mid) where TMid : Mid, IExtraDataContainer + where TExtraData : ExtraData + { + var expectedExtraData = ParseExtraData(mid); + if (expectedExtraData is TExtraData extraData) + return extraData; + + throw new InvalidCastException($"Extra data cannot be casted to {typeof(TExtraData).Name}"); + } + + /// + /// Parses the extra data of any extra data container mid, such as , and . + /// The extra data instance is resolved from the mid it refers to and parsed with the revision wanted by . + /// + /// The type of the mid carrying the extra data. + /// The mid containing the extra data to parse. + /// The parsed extra data. + /// Thrown when is not a supported extra data container, or when no registered message template handles the contained mid. + public ExtraData ParseExtraData(TMid mid) where TMid : Mid, IExtraDataContainer + { + var expectedMid = GetMidFromExtraDataMid(mid); + var template = GetMessageTemplate(expectedMid); + var instance = template.GetExtraDataInstance(expectedMid, GetExtraDataKind(mid)); + + var extraDataInstance = instance.CompiledConstructor(); + extraDataInstance.Revision = mid.WantedRevision; + return extraDataInstance.Parse(mid.ExtraData); + } + + /// + /// Parses a package decoding it with . + /// + /// The package to parse. + /// The parsed mid instance. + /// Thrown when no registered message template handles the package's mid. public Mid Parse(byte[] package) { - int mid = int.Parse(Encoding.ASCII.GetString(package, 4, 4)); + int mid = ReadMidNumber(package, Mid.DefaultEncoding); var instance = TryParseStandaloneMid(mid); if (instance != default) return instance; @@ -47,24 +177,83 @@ public Mid Parse(byte[] package) return template.ProcessPackage(mid, package); } + /// + /// Parses a package decoding it with the given . + /// + /// The package to parse. + /// Encoding used to decode the package. + /// The parsed mid instance. + /// Thrown when no registered message template handles the package's mid. + public Mid Parse(byte[] package, Encoding encoding) + { + int mid = ReadMidNumber(package, encoding); + var instance = TryParseStandaloneMid(mid); + if (instance != default) + return instance; + + var template = GetMessageTemplate(mid); + return template.ProcessPackage(mid, package, encoding); + } + + /// + /// Parses a package and returns it as the expected mid type. + /// + /// The mid type the package is expected to be. + /// The package to parse. + /// The parsed mid instance. + /// Thrown when the package is not an . + /// Thrown when no registered message template handles the package's mid. public ExpectedMid Parse(string package) where ExpectedMid : Mid { Mid mid = Parse(package); - if (mid.GetType().Equals(typeof(ExpectedMid))) - return (ExpectedMid)mid; + if (mid is ExpectedMid expectedMid) + return expectedMid; throw new InvalidCastException($"Package is Mid {mid.GetType().Name}, cannot be casted to {typeof(ExpectedMid).Name}"); } + /// + /// Parses a package decoding it with and returns it as the expected mid type. + /// + /// The mid type the package is expected to be. + /// The package to parse. + /// The parsed mid instance. + /// Thrown when the package is not an . + /// Thrown when no registered message template handles the package's mid. public ExpectedMid Parse(byte[] package) where ExpectedMid : Mid + => Parse(Parse(package)); + + /// + /// Parses a package decoding it with the given and returns it as the expected mid type. + /// + /// The mid type the package is expected to be. + /// The package to parse. + /// Encoding used to decode the package. + /// The parsed mid instance. + /// Thrown when the package is not an . + /// Thrown when no registered message template handles the package's mid. + public ExpectedMid Parse(byte[] package, Encoding encoding) where ExpectedMid : Mid + => Parse(Parse(package, encoding)); + + private static ExpectedMid Parse(Mid mid) where ExpectedMid : Mid { - Mid mid = Parse(package); if (mid.GetType().Equals(typeof(ExpectedMid))) return (ExpectedMid)mid; throw new InvalidCastException($"Package is Mid {mid.GetType().Name}, cannot be casted to {typeof(ExpectedMid).Name}"); } + private static int ReadMidNumber(byte[] package, Encoding encoding) + { +#if NETSTANDARD2_0 + return int.Parse(encoding.GetString(package, 4, 4)); +#else + Span buffer = stackalloc char[4]; + var written = encoding.GetChars(package.AsSpan(4, 4), buffer); + return int.Parse(buffer.Slice(0, written)); +#endif + } + internal void UseTemplate(IMessagesTemplate template) { var type = template.GetType(); @@ -145,5 +334,27 @@ private static Mid TryParseStandaloneMid(int mid) _ => default, }; } + + private static int GetMidFromExtraDataMid(TMid mid) where TMid : Mid, IExtraDataContainer + { + switch (mid) + { + case Communication.Mid0006 m: return m.RequestedMid; + case Communication.Mid0008 m: return m.SubscriptionMid; + case Communication.Mid0009 m: return m.UnsubscriptionMid; + default: throw new NotImplementedException($"Could not get the MID from {mid.GetType().Name} as extra data, please implement it"); + } + } + + private static Type GetExtraDataKind(TMid mid) where TMid : Mid, IExtraDataContainer + { + switch (mid) + { + case Communication.Mid0006 _: return typeof(IExtraDataRequest); + case Communication.Mid0008 _: return typeof(IExtraDataSubscription); + case Communication.Mid0009 _: return typeof(IExtraDataUnsubscription); + default: throw new NotImplementedException($"Could not get the extra data kind from {mid.GetType().Name}, please implement it"); + } + } } } diff --git a/src/OpenProtocolInterpreter/MotorTuning/Mid0501.cs b/src/OpenProtocolInterpreter/MotorTuning/Mid0501.cs index 74a958c8..b4a97bde 100644 --- a/src/OpenProtocolInterpreter/MotorTuning/Mid0501.cs +++ b/src/OpenProtocolInterpreter/MotorTuning/Mid0501.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.MotorTuning { @@ -16,11 +17,8 @@ public class Mid0501 : Mid, IMotorTuning, IController, IAcknowledgeable /// Motor Tune Failed = false (0) /// Motor Tune Success = true (1) /// - public bool MotorTuneResult - { - get => GetField(1, DataFields.MotorTuneResult).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(1, DataFields.MotorTuneResult).SetValue(OpenProtocolConvert.ToString, value); - } + [BooleanDataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 1)] + public bool MotorTuneResult { get; set; } public Mid0501() : this(new Header() { @@ -33,23 +31,5 @@ public Mid0501() : this(new Header() public Mid0501(Header header) : base(header) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Boolean(DataFields.MotorTuneResult, 20) - } - } - }; - } - - protected enum DataFields - { - MotorTuneResult - } } } diff --git a/src/OpenProtocolInterpreter/MotorTuning/MotorTuningMessages.cs b/src/OpenProtocolInterpreter/MotorTuning/MotorTuningMessages.cs index fa22f7b3..7df8441b 100644 --- a/src/OpenProtocolInterpreter/MotorTuning/MotorTuningMessages.cs +++ b/src/OpenProtocolInterpreter/MotorTuning/MotorTuningMessages.cs @@ -11,13 +11,13 @@ internal class MotorTuningMessages : MessagesTemplate { public MotorTuningMessages() : base() { - _templates = new Dictionary() + _templates = new Dictionary>() { - { Mid0500.MID, new MidCompiledInstance(typeof(Mid0500)) }, - { Mid0501.MID, new MidCompiledInstance(typeof(Mid0501)) }, - { Mid0502.MID, new MidCompiledInstance(typeof(Mid0502)) }, - { Mid0503.MID, new MidCompiledInstance(typeof(Mid0503)) }, - { Mid0504.MID, new MidCompiledInstance(typeof(Mid0504)) } + { Mid0500.MID, new CompiledInstance(typeof(Mid0500)) }, + { Mid0501.MID, new CompiledInstance(typeof(Mid0501)) }, + { Mid0502.MID, new CompiledInstance(typeof(Mid0502)) }, + { Mid0503.MID, new CompiledInstance(typeof(Mid0503)) }, + { Mid0504.MID, new CompiledInstance(typeof(Mid0504)) } }; } diff --git a/src/OpenProtocolInterpreter/MultiSpindle/Mid0091.cs b/src/OpenProtocolInterpreter/MultiSpindle/Mid0091.cs index 6f2fce75..14b9162a 100644 --- a/src/OpenProtocolInterpreter/MultiSpindle/Mid0091.cs +++ b/src/OpenProtocolInterpreter/MultiSpindle/Mid0091.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Text; @@ -17,27 +17,16 @@ public class Mid0091 : Mid, IMultiSpindle, IController, IAcknowledgeable GetField(1, DataFields.NumberOfSpindles).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.NumberOfSpindles).SetValue(OpenProtocolConvert.ToString, value); - } - public int SyncTighteningId - { - get => GetField(1, DataFields.SyncTighteningId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.SyncTighteningId).SetValue(OpenProtocolConvert.ToString, value); - } - public DateTime Time - { - get => GetField(1, DataFields.Time).GetValue(OpenProtocolConvert.ToDateTime); - set => GetField(1, DataFields.Time).SetValue(OpenProtocolConvert.ToString, value); - } - public bool SyncOverallStatus - { - get => GetField(1, DataFields.SyncOverallStatus).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(1, DataFields.SyncOverallStatus).SetValue(OpenProtocolConvert.ToString, value); - } - public List SpindlesStatus { get; set; } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 2)] + public int NumberOfSpindles { get; set; } + [Int32DataFieldDefinition(revision: 1, field: 2, Index = 24, Size = 5)] + public int SyncTighteningId { get; set; } + [TimestampDataFieldDefinition(revision: 1, field: 3, Index = 31)] + public DateTime Time { get; set; } + [BooleanDataFieldDefinition(revision: 1, field: 4, Index = 52)] + public bool SyncOverallStatus { get; set; } + [SpindleStatusCollectionDefinition(revision: 1, field: 5, Index = 55, Size = 5)] + public List SpindlesStatus { get; set; } = new List(); public Mid0091() : this(new Header() { @@ -53,76 +42,21 @@ public Mid0091(Header header) : base(header) SpindlesStatus ??= []; } + public override string Pack() { - GetField(1, DataFields.SpindleStatus).Value = PackSpindlesStatus(); + NumberOfSpindles = SpindlesStatus?.Count ?? 0; //Enforce the number of spindles to match the list count + GetField(nameof(SpindlesStatus)).Size = NumberOfSpindles * SpindleStatus.DefaultSize; return base.Pack(); } - public override Mid Parse(string package) - { - Header = ProcessHeader(package); - var spindleField = GetField(1, DataFields.SpindleStatus); - spindleField.Size = Header.Length - spindleField.Index - 2; - base.Parse(package); - SpindlesStatus = ParseSpindlesStatus(spindleField.Value); - return this; - } - - //TODO: move to SpindleStatus class - protected virtual string PackSpindlesStatus() + protected override void ProcessDataField(DataField dataField, ReadOnlySpan package) { - var builder = new StringBuilder(); - foreach (var spindle in SpindlesStatus) - builder.Append(OpenProtocolConvert.ToString('0', 2, PaddingOrientation.LeftPadded, spindle.SpindleNumber) + - OpenProtocolConvert.ToString('0', 2, PaddingOrientation.LeftPadded, spindle.ChannelId) + - OpenProtocolConvert.ToString(spindle.SyncOverallStatus)); - - return builder.ToString(); - } - - protected virtual List ParseSpindlesStatus(string section) - { - var list = new List(); - for (int i = 0; i < section.Length; i += 5) + if (dataField.Field == 5) { - var obj = new SpindleStatus() - { - SpindleNumber = OpenProtocolConvert.ToInt32(section.Substring(i, 2)), - ChannelId = OpenProtocolConvert.ToInt32(section.Substring(i + 2, 2)), - SyncOverallStatus = OpenProtocolConvert.ToBoolean(section.Substring(i + 4, 1)) - }; - - list.Add(obj); + dataField.Size = NumberOfSpindles * SpindleStatus.DefaultSize; } - - return list; - } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.NumberOfSpindles, 20, 2), - DataField.Number(DataFields.SyncTighteningId, 24, 5), - DataField.Timestamp(DataFields.Time, 31), - DataField.Boolean(DataFields.SyncOverallStatus, 52), - new(DataFields.SpindleStatus, 55, 5) - } - } - }; - } - - protected enum DataFields - { - NumberOfSpindles, - SyncTighteningId, - Time, - SyncOverallStatus, - SpindleStatus + base.ProcessDataField(dataField, package); } } } diff --git a/src/OpenProtocolInterpreter/MultiSpindle/Mid0100.cs b/src/OpenProtocolInterpreter/MultiSpindle/Mid0100.cs index b4d76698..35ec639e 100644 --- a/src/OpenProtocolInterpreter/MultiSpindle/Mid0100.cs +++ b/src/OpenProtocolInterpreter/MultiSpindle/Mid0100.cs @@ -1,23 +1,24 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.MultiSpindle { /// /// Multi-spindle result subscribe /// - /// A subscription for the multi-spindle status. For Power Focus, the subscription must - /// be addressed to a sync Master. - /// + /// A subscription for the multi-spindle status. For Power Focus, the subscription must + /// be addressed to a sync Master. + /// /// - /// This telegram is also used for a PowerMACS 4000 system - /// running a press instead of a spindle. A press system only supports revision 4 and higher - /// of the telegram and will answer with , MID revision unsupported if a subscription + /// This telegram is also used for a PowerMACS 4000 system + /// running a press instead of a spindle. A press system only supports revision 4 and higher + /// of the telegram and will answer with , MID revision unsupported if a subscription /// is made with a lower revision. /// /// Message sent by: Integrator /// - /// Answer: Command accepted or - /// Command error, Controller is not a sync master/station controller, + /// Answer: Command accepted or + /// Command error, Controller is not a sync master/station controller, /// Multi-spindle result subscription already exists or MID revision unsupported /// /// @@ -25,24 +26,18 @@ public class Mid0100 : Mid, IMultiSpindle, IIntegrator, ISubscription, IAcceptab { public const int MID = 100; - public IEnumerable DocumentedPossibleErrors => new Error[] - { + public IEnumerable DocumentedPossibleErrors => new Error[] + { Error.ControllerIsNotASyncMasterOrStationController, Error.MultiSpindleResultSubscriptionAlreadyExists, Error.MidRevisionUnsupported }; - public long DataNumberSystem - { - get => GetField(2, DataFields.DataNumberSystem).GetValue(OpenProtocolConvert.ToInt64); - set => GetField(2, DataFields.DataNumberSystem).SetValue(OpenProtocolConvert.ToString, value); - } + [Int64DataFieldDefinition(revision: 2, field: 1, Index = 20, Size = 10, HasPrefix = false)] + public long DataNumberSystem { get; set; } - public bool SendOnlyNewData - { - get => GetField(3, DataFields.SendOnlyNewData).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(3, DataFields.SendOnlyNewData).SetValue(OpenProtocolConvert.ToString, value); - } + [BooleanDataFieldDefinition(revision: 3, field: 2, Index = 30, HasPrefix = false)] + public bool SendOnlyNewData { get; set; } public Mid0100() : this(DEFAULT_REVISION) { @@ -66,30 +61,5 @@ public Mid0100(int revision, bool noAckFlag = false) : this(new Header() }) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 2, new List() - { - DataField.Number(DataFields.DataNumberSystem, 20, 10, false), - } - }, - { - 3, new List() - { - DataField.Boolean(DataFields.SendOnlyNewData, 30, false), - } - } - }; - } - - protected enum DataFields - { - DataNumberSystem, - SendOnlyNewData - } } } diff --git a/src/OpenProtocolInterpreter/MultiSpindle/Mid0101.cs b/src/OpenProtocolInterpreter/MultiSpindle/Mid0101.cs index 2620b3ab..293e887f 100644 --- a/src/OpenProtocolInterpreter/MultiSpindle/Mid0101.cs +++ b/src/OpenProtocolInterpreter/MultiSpindle/Mid0101.cs @@ -1,5 +1,6 @@ -using System; +using System; using System.Collections.Generic; +using System.Linq; namespace OpenProtocolInterpreter.MultiSpindle { @@ -15,7 +16,7 @@ namespace OpenProtocolInterpreter.MultiSpindle /// exactly the same but some of the fields have slightly different definitions.The fields for Torque are /// used for Force values and the fields for Angle are used for Stroke values. A press system always uses /// revision 4 or higher of the telegram. - /// + /// /// Message sent by: Controller /// Answer: Multi-spindle result acknowledge /// @@ -23,102 +24,46 @@ public class Mid0101 : Mid, IMultiSpindle, IController, IAcknowledgeable GetField(1, DataFields.NumberOfSpindlesOrPresses).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.NumberOfSpindlesOrPresses).SetValue(OpenProtocolConvert.ToString, value); - } - public string VinNumber - { - get => GetField(1, DataFields.VinNumber).Value; - set => GetField(1, DataFields.VinNumber).SetValue(value); - } - public int JobId - { - get => GetField(1, DataFields.JobId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.JobId).SetValue(OpenProtocolConvert.ToString, value); - } - public int ParameterSetId - { - get => GetField(1, DataFields.ParameterSetId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.ParameterSetId).SetValue(OpenProtocolConvert.ToString, value); - } - public int BatchSize - { - get => GetField(1, DataFields.BatchSize).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.BatchSize).SetValue(OpenProtocolConvert.ToString, value); - } - public int BatchCounter - { - get => GetField(1, DataFields.BatchCounter).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.BatchCounter).SetValue(OpenProtocolConvert.ToString, value); - } - public BatchStatus BatchStatus - { - get => (BatchStatus)GetField(1, DataFields.BatchStatus).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.BatchStatus).SetValue(OpenProtocolConvert.ToString, value); - } - public decimal TorqueOrForceMinLimit - { - get => GetField(1, DataFields.TorqueOrForceMinLimit).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(1, DataFields.TorqueOrForceMinLimit).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal TorqueOrForceMaxLimit - { - get => GetField(1, DataFields.TorqueOrForceMaxLimit).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(1, DataFields.TorqueOrForceMaxLimit).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal TorqueOrForceFinalTarget - { - get => GetField(1, DataFields.TorqueOrForceFinalTarget).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(1, DataFields.TorqueOrForceFinalTarget).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal AngleOrStrokeMinLimit - { - get => GetField(1, DataFields.AngleOrStrokeMinLimit).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(1, DataFields.AngleOrStrokeMinLimit).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal AngleOrStrokeMaxLimit - { - get => GetField(1, DataFields.AngleOrStrokeMaxLimit).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(1, DataFields.AngleOrStrokeMaxLimit).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal FinalAngleOrStrokeTarget - { - get => GetField(1, DataFields.FinalAngleOrStrokeTarget).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(1, DataFields.FinalAngleOrStrokeTarget).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public DateTime LastChangeInParameterSet - { - get => GetField(1, DataFields.LastChangeInParameterSet).GetValue(OpenProtocolConvert.ToDateTime); - set => GetField(1, DataFields.LastChangeInParameterSet).SetValue(OpenProtocolConvert.ToString, value); - } - public DateTime TimeStamp - { - get => GetField(1, DataFields.Timestamp).GetValue(OpenProtocolConvert.ToDateTime); - set => GetField(1, DataFields.Timestamp).SetValue(OpenProtocolConvert.ToString, value); - } - public int SyncTighteningId - { - get => GetField(1, DataFields.SyncTighteningId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.SyncTighteningId).SetValue(OpenProtocolConvert.ToString, value); - } - public bool SyncOverallStatus - { - get => GetField(1, DataFields.SyncOverallStatus).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(1, DataFields.SyncOverallStatus).SetValue(OpenProtocolConvert.ToString, value); - } - public List SpindlesOrPressesStatus { get; set; } - public SystemSubType SystemSubType - { - get => (SystemSubType)GetField(4, DataFields.SystemSubType).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(4, DataFields.SystemSubType).SetValue(OpenProtocolConvert.ToString, value); - } - public int JobSequenceNumber - { - get => GetField(5, DataFields.JobSequenceNumber).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(5, DataFields.JobSequenceNumber).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 2)] + public int NumberOfSpindlesOrPresses { get; set; } + [StringDataFieldDefinition(revision: 1, field: 2, Index = 24, Size = 25)] + public string VinNumber { get; set; } + [Int32DataFieldDefinition(revision: 1, field: 3, Index = 51, Size = 2)] + public int JobId { get; set; } + [Int32DataFieldDefinition(revision: 1, field: 4, Index = 55, Size = 3)] + public int ParameterSetId { get; set; } + [Int32DataFieldDefinition(revision: 1, field: 5, Index = 60, Size = 4)] + public int BatchSize { get; set; } + [Int32DataFieldDefinition(revision: 1, field: 6, Index = 66, Size = 4)] + public int BatchCounter { get; set; } + [Int32DataFieldDefinition(revision: 1, field: 7, Index = 72, Size = 1)] + public BatchStatus BatchStatus { get; set; } + [TruncatedDecimalDataFieldDefinition(revision: 1, field: 8, Index = 75, Size = 6)] + public decimal TorqueOrForceMinLimit { get; set; } + [TruncatedDecimalDataFieldDefinition(revision: 1, field: 9, Index = 83, Size = 6)] + public decimal TorqueOrForceMaxLimit { get; set; } + [TruncatedDecimalDataFieldDefinition(revision: 1, field: 10, Index = 91, Size = 6)] + public decimal TorqueOrForceFinalTarget { get; set; } + [TruncatedDecimalDataFieldDefinition(revision: 1, field: 11, Index = 99, Size = 5)] + public decimal AngleOrStrokeMinLimit { get; set; } + [TruncatedDecimalDataFieldDefinition(revision: 1, field: 12, Index = 106, Size = 5)] + public decimal AngleOrStrokeMaxLimit { get; set; } + [TruncatedDecimalDataFieldDefinition(revision: 1, field: 13, Index = 113, Size = 5)] + public decimal FinalAngleOrStrokeTarget { get; set; } + [TimestampDataFieldDefinition(revision: 1, field: 14, Index = 120)] + public DateTime LastChangeInParameterSet { get; set; } + [TimestampDataFieldDefinition(revision: 1, field: 15, Index = 141)] + public DateTime TimeStamp { get; set; } + [Int32DataFieldDefinition(revision: 1, field: 16, Index = 162, Size = 5)] + public int SyncTighteningId { get; set; } + [BooleanDataFieldDefinition(revision: 1, field: 17, Index = 169)] + public bool SyncOverallStatus { get; set; } + [SpindleOrPressStatusCollectionDefinition(revision: 1, field: 18, Index = 172)] + public List SpindlesOrPressesStatus { get; set; } = new List(); + [Int32DataFieldDefinition(revision: 4, field: 19, Index = 0, Size = 3)] + public SystemSubType SystemSubType { get; set; } + [Int32DataFieldDefinition(revision: 5, field: 20, Index = 0, Size = 5)] + public int JobSequenceNumber { get; set; } public Mid0101() : this(DEFAULT_REVISION) { @@ -140,140 +85,55 @@ public Mid0101(int revision) : this(new Header() public override string Pack() { - var spindesOrPressesStatusField = GetField(1, DataFields.SpindesOrPressesStatus); - spindesOrPressesStatusField.Size = SpindlesOrPressesStatus.Count * 18; - spindesOrPressesStatusField.Value = PackSpindlesOrPressesStatus(); - return base.Pack(); - } - - public override Mid Parse(string package) - { - Header = ProcessHeader(package); - var spindleOrPressesField = GetField(1, DataFields.NumberOfSpindlesOrPresses); - int spindleOrPresses = OpenProtocolConvert.ToInt32(package.Substring(spindleOrPressesField.Index + 2, spindleOrPressesField.Size)); - var spindesOrPressesStatusField = GetField(1, DataFields.SpindesOrPressesStatus); - spindesOrPressesStatusField.Size = spindleOrPresses * 18; - if(Header.Revision > 3) + NumberOfSpindlesOrPresses = SpindlesOrPressesStatus?.Count ?? 0; //Enforce the number of spindles to match the list count + var spindlesOrPressesStatusField = GetField(revision: 1, field: 18); + spindlesOrPressesStatusField.Size = NumberOfSpindlesOrPresses * SpindleOrPressStatus.DefaultSize; + if (Header.Revision > 3) { - var systemSubTypeField = GetField(4, DataFields.SystemSubType); - systemSubTypeField.Index = spindesOrPressesStatusField.Index + spindesOrPressesStatusField.Size + 2; - if(Header.Revision > 4) + var systemSubTypeField = GetField(revision: 4, field: 19); + systemSubTypeField.Index = spindlesOrPressesStatusField.Index + spindlesOrPressesStatusField.TotalSize; + if (Header.Revision > 4) { - GetField(5, DataFields.JobSequenceNumber).Index = systemSubTypeField.Index + systemSubTypeField.Size + 2; + GetField(revision: 5, field: 20).Index = systemSubTypeField.Index + systemSubTypeField.TotalSize; } } - ProcessDataFields(package); - SpindlesOrPressesStatus = ParseSpindlesOrPressesStatus(spindesOrPressesStatusField.Value); - return this; + return base.Pack(); } - //TODO: move to SpindleOrPressStatus class - protected virtual string PackSpindlesOrPressesStatus() + + protected override void ProcessDataFields(ReadOnlySpan package) { - string package = string.Empty; - foreach (var v in SpindlesOrPressesStatus) + foreach (var field in DataFieldsByRevision()) { - package += OpenProtocolConvert.ToString('0', 2, PaddingOrientation.LeftPadded, v.SpindleOrPressNumber) + - OpenProtocolConvert.ToString('0', 2, PaddingOrientation.LeftPadded, v.ChannelId) + - OpenProtocolConvert.ToString(v.OverallStatus) + - OpenProtocolConvert.ToString(v.TorqueOrForceStatus) + - OpenProtocolConvert.TruncatedDecimalToString('0', 6, PaddingOrientation.LeftPadded, v.TorqueOrForce) + - OpenProtocolConvert.ToString(v.AngleOrStrokeStatus) + - OpenProtocolConvert.ToString('0', 5, PaddingOrientation.LeftPadded, v.AngleOrStroke); + ProcessDataField(field, package); } - - return package; } - protected virtual List ParseSpindlesOrPressesStatus(string section) + protected override void ProcessDataField(DataField dataField, ReadOnlySpan package) { - var list = new List(); - for (int i = 0; i < section.Length; i += 18) + if (dataField.Field == 18) { - var spindleValue = section.Substring(i, 18); - var obj = new SpindleOrPressStatus() - { - SpindleOrPressNumber = OpenProtocolConvert.ToInt32(spindleValue.Substring(0, 2)), - ChannelId = OpenProtocolConvert.ToInt32(spindleValue.Substring(2, 2)), - OverallStatus = OpenProtocolConvert.ToBoolean(spindleValue.Substring(4, 1)), - TorqueOrForceStatus = (TighteningValueStatus)OpenProtocolConvert.ToInt32(spindleValue.Substring(5, 1)), - TorqueOrForce = OpenProtocolConvert.ToTruncatedDecimal(spindleValue.Substring(6, 6)), - AngleOrStrokeStatus = OpenProtocolConvert.ToBoolean(spindleValue.Substring(12, 1)), - AngleOrStroke = OpenProtocolConvert.ToInt32(spindleValue.Substring(13, 5)) - }; - list.Add(obj); + dataField.Size = NumberOfSpindlesOrPresses * SpindleOrPressStatus.DefaultSize; } - - return list; + base.ProcessDataField(dataField, package); } - protected override Dictionary> RegisterDatafields() + private IEnumerable DataFieldsByRevision() { - return new Dictionary>() + var previousField = default(DataField); + foreach (var fields in RevisionsByFields) { + foreach (var dataField in fields.Value) { - 1, new List() - { - DataField.Number(DataFields.NumberOfSpindlesOrPresses, 20, 2), - DataField.String(DataFields.VinNumber, 24, 25), - DataField.Number(DataFields.JobId, 51, 2), - DataField.Number(DataFields.ParameterSetId, 55, 3), - DataField.Number(DataFields.BatchSize, 60, 4), - DataField.Number(DataFields.BatchCounter, 66, 4), - DataField.Number(DataFields.BatchStatus, 72, 1), - DataField.Number(DataFields.TorqueOrForceMinLimit, 75, 6), - DataField.Number(DataFields.TorqueOrForceMaxLimit, 83, 6), - DataField.Number(DataFields.TorqueOrForceFinalTarget, 91, 6), - DataField.Number(DataFields.AngleOrStrokeMinLimit, 99, 5), - DataField.Number(DataFields.AngleOrStrokeMaxLimit, 106, 5), - DataField.Number(DataFields.FinalAngleOrStrokeTarget, 113, 5), - DataField.Timestamp(DataFields.LastChangeInParameterSet, 120), - DataField.Timestamp(DataFields.Timestamp, 141), - DataField.Number(DataFields.SyncTighteningId, 162, 5), - DataField.Boolean(DataFields.SyncOverallStatus, 169), - DataField.Volatile(DataFields.SpindesOrPressesStatus, 172) - } - }, - { - 4, new List() - { - DataField.Number(DataFields.SystemSubType, 0, 3) - } - }, - { - 5, new List() - { - DataField.Number(DataFields.JobSequenceNumber, 0, 5) - } - } - }; - } + if (previousField != null && dataField.Index == 0) + { + dataField.Index = previousField.Index + previousField.TotalSize; + } - protected enum DataFields - { - NumberOfSpindlesOrPresses, - VinNumber, - JobId, - ParameterSetId, - BatchSize, - BatchCounter, - BatchStatus, - TorqueOrForceMinLimit, - TorqueOrForceMaxLimit, - TorqueOrForceFinalTarget, - AngleOrStrokeMinLimit, - AngleOrStrokeMaxLimit, - FinalAngleOrStrokeTarget, - Target, - LastChangeInParameterSet, - Timestamp, - SyncTighteningId, - SyncOverallStatus, - SpindesOrPressesStatus, - //Rev 4 - SystemSubType, - //Rev 5 - JobSequenceNumber + previousField = dataField; + yield return dataField; + } + } } } } diff --git a/src/OpenProtocolInterpreter/MultiSpindle/Mid0104.cs b/src/OpenProtocolInterpreter/MultiSpindle/Mid0104.cs index 8c5e5b88..ace2329c 100644 --- a/src/OpenProtocolInterpreter/MultiSpindle/Mid0104.cs +++ b/src/OpenProtocolInterpreter/MultiSpindle/Mid0104.cs @@ -10,7 +10,7 @@ namespace OpenProtocolInterpreter.MultiSpindle /// Note: MID 0104 can’t be used if there is an active subscription for multiple spindle results. /// Message sent by: Integrator /// - /// Answer: Command accepted or + /// Answer: Command accepted or /// Command error, Multi spindle result subscription already exists /// /// @@ -20,34 +20,13 @@ public class Mid0104 : Mid, IMultiSpindle, IIntegrator, IAnswerableBy, public IEnumerable DocumentedPossibleErrors => new Error[] { Error.MultiSpindleResultSubscriptionAlreadyExists }; - public long RequestedResultIndex - { - get => GetField(1, DataFields.RequestedResultIndex).GetValue(OpenProtocolConvert.ToInt64); - set => GetField(1, DataFields.RequestedResultIndex).SetValue(OpenProtocolConvert.ToString, value); - } + [Int64DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 10)] + public long RequestedResultIndex { get; set; } public Mid0104() : base(MID, DEFAULT_REVISION) { } public Mid0104(Header header) : base(header) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.RequestedResultIndex, 20, 10), - } - } - }; - } - - protected enum DataFields - { - RequestedResultIndex - } } } diff --git a/src/OpenProtocolInterpreter/MultiSpindle/MultiSpindleMessages.cs b/src/OpenProtocolInterpreter/MultiSpindle/MultiSpindleMessages.cs index a99f4f58..419083f7 100644 --- a/src/OpenProtocolInterpreter/MultiSpindle/MultiSpindleMessages.cs +++ b/src/OpenProtocolInterpreter/MultiSpindle/MultiSpindleMessages.cs @@ -11,17 +11,17 @@ internal class MultiSpindleMessages : MessagesTemplate { public MultiSpindleMessages() : base() { - _templates = new Dictionary() + _templates = new Dictionary>() { - { Mid0090.MID, new MidCompiledInstance(typeof(Mid0090)) }, - { Mid0091.MID, new MidCompiledInstance(typeof(Mid0091)) }, - { Mid0092.MID, new MidCompiledInstance(typeof(Mid0092)) }, - { Mid0093.MID, new MidCompiledInstance(typeof(Mid0093)) }, - { Mid0100.MID, new MidCompiledInstance(typeof(Mid0100)) }, - { Mid0101.MID, new MidCompiledInstance(typeof(Mid0101)) }, - { Mid0102.MID, new MidCompiledInstance(typeof(Mid0102)) }, - { Mid0103.MID, new MidCompiledInstance(typeof(Mid0103)) }, - { Mid0104.MID, new MidCompiledInstance(typeof(Mid0104)) }, + { Mid0090.MID, new CompiledInstance(typeof(Mid0090)) }, + { Mid0091.MID, new CompiledInstance(typeof(Mid0091)) }, + { Mid0092.MID, new CompiledInstance(typeof(Mid0092)) }, + { Mid0093.MID, new CompiledInstance(typeof(Mid0093)) }, + { Mid0100.MID, new CompiledInstance(typeof(Mid0100)) }, + { Mid0101.MID, new CompiledInstance(typeof(Mid0101)) }, + { Mid0102.MID, new CompiledInstance(typeof(Mid0102)) }, + { Mid0103.MID, new CompiledInstance(typeof(Mid0103)) }, + { Mid0104.MID, new CompiledInstance(typeof(Mid0104)) }, }; } diff --git a/src/OpenProtocolInterpreter/MultiSpindle/SpindleOrPressStatus.cs b/src/OpenProtocolInterpreter/MultiSpindle/SpindleOrPressStatus.cs index f6b2cd87..ec8232b6 100644 --- a/src/OpenProtocolInterpreter/MultiSpindle/SpindleOrPressStatus.cs +++ b/src/OpenProtocolInterpreter/MultiSpindle/SpindleOrPressStatus.cs @@ -1,10 +1,17 @@ -namespace OpenProtocolInterpreter.MultiSpindle +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Text; + +namespace OpenProtocolInterpreter.MultiSpindle { /// /// Represents a Spindle or a Press status entity, depending on /// public class SpindleOrPressStatus { + internal const int DefaultSize = 18; + public int SpindleOrPressNumber { get; set; } public int ChannelId { get; set; } public bool OverallStatus { get; set; } @@ -12,5 +19,80 @@ public class SpindleOrPressStatus public decimal TorqueOrForce { get; set; } public bool AngleOrStrokeStatus { get; set; } public int AngleOrStroke { get; set; } + + public string Pack() + { + return string.Concat( + OpenProtocolConvert.ToString('0', 2, PaddingOrientation.LeftPadded, SpindleOrPressNumber), + OpenProtocolConvert.ToString('0', 2, PaddingOrientation.LeftPadded, ChannelId), + OpenProtocolConvert.ToString(OverallStatus), + OpenProtocolConvert.ToString(TorqueOrForceStatus), + OpenProtocolConvert.TruncatedDecimalToString('0', 6, PaddingOrientation.LeftPadded, TorqueOrForce), + OpenProtocolConvert.ToString(AngleOrStrokeStatus), + OpenProtocolConvert.ToString('0', 5, PaddingOrientation.LeftPadded, AngleOrStroke) + ); + } + + public static SpindleOrPressStatus Parse(string section) + => Parse(section.AsSpan()); + + public static SpindleOrPressStatus Parse(ReadOnlySpan section) + { + return new SpindleOrPressStatus() + { + SpindleOrPressNumber = OpenProtocolConvert.ToInt32(section.Slice(0, 2)), + ChannelId = OpenProtocolConvert.ToInt32(section.Slice(2, 2)), + OverallStatus = OpenProtocolConvert.ToBoolean(section.Slice(4, 1)), + TorqueOrForceStatus = (TighteningValueStatus)OpenProtocolConvert.ToInt32(section.Slice(5, 1)), + TorqueOrForce = OpenProtocolConvert.ToTruncatedDecimal(section.Slice(6, 6)), + AngleOrStrokeStatus = OpenProtocolConvert.ToBoolean(section.Slice(12, 1)), + AngleOrStroke = OpenProtocolConvert.ToInt32(section.Slice(13, 5)) + }; + } + + public static List ParseAll(string section) + => ParseAll(section.AsSpan()); + + public static List ParseAll(ReadOnlySpan section) + { + var list = new List(); + for (int i = 0; i < section.Length; i += DefaultSize) + { + list.Add(Parse(section.Slice(i, DefaultSize))); + } + + return list; + } + } + + public class SpindleOrPressStatusCollectionDefinitionAttribute : DataFieldDefinitionAttribute + { + public SpindleOrPressStatusCollectionDefinitionAttribute(int revision) : base(revision) + { + + } + public SpindleOrPressStatusCollectionDefinitionAttribute(int field, int revision) : base(field, revision) + { + + } + + internal override DataField Build(object owner, PropertyInfo propertyInfo, int index) + { + return new DataField>(Field, index, Size, HasPrefix) + { + DefaultConverter = Pack, + DefaultParser = SpindleOrPressStatus.ParseAll + }.Bind(owner, propertyInfo); + } + + private static string Pack(char paddingChar, int size, PaddingOrientation orientation, List spindleOrPressStatus) + { + var sb = new StringBuilder(); + foreach (var spindle in spindleOrPressStatus) + { + sb.Append(spindle.Pack()); + } + return sb.ToString(); + } } } diff --git a/src/OpenProtocolInterpreter/MultiSpindle/SpindleStatus.cs b/src/OpenProtocolInterpreter/MultiSpindle/SpindleStatus.cs index 45cc9dea..931a5c94 100644 --- a/src/OpenProtocolInterpreter/MultiSpindle/SpindleStatus.cs +++ b/src/OpenProtocolInterpreter/MultiSpindle/SpindleStatus.cs @@ -1,12 +1,86 @@ -namespace OpenProtocolInterpreter.MultiSpindle +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Text; + +namespace OpenProtocolInterpreter.MultiSpindle { /// /// Represents a Spindle Status entity /// public class SpindleStatus { + internal const int DefaultSize = 5; + public int SpindleNumber { get; set; } public int ChannelId { get; set; } public bool SyncOverallStatus { get; set; } + + public string Pack() + { + return string.Concat( + OpenProtocolConvert.ToString('0', 2, PaddingOrientation.LeftPadded, SpindleNumber), + OpenProtocolConvert.ToString('0', 2, PaddingOrientation.LeftPadded, ChannelId), + OpenProtocolConvert.ToString(SyncOverallStatus) + ); + } + + public static SpindleStatus Parse(string section) + => Parse(section.AsSpan()); + + public static SpindleStatus Parse(ReadOnlySpan section) + { + return new SpindleStatus() + { + SpindleNumber = OpenProtocolConvert.ToInt32(section.Slice(0, 2)), + ChannelId = OpenProtocolConvert.ToInt32(section.Slice(2, 2)), + SyncOverallStatus = OpenProtocolConvert.ToBoolean(section.Slice(4, 1)) + }; + } + + public static List ParseAll(string section) + => ParseAll(section.AsSpan()); + + public static List ParseAll(ReadOnlySpan section) + { + var list = new List(); + for (int i = 0; i < section.Length; i += DefaultSize) + { + list.Add(Parse(section.Slice(i, DefaultSize))); + } + + return list; + } + } + + public class SpindleStatusCollectionDefinitionAttribute : DataFieldDefinitionAttribute + { + public SpindleStatusCollectionDefinitionAttribute(int revision) : base(revision) + { + + } + public SpindleStatusCollectionDefinitionAttribute(int field, int revision) : base(field, revision) + { + + } + + internal override DataField Build(object owner, PropertyInfo propertyInfo, int index) + { + return new DataField>(Field, index, Size, HasPrefix) + { + DefaultConverter = Pack, + DefaultParser = SpindleStatus.ParseAll + }.Bind(owner, propertyInfo); + } + + private static string Pack(char paddingChar, int size, PaddingOrientation orientation, List spindleStatus) + { + var sb = new StringBuilder(); + foreach (var spindle in spindleStatus) + { + sb.Append(spindle.Pack()); + } + return sb.ToString(); + } } } diff --git a/src/OpenProtocolInterpreter/MultipleIdentifiers/IdentifierStatus.cs b/src/OpenProtocolInterpreter/MultipleIdentifiers/IdentifierStatus.cs index 7e2ce082..a9713d84 100644 --- a/src/OpenProtocolInterpreter/MultipleIdentifiers/IdentifierStatus.cs +++ b/src/OpenProtocolInterpreter/MultipleIdentifiers/IdentifierStatus.cs @@ -1,4 +1,5 @@ using System; +using System.Reflection; namespace OpenProtocolInterpreter.MultipleIdentifiers { @@ -21,19 +22,44 @@ public string Pack() } public static IdentifierStatus Parse(string section) + => Parse(section.AsSpan()); + + public static IdentifierStatus Parse(ReadOnlySpan section) { - if (string.IsNullOrEmpty(section)) - { + if (section.IsEmpty) return default; - } return new IdentifierStatus() { - IdentifierTypeNumber = OpenProtocolConvert.ToInt32(section.Substring(0, 1)), - IncludedInWorkOrder = OpenProtocolConvert.ToBoolean(section.Substring(1, 2)), - StatusInWorkOrder = (StatusInWorkOrder)OpenProtocolConvert.ToInt32(section.Substring(3, 2)), + IdentifierTypeNumber = OpenProtocolConvert.ToInt32(section.Slice(0, 1)), + IncludedInWorkOrder = OpenProtocolConvert.ToBoolean(section.Slice(1, 2)), + StatusInWorkOrder = (StatusInWorkOrder)OpenProtocolConvert.ToInt32(section.Slice(3, 2)), ResultPart = section.SafeSubstring(5, 25) }; } } + + public class IdentifierStatusDefinitionAttribute : DataFieldDefinitionAttribute + { + public IdentifierStatusDefinitionAttribute(int revision) : base(revision) + { + + } + public IdentifierStatusDefinitionAttribute(int field, int revision) : base(field, revision) + { + + } + + internal override DataField Build(object owner, PropertyInfo propertyInfo, int index) + { + return new DataField(Field, index, Size, HasPrefix) + { + DefaultConverter = Pack, + DefaultParser = IdentifierStatus.Parse + }.Bind(owner, propertyInfo); + } + + private static string Pack(char paddingChar, int size, PaddingOrientation orientation, IdentifierStatus identifierStatus) + => identifierStatus.Pack(); + } } diff --git a/src/OpenProtocolInterpreter/MultipleIdentifiers/Mid0150.cs b/src/OpenProtocolInterpreter/MultipleIdentifiers/Mid0150.cs index 4b5268b9..3b474c24 100644 --- a/src/OpenProtocolInterpreter/MultipleIdentifiers/Mid0150.cs +++ b/src/OpenProtocolInterpreter/MultipleIdentifiers/Mid0150.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.MultipleIdentifiers { @@ -6,7 +7,7 @@ namespace OpenProtocolInterpreter.MultipleIdentifiers /// Identifier download request /// Used by the integrator to send an identifier to the controller. /// Message sent by: Integrator - ///Answer: Command accepted or Command error, Identifier input source not granted + ///Answer: Command accepted or Command error, Identifier input source not granted /// public class Mid0150 : Mid, IMultipleIdentifier, IIntegrator, IAcceptableCommand, IDeclinableCommand { @@ -14,60 +15,43 @@ public class Mid0150 : Mid, IMultipleIdentifier, IIntegrator, IAcceptableCommand public IEnumerable DocumentedPossibleErrors => new Error[] { Error.IdentifierInputSourceNotGranted }; - public string IdentifierData - { - get => GetField(1, DataFields.IdentifierData).Value; - set => GetField(1, DataFields.IdentifierData).SetValue(value); - } + [StringDataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 0, HasPrefix = false)] + public string IdentifierData { get; set; } public Mid0150() : this(new Header() { Mid = MID, Revision = DEFAULT_REVISION - }) - { + }) + { } public Mid0150(Header header) : base(header) { } + protected override string BuildHeader() + { + Header.Length = Header.DefaultSize + IdentifierData?.Length ?? 0; + return Header.ToString(); + } + public override string Pack() { - var identifierDataField = GetField(1, DataFields.IdentifierData); - if(identifierDataField.Value.Length > 100) + if (IdentifierData?.Length > 100) { - identifierDataField.Value = identifierDataField.Value.Substring(0, 100); + IdentifierData = IdentifierData.Substring(0, 100); } - identifierDataField.Size = identifierDataField.Value.Length; return base.Pack(); } - public override Mid Parse(string package) + public override Mid Parse(ReadOnlySpan package) { Header = ProcessHeader(package); - GetField(1, DataFields.IdentifierData).Size = Header.Length - 20; + GetField(nameof(IdentifierData)).Size = Header.Length - Header.DefaultSize; ProcessDataFields(package); return this; } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Volatile(DataFields.IdentifierData, 20, false) - } - } - }; - } - - protected enum DataFields - { - IdentifierData - } } } diff --git a/src/OpenProtocolInterpreter/MultipleIdentifiers/Mid0152.cs b/src/OpenProtocolInterpreter/MultipleIdentifiers/Mid0152.cs index 5310743b..c6605e59 100644 --- a/src/OpenProtocolInterpreter/MultipleIdentifiers/Mid0152.cs +++ b/src/OpenProtocolInterpreter/MultipleIdentifiers/Mid0152.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.MultipleIdentifiers { @@ -9,7 +10,7 @@ namespace OpenProtocolInterpreter.MultipleIdentifiers /// by the controller to the subscriber. /// /// - /// The identifier contains the status of the maximum four identifier result parts that could + /// The identifier contains the status of the maximum four identifier result parts that could /// be extracted from one or more valid identifiers. /// /// Message sent by: Controller @@ -19,9 +20,13 @@ public class Mid0152 : Mid, IMultipleIdentifier, IController, IAcknowledgeable> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - new(DataFields.FirstIdentifierStatus, 20, 30), - new(DataFields.SecondIdentifierStatus, 52, 30), - new(DataFields.ThirdIdentifierStatus, 84, 30), - new(DataFields.FourthIdentifierStatus, 116, 30) - } - } - }; - } - - protected enum DataFields - { - FirstIdentifierStatus, - SecondIdentifierStatus, - ThirdIdentifierStatus, - FourthIdentifierStatus } } } diff --git a/src/OpenProtocolInterpreter/MultipleIdentifiers/MultipleIdentifierMessages.cs b/src/OpenProtocolInterpreter/MultipleIdentifiers/MultipleIdentifierMessages.cs index 2e977eb2..fb430c51 100644 --- a/src/OpenProtocolInterpreter/MultipleIdentifiers/MultipleIdentifierMessages.cs +++ b/src/OpenProtocolInterpreter/MultipleIdentifiers/MultipleIdentifierMessages.cs @@ -11,16 +11,16 @@ internal class MultipleIdentifierMessages : MessagesTemplate { public MultipleIdentifierMessages() : base() { - _templates = new Dictionary() + _templates = new Dictionary>() { - { Mid0150.MID, new MidCompiledInstance(typeof(Mid0150)) }, - { Mid0151.MID, new MidCompiledInstance(typeof(Mid0151)) }, - { Mid0152.MID, new MidCompiledInstance(typeof(Mid0152)) }, - { Mid0153.MID, new MidCompiledInstance(typeof(Mid0153)) }, - { Mid0154.MID, new MidCompiledInstance(typeof(Mid0154)) }, - { Mid0155.MID, new MidCompiledInstance(typeof(Mid0155)) }, - { Mid0156.MID, new MidCompiledInstance(typeof(Mid0156)) }, - { Mid0157.MID, new MidCompiledInstance(typeof(Mid0157)) } + { Mid0150.MID, new CompiledInstance(typeof(Mid0150)) }, + { Mid0151.MID, new CompiledInstance(typeof(Mid0151)) }, + { Mid0152.MID, new CompiledInstance(typeof(Mid0152)) }, + { Mid0153.MID, new CompiledInstance(typeof(Mid0153)) }, + { Mid0154.MID, new CompiledInstance(typeof(Mid0154)) }, + { Mid0155.MID, new CompiledInstance(typeof(Mid0155)) }, + { Mid0156.MID, new CompiledInstance(typeof(Mid0156)) }, + { Mid0157.MID, new CompiledInstance(typeof(Mid0157)) } }; } diff --git a/src/OpenProtocolInterpreter/OpenProtocolCommandsDisabled/Mid0421.cs b/src/OpenProtocolInterpreter/OpenProtocolCommandsDisabled/Mid0421.cs index 8628a69e..99aefcf3 100644 --- a/src/OpenProtocolInterpreter/OpenProtocolCommandsDisabled/Mid0421.cs +++ b/src/OpenProtocolInterpreter/OpenProtocolCommandsDisabled/Mid0421.cs @@ -1,15 +1,16 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.OpenProtocolCommandsDisabled { /// /// Open Protocol commands disabled /// - /// Upload the status of the Open Protocol commands disable digital input. - /// The data upload consists of one byte delivering the digital input status. - /// The status is uploaded each time the “Open Protocol commands disable” digital + /// Upload the status of the Open Protocol commands disable digital input. + /// The data upload consists of one byte delivering the digital input status. + /// The status is uploaded each time the “Open Protocol commands disable” digital /// input changes (push function). - /// + /// /// Message sent by: Controller /// Answer: Open Protocol commands disabled acknowledge /// @@ -17,12 +18,8 @@ public class Mid0421 : Mid, IOpenProtocolCommandsDisabled, IController, IAcknowl { public const int MID = 421; - public bool DigitalInputStatus - { - get => GetField(1, DataFields.DigitalInputStatus).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(1, DataFields.DigitalInputStatus).SetValue(OpenProtocolConvert.ToString, value); - } - + [BooleanDataFieldDefinition(revision: 1, field: 1, Index = 20, HasPrefix = false)] + public bool DigitalInputStatus { get; set; } public Mid0421() : this(new Header() { Mid = MID, @@ -34,23 +31,5 @@ public Mid0421() : this(new Header() public Mid0421(Header header) : base(header) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Boolean(DataFields.DigitalInputStatus, 20, false) - } - } - }; - } - - protected enum DataFields - { - DigitalInputStatus - } } } diff --git a/src/OpenProtocolInterpreter/OpenProtocolCommandsDisabled/OpenProtocolCommandsDisabledMessages.cs b/src/OpenProtocolInterpreter/OpenProtocolCommandsDisabled/OpenProtocolCommandsDisabledMessages.cs index 9ae52513..aa936f87 100644 --- a/src/OpenProtocolInterpreter/OpenProtocolCommandsDisabled/OpenProtocolCommandsDisabledMessages.cs +++ b/src/OpenProtocolInterpreter/OpenProtocolCommandsDisabled/OpenProtocolCommandsDisabledMessages.cs @@ -11,12 +11,12 @@ internal class OpenProtocolCommandsDisabledMessages : MessagesTemplate { public OpenProtocolCommandsDisabledMessages() : base() { - _templates = new Dictionary() + _templates = new Dictionary>() { - { Mid0420.MID, new MidCompiledInstance(typeof(Mid0420)) }, - { Mid0421.MID, new MidCompiledInstance(typeof(Mid0421)) }, - { Mid0422.MID, new MidCompiledInstance(typeof(Mid0422)) }, - { Mid0423.MID, new MidCompiledInstance(typeof(Mid0423)) } + { Mid0420.MID, new CompiledInstance(typeof(Mid0420)) }, + { Mid0421.MID, new CompiledInstance(typeof(Mid0421)) }, + { Mid0422.MID, new CompiledInstance(typeof(Mid0422)) }, + { Mid0423.MID, new CompiledInstance(typeof(Mid0423)) } }; } diff --git a/src/OpenProtocolInterpreter/OpenProtocolConvert.cs b/src/OpenProtocolInterpreter/OpenProtocolConvert.cs index dfaa9088..6003aa19 100644 --- a/src/OpenProtocolInterpreter/OpenProtocolConvert.cs +++ b/src/OpenProtocolInterpreter/OpenProtocolConvert.cs @@ -10,6 +10,7 @@ namespace OpenProtocolInterpreter public class OpenProtocolConvert { private static readonly IFormatProvider _formatProvider = new CultureInfo("en-US"); + private static readonly DateTimeOffset _unixEpoch = DateTimeOffset.FromUnixTimeSeconds(0); public static string ToString(bool value) => value ? "1" : "0"; @@ -18,11 +19,16 @@ public static string ToString(char paddingChar, int size, PaddingOrientation ori => ToString(value); public static bool ToBoolean(string value) + => ToBoolean(value.AsSpan()); + + public static bool ToBoolean(ReadOnlySpan value) { int intValue = 0; - if (value != null) - int.TryParse(value.ToString(), out intValue); - +#if NETSTANDARD2_0 + if (!value.IsEmpty) int.TryParse(value.ToString(), out intValue); +#else + if (!value.IsEmpty) int.TryParse(value, out intValue); +#endif return Convert.ToBoolean(intValue); } @@ -33,17 +39,45 @@ public static string ToString(char paddingChar, int size, PaddingOrientation ori => ToString(value); public static DateTime ToDateTime(string value) + => ToDateTime(value.AsSpan()); + + public static DateTime ToDateTime(ReadOnlySpan value) { var convertedValue = DateTime.Now; - if (!string.IsNullOrWhiteSpace(value.ToString())) - { - var date = value.ToString(); - DateTime.TryParse($"{date.Substring(0, 10)} {date.Substring(11, 8)}", out convertedValue); - } - + if (value.IsWhiteSpace()) + return convertedValue; + + Span buffer = stackalloc char[19]; + value.Slice(0, 10).CopyTo(buffer); + buffer[10] = ' '; + value.Slice(11, 8).CopyTo(buffer.Slice(11)); + +#if NETSTANDARD2_0 + DateTime.TryParse(buffer.ToString(), out convertedValue); +#else + DateTime.TryParse(buffer, out convertedValue); +#endif return convertedValue; } + public static string ToString(DateTimeOffset value) + => ToString('0', 10, PaddingOrientation.LeftPadded, value); + + public static string ToString(char paddingChar, int size, PaddingOrientation orientation, DateTimeOffset value) + => ToString(paddingChar, size, orientation, value.ToUnixTimeSeconds()); + + public static DateTimeOffset ToUnixDateTime(string value) + => ToUnixDateTime(value.AsSpan()); + + public static DateTimeOffset ToUnixDateTime(ReadOnlySpan value) + { + if (value.IsWhiteSpace()) + return _unixEpoch; + + var unixTimestamp = ToInt64(value); + return DateTimeOffset.FromUnixTimeSeconds(unixTimestamp); + } + public static string ToString(decimal value) { return value.ToString("00.0###", _formatProvider); @@ -56,30 +90,66 @@ public static string ToString(char paddingChar, int size, PaddingOrientation ori } public static decimal ToDecimal(string value) + => ToDecimal(value.AsSpan()); + + public static decimal ToDecimal(ReadOnlySpan value) { decimal decimalValue = 0; - if (!string.IsNullOrWhiteSpace(value)) - decimal.TryParse(value.Replace(',', '.'), NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowExponent, _formatProvider, out decimalValue); - + if (value.IsWhiteSpace()) + return decimalValue; + +#if NETSTANDARD2_0 + decimal.TryParse(value.ToString().Replace(',', '.'), NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowExponent, _formatProvider, out decimalValue); +#else + Span buffer = value.Length <= 64 ? stackalloc char[value.Length] : new char[value.Length]; + value.CopyTo(buffer); + for (int i = 0; i < buffer.Length; i++) + { + if (buffer[i] == ',') + buffer[i] = '.'; + } + decimal.TryParse(buffer, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowExponent, _formatProvider, out decimalValue); +#endif return decimalValue; } public static string TruncatedDecimalToString(decimal value) + => TruncatedDecimalToString(value, 2); + + public static string TruncatedDecimalToString(decimal value, int decimalDigits) { - int convertedValue = (int)(Math.Round(value, 2) * 100m); + var decimals = (decimal)Math.Pow(10, decimalDigits); + int convertedValue = (int)(Math.Round(value, 2) * decimals); return convertedValue.ToString(); } public static string TruncatedDecimalToString(char paddingChar, int size, PaddingOrientation orientation, decimal value) + => TruncatedDecimalToString(paddingChar, size, orientation, value, 2); + + public static string TruncatedDecimalToString(char paddingChar, int size, PaddingOrientation orientation, decimal value, int decimalDigits) { - var str = TruncatedDecimalToString(value); - return TruncatePadded(paddingChar, size, orientation, str); + if (value < 0) + { + return string.Concat("-", TruncatePadded(paddingChar, size - 1, orientation, TruncatedDecimalToString(-value, decimalDigits))); + } + + return TruncatePadded(paddingChar, size, orientation, TruncatedDecimalToString(value, decimalDigits)); } public static decimal ToTruncatedDecimal(string value) + => ToTruncatedDecimal(value, 2); + + public static decimal ToTruncatedDecimal(string value, int decimalDigits) + => ToTruncatedDecimal(value.AsSpan(), decimalDigits); + + public static decimal ToTruncatedDecimal(ReadOnlySpan value) + => ToTruncatedDecimal(value, 2); + + public static decimal ToTruncatedDecimal(ReadOnlySpan value, int decimalDigits) { + var decimals = (decimal)Math.Pow(10, decimalDigits); int intValue = ToInt32(value); - return intValue / 100m; + return intValue / decimals; } public static string ToString(int value) @@ -89,7 +159,14 @@ public static string ToString(TEnum value) where TEnum : struct, Enum => ToString(value.GetHashCode()); public static string ToString(char paddingChar, int size, PaddingOrientation orientation, int value) - => TruncatePadded(paddingChar, size, orientation, ToString(value)); + { + if (value < 0) + { + return string.Concat("-", TruncatePadded(paddingChar, size - 1, orientation, ToString(-value))); + } + + return TruncatePadded(paddingChar, size, orientation, ToString(value)); + } public static string ToString(char paddingChar, int size, PaddingOrientation orientation, TEnum value) where TEnum : struct, Enum => TruncatePadded(paddingChar, size, orientation, ToString(value)); @@ -100,11 +177,27 @@ public static int ToInt32(string value) return convertedValue; } + public static int ToInt32(ReadOnlySpan value) + { +#if NETSTANDARD2_0 + return ToInt32(value.ToString()); +#else + int.TryParse(value, out int convertedValue); + return convertedValue; +#endif + } + public static string ToString(long value) => value.ToString(); public static string ToString(char paddingChar, int size, PaddingOrientation orientation, long value) - => TruncatePadded(paddingChar, size, orientation, ToString(value)); + { + if (value < 0) + { + return string.Concat("-", TruncatePadded(paddingChar, size - 1, orientation, ToString(-value))); + } + return TruncatePadded(paddingChar, size, orientation, ToString(value)); + } public static long ToInt64(string value) { @@ -112,7 +205,20 @@ public static long ToInt64(string value) return convertedValue; } - public static string ToString(IEnumerable value) + public static long ToInt64(ReadOnlySpan value) + { +#if NETSTANDARD2_0 + return ToInt64(value.ToString()); +#else + long.TryParse(value, out long convertedValue); + return convertedValue; +#endif + } + + public static string ToString(char paddingChar, int size, PaddingOrientation orientation, List value) + => ToString(value); + + public static string ToString(List value) { var builder = new StringBuilder(); foreach (var v in value) @@ -140,19 +246,22 @@ public static byte ToByte(bool[] values) } public static string TruncatePadded(char paddingChar, int size, PaddingOrientation orientation, string value) + => TruncatePadded(paddingChar, size, orientation, value.AsSpan()); + + public static string TruncatePadded(char paddingChar, int size, PaddingOrientation orientation, ReadOnlySpan value) { - if (value == null) - return string.Empty.PadLeft(size, paddingChar); + var truncated = size > 0 && value.Length > size ? value.Slice(0, size) : value; + int resultLength = Math.Max(size, truncated.Length); - if (size > 0 && value.Length > size) - { - value = value.Substring(0, size); - } + Span buffer = resultLength <= 128 ? stackalloc char[resultLength] : new char[resultLength]; + buffer.Fill(paddingChar); if (orientation == PaddingOrientation.RightPadded) - return value.PadRight(size, paddingChar); + truncated.CopyTo(buffer); + else + truncated.CopyTo(buffer.Slice(resultLength - truncated.Length)); - return value.PadLeft(size, paddingChar); + return buffer.ToString(); } } } diff --git a/src/OpenProtocolInterpreter/OpenProtocolInterpreter.csproj b/src/OpenProtocolInterpreter/OpenProtocolInterpreter.csproj index 501b0c46..ec52e964 100644 --- a/src/OpenProtocolInterpreter/OpenProtocolInterpreter.csproj +++ b/src/OpenProtocolInterpreter/OpenProtocolInterpreter.csproj @@ -3,7 +3,7 @@ netstandard2.0;net6.0;net8.0;net10.0 latest - 6.1.2 + 6.2.0 Converts the ugly package that came from Open Protocol to an object Copyright © 2026 Henrique Dal Bello Batista @@ -13,7 +13,7 @@ MIT CSharp Open Protocol Atlas Copco true - See release notes at: https://github.com/Rickedb/OpenProtocolInterpreter/releases/tag/6.1.0 + See release notes at: https://github.com/Rickedb/OpenProtocolInterpreter/releases/tag/6.2.0 icon.png @@ -35,4 +35,8 @@ + + + + diff --git a/src/OpenProtocolInterpreter/PLCUserData/Mid0240.cs b/src/OpenProtocolInterpreter/PLCUserData/Mid0240.cs index df0b690f..d99d79b3 100644 --- a/src/OpenProtocolInterpreter/PLCUserData/Mid0240.cs +++ b/src/OpenProtocolInterpreter/PLCUserData/Mid0240.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.PLCUserData { @@ -7,7 +8,7 @@ namespace OpenProtocolInterpreter.PLCUserData /// Used by the integrator to send user data input to the PLC. /// Message sent by: Integrator /// - /// Answer: Command accepted or + /// Answer: Command accepted or /// Command error, Invalid data, or Controller is not a sync master/station controller /// /// @@ -17,11 +18,8 @@ public class Mid0240 : Mid, IPLCUserData, IIntegrator, IAcceptableCommand, IDecl public IEnumerable DocumentedPossibleErrors => new Error[] { Error.InvalidData, Error.ControllerIsNotASyncMasterOrStationController }; - public string UserData - { - get => GetField(1, DataFields.UserData).Value; - set => GetField(1, DataFields.UserData).SetValue(value); - } + [StringDataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 200, HasPrefix = false)] + public string UserData { get; set; } public Mid0240() : base(MID, DEFAULT_REVISION) { } @@ -31,40 +29,22 @@ public Mid0240(Header header) : base(header) public override string Pack() { - var userDataField = GetField(1, DataFields.UserData); - if (userDataField.Value.Length > 200) + if (UserData.Length > 200) { - userDataField.Value = userDataField.Value.Substring(0, 200); + UserData = UserData.SafeSubstring(0, 200); } - userDataField.Size = userDataField.Value.Length; + GetField(revision: 1, field: 1).Size = UserData.Length; //Enforce size of user data return base.Pack(); } - public override Mid Parse(string package) - { - Header = ProcessHeader(package); - GetField(1, DataFields.UserData).Size = Header.Length - 20; - ProcessDataFields(package); - return this; - } - - protected override Dictionary> RegisterDatafields() + protected override void ProcessDataField(DataField dataField, ReadOnlySpan package) { - return new Dictionary>() + if (dataField.Field == 1) //UserData { - { - 1, new List() - { - DataField.Volatile(DataFields.UserData, 20, false) - } - } - }; - } - - internal enum DataFields - { - UserData + dataField.Size = Header.Length - dataField.Index; + } + base.ProcessDataField(dataField, package); } } } diff --git a/src/OpenProtocolInterpreter/PLCUserData/Mid0242.cs b/src/OpenProtocolInterpreter/PLCUserData/Mid0242.cs index e6288ff6..6f27013e 100644 --- a/src/OpenProtocolInterpreter/PLCUserData/Mid0242.cs +++ b/src/OpenProtocolInterpreter/PLCUserData/Mid0242.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.PLCUserData { @@ -12,11 +13,8 @@ public class Mid0242 : Mid, IPLCUserData, IController, IAcknowledgeable { public const int MID = 242; - public string UserData - { - get => GetField(1, DataFields.UserData).Value; - set => GetField(1, DataFields.UserData).SetValue(value); - } + [StringDataFieldDefinition(revision: 1, field: 1, Index = 20, HasPrefix = false)] + public string UserData { get; set; } public Mid0242() : base(MID, DEFAULT_REVISION) { @@ -29,34 +27,22 @@ public Mid0242(Header header) : base(header) public override string Pack() { - GetField(1, DataFields.UserData).Size = UserData.Length; - return base.Pack(); - } + if (UserData.Length > 200) + { + UserData = UserData.SafeSubstring(0, 200); + } - public override Mid Parse(string package) - { - Header = ProcessHeader(package); - GetField(1, DataFields.UserData).Size = Header.Length - 20; - ProcessDataFields(package); - return this; + GetField(revision: 1, field: 1).Size = UserData.Length; //Enforce size of user data + return base.Pack(); } - protected override Dictionary> RegisterDatafields() + protected override void ProcessDataField(DataField dataField, ReadOnlySpan package) { - return new Dictionary>() + if (dataField.Field == 1) //UserData { - { - 1, new List() - { - DataField.Volatile(DataFields.UserData, 20, false) - } - } - }; - } - - internal enum DataFields - { - UserData + dataField.Size = Header.Length - dataField.Index; + } + base.ProcessDataField(dataField, package); } } } diff --git a/src/OpenProtocolInterpreter/PLCUserData/Mid0245.cs b/src/OpenProtocolInterpreter/PLCUserData/Mid0245.cs index 34260ec6..48c11ffa 100644 --- a/src/OpenProtocolInterpreter/PLCUserData/Mid0245.cs +++ b/src/OpenProtocolInterpreter/PLCUserData/Mid0245.cs @@ -1,13 +1,14 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.PLCUserData { /// /// User data download with offset /// - /// Used by the integrator to send user data input to the PLC. + /// Used by the integrator to send user data input to the PLC. /// The difference compared to User data download is that with this MID it is possible - /// to specify an offset for the data written in the PLC. This makes it possible to have more than + /// to specify an offset for the data written in the PLC. This makes it possible to have more than /// one device writing user data to the PLC on different data areas. /// /// @@ -18,14 +19,14 @@ namespace OpenProtocolInterpreter.PLCUserData /// characters in the telegram. /// /// - /// Only data that is sent in the user data field will be written to the PLC, the remaining data will + /// Only data that is sent in the user data field will be written to the PLC, the remaining data will /// be untouched. /// /// /// This means for example that if the offset is 10 and the user data is 1234 the bytes with /// address 13010 and 13011 will be updated (to 0x12 and 0x34) and the rest of the area will be /// unchanged. - /// + /// /// Message sent by: Integrator /// /// Answer: Command accepted or @@ -45,16 +46,11 @@ public class Mid0245 : Mid, IPLCUserData, IIntegrator, IAcceptableCommand, IDecl Error.MidRevisionUnsupported }; - public int Offset - { - get => GetField(1, DataFields.Offset).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.Offset).SetValue(OpenProtocolConvert.ToString, value); - } - public string UserData - { - get => GetField(1, DataFields.UserData).Value; - set => GetField(1, DataFields.UserData).SetValue(value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 3, HasPrefix = false)] + public int Offset { get; set; } + + [StringDataFieldDefinition(revision: 1, field: 2, Index = 23, Size = 2, HasPrefix = false)] + public string UserData { get; set; } public Mid0245() : this(DEFAULT_REVISION) { @@ -75,46 +71,22 @@ public Mid0245(Header header) : base(header) public override string Pack() { - var userDataField = GetField(1, DataFields.UserData); - if (string.IsNullOrEmpty(userDataField.Value)) - { - userDataField.Value = " "; - } - else if (userDataField.Value.Length > 200) + if (UserData.Length > 200) { - userDataField.Value = userDataField.Value.Substring(0, 200); + UserData = UserData.SafeSubstring(0, 200); } - userDataField.Size = userDataField.Value.Length; + GetField(revision: 1, field: 2).Size = UserData.Length; //Enforce size of user data return base.Pack(); } - public override Mid Parse(string package) + protected override void ProcessDataField(DataField dataField, ReadOnlySpan package) { - Header = ProcessHeader(package); - GetField(1, DataFields.UserData).Size = Header.Length - 23; - ProcessDataFields(package); - return this; - } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() + if (dataField.Field == 2) //UserData { - { - 1, new List() - { - DataField.Number(DataFields.Offset, 20, 3, false), - DataField.Volatile(DataFields.UserData, 23, false) - } - } - }; - } - - internal enum DataFields - { - Offset, - UserData + dataField.Size = Header.Length - dataField.Index; + } + base.ProcessDataField(dataField, package); } } } diff --git a/src/OpenProtocolInterpreter/PLCUserData/PLCUserDataMessages.cs b/src/OpenProtocolInterpreter/PLCUserData/PLCUserDataMessages.cs index d8beafae..293e52b2 100644 --- a/src/OpenProtocolInterpreter/PLCUserData/PLCUserDataMessages.cs +++ b/src/OpenProtocolInterpreter/PLCUserData/PLCUserDataMessages.cs @@ -11,14 +11,14 @@ internal class PLCUserDataMessages : MessagesTemplate { public PLCUserDataMessages() : base() { - _templates = new Dictionary() + _templates = new Dictionary>() { - { Mid0240.MID, new MidCompiledInstance(typeof(Mid0240)) }, - { Mid0241.MID, new MidCompiledInstance(typeof(Mid0241)) }, - { Mid0242.MID, new MidCompiledInstance(typeof(Mid0242)) }, - { Mid0243.MID, new MidCompiledInstance(typeof(Mid0243)) }, - { Mid0244.MID, new MidCompiledInstance(typeof(Mid0244)) }, - { Mid0245.MID, new MidCompiledInstance(typeof(Mid0245)) } + { Mid0240.MID, new CompiledInstance(typeof(Mid0240)) }, + { Mid0241.MID, new CompiledInstance(typeof(Mid0241)) }, + { Mid0242.MID, new CompiledInstance(typeof(Mid0242)) }, + { Mid0243.MID, new CompiledInstance(typeof(Mid0243)) }, + { Mid0244.MID, new CompiledInstance(typeof(Mid0244)) }, + { Mid0245.MID, new CompiledInstance(typeof(Mid0245)) } }; } diff --git a/src/OpenProtocolInterpreter/ParameterSet/Mid0011.cs b/src/OpenProtocolInterpreter/ParameterSet/Mid0011.cs index 0a960eb7..14f538e1 100644 --- a/src/OpenProtocolInterpreter/ParameterSet/Mid0011.cs +++ b/src/OpenProtocolInterpreter/ParameterSet/Mid0011.cs @@ -1,5 +1,7 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; +using System.Runtime.InteropServices; namespace OpenProtocolInterpreter.ParameterSet { @@ -9,7 +11,7 @@ namespace OpenProtocolInterpreter.ParameterSet /// The transmission of all the valid parameter set IDs of the controller. In the revision 000-001 the data /// field contains the number of valid parameter sets currently present in the controller, and the ID of each /// parameter set present.In revision 2 is the number of stages on each Pset/Mset added. - /// + /// /// Message sent by: Controller /// Answer: None /// @@ -17,16 +19,15 @@ public class Mid0011 : Mid, IParameterSet, IController { public const int MID = 11; - public int TotalParameterSets - { - get => ParameterSets.Count; - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 3, HasPrefix = false)] + public int TotalParameterSets { get; set; } - public List ParameterSets { get; set; } + [Int32CollectionDefinition(revision: 1, field: 2, Index = 23, EachFieldSize = 3, HasPrefix = false)] + public List ParameterSets { get; set; } = new List(); public Mid0011() : this(new Header() { - Mid = MID, + Mid = MID, Revision = DEFAULT_REVISION }) { @@ -37,60 +38,19 @@ public Mid0011(Header header) : base(header) ParameterSets ??= []; } - public override string Pack() - { - GetField(1, DataFields.TotalParameterSets).SetValue(OpenProtocolConvert.ToString, TotalParameterSets); - var eachParameterField = GetField(1, DataFields.EachParameterSet); - eachParameterField.Value = PackParameterSetIdList(); - eachParameterField.Size = eachParameterField.Value.Length; - return base.Pack(); - } - - public override Mid Parse(string package) - { - Header = ProcessHeader(package); - - GetField(1, DataFields.EachParameterSet).Size = Header.Length - GetField(1, DataFields.EachParameterSet).Index; - ProcessDataFields(package); - ParameterSets = ParseParameterSetIdList(GetField(1, DataFields.EachParameterSet).Value).ToList(); - return this; - } - - protected virtual string PackParameterSetIdList() + protected override void ProcessDataField(DataField dataField, ReadOnlySpan package) { - string pack = string.Empty; - foreach (var v in ParameterSets) - pack += OpenProtocolConvert.ToString('0', 3, PaddingOrientation.LeftPadded, v); - return pack; - } - - protected virtual List ParseParameterSetIdList(string section) - { - var list = new List(); - for (int i = 0; i < section.Length; i += 3) - list.Add(OpenProtocolConvert.ToInt32(section.Substring(i, 3))); - - return list; - } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() + if (dataField.Field == 2) //ParameterSets { - { - 1, new List() - { - DataField.Number(DataFields.TotalParameterSets, 20, 3, false), - new(DataFields.EachParameterSet, 23, 3, false) - } - } - }; + dataField.Size = TotalParameterSets * 3; + } + base.ProcessDataField(dataField, package); } - - protected enum DataFields + public override string Pack() { - TotalParameterSets, - EachParameterSet + TotalParameterSets = ParameterSets?.Count ?? 0; //Enforce the number of parameter sets to match the list count + GetField(nameof(ParameterSets)).Size = TotalParameterSets * 3; + return base.Pack(); } } } diff --git a/src/OpenProtocolInterpreter/ParameterSet/Mid0012.cs b/src/OpenProtocolInterpreter/ParameterSet/Mid0012.cs index 4ce48402..fa653764 100644 --- a/src/OpenProtocolInterpreter/ParameterSet/Mid0012.cs +++ b/src/OpenProtocolInterpreter/ParameterSet/Mid0012.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.ParameterSet { @@ -7,7 +8,7 @@ namespace OpenProtocolInterpreter.ParameterSet /// Request to upload parameter set data from the controller. /// Message sent by: Integrator /// - /// Answer: Parameter set data upload reply, or + /// Answer: Parameter set data upload reply, or /// Command error, Parameter set not present /// /// @@ -17,16 +18,10 @@ public class Mid0012 : Mid, IParameterSet, IIntegrator, IAnswerableBy, public IEnumerable DocumentedPossibleErrors => new Error[] { Error.ParameterSetIdNotPresent }; - public int ParameterSetId - { - get => GetField(1, DataFields.ParameterSetId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.ParameterSetId).SetValue(OpenProtocolConvert.ToString, value); - } - public int ParameterSetFileVersion - { - get => GetField(3, DataFields.PSetFileVersion).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(3, DataFields.PSetFileVersion).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 3, HasPrefix = false)] + public int ParameterSetId { get; set; } + [Int32DataFieldDefinition(revision: 3, field: 3, Index = 23, Size = 8, HasPrefix = false)] + public int ParameterSetFileVersion { get; set; } public Mid0012() : this(DEFAULT_REVISION) { @@ -44,32 +39,5 @@ public Mid0012(int revision) : this(new Header() public Mid0012(Header header) : base(header) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.ParameterSetId, 20, 3, false) - } - }, - { - 3, new List() - { - DataField.Number(DataFields.PSetFileVersion, 23, 8, false) - } - }, - }; - } - - protected enum DataFields - { - //Revision 1-2 - ParameterSetId, - //Revision 3-4 - PSetFileVersion - } } } diff --git a/src/OpenProtocolInterpreter/ParameterSet/Mid0013.cs b/src/OpenProtocolInterpreter/ParameterSet/Mid0013.cs index 06bfba2f..f2048abe 100644 --- a/src/OpenProtocolInterpreter/ParameterSet/Mid0013.cs +++ b/src/OpenProtocolInterpreter/ParameterSet/Mid0013.cs @@ -13,73 +13,34 @@ public class Mid0013 : Mid, IParameterSet, IController { public const int MID = 13; - public int ParameterSetId - { - get => GetField(1, DataFields.ParameterSetId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.ParameterSetId).SetValue(OpenProtocolConvert.ToString, value); - } - public string ParameterSetName - { - get => GetField(1, DataFields.ParameterSetName).Value; - set => GetField(1, DataFields.ParameterSetName).SetValue(value); - } - public RotationDirection RotationDirection - { - get => (RotationDirection)GetField(1, DataFields.RotationDirection).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.RotationDirection).SetValue(OpenProtocolConvert.ToString, value); - } - public int BatchSize - { - get => GetField(1, DataFields.BatchSize).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.BatchSize).SetValue(OpenProtocolConvert.ToString, value); - } - public decimal MinTorque - { - get => GetField(1, DataFields.MinTorque).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(1, DataFields.MinTorque).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal MaxTorque - { - get => GetField(1, DataFields.MaxTorque).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(1, DataFields.MaxTorque).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal TorqueFinalTarget - { - get => GetField(1, DataFields.TorqueFinalTarget).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(1, DataFields.TorqueFinalTarget).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public int MinAngle - { - get => GetField(1, DataFields.MinAngle).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.MinAngle).SetValue(OpenProtocolConvert.ToString, value); - } - public int MaxAngle - { - get => GetField(1, DataFields.MaxAngle).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.MaxAngle).SetValue(OpenProtocolConvert.ToString, value); - } - public int AngleFinalTarget - { - get => GetField(1, DataFields.AngleFinalTarget).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.AngleFinalTarget).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 3)] + public int ParameterSetId { get; set; } + [StringDataFieldDefinition(revision: 1, field: 2, Index = 25, Size = 25)] + public string ParameterSetName { get; set; } + [Int32DataFieldDefinition(revision: 1, field: 3, Index = 52, Size = 1)] + public RotationDirection RotationDirection { get; set; } + [Int32DataFieldDefinition(revision: 1, field: 4, Index = 55, Size = 2)] + public int BatchSize { get; set; } + [TruncatedDecimalDataFieldDefinition(revision: 1, field: 5, Index = 59, Size = 6)] + public decimal MinTorque { get; set; } + [TruncatedDecimalDataFieldDefinition(revision: 1, field: 6, Index = 67, Size = 6)] + public decimal MaxTorque { get; set; } + [TruncatedDecimalDataFieldDefinition(revision: 1, field: 7, Index = 75, Size = 6)] + public decimal TorqueFinalTarget { get; set; } + [Int32DataFieldDefinition(revision: 1, field: 8, Index = 83, Size = 5)] + public int MinAngle { get; set; } + [Int32DataFieldDefinition(revision: 1, field: 9, Index = 90, Size = 5)] + public int MaxAngle { get; set; } + [Int32DataFieldDefinition(revision: 1, field: 10, Index = 97, Size = 5)] + public int AngleFinalTarget { get; set; } //Rev 2 - public decimal FirstTarget - { - get => GetField(2, DataFields.FirstTarget).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(2, DataFields.FirstTarget).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal StartFinalAngle - { - get => GetField(2, DataFields.StartFinalTarget).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(2, DataFields.StartFinalTarget).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } + [TruncatedDecimalDataFieldDefinition(revision: 2, field: 11, Index = 104, Size = 6)] + public decimal FirstTarget { get; set; } + [TruncatedDecimalDataFieldDefinition(revision: 2, field: 12, Index = 112, Size = 6)] + public decimal StartFinalAngle { get; set; } //Rev 5 - public DateTime LastChangeInParameterSet - { - get => GetField(5, DataFields.LastChangeInParameterSet).GetValue(OpenProtocolConvert.ToDateTime); - set => GetField(5, DataFields.LastChangeInParameterSet).SetValue(OpenProtocolConvert.ToString, value); - } + [TimestampDataFieldDefinition(revision: 5, field: 13, Index = 120)] + public DateTime LastChangeInParameterSet { get; set; } public Mid0013() : this(DEFAULT_REVISION) { @@ -88,69 +49,15 @@ public Mid0013() : this(DEFAULT_REVISION) public Mid0013(Header header) : base(header) { - + } public Mid0013(int revision) : this(new Header() { - Mid = MID, + Mid = MID, Revision = revision }) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.ParameterSetId, 20, 3), - DataField.String(DataFields.ParameterSetName, 25, 25), - DataField.Number(DataFields.RotationDirection, 52, 1), - DataField.Number(DataFields.BatchSize, 55, 2), - DataField.Number(DataFields.MinTorque, 59, 6), - DataField.Number(DataFields.MaxTorque, 67, 6), - DataField.Number(DataFields.TorqueFinalTarget, 75, 6), - DataField.Number(DataFields.MinAngle, 83, 5), - DataField.Number(DataFields.MaxAngle, 90, 5), - DataField.Number(DataFields.AngleFinalTarget, 97, 5) - } - }, - { - 2, new List() - { - DataField.Number(DataFields.FirstTarget, 104, 6), - DataField.Number(DataFields.StartFinalTarget, 112, 6) - } - }, - { - 5, new List() - { - DataField.Timestamp(DataFields.LastChangeInParameterSet, 120), - } - } - }; - } - - protected enum DataFields - { - ParameterSetId, - ParameterSetName, - RotationDirection, - BatchSize, - MinTorque, - MaxTorque, - TorqueFinalTarget, - MinAngle, - MaxAngle, - AngleFinalTarget, - //Rev 2 - FirstTarget, - StartFinalTarget, - //Rev 5 - LastChangeInParameterSet - } } } diff --git a/src/OpenProtocolInterpreter/ParameterSet/Mid0015.cs b/src/OpenProtocolInterpreter/ParameterSet/Mid0015.cs index f35bcbac..3d435ae5 100644 --- a/src/OpenProtocolInterpreter/ParameterSet/Mid0015.cs +++ b/src/OpenProtocolInterpreter/ParameterSet/Mid0015.cs @@ -1,14 +1,16 @@ -using System; +using System; using System.Collections.Generic; +using System.Linq; +using System.Text; namespace OpenProtocolInterpreter.ParameterSet { /// /// Parameter set selected /// - /// A new parameter set is selected in the controller. - /// The message includes the ID of the parameter set selected as well as the date and time of the - /// last change in the parameter set settings. This message is also sent as an immediate response to + /// A new parameter set is selected in the controller. + /// The message includes the ID of the parameter set selected as well as the date and time of the + /// last change in the parameter set settings. This message is also sent as an immediate response to /// Parameter set selected subscribe. /// /// Message sent by: Controller @@ -18,72 +20,66 @@ public class Mid0015 : Mid, IParameterSet, IController, IAcknowledgeable GetField(Header.StandardizedRevision, DataFields.ParameterSetId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(Header.StandardizedRevision, DataFields.ParameterSetId).SetValue(OpenProtocolConvert.ToString, value); - } - public DateTime LastChangeInParameterSet - { - get => GetField(Header.StandardizedRevision, DataFields.LastChangeInParameterSet).GetValue(OpenProtocolConvert.ToDateTime); - set => GetField(Header.StandardizedRevision, DataFields.LastChangeInParameterSet).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 3, HasPrefix = false)] + [Int32DataFieldDefinition(revision: 2, field: 1, Index = 20, Size = 3)] + [Int32DataFieldDefinition(revision: 3, field: 1, Index = 20, Size = 3)] + public int ParameterSetId { get; set; } + + [TimestampDataFieldDefinition(revision: 1, field: 2, Index = 23, HasPrefix = false)] + [TimestampDataFieldDefinition(revision: 2, field: 3, Index = 52)] + [TimestampDataFieldDefinition(revision: 3, field: 3, Index = 52)] + public DateTime LastChangeInParameterSet { get; set; } + //Rev 2 - public string ParameterSetName - { - get => GetField(2, DataFields.ParameterSetName).Value; - set => GetField(2, DataFields.ParameterSetName).SetValue(value); - } - public RotationDirection RotationDirection - { - get => (RotationDirection)GetField(2, DataFields.RotationDirection).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.RotationDirection).SetValue(OpenProtocolConvert.ToString, value); - } - public int BatchSize - { - get => GetField(2, DataFields.BatchSize).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.BatchSize).SetValue(OpenProtocolConvert.ToString, value); - } - public decimal MinTorque - { - get => GetField(2, DataFields.TorqueMin).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(2, DataFields.TorqueMin).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal MaxTorque - { - get => GetField(2, DataFields.TorqueMax).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(2, DataFields.TorqueMax).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal TorqueFinalTarget - { - get => GetField(2, DataFields.TorqueFinalTarget).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(2, DataFields.TorqueFinalTarget).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public int MinAngle - { - get => GetField(2, DataFields.AngleMin).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.AngleMin).SetValue(OpenProtocolConvert.ToString, value); - } - public int MaxAngle - { - get => GetField(2, DataFields.AngleMax).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.AngleMax).SetValue(OpenProtocolConvert.ToString, value); - } - public int AngleFinalTarget - { - get => GetField(2, DataFields.FinalAngleTarget).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.FinalAngleTarget).SetValue(OpenProtocolConvert.ToString, value); - } - public decimal FirstTarget - { - get => GetField(2, DataFields.FirstTarget).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(2, DataFields.FirstTarget).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal StartFinalAngle - { - get => GetField(2, DataFields.StartFinalAngle).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(2, DataFields.StartFinalAngle).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } + [StringDataFieldDefinition(revision: 2, field: 2, Index = 25, Size = 25)] + [StringDataFieldDefinition(revision: 3, field: 2, Index = 25, Size = 25)] + public string ParameterSetName { get; set; } + + [Int32DataFieldDefinition(revision: 2, field: 4, Index = 73, Size = 1)] + [Int32DataFieldDefinition(revision: 3, field: 4, Index = 73, Size = 1)] + public RotationDirection RotationDirection { get; set; } + + [Int32DataFieldDefinition(revision: 2, field: 5, Index = 76, Size = 2)] + [Int32DataFieldDefinition(revision: 3, field: 5, Index = 76, Size = 2)] + public int BatchSize { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 2, field: 6, Index = 80, Size = 6)] + [TruncatedDecimalDataFieldDefinition(revision: 3, field: 6, Index = 80, Size = 6)] + public decimal MinTorque { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 2, field: 7, Index = 88, Size = 6)] + [TruncatedDecimalDataFieldDefinition(revision: 3, field: 7, Index = 88, Size = 6)] + public decimal MaxTorque { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 2, field: 8, Index = 96, Size = 6)] + [TruncatedDecimalDataFieldDefinition(revision: 3, field: 8, Index = 96, Size = 6)] + public decimal TorqueFinalTarget { get; set; } + + [Int32DataFieldDefinition(revision: 2, field: 9, Index = 104, Size = 5)] + [Int32DataFieldDefinition(revision: 3, field: 9, Index = 104, Size = 5)] + public int MinAngle { get; set; } + + [Int32DataFieldDefinition(revision: 2, field: 10, Index = 111, Size = 5)] + [Int32DataFieldDefinition(revision: 3, field: 10, Index = 111, Size = 5)] + public int MaxAngle { get; set; } + + [Int32DataFieldDefinition(revision: 2, field: 11, Index = 118, Size = 5)] + [Int32DataFieldDefinition(revision: 3, field: 11, Index = 118, Size = 5)] + public int AngleFinalTarget { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 2, field: 12, Index = 125, Size = 6)] + [TruncatedDecimalDataFieldDefinition(revision: 3, field: 12, Index = 125, Size = 6)] + public decimal FirstTarget { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 2, field: 13, Index = 133, Size = 6)] + [TruncatedDecimalDataFieldDefinition(revision: 3, field: 13, Index = 133, Size = 6)] + public decimal StartFinalAngle { get; set; } + + [Int32DataFieldDefinition(revision: 3, field: 14, Index = 141, Size = 4)] + public int SelectedIdentifierNumber { get; set; } + + [StringDataFieldDefinition(revision: 3, field: 15, Index = 147, Size = 25)] + public string JointId { get; set; } public Mid0015() : this(DEFAULT_REVISION) { @@ -108,74 +104,39 @@ public Mid0015(int revision) : this(new Header() protected override string BuildHeader() { - Header.Length = 20; - foreach (var dataField in RevisionsByFields[Header.StandardizedRevision]) - Header.Length += (dataField.HasPrefix ? 2 : 0) + dataField.Size; + Header.Length = Header.DefaultSize; + if (RevisionsByFields.Any()) + { + var fields = DataFieldsByRevision(); + Header.Length += fields.Sum(x => x.TotalSize); + } return Header.ToString(); } + public override string Pack() { - int index = 1; - return BuildHeader() + base.Pack(Header.StandardizedRevision, ref index); - } + var builder = new StringBuilder(); + var fields = DataFieldsByRevision().OrderBy(f => f.Field).ToList(); - public override Mid Parse(string package) - { - Header = ProcessHeader(package); - ProcessDataFields(Header.StandardizedRevision, package); - return this; + builder.Append(BuildHeader()); + builder.Append(Pack(fields)); + + return builder.ToString(); } - protected override Dictionary> RegisterDatafields() + protected override void ProcessDataFields(ReadOnlySpan package) { - return new Dictionary>() + foreach (var field in DataFieldsByRevision()) { - { - 1, new List() - { - DataField.Number(DataFields.ParameterSetId, 20, 3, false), - DataField.Timestamp(DataFields.LastChangeInParameterSet, 23, false) - } - }, - { - 2, new List() - { - DataField.Number(DataFields.ParameterSetId, 20, 3), - DataField.String(DataFields.ParameterSetName, 25, 25), - DataField.Timestamp(DataFields.LastChangeInParameterSet, 52), - DataField.Number(DataFields.RotationDirection, 73, 1), - DataField.Number(DataFields.BatchSize, 76, 2), - DataField.Number(DataFields.TorqueMin, 80, 6), - DataField.Number(DataFields.TorqueMax, 88, 6), - DataField.Number(DataFields.TorqueFinalTarget, 96, 6), - DataField.Number(DataFields.AngleMin, 104, 5), - DataField.Number(DataFields.AngleMax, 111, 5), - DataField.Number(DataFields.FinalAngleTarget, 118, 5), - DataField.Number(DataFields.FirstTarget, 125, 6), - DataField.Number(DataFields.StartFinalAngle, 133, 6) - } - } - }; + ProcessDataField(field, package); + } } - - protected enum DataFields + private IEnumerable DataFieldsByRevision() { - ParameterSetId, - LastChangeInParameterSet, - //Rev 2 - ParameterSetName, - RotationDirection, - BatchSize, - TorqueMin, - TorqueMax, - TorqueFinalTarget, - AngleMin, - AngleMax, - FinalAngleTarget, - FirstTarget, - StartFinalAngle + foreach (var dataField in RevisionsByFields[Header.StandardizedRevision].OrderBy(x => x.Field)) + yield return dataField; } } } diff --git a/src/OpenProtocolInterpreter/ParameterSet/Mid0018.cs b/src/OpenProtocolInterpreter/ParameterSet/Mid0018.cs index 80eda582..28ca9a83 100644 --- a/src/OpenProtocolInterpreter/ParameterSet/Mid0018.cs +++ b/src/OpenProtocolInterpreter/ParameterSet/Mid0018.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.ParameterSet { @@ -6,7 +7,7 @@ namespace OpenProtocolInterpreter.ParameterSet /// Select Parameter set /// Message sent by: Integrator /// - /// Answer: Command accepted or + /// Answer: Command accepted or /// Command error, Parameter set can not be set /// /// @@ -16,15 +17,12 @@ public class Mid0018 : Mid, IParameterSet, IIntegrator, IAcceptableCommand, IDec public IEnumerable DocumentedPossibleErrors => new Error[] { Error.ParameterSetCannotBeSet }; - public int ParameterSetId - { - get => GetField(1, DataFields.ParameterSetId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.ParameterSetId).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 3, HasPrefix = false)] + public int ParameterSetId { get; set; } public Mid0018() : this(new Header() { - Mid = MID, + Mid = MID, Revision = DEFAULT_REVISION }) { @@ -33,24 +31,5 @@ public Mid0018() : this(new Header() public Mid0018(Header header) : base(header) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.ParameterSetId, 20, 3, false) - } - } - }; - } - - - protected enum DataFields - { - ParameterSetId - } } } diff --git a/src/OpenProtocolInterpreter/ParameterSet/Mid0019.cs b/src/OpenProtocolInterpreter/ParameterSet/Mid0019.cs index 50af294a..1778ea41 100644 --- a/src/OpenProtocolInterpreter/ParameterSet/Mid0019.cs +++ b/src/OpenProtocolInterpreter/ParameterSet/Mid0019.cs @@ -1,4 +1,7 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; namespace OpenProtocolInterpreter.ParameterSet { @@ -7,7 +10,7 @@ namespace OpenProtocolInterpreter.ParameterSet /// This message gives the possibility to set the batch size of a parameter set at run time. /// Message sent by: Integrator /// - /// Answer: Command accepted or + /// Answer: Command accepted or /// Command error, Invalid data /// /// @@ -17,16 +20,13 @@ public class Mid0019 : Mid, IParameterSet, IIntegrator, IAcceptableCommand, IDec public IEnumerable DocumentedPossibleErrors => new Error[] { Error.InvalidData }; - public int ParameterSetId - { - get => GetField(1, DataFields.ParameterSetId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.ParameterSetId).SetValue(OpenProtocolConvert.ToString, value); - } - public int BatchSize - { - get => GetField(1, DataFields.BatchSize).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.BatchSize).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 3, HasPrefix = false)] + [Int32DataFieldDefinition(revision: 2, field: 1, Index = 20, Size = 3, HasPrefix = false)] + public int ParameterSetId { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 2, Index = 23, Size = 2, HasPrefix = false)] + [Int32DataFieldDefinition(revision: 2, field: 2, Index = 23, Size = 4, HasPrefix = false)] + public int BatchSize { get; set; } public Mid0019() : this(new Header() { @@ -40,51 +40,37 @@ public Mid0019(Header header) : base(header) { } - public override string Pack() + protected override string BuildHeader() { - HandleRevision(); - return base.Pack(); - } - - public override Mid Parse(string package) - { - Header = ProcessHeader(package); - HandleRevision(); - ProcessDataFields(package); - return this; - } - - private void HandleRevision() - { - var batchSizeField = GetField(1, DataFields.BatchSize); - if (Header.Revision > 1) - { - batchSizeField.Size = 4; - } - else + Header.Length = Header.DefaultSize; + if (RevisionsByFields.Any()) { - batchSizeField.Size = 2; + var fields = DataFieldsByRevision(); + Header.Length += fields.Sum(x => x.TotalSize); } + + return Header.ToString(); } - protected override Dictionary> RegisterDatafields() + public override string Pack() { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.ParameterSetId, 20, 3, false), - DataField.Number(DataFields.BatchSize, 23, 2, false), - } - } - }; + var builder = new StringBuilder(); + var fields = DataFieldsByRevision().ToList(); + + builder.Append(BuildHeader()); + builder.Append(Pack(fields)); + + return builder.ToString(); } - protected enum DataFields + + protected override void ProcessDataFields(ReadOnlySpan package) { - ParameterSetId, - BatchSize + var fields = DataFieldsByRevision().ToList(); + base.ProcessDataFields(fields, package); } + + private IEnumerable DataFieldsByRevision() + => RevisionsByFields[Header.StandardizedRevision]; } } diff --git a/src/OpenProtocolInterpreter/ParameterSet/Mid0020.cs b/src/OpenProtocolInterpreter/ParameterSet/Mid0020.cs index c50e0eaf..2b28e54a 100644 --- a/src/OpenProtocolInterpreter/ParameterSet/Mid0020.cs +++ b/src/OpenProtocolInterpreter/ParameterSet/Mid0020.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.ParameterSet { @@ -7,7 +8,7 @@ namespace OpenProtocolInterpreter.ParameterSet /// This message gives the possibility to reset the batch counter of the running parameter set, at run time. /// Message sent by: Integrator /// - /// Answer: Command accepted or + /// Answer: Command accepted or /// Command error, Invalid data, or Parameter set not running /// /// @@ -17,11 +18,8 @@ public class Mid0020 : Mid, IParameterSet, IIntegrator, IAcceptableCommand, IDec public IEnumerable DocumentedPossibleErrors => new Error[] { Error.InvalidData, Error.ParameterSetNotRunning }; - public int ParameterSetId - { - get => GetField(1, DataFields.ParameterSetId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.ParameterSetId).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 3, HasPrefix = false)] + public int ParameterSetId { get; set; } public Mid0020() : this(new Header() { @@ -34,23 +32,5 @@ public Mid0020() : this(new Header() public Mid0020(Header header) : base(header) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.ParameterSetId, 20, 3, false) - } - } - }; - } - - protected enum DataFields - { - ParameterSetId - } } } diff --git a/src/OpenProtocolInterpreter/ParameterSet/Mid0022.cs b/src/OpenProtocolInterpreter/ParameterSet/Mid0022.cs index 5a1419b7..1979fc87 100644 --- a/src/OpenProtocolInterpreter/ParameterSet/Mid0022.cs +++ b/src/OpenProtocolInterpreter/ParameterSet/Mid0022.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System; namespace OpenProtocolInterpreter.ParameterSet { @@ -12,15 +12,12 @@ public class Mid0022 : Mid, IParameterSet, IController, IAcknowledgeable GetField(1, DataFields.RelayStatus).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(1, DataFields.RelayStatus).SetValue(OpenProtocolConvert.ToString, value); - } + [BooleanDataFieldDefinition(revision: 1, field: 1, Index = 20, HasPrefix = false)] + public bool RelayStatus { get; set; } public Mid0022() : this(new Header() { - Mid = MID, + Mid = MID, Revision = DEFAULT_REVISION }) { @@ -29,23 +26,5 @@ public Mid0022() : this(new Header() public Mid0022(Header header) : base(header) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Boolean(DataFields.RelayStatus, 20, false) - } - } - }; - } - - protected enum DataFields - { - RelayStatus - } } } diff --git a/src/OpenProtocolInterpreter/ParameterSet/Mid2501.cs b/src/OpenProtocolInterpreter/ParameterSet/Mid2501.cs index acd8bc3c..681039e6 100644 --- a/src/OpenProtocolInterpreter/ParameterSet/Mid2501.cs +++ b/src/OpenProtocolInterpreter/ParameterSet/Mid2501.cs @@ -1,13 +1,48 @@ namespace OpenProtocolInterpreter.ParameterSet { + public class Mid2501ExtraDataRequest : ExtraData, IExtraDataRequest, IExtraDataSubscription, IExtraDataUnsubscription + { + public override int Mid => Mid2501.MID; + + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 0, Size = 4, HasPrefix = false)] + public int ProgramId { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 2, Index = 4, Size = 3, HasPrefix = false)] + public NodeType NodeType { get; set; } + + public Mid2501ExtraDataRequest() + { + + } + + public Mid2501ExtraDataRequest(int revision) : base(revision) + { + + } + } + /// /// MID: Tightening Program Message Upload - /// Description: + /// Description: /// Reset the subscription for Lock at batch done. /// Message sent by: Integrator /// Answer: MID 0005 Command accepted or MID 0004 Command error /// - class Mid2501 + public class Mid2501 : Mid, IParameterSet, IIntegrator { + public const int MID = 2501; + + public Mid2501() : this(new Header() + { + Mid = MID, + Revision = DEFAULT_REVISION + }) + { + + } + + public Mid2501(Header header) : base(header) + { + } } } diff --git a/src/OpenProtocolInterpreter/ParameterSet/Mid2502.cs b/src/OpenProtocolInterpreter/ParameterSet/Mid2502.cs new file mode 100644 index 00000000..d311c2ba --- /dev/null +++ b/src/OpenProtocolInterpreter/ParameterSet/Mid2502.cs @@ -0,0 +1,23 @@ +namespace OpenProtocolInterpreter.ParameterSet +{ + public class Mid2502 : Mid, IController, IParameterSet + { + public const int MID = 2502; + + public Mid2502() : this(DEFAULT_REVISION) + { + } + + public Mid2502(Header header) : base(header) + { + } + + public Mid2502(int revision) : this(new Header() + { + Mid = MID, + Revision = revision + }) + { + } + } +} diff --git a/src/OpenProtocolInterpreter/ParameterSet/Mid2503.cs b/src/OpenProtocolInterpreter/ParameterSet/Mid2503.cs new file mode 100644 index 00000000..aee6d8f7 --- /dev/null +++ b/src/OpenProtocolInterpreter/ParameterSet/Mid2503.cs @@ -0,0 +1,40 @@ +using System; + +namespace OpenProtocolInterpreter.ParameterSet +{ + public class Mid2503 : Mid, IIntegrator, IParameterSet + { + public const int MID = 2503; + + [StringDataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 0, HasPrefix = false)] + public string Password { get; set; } + + public Mid2503() : this(DEFAULT_REVISION) + { + } + + public Mid2503(Header header) : base(header) + { + } + + public Mid2503(int revision) : this(new Header() + { + Mid = MID, + Revision = revision + }) + { + } + + public override string Pack() + { + GetField(nameof(Password)).Size = Password?.Length ?? 0; + return base.Pack(); + } + + public override Mid Parse(ReadOnlySpan package) + { + GetField(nameof(Password)).Size = Header.Length - Header.DefaultSize; + return base.Parse(package); + } + } +} diff --git a/src/OpenProtocolInterpreter/ParameterSet/Mid2504.cs b/src/OpenProtocolInterpreter/ParameterSet/Mid2504.cs index f71e07ef..76e1d147 100644 --- a/src/OpenProtocolInterpreter/ParameterSet/Mid2504.cs +++ b/src/OpenProtocolInterpreter/ParameterSet/Mid2504.cs @@ -10,21 +10,18 @@ namespace OpenProtocolInterpreter.ParameterSet /// Command error, Dynamic Job cannot be created, non-existing pset /// /// - public class Mid2504 : Mid, IParameterSet, IIntegrator, IAcceptableCommand, IDeclinableCommand + public class Mid2504 : Mid, IParameterSet, IIntegrator, IAcceptableCommand, IDeclinableCommand, IExtraDataRequest { public const int MID = 2504; public IEnumerable DocumentedPossibleErrors => new Error[] { Error.ParameterSetIdNotPresent }; - public int ParameterSetId - { - get => GetField(1, DataFields.ParameterSetId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.ParameterSetId).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 3, HasPrefix = false)] + public int ParameterSetId { get; set; } public Mid2504() : this(new Header() { - Mid = MID, + Mid = MID, Revision = DEFAULT_REVISION }) { @@ -34,23 +31,5 @@ public Mid2504() : this(new Header() public Mid2504(Header header) : base(header) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.ParameterSetId, 20, 3, false) - } - } - }; - } - - protected enum DataFields - { - ParameterSetId - } } } diff --git a/src/OpenProtocolInterpreter/ParameterSet/Mid2505.cs b/src/OpenProtocolInterpreter/ParameterSet/Mid2505.cs index 61da610b..6b36504d 100644 --- a/src/OpenProtocolInterpreter/ParameterSet/Mid2505.cs +++ b/src/OpenProtocolInterpreter/ParameterSet/Mid2505.cs @@ -1,5 +1,7 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; +using System.Runtime.InteropServices; namespace OpenProtocolInterpreter.ParameterSet { @@ -11,27 +13,24 @@ namespace OpenProtocolInterpreter.ParameterSet /// Command error, Dynamic Pset cannot be created, non-existing pset /// /// - /// A dynamic pset is created from a preexisting Pset in the Controller and selected for tightenings. + /// A dynamic pset is created from a preexisting Pset in the Controller and selected for tightenings. /// The message can substitute Pset selection, Set Identifier, Reset All Identifier, Reset Latest Identifier, Set Batch Size, Disable Tool and Enable Tool. /// /// - public class Mid2505 : Mid, IParameterSet, IIntegrator, IAcceptableCommand, IDeclinableCommand + public class Mid2505 : Mid, IParameterSet, IIntegrator, IAcceptableCommand, IDeclinableCommand, IExtraDataRequest { public const int MID = 2505; public IEnumerable DocumentedPossibleErrors => Enumerable.Empty(); - public int ParameterSetId - { - get => GetField(1, DataFields.ParameterSetId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.ParameterSetId).SetValue(OpenProtocolConvert.ToString, value); - } - public int NumberOfParameterDataFields - { - get => GetField(1, DataFields.NumberOfParameterDataFields).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.NumberOfParameterDataFields).SetValue(OpenProtocolConvert.ToString, value); - } - public List VariableDataFields { get; set; } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 3, HasPrefix = false)] + public int ParameterSetId { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 2, Index = 23, Size = 3, HasPrefix = false)] + public int NumberOfParameterDataFields { get; set; } + + [VariableDataFieldCollectionDefinition(revision: 1, field: 3, Index = 26, HasPrefix = false)] + public List VariableDataFields { get; set; } = new List(); public Mid2505() : this(DEFAULT_REVISION) { @@ -53,40 +52,18 @@ public Mid2505(Header header) : base(header) public override string Pack() { - GetField(1, DataFields.DataFields).Value = OpenProtocolConvert.ToString(VariableDataFields); + NumberOfParameterDataFields = VariableDataFields?.Count ?? 0; //Enforce list size even if modified + GetField(revision: 1, field: 3).Size = VariableDataFields?.Sum(x => x.TotalSize) ?? 0; //Enforce size of variable data fields return base.Pack(); } - public override Mid Parse(string package) + protected override void ProcessDataField(DataField dataField, ReadOnlySpan package) { - Header = ProcessHeader(package); - var dataFieldsField = GetField(1, DataFields.DataFields); - dataFieldsField.Size = Header.Length - dataFieldsField.Index; - ProcessDataFields(package); - VariableDataFields = VariableDataField.ParseAll(dataFieldsField.Value).ToList(); - return this; - } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() + if (dataField.Field == 3) //VariableDataFields { - { - 1, new List() - { - DataField.Number(DataFields.ParameterSetId, 20, 3, false), - DataField.Number(DataFields.NumberOfParameterDataFields, 23, 3, false), - DataField.Volatile(DataFields.DataFields, 26, false) - } - } - }; - } - - protected enum DataFields - { - ParameterSetId, - NumberOfParameterDataFields, - DataFields + dataField.Size = Header.Length - dataField.Index; + } + base.ProcessDataField(dataField, package); } } } diff --git a/src/OpenProtocolInterpreter/ParameterSet/Mid2506.cs b/src/OpenProtocolInterpreter/ParameterSet/Mid2506.cs index 8bdc6a40..de95dba6 100644 --- a/src/OpenProtocolInterpreter/ParameterSet/Mid2506.cs +++ b/src/OpenProtocolInterpreter/ParameterSet/Mid2506.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.ParameterSet { @@ -13,22 +14,17 @@ namespace OpenProtocolInterpreter.ParameterSet /// Note: If a running program is included in MID 2506 deletion the program shall finish before deletion. /// Note: Deleting programs included in other nodes may give unwanted behaviour. It will behave identical to a manual delete of the program. /// - public class Mid2506 : Mid, IParameterSet, IIntegrator, IAcceptableCommand, IDeclinableCommand + public class Mid2506 : Mid, IParameterSet, IIntegrator, IAcceptableCommand, IDeclinableCommand, IExtraDataRequest { public const int MID = 2506; public IEnumerable DocumentedPossibleErrors => []; - public int ProgramId - { - get => GetField(1, DataFields.ProgramId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.ProgramId).SetValue(OpenProtocolConvert.ToString, value); - } - public NodeType NodeType - { - get => (NodeType)GetField(1, DataFields.NodeType).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.NodeType).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 4, HasPrefix = false)] + public int ProgramId { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 2, Index = 24, Size = 3, HasPrefix = false)] + public NodeType NodeType { get; set; } public Mid2506() : this(new Header() { @@ -43,25 +39,5 @@ public Mid2506(Header header) : base(header) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.ProgramId, 20, 4, false), - DataField.Number(DataFields.NodeType, 24, 3, false), - } - } - }; - } - - protected enum DataFields - { - ProgramId, - NodeType - } } } diff --git a/src/OpenProtocolInterpreter/ParameterSet/ParameterSetMessages.cs b/src/OpenProtocolInterpreter/ParameterSet/ParameterSetMessages.cs index b5a16f0d..d0c40f7a 100644 --- a/src/OpenProtocolInterpreter/ParameterSet/ParameterSetMessages.cs +++ b/src/OpenProtocolInterpreter/ParameterSet/ParameterSetMessages.cs @@ -11,26 +11,29 @@ internal class ParameterSetMessages : MessagesTemplate { public ParameterSetMessages() : base() { - _templates = new Dictionary() + _templates = new Dictionary>() { - { Mid0010.MID, new MidCompiledInstance(typeof(Mid0010)) }, - { Mid0011.MID, new MidCompiledInstance(typeof(Mid0011)) }, - { Mid0012.MID, new MidCompiledInstance(typeof(Mid0012)) }, - { Mid0013.MID, new MidCompiledInstance(typeof(Mid0013)) }, - { Mid0014.MID, new MidCompiledInstance(typeof(Mid0014)) }, - { Mid0015.MID, new MidCompiledInstance(typeof(Mid0015)) }, - { Mid0016.MID, new MidCompiledInstance(typeof(Mid0016)) }, - { Mid0017.MID, new MidCompiledInstance(typeof(Mid0017)) }, - { Mid0018.MID, new MidCompiledInstance(typeof(Mid0018)) }, - { Mid0019.MID, new MidCompiledInstance(typeof(Mid0019)) }, - { Mid0020.MID, new MidCompiledInstance(typeof(Mid0020)) }, - { Mid0021.MID, new MidCompiledInstance(typeof(Mid0021)) }, - { Mid0022.MID, new MidCompiledInstance(typeof(Mid0022)) }, - { Mid0023.MID, new MidCompiledInstance(typeof(Mid0023)) }, - { Mid0024.MID, new MidCompiledInstance(typeof(Mid0024)) }, - { Mid2504.MID, new MidCompiledInstance(typeof(Mid2504)) }, - { Mid2505.MID, new MidCompiledInstance(typeof(Mid2505)) }, - { Mid2506.MID, new MidCompiledInstance(typeof(Mid2506)) } + { Mid0010.MID, new CompiledInstance(typeof(Mid0010)) }, + { Mid0011.MID, new CompiledInstance(typeof(Mid0011)) }, + { Mid0012.MID, new CompiledInstance(typeof(Mid0012)) }, + { Mid0013.MID, new CompiledInstance(typeof(Mid0013)) }, + { Mid0014.MID, new CompiledInstance(typeof(Mid0014)) }, + { Mid0015.MID, new CompiledInstance(typeof(Mid0015)) }, + { Mid0016.MID, new CompiledInstance(typeof(Mid0016)) }, + { Mid0017.MID, new CompiledInstance(typeof(Mid0017)) }, + { Mid0018.MID, new CompiledInstance(typeof(Mid0018)) }, + { Mid0019.MID, new CompiledInstance(typeof(Mid0019)) }, + { Mid0020.MID, new CompiledInstance(typeof(Mid0020)) }, + { Mid0021.MID, new CompiledInstance(typeof(Mid0021)) }, + { Mid0022.MID, new CompiledInstance(typeof(Mid0022)) }, + { Mid0023.MID, new CompiledInstance(typeof(Mid0023)) }, + { Mid0024.MID, new CompiledInstance(typeof(Mid0024)) }, + { Mid2501.MID, new CompiledInstance(typeof(Mid2501)) }, + { Mid2502.MID, new CompiledInstance(typeof(Mid2502)) }, + { Mid2503.MID, new CompiledInstance(typeof(Mid2503)) }, + { Mid2504.MID, new CompiledInstance(typeof(Mid2504)) }, + { Mid2505.MID, new CompiledInstance(typeof(Mid2505)) }, + { Mid2506.MID, new CompiledInstance(typeof(Mid2506)) } }; } diff --git a/src/OpenProtocolInterpreter/PowerMACS/BoltData.cs b/src/OpenProtocolInterpreter/PowerMACS/BoltData.cs index 7cd69340..2b2ce58a 100644 --- a/src/OpenProtocolInterpreter/PowerMACS/BoltData.cs +++ b/src/OpenProtocolInterpreter/PowerMACS/BoltData.cs @@ -1,4 +1,9 @@ -namespace OpenProtocolInterpreter.PowerMACS +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Text; + +namespace OpenProtocolInterpreter.PowerMACS { /// /// Represents a Bolt entity @@ -16,4 +21,80 @@ public class BoltData public decimal BoltAngleHighLimit { get; set; } public decimal BoltAngleLowLimit { get; set; } } + + public class BoltDataCollectionDefinitionAttribute : DataFieldDefinitionAttribute + { + public int EachFieldSize { get; set; } = 67; + + public BoltDataCollectionDefinitionAttribute(int revision) : base(revision) + { + + } + public BoltDataCollectionDefinitionAttribute(int field, int revision) : base(field, revision) + { + + } + + internal override DataField Build(object owner, PropertyInfo propertyInfo, int index) + { + return new DataField>(Field, index, Size, HasPrefix) + { + DefaultConverter = PackBoltData, + DefaultParser = ParseBoltData + }.Bind(owner, propertyInfo); + } + + private static string PackBoltData(char paddingChar, int size, PaddingOrientation orientation, List boltsData) + { + var builder = new StringBuilder(); + foreach (var bolt in boltsData) + { + builder.Append($"13{OpenProtocolConvert.ToString('0', 2, PaddingOrientation.LeftPadded, bolt.OrdinalBoltNumber)}"); + builder.Append($"14{OpenProtocolConvert.ToString(bolt.SimpleBoltStatus)}"); + builder.Append($"15{OpenProtocolConvert.ToString(bolt.TorqueStatus)}"); + builder.Append($"16{OpenProtocolConvert.ToString(bolt.AngleStatus)}"); + builder.Append($"17{OpenProtocolConvert.ToString('0', 7, PaddingOrientation.RightPadded, bolt.BoltTorque)}"); + builder.Append($"18{OpenProtocolConvert.ToString('0', 7, PaddingOrientation.RightPadded, bolt.BoltAngle)}"); + builder.Append($"19{OpenProtocolConvert.ToString('0', 7, PaddingOrientation.RightPadded, bolt.BoltTorqueHighLimit)}"); + builder.Append($"20{OpenProtocolConvert.ToString('0', 7, PaddingOrientation.RightPadded, bolt.BoltTorqueLowLimit)}"); + builder.Append($"21{OpenProtocolConvert.ToString('0', 7, PaddingOrientation.RightPadded, bolt.BoltAngleHighLimit)}"); + builder.Append($"22{OpenProtocolConvert.ToString('0', 7, PaddingOrientation.RightPadded, bolt.BoltAngleLowLimit)}"); + } + + return builder.ToString(); + } + + private List ParseBoltData(string value) + { + var list = new List(); + if (string.IsNullOrWhiteSpace(value)) + { + return list; + } + + var numberOfBolts = value.Length / EachFieldSize; + var span = value.AsSpan(); + for (int i = 0; i < numberOfBolts; i++) + { + var bolt = span.Slice(i * EachFieldSize, EachFieldSize); + var obj = new BoltData() + { + OrdinalBoltNumber = OpenProtocolConvert.ToInt32(bolt.Slice(2, 2)), + SimpleBoltStatus = OpenProtocolConvert.ToBoolean(bolt.Slice(6, 1)), + TorqueStatus = (TorqueStatus)OpenProtocolConvert.ToInt32(bolt.Slice(9, 1)), + AngleStatus = (AngleStatus)OpenProtocolConvert.ToInt32(bolt.Slice(12, 1)), + BoltTorque = OpenProtocolConvert.ToDecimal(bolt.Slice(15, 7)), + BoltAngle = OpenProtocolConvert.ToDecimal(bolt.Slice(24, 7)), + BoltTorqueHighLimit = OpenProtocolConvert.ToDecimal(bolt.Slice(33, 7)), + BoltTorqueLowLimit = OpenProtocolConvert.ToDecimal(bolt.Slice(42, 7)), + BoltAngleHighLimit = OpenProtocolConvert.ToDecimal(bolt.Slice(51, 7)), + BoltAngleLowLimit = OpenProtocolConvert.ToDecimal(bolt.Slice(60, 7)), + }; + + list.Add(obj); + } + + return list; + } + } } diff --git a/src/OpenProtocolInterpreter/PowerMACS/BoltResult.cs b/src/OpenProtocolInterpreter/PowerMACS/BoltResult.cs index efbb3722..4054a677 100644 --- a/src/OpenProtocolInterpreter/PowerMACS/BoltResult.cs +++ b/src/OpenProtocolInterpreter/PowerMACS/BoltResult.cs @@ -1,4 +1,10 @@ -namespace OpenProtocolInterpreter.PowerMACS +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; + +namespace OpenProtocolInterpreter.PowerMACS { /// /// Represents a Bolt Result entity @@ -9,4 +15,80 @@ public class BoltResult public DataType Type { get; set; } public object Value { get; set; } } + + public class BoltResultCollectionDefinitionAttribute : DataFieldDefinitionAttribute + { + public BoltResultCollectionDefinitionAttribute(int revision) : base(revision) + { + + } + public BoltResultCollectionDefinitionAttribute(int field, int revision) : base(field, revision) + { + + } + + internal override DataField Build(object owner, PropertyInfo propertyInfo, int index) + { + return new DataField>(Field, index, Size, HasPrefix) + { + DefaultConverter = PackBoltResult, + DefaultParser = ParseBoltResult + }.Bind(owner, propertyInfo); + } + + private static string PackBoltResult(char paddingChar, int size, PaddingOrientation orientation, List boltResults) + { + var builder = new StringBuilder(); + foreach (var bolt in boltResults) + { + builder.Append(OpenProtocolConvert.TruncatePadded(' ', 20, PaddingOrientation.RightPadded, bolt.VariableName)); + builder.Append(bolt.Type.Type); + if (DataType.DataTypes[1].Type.Equals(bolt.Type.Type)) // Integer + { + builder.Append(OpenProtocolConvert.ToString('0', 7, PaddingOrientation.LeftPadded, (int)bolt.Value)); + } + else if (DataType.DataTypes[2].Type.Equals(bolt.Type.Type)) // Decimal + { + builder.Append(OpenProtocolConvert.ToString('0', 7, PaddingOrientation.LeftPadded, (decimal)bolt.Value)); + } + } + + return builder.ToString(); + } + + + private static List ParseBoltResult(string value) + { + var list = new List(); + if (string.IsNullOrWhiteSpace(value)) + { + return list; + } + + var section = value.AsSpan(); + for (int i = 0; i < section.Length; i += 29) + { + var type = section.Slice(20 + i, 2).ToString(); + var result = new BoltResult() + { + VariableName = section.Slice(i, 20).ToString(), + Type = DataType.DataTypes.First(x => x == type) + }; + + var resultValue = section.Slice(22 + i, 7); + if (result.Type.Type == DataType.DataTypes[1].Type) // Integer + { + result.Value = OpenProtocolConvert.ToInt32(resultValue); + } + else if (result.Type.Type == DataType.DataTypes[2].Type) // Decimal + { + result.Value = OpenProtocolConvert.ToDecimal(resultValue); + } + + list.Add(result); + } + + return list; + } + } } diff --git a/src/OpenProtocolInterpreter/PowerMACS/Mid0105.cs b/src/OpenProtocolInterpreter/PowerMACS/Mid0105.cs index 13b2dc90..94125b76 100644 --- a/src/OpenProtocolInterpreter/PowerMACS/Mid0105.cs +++ b/src/OpenProtocolInterpreter/PowerMACS/Mid0105.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.PowerMACS { @@ -15,7 +16,7 @@ namespace OpenProtocolInterpreter.PowerMACS /// /// Message sent by: Integrator /// - /// Answer: Command accepted or + /// Answer: Command accepted or /// Command error, Subscription already exists or MID revision unsupported /// /// @@ -25,16 +26,10 @@ public class Mid0105 : Mid, IPowerMACS, IIntegrator, ISubscription, IAcceptableC public IEnumerable DocumentedPossibleErrors => new Error[] { Error.SubscriptionAlreadyExists, Error.MidRevisionUnsupported }; - public int DataNumberSystem - { - get => GetField(2, DataFields.DataNumberSystem).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.DataNumberSystem).SetValue(OpenProtocolConvert.ToString, value); - } - public bool SendOnlyNewData - { - get => GetField(3, DataFields.SendOnlyNewData).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(3, DataFields.SendOnlyNewData).SetValue(OpenProtocolConvert.ToString, value); - } + [Int64DataFieldDefinition(revision: 2, field: 1, Index = 20, Size = 10, HasPrefix = false)] + public long DataNumberSystem { get; set; } + [BooleanDataFieldDefinition(revision: 3, field: 2, Index = 30, HasPrefix = false)] + public bool SendOnlyNewData { get; set; } public Mid0105() : this(DEFAULT_REVISION) { @@ -58,30 +53,5 @@ public Mid0105(int revision, bool noAckFlag = false) : this(new Header() }) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 2, new List() - { - DataField.Number(DataFields.DataNumberSystem, 20, 10, false), - } - }, - { - 3, new List() - { - DataField.Boolean(DataFields.SendOnlyNewData, 30, false) - } - }, - }; - } - - protected enum DataFields - { - DataNumberSystem, - SendOnlyNewData - } } } diff --git a/src/OpenProtocolInterpreter/PowerMACS/Mid0106.cs b/src/OpenProtocolInterpreter/PowerMACS/Mid0106.cs index 1e4346db..e1bc415b 100644 --- a/src/OpenProtocolInterpreter/PowerMACS/Mid0106.cs +++ b/src/OpenProtocolInterpreter/PowerMACS/Mid0106.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -33,78 +33,55 @@ public class Mid0106 : Mid, IPowerMACS, IController, IAcknowledgeable { public const int MID = 106; - public int TotalNumberOfMessages - { - get => GetField(1, DataFields.TotalNumberOfMessages).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.TotalNumberOfMessages).SetValue(OpenProtocolConvert.ToString, value); - } - public int MessageNumber - { - get => GetField(1, DataFields.MessageNumber).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.MessageNumber).SetValue(OpenProtocolConvert.ToString, value); - } - public int DataNumberSystem - { - get => GetField(1, DataFields.DataNumberSystem).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.DataNumberSystem).SetValue(OpenProtocolConvert.ToString, value); - } - public int StationNumber - { - get => GetField(1, DataFields.StationNumber).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.StationNumber).SetValue(OpenProtocolConvert.ToString, value); - } - public string StationName - { - get => GetField(1, DataFields.StationName).Value; - set => GetField(1, DataFields.StationName).SetValue(value); - } - public DateTime Time - { - get => GetField(1, DataFields.Time).GetValue(OpenProtocolConvert.ToDateTime); - set => GetField(1, DataFields.Time).SetValue(OpenProtocolConvert.ToString, value); - } - public int ModeNumber - { - get => GetField(1, DataFields.ModeNumber).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.ModeNumber).SetValue(OpenProtocolConvert.ToString, value); - } - public string ModeName - { - get => GetField(1, DataFields.ModeName).Value; - set => GetField(1, DataFields.ModeName).SetValue(value); - } - public bool SimpleStatus - { - get => GetField(1, DataFields.SimpleStatus).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(1, DataFields.SimpleStatus).SetValue(OpenProtocolConvert.ToString, value); - } - public PowerMacsStatus PMStatus - { - get => (PowerMacsStatus)GetField(1, DataFields.PMStatus).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.PMStatus).SetValue(OpenProtocolConvert.ToString, value); - } - public string WpId - { - get => GetField(1, DataFields.WPId).Value; - set => GetField(1, DataFields.WPId).SetValue(value); - } - public int NumberOfBolts - { - get => GetField(1, DataFields.NumberOfBolts).GetValue(OpenProtocolConvert.ToInt32); - private set => GetField(1, DataFields.NumberOfBolts).SetValue(OpenProtocolConvert.ToString, value); - } - public List BoltsData { get; set; } - public int TotalSpecialValues - { - get => GetField(1, DataFields.NumberOfSpecialValues).GetValue(OpenProtocolConvert.ToInt32); - private set => GetField(1, DataFields.NumberOfSpecialValues).SetValue(OpenProtocolConvert.ToString, value); - } - public List SpecialValues { get; set; } - public SystemSubType SystemSubType - { - get => (SystemSubType)GetField(4, DataFields.SystemSubType).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(4, DataFields.SystemSubType).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 2)] + public int TotalNumberOfMessages { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 2, Index = 24, Size = 2)] + public int MessageNumber { get; set; } + + [Int64DataFieldDefinition(revision: 1, field: 3, Index = 28, Size = 10)] + public long DataNumberSystem { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 4, Index = 40, Size = 2)] + public int StationNumber { get; set; } + + [StringDataFieldDefinition(revision: 1, field: 5, Index = 44, Size = 20)] + public string StationName { get; set; } + + [TimestampDataFieldDefinition(revision: 1, field: 6, Index = 66)] + public DateTime Time { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 7, Index = 87, Size = 2)] + public int ModeNumber { get; set; } + + [StringDataFieldDefinition(revision: 1, field: 8, Index = 91, Size = 20)] + public string ModeName { get; set; } + + [BooleanDataFieldDefinition(revision: 1, field: 9, Index = 113)] + public bool SimpleStatus { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 10, Index = 116, Size = 1)] + public PowerMacsStatus PMStatus { get; set; } + + [StringDataFieldDefinition(revision: 1, field: 11, Index = 119, Size = 40)] + public string WpId { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 12, Index = 161, Size = 2)] + public int NumberOfBolts { get; set; } + + [BoltDataCollectionDefinition(revision: 1, field: 13, Index = 165, HasPrefix = false)] + public List BoltsData { get; set; } = new List(); + + //Total Special values has a weird pattern of being attached to the list of special values instead of being a separate field. + //So we do process is in a separate way with special values and set its value and have to do it together with list because each special value + //has a dynamic size, due to that, we cannot make the same processing as Bolt data list that has fixed length of 67 bytes for each bolt data. + public int TotalSpecialValues { get; set; } + + [SpecialValueCollectionDefinition(revision: 1, field: 23, Index = 0, Size = 67)] + public List SpecialValues { get; set; } = new List(); + + [Int32DataFieldDefinition(revision: 4, field: 24, Index = 0, Size = 3)] + public SystemSubType SystemSubType { get; set; } public Mid0106() : this(DEFAULT_REVISION) { @@ -125,179 +102,67 @@ public Mid0106(int revision) : this(new Header() { } + protected override string BuildHeader() + { + Header.Length = Header.DefaultSize; + var fields = DataFieldsByRevision(); + Header.Length += fields.Sum(x => x.TotalSize); + return Header.ToString(); + } + public override string Pack() { NumberOfBolts = BoltsData.Count; TotalSpecialValues = SpecialValues.Count; - GetField(1, DataFields.BoltData).Value = PackBoltsData(); - GetField(1, DataFields.SpecialValues).Value = PackSpecialValues(); - - var builder = new StringBuilder(BuildHeader()); - int prefixIndex = 1; - for (int i = 1; i <= (Header.Revision > 0 ? Header.Revision : 1); i++) - foreach (var dataField in RevisionsByFields[i]) - { - if (dataField.Field == (int)DataFields.NumberOfSpecialValues) - prefixIndex = 23; - - if (dataField.HasPrefix) - { - builder.Append(prefixIndex.ToString("D2")); - prefixIndex++; - } - - builder.Append(dataField.Value); - } - - return builder.ToString(); + GetField(nameof(BoltsData)).Size = NumberOfBolts * 67; + GetField(nameof(SpecialValues)).Size = 2 + SpecialValues.Sum(x => x.TotalFieldLength); + return base.Pack(); } - public override Mid Parse(string package) + protected override void ProcessDataField(DataField dataField, ReadOnlySpan package) { - Header = ProcessHeader(package); - - int numberOfBolts = OpenProtocolConvert.ToInt32(package.Substring(GetField(1, DataFields.NumberOfBolts).Index + 2, GetField(1, DataFields.NumberOfBolts).Size)); - GetField(1, DataFields.BoltData).Size *= numberOfBolts; - - var numberOfSpecialValuesField = GetField(1, DataFields.NumberOfSpecialValues); - numberOfSpecialValuesField.Index = GetField(1, DataFields.BoltData).Index + GetField(1, DataFields.BoltData).Size; - - var specialValues = GetField(1, DataFields.SpecialValues); - specialValues.Index = numberOfSpecialValuesField.Index + numberOfSpecialValuesField.Size + 2; - if (Header.Revision > 3) + if (dataField.Field == 23) { - specialValues.Size = Header.Length - GetField(4, DataFields.SystemSubType).Size - 2; - GetField(4, DataFields.SystemSubType).Index = specialValues.Index + specialValues.Size; + if (Header.Revision > 3) + dataField.Size = Header.Length - GetField(revision: 4, field: 4).TotalSize - 2; + else + dataField.Size = Header.Length - dataField.Index - 2; + + base.ProcessDataField(dataField, package); + TotalSpecialValues = SpecialValues.Count; + return; } - else - { - specialValues.Size = Header.Length - specialValues.Index; - } - - ProcessDataFields(package); - - BoltsData = ParseBoltsData(GetField(1, DataFields.BoltData).Value); - SpecialValues = SpecialValue.ParseAll(GetField(1, DataFields.SpecialValues).Value, TotalSpecialValues, false).ToList(); - return this; - } - protected virtual string PackBoltsData() - { - var builder = new StringBuilder(); - foreach (var bolt in BoltsData) + if (dataField.Field == 13) { - builder.Append($"13{OpenProtocolConvert.ToString('0', 2, PaddingOrientation.LeftPadded, bolt.OrdinalBoltNumber)}"); - builder.Append($"14{OpenProtocolConvert.ToString(bolt.SimpleBoltStatus)}"); - builder.Append($"15{OpenProtocolConvert.ToString(bolt.TorqueStatus)}"); - builder.Append($"16{OpenProtocolConvert.ToString(bolt.AngleStatus)}"); - builder.Append($"17{OpenProtocolConvert.ToString('0', 7, PaddingOrientation.RightPadded, bolt.BoltTorque)}"); - builder.Append($"18{OpenProtocolConvert.ToString('0', 7, PaddingOrientation.RightPadded, bolt.BoltAngle)}"); - builder.Append($"19{OpenProtocolConvert.ToString('0', 7, PaddingOrientation.RightPadded, bolt.BoltTorqueHighLimit)}"); - builder.Append($"20{OpenProtocolConvert.ToString('0', 7, PaddingOrientation.RightPadded, bolt.BoltTorqueLowLimit)}"); - builder.Append($"21{OpenProtocolConvert.ToString('0', 7, PaddingOrientation.RightPadded, bolt.BoltAngleHighLimit)}"); - builder.Append($"22{OpenProtocolConvert.ToString('0', 7, PaddingOrientation.RightPadded, bolt.BoltAngleLowLimit)}"); + dataField.Size = NumberOfBolts * 67; } - return builder.ToString(); + base.ProcessDataField(dataField, package); } - protected virtual string PackSpecialValues() + protected override void ProcessDataFields(ReadOnlySpan package) { - var builder = new StringBuilder(); - foreach (var v in SpecialValues) - { - builder.Append(v.Pack(false)); - } - - return builder.ToString(); + foreach (var field in DataFieldsByRevision()) + ProcessDataField(field, package); } - protected virtual List ParseBoltsData(string value) + private IEnumerable DataFieldsByRevision() { - var list = new List(); - if (string.IsNullOrWhiteSpace(value)) + var previousField = default(DataField); + for (int i = 1; i <= Header.StandardizedRevision; i++) { - return list; - } - - var bolts = new List(); - for (int i = 0; i < NumberOfBolts; i++) - bolts.Add(value.Substring(i * 67, 67)); - - foreach (var bolt in bolts) - { - var obj = new BoltData() - { - OrdinalBoltNumber = OpenProtocolConvert.ToInt32(bolt.Substring(2, 2)), - SimpleBoltStatus = OpenProtocolConvert.ToBoolean(bolt.Substring(6, 1)), - TorqueStatus = (TorqueStatus)OpenProtocolConvert.ToInt32(bolt.Substring(9, 1)), - AngleStatus = (AngleStatus)OpenProtocolConvert.ToInt32(bolt.Substring(12, 1)), - BoltTorque = OpenProtocolConvert.ToDecimal(bolt.Substring(15, 7)), - BoltAngle = OpenProtocolConvert.ToDecimal(bolt.Substring(24, 7)), - BoltTorqueHighLimit = OpenProtocolConvert.ToDecimal(bolt.Substring(33, 7)), - BoltTorqueLowLimit = OpenProtocolConvert.ToDecimal(bolt.Substring(42, 7)), - BoltAngleHighLimit = OpenProtocolConvert.ToDecimal(bolt.Substring(51, 7)), - BoltAngleLowLimit = OpenProtocolConvert.ToDecimal(bolt.Substring(60, 7)), - }; - - list.Add(obj); - } - - return list; - } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() + foreach (var dataField in RevisionsByFields[i]) { + if (previousField != null && dataField.Index == 0) { - 1, new List() - { - DataField.Number(DataFields.TotalNumberOfMessages, 20, 2), - DataField.Number(DataFields.MessageNumber, 24, 2), - DataField.Number(DataFields.DataNumberSystem, 28, 10), - DataField.Number(DataFields.StationNumber, 40, 2), - DataField.String(DataFields.StationName, 44, 20), - DataField.Timestamp(DataFields.Time, 66), - DataField.Number(DataFields.ModeNumber, 87, 2), - DataField.String(DataFields.ModeName, 91, 20), - DataField.Boolean(DataFields.SimpleStatus, 113), - DataField.Number(DataFields.PMStatus, 116, 1), - DataField.String(DataFields.WPId, 119, 40), - DataField.Number(DataFields.NumberOfBolts, 161, 2), - new(DataFields.BoltData, 165, 67, false), - DataField.Number(DataFields.NumberOfSpecialValues, 0, 2), - DataField.Volatile(DataFields.SpecialValues, false) - } - }, - { - 4, new List() - { - DataField.Number(DataFields.SystemSubType, 0, 3) - } + dataField.Index = previousField.Index + previousField.TotalSize; } - }; - } - protected enum DataFields - { - TotalNumberOfMessages, - MessageNumber, - DataNumberSystem, - StationNumber, - StationName, - Time, - ModeNumber, - ModeName, - SimpleStatus, - PMStatus, - WPId, - NumberOfBolts, - BoltData, - NumberOfSpecialValues, - SpecialValues, - //Rev 4 - SystemSubType + previousField = dataField; + yield return dataField; + } + } } } } diff --git a/src/OpenProtocolInterpreter/PowerMACS/Mid0107.cs b/src/OpenProtocolInterpreter/PowerMACS/Mid0107.cs index c315a568..84bca407 100644 --- a/src/OpenProtocolInterpreter/PowerMACS/Mid0107.cs +++ b/src/OpenProtocolInterpreter/PowerMACS/Mid0107.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -8,14 +8,14 @@ namespace OpenProtocolInterpreter.PowerMACS /// /// Last Power MACS tightening result Bolt data /// - /// This message contains the cycle data for one Bolt, both Bolt data and step data. It is only sent if - /// the acknowledgement of the message Last PowerMACS tightening result station data had the parameter + /// This message contains the cycle data for one Bolt, both Bolt data and step data. It is only sent if + /// the acknowledgement of the message Last PowerMACS tightening result station data had the parameter /// Bolt Data set to TRUE. The next Bolt data is sent if the acknowledgement has the parameter Bolt Data set to TRUE. - /// This telegram is also used for Power MACS systems running a Press.The layout of the telegram is exactly the - /// same but some of the fields have slightly different definitions. The fields for Torque are used for Force values - /// and the fields for Angle are used for Stroke values. Press systems also use different identifiers for the optional + /// This telegram is also used for Power MACS systems running a Press.The layout of the telegram is exactly the + /// same but some of the fields have slightly different definitions. The fields for Torque are used for Force values + /// and the fields for Angle are used for Stroke values. Press systems also use different identifiers for the optional /// data on bolt and step level. Press systems always use revision 4 or higher of the telegram.Values in the fixed part - /// that are undefined in the results will be sent as all spaces (ASCII 0x20). + /// that are undefined in the results will be sent as all spaces (ASCII 0x20). /// /// /// This can happen with the Customer Error Code if this function is not activated. @@ -24,7 +24,7 @@ namespace OpenProtocolInterpreter.PowerMACS /// Note 2: The Bolt results and step results are only sent when the value exists in the result. This means, /// for example, that if no high limit is programmed for Peak T, then the value Peak T + will not be sent /// even if limits for Peak T are defined in the reporter. - /// + /// /// Message sent by: Controller /// Answer: Last PowerMACS tightening result data acknowledge /// @@ -32,314 +32,154 @@ public class Mid0107 : Mid, IPowerMACS, IController, IAcknowledgeable { public const int MID = 107; - public int TotalNumberOfMessages - { - get => GetField(1, DataFields.TotalNumberOfMessages).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.TotalNumberOfMessages).SetValue(OpenProtocolConvert.ToString, value); - } - public int MessageNumber - { - get => GetField(1, DataFields.MessageNumber).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.MessageNumber).SetValue(OpenProtocolConvert.ToString, value); - } - public int DataNumberSystem - { - get => GetField(1, DataFields.DataNumberSystem).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.DataNumberSystem).SetValue(OpenProtocolConvert.ToString, value); - } - public int StationNumber - { - get => GetField(1, DataFields.StationNumber).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.StationNumber).SetValue(OpenProtocolConvert.ToString, value); - } - public DateTime Time - { - get => GetField(1, DataFields.Time).GetValue(OpenProtocolConvert.ToDateTime); - set => GetField(1, DataFields.Time).SetValue(OpenProtocolConvert.ToString, value); - } - public int BoltNumber - { - get => GetField(1, DataFields.BoltNumber).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.BoltNumber).SetValue(OpenProtocolConvert.ToString, value); - } - public string BoltName - { - get => GetField(1, DataFields.BoltName).Value; - set => GetField(1, DataFields.BoltName).SetValue(value); - } - public string ProgramName - { - get => GetField(1, DataFields.ProgramName).Value; - set => GetField(1, DataFields.ProgramName).SetValue(value); - } - public PowerMacsStatus PowerMacsStatus - { - get => (PowerMacsStatus)GetField(1, DataFields.PMStatus).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.PMStatus).SetValue(OpenProtocolConvert.ToString, value); - } - public string Errors - { - get => GetField(1, DataFields.Errors).Value; - set => GetField(1, DataFields.Errors).SetValue(value); - } - public string CustomerErrorCode - { - get => GetField(1, DataFields.CustomerErrorCode).Value; - set => GetField(1, DataFields.CustomerErrorCode).SetValue(value); - } - public int NumberOfBoltResults - { - get => GetField(1, DataFields.NumberOfBoltResults).GetValue(OpenProtocolConvert.ToInt32); - private set => GetField(1, DataFields.NumberOfBoltResults).SetValue(OpenProtocolConvert.ToString, value); - } - public List BoltResults { get; set; } - public int NumberOfStepResults - { - get => GetField(1, DataFields.NumberOfStepResults).GetValue(OpenProtocolConvert.ToInt32); - private set => GetField(1, DataFields.NumberOfStepResults).SetValue(OpenProtocolConvert.ToString, value); - } - public bool AllStepDataSent - { - get => GetField(1, DataFields.AllStepDataSent).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(1, DataFields.AllStepDataSent).SetValue(OpenProtocolConvert.ToString, value); - } - public List StepResults { get; set; } - public int NumberOfSpecialValues - { - get => GetField(1, DataFields.NumberOfSpecialValues).GetValue(OpenProtocolConvert.ToInt32); - private set => GetField(1, DataFields.NumberOfSpecialValues).SetValue(OpenProtocolConvert.ToString, value); - } - public List SpecialValues { get; set; } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 2)] + public int TotalNumberOfMessages { get; set; } - public Mid0107() : this(new Header() - { - Mid = MID, - Revision = DEFAULT_REVISION - }) - { + [Int32DataFieldDefinition(revision: 1, field: 2, Index = 24, Size = 2)] + public int MessageNumber { get; set; } - } + [Int64DataFieldDefinition(revision: 1, field: 3, Index = 28, Size = 10)] + public long DataNumberSystem { get; set; } - public Mid0107(Header header) : base(header) - { - BoltResults ??= []; - StepResults ??= []; - SpecialValues ??= []; - } + [Int32DataFieldDefinition(revision: 1, field: 4, Index = 40, Size = 2)] + public int StationNumber { get; set; } - public override string Pack() - { - NumberOfBoltResults = BoltResults.Count; - NumberOfStepResults = StepResults.Count; - NumberOfSpecialValues = SpecialValues.Count; + [TimestampDataFieldDefinition(revision: 1, field: 5, Index = 44)] + public DateTime Time { get; set; } - GetField(1, DataFields.BoltResults).SetValue(PackBoltResultList()); - GetField(1, DataFields.StepResults).SetValue(PackStepResults()); - GetField(1, DataFields.SpecialValues).SetValue(PackSpecialValues()); + [Int32DataFieldDefinition(revision: 1, field: 6, Index = 65, Size = 4)] + public int BoltNumber { get; set; } - return base.Pack(); - } + [StringDataFieldDefinition(revision: 1, field: 7, Index = 71, Size = 20)] + public string BoltName { get; set; } - public override Mid Parse(string package) - { - Header = ProcessHeader(package); + [StringDataFieldDefinition(revision: 1, field: 8, Index = 93, Size = 20)] + public string ProgramName { get; set; } - int numberOfBoltResults = OpenProtocolConvert.ToInt32(GetValue(GetField(1, DataFields.NumberOfBoltResults), package)); - var boltResultField = GetField(1, DataFields.BoltResults); - boltResultField.Size = 29 * numberOfBoltResults; + [Int32DataFieldDefinition(revision: 1, field: 9, Index = 115, Size = 1)] + public PowerMacsStatus PowerMacsStatus { get; set; } - var numberOfStepResultsField = GetField(1, DataFields.NumberOfStepResults); - numberOfStepResultsField.Index = boltResultField.Index + boltResultField.Size; + [StringDataFieldDefinition(revision: 1, field: 10, Index = 118, Size = 50)] + public string Errors { get; set; } - var allStepDataSentField = GetField(1, DataFields.AllStepDataSent); - allStepDataSentField.Index = 2 + numberOfStepResultsField.Index + numberOfStepResultsField.Size; + [StringDataFieldDefinition(revision: 1, field: 11, Index = 170, Size = 4)] + public string CustomerErrorCode { get; set; } - var stepResultsField = GetField(1, DataFields.StepResults); - stepResultsField.Index = 2 + allStepDataSentField.Index + allStepDataSentField.Size; + [Int32DataFieldDefinition(revision: 1, field: 12, Index = 176, Size = 2)] + public int NumberOfBoltResults { get; set; } - int numberOfStepResults = OpenProtocolConvert.ToInt32(GetValue(numberOfStepResultsField, package)); - stepResultsField.Size = 31 * numberOfStepResults; + [BoltResultCollectionDefinition(revision: 1, field: 12, Index = 180, Size = 0, HasPrefix = false)] + public List BoltResults { get; set; } = new List(); - var numberOfSpecialValuesField = GetField(1, DataFields.NumberOfSpecialValues); - numberOfSpecialValuesField.Index = stepResultsField.Index + stepResultsField.Size; + [Int32DataFieldDefinition(revision: 1, field: 13, Index = 0, Size = 3)] + public int NumberOfStepResults { get; set; } - var specialValuesField = GetField(1, DataFields.SpecialValues); - specialValuesField.Index = 2 + numberOfSpecialValuesField.Index + numberOfSpecialValuesField.Size; - specialValuesField.Size = Header.Length - specialValuesField.Index; + [BooleanDataFieldDefinition(revision: 1, field: 14, Index = 0, Size = 1)] + public bool AllStepDataSent { get; set; } - ProcessDataFields(package); + [StepResultCollectionDefinition(revision: 1, field: 14, Index = 0, Size = 0, HasPrefix = false)] + public List StepResults { get; set; } = new List(); - BoltResults = ParseBoltResultList(boltResultField.Value); - StepResults = ParseStepResults(stepResultsField.Value); - SpecialValues = SpecialValue.ParseAll(specialValuesField.Value, NumberOfSpecialValues, true).ToList(); - return this; - } + //Total Special values has a weird pattern of being attached to the list of special values instead of being a separate field. + //So we do process is in a separate way with special values and set its value and have to do it together with list because each special value + //has a dynamic size, due to that, we cannot make the same processing as Bolt result list that has fixed length of 31 bytes for each bolt result. + public int NumberOfSpecialValues { get; set; } - protected virtual string PackBoltResultList() - { - var builder = new StringBuilder(); - foreach (var bolt in BoltResults) - { - builder.Append(OpenProtocolConvert.TruncatePadded(' ', 20, PaddingOrientation.RightPadded, bolt.VariableName)); - builder.Append(bolt.Type.Type); - if (bolt.Type.Type == DataType.DataTypes[1].Type) // Integer - { - builder.Append(OpenProtocolConvert.ToString('0', 7, PaddingOrientation.LeftPadded, (int)bolt.Value)); - } - else if (bolt.Type.Type == DataType.DataTypes[2].Type) // Decimal - { - builder.Append(OpenProtocolConvert.ToString('0', 7, PaddingOrientation.LeftPadded, (decimal)bolt.Value)); - } - } + [SpecialValueCollectionDefinition(revision: 1, field: 15, Index = 0, UseStepNumber = true)] + public List SpecialValues { get; set; } = new List(); - return builder.ToString(); - } + [Int32DataFieldDefinition(revision: 4, field: 16, Index = 0, Size = 3)] + public SystemSubType SystemSubType { get; set; } - protected virtual string PackStepResults() + public Mid0107() : this(new Header() + { + Mid = MID, + Revision = DEFAULT_REVISION + }) { - var builder = new StringBuilder(); - foreach (var step in StepResults) - { - builder.Append(OpenProtocolConvert.TruncatePadded(' ', 20, PaddingOrientation.RightPadded, step.VariableName)); - builder.Append(step.Type.Type); - if (step.Type.Type == DataType.DataTypes[1].Type) // Integer - { - builder.Append(OpenProtocolConvert.ToString('0', 7, PaddingOrientation.LeftPadded, (int)step.Value)); - } - else if (step.Type.Type == DataType.DataTypes[2].Type) // Decimal - { - builder.Append(OpenProtocolConvert.ToString('0', 7, PaddingOrientation.LeftPadded, (decimal)step.Value)); - } - builder.Append(OpenProtocolConvert.ToString('0', 2, PaddingOrientation.LeftPadded, step.StepNumber)); - } - return builder.ToString(); } - protected virtual string PackSpecialValues() + public Mid0107(Header header) : base(header) { - var builder = new StringBuilder(); - foreach (var v in SpecialValues) - { - builder.Append(v.Pack(true)); - } + BoltResults ??= []; + StepResults ??= []; + SpecialValues ??= []; + } - return builder.ToString(); + protected override string BuildHeader() + { + Header.Length = Header.DefaultSize; + var fields = DataFieldsByRevision(); + Header.Length += fields.Sum(x => x.TotalSize); + return Header.ToString(); } - protected virtual List ParseBoltResultList(string section) + public override string Pack() { - var list = new List(); - for (int i = 0; i < section.Length; i += 29) - { - var result = new BoltResult() - { - VariableName = section.Substring(i, 20), - Type = DataType.DataTypes.First(x => x.Type.Trim() == section.Substring(20 + i, 2).Trim()) - }; + NumberOfBoltResults = BoltResults.Count; + NumberOfStepResults = StepResults.Count; + NumberOfSpecialValues = SpecialValues.Count; - var resultValue = section.Substring(22 + i, 7); - if (result.Type.Type == DataType.DataTypes[1].Type) // Integer - { - result.Value = OpenProtocolConvert.ToInt32(resultValue); - } - else if (result.Type.Type == DataType.DataTypes[2].Type) // Decimal - { - result.Value = OpenProtocolConvert.ToDecimal(resultValue); - } + GetField>(revision: 1, field: 12).Size = NumberOfBoltResults * 29; + GetField>(revision: 1, field: 14).Size = NumberOfStepResults * 31; + GetField>(revision: 1, field: 15).Size = 2 + SpecialValues.Sum(x => x.TotalFieldLength); - list.Add(result); - } + var header = BuildHeader(); + var builder = new StringBuilder(Header.Length); + builder.Append(header); - return list; + var fields = DataFieldsByRevision(); + builder.Append(base.Pack(fields)); + return builder.ToString(); } - protected virtual List ParseStepResults(string section) + protected override void ProcessDataFields(ReadOnlySpan package) { - var list = new List(); - for (int i = 0; i < section.Length; i += 31) - { - var result = new StepResult() - { - VariableName = section.Substring(i, 20), - Type = DataType.DataTypes.First(x => x.Type.Trim() == section.Substring(20 + i, 2).Trim()), - StepNumber = OpenProtocolConvert.ToInt32(section.Substring(29 + i, 2)) - }; - - var resultValue = section.Substring(22 + i, 7); - if (result.Type.Type == DataType.DataTypes[1].Type) // Integer - { - result.Value = OpenProtocolConvert.ToInt32(resultValue); - } - else if (result.Type.Type == DataType.DataTypes[2].Type) // Decimal - { - int decimalPlaces = resultValue.Split('.')[1].Length; - result.Value = OpenProtocolConvert.ToDecimal(resultValue); - } + foreach (var field in DataFieldsByRevision()) + ProcessDataField(field, package); + } - list.Add(result); + protected override void ProcessDataField(DataField dataField, ReadOnlySpan package) + { + switch (dataField.Field) + { + case 12 when dataField is DataField>: //BoltResults + dataField.Size = NumberOfBoltResults * 29; + break; + case 14 when dataField is DataField>: //StepResults + dataField.Size = NumberOfStepResults * 31; + break; + case 15 when dataField is DataField>: //SpecialValues + if (Header.Revision > 3) + dataField.Size = Header.Length - GetField(revision: 4, field: 16).TotalSize - 2; + else + dataField.Size = Header.Length - dataField.Index - 2; + + base.ProcessDataField(dataField, package); + NumberOfSpecialValues = SpecialValues.Count; + return; } - return list; + base.ProcessDataField(dataField, package); } - protected override Dictionary> RegisterDatafields() + private IEnumerable DataFieldsByRevision() { - return new Dictionary>() + var previousField = default(DataField); + for (int i = 1; i <= Header.StandardizedRevision; i++) + { + foreach (var dataField in RevisionsByFields[i]) { + if (previousField != null && dataField.Index == 0) { - 1, new List() - { - DataField.Number(DataFields.TotalNumberOfMessages, 20, 2), - DataField.Number(DataFields.MessageNumber, 24, 2), - DataField.Number(DataFields.DataNumberSystem, 28, 10), - DataField.Number(DataFields.StationNumber, 40, 2), - DataField.Timestamp(DataFields.Time, 44), - DataField.Number(DataFields.BoltNumber, 65, 4), - DataField.String(DataFields.BoltName, 71, 20), - DataField.String(DataFields.ProgramName, 93, 20), - DataField.Number(DataFields.PMStatus, 115, 1), - DataField.String(DataFields.Errors, 118, 50), - DataField.String(DataFields.CustomerErrorCode, 170, 4), - DataField.Number(DataFields.NumberOfBoltResults, 176, 2), - DataField.Volatile(DataFields.BoltResults, 180, false), - DataField.Number(DataFields.NumberOfStepResults, 0, 3), - DataField.Boolean(DataFields.AllStepDataSent, 0), - DataField.Volatile(DataFields.StepResults, 0, false), - DataField.Number(DataFields.NumberOfSpecialValues, 0, 2), - DataField.Volatile(DataFields.SpecialValues, 0, false) - } - }, - { - 4, new List() - { - DataField.Number(DataFields.SystemSubType, 0, 3) - } + dataField.Index = previousField.Index + previousField.TotalSize; } - }; - } - protected enum DataFields - { - TotalNumberOfMessages, - MessageNumber, - DataNumberSystem, - StationNumber, - Time, - BoltNumber, - BoltName, - ProgramName, - PMStatus, - Errors, - CustomerErrorCode, - NumberOfBoltResults, - BoltResults, - NumberOfStepResults, - AllStepDataSent, - StepResults, - NumberOfSpecialValues, - SpecialValues, - SystemSubType + previousField = dataField; + yield return dataField; + } + } } } } diff --git a/src/OpenProtocolInterpreter/PowerMACS/Mid0108.cs b/src/OpenProtocolInterpreter/PowerMACS/Mid0108.cs index 45cab4ed..ce0238f4 100644 --- a/src/OpenProtocolInterpreter/PowerMACS/Mid0108.cs +++ b/src/OpenProtocolInterpreter/PowerMACS/Mid0108.cs @@ -9,9 +9,9 @@ namespace OpenProtocolInterpreter.PowerMACS /// tightening). Otherwise no more Bolt data is sent for this tightening. /// /// - /// If only the station data is wanted Bolt Data must be set to FALSE in the acknowledgement of + /// If only the station data is wanted Bolt Data must be set to FALSE in the acknowledgement of /// Last Power MACS tightening result Station data. - /// + /// /// Message sent by: Integrator /// Answer: None /// @@ -19,11 +19,8 @@ public class Mid0108 : Mid, IPowerMACS, IIntegrator, IAcknowledge { public const int MID = 108; - public bool BoltData - { - get => GetField(1, DataFields.BoltData).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(1, DataFields.BoltData).SetValue(OpenProtocolConvert.ToString, value); - } + [BooleanDataFieldDefinition(revision: 1, field: 1, Index = 20, HasPrefix = false)] + public bool BoltData { get; set; } public Mid0108() : this(DEFAULT_REVISION) { @@ -41,23 +38,5 @@ public Mid0108(int revision) : this(new Header() }) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Boolean(DataFields.BoltData, 20, false), - } - }, - }; - } - - protected enum DataFields - { - BoltData - } } } diff --git a/src/OpenProtocolInterpreter/PowerMACS/PowerMACSMessages.cs b/src/OpenProtocolInterpreter/PowerMACS/PowerMACSMessages.cs index a9ac2fb3..1a54625e 100644 --- a/src/OpenProtocolInterpreter/PowerMACS/PowerMACSMessages.cs +++ b/src/OpenProtocolInterpreter/PowerMACS/PowerMACSMessages.cs @@ -11,13 +11,13 @@ internal class PowerMACSMessages : MessagesTemplate { public PowerMACSMessages() : base() { - _templates = new Dictionary() + _templates = new Dictionary>() { - { Mid0105.MID, new MidCompiledInstance(typeof(Mid0105)) }, - { Mid0106.MID, new MidCompiledInstance(typeof(Mid0106)) }, - { Mid0107.MID, new MidCompiledInstance(typeof(Mid0107)) }, - { Mid0108.MID, new MidCompiledInstance(typeof(Mid0108)) }, - { Mid0109.MID, new MidCompiledInstance(typeof(Mid0109)) } + { Mid0105.MID, new CompiledInstance(typeof(Mid0105)) }, + { Mid0106.MID, new CompiledInstance(typeof(Mid0106)) }, + { Mid0107.MID, new CompiledInstance(typeof(Mid0107)) }, + { Mid0108.MID, new CompiledInstance(typeof(Mid0108)) }, + { Mid0109.MID, new CompiledInstance(typeof(Mid0109)) } }; } diff --git a/src/OpenProtocolInterpreter/PowerMACS/SpecialValue.cs b/src/OpenProtocolInterpreter/PowerMACS/SpecialValue.cs index 8a28d646..a91fd44a 100644 --- a/src/OpenProtocolInterpreter/PowerMACS/SpecialValue.cs +++ b/src/OpenProtocolInterpreter/PowerMACS/SpecialValue.cs @@ -1,4 +1,7 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; using System.Text; namespace OpenProtocolInterpreter.PowerMACS @@ -8,6 +11,8 @@ namespace OpenProtocolInterpreter.PowerMACS /// public class SpecialValue { + public int TotalFieldLength => 20 + 2 + 2 + Length + (StepNumber > 0 ? 2 : 0); + public string VariableName { get; set; } public DataType Type { get; set; } public int Length { get; set; } @@ -29,41 +34,102 @@ public string Pack(bool useStepNumber) } public static SpecialValue Parse(string value, bool useStepNumber) + => Parse(value.AsSpan(), useStepNumber); + + public static SpecialValue Parse(ReadOnlySpan value, bool useStepNumber) { var obj = new SpecialValue { - VariableName = value.Substring(0, 20), - Type = (DataType)value.Substring(20, 2), - Length = OpenProtocolConvert.ToInt32(value.Substring(22, 2)) + VariableName = value.Slice(0, 20).ToString(), + Type = (DataType)value.Slice(20, 2).ToString(), + Length = OpenProtocolConvert.ToInt32(value.Slice(22, 2)) }; - obj.Value = value.Substring(24, obj.Length); + obj.Value = value.Slice(24, obj.Length).ToString(); if (useStepNumber) { - obj.StepNumber = OpenProtocolConvert.ToInt32(value.Substring(24 + obj.Length, 2)); + obj.StepNumber = OpenProtocolConvert.ToInt32(value.Slice(24 + obj.Length, 2)); } return obj; } - public static IEnumerable ParseAll(string value, int totalSpecialValues, bool useStepNumber) + public static IEnumerable ParseAll(string value, bool useStepNumber) + => ParseAll(value.AsSpan(), useStepNumber); + + public static IEnumerable ParseAll(ReadOnlySpan value, bool useStepNumber) { - if (string.IsNullOrWhiteSpace(value)) + if (value.IsWhiteSpace() || value.IsEmpty) + return Array.Empty(); + + var result = new List(); + var totalSpecialValues = OpenProtocolConvert.ToInt32(value.Slice(0, 2)); + int index = 2; + const int sectionSize = 24; + for (int i = 0; i < totalSpecialValues; i++) { - yield break; + var length = OpenProtocolConvert.ToInt32(value.Slice(22 + index, 2)); + var totalSize = length + (useStepNumber ? sectionSize + 2 : sectionSize); + var section = value.Slice(index, totalSize); + index += totalSize; + result.Add(Parse(section, useStepNumber)); } + return result; + } + + public static IEnumerable ParseAll(string value, int totalSpecialValues, bool useStepNumber) + => ParseAll(value.AsSpan(), totalSpecialValues, useStepNumber); + public static IEnumerable ParseAll(ReadOnlySpan value, int totalSpecialValues, bool useStepNumber) + { + if (value.IsWhiteSpace() || value.IsEmpty) + return Array.Empty(); + + var result = new List(); int index = 0; const int sectionSize = 24; for (int i = 0; i < totalSpecialValues; i++) { - var length = OpenProtocolConvert.ToInt32(value.Substring(22 + index, 2)); + var length = OpenProtocolConvert.ToInt32(value.Slice(22 + index, 2)); var totalSize = length + (useStepNumber ? sectionSize + 2 : sectionSize); - var section = value.Substring(index, totalSize); + var section = value.Slice(index, totalSize); index += totalSize; - yield return Parse(section, useStepNumber); + result.Add(Parse(section, useStepNumber)); } + return result; + } + } + + public class SpecialValueCollectionDefinitionAttribute : DataFieldDefinitionAttribute + { + public bool UseStepNumber { get; set; } + + public SpecialValueCollectionDefinitionAttribute(int revision) : base(revision) + { + + } + public SpecialValueCollectionDefinitionAttribute(int field, int revision) : base(field, revision) + { + } + internal override DataField Build(object owner, PropertyInfo propertyInfo, int index) + { + return new DataField>(Field, index, Size, HasPrefix) + { + DefaultConverter = PackSpecialValues, + DefaultParser = ParseSpecialValues + }.Bind(owner, propertyInfo); + } + + private string PackSpecialValues(char paddingChar, int size, PaddingOrientation orientation, List specialValues) + { + var packages = string.Join(string.Empty, specialValues.Select(x => x.Pack(UseStepNumber))); + return string.Concat(OpenProtocolConvert.ToString('0', 2, PaddingOrientation.LeftPadded, specialValues.Count), packages); + } + private List ParseSpecialValues(string value) + { + return SpecialValue.ParseAll(value, UseStepNumber).ToList(); + } } } diff --git a/src/OpenProtocolInterpreter/PowerMACS/StepResult.cs b/src/OpenProtocolInterpreter/PowerMACS/StepResult.cs index 2e8c514a..ced683dc 100644 --- a/src/OpenProtocolInterpreter/PowerMACS/StepResult.cs +++ b/src/OpenProtocolInterpreter/PowerMACS/StepResult.cs @@ -1,4 +1,10 @@ -namespace OpenProtocolInterpreter.PowerMACS +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; + +namespace OpenProtocolInterpreter.PowerMACS { /// /// Represents a Step Result entity @@ -10,4 +16,82 @@ public class StepResult public object Value { get; set; } public int StepNumber { get; set; } } + + public class StepResultCollectionDefinitionAttribute : DataFieldDefinitionAttribute + { + public StepResultCollectionDefinitionAttribute(int revision) : base(revision) + { + + } + public StepResultCollectionDefinitionAttribute(int field, int revision) : base(field, revision) + { + + } + + internal override DataField Build(object owner, PropertyInfo propertyInfo, int index) + { + return new DataField>(Field, index, Size, HasPrefix) + { + DefaultConverter = PackStepResults, + DefaultParser = ParseStepResults + }.Bind(owner, propertyInfo); + } + + protected static string PackStepResults(char paddingChar, int size, PaddingOrientation orientation, List stepResults) + { + var builder = new StringBuilder(); + foreach (var step in stepResults) + { + builder.Append(OpenProtocolConvert.TruncatePadded(' ', 20, PaddingOrientation.RightPadded, step.VariableName)); + builder.Append(step.Type.Type); + if (DataType.DataTypes[1].Type.Equals(step.Type.Type)) // Integer + { + builder.Append(OpenProtocolConvert.ToString('0', 7, PaddingOrientation.LeftPadded, (int)step.Value)); + } + else if (DataType.DataTypes[2].Type.Equals(step.Type.Type)) // Decimal + { + builder.Append(OpenProtocolConvert.ToString('0', 7, PaddingOrientation.LeftPadded, (decimal)step.Value)); + } + else + { + throw new ArgumentException($"Unsupported data type: '{step.Type.Type}', it should be only either Integer ('I ') or Decimal ('F ')"); + } + builder.Append(OpenProtocolConvert.ToString('0', 2, PaddingOrientation.LeftPadded, step.StepNumber)); + } + + return builder.ToString(); + } + + protected static List ParseStepResults(string package) + { + var list = new List(); + var section = package.AsSpan(); + for (int i = 0; i < section.Length; i += 31) + { + var type = section.Slice(20 + i, 2).ToString(); + var result = new StepResult() + { + VariableName = section.Slice(i, 20).ToString(), + Type = DataType.DataTypes.First(x => x.Type.Trim() == type.Trim()), + StepNumber = OpenProtocolConvert.ToInt32(section.Slice(29 + i, 2)) + }; + + var resultValue = section.Slice(22 + i, 7); + if (result.Type.Type == DataType.DataTypes[1].Type) // Integer + { + result.Value = OpenProtocolConvert.ToInt32(resultValue); + } + else if (result.Type.Type == DataType.DataTypes[2].Type) // Decimal + { + var decimalPointIndex = resultValue.IndexOf('.'); + int decimalPlaces = decimalPointIndex >= 0 ? resultValue.Slice(decimalPointIndex + 1).Length : 0; + result.Value = OpenProtocolConvert.ToDecimal(resultValue); + } + + list.Add(result); + } + + return list; + } + } } diff --git a/src/OpenProtocolInterpreter/Result/Mid1201.cs b/src/OpenProtocolInterpreter/Result/Mid1201.cs index e1360e0b..65071295 100644 --- a/src/OpenProtocolInterpreter/Result/Mid1201.cs +++ b/src/OpenProtocolInterpreter/Result/Mid1201.cs @@ -1,20 +1,21 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace OpenProtocolInterpreter.Result { + /// /// Operation result Overall data /// - /// This MID contains the overall result data and some of the object data of the last tightening. - /// In the subscription of this message it can be chosen to also start subscription of Operation result object data. + /// This MID contains the overall result data and some of the object data of the last tightening. + /// In the subscription of this message it can be chosen to also start subscription of Operation result object data. /// The user defined values is preconfigured in the controller via the configuration tool. /// /// Message sent by: Controller /// - /// Answer: Operation result data acknowledge or + /// Answer: Operation result data acknowledge or /// with in the data field. /// /// If the sequence number acknowledge functionality is used there is no need for these acknowledges. @@ -23,195 +24,258 @@ public class Mid1201 : Mid, IResult, IController, IAcknowledgeable, IAc { public const int MID = 1201; - public int TotalNumberOfMessages + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 3, HasPrefix = false)] + [Int32DataFieldDefinition(revision: 2, field: 1, Index = 20, Size = 3, HasPrefix = false)] + [Int32DataFieldDefinition(revision: 3, field: 1, Index = 20, Size = 3, HasPrefix = false)] + public int TotalNumberOfMessages { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 2, Index = 23, Size = 3, HasPrefix = false)] + [Int32DataFieldDefinition(revision: 2, field: 2, Index = 23, Size = 3, HasPrefix = false)] + [Int32DataFieldDefinition(revision: 3, field: 2, Index = 23, Size = 3, HasPrefix = false)] + public int MessageNumber { get; set; } + + [Int64DataFieldDefinition(revision: 1, field: 3, Index = 26, Size = 10, HasPrefix = false)] + [Int64DataFieldDefinition(revision: 2, field: 3, Index = 26, Size = 10, HasPrefix = false)] + [Int64DataFieldDefinition(revision: 3, field: 3, Index = 26, Size = 10, HasPrefix = false)] + public long ResultDataIdentifier { get; set; } + + [TimestampDataFieldDefinition(revision: 1, field: 4, Index = 36, HasPrefix = false)] + [TimestampDataFieldDefinition(revision: 2, field: 4, Index = 36, HasPrefix = false)] + [TimestampDataFieldDefinition(revision: 3, field: 4, Index = 36, HasPrefix = false)] + public DateTime Time { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 5, Index = 55, Size = 1, HasPrefix = false)] + [Int32DataFieldDefinition(revision: 2, field: 5, Index = 55, Size = 1, HasPrefix = false)] + [Int32DataFieldDefinition(revision: 3, field: 5, Index = 55, Size = 1, HasPrefix = false)] + public int ResultStatus { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 6, Index = 56, Size = 2, HasPrefix = false)] + [Int32DataFieldDefinition(revision: 2, field: 6, Index = 56, Size = 2, HasPrefix = false)] + [Int32DataFieldDefinition(revision: 3, field: 6, Index = 56, Size = 2, HasPrefix = false)] + public OperationType OperationType { get; set; } + + [Int32DataFieldDefinition(revision: 2, field: 7, Index = 58, Size = 4, HasPrefix = false)] + [Int32DataFieldDefinition(revision: 3, field: 7, Index = 58, Size = 4, HasPrefix = false)] + public int RequestMid { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 7, Index = 58, Size = 3, HasPrefix = false)] + [Int32DataFieldDefinition(revision: 2, field: 8, Index = 62, Size = 3, HasPrefix = false)] + [Int32DataFieldDefinition(revision: 3, field: 8, Index = 62, Size = 3, HasPrefix = false)] + public int NumberOfObjects { get; set; } + + [ObjectDataCollectionDefinition(revision: 1, field: 8, Index = 61, Size = 0, HasPrefix = false)] + [ObjectDataCollectionDefinition(revision: 2, field: 9, Index = 65, Size = 0, HasPrefix = false)] + [ObjectDataCollectionDefinition(revision: 3, field: 9, Index = 65, Size = 0, HasPrefix = false)] + public List ObjectDataList { get; set; } = new List(); + + [Int32DataFieldDefinition(revision: 1, field: 9, Index = 0, Size = 3, HasPrefix = false)] + [Int32DataFieldDefinition(revision: 2, field: 10, Index = 0, Size = 3, HasPrefix = false)] + [Int32DataFieldDefinition(revision: 3, field: 10, Index = 0, Size = 3, HasPrefix = false)] + public int NumberOfDataFields { get; set; } + + [VariableDataFieldCollectionDefinition(revision: 1, field: 10, Index = 0, Size = 0, HasPrefix = false)] + [VariableDataFieldCollectionDefinition(revision: 2, field: 11, Index = 0, Size = 0, HasPrefix = false)] + [VariableDataFieldCollectionDefinition(revision: 3, field: 11, Index = 0, Size = 0, HasPrefix = false)] + public List VariableDataFields { get; set; } = new List(); + + public Mid1201() : this(DEFAULT_REVISION) { - get => GetField(Header.StandardizedRevision, DataFields.TotalMessages).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(Header.StandardizedRevision, DataFields.TotalMessages).SetValue(OpenProtocolConvert.ToString, value); + } - public int MessageNumber + + public Mid1201(int revision) : this(new Header() { - get => GetField(Header.StandardizedRevision, DataFields.MessageNumber).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(Header.StandardizedRevision, DataFields.MessageNumber).SetValue(OpenProtocolConvert.ToString, value); - } - public int ResultDataIdentifier + Mid = MID, + Revision = revision + }) { - get => GetField(Header.StandardizedRevision, DataFields.ResultDataIdentifier).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(Header.StandardizedRevision, DataFields.ResultDataIdentifier).SetValue(OpenProtocolConvert.ToString, value); } - public DateTime Time + + public Mid1201(Header header) : base(header) { - get => GetField(Header.StandardizedRevision, DataFields.Time).GetValue(OpenProtocolConvert.ToDateTime); - set => GetField(Header.StandardizedRevision, DataFields.Time).SetValue(OpenProtocolConvert.ToString, value); + ObjectDataList = []; + VariableDataFields = []; } - public bool ResultStatus + + protected override string BuildHeader() { - get => GetField(Header.StandardizedRevision, DataFields.ResultStatus).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(Header.StandardizedRevision, DataFields.ResultStatus).SetValue(OpenProtocolConvert.ToString, value); + var fields = DataFieldsByRevision(); + Header.Length = Header.DefaultSize + fields.Sum(x => x.TotalSize); + return Header.ToString(); } - public OperationType OperationType + + public override string Pack() { - get => (OperationType)GetField(Header.StandardizedRevision, DataFields.OperationType).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(Header.StandardizedRevision, DataFields.OperationType).SetValue(OpenProtocolConvert.ToString, value); + NumberOfObjects = ObjectDataList?.Count ?? 0; + NumberOfDataFields = VariableDataFields?.Count ?? 0; + if (Header.StandardizedRevision == 1) + { + GetField(revision: Header.StandardizedRevision, field: 8).Size = NumberOfObjects * ObjectData.Size(Header.StandardizedRevision); + GetField(revision: Header.StandardizedRevision, field: 10).Size = VariableDataFields.Sum(x => x.TotalSize); + } + else + { + GetField(revision: Header.StandardizedRevision, field: 9).Size = NumberOfObjects * ObjectData.Size(Header.StandardizedRevision); + GetField(revision: Header.StandardizedRevision, field: 11).Size = VariableDataFields.Sum(x => x.TotalSize); + } + + var builder = new StringBuilder(); + builder.Append(BuildHeader()); + builder.Append(Pack(DataFieldsByRevision())); + return builder.ToString(); } - public int RequestMid + + protected override void ProcessDataField(DataField dataField, ReadOnlySpan package) { - get => GetField(Header.StandardizedRevision, DataFields.RequestMid).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(Header.StandardizedRevision, DataFields.RequestMid).SetValue(OpenProtocolConvert.ToString, value); + switch (dataField.Field) + { + case 8 when dataField is DataField>: + case 9 when dataField is DataField>: + dataField.Size = NumberOfObjects * ObjectData.Size(Header.StandardizedRevision); + break; + case 10 when dataField is DataField>: //StepResults + case 11 when dataField is DataField>: + dataField.Size = Header.Length - dataField.Index; + break; + } + + base.ProcessDataField(dataField, package); } - public int NumberOfObjects + + protected override void ProcessDataFields(ReadOnlySpan package) { - get => GetField(Header.StandardizedRevision, DataFields.NumberOfObjects).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(Header.StandardizedRevision, DataFields.NumberOfObjects).SetValue(OpenProtocolConvert.ToString, value); + foreach (var field in DataFieldsByRevision()) + ProcessDataField(field, package); } - public int NumberOfDataFields + + private IEnumerable DataFieldsByRevision() { - get => GetField(Header.StandardizedRevision, DataFields.NumberOfDataFields).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(Header.StandardizedRevision, DataFields.NumberOfDataFields).SetValue(OpenProtocolConvert.ToString, value); + var previousField = default(DataField); + foreach (var dataField in RevisionsByFields[Header.StandardizedRevision]) + { + if (previousField != null && dataField.Index == 0) + { + dataField.Index = previousField.Index + previousField.TotalSize; + } + + previousField = dataField; + yield return dataField; + } } - public List ObjectDataList { get; set; } - public List VariableDataFields { get; set; } + } - public Mid1201() : this(DEFAULT_REVISION) + public class Mid1201ExtraDataRequest : ExtraData, IExtraDataRequest + { + public override int Mid => Mid1201.MID; + + [Int64DataFieldDefinition(revision: 1, field: 1, Index = 0, Size = 10, HasPrefix = false)] + public long Index { get; set; } + + public Mid1201ExtraDataRequest() : this(2) { } - public Mid1201(int revision) : this(new Header() - { - Mid = MID, - Revision = revision - }) + public Mid1201ExtraDataRequest(int revision) : base(revision) { } + } - public Mid1201(Header header) : base(header) + public class Mid1201ExtraDataSubscription : ExtraData, IExtraDataSubscription + { + public override int Mid => Mid1201.MID; + + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 0, Size = 10, HasPrefix = false)] + public int SendAlternatives { get; set; } + + [TimestampDataFieldDefinition(revision: 1, field: 2, Index = 10, HasPrefix = false)] + public DateTime DataIdentifierTimestamp { get; set; } + + [BooleanDataFieldDefinition(revision: 1, field: 4, Index = 29, HasPrefix = false)] + public bool SendObjectData { get; set; } + + public Mid1201ExtraDataSubscription() : this(1) { - ObjectDataList = []; - VariableDataFields = []; + } - protected override string BuildHeader() + public Mid1201ExtraDataSubscription(int revision) : base(revision) { - Header.Length = 20 + RevisionsByFields[Header.StandardizedRevision].Sum(x => x.Size + (x.HasPrefix ? 2 : 0)); - return Header.ToString(); } + } - public override string Pack() + public class Mid1201SecondAlternativeExtraDataSubscription : ExtraData, IExtraDataSubscription + { + public override int Mid => Mid1201.MID; + + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 0, Size = 10, HasPrefix = false)] + public int SendAlternatives { get; set; } + + [UnixTimestampDataFieldDefinition(revision: 1, field: 2, Index = 10, HasPrefix = false)] + public DateTimeOffset DataIdentifierTimestamp { get; set; } + + [BooleanDataFieldDefinition(revision: 1, field: 4, Index = 20, HasPrefix = false)] + public bool SendObjectData { get; set; } + + public Mid1201SecondAlternativeExtraDataSubscription() : this(1) { - NumberOfObjects = ObjectDataList.Count; - NumberOfDataFields = VariableDataFields.Count; - var revision = Header.StandardizedRevision; - GetField(revision, DataFields.ObjectData).SetValue(PackObjectDataList()); - GetField(revision, DataFields.DataFieldList).SetValue(OpenProtocolConvert.ToString(VariableDataFields)); - var index = 1; - return string.Concat(BuildHeader(), base.Pack(revision, ref index)); } - public override Mid Parse(string package) + public Mid1201SecondAlternativeExtraDataSubscription(int revision) : base(revision) { - Header = ProcessHeader(package); + } + } - var revision = Header.StandardizedRevision; - var rawTotalObjectData = GetValue(GetField(revision, DataFields.NumberOfObjects), package); - int totalObjectData = OpenProtocolConvert.ToInt32(rawTotalObjectData); + public class Mid1201ThirdAlternativeExtraDataSubscription : ExtraData, IExtraDataSubscription + { + public override int Mid => Mid1201.MID; - var objectDataField = GetField(revision, DataFields.ObjectData); - objectDataField.Size = totalObjectData * ObjectData.Size(Header.Revision); + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 0, Size = 1, HasPrefix = false)] + public int SendAlternatives { get; set; } = 3; - var totalNumberDataField = GetField(revision, DataFields.NumberOfDataFields); - totalNumberDataField.Index = objectDataField.Index + objectDataField.Size; + [Int64DataFieldDefinition(revision: 1, field: 2, Index = 1, Size = 10, HasPrefix = false)] + public long DataIdentifierFirstIndex { get; set; } - var dataFieldListField = GetField(revision, DataFields.DataFieldList); - dataFieldListField.Index = totalNumberDataField.Index + totalNumberDataField.Size; - dataFieldListField.Size = Header.Length - dataFieldListField.Index; + [Int64DataFieldDefinition(revision: 1, field: 3, Index = 11, Size = 10, HasPrefix = false)] + public long DataIdentifierLastIndex { get; set; } - ProcessDataFields(revision, package); - ObjectDataList = ObjectData.ParseAll(revision, objectDataField.Value).ToList(); - VariableDataFields = VariableDataField.ParseAll(dataFieldListField.Value).ToList(); - return this; - } + [BooleanDataFieldDefinition(revision: 1, field: 4, Index = 21, HasPrefix = false)] + public bool SendObjectData { get; set; } - protected virtual string PackObjectDataList() + public Mid1201ThirdAlternativeExtraDataSubscription() : this(1) { - var builder = new StringBuilder(); - foreach (var v in ObjectDataList) - { - builder.Append(v.Pack(Header.StandardizedRevision)); - } - return builder.ToString(); } + public Mid1201ThirdAlternativeExtraDataSubscription(int revision) : base(revision) + { + } + } - protected override Dictionary> RegisterDatafields() + public class Mid1201FourthAlternativeExtraDataSubscription : ExtraData, IExtraDataSubscription + { + public override int Mid => Mid1201.MID; + + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 0, Size = 1, HasPrefix = false)] + public int SendAlternatives { get; set; } = 3; + + [UnixTimestampDataFieldDefinition(revision: 1, field: 2, Index = 1, Size = 10, HasPrefix = false)] + public DateTimeOffset DataIdentifierFirstIndex { get; set; } + + [UnixTimestampDataFieldDefinition(revision: 1, field: 3, Index = 11, Size = 10, HasPrefix = false)] + public DateTimeOffset DataIdentifierLastIndex { get; set; } + + [BooleanDataFieldDefinition(revision: 1, field: 4, Index = 21, HasPrefix = false)] + public bool SendObjectData { get; set; } + + public Mid1201FourthAlternativeExtraDataSubscription() : this(1) { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.TotalMessages, 20, 3, false), - DataField.Number(DataFields.MessageNumber, 23, 3, false), - DataField.Number(DataFields.ResultDataIdentifier, 26, 10, false), - DataField.Timestamp(DataFields.Time, 36, false), - DataField.Boolean(DataFields.ResultStatus, 55, false), - DataField.Number(DataFields.OperationType, 56, 2, false), - DataField.Number(DataFields.NumberOfObjects, 58, 3, false), - DataField.Volatile(DataFields.ObjectData, 61, false), - DataField.Number(DataFields.NumberOfDataFields, 0, 3, false), - DataField.Volatile(DataFields.DataFieldList, 0, false) - } - }, - { - 2, new List() - { - DataField.Number(DataFields.TotalMessages, 20, 3, false), - DataField.Number(DataFields.MessageNumber, 23, 3, false), - DataField.Number(DataFields.ResultDataIdentifier, 26, 10, false), - DataField.Timestamp(DataFields.Time, 36, false), - DataField.Boolean(DataFields.ResultStatus, 55, false), - DataField.Number(DataFields.OperationType, 56, 2, false), - DataField.Number(DataFields.RequestMid, 58, 4, false), - DataField.Number(DataFields.NumberOfObjects, 62, 3, false), - DataField.Volatile(DataFields.ObjectData, 65, false), - DataField.Number(DataFields.NumberOfDataFields, 0, 3, false), - DataField.Volatile(DataFields.DataFieldList, 0, false) - } - }, - { - 3, new List() - { - DataField.Number(DataFields.TotalMessages, 20, 3, false), - DataField.Number(DataFields.MessageNumber, 23, 3, false), - DataField.Number(DataFields.ResultDataIdentifier, 26, 10, false), - DataField.Timestamp(DataFields.Time, 36, false), - DataField.Boolean(DataFields.ResultStatus, 55, false), - DataField.Number(DataFields.OperationType, 56, 2, false), - DataField.Number(DataFields.RequestMid, 58, 4, false), - DataField.Number(DataFields.NumberOfObjects, 62, 3, false), - DataField.Volatile(DataFields.ObjectData, 65, false), - DataField.Number(DataFields.NumberOfDataFields, 0, 3, false), - DataField.Volatile(DataFields.DataFieldList, 0, false) - } - } - }; + } - protected enum DataFields + public Mid1201FourthAlternativeExtraDataSubscription(int revision) : base(revision) { - TotalMessages, - MessageNumber, - ResultDataIdentifier, - Time, - ResultStatus, - OperationType, - RequestMid, - NumberOfObjects, - ObjectData, // list of data - NumberOfDataFields, - DataFieldList } } } - diff --git a/src/OpenProtocolInterpreter/Result/Mid1202.cs b/src/OpenProtocolInterpreter/Result/Mid1202.cs index f6afabe9..6d07cc26 100644 --- a/src/OpenProtocolInterpreter/Result/Mid1202.cs +++ b/src/OpenProtocolInterpreter/Result/Mid1202.cs @@ -1,63 +1,59 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; +using System.Text; namespace OpenProtocolInterpreter.Result { /// /// Operation result object data /// - /// This message contains the cycle data for one object, both data for the whole process and data related to - /// the different steps in the process.The user defined values are preconfigured in the controller via the + /// This message contains the cycle data for one object, both data for the whole process and data related to + /// the different steps in the process.The user defined values are preconfigured in the controller via the /// configuration tool. The message uses the Variable Parameter pattern for transmission of the values. /// /// - /// Note: Only values that exist in the result will be sent.So the actual data received may vary between + /// Note: Only values that exist in the result will be sent.So the actual data received may vary between /// the cycles if the settings differ between different programs. /// /// Message sent by: Controller /// - /// Answer: Operation result data acknowledge or + /// Answer: Operation result data acknowledge or /// with in the data field. /// - /// + /// /// If the sequence number acknowledge functionality is used there is no need for these acknowledges. /// public class Mid1202 : Mid, IResult, IController, IAcknowledgeable, IAcceptableCommand { public const int MID = 1202; - public int TotalNumberOfMessages - { - get => GetField(Header.StandardizedRevision, DataFields.TotalMessages).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(Header.StandardizedRevision, DataFields.TotalMessages).SetValue(OpenProtocolConvert.ToString, value); - } - public int MessageNumber - { - get => GetField(Header.StandardizedRevision, DataFields.MessageNumber).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(Header.StandardizedRevision, DataFields.MessageNumber).SetValue(OpenProtocolConvert.ToString, value); - } - public long ResultDataIdentifier - { - get => GetField(Header.StandardizedRevision, DataFields.ResultDataIdentifier).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(Header.StandardizedRevision, DataFields.ResultDataIdentifier).SetValue(OpenProtocolConvert.ToString, value); - } - public int ObjectId - { - get => GetField(Header.StandardizedRevision, DataFields.ObjectId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(Header.StandardizedRevision, DataFields.ObjectId).SetValue(OpenProtocolConvert.ToString, value); - } - public string NodeGuid - { - get => GetField(Header.StandardizedRevision, DataFields.NodeGuid).Value; - set => GetField(Header.StandardizedRevision, DataFields.NodeGuid).SetValue(value); - } - public int NumberOfDataFields - { - get => GetField(Header.StandardizedRevision, DataFields.NumberOfDataFields).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(Header.StandardizedRevision, DataFields.NumberOfDataFields).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 3, HasPrefix = false)] + [Int32DataFieldDefinition(revision: 2, field: 1, Index = 20, Size = 3, HasPrefix = false)] + public int TotalNumberOfMessages { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 2, Index = 23, Size = 3, HasPrefix = false)] + [Int32DataFieldDefinition(revision: 2, field: 2, Index = 23, Size = 3, HasPrefix = false)] + public int MessageNumber { get; set; } + + [Int64DataFieldDefinition(revision: 1, field: 3, Index = 26, Size = 10, HasPrefix = false)] + [Int64DataFieldDefinition(revision: 2, field: 3, Index = 26, Size = 10, HasPrefix = false)] + public long ResultDataIdentifier { get; set; } - public List VariableDataFields { get; set; } + [Int32DataFieldDefinition(revision: 1, field: 4, Index = 36, Size = 4, HasPrefix = false)] + [Int32DataFieldDefinition(revision: 2, field: 4, Index = 36, Size = 4, HasPrefix = false)] + public int ObjectId { get; set; } + + [StringDataFieldDefinition(revision: 2, field: 5, Index = 40, Size = 36, HasPrefix = false)] + public string NodeGuid { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 5, Index = 40, Size = 3, HasPrefix = false)] + [Int32DataFieldDefinition(revision: 2, field: 6, Index = 76, Size = 3, HasPrefix = false)] + public int NumberOfDataFields { get; set; } + + [VariableDataFieldCollectionDefinition(revision: 1, field: 6, Index = 43, Size = 0, HasPrefix = false)] + [VariableDataFieldCollectionDefinition(revision: 2, field: 7, Index = 79, Size = 0, HasPrefix = false)] + public List VariableDataFields { get; set; } = new List(); public Mid1202() : this(new Header() { @@ -71,72 +67,58 @@ public Mid1202(Header header) : base(header) { VariableDataFields = []; } + protected override string BuildHeader() { - Header.Length = 20 + RevisionsByFields[Header.StandardizedRevision].Sum(x => x.TotalSize); + var fields = DataFieldsByRevision(); + Header.Length = Header.DefaultSize + fields.Sum(x => x.TotalSize); return Header.ToString(); } public override string Pack() { - NumberOfDataFields = VariableDataFields.Count; - var revision = Header.StandardizedRevision; - GetField(revision, DataFields.VariableDataFields).SetValue(OpenProtocolConvert.ToString(VariableDataFields)); - int prefixIndex = 0; - return string.Concat(BuildHeader(), base.Pack(revision, ref prefixIndex)); + NumberOfDataFields = VariableDataFields?.Count ?? 0; //Enforce list size even if modified + var field = Header.StandardizedRevision > 1 ? 7 : 6; + GetField(revision: Header.StandardizedRevision, field: field).Size = VariableDataFields?.Sum(x => x.TotalSize) ?? 0; //Enforce size of variable data fields + + var builder = new StringBuilder(); + builder.Append(BuildHeader()); + builder.Append(Pack(DataFieldsByRevision())); + return builder.ToString(); } - public override Mid Parse(string package) + protected override void ProcessDataField(DataField dataField, ReadOnlySpan package) { - Header = ProcessHeader(package); - var revision = Header.StandardizedRevision; - var variableDataField = GetField(revision, DataFields.VariableDataFields); - variableDataField.Size = Header.Length - variableDataField.Index; - ProcessDataFields(revision, package); - - VariableDataFields = VariableDataField.ParseAll(variableDataField.Value).ToList(); - return this; + switch (dataField.Field) + { + case 6 when dataField is DataField>: + case 7 when dataField is DataField>: + dataField.Size = Header.Length - dataField.Index; + break; + } + + base.ProcessDataField(dataField, package); } - protected override Dictionary> RegisterDatafields() + protected override void ProcessDataFields(ReadOnlySpan package) { - return new Dictionary>() + foreach (var field in DataFieldsByRevision()) + ProcessDataField(field, package); + } + + private IEnumerable DataFieldsByRevision() + { + var previousField = default(DataField); + foreach (var dataField in RevisionsByFields[Header.StandardizedRevision]) { + if (previousField != null && dataField.Index == 0) { - 1, new List() - { - DataField.Number(DataFields.TotalMessages, 20, 3, false), - DataField.Number(DataFields.MessageNumber, 23, 3, false), - DataField.Number(DataFields.ResultDataIdentifier, 26, 10, false), - DataField.Number(DataFields.ObjectId, 36, 4, false), - DataField.Number(DataFields.NumberOfDataFields, 40, 3, false), - DataField.Volatile(DataFields.VariableDataFields, 43, false) //defined at runtime - } - }, - { - 2, new List() - { - DataField.Number(DataFields.TotalMessages, 20, 3, false), - DataField.Number(DataFields.MessageNumber, 23, 3, false), - DataField.Number(DataFields.ResultDataIdentifier, 26, 10, false), - DataField.Number(DataFields.ObjectId, 36, 4, false), - DataField.String(DataFields.NodeGuid, 40, 36, false), - DataField.Number(DataFields.NumberOfDataFields, 76, 3, false), - DataField.Volatile(DataFields.VariableDataFields, 79, false) //defined at runtime - } + dataField.Index = previousField.Index + previousField.TotalSize; } - }; - } - protected enum DataFields - { - TotalMessages, - MessageNumber, - ResultDataIdentifier, - ObjectId, - NodeGuid, - NumberOfDataFields, - VariableDataFields + previousField = dataField; + yield return dataField; + } } } } diff --git a/src/OpenProtocolInterpreter/Result/ObjectData.cs b/src/OpenProtocolInterpreter/Result/ObjectData.cs index b56b75f7..40034171 100644 --- a/src/OpenProtocolInterpreter/Result/ObjectData.cs +++ b/src/OpenProtocolInterpreter/Result/ObjectData.cs @@ -1,4 +1,7 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; using System.Text; namespace OpenProtocolInterpreter.Result @@ -19,10 +22,10 @@ public string Pack() public string Pack(int revision) { var package = OpenProtocolConvert.ToString('0', 4, PaddingOrientation.LeftPadded, Id) + OpenProtocolConvert.ToString(Status); - if(revision > 2) + if (revision > 2) { - return string.Concat(package, - OpenProtocolConvert.ToString((int)ObjectType), + return string.Concat(package, + OpenProtocolConvert.ToString((int)ObjectType), OpenProtocolConvert.ToString('0', 4, PaddingOrientation.LeftPadded, ReferenceObjectId)); } @@ -33,30 +36,35 @@ public static ObjectData Parse(string value) => Parse(1, value); public static ObjectData Parse(int revision, string value) + => Parse(revision, value.AsSpan()); + + public static ObjectData Parse(int revision, ReadOnlySpan value) { var obj = new ObjectData() { - Id = OpenProtocolConvert.ToInt32(value.Substring(0, 4)), - Status = OpenProtocolConvert.ToBoolean(value.Substring(4, 1)) + Id = OpenProtocolConvert.ToInt32(value.Slice(0, 4)), + Status = OpenProtocolConvert.ToBoolean(value.Slice(4, 1)) }; if (revision > 2) { - obj.ObjectType = (ObjectType)OpenProtocolConvert.ToInt32(value.Substring(5, 1)); - obj.ReferenceObjectId = OpenProtocolConvert.ToInt32(value.Substring(6, 4)); + obj.ObjectType = (ObjectType)OpenProtocolConvert.ToInt32(value.Slice(5, 1)); + obj.ReferenceObjectId = OpenProtocolConvert.ToInt32(value.Slice(6, 4)); } return obj; } public static IEnumerable ParseAll(int revision, string value) + => ParseAll(revision, value.AsSpan()); + + public static IEnumerable ParseAll(int revision, ReadOnlySpan value) { int sectionSize = Size(revision); + var result = new List(); for (int i = 0; i < value.Length; i += sectionSize) - { - var section = value.Substring(i, sectionSize); - yield return Parse(revision, section); - } + result.Add(Parse(revision, value.Slice(i, sectionSize))); + return result; } public static IEnumerable ParseAll(string value) @@ -64,4 +72,31 @@ public static IEnumerable ParseAll(string value) internal static int Size(int revision) => revision > 2 ? 10 : 5; } + + public class ObjectDataCollectionDefinitionAttribute : DataFieldDefinitionAttribute + { + public ObjectDataCollectionDefinitionAttribute(int revision) : base(revision) + { + + } + public ObjectDataCollectionDefinitionAttribute(int field, int revision) : base(field, revision) + { + + } + + internal override DataField Build(object owner, PropertyInfo propertyInfo, int index) + { + return new DataField>(Field, index, Size, HasPrefix) + { + DefaultConverter = Pack, + DefaultParser = Parse + }.Bind(owner, propertyInfo); + } + + private string Pack(char paddingChar, int size, PaddingOrientation orientation, List value) + => string.Join("", value.Select(t => t.Pack(Revision))); + + private List Parse(string value) + => ObjectData.ParseAll(Revision, value).ToList(); + } } diff --git a/src/OpenProtocolInterpreter/Result/ResultMessages.cs b/src/OpenProtocolInterpreter/Result/ResultMessages.cs index e0824101..1cdfe7d0 100644 --- a/src/OpenProtocolInterpreter/Result/ResultMessages.cs +++ b/src/OpenProtocolInterpreter/Result/ResultMessages.cs @@ -11,11 +11,11 @@ internal class ResultMessages : MessagesTemplate { public ResultMessages() : base() { - _templates = new Dictionary() + _templates = new Dictionary>() { - { Mid1201.MID, new MidCompiledInstance(typeof(Mid1201)) }, - { Mid1202.MID, new MidCompiledInstance(typeof(Mid1202)) }, - { Mid1203.MID, new MidCompiledInstance(typeof(Mid1203)) } + { Mid1201.MID, new CompiledInstance(typeof(Mid1201)) }, + { Mid1202.MID, new CompiledInstance(typeof(Mid1202)) }, + { Mid1203.MID, new CompiledInstance(typeof(Mid1203)) } }; } diff --git a/src/OpenProtocolInterpreter/Statistic/Mid0300.cs b/src/OpenProtocolInterpreter/Statistic/Mid0300.cs index 8eed0132..eae66d33 100644 --- a/src/OpenProtocolInterpreter/Statistic/Mid0300.cs +++ b/src/OpenProtocolInterpreter/Statistic/Mid0300.cs @@ -6,13 +6,13 @@ namespace OpenProtocolInterpreter.Statistic /// Histogram upload request /// /// Request to upload a histogram from the controller for a certain parameter set. - /// The histogram is calculated with all the tightening results currently present in - /// the controller’s memory and within the statistic acceptance window(statistic min and max limits) + /// The histogram is calculated with all the tightening results currently present in + /// the controller’s memory and within the statistic acceptance window(statistic min and max limits) /// for the requested parameter set. /// /// Message sent by: Integrator /// - /// Answer: Histogram upload reply, or + /// Answer: Histogram upload reply, or /// Command error, No histogram available or Invalid data /// /// @@ -22,16 +22,11 @@ public class Mid0300 : Mid, IStatistic, IIntegrator, IAnswerableBy, IDe public IEnumerable DocumentedPossibleErrors => new Error[] { Error.NoHistogramAvailable, Error.InvalidData }; - public int ParameterSetId - { - get => GetField(1, DataFields.ParameterSetId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.ParameterSetId).SetValue(OpenProtocolConvert.ToString, value); - } - public HistogramType HistogramType - { - get => (HistogramType)GetField(1, DataFields.HistogramType).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.HistogramType).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 3)] + public int ParameterSetId { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 2, Index = 25, Size = 2)] + public HistogramType HistogramType { get; set; } public Mid0300() : this(new Header() { @@ -44,25 +39,5 @@ public Mid0300() : this(new Header() public Mid0300(Header header) : base(header) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.ParameterSetId, 20, 3), - DataField.Number(DataFields.HistogramType, 25, 2) - } - } - }; - } - - protected enum DataFields - { - ParameterSetId, - HistogramType - } } } diff --git a/src/OpenProtocolInterpreter/Statistic/Mid0301.cs b/src/OpenProtocolInterpreter/Statistic/Mid0301.cs index f6d0c1ac..826687b0 100644 --- a/src/OpenProtocolInterpreter/Statistic/Mid0301.cs +++ b/src/OpenProtocolInterpreter/Statistic/Mid0301.cs @@ -15,76 +15,42 @@ public class Mid0301 : Mid, IStatistic, IController { public const int MID = 301; - public int ParameterSetId - { - get => GetField(1, DataFields.ParameterSetId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.ParameterSetId).SetValue(OpenProtocolConvert.ToString, value); - } - public HistogramType HistogramType - { - get => (HistogramType)GetField(1, DataFields.HistogramType).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.HistogramType).SetValue(OpenProtocolConvert.ToString, value); - } - public decimal SigmaHistogram - { - get => GetField(1, DataFields.SigmaHistogram).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(1, DataFields.SigmaHistogram).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal MeanValueHistogram - { - get => GetField(1, DataFields.MeanValueHistogram).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(1, DataFields.MeanValueHistogram).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal ClassRange - { - get => GetField(1, DataFields.ClassRange).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(1, DataFields.ClassRange).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public int FirstBar - { - get => GetField(1, DataFields.Bar1).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.Bar1).SetValue(OpenProtocolConvert.ToString, value); - } - public int SecondBar - { - get => GetField(1, DataFields.Bar2).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.Bar2).SetValue(OpenProtocolConvert.ToString, value); - } - public int ThirdBar - { - get => GetField(1, DataFields.Bar3).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.Bar3).SetValue(OpenProtocolConvert.ToString, value); - } - public int FourthBar - { - get => GetField(1, DataFields.Bar4).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.Bar4).SetValue(OpenProtocolConvert.ToString, value); - } - public int FifthBar - { - get => GetField(1, DataFields.Bar5).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.Bar5).SetValue(OpenProtocolConvert.ToString, value); - } - public int SixthBar - { - get => GetField(1, DataFields.Bar6).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.Bar6).SetValue(OpenProtocolConvert.ToString, value); - } - public int SeventhBar - { - get => GetField(1, DataFields.Bar7).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.Bar7).SetValue(OpenProtocolConvert.ToString, value); - } - public int EighthBar - { - get => GetField(1, DataFields.Bar8).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.Bar8).SetValue(OpenProtocolConvert.ToString, value); - } - public int NinethBar - { - get => GetField(1, DataFields.Bar9).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.Bar9).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 3)] + public int ParameterSetId { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 2, Index = 25, Size = 2)] + public HistogramType HistogramType { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 1, field: 3, Index = 29, Size = 6)] + public decimal SigmaHistogram { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 1, field: 4, Index = 37, Size = 6)] + public decimal MeanValueHistogram { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 1, field: 5, Index = 45, Size = 6)] + public decimal ClassRange { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 6, Index = 53, Size = 4)] + public int FirstBar { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 7, Index = 59, Size = 4)] + public int SecondBar { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 8, Index = 65, Size = 4)] + public int ThirdBar { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 9, Index = 71, Size = 4)] + public int FourthBar { get; set; } + [Int32DataFieldDefinition(revision: 1, field: 10, Index = 77, Size = 4)] + public int FifthBar { get; set; } + [Int32DataFieldDefinition(revision: 1, field: 11, Index = 83, Size = 4)] + public int SixthBar { get; set; } + [Int32DataFieldDefinition(revision: 1, field: 12, Index = 89, Size = 4)] + public int SeventhBar { get; set; } + [Int32DataFieldDefinition(revision: 1, field: 13, Index = 95, Size = 4)] + public int EighthBar { get; set; } + [Int32DataFieldDefinition(revision: 1, field: 14, Index = 101, Size = 4)] + public int NinethBar { get; set; } public Mid0301() : this(new Header() { @@ -97,52 +63,5 @@ public Mid0301() : this(new Header() public Mid0301(Header header) : base(header) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.ParameterSetId, 20, 3), - DataField.Number(DataFields.HistogramType, 25, 2), - DataField.Number(DataFields.SigmaHistogram, 29, 6), - DataField.Number(DataFields.MeanValueHistogram, 37, 6), - DataField.Number(DataFields.ClassRange, 45, 6), - DataField.Number(DataFields.Bar1, 53, 4), - DataField.Number(DataFields.Bar2, 59, 4), - DataField.Number(DataFields.Bar3, 65, 4), - DataField.Number(DataFields.Bar4, 71, 4), - DataField.Number(DataFields.Bar5, 77, 4), - DataField.Number(DataFields.Bar6, 83, 4), - DataField.Number(DataFields.Bar7, 89, 4), - DataField.Number(DataFields.Bar8, 95, 4), - DataField.Number(DataFields.Bar9, 101, 4) - } - } - }; - } - - protected enum DataFields - { - ParameterSetId, - HistogramType, - SigmaHistogram, - /// - /// X-BAR - /// - MeanValueHistogram, - ClassRange, - Bar1, - Bar2, - Bar3, - Bar4, - Bar5, - Bar6, - Bar7, - Bar8, - Bar9 - } } } diff --git a/src/OpenProtocolInterpreter/Statistic/StatisticMessages.cs b/src/OpenProtocolInterpreter/Statistic/StatisticMessages.cs index 5e8234fb..d83daf20 100644 --- a/src/OpenProtocolInterpreter/Statistic/StatisticMessages.cs +++ b/src/OpenProtocolInterpreter/Statistic/StatisticMessages.cs @@ -11,10 +11,10 @@ internal class StatisticMessages : MessagesTemplate { public StatisticMessages() : base() { - _templates = new Dictionary() + _templates = new Dictionary>() { - { Mid0300.MID, new MidCompiledInstance(typeof(Mid0300)) }, - { Mid0301.MID, new MidCompiledInstance(typeof(Mid0301)) } + { Mid0300.MID, new CompiledInstance(typeof(Mid0300)) }, + { Mid0301.MID, new CompiledInstance(typeof(Mid0301)) } }; } diff --git a/src/OpenProtocolInterpreter/Tightening/Mid0061.cs b/src/OpenProtocolInterpreter/Tightening/Mid0061.cs index 50f02f32..30b2ccbf 100644 --- a/src/OpenProtocolInterpreter/Tightening/Mid0061.cs +++ b/src/OpenProtocolInterpreter/Tightening/Mid0061.cs @@ -15,396 +15,298 @@ public class Mid0061 : Mid, ITightening, IController, IAcknowledgeable { public const int MID = 61; - public int CellId - { - get => GetField(GetCurrentRevisionIndex(), DataFields.CellId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(GetCurrentRevisionIndex(), DataFields.CellId).SetValue(OpenProtocolConvert.ToString, value); - } - public int ChannelId - { - get => GetField(GetCurrentRevisionIndex(), DataFields.ChannelId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(GetCurrentRevisionIndex(), DataFields.ChannelId).SetValue(OpenProtocolConvert.ToString, value); - } - public string TorqueControllerName - { - get => GetField(GetCurrentRevisionIndex(), DataFields.TorqueControllerName).Value; - set => GetField(GetCurrentRevisionIndex(), DataFields.TorqueControllerName).SetValue(value); - } - public string VinNumber - { - get => GetField(GetCurrentRevisionIndex(), DataFields.VinNumber).Value; - set => GetField(GetCurrentRevisionIndex(), DataFields.VinNumber).SetValue(value); - } - public int JobId - { - get => GetField(GetCurrentRevisionIndex(), DataFields.JobId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(GetCurrentRevisionIndex(), DataFields.JobId).SetValue(OpenProtocolConvert.ToString, value); - } - public int ParameterSetId - { - get => GetField(GetCurrentRevisionIndex(), DataFields.ParameterSetId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(GetCurrentRevisionIndex(), DataFields.ParameterSetId).SetValue(OpenProtocolConvert.ToString, value); - } - public int BatchSize - { - get => GetField(GetCurrentRevisionIndex(), DataFields.BatchSize).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(GetCurrentRevisionIndex(), DataFields.BatchSize).SetValue(OpenProtocolConvert.ToString, value); - } - public int BatchCounter - { - get => GetField(GetCurrentRevisionIndex(), DataFields.BatchCounter).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(GetCurrentRevisionIndex(), DataFields.BatchCounter).SetValue(OpenProtocolConvert.ToString, value); - } - public bool TighteningStatus - { - get => GetField(GetCurrentRevisionIndex(), DataFields.TighteningStatus).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(GetCurrentRevisionIndex(), DataFields.TighteningStatus).SetValue(OpenProtocolConvert.ToString, value); - } - public TighteningValueStatus TorqueStatus - { - get => (TighteningValueStatus)GetField(GetCurrentRevisionIndex(), DataFields.TorqueStatus).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(GetCurrentRevisionIndex(), DataFields.TorqueStatus).SetValue(OpenProtocolConvert.ToString, value); - } - public TighteningValueStatus AngleStatus - { - get => (TighteningValueStatus)GetField(GetCurrentRevisionIndex(), DataFields.AngleStatus).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(GetCurrentRevisionIndex(), DataFields.AngleStatus).SetValue(OpenProtocolConvert.ToString, value); - } - public decimal TorqueMinLimit - { - get => GetField(GetCurrentRevisionIndex(), DataFields.TorqueMinLimit).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(GetCurrentRevisionIndex(), DataFields.TorqueMinLimit).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal TorqueMaxLimit - { - get => GetField(GetCurrentRevisionIndex(), DataFields.TorqueMaxLimit).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(GetCurrentRevisionIndex(), DataFields.TorqueMaxLimit).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal TorqueFinalTarget - { - get => GetField(GetCurrentRevisionIndex(), DataFields.TorqueFinalTarget).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(GetCurrentRevisionIndex(), DataFields.TorqueFinalTarget).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal Torque - { - get => GetField(GetCurrentRevisionIndex(), DataFields.Torque).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(GetCurrentRevisionIndex(), DataFields.Torque).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public int AngleMinLimit - { - get => GetField(GetCurrentRevisionIndex(), DataFields.AngleMinLimit).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(GetCurrentRevisionIndex(), DataFields.AngleMinLimit).SetValue(OpenProtocolConvert.ToString, value); - } - public int AngleMaxLimit - { - get => GetField(GetCurrentRevisionIndex(), DataFields.AngleMaxLimit).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(GetCurrentRevisionIndex(), DataFields.AngleMaxLimit).SetValue(OpenProtocolConvert.ToString, value); - } - public int AngleFinalTarget - { - get => GetField(GetCurrentRevisionIndex(), DataFields.AngleFinalTarget).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(GetCurrentRevisionIndex(), DataFields.AngleFinalTarget).SetValue(OpenProtocolConvert.ToString, value); - } - public int Angle - { - get => GetField(GetCurrentRevisionIndex(), DataFields.Angle).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(GetCurrentRevisionIndex(), DataFields.Angle).SetValue(OpenProtocolConvert.ToString, value); - } - public DateTime Timestamp - { - get => GetField(GetCurrentRevisionIndex(), DataFields.Timestamp).GetValue(OpenProtocolConvert.ToDateTime); - set => GetField(GetCurrentRevisionIndex(), DataFields.Timestamp).SetValue(OpenProtocolConvert.ToString, value); - } - public DateTime LastChangeInParameterSet - { - get => GetField(GetCurrentRevisionIndex(), DataFields.LastChangeInParameterSet).GetValue(OpenProtocolConvert.ToDateTime); - set => GetField(GetCurrentRevisionIndex(), DataFields.LastChangeInParameterSet).SetValue(OpenProtocolConvert.ToString, value); - } - public BatchStatus BatchStatus - { - get => (BatchStatus)GetField(GetCurrentRevisionIndex(), DataFields.BatchStatus).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(GetCurrentRevisionIndex(), DataFields.BatchStatus).SetValue(OpenProtocolConvert.ToString, value); - } - public long TighteningId - { - get => GetField(GetCurrentRevisionIndex(), DataFields.TighteningId).GetValue(OpenProtocolConvert.ToInt64); - set => GetField(GetCurrentRevisionIndex(), DataFields.TighteningId).SetValue(OpenProtocolConvert.ToString, value); - } - //Rev 2 Addition - public Strategy Strategy - { - get => (Strategy)GetField(2, DataFields.Strategy).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.Strategy).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 4)] + [Int32DataFieldDefinition(revision: 2, field: 1, Index = 20, Size = 4)] + public int CellId { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 2, Index = 26, Size = 2)] + [Int32DataFieldDefinition(revision: 2, field: 2, Index = 26, Size = 2)] + public int ChannelId { get; set; } + + [StringDataFieldDefinition(revision: 1, field: 3, Index = 30, Size = 25)] + [StringDataFieldDefinition(revision: 2, field: 3, Index = 30, Size = 25)] + public string TorqueControllerName { get; set; } + + [StringDataFieldDefinition(revision: 1, field: 4, Index = 57, Size = 25)] + [StringDataFieldDefinition(revision: 2, field: 4, Index = 57, Size = 25)] + [StringDataFieldDefinition(revision: 999, field: 1, Index = 20, Size = 25, HasPrefix = false)] + public string VinNumber { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 5, Index = 84, Size = 2)] + [Int32DataFieldDefinition(revision: 2, field: 5, Index = 84, Size = 4)] + [Int32DataFieldDefinition(revision: 999, field: 2, Index = 45, Size = 2, HasPrefix = false)] + public int JobId { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 6, Index = 88, Size = 3)] + [Int32DataFieldDefinition(revision: 2, field: 6, Index = 90, Size = 3)] + [Int32DataFieldDefinition(revision: 999, field: 3, Index = 47, Size = 3, HasPrefix = false)] + public int ParameterSetId { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 7, Index = 93, Size = 4)] + [Int32DataFieldDefinition(revision: 2, field: 9, Index = 106, Size = 4)] + [Int32DataFieldDefinition(revision: 999, field: 4, Index = 50, Size = 4, HasPrefix = false)] + public int BatchSize { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 8, Index = 99, Size = 4)] + [Int32DataFieldDefinition(revision: 2, field: 10, Index = 112, Size = 4)] + [Int32DataFieldDefinition(revision: 999, field: 5, Index = 54, Size = 4, HasPrefix = false)] + public int BatchCounter { get; set; } + + [BooleanDataFieldDefinition(revision: 1, field: 9, Index = 105)] + [BooleanDataFieldDefinition(revision: 2, field: 11, Index = 118)] + [BooleanDataFieldDefinition(revision: 999, field: 7, Index = 59, HasPrefix = false)] + public bool TighteningStatus { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 10, Index = 108, Size = 1)] + [Int32DataFieldDefinition(revision: 2, field: 13, Index = 124, Size = 1)] + [Int32DataFieldDefinition(revision: 999, field: 8, Index = 60, Size = 1, HasPrefix = false)] + public TighteningValueStatus TorqueStatus { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 11, Index = 111, Size = 1)] + [Int32DataFieldDefinition(revision: 2, field: 14, Index = 127, Size = 1)] + [Int32DataFieldDefinition(revision: 999, field: 9, Index = 61, Size = 1, HasPrefix = false)] + public TighteningValueStatus AngleStatus { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 1, field: 12, Index = 114, Size = 6)] + [TruncatedDecimalDataFieldDefinition(revision: 2, field: 21, Index = 157, Size = 6)] + public decimal TorqueMinLimit { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 1, field: 13, Index = 122, Size = 6)] + [TruncatedDecimalDataFieldDefinition(revision: 2, field: 22, Index = 165, Size = 6)] + public decimal TorqueMaxLimit { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 1, field: 14, Index = 130, Size = 6)] + [TruncatedDecimalDataFieldDefinition(revision: 2, field: 23, Index = 173, Size = 6)] + public decimal TorqueFinalTarget { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 1, field: 15, Index = 138, Size = 6)] + [TruncatedDecimalDataFieldDefinition(revision: 2, field: 24, Index = 181, Size = 6)] + [TruncatedDecimalDataFieldDefinition(revision: 999, field: 10, Index = 62, Size = 6, HasPrefix = false)] + public decimal Torque { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 16, Index = 146, Size = 5)] + [Int32DataFieldDefinition(revision: 2, field: 25, Index = 189, Size = 5)] + public int AngleMinLimit { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 17, Index = 153, Size = 5)] + [Int32DataFieldDefinition(revision: 2, field: 26, Index = 196, Size = 5)] + public int AngleMaxLimit { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 18, Index = 160, Size = 5)] + [Int32DataFieldDefinition(revision: 2, field: 27, Index = 203, Size = 5)] + public int AngleFinalTarget { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 19, Index = 167, Size = 5)] + [Int32DataFieldDefinition(revision: 2, field: 28, Index = 210, Size = 5)] + [Int32DataFieldDefinition(revision: 999, field: 11, Index = 68, Size = 5, HasPrefix = false)] + public int Angle { get; set; } + + [TimestampDataFieldDefinition(revision: 1, field: 20, Index = 174)] + [TimestampDataFieldDefinition(revision: 2, field: 45, Index = 343)] + [TimestampDataFieldDefinition(revision: 999, field: 12, Index = 73, HasPrefix = false)] + public DateTime Timestamp { get; set; } + + [TimestampDataFieldDefinition(revision: 1, field: 21, Index = 195)] + [TimestampDataFieldDefinition(revision: 2, field: 46, Index = 364)] + [TimestampDataFieldDefinition(revision: 999, field: 13, Index = 92, HasPrefix = false)] + public DateTime LastChangeInParameterSet { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 22, Index = 216, Size = 1)] + [Int32DataFieldDefinition(revision: 2, field: 12, Index = 121, Size = 1)] + [Int32DataFieldDefinition(revision: 999, field: 6, Index = 58, Size = 1, HasPrefix = false)] + public BatchStatus BatchStatus { get; set; } + + [Int64DataFieldDefinition(revision: 1, field: 23, Index = 219, Size = 10)] + [Int64DataFieldDefinition(revision: 2, field: 41, Index = 301, Size = 10)] + [Int64DataFieldDefinition(revision: 999, field: 14, Index = 111, Size = 10, HasPrefix = false)] + public long TighteningId { get; set; } + + //Rev 2 + [Int32DataFieldDefinition(revision: 2, field: 7, Index = 95, Size = 2)] + public Strategy Strategy { get; set; } + + [StrategyOptionsDefinition(revision: 2, field: 8, Index = 99, Size = 5, PaddingChar = '0', PaddingOrientation = PaddingOrientation.LeftPadded)] public StrategyOptions StrategyOptions { get; set; } - public TighteningValueStatus RundownAngleStatus - { - get => (TighteningValueStatus)GetField(2, DataFields.RundownAngleStatus).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.RundownAngleStatus).SetValue(OpenProtocolConvert.ToString, value); - } - public TighteningValueStatus CurrentMonitoringStatus - { - get => (TighteningValueStatus)GetField(2, DataFields.CurrentMonitoringStatus).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.CurrentMonitoringStatus).SetValue(OpenProtocolConvert.ToString, value); - } - public TighteningValueStatus SelftapStatus - { - get => (TighteningValueStatus)GetField(2, DataFields.SelftapStatus).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.SelftapStatus).SetValue(OpenProtocolConvert.ToString, value); - } - public TighteningValueStatus PrevailTorqueMonitoringStatus - { - get => (TighteningValueStatus)GetField(2, DataFields.PrevailTorqueMonitoringStatus).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.PrevailTorqueMonitoringStatus).SetValue(OpenProtocolConvert.ToString, value); - } - public TighteningValueStatus PrevailTorqueCompensateStatus - { - get => (TighteningValueStatus)GetField(2, DataFields.PrevailTorqueCompensateStatus).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.PrevailTorqueCompensateStatus).SetValue(OpenProtocolConvert.ToString, value); - } + + [Int32DataFieldDefinition(revision: 2, field: 15, Index = 130, Size = 1)] + public TighteningValueStatus RundownAngleStatus { get; set; } + + [Int32DataFieldDefinition(revision: 2, field: 16, Index = 133, Size = 1)] + public TighteningValueStatus CurrentMonitoringStatus { get; set; } + + [Int32DataFieldDefinition(revision: 2, field: 17, Index = 136, Size = 1)] + public TighteningValueStatus SelftapStatus { get; set; } + + [Int32DataFieldDefinition(revision: 2, field: 18, Index = 139, Size = 1)] + public TighteningValueStatus PrevailTorqueMonitoringStatus { get; set; } + + + [Int32DataFieldDefinition(revision: 2, field: 19, Index = 142, Size = 1)] + public TighteningValueStatus PrevailTorqueCompensateStatus { get; set; } + + [TighteningErrorStatusDefinition(revision: 2, field: 20, Index = 145, Size = 10, PaddingChar = '0', PaddingOrientation = PaddingOrientation.LeftPadded)] public TighteningErrorStatus TighteningErrorStatus { get; set; } - public int RundownAngleMin - { - get => GetField(2, DataFields.RundownAngleMin).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.RundownAngleMin).SetValue(OpenProtocolConvert.ToString, value); - } - public int RundownAngleMax - { - get => GetField(2, DataFields.RundownAngleMax).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.RundownAngleMax).SetValue(OpenProtocolConvert.ToString, value); - } - public int RundownAngle - { - get => GetField(2, DataFields.RundownAngle).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.RundownAngle).SetValue(OpenProtocolConvert.ToString, value); - } - public int CurrentMonitoringMin - { - get => GetField(2, DataFields.CurrentMonitoringMin).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.CurrentMonitoringMin).SetValue(OpenProtocolConvert.ToString, value); - } - public int CurrentMonitoringMax - { - get => GetField(2, DataFields.CurrentMonitoringMax).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.CurrentMonitoringMax).SetValue(OpenProtocolConvert.ToString, value); - } - public int CurrentMonitoringValue - { - get => GetField(2, DataFields.CurrentMonitoringValue).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.CurrentMonitoringValue).SetValue(OpenProtocolConvert.ToString, value); - } - public decimal SelftapMin - { - get => GetField(2, DataFields.SelftapMin).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(2, DataFields.SelftapMin).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal SelftapMax - { - get => GetField(2, DataFields.SelftapMax).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(2, DataFields.SelftapMax).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal SelftapTorque - { - get => GetField(2, DataFields.SelftapTorque).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(2, DataFields.SelftapTorque).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal PrevailTorqueMonitoringMin - { - get => GetField(2, DataFields.PrevailTorqueMonitoringMin).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(2, DataFields.PrevailTorqueMonitoringMin).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal PrevailTorqueMonitoringMax - { - get => GetField(2, DataFields.PrevailTorqueMonitoringMax).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(2, DataFields.PrevailTorqueMonitoringMax).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal PrevailTorque - { - get => GetField(2, DataFields.PrevailTorque).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(2, DataFields.PrevailTorque).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public int JobSequenceNumber - { - get => GetField(2, DataFields.JobSequenceNumber).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.JobSequenceNumber).SetValue(OpenProtocolConvert.ToString, value); - } - public int SyncTighteningId - { - get => GetField(2, DataFields.SyncTighteningId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.SyncTighteningId).SetValue(OpenProtocolConvert.ToString, value); - } - public string ToolSerialNumber - { - get => GetField(2, DataFields.ToolSerialNumber).Value; - set => GetField(2, DataFields.ToolSerialNumber).SetValue(value); - } + + [Int32DataFieldDefinition(revision: 2, field: 29, Index = 217, Size = 5)] + public int RundownAngleMin { get; set; } + + [Int32DataFieldDefinition(revision: 2, field: 30, Index = 224, Size = 5)] + public int RundownAngleMax { get; set; } + + [Int32DataFieldDefinition(revision: 2, field: 31, Index = 231, Size = 5)] + public int RundownAngle { get; set; } + + [Int32DataFieldDefinition(revision: 2, field: 32, Index = 238, Size = 3)] + public int CurrentMonitoringMin { get; set; } + + [Int32DataFieldDefinition(revision: 2, field: 33, Index = 243, Size = 3)] + public int CurrentMonitoringMax { get; set; } + + [Int32DataFieldDefinition(revision: 2, field: 34, Index = 248, Size = 3)] + public int CurrentMonitoringValue { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 2, field: 35, Index = 253, Size = 6)] + public decimal SelftapMin { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 2, field: 36, Index = 261, Size = 6)] + public decimal SelftapMax { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 2, field: 37, Index = 269, Size = 6)] + public decimal SelftapTorque { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 2, field: 38, Index = 277, Size = 6)] + public decimal PrevailTorqueMonitoringMin { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 2, field: 39, Index = 285, Size = 6)] + public decimal PrevailTorqueMonitoringMax { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 2, field: 40, Index = 293, Size = 6)] + public decimal PrevailTorque { get; set; } + + [Int32DataFieldDefinition(revision: 2, field: 42, Index = 313, Size = 5)] + public int JobSequenceNumber { get; set; } + + [Int32DataFieldDefinition(revision: 2, field: 43, Index = 320, Size = 5)] + public int SyncTighteningId { get; set; } + + [StringDataFieldDefinition(revision: 2, field: 44, Index = 327, Size = 14)] + public string ToolSerialNumber { get; set; } + //Rev 3 Addition - public string ParameterSetName - { - get => GetField(3, DataFields.ParameterSetName).Value; - set => GetField(3, DataFields.ParameterSetName).SetValue(value); - } - public TorqueValuesUnit TorqueValuesUnit - { - get => (TorqueValuesUnit)GetField(3, DataFields.TorqueValuesUnit).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(3, DataFields.TorqueValuesUnit).SetValue(OpenProtocolConvert.ToString, value); - } - public ResultType ResultType - { - get => (ResultType)GetField(3, DataFields.ResultType).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(3, DataFields.ResultType).SetValue(OpenProtocolConvert.ToString, value); - } + [StringDataFieldDefinition(revision: 3, field: 47, Index = 385, Size = 25)] + public string ParameterSetName { get; set; } + + [Int32DataFieldDefinition(revision: 3, field: 48, Index = 412, Size = 1)] + public TorqueValuesUnit TorqueValuesUnit { get; set; } + + [Int32DataFieldDefinition(revision: 3, field: 49, Index = 415, Size = 2)] + public ResultType ResultType { get; set; } + //Rev 4 addition - public string IdentifierResultPart2 - { - get => GetField(4, DataFields.IdentifierResultPart2).Value; - set => GetField(4, DataFields.IdentifierResultPart2).SetValue(value); - } - public string IdentifierResultPart3 - { - get => GetField(4, DataFields.IdentifierResultPart3).Value; - set => GetField(4, DataFields.IdentifierResultPart3).SetValue(value); - } - public string IdentifierResultPart4 - { - get => GetField(4, DataFields.IdentifierResultPart4).Value; - set => GetField(4, DataFields.IdentifierResultPart4).SetValue(value); - } + [StringDataFieldDefinition(revision: 4, field: 50, Index = 419, Size = 25)] + public string IdentifierResultPart2 { get; set; } + + [StringDataFieldDefinition(revision: 4, field: 51, Index = 446, Size = 25)] + public string IdentifierResultPart3 { get; set; } + + [StringDataFieldDefinition(revision: 4, field: 52, Index = 473, Size = 25)] + public string IdentifierResultPart4 { get; set; } + //Rev 5 addition - public string CustomerTighteningErrorCode - { - get => GetField(5, DataFields.CustomerTighteningErrorCode).Value; - set => GetField(5, DataFields.CustomerTighteningErrorCode).SetValue(value); - } + [StringDataFieldDefinition(revision: 5, field: 53, Index = 500, Size = 4)] + public string CustomerTighteningErrorCode { get; set; } + //Rev 6 Addition - public decimal PrevailTorqueCompensateValue - { - get => GetField(6, DataFields.PrevailTorqueCompensateValue).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(6, DataFields.PrevailTorqueCompensateValue).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } + [TruncatedDecimalDataFieldDefinition(revision: 6, field: 54, Index = 506, Size = 6)] + public decimal PrevailTorqueCompensateValue { get; set; } + + [TighteningErrorStatus2Definition(revision: 6, field: 55, Index = 514, Size = 10, PaddingChar = '0', PaddingOrientation = PaddingOrientation.LeftPadded)] public TighteningErrorStatus2 TighteningErrorStatus2 { get; set; } + //Rev 7 addition - public decimal CompensatedAngle - { - get => GetField(7, DataFields.CompensatedAngle).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(7, DataFields.CompensatedAngle).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal FinalAngleDecimal - { - get => GetField(7, DataFields.FinalAngleDecimal).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(7, DataFields.FinalAngleDecimal).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } + [TruncatedDecimalDataFieldDefinition(revision: 7, field: 56, Index = 526, Size = 7)] + public decimal CompensatedAngle { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 7, field: 57, Index = 535, Size = 7)] + public decimal FinalAngleDecimal { get; set; } + //Rev 8 addition - public decimal StartFinalAngle - { - get => GetField(8, DataFields.StartFinalAngle).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(8, DataFields.StartFinalAngle).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public PostViewTorque PostViewTorqueActivated - { - get => (PostViewTorque)GetField(8, DataFields.PostViewTorqueActivated).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(8, DataFields.PostViewTorqueActivated).SetValue(OpenProtocolConvert.ToString, value); - } - public decimal PostViewTorqueHigh - { - get => GetField(8, DataFields.PostViewTorqueHigh).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(8, DataFields.PostViewTorqueHigh).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal PostViewTorqueLow - { - get => GetField(8, DataFields.PostViewTorqueLow).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(8, DataFields.PostViewTorqueLow).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } + [TruncatedDecimalDataFieldDefinition(revision: 8, field: 58, Index = 544, Size = 6)] + public decimal StartFinalAngle { get; set; } + + [Int32DataFieldDefinition(revision: 8, field: 59, Index = 552, Size = 1)] + public PostViewTorque PostViewTorqueActivated { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 8, field: 60, Index = 555, Size = 6)] + public decimal PostViewTorqueHigh { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 8, field: 61, Index = 563, Size = 6)] + public decimal PostViewTorqueLow { get; set; } + //Rev 9 addition - public decimal CurrentMonitoringAmpere - { - get => GetField(9, DataFields.CurrentMonitoringAmp).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(9, DataFields.CurrentMonitoringAmp).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal CurrentMonitoringAmpereMin - { - get => GetField(9, DataFields.CurrentMonitoringAmpMin).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(9, DataFields.CurrentMonitoringAmpMin).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal CurrentMonitoringAmpereMax - { - get => GetField(9, DataFields.CurrentMonitoringAmpMax).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(9, DataFields.CurrentMonitoringAmpMax).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } + [TruncatedDecimalDataFieldDefinition(revision: 9, field: 62, Index = 571, Size = 5)] + public decimal CurrentMonitoringAmpere { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 9, field: 63, Index = 578, Size = 5)] + public decimal CurrentMonitoringAmpereMin { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 9, field: 64, Index = 585, Size = 5)] + public decimal CurrentMonitoringAmpereMax { get; set; } + //Rev 10 addition - public int AngleNumeratorScaleFactor - { - get => GetField(10, DataFields.AngleNumeratorScaleFactor).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(10, DataFields.AngleNumeratorScaleFactor).SetValue(OpenProtocolConvert.ToString, value); - } - public int AngleDenominatorScaleFactor - { - get => GetField(10, DataFields.AngleDenominatorScaleFactor).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(10, DataFields.AngleDenominatorScaleFactor).SetValue(OpenProtocolConvert.ToString, value); - } - public TighteningValueStatus OverallAngleStatus - { - get => (TighteningValueStatus)GetField(10, DataFields.OverallAngleStatus).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(10, DataFields.OverallAngleStatus).SetValue(OpenProtocolConvert.ToString, value); - } - public int OverallAngleMin - { - get => GetField(10, DataFields.OverallAngleMin).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(10, DataFields.OverallAngleMin).SetValue(OpenProtocolConvert.ToString, value); - } - public int OverallAngleMax - { - get => GetField(10, DataFields.OverallAngleMax).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(10, DataFields.OverallAngleMax).SetValue(OpenProtocolConvert.ToString, value); - } - public int OverallAngle - { - get => GetField(10, DataFields.OverallAngle).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(10, DataFields.OverallAngle).SetValue(OpenProtocolConvert.ToString, value); - } - public decimal PeakTorque - { - get => GetField(10, DataFields.PeakTorque).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(10, DataFields.PeakTorque).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal ResidualBreakawayTorque - { - get => GetField(10, DataFields.ResidualBreakawayTorque).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(10, DataFields.ResidualBreakawayTorque).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal StartRundownAngle - { - get => GetField(10, DataFields.StartRundownAngle).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(10, DataFields.StartRundownAngle).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal RundownAngleComplete - { - get => GetField(10, DataFields.RundownAngleComplete).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(10, DataFields.RundownAngleComplete).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } + [Int32DataFieldDefinition(revision: 10, field: 65, Index = 592, Size = 5)] + public int AngleNumeratorScaleFactor { get; set; } + + [Int32DataFieldDefinition(revision: 10, field: 66, Index = 599, Size = 5)] + public int AngleDenominatorScaleFactor { get; set; } + + [Int32DataFieldDefinition(revision: 10, field: 67, Index = 606, Size = 1)] + public TighteningValueStatus OverallAngleStatus { get; set; } + + [Int32DataFieldDefinition(revision: 10, field: 68, Index = 609, Size = 5)] + public int OverallAngleMin { get; set; } + + [Int32DataFieldDefinition(revision: 10, field: 69, Index = 616, Size = 5)] + public int OverallAngleMax { get; set; } + + [Int32DataFieldDefinition(revision: 10, field: 70, Index = 623, Size = 5)] + public int OverallAngle { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 10, field: 71, Index = 630, Size = 6)] + public decimal PeakTorque { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 10, field: 72, Index = 638, Size = 6)] + public decimal ResidualBreakawayTorque { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 10, field: 73, Index = 646, Size = 6)] + public decimal StartRundownAngle { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 10, field: 74, Index = 654, Size = 6)] + public decimal RundownAngleComplete { get; set; } + //Rev 11 - public decimal ClickTorque - { - get => GetField(11, DataFields.ClickTorque).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(11, DataFields.ClickTorque).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public int ClickAngle - { - get => GetField(11, DataFields.ClickAngle).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(11, DataFields.ClickAngle).SetValue(OpenProtocolConvert.ToString, value); - } - //Rev 998 addition - public int NumberOfStagesInMultistage - { - get => GetField(998, DataFields.NumberOfStagesInMultistage).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(998, DataFields.NumberOfStagesInMultistage).SetValue(OpenProtocolConvert.ToString, value); - } - public int NumberOfStageResults - { - get => GetField(998, DataFields.NumberOfStageResults).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(998, DataFields.NumberOfStageResults).SetValue(OpenProtocolConvert.ToString, value); - } - public List StageResults { get; set; } + [TruncatedDecimalDataFieldDefinition(revision: 11, field: 75, Index = 662, Size = 6)] + public decimal ClickTorque { get; set; } + + [Int32DataFieldDefinition(revision: 11, field: 76, Index = 670, Size = 5)] + public int ClickAngle { get; set; } + + //Rev 12 + [Int32DataFieldDefinition(revision: 12, field: 77, Index = 677, Size = 4)] + public int SelectedIdentifierNumber { get; set; } + + [StringDataFieldDefinition(revision: 12, field: 78, Index = 683, Size = 25)] + public string JointId { get; set; } + + //Rev 998 addition + [Int32DataFieldDefinition(revision: 998, field: 56, Index = 526, Size = 2)] + public int NumberOfStagesInMultistage { get; set; } + + [Int32DataFieldDefinition(revision: 998, field: 57, Index = 530, Size = 2)] + public int NumberOfStageResults { get; set; } + + [StageResultCollectionDefinition(revision: 998, field: 58, Index = 534, Size = 0)] + public List StageResults { get; set; } = new List(); public Mid0061() : this(DEFAULT_REVISION) { @@ -413,6 +315,7 @@ public Mid0061() : this(DEFAULT_REVISION) public Mid0061(Header header) : base(header) { + } public Mid0061(int revision) : this(new Header() @@ -427,28 +330,15 @@ protected override string BuildHeader() { if (RevisionsByFields.Any()) { - Header.Length = 20; - Header.Revision = Header.Revision > 0 ? Header.Revision : 1; - if (Header.Revision == 1 || Header.Revision == 999) - { - foreach (var dataField in RevisionsByFields[Header.Revision]) - Header.Length += (dataField.HasPrefix ? 2 : 0) + dataField.Size; - } - else + Header.Length = Header.DefaultSize; + if (Header.Revision == 998) { - int processUntil = Header.Revision != 998 ? Header.Revision : 6; - - for (int i = 2; i <= processUntil; i++) - foreach (var dataField in RevisionsByFields[i]) - Header.Length += (dataField.HasPrefix ? 2 : 0) + dataField.Size; - - if (Header.Revision == 998) - { - GetField(998, DataFields.StageResult).Size = StageResults.Count * 11; - foreach (var dataField in RevisionsByFields[998]) - Header.Length += (dataField.HasPrefix ? 2 : 0) + dataField.Size; - } + var stageResultField = GetField(nameof(StageResults)); + stageResultField.Size = StageResults.Count * 11; } + + var fields = DataFieldsByRevision(); + Header.Length += fields.Sum(x => x.TotalSize); } return Header.ToString(); } @@ -456,390 +346,54 @@ protected override string BuildHeader() public override string Pack() { var builder = new StringBuilder(); - int prefixIndex = 1; - if (Header.Revision > 1 && Header.Revision != 999) - { - GetField(2, DataFields.StrategyOptions).SetValue(StrategyOptions.Pack()); - GetField(2, DataFields.TighteningErrorStatus).SetValue(TighteningErrorStatus.Pack()); + var fields = DataFieldsByRevision().OrderBy(f => f.Index).ToList(); + builder.Append(BuildHeader()); + builder.Append(Pack(fields)); - if (Header.Revision > 5) - { - GetField(6, DataFields.TighteningErrorStatus2).SetValue(TighteningErrorStatus2.Pack()); - } - - if (Header.Revision == 998) - { - NumberOfStageResults = StageResults.Count; - var stageResultField = GetField(998, DataFields.StageResult); - stageResultField.Size = StageResults.Count * 11; - stageResultField.SetValue(PackStageResults()); - } + return builder.ToString(); + } - builder.Append(BuildHeader()); - int processUntilRevision = Header.Revision != 998 ? Header.Revision : 6; - for (int revision = 2; revision <= processUntilRevision; revision++) - { - builder.Append(Pack(revision, ref prefixIndex)); - } + protected override void ProcessDataFields(ReadOnlySpan package) + { + var fields = DataFieldsByRevision().OrderBy(f => f.Index).ToList(); + ProcessDataFields(fields, package); + } - if (Header.Revision == 998) - { - builder.Append(Pack(998, ref prefixIndex)); - } - } - else + protected override void ProcessDataField(DataField dataField, ReadOnlySpan package) + { + if (Header.StandardizedRevision == 998 && dataField.Field == 58) { - builder.Append(BuildHeader()); - builder.Append(Pack(Header.Revision, ref prefixIndex)); + dataField.Size = NumberOfStageResults * 11; } - - return builder.ToString(); + base.ProcessDataField(dataField, package); } - protected override void ProcessDataFields(string package) + private IEnumerable DataFieldsByRevision() { - if (Header.Revision == 1 || Header.Revision == 999) + var currentRevision = Header.StandardizedRevision; + var fromRevision = Header.StandardizedRevision; + var toRevision = Header.StandardizedRevision; + if (currentRevision == 999) { - ProcessDataFields(Header.Revision, package); + fromRevision = toRevision = 999; } - else + else if (currentRevision > 1) { - int processUntilRevision = Header.Revision; - if (Header.Revision == 998) - { - processUntilRevision = 6; - var stageResultField = GetField(998, DataFields.StageResult); - stageResultField.Size = Header.Length - stageResultField.Index - 2; - ProcessDataFields(998, package); - StageResults = StageResult.ParseAll(stageResultField.Value).ToList(); - } - - for (int revision = 2; revision <= processUntilRevision; revision++) - ProcessDataFields(revision, package); - - var strategyOptionsField = GetField(2, DataFields.StrategyOptions); - StrategyOptions = StrategyOptions.Parse(strategyOptionsField.Value); - - var tighteningErrorStatusField = GetField(2, DataFields.TighteningErrorStatus); - TighteningErrorStatus = TighteningErrorStatus.Parse(tighteningErrorStatusField.Value); - - if (Header.Revision > 5) - { - var tighteningErrorStatus2Field = GetField(6, DataFields.TighteningErrorStatus2); - TighteningErrorStatus2 = TighteningErrorStatus2.Parse(tighteningErrorStatus2Field.Value); - } + fromRevision = 2; + toRevision = Header.StandardizedRevision != 998 ? Header.StandardizedRevision : 6; } - } - protected virtual string PackStageResults() - { - var builder = new StringBuilder(); - foreach (var v in StageResults) + for (int i = fromRevision; i <= toRevision; i++) { - builder.Append(v.Pack()); + foreach (var dataField in RevisionsByFields[i]) + yield return dataField; } - return builder.ToString(); - } - - protected override Dictionary> RegisterDatafields() - { - //opted to work with a different approuch (since it would need to modify too much fields) - return new Dictionary>() + if (currentRevision == 998) { - { - 1, new List() - { - DataField.Number(DataFields.CellId, 20, 4), - DataField.Number(DataFields.ChannelId, 26, 2), - DataField.String(DataFields.TorqueControllerName, 30, 25), - DataField.String(DataFields.VinNumber, 57, 25), - DataField.Number(DataFields.JobId, 84, 2), - DataField.Number(DataFields.ParameterSetId, 88, 3), - DataField.Number(DataFields.BatchSize, 93, 4), - DataField.Number(DataFields.BatchCounter, 99, 4), - DataField.Number(DataFields.TighteningStatus, 105, 1), - DataField.Number(DataFields.TorqueStatus, 108, 1), - DataField.Number(DataFields.AngleStatus, 111, 1), - DataField.Number(DataFields.TorqueMinLimit, 114, 6), - DataField.Number(DataFields.TorqueMaxLimit, 122, 6), - DataField.Number(DataFields.TorqueFinalTarget, 130, 6), - DataField.Number(DataFields.Torque, 138, 6), - DataField.Number(DataFields.AngleMinLimit, 146, 5), - DataField.Number(DataFields.AngleMaxLimit, 153, 5), - DataField.Number(DataFields.AngleFinalTarget, 160, 5), - DataField.Number(DataFields.Angle, 167, 5), - DataField.Timestamp(DataFields.Timestamp, 174), - DataField.Timestamp(DataFields.LastChangeInParameterSet, 195), - DataField.Number(DataFields.BatchStatus, 216, 1), - DataField.Number(DataFields.TighteningId, 219, 10) - } - }, - { - 2, new List() - { - DataField.Number(DataFields.CellId, 20, 4), - DataField.Number(DataFields.ChannelId, 26, 2), - DataField.String(DataFields.TorqueControllerName, 30, 25), - DataField.String(DataFields.VinNumber, 57, 25), - DataField.Number(DataFields.JobId, 84, 4), - DataField.Number(DataFields.ParameterSetId, 90, 3), - DataField.Number(DataFields.Strategy, 95, 2), - new(DataFields.StrategyOptions, 99, 5, '0', PaddingOrientation.LeftPadded), - DataField.Number(DataFields.BatchSize, 106, 4), - DataField.Number(DataFields.BatchCounter, 112, 4), - DataField.Number(DataFields.TighteningStatus, 118, 1), - DataField.Number(DataFields.BatchStatus, 121, 1), - DataField.Number(DataFields.TorqueStatus, 124, 1), - DataField.Number(DataFields.AngleStatus, 127, 1), - DataField.Number(DataFields.RundownAngleStatus, 130, 1), - DataField.Number(DataFields.CurrentMonitoringStatus, 133, 1), - DataField.Number(DataFields.SelftapStatus, 136, 1), - DataField.Number(DataFields.PrevailTorqueMonitoringStatus, 139, 1), - DataField.Number(DataFields.PrevailTorqueCompensateStatus, 142, 1), - new(DataFields.TighteningErrorStatus, 145, 10, '0', PaddingOrientation.LeftPadded), - DataField.Number(DataFields.TorqueMinLimit, 157, 6), - DataField.Number(DataFields.TorqueMaxLimit, 165, 6), - DataField.Number(DataFields.TorqueFinalTarget, 173, 6), - DataField.Number(DataFields.Torque, 181, 6), - DataField.Number(DataFields.AngleMinLimit, 189, 5), - DataField.Number(DataFields.AngleMaxLimit, 196, 5), - DataField.Number(DataFields.AngleFinalTarget, 203, 5), - DataField.Number(DataFields.Angle, 210, 5), - DataField.Number(DataFields.RundownAngleMin, 217, 5), - DataField.Number(DataFields.RundownAngleMax, 224, 5), - DataField.Number(DataFields.RundownAngle, 231, 5), - DataField.Number(DataFields.CurrentMonitoringMin, 238, 3), - DataField.Number(DataFields.CurrentMonitoringMax, 243, 3), - DataField.Number(DataFields.CurrentMonitoringValue, 248, 3), - DataField.Number(DataFields.SelftapMin, 253, 6), - DataField.Number(DataFields.SelftapMax, 261, 6 ), - DataField.Number(DataFields.SelftapTorque, 269, 6), - DataField.Number(DataFields.PrevailTorqueMonitoringMin, 277, 6), - DataField.Number(DataFields.PrevailTorqueMonitoringMax, 285, 6), - DataField.Number(DataFields.PrevailTorque, 293, 6), - DataField.Number(DataFields.TighteningId, 301, 10), - DataField.Number(DataFields.JobSequenceNumber, 313, 5), - DataField.Number(DataFields.SyncTighteningId, 320, 5), - DataField.String(DataFields.ToolSerialNumber, 327, 14), - DataField.Timestamp(DataFields.Timestamp, 343), - DataField.Timestamp(DataFields.LastChangeInParameterSet, 364) - } - }, - { - 3, new List() - { - DataField.String(DataFields.ParameterSetName, 385, 25), - DataField.Number(DataFields.TorqueValuesUnit, 412, 1), - DataField.Number(DataFields.ResultType, 415, 2) - } - }, - { - 4, new List() - { - DataField.String(DataFields.IdentifierResultPart2, 419, 25), - DataField.String(DataFields.IdentifierResultPart3, 446, 25), - DataField.String(DataFields.IdentifierResultPart4, 473, 25) - } - }, - { - 5, new List() - { - DataField.String(DataFields.CustomerTighteningErrorCode, 500, 4) - } - }, - { - 6, new List() - { - DataField.Number(DataFields.PrevailTorqueCompensateValue, 506, 6), - new(DataFields.TighteningErrorStatus2, 514, 10, '0', PaddingOrientation.LeftPadded) - } - }, - { - 7, new List() - { - DataField.Number(DataFields.CompensatedAngle, 526, 7), - DataField.Number(DataFields.FinalAngleDecimal, 535, 7) - } - }, - { - 8, new List() - { - DataField.Number(DataFields.StartFinalAngle, 544, 6), - DataField.Number(DataFields.PostViewTorqueActivated, 552, 1), - DataField.Number(DataFields.PostViewTorqueHigh, 555, 6), - DataField.Number(DataFields.PostViewTorqueLow, 563, 6) - } - }, - { - 9, new List() - { - DataField.Number(DataFields.CurrentMonitoringAmp, 571, 5), - DataField.Number(DataFields.CurrentMonitoringAmpMin, 578, 5), - DataField.Number(DataFields.CurrentMonitoringAmpMax, 585, 5) - } - }, - { - 10, new List() - { - DataField.Number(DataFields.AngleNumeratorScaleFactor, 592, 5), - DataField.Number(DataFields.AngleDenominatorScaleFactor, 599, 5), - DataField.Number(DataFields.OverallAngleStatus, 606, 1), - DataField.Number(DataFields.OverallAngleMin, 609, 5), - DataField.Number(DataFields.OverallAngleMax, 616, 5), - DataField.Number(DataFields.OverallAngle, 623, 5), - DataField.Number(DataFields.PeakTorque, 630, 6), - DataField.Number(DataFields.ResidualBreakawayTorque, 638, 6), - DataField.Number(DataFields.StartRundownAngle, 646, 6), - DataField.Number(DataFields.RundownAngleComplete, 654, 6) - } - }, - { - 11, new List() - { - DataField.Number(DataFields.ClickTorque, 662, 6), - DataField.Number(DataFields.ClickAngle, 670, 5), - } - }, - { - 998, new List() - { - DataField.Number(DataFields.NumberOfStagesInMultistage, 526, 2), - DataField.Number(DataFields.NumberOfStageResults, 530, 2), - new(DataFields.StageResult, 534, 11) - } - }, - { - 999, new List() - { - DataField.String(DataFields.VinNumber, 20, 25, false), - DataField.Number(DataFields.JobId, 45, 2, false), - DataField.Number(DataFields.ParameterSetId, 47, 3, false), - DataField.Number(DataFields.BatchSize, 50, 4, false), - DataField.Number(DataFields.BatchCounter, 54, 4, false), - DataField.Number(DataFields.BatchStatus, 58, 1, false), - DataField.Number(DataFields.TighteningStatus, 59, 1, false), - DataField.Number(DataFields.TorqueStatus, 60, 1, false), - DataField.Number(DataFields.AngleStatus, 61, 1, false), - DataField.Number(DataFields.Torque, 62, 6, false), - DataField.Number(DataFields.Angle, 68, 5, false), - DataField.Timestamp(DataFields.Timestamp, 73, false), - DataField.Timestamp(DataFields.LastChangeInParameterSet, 92, false), - DataField.Number(DataFields.TighteningId, 111, 10, false) - } - } - }; - } - - /// - /// Obtain which revision we will work with for shared properties - /// (since rev 1, 2 and 999 are way too different, they are processed in different datafields) - /// - /// Datafield Revision Index - private int GetCurrentRevisionIndex() - { - if (Header.Revision == 999) - return 999; - - if (Header.Revision > 1) - return 2; - - return 1; - } - - protected enum DataFields - { - CellId, - ChannelId, - TorqueControllerName, - VinNumber, - JobId, - ParameterSetId, - BatchSize, - BatchCounter, - TighteningStatus, - TorqueStatus, - AngleStatus, - TorqueMinLimit, - TorqueMaxLimit, - TorqueFinalTarget, - Torque, - AngleMinLimit, - AngleMaxLimit, - AngleFinalTarget, - Angle, - Timestamp, - LastChangeInParameterSet, - BatchStatus, - TighteningId, - //Rev 2 - Strategy, - StrategyOptions, - RundownAngleStatus, - CurrentMonitoringStatus, - SelftapStatus, - PrevailTorqueMonitoringStatus, - PrevailTorqueCompensateStatus, - TighteningErrorStatus, - RundownAngleMin, - RundownAngleMax, - RundownAngle, - CurrentMonitoringMin, - CurrentMonitoringMax, - CurrentMonitoringValue, - SelftapMin, - SelftapMax, - SelftapTorque, - PrevailTorqueMonitoringMin, - PrevailTorqueMonitoringMax, - PrevailTorque, - JobSequenceNumber, - SyncTighteningId, - ToolSerialNumber, - //Rev 3 - ParameterSetName, - TorqueValuesUnit, - ResultType, - //Rev 4 - IdentifierResultPart2, - IdentifierResultPart3, - IdentifierResultPart4, - //Rev 5 - CustomerTighteningErrorCode, - //Rev 6 - PrevailTorqueCompensateValue, - TighteningErrorStatus2, - //Rev 7 - CompensatedAngle, - FinalAngleDecimal, - //Rev 8 - StartFinalAngle, - PostViewTorqueActivated, - PostViewTorqueHigh, - PostViewTorqueLow, - //Rev 9 - CurrentMonitoringAmp, - CurrentMonitoringAmpMin, - CurrentMonitoringAmpMax, - //Rev 10 - AngleNumeratorScaleFactor, - AngleDenominatorScaleFactor, - OverallAngleStatus, - OverallAngleMin, - OverallAngleMax, - OverallAngle, - PeakTorque, - ResidualBreakawayTorque, - StartRundownAngle, - RundownAngleComplete, - //Rev 11 - ClickTorque, - ClickAngle, - //Rev 998 (Go over rev 7) - NumberOfStagesInMultistage, - NumberOfStageResults, - StageResult - //Rev 999 => all registered + foreach (var dataField in RevisionsByFields[998]) + yield return dataField; + } } } } diff --git a/src/OpenProtocolInterpreter/Tightening/Mid0064.cs b/src/OpenProtocolInterpreter/Tightening/Mid0064.cs index af2aebad..36eebb8b 100644 --- a/src/OpenProtocolInterpreter/Tightening/Mid0064.cs +++ b/src/OpenProtocolInterpreter/Tightening/Mid0064.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.Tightening { @@ -10,14 +11,14 @@ namespace OpenProtocolInterpreter.Tightening /// network in order to retrieve the missing result during the communication interruption.The integrator /// can see the missing results by always comparing the last tightening IDs of the two last received /// tightenings packets (parameter 23 in the result message). - /// + /// /// /// Requesting tightening ID zero is the same as requesting the latest tightening performed. /// /// Message sent by: Integrator /// - /// Answer: Old tightening result upload reply or - /// Command error, Tightening ID requested not found, or + /// Answer: Old tightening result upload reply or + /// Command error, Tightening ID requested not found, or /// MID revision not supported /// /// @@ -27,16 +28,11 @@ public class Mid0064 : Mid, ITightening, IIntegrator, IAnswerableBy, ID public IEnumerable DocumentedPossibleErrors => new Error[] { Error.TighteningIdRequestNotFound, Error.MidRevisionUnsupported }; - public long TighteningId - { - get => GetField(1, DataFields.TighteningId).GetValue(OpenProtocolConvert.ToInt64); - set => GetField(1, DataFields.TighteningId).SetValue(OpenProtocolConvert.ToString, value); - } - public bool OfflineResult - { - get => GetField(10, DataFields.OfflineResult).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(10, DataFields.OfflineResult).SetValue(OpenProtocolConvert.ToString, value); - } + [Int64DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 10, HasPrefix = false)] + public long TighteningId { get; set; } + + [BooleanDataFieldDefinition(revision: 10, field: 2, Index = 30, Size = 1, HasPrefix = false)] + public bool OfflineResult { get; set; } public Mid0064() : this(DEFAULT_REVISION) { @@ -56,29 +52,9 @@ public Mid0064(int revision) : this(new Header() { } - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.TighteningId, 20, 10, false) - } - }, - { - 10, new List() - { - DataField.Boolean(DataFields.OfflineResult, 30, false) - } - } - }; - } - - protected enum DataFields + override public string Pack() { - TighteningId, - OfflineResult + return base.Pack(); } } } diff --git a/src/OpenProtocolInterpreter/Tightening/Mid0065.cs b/src/OpenProtocolInterpreter/Tightening/Mid0065.cs index 8fbace3d..4f39ab4c 100644 --- a/src/OpenProtocolInterpreter/Tightening/Mid0065.cs +++ b/src/OpenProtocolInterpreter/Tightening/Mid0065.cs @@ -14,289 +14,215 @@ public class Mid0065 : Mid, ITightening, IController { public const int MID = 65; - public long TighteningId - { - get => GetField(GetCurrentRevisionIndex(), DataFields.TighteningId).GetValue(OpenProtocolConvert.ToInt64); - set => GetField(GetCurrentRevisionIndex(), DataFields.TighteningId).SetValue(OpenProtocolConvert.ToString, value); - } - public string VinNumber - { - get => GetField(GetCurrentRevisionIndex(), DataFields.VinNumber).Value; - set => GetField(GetCurrentRevisionIndex(), DataFields.VinNumber).SetValue(value); - } - public int ParameterSetId - { - get => GetField(GetCurrentRevisionIndex(), DataFields.ParameterSetId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(GetCurrentRevisionIndex(), DataFields.ParameterSetId).SetValue(OpenProtocolConvert.ToString, value); - } - public int BatchCounter - { - get => GetField(GetCurrentRevisionIndex(), DataFields.BatchCounter).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(GetCurrentRevisionIndex(), DataFields.BatchCounter).SetValue(OpenProtocolConvert.ToString, value); - } - public bool TighteningStatus - { - get => GetField(GetCurrentRevisionIndex(), DataFields.TighteningStatus).GetValue(OpenProtocolConvert.ToBoolean); - set => GetField(GetCurrentRevisionIndex(), DataFields.TighteningStatus).SetValue(OpenProtocolConvert.ToString, value); - } - public TighteningValueStatus TorqueStatus - { - get => (TighteningValueStatus)GetField(GetCurrentRevisionIndex(), DataFields.TorqueStatus).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(GetCurrentRevisionIndex(), DataFields.TorqueStatus).SetValue(OpenProtocolConvert.ToString, value); - } - public TighteningValueStatus AngleStatus - { - get => (TighteningValueStatus)GetField(GetCurrentRevisionIndex(), DataFields.AngleStatus).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(GetCurrentRevisionIndex(), DataFields.AngleStatus).SetValue(OpenProtocolConvert.ToString, value); - } - public decimal Torque - { - get => GetField(GetCurrentRevisionIndex(), DataFields.Torque).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(GetCurrentRevisionIndex(), DataFields.Torque).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public int Angle - { - get => GetField(GetCurrentRevisionIndex(), DataFields.Angle).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(GetCurrentRevisionIndex(), DataFields.Angle).SetValue(OpenProtocolConvert.ToString, value); - } - public DateTime Timestamp - { - get => GetField(GetCurrentRevisionIndex(), DataFields.Timestamp).GetValue(OpenProtocolConvert.ToDateTime); - set => GetField(GetCurrentRevisionIndex(), DataFields.Timestamp).SetValue(OpenProtocolConvert.ToString, value); - } - public BatchStatus BatchStatus - { - get => (BatchStatus)GetField(GetCurrentRevisionIndex(), DataFields.BatchStatus).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(GetCurrentRevisionIndex(), DataFields.BatchStatus).SetValue(OpenProtocolConvert.ToString, value); - } + [Int64DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 10)] + [Int64DataFieldDefinition(revision: 2, field: 1, Index = 20, Size = 10)] + public long TighteningId { get; set; } + + [StringDataFieldDefinition(revision: 1, field: 2, Index = 32, Size = 25)] + [StringDataFieldDefinition(revision: 2, field: 2, Index = 32, Size = 25)] + public string VinNumber { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 3, Index = 59, Size = 3)] + [Int32DataFieldDefinition(revision: 2, field: 4, Index = 65, Size = 3)] + public int ParameterSetId { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 4, Index = 64, Size = 4)] + [Int32DataFieldDefinition(revision: 2, field: 8, Index = 87, Size = 4)] + public int BatchCounter { get; set; } + + [BooleanDataFieldDefinition(revision: 1, field: 5, Index = 70, Size = 1)] + [BooleanDataFieldDefinition(revision: 2, field: 9, Index = 93, Size = 1)] + public bool TighteningStatus { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 6, Index = 73, Size = 1)] + [Int32DataFieldDefinition(revision: 2, field: 11, Index = 99, Size = 1)] + public TighteningValueStatus TorqueStatus { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 7, Index = 76, Size = 1)] + [Int32DataFieldDefinition(revision: 2, field: 12, Index = 102, Size = 1)] + public TighteningValueStatus AngleStatus { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 1, field: 8, Index = 79, Size = 6)] + [TruncatedDecimalDataFieldDefinition(revision: 2, field: 19, Index = 132, Size = 6)] + public decimal Torque { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 9, Index = 87, Size = 5)] + [Int32DataFieldDefinition(revision: 2, field: 20, Index = 140, Size = 5)] + public int Angle { get; set; } + + [TimestampDataFieldDefinition(revision: 1, field: 10, Index = 94, Size = 19)] + [TimestampDataFieldDefinition(revision: 2, field: 28, Index = 205, Size = 19)] + public DateTime Timestamp { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 11, Index = 115, Size = 1)] + [Int32DataFieldDefinition(revision: 2, field: 10, Index = 96, Size = 1)] + public BatchStatus BatchStatus { get; set; } + //Rev 2 - public int JobId - { - get => GetField(2, DataFields.JobId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.JobId).SetValue(OpenProtocolConvert.ToString, value); - } - public Strategy Strategy - { - get => (Strategy)GetField(2, DataFields.Strategy).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.Strategy).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 2, field: 3, Index = 59, Size = 4)] + public int JobId { get; set; } + + [Int32DataFieldDefinition(revision: 2, field: 5, Index = 70, Size = 2)] + public Strategy Strategy { get; set; } + + [StrategyOptionsDefinition(revision: 2, field: 6, Index = 74, Size = 5, PaddingChar = '0', PaddingOrientation = PaddingOrientation.LeftPadded)] public StrategyOptions StrategyOptions { get; set; } - public int BatchSize - { - get => GetField(2, DataFields.BatchSize).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.BatchSize).SetValue(OpenProtocolConvert.ToString, value); - } - public TighteningValueStatus RundownAngleStatus - { - get => (TighteningValueStatus)GetField(2, DataFields.RundownAngleStatus).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.RundownAngleStatus).SetValue(OpenProtocolConvert.ToString, value); - } - public TighteningValueStatus CurrentMonitoringStatus - { - get => (TighteningValueStatus)GetField(2, DataFields.CurrentMonitoringStatus).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.CurrentMonitoringStatus).SetValue(OpenProtocolConvert.ToString, value); - } - public TighteningValueStatus SelftapStatus - { - get => (TighteningValueStatus)GetField(2, DataFields.SelftapStatus).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.SelftapStatus).SetValue(OpenProtocolConvert.ToString, value); - } - public TighteningValueStatus PrevailTorqueMonitoringStatus - { - get => (TighteningValueStatus)GetField(2, DataFields.PrevailTorqueMonitoringStatus).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.PrevailTorqueMonitoringStatus).SetValue(OpenProtocolConvert.ToString, value); - } - public TighteningValueStatus PrevailTorqueCompensateStatus - { - get => (TighteningValueStatus)GetField(2, DataFields.PrevaiTorqueMonitoringStatus).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.PrevaiTorqueMonitoringStatus).SetValue(OpenProtocolConvert.ToString, value); - } + + [Int32DataFieldDefinition(revision: 2, field: 7, Index = 81, Size = 4)] + public int BatchSize { get; set; } + + [Int32DataFieldDefinition(revision: 2, field: 13, Index = 105, Size = 1)] + public TighteningValueStatus RundownAngleStatus { get; set; } + + [Int32DataFieldDefinition(revision: 2, field: 14, Index = 108, Size = 1)] + public TighteningValueStatus CurrentMonitoringStatus { get; set; } + + [Int32DataFieldDefinition(revision: 2, field: 15, Index = 111, Size = 1)] + public TighteningValueStatus SelftapStatus { get; set; } + + [Int32DataFieldDefinition(revision: 2, field: 16, Index = 114, Size = 1)] + public TighteningValueStatus PrevailTorqueMonitoringStatus { get; set; } + + [Int32DataFieldDefinition(revision: 2, field: 17, Index = 117, Size = 1)] + public TighteningValueStatus PrevailTorqueCompensateStatus { get; set; } + + [TighteningErrorStatusDefinition(revision: 2, field: 18, Index = 120, Size = 10, PaddingChar = '0', PaddingOrientation = PaddingOrientation.LeftPadded)] public TighteningErrorStatus TighteningErrorStatus { get; set; } - public int RundownAngle - { - get => GetField(2, DataFields.RundownAngle).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.RundownAngle).SetValue(OpenProtocolConvert.ToString, value); - } - public int CurrentMonitoringValue - { - get => GetField(2, DataFields.CurrentMonitoringValue).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.CurrentMonitoringValue).SetValue(OpenProtocolConvert.ToString, value); - } - public decimal SelftapTorque - { - get => GetField(2, DataFields.SelftapTorque).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(2, DataFields.SelftapTorque).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal PrevailTorque - { - get => GetField(2, DataFields.PrevailTorque).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(2, DataFields.PrevailTorque).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public int JobSequenceNumber - { - get => GetField(2, DataFields.JobSequenceNumber).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.JobSequenceNumber).SetValue(OpenProtocolConvert.ToString, value); - } - public int SyncTighteningId - { - get => GetField(2, DataFields.SyncTighteningId).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.SyncTighteningId).SetValue(OpenProtocolConvert.ToString, value); - } - public string ToolSerialNumber - { - get => GetField(2, DataFields.ToolSerialNumber).Value; - set => GetField(2, DataFields.ToolSerialNumber).SetValue(value); - } + + [Int32DataFieldDefinition(revision: 2, field: 21, Index = 147, Size = 5)] + public int RundownAngle { get; set; } + + [Int32DataFieldDefinition(revision: 2, field: 22, Index = 154, Size = 3)] + public int CurrentMonitoringValue { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 2, field: 23, Index = 159, Size = 6)] + public decimal SelftapTorque { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 2, field: 24, Index = 167, Size = 6)] + public decimal PrevailTorque { get; set; } + + [Int32DataFieldDefinition(revision: 2, field: 25, Index = 175, Size = 5)] + public int JobSequenceNumber { get; set; } + + [Int32DataFieldDefinition(revision: 2, field: 26, Index = 182, Size = 5)] + public int SyncTighteningId { get; set; } + + [StringDataFieldDefinition(revision: 2, field: 27, Index = 189, Size = 14)] + public string ToolSerialNumber { get; set; } + //Rev 3 - public TorqueValuesUnit TorqueValuesUnit - { - get => (TorqueValuesUnit)GetField(3, DataFields.TorqueValuesUnit).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(3, DataFields.TorqueValuesUnit).SetValue(OpenProtocolConvert.ToString, value); - } - public ResultType ResultType - { - get => (ResultType)GetField(3, DataFields.ResultType).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(3, DataFields.ResultType).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 3, field: 29, Index = 226, Size = 1)] + public TorqueValuesUnit TorqueValuesUnit { get; set; } + + [Int32DataFieldDefinition(revision: 3, field: 30, Index = 229, Size = 2)] + public ResultType ResultType { get; set; } + + //Rev 4 - public string IdentifierResultPart2 - { - get => GetField(4, DataFields.IdentifierResulPart2).Value; - set => GetField(4, DataFields.IdentifierResulPart2).SetValue(value); - } - public string IdentifierResultPart3 - { - get => GetField(4, DataFields.IdentifierResulPart3).Value; - set => GetField(4, DataFields.IdentifierResulPart3).SetValue(value); - } - public string IdentifierResultPart4 - { - get => GetField(4, DataFields.IdentifierResulPart4).Value; - set => GetField(4, DataFields.IdentifierResulPart4).SetValue(value); - } + [StringDataFieldDefinition(revision: 4, field: 31, Index = 233, Size = 25)] + public string IdentifierResultPart2 { get; set; } + + [StringDataFieldDefinition(revision: 4, field: 32, Index = 260, Size = 25)] + public string IdentifierResultPart3 { get; set; } + + [StringDataFieldDefinition(revision: 4, field: 33, Index = 287, Size = 25)] + public string IdentifierResultPart4 { get; set; } + //Rev 5 - public string CustomerTighteningErrorCode - { - get => GetField(5, DataFields.CustomerTighteningErrorCode).Value; - set => GetField(5, DataFields.CustomerTighteningErrorCode).SetValue(value); - } + [StringDataFieldDefinition(revision: 5, field: 34, Index = 314, Size = 4)] + public string CustomerTighteningErrorCode { get; set; } + //Rev 6 - public decimal PrevailTorqueCompensateValue - { - get => GetField(6, DataFields.PrevailTorqueCompensateValue).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(6, DataFields.PrevailTorqueCompensateValue).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } + [TruncatedDecimalDataFieldDefinition(revision: 6, field: 35, Index = 320, Size = 6)] + public decimal PrevailTorqueCompensateValue { get; set; } + + [TighteningErrorStatus2Definition(revision: 6, field: 36, Index = 328, Size = 10, PaddingChar = '0', PaddingOrientation = PaddingOrientation.LeftPadded)] public TighteningErrorStatus2 TighteningErrorStatus2 { get; set; } + //Rev 7 - public long StationId - { - get => GetField(7, DataFields.StationId).GetValue(OpenProtocolConvert.ToInt64); - set => GetField(7, DataFields.StationId).SetValue(OpenProtocolConvert.ToString, value); - } - public string StationName - { - get => GetField(7, DataFields.StationName).Value; - set => GetField(7, DataFields.StationName).SetValue(value); - } + [Int64DataFieldDefinition(revision: 7, field: 37, Index = 340, Size = 10)] + public long StationId { get; set; } + + [StringDataFieldDefinition(revision: 7, field: 38, Index = 352, Size = 25)] + public string StationName { get; set; } + //Rev 8 - public decimal StartFinalAngle - { - get => GetField(8, DataFields.StartFinalAngle).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(8, DataFields.StartFinalAngle).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public PostViewTorque PostViewTorqueActivated - { - get => (PostViewTorque)GetField(8, DataFields.PostViewTorqueActivated).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(8, DataFields.PostViewTorqueActivated).SetValue(OpenProtocolConvert.ToString, value); - } - public decimal PostViewTorqueHigh - { - get => GetField(8, DataFields.PostViewTorqueHigh).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(8, DataFields.PostViewTorqueHigh).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal PostViewTorqueLow - { - get => GetField(8, DataFields.PostViewTorqueLow).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(8, DataFields.PostViewTorqueLow).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } + [TruncatedDecimalDataFieldDefinition(revision: 8, field: 39, Index = 379, Size = 6)] + public decimal StartFinalAngle { get; set; } + + [Int32DataFieldDefinition(revision: 8, field: 40, Index = 387, Size = 1)] + public PostViewTorque PostViewTorqueActivated { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 8, field: 41, Index = 390, Size = 6)] + public decimal PostViewTorqueHigh { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 8, field: 42, Index = 398, Size = 6)] + public decimal PostViewTorqueLow { get; set; } + //Rev 9 - public decimal CurrentMonitoringAmpere - { - get => GetField(9, DataFields.CurrentMonitoringAmp).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(9, DataFields.CurrentMonitoringAmp).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal CurrentMonitoringAmpereMin - { - get => GetField(9, DataFields.CurrentMonitoringAmpMin).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(9, DataFields.CurrentMonitoringAmpMin).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal CurrentMonitoringAmpereMax - { - get => GetField(9, DataFields.CurrentMonitoringAmpMax).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(9, DataFields.CurrentMonitoringAmpMax).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } + [TruncatedDecimalDataFieldDefinition(revision: 9, field: 43, Index = 406, Size = 5)] + public decimal CurrentMonitoringAmpere { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 9, field: 44, Index = 413, Size = 5)] + public decimal CurrentMonitoringAmpereMin { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 9, field: 45, Index = 420, Size = 5)] + public decimal CurrentMonitoringAmpereMax { get; set; } + //Rev 10 addition - public int AngleNumeratorScaleFactor - { - get => GetField(10, DataFields.AngleNumeratorScaleFactor).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(10, DataFields.AngleNumeratorScaleFactor).SetValue(OpenProtocolConvert.ToString, value); - } - public int AngleDenominatorScaleFactor - { - get => GetField(10, DataFields.AngleDenominatorScaleFactor).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(10, DataFields.AngleDenominatorScaleFactor).SetValue(OpenProtocolConvert.ToString, value); - } - public TighteningValueStatus OverallAngleStatus - { - get => (TighteningValueStatus)GetField(10, DataFields.OverallAngleStatus).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(10, DataFields.OverallAngleStatus).SetValue(OpenProtocolConvert.ToString, value); - } - public int OverallAngleMin - { - get => GetField(10, DataFields.OverallAngleMin).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(10, DataFields.OverallAngleMin).SetValue(OpenProtocolConvert.ToString, value); - } - public int OverallAngleMax - { - get => GetField(10, DataFields.OverallAngleMax).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(10, DataFields.OverallAngleMax).SetValue(OpenProtocolConvert.ToString, value); - } - public int OverallAngle - { - get => GetField(10, DataFields.OverallAngle).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(10, DataFields.OverallAngle).SetValue(OpenProtocolConvert.ToString, value); - } - public decimal PeakTorque - { - get => GetField(10, DataFields.PeakTorque).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(10, DataFields.PeakTorque).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal ResidualBreakawayTorque - { - get => GetField(10, DataFields.ResidualBreakawayTorque).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(10, DataFields.ResidualBreakawayTorque).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal StartRundownAngle - { - get => GetField(10, DataFields.StartRundownAngle).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(10, DataFields.StartRundownAngle).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal RundownAngleComplete - { - get => GetField(10, DataFields.RundownAngleComplete).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(10, DataFields.RundownAngleComplete).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } + [Int32DataFieldDefinition(revision: 10, field: 46, Index = 427, Size = 5)] + public int AngleNumeratorScaleFactor { get; set; } + + [Int32DataFieldDefinition(revision: 10, field: 47, Index = 434, Size = 5)] + public int AngleDenominatorScaleFactor { get; set; } + + [Int32DataFieldDefinition(revision: 10, field: 48, Index = 441, Size = 1)] + public TighteningValueStatus OverallAngleStatus { get; set; } + + [Int32DataFieldDefinition(revision: 10, field: 49, Index = 444, Size = 5)] + public int OverallAngleMin { get; set; } + + [Int32DataFieldDefinition(revision: 10, field: 50, Index = 451, Size = 5)] + public int OverallAngleMax { get; set; } + + [Int32DataFieldDefinition(revision: 10, field: 51, Index = 458, Size = 5)] + public int OverallAngle { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 10, field: 52, Index = 465, Size = 6)] + public decimal PeakTorque { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 10, field: 53, Index = 473, Size = 6)] + public decimal ResidualBreakawayTorque { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 10, field: 54, Index = 481, Size = 6)] + public decimal StartRundownAngle { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 10, field: 55, Index = 489, Size = 6)] + public decimal RundownAngleComplete { get; set; } + //Rev 11 - public decimal ClickTorque - { - get => GetField(11, DataFields.ClickTorque).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(11, DataFields.ClickTorque).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public int ClickAngle - { - get => GetField(11, DataFields.ClickAngle).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(11, DataFields.ClickAngle).SetValue(OpenProtocolConvert.ToString, value); - } + [TruncatedDecimalDataFieldDefinition(revision: 11, field: 56, Index = 497, Size = 6)] + public decimal ClickTorque { get; set; } + + [Int32DataFieldDefinition(revision: 11, field: 57, Index = 505, Size = 5)] + public int ClickAngle { get; set; } + + //Rev 12 + [Int32DataFieldDefinition(revision: 12, field: 58, Index = 512, Size = 4)] + public int SelectedIdentifierNumber { get; set; } + + [StringDataFieldDefinition(revision: 12, field: 59, Index = 518, Size = 25)] + public string JointId { get; set; } + + //Rev 998 addition + [Int32DataFieldDefinition(revision: 998, field: 37, Index = 340, Size = 2)] + public int NumberOfStagesInMultistage { get; set; } + + [Int32DataFieldDefinition(revision: 998, field: 38, Index = 344, Size = 2)] + public int NumberOfStageResults { get; set; } + + [StageResultCollectionDefinition(revision: 998, field: 39, Index = 348, Size = 0)] + public List StageResults { get; set; } = new List(); public Mid0065() : this(DEFAULT_REVISION) { @@ -305,7 +231,7 @@ public Mid0065() : this(DEFAULT_REVISION) public Mid0065(Header header) : base(header) { - + StageResults ??= []; } public Mid0065(int revision) : this(new Header() @@ -320,279 +246,67 @@ protected override string BuildHeader() { if (RevisionsByFields.Any()) { - Header.Length = 20; - Header.Revision = Header.Revision > 0 ? Header.Revision : 1; - if (Header.Revision > 1) + Header.Length = Header.DefaultSize; + if (Header.Revision == 998) { - for (int i = 2; i <= Header.Revision; i++) - foreach (var dataField in RevisionsByFields[i]) - Header.Length += (dataField.HasPrefix ? 2 : 0) + dataField.Size; - } - else - { - foreach (var dataField in RevisionsByFields[1]) - Header.Length += (dataField.HasPrefix ? 2 : 0) + dataField.Size; + var stageResultField = GetField(nameof(StageResults)); + stageResultField.Size = StageResults.Count * 11; } + + var fields = DataFieldsByRevision(); + Header.Length += fields.Sum(x => x.TotalSize); } return Header.ToString(); } public override string Pack() { - var builder = new StringBuilder(BuildHeader()); - int prefixIndex = 1; - if (Header.Revision > 1) - { - GetField(2, DataFields.StrategyOptions).SetValue(StrategyOptions.Pack()); - GetField(2, DataFields.TighteningErrorStatus).SetValue(TighteningErrorStatus.Pack()); - - if (Header.Revision > 5) - { - GetField(6, DataFields.TighteningErrorStatus2).SetValue(TighteningErrorStatus2.Pack()); - } - - int processUntil = Header.Revision; - for (int revision = 2; revision <= processUntil; revision++) - { - builder.Append(Pack(revision, ref prefixIndex)); - } - } - else - { - builder.Append(Pack(Header.Revision, ref prefixIndex)); - } + var builder = new StringBuilder(); + var fields = DataFieldsByRevision().OrderBy(f => f.Index).ToList(); + builder.Append(BuildHeader()); + builder.Append(Pack(fields)); return builder.ToString(); } - protected override void ProcessDataFields(string package) + protected override void ProcessDataFields(ReadOnlySpan package) { - if (Header.Revision == 1) - { - ProcessDataFields(Header.Revision, package); - } - else - { - int processUntil = Header.Revision; - for (int revision = 2; revision <= processUntil; revision++) - ProcessDataFields(revision, package); - - var strategyOptionsField = GetField(2, DataFields.StrategyOptions); - StrategyOptions = StrategyOptions.Parse(strategyOptionsField.Value); - - var tighteningErrorStatusField = GetField(2, DataFields.TighteningErrorStatus); - TighteningErrorStatus = TighteningErrorStatus.Parse(tighteningErrorStatusField.Value); - - if (Header.Revision > 5) - { - var tighteningErrorStatus2Field = GetField(6, DataFields.TighteningErrorStatus2); - TighteningErrorStatus2 = TighteningErrorStatus2.Parse(tighteningErrorStatus2Field.Value); - } - } + var fields = DataFieldsByRevision().OrderBy(f => f.Index).ToList(); + base.ProcessDataFields(fields, package); } - protected override Dictionary> RegisterDatafields() + protected override void ProcessDataField(DataField dataField, ReadOnlySpan package) { - //opted to work with a different approuch (since it would need to modify too much fields) - return new Dictionary>() + if (Header.StandardizedRevision == 998 && dataField.Field == 39) { - { - 1, new List() - { - DataField.Number(DataFields.TighteningId, 20, 10), - DataField.String(DataFields.VinNumber, 32, 25), - DataField.Number(DataFields.ParameterSetId, 59, 3), - DataField.Number(DataFields.BatchCounter, 64, 4), - DataField.Number(DataFields.TighteningStatus, 70, 1), - DataField.Number(DataFields.TorqueStatus, 73, 1), - DataField.Number(DataFields.AngleStatus, 76, 1), - DataField.Number(DataFields.Torque, 79, 6), - DataField.Number(DataFields.Angle, 87, 5), - DataField.Timestamp(DataFields.Timestamp, 94), - DataField.Number(DataFields.BatchStatus, 115, 1) - } - }, - { - 2, new List() - { - DataField.Number(DataFields.TighteningId, 20, 10), - DataField.String(DataFields.VinNumber, 32, 25), - DataField.Number(DataFields.JobId, 59, 4), - DataField.Number(DataFields.ParameterSetId, 65, 3), - DataField.Number(DataFields.Strategy, 70, 2), - new(DataFields.StrategyOptions, 74, 5, '0', PaddingOrientation.LeftPadded), - DataField.Number(DataFields.BatchSize, 81, 4), - DataField.Number(DataFields.BatchCounter, 87, 4), - DataField.Number(DataFields.TighteningStatus, 93, 1), - DataField.Number(DataFields.BatchStatus, 96, 1), - DataField.Number(DataFields.TorqueStatus, 99, 1), - DataField.Number(DataFields.AngleStatus, 102, 1), - DataField.Number(DataFields.RundownAngleStatus, 105, 1), - DataField.Number(DataFields.CurrentMonitoringStatus, 108, 1), - DataField.Number(DataFields.SelftapStatus, 111, 1), - DataField.Number(DataFields.PrevailTorqueMonitoringStatus, 114, 1), - DataField.Number(DataFields.PrevaiTorqueMonitoringStatus, 117, 1), - new(DataFields.TighteningErrorStatus, 120, 10, '0', PaddingOrientation.LeftPadded), - DataField.Number(DataFields.Torque, 132, 6), - DataField.Number(DataFields.Angle, 140, 5), - DataField.Number(DataFields.RundownAngle, 147, 5), - DataField.Number(DataFields.CurrentMonitoringValue, 154, 3), - DataField.Number(DataFields.SelftapTorque, 159, 6), - DataField.Number(DataFields.PrevailTorque, 167, 6), - DataField.Number(DataFields.JobSequenceNumber, 175, 5), - DataField.Number(DataFields.SyncTighteningId, 182, 5), - DataField.String(DataFields.ToolSerialNumber, 189, 14), - DataField.Timestamp(DataFields.Timestamp, 205), - } - }, - { - 3, new List() - { - DataField.Number(DataFields.TorqueValuesUnit, 226, 1), - DataField.Number(DataFields.ResultType, 229, 2) - } - }, - { - 4, new List() - { - DataField.String(DataFields.IdentifierResulPart2, 233, 25), - DataField.String(DataFields.IdentifierResulPart3, 260, 25), - DataField.String(DataFields.IdentifierResulPart4, 287, 25) - } - }, - { - 5, new List() - { - DataField.String(DataFields.CustomerTighteningErrorCode, 314, 4), - } - }, - { - 6, new List() - { - DataField.Number(DataFields.PrevailTorqueCompensateValue, 320, 6), - new(DataFields.TighteningErrorStatus2, 328, 10, '0', PaddingOrientation.LeftPadded) - } - }, - { - 7, new List() - { - DataField.Number(DataFields.StationId, 340, 10), - DataField.String(DataFields.StationName, 352, 25) - } - }, - { - 8, new List() - { - DataField.Number(DataFields.StartFinalAngle, 379, 6), - DataField.Number(DataFields.PostViewTorqueActivated, 387, 1), - DataField.Number(DataFields.PostViewTorqueHigh, 390, 6), - DataField.Number(DataFields.PostViewTorqueLow, 398, 6), - } - }, - { - 9, new List() - { - DataField.Number(DataFields.CurrentMonitoringAmp, 406, 5), - DataField.Number(DataFields.CurrentMonitoringAmpMin, 413, 5), - DataField.Number(DataFields.CurrentMonitoringAmpMax, 420, 5) - } - }, - { - 10, new List() - { - DataField.Number(DataFields.AngleNumeratorScaleFactor, 427, 5), - DataField.Number(DataFields.AngleDenominatorScaleFactor, 434, 5), - DataField.Number(DataFields.OverallAngleStatus, 441, 1), - DataField.Number(DataFields.OverallAngleMin, 444, 5), - DataField.Number(DataFields.OverallAngleMax, 451, 5), - DataField.Number(DataFields.OverallAngle, 458, 5), - DataField.Number(DataFields.PeakTorque, 465, 6), - DataField.Number(DataFields.ResidualBreakawayTorque, 473, 6), - DataField.Number(DataFields.StartRundownAngle, 481, 6), - DataField.Number(DataFields.RundownAngleComplete, 489, 6) - } - }, - { - 11, new List() - { - DataField.Number(DataFields.ClickTorque, 497, 6), - DataField.Number(DataFields.ClickAngle, 505, 5), - } - } - }; + dataField.Size = NumberOfStageResults * 11; + } + base.ProcessDataField(dataField, package); } - private int GetCurrentRevisionIndex() => (Header.Revision > 1) ? 2 : 1; - protected enum DataFields + private IEnumerable DataFieldsByRevision() { - TighteningId, - VinNumber, - ParameterSetId, - BatchCounter, - TighteningStatus, - TorqueStatus, - AngleStatus, - Torque, - Angle, - Timestamp, - BatchStatus, - //Rev 2 Additions - JobId, - Strategy, - StrategyOptions, - BatchSize, - RundownAngleStatus, - CurrentMonitoringStatus, - SelftapStatus, - PrevailTorqueMonitoringStatus, - PrevaiTorqueMonitoringStatus, - TighteningErrorStatus, - RundownAngle, - CurrentMonitoringValue, - SelftapTorque, - PrevailTorque, - JobSequenceNumber, - SyncTighteningId, - ToolSerialNumber, - //Rev 3 Additions - TorqueValuesUnit, - ResultType, - //Rev 4 Additions - IdentifierResulPart2, - IdentifierResulPart3, - IdentifierResulPart4, - //Rev 5 Additions - CustomerTighteningErrorCode, - //Rev 6 Additions - PrevailTorqueCompensateValue, - TighteningErrorStatus2, - //Rev 7 Additions - StationId, - StationName, - //Rev 8 Additions - StartFinalAngle, - PostViewTorqueActivated, - PostViewTorqueHigh, - PostViewTorqueLow, - //Rev 9 - CurrentMonitoringAmp, - CurrentMonitoringAmpMin, - CurrentMonitoringAmpMax, - //Rev 10 - AngleNumeratorScaleFactor, - AngleDenominatorScaleFactor, - OverallAngleStatus, - OverallAngleMin, - OverallAngleMax, - OverallAngle, - PeakTorque, - ResidualBreakawayTorque, - StartRundownAngle, - RundownAngleComplete, - //Rev 11 - ClickTorque, - ClickAngle + var currentRevision = Header.StandardizedRevision; + var fromRevision = Header.StandardizedRevision; + var toRevision = Header.StandardizedRevision; + if (currentRevision > 1) + { + fromRevision = 2; + toRevision = Header.StandardizedRevision != 998 ? Header.StandardizedRevision : 6; + } + + for (int i = fromRevision; i <= toRevision; i++) + { + foreach (var dataField in RevisionsByFields[i]) + yield return dataField; + } + + if (currentRevision == 998) + { + foreach (var dataField in RevisionsByFields[998]) + yield return dataField; + } } } } diff --git a/src/OpenProtocolInterpreter/Tightening/Mid0066.cs b/src/OpenProtocolInterpreter/Tightening/Mid0066.cs index d85e3b60..d1e4923a 100644 --- a/src/OpenProtocolInterpreter/Tightening/Mid0066.cs +++ b/src/OpenProtocolInterpreter/Tightening/Mid0066.cs @@ -1,4 +1,6 @@ -using System.Collections.Generic; +using System; +using System.Linq; +using System.Text; namespace OpenProtocolInterpreter.Tightening { @@ -12,17 +14,13 @@ public class Mid0066 : Mid, ITightening, IController { public const int MID = 66; - public int NumberOfOfflineResults - { - get => GetField(1, DataFields.NumberOfOfflineResults).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.NumberOfOfflineResults).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 2)] + [Int32DataFieldDefinition(revision: 2, field: 1, Index = 20, Size = 3)] + public int NumberOfOfflineResults { get; set; } + + [Int32DataFieldDefinition(revision: 2, field: 2, Index = 25, Size = 3)] + public int NumberOfOfflineCurves { get; set; } - public int NumberOfOfflineCurves - { - get => GetField(2, DataFields.NumberOfOfflineCurves).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.NumberOfOfflineCurves).SetValue(OpenProtocolConvert.ToString, value); - } public Mid0066() : this(new Header() { @@ -36,48 +34,28 @@ public Mid0066(Header header) : base(header) { } - public override Mid Parse(string package) - { - Header = ProcessHeader(package); - HandleRevisionSizes(); - ProcessDataFields(package); - return this; - } - - public override string Pack() + protected override string BuildHeader() { - HandleRevisionSizes(); - return base.Pack(); + var fields = RevisionsByFields[Header.StandardizedRevision]; + Header.Length = Header.DefaultSize + fields.Sum(dataField => dataField.TotalSize); + return Header.ToString(); } - private void HandleRevisionSizes() + public override Mid Parse(ReadOnlySpan package) { - GetField(1, DataFields.NumberOfOfflineResults).Size = Header.Revision > 1 ? 3 : 2; + Header = ProcessHeader(package); + var fields = RevisionsByFields[Header.StandardizedRevision]; + ProcessDataFields(fields, package); + return this; } - protected override Dictionary> RegisterDatafields() + public override string Pack() { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.NumberOfOfflineResults, 20, 2) - } - }, - { - 2, new List() - { - DataField.Number(DataFields.NumberOfOfflineCurves, 25, 3), - } - } - }; - } + var fields = RevisionsByFields[Header.StandardizedRevision]; + var builder = new StringBuilder(BuildHeader()); - protected enum DataFields - { - NumberOfOfflineResults, - NumberOfOfflineCurves + builder.Append(Pack(fields)); + return builder.ToString(); } } } diff --git a/src/OpenProtocolInterpreter/Tightening/Mid0067.cs b/src/OpenProtocolInterpreter/Tightening/Mid0067.cs new file mode 100644 index 00000000..7f14d631 --- /dev/null +++ b/src/OpenProtocolInterpreter/Tightening/Mid0067.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace OpenProtocolInterpreter.Tightening +{ + /// + /// Tightening Result List Upload + /// This message contains a list of tightening results stored in the controller. The result list is sorted ascendingly on result index, and contains a brief summary of each result. + /// shall be used for fetching this message + /// For full results data, request upload of + /// + public class Mid0067 : Mid, ITightening, IController + { + public const int MID = 67; + + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 2, HasPrefix = false)] + public int NumberOfResults { get; set; } + + [ResultDataCollectionDefinition(revision: 1, field: 2, Index = 22, Size = 0, HasPrefix = false)] + public List Results { get; set; } = new List(); + + public Mid0067() : this(new Header() + { + Mid = MID, + Revision = DEFAULT_REVISION + }) + { + + } + + public Mid0067(Header header) : base(header) + { + } + + protected override void ProcessDataField(DataField dataField, ReadOnlySpan package) + { + if (dataField.Field == 2) //Results + { + dataField.Size = NumberOfResults * 30; + } + + base.ProcessDataField(dataField, package); + } + + public override string Pack() + { + NumberOfResults = Results?.Count ?? 0; //Enforce list size even if modified + GetField(nameof(Results)).Size = NumberOfResults * 30; + return base.Pack(); + } + } + + public class Mid0067ExtraData : ExtraData, IExtraDataRequest + { + public override int Mid => Mid0067.MID; + + [Int64DataFieldDefinition(revision: 1, field: 1, Index = 0, Size = 10, HasPrefix = false)] + public long StartIndex { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 2, Index = 10, Size = 3, HasPrefix = false)] + public int Count { get; set; } + } +} diff --git a/src/OpenProtocolInterpreter/Tightening/Mid0902.cs b/src/OpenProtocolInterpreter/Tightening/Mid0902.cs index 128091f2..f7965194 100644 --- a/src/OpenProtocolInterpreter/Tightening/Mid0902.cs +++ b/src/OpenProtocolInterpreter/Tightening/Mid0902.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; @@ -15,37 +15,26 @@ public class Mid0902 : Mid, ITightening, IController { public const int MID = 902; - public long Capacity - { - get => GetField(1, DataFields.Capacity).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.Capacity).SetValue(OpenProtocolConvert.ToString, value); - } - public long OldestSequenceNumber - { - get => GetField(1, DataFields.OldestSequenceNumber).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.OldestSequenceNumber).SetValue(OpenProtocolConvert.ToString, value); - } - public DateTime OldestTime - { - get => GetField(1, DataFields.OldestTime).GetValue(OpenProtocolConvert.ToDateTime); - set => GetField(1, DataFields.OldestTime).SetValue(OpenProtocolConvert.ToString, value); - } - public long NewestSequenceNumber - { - get => GetField(1, DataFields.NewestSequenceNumber).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.NewestTime).SetValue(OpenProtocolConvert.ToString, value); - } - public DateTime NewestTime - { - get => GetField(1, DataFields.NewestTime).GetValue(OpenProtocolConvert.ToDateTime); - set => GetField(1, DataFields.NewestTime).SetValue(OpenProtocolConvert.ToString, value); - } - public int NumberOfPIDs - { - get => GetField(1, DataFields.NumberOfPIDs).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.NumberOfPIDs).SetValue(OpenProtocolConvert.ToString, value); - } - public List VariableDataFields { get; set; } + [Int64DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 10, HasPrefix = false)] + public long Capacity { get; set; } + + [Int64DataFieldDefinition(revision: 1, field: 2, Index = 30, Size = 10, HasPrefix = false)] + public long OldestSequenceNumber { get; set; } + + [TimestampDataFieldDefinition(revision: 1, field: 3, Index = 40, HasPrefix = false)] + public DateTime OldestTime { get; set; } + + [Int64DataFieldDefinition(revision: 1, field: 4, Index = 59, Size = 10, HasPrefix = false)] + public long NewestSequenceNumber { get; set; } + + [TimestampDataFieldDefinition(revision: 1, field: 5, Index = 69, HasPrefix = false)] + public DateTime NewestTime { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 6, Index = 88, Size = 3, HasPrefix = false)] + public int NumberOfPIDs { get; set; } + + [VariableDataFieldCollectionDefinition(revision: 1, field: 7, Index = 91, Size = 0, HasPrefix = false)] + public List VariableDataFields { get; set; } = new List(); public Mid0902() : this(new Header() { @@ -58,56 +47,23 @@ public Mid0902() : this(new Header() public Mid0902(Header header) : base(header) { + VariableDataFields = []; } public override string Pack() { - var revision = Header.StandardizedRevision; - GetField(revision, DataFields.VariableDataFields).SetValue(OpenProtocolConvert.ToString(VariableDataFields)); - - var index = 1; - return string.Concat(BuildHeader(), base.Pack(revision, ref index)); + NumberOfPIDs = VariableDataFields?.Count ?? 0; //Enforce list size even if modified + GetField(revision: 1, field: 7).Size = VariableDataFields?.Sum(x => x.TotalSize) ?? 0; //Enforce size of variable data fields + return base.Pack(); } - public override Mid Parse(string package) + protected override void ProcessDataField(DataField dataField, ReadOnlySpan package) { - Header = ProcessHeader(package); - - var field = GetField(1, DataFields.VariableDataFields); - field.Size = Header.Length - field.Index; - base.Parse(package); - VariableDataFields = VariableDataField.ParseAll(field.Value).ToList(); - return this; - } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() + if (dataField.Field == 7) //VariableDataFields { - { - 1, new List() - { - DataField.Number(DataFields.Capacity, 20, 10, false), - DataField.Number(DataFields.OldestSequenceNumber, 30, 10, false), - DataField.Timestamp(DataFields.OldestTime, 40, false), - DataField.Number(DataFields.NewestSequenceNumber, 59, 10, false), - DataField.Timestamp(DataFields.NewestTime, 69, false), - DataField.Number(DataFields.NumberOfPIDs, 88, 3, false), - DataField.Volatile(DataFields.VariableDataFields, 91, false) - } - } - }; - } - - protected enum DataFields - { - Capacity, - OldestSequenceNumber, - OldestTime, - NewestSequenceNumber, - NewestTime, - NumberOfPIDs, - VariableDataFields + dataField.Size = Header.Length - dataField.Index; + } + base.ProcessDataField(dataField, package); } } } diff --git a/src/OpenProtocolInterpreter/Tightening/ResultData.cs b/src/OpenProtocolInterpreter/Tightening/ResultData.cs new file mode 100644 index 00000000..c2397f7c --- /dev/null +++ b/src/OpenProtocolInterpreter/Tightening/ResultData.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; + +namespace OpenProtocolInterpreter.Tightening +{ + public class ResultData + { + public long Index { get; set; } + public DateTime StartTime { get; set; } + public int Status { get; set; } + + public string Pack() + { + return OpenProtocolConvert.ToString('0', 10, PaddingOrientation.LeftPadded, Index) + + OpenProtocolConvert.ToString(StartTime) + + OpenProtocolConvert.ToString('0', 1, PaddingOrientation.LeftPadded, Status); + } + + public static ResultData Parse(string value) + => Parse(value.AsSpan()); + + public static ResultData Parse(ReadOnlySpan value) + { + return new ResultData() + { + Index = OpenProtocolConvert.ToInt64(value.Slice(0, 10)), + StartTime = OpenProtocolConvert.ToDateTime(value.Slice(10, 19)), + Status = OpenProtocolConvert.ToInt32(value.Slice(29, 1)) + }; + } + + public static IEnumerable ParseAll(string value) + => ParseAll(value.AsSpan()); + + public static IEnumerable ParseAll(ReadOnlySpan value) + { + var result = new List(); + const int sectionSize = 30; + for (int i = 0; i < value.Length; i += sectionSize) + result.Add(Parse(value.Slice(i, sectionSize))); + return result; + } + } + + public class ResultDataCollectionDefinitionAttribute : DataFieldDefinitionAttribute + { + public ResultDataCollectionDefinitionAttribute(int revision) : base(revision) + { + + } + public ResultDataCollectionDefinitionAttribute(int field, int revision) : base(field, revision) + { + + } + + internal override DataField Build(object owner, PropertyInfo propertyInfo, int index) + { + return new DataField>(Field, index, Size, HasPrefix) + { + DefaultConverter = Pack, + DefaultParser = Parse + }.Bind(owner, propertyInfo); + } + + private static string Pack(char paddingChar, int size, PaddingOrientation orientation, List value) + { + var builder = new StringBuilder(value.Count * 30); + foreach (var v in value) + builder.Append(v.Pack()); + + return builder.ToString(); + } + + private static List Parse(string value) + => ResultData.ParseAll(value).ToList(); + } +} diff --git a/src/OpenProtocolInterpreter/Tightening/StageResult.cs b/src/OpenProtocolInterpreter/Tightening/StageResult.cs index 1f69f45a..ced6cb7b 100644 --- a/src/OpenProtocolInterpreter/Tightening/StageResult.cs +++ b/src/OpenProtocolInterpreter/Tightening/StageResult.cs @@ -1,4 +1,8 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; namespace OpenProtocolInterpreter.Tightening { @@ -17,22 +21,60 @@ public string Pack() } public static StageResult Parse(string value) + => Parse(value.AsSpan()); + + public static StageResult Parse(ReadOnlySpan value) { return new StageResult() { - Torque = OpenProtocolConvert.ToTruncatedDecimal(value.Substring(0, 6)), - Angle = OpenProtocolConvert.ToInt32(value.Substring(6, 5)) + Torque = OpenProtocolConvert.ToTruncatedDecimal(value.Slice(0, 6)), + Angle = OpenProtocolConvert.ToInt32(value.Slice(6, 5)) }; } public static IEnumerable ParseAll(string value) + => ParseAll(value.AsSpan()); + + public static IEnumerable ParseAll(ReadOnlySpan value) { + var result = new List(); const int sectionSize = 11; for (int i = 0; i < value.Length; i += sectionSize) + result.Add(Parse(value.Slice(i, sectionSize))); + return result; + } + } + + public class StageResultCollectionDefinitionAttribute : DataFieldDefinitionAttribute + { + public StageResultCollectionDefinitionAttribute(int revision) : base(revision) + { + + } + public StageResultCollectionDefinitionAttribute(int field, int revision) : base(field, revision) + { + + } + + internal override DataField Build(object owner, PropertyInfo propertyInfo, int index) + { + return new DataField>(Field, index, Size, HasPrefix) { - var section = value.Substring(i, sectionSize); - yield return Parse(section); - } + DefaultConverter = PackStageResults, + DefaultParser = ParseStageResults + }.Bind(owner, propertyInfo); } + + private static string PackStageResults(char paddingChar, int size, PaddingOrientation orientation, List stageResults) + { + var builder = new StringBuilder(stageResults.Count * 11); + foreach (var stageResult in stageResults) + builder.Append(stageResult.Pack()); + + return builder.ToString(); + } + + private static List ParseStageResults(string value) + => StageResult.ParseAll(value).ToList(); } } diff --git a/src/OpenProtocolInterpreter/Tightening/StrategyOptions.cs b/src/OpenProtocolInterpreter/Tightening/StrategyOptions.cs index bc900ced..8e4bd9f3 100644 --- a/src/OpenProtocolInterpreter/Tightening/StrategyOptions.cs +++ b/src/OpenProtocolInterpreter/Tightening/StrategyOptions.cs @@ -1,4 +1,5 @@ -using System.Text; +using System; +using System.Reflection; namespace OpenProtocolInterpreter.Tightening { @@ -24,7 +25,7 @@ public class StrategyOptions public string Pack() { byte[] bytes = PackBytes(); - return Encoding.ASCII.GetString(bytes); + return Mid.DefaultEncoding.GetString(bytes); } public byte[] PackBytes() @@ -53,14 +54,17 @@ public byte[] PackBytes() false }); - var asciiInt = System.BitConverter.ToInt32(bytes, 0).ToString("D5"); - return Encoding.ASCII.GetBytes(asciiInt); + var asciiInt = BitConverter.ToInt32(bytes, 0).ToString("D5"); + return Mid.DefaultEncoding.GetBytes(asciiInt); } public static StrategyOptions Parse(string value) + => Parse(value.AsSpan()); + + public static StrategyOptions Parse(ReadOnlySpan value) { var intValue = OpenProtocolConvert.ToInt32(value); - var bytes = System.BitConverter.GetBytes(intValue); + var bytes = BitConverter.GetBytes(intValue); return Parse(bytes); } @@ -84,4 +88,31 @@ public static StrategyOptions Parse(byte[] value) }; } } + + public class StrategyOptionsDefinitionAttribute : DataFieldDefinitionAttribute + { + public StrategyOptionsDefinitionAttribute(int revision) : base(revision) + { + + } + public StrategyOptionsDefinitionAttribute(int field, int revision) : base(field, revision) + { + + } + + internal override DataField Build(object owner, PropertyInfo propertyInfo, int index) + { + return new DataField(Field, index, Size, HasPrefix) + { + DefaultConverter = PackStrategyOptions, + DefaultParser = ParseStrategyOptions + }.Bind(owner, propertyInfo); + } + + private static string PackStrategyOptions(char paddingChar, int size, PaddingOrientation orientation, StrategyOptions strategyOptions) + => strategyOptions.Pack().PadLeft(size, paddingChar); + + private static StrategyOptions ParseStrategyOptions(string value) + => StrategyOptions.Parse(value); + } } diff --git a/src/OpenProtocolInterpreter/Tightening/TighteningErrorStatus.cs b/src/OpenProtocolInterpreter/Tightening/TighteningErrorStatus.cs index 57c6e0b3..5fa4bdbe 100644 --- a/src/OpenProtocolInterpreter/Tightening/TighteningErrorStatus.cs +++ b/src/OpenProtocolInterpreter/Tightening/TighteningErrorStatus.cs @@ -1,4 +1,5 @@ -using System.Text; +using System; +using System.Reflection; namespace OpenProtocolInterpreter.Tightening { @@ -47,7 +48,7 @@ public class TighteningErrorStatus public string Pack() { byte[] bytes = PackBytes(); - return Encoding.ASCII.GetString(bytes); + return Mid.DefaultEncoding.GetString(bytes); } public byte[] PackBytes() @@ -99,13 +100,16 @@ public byte[] PackBytes() ]); var asciiLong = System.BitConverter.ToInt64(bytes, 0).ToString("D10"); - return Encoding.ASCII.GetBytes(asciiLong); + return Mid.DefaultEncoding.GetBytes(asciiLong); } public static TighteningErrorStatus Parse(string value) + => Parse(value.AsSpan()); + + public static TighteningErrorStatus Parse(ReadOnlySpan value) { var longValue = OpenProtocolConvert.ToInt64(value); - var bytes = System.BitConverter.GetBytes(longValue); + var bytes = BitConverter.GetBytes(longValue); return Parse(bytes); } @@ -153,6 +157,33 @@ public static TighteningErrorStatus Parse(byte[] value) } } + public class TighteningErrorStatusDefinitionAttribute : DataFieldDefinitionAttribute + { + public TighteningErrorStatusDefinitionAttribute(int revision) : base(revision) + { + + } + public TighteningErrorStatusDefinitionAttribute(int field, int revision) : base(field, revision) + { + + } + + internal override DataField Build(object owner, PropertyInfo propertyInfo, int index) + { + return new DataField(Field, index, Size, HasPrefix) + { + DefaultConverter = PackTighteningErrorStatus, + DefaultParser = ParseTighteningErrorStatus + }.Bind(owner, propertyInfo); + } + + private static string PackTighteningErrorStatus(char paddingChar, int size, PaddingOrientation orientation, TighteningErrorStatus tighteningErrorStatus) + => tighteningErrorStatus.Pack().PadLeft(size, paddingChar); + + private static TighteningErrorStatus ParseTighteningErrorStatus(string value) + => TighteningErrorStatus.Parse(value); + } + public class TighteningErrorStatus2 { public bool DriveDeactivated { get; set; } @@ -184,7 +215,7 @@ public TighteningErrorStatus2() public string Pack() { byte[] bytes = PackBytes(); - return Encoding.ASCII.GetString(bytes); + return Mid.DefaultEncoding.GetString(bytes); } public byte[] PackBytes() @@ -234,10 +265,13 @@ public byte[] PackBytes() ]; var asciiLong = System.BitConverter.ToInt64(bytes, 0).ToString().PadLeft(10, '0'); - return Encoding.ASCII.GetBytes(asciiLong); + return Mid.DefaultEncoding.GetBytes(asciiLong); } public static TighteningErrorStatus2 Parse(string value) + => Parse(value.AsSpan()); + + public static TighteningErrorStatus2 Parse(ReadOnlySpan value) { var longValue = OpenProtocolConvert.ToInt64(value); var bytes = System.BitConverter.GetBytes(longValue); @@ -278,4 +312,32 @@ public static TighteningErrorStatus2 Parse(byte[] value) return obj; } } + + public class TighteningErrorStatus2DefinitionAttribute : DataFieldDefinitionAttribute + { + public TighteningErrorStatus2DefinitionAttribute(int revision) : base(revision) + { + + } + public TighteningErrorStatus2DefinitionAttribute(int field, int revision) : base(field, revision) + { + + } + + internal override DataField Build(object owner, PropertyInfo propertyInfo, int index) + { + return new DataField(Field, index, Size, HasPrefix) + { + DefaultConverter = PackTighteningErrorStatus2, + DefaultParser = ParseTighteningErrorStatus2 + }.Bind(owner, propertyInfo); + } + + private static string PackTighteningErrorStatus2(char paddingChar, int size, PaddingOrientation orientation, TighteningErrorStatus2 tighteningErrorStatus) + => tighteningErrorStatus.Pack().PadLeft(size, paddingChar); + + private static TighteningErrorStatus2 ParseTighteningErrorStatus2(string value) + => TighteningErrorStatus2.Parse(value); + } + } diff --git a/src/OpenProtocolInterpreter/Tightening/TighteningMessages.cs b/src/OpenProtocolInterpreter/Tightening/TighteningMessages.cs index 81ece324..67566bf4 100644 --- a/src/OpenProtocolInterpreter/Tightening/TighteningMessages.cs +++ b/src/OpenProtocolInterpreter/Tightening/TighteningMessages.cs @@ -11,16 +11,27 @@ internal class TighteningMessages : MessagesTemplate { public TighteningMessages() : base() { - _templates = new Dictionary() + _templates = new Dictionary>() { - { Mid0060.MID, new MidCompiledInstance(typeof(Mid0060)) }, - { Mid0061.MID, new MidCompiledInstance(typeof(Mid0061)) }, - { Mid0062.MID, new MidCompiledInstance(typeof(Mid0062)) }, - { Mid0063.MID, new MidCompiledInstance(typeof(Mid0063)) }, - { Mid0064.MID, new MidCompiledInstance(typeof(Mid0064)) }, - { Mid0065.MID, new MidCompiledInstance(typeof(Mid0065)) }, - { Mid0066.MID, new MidCompiledInstance(typeof(Mid0066)) }, - { Mid0902.MID, new MidCompiledInstance(typeof(Mid0902)) } + { Mid0060.MID, new CompiledInstance(typeof(Mid0060)) }, + { Mid0061.MID, new CompiledInstance(typeof(Mid0061)) }, + { Mid0062.MID, new CompiledInstance(typeof(Mid0062)) }, + { Mid0063.MID, new CompiledInstance(typeof(Mid0063)) }, + { Mid0064.MID, new CompiledInstance(typeof(Mid0064)) }, + { Mid0065.MID, new CompiledInstance(typeof(Mid0065)) }, + { Mid0066.MID, new CompiledInstance(typeof(Mid0066)) }, + { Mid0067.MID, new CompiledInstance(typeof(Mid0067)) }, + { Mid0902.MID, new CompiledInstance(typeof(Mid0902)) } + }; + + _extraDataTemplates = new Dictionary>>() + { + { + Mid0067.MID, new List>() + { + new CompiledInstance(typeof(Mid0067ExtraData)) + } + } }; } diff --git a/src/OpenProtocolInterpreter/Time/Mid0081.cs b/src/OpenProtocolInterpreter/Time/Mid0081.cs index fe563f2e..00853a79 100644 --- a/src/OpenProtocolInterpreter/Time/Mid0081.cs +++ b/src/OpenProtocolInterpreter/Time/Mid0081.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; namespace OpenProtocolInterpreter.Time { @@ -13,15 +12,12 @@ public class Mid0081 : Mid, ITime, IController { public const int MID = 81; - public DateTime Time - { - get => GetField(1, DataFields.Time).GetValue(OpenProtocolConvert.ToDateTime); - set => GetField(1, DataFields.Time).SetValue(OpenProtocolConvert.ToString, value); - } + [TimestampDataFieldDefinition(revision: 1, field: 1, Index = 20, HasPrefix = false)] + public DateTime Time { get; set; } public Mid0081() : this(new Header() { - Mid = MID, + Mid = MID, Revision = DEFAULT_REVISION }) { @@ -30,23 +26,5 @@ public Mid0081() : this(new Header() public Mid0081(Header header) : base(header) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Timestamp(DataFields.Time, 20, false) - } - } - }; - } - - protected enum DataFields - { - Time - } } } diff --git a/src/OpenProtocolInterpreter/Time/Mid0082.cs b/src/OpenProtocolInterpreter/Time/Mid0082.cs index ca7ebdc5..200bcb0c 100644 --- a/src/OpenProtocolInterpreter/Time/Mid0082.cs +++ b/src/OpenProtocolInterpreter/Time/Mid0082.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; namespace OpenProtocolInterpreter.Time { @@ -13,15 +12,12 @@ public class Mid0082 : Mid, ITime, IIntegrator { public const int MID = 82; - public DateTime Time - { - get => GetField(1, DataFields.Time).GetValue(OpenProtocolConvert.ToDateTime); - set => GetField(1, DataFields.Time).SetValue(OpenProtocolConvert.ToString, value); - } + [TimestampDataFieldDefinition(revision: 1, field: 1, Index = 20, HasPrefix = false)] + public DateTime Time { get; set; } public Mid0082() : this(new Header() { - Mid = MID, + Mid = MID, Revision = DEFAULT_REVISION }) { @@ -30,23 +26,5 @@ public Mid0082() : this(new Header() public Mid0082(Header header) : base(header) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Timestamp(DataFields.Time, 20, false) - } - } - }; - } - - protected enum DataFields - { - Time - } } } diff --git a/src/OpenProtocolInterpreter/Time/TimeMessages.cs b/src/OpenProtocolInterpreter/Time/TimeMessages.cs index e08f8968..c5cc8b2b 100644 --- a/src/OpenProtocolInterpreter/Time/TimeMessages.cs +++ b/src/OpenProtocolInterpreter/Time/TimeMessages.cs @@ -11,11 +11,11 @@ internal class TimeMessages : MessagesTemplate { public TimeMessages() : base() { - _templates = new Dictionary() + _templates = new Dictionary>() { - { Mid0080.MID, new MidCompiledInstance(typeof(Mid0080)) }, - { Mid0081.MID, new MidCompiledInstance(typeof(Mid0081)) }, - { Mid0082.MID, new MidCompiledInstance(typeof(Mid0082)) } + { Mid0080.MID, new CompiledInstance(typeof(Mid0080)) }, + { Mid0081.MID, new CompiledInstance(typeof(Mid0081)) }, + { Mid0082.MID, new CompiledInstance(typeof(Mid0082)) } }; } diff --git a/src/OpenProtocolInterpreter/Tool/Mid0040.cs b/src/OpenProtocolInterpreter/Tool/Mid0040.cs index 805e7e08..a7f17900 100644 --- a/src/OpenProtocolInterpreter/Tool/Mid0040.cs +++ b/src/OpenProtocolInterpreter/Tool/Mid0040.cs @@ -5,7 +5,7 @@ namespace OpenProtocolInterpreter.Tool /// /// Tool data upload request /// - /// A request for some of the data stored in the tool. The result of this command + /// A request for some of the data stored in the tool. The result of this command /// is the transmission of the tool data. /// /// Message sent by: Integrator @@ -15,11 +15,8 @@ public class Mid0040 : Mid, ITool, IIntegrator, IAnswerableBy { public const int MID = 40; - public int ToolNumber - { - get => GetField(6, DataFields.ToolNumber).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(6, DataFields.ToolNumber).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 6, field: 1, Index = 20, Size = 4)] + public int ToolNumber { get; set; } public Mid0040() : this(DEFAULT_REVISION) { @@ -32,28 +29,10 @@ public Mid0040(Header header) : base(header) public Mid0040(int revision) : this(new Header() { - Mid = MID, + Mid = MID, Revision = revision }) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 6, new List() - { - DataField.Number(DataFields.ToolNumber, 20, 4) - } - }, - }; - } - - protected enum DataFields - { - ToolNumber - } } } diff --git a/src/OpenProtocolInterpreter/Tool/Mid0041.cs b/src/OpenProtocolInterpreter/Tool/Mid0041.cs index 31da0922..ea2c77ac 100644 --- a/src/OpenProtocolInterpreter/Tool/Mid0041.cs +++ b/src/OpenProtocolInterpreter/Tool/Mid0041.cs @@ -13,117 +13,78 @@ public class Mid0041 : Mid, ITool, IController { public const int MID = 41; - public string ToolSerialNumber - { - get => GetField(1, DataFields.ToolSerialNumber).Value; - set => GetField(1, DataFields.ToolSerialNumber).SetValue(value); - } - public long ToolNumberOfTightenings - { - get => GetField(1, DataFields.ToolNumberOfTightenings).GetValue(OpenProtocolConvert.ToInt64); - set => GetField(1, DataFields.ToolNumberOfTightenings).SetValue(OpenProtocolConvert.ToString, value); - } - public DateTime LastCalibrationDate - { - get => GetField(1, DataFields.LastCalibrationDate).GetValue(OpenProtocolConvert.ToDateTime); - set => GetField(1, DataFields.LastCalibrationDate).SetValue(OpenProtocolConvert.ToString, value); - } - public string ControllerSerialNumber - { - get => GetField(1, DataFields.ControllerSerialNumber).Value; - set => GetField(1, DataFields.ControllerSerialNumber).SetValue(value); - } + [StringDataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 14)] + public string ToolSerialNumber { get; set; } + + [Int64DataFieldDefinition(revision: 1, field: 2, Index = 36, Size = 10)] + public long ToolNumberOfTightenings { get; set; } + + [TimestampDataFieldDefinition(revision: 1, field: 3, Index = 48)] + public DateTime LastCalibrationDate { get; set; } + + [StringDataFieldDefinition(revision: 1, field: 4, Index = 69, Size = 10)] + public string ControllerSerialNumber { get; set; } + //Rev 2 - public decimal CalibrationValue - { - get => GetField(2, DataFields.CalibrationValue).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(2, DataFields.CalibrationValue).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public DateTime LastServiceDate - { - get => GetField(2, DataFields.LastServiceDate).GetValue(OpenProtocolConvert.ToDateTime); - set => GetField(2, DataFields.LastServiceDate).SetValue(OpenProtocolConvert.ToString, value); - } - public long TighteningsSinceService - { - get => GetField(2, DataFields.TighteningsSinceService).GetValue(OpenProtocolConvert.ToInt64); - set => GetField(2, DataFields.TighteningsSinceService).SetValue(OpenProtocolConvert.ToString, value); - } - public ToolType ToolType - { - get => (ToolType)GetField(2, DataFields.ToolType).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.ToolType).SetValue(OpenProtocolConvert.ToString, value); - } - public int MotorSize - { - get => GetField(2, DataFields.MotorSize).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.MotorSize).SetValue(OpenProtocolConvert.ToString, value); - } - public OpenEndData OpenEndData - { - get => GetField(2, DataFields.OpenEndData).GetValue(OpenEndData.Parse); - set => GetField(2, DataFields.OpenEndData).SetValue(PackOpenEndData, value); - } - public string ControllerSoftwareVersion - { - get => GetField(2, DataFields.ControllerSoftwareVersion).Value; - set => GetField(2, DataFields.ControllerSoftwareVersion).SetValue(value); - } + [TruncatedDecimalDataFieldDefinition(revision: 2, field: 5, Index = 81, Size = 6)] + public decimal CalibrationValue { get; set; } + + [TimestampDataFieldDefinition(revision: 2, field: 6, Index = 89)] + public DateTime LastServiceDate { get; set; } + + [Int64DataFieldDefinition(revision: 2, field: 7, Index = 110, Size = 10)] + public long TighteningsSinceService { get; set; } + + [Int32DataFieldDefinition(revision: 2, field: 8, Index = 122, Size = 2)] + public ToolType ToolType { get; set; } + + [Int32DataFieldDefinition(revision: 2, field: 9, Index = 126, Size = 2)] + public int MotorSize { get; set; } + + [OpenEndDataDefinition(revision: 2, field: 10, Index = 130, Size = 3)] + public OpenEndData OpenEndData { get; set; } + + [StringDataFieldDefinition(revision: 2, field: 11, Index = 135, Size = 19)] + public string ControllerSoftwareVersion { get; set; } + //Rev 3 - public decimal ToolMaxTorque - { - get => GetField(3, DataFields.ToolMaxTorque).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(3, DataFields.ToolMaxTorque).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal GearRatio - { - get => GetField(3, DataFields.GearRatio).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(3, DataFields.GearRatio).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal ToolFullSpeed - { - get => GetField(3, DataFields.ToolFullSpeed).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(3, DataFields.ToolFullSpeed).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } + [TruncatedDecimalDataFieldDefinition(revision: 3, field: 12, Index = 156, Size = 6)] + public decimal ToolMaxTorque { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 3, field: 13, Index = 164, Size = 6)] + public decimal GearRatio { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 3, field: 14, Index = 172, Size = 6)] + public decimal ToolFullSpeed { get; set; } + //Rev 4 - public PrimaryTool PrimaryTool - { - get => (PrimaryTool)GetField(4, DataFields.PrimaryTool).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(4, DataFields.PrimaryTool).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 4, field: 15, Index = 180, Size = 2)] + public PrimaryTool PrimaryTool { get; set; } + //Rev 5 - public string ToolModel - { - get => GetField(5, DataFields.ToolModel).Value; - set => GetField(5, DataFields.ToolModel).SetValue(value); - } + [StringDataFieldDefinition(revision: 5, field: 16, Index = 184, Size = 12)] + public string ToolModel { get; set; } + //Rev 6 - public int ToolNumber - { - get => GetField(6, DataFields.ToolNumber).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(6, DataFields.ToolNumber).SetValue(OpenProtocolConvert.ToString, value); - } - public string ToolArticleNumber - { - get => GetField(6, DataFields.ToolArticleNumber).Value; - set => GetField(6, DataFields.ToolArticleNumber).SetValue(value); - } + /// + /// The number of the tool. It is the same number as the tool numbers sent in Tool List Upload. + /// In systems with only 1 tool the number sent will always be 0001 + /// + [Int32DataFieldDefinition(revision: 6, field: 17, Index = 198, Size = 4)] + public int ToolNumber { get; set; } + + [StringDataFieldDefinition(revision: 6, field: 18, Index = 204, Size = 30)] + public string ToolArticleNumber { get; set; } + //Rev 7 - public decimal RundownMinSpeed - { - get => GetField(7, DataFields.RundownMinSpeed).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(7, DataFields.RundownMinSpeed).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal DownshiftMaxSpeed - { - get => GetField(7, DataFields.DownshiftMaxSpeed).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(7, DataFields.DownshiftMaxSpeed).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public decimal DownshiftMinSpeed - { - get => GetField(7, DataFields.DownshiftMinSpeed).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(7, DataFields.DownshiftMinSpeed).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } + [TruncatedDecimalDataFieldDefinition(revision: 7, field: 19, Index = 236, Size = 6)] + public decimal RundownMinSpeed { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 7, field: 20, Index = 244, Size = 6)] + public decimal DownshiftMaxSpeed { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 7, field: 21, Index = 252, Size = 6)] + public decimal DownshiftMinSpeed { get; set; } public Mid0041() : this(DEFAULT_REVISION) { @@ -142,102 +103,5 @@ public Mid0041(int revision) : this(new Header() { } - - protected virtual string PackOpenEndData(char paddingChar, int size, PaddingOrientation orientation, OpenEndData value) - => value.Pack(); - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.String(DataFields.ToolSerialNumber, 20, 14), - DataField.Number(DataFields.ToolNumberOfTightenings, 36, 10), - DataField.Timestamp(DataFields.LastCalibrationDate, 48), - DataField.String(DataFields.ControllerSerialNumber, 69, 10) - } - }, - { - 2, new List() - { - DataField.Number(DataFields.CalibrationValue, 81, 6), - DataField.Timestamp(DataFields.LastServiceDate, 89), - DataField.Number(DataFields.TighteningsSinceService, 110, 10), - DataField.Number(DataFields.ToolType, 122, 2), - DataField.Number(DataFields.MotorSize, 126, 2), - new(DataFields.OpenEndData, 130, 3), - DataField.String(DataFields.ControllerSoftwareVersion, 135, 19) - } - }, - { - 3, new List() - { - DataField.Number(DataFields.ToolMaxTorque, 156, 6), - DataField.Number(DataFields.GearRatio, 164, 6), - DataField.Number(DataFields.ToolFullSpeed, 172, 6) - } - }, - { - 4, new List() - { - DataField.Number(DataFields.PrimaryTool, 180, 2) - } - }, - { - 5, new List() - { - DataField.String(DataFields.ToolModel, 184, 12) - } - }, - { - 6, new List() - { - DataField.Number(DataFields.ToolNumber, 198, 4), - DataField.String(DataFields.ToolArticleNumber, 204, 30) - } - }, - { - 7, new List() - { - DataField.Number(DataFields.RundownMinSpeed, 236, 6), - DataField.Number(DataFields.DownshiftMaxSpeed, 244, 6), - DataField.Number(DataFields.DownshiftMinSpeed, 252, 6), - } - } - }; - } - - protected enum DataFields - { - ToolSerialNumber, - ToolNumberOfTightenings, - LastCalibrationDate, - ControllerSerialNumber, - //Rev 2 - CalibrationValue, - LastServiceDate, - TighteningsSinceService, - ToolType, - MotorSize, - OpenEndData, - ControllerSoftwareVersion, - //Rev 3 - ToolMaxTorque, - GearRatio, - ToolFullSpeed, - //Rev 4 - PrimaryTool, - //Rev 5 - ToolModel, - //Rev 6 - ToolNumber, - ToolArticleNumber, - //Rev 7 - RundownMinSpeed, - DownshiftMaxSpeed, - DownshiftMinSpeed - } } } diff --git a/src/OpenProtocolInterpreter/Tool/Mid0042.cs b/src/OpenProtocolInterpreter/Tool/Mid0042.cs index e331063d..9cdd8547 100644 --- a/src/OpenProtocolInterpreter/Tool/Mid0042.cs +++ b/src/OpenProtocolInterpreter/Tool/Mid0042.cs @@ -1,6 +1,4 @@ -using System.Collections.Generic; - -namespace OpenProtocolInterpreter.Tool +namespace OpenProtocolInterpreter.Tool { /// /// Disable tool @@ -11,16 +9,11 @@ public class Mid0042 : Mid, ITool, IIntegrator, IAcceptableCommand { public const int MID = 42; - public int ToolNumber - { - get => GetField(2, DataFields.ToolNumber).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.ToolNumber).SetValue(OpenProtocolConvert.ToString, value); - } - public DisableType DisableType - { - get => (DisableType)GetField(2, DataFields.DisableType).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.DisableType).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 2, field: 1, Index = 20, Size = 4)] + public int ToolNumber { get; set; } + + [Int32DataFieldDefinition(revision: 2, field: 2, Index = 26, Size = 2)] + public DisableType DisableType { get; set; } public Mid0042() : this(DEFAULT_REVISION) { @@ -37,26 +30,5 @@ public Mid0042(int revision) : this(new Header() }) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 2, new List() - { - DataField.Number(DataFields.ToolNumber, 20, 4), - DataField.Number(DataFields.DisableType, 26, 2) - } - }, - }; - } - - protected enum DataFields - { - ToolNumber, - DisableType - } } - } diff --git a/src/OpenProtocolInterpreter/Tool/Mid0043.cs b/src/OpenProtocolInterpreter/Tool/Mid0043.cs index 7fbd1a95..2b757341 100644 --- a/src/OpenProtocolInterpreter/Tool/Mid0043.cs +++ b/src/OpenProtocolInterpreter/Tool/Mid0043.cs @@ -1,9 +1,13 @@ -using System.Collections.Generic; - -namespace OpenProtocolInterpreter.Tool +namespace OpenProtocolInterpreter.Tool { /// /// Enable tool + /// + /// Enable the tool in revision 0-1. For revision 2, will release the inhibit / disable value set with Disable tool. + /// + /// + /// The number of the tool to release is specified in the telegram. If the tool number is set to 9999 all tools connected to the controller or station will be released. + /// /// Message sent by: Integrator /// Answer: Command accepted /// @@ -11,11 +15,11 @@ public class Mid0043 : Mid, ITool, IIntegrator, IAcceptableCommand { public const int MID = 43; - public int ToolNumber - { - get => GetField(2, DataFields.ToolNumber).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.ToolNumber).SetValue(OpenProtocolConvert.ToString, value); - } + /// + /// The number of the tool to enable. It is the same number as the tool numbers sent in Tool List Upload + /// + [Int32DataFieldDefinition(revision: 2, field: 1, Index = 20, Size = 4)] + public int ToolNumber { get; set; } public Mid0043() : this(DEFAULT_REVISION) { @@ -28,29 +32,10 @@ public Mid0043(Header header) : base(header) public Mid0043(int revision) : this(new Header() { - Mid = MID, + Mid = MID, Revision = revision }) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 2, new List() - { - DataField.Number(DataFields.ToolNumber, 20, 4), - } - }, - }; - } - - protected enum DataFields - { - ToolNumber, - DisableType - } } } diff --git a/src/OpenProtocolInterpreter/Tool/Mid0045.cs b/src/OpenProtocolInterpreter/Tool/Mid0045.cs index 7cca1a85..ebf20614 100644 --- a/src/OpenProtocolInterpreter/Tool/Mid0045.cs +++ b/src/OpenProtocolInterpreter/Tool/Mid0045.cs @@ -9,7 +9,7 @@ namespace OpenProtocolInterpreter.Tool /// /// Message sent by: Integrator /// - /// Answer: Command accepted or + /// Answer: Command accepted or /// Command error, Calibration failed /// /// @@ -19,21 +19,20 @@ public class Mid0045 : Mid, ITool, IIntegrator, IAcceptableCommand, IDeclinableC public IEnumerable DocumentedPossibleErrors => new Error[] { Error.CalibrationFailed }; - public CalibrationUnit CalibrationValueUnit - { - get => (CalibrationUnit)GetField(1, DataFields.CalibrationValueUnit).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.CalibrationValueUnit).SetValue(OpenProtocolConvert.ToString, value); - } - public decimal CalibrationValue - { - get => GetField(1, DataFields.CalibrationValue).GetValue(OpenProtocolConvert.ToTruncatedDecimal); - set => GetField(1, DataFields.CalibrationValue).SetValue(OpenProtocolConvert.TruncatedDecimalToString, value); - } - public int ChannelNumber - { - get => GetField(2, DataFields.ChannelNumber).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(2, DataFields.ChannelNumber).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 1)] + public CalibrationUnit CalibrationValueUnit { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 1, field: 2, Index = 23, Size = 6)] + public decimal CalibrationValue { get; set; } + + [Int32DataFieldDefinition(revision: 2, field: 3, Index = 31, Size = 2)] + public int ChannelNumber { get; set; } + + [TruncatedDecimalDataFieldDefinition(revision: 3, field: 4, Index = 35, Size = 10, DecimalPoints = 4)] + public decimal ExtendedCalibrationValue { get; set; } + + [Int32DataFieldDefinition(revision: 3, field: 5, Index = 47, Size = 1)] + public int TransducerNumber { get; set; } public Mid0045() : this(DEFAULT_REVISION) { @@ -50,32 +49,5 @@ public Mid0045(int revision) : this(new Header() }) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.CalibrationValueUnit, 20, 1), - DataField.Number(DataFields.CalibrationValue, 23, 6) - } - }, - { - 2, new List() - { - DataField.Number(DataFields.ChannelNumber, 31, 2), - } - } - }; - } - - protected enum DataFields - { - CalibrationValueUnit, - CalibrationValue, - ChannelNumber - } } } diff --git a/src/OpenProtocolInterpreter/Tool/Mid0046.cs b/src/OpenProtocolInterpreter/Tool/Mid0046.cs index 2dbf916d..3a6dee58 100644 --- a/src/OpenProtocolInterpreter/Tool/Mid0046.cs +++ b/src/OpenProtocolInterpreter/Tool/Mid0046.cs @@ -9,8 +9,8 @@ namespace OpenProtocolInterpreter.Tool /// Warning 2: the new configuration will not be active until the next controller reboot! /// Message sent by: Integrator /// - /// Answer: Command accepted or - /// Command error, Programming control not granted or + /// Answer: Command accepted or + /// Command error, Programming control not granted or /// Invalid data (value not supported by controller) /// /// @@ -20,11 +20,8 @@ public class Mid0046 : Mid, ITool, IIntegrator, IAcceptableCommand, IDeclinableC public IEnumerable DocumentedPossibleErrors => new Error[] { Error.ProgrammingControlNotGranted, Error.InvalidData }; - public PrimaryTool PrimaryTool - { - get => (PrimaryTool)GetField(1, DataFields.PrimaryTool).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.PrimaryTool).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 2)] + public PrimaryTool PrimaryTool { get; set; } public Mid0046() : this(new Header() { @@ -37,23 +34,5 @@ public Mid0046() : this(new Header() public Mid0046(Header header) : base(header) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.PrimaryTool, 20, 2) - } - } - }; - } - - protected enum DataFields - { - PrimaryTool - } } } diff --git a/src/OpenProtocolInterpreter/Tool/Mid0047.cs b/src/OpenProtocolInterpreter/Tool/Mid0047.cs index d4841ebf..90409b85 100644 --- a/src/OpenProtocolInterpreter/Tool/Mid0047.cs +++ b/src/OpenProtocolInterpreter/Tool/Mid0047.cs @@ -5,9 +5,9 @@ namespace OpenProtocolInterpreter.Tool /// /// Tool Pairing handling /// - /// This message is sent by the integrator in order to Pair tools, to abort ongoing pairing, + /// This message is sent by the integrator in order to Pair tools, to abort ongoing pairing, /// to Abort/Disconnect established connection and request for pairing status of the IRC-B or IRC-W tool types. - /// At pairing handling type, Start Pairing and Pairing Abort or Disconnect the controller must take program control + /// At pairing handling type, Start Pairing and Pairing Abort or Disconnect the controller must take program control /// and release when finished. MID 0048 will be uploaded during the pairing process at each change of the pairing stage. /// /// Message sent by: Integrator @@ -22,11 +22,8 @@ public class Mid0047 : Mid, ITool, IIntegrator, IAcceptableCommand, IDeclinableC public IEnumerable DocumentedPossibleErrors => new Error[] { }; - public PairingHandlingType PairingHandlingType - { - get => (PairingHandlingType)GetField(1, DataFields.PairingHandlingType).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.PairingHandlingType).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 2)] + public PairingHandlingType PairingHandlingType { get; set; } public Mid0047() : this(new Header() { @@ -39,23 +36,5 @@ public Mid0047() : this(new Header() public Mid0047(Header header) : base(header) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.PairingHandlingType, 20, 2) - } - } - }; - } - - protected enum DataFields - { - PairingHandlingType - } } } diff --git a/src/OpenProtocolInterpreter/Tool/Mid0048.cs b/src/OpenProtocolInterpreter/Tool/Mid0048.cs index 6b062c32..18f68501 100644 --- a/src/OpenProtocolInterpreter/Tool/Mid0048.cs +++ b/src/OpenProtocolInterpreter/Tool/Mid0048.cs @@ -13,16 +13,11 @@ public class Mid0048 : Mid, ITool, IController { public const int MID = 48; - public PairingStatus PairingStatus - { - get => (PairingStatus)GetField(1, DataFields.PairingStatus).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.PairingStatus).SetValue(OpenProtocolConvert.ToString, value); - } - public DateTime TimeStamp - { - get => GetField(1, DataFields.Timestamp).GetValue(OpenProtocolConvert.ToDateTime); - set => GetField(1, DataFields.Timestamp).SetValue(OpenProtocolConvert.ToString, value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 2)] + public PairingStatus PairingStatus { get; set; } + + [TimestampDataFieldDefinition(revision: 1, field: 2, Index = 24)] + public DateTime TimeStamp { get; set; } public Mid0048() : this(new Header() { @@ -35,25 +30,5 @@ public Mid0048() : this(new Header() public Mid0048(Header header) : base(header) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.PairingStatus, 20, 2), - DataField.Timestamp(DataFields.Timestamp, 24) - } - } - }; - } - - protected enum DataFields - { - PairingStatus, - Timestamp - } } } diff --git a/src/OpenProtocolInterpreter/Tool/Mid0701.cs b/src/OpenProtocolInterpreter/Tool/Mid0701.cs index e18bcd16..030f2836 100644 --- a/src/OpenProtocolInterpreter/Tool/Mid0701.cs +++ b/src/OpenProtocolInterpreter/Tool/Mid0701.cs @@ -1,5 +1,5 @@ -using System.Collections.Generic; -using System.Linq; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.Tool { @@ -7,7 +7,7 @@ namespace OpenProtocolInterpreter.Tool /// Tool list upload reply /// /// Upload a list of connected tools from controller. - /// + /// /// Message sent by: Controller /// Answer: None /// The list will contain all tools that are connected to the controller or station. @@ -17,12 +17,15 @@ public class Mid0701 : Mid, ITool, IController { public const int MID = 701; - public int TotalTools { get => Tools.Count; } - public List Tools { get; set; } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 3, HasPrefix = false)] + public int TotalTools { get; set; } + + [ToolDataCollectionDefinition(revision: 1, field: 2, Index = 23, Size = 0, HasPrefix = false)] + public List Tools { get; set; } = new List(); public Mid0701() : this(new Header() { - Mid = MID, + Mid = MID, Revision = DEFAULT_REVISION }) { @@ -35,52 +38,18 @@ public Mid0701(Header header) : base(header) public override string Pack() { - GetField(1, DataFields.TotalTools).SetValue(OpenProtocolConvert.ToString, TotalTools); - var eachToolField = GetField(1, DataFields.EachTool); - eachToolField.Value = PackTools(); - eachToolField.Size = eachToolField.Value.Length; + TotalTools = Tools?.Count ?? 0; //Enforce list size even if modified + GetField(revision: 1, field: 2).Size = TotalTools * ToolData.SectionSize; //Enforce size of variable data fields return base.Pack(); } - public override Mid Parse(string package) - { - Header = ProcessHeader(package); - - var eachToolField = GetField(1, DataFields.EachTool); - eachToolField.Size = Header.Length - eachToolField.Index; - ProcessDataFields(package); - Tools = ToolData.ParseAll(eachToolField.Value).ToList(); - return this; - } - - protected virtual string PackTools() + protected override void ProcessDataField(DataField dataField, ReadOnlySpan package) { - string pack = string.Empty; - foreach (var tool in Tools) + if (dataField.Field == 2) //Tools { - pack += tool.Pack(); + dataField.Size = TotalTools * ToolData.SectionSize; } - - return pack; - } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.TotalTools, 20, 3, false), - new(DataFields.EachTool, 23, 3, false) - } - } - }; - } - protected enum DataFields - { - TotalTools, - EachTool + base.ProcessDataField(dataField, package); } } } diff --git a/src/OpenProtocolInterpreter/Tool/Mid0702.cs b/src/OpenProtocolInterpreter/Tool/Mid0702.cs index 2290aae8..2535c76d 100644 --- a/src/OpenProtocolInterpreter/Tool/Mid0702.cs +++ b/src/OpenProtocolInterpreter/Tool/Mid0702.cs @@ -1,19 +1,26 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; namespace OpenProtocolInterpreter.Tool { + /// + /// Tool Data upload reply with generic data + /// Upload a list of connected tools from controller. + /// Message sent by: Controller + /// Answer: None + /// The list will contain all tool parameters that are connected to the controller or station. + /// To request the data with required extra data () is used. + /// public class Mid0702 : Mid, ITool, IController { public const int MID = 702; - public int ToolNumber - { - get => GetField(1, DataFields.ToolNumber).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.ToolNumber).SetValue(OpenProtocolConvert.ToString, value); - } - public int NumberOfToolParameters => ToolDataUpload.Count; - public List ToolDataUpload { get; set; } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 3, HasPrefix = false)] + public int NumberOfToolPIDs { get; set; } + + [VariableDataFieldCollectionDefinition(revision: 1, field: 2, Index = 23, Size = 0, HasPrefix = false)] + public List ToolDataUpload { get; set; } = new List(); public Mid0702() : this(new Header() { @@ -30,41 +37,41 @@ public Mid0702(Header header) : base(header) public override string Pack() { - GetField(1, DataFields.NumberOfToolParameters).SetValue(OpenProtocolConvert.ToString, ToolDataUpload.Count); - GetField(1, DataFields.EachToolDataUpload).Value = OpenProtocolConvert.ToString(ToolDataUpload); + NumberOfToolPIDs = ToolDataUpload?.Count ?? 0; //Enforce list size even if modified + GetField(revision: 1, field: 2).Size = ToolDataUpload?.Sum(x => x.TotalSize) ?? 0; //Enforce size of variable data fields return base.Pack(); } - public override Mid Parse(string package) + protected override void ProcessDataField(DataField dataField, ReadOnlySpan package) { - Header = ProcessHeader(package); - var dataFieldsField = GetField(1, DataFields.EachToolDataUpload); - dataFieldsField.Size = Header.Length - dataFieldsField.Index; - ProcessDataFields(package); - ToolDataUpload = VariableDataField.ParseAll(dataFieldsField.Value).ToList(); - return this; + if (dataField.Field == 2) //VariableDataFields + { + dataField.Size = Header.Length - dataField.Index; + } + base.ProcessDataField(dataField, package); } + } + + /// + /// To request the data Application data message request with required extra data is used + /// A check for allowed PIDs to be included in this message should be done for each controller type. + /// + public class Mid0702ExtraData : ExtraData, IExtraDataRequest + { + public override int Mid => Mid0702.MID; + + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 0, Size = 4)] + public int ToolNumber { get; set; } - protected override Dictionary> RegisterDatafields() + public Mid0702ExtraData() { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.ToolNumber, 20, 4), - DataField.Number(DataFields.NumberOfToolParameters, 26, 2, false), - new(DataFields.EachToolDataUpload, 28, 0, false) - } - } - }; + } - protected enum DataFields + public Mid0702ExtraData(int revision) : base(revision) { - ToolNumber, - NumberOfToolParameters, - EachToolDataUpload + } } + } diff --git a/src/OpenProtocolInterpreter/Tool/Mid0703.cs b/src/OpenProtocolInterpreter/Tool/Mid0703.cs index eaa21f85..509303d3 100644 --- a/src/OpenProtocolInterpreter/Tool/Mid0703.cs +++ b/src/OpenProtocolInterpreter/Tool/Mid0703.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; namespace OpenProtocolInterpreter.Tool @@ -7,10 +8,10 @@ namespace OpenProtocolInterpreter.Tool /// Set calibration value request with generic data /// /// This message is sent by the integrator in order to set the calibration value of the tool. - /// + /// /// Message sent by: Integrator /// - /// Answer: Command accepted or + /// Answer: Command accepted or /// Command error, with code Calibration failed /// /// @@ -20,13 +21,14 @@ public class Mid0703 : Mid, ITool, IIntegrator, IAcceptableCommand, IDeclinableC public IEnumerable DocumentedPossibleErrors => new Error[] { Error.CalibrationFailed }; - public int ToolNumber - { - get => GetField(1, DataFields.ToolNumber).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.ToolNumber).SetValue(OpenProtocolConvert.ToString, value); - } - public int NumberOfCalibrationParameters => CalibrationParameters.Count; - public List CalibrationParameters { get; set; } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 4)] + public int ToolNumber { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 2, Index = 26, Size = 2, HasPrefix = false)] + public int NumberOfCalibrationParameters { get; set; } + + [VariableDataFieldCollectionDefinition(revision: 1, field: 3, Index = 28, Size = 0, HasPrefix = false)] + public List CalibrationParameters { get; set; } = new List(); public Mid0703() : this(new Header() { @@ -43,40 +45,18 @@ public Mid0703(Header header) : base(header) public override string Pack() { - GetField(1, DataFields.NumberOfCalibrationParameters).SetValue(OpenProtocolConvert.ToString, CalibrationParameters.Count); - GetField(1, DataFields.EachCalibrationParameter).Value = OpenProtocolConvert.ToString(CalibrationParameters); + NumberOfCalibrationParameters = CalibrationParameters?.Count ?? 0; //Enforce list size even if modified + GetField(revision: 1, field: 3).Size = CalibrationParameters?.Sum(x => x.TotalSize) ?? 0; //Enforce size of variable data fields return base.Pack(); } - public override Mid Parse(string package) + protected override void ProcessDataField(DataField dataField, ReadOnlySpan package) { - Header = ProcessHeader(package); - var dataFieldsField = GetField(1, DataFields.EachCalibrationParameter); - dataFieldsField.Size = Header.Length - dataFieldsField.Index; - ProcessDataFields(package); - CalibrationParameters = VariableDataField.ParseAll(dataFieldsField.Value).ToList(); - return this; - } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() + if (dataField.Field == 3) //CalibrationParameters { - { - 1, new List() - { - DataField.Number(DataFields.ToolNumber, 20, 4), - DataField.Number(DataFields.NumberOfCalibrationParameters, 26, 2, false), - new(DataFields.EachCalibrationParameter, 28, 0, false) - } - } - }; - } - protected enum DataFields - { - ToolNumber, - NumberOfCalibrationParameters, - EachCalibrationParameter + dataField.Size = Header.Length - dataField.Index; + } + base.ProcessDataField(dataField, package); } } } diff --git a/src/OpenProtocolInterpreter/Tool/Mid0704.cs b/src/OpenProtocolInterpreter/Tool/Mid0704.cs index edfabba6..c4a13cd4 100644 --- a/src/OpenProtocolInterpreter/Tool/Mid0704.cs +++ b/src/OpenProtocolInterpreter/Tool/Mid0704.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; namespace OpenProtocolInterpreter.Tool @@ -7,7 +8,7 @@ namespace OpenProtocolInterpreter.Tool /// Tool Data status reply with generic data /// /// Upload requested parameters from given tool. - /// + /// /// Message sent by: Controller /// /// Answer: None @@ -20,12 +21,11 @@ public class Mid0704 : Mid, ITool, IController { public const int MID = 704; - public int NumberOfDataFields - { - get => GetField(1, DataFields.NumberOfDataFields).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.NumberOfDataFields).SetValue(OpenProtocolConvert.ToString, value); - } - public List VariableDataFields { get; set; } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 3, HasPrefix = false)] + public int NumberOfDataFields { get; set; } + + [VariableDataFieldCollectionDefinition(revision: 1, field: 2, Index = 23, Size = 0, HasPrefix = false)] + public List VariableDataFields { get; set; } = new List(); public Mid0704() : this(new Header() { @@ -38,46 +38,140 @@ public Mid0704() : this(new Header() public Mid0704(Header header) : base(header) { + VariableDataFields ??= []; } public override string Pack() { - var revision = Header.StandardizedRevision; - GetField(revision, DataFields.VariableDataFields).SetValue(OpenProtocolConvert.ToString(VariableDataFields)); + NumberOfDataFields = VariableDataFields?.Count ?? 0; //Enforce list size even if modified + GetField(revision: 1, field: 2).Size = VariableDataFields?.Sum(x => x.TotalSize) ?? 0; //Enforce size of variable data fields + return base.Pack(); + } + + protected override void ProcessDataField(DataField dataField, ReadOnlySpan package) + { + if (dataField.Field == 2) //VariableDataFields + { + dataField.Size = Header.Length - dataField.Index; + } + base.ProcessDataField(dataField, package); + } + } + + /// + /// Use to request for uploads. + /// + public class Mid0704ExtraDataRequest : ExtraData, IExtraDataRequest + { + private const int PID_SIZE = 6; + + public override int Mid => Mid0704.MID; + + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 0, Size = 4, HasPrefix = false)] + public int ToolNumber { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 2, Index = 4, Size = 3, HasPrefix = false)] + public int TotalRequestedPIDs { get; set; } + + [Int32CollectionDefinition(revision: 1, field: 3, Index = 7, Size = 0, HasPrefix = false, EachFieldSize = PID_SIZE)] + public List RequestedPIDs { get; set; } = new List(); + + public Mid0704ExtraDataRequest() + { - var index = 1; - return string.Concat(BuildHeader(), base.Pack(revision, ref index)); } - public override Mid Parse(string package) + public Mid0704ExtraDataRequest(int revision) : base(revision) { - Header = ProcessHeader(package); - var field = GetField(1, DataFields.VariableDataFields); - field.Size = Header.Length - field.Index; - base.Parse(package); - VariableDataFields = VariableDataField.ParseAll(field.Value).ToList(); - return this; } - protected override Dictionary> RegisterDatafields() + public override string Pack() + { + TotalRequestedPIDs = RequestedPIDs?.Count ?? 0; //Enforce list size even if modified + GetField(revision: 1, field: 3).Size = TotalRequestedPIDs * PID_SIZE; //Enforce size of requested pids + return base.Pack(); + } + + protected override void ProcessDataField(DataField dataField, ReadOnlySpan package) { - return new Dictionary>() + if (dataField.Field == 3) //RequestedPIDs { - { - 1, new List() - { - DataField.Number(DataFields.NumberOfDataFields, 20, 3, false), - DataField.Volatile(DataFields.VariableDataFields, 23, false) - } - } - }; + dataField.Size = package.Length - dataField.Index; + } + base.ProcessDataField(dataField, package); } + } - protected enum DataFields + /// + ///Use for subscription of uploads at versioning. + /// + /// As the restriction is given as an UI the value may be casted to the type for the requested + /// parameter. For a string parameter only 000 is allowed. For time parameters the restriction is + /// given in seconds. + /// + /// + /// Example: A request for temperature with a restriction of 5 will initiate a transmission of MID 0704 whenever the temperature has changed 5 degrees or more. + /// + /// + public class Mid0704ExtraDataSubscription : ExtraData, IExtraDataSubscription + { + public override int Mid => Mid0704.MID; + + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 0, Size = 4, HasPrefix = false)] + public int ToolNumber { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 2, Index = 4, Size = 3, HasPrefix = false)] + public int NumberOfPIDs { get; set; } + + [PIDRestrictionCollectionDefinition(revision: 1, field: 3, Index = 7, Size = 0, HasPrefix = false)] + public List PIDRestrictions { get; set; } = new List(); + + public Mid0704ExtraDataSubscription() + { + + } + + public Mid0704ExtraDataSubscription(int revision) : base(revision) + { + + } + + public override string Pack() + { + NumberOfPIDs = PIDRestrictions?.Count ?? 0; //Enforce list size even if modified + GetField(revision: 1, field: 3).Size = NumberOfPIDs * PIDRestriction.PackedSize; //Enforce size of variable data fields + return base.Pack(); + } + + protected override void ProcessDataField(DataField dataField, ReadOnlySpan package) { - NumberOfDataFields, - VariableDataFields + if (dataField.Field == 3) //CalibrationParameters + { + dataField.Size = package.Length - dataField.Index; + } + base.ProcessDataField(dataField, package); + } + } + + /// + /// Use to unsubscribe a . + /// + public class Mid0704ExtraDataUnsubscription : ExtraData, IExtraDataUnsubscription + { + public override int Mid => Mid0704.MID; + + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 0, Size = 4, HasPrefix = false)] + public int ToolNumber { get; set; } + + public Mid0704ExtraDataUnsubscription() + { + + } + + public Mid0704ExtraDataUnsubscription(int revision) : base(revision) + { + } } } diff --git a/src/OpenProtocolInterpreter/Tool/OpenEndData.cs b/src/OpenProtocolInterpreter/Tool/OpenEndData.cs index a585a811..347106a0 100644 --- a/src/OpenProtocolInterpreter/Tool/OpenEndData.cs +++ b/src/OpenProtocolInterpreter/Tool/OpenEndData.cs @@ -1,4 +1,7 @@ -namespace OpenProtocolInterpreter.Tool +using System; +using System.Reflection; + +namespace OpenProtocolInterpreter.Tool { public class OpenEndData { @@ -26,13 +29,43 @@ public string Pack() } public static OpenEndData Parse(string value) + => Parse(value.AsSpan()); + + public static OpenEndData Parse(ReadOnlySpan value) { return new OpenEndData() { - UseOpenEnd = OpenProtocolConvert.ToBoolean(value[0].ToString()), - TighteningDirection = (TighteningDirection)OpenProtocolConvert.ToInt32(value[1].ToString()), - MotorRotation = (MotorRotation)OpenProtocolConvert.ToInt32(value[2].ToString()), + UseOpenEnd = OpenProtocolConvert.ToBoolean(value.Slice(0, 1)), + TighteningDirection = (TighteningDirection)OpenProtocolConvert.ToInt32(value.Slice(1, 1)), + MotorRotation = (MotorRotation)OpenProtocolConvert.ToInt32(value.Slice(2, 1)), }; } } + + public class OpenEndDataDefinitionAttribute : DataFieldDefinitionAttribute + { + public OpenEndDataDefinitionAttribute(int revision) : base(revision) + { + + } + public OpenEndDataDefinitionAttribute(int field, int revision) : base(field, revision) + { + + } + + internal override DataField Build(object owner, PropertyInfo propertyInfo, int index) + { + return new DataField(Field, index, Size, HasPrefix) + { + DefaultConverter = PackOpenEndData, + DefaultParser = ParseOpenEndData + }.Bind(owner, propertyInfo); + } + + private string PackOpenEndData(char paddingChar, int size, PaddingOrientation orientation, OpenEndData openEndData) + => openEndData.Pack(); + + private OpenEndData ParseOpenEndData(string value) + => OpenEndData.Parse(value); + } } diff --git a/src/OpenProtocolInterpreter/Tool/PIDRestriction.cs b/src/OpenProtocolInterpreter/Tool/PIDRestriction.cs new file mode 100644 index 00000000..d5cf19a4 --- /dev/null +++ b/src/OpenProtocolInterpreter/Tool/PIDRestriction.cs @@ -0,0 +1,83 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; + +namespace OpenProtocolInterpreter.Tool +{ + public class PIDRestriction + { + /// + /// Size in bytes of a packed : (6) plus (3). + /// + internal const int PackedSize = 9; + + public int PID { get; set; } + public int Restriction { get; set; } + + public PIDRestriction() + { + + } + + public PIDRestriction(int pid, int restriction) + { + PID = pid; + Restriction = restriction; + } + + public string Pack() + { + return OpenProtocolConvert.ToString('0', 6, PaddingOrientation.LeftPadded, PID) + + OpenProtocolConvert.ToString('0', 3, PaddingOrientation.LeftPadded, Restriction); + } + + public static PIDRestriction Parse(string value) + => Parse(value.AsSpan()); + + public static PIDRestriction Parse(ReadOnlySpan value) + { + return new PIDRestriction() + { + PID = OpenProtocolConvert.ToInt32(value.Slice(0, 6)), + Restriction = OpenProtocolConvert.ToInt32(value.Slice(6, 3)), + }; + } + } + + public class PIDRestrictionCollectionDefinitionAttribute : DataFieldDefinitionAttribute + { + public PIDRestrictionCollectionDefinitionAttribute(int revision) : base(revision) + { + + } + public PIDRestrictionCollectionDefinitionAttribute(int field, int revision) : base(field, revision) + { + + } + + internal override DataField Build(object owner, PropertyInfo propertyInfo, int index) + { + return new DataField>(Field, index, Size, HasPrefix) + { + DefaultConverter = PackPIDRestriction, + DefaultParser = ParsePIDRestriction + }.Bind(owner, propertyInfo); + } + + private string PackPIDRestriction(char paddingChar, int size, PaddingOrientation orientation, List pidRestrictions) + => string.Join("", pidRestrictions.Select(p => p.Pack())); + + private List ParsePIDRestriction(string value) + { + var span = value.AsSpan(); + var pidRestrictions = new List(span.Length / PIDRestriction.PackedSize); + for (int i = 0; i + PIDRestriction.PackedSize <= span.Length; i += PIDRestriction.PackedSize) + { + pidRestrictions.Add(PIDRestriction.Parse(span.Slice(i, PIDRestriction.PackedSize))); + } + + return pidRestrictions; + } + } +} diff --git a/src/OpenProtocolInterpreter/Tool/ToolData.cs b/src/OpenProtocolInterpreter/Tool/ToolData.cs index a20c562d..6359e8f1 100644 --- a/src/OpenProtocolInterpreter/Tool/ToolData.cs +++ b/src/OpenProtocolInterpreter/Tool/ToolData.cs @@ -1,4 +1,7 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; namespace OpenProtocolInterpreter.Tool { @@ -7,6 +10,8 @@ namespace OpenProtocolInterpreter.Tool /// public class ToolData { + internal const int SectionSize = 94; + public int Number { get; set; } public string SerialNumber { get; set; } public string ModelName { get; set; } @@ -21,29 +26,58 @@ public string Pack() } public static ToolData Parse(string value) + => Parse(value.AsSpan()); + + public static ToolData Parse(ReadOnlySpan value) { return new ToolData() { - Number = OpenProtocolConvert.ToInt32(value.Substring(0, 4)), - SerialNumber = value.Substring(4, 30), - ModelName = value.Substring(34, 30), - ModelArticleNumber = value.Substring(64, 30) + Number = OpenProtocolConvert.ToInt32(value.Slice(0, 4)), + SerialNumber = value.Slice(4, 30).ToString(), + ModelName = value.Slice(34, 30).ToString(), + ModelArticleNumber = value.Slice(64, 30).ToString() }; } public static IEnumerable ParseAll(string value) + => ParseAll(value.AsSpan()); + + public static IEnumerable ParseAll(ReadOnlySpan value) + { + if (value.IsEmpty) + return Array.Empty(); + + var result = new List(); + for (int i = 0; i < value.Length; i += SectionSize) + result.Add(Parse(value.Slice(i, SectionSize))); + return result; + } + } + + public class ToolDataCollectionDefinitionAttribute : DataFieldDefinitionAttribute + { + public ToolDataCollectionDefinitionAttribute(int revision) : base(revision) { - if(string.IsNullOrEmpty(value)) - { - yield break; - } - const int sectionSize = 94; - for (int i = 0; i < value.Length; i += sectionSize) + } + public ToolDataCollectionDefinitionAttribute(int field, int revision) : base(field, revision) + { + + } + + internal override DataField Build(object owner, PropertyInfo propertyInfo, int index) + { + return new DataField>(Field, index, Size, HasPrefix) { - var section = value.Substring(i, sectionSize); - yield return Parse(section); - } + DefaultConverter = Pack, + DefaultParser = Parse + }.Bind(owner, propertyInfo); } + + private string Pack(char paddingChar, int size, PaddingOrientation orientation, List toolData) + => string.Join("", toolData.Select(t => t.Pack())); + + private List Parse(string value) + => ToolData.ParseAll(value).ToList(); } } diff --git a/src/OpenProtocolInterpreter/Tool/ToolMessages.cs b/src/OpenProtocolInterpreter/Tool/ToolMessages.cs index f95f2854..6d46cd00 100644 --- a/src/OpenProtocolInterpreter/Tool/ToolMessages.cs +++ b/src/OpenProtocolInterpreter/Tool/ToolMessages.cs @@ -11,21 +11,39 @@ internal class ToolMessages : MessagesTemplate { public ToolMessages() : base() { - _templates = new Dictionary() + _templates = new Dictionary>() { - { Mid0040.MID, new MidCompiledInstance(typeof(Mid0040)) }, - { Mid0041.MID, new MidCompiledInstance(typeof(Mid0041)) }, - { Mid0042.MID, new MidCompiledInstance(typeof(Mid0042)) }, - { Mid0043.MID, new MidCompiledInstance(typeof(Mid0043)) }, - { Mid0044.MID, new MidCompiledInstance(typeof(Mid0044)) }, - { Mid0045.MID, new MidCompiledInstance(typeof(Mid0045)) }, - { Mid0046.MID, new MidCompiledInstance(typeof(Mid0046)) }, - { Mid0047.MID, new MidCompiledInstance(typeof(Mid0047)) }, - { Mid0048.MID, new MidCompiledInstance(typeof(Mid0048)) }, - { Mid0701.MID, new MidCompiledInstance(typeof(Mid0701)) }, - { Mid0702.MID, new MidCompiledInstance(typeof(Mid0702)) }, - { Mid0703.MID, new MidCompiledInstance(typeof(Mid0703)) }, - { Mid0704.MID, new MidCompiledInstance(typeof(Mid0704)) } + { Mid0040.MID, new CompiledInstance(typeof(Mid0040)) }, + { Mid0041.MID, new CompiledInstance(typeof(Mid0041)) }, + { Mid0042.MID, new CompiledInstance(typeof(Mid0042)) }, + { Mid0043.MID, new CompiledInstance(typeof(Mid0043)) }, + { Mid0044.MID, new CompiledInstance(typeof(Mid0044)) }, + { Mid0045.MID, new CompiledInstance(typeof(Mid0045)) }, + { Mid0046.MID, new CompiledInstance(typeof(Mid0046)) }, + { Mid0047.MID, new CompiledInstance(typeof(Mid0047)) }, + { Mid0048.MID, new CompiledInstance(typeof(Mid0048)) }, + { Mid0701.MID, new CompiledInstance(typeof(Mid0701)) }, + { Mid0702.MID, new CompiledInstance(typeof(Mid0702)) }, + { Mid0703.MID, new CompiledInstance(typeof(Mid0703)) }, + { Mid0704.MID, new CompiledInstance(typeof(Mid0704)) } + }; + + _extraDataTemplates = new Dictionary>>() + { + { + Mid0702.MID, new List>() + { + new CompiledInstance(typeof(Mid0702ExtraData)) + } + }, + { + Mid0704.MID, new List>() + { + new CompiledInstance(typeof(Mid0704ExtraDataRequest)), + new CompiledInstance(typeof(Mid0704ExtraDataSubscription)), + new CompiledInstance(typeof(Mid0704ExtraDataUnsubscription)) + } + } }; } diff --git a/src/OpenProtocolInterpreter/UserInterface/Mid0110.cs b/src/OpenProtocolInterpreter/UserInterface/Mid0110.cs index 6d546095..3d958363 100644 --- a/src/OpenProtocolInterpreter/UserInterface/Mid0110.cs +++ b/src/OpenProtocolInterpreter/UserInterface/Mid0110.cs @@ -14,7 +14,7 @@ namespace OpenProtocolInterpreter.UserInterface /// /// Message sent by: Integrator /// - /// Answer: Command accepted or + /// Answer: Command accepted or /// Command error, User text could not be displayed /// /// @@ -24,11 +24,8 @@ public class Mid0110 : Mid, IUserInterface, IIntegrator, IAcceptableCommand, IDe public IEnumerable DocumentedPossibleErrors => new Error[] { }; - public string UserText - { - get => GetField(1, DataFields.UserText).Value; - set => GetField(1, DataFields.UserText).SetValue(value); - } + [StringDataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 4, HasPrefix = false)] + public string UserText { get; set; } public Mid0110() : base(MID, DEFAULT_REVISION) { @@ -38,23 +35,5 @@ public Mid0110() : base(MID, DEFAULT_REVISION) public Mid0110(Header header) : base(header) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.String(DataFields.UserText, 20, 4, false), - } - } - }; - } - - protected enum DataFields - { - UserText - } } } diff --git a/src/OpenProtocolInterpreter/UserInterface/Mid0111.cs b/src/OpenProtocolInterpreter/UserInterface/Mid0111.cs index 4ee17c5c..b1bf62ee 100644 --- a/src/OpenProtocolInterpreter/UserInterface/Mid0111.cs +++ b/src/OpenProtocolInterpreter/UserInterface/Mid0111.cs @@ -5,18 +5,18 @@ namespace OpenProtocolInterpreter.UserInterface /// /// Display user text on graph /// - /// By sending this message the integrator can display a text on the graphic display. - /// The user can furthermore set the time for the text to be displayed and if the text + /// By sending this message the integrator can display a text on the graphic display. + /// The user can furthermore set the time for the text to be displayed and if the text /// should be acknowledged by the operator or not. /// /// - /// The text is divided into four lines with 25 ASCII characters each.If a line is shorter + /// The text is divided into four lines with 25 ASCII characters each.If a line is shorter /// than 25 characters it must be right padded with blanks(SPC 0x20). /// /// The first line is the text header and is in upper character. /// Message sent by: Integrator /// - /// Answer: Command accepted or + /// Answer: Command accepted or /// Command error, User text could not be displayed /// /// @@ -26,36 +26,23 @@ public class Mid0111 : Mid, IUserInterface, IIntegrator, IAcceptableCommand, IDe public IEnumerable DocumentedPossibleErrors => new Error[] { }; - public int TextDuration - { - get => GetField(1, DataFields.TextDuration).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.TextDuration).SetValue(OpenProtocolConvert.ToString, value); - } - public RemovalCondition RemovalCondition - { - get => (RemovalCondition)GetField(1, DataFields.RemovalCondition).GetValue(OpenProtocolConvert.ToInt32); - set => GetField(1, DataFields.RemovalCondition).SetValue(OpenProtocolConvert.ToString, value); - } - public string Line1 - { - get => GetField(1, DataFields.Line1Header).Value; - set => GetField(1, DataFields.Line1Header).SetValue(value); - } - public string Line2 - { - get => GetField(1, DataFields.Line2).Value; - set => GetField(1, DataFields.Line2).SetValue(value); - } - public string Line3 - { - get => GetField(1, DataFields.Line3).Value; - set => GetField(1, DataFields.Line3).SetValue(value); - } - public string Line4 - { - get => GetField(1, DataFields.Line4).Value; - set => GetField(1, DataFields.Line4).SetValue(value); - } + [Int32DataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 4)] + public int TextDuration { get; set; } + + [Int32DataFieldDefinition(revision: 1, field: 2, Index = 26, Size = 1)] + public RemovalCondition RemovalCondition { get; set; } + + [StringDataFieldDefinition(revision: 1, field: 3, Index = 29, Size = 25)] + public string Line1 { get; set; } + + [StringDataFieldDefinition(revision: 1, field: 4, Index = 56, Size = 25)] + public string Line2 { get; set; } + + [StringDataFieldDefinition(revision: 1, field: 5, Index = 83, Size = 25)] + public string Line3 { get; set; } + + [StringDataFieldDefinition(revision: 1, field: 6, Index = 110, Size = 25)] + public string Line4 { get; set; } public Mid0111() : this(new Header() { @@ -68,33 +55,5 @@ public Mid0111() : this(new Header() public Mid0111(Header header) : base(header) { } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Number(DataFields.TextDuration, 20, 4), - DataField.Number(DataFields.RemovalCondition, 26, 1), - DataField.String(DataFields.Line1Header, 29, 25), - DataField.String(DataFields.Line2, 56, 25), - DataField.String(DataFields.Line3, 83, 25), - DataField.String(DataFields.Line4, 110, 25) - } - } - }; - } - - protected enum DataFields - { - TextDuration, - RemovalCondition, - Line1Header, - Line2, - Line3, - Line4 - } } } diff --git a/src/OpenProtocolInterpreter/UserInterface/UserInterfaceMessages.cs b/src/OpenProtocolInterpreter/UserInterface/UserInterfaceMessages.cs index a8d10623..37689707 100644 --- a/src/OpenProtocolInterpreter/UserInterface/UserInterfaceMessages.cs +++ b/src/OpenProtocolInterpreter/UserInterface/UserInterfaceMessages.cs @@ -11,11 +11,11 @@ internal class UserInterfaceMessages : MessagesTemplate { public UserInterfaceMessages() : base() { - _templates = new Dictionary() + _templates = new Dictionary>() { - { Mid0110.MID, new MidCompiledInstance(typeof(Mid0110)) }, - { Mid0111.MID, new MidCompiledInstance(typeof(Mid0111)) }, - { Mid0113.MID, new MidCompiledInstance(typeof(Mid0113)) } + { Mid0110.MID, new CompiledInstance(typeof(Mid0110)) }, + { Mid0111.MID, new CompiledInstance(typeof(Mid0111)) }, + { Mid0113.MID, new CompiledInstance(typeof(Mid0113)) } }; } diff --git a/src/OpenProtocolInterpreter/VariableDataField.cs b/src/OpenProtocolInterpreter/VariableDataField.cs index 8712e3ce..51c24c28 100644 --- a/src/OpenProtocolInterpreter/VariableDataField.cs +++ b/src/OpenProtocolInterpreter/VariableDataField.cs @@ -9,6 +9,8 @@ namespace OpenProtocolInterpreter /// public class VariableDataField { + private const int DefaultSize = 17; + public int ParameterId { get; set; } public int Length { get; set; } public DataTypeDefinition DataType { get; set; } @@ -16,6 +18,8 @@ public class VariableDataField public int StepNumber { get; set; } public string DataValue { get; set; } + internal int TotalSize => DefaultSize + Length; + public object Convert() { switch (DataType) @@ -31,7 +35,7 @@ public object Convert() case DataTypeDefinition.Timestamp: return DateTime.TryParseExact(DataValue, "yyyy-MM-dd:HH:mm:ss", null, DateTimeStyles.None, out DateTime dateTime) ? dateTime : DataValue; - + case DataTypeDefinition.Boolean: return OpenProtocolConvert.ToBoolean(DataValue); @@ -53,45 +57,50 @@ public string Pack() { return OpenProtocolConvert.ToString('0', 5, PaddingOrientation.LeftPadded, ParameterId) + OpenProtocolConvert.ToString('0', 3, PaddingOrientation.LeftPadded, Length) + - OpenProtocolConvert.ToString('0', 2, PaddingOrientation.LeftPadded, (int)DataType) + + OpenProtocolConvert.ToString('0', 2, PaddingOrientation.LeftPadded, (int)DataType) + OpenProtocolConvert.ToString('0', 3, PaddingOrientation.LeftPadded, (int)Unit) + OpenProtocolConvert.ToString('0', 4, PaddingOrientation.LeftPadded, StepNumber) + OpenProtocolConvert.TruncatePadded(' ', Length, PaddingOrientation.RightPadded, DataValue); } public static VariableDataField Parse(string value) + => Parse(value.AsSpan()); + + public static VariableDataField Parse(ReadOnlySpan value) { - var length = OpenProtocolConvert.ToInt32(value.Substring(5, 3)); + var length = OpenProtocolConvert.ToInt32(value.Slice(5, 3)); return Parse(value, length); } - public static IEnumerable ParseAll(string value) + public static List ParseAll(string value) + => ParseAll(value.AsSpan()); + + public static List ParseAll(ReadOnlySpan value) { - if (string.IsNullOrWhiteSpace(value)) - { - yield break; - } + if (value.IsWhiteSpace() || value.IsEmpty) + return new List(); + var result = new List(); int valueLength; const int fixedLength = 17; for (int i = 0; i < value.Length; i += fixedLength + valueLength) { - valueLength = OpenProtocolConvert.ToInt32(value.Substring(i + 5, 3)); - var section = value.Substring(i, fixedLength + valueLength); - yield return Parse(section, valueLength); + valueLength = OpenProtocolConvert.ToInt32(value.Slice(i + 5, 3)); + result.Add(Parse(value.Slice(i, fixedLength + valueLength), valueLength)); } + return result; } - private static VariableDataField Parse(string value, int length) + private static VariableDataField Parse(ReadOnlySpan value, int length) { return new VariableDataField() { - ParameterId = OpenProtocolConvert.ToInt32(value.Substring(0, 5)), + ParameterId = OpenProtocolConvert.ToInt32(value.Slice(0, 5)), Length = length, - DataType = (DataTypeDefinition)OpenProtocolConvert.ToInt32(value.Substring(8, 2)), - Unit = (DataUnitType)OpenProtocolConvert.ToInt32(value.Substring(10, 3)), - StepNumber = OpenProtocolConvert.ToInt32(value.Substring(13, 4)), - DataValue = value.Substring(17, length) + DataType = (DataTypeDefinition)OpenProtocolConvert.ToInt32(value.Slice(8, 2)), + Unit = (DataUnitType)OpenProtocolConvert.ToInt32(value.Slice(10, 3)), + StepNumber = OpenProtocolConvert.ToInt32(value.Slice(13, 4)), + DataValue = value.Slice(17, length).ToString() }; } diff --git a/src/OpenProtocolInterpreter/Vin/Mid0050.cs b/src/OpenProtocolInterpreter/Vin/Mid0050.cs index ddcdd338..02d2ea30 100644 --- a/src/OpenProtocolInterpreter/Vin/Mid0050.cs +++ b/src/OpenProtocolInterpreter/Vin/Mid0050.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace OpenProtocolInterpreter.Vin { @@ -10,7 +11,7 @@ namespace OpenProtocolInterpreter.Vin /// Used by the integrator to send a VIN number to the controller. /// Message sent by: Integrator /// - /// Answer: Command accepted or + /// Answer: Command accepted or /// Command error, VIN input source not granted /// /// @@ -20,11 +21,8 @@ public class Mid0050 : Mid, IVin, IIntegrator, IAcceptableCommand, IDeclinableCo public IEnumerable DocumentedPossibleErrors => new Error[] { Error.VINInputSourceNotGranted }; - public string VinNumber - { - get => GetField(1, DataFields.VinNumber).Value; - set => GetField(1, DataFields.VinNumber).SetValue(value); - } + [StringDataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 25, HasPrefix = false)] + public string VinNumber { get; set; } public Mid0050() : base(MID, DEFAULT_REVISION) { } @@ -34,34 +32,16 @@ public Mid0050(Header header) : base(header) public override string Pack() { - GetField(1, DataFields.VinNumber).Size = VinNumber.Length; + GetField(nameof(VinNumber)).Size = VinNumber.Length; return base.Pack(); } - public override Mid Parse(string package) + public override Mid Parse(ReadOnlySpan package) { Header = ProcessHeader(package); - GetField(1, DataFields.VinNumber).Size = Header.Length - 20; + GetField(nameof(VinNumber)).Size = Header.Length - 20; ProcessDataFields(package); return this; } - - protected override Dictionary> RegisterDatafields() - { - return new Dictionary>() - { - { - 1, new List() - { - DataField.Volatile(DataFields.VinNumber, 20, false), //dynamic - } - } - }; - } - - protected enum DataFields - { - VinNumber - } } } diff --git a/src/OpenProtocolInterpreter/Vin/Mid0052.cs b/src/OpenProtocolInterpreter/Vin/Mid0052.cs index e10244c4..2c0f7b70 100644 --- a/src/OpenProtocolInterpreter/Vin/Mid0052.cs +++ b/src/OpenProtocolInterpreter/Vin/Mid0052.cs @@ -1,4 +1,6 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.Text; namespace OpenProtocolInterpreter.Vin { @@ -23,26 +25,21 @@ public class Mid0052 : Mid, IVin, IController, IAcknowledgeable { public const int MID = 52; - public string VinNumber - { - get => GetField(1, DataFields.VinNumber).Value; - set => GetField(1, DataFields.VinNumber).SetValue(value); - } - public string IdentifierResultPart2 - { - get => GetField(2, DataFields.IdentifierResultPart2).Value; - set => GetField(2, DataFields.IdentifierResultPart2).SetValue(value); - } - public string IdentifierResultPart3 - { - get => GetField(2, DataFields.IdentifierResultPart3).Value; - set => GetField(2, DataFields.IdentifierResultPart3).SetValue(value); - } - public string IdentifierResultPart4 - { - get => GetField(2, DataFields.IdentifierResultPart4).Value; - set => GetField(2, DataFields.IdentifierResultPart4).SetValue(value); - } + /// + /// Note: Only for PowerMACS and rev 000-001, the VIN number can be up to 40 bytes long. Minimum number of bytes is always 25. + /// + [StringDataFieldDefinition(revision: 1, field: 1, Index = 20, Size = 25, HasPrefix = false)] + [StringDataFieldDefinition(revision: 2, field: 1, Index = 20, Size = 25)] + public string VinNumber { get; set; } + + [StringDataFieldDefinition(revision: 2, field: 2, Index = 47, Size = 25)] + public string IdentifierResultPart2 { get; set; } + + [StringDataFieldDefinition(revision: 2, field: 3, Index = 74, Size = 25)] + public string IdentifierResultPart3 { get; set; } + + [StringDataFieldDefinition(revision: 2, field: 4, Index = 101, Size = 25)] + public string IdentifierResultPart4 { get; set; } public Mid0052() : this(DEFAULT_REVISION) { @@ -55,66 +52,40 @@ public Mid0052(Header header) : base(header) public Mid0052(int revision) : base(MID, revision) { } - public override string Pack() + protected override string BuildHeader() { - var vinNumberField = GetField(1, DataFields.VinNumber); - if (Header.Revision > 1) - vinNumberField.HasPrefix = true; + Header.Length = Header.DefaultSize; + foreach (var dataField in DataFieldsByRevision()) + Header.Length += dataField.TotalSize; - //Can be up to 40 bytes long - vinNumberField.Size = (VinNumber.Length > 25) ? VinNumber.Length : 25; - return base.Pack(); + return Header.ToString(); } - public override Mid Parse(string package) + public override string Pack() { - Header = ProcessHeader(package); - if (Header.Revision > 1) - { - var vinNumberField = GetField(1, DataFields.VinNumber); - vinNumberField.HasPrefix = true; - vinNumberField.Size = Header.Length - 103; - if (vinNumberField.Size > 25) - { - int addedSize = vinNumberField.Size - 25; - GetField(2, DataFields.IdentifierResultPart2).Index += addedSize; - GetField(2, DataFields.IdentifierResultPart3).Index += addedSize; - GetField(2, DataFields.IdentifierResultPart4).Index += addedSize; - } - } - else - GetField(1, DataFields.VinNumber).Size = Header.Length - 20; - ProcessDataFields(package); - return this; + if (Header.StandardizedRevision == 1) + GetField(nameof(VinNumber)).Size = (VinNumber.Length > 25) ? VinNumber.Length : 25; + + var header = BuildHeader(); + var builder = new StringBuilder(Header.Length).Append(header).Append(base.Pack(DataFieldsByRevision())); + return builder.ToString(); } - protected override Dictionary> RegisterDatafields() + protected override void ProcessDataFields(ReadOnlySpan package) + => base.ProcessDataFields(DataFieldsByRevision(), package); + + protected override void ProcessDataField(DataField dataField, ReadOnlySpan package) { - return new Dictionary>() - { - { - 1, new List() - { - DataField.String(DataFields.VinNumber, 20, 25, false) - } - }, - { - 2, new List() - { - DataField.String(DataFields.IdentifierResultPart2, 47, 25), - DataField.String(DataFields.IdentifierResultPart3, 74, 25), - DataField.String(DataFields.IdentifierResultPart4, 101, 25) - } - } - }; + if (Header.StandardizedRevision == 1 && dataField.Field == 1) + dataField.Size = Header.Length - Header.DefaultSize; + + base.ProcessDataField(dataField, package); } - protected enum DataFields + private IEnumerable DataFieldsByRevision() { - VinNumber, - IdentifierResultPart2, - IdentifierResultPart3, - IdentifierResultPart4, + foreach (var dataField in RevisionsByFields[Header.StandardizedRevision]) + yield return dataField; } } } diff --git a/src/OpenProtocolInterpreter/Vin/VINMessages.cs b/src/OpenProtocolInterpreter/Vin/VINMessages.cs index e6752700..92088da8 100644 --- a/src/OpenProtocolInterpreter/Vin/VINMessages.cs +++ b/src/OpenProtocolInterpreter/Vin/VINMessages.cs @@ -11,13 +11,13 @@ internal class VinMessages : MessagesTemplate { public VinMessages() : base() { - _templates = new Dictionary() + _templates = new Dictionary>() { - { Mid0050.MID, new MidCompiledInstance(typeof(Mid0050)) }, - { Mid0051.MID, new MidCompiledInstance(typeof(Mid0051)) }, - { Mid0052.MID, new MidCompiledInstance(typeof(Mid0052)) }, - { Mid0053.MID, new MidCompiledInstance(typeof(Mid0053)) }, - { Mid0054.MID, new MidCompiledInstance(typeof(Mid0054)) } + { Mid0050.MID, new CompiledInstance(typeof(Mid0050)) }, + { Mid0051.MID, new CompiledInstance(typeof(Mid0051)) }, + { Mid0052.MID, new CompiledInstance(typeof(Mid0052)) }, + { Mid0053.MID, new CompiledInstance(typeof(Mid0053)) }, + { Mid0054.MID, new CompiledInstance(typeof(Mid0054)) } }; } diff --git a/src/OpenProtocolInterpreter/_internals/DataFieldMetadata.cs b/src/OpenProtocolInterpreter/_internals/DataFieldMetadata.cs new file mode 100644 index 00000000..e259f7ab --- /dev/null +++ b/src/OpenProtocolInterpreter/_internals/DataFieldMetadata.cs @@ -0,0 +1,31 @@ +using System.Reflection; + +namespace OpenProtocolInterpreter +{ + internal struct DataFieldMetadata + { + public int Index { get; set; } + public DataFieldDefinitionAttribute Attribute { get; set; } + public PropertyInfo Property { get; set; } + + public DataFieldMetadata(DataFieldDefinition definition) + { + + } + + public DataFieldMetadata(int index, DataFieldDefinitionAttribute attribute, PropertyInfo property) + { + Index = index; + Attribute = attribute; + Property = property; + } + + /// + /// Creates the data field bound to , which is either a or an . + /// + public DataField CreateAndBind(object owner) + { + return Attribute.CreateAndBind(owner, Property, Index); + } + } +} diff --git a/src/OpenProtocolInterpreter/_internals/Messages/IMessagesTemplate.cs b/src/OpenProtocolInterpreter/_internals/Messages/IMessagesTemplate.cs index baac7579..3f0db7ae 100644 --- a/src/OpenProtocolInterpreter/_internals/Messages/IMessagesTemplate.cs +++ b/src/OpenProtocolInterpreter/_internals/Messages/IMessagesTemplate.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Text; namespace OpenProtocolInterpreter.Messages { @@ -11,6 +12,9 @@ internal interface IMessagesTemplate void AddOrUpdateTemplate(IDictionary types); Mid ProcessPackage(int mid, string package); Mid ProcessPackage(int mid, byte[] package); + Mid ProcessPackage(int mid, byte[] package, Encoding encoding); bool IsAssignableTo(int mid); + CompiledInstance GetInstance(int mid); + CompiledInstance GetExtraDataInstance(int mid, Type kind); } } diff --git a/src/OpenProtocolInterpreter/_internals/Messages/MessagesTemplate.cs b/src/OpenProtocolInterpreter/_internals/Messages/MessagesTemplate.cs index 47b10d52..d0e605a1 100644 --- a/src/OpenProtocolInterpreter/_internals/Messages/MessagesTemplate.cs +++ b/src/OpenProtocolInterpreter/_internals/Messages/MessagesTemplate.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Text; namespace OpenProtocolInterpreter.Messages { @@ -9,14 +10,16 @@ namespace OpenProtocolInterpreter.Messages /// internal abstract class MessagesTemplate : IMessagesTemplate { - protected IDictionary _templates; + protected IDictionary> _templates; + protected IDictionary>> _extraDataTemplates; /// /// Initializes a new instance of class. /// public MessagesTemplate() { - _templates = new Dictionary(); + _templates = new Dictionary>(); + _extraDataTemplates = new Dictionary>>(); } /// @@ -34,7 +37,7 @@ public MessagesTemplate() /// instance. public Mid ProcessPackage(int mid, string package) { - var compiledInstance = GetMidType(mid); + var compiledInstance = GetInstance(mid); return compiledInstance.CompiledConstructor().Parse(package); } @@ -42,14 +45,85 @@ public Mid ProcessPackage(int mid, string package) /// Find out which Mid instance it should instantiate and parse all it's content /// /// Mid number - /// package in bytes + /// package in bytes, encoded with /// instance public Mid ProcessPackage(int mid, byte[] package) { - var compiledInstance = GetMidType(mid); + var compiledInstance = GetInstance(mid); return compiledInstance.CompiledConstructor().Parse(package); } + /// + /// Find out which Mid instance it should instantiate and parse all it's content + /// + /// Mid number + /// package in bytes + /// Encoding used to decode the package + /// instance + public Mid ProcessPackage(int mid, byte[] package, Encoding encoding) + { + var compiledInstance = GetInstance(mid); + return compiledInstance.CompiledConstructor().Parse(package, encoding); + } + + /// + /// Get from the dictionary based on mid number + /// + /// Mid number + /// Compiled instance + public CompiledInstance GetInstance(int mid) + { + if (!_templates.TryGetValue(mid, out CompiledInstance compiledInstance)) + { + throw new NotImplementedException($"MID {mid} was not implemented, please register it!"); + } + + return compiledInstance; + } + + /// + /// Get the of the registered for a mid number. + /// + /// A mid may have one per kind, since request (), + /// subscription () and unsubscription () + /// may not share the same content. + /// + /// + /// Mid number + /// , or + /// Compiled instance + public CompiledInstance GetExtraDataInstance(int mid, Type kind) + { + if (!_extraDataTemplates.TryGetValue(mid, out List> compiledInstances)) + { + throw new NotImplementedException($"MID {mid} has no extra data implemented, please register it!"); + } + + var compiledInstance = compiledInstances.FirstOrDefault(x => kind.IsAssignableFrom(x.Type)); + if (compiledInstance == null) + { + throw new NotImplementedException($"MID {mid} has no extra data implemented for {kind.Name}, please register it!"); + } + + return compiledInstance; + } + + /// + /// Register an implementer for a mid number. + /// The same mid may register one per kind (request, subscription and unsubscription). + /// + /// Mid number + /// Compiled instance of the implementer + protected void AddExtraDataTemplate(int mid, CompiledInstance compiledInstance) + { + if (!_extraDataTemplates.TryGetValue(mid, out List> compiledInstances)) + { + _extraDataTemplates.Add(mid, compiledInstances = new List>()); + } + + compiledInstances.Add(compiledInstance); + } + /// /// Update Mid instance it should instantiate /// @@ -63,7 +137,7 @@ public void AddOrUpdateTemplate(IDictionary types) _templates.Remove(type.Key); } - _templates.Add(type.Key, new MidCompiledInstance(type.Value)); + _templates.Add(type.Key, new CompiledInstance(type.Value)); } } @@ -92,29 +166,14 @@ protected void FilterSelectedMids(IEnumerable mids) } /// - /// Remove unused/ignored from dictionary. + /// Remove unused/ignored from dictionary. /// /// Ignored mid instances - private void FilterSelectedMids(IEnumerable mids) + private void FilterSelectedMids(IEnumerable> mids) { var ignoredMids = _templates.Where(x => !mids.Contains(x.Value)).ToList(); foreach (var ignore in ignoredMids) _templates.Remove(ignore); } - - /// - /// Get from the dictionary based on mid number - /// - /// Mid number - /// Compiled instance - private MidCompiledInstance GetMidType(int mid) - { - if (!_templates.TryGetValue(mid, out MidCompiledInstance instanceCompiler)) - { - throw new NotImplementedException($"MID {mid} was not implemented, please register it!"); - } - - return instanceCompiler; - } } } diff --git a/src/OpenProtocolInterpreter/_internals/Messages/MidCompiledInstance.cs b/src/OpenProtocolInterpreter/_internals/Messages/MidCompiledInstance.cs index 9b8b0c68..8a9ed2bc 100644 --- a/src/OpenProtocolInterpreter/_internals/Messages/MidCompiledInstance.cs +++ b/src/OpenProtocolInterpreter/_internals/Messages/MidCompiledInstance.cs @@ -4,16 +4,16 @@ namespace OpenProtocolInterpreter.Messages { - internal class MidCompiledInstance + internal class CompiledInstance { public Type Type { get; set; } - public Func CompiledConstructor { get; set; } + public Func CompiledConstructor { get; set; } - public MidCompiledInstance(Type type) + public CompiledInstance(Type type) { Type = type; var ctor = type.GetConstructor(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null, Type.EmptyTypes, null); - CompiledConstructor = Expression.Lambda>(Expression.New(ctor)).Compile(); + CompiledConstructor = Expression.Lambda>(Expression.New(ctor)).Compile(); } } } diff --git a/src/OpenProtocolInterpreter/_internals/SafeAccessRevisionsFields.cs b/src/OpenProtocolInterpreter/_internals/SafeAccessRevisionsFields.cs index e5a1fb83..4f8518ca 100644 --- a/src/OpenProtocolInterpreter/_internals/SafeAccessRevisionsFields.cs +++ b/src/OpenProtocolInterpreter/_internals/SafeAccessRevisionsFields.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using System.Runtime.Serialization; namespace OpenProtocolInterpreter { @@ -42,9 +41,5 @@ public SafeAccessRevisionsFields(int capacity) : base(capacity) public SafeAccessRevisionsFields(int capacity, IEqualityComparer comparer) : base(capacity, comparer) { } - - protected SafeAccessRevisionsFields(SerializationInfo info, StreamingContext context) : base(info, context) - { - } } } diff --git a/src/OpenProtocolInterpreter/_internals/StringExtensions.cs b/src/OpenProtocolInterpreter/_internals/StringExtensions.cs index db5dadfe..3a2ee189 100644 --- a/src/OpenProtocolInterpreter/_internals/StringExtensions.cs +++ b/src/OpenProtocolInterpreter/_internals/StringExtensions.cs @@ -1,22 +1,11 @@ -namespace OpenProtocolInterpreter +using System; + +namespace OpenProtocolInterpreter { public static class StringExtensions { public static string TruncatePadded(this string value, char paddingChar, int size, PaddingOrientation orientation) - { - if (value == null) - return string.Empty.PadLeft(size, paddingChar); - - if (size > 0 && value.Length > size) - { - value = value.Substring(0, size); - } - - if (orientation == PaddingOrientation.RightPadded) - return value.PadRight(size, paddingChar); - - return value.PadLeft(size, paddingChar); - } + => OpenProtocolConvert.TruncatePadded(paddingChar, size, orientation, value.AsSpan()); internal static string SafePadRight(this string value, int length) => SafePadRight(value, length, ' '); @@ -32,18 +21,17 @@ internal static string SafePadRight(this string value, int length, char characte } internal static string SafeSubstring(this string value, int startIndex, int length) + => SafeSubstring(value.AsSpan(), startIndex, length); + + internal static string SafeSubstring(this ReadOnlySpan value, int startIndex, int length) { - if(string.IsNullOrEmpty(value)) - { + if (value.IsEmpty) return string.Empty; - } if (value.Length < startIndex + length) - { - return value.Substring(startIndex, value.Length - startIndex); - } + return startIndex < value.Length ? value.Slice(startIndex).ToString() : string.Empty; - return value.Substring(startIndex, length); + return value.Slice(startIndex, length).ToString(); } } }