Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
missingOldImpl.DisplayLcd20x4 Maven / Gradle / Ivy
package berlin.yuna.tinkerforgesensor.model.missing;
import berlin.yuna.tinkerforgesensor.model.exception.NetworkConnectionException;
import berlin.yuna.tinkerforgesensor.model.sensor.Sensor;
import berlin.yuna.tinkerforgesensor.model.ValueType;
import com.tinkerforge.BrickletLCD20x4;
import com.tinkerforge.Device;
import com.tinkerforge.TinkerforgeException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import static berlin.yuna.tinkerforgesensor.model.LedStatusType.LED_OFF;
import static berlin.yuna.tinkerforgesensor.model.LedStatusType.LED_ON;
import static berlin.yuna.tinkerforgesensor.model.LedStatusType.LED_NONE;
import static berlin.yuna.tinkerforgesensor.model.ValueType.BUTTON;
import static berlin.yuna.tinkerforgesensor.model.ValueType.BUTTON_PRESSED;
import static berlin.yuna.tinkerforgesensor.model.ValueType.BUTTON_RELEASED;
import static berlin.yuna.tinkerforgesensor.model.ValueType.DEVICE_TIMEOUT;
import static berlin.yuna.tinkerforgesensor.util.StringUtils.spaces;
import static berlin.yuna.tinkerforgesensor.util.StringUtils.utf16ToKS0066U;
import static java.util.Arrays.asList;
/**
* {@link DisplayLcd20x4}
* 20x4 character alphanumeric display with blue backlight
*
* Values
*
* {@link ValueType#BUTTON_PRESSED} [1] = Pressed
* {@link ValueType#BUTTON_RELEASED} [0] = Released
* {@link ValueType#BUTTON} [0/1,0/1,0/1,0/1] = 4x Button Released/Pressed
*
* Technical Info
*
* Clear display
* sensor.send(true);
* Send text
* sensor.send("Howdy");
* Send text centered
* sensor.send("Line1 center", true);
* Send text centered on row 2
* sensor.send("Line2 center", true, 1);
* Send text on position 5 and row 3
* sensor.send("Line3 posX=5", 4, 2);
* Send text with dynamic spaces between)
* sensor.send("H ${s} O ${s} W ${s} D ${s} Y");
* Display ON
* sensor.ledAdditional_setOn;
* Getting button state from second button (0=Released, 1= pressed)
* sensor.values().button(1);
* Getting button state list of 0/1 (0=Released, 1= pressed) value for each button
* sensor.values().button_List();
* Getting button pressed
* sensor.values().buttonPressed();
*/
public class DisplayLcd20x4 extends Sensor {
public static final String DYNAMIC_SPACE = "${s}";
public static final int COLUMN_LIMIT = 20;
final Integer[] buttons = {0, 0, 0, 0};
private static final String SPLIT_LINE = System.lineSeparator();
// private final String[] cachedRows = new String[]{"", "", "", ""};
public DisplayLcd20x4(final Device device, final String uid) throws NetworkConnectionException {
super((BrickletLCD20x4) device, uid);
}
@Override
protected Sensor initListener() {
device.addButtonPressedListener(value -> {
buttons[value] = 1;
sendEvent(BUTTON_PRESSED, 1, true);
sendEvent(BUTTON, asList(buttons), true);
});
device.addButtonReleasedListener(value -> {
buttons[value] = 0;
sendEvent(BUTTON_RELEASED, 0, true);
sendEvent(BUTTON, asList(buttons), true);
});
return this;
}
@Override
public Sensor send(final Object... values) {
final List> items = new ArrayList<>();
List item = new ArrayList<>();
for (Object value : values) {
if (value instanceof String && !item.isEmpty()) {
items.add(item);
item = new ArrayList<>();
}
item.add(value);
}
items.add(item);
items.stream().filter(i -> !i.isEmpty()).forEach(this::send);
return this;
}
public void send(final List values) {
if (values.get(0) instanceof Boolean) {
clearDisplay();
return;
}
//[0] == text
final String text = (String) values.get(0);
int posX = 0;
int posY = 0;
boolean center = false;
//[1] == Number(X)/Boolean(Center)
if (values.size() > 1 && values.get(1) instanceof Boolean) {
posX = 0;
center = true;
} else if (values.size() > 1 && values.get(1) instanceof Number) {
posX = ((Number) values.get(1)).intValue();
center = false;
}
//[2] == Number(Y)
if (values.size() > 2 && values.get(2) instanceof Number) {
posY = ((Number) values.get(2)).intValue();
}
//TODO: validate positions
if (text != null && !text.trim().isEmpty()) {
writeLines(posX, posY, text, center);
}
}
@Override
public Sensor send(final Object value) {
return send(new Object[]{value});
}
@Override
public Sensor setLedStatus(final Integer value) {
return this;
}
@Override
public Sensor ledAdditional(final Integer value) {
if (ledAdditional.bit == value) return this;
try {
if (value == LED_ON.bit) {
ledAdditional = LED_ON;
device.backlightOn();
} else if (value == LED_OFF.bit) {
ledAdditional = LED_OFF;
device.backlightOff();
}
} catch (TinkerforgeException ignored) {
sendEvent(DEVICE_TIMEOUT, 404L);
}
return this;
}
@Override
public Sensor flashLed() {
try {
this.ledAdditional_setOn();
for (int i = 0; i < 7; i++) {
send("H ${s} O ${s} W ${s} D ${s} Y [" + i + "]");
send(DYNAMIC_SPACE + UUID.randomUUID() + DYNAMIC_SPACE, 0, 1);
Thread.sleep(128);
}
send(true);
this.ledAdditional_setOff();
} catch (Exception ignore) {
}
return this;
}
@Override
public Sensor refreshPeriod(final int milliseconds) {
return this;
}
@Override
public Sensor initLedConfig() {
ledStatus = LED_NONE;
ledAdditional = LED_OFF;
return this;
}
private Sensor clearDisplay() {
try {
device.clearDisplay();
} catch (TinkerforgeException e) {
sendEvent(DEVICE_TIMEOUT, 404L);
}
return this;
}
private void writeLines(final int posX, final int posY, final String text, final boolean center) {
int y = posY;
final String[] lines = text.split(SPLIT_LINE);
String leftOverText = "";
for (String line : lines) {
line += leftOverText;
line = spaceUp(line);
leftOverText = "";
if (line.length() > COLUMN_LIMIT) {
leftOverText = line.substring(COLUMN_LIMIT);
line = line.substring(0, COLUMN_LIMIT);
} else if (center) {
line = centerLine(line);
}
sendToDisplay((short) posX, (short) y, utf16ToKS0066U(line));
y++;
}
if (!leftOverText.isEmpty()) {
writeLines(posX, y, leftOverText, center);
}
}
private String centerLine(final String line) {
final StringBuilder stringBuilder = new StringBuilder(line);
final int spaces = (COLUMN_LIMIT - line.length()) / 2;
for (int i = 0; i < spaces && line.length() < COLUMN_LIMIT; i++) {
stringBuilder.insert(0, " ");
}
for (int i = 0; i < spaces && line.length() < COLUMN_LIMIT; i++) {
stringBuilder.append(" ");
}
return stringBuilder.toString();
}
private void sendToDisplay(final short x, final short y, final String line) {
try {
// if (!line.equals(cachedRows[y])) {
// cachedRows[y] = line;
device.writeLine(y, x, line);
// }
} catch (TinkerforgeException e) {
sendEvent(DEVICE_TIMEOUT, 404L);
}
}
private static String spaceUp(final String line) {
String text = line;
if (text.contains(DYNAMIC_SPACE)) {
int spaceUps;
while ((spaceUps = ("splitStart" + text + "splitEnd").split("\\$\\{s}").length - 1) > 0) {
final int length = text.length() - ((DYNAMIC_SPACE).length() * spaceUps);
text = text.replaceFirst("\\$\\{s}", spaces((COLUMN_LIMIT - length) / spaceUps));
}
}
return text;
}
}