alesi2000

ASAP2 XCP Sample console application

Apr 13th, 2012 (edited)
1,839
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.73 KB | None | 0 0
  1. using jnsoft.ASAP2.Values;
  2. using jnsoft.ASAP2;
  3. using System.Text;
  4. using jnsoft.Helpers;
  5.  
  6. namespace jnsoft.Comm.XCP.Examples;
  7.  
  8. /// <summary>
  9. /// ASAP2 XCP Sample console application.
  10. ///
  11. /// Demonstrating a simple create connection to an ECU.
  12. /// Usage: ASAP2XCPExample.exe ASAP2Example.a2l
  13. /// </summary>
  14. class Program
  15. {
  16.   const string fTime = "HH:mm:ss,fff";
  17.   static void Main(string[] args)
  18.   {
  19.     var prevColor = Console.ForegroundColor;
  20.     try
  21.     {
  22.       using var a2lParser = new A2LParser();
  23.       a2lParser.parse(args[0]);
  24.  
  25.       var module = a2lParser.Project.getNode<A2LMODULE>(false);
  26.       var modPar = module.getNode<A2LMOD_PAR>(false);
  27.       string a2lEPK = modPar.EPK.Trim(['\0', ' ']);
  28.  
  29.       // Create a XCP communication master to connect to a slave
  30.       // using XCP over TCP to slave address 127.0.0.1:1800
  31.       var xcpMedia = module.getXCPInterfaces().First(x => x.Type == A2LType.XCP_ON_TCP_IP);
  32.       xcpMedia.getSettings(out var protocol, out var Checksum
  33.         , out var PAG, out var DAQ, out var PGM);
  34.  
  35.       using var xcpMaster = new XCPMaster(ConnectBehaviourType.Manual
  36.        , XCPType.TCP, "127.0.0.1", 1800, protocol, DAQ
  37.        , StateChanged, EventReceived, ServiceRequestReceived, ErrorReceived);
  38.  
  39.       // try to connect to ECU
  40.       Console.WriteLine($"{DateTime.Now.ToString(fTime)}: Connecting...EPK should be {a2lEPK}... (press any key to quit)");
  41.       CmdResult result;
  42.       while (CmdResult.OK != (result = xcpMaster.Connect(ConnectMode.Normal, out var respConnect)))
  43.       { // wait until connected
  44.         Thread.Sleep(1000);
  45.         if (Console.KeyAvailable)
  46.           // exit process after keypress
  47.           return;
  48.       }
  49.  
  50.       // connect sucessful -> query GetStatus
  51.       if (CmdResult.OK != (result = xcpMaster.GetStatus(out var respState)))
  52.         // exit process after failed query
  53.         return;
  54.  
  55.       Console.ForegroundColor = ConsoleColor.Yellow;
  56.       Console.WriteLine($"{DateTime.Now.ToString(fTime)}: Session state={respState.SessionState}");
  57.  
  58.       #region query EPK on Address 0, length 30
  59.  
  60.       if (CmdResult.OK == xcpMaster.ShortUpload(32, 0, 0, out var respData))
  61.       { // upload successful
  62.         string deviceEPK = Encoding.Default.GetString(respData).Trim(['\0', ' ', '\xff']);
  63.         Console.WriteLine($"{DateTime.Now.ToString(fTime)}: EPK from device is: '{deviceEPK}'");
  64.       }
  65.  
  66.       #endregion
  67.  
  68.       #region Polling a measurement's value from ECU
  69.  
  70.       var measurement = a2lParser.Project.MeasDict.Values.First();
  71.       var size = measurement.DataType.getSizeInByte();
  72.       var cnt = measurement.getArraySize();
  73.       var memSize = size * cnt;
  74.       if (xcpMaster.readSync(memSize, 0, measurement.Address, out var data))
  75.       {
  76.         for (int i = 0, offset = 0; i < cnt; ++i, offset += size)
  77.         {
  78.           var rawValue = Extensions.getSingleRawValue(data, offset
  79.             , measurement.DataType, measurement.ByteOrder, measurement.Bits);
  80.           var physicalValue = measurement.RefCompuMethod.toPhysical(rawValue);
  81.  
  82.           Console.WriteLine($"Measurement {measurement.Name}({i}) = {physicalValue} [{measurement.Unit}]");
  83.         }
  84.       }
  85.  
  86.       #endregion
  87.  
  88.       #region Reading/modifying/writing a characteristic from ECU's memory
  89.  
  90.       // Create an empty datafile based on the A2L memory segments (serves for any characteristic)
  91.       var dataFile = new DataFileS19(null, module.createInitialMemorySegments(false));
  92.  
  93.       // Get a characteristic from the A2L Definition
  94.       var characteristic = a2lParser.Project.CharDict.Values.First();
  95.  
  96.       // Read the data from the ECU
  97.       xcpMaster.readCharacteristic(ECUPage.RAM, dataFile, characteristic);
  98.  
  99.       // Get the characteristic's value from the datafile
  100.       var charValue = CharacteristicValue.createValue(dataFile, characteristic, ValueObjectFormat.Physical);
  101.  
  102.       // e.g. print the value
  103.       Console.WriteLine($"Characteristic {characteristic.Name} ({((A2LCHARACTERISTIC)characteristic).CharType}) = {charValue.toSingleValue()}");
  104.  
  105.       // Here you may change the charValue.Value (it's type depends on the characteristic's type)
  106.       charValue.Value = 1.0; // for a single value
  107.  
  108.       CharacteristicValue.setValue(dataFile, charValue); // write the value to the datafile
  109.  
  110.       // Write the characteristic value to the ECU's memory
  111.       xcpMaster.writeCharacteristic(dataFile, characteristic);
  112.  
  113.       xcpMaster.Disconnect();
  114.  
  115.       #endregion
  116.     }
  117.     finally
  118.     { // reset starting color
  119.       Console.ForegroundColor = prevColor;
  120.     }
  121.  
  122.  
  123.     // Callback receiving XCP service requests
  124.     static void ServiceRequestReceived(object sender, XCPServiceRequestArgs e)
  125.     {
  126.       Console.ForegroundColor = ConsoleColor.White;
  127.       Console.WriteLine($"{DateTime.Now.ToString(fTime)}: Received service request: {e.ReceivedServiceRequest.ServiceRequestCode}");
  128.     }
  129.  
  130.     // Callback receiving XCP events
  131.     static void EventReceived(object sender, XCPEventArgs e)
  132.     {
  133.       Console.ForegroundColor = ConsoleColor.Yellow;
  134.       Console.WriteLine($"{DateTime.Now.ToString(fTime)}: Received event: {e.ReceivedEvent.EventCode}");
  135.     }
  136.  
  137.     // Callback receiving XCP errors
  138.     static void ErrorReceived(object sender, XCPErrorArgs e)
  139.     {
  140.       Console.ForegroundColor = ConsoleColor.Red;
  141.       Console.WriteLine($"{DateTime.Now.ToString(fTime)}: Received error: {e.ErrorCode}");
  142.     }
  143.  
  144.     // Callback receiving XCP connection state changes
  145.     static void StateChanged(object sender, EventArgs e)
  146.     {
  147.       Console.ForegroundColor = ConsoleColor.Green;
  148.       XCPMaster master = (XCPMaster)sender;
  149.       Console.WriteLine($"{DateTime.Now.ToString(fTime)}: State: {(master.Connected ? "connected" : "disconnected")}");
  150.     }
  151.   }
  152. }
Advertisement
Add Comment
Please, Sign In to add comment