package de.ctdo.bunti.model; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import de.ctdo.bunti.dmx.*; public abstract class BuntiDMXDevice extends BuntiDevice { private int startAddress; private long lastSendOut; private DMXChannels dmxChannels = new DMXChannels(); public BuntiDMXDevice(int deviceId, int startAddress, String name) { super(deviceId,name); this.startAddress = startAddress; } public final long getLastSendOut() { return lastSendOut; } public final void setSendOutNow() { this.lastSendOut = System.currentTimeMillis(); } public final int getStartAddress() { return startAddress; } public final void setStartAddress(int startAddress) { this.startAddress = startAddress; } /** * Set channel value by given channel name. * @param name The channel name to change the value. * @param value The channel value to set. */ protected final void setChannelValueByName(String name, int value) { DMXChannel dx = dmxChannels.getChannelByName(name); if(dx != null) { dx.setValue(DMX.sanitizeDMXValue(value)); } lastChangedNow(); } /** * Returns the channel value identified by channel name. * @param name The channel name to get the value from. * @return The desired channel value. */ protected final int getChannelValueByName(String name) { DMXChannel dx = dmxChannels.getChannelByName(name); if(dx != null) { return dx.getValue(); } return 0; } // /** // * Merge the DMX values from this device into a global DMX512 Data Array. // * @param dmxData DMX512 Data array to merge the local values into. // * @return True on success, false otherwise. // */ // public boolean mergeDMXData(int[] dmxData) { // // if(dmxData == null || dmxData.length == 0) { // return false; // } // // for (DMXChannel channel : dmxChannels.getAllChannels()) { // int index = channel.getOffset() + (startAddress - DMX.DMX_STARTADDRESS_OFFSET); // // if(index >= 0 && index < dmxData.length){ // dmxData[index] = channel.getValue(); // } else { // return false; // } // } // // return true; // } // // /** // * Merge the DMX values from this device into a global DMX512 Data Array. // * @param dmxData DMX512 Data to merge the local values into. // * @return True on success, false otherwise. // */ // public boolean mergeDMXData(Map dmxData) { // // if(dmxData == null || dmxData.size() == 0) { // return false; // } // // for (DMXChannel channel : dmxChannels.getAllChannels()) { // int index = channel.getOffset() + (startAddress - DMX.DMX_STARTADDRESS_OFFSET); // // if(index >= DMX.DMX_CHANNELS_MIN && index <= DMX.DMX_CHANNELS_MAX){ // dmxData.put(index, channel.getValue()); // } else { // return false; // } // } // // return true; // } public Map getChannelData() { Map map = new HashMap(); for (DMXChannel channel : dmxChannels.getAllChannels()) { int index = channel.getOffset() + startAddress + DMX.DMX_STARTADDRESS_OFFSET; if(index >= DMX.DMX_CHANNELS_MIN && index <= DMX.DMX_CHANNELS_MAX){ map.put(index, channel.getValue()); } } return map; } @Override public final boolean setValuesFromOptions(Map options) { for (Entry opt : options.entrySet()) { DMXChannel channel = dmxChannels.getChannelByName(opt.getKey()); if(channel != null) { try { int value = Integer.parseInt(opt.getValue().toString()); setChannelValueByName(channel.getName(), value); } catch (Exception e) { return false; } } } return true; } public final boolean addChannel(DMXChannel channel){ return dmxChannels.addChannel(channel); } @Override public String toString() { return "BuntiDMXDevice " + getDeviceId() + ", " + getDeviceName(); } }