|
|
|
@ -46,11 +46,12 @@ public class IspManager { |
|
|
|
|
private static final int MAX_DATA_BLOCK_SIZE = LINES_PER_BLOCK * LINE_DATA_LENGTH; |
|
|
|
|
private static final int UUENCODE_ADDED_VAL = 32; |
|
|
|
|
private static final int LINE_DATA_LENGTH_MAX = 45; |
|
|
|
|
|
|
|
|
|
//defines commands and some answers
|
|
|
|
|
private static final byte[] SYNC_START = "?".getBytes(); |
|
|
|
|
private static final byte[] SYNC = "Synchronized\r\n".getBytes(); |
|
|
|
|
private static final byte[] SYNC_OK = "OK\r\n".getBytes(); |
|
|
|
|
private static final byte[] DATA_BLOCK_OK = "OK\r\n".getBytes(); |
|
|
|
|
//private static final byte[] DATA_BLOCK_RESEND = "RESEND\r\n".getBytes();
|
|
|
|
|
private static final byte[] SYNC_ECHO_OFF = "A 0\r\n".getBytes(); |
|
|
|
|
private static final byte[] READ_UID = "N\r\n".getBytes(); |
|
|
|
|
private static final byte[] READ_PART_ID = "J\r\n".getBytes(); |
|
|
|
@ -63,7 +64,6 @@ public class IspManager { |
|
|
|
|
private Context context; |
|
|
|
|
private long part_id = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private IspManager(Context context) { |
|
|
|
|
this.context = context; |
|
|
|
|
} |
|
|
|
@ -98,68 +98,18 @@ public class IspManager { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public boolean synchronize(int crystal_freq) { |
|
|
|
|
if (serialPort == null) |
|
|
|
|
return false; |
|
|
|
|
serialPort.purge(D2xxManager.FT_PURGE_RX); |
|
|
|
|
serialPort.purge(D2xxManager.FT_PURGE_TX); |
|
|
|
|
byte[] buf; |
|
|
|
|
if (serialPort.write(SYNC_START) != SYNC_START.length) { |
|
|
|
|
System.out.println("Start"); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
buf = new byte[SYNC.length]; |
|
|
|
|
serialPort.read(buf, buf.length, 500); |
|
|
|
|
String result = new String(buf); |
|
|
|
|
String expected = new String(SYNC); |
|
|
|
|
if (result.compareTo(expected) != 0) { |
|
|
|
|
serialPort.write("\r\n".getBytes()); |
|
|
|
|
System.out.println("Start answer " + result); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
if (serialPort.write(SYNC) != SYNC.length) { |
|
|
|
|
System.out.println("SYNC write"); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
clearBuffer(SYNC.length); |
|
|
|
|
buf = new byte[SYNC_OK.length]; |
|
|
|
|
serialPort.read(buf, buf.length, 500); |
|
|
|
|
result = new String(buf); |
|
|
|
|
expected = new String(SYNC_OK); |
|
|
|
|
if (result.compareTo(expected) != 0) { |
|
|
|
|
System.out.println("SYNC OK " + result); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
String freq = String.valueOf(crystal_freq) + "\r\n"; |
|
|
|
|
if (serialPort.write(freq.getBytes()) != freq.length()) { |
|
|
|
|
System.out.println("freq write"); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
clearBuffer(freq.length()); |
|
|
|
|
buf = new byte[SYNC_OK.length]; |
|
|
|
|
serialPort.read(buf, buf.length, 500); |
|
|
|
|
result = new String(buf); |
|
|
|
|
expected = new String(SYNC_OK); |
|
|
|
|
if (result.compareTo(expected) != 0) { |
|
|
|
|
System.out.println("freq answer " + result); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (serialPort.write(SYNC_ECHO_OFF) != SYNC_ECHO_OFF.length) { |
|
|
|
|
System.out.println("Sync Echo Off write"); |
|
|
|
|
return false; |
|
|
|
|
public boolean synchronizeIfPossible(int crystal_freq) { |
|
|
|
|
if (!synchronize(crystal_freq)) { |
|
|
|
|
serialPort.purge(D2xxManager.FT_PURGE_TX); |
|
|
|
|
serialPort.purge(D2xxManager.FT_PURGE_RX); |
|
|
|
|
String[] uids = readUid(); |
|
|
|
|
if (uids == null) { |
|
|
|
|
System.out.println("uids null fuck"); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
clearBuffer(SYNC_ECHO_OFF.length); |
|
|
|
|
buf = new byte[RETURN_CODE_SIZE]; |
|
|
|
|
serialPort.read(buf, buf.length, 500); |
|
|
|
|
clearBuffer(REP_BUF); |
|
|
|
|
return true; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void clearBuffer(int size) { |
|
|
|
@ -262,169 +212,7 @@ public class IspManager { |
|
|
|
|
return version; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private int sendCommand(byte[] cmd) { |
|
|
|
|
byte[] buf = new byte[RETURN_CODE_SIZE]; |
|
|
|
|
if (serialPort.write(cmd) != cmd.length) |
|
|
|
|
return -5; |
|
|
|
|
int len = read(buf, buf.length, 500); |
|
|
|
|
if (len <= 0) |
|
|
|
|
return -4; |
|
|
|
|
int ret = parseRetCode(buf); |
|
|
|
|
if(ret > 9) |
|
|
|
|
read(buf,1,50); |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private int sendCommand(char c, int addr, int count) { |
|
|
|
|
int ret; |
|
|
|
|
int len; |
|
|
|
|
|
|
|
|
|
byte[] buf = String.format(Locale.getDefault(),"%c %d %d\r\n",c,addr,count).getBytes(); |
|
|
|
|
len = buf.length; |
|
|
|
|
if(len > REP_BUF) { |
|
|
|
|
len = REP_BUF; |
|
|
|
|
} |
|
|
|
|
int sent = serialPort.write(buf,len); |
|
|
|
|
if(len != sent) { |
|
|
|
|
return -5; |
|
|
|
|
} |
|
|
|
|
buf = new byte[RETURN_CODE_SIZE]; |
|
|
|
|
len = read(buf,buf.length,500); |
|
|
|
|
if(len <= 0) { |
|
|
|
|
return -4; |
|
|
|
|
} |
|
|
|
|
ret = parseRetCode(buf); |
|
|
|
|
|
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private int read(byte[] buffer, int size, int timeout) { |
|
|
|
|
long startTime = System.nanoTime(); |
|
|
|
|
long timeoutNano = timeout * 1000000; |
|
|
|
|
int sizeRead = 0; |
|
|
|
|
|
|
|
|
|
ByteBuffer output = ByteBuffer.wrap(buffer, 0, size); |
|
|
|
|
|
|
|
|
|
while (sizeRead < size) { |
|
|
|
|
int sizeToRead = serialPort.getQueueStatus(); |
|
|
|
|
if (sizeRead + sizeToRead > size) |
|
|
|
|
sizeToRead = size - sizeRead; |
|
|
|
|
byte[] buf = new byte[sizeToRead]; |
|
|
|
|
if (sizeToRead > 0) { |
|
|
|
|
int sizeReceived = serialPort.read(buf, sizeToRead, 50); |
|
|
|
|
if (sizeReceived < 0) |
|
|
|
|
return sizeReceived; |
|
|
|
|
sizeRead += sizeReceived; |
|
|
|
|
if (sizeReceived != 0) |
|
|
|
|
output.put(buf, 0, sizeReceived); |
|
|
|
|
} |
|
|
|
|
long time = System.nanoTime(); |
|
|
|
|
if (time - startTime >= timeoutNano) |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
return sizeRead; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private int parseRetCode(byte[] data) { |
|
|
|
|
String str = new String(data,0,2); |
|
|
|
|
str = str.replace("\r", ""); |
|
|
|
|
str = str.replace("\n", ""); |
|
|
|
|
if (!str.matches("[0-9 -+]*")) |
|
|
|
|
return -1; |
|
|
|
|
return Integer.parseInt(str); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public boolean synchronizeIfPossible(int crystal_freq) { |
|
|
|
|
if (!synchronize(crystal_freq)) { |
|
|
|
|
serialPort.purge(D2xxManager.FT_PURGE_TX); |
|
|
|
|
serialPort.purge(D2xxManager.FT_PURGE_RX); |
|
|
|
|
String[] uids = readUid(); |
|
|
|
|
if (uids == null) { |
|
|
|
|
System.out.println("uids null fuck"); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private int eraseFlash(Parts parts) { |
|
|
|
|
int ret = unlock(); |
|
|
|
|
if (ret != 0) { |
|
|
|
|
System.out.println("unlock fail"); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
for (int i = 0; i < parts.flash_nb_sectors; i++) { |
|
|
|
|
//blank-check
|
|
|
|
|
ret = send_cmd_sectors('I', i, i); |
|
|
|
|
if (ret == 0) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (ret < 0) { |
|
|
|
|
System.out.println("blank "+i+" fail"); |
|
|
|
|
return ret; |
|
|
|
|
} else { |
|
|
|
|
byte buf[] = new byte[REP_BUF]; |
|
|
|
|
read(buf, 40, 500); |
|
|
|
|
} |
|
|
|
|
//prepare-for-write
|
|
|
|
|
ret = send_cmd_sectors('P', i, i); |
|
|
|
|
if (ret != 0) { |
|
|
|
|
System.out.println("prepare-for-write "+i+" fail"); |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
//erase
|
|
|
|
|
ret = send_cmd_sectors('E', i, i); |
|
|
|
|
if (ret != 0) { |
|
|
|
|
System.out.println("erase "+i+" fail"); |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private int send_cmd_sectors(char cmd, int first_sector, int last_sector) { |
|
|
|
|
byte[] buf = new byte[RETURN_CODE_SIZE]; |
|
|
|
|
int ret; |
|
|
|
|
int len; |
|
|
|
|
|
|
|
|
|
if(last_sector < first_sector){ |
|
|
|
|
return -6; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
String request = String.format(Locale.getDefault(),"%c %d %d\r\n",cmd, first_sector, last_sector); |
|
|
|
|
len = serialPort.write(request.getBytes()); |
|
|
|
|
if(len != request.getBytes().length){ |
|
|
|
|
return -5; |
|
|
|
|
} |
|
|
|
|
len = read(buf,buf.length,500); |
|
|
|
|
if(len <= 0){ |
|
|
|
|
return -4; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ret = parseRetCode(buf); |
|
|
|
|
|
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private int unlock() { |
|
|
|
|
int ret = sendCommand(UNLOCK); |
|
|
|
|
if(ret != 0) |
|
|
|
|
return -1; |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void flash(final Server server, final Binary binary, final FlashListener listener) { |
|
|
|
|
new Thread(new Runnable() { |
|
|
|
|
@Override |
|
|
|
|
public void run() { |
|
|
|
|
flashBinary(server,binary,listener); |
|
|
|
|
} |
|
|
|
|
}).start(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private int flashBinary(Server server, Binary binary, FlashListener listener) { |
|
|
|
|
public int flashBinary(Server server, Binary binary, FlashListener listener) { |
|
|
|
|
Parts parts = DatabaseManager.getInstance(context).getParts(part_id); |
|
|
|
|
if(parts == null) { |
|
|
|
|
listener.onError(context.getString(R.string.parts_missing)); |
|
|
|
@ -504,6 +292,132 @@ public class IspManager { |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/**** ISP Commands *****/ |
|
|
|
|
|
|
|
|
|
private boolean synchronize(int crystal_freq) { |
|
|
|
|
if (serialPort == null) |
|
|
|
|
return false; |
|
|
|
|
serialPort.purge(D2xxManager.FT_PURGE_RX); |
|
|
|
|
serialPort.purge(D2xxManager.FT_PURGE_TX); |
|
|
|
|
byte[] buf; |
|
|
|
|
if (serialPort.write(SYNC_START) != SYNC_START.length) { |
|
|
|
|
System.out.println("Start"); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
buf = new byte[SYNC.length]; |
|
|
|
|
serialPort.read(buf, buf.length, 500); |
|
|
|
|
String result = new String(buf); |
|
|
|
|
String expected = new String(SYNC); |
|
|
|
|
if (result.compareTo(expected) != 0) { |
|
|
|
|
serialPort.write("\r\n".getBytes()); |
|
|
|
|
System.out.println("Start answer " + result); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
if (serialPort.write(SYNC) != SYNC.length) { |
|
|
|
|
System.out.println("SYNC write"); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
clearBuffer(SYNC.length); |
|
|
|
|
buf = new byte[SYNC_OK.length]; |
|
|
|
|
serialPort.read(buf, buf.length, 500); |
|
|
|
|
result = new String(buf); |
|
|
|
|
expected = new String(SYNC_OK); |
|
|
|
|
if (result.compareTo(expected) != 0) { |
|
|
|
|
System.out.println("SYNC OK " + result); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
String freq = String.valueOf(crystal_freq) + "\r\n"; |
|
|
|
|
if (serialPort.write(freq.getBytes()) != freq.length()) { |
|
|
|
|
System.out.println("freq write"); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
clearBuffer(freq.length()); |
|
|
|
|
buf = new byte[SYNC_OK.length]; |
|
|
|
|
serialPort.read(buf, buf.length, 500); |
|
|
|
|
result = new String(buf); |
|
|
|
|
expected = new String(SYNC_OK); |
|
|
|
|
if (result.compareTo(expected) != 0) { |
|
|
|
|
System.out.println("freq answer " + result); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (serialPort.write(SYNC_ECHO_OFF) != SYNC_ECHO_OFF.length) { |
|
|
|
|
System.out.println("Sync Echo Off write"); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
clearBuffer(SYNC_ECHO_OFF.length); |
|
|
|
|
buf = new byte[RETURN_CODE_SIZE]; |
|
|
|
|
serialPort.read(buf, buf.length, 500); |
|
|
|
|
clearBuffer(REP_BUF); |
|
|
|
|
return true; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private int sendCommand(byte[] cmd) { |
|
|
|
|
byte[] buf = new byte[RETURN_CODE_SIZE]; |
|
|
|
|
if (serialPort.write(cmd) != cmd.length) |
|
|
|
|
return -5; |
|
|
|
|
int len = read(buf, buf.length, 500); |
|
|
|
|
if (len <= 0) |
|
|
|
|
return -4; |
|
|
|
|
int ret = parseRetCode(buf); |
|
|
|
|
if(ret > 9) |
|
|
|
|
read(buf,1,50); |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private int sendCommand(char c, int addr, int count) { |
|
|
|
|
int ret; |
|
|
|
|
int len; |
|
|
|
|
|
|
|
|
|
byte[] buf = String.format(Locale.getDefault(),"%c %d %d\r\n",c,addr,count).getBytes(); |
|
|
|
|
len = buf.length; |
|
|
|
|
if(len > REP_BUF) { |
|
|
|
|
len = REP_BUF; |
|
|
|
|
} |
|
|
|
|
int sent = serialPort.write(buf,len); |
|
|
|
|
if(len != sent) { |
|
|
|
|
return -5; |
|
|
|
|
} |
|
|
|
|
buf = new byte[RETURN_CODE_SIZE]; |
|
|
|
|
len = read(buf,buf.length,500); |
|
|
|
|
if(len <= 0) { |
|
|
|
|
return -4; |
|
|
|
|
} |
|
|
|
|
ret = parseRetCode(buf); |
|
|
|
|
|
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private int send_cmd_sectors(char cmd, int first_sector, int last_sector) { |
|
|
|
|
byte[] buf = new byte[RETURN_CODE_SIZE]; |
|
|
|
|
int ret; |
|
|
|
|
int len; |
|
|
|
|
|
|
|
|
|
if(last_sector < first_sector){ |
|
|
|
|
return -6; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
String request = String.format(Locale.getDefault(),"%c %d %d\r\n",cmd, first_sector, last_sector); |
|
|
|
|
len = serialPort.write(request.getBytes()); |
|
|
|
|
if(len != request.getBytes().length){ |
|
|
|
|
return -5; |
|
|
|
|
} |
|
|
|
|
len = read(buf,buf.length,500); |
|
|
|
|
if(len <= 0){ |
|
|
|
|
return -4; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ret = parseRetCode(buf); |
|
|
|
|
|
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private int send_cmd_address(char c, int flash_addr, int ram_addr, int write_size) { |
|
|
|
|
int ret; |
|
|
|
|
int len; |
|
|
|
@ -607,10 +521,61 @@ public class IspManager { |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private int parseRetCode(byte[] data) { |
|
|
|
|
String str = new String(data,0,2); |
|
|
|
|
str = str.replace("\r", ""); |
|
|
|
|
str = str.replace("\n", ""); |
|
|
|
|
if (!str.matches("[0-9 -+]*")) |
|
|
|
|
return -1; |
|
|
|
|
return Integer.parseInt(str); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private int eraseFlash(Parts parts) { |
|
|
|
|
int ret = unlock(); |
|
|
|
|
if (ret != 0) { |
|
|
|
|
System.out.println("unlock fail"); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
for (int i = 0; i < parts.flash_nb_sectors; i++) { |
|
|
|
|
//blank-check
|
|
|
|
|
ret = send_cmd_sectors('I', i, i); |
|
|
|
|
if (ret == 0) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (ret < 0) { |
|
|
|
|
System.out.println("blank "+i+" fail"); |
|
|
|
|
return ret; |
|
|
|
|
} else { |
|
|
|
|
byte buf[] = new byte[REP_BUF]; |
|
|
|
|
read(buf, 40, 500); |
|
|
|
|
} |
|
|
|
|
//prepare-for-write
|
|
|
|
|
ret = send_cmd_sectors('P', i, i); |
|
|
|
|
if (ret != 0) { |
|
|
|
|
System.out.println("prepare-for-write "+i+" fail"); |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
//erase
|
|
|
|
|
ret = send_cmd_sectors('E', i, i); |
|
|
|
|
if (ret != 0) { |
|
|
|
|
System.out.println("erase "+i+" fail"); |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private int unlock() { |
|
|
|
|
int ret = sendCommand(UNLOCK); |
|
|
|
|
if(ret != 0) |
|
|
|
|
return -1; |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/**** Miscellaneous Functions ****/ |
|
|
|
|
|
|
|
|
|
private int uu_encode(byte[] data_out, byte[] data, int offset, int orig_size) { |
|
|
|
|
//TODO
|
|
|
|
|
System.out.println("uu "+offset+" "+orig_size); |
|
|
|
|
int new_size = 0; |
|
|
|
|
int pos = offset; |
|
|
|
|
while(pos < offset+orig_size) { |
|
|
|
@ -686,8 +651,7 @@ public class IspManager { |
|
|
|
|
val[5] = byteArrayToInt(data, 20); |
|
|
|
|
val[6] = byteArrayToInt(data, 24); |
|
|
|
|
|
|
|
|
|
int sum = 0 - val[0] - val[1] - val[2] - val[3] - val[4] - val[5] - val[6]; |
|
|
|
|
return sum; |
|
|
|
|
return 0 - val[0] - val[1] - val[2] - val[3] - val[4] - val[5] - val[6]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void fill_data_with_0(byte[] data, int offset, int flash_size) { |
|
|
|
@ -737,6 +701,33 @@ public class IspManager { |
|
|
|
|
return write_size; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private int read(byte[] buffer, int size, int timeout) { |
|
|
|
|
long startTime = System.nanoTime(); |
|
|
|
|
long timeoutNano = timeout * 1000000; |
|
|
|
|
int sizeRead = 0; |
|
|
|
|
|
|
|
|
|
ByteBuffer output = ByteBuffer.wrap(buffer, 0, size); |
|
|
|
|
|
|
|
|
|
while (sizeRead < size) { |
|
|
|
|
int sizeToRead = serialPort.getQueueStatus(); |
|
|
|
|
if (sizeRead + sizeToRead > size) |
|
|
|
|
sizeToRead = size - sizeRead; |
|
|
|
|
byte[] buf = new byte[sizeToRead]; |
|
|
|
|
if (sizeToRead > 0) { |
|
|
|
|
int sizeReceived = serialPort.read(buf, sizeToRead, 50); |
|
|
|
|
if (sizeReceived < 0) |
|
|
|
|
return sizeReceived; |
|
|
|
|
sizeRead += sizeReceived; |
|
|
|
|
if (sizeReceived != 0) |
|
|
|
|
output.put(buf, 0, sizeReceived); |
|
|
|
|
} |
|
|
|
|
long time = System.nanoTime(); |
|
|
|
|
if (time - startTime >= timeoutNano) |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
return sizeRead; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private int byteArrayToInt(byte[] array, int offset) { |
|
|
|
|
int value = 0; |
|
|
|
|
value |= (array[offset] & 0xff); |
|
|
|
|