commandType == 2 &&
messageType == 1 &&
checkBit(mask, 0)) {
// Create new position
Position position = new Position();
ExtendedInfoFormatter extendedInfo = new ExtendedInfoFormatter(getProtocol());
// Status code
if (checkBit(mask, 1)) {
extendedInfo.set("status", buf.readUnsignedInt());
}
// Device id
String id = null;
if (checkBit(mask, 23)) {
id = buf.toString(buf.readerIndex(), 8, Charset.defaultCharset()).trim();
buf.skipBytes(8);
} else if (checkBit(mask, 2)) {
id = buf.toString(buf.readerIndex(), 22, Charset.defaultCharset()).trim();
buf.skipBytes(22);
} else {
Log.warning("No device id field");
return null;
}
try {
position.setDeviceId(getDataManager().getDeviceByImei(id).getId());
} catch(Exception error) {
Log.warning("Unknown device - " + id);
return null;
}
// IO data
if (checkBit(mask, 3)) {
buf.readUnsignedShort();
}
// ADC 1
if (checkBit(mask, 4)) {
buf.readUnsignedShort();
}
// ADC 2
if (checkBit(mask, 5)) {
buf.readUnsignedShort();
}
// Function category
if (checkBit(mask, 7)) {
buf.readUnsignedByte();
}
Calendar time = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
time.clear();
// Date
if (checkBit(mask, 8)) {
time.set(Calendar.DAY_OF_MONTH, buf.readUnsignedByte());
time.set(Calendar.MONTH, buf.readUnsignedByte() - 1);
time.set(Calendar.YEAR, 2000 + buf.readUnsignedByte());
}
// GPS status
if (checkBit(mask, 9)) {
position.setValid(buf.readUnsignedByte() == 1);
}
// Latitude
if (checkBit(mask, 10)) {
position.setLatitude(convertCoordinate(buf.readUnsignedInt()));
}
// Longitude
if (checkBit(mask, 11)) {
position.setLongitude(convertCoordinate(buf.readUnsignedInt()));
}
// Speed
if (checkBit(mask, 12)) {
position.setSpeed(buf.readUnsignedShort() / 10.0);
}
// Course
if (checkBit(mask, 13)) {
position.setCourse(buf.readUnsignedShort() / 10.0);
}
// Time
if (checkBit(mask, 14)) {
time.set(Calendar.HOUR_OF_DAY, buf.readUnsignedByte());
time.set(Calendar.MINUTE, buf.readUnsignedByte());
time.set(Calendar.SECOND, buf.readUnsignedByte());
}
position.setTime(time.getTime());
// Altitude
if (checkBit(mask, 15)) {
position.setAltitude((double) buf.readMedium());
}
// Satellites
if (checkBit(mask, 16)) {
extendedInfo.set("satellites", buf.readUnsignedByte());
}
// Battery percentage
if (checkBit(mask, 17)) {
buf.readUnsignedShort();
}
// Trip milage
if (checkBit(mask, 20)) {
extendedInfo.set("trip", buf.readUnsignedInt());
}
// Milage
if (checkBit(mask, 21)) {
extendedInfo.set("milage", buf.readUnsignedInt());
}
// Time of message generation
if (checkBit(mask, 22)) {
buf.skipBytes(6);
}
// Battery level
if (checkBit(mask, 24)) {
extendedInfo.set("power", buf.readUnsignedShort() / 1000.0);
}
// GPS overspeed
if (checkBit(mask, 25)) {
buf.skipBytes(18);
}
// Cell information
if (checkBit(mask, 26)) {
buf.skipBytes(54);
}
// Sequence number
if (checkBit(mask, 28)) {
extendedInfo.set("index", buf.readUnsignedShort());
}
// Extended info
position.setExtendedInfo(extendedInfo.toString());
return position;
}
return null;