package de.uniluebeck.itm.wsn.drivers.trisos;
import com.google.common.util.concurrent.TimeLimiter;
import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted;
import de.uniluebeck.itm.wsn.drivers.core.operation.OperationListener;
import de.uniluebeck.itm.wsn.drivers.core.operation.ResetOperation;
import de.uniluebeck.itm.wsn.drivers.core.operation.TimeLimitedOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.annotation.Nullable;
import java.io.BufferedReader;
import java.io.InputStreamReader;
/**
* TriSOS operation for resetting the TriSOS node.
*
* @author Torsten Teubler
*/
public class TriSOSResetOperation extends TimeLimitedOperation<Void> implements ResetOperation {
private final TriSOSConfiguration configuration;
private static final Logger log = LoggerFactory.getLogger(TriSOSProgramOperation.class);
@Inject
public TriSOSResetOperation(final TimeLimiter timeLimiter,
@Assisted final long timeoutMillis,
@Assisted @Nullable final OperationListener<Void> voidOperationListener,
final TriSOSConfiguration configuration) {
super(timeLimiter, timeoutMillis, voidOperationListener);
this.configuration = configuration;
}
@Override
protected Void callInternal() throws Exception {
// fetch reset command string
String resetCommand = configuration.getResetCommandString();
System.out.println("Execute: " + resetCommand);
Process p = Runtime.getRuntime().exec(resetCommand);
BufferedReader readerInputStream = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedReader readerOutputStream = new BufferedReader(new InputStreamReader(p.getErrorStream()));
String line;
progress(0f);
while ((line = readerInputStream.readLine()) != null) {
log.trace(configuration.getProgramExe() + ": " + line);
}
readerInputStream.close();
while ((line = readerOutputStream.readLine()) != null) {
log.trace(configuration.getProgramExe() + ": " + line);
}
readerOutputStream.close();
// wait for process to finish ...
p.waitFor();
p.destroy();
progress(1f);
return null;
}
}