public bool SendCCTalkCommand(byte address, byte command, byte[] data, int timeOut, out byte[] response, CCTMessageType msgType, byte[] encryptionCode)
        {
            if (data.Length > 252)
            {
                throw new Exception("to many bytes in ccTalk data");
            }
            bool flag1 = false;

            response = emptyBuffer;


            lock (this)
            {
                int i1 = 4 + data.Length + 1;
                buffer[0] = address;
                buffer[1] = (byte)data.Length;
                buffer[2] = 1;
                buffer[3] = command;
                data.CopyTo(buffer, 4);
                switch (msgType)
                {
                case CCTMessageType.NoneCRC:
                    break;

                case CCTMessageType.EncryptedNoneCRC:
                    CCTCrypt.Encrypt(buffer, 2, i1 - 2, encryptionCode);
                    break;

                case CCTMessageType.StandardCRC8:
                    crc8.Reset();
                    crc8.PushData(buffer, 0, i1 - 1);
                    buffer[4 + data.Length] = crc8.CRC;
                    break;

                case CCTMessageType.EncryptedCRC8:
                    crc8.Reset();
                    crc8.PushData(buffer, 0, i1 - 1);
                    buffer[4 + data.Length] = crc8.CRC;
                    CCTCrypt.Encrypt(buffer, 2, i1 - 2, encryptionCode);
                    break;

                case CCTMessageType.StandardCRC16:
                    crc16.Reset();
                    crc16.PushByte(buffer[0]);
                    crc16.PushByte(buffer[1]);
                    crc16.PushData(buffer, 3, i1 - 4);
                    buffer[2] = (byte)(crc16.CRC & 255);
                    buffer[4 + data.Length] = (byte)(crc16.CRC >> 8);
                    break;

                case CCTMessageType.EncryptedCRC16:
                    crc16.Reset();
                    crc16.PushByte(buffer[0]);
                    crc16.PushByte(buffer[1]);
                    crc16.PushData(buffer, 3, i1 - 4);
                    buffer[2] = (byte)(crc16.CRC & 255);
                    buffer[4 + data.Length] = (byte)(crc16.CRC >> 8);
                    CCTCrypt.Encrypt(buffer, 2, i1 - 2, encryptionCode);
                    break;
                }
                Thread.Sleep(20);

                if (SerPort == null)
                {
                    return(false);
                }
                SerPort.DiscardInBuffer();
                SerPort.Write(buffer, 0, i1);

                if ((command == 253) || (command == 252))
                {
                    Thread.Sleep(1500);
                }
                else
                {
                    Thread.Sleep(100);
                }

                bool flag2 = false, flag3 = false;
                int  i2 = 0, i3 = 0;
                CCTPerformanceTimer performanceTimer = new CCTPerformanceTimer();
                performanceTimer.Start();
                while (!flag2)
                {
                    try
                    {
                        Thread.Sleep(20);
                        while (SerPort.BytesToRead > 0)
                        {
                            if (flag3)
                            {
                                TimeSpan timeSpan1 = performanceTimer.TimeSpan;
                                timeOut = (int)timeSpan1.TotalMilliseconds + 50;
                            }
                            buffer[i2++] = (byte)SerPort.ReadByte();
                            i3           = i2 >= 3 ? 5 + buffer[1] : -1;
                            if (i2 == i3)
                            {
                                if (buffer[0] == address)
                                {
                                    i2    = 0;
                                    flag3 = true;
                                }
                                if (buffer[0] == 1)
                                {
                                    flag2 = true;
                                    switch (msgType)
                                    {
                                    case CCTMessageType.NoneCRC:
                                        break;

                                    case CCTMessageType.EncryptedNoneCRC:
                                        CCTCrypt.Decrypt(buffer, 2, i2 - 2, encryptionCode);
                                        break;

                                    case CCTMessageType.StandardCRC8:
                                        crc8.Reset();
                                        crc8.PushData(buffer, 0, i2 - 1);
                                        flag1 = buffer[i2 - 1] == crc8.CRC;
                                        break;

                                    case CCTMessageType.EncryptedCRC8:
                                        CCTCrypt.Decrypt(buffer, 2, i2 - 2, encryptionCode);
                                        crc8.Reset();
                                        crc8.PushData(buffer, 0, i2 - 1);
                                        flag1 = buffer[i2 - 1] == crc8.CRC;
                                        break;

                                    case CCTMessageType.StandardCRC16:
                                        crc16.Reset();
                                        crc16.PushByte(buffer[0]);
                                        crc16.PushByte(buffer[1]);
                                        crc16.PushData(buffer, 3, i2 - 4);
                                        flag1 = (buffer[2] + (buffer[i2 - 1] << 8)) == crc16.CRC;
                                        break;

                                    case CCTMessageType.EncryptedCRC16:
                                        CCTCrypt.Decrypt(buffer, 2, i2 - 2, encryptionCode);
                                        crc16.Reset();
                                        crc16.PushByte(buffer[0]);
                                        crc16.PushByte(buffer[1]);
                                        crc16.PushData(buffer, 3, i2 - 4);
                                        flag1 = (buffer[2] + (buffer[i2 - 1] << 8)) == crc16.CRC;
                                        break;
                                    }
                                    if (flag1)
                                    {
                                        response = new byte[buffer[1]];
                                        Array.Copy(buffer, 4, response, 0, response.Length);
                                    }
                                }
                            }
                        }
                        TimeSpan timeSpan2 = performanceTimer.TimeSpan;
                        if (timeSpan2.TotalMilliseconds > (double)timeOut)
                        {
                            flag2 = true;
                        }
                    }
                    catch (Exception ex)
                    {
                        Log.Error("", ex);
                    }
                }
            }
            response = new byte[buffer[1]];
            Array.Copy(buffer, 4, response, 0, response.Length);
            return(flag1);
        }
        public bool SendCCTalkCommand(byte srcAddress, byte destAddress, byte commandHeader, bool noParamBytes, byte[] paramBuffer, out bool noRxDataBytes, out byte[] rxDataBuffer, out string commsStatus, bool encrypted, bool useCRCChecksum, byte[] secArray)
        {
            bool flag1 = false, flag2 = false;
            int  i1 = 0, i2 = 0;

            byte[] bArr1 = new byte[256];
            noRxDataBytes = true;
            rxDataBuffer  = null;
            commsStatus   = "";
            byte[] bArr2 = null;
            byte[] bArr3 = new byte[256];
            byte[] bArr4 = null;
            try
            {
                if (_PortIsDisapiered)
                {
                    if (CheckIfPortExists())
                    {
                        _PortIsDisapiered = false;
                    }
                    else
                    {
                        return(false);
                    }
                }
                // _logger.Debug("commandHeader:" + commandHeader.ToString());
                lock (readWriteLock)
                {
                    if (noParamBytes)
                    {
                        bArr2 = new byte[5];
                    }
                    else
                    {
                        bArr2 = new byte[(5 + paramBuffer.Length)];
                    }
                    bArr2[0] = destAddress;
                    if (noParamBytes)
                    {
                        bArr2[1] = 0;
                    }
                    else
                    {
                        bArr2[1] = (byte)paramBuffer.Length;
                    }
                    bArr2[2] = srcAddress;
                    bArr2[3] = commandHeader;
                    if (!noParamBytes)
                    {
                        for (int i3 = 0; i3 < paramBuffer.Length; i3++)
                        {
                            bArr2[i3 + 4] = paramBuffer[i3];
                        }
                        bArr2[3 + paramBuffer.Length + 1] = 0;
                    }
                    else
                    {
                        bArr2[4] = 0;
                    }
                    if (encrypted)
                    {
                        // byte[] bArr5 = new byte[(bArr2.Length - 2)];

                        //new added
                        int leng1           = 5;
                        int parambufferleng = 0;
                        if (paramBuffer != null)
                        {
                            parambufferleng = paramBuffer.Length;
                        }
                        leng1 = 5 + parambufferleng;
                        CCTCrc16 crc16 = new CCTCrc16();
                        crc16.Reset();
                        crc16.PushByte(bArr2[0]);
                        crc16.PushByte(bArr2[1]);
                        crc16.PushData(bArr2, 3, leng1 - 4);
                        bArr2[2] = (byte)(crc16.CRC & 255);

                        if (noParamBytes)
                        {
                            bArr2[4] = (byte)(crc16.CRC >> 8);
                        }
                        else if (4 + parambufferleng + 1 <= bArr2.Length)
                        {
                            bArr2[4 + parambufferleng] = (byte)(crc16.CRC >> 8);
                        }
                        else
                        {
                            Log.Error("CRC16-Encryption-Error. Buffer:" + bArr2.ToString());
                            flag1 = false; flag2 = false;
                            return(false);
                        }

                        // CalculateCRCChecksum(ref bArr2);
                        // CalculateSimpleChecksumForSend(ref bArr2);
                        //for (int i4 = 0; i4 < bArr5.Length; i4++)
                        //{
                        //    bArr5[i4] = bArr2[i4 + 2];
                        //}

                        //int leng = 5;
                        //if (paramBuffer != null)
                        //{
                        //    leng = 5 + paramBuffer.Length;
                        //}
                        CCTCrypt.Encrypt(bArr2, 2, bArr2.Length - 2, secArray);
                        // CCTCrypt.Encrypt(bArr2, 2, leng - 2, secArray);
                        //EncryptCcTalk(ref bArr5);
                        //for (int i5 = 0; i5 < bArr5.Length; i5++)
                        //{
                        //    bArr2[i5 + 2] = bArr5[i5];
                        //}
                        // bArr5 = null;
                    }
                    else if (useCRCChecksum)
                    {
                        CalculateCRCChecksum(ref bArr2);
                    }
                    else
                    {
                        CalculateSimpleChecksumForSend(ref bArr2);
                    }

                    try
                    {
                        if (SerPort != null)
                        {
                            SerPort.DiscardInBuffer();
                            SerPort.Write(bArr2, 0, bArr2.Length);
                            if ((commandHeader == 253) || (commandHeader == 252))
                            {
                                Thread.Sleep(1500);
                            }
                            else
                            {
                                Thread.Sleep(100);
                            }

                            i1 = i2 = 0;
                            while (SerPort.BytesToRead != 0)
                            {
                                byte readbyte = (byte)SerPort.ReadByte();
                                if (i1 < bArr1.Length)
                                {
                                    bArr1[i1] = readbyte;
                                    if (i1 >= bArr2.Length)
                                    {
                                        bArr3[i2] = bArr1[i1];
                                        flag2     = true;
                                        i2++;
                                    }
                                }
                                else
                                {
                                    Log.Error("Resultbuffer <  bytes read from comPort.");
                                }
                                i1++;
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        Log.Error("", e);
                        _PortIsDisapiered = !CheckIfPortExists();
                        return(false);
                    }


                    if (flag2)
                    {
                        flag1 = true;
                        if ((commandHeader == 253) || (commandHeader == 252))
                        {
                            noRxDataBytes = false;
                            rxDataBuffer  = new byte[i2];
                            for (int i6 = 0; i6 < i2; i6++)
                            {
                                rxDataBuffer[i6] = bArr3[i6];
                            }
                        }
                        else
                        {
                            bArr4 = new byte[i2];
                            for (int i7 = 0; i7 < i2; i7++)
                            {
                                bArr4[i7] = bArr3[i7];
                            }
                            bool flag3 = false;
                            if (encrypted)
                            {
                                byte[] bArr6 = new byte[(bArr4.Length - 2)];
                                for (int i8 = 0; i8 < bArr6.Length; i8++)
                                {
                                    bArr6[i8] = bArr4[i8 + 2];
                                }
                                //DecryptCcTalk(ref bArr6);
                                //for (int i9 = 0; i9 < bArr6.Length; i9++)
                                //{
                                //    bArr4[i9 + 2] = bArr6[i9];
                                //}
                                bArr6 = null;
                                CCTCrypt.Decrypt(bArr4, 2, bArr4.Length - 2, secArray);
                                // CCTCrypt.Decrypt(bArr4, 2, i2 - 2, secArray);
                                crc16.Reset();
                                crc16.PushByte(bArr4[0]);
                                crc16.PushByte(bArr4[1]);
                                crc16.PushData(bArr4, 3, i2 - 4);
                                flag3 = (bArr4[2] + (bArr4[i2 - 1] << 8)) == crc16.CRC;
                                // flag3 = CheckCRCChecksum(bArr4);
                                // flag3 = CheckSimpleChecksumForReceive(bArr4);
                            }
                            else if (useCRCChecksum)
                            {
                                flag3 = CheckCRCChecksum(bArr4);
                            }
                            else
                            {
                                flag3 = CheckSimpleChecksumForReceive(bArr4);
                            }

                            if (!flag3)
                            {
                                commsStatus = "Checksum Error at Receive";
                                flag1       = false;
                            }
                            else if (bArr4[1] != 0)
                            {
                                noRxDataBytes = false;
                                rxDataBuffer  = new byte[bArr4[1]];
                                for (int i10 = 0; i10 < bArr4[1]; i10++)
                                {
                                    rxDataBuffer[i10] = bArr4[i10 + 4];
                                }
                            }
                        }
                    }
                    else
                    {
                        commsStatus = "No Data received";
                        flag1       = false;
                    }
                }
            }
            catch (Exception Ex)
            {
                Log.Error("In SendCCTalkCommand.", Ex);
                _PortIsDisapiered = !CheckIfPortExists();
                return(false);
            }
            return(flag1);
        }