package org.opennaas.extensions.router.model.opticalSwitch;
import java.util.ArrayList;
import java.util.List;
public class WDMChannelPlan extends FiberChannelPlan {
/**
* Light speed (m/s)
*/
private final double c = 299792458; // m/s
// Frequencies in THz
private double maxFreq;
private double minFreq;
private double guardInterval;
private ITUGrid ituGrid;
private List<FiberChannel> channels;
public WDMChannelPlan() {
channelType = ChannelType.WDM;
// use all ITU Grid by default
ituGrid = new ITUGrid();
maxFreq = ITUGrid.getInitialFreq();
minFreq = ITUGrid.getFinalFreq();
guardInterval = ITUGrid.getGuardInterval();
channels = generateChannels();
}
public WDMChannelPlan(double maxFreq, double minFreq, double guardInterval, ITUGrid ituGrid) {
channelType = ChannelType.WDM;
setMaxFreq(maxFreq);
setMinFreq(minFreq);
setGuardInterval(guardInterval);
setITUGrid(ituGrid);
channels = generateChannels();
}
public double getMaxFreq() {
return maxFreq;
}
private void setMaxFreq(double maxFreq) {
this.maxFreq = maxFreq;
}
public double getMinFreq() {
return minFreq;
}
private void setMinFreq(double minFreq) {
this.minFreq = minFreq;
}
public double getGuardInterval() {
return guardInterval;
}
private void setGuardInterval(double guardInterval) {
this.guardInterval = guardInterval;
}
private void setITUGrid(ITUGrid ituGrid) {
this.ituGrid = ituGrid;
}
public final ITUGrid getITUGrid() {
return ituGrid;
}
/**
*
* @param freq
* in THz
* @return channel number
*/
public int getChannelNumber(double freq) {
int channelNum = ituGrid.getChannelNumberFromFrequency(freq);
// FIXME
// if (! channelNumSupported(channelNum))
// throw new ChannelNotSupportedException();
return channelNum;
}
/**
*
* @param lambda
* @return
*/
public int getChannelNumberFromLambda(double lambda) {
double freq = getFrequency(lambda);
int channelNum = getChannelNumber(freq);
// FIXME
// if (! channelNumSupported(channelNum))
// throw new ChannelNotSupportedException();
return channelNum;
}
/**
*
* @param channelNum
* @return channel frequency in THz
*/
public double getFrequency(int channelNum) {
// FIXME
// if (! channelNumSupported(channelNum))
// throw new ChannelNotSupportedException();
return ituGrid.getFrequencyFromChannelNum(channelNum);
}
/**
*
* @param lambda
* (nm)
* @return channel frequency in THz
*/
private double getFrequency(double lambda) {
double freq = ituGrid.getFrequencyFromLambda(lambda);
// FIXME
// if (freq > getMaxFreq() || freq < getMinFreq()) {
// throw new ChannelNotSupportedException();
// }
return freq;
}
/**
*
* @param channelNum
* @return channel lambda (wavelength) in nm
*/
private double getLambda(int channelNum) {
// FIXME
// if (!channelNumSupported(channelNum)) {
// throw new ChannelNotSupportedException();
// }
double freq = getFrequency(channelNum);
return ituGrid.getLambdaFromFrequency(freq);
}
@Override
public int[] getAllChannelsNum() {
List<FiberChannel> channels = getAllChannels();
int[] channelNums = new int[channels.size()];
for (int i = 0; i < channelNums.length; i++) {
channelNums[i] = channels.get(i).getNumChannel();
}
return channelNums;
}
public FiberChannel getChannel(int channelNum) {
// FIXME
// if (!channelNumSupported(channelNum)) {
// throw new ChannelNotSupportedException();
// }
int index = (channelNum - getFirstChannel()) / getChannelGap();
// assumes channels is ordered
return channels.get(index);
}
@Override
public List<FiberChannel> getAllChannels() {
return channels;
}
@Override
public int getFirstChannel() {
return ituGrid.getChannelNumberFromFrequency(maxFreq);
}
@Override
public int getLastChannel() {
return ituGrid.getChannelNumberFromFrequency(minFreq);
}
@Override
public int getChannelGap() {
return (int) (getGuardInterval() / ituGrid.getGuardInterval());
}
private List<FiberChannel> generateChannels() {
// assure only 4 decimals are taken into account
// use operations wuth ints as doubles are not exact
long maxFreqRounded = Math.round(maxFreq * 10000);
long minFreqRounded = Math.round(minFreq * 10000);
long guardIntervalRounded = Math.round(guardInterval * 10000);
int numberOfChannels = (int) ((maxFreqRounded - minFreqRounded) / guardIntervalRounded);
List<FiberChannel> allChannels = new ArrayList<FiberChannel>(numberOfChannels);
int firstChannelNum = getFirstChannel();
int channelGap = getChannelGap();
for (int i = 0; i < numberOfChannels; i++) {
DWDMChannel channel = new DWDMChannel();
channel.setChannelNumber(firstChannelNum + i * channelGap);
channel.setLambda(getLambda(channel.getChannelNumber()));
allChannels.add(channel);
}
return allChannels;
}
// private int localNumToITUGridNum(int localChannelNum) {
//
// // FIXME
// // if (! channelNumSupported(localChannelNum))
// // throw new ChannelNotSupportedException();
//
// int local0 = ituGrid.getChannelNumberFromFrequency(maxFreq);
// return (int) (local0 + localChannelNum * guardInterval / ituGrid.getGuardInterval());
// }
//
// private int ituGridNumToLocalNum(int ituGridChannelNum) {
// int local0 = ituGrid.getChannelNumberFromFrequency(maxFreq);
// int localNum = (int) ((ituGridChannelNum - local0) / (guardInterval / ituGrid.getGuardInterval()));
//
// // FIXME
// // if (! channelNumSupported(localNum))
// // throw new ChannelNotSupportedException();
//
// return localNum;
// }
public boolean channelNumSupported(int channelNum) {
return (channelNum >= getFirstChannel() || channelNum <= getLastChannel());
}
}