private void FrameReceived(object sender, CanFrame frame) { Debug.WriteLine(frame); //if(_parsers.ContainsKey(frame.Id)) try { _parsers[frame.Id].Update(frame); } catch (KeyNotFoundException ex) { logger.Info("Exciter frame received failed: ", ex); } catch (Exception ex) { logger.Info("Exciter frame received failed: ", ex); } if (Updated == null) { return; } Updated(this, frame); }
static async Task RunCanLoopAsync(CancellationToken cancellationToken) { var factory = new SocketCanFactory(); var incomingBuffer = new byte[16]; var incomingFrame = new CanFrame(); using (var socket = factory.CreateSocket("can0")) { while (true) { await socket.ReceiveAsync(incomingBuffer, SocketFlags.None, CancellationToken.None).ConfigureAwait(false); incomingFrame.Reinitialize(incomingBuffer); try { await socket.SendAsync(new CanFrame { IsExtendedFrame = true, Id = incomingFrame.Id - 1, DataLength = 4 }.FrameBytes, SocketFlags.None).ConfigureAwait(false); } catch (SocketException se) when(se.SocketErrorCode == SocketError.NoBufferSpaceAvailable) { Console.WriteLine("No buffer space available waiting a few ms"); await Task.Delay(TimeSpan.FromMilliseconds(10), cancellationToken).ConfigureAwait(false); } } } }
private void ModulatorStep(CanFrame frame) { _stepFreq0 = frame[0]; _stepFreq1 = frame[1]; _stepFreq2 = frame[2]; _stepFreq3 = frame[3]; }
public void Post(CanFrame frame) { using (CanRaw can = new CanRaw()) { can.WriteFrame(frame); } }
private void ModulatorStatus(CanFrame frame) { _warningFlag = frame[0]; _errorFlag = frame[1]; _vforEq = frame[2]; _vrefEq = frame[3]; }
public void SendTest() { const int dataLength = 4000; UInt16 descriptorA = CanFrame.GetDescriptorFor(r.Next(0, CanFrame.IdMaxValue), 8); UInt16 descriptorB; do { descriptorB = CanFrame.GetDescriptorFor(r.Next(0, CanFrame.IdMaxValue), 8); }while (descriptorB == descriptorA); Byte[] data = new byte[dataLength]; r.NextBytes(data); var flows = ChainedCanFlow.Take(2, descriptorA, descriptorB); var recieveAction = Task <TpReceiveTransaction> .Factory.StartNew(() => IsoTp.Receive(flows[0], descriptorA, descriptorB)); IsoTp.Send(flows[1], descriptorA, descriptorB, data); recieveAction.Wait(1000); CollectionAssert.AreEqual(data, recieveAction.Result.Data, "Данные были повреждены в ходе передачи"); }
/// <summary>Отправляет Can-сообщение в поток</summary> public void Send(CanFrame Frame, bool ClearBeforeSend = false) { foreach (var brother in Brothers) { brother.Enqueue(Frame); } }
public override void Write(CanFrame Frame, Stream DataStream) { string str = string.Format(OutFormat, Frame.Descriptor, string.Join(" ", Frame.Data.Select(b => b.ToString("X2"))), Frame.Time.ToString(System.Globalization.CultureInfo.InvariantCulture)); var sBuff = Encoding.Default.GetBytes(str + Environment.NewLine); DataStream.Write(sBuff, 0, sBuff.Length); }
/// <summary> /// Get string representation of CAN message. /// </summary> /// <returns>CAN message as string representation</returns> public static string ToString(CanFrame frame) { var flags = frame.Id.Flags; var rtr = (flags & CanIdFlags.RTR) != 0; var id = frame.Id.Value & CanId.CanExtendedIdMask; var extended = id > 0x7ff; var prefix = (extended, rtr) switch { (true, true) => "R", (true, false) => "T", (false, true) => "r", (false, false) => "t" }; var idString = id.ToString(extended ? "X8" : "X3"); var result = $"{prefix}{idString}{frame.DataLength:X1}"; if (!rtr) { var sb = new StringBuilder(result, result.Length + frame.DataLength * 2); for (int i = 0; i < frame.DataLength; i++) { sb.Append(frame.Data[frame.DataOffset + i].ToString("X2")); } result = sb.ToString(); } return(result); }
public void Update(CanFrame frame) { switch (frame.Id) { case ID_MODULATOR_SOURCE: ModulatorSource(frame); break; case ID_MODULATOR_FREQUENCY: ModulatorFrequency(frame); break; case ID_MODULATOR_SWEEP: ModulatorSweep(frame); break; case ID_MODULATOR_STATUS: ModulatorStatus(frame); break; case ID_MODULATOR_STEP: ModulatorStep(frame); break; } }
/// <summary> /// Отправляет одно сообщение в канал /// </summary> /// <param name="Frame">CAN-Сообщение</param> /// <param name="Line">Канал связи</param> internal void SendFrame(CanFrame Frame, AppiLine Line) { SendFrames(new List <CanFrame>() { Frame }, Line); }
public void Send(CanFrame frame) { Debug.WriteLine("Sent: {0}", frame); logger.Info(string.Format("Sent: {0}", frame)); _device.Send((ushort)frame.Id, frame.Rtr, frame.Data()); Thread.Sleep(50); }
public CanFrame Translate(CanFrame rawData, bool noUnit) { //Check if format is correct if (string.IsNullOrEmpty(rawData.PayloadCanData) || rawData.PayloadCanData.Length != 14) { Console.WriteLine("Data is not lenght of 14: {0}", rawData.PayloadCanData); return(rawData); } //0 000 - direkt //3 180 - Kessel // 280 - atez //6 300, 301 ... - Control Unit / Bedienmodule(bei mir 301, 302 und 303) // 400 - Raumfernfühler //9 480 - Manager //A 500 - Heizmodul // 580 - Buskoppler //C 600, 601 ... - Mischermodule(bei mir 601, 602, 603) (wpwm controller) //D 680 - PC(ComfortSoft) (6A1, 6A2) // 700 - Fremdgerät // 780 - DCF-Modul //- ModulType auf der Basis des ComfortSoft-Protokolls, 2. Byte (siehe robots, haustechnikdialog): //0 - write //1 - read //2 - response //3 - ack //4 - write ack //5 - write respond //6 - system //7 - system respond //20/21 (hex.) - write/read large telegram var payloadIndex = Convert.ToInt32(rawData.PayloadCanData.Substring(6, 4), 16); var payloadData = rawData.PayloadCanData.Substring(10); //Get IndexData var indexData = ElsterIndex.ElsterTable.FirstOrDefault(x => x.Index == payloadIndex); //Index not available if (indexData == null) { return(rawData); } rawData.MqttTopicExtention = indexData.MqttTopic; if (!noUnit) { rawData.MqttValue = indexData.Converter.ConvertValue(payloadData) + indexData.Unit; } else { rawData.MqttValue = indexData.Converter.ConvertValue(payloadData); } return(rawData); }
private void HandleDlc1Frame(CanFrame frame, Message message) { switch (frame.Data[0]) { case 0xFF: break; } }
protected override void InfoGeneralStatus(CanFrame frame) { _powerLsb = frame[0]; _powerMsb = frame[1]; _vswrLsb = frame[2]; _vswrMsb = frame[3]; _status = frame[4]; }
public override CanFrame GetCanFrame(int WithDescriptor) { Byte[] buff = new Byte[8]; buff[0] = (byte)(((byte)FrameType & 0x0f) << 4 | Data.Length & 0x0f); Buffer.BlockCopy(Data, 0, buff, 1, Data.Length); return(CanFrame.NewWithDescriptor(WithDescriptor, buff)); }
public void Send(CanFrame canmsg) { MessageTransmitted?.Invoke( this, new CanMessageEventArgs { Message = canmsg }); }
private void RfcuTemp(CanFrame frame) { Module1Temp = frame[0]; Module2Temp = frame[1]; Module3Temp = frame[2]; Module4Temp = frame[3]; PreDrive1Temp = frame[4]; CombinerTemp = frame[5]; }
/// <summary> /// Собирает байты для буфера АППИ /// </summary> /// <returns>10 байт: 2 байта дескриптор + 8 байт данных</returns> public static Byte[] ToBufferBytes(this CanFrame Frame) { Byte[] buff = new Byte[10]; BitConverter.GetBytes((UInt16)Frame.Descriptor).Reverse().ToArray().CopyTo(buff, 0); Frame.Data.CopyTo(buff, 2); return(buff); }
public CanFrameInfo(CanFrame frame) { var tailByte = frame.Data[frame.DataOffset + frame.DataLength - 1]; TransferId = (byte)(tailByte & 0x1F); IsStartOfTransfer = ((tailByte >> 7) & 1) == 1; IsEndOfTransfer = ((tailByte >> 6) & 1) == 1; ToggleBit = ((tailByte >> 5) & 1) == 1; }
protected override void InfoWarning(CanFrame frame) { _tempWarning = frame[0]; _ovRefWarning = frame[1]; _vswrWarning = frame[2]; _overCurrentWarning = frame[3]; _fuseWarning = frame[4]; _globalWarning = frame[5]; }
protected void OnRecieved(CanFrame frame) { if (Received == null) { return; } Received(this, frame); }
public async Task I2cScanAsync(CanDevice device) { var frame = new CanFrame(); frame.Address = device.CanId; frame.DLC = (byte)(1); frame.RemoteRequest = true; await SendFrameAsync(frame); }
private void ModulatorFrequency(CanFrame frame) { _freq0 = frame[0]; _freq1 = frame[1]; _freq2 = frame[2]; _freq3 = frame[3]; _modulation = frame[4]; _vfLsb = frame[5]; _vfMsb = frame[6]; }
public override void Write(CanFrame Frame, Stream DataStream) { int length = Frame.Data.Length + 2 + 8; var buff = new Byte[length]; Buffer.BlockCopy(BitConverter.GetBytes(Frame.Time.ToBinary()), 0, buff, 0, 8); Buffer.BlockCopy(BitConverter.GetBytes((UInt16)Frame.Descriptor), 0, buff, 8, 2); Buffer.BlockCopy(Frame.Data, 0, buff, 8 + 2, Frame.Data.Length); DataStream.Write(buff, 0, buff.Length); }
public override CanFrame GetCanFrame(int WithDescriptor) { var buff = new Byte[8]; buff[0] = (byte)(((byte)FrameType & 0x0f) << 4 | (byte)Flag & 0x0f); buff[1] = BlockSize; buff[2] = SeparationCodeFromTime(SeparationTime); return(CanFrame.NewWithDescriptor(WithDescriptor, buff)); }
protected void OnFrameReceived(CanFrame frame) { EventHandler<FrameReceivedEventArgs> handler = FrameReceived; if (handler != null) { FrameReceivedEventArgs e = new FrameReceivedEventArgs(); e.Frame = frame; handler(this, e); } }
/// <summary> /// Восстанавливает CAN-сообщение из буфера АППИ /// </summary> /// <param name="Buff">10 байт буфера</param> public static CanFrame FromBufferBytes(Byte[] Buff) { int id = (int)BitConverter.ToUInt16(Buff.Take(2).Reverse().ToArray(), 0) >> 4; int len = Buff[1] & 0x0f; if (len > 8) { throw new AppiBufferDecodeException("Расшифрована неправильная длина CAN-сообщения ({0} байт)", len); } return(CanFrame.NewWithId(id, Buff, 2, len)); }
private void RfcuAnalog0_7(CanFrame frame) { A0Reserve = frame[0]; A1VforMod2 = frame[1]; A2VrefMod2 = frame[2]; A3RfSamMod2 = frame[3]; A4CurMod2 = frame[4]; A5VrefEq = frame[5]; A6RfSamMod3 = frame[6]; A7VforMod4 = frame[7]; }
private void RfcuAnalog8_15(CanFrame frame) { A8VrefMod1 = frame[0]; A9VforEq = frame[1]; A10Reserve = frame[2]; A11CurMod4 = frame[3]; A12CurPrD = frame[4]; A13VforMod1 = frame[5]; A14VrefMod4 = frame[6]; A15RfSamMod1 = frame[7]; }
private void RfcuAnalog16_23(CanFrame frame) { A16Reserve = frame[0]; A17RfSamPrD = frame[1]; A18Reserve = frame[2]; A19VforMod3 = frame[3]; A20VrefMod3 = frame[4]; A21RfSameMod4 = frame[5]; A22CurMod3 = frame[6]; A23CurMod1 = frame[7]; }
public abstract void Write(CanFrame Frame, Stream DataStream);