package com.dronecontrol.socketcontrol.input;
import com.dronecontrol.droneapi.data.NavData;
import com.dronecontrol.droneapi.listeners.NavDataListener;
import com.dronecontrol.socketcontrol.input.data.DroneData;
import com.dronecontrol.socketcontrol.input.socket.SocketClient;
import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.map.ObjectMapper;
import javax.inject.Inject;
import java.io.IOException;
import java.io.StringWriter;
public class SocketDataSender implements NavDataListener
{
private static final float HEIGHT_THRESHOLD = 0.25f;
private final SocketClient socketClient;
private final JsonFactory jsonFactory;
private final ObjectMapper objectMapper;
@Inject
public SocketDataSender(SocketClient socketClient, JsonFactory jsonFactory, ObjectMapper objectMapper)
{
this.socketClient = socketClient;
this.jsonFactory = jsonFactory;
this.objectMapper = objectMapper;
}
@Override
public void onNavData(NavData navData)
{
send(getDroneData(navData));
}
private DroneData getDroneData(NavData navData)
{
boolean flying = navData.getState().isFlying();
float currentHeight = getCurrentHeight(navData);
return new DroneData(flying, currentHeight);
}
private float getCurrentHeight(NavData navData)
{
return (navData.getAltitude() < HEIGHT_THRESHOLD ? 0.0f : navData.getAltitude());
}
private void send(DroneData droneData)
{
try
{
send(getSerializedJsonText(droneData));
} catch (IOException e)
{
throw new IllegalStateException("Error writing drone data", e);
}
}
private void send(String serializedJsonText)
{
if (socketClient.isConnected())
{
socketClient.send(serializedJsonText);
}
}
private String getSerializedJsonText(DroneData droneData) throws IOException
{
StringWriter stringWriter = new StringWriter();
JsonGenerator jsonGenerator = jsonFactory.createJsonGenerator(stringWriter);
objectMapper.writeValue(jsonGenerator, droneData);
return stringWriter.toString();
}
}