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);
            }
        }
Exemple #3
0
        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;
        }
Exemple #10
0
        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);
 }
 public async Task SendCanPacket(CanMessage msg)
 {
     await Serial.BlindCommand(CBTCommand.CanPacket(msg));
 }