Merge pull request #14 from lebrush/temp-chipsets

TemperatureChip interface and TI TMP112 chipset implementation
This commit is contained in:
Joakim Eriksson 2013-06-25 00:26:49 -07:00
commit f302d46cc9
2 changed files with 254 additions and 0 deletions

View File

@ -0,0 +1,181 @@
/* 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 <victor.arino@tado.com>
*
*/
package se.sics.mspsim.chip;
import se.sics.mspsim.core.MSP430Core;
import se.sics.mspsim.core.USARTSource;
/**
* Temperature chipset TI tmp112 emulation
*
* @author Víctor Ariño <victor.arino@tado.com>
*/
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;
}
}

View File

@ -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 <victor.arino@tado.com>
*
*/
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 <victor.arino@tado.com>
*/
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();
}