Exemplo n.º 1
0
        /// <summary>
        /// Creates the set request file.
        /// </summary>
        /// <param name="portId">The port id.</param>
        /// <param name="param">The param.</param>
        /// <returns></returns>
        public static SmlFile CreateSetRequestFile(string portId, TextParam param)
        {
            var handler = new SmlHandler(portId);
            var smlFile = new SmlFile();
            handler.AddOpenRequest(smlFile);
            handler.AddSetTextParamRequest(smlFile, param);
            handler.AddCloseRequest(smlFile);

            return smlFile;
        }
Exemplo n.º 2
0
        /// <summary>
        /// Adds the set text param request.
        /// </summary>
        /// <param name="reqFile">The req file.</param>
        /// <param name="param">The param.</param>
        private void AddSetTextParamRequest(SmlFile reqFile, TextParam param)
        {
            var msg = new Core.Sml.Messages.Message()
            {
                TransactionId = new[] { (byte)(reqFile.Count + 1) },
                GroupNo = 0x00,
                SetProcParameterRequest = new Core.Sml.Messages.SetProcParameterRequest()
                {
                    TreePath = new List<Core.Obis.ObisId>()
                    {
                        new Core.Obis.ObisId((ulong)param.ObisCode)
                    },
                    Tree = new Tree(new Core.Obis.ObisId((ulong)param.ObisCode), param.Data)

                }
            };
            //var obisId = (ObisId)param.ObisCode;
            //var paramTreePath = new SmlTreePath(obisId);
            //var tree = new SmlTree { ParameterName = new SmlOctetstring(ObisUtil.GetBytes(obisId)) };
            //if (string.IsNullOrEmpty(param.Data))
            //{
            //    throw new ArgumentNullException("param");
            //}

            //tree.ParameterValue = new SmlProcParValue(new SmlOctetstring(param.Data));
            //var msg = SmlMessageFactory.SetProcParamReq(paramTreePath, tree);

            //var transactionId = new byte[] { (byte)(reqFile.Count + 1) };
            //msg.TransactionId = new SmlOctetstring(transactionId);
            //msg.GroupNo = 0x00;
            reqFile.Add(msg);
        }
        public async Task<TextParam> ReadParameter(TextParam param)
        {
            var obis = new ObisId((ulong) param.ObisCode);
            var result = await this.baseMeterDevice.ReadRegisterAsync(obis).ConfigureAwait(false);
            if (result == null)
            {
                throw new NullReferenceException();
            }

            return new TextParam()
            {
                ObisCode = param.ObisCode, Data = result.GetAsString()
            };
        }
 public async Task WriteParameter(TextParam param, bool enableManufacturerMode = false)
 {
     throw new NotImplementedException();
 }
        /// <summary>
        /// Reads the parameter.
        /// </summary>
        /// <param name="param">The param.</param>
        /// <returns></returns>
        public async Task<TextParam> ReadParameter(TextParam param)
        {
            logger.Info("Reading text parameter.");

            var requestFile = SmlHandler.CreateGetRequestFile(portName, param.ObisCode);
            return await Retry.Do(
                async () =>
                {
                    var resVal = await SendFile(requestFile).ConfigureAwait(false);
                    CheckAttentionResponse(param.ObisCode, resVal);

                    var val = (byte[])resVal;
                    if (val != null)
                    {
                        param.Data = Encoding.UTF8.GetString(val);
                        logger.Info("Responding with text result: {0}.", param.Data);
                        return param;
                    }

                    logger.Info("No response for reading text parameter.");
                    throw new NullReferenceException();
                });
        }
        /// <summary>
        /// Writes the parameter.
        /// </summary>
        /// <param name="param">The param.</param>
        /// <param name="enableManufacturerMode">if set to <c>true</c> [enable manufacturer mode].</param>
        public async Task WriteParameter(TextParam param, bool enableManufacturerMode = false)
        {
            logger.Info(
                "Writing text parameter {0} with value {1}.",
                (ObisId)param.ObisCode,
                param.Data);
            await Retry.DoTask(
                async () =>
                {
                    var requestFile = SmlHandler.CreateSetRequestFile(portName, param);
                    await SendRequestFile(requestFile, enableManufacturerMode).ConfigureAwait(false);
                    if (writeOnlyParams.Contains(param.ObisCode))
                    {
                        return;
                    }

                    var result = await ReadParameter(new TextParam { ObisCode = param.ObisCode });

                    if (param.Data.Trim() != result.Data.Trim())
                    {
                        throw new DataException(
                            string.Format(
                                "Failed to write and verify {0:X6}: written: {1}, read: {2}",
                                param.ObisCode,
                                param.Data,
                                result.Data));
                    }
                });

        }
        /// <summary>
        /// Reads the tariff switching program number.
        /// </summary>
        /// <param name="clientId">The client id.</param>
        /// <param name="communicationPort">The communication port.</param>
        /// <returns>The current tariff switching program number</returns>
        public async Task<TextParam> ReadTariffSwitchingProgramNumber(Guid clientId, CommunicationPort communicationPort)
        {
            CheckConfiguration(communicationPort, clientId);

            var textParam = new TextParam()
            {
                ObisCode = (long)ObisId.EdlTariffProgramNumber,
                Data = string.Empty
            };

            textParam = await ClientComListDict[communicationPort.ComPortName].ComThread.ReadParameter(textParam);
            return textParam;
        }
        /// <summary>
        /// Writes the tariff switching program number.
        /// </summary>
        /// <param name="clientId">The client id.</param>
        /// <param name="communicationPort">The communication port.</param>
        /// <param name="switchingProgramNo">The switching program no.</param>
        public async Task WriteTariffSwitchingProgramNumber(Guid clientId, CommunicationPort communicationPort, string switchingProgramNo)
        {
            CheckConfiguration(communicationPort, clientId);

            var textParam = new TextParam()
            {
                ObisCode = (long)ObisId.EdlTariffProgramNumber,
                Data = switchingProgramNo
            };

            await ClientComListDict[communicationPort.ComPortName].ComThread.WriteParameter(textParam);
        }
        /// <summary>
        /// Writes the display special text.
        /// </summary>
        /// <param name="clientId">The client id.</param>
        /// <param name="communicationPort">The communication port.</param>
        /// <param name="displaySpecialText">The display special text.</param>
        public async Task WriteDisplaySpecialText(Guid clientId, CommunicationPort communicationPort, string displaySpecialText)
        {
            CheckConfiguration(communicationPort, clientId);

            var textParam = new TextParam()
            {
                ObisCode = (long)ObisId.EdlInfoText,
                Data = displaySpecialText
            };

            await ClientComListDict[communicationPort.ComPortName].ComThread.WriteParameter(textParam);
        }
        /// <summary>
        /// Reads the display special text.
        /// </summary>
        /// <param name="clientId">The client id.</param>
        /// <param name="communicationPort">The communication port.</param>
        /// <returns>The special text shown on the LCD's 2nd line.</returns>
        public async Task<TextParam> ReadDisplaySpecialText(Guid clientId, CommunicationPort communicationPort)
        {
            CheckConfiguration(communicationPort, clientId);

            var textParam = new TextParam()
            {
                ObisCode = (long)ObisId.EdlInfoText,
                Data = string.Empty
            };

            textParam = await ClientComListDict[communicationPort.ComPortName].ComThread.ReadParameter(textParam);
            return textParam;
        }
        public async Task<TextParam> ReadHardwareVersion(Guid clientId, CommunicationPort communicationPort)
        {
            var port = CheckConfiguration(communicationPort, clientId);

            var param = new TextParam
            {
                Data = null,
                ObisCode = VendorSpecificRegisterIds.HardwareVersion.AsLong()
            };

            param = await port.ComThread.ReadParameter(param);
            return param;
        }
        public async Task<TextParam> ReadFirmwareVersion(Guid clientId, CommunicationPort communicationPort)
        {
            var port = CheckConfiguration(communicationPort, clientId);

            var param = new TextParam()
            {
                Data = ""
            };

            param.ObisCode = RegisterIds.FirmwareVersion.AsLong();

            param = await port.ComThread.ReadParameter(param);
            return param;
        }
        /// <summary>
        /// Writes the parameter.
        /// </summary>
        /// <param name="param">The param.</param>
        /// <param name="enableManufacturerMode">if set to <c>true</c> [enable manufacturer mode].</param>
        public async Task WriteParameter(TextParam param, bool enableManufacturerMode = false)
        {
            this.logger.Info(
                "Writing text parameter {0} with value {1}.",
                (ObisId)param.ObisCode,
                param.Data);
            await Retry.DoTask(
                async () =>
                {
                    var requestFile = SmlHandler.CreateSetRequestFile(this.endpoint, param);
                    await this.SendRequestFile(requestFile, enableManufacturerMode);
                    if (writeOnlyParams.Contains(param.ObisCode))
                    {
                        return;
                    }

                    var result = await this.ReadParameter(new TextParam() { ObisCode = param.ObisCode });

                    if (param.Data.Trim() != result.Data.Trim())
                    {
                        throw new DataException(
                            $"Failed to write and verify {param.ObisCode:X6}: written: {param.Data}, read: {result.Data}");
                    }
                });

        }