internal override void InterpretResult(bool reverseByteOrder, IEECmdConverters cmdConv, IEECommandParameter cmdParams)
        {
            // ACK received...
            if (Data.Length < 4)
            {
                Code = EECmdResultCode.InvalidResult;
                return;
            }

            DpIdx     = Data[1];
            Variant   = (ValueVariant)Data[2];
            Precision = Data[3];
            Name      = StringHelper.ExtractStringContent(Data, 4, -1);
        }
예제 #2
0
        internal override void InterpretResult(bool reverseByteOrder, IEECmdConverters cmdConv, IEECommandParameter cmdParams)
        {
            // ACK received...
            if (Data.Length < 6)
            {
                Code = EECmdResultCode.InvalidResult;
                return;
            }

            DpIdx       = Data[1];
            Variant     = (ValueVariant)Data[2];
            DataType    = Data[3];
            ScaleFactor = DataTypeConverter.ByteConverter.ToUInt16(Data, 4, reverseByteOrder);
        }
예제 #3
0
 internal override void InterpretResult(bool reverseByteOrder, IEECmdConverters cmdConv, IEECommandParameter cmdParams)
 {
     // Create command specific result from data
     if (Data.Length < 1)
     {
         Code = EECmdResultCode.InvalidResult;
     }
     else
     {
         // Payload begins at second byte
         Payload = new byte[Data.Length - 1];
         Array.Copy(Data, 1, Payload, 0, Data.Length - 1);
     }
 }
예제 #4
0
        internal override void InterpretResult(bool reverseByteOrder, IEECmdConverters cmdConv, IEECommandParameter cmdParams)
        {
            if (Data.Length < 4)
            {
                Code = EECmdResultCode.InvalidResult;
                return;
            }

            ModeIdx  = Data[1];
            DataType = Data[2];
            if (EE31DataType.ToValue(DataType, Data, 3, out object value, out byte[] valueData))
            {
                ValueData = valueData;
                Value     = value;
            }
예제 #5
0
        internal override void InterpretResult(bool reverseByteOrder, IEECmdConverters cmdConv, IEECommandParameter cmdParams)
        {
            // Create command specific result from data
            if (Data.Length < cmdParams.CmdData.Length + 1)
            {
                Code = EECmdResultCode.InvalidResult;
            }
            else
            {
                // First response byte is 0, data begins at 1
                int resultIdx = 1;

                // Get number of requested values from sent command data
                int nrValues = cmdParams.CmdData.Length / 2;

                for (int i = 0; i < nrValues; i++)
                {
                    // Get MVCode from sent command data
                    MVCode code = cmdConv.MVIndexToMVCode(cmdParams.CmdData[i * 2]);

                    // Get data type (try to get from MVCode if invalid)
                    MVDataType dataType = (MVDataType)Data[resultIdx++];

                    // Get value for data type
                    double value = double.NaN;
                    switch (dataType)
                    {
                    case MVDataType.Float:
                        if ((resultIdx + 4) <= Data.Length)
                        {
                            value = DataTypeConverter.ByteConverter.ToFloat(Data, resultIdx, reverseByteOrder).ToDoubleWithFloatResolution();
                        }
                        resultIdx += 4;
                        break;

                    case MVDataType.Double:
                        if ((resultIdx + 8) <= Data.Length)
                        {
                            value = DataTypeConverter.ByteConverter.ToDouble(Data, resultIdx, reverseByteOrder);
                        }
                        resultIdx += 8;
                        break;
                    }

                    MeasValues.Add(new KeyValuePair <MVCode, double>(code, value));
                }
            }
        }
예제 #6
0
        internal override void InterpretResult(bool reverseByteOrder, IEECmdConverters cmdConv, IEECommandParameter cmdParams)
        {
            // ACK received...
            if (Data.Length > 1 && 0xFF != Data[1])
            {
                // Switch intervall [msec/100]
                SwitchInterval = Data[1] * 100;
            }
            if (Data.Length > 2 && 0xFF != Data[2])
            {
                // Backlight brightness 0..100%
                BacklightBrightness = Data[2];
            }
            if (Data.Length > 3 && 0xFF != Data[3])
            {
                // Contrast 0..100%
                Contrast = Data[3];
            }
            if (Data.Length > 4 && 0xFF != Data[4])
            {
                // Display orientation (Normal, upside down,...)
                switch (Data[4])
                {
                default:
                case 0:
                    // Normal
                    DisplayOrientation = Protocol.DisplayOrientation.Normal;
                    break;

                case 1:
                    // Upside down (180°)
                    DisplayOrientation = Protocol.DisplayOrientation.UpsideDown;
                    break;

                case 2:
                    // Side (270°)
                    DisplayOrientation = Protocol.DisplayOrientation.Side270;
                    break;

                case 3:
                    // Side (90°)
                    DisplayOrientation = Protocol.DisplayOrientation.Side90;
                    break;
                }
            }
        }
예제 #7
0
        internal override void InterpretResult(bool reverseByteOrder, IEECmdConverters cmdConv, IEECommandParameter cmdParams)
        {
            // Create command specific result from data
            if (Data.Length < 18)
            {
                Code = EECmdResultCode.InvalidResult;
                return;
            }

            Out1_Voltage = Data[0] == 0x1;
            Out2_Voltage = Data[1] == 0x1;

            Out1_RangeMin = DataTypeConverter.ByteConverter.ToFloat(Data, 2, reverseByteOrder);
            Out1_RangeMax = DataTypeConverter.ByteConverter.ToFloat(Data, 6, reverseByteOrder);

            Out2_RangeMin = DataTypeConverter.ByteConverter.ToFloat(Data, 10, reverseByteOrder);
            Out2_RangeMax = DataTypeConverter.ByteConverter.ToFloat(Data, 14, reverseByteOrder);
        }
예제 #8
0
        internal override void InterpretResult(bool reverseByteOrder, IEECmdConverters cmdConv, IEECommandParameter cmdParams)
        {
            // ACK received...
            if (Data.Length < 26)
            {
                Code = EECmdResultCode.InvalidResult;
                return;
            }

            BusAddr   = Data[1];
            IsEEProbe = Data[2] != 0;
            Name      = StringHelper.ExtractStringContent(Data, 3, 16);
            int day   = Math.Max(1, (int)Data[19]);
            int month = Math.Max(1, (int)Data[20]);
            int year  = Math.Max(1, (int)DataTypeConverter.ByteConverter.ToUInt16(Data, 21, reverseByteOrder));

            CalibExpiration = new DateTime(year, month, day);
            NrOfRetries     = Data[23];
            TimeoutMs       = DataTypeConverter.ByteConverter.ToUInt16(Data, 24, reverseByteOrder);
        }
예제 #9
0
        internal override void InterpretResult(bool reverseByteOrder, IEECmdConverters cmdConv, IEECommandParameter cmdParams)
        {
            if (Data.Length < 2)
            {
                Code = EECmdResultCode.InvalidResult;
            }
            else
            {
                // Create command specific result from data
                var hwCodes = new List <ushort>();
                var major   = new List <byte>();
                var minor   = new List <byte>();
                var rev     = new List <byte>();

                for (int i = 0; i < Data.Length; i++)
                {
                    hwCodes.Add(DataTypeConverter.ByteConverter.ToUInt16(Data, i, reverseByteOrder));
                    i += 2;

                    if (i + 2 < Data.Length)
                    {
                        // Optional information for this HW code
                        major.Add(Data[i]);
                        minor.Add(Data[i + 1]);
                        rev.Add(Data[i + 2]);
                    }
                    else
                    {
                        break;
                    }
                }

                HWCodes       = hwCodes;
                MajorVersions = major;
                MinorVersions = minor;
                Revisions     = rev;
            }
        }
예제 #10
0
        internal override void InterpretResult(bool reverseByteOrder, IEECmdConverters cmdConv, IEECommandParameter cmdParams)
        {
            // ACK received...
            if (Data.Length < 25)
            {
                Code = EECmdResultCode.InvalidResult;
                return;
            }

            ProbeID           = Data[1];
            SourceType        = (ModbusSource)Data[2];
            FuncCode          = (ModbusFunc)Data[3];
            SourceRegAddr     = DataTypeConverter.ByteConverter.ToUInt16(Data, 4, reverseByteOrder);
            RequestIntervalMs = DataTypeConverter.ByteConverter.ToUInt16(Data, 6, reverseByteOrder);
            DataType          = Data[8];
            ScaleFactor       = DataTypeConverter.ByteConverter.ToUInt16(Data, 9, reverseByteOrder);
            // TODO: LimitErrorMin = DataTypeConverter.ByteConverter.ToFloat(Data, ??, reverseByteOrder);
            // TODO: LimitErrorMax = DataTypeConverter.ByteConverter.ToFloat(Data, ??, reverseByteOrder);
            LimitWarningMin = DataTypeConverter.ByteConverter.ToFloat(Data, 11, reverseByteOrder);
            LimitWarningMax = DataTypeConverter.ByteConverter.ToFloat(Data, 15, reverseByteOrder);
            LimitHysteresis = DataTypeConverter.ByteConverter.ToFloat(Data, 19, reverseByteOrder);
            CustomUnitIdx   = Data[23];
            Unit            = Data[24];
        }
예제 #11
0
 internal override void ConvertData(IEECmdConverters protConverters)
 {
     //... set bytes
 }
예제 #12
0
        internal override void InterpretResult(bool reverseByteOrder, IEECmdConverters cmdConv, IEECommandParameter cmdParams)
        {
            // Create command specific result from data
            if (Data.Length < 1)
            {
                Code = EECmdResultCode.InvalidResult;
            }
            else
            {
                if (Data.Length > 1)
                {
                    ModuleState = Data[1];
                }

                ComPortSettings cps = new ComPortSettings();

                // Decode settings
                byte cpsCoded = Data[0];

                // Bits 0..2: Baudrate
                //   Bit 7 = 0: (000 = 4k8, 001 = 9k6, 010 = 19k2, 011 = 38k4, 100 = 57k6, 101 = 76k8, 110 = 115k2)
                //   Bit 7 = 1: (000 = 300, 001 = 600, 010 = 1k2,  011 = 2k4)
                // Bits 3..4: Parität (01 = None, 10 = Odd, 11 = Even)
                // Bit 5: Stoppbits (0 = 1 Stoppbit, 1 = 2 Stoppbits)
                // Bit 6: Datenbits (0 = 8 Datenbits, 1 = 7 Datenbits)
                if (0x80 == (cpsCoded & 0x80))
                {
                    // Bit 7 is 1
                    switch (cpsCoded & 0x07)
                    {
                    case 0: cps.Baudrate = 300; break;

                    case 1: cps.Baudrate = 600; break;

                    case 2: cps.Baudrate = 1200; break;

                    case 3: cps.Baudrate = 2400; break;

                    default: Code = EECmdResultCode.InvalidResult; break;
                    }
                }
                else
                {
                    // Bit 7 is 0
                    switch (cpsCoded & 0x07)
                    {
                    case 0: cps.Baudrate = 4800; break;

                    case 1: cps.Baudrate = 9600; break;

                    case 2: cps.Baudrate = 19200; break;

                    case 3: cps.Baudrate = 38400; break;

                    case 4: cps.Baudrate = 57600; break;

                    case 5: cps.Baudrate = 76800; break;

                    case 6: cps.Baudrate = 115200; break;

                    default: Code = EECmdResultCode.InvalidResult; break;
                    }
                }
                switch (cpsCoded & 0x18)
                {
                case (1 * 8): cps.Parity = System.IO.Ports.Parity.None; break;

                case (2 * 8): cps.Parity = System.IO.Ports.Parity.Odd; break;

                case (3 * 8): cps.Parity = System.IO.Ports.Parity.Even; break;

                default: Code = EECmdResultCode.InvalidResult; break;
                }
                switch (cpsCoded & 0x20)
                {
                case (0 * 32): cps.Stopbits = System.IO.Ports.StopBits.One; break;

                case (1 * 32): cps.Stopbits = System.IO.Ports.StopBits.Two; break;

                default: Code = EECmdResultCode.InvalidResult; break;
                }
                switch (cpsCoded & 0x40)
                {
                case (0 * 64): cps.Databits = 8; break;

                case (1 * 64): cps.Databits = 7; break;

                default: Code = EECmdResultCode.InvalidResult; break;
                }

                if (Code == EECmdResultCode.Success)
                {
                    ComSettings = cps;
                }
            }
        }
예제 #13
0
 /// <summary>
 /// Result classes might overwrite to provide special result handling.
 /// </summary>
 internal virtual void InterpretResult(bool reverseByteOrder, IEECmdConverters cmdConv, IEECommandParameter cmdParams)
 {
 }
예제 #14
0
        internal override void InterpretResult(bool reverseByteOrder, IEECmdConverters cmdConv, IEECommandParameter cmdParams)
        {
            // ACK received...
            if (Data.Length < 2)
            {
                Code = EECmdResultCode.InvalidResult;
                return;
            }

            byte dispMode = Data[0];

            // Bit 7 = 0: measurands numbering is from EE31 indices list.
            // Bit 7 = 1: measurands numbering as in Gen.Cfg
            MVCodesNumberTranslationNeeded = (0x80 != (dispMode & 0x80));
            // Bit 6 = 0: automatic measuring range switch (on overflow) off
            // Bit 6 = 1: automatic measuring range switch (on overflow) on
            // settings.xxx = (0x40 == (dispMode & 0x40));
            // Bit 5 = 0: backlight off
            // Bit 5 = 1: backlight on
            BacklightActive = (0x20 == (dispMode & 0x20));
            // Bit 4 = 0: Startup logo off
            // Bit 4 = 1: Startup logo on
            // settings.xxx = (0x10 == (dispMode & 0x10));
            // Bit 3 = 0: Startup lamptest off
            // Bit 3 = 1: Startup lamptest on
            // settings.xxx = (0x08 == (dispMode & 0x08));
            // Bits 0..2: Display mode
            switch ((dispMode & 0x07))
            {
            case 0:
                // Display off
                DisplayMode = Protocol.DisplayMode.Off;
                break;

            case 1:
                // One line
                DisplayMode = Protocol.DisplayMode.OneLine;
                break;

            case 2:
                // One line alternating
                DisplayMode = Protocol.DisplayMode.OneLineAlternating;
                break;

            case 3:
                // Two lines
                DisplayMode = Protocol.DisplayMode.TwoLines;
                break;

            case 4:
                // Three lines
                DisplayMode = Protocol.DisplayMode.ThreeLines;
                break;

            case 5:
                // Four lines
                // unused
                break;

            case 6:
                // unused
                break;

            case 7:
                // unused
                break;
            }

            // Fetch following measurand codes
            var listAssignedMeasurands = new List <MVCode>();

            for (int idx = 1; idx < Data.Length; idx++)
            {
                MVCode mvc;
                if (MVCodesNumberTranslationNeeded)
                {
                    mvc = cmdConv.MVIndexToMVCode(Data[idx]);
                }
                else
                {
                    if (0xFF == Data[idx])
                    {
                        mvc = MVCode.INVALID;
                    }
                    else
                    {
                        mvc = (MVCode)Data[idx];
                    }
                }
                listAssignedMeasurands.Add(mvc);
            }

            AssignedMeasurands = listAssignedMeasurands;
        }
예제 #15
0
 internal virtual void ConvertData(IEECmdConverters protConverters)
 {
 }
예제 #16
0
 internal override void ConvertData(IEECmdConverters protConverters)
 {
     // Translate MVCode to index if neccessary
     base.CmdData[0] = protConverters.MVCodeToEE31MVIndex((MVCode)base.CmdData[0]);
     base.CmdData[1] = protConverters.MVCodeToEE31MVIndex((MVCode)base.CmdData[1]);
 }