All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.tinkerforge.BrickletLoadCellV2 Maven / Gradle / Ivy

/* ***********************************************************
 * This file was automatically generated on 2020-06-25.      *
 *                                                           *
 * Java Bindings Version 2.1.28                              *
 *                                                           *
 * If you have a bugfix for this file and want to commit it, *
 * please fix the bug in the generator. You can find a link  *
 * to the generators git repository on tinkerforge.com       *
 *************************************************************/

package com.tinkerforge;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * Measures weight with a load cell
 */
public class BrickletLoadCellV2 extends Device {
	public final static int DEVICE_IDENTIFIER = 2104;
	public final static String DEVICE_DISPLAY_NAME = "Load Cell Bricklet 2.0";

	public final static byte FUNCTION_GET_WEIGHT = (byte)1;
	public final static byte FUNCTION_SET_WEIGHT_CALLBACK_CONFIGURATION = (byte)2;
	public final static byte FUNCTION_GET_WEIGHT_CALLBACK_CONFIGURATION = (byte)3;
	public final static byte FUNCTION_SET_MOVING_AVERAGE = (byte)5;
	public final static byte FUNCTION_GET_MOVING_AVERAGE = (byte)6;
	public final static byte FUNCTION_SET_INFO_LED_CONFIG = (byte)7;
	public final static byte FUNCTION_GET_INFO_LED_CONFIG = (byte)8;
	public final static byte FUNCTION_CALIBRATE = (byte)9;
	public final static byte FUNCTION_TARE = (byte)10;
	public final static byte FUNCTION_SET_CONFIGURATION = (byte)11;
	public final static byte FUNCTION_GET_CONFIGURATION = (byte)12;
	public final static byte FUNCTION_GET_SPITFP_ERROR_COUNT = (byte)234;
	public final static byte FUNCTION_SET_BOOTLOADER_MODE = (byte)235;
	public final static byte FUNCTION_GET_BOOTLOADER_MODE = (byte)236;
	public final static byte FUNCTION_SET_WRITE_FIRMWARE_POINTER = (byte)237;
	public final static byte FUNCTION_WRITE_FIRMWARE = (byte)238;
	public final static byte FUNCTION_SET_STATUS_LED_CONFIG = (byte)239;
	public final static byte FUNCTION_GET_STATUS_LED_CONFIG = (byte)240;
	public final static byte FUNCTION_GET_CHIP_TEMPERATURE = (byte)242;
	public final static byte FUNCTION_RESET = (byte)243;
	public final static byte FUNCTION_WRITE_UID = (byte)248;
	public final static byte FUNCTION_READ_UID = (byte)249;
	public final static byte FUNCTION_GET_IDENTITY = (byte)255;
	private final static int CALLBACK_WEIGHT = 4;

	public final static char THRESHOLD_OPTION_OFF = 'x';
	public final static char THRESHOLD_OPTION_OUTSIDE = 'o';
	public final static char THRESHOLD_OPTION_INSIDE = 'i';
	public final static char THRESHOLD_OPTION_SMALLER = '<';
	public final static char THRESHOLD_OPTION_GREATER = '>';
	public final static int INFO_LED_CONFIG_OFF = 0;
	public final static int INFO_LED_CONFIG_ON = 1;
	public final static int INFO_LED_CONFIG_SHOW_HEARTBEAT = 2;
	public final static int RATE_10HZ = 0;
	public final static int RATE_80HZ = 1;
	public final static int GAIN_128X = 0;
	public final static int GAIN_64X = 1;
	public final static int GAIN_32X = 2;
	public final static int BOOTLOADER_MODE_BOOTLOADER = 0;
	public final static int BOOTLOADER_MODE_FIRMWARE = 1;
	public final static int BOOTLOADER_MODE_BOOTLOADER_WAIT_FOR_REBOOT = 2;
	public final static int BOOTLOADER_MODE_FIRMWARE_WAIT_FOR_REBOOT = 3;
	public final static int BOOTLOADER_MODE_FIRMWARE_WAIT_FOR_ERASE_AND_REBOOT = 4;
	public final static int BOOTLOADER_STATUS_OK = 0;
	public final static int BOOTLOADER_STATUS_INVALID_MODE = 1;
	public final static int BOOTLOADER_STATUS_NO_CHANGE = 2;
	public final static int BOOTLOADER_STATUS_ENTRY_FUNCTION_NOT_PRESENT = 3;
	public final static int BOOTLOADER_STATUS_DEVICE_IDENTIFIER_INCORRECT = 4;
	public final static int BOOTLOADER_STATUS_CRC_MISMATCH = 5;
	public final static int STATUS_LED_CONFIG_OFF = 0;
	public final static int STATUS_LED_CONFIG_ON = 1;
	public final static int STATUS_LED_CONFIG_SHOW_HEARTBEAT = 2;
	public final static int STATUS_LED_CONFIG_SHOW_STATUS = 3;

	private List listenerWeight = new CopyOnWriteArrayList();

	public class WeightCallbackConfiguration {
		public long period;
		public boolean valueHasToChange;
		public char option;
		public int min;
		public int max;

		public String toString() {
			return "[" + "period = " + period + ", " + "valueHasToChange = " + valueHasToChange + ", " + "option = " + option + ", " + "min = " + min + ", " + "max = " + max + "]";
		}
	}

	public class Configuration {
		public int rate;
		public int gain;

		public String toString() {
			return "[" + "rate = " + rate + ", " + "gain = " + gain + "]";
		}
	}

	public class SPITFPErrorCount {
		public long errorCountAckChecksum;
		public long errorCountMessageChecksum;
		public long errorCountFrame;
		public long errorCountOverflow;

		public String toString() {
			return "[" + "errorCountAckChecksum = " + errorCountAckChecksum + ", " + "errorCountMessageChecksum = " + errorCountMessageChecksum + ", " + "errorCountFrame = " + errorCountFrame + ", " + "errorCountOverflow = " + errorCountOverflow + "]";
		}
	}

	/**
	 * This listener is triggered periodically according to the configuration set by
	 * {@link BrickletLoadCellV2#setWeightCallbackConfiguration(long, boolean, char, int, int)}.
	 * 
	 * The parameter is the same as {@link BrickletLoadCellV2#getWeight()}.
	 */
	public interface WeightListener extends DeviceListener {
		public void weight(int weight);
	}

	/**
	 * Creates an object with the unique device ID \c uid. and adds it to
	 * the IP Connection \c ipcon.
	 */
	public BrickletLoadCellV2(String uid, IPConnection ipcon) {
		super(uid, ipcon);

		apiVersion[0] = 2;
		apiVersion[1] = 0;
		apiVersion[2] = 0;

		deviceIdentifier = DEVICE_IDENTIFIER;
		deviceDisplayName = DEVICE_DISPLAY_NAME;

		responseExpected[IPConnectionBase.unsignedByte(FUNCTION_GET_WEIGHT)] = RESPONSE_EXPECTED_FLAG_ALWAYS_TRUE;
		responseExpected[IPConnectionBase.unsignedByte(FUNCTION_SET_WEIGHT_CALLBACK_CONFIGURATION)] = RESPONSE_EXPECTED_FLAG_TRUE;
		responseExpected[IPConnectionBase.unsignedByte(FUNCTION_GET_WEIGHT_CALLBACK_CONFIGURATION)] = RESPONSE_EXPECTED_FLAG_ALWAYS_TRUE;
		responseExpected[IPConnectionBase.unsignedByte(FUNCTION_SET_MOVING_AVERAGE)] = RESPONSE_EXPECTED_FLAG_FALSE;
		responseExpected[IPConnectionBase.unsignedByte(FUNCTION_GET_MOVING_AVERAGE)] = RESPONSE_EXPECTED_FLAG_ALWAYS_TRUE;
		responseExpected[IPConnectionBase.unsignedByte(FUNCTION_SET_INFO_LED_CONFIG)] = RESPONSE_EXPECTED_FLAG_FALSE;
		responseExpected[IPConnectionBase.unsignedByte(FUNCTION_GET_INFO_LED_CONFIG)] = RESPONSE_EXPECTED_FLAG_ALWAYS_TRUE;
		responseExpected[IPConnectionBase.unsignedByte(FUNCTION_CALIBRATE)] = RESPONSE_EXPECTED_FLAG_FALSE;
		responseExpected[IPConnectionBase.unsignedByte(FUNCTION_TARE)] = RESPONSE_EXPECTED_FLAG_FALSE;
		responseExpected[IPConnectionBase.unsignedByte(FUNCTION_SET_CONFIGURATION)] = RESPONSE_EXPECTED_FLAG_FALSE;
		responseExpected[IPConnectionBase.unsignedByte(FUNCTION_GET_CONFIGURATION)] = RESPONSE_EXPECTED_FLAG_ALWAYS_TRUE;
		responseExpected[IPConnectionBase.unsignedByte(FUNCTION_GET_SPITFP_ERROR_COUNT)] = RESPONSE_EXPECTED_FLAG_ALWAYS_TRUE;
		responseExpected[IPConnectionBase.unsignedByte(FUNCTION_SET_BOOTLOADER_MODE)] = RESPONSE_EXPECTED_FLAG_ALWAYS_TRUE;
		responseExpected[IPConnectionBase.unsignedByte(FUNCTION_GET_BOOTLOADER_MODE)] = RESPONSE_EXPECTED_FLAG_ALWAYS_TRUE;
		responseExpected[IPConnectionBase.unsignedByte(FUNCTION_SET_WRITE_FIRMWARE_POINTER)] = RESPONSE_EXPECTED_FLAG_FALSE;
		responseExpected[IPConnectionBase.unsignedByte(FUNCTION_WRITE_FIRMWARE)] = RESPONSE_EXPECTED_FLAG_ALWAYS_TRUE;
		responseExpected[IPConnectionBase.unsignedByte(FUNCTION_SET_STATUS_LED_CONFIG)] = RESPONSE_EXPECTED_FLAG_FALSE;
		responseExpected[IPConnectionBase.unsignedByte(FUNCTION_GET_STATUS_LED_CONFIG)] = RESPONSE_EXPECTED_FLAG_ALWAYS_TRUE;
		responseExpected[IPConnectionBase.unsignedByte(FUNCTION_GET_CHIP_TEMPERATURE)] = RESPONSE_EXPECTED_FLAG_ALWAYS_TRUE;
		responseExpected[IPConnectionBase.unsignedByte(FUNCTION_RESET)] = RESPONSE_EXPECTED_FLAG_FALSE;
		responseExpected[IPConnectionBase.unsignedByte(FUNCTION_WRITE_UID)] = RESPONSE_EXPECTED_FLAG_FALSE;
		responseExpected[IPConnectionBase.unsignedByte(FUNCTION_READ_UID)] = RESPONSE_EXPECTED_FLAG_ALWAYS_TRUE;
		responseExpected[IPConnectionBase.unsignedByte(FUNCTION_GET_IDENTITY)] = RESPONSE_EXPECTED_FLAG_ALWAYS_TRUE;

		callbacks[CALLBACK_WEIGHT] = new IPConnection.DeviceCallbackListener() {
			public void callback(byte[] packet) {
				if (packet.length != 12) {
					return; // silently ignoring callback with wrong length
				}

				ByteBuffer bb = ByteBuffer.wrap(packet, 8, packet.length - 8);
				bb.order(ByteOrder.LITTLE_ENDIAN);

				int weight = (bb.getInt());

				for (WeightListener listener: listenerWeight) {
					listener.weight(weight);
				}
			}
		};

		ipcon.addDevice(this);
	}

	/**
	 * Returns the currently measured weight.
	 * 
	 * 
	 * If you want to get the value periodically, it is recommended to use the
	 * {@link BrickletLoadCellV2.WeightListener} listener. You can set the listener configuration
	 * with {@link BrickletLoadCellV2#setWeightCallbackConfiguration(long, boolean, char, int, int)}.
	 */
	public int getWeight() throws TinkerforgeException {
		checkValidity();

		ByteBuffer bb = ipcon.createRequestPacket((byte)8, FUNCTION_GET_WEIGHT, this);


		byte[] response = sendRequest(bb.array(), 12);

		bb = ByteBuffer.wrap(response, 8, response.length - 8);
		bb.order(ByteOrder.LITTLE_ENDIAN);

		int weight = (bb.getInt());

		return weight;
	}

	/**
	 * The period is the period with which the {@link BrickletLoadCellV2.WeightListener} listener is triggered
	 * periodically. A value of 0 turns the listener off.
	 * 
	 * If the `value has to change`-parameter is set to true, the listener is only
	 * triggered after the value has changed. If the value didn't change
	 * within the period, the listener is triggered immediately on change.
	 * 
	 * If it is set to false, the listener is continuously triggered with the period,
	 * independent of the value.
	 * 
	 * It is furthermore possible to constrain the listener with thresholds.
	 * 
	 * The `option`-parameter together with min/max sets a threshold for the {@link BrickletLoadCellV2.WeightListener} listener.
	 * 
	 * The following options are possible:
	 * 
	 * \verbatim
	 *  "Option", "Description"
	 * 
	 *  "'x'",    "Threshold is turned off"
	 *  "'o'",    "Threshold is triggered when the value is *outside* the min and max values"
	 *  "'i'",    "Threshold is triggered when the value is *inside* or equal to the min and max values"
	 *  "'<'",    "Threshold is triggered when the value is smaller than the min value (max is ignored)"
	 *  "'>'",    "Threshold is triggered when the value is greater than the min value (max is ignored)"
	 * \endverbatim
	 * 
	 * If the option is set to 'x' (threshold turned off) the listener is triggered with the fixed period.
	 */
	public void setWeightCallbackConfiguration(long period, boolean valueHasToChange, char option, int min, int max) throws TinkerforgeException {
		checkValidity();

		ByteBuffer bb = ipcon.createRequestPacket((byte)22, FUNCTION_SET_WEIGHT_CALLBACK_CONFIGURATION, this);

		bb.putInt((int)period);
		bb.put((byte)(valueHasToChange ? 1 : 0));
		bb.put((byte)option);
		bb.putInt(min);
		bb.putInt(max);

		sendRequest(bb.array(), 0);
	}

	/**
	 * Returns the listener configuration as set by {@link BrickletLoadCellV2#setWeightCallbackConfiguration(long, boolean, char, int, int)}.
	 */
	public WeightCallbackConfiguration getWeightCallbackConfiguration() throws TinkerforgeException {
		checkValidity();

		ByteBuffer bb = ipcon.createRequestPacket((byte)8, FUNCTION_GET_WEIGHT_CALLBACK_CONFIGURATION, this);


		byte[] response = sendRequest(bb.array(), 22);

		bb = ByteBuffer.wrap(response, 8, response.length - 8);
		bb.order(ByteOrder.LITTLE_ENDIAN);

		WeightCallbackConfiguration obj = new WeightCallbackConfiguration();
		obj.period = IPConnectionBase.unsignedInt(bb.getInt());
		obj.valueHasToChange = (bb.get()) != 0;
		obj.option = (char)(bb.get());
		obj.min = (bb.getInt());
		obj.max = (bb.getInt());

		return obj;
	}

	/**
	 * Sets the length of a `moving averaging <https://en.wikipedia.org/wiki/Moving_average>`__
	 * for the weight value.
	 * 
	 * Setting the length to 1 will turn the averaging off. With less
	 * averaging, there is more noise on the data.
	 */
	public void setMovingAverage(int average) throws TinkerforgeException {
		checkValidity();

		ByteBuffer bb = ipcon.createRequestPacket((byte)10, FUNCTION_SET_MOVING_AVERAGE, this);

		bb.putShort((short)average);

		sendRequest(bb.array(), 0);
	}

	/**
	 * Returns the length moving average as set by {@link BrickletLoadCellV2#setMovingAverage(int)}.
	 */
	public int getMovingAverage() throws TinkerforgeException {
		checkValidity();

		ByteBuffer bb = ipcon.createRequestPacket((byte)8, FUNCTION_GET_MOVING_AVERAGE, this);


		byte[] response = sendRequest(bb.array(), 10);

		bb = ByteBuffer.wrap(response, 8, response.length - 8);
		bb.order(ByteOrder.LITTLE_ENDIAN);

		int average = IPConnectionBase.unsignedShort(bb.getShort());

		return average;
	}

	/**
	 * Configures the info LED to be either turned off, turned on, or blink in
	 * heartbeat mode.
	 */
	public void setInfoLEDConfig(int config) throws TinkerforgeException {
		checkValidity();

		ByteBuffer bb = ipcon.createRequestPacket((byte)9, FUNCTION_SET_INFO_LED_CONFIG, this);

		bb.put((byte)config);

		sendRequest(bb.array(), 0);
	}

	/**
	 * Returns the LED configuration as set by {@link BrickletLoadCellV2#setInfoLEDConfig(int)}
	 */
	public int getInfoLEDConfig() throws TinkerforgeException {
		checkValidity();

		ByteBuffer bb = ipcon.createRequestPacket((byte)8, FUNCTION_GET_INFO_LED_CONFIG, this);


		byte[] response = sendRequest(bb.array(), 9);

		bb = ByteBuffer.wrap(response, 8, response.length - 8);
		bb.order(ByteOrder.LITTLE_ENDIAN);

		int config = IPConnectionBase.unsignedByte(bb.get());

		return config;
	}

	/**
	 * To calibrate your Load Cell Bricklet 2.0 you have to
	 * 
	 * * empty the scale and call this function with 0 and
	 * * add a known weight to the scale and call this function with the weight.
	 * 
	 * The calibration is saved in the flash of the Bricklet and only
	 * needs to be done once.
	 * 
	 * We recommend to use the Brick Viewer for calibration, you don't need
	 * to call this function in your source code.
	 */
	public void calibrate(long weight) throws TinkerforgeException {
		checkValidity();

		ByteBuffer bb = ipcon.createRequestPacket((byte)12, FUNCTION_CALIBRATE, this);

		bb.putInt((int)weight);

		sendRequest(bb.array(), 0);
	}

	/**
	 * Sets the currently measured weight as tare weight.
	 */
	public void tare() throws TinkerforgeException {
		checkValidity();

		ByteBuffer bb = ipcon.createRequestPacket((byte)8, FUNCTION_TARE, this);


		sendRequest(bb.array(), 0);
	}

	/**
	 * The measurement rate and gain are configurable.
	 * 
	 * The rate can be either 10Hz or 80Hz. A faster rate will produce more noise.
	 * It is additionally possible to add a moving average
	 * (see {@link BrickletLoadCellV2#setMovingAverage(int)}) to the measurements.
	 * 
	 * The gain can be 128x, 64x or 32x. It represents a measurement range of
	 * ±20mV, ±40mV and ±80mV respectively. The Load Cell Bricklet uses an
	 * excitation voltage of 5V and most load cells use an output of 2mV/V. That
	 * means the voltage range is ±15mV for most load cells (i.e. gain of 128x
	 * is best). If you don't know what all of this means you should keep it at
	 * 128x, it will most likely be correct.
	 */
	public void setConfiguration(int rate, int gain) throws TinkerforgeException {
		checkValidity();

		ByteBuffer bb = ipcon.createRequestPacket((byte)10, FUNCTION_SET_CONFIGURATION, this);

		bb.put((byte)rate);
		bb.put((byte)gain);

		sendRequest(bb.array(), 0);
	}

	/**
	 * Returns the configuration as set by {@link BrickletLoadCellV2#setConfiguration(int, int)}.
	 */
	public Configuration getConfiguration() throws TinkerforgeException {
		checkValidity();

		ByteBuffer bb = ipcon.createRequestPacket((byte)8, FUNCTION_GET_CONFIGURATION, this);


		byte[] response = sendRequest(bb.array(), 10);

		bb = ByteBuffer.wrap(response, 8, response.length - 8);
		bb.order(ByteOrder.LITTLE_ENDIAN);

		Configuration obj = new Configuration();
		obj.rate = IPConnectionBase.unsignedByte(bb.get());
		obj.gain = IPConnectionBase.unsignedByte(bb.get());

		return obj;
	}

	/**
	 * Returns the error count for the communication between Brick and Bricklet.
	 * 
	 * The errors are divided into
	 * 
	 * * ACK checksum errors,
	 * * message checksum errors,
	 * * framing errors and
	 * * overflow errors.
	 * 
	 * The errors counts are for errors that occur on the Bricklet side. All
	 * Bricks have a similar function that returns the errors on the Brick side.
	 */
	public SPITFPErrorCount getSPITFPErrorCount() throws TinkerforgeException {
		checkValidity();

		ByteBuffer bb = ipcon.createRequestPacket((byte)8, FUNCTION_GET_SPITFP_ERROR_COUNT, this);


		byte[] response = sendRequest(bb.array(), 24);

		bb = ByteBuffer.wrap(response, 8, response.length - 8);
		bb.order(ByteOrder.LITTLE_ENDIAN);

		SPITFPErrorCount obj = new SPITFPErrorCount();
		obj.errorCountAckChecksum = IPConnectionBase.unsignedInt(bb.getInt());
		obj.errorCountMessageChecksum = IPConnectionBase.unsignedInt(bb.getInt());
		obj.errorCountFrame = IPConnectionBase.unsignedInt(bb.getInt());
		obj.errorCountOverflow = IPConnectionBase.unsignedInt(bb.getInt());

		return obj;
	}

	/**
	 * Sets the bootloader mode and returns the status after the requested
	 * mode change was instigated.
	 * 
	 * You can change from bootloader mode to firmware mode and vice versa. A change
	 * from bootloader mode to firmware mode will only take place if the entry function,
	 * device identifier and CRC are present and correct.
	 * 
	 * This function is used by Brick Viewer during flashing. It should not be
	 * necessary to call it in a normal user program.
	 */
	public int setBootloaderMode(int mode) throws TinkerforgeException {
		checkValidity();

		ByteBuffer bb = ipcon.createRequestPacket((byte)9, FUNCTION_SET_BOOTLOADER_MODE, this);

		bb.put((byte)mode);

		byte[] response = sendRequest(bb.array(), 9);

		bb = ByteBuffer.wrap(response, 8, response.length - 8);
		bb.order(ByteOrder.LITTLE_ENDIAN);

		int status = IPConnectionBase.unsignedByte(bb.get());

		return status;
	}

	/**
	 * Returns the current bootloader mode, see {@link BrickletLoadCellV2#setBootloaderMode(int)}.
	 */
	public int getBootloaderMode() throws TinkerforgeException {
		checkValidity();

		ByteBuffer bb = ipcon.createRequestPacket((byte)8, FUNCTION_GET_BOOTLOADER_MODE, this);


		byte[] response = sendRequest(bb.array(), 9);

		bb = ByteBuffer.wrap(response, 8, response.length - 8);
		bb.order(ByteOrder.LITTLE_ENDIAN);

		int mode = IPConnectionBase.unsignedByte(bb.get());

		return mode;
	}

	/**
	 * Sets the firmware pointer for {@link BrickletLoadCellV2#writeFirmware(int[])}. The pointer has
	 * to be increased by chunks of size 64. The data is written to flash
	 * every 4 chunks (which equals to one page of size 256).
	 * 
	 * This function is used by Brick Viewer during flashing. It should not be
	 * necessary to call it in a normal user program.
	 */
	public void setWriteFirmwarePointer(long pointer) throws TinkerforgeException {
		checkValidity();

		ByteBuffer bb = ipcon.createRequestPacket((byte)12, FUNCTION_SET_WRITE_FIRMWARE_POINTER, this);

		bb.putInt((int)pointer);

		sendRequest(bb.array(), 0);
	}

	/**
	 * Writes 64 Bytes of firmware at the position as written by
	 * {@link BrickletLoadCellV2#setWriteFirmwarePointer(long)} before. The firmware is written
	 * to flash every 4 chunks.
	 * 
	 * You can only write firmware in bootloader mode.
	 * 
	 * This function is used by Brick Viewer during flashing. It should not be
	 * necessary to call it in a normal user program.
	 */
	public int writeFirmware(int[] data) throws TinkerforgeException {
		checkValidity();

		ByteBuffer bb = ipcon.createRequestPacket((byte)72, FUNCTION_WRITE_FIRMWARE, this);

		for (int i = 0; i < 64; i++) {
			bb.put((byte)data[i]);
		}

		byte[] response = sendRequest(bb.array(), 9);

		bb = ByteBuffer.wrap(response, 8, response.length - 8);
		bb.order(ByteOrder.LITTLE_ENDIAN);

		int status = IPConnectionBase.unsignedByte(bb.get());

		return status;
	}

	/**
	 * Sets the status LED configuration. By default the LED shows
	 * communication traffic between Brick and Bricklet, it flickers once
	 * for every 10 received data packets.
	 * 
	 * You can also turn the LED permanently on/off or show a heartbeat.
	 * 
	 * If the Bricklet is in bootloader mode, the LED is will show heartbeat by default.
	 */
	public void setStatusLEDConfig(int config) throws TinkerforgeException {
		checkValidity();

		ByteBuffer bb = ipcon.createRequestPacket((byte)9, FUNCTION_SET_STATUS_LED_CONFIG, this);

		bb.put((byte)config);

		sendRequest(bb.array(), 0);
	}

	/**
	 * Returns the configuration as set by {@link BrickletLoadCellV2#setStatusLEDConfig(int)}
	 */
	public int getStatusLEDConfig() throws TinkerforgeException {
		checkValidity();

		ByteBuffer bb = ipcon.createRequestPacket((byte)8, FUNCTION_GET_STATUS_LED_CONFIG, this);


		byte[] response = sendRequest(bb.array(), 9);

		bb = ByteBuffer.wrap(response, 8, response.length - 8);
		bb.order(ByteOrder.LITTLE_ENDIAN);

		int config = IPConnectionBase.unsignedByte(bb.get());

		return config;
	}

	/**
	 * Returns the temperature as measured inside the microcontroller. The
	 * value returned is not the ambient temperature!
	 * 
	 * The temperature is only proportional to the real temperature and it has bad
	 * accuracy. Practically it is only useful as an indicator for
	 * temperature changes.
	 */
	public int getChipTemperature() throws TinkerforgeException {
		checkValidity();

		ByteBuffer bb = ipcon.createRequestPacket((byte)8, FUNCTION_GET_CHIP_TEMPERATURE, this);


		byte[] response = sendRequest(bb.array(), 10);

		bb = ByteBuffer.wrap(response, 8, response.length - 8);
		bb.order(ByteOrder.LITTLE_ENDIAN);

		int temperature = (bb.getShort());

		return temperature;
	}

	/**
	 * Calling this function will reset the Bricklet. All configurations
	 * will be lost.
	 * 
	 * After a reset you have to create new device objects,
	 * calling functions on the existing ones will result in
	 * undefined behavior!
	 */
	public void reset() throws TinkerforgeException {
		checkValidity();

		ByteBuffer bb = ipcon.createRequestPacket((byte)8, FUNCTION_RESET, this);


		sendRequest(bb.array(), 0);
	}

	/**
	 * Writes a new UID into flash. If you want to set a new UID
	 * you have to decode the Base58 encoded UID string into an
	 * integer first.
	 * 
	 * We recommend that you use Brick Viewer to change the UID.
	 */
	public void writeUID(long uid) throws TinkerforgeException {
		checkValidity();

		ByteBuffer bb = ipcon.createRequestPacket((byte)12, FUNCTION_WRITE_UID, this);

		bb.putInt((int)uid);

		sendRequest(bb.array(), 0);
	}

	/**
	 * Returns the current UID as an integer. Encode as
	 * Base58 to get the usual string version.
	 */
	public long readUID() throws TinkerforgeException {
		checkValidity();

		ByteBuffer bb = ipcon.createRequestPacket((byte)8, FUNCTION_READ_UID, this);


		byte[] response = sendRequest(bb.array(), 12);

		bb = ByteBuffer.wrap(response, 8, response.length - 8);
		bb.order(ByteOrder.LITTLE_ENDIAN);

		long uid = IPConnectionBase.unsignedInt(bb.getInt());

		return uid;
	}

	/**
	 * Returns the UID, the UID where the Bricklet is connected to,
	 * the position, the hardware and firmware version as well as the
	 * device identifier.
	 * 
	 * The position can be 'a', 'b', 'c', 'd', 'e', 'f', 'g' or 'h' (Bricklet Port).
	 * The Raspberry Pi HAT (Zero) Brick is always at position 'i' and the Bricklet
	 * connected to an :ref:`Isolator Bricklet <isolator_bricklet>` is always as
	 * position 'z'.
	 * 
	 * The device identifier numbers can be found :ref:`here <device_identifier>`.
	 * |device_identifier_constant|
	 */
	public Identity getIdentity() throws TinkerforgeException {
		ByteBuffer bb = ipcon.createRequestPacket((byte)8, FUNCTION_GET_IDENTITY, this);


		byte[] response = sendRequest(bb.array(), 33);

		bb = ByteBuffer.wrap(response, 8, response.length - 8);
		bb.order(ByteOrder.LITTLE_ENDIAN);

		Identity obj = new Identity();
		obj.uid = IPConnectionBase.string(bb, 8);
		obj.connectedUid = IPConnectionBase.string(bb, 8);
		obj.position = (char)(bb.get());
		for (int i = 0; i < 3; i++) {
			obj.hardwareVersion[i] = IPConnectionBase.unsignedByte(bb.get());
		}
		for (int i = 0; i < 3; i++) {
			obj.firmwareVersion[i] = IPConnectionBase.unsignedByte(bb.get());
		}
		obj.deviceIdentifier = IPConnectionBase.unsignedShort(bb.getShort());

		return obj;
	}

	/**
	 * Adds a Weight listener.
	 */
	public void addWeightListener(WeightListener listener) {
		listenerWeight.add(listener);
	}

	/**
	 * Removes a Weight listener.
	 */
	public void removeWeightListener(WeightListener listener) {
		listenerWeight.remove(listener);
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy