package com.integreight.onesheeld.shields.controller;
import android.app.Activity;
import com.integreight.onesheeld.sdk.ShieldFrame;
import com.integreight.onesheeld.enums.UIShield;
import com.integreight.onesheeld.shields.ControllerParent;
import com.integreight.onesheeld.utils.Log;
public class LcdShield extends ControllerParent<LcdShield> {
private LcdEventHandler eventHandler;
// private Activity activity;
public int rows = 2;
public int columns = 16;
public char[] chars;
public int currIndx = 0;
// Method ids
private static final byte PRINT = (byte) 0x11;
private static final byte BEGIN = (byte) 0x01;
private static final byte CLEAR = (byte) 0x02;
private static final byte HOME = (byte) 0x03;
// private static final byte NO_DISPLAY = (byte) 0x05;
// private static final byte DISPLAY = (byte) 0x06;
private static final byte NO_BLINK = (byte) 0x04;
private static final byte BLINK = (byte) 0x05;
private static final byte NO_CURSOR = (byte) 0x06;
private static final byte CURSOR = (byte) 0x07;
private static final byte SCROLL_DISPLAY_LEFT = (byte) 0x08;
private static final byte SCROLL_DISPLAY_RIGHT = (byte) 0x09;
private static final byte LEFT_TO_RIGHT = (byte) 0x0A;
private static final byte RIGHT_TO_LEFT = (byte) 0x0B;
// private static final byte CREATE_CHAR = (byte) 0x0F;
private static final byte SET_CURSOR = (byte) 0x0E;
private static final byte WRITE = (byte) 0x0F;
private static final byte AUTO_SCROLL = (byte) 0x0C;
private static final byte NO_AUTO_SCROLL = (byte) 0x0D;
public int lastScrollLeft = 0;
public boolean isBlinking = false, isCursoring = false;
private boolean isAutoScroll = false;
private boolean isLeftToRight = true;
public LcdShield() {
super();
}
public LcdShield(Activity activity, String tag) {
super(activity, tag);
setChars(new char[rows * columns]);
}
@Override
public ControllerParent<LcdShield> init(String tag) {
setChars(new char[columns * rows]);
return super.init(tag);
}
public void setLcdEventHandler(LcdEventHandler eventHandler) {
this.eventHandler = eventHandler;
}
public void write(char ch) {
if (currIndx > -1 && currIndx < chars.length) {
// if (isLeftToRight) {
if (!isAutoScroll) {
chars[currIndx] = ch;
changeCursor(isLeftToRight ? currIndx + 1 : currIndx - 1);
} else {
final char[] tmp = chars;
for (int i = 0; i < currIndx; i++) {
if (i + 1 < tmp.length && i + 1 > -1)
chars[i] = tmp[i + 1];
}
if (currIndx - 1 > -1 && currIndx - 1 < chars.length)
chars[currIndx - 1] = ch;
}
}
}
public void changeCursor(int indx) {
if (!isAutoScroll && indx > -1 && indx < rows * columns) {
if (eventHandler != null) {
eventHandler.noBlink();
eventHandler.noCursor();
}
currIndx = indx;
}
}
public synchronized void scrollDisplayLeft() {
lastScrollLeft = 1;
char[] tmp = new char[chars.length];
for (int i = 0; i < tmp.length; i++) {
if (i + lastScrollLeft > -1 && i + lastScrollLeft < chars.length) {
tmp[i] = chars[i + lastScrollLeft];
}
}
if (eventHandler != null)
eventHandler.noBlink();
changeCursor(currIndx - 1);
chars = tmp;
if (eventHandler != null) {
eventHandler.updateLCD(chars);
if (isBlinking)
eventHandler.blink();
}
Log.d("LCD", (">>>>>>> Left " + lastScrollLeft));
}
public synchronized void scrollDisplayRight() {
lastScrollLeft = -1;
char[] tmp = new char[chars.length];
for (int i = 0; i < tmp.length; i++) {
if (i + lastScrollLeft > -1 && i + lastScrollLeft < chars.length) {
tmp[i] = chars[i + lastScrollLeft];
}
}
if (eventHandler != null)
eventHandler.noBlink();
changeCursor(currIndx + 1);
chars = tmp;
if (eventHandler != null) {
eventHandler.updateLCD(chars);
if (isBlinking)
eventHandler.blink();
}
Log.d("LCD", (">>>>>>> Right " + lastScrollLeft));
}
public static interface LcdEventHandler {
public void updateLCD(char[] arrayToUpdate);
public void blink();
public void noBlink();
public void cursor();
public void noCursor();
}
private void processInput(ShieldFrame frame) {
switch (frame.getFunctionId()) {
case CLEAR:
if (eventHandler != null) {
eventHandler.noBlink();
eventHandler.noCursor();
}
lastScrollLeft = 0;
chars = new char[columns * rows];
if (eventHandler != null)
eventHandler.updateLCD(chars);
changeCursor(0);
if (isBlinking && eventHandler != null)
eventHandler.blink();
if (isCursoring && eventHandler != null)
eventHandler.cursor();
break;
case HOME:
if (eventHandler != null)
eventHandler.noBlink();
if (eventHandler != null)
eventHandler.noCursor();
changeCursor(0);
if (isBlinking && eventHandler != null)
eventHandler.blink();
if (isCursoring && eventHandler != null)
eventHandler.cursor();
break;
case BLINK:
if (eventHandler != null)
eventHandler.blink();
isBlinking = true;
break;
case NO_BLINK:
if (eventHandler != null)
eventHandler.noBlink();
isBlinking = false;
break;
case SCROLL_DISPLAY_LEFT:
scrollDisplayLeft();
break;
case SCROLL_DISPLAY_RIGHT:
scrollDisplayRight();
break;
case BEGIN:
break;
case SET_CURSOR:
if (eventHandler != null) {
eventHandler.noBlink();
eventHandler.noCursor();
}
int row = (int) frame.getArgument(0)[0];
int col = (int) frame.getArgument(1)[0];
changeCursor((row * columns) + col);
if (isBlinking && eventHandler != null)
eventHandler.blink();
if (isCursoring && eventHandler != null)
eventHandler.cursor();
break;
case WRITE:
write(frame.getArgumentAsString(0).charAt(0));
if (eventHandler != null) {
eventHandler.updateLCD(chars);
if (isBlinking)
eventHandler.blink();
if (isCursoring)
eventHandler.cursor();
}
break;
case PRINT:
lastScrollLeft = 0;
if (eventHandler != null) {
eventHandler.noBlink();
eventHandler.noCursor();
}
lastScrollLeft = 0;
String txt = frame.getArgumentAsString(0);
for (int i = 0; i < txt.length(); i++) {
write(txt.charAt(i));
}
if (eventHandler != null) {
eventHandler.updateLCD(chars);
if (isBlinking)
eventHandler.blink();
if (isCursoring)
eventHandler.cursor();
}
break;
case CURSOR:
if (eventHandler != null)
eventHandler.cursor();
isCursoring = true;
break;
case NO_CURSOR:
if (eventHandler != null)
eventHandler.noCursor();
isCursoring = false;
break;
case AUTO_SCROLL:
isAutoScroll = true;
break;
case NO_AUTO_SCROLL:
isAutoScroll = false;
break;
case LEFT_TO_RIGHT:
isLeftToRight = true;
break;
case RIGHT_TO_LEFT:
isLeftToRight = false;
break;
default:
break;
}
}
@Override
public void onNewShieldFrameReceived(ShieldFrame frame) {
if (frame.getShieldId() == UIShield.LCD_SHIELD.getId())
processInput(frame);
}
@Override
public void reset() {
// TODO Auto-generated method stub
}
public void setChars(char[] chars) {
this.chars = chars;
}
}