public void onDpMessage(DpMessage msg)
        {
            switch (msg.type)
            {
            case DpMessageType.DP_MSG_DPINFO:
                lock (this)
                {
                    if (currDpInfoListener != null)
                    {
                        currDpInfoListener((DpInfo)msg);
                        currentTempOnDp = ((DpInfo)msg).CurrentTemp;
                        Monitor.Pulse(this);
                        currDpInfoListener = null;
                    }
                }

                break;

            case DpMessageType.DP_MSG_LICENSE_ACK:
                lock (this)
                {
                    if (licenseAckListener != null)
                    {
                        licenseAckListener((LicenseAck)msg);
                        Monitor.Pulse(this);
                        licenseAckListener = null;
                    }
                }
                break;

            default:
                break;
            }
        }
        public bool SendDpLicense(byte[] license, int timeout, LicenseAckListener listener)
        {
            lock (this)
            {
                byte[] data = new byte[API_MSG_DP_BASIC_MASSEGE_LENGTH + license.Length];
                data[0] = API_MSG_PREAMBLE;
                data[1] = (byte)data.Count();
                data[2] = API_MSG_DP_SEND_LICENSE;  //opcode


                Array.Copy(license, 0, data, API_MSG_DP_BASIC_MASSEGE_LENGTH - 1, license.Count());

                licenseAckListener = listener;

                data[data.Count() - 1] = CheckCum(data, data.Count());
                SerialPortInstanse.Send(data, data.Count());

                bool res = Monitor.Wait(this, timeout);

                if (!res)
                {
                    listener(null);
                    licenseAckListener = null;
                }

                _gui.UpdateTraceInfo("Dp write calib. point " + res + "\r\n");
                return(res);
            }
        }