/** * Copyright (c) 2010-2016 by the respective copyright holders. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package org.openhab.binding.sapp.internal.model; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; import org.openhab.binding.sapp.internal.configs.SappBindingConfigUtils; /** * Decimal Address model * * @author Paolo Denti * @since 1.8.0 * */ public class SappAddressDecimal extends SappAddress { private int originalMinScale; private int originalMaxScale; private int minScale; private int maxScale; /** * Constructor */ public SappAddressDecimal(String pnmasId, SappAddressType addressType, int address, String subAddress, int minScale, int maxScale) { super(pnmasId, addressType, address, subAddress); setOriginalScale(subAddress); if (minScale != maxScale) { // check against bad parameters, division by zero this.minScale = minScale; this.maxScale = maxScale; } else { this.minScale = originalMinScale; this.maxScale = originalMaxScale; } } /** * Constructor */ public SappAddressDecimal(String pnmasId, SappAddressType addressType, int address, String subAddress) { super(pnmasId, addressType, address, subAddress); setOriginalScale(subAddress); this.minScale = originalMinScale; this.maxScale = originalMaxScale; } /** * minScale getter */ public int getMinScale() { return minScale; } /** * maxScale getter */ public int getMaxScale() { return maxScale; } /** * originalMinScale getter */ public int getOriginalMinScale() { return originalMinScale; } /** * originalMaxScale getter */ public int getOriginalMaxScale() { return originalMaxScale; } private void setOriginalScale(String subAddress) { if (subAddress.equals(SappBindingConfigUtils.WORD_MASK_U) || subAddress.equals(SappBindingConfigUtils.WORD_MASK_S)) { originalMinScale = 0; originalMaxScale = 0xFFFF; } else if (subAddress.equals(SappBindingConfigUtils.LOW_MASK_U) || subAddress.equals(SappBindingConfigUtils.LOW_MASK_S)) { originalMinScale = 0; originalMaxScale = 0x00FF; } else if (subAddress.equals(SappBindingConfigUtils.HIGH_MASK_U) || subAddress.equals(SappBindingConfigUtils.HIGH_MASK_S)) { originalMinScale = 0; originalMaxScale = 0x00FF; } else { originalMinScale = 0; originalMaxScale = 0x0001; } } /** * returns the scaled value with respect to the original scale */ public BigDecimal scaledValue(int value, String subAddress) { BigDecimal toScaleValue = new BigDecimal(value); if (subAddress.equals(SappBindingConfigUtils.WORD_MASK_S) && value > 0x7FFF) { toScaleValue = (toScaleValue.subtract(new BigDecimal(0xFFFF))).subtract(BigDecimal.ONE); } else if (subAddress.equals(SappBindingConfigUtils.LOW_MASK_S) && value > 0x7F) { toScaleValue = (toScaleValue.subtract(new BigDecimal(0xFF))).subtract(BigDecimal.ONE); } else if (subAddress.equals(SappBindingConfigUtils.HIGH_MASK_S) && value > 0x7F) { toScaleValue = (toScaleValue.subtract(new BigDecimal(0xFF))).subtract(BigDecimal.ONE); } BigDecimal originalScale = new BigDecimal(originalMaxScale - originalMinScale); BigDecimal scale = new BigDecimal(maxScale - minScale); return toScaleValue.subtract(new BigDecimal(originalMinScale)).multiply(scale) .divide(originalScale, MathContext.DECIMAL128).add(new BigDecimal(minScale)); } /** * converts a scaled value back to the original scale */ public int backScaledValue(BigDecimal value) { BigDecimal originalScale = new BigDecimal(originalMaxScale - originalMinScale); BigDecimal scale = new BigDecimal(maxScale - minScale); return value.subtract(new BigDecimal(minScale)).multiply(originalScale).divide(scale, MathContext.DECIMAL128) .add(new BigDecimal(originalMinScale)).round(new MathContext(0, RoundingMode.HALF_EVEN)).intValue(); } /** * {@inheritDoc} */ @Override public String toString() { return String.format("[ %s:%s:%d:%s:%d:%d ]", getPnmasId(), getAddressType(), getAddress(), getSubAddress(), minScale, maxScale); } }