public static byte[] CanPacket(CanMessage msg) { if (msg.Bus < 1 || msg.Bus > MAX_BUS) { throw new Exception("Invalid Bus"); } if (msg.Id > 0xFFF || msg.Id <= 0) { throw new Exception("Invalid can identifier"); } if (msg.Data.Length > 8) { throw new Exception("Invalid packed data"); } var msgId = BitConverter.GetBytes(msg.Id); byte[] cmd = { CMD_SEND_CAN, (byte)msg.Bus, msgId[1], msgId[0], 0, 0, 0, 0, 0, 0, 0, 0, (byte)msg.Data.Length }; Buffer.BlockCopy(msg.Data, 0, cmd, 4, msg.Data.Length); return(cmd); }
private void ReadCanMessage() { var bytesToRead = _canBuf.Length - _canRead; var bytesRead = _port.Read(_canBuf, _canRead, Math.Min(bytesToRead, _port.BytesToRead)); if (bytesRead == bytesToRead) { // Read completed _canRead = 0; _receivingCanMsg = false; if (CanMessageReceived != null) { var msg = new CanMessage { Bus = _canBuf[0], Id = (_canBuf[1] << 8) + _canBuf[2], Status = _canBuf[12], Data = new byte[_canBuf[11]], DateTime = _startTime + _stopwatch.Elapsed }; Buffer.BlockCopy(_canBuf, 3, msg.Data, 0, msg.Data.Length); CanMessageReceived(msg); } } else { // Partial read _canRead += bytesRead; _receivingCanMsg = true; } if (_port.IsOpen && _port.BytesToRead > 0) { OnDataReceived(this, null); } }
private async Task ReadCanMessage(DateTime timestamp) { int bytesToRead, bytesRead; do { bytesToRead = _canBuf.Length - _canRead; bytesRead = await _port.BaseStream.ReadAsync(_canBuf, _canRead, bytesToRead, _cancelRead.Token); if (bytesRead == bytesToRead) { // Read completed _canRead = 0; if (CanMessageReceived == null) { continue; } var msg = new CanMessage { Bus = _canBuf[0], Id = (_canBuf[1] << 8) + _canBuf[2], Status = _canBuf[12], Data = new byte[_canBuf[11]], DateTime = timestamp }; Buffer.BlockCopy(_canBuf, 3, msg.Data, 0, msg.Data.Length); CanMessageReceived(msg); } else { // Partial read _canRead += bytesRead; } }while (bytesRead < bytesToRead); }
public CanMessage[] GetLastMessages(int num) { WaitSemaphore(); _busy = true; CanMessage[] msgs; if (_putIndex == _getIndex) { // No new messages msgs = new CanMessage[0]; } else if (_putIndex > _getIndex || _putIndex >= num) { // New messages in a single block var size = (_putIndex > _getIndex) ? Math.Min(_putIndex - _getIndex, num) : num; msgs = new CanMessage[size]; Array.Copy(_buffer, _putIndex - size, msgs, 0, size); _getIndex = _putIndex; } else { // New messages in two blocks (putIndex < getIndex) // Block1: ??? --> last index, Block2: 0 --> (putIndex - 1) var sizeBlock1 = Math.Min(_buffer.Length - _getIndex, num - _putIndex); msgs = new CanMessage[sizeBlock1 + _putIndex]; Array.Copy(_buffer, _buffer.Length - sizeBlock1, msgs, 0, sizeBlock1); Array.Copy(_buffer, 0, msgs, sizeBlock1, _putIndex); _getIndex = _putIndex; } _busy = false; return msgs; }
public CanMessage[] GetDistinctMessages() { WaitSemaphore(); _busy = true; CanMessage[] msgs = new CanMessage[_bufferDistinct.Count]; _bufferDistinct.Values.CopyTo(msgs, 0); _busy = false; return msgs; }
public void AddMessage(CanMessage msg) { WaitSemaphore(); _busy = true; _buffer[_putIndex++] = msg; if (_putIndex == _buffer.Length) _putIndex = 0; if (_putIndex == _getIndex) { _getIndex++; if (_getIndex == _buffer.Length) _getIndex = 0; } _busy = false; }
public FakeCBT(string portName = null) { _rnd = new Random(); _timer = new MicroTimer(1000); _timer.MicroTimerElapsed += (s, args) => { if (CanMessageReceived == null) return; // Generate random Can Message var msg = new CanMessage { Bus = 1, Id = _rnd.Next(1, 0xFFF), Status = _rnd.Next(0, 3), Data = BitConverter.GetBytes(++_counter), DateTime = _startTime + _stopwatch.Elapsed }; CanMessageReceived(msg); }; }
public FakeCBT(string portName = null) { _stopwatch = new Stopwatch(); _rnd = new Random(); _timer = new MicroTimer(1000); _timer.MicroTimerElapsed += (s, args) => { if (CanMessageReceived == null) return; // Generate random Can Message var msg = new CanMessage { Bus = _rnd.Next(1, 3), Id = _rnd.Next(0x294, 0x2A1), Status = _rnd.Next(0, 3), Data = new byte[] { (byte)_rnd.Next(0x00, 0xFF), (byte)_rnd.Next(0x00, 0xFF), (byte)_rnd.Next(0x00, 0xFF), (byte)_rnd.Next(0x00, 0xFF), (byte)_rnd.Next(0x00, 0xFF), (byte)_rnd.Next(0x00, 0xFF), (byte)_rnd.Next(0x00, 0xFF), (byte)_rnd.Next(0x00, 0xFF) }, DateTime = _startTime + _stopwatch.Elapsed }; CanMessageReceived(msg); }; }
public void AddMessage(CanMessage msg) { WaitSemaphore(); _busy = true; _buffer[_putIndex++] = msg; if (_putIndex == _buffer.Length) _putIndex = 0; if (_putIndex == _getIndex) { _getIndex++; if (_getIndex == _buffer.Length) _getIndex = 0; } if (_bufferDistinct.ContainsKey(msg.Id)) _bufferDistinct[msg.Id] = msg; else { _bufferDistinct.Add(msg.Id, msg); } _busy = false; }
public FakeCBT(string portName = null) { _stopwatch = new Stopwatch(); _rnd = new Random(); _timer = new MicroTimer(1000); _timer.MicroTimerElapsed += (s, args) => { if (CanMessageReceived == null) { return; } // Generate random Can Message var msg = new CanMessage { Bus = _rnd.Next(1, 3), Id = _rnd.Next(0x294, 0x2A1), Status = _rnd.Next(0, 3), Data = new byte[] { (byte)_rnd.Next(0x00, 0xFF), (byte)_rnd.Next(0x00, 0xFF), (byte)_rnd.Next(0x00, 0xFF), (byte)_rnd.Next(0x00, 0xFF), (byte)_rnd.Next(0x00, 0xFF), (byte)_rnd.Next(0x00, 0xFF), (byte)_rnd.Next(0x00, 0xFF), (byte)_rnd.Next(0x00, 0xFF) }, DateTime = _startTime + _stopwatch.Elapsed }; CanMessageReceived(msg); }; }
private void ReadCanMessage() { var bytesToRead = _canBuf.Length - _canRead; var bytesRead = _port.Read(_canBuf, _canRead, Math.Min(bytesToRead, _port.BytesToRead)); if (bytesRead == bytesToRead) { // Read completed _canRead = 0; _receivingCanMsg = false; if (CanMessageReceived != null) { var msg = new CanMessage { Bus = _canBuf[0], Id = (_canBuf[1] << 8) + _canBuf[2], Status = _canBuf[12], Data = new byte[_canBuf[11]], DateTime = _startTime + _stopwatch.Elapsed }; Buffer.BlockCopy(_canBuf, 3, msg.Data, 0, msg.Data.Length); CanMessageReceived(msg); } } else { // Partial read _canRead += bytesRead; _receivingCanMsg = true; } if (_port.IsOpen && _port.BytesToRead > 0) OnDataReceived(this, null); }
void cbt_CanMessageReceived(CanMessage msg) { if (msg.Bus != _bus) return; _sw?.WriteLine("\"" + msg.Time + "\";\"" + $"{msg.Id:X3}" + "\";\"" + msg.HexData + "\";" + msg.Status + ";\"\""); _buffer.AddMessage(msg); }
public static byte[] CanPacket(CanMessage msg) { if (msg.Bus < 1 || msg.Bus > MAX_BUS) throw new Exception("Invalid Bus"); if (msg.Id > 0xFFF || msg.Id <= 0) throw new Exception("Invalid can identifier"); if (msg.Data.Length > 8) throw new Exception("Invalid packed data"); var msgId = BitConverter.GetBytes(msg.Id); byte[] cmd = { CMD_SEND_CAN, (byte)msg.Bus, msgId[1], msgId[0], 0, 0, 0, 0, 0, 0, 0, 0, (byte)msg.Data.Length }; Buffer.BlockCopy(msg.Data, 0, cmd, 4, msg.Data.Length); return cmd; }
public async Task SendCanPacket(CanMessage msg) { await Serial.BlindCommand(CBTCommand.CanPacket(msg)); }
private async Task ReadCanMessage(DateTime timestamp) { int bytesToRead, bytesRead; do { bytesToRead = _canBuf.Length - _canRead; bytesRead = await _port.BaseStream.ReadAsync(_canBuf, _canRead, bytesToRead, _cancelRead.Token); if (bytesRead == bytesToRead) { // Read completed _canRead = 0; if (CanMessageReceived == null) continue; var msg = new CanMessage { Bus = _canBuf[0], Id = (_canBuf[1] << 8) + _canBuf[2], Status = _canBuf[12], Data = new byte[_canBuf[11]], DateTime = timestamp }; Buffer.BlockCopy(_canBuf, 3, msg.Data, 0, msg.Data.Length); CanMessageReceived(msg); } else { // Partial read _canRead += bytesRead; } } while (bytesRead < bytesToRead); }