From a219f62f0da4f8f40f505d46a18940210eb878d2 Mon Sep 17 00:00:00 2001 From: Nicolae Mihalache Date: Thu, 2 Jul 2020 11:09:48 +0200 Subject: [PATCH] v0.9 changelog Prepare release jsle-0.9 cleanup added a method to format the ccsds time as string including the picoseconds --- Changelog | 3 ++ distribution/release.sh | 6 ++-- pom.xml | 2 +- src/main/java/org/yamcs/sle/CcsdsTime.java | 27 +++++++++++++--- .../sle/udpslebridge/UdpCltuUplinker.java | 31 +++++++++++-------- .../java/org/yamcs/sle/CcsdsTimeTest.java | 5 +++ 6 files changed, 52 insertions(+), 22 deletions(-) diff --git a/Changelog b/Changelog index b444a46..a4797b7 100644 --- a/Changelog +++ b/Changelog @@ -1,3 +1,6 @@ +Version 0.9 released 2-July-2020 +- minor fixes + Version 0.8 released 28-May-2020 - implemented the Return Channel Frame (RCF) service diff --git a/distribution/release.sh b/distribution/release.sh index 878fe97..07266c0 100755 --- a/distribution/release.sh +++ b/distribution/release.sh @@ -38,7 +38,7 @@ fi mvn -q clean -clonedir=$jslehome/distribution/target/yamcs-clone +clonedir=$jslehome/distribution/target/jsle-clone mkdir -p $clonedir git clone . $clonedir @@ -58,13 +58,13 @@ echo if [ $snapshot -eq 0 ]; then read -p "Do you want to stage $pomversion maven artifacts to Maven Central? [y/N] " yesNo if [[ $yesNo == 'y' ]]; then - mvn -f $clonedir -P yamcs-release -DskipTests deploy + mvn -f $clonedir -P jsle-release -DskipTests deploy echo 'Release the staging repository at https://oss.sonatype.org' fi else read -p "Do you want to publish $pomversion maven artifacts to Sonatype Snapshots? [y/N] " yesNo if [[ $yesNo == 'y' ]]; then - mvn -f $clonedir -P yamcs-release -DskipTests -DskipStaging deploy + mvn -f $clonedir -P jsle-release -DskipTests -DskipStaging deploy fi fi diff --git a/pom.xml b/pom.xml index 88c24a0..2eef2ab 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.yamcs jsle jar - 0.9-SNAPSHOT + 0.9 jsle https://github.com/yamcs/jsle Java implementation for the SLE (Space Link Extension) protocol. diff --git a/src/main/java/org/yamcs/sle/CcsdsTime.java b/src/main/java/org/yamcs/sle/CcsdsTime.java index 685e999..5a6be7f 100644 --- a/src/main/java/org/yamcs/sle/CcsdsTime.java +++ b/src/main/java/org/yamcs/sle/CcsdsTime.java @@ -21,7 +21,8 @@ public class CcsdsTime implements Comparable { final private int numDays; final private long picosecInDay; - final static DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendInstant(3).toFormatter(); + final static DateTimeFormatter FORMATTER = DateTimeFormatter.ISO_INSTANT; + final static DateTimeFormatter FORMATTER_SEC = new DateTimeFormatterBuilder().appendInstant(0).toFormatter(); public CcsdsTime(int numDays, long picosecInDay) { this.numDays = numDays; @@ -237,10 +238,7 @@ public long toJavaMillisec() { return ((long) numDays - NUM_DAYS_1958_1970) * MS_IN_DAY + picosecInDay / 1000_000_000; } - public String toString() { - return formatter - .format(Instant.ofEpochSecond(((long) numDays - NUM_DAYS_1958_1970) * SEC_IN_DAY, picosecInDay / 1000)); - } + @Override public int compareTo(CcsdsTime o) { @@ -250,4 +248,23 @@ public int compareTo(CcsdsTime o) { } return x; } + + /** + * Formats the time with up to nanosecond resolution + */ + public String toString() { + Instant inst = Instant.ofEpochSecond(((long) numDays - NUM_DAYS_1958_1970) * SEC_IN_DAY, picosecInDay / 1000); + return FORMATTER.format(inst); + } + + /** + * Converts to ISO8860 string with 12 digits picoseconds after dot + * @return + */ + public String toStringPico() { + Instant inst = Instant.ofEpochSecond(((long) numDays - NUM_DAYS_1958_1970) * SEC_IN_DAY, picosecInDay / 1000); + String s = FORMATTER_SEC.format(inst); + //silly we have to remove the 'Z' from the string formatted by DateTimeFormatter + return String.format("%s.%012dZ", s.substring(0, s.length()-1), picosecInDay % 1_000_000_000_000L); + } } diff --git a/src/main/java/org/yamcs/sle/udpslebridge/UdpCltuUplinker.java b/src/main/java/org/yamcs/sle/udpslebridge/UdpCltuUplinker.java index a304f95..0e73e60 100644 --- a/src/main/java/org/yamcs/sle/udpslebridge/UdpCltuUplinker.java +++ b/src/main/java/org/yamcs/sle/udpslebridge/UdpCltuUplinker.java @@ -4,28 +4,30 @@ import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; +import java.util.logging.Level; import java.util.logging.Logger; import org.yamcs.sle.CcsdsTime; import org.yamcs.sle.Constants.ForwardDuStatus; import org.yamcs.sle.provider.CltuUplinker; +import io.netty.buffer.ByteBufUtil; + public class UdpCltuUplinker implements CltuUplinker { static Logger logger = Logger.getLogger(UdpFrameReceiver.class.getName()); - + String hostname; int port; int bitrate; InetAddress address; DatagramSocket socket; - + public UdpCltuUplinker(String hostname, int port, int bitrate) { this.hostname = hostname; this.port = port; this.bitrate = bitrate; } - @Override public int start() { try { @@ -35,19 +37,19 @@ public int start() { logger.warning(e.toString()); return 1;// unable to comply } - return -1;//ok + return -1;// ok } @Override public UplinkResult uplink(byte[] cltuData) { UplinkResult ur = new UplinkResult(); - + DatagramPacket dtg = new DatagramPacket(cltuData, cltuData.length, address, port); ur.startTime = CcsdsTime.now(); - long durationNs = cltuData.length*8*1000_000_000/bitrate; - int millis = (int) (durationNs/1000_000); - int nanos = (int) (durationNs%1000_000); - + long durationNs = cltuData.length * 8 * 1000_000_000 / bitrate; + int millis = (int) (durationNs / 1000_000); + int nanos = (int) (durationNs % 1000_000); + try { Thread.sleep(millis, nanos); } catch (InterruptedException e1) { @@ -55,16 +57,19 @@ public UplinkResult uplink(byte[] cltuData) { ur.cltuStatus = ForwardDuStatus.interrupted; return ur; } - + if (logger.isLoggable(Level.FINE)) { + logger.fine("Sending UDP CLTU " + ByteBufUtil.hexDump(cltuData)); + } + try { socket.send(dtg); ur.cltuStatus = ForwardDuStatus.radiated; ur.stopTime = CcsdsTime.now(); return ur; } catch (IOException e) { - logger.warning("Error sending datagram"+ e); - ur.cltuStatus = ForwardDuStatus.interrupted; - return ur; + logger.warning("Error sending datagram" + e); + ur.cltuStatus = ForwardDuStatus.interrupted; + return ur; } } diff --git a/src/test/java/org/yamcs/sle/CcsdsTimeTest.java b/src/test/java/org/yamcs/sle/CcsdsTimeTest.java index 7458d5c..bcdfecd 100644 --- a/src/test/java/org/yamcs/sle/CcsdsTimeTest.java +++ b/src/test/java/org/yamcs/sle/CcsdsTimeTest.java @@ -39,4 +39,9 @@ public void test4() { assertEquals("2020-05-05T20:50:00.001Z", t.toString()); } + @Test + public void test5() { + CcsdsTime t = new CcsdsTime(1, 301123456789012L); + assertEquals("1958-01-02T00:05:01.123456789012Z", t.toStringPico()); + } }