}
String[] values = sentence.split(",");
// Parse data
Position position = new Position();
ExtendedInfoFormatter extendedInfo = new ExtendedInfoFormatter(getProtocol());
for (int formatIndex = 0, valueIndex = 1; formatIndex < format.length() && valueIndex < values.length; formatIndex++) {
String value = values[valueIndex];
switch(format.charAt(formatIndex)) {
case 'S':
try {
position.setDeviceId(getDataManager().getDeviceByImei(value).getId());
} catch(Exception error) {
Log.warning("Unknown device - " + value);
return null;
}
break;
case 'A':
if (value.isEmpty()) {
position.setValid(false);
} else {
position.setValid(Integer.valueOf(value) != 1);
}
break;
case 'B':
Calendar time = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
time.clear();
time.set(Calendar.DAY_OF_MONTH, Integer.valueOf(value.substring(0, 2)));
time.set(Calendar.MONTH, Integer.valueOf(value.substring(2, 4)) - 1);
time.set(Calendar.YEAR, 2000 + Integer.valueOf(value.substring(4)));
value = values[++valueIndex];
time.set(Calendar.HOUR_OF_DAY, Integer.valueOf(value.substring(0, 2)));
time.set(Calendar.MINUTE, Integer.valueOf(value.substring(2, 4)));
time.set(Calendar.SECOND, Integer.valueOf(value.substring(4)));
position.setTime(time.getTime());
break;
case 'C':
valueIndex += 1;
break;
case '1':
double longitude = Double.valueOf(value.substring(1));
if (value.charAt(0) == 'W') longitude = -longitude;
position.setLongitude(longitude);
break;
case '2':
longitude = Double.valueOf(value.substring(4)) / 60;
longitude += Integer.valueOf(value.substring(1, 4));
if (value.charAt(0) == 'W') longitude = -longitude;
position.setLongitude(longitude);
break;
case '3':
position.setLongitude(Double.valueOf(value) * 0.000001);
break;
case '6':
double latitude = Double.valueOf(value.substring(1));
if (value.charAt(0) == 'S') latitude = -latitude;
position.setLatitude(latitude);
break;
case '7':
latitude = Double.valueOf(value.substring(3)) / 60;
latitude += Integer.valueOf(value.substring(1, 3));
if (value.charAt(0) == 'S') latitude = -latitude;
position.setLatitude(latitude);
break;
case '8':
position.setLatitude(Double.valueOf(value) * 0.000001);
break;
case 'G':
position.setAltitude(Double.valueOf(value));
break;
case 'H':
position.setSpeed(Double.valueOf(value));
break;
case 'I':
position.setSpeed(Double.valueOf(value) * 0.539957);
break;
case 'J':
position.setSpeed(Double.valueOf(value) * 0.868976);
break;
case 'K':
position.setCourse(Double.valueOf(value));
break;
case 'N':
extendedInfo.set("battery", Double.valueOf(value));
break;
default:
// Unsupported
break;
}
valueIndex += 1;
}
position.setExtendedInfo(extendedInfo.toString());
return position;
}