import java.io.IOException; import java.util.Enumeration; import java.util.Vector; import javax.bluetooth.*; import java.io.*; import javax.microedition.io.*; class OOBDFlashHandler { static StreamConnection con = null; static OutputStream os = null; static InputStream is = null; public static boolean examine(OOBDDongleDescriptor dongle) { try { System.out.print("."); con = (StreamConnection) Connector.open(dongle.url, Connector.READ_WRITE, true); os = con.openOutputStream(); is = con.openInputStream(); byte buffer[] = new byte[1024]; int bytes_read; String greeting = "p 0 0 0\r"; os.write("\r\rp 0 0 0\r".getBytes()); sleep(200); while (is.available() > 0) { is.read(buffer); sleep(200); } echoWrite(greeting); String received = readln(); echoWrite(greeting); received = readln(); received = received.replace("\r", "\n"); String[] temp = received.split("\\s+"); //in case just the bootloader is active, we do the following steps to have the bootloader string in received, before we close the socket echoWrite("\n"); received = readln(); received = received.replace("\r", "\n"); /* print substrings */ /* for(int i =0; i < temp.length ; i++) { System.out.println(Integer.toString(i)+":"+ temp[i]); } */ close(); //System.out.println("\nexamine string:"+received); if (temp.length > 4 && "OOBD".equals(temp[0])) { dongle.hardwareID = temp[1]; dongle.revision = temp[2]; dongle.design = temp[3]; dongle.layout = temp[4]; return true; } else { //look for the bootloader string temp = received.split("\\s+"); if (temp.length > 0 & temp[temp.length - 1].equals("OOBD-Flashloader>")) { System.out.print("bootloader active-"); dongle.hardwareID = "0"; dongle.revision = "0"; dongle.design = "0"; dongle.layout = "0"; return true; } return false; } } catch (IOException e) { System.err.print(e.toString()); return false; } } public static boolean switchToFlashMode(String dongleURL) { int runstatus = 3; try { con = (StreamConnection) Connector.open(dongleURL, Connector.READ_WRITE, true); os = con.openOutputStream(); is = con.openInputStream(); byte buffer[] = new byte[1024]; int bytes_read; while (runstatus > 0) { os.write("\r\n".getBytes()); sleep(500); String received = readln(); received = received.replace("\r", "\n"); //System.out.print("reveived: "+received); String[] temp = received.split("\\s+"); if (temp.length > 0 & temp[temp.length - 1].equals(">")) { System.out.print("Firmware found-"); echoWrite("p 0 99 2\r"); sleep(100); echoWrite("fff"); received = readln(); echoWrite("\r\r\r"); sleep(1000); received = readln(); echoWrite("\r"); sleep(1000); received = readln(); temp = received.split("\\s+"); } if (temp.length > 0 & temp[temp.length - 1].equals("OOBD-Flashloader>")) { System.out.println("bootloader active-No Way back: start the flash upload..."); echoWrite("1"); return true; } else { runstatus -= 1; // reduce the trial conter by 1 if (runstatus == 1) { // it seems serious, the dongle does not answer. Last chance is to kill a potential running ymodem- transfer.. //Try to send YMODEM cancel signal 0x18 a few times.. os.write("\u0018\u0018\u0018\u0018\u0018\u0018".getBytes()); // Try to send YMODEM cancel signal 'a' a few times.. os.write("aaaa".getBytes()); } } } } catch (IOException e) { System.err.print(e.toString()); return false; } return false; } public static InputStream getInputStream() { return is; } public static OutputStream getOutputStream() { return os; } public static void resetDongle() { System.out.println("try to start firmware again"); echoWrite("3"); } public static void sleep(int millisecs) { try { Thread.sleep(millisecs); } catch (InterruptedException ex) { Thread.currentThread().interrupt(); } } public static void close() { try { if (os != null) { os.close(); os = null; } if (is != null) { is.close(); is = null; } if (con != null) { con.close(); con = null; } } catch (IOException ex) { ex.printStackTrace(); } } public static String readln() { boolean recvDone = false; String res = ""; byte buffer[] = new byte[1024]; int bytes_read; while (!recvDone) { try { int ready = is.available(); if (ready == 0) { sleep(500); } ready = is.available(); if (ready != 0) { bytes_read = is.read(buffer); res = res + new String(buffer, 0, bytes_read); recvDone = res.substring(res.length() - 1).equals("\r"); } else { recvDone = true; } } catch (IOException ex) { ex.printStackTrace(); } } return res; } public static void echoWrite(String cmd) { byte buffer[] = new byte[1024]; int bytes_read; try { os.flush(); os.write(cmd.getBytes()); bytes_read = is.read(buffer, 0, cmd.length()); } catch (IOException ex) { ex.printStackTrace(); } } }