package org.yamcs.tctm;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import org.slf4j.Logger;
import org.yamcs.ConfigurationException;
import org.yamcs.YConfiguration;
import org.yamcs.YamcsServer;
import org.yamcs.archive.PacketWithTime;
import org.yamcs.time.TimeService;
import org.yamcs.utils.LoggingUtils;
import com.google.common.util.concurrent.AbstractExecutionThreadService;
/**
* Reads telemetry files from the directory yamcs.incomingDir/tm
*
*/
public class FilePollingTmDataLink extends AbstractExecutionThreadService implements TmPacketDataLink {
final String incomingDir;
final private Logger log;
volatile boolean disabled;
TmSink tmSink;
volatile long tmCount=0;
final TimeService timeService;
public FilePollingTmDataLink(String yamcsInstance, String name, String incomingDir) {
log = LoggingUtils.getLogger(this.getClass(), yamcsInstance);
this.incomingDir = incomingDir;
this.timeService = YamcsServer.getTimeService(yamcsInstance);
}
/**
* used when no spec is specified, the incomingDir is based on the property with the same name from the yamcs.yaml
* @param archiveInstance
* @throws ConfigurationException
*/
public FilePollingTmDataLink(String archiveInstance, String name) throws ConfigurationException {
this(archiveInstance, name, YConfiguration.getConfiguration("yamcs").getString("incomingDir")
+File.separator+archiveInstance+File.separator+"tm");
}
@Override
public void run() {
File fdir=new File(incomingDir);
try {
while(isRunning()) {
if(!disabled && fdir.exists()) {
File[] files=fdir.listFiles();
Arrays.sort(files);
for(File f:files) {
log.info("Injecting the content of {}", f);
try {
TmFileReader prov=getTmFileReader(f.getAbsolutePath());
PacketWithTime pwrt;
while((pwrt=prov.readPacket(timeService.getMissionTime()))!=null) {
tmSink.processPacket(pwrt);
tmCount++;
}
} catch (IOException e) {
log.warn("Got IOException while reading from "+f+": ", e);
}
if(!f.delete()) {
log.warn("Could not remove {}", f);
}
}
}
Thread.sleep(10000);
}
} catch(InterruptedException e) {
log.debug("Interrupted", e);
Thread.currentThread().interrupt();
}
}
public TmFileReader getTmFileReader(String fileName) throws IOException {
return new TmFileReader(fileName);
}
@Override
public String getDetailedStatus() {
return "reading files from "+incomingDir;
}
@Override
public void disable() {
disabled=true;
}
@Override
public void enable() {
disabled=false;
}
@Override
public boolean isDisabled() {
return disabled;
}
@Override
public String getLinkStatus() {
if (disabled) {
return "DISABLED";
}
if(isRunning()) {
return "OK";
} else {
return "UNAVAIL";
}
}
@Override
public void setTmSink(TmSink tmSink) {
this.tmSink=tmSink;
}
@Override
public long getDataCount() {
return tmCount;
}
}