diff --git a/src/native/mswin32/nsp.dll b/src/native/mswin32/nsp.dll index 02a3603..622eea1 100755 Binary files a/src/native/mswin32/nsp.dll and b/src/native/mswin32/nsp.dll differ diff --git a/src/native/mswin64/nsp.dll b/src/native/mswin64/nsp.dll index e9f8f53..9de952b 100644 Binary files a/src/native/mswin64/nsp.dll and b/src/native/mswin64/nsp.dll differ diff --git a/src/native/osx/libnsp.dylib b/src/native/osx/libnsp.dylib new file mode 100755 index 0000000..9f432ce Binary files /dev/null and b/src/native/osx/libnsp.dylib differ diff --git a/src/org/hwo/collections/SortedList.java b/src/org/hwo/collections/SortedList.java index 25bd78d..91b3e32 100644 --- a/src/org/hwo/collections/SortedList.java +++ b/src/org/hwo/collections/SortedList.java @@ -1,9 +1,10 @@ package org.hwo.collections; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; -public class SortedList> { +public class SortedList> implements Iterable{ private List backingStore; @@ -17,7 +18,7 @@ public class SortedList> { public T after(T element){ for (int i=0;i 0) return backingStore.get(i); } @@ -46,6 +47,10 @@ public class SortedList> { return true; } + public void clear(){ + this.backingStore.clear(); + } + public boolean remove(T element){ return backingStore.remove( element ); } @@ -72,6 +77,11 @@ public class SortedList> { public T[] toArray(T[] a){ return backingStore.toArray(a); } + + @Override + public Iterator iterator() { + return backingStore.iterator(); + } diff --git a/src/org/hwo/io/NewSerialPort/NewSerialPort.java b/src/org/hwo/io/NewSerialPort/NewSerialPort.java index 34f0d21..30dca8c 100644 --- a/src/org/hwo/io/NewSerialPort/NewSerialPort.java +++ b/src/org/hwo/io/NewSerialPort/NewSerialPort.java @@ -362,13 +362,13 @@ public class NewSerialPort { public void write(byte[] b, int off, int len) throws IOException { int nWritten = 0; - log(DEBUGDETAIL,"NSP::write(...)"); + //log(DEBUGDETAIL,"NSP::write(...)"); for (int redo=0; redo < 5 ; redo++){ nWritten = nsp_write_bytes(nsp, b, off, len); if (nWritten == EAGAIN){ try { - log(DEBUGDETAIL,"SL-TX-EAGAIN... [%d]",redo); + // log(DEBUGDETAIL,"SL-TX-EAGAIN... [%d]",redo); Thread.sleep(5); } catch (Exception e){ diff --git a/src/org/hwo/logging/Logging.java b/src/org/hwo/logging/Logging.java index e318fe1..604775d 100644 --- a/src/org/hwo/logging/Logging.java +++ b/src/org/hwo/logging/Logging.java @@ -6,7 +6,9 @@ import java.io.IOException; import java.io.OutputStream; import java.io.PrintStream; import java.text.DateFormat; +import java.util.Arrays; import java.util.Date; +import java.util.Iterator; import java.util.LinkedList; import java.util.List; @@ -19,42 +21,61 @@ public class Logging { private PrintStream logStream; - private final DateFormat dateFormat; + private DateFormat dateFormat; List loggingListeners; private int limitLogLevel; + private String logFilename; + public Logging(){ + setLogFileName("application.log"); + initialize(); + } public Logging(String filename){ + setLogFileName(filename); + initialize(); + } + + private void initialize(){ loggingListeners = new LinkedList(); limitLogLevel = 10; dateFormat = DateFormat.getDateTimeInstance(); - try { - - File f = new File(filename); - File fold = new File(String.format("%s.old", filename)); - - if (fold.exists()){ - fold.delete(); - } - - if (f.exists()){ - f.renameTo(fold); - } - - logStream = new PrintStream(filename); - - } catch (FileNotFoundException e) { - liveStream.println("----!!!!! LOGGING ERROR !!!!!-----"); - e.printStackTrace(); - } - + System.setErr(new PrintStream(new LoggingOutputStream(LogLevel.ERROR))); System.setOut(new PrintStream(new LoggingOutputStream(LogLevel.INFO))); } + public PrintStream getLogStream(){ + if (this.logStream == null){ + try { + logStream = new PrintStream(logFilename); + } catch (FileNotFoundException e){ + logStream = liveStream; + log(LogLevel.ERROR,"Logging: setLogFileName(%s) failed:",logFilename); + log(e); + } + } + return logStream; + } + + public void setLogFileName(String filename){ + this.logFilename = filename; + + File f = new File(logFilename); + File fold = new File(String.format("%s.old", logFilename)); + + if (fold.exists()){ + fold.delete(); + } + + if (f.exists()){ + f.renameTo(fold); + } + } + public int getLimitLogLevel() { return limitLogLevel; } @@ -77,8 +98,8 @@ public class Logging { formattedLine = String.format("%s [%-12s] %s", dateFormat.format(new Date()),logLevel.toString(),message); - logStream.println(formattedLine); - logStream.flush(); + getLogStream().println(formattedLine); + getLogStream().flush(); if (liveStream != null){ liveStream.println(formattedLine); @@ -89,12 +110,7 @@ public class Logging { l.logMessageArrived(formattedLine); } } - - - static public void setLogFileName(String logFileName){ - _inst = new Logging(logFileName); - } - + static public void log(LogLevel logLevel,String message){ if (_inst == null){ _inst = new Logging("application.log"); @@ -140,6 +156,33 @@ public class Logging { return _inst; } + static public String[] Init(String[] arguments,Class mainClass){ + return Init(arguments, mainClass.getCanonicalName() + ".log"); + } + static public String[] Init(String[] arguments,String defaultFileName){ + LinkedList args = new LinkedList<>(); + Iterator i = Arrays.asList(arguments).iterator(); + + Logging._inst = new Logging(); + Logging._inst.setLogFileName(defaultFileName); + + while (i.hasNext()){ + String option = i.next(); + switch (option){ + case "--log-filename": + Logging._inst.setLogFileName(i.next()); + break; + case "--log-level": + Logging._inst.setLimitLogLevel(Integer.parseInt(i.next())); + break; + default: + args.add(option); + break; + } + } + return args.toArray(new String[0]); + } + static { liveStream = System.out; }