Exemple #1
0
        public static CANData waitMessage(CANData msg, int timeout)
        {
            CANData cdGet = null;
            //向驱动管理器注册一个回调函数
            Action <CANData> actFun = new Action <CANData>(
                (CANData cd) => {
                if (cd.Equals(msg))
                {
                    cdGet = cd;
                }
            }
                );

            DriverManager.PushCANDataProcessor(actFun);
            long tickTimeout = DateTime.Now.Ticks + timeout * 10000;

            while (DateTime.Now.Ticks < tickTimeout)
            {
                if (cdGet != null)
                {
                    DriverManager.PopCANDataProcessor();
                    return(cdGet);
                }
                else
                {
                    Application.DoEvents();
                    Thread.Sleep(1);
                }
            }
            DriverManager.PopCANDataProcessor();
            throw new TimeoutException("Waiting on CAN time out!");
        }
Exemple #2
0
        public NativeCAN()
        {
            handle = FRC_CAN_Reader_Native_Create();

            readThread = new Thread(() =>
            {
                var eventHandle = FRC_CAN_Reader_Native_GetEventHandle(handle);
                while (true)
                {
                    int dataLen = 0;
                    if (WPI_WaitForObjectTimeout(eventHandle, 1, &dataLen) != 0)
                    {
                        dataLen           = 0;
                        CANData *messages = FRC_CAN_Reader_Native_ReadMessages(handle, &dataLen);
                        if (messages == null)
                        {
                            continue;
                        }
                        for (int i = 0; i < dataLen; i++)
                        {
                            CANData data    = messages[i];
                            ulong ulongData = Unsafe.ReadUnaligned <ulong>(data.data);
                            CANMessageReceived?.Invoke((uint)data.id, ulongData, data.length, (uint)data.timestamp);
                        }
                    }
                }
            });
            readThread.IsBackground = true;
            readThread.Name         = "CAN Managed Reader";
            readThread.Start();
        }
Exemple #3
0
        public static bool SendData(CANData cd)
        {
            cd.ActionTime = DateTime.Now;
            bool TxResult = Driver.SendData(cd);

            TxForm.appendData(cd);
            return(TxResult);
        }
Exemple #4
0
 public static void transmitData(int ID, int[] Data)
 {
     try {
         sendData(CANData.getNewJS(ID, Data));
     } catch (Exception e) {
         JavascriptIDE.add(e);
         Logger.logError(e);
     }
 }
Exemple #5
0
 public void appendData(CANData cd)
 {
     ctvr.Dispatcher.Invoke(new Action(() => {
         ctvr.appendData(cd);
     }));
     mlt.Dispatcher.Invoke(new Action(() => {
         mlt.addItem(cd.ToString());
     }));
     lbAllCount.Text = string.Format("总数量:{0}条 ", ctvr.Data.Count);
 }
Exemple #6
0
        public static CANData GetData()
        {
            CANData cd = cdriver.GetQueue().Dequeue();

            foreach (Action <CANData> processor in messageProcessorQueue)
            {
                processor(cd);
            }
            return(cd);
        }
Exemple #7
0
 void rxThread()
 {
     while (true)
     {
         if (DriverManager.IsInitialized)
         {
             int dataSize = DriverManager.Driver.GetQueue().Count;
             if (dataSize > 0)
             {
                 try {
                     for (int i = 0; i < dataSize; i++)
                     {
                         CANData cd = DriverManager.GetData();
                         ctvr.Dispatcher.Invoke(new Action(() => {
                             ctvr.appendData(cd);
                         }));
                         mlt.Dispatcher.Invoke(new Action(() => {
                             mlt.addItem(cd.ToString());
                         }));
                         rxTime.Enqueue(cd.ActionTime);
                     }
                 } catch {
                     return;
                 }
             }
         }
         DateTime histLimit = DateTime.Now - new TimeSpan(0, 0, 3);
         while (rxTime.Count > 0)
         {
             if (rxTime.Dequeue() >= histLimit)
             {
                 break;
             }
         }
         if (rxTime.Count > 0)
         {
             long   dt   = rxTime.Last().Ticks - rxTime.First().Ticks;
             double dtms = dt / 10000.0 / 1000.0;
             if (dt == 0)
             {
                 lbSpeed.Text = "传输速度:- fps";
             }
             else
             {
                 lbSpeed.Text = string.Format("传输速度:{0} fps", (long)(rxTime.Count / dtms));
             }
         }
         else
         {
             lbSpeed.Text = "传输速度:0 fps";
         }
         lbAllCount.Text = string.Format("总数量:{0}条 ", ctvr.Data.Count);
         Thread.Sleep(50);//20Hz刷新率
     }
 }
        public void appendData(CANData cd)
        {
            dataQueue.Enqueue(cd);
            if (treeData.ContainsKey(cd.ID))
            {
                //刷新内容
                treeData[cd.ID].Header = cd.ToString();
            }
            else
            {
                //新增节点
                treeData.Add(cd.ID, new TreeViewItem()
                {
                    Foreground = canView.Foreground
                });
                treeData[cd.ID].Header = cd.ToString();
                canView.Items.Add(treeData[cd.ID]);
            }
            string appendText;

            if (lastTick.ContainsKey(cd.ID))
            {
                appendText      = string.Format("  Dt:{0}ms", (cd.ActionTime.Ticks - lastTick[cd.ID]) / 10000.0);
                lastTick[cd.ID] = cd.ActionTime.Ticks;
            }
            else
            {
                appendText = "  Dt:--ms";
                lastTick.Add(cd.ID, cd.ActionTime.Ticks);
            }
            treeData[cd.ID].Header += appendText;
            treeData[cd.ID].Tag     = cd;

            if (CANDecoder.ContainsKey(cd.ID))  //可以解析
            {
                bool isExpand = false;
                foreach (CANSignal cSignal in CANDecoder[cd.ID].Keys)
                {
                    TreeViewItem tn = CANDecoder[cd.ID][cSignal];
                    if (NOT_ADDED.Equals(tn.Header.ToString()))
                    {
                        treeData[cd.ID].Items.Add(tn);
                        isExpand = true;
                    }
                    tn.Header = string.Format("{0}:{1}-->{2}",
                                              cSignal.Name, cSignal.BytesToInt(cd.GetData()), cSignal.DecodeCANMessage(cd.GetData()).ToString());
                    tn.Foreground = canView.Foreground;
                }
                if (isExpand)
                {
                    treeData[cd.ID].ExpandSubtree();
                }
            }
        }
Exemple #9
0
 public static void transmitData(CANData cd)
 {
     try {
         DriverManager.SendData(cd);
     } catch (NullReferenceException nullex) {
         JavascriptIDE.add("可能尚未初始化CAN收发器,去初始化一下!");
         Logger.logError(nullex);
     } catch (Exception e) {
         JavascriptIDE.add(e);
         Logger.logError(e);
     }
 }
Exemple #10
0
        public override bool SendData(CANData cdin)
        {
            CAN_OBJ co = new CAN_OBJ();

            co.data       = cdin.GetData();
            co.ID         = (uint)cdin.ID;
            co.DataLen    = (byte)cdin.getDataLen();
            co.SendType   = 1;
            co.ExternFlag = 0x01;
            co.RemoteFlag = 0x00;
            lock (this) {
                return(ECANDLL.Transmit(deviceType, useDeviceIndex, useCANIndex, ref co, 1) == ECANStatus.STATUS_OK);
            }
        }
Exemple #11
0
        public override bool SendData(CANData data)
        {
            VCI_CAN_OBJ co = new VCI_CAN_OBJ();

            co.Data       = data.GetData();
            co.ID         = (uint)data.ID;
            co.DataLen    = (byte)data.getDataLen();
            co.SendType   = 1;
            co.ExternFlag = 0x01;
            co.RemoteFlag = 0x00;
            lock (this) {
                uint sendResult
                    = iTekAnalyst2API.VCI_Transmit(devideType, useDeviceIndex, useCANIndex, ref co, 1);
                return(sendResult != 0);
            }
        }
Exemple #12
0
 public TransmitThread(CANData cd, int cycleTime)
 {
     sd.data  = cd;
     sd.cycle = cycleTime;
 }
Exemple #13
0
 public static TransmitThread newSendThread(CANData cd, int cycleTime)
 {
     print("Warning: 'newSendThread' is obsoleted.\nUse 'newTransmitThread' instead.");
     return(new TransmitThread(cd, cycleTime));
 }
Exemple #14
0
 public static TransmitThread newTransmitThread(CANData cd, int cycleTime)
 {
     return(new TransmitThread(cd, cycleTime));
 }
Exemple #15
0
 public abstract bool SendData(CANData data);
Exemple #16
0
 protected void Push(CANData cd)
 {
     RXQueue.Enqueue(cd);
     PushedCount++;
 }
Exemple #17
0
 public void appendRX(CANData cd)
 {
     ctvr.appendData(cd);
 }
Exemple #18
0
 public static void sendData(CANData cd)
 {
     print("Warning: 'sendData' is obsoleted.\nUse 'transmitData' instead.");
     transmitData(cd);
 }
Exemple #19
0
 public static CANData getNewCANData(int ID, int[] Data)
 {
     return(CANData.getNewJS(ID, Data));
 }