예제 #1
0
        public bool GetState(object outputDescriptor)
        {
            var output          = DescriptorHelper.CastHardwareDescriptorOrThrow <OutputDescriptor>(outputDescriptor);
            var registerAddress = WORK_MODE_ADDRESS + GetOffset(output.DriverAddress);
            var registerValue   = _modbusTcp.ReadHoldingRegister(output.IpAddress, output.PortNumber, registerAddress);

            return(registerValue != 1);
        }
예제 #2
0
        public Task <TemperatureSensorData> GetValue(object inputDescriptor)
        {
            var input = DescriptorHelper.CastHardwareDescriptorOrThrow <InputDescriptor>(inputDescriptor);
            var temperatureReadout = _modbusTcp.ReadInputRegister(input.IpAddress, input.PortNumber, GetOffset(input.DriverAddress) + input.InputRegisterAddress);

            return(Task.FromResult(new TemperatureSensorData
            {
                Value = temperatureReadout * input.ValueMultiplier + input.ValueOffset,
                CrcOk = temperatureReadout != 1024 && temperatureReadout != int.MinValue
            }));
        }
        public bool GetState(object outputDescriptor)
        {
            var output = DescriptorHelper.CastHardwareDescriptorOrThrow <OutputDescriptor>(outputDescriptor);

            var channel   = GetChannel(output.OutputName);
            var chipState = GetChipState(output.DeviceId);

            var bitToCheck = 1 << channel.Pin;

            return((chipState.BankToValue[channel.Bank] & bitToCheck) == bitToCheck);
        }
        public bool GetState(object outputDescriptor)
        {
            var output = DescriptorHelper.CastHardwareDescriptorOrThrow <OutputDescriptor>(outputDescriptor);

            if (!OUTPUT_NAME_TO_CHANNEL.TryGetValue(output.OutputName, out var channel))
            {
                throw new ArgumentException(nameof(output.OutputName));
            }

            return(GetChannelState(output.DeviceId, channel));
        }
        public void SetState(object outputDescriptor, bool state)
        {
            var output = DescriptorHelper.CastHardwareDescriptorOrThrow <OutputDescriptor>(outputDescriptor);

            Logger.DebugWithData("New output state: ", new { output.DeviceId, output.OutputName, state });

            if (!OUTPUT_NAME_TO_CHANNEL.TryGetValue(output.OutputName, out var channel))
            {
                throw new ArgumentException(nameof(output.OutputName));
            }

            SetChannelState(output.DeviceId, channel, state);
        }
예제 #6
0
        public void SetState(object outputDescriptor, bool state)
        {
            var output   = DescriptorHelper.CastHardwareDescriptorOrThrow <OutputDescriptor>(outputDescriptor);
            var bmsState = _modbusTcp.ReadHoldingRegister(output.IpAddress, output.PortNumber, BMS_MODE_ADDRESS);

            if (bmsState != BMS_WM_RAW)
            {
                _modbusTcp.WriteHoldingRegister(output.IpAddress, output.PortNumber, BMS_MODE_ADDRESS, BMS_WM_RAW);
            }

            var registerAddress = WORK_MODE_ADDRESS + GetOffset(output.DriverAddress);

            _modbusTcp.WriteHoldingRegister(output.IpAddress, output.PortNumber, registerAddress, state ? 2 : 1);
        }
        public void SetState(object outputDescriptor, bool newState)
        {
            var output = DescriptorHelper.CastHardwareDescriptorOrThrow <OutputDescriptor>(outputDescriptor);

            Logger.DebugWithData("New output state: ", new { output.DeviceId, output.OutputName, newState });

            var channel = GetChannel(output.OutputName);

            lock (_lock)
            {
                var chipState = GetChipState(output.DeviceId);

                if (!chipState.InitializedAsOutput)
                {
                    _i2c.WriteToDevice(output.DeviceId, 0x00, 0x00);
                    _i2c.WriteToDevice(output.DeviceId, 0x01, 0x00);

                    chipState.InitializedAsOutput = true;
                }

                var bitToFlip = 1 << channel.Pin;

                var currentState = chipState.BankToValue[channel.Bank];

                if (newState)
                {
                    currentState |= bitToFlip;
                }
                else
                {
                    currentState &= ~bitToFlip;
                }

                chipState.BankToValue[channel.Bank] = currentState;

                _i2c.WriteToDevice(output.DeviceId, (byte)channel.Bank, (byte)currentState);
            }
        }
예제 #8
0
        public async Task <TemperatureSensorData> GetValue(object inputDescriptor)
        {
            var input = DescriptorHelper.CastHardwareDescriptorOrThrow <InputDescriptor>(inputDescriptor);

            if (SupportedDevicesPrefix.Any(input.DeviceId.StartsWith))
            {
                var rawData = await _oneWire.GetDeviceData(input.DeviceId);

                var indexOfTemp = rawData.IndexOf("t=", StringComparison.Ordinal) + 2;

                if (indexOfTemp > 2)
                {
                    var result = new TemperatureSensorData
                    {
                        CrcOk = rawData.Contains("YES") && !rawData.Contains("00 00 00 00 00 00 00 00 00")
                    };

                    if (int.TryParse(rawData.Substring(indexOfTemp, rawData.Length - (indexOfTemp + 1)), out int temp))
                    {
                        result.Value = temp / 1000d;
                    }

                    return(result);
                }
                else
                {
                    Logger.Warning("No data.");
                }
            }
            else
            {
                Logger.Warning("Unsupported device.");
            }

            return(new TemperatureSensorData());
        }