Пример #1
0
        /// <summary>
        ///  Sends Cctalk message to device and waits for answer.
        /// </summary>
        public CctalkMessage Send(CctalkMessage com, ICctalkChecksum chHandler)
        {
            // TODO: handle BUSY message
            lock (_callSyncRoot)
            {
                Trace.TraceInformation("Sending message from {0} to {1}. Header={2}", com.SourceAddr, com.DestAddr, com.Header);


                var msgBytes = com.GetTransferDataNoChecksumm();
                chHandler.CalcAndApply(msgBytes);

                //_respondChecksumChecker = chHandler;

                _port.DiscardInBuffer();

                _port.Write(msgBytes, 0, msgBytes.Length);

                Trace.TraceInformation("Message sent, waiting for respond");

                _port.ReadTimeout = RespondStartTimeout;
                Int32         respondBufPos = 0;
                CctalkMessage respond;


                var echoRemover = 0;
                while (true)
                {
                    try
                    {
                        var b = (Byte)_port.ReadByte();
                        // after first respond package we wait fo rest respond packages with another timout
                        _port.ReadTimeout = RespondDataTimeout;

                        if (_removeEcho && (echoRemover < msgBytes.Length))
                        {
                            echoRemover++;
                            continue;
                        }
                        _respondBuf[respondBufPos] = b;
                        respondBufPos++;

                        var isRespondComplete = GenericCctalkDevice.IsRespondComplete(_respondBuf, respondBufPos);
                        if (isRespondComplete)
                        {
                            if (!chHandler.Check(_respondBuf, 0, respondBufPos))
                            {
                                var copy = new byte[respondBufPos];
                                Array.Copy(_respondBuf, copy, respondBufPos);
                                throw new InvalidRespondFormatException(copy, "Checksumm check fail");
                            }
                            respond = GenericCctalkDevice.ParseRespond(_respondBuf, 0, respondBufPos);
                            //var temp = new byte[respondBufPos];
                            //Array.Copy(_respondBuf, 0, temp, 0, temp.Length);
                            //DllLog.In(temp.ToStr());
                            Array.Clear(_respondBuf, 0, _respondBuf.Length);
                            break;
                        }
                    }
                    catch (TimeoutException ex)
                    {
                        if (_port.ReadTimeout == RespondStartTimeout)
                        {
                            Log.In("Device not respondng");
                            //throw new TimeoutException("Device not respondng", ex);
                            return(null);
                        }

                        var respondBufContents = new StringBuilder();
                        for (int i = 0; i > respondBufPos; i++)
                        {
                            respondBufContents.Append(_respondBuf[i].ToString("X"))
                            .Append(" ");
                        }
                        Trace.TraceInformation("Pause in reply error. Recive buffer contents {0} bytes: {1}", respondBufPos, respondBufContents);
                        Array.Clear(_respondBuf, 0, _respondBuf.Length);
                        throw new TimeoutException("Pause in reply (should reset all communication vatiables and be ready to recive the next message)", ex);
                    }
                }

                return(respond);


                /*
                 * When receiving bytes within a message packet, the communication software should
                 * wait up to 50ms for another byte if it is expected. If a timeout condition occurs, the
                 * software should reset all communication variables and be ready to receive the next
                 * message. No other action should be taken. (cctalk spec part1, 11.1)
                 */
            }
        }
        /// <summary>
        ///  Sends Cctalk message to device and waits for answer.
        /// </summary>
        public CctalkMessage Send(CctalkMessage com, ICctalkChecksum chHandler)
        {
            // TODO: handle BUSY message
            lock (_callSyncRoot)
            {
                var msgBytes = com.GetTransferDataNoChecksumm();
                chHandler.CalcAndApply(msgBytes);

                //_respondChecksumChecker = chHandler;

                _port.DiscardInBuffer();

                _port.Write(msgBytes, 0, msgBytes.Length);

                _port.ReadTimeout = RespondStartTimeout;
                Int32         respondBufPos = 0;
                CctalkMessage respond;


                var echoRemover = 0;
                while (true)
                {
                    try
                    {
                        var b = (Byte)_port.ReadByte();
                        _port.ReadTimeout = RespondDataTimeout;

                        if (_removeEcho && (echoRemover < msgBytes.Length))
                        {
                            echoRemover++;
                            continue;
                        }
                        _respondBuf[respondBufPos] = b;
                        respondBufPos++;

                        var isRespondComplete = GenericCctalkDevice.IsRespondComplete(_respondBuf, respondBufPos);
                        if (isRespondComplete)
                        {
                            if (!chHandler.Check(_respondBuf, 0, respondBufPos))
                            {
                                var copy = new byte[respondBufPos];
                                Array.Copy(_respondBuf, copy, respondBufPos);
                                throw new InvalidRespondFormatException(copy, "Checksumm check fail");
                            }
                            respond = GenericCctalkDevice.ParseRespond(_respondBuf, 0, respondBufPos);
                            Array.Clear(_respondBuf, 0, _respondBuf.Length);
                            break;
                        }
                    }
                    catch (TimeoutException ex)
                    {
                        if (_port.ReadTimeout == RespondStartTimeout)
                        {
                            throw new TimeoutException("Device not respondng", ex);
                        }

                        throw new TimeoutException("Pause in reply (should reset all communication vatiables and be ready to recive the next message)", ex);
                    }
                }

                return(respond);


                /*
                 * When receiving bytes within a message packet, the communication software should
                 * wait up to 50ms for another byte if it is expected. If a timeout condition occurs, the
                 * software should reset all communication variables and be ready to receive the next
                 * message. No other action should be taken. (cctalk spec part1, 11.1)
                 */
            }
        }