package klik.server.x10;
import java.util.ArrayList;
import java.util.List;
import klik.server.Process;
import klik.server.data.DataManager;
import klik.server.data.X10Unit;
import klik.shared.constants.X10.Function;
import klik.shared.constants.X10.State;
import klik.shared.model.UnitEventDto;
import klik.shared.model.UnitStatusDto;
import org.apache.commons.logging.Log;
import com.google.inject.Inject;
public class X10UnitEventHandler {
@Inject
private static Log logger;
public static ArrayList<UnitStatusDto> handleEvent(UnitEventDto event) {
int value = Math.abs(event.getValue());
logger.info("send event "+event.getAddress()+" "+event.getFunction()+(value != 0 ? " "+value : ""));
Process.sendCommand(event.getFunction(), event.getAddress(), value);
return handleEvent(event.getFunction(), event.getAddress(), event.getValue(), true);
}
/**
* Also used by TJX10P UnitListener.
* @param function
* @param address
* @param value
* @return
*/
public static ArrayList<UnitStatusDto> handleEvent(Function function, String address, int value, boolean relative) {
logger.info("handleEvent "+address+" "+function+(value != 0 ? " "+value : ""));
List<X10Unit> list = null;
switch (function) {
case ALL_LIGHTS_OFF:
case ALL_LIGHTS_ON:
case ALL_UNITS_OFF:
list = DataManager.getUnitsWithHouseCode(address.toCharArray()[0]);
break;
default:
list = DataManager.getUnitsWithAddress(address);
}
ArrayList<UnitStatusDto> returnList =
new ArrayList<UnitStatusDto>(list == null ? 0 : list.size());
if (list != null) {
for (X10Unit unit : list) {
unit = handleFunction(function, unit, value, relative);
DataManager.updateUnit(unit);
returnList.add(new UnitStatusDto(unit.getId(),
unit.getType(),
unit.getAddress(),
unit.getState(),
unit.getName(),
unit.getValue()));
}
}
logger.debug("list size "+returnList.size());
return returnList;
}
private static X10Unit handleFunction(Function function, X10Unit unit, int value, boolean relative) {
State state = null;
switch (function) {
case ON:
if (!unit.getState().equals(State.DIM)) {
state = State.ON;
value = 100;
}
break;
case BRIGHT:
if (unit.getValue() == 0) {
value = 100;
state = State.ON;
break;
}
case DIM:
state = State.DIM;
if (relative) {
value = unit.getValue() + value;
}
if (value >= 0) {
if (value >= 100) {
value = 100;
state = State.ON;
}
break;
} else {
state = State.OFF;
value = 0;
}
case OFF:
default:
state = State.OFF;
value = 0;
}
unit.setState(state);
unit.setValue(value);
return unit;
}
}