From cae87d038b66238a40f48d6af57b5f46c7aecc24 Mon Sep 17 00:00:00 2001 From: lebrush Date: Thu, 16 May 2013 17:16:50 +0200 Subject: [PATCH 1/2] TemperatureChip interface and TI TMP112 chipset implementation --- com/tado/mspsim/chip/TMP112.java | 148 ++++++++++++++++++++++ com/tado/mspsim/chip/TemperatureChip.java | 40 ++++++ 2 files changed, 188 insertions(+) create mode 100644 com/tado/mspsim/chip/TMP112.java create mode 100644 com/tado/mspsim/chip/TemperatureChip.java diff --git a/com/tado/mspsim/chip/TMP112.java b/com/tado/mspsim/chip/TMP112.java new file mode 100644 index 0000000..b74f696 --- /dev/null +++ b/com/tado/mspsim/chip/TMP112.java @@ -0,0 +1,148 @@ +package com.tado.mspsim.chip; + +import se.sics.mspsim.core.MSP430Core; +import se.sics.mspsim.core.USARTSource; + +/** + * Temperature chipset TI tmp112 emulation + * + * @author Víctor Ariño + */ +public class TMP112 extends I2CUnit implements TemperatureChip { + + private int temperature = 0; // in degrees + private int config = 0x60a0; // default config + + private boolean extendedMode = false; + private boolean polarity = false; + private boolean alarm = false; + private boolean shutdown = false; + private boolean thermostat = false; + private int resolution = 0x03; + private boolean oneShot = false; + + private float[] resFactors = { 50f, 25f, 12.5f, 6.25f }; + + public static final int TEMP_REG = 0; + public static final int CONFIG_REG = 1; + public static final int TEMP_L_REG = 2; + public static final int TEMP_H_REG = 3; + + public TMP112(USARTSource src, MSP430Core cpu) { + super("tmp112", 0x48, src, cpu); + } + + @Override + protected int registerRead(int address) { + switch (address) { + case TEMP_REG: + return getRawTemperature() & 0xffff; + case CONFIG_REG: + return config; + case TEMP_L_REG: + case TEMP_H_REG: + logw("not implemented"); + break; + } + return 0; + } + + @Override + protected void registerWrite(int address, int value) { + switch (address) { + case CONFIG_REG: + config = value; + /* Parse some of the configurations */ + polarity = ((value & 0x400) > 0); + extendedMode = ((value & 0x10) > 0); + alarm = ((value & 0x020) > 0); + shutdown = ((value & 0x100) > 0); + thermostat = ((value & 0x200) > 0); + resolution = ((value & 0x6000) >> 13); + oneShot = ((value & 0x8000) > 0); + break; + default: + logw("not implemented"); + break; + } + } + + /** + * Get the raw temperature + * + * The temperature in the class is stored in a user-friendly way, however the + * chipset must transmit it in a specific way without resolution conversions. + * This is done by this function: convert a temperature into the format that + * the tmp112 would send it to via i2c. + * + * @return + */ + private synchronized int getRawTemperature() { + int tmp = (int) (Math.abs(temperature) / resFactors[resolution]); + if (temperature < 0) { + /* Do the two-complements value and mask it */ + int nbits = 9 + resolution + (extendedMode ? 1 : 0); + int mask = (int) ((1L << nbits) - 1); + tmp = ~tmp + 1; + tmp &= mask; + } + return tmp << 4; + } + + @Override + public synchronized int getTemperature() { + return temperature; + } + + @Override + public synchronized void setTemperature(int temp) { + if (temp <= getMaxTemperature() && temp >= getMinTemperature()) { + temperature = temp; + } + } + + @Override + public int getMaxTemperature() { + int nbits = 9 + resolution + (extendedMode ? 1 : 0); + nbits -= 1; + return (int) (((1L << nbits) - 1) * resFactors[resolution]); + } + + @Override + public int getMinTemperature() { + return -4000; + } + + public int getConfig() { + return config; + } + + public boolean isExtendedMode() { + return extendedMode; + } + + public boolean isPolarity() { + return polarity; + } + + public boolean isAlarm() { + return alarm; + } + + public boolean isShutdown() { + return shutdown; + } + + public boolean isThermostat() { + return thermostat; + } + + public int getResolution() { + return resolution; + } + + public boolean isOneShot() { + return oneShot; + } + +} diff --git a/com/tado/mspsim/chip/TemperatureChip.java b/com/tado/mspsim/chip/TemperatureChip.java new file mode 100644 index 0000000..da6ea98 --- /dev/null +++ b/com/tado/mspsim/chip/TemperatureChip.java @@ -0,0 +1,40 @@ +package com.tado.mspsim.chip; + +/** + * Interface for a temperature chip. + * + * Implementing this interface makes it compatible with the cooja-interfaces + * and hence makes the peripheral implementation way easier + * + * @author Víctor Ariño + */ +public interface TemperatureChip { + /** + * Get the current temperature on the chip + * + * @return + */ + public int getTemperature(); + + /** + * Set a new temperature on the chip + * + * @param temp + * temperature to set in XXYY format where XX.YY°C + */ + public void setTemperature(int temp); + + /** + * Get the maximum temperature allowed by the chipset + * + * @return + */ + public int getMaxTemperature(); + + /** + * Get the minimum temperature allowed by the chipset + * + * @return + */ + public int getMinTemperature(); +} From c7c49df7eecba9b7f3f13adbc5d021baa6a47650 Mon Sep 17 00:00:00 2001 From: lebrush Date: Tue, 4 Jun 2013 11:34:23 +0200 Subject: [PATCH 2/2] Merged into se.sics package and added license. --- com/tado/mspsim/chip/TemperatureChip.java | 40 ---------- {com/tado => se/sics}/mspsim/chip/TMP112.java | 35 ++++++++- se/sics/mspsim/chip/TemperatureChip.java | 73 +++++++++++++++++++ 3 files changed, 107 insertions(+), 41 deletions(-) delete mode 100644 com/tado/mspsim/chip/TemperatureChip.java rename {com/tado => se/sics}/mspsim/chip/TMP112.java (65%) create mode 100644 se/sics/mspsim/chip/TemperatureChip.java diff --git a/com/tado/mspsim/chip/TemperatureChip.java b/com/tado/mspsim/chip/TemperatureChip.java deleted file mode 100644 index da6ea98..0000000 --- a/com/tado/mspsim/chip/TemperatureChip.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.tado.mspsim.chip; - -/** - * Interface for a temperature chip. - * - * Implementing this interface makes it compatible with the cooja-interfaces - * and hence makes the peripheral implementation way easier - * - * @author Víctor Ariño - */ -public interface TemperatureChip { - /** - * Get the current temperature on the chip - * - * @return - */ - public int getTemperature(); - - /** - * Set a new temperature on the chip - * - * @param temp - * temperature to set in XXYY format where XX.YY°C - */ - public void setTemperature(int temp); - - /** - * Get the maximum temperature allowed by the chipset - * - * @return - */ - public int getMaxTemperature(); - - /** - * Get the minimum temperature allowed by the chipset - * - * @return - */ - public int getMinTemperature(); -} diff --git a/com/tado/mspsim/chip/TMP112.java b/se/sics/mspsim/chip/TMP112.java similarity index 65% rename from com/tado/mspsim/chip/TMP112.java rename to se/sics/mspsim/chip/TMP112.java index b74f696..51a1a0b 100644 --- a/com/tado/mspsim/chip/TMP112.java +++ b/se/sics/mspsim/chip/TMP112.java @@ -1,4 +1,37 @@ -package com.tado.mspsim.chip; +/* Copyright (c) 2013, tado° GmbH. Munich, Germany. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of MSPSim. + * + * Author: Víctor Ariño + * + */ + +package se.sics.mspsim.chip; import se.sics.mspsim.core.MSP430Core; import se.sics.mspsim.core.USARTSource; diff --git a/se/sics/mspsim/chip/TemperatureChip.java b/se/sics/mspsim/chip/TemperatureChip.java new file mode 100644 index 0000000..829610c --- /dev/null +++ b/se/sics/mspsim/chip/TemperatureChip.java @@ -0,0 +1,73 @@ +/* Copyright (c) 2013, tado° GmbH. Munich, Germany. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of MSPSim. + * + * Author: Víctor Ariño + * + */ + +package se.sics.mspsim.chip; + +/** + * Interface for a temperature chip. + * + * Implementing this interface makes it compatible with the cooja-interfaces + * and hence makes the peripheral implementation way easier + * + * @author Víctor Ariño + */ +public interface TemperatureChip { + /** + * Get the current temperature on the chip + * + * @return + */ + public int getTemperature(); + + /** + * Set a new temperature on the chip + * + * @param temp + * temperature to set in XXYY format where XX.YY°C + */ + public void setTemperature(int temp); + + /** + * Get the maximum temperature allowed by the chipset + * + * @return + */ + public int getMaxTemperature(); + + /** + * Get the minimum temperature allowed by the chipset + * + * @return + */ + public int getMinTemperature(); +}