package org.yamcs.web.websocket;
import java.io.IOException;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.yamcs.protobuf.SchemaYamcs;
import org.yamcs.protobuf.Web.WebSocketServerMessage.WebSocketReplyData;
import org.yamcs.protobuf.Yamcs.ProtoDataType;
import org.yamcs.protobuf.Yamcs.TimeInfo;
import org.yamcs.utils.TimeEncoding;
public class TimeResource extends AbstractWebSocketResource {
private static final Logger log = LoggerFactory.getLogger(TimeResource.class);
public static final String RESOURCE_NAME = "time";
public static final String OP_subscribe = "subscribe";
private static ScheduledThreadPoolExecutor timer = new ScheduledThreadPoolExecutor(1);
private ScheduledFuture<?> future = null;
public TimeResource(WebSocketProcessorClient client) {
super(client);
}
@Override
public WebSocketReplyData processRequest(WebSocketDecodeContext ctx, WebSocketDecoder decoder) throws WebSocketException {
switch (ctx.getOperation()) {
case OP_subscribe:
return processSubscribeRequest(ctx, decoder);
default:
throw new WebSocketException(ctx.getRequestId(), "Unsupported operation '" + ctx.getOperation() + "'");
}
}
private WebSocketReplyData processSubscribeRequest(WebSocketDecodeContext ctx, WebSocketDecoder decoder) throws WebSocketException {
future = timer.scheduleAtFixedRate(() -> {
try {
long currentTime = processor.getCurrentTime();
TimeInfo ti = TimeInfo.newBuilder().setCurrentTime(currentTime).setCurrentTimeUTC(TimeEncoding.toString(currentTime)).build();
wsHandler.sendData(ProtoDataType.TIME_INFO, ti, SchemaYamcs.TimeInfo.WRITE);
} catch (IOException e) {
log.debug("Could not send time info data", e);
}
}, 1, 1, TimeUnit.SECONDS);
return toAckReply(ctx.getRequestId());
}
@Override
public void quit() {
if(future!=null) {
future.cancel(false);
}
}
}