package lejos.nxt.addon; import lejos.nxt.I2CPort; import lejos.nxt.I2CSensor; /* * WARNING: THIS CLASS IS SHARED BETWEEN THE classes AND pccomms PROJECTS. * DO NOT EDIT THE VERSION IN pccomms AS IT WILL BE OVERWRITTEN WHEN THE PROJECT IS BUILT. */ /** * This class works with HiTechnic or Mindsensors acceleration (tilt) sensor. * */ public class TiltSensor extends I2CSensor { byte[] buf = new byte[2]; byte[] buf2 = new byte[1]; private static final String MINDSENSORS_ID = "mndsnsrs"; private static byte X_TILT = 0x42; private static byte Y_TILT = 0x43; private static byte Z_TILT = 0x44; private static byte MINDSTORMS_X_ACCEL_LSB = 0x45; private static byte MINDSTORMS_Y_ACCEL_LSB = 0x47; private static byte MINDSTORMS_Z_ACCEL_LSB = 0x49; private static byte HITECHNIC_X_ACCEL_2BITS = 0x45; private static byte HITECHNIC_Y_ACCEL_2BITS = 0x46; private static byte HITECHNIC_Z_ACCEL_2BITS = 0x47; private boolean isMindsensors; // For comparing HiTechnic vs. Mindsensors public TiltSensor(I2CPort port) { super(port); port.setType(TYPE_LOWSPEED_9V); isMindsensors = (this.getProductID().equals(MINDSENSORS_ID)); } /** * Tilt of sensor along X-axis (see top of Mindsensors.com sensor for * diagram of axis). 128 is level. * * @return X tilt value, or -1 if call failed */ public int getXTilt() { int ret = getData(X_TILT, buf, 1); return (ret == 0 ? (buf[0] & 0xff) : -1); } /** * Returns Y tilt value. * * @return Y tilt value, or -1 if call failed */ public int getYTilt() { int ret = getData(Y_TILT, buf, 1); return (ret == 0 ? (buf[0] & 0xff) : -1); } /** * Returns Z tilt value. * * @return Z tilt value, or -1 if call failed */ public int getZTilt() { int ret = getData(Z_TILT, buf, 1); return (ret == 0 ? (buf[0] & 0xff) : -1); } /** * Acceleration along X axis. Positive or negative values in mg. * (g = acceleration due to gravity = 9.81 m/s^2) * @return Acceleration e.g. 9810 mg (falling on earth) */ public int getXAccel() { if (isMindsensors) { int ret = getData(MINDSTORMS_X_ACCEL_LSB, buf, 2); int accel = (buf[0] & 0xFF) | ((buf[1]) << 8); return (ret == 0 ? accel : -1); } else { int ret = getData(X_TILT, buf, 1); if (ret != 0) return -1; ret = getData(HITECHNIC_X_ACCEL_2BITS, buf2, 1); if (ret != 0) return -1; return ((buf[0] & 0xFF) << 2) + (buf2[0] & 0xFF); } } /** * Acceleration along Y axis. Positive or negative values in mg. * (g = acceleration due to gravity = 9.81 m/s^2) * @return Acceleration e.g. 9810 mg (falling on earth) */ public int getYAccel() { if (isMindsensors) { int ret = getData(MINDSTORMS_Y_ACCEL_LSB, buf, 2); int accel = (buf[0] & 0xFF) | ((buf[1]) << 8); return (ret == 0 ? accel : -1); } else { int ret = getData(Y_TILT, buf, 1); if (ret != 0) return -1; ret = getData(HITECHNIC_Y_ACCEL_2BITS, buf2, 1); if (ret != 0) return -1; return ((buf[0] & 0xFF) << 2) + (buf2[0] & 0xFF); } } /** * Acceleration along Z axis. Positive or negative values in mg. * (g = acceleration due to gravity = 9.81 m/s^2) * @return Acceleration e.g. 9810 mg (falling on earth) */ public int getZAccel() { if (isMindsensors) { int ret = getData(MINDSTORMS_Z_ACCEL_LSB, buf, 2); int accel = (buf[0] & 0xFF) | ((buf[1]) << 8); return (ret == 0 ? accel : -1); } else { int ret = getData(Z_TILT, buf, 1); if (ret != 0) return -1; ret = getData(HITECHNIC_Z_ACCEL_2BITS, buf2, 1); if (ret != 0) return -1; return ((buf[0] & 0xFF) << 2) + (buf2[0] & 0xFF); } } }