package org.opennaas.extensions.roadm.wonesys.commandsets.commands.psroadm;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.opennaas.core.resources.command.CommandException;
import org.opennaas.core.resources.command.Response;
import org.opennaas.extensions.roadm.wonesys.commandsets.WonesysCommand;
import org.opennaas.extensions.roadm.wonesys.commandsets.WonesysResponse;
import org.opennaas.extensions.router.model.opticalSwitch.ITUGrid;
import org.opennaas.extensions.router.model.opticalSwitch.WDMChannelPlan;
import org.opennaas.extensions.router.model.opticalSwitch.dwdm.proteus.ProteusOpticalSwitch;
import org.opennaas.extensions.router.model.opticalSwitch.dwdm.proteus.cards.ProteusOpticalSwitchCard;
public class GetChannelPlan extends WonesysCommand {
private static final String COMMAND_ID = "0b03";
private static final String DATA_LENGTH = "0000";
private int chassis;
private int slot;
private String chassisHexStr;
private String slotHexStr;
Log log = LogFactory.getLog(GetChannelPlan.class);
public GetChannelPlan(int chassisNum, int slotNum) {
super();
this.chassis = chassisNum;
this.slot = slotNum;
this.chassisHexStr = toByteHexString(chassisNum, 1);
this.slotHexStr = toByteHexString(slotNum, 1);
}
@Override
public void parseResponse(Object response, Object model) throws CommandException {
if (!(model instanceof ProteusOpticalSwitch)) {
throw new IllegalArgumentException("Given model is not a ProteusOpticalSwitchCard. It is of type: " + model.getClass());
}
WonesysResponse commandResponse = (WonesysResponse) response;
if (commandResponse.getStatus().equals(Response.Status.ERROR)) {
if (commandResponse.getErrors().size() > 0)
throw new CommandException(commandResponse.getErrors().get(0));
else
throw new CommandException("Command Failed");
}
String responseData = commandResponse.getInformation();
// * Canal DWDM: 0-824 (Ver ITU_Grid_Planning.ods)
// ** Espaciado: 0x00: 100 GHz, 0x01: 50 GHz, 0x02: 25 GHz, 0x03: 12,5 GHz
String sfirstChannel = responseData.substring(0, 4);
sfirstChannel = convertLittleBigEndian(sfirstChannel);
String slastChannel = responseData.substring(4, 8);
slastChannel = convertLittleBigEndian(slastChannel);
String schannelGap = responseData.substring(8, 10);
int firstChannel = Integer.parseInt(sfirstChannel, 16);
int lastChannel = Integer.parseInt(slastChannel, 16);
double guardIntervalInv = Math.pow(2, Integer.parseInt(schannelGap, 16));
double guardInterval = (100 / (guardIntervalInv * 1000)); // THz
ITUGrid ituGrid = new ITUGrid();
double cardMaxFreq = ituGrid.getFrequencyFromChannelNum(firstChannel);
double cardMinFreq = ituGrid.getFrequencyFromChannelNum(lastChannel);
WDMChannelPlan cardChannelPlan = new WDMChannelPlan(cardMaxFreq, cardMinFreq, guardInterval, ituGrid);
ProteusOpticalSwitchCard card = ((ProteusOpticalSwitch) model).getCard(chassis, slot);
card.setChannelPlan(cardChannelPlan);
log.info("ChannelPlan loaded: Card supports " + cardChannelPlan.getAllChannels().size() + " channels\n" +
"First channel=" + cardChannelPlan.getFirstChannel() + " LastChannel=" + cardChannelPlan.getLastChannel() + " ChannelGap=" + cardChannelPlan
.getChannelGap());
}
@Override
protected String getWonesysCommandDeviceId() {
return chassisHexStr + slotHexStr;
}
@Override
protected String getWonesysCommandId() {
return COMMAND_ID;
}
@Override
protected String getWonesysCommandRequiredDataLength() {
return DATA_LENGTH;
}
@Override
protected String getWonesysCommandData() {
return "";
}
}