2 * Copyright (c) 2010-2023 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.lcn.internal.subhandler;
15 import java.util.Arrays;
16 import java.util.Collection;
17 import java.util.Collections;
18 import java.util.regex.Matcher;
19 import java.util.regex.Pattern;
20 import java.util.stream.IntStream;
22 import org.eclipse.jdt.annotation.NonNullByDefault;
23 import org.openhab.binding.lcn.internal.LcnBindingConstants;
24 import org.openhab.binding.lcn.internal.LcnModuleHandler;
25 import org.openhab.binding.lcn.internal.common.LcnChannelGroup;
26 import org.openhab.binding.lcn.internal.common.LcnDefs;
27 import org.openhab.binding.lcn.internal.common.LcnDefs.KeyLockStateModifier;
28 import org.openhab.binding.lcn.internal.common.LcnException;
29 import org.openhab.binding.lcn.internal.common.PckGenerator;
30 import org.openhab.binding.lcn.internal.connection.ModInfo;
31 import org.openhab.core.library.types.OnOffType;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
36 * Handles Commands and State changes of key table locks of an LCN module.
38 * @author Fabian Wolter - Initial contribution
41 public class LcnModuleKeyLockTableSubHandler extends AbstractLcnModuleSubHandler {
42 private final Logger logger = LoggerFactory.getLogger(LcnModuleKeyLockTableSubHandler.class);
43 private static final Pattern PATTERN = Pattern.compile(LcnBindingConstants.ADDRESS_REGEX
44 + "\\.TX(?<table0>\\d{3})(?<table1>\\d{3})(?<table2>\\d{3})((?<table3>\\d{3}))?");
46 public LcnModuleKeyLockTableSubHandler(LcnModuleHandler handler, ModInfo info) {
51 public void handleRefresh(LcnChannelGroup channelGroup, int number) {
52 info.refreshStatusLockedKeys();
56 public void handleRefresh(String groupId) {
61 public void handleCommandOnOff(OnOffType command, LcnChannelGroup channelGroup, int number) throws LcnException {
62 KeyLockStateModifier[] keyLockStateModifiers = new LcnDefs.KeyLockStateModifier[channelGroup.getCount()];
63 Arrays.fill(keyLockStateModifiers, LcnDefs.KeyLockStateModifier.NOCHANGE);
64 keyLockStateModifiers[number] = command == OnOffType.ON ? LcnDefs.KeyLockStateModifier.ON
65 : LcnDefs.KeyLockStateModifier.OFF;
66 int tableId = channelGroup.ordinal() - LcnChannelGroup.KEYLOCKTABLEA.ordinal();
67 handler.sendPck(PckGenerator.lockKeys(tableId, keyLockStateModifiers));
68 info.refreshStatusStatusLockedKeysAfterChange();
72 public void handleStatusMessage(Matcher matcher) {
73 info.onLockedKeysResponseReceived();
75 IntStream.range(0, LcnDefs.KEY_TABLE_COUNT).forEach(tableId -> {
76 String stateString = matcher.group(String.format("table%d", tableId));
77 if (stateString != null) {
78 boolean[] states = LcnDefs.getBooleanValue(Integer.parseInt(stateString));
80 LcnChannelGroup channelGroup = LcnChannelGroup.fromTableId(tableId);
81 for (int i = 0; i < states.length; i++) {
82 fireUpdate(channelGroup, i, states[i] ? OnOffType.ON : OnOffType.OFF);
84 } catch (LcnException e) {
85 logger.warn("Failed to set key table lock state: {}", e.getMessage());
92 public Collection<Pattern> getPckStatusMessagePatterns() {
93 return Collections.singleton(PATTERN);