Advertisement
alesi2000

ASAP2AdjustDataExample

Apr 13th, 2012 (edited)
967
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.73 KB | None | 0 0
  1. using jnsoft.Helpers;
  2. using System;
  3. using System.Globalization;
  4. using System.IO;
  5.  
  6. namespace jnsoft.ASAP2.Values.Examples
  7. {
  8.   /// <summary>
  9.   /// Demo console application.
  10.   ///
  11.   /// - Loading an A2L and it's corresponding datafile (.hex or .s19)
  12.   /// - Do an EPK check on the datafile
  13.   /// - Iterate over any characteristics and print and modify out values
  14.   /// - save the changed data file
  15.   ///
  16.   /// Usage: ASAP2AdjustDataExample A2LFile.a2l DataFile.hex|.s19
  17.   /// Prerequisites: A valid A2L file, and a corresponding data file (hex/s19)
  18.   /// </summary>
  19.   class Program
  20.   {
  21.     static void Main(string[] args)
  22.     {
  23.       if (args.Length == 0)
  24.       { // no args -> present usage
  25.         var appName = Extensions.AppName;
  26.         Console.WriteLine($"{appName}({Extensions.AppVersion})");
  27.         Console.WriteLine("\t Adjust datafile demo");
  28.         Console.WriteLine($"Usage: {appName} A2LFile.a2l datafile.hex|datafile.s19");
  29.         return;
  30.       }
  31.       var prevColor = Console.ForegroundColor;
  32.       try
  33.       {
  34.         using (var a2lParser = new A2LParser())
  35.         {
  36.           // parse specified A2L file
  37.           if (!a2lParser.parse(args[0]))
  38.             // not an a2l file
  39.             return;
  40.  
  41.           // do further checks
  42.           var project = a2lParser.Project;
  43.           var module = project.getNode<A2LMODULE>(true);
  44.           var initialSegments = module.createInitialMemorySegments(false);
  45.  
  46.           // Load the data file
  47.           var dataFile = DataFile.open(args[1], initialSegments);
  48.  
  49.           // Do the EPK check on the file
  50.           var modPar = module.getNode<A2LMOD_PAR>(true);
  51.           if (modPar != null && !string.IsNullOrEmpty(modPar.EPK) && !dataFile.checkEPK(modPar.EPKAddress, modPar.EPK))
  52.             // epk check failed
  53.             throw new ArgumentException("EPK check failed");
  54.  
  55.           // Print and modify characteristic's
  56.           foreach (var recLayoutRef in module.enumChildNodes<A2LRECORD_LAYOUT_REF>())
  57.           {
  58.             // create the characteristic's value
  59.             var value = CreateValue(dataFile, recLayoutRef);
  60.             if (value == null)
  61.             {
  62.               Console.ForegroundColor = ConsoleColor.Red;
  63.               Console.WriteLine($"Segment not found for {recLayoutRef.Name}");
  64.               continue;
  65.             }
  66.  
  67.             switch (recLayoutRef)
  68.             {
  69.               case A2LAXIS_PTS axisPts:
  70.                 // Just for documentation, usually AxisPts are referenced
  71.                 // by CURVE/MAP/CUBOIDs and are implicitly accessed and modified by them
  72.                 Console.ForegroundColor = ConsoleColor.White;
  73.                 Console.WriteLine($"AxisPts {axisPts.Name}=\n{value}");
  74.                 // Access values
  75.                 var vFncValues = (double[])value.Value;
  76.                 break;
  77.  
  78.               case A2LCHARACTERISTIC characteristic:
  79.                 switch (characteristic.CharType)
  80.                 {
  81.                   case CHAR_TYPE.VALUE:
  82.                     Console.ForegroundColor = ConsoleColor.Green;
  83.                     Console.WriteLine(string.Format(CultureInfo.InvariantCulture
  84.                       , $"{{0}};{{1:f{value.DecimalCount}}};{{2}}"
  85.                       , characteristic.Name
  86.                       , (double)value.Value
  87.                       , value.Unit
  88.                       ));
  89.  
  90.                     // Set a random value as Function value
  91.                     value.Value = CreateRandomValue(characteristic);
  92.                     continue;
  93.  
  94.                   case CHAR_TYPE.ASCII:
  95.                     Console.ForegroundColor = ConsoleColor.Gray;
  96.                     Console.WriteLine($"ASCII Value {characteristic.Name}={value.toSingleValue()}");
  97.                     continue;
  98.  
  99.                   case CHAR_TYPE.VAL_BLK:
  100.                     Console.ForegroundColor = ConsoleColor.White;
  101.                     Console.WriteLine($"ValBlk {characteristic.Name}=\n{value}");
  102.  
  103.                     // Set random values into ValBlks's function values
  104.                     vFncValues = (double[])value.Value;
  105.                     for (int x = 0; x < vFncValues.GetLength(0); ++x)
  106.                       vFncValues[x] = CreateRandomValue(characteristic);
  107.                     break;
  108.  
  109.                   case CHAR_TYPE.CURVE:
  110.                     Console.ForegroundColor = ConsoleColor.Yellow;
  111.                     Console.WriteLine($"Curve {characteristic.Name}=\n{value}");
  112.  
  113.                     // Set random values into curve's function values
  114.                     var cFncValues = (double[])value.Value;
  115.                     for (int x = 0; x < cFncValues.GetLength(0); ++x)
  116.                       cFncValues[x] = CreateRandomValue(characteristic);
  117.  
  118.                     // Move the X-Axis values and increment values by 1
  119.                     var axisIdx = 0;
  120.                     for (int i = 0; i < value.AxisValue[axisIdx].Length; ++i)
  121.                       value.AxisValue[axisIdx][i] = value.AxisValue[axisIdx][i] + 1;
  122.                     break;
  123.  
  124.                   case CHAR_TYPE.MAP:
  125.                     Console.ForegroundColor = ConsoleColor.Cyan;
  126.                     Console.WriteLine($"Map {characteristic.Name}=\n{value}");
  127.  
  128.                     // Set random values into map's function values
  129.                     var mFncValues = (double[,])value.Value;
  130.                     for (int y = 0; y < mFncValues.GetLength(1); ++y)
  131.                       for (int x = 0; x < mFncValues.GetLength(0); ++x)
  132.                         mFncValues[x, y] = CreateRandomValue(characteristic);
  133.  
  134.                     // Move the X-Axis values and increment values by 1
  135.                     axisIdx = 0;
  136.                     for (int i = 0; i < value.AxisValue[axisIdx].Length; ++i)
  137.                       value.AxisValue[axisIdx][i] = value.AxisValue[axisIdx][i] + 1;
  138.  
  139.                     // Move the Y-Axis values and decrement values by 1
  140.                     axisIdx++;
  141.                     for (int i = 0; i < value.AxisValue[axisIdx].Length; ++i)
  142.                       value.AxisValue[axisIdx][i] = value.AxisValue[axisIdx][i] - 1;
  143.                     break;
  144.                 }
  145.  
  146.                 // Write the changed characteristic back into the datafile
  147.                 CharacteristicValue.setValue(dataFile, value);
  148.                 break;
  149.             }
  150.           }
  151.  
  152.           Console.WriteLine($"{Path.GetFileName(args[1])}={(dataFile.IsDirty ? "dirty" : "unchanged")}");
  153.           if (dataFile.IsDirty)
  154.           { // save the changed datafile
  155.             var destFile = "test" + Path.GetExtension(args[1]);
  156.             bool saved = dataFile.save(destFile, true);
  157.             Console.WriteLine($"{(saved ? "successfully saved" : "failed to save")} to {destFile}");
  158.           }
  159.         }
  160.       }
  161.       catch (Exception ex) { Console.WriteLine($"Something failed {ex.Message}"); }
  162.       finally { Console.ForegroundColor = prevColor; }
  163.     }
  164.  
  165.     /// <summary>
  166.     /// Creates a characteristic's physical value from the given dataFile.
  167.     /// </summary>
  168.     /// <param name="dataFile">The datafile to read from</param>
  169.     /// <param name="characteristic"></param>
  170.     /// <returns></returns>
  171.     static ICharValue CreateValue(IDataFile dataFile, A2LRECORD_LAYOUT_REF characteristic)
  172.     {
  173.       return CharacteristicValue.createValue(dataFile, characteristic, ValueObjectFormat.Physical);
  174.     }
  175.  
  176.     /// <summary>
  177.     /// Creates random values for a specific characteristic (between lower and upper limit).
  178.     /// </summary>
  179.     /// <param name="characteristic"></param>
  180.     static double CreateRandomValue(A2LCHARACTERISTIC characteristic)
  181.     {
  182.       return new Random().NextDouble()
  183.         * Math.Abs(characteristic.UpperLimit - characteristic.LowerLimit)
  184.         + characteristic.LowerLimit;
  185.     }
  186.   }
  187. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement