public bool GetParameter(ushort controllerId, ushort parameterId, byte subindex)
        {
            int repeatCount = 0;
            var dataList    = new List <CanDriver.canmsg_t>();
            var msg         = new CanDriver.canmsg_t();

            msg.flags   = CanDriver.MSG_BOVR;
            msg.cob     = 0;
            msg.id      = (uint)(0x600 + controllerId); //rSdo + id=1
            msg.length  = (short)CanDriver.DATALENGTH;
            msg.data    = new byte[CanDriver.DATALENGTH];
            msg.data[0] = 0x40;                     //read data
            msg.data[1] = (byte)(parameterId);      //id low
            msg.data[2] = (byte)(parameterId >> 8); //id high
            msg.data[3] = subindex;                 //subindex
            dataList.Add(msg);
            while (true)
            {
                _device.SendData(dataList);
                if (!_isUnloaded.WaitOne(TimeSpan.FromMilliseconds(250)))
                {
                    repeatCount++;
                    if (repeatCount == 10)
                    {
                        MessageBox.Show(@"Превышен лимит ожидания вычитки параметра 0x" + Convert.ToString(parameterId, 16) + @"!!!", @"Ошибка");
                        return(false);
                    }
                    continue;
                }
                break;
            }
            return(true);
        }
Exemple #2
0
        public List <CanDriver.canmsg_t> ReceiveMsgBlock(int msgCount)
        {
            int  Ret = 0;
            byte CAN_No, Mode, RTR, DLC;

            byte[] Data = new byte[8];
            UInt32 CANID, TH, TL, DL, DH;
            var    msgBlock  = new List <CanDriver.canmsg_t>();
            UInt32 realCount = 0;

            CAN_No = 1;
            Mode   = RTR = DLC = 0;
            CANID  = TH = TL = 0;
            int ret;

            while (Ret++ < msgCount)
            {
                Mode  = RTR = DLC = 0;
                CANID = TH = TL = 0;
                ret   = VCI_CAN_DotNET.VCI_SDK.VCI_RecvCANMsg_NoStruct(CAN_No, ref Mode, ref RTR, ref DLC, ref CANID, ref TL, ref TH, Data);
                if ((ret == 14 && Ret == 1) || ret == 5)
                {
                    return(msgBlock);
                }
                var msg = new CanDriver.canmsg_t
                {
                    id     = CANID,
                    length = (short)Data.Count(),
                    data   = new byte[Data.Count()]
                };
                for (int i = 0; i < msg.length; i++)
                {
                    msg.data[i] = Data[i];
                }
                msgBlock.Add(msg);
            }
            return(msgBlock);
        }
        public List <CanDriver.canmsg_t> ReceiveMsgBlock(int msgCount)
        {
            string ReceiveStatus;
            int    nRet;
            uint   nReadCount      = (uint)msgCount;
            uint   pulNumberofRead = 0;

            var msgRead = new CanDriver.canmsg_t[msgCount];

            for (int i = 0; i < msgCount; i++)
            {
                msgRead[i].data = new byte[8];
            }

            nRet = acCanRead(msgRead, nReadCount, ref pulNumberofRead); //Receiving frames
            if (nRet == AdvCANIO.TIME_OUT)
            {
                ReceiveStatus  = "Package ";
                ReceiveStatus += "receiving timeout!";
                return(new List <CanDriver.canmsg_t>());
            }
            else if (nRet == AdvCANIO.OPERATION_ERROR)
            {
                ReceiveStatus  = "Package ";
                ReceiveStatus += " error!";
                return(null);
            }
            else
            {
                var ret = msgRead.ToList();
                //var ret = msgRead.ToList().Where(m=>m.id!=0xF).ToList();
                //if(ret.Count!=0)
                ret.RemoveRange((int)pulNumberofRead, (int)(msgRead.Count() - pulNumberofRead));
                return(ret);
            }
        }
        public bool SetParameter(CanParameter canParameter)
        {
            int repeatCount = 0;
            var msg         = new CanDriver.canmsg_t();

            msg.flags   = CanDriver.MSG_BOVR;
            msg.cob     = 0;
            msg.id      = (uint)(0x600 + canParameter.ControllerId); //rSdo + id=1
            msg.length  = (short)CanDriver.DATALENGTH;
            msg.data    = new byte[CanDriver.DATALENGTH];
            msg.data[1] = (byte)(canParameter.ParameterId);      //id low
            msg.data[2] = (byte)(canParameter.ParameterId >> 8); //id high
            msg.data[3] = canParameter.ParameterSubIndex;        //subindex
            if (canParameter.Data.Count() == 4)
            {
                msg.data[0] = 0x22; //write 4 byte e=1 s=0;
                msg.data[4] = canParameter.Data[0];
                msg.data[5] = canParameter.Data[1];
                msg.data[6] = canParameter.Data[2];
                msg.data[7] = canParameter.Data[3];
            }
            else if (canParameter.Data.Count() == 3)
            {
                msg.data[0] = 0x26; //write 3 byte e=1 s=0;
                msg.data[4] = canParameter.Data[0];
                msg.data[5] = canParameter.Data[1];
                msg.data[6] = canParameter.Data[2];
            }
            else if (canParameter.Data.Count() == 2)
            {
                msg.data[0] = 0x2A; //write 2 byte e=1 s=0;
                msg.data[4] = canParameter.Data[0];
                msg.data[5] = canParameter.Data[1];
            }
            else if (canParameter.Data.Count() > 4) //codtDomain
            {
                _codtDomainThread = new Thread(SetSegment)
                {
                    IsBackground = true
                };
                _codtDomainThread.Start(canParameter);
                return(true);
            }
            while ((true))
            {
                if (repeatCount == 10)
                {
                    MessageBox.Show("Превышен лимит ожидания записи параметра 0x" + Convert.ToString(canParameter.ParameterId, 16) + "!!!", "Ошибка");
                    return(false);
                }
                _device.SendData(new List <CanDriver.canmsg_t> {
                    msg
                });
                if (!_isLoaded.WaitOne(TimeSpan.FromMilliseconds(500)))
                {
                    repeatCount++;
                    continue;
                }
                break;
            }
            return(true);
        }
        private void SetSegment(object parameter)
        {
            int repeatCount = 0;
            //start block
            var canParameter = parameter as CanParameter;
            var msg          = new CanDriver.canmsg_t();

            msg.flags   = CanDriver.MSG_BOVR;
            msg.cob     = 0;
            msg.id      = (ushort)(0x600 + canParameter.ControllerId); //rSdo + id=1
            msg.length  = (short)CanDriver.DATALENGTH;
            msg.data    = new byte[CanDriver.DATALENGTH];
            msg.data[0] = 0x20;                                  //write segment e=0 s=0;
            msg.data[1] = (byte)(canParameter.ParameterId);      //id low
            msg.data[2] = (byte)(canParameter.ParameterId >> 8); //id high
            msg.data[3] = canParameter.ParameterSubIndex;        //subindex
            msg.data[4] = (byte)canParameter.Data.Count();
            //Device.SendData(new List<CanDriver.canmsg_t> { msg });// start block
            while (true)
            {
                if (repeatCount == 10)
                {
                    MessageBox.Show("Превышен лимит ожидания записи параметра 0x" + Convert.ToString(canParameter.ParameterId, 16) + "!!!", "Ошибка");
                    return;
                }
                Thread.Sleep(20);
                _device.SendData(new List <CanDriver.canmsg_t> {
                    msg
                });                                                    // start block
                if (!_isLoaded.WaitOne(TimeSpan.FromMilliseconds(2000)))
                {
                    repeatCount++;
                    continue;
                }
                repeatCount = 0;
                Thread.Sleep(200);
                break;
            }

            //if (!_isLoaded.WaitOne(TimeSpan.FromMilliseconds(1000)))
            //{
            //  return;
            //}
            double byteCount   = canParameter.Data.Count();
            var    _sendNumber = (int)Math.Ceiling((double)(byteCount / 7));
            //send data
            int i = 0;

            while (i < _sendNumber)
            {
                var block = new byte[8];
                for (int j = 0; j < 7; j++)
                {
                    if (i * 7 + j >= canParameter.Data.Count()) //set last bute to 0
                    {
                        block[j + 1] = 0;
                    }
                    else
                    {
                        block[j + 1] = canParameter.Data[i * 7 + j];
                    }
                }
                if (i == _sendNumber - 1)//last block + 6 bit unused
                {
                    block[0] = 0x1D;
                }
                else if (i % 2 == 0) //change count bit
                {
                    block[0] = 0;
                }
                else
                {
                    block[0] = 0x10;
                }
                _device.SendData(new List <CanDriver.canmsg_t>
                {
                    new CanDriver.canmsg_t
                    {
                        id     = (ushort)(0x600 + canParameter.ControllerId),
                        length = 8,
                        flags  = CanDriver.MSG_BOVR,
                        data   = block
                    }
                });
                if (i == _sendNumber - 1)                    // if it was last block
                {
                    ParameterReceive(new List <CanParameter> //parameter was seted
                    {
                        new CanParameter
                        {
                            ControllerId      = canParameter.ControllerId,
                            ParameterId       = canParameter.ParameterId,
                            ParameterSubIndex = canParameter.ParameterSubIndex
                        }
                    });
                }
                if (!_isLoaded.WaitOne(TimeSpan.FromMilliseconds(500)))
                {
                    repeatCount++;
                    if (repeatCount == 10)
                    {
                        MessageBox.Show("Превышен лимит ожидания записи сегмента №" + i + "!!!", "Ошибка");
                        return;
                    }
                    continue;
                }
                repeatCount = 0;
                i++;
            }
        }