From d05758b19859f809220e90f8cf5ef710f4d8d351 Mon Sep 17 00:00:00 2001 From: Brad Hards Date: Wed, 12 Apr 2023 00:50:13 +1000 Subject: [PATCH] st1002: implementation of Range Image Local Set (#455) This required ST 1202 transformations, which in turn required ST 1010 SDCC. Includes usual javadoc, unit tests and a generator example. --- .github/workflows/jdk11.yml | 15 + README.md | 3 + .../jmisb/api/common/KlvParseException.java | 1 + examples/README.md | 4 + examples/pom.xml | 1 + examples/rangeimagegenerator/pom.xml | 48 + .../src/main/java/module-info.java | 11 + .../rangeimagegenerator/Generator.java | 211 +++++ .../rangeimagegenerator/GeneratorCLI.java | 57 ++ examples/rangeimagegenerator/test1280.jpg | Bin 0 -> 20534 bytes impl/pom.xml | 10 + impl/src/main/java/module-info.java | 1 + pom.xml | 5 +- st0601/pom.xml | 5 + st0601/src/main/java/module-info.java | 1 + .../st0601/NestedRangeImageLocalSet.java | 84 ++ .../org/jmisb/st0601/UasDatalinkFactory.java | 3 +- .../java/org/jmisb/st0601/UasDatalinkTag.java | 3 +- .../st0601/NestedRangeImageLocalSetTest.java | 121 +++ st1002/checkstyle.xml | 229 +++++ st1002/checkstyle_suppressions.xml | 6 + st1002/pom.xml | 100 +++ st1002/src/main/java/module-info.java | 43 + .../st1002/GeneralizedTransformation.java | 85 ++ .../st1002/IRangeImageMetadataValue.java | 17 + .../org/jmisb/st1002/NumberOfSectionsInX.java | 84 ++ .../org/jmisb/st1002/NumberOfSectionsInY.java | 84 ++ .../st1002/RangeImageCompressionMethod.java | 64 ++ .../jmisb/st1002/RangeImageEnumerations.java | 137 +++ .../org/jmisb/st1002/RangeImageLocalSet.java | 222 +++++ .../st1002/RangeImageLocalSetFactory.java | 19 + .../jmisb/st1002/RangeImageMetadataKey.java | 84 ++ .../org/jmisb/st1002/RangeImageSource.java | 69 ++ .../jmisb/st1002/RangeImageryDataType.java | 78 ++ .../st1002/ST1002PrecisionTimeStamp.java | 61 ++ .../org/jmisb/st1002/ST1002VersionNumber.java | 77 ++ .../java/org/jmisb/st1002/SectionData.java | 316 +++++++ .../st1002/SectionDataIdentifierKey.java | 78 ++ .../org/jmisb/st1002/SectionDataList.java | 84 ++ .../st1002/SinglePointRangeMeasurement.java | 77 ++ .../SinglePointRangeMeasurementColumn.java | 75 ++ .../SinglePointRangeMeasurementRow.java | 75 ++ ...inglePointRangeMeasurementUncertainty.java | 67 ++ .../java/org/jmisb/st1002/package-info.java | 17 + .../st1002/doc-files/coboresightedsensors.png | Bin 0 -> 106957 bytes .../st1002/doc-files/depthrangeimage.png | Bin 0 -> 45578 bytes .../doc-files/fivehorizontalsections.png | Bin 0 -> 69149 bytes .../doc-files/nonboresightedsensors.png | Bin 0 -> 146534 bytes .../doc-files/perspectiverangeimage.png | Bin 0 -> 51346 bytes .../jmisb/st1002/doc-files/sectiondatavlp.png | Bin 0 -> 131502 bytes .../doc-files/singlepointrangemeasurement.png | Bin 0 -> 65260 bytes .../doc-files/threeverticalsections.png | Bin 0 -> 63571 bytes .../org.jmisb.api.klv.IMisbMessageFactory | 1 + .../st1002/GeneralizedTransformationTest.java | 87 ++ .../java/org/jmisb/st1002/LoggerChecks.java | 63 ++ .../jmisb/st1002/NumberOfSectionsInXTest.java | 82 ++ .../jmisb/st1002/NumberOfSectionsInYTest.java | 82 ++ .../jmisb/st1002/PrecisionTimeStampTest.java | 134 +++ .../RangeImageCompressionMethodTest.java | 45 + .../jmisb/st1002/RangeImageDataTypeTest.java | 45 + .../st1002/RangeImageEnumerationsTest.java | 88 ++ .../jmisb/st1002/RangeImageLocalSetTest.java | 358 ++++++++ .../jmisb/st1002/RangeImageSourceTest.java | 45 + .../jmisb/st1002/ST1002VersionNumberTest.java | 92 ++ .../st1002/SectionDataIdentifierKeyTest.java | 56 ++ .../org/jmisb/st1002/SectionDataListTest.java | 61 ++ .../org/jmisb/st1002/SectionDataTest.java | 838 ++++++++++++++++++ ...SinglePointRangeMeasurementColumnTest.java | 128 +++ .../SinglePointRangeMeasurementRowTest.java | 128 +++ .../SinglePointRangeMeasurementTest.java | 119 +++ ...ePointRangeMeasurementUncertaintyTest.java | 120 +++ st1002/testng-unit.xml | 10 + st1010/SpotBugsFilter.xml | 3 + st1010/checkstyle.xml | 229 +++++ st1010/checkstyle_suppressions.xml | 6 + st1010/pom.xml | 92 ++ st1010/src/main/java/module-info.java | 20 + .../java/org/jmisb/st1010/EncodingFormat.java | 60 ++ .../src/main/java/org/jmisb/st1010/SDCC.java | 187 ++++ .../java/org/jmisb/st1010/SDCCParser.java | 189 ++++ .../org/jmisb/st1010/SDCCParserContext.java | 49 + .../java/org/jmisb/st1010/SDCCSerialiser.java | 265 ++++++ .../jmisb/st1010/SDCCValueIdentifierKey.java | 86 ++ .../java/org/jmisb/st1010/SDCCValueWrap.java | 65 ++ .../java/org/jmisb/st1010/package-info.java | 17 + .../org/jmisb/st1010/EncodingFormatTest.java | 48 + .../jmisb/st1010/Mode1ParseControlTest.java | 22 + .../jmisb/st1010/Mode2ParseControlTest.java | 31 + .../java/org/jmisb/st1010/SDCCParserTest.java | 236 +++++ .../test/java/org/jmisb/st1010/SDCCTest.java | 97 ++ .../st1010/SDCCValueIdentifierKeyTest.java | 49 + .../java/org/jmisb/st1010/SDCCWriterTest.java | 563 ++++++++++++ st1010/testng-unit.xml | 10 + st1202/SpotBugsFilter.xml | 3 + st1202/checkstyle.xml | 229 +++++ st1202/checkstyle_suppressions.xml | 6 + st1202/pom.xml | 97 ++ st1202/src/main/java/module-info.java | 28 + ...eneralizedTransformationMetadataValue.java | 69 ++ .../java/org/jmisb/st1202/Denominator_X.java | 28 + .../java/org/jmisb/st1202/Denominator_Y.java | 28 + .../GeneralizedTransformationLocalSet.java | 156 ++++ ...eneralizedTransformationParametersKey.java | 148 ++++ ...eneralizedTransformationMetadataValue.java | 19 + .../main/java/org/jmisb/st1202/SDCC_FLP.java | 91 ++ .../jmisb/st1202/ST1202DocumentVersion.java | 78 ++ .../st1202/TransformationEnumeration.java | 157 ++++ .../jmisb/st1202/X_Numerator_Constant.java | 28 + .../java/org/jmisb/st1202/X_Numerator_X.java | 28 + .../java/org/jmisb/st1202/X_Numerator_Y.java | 28 + .../jmisb/st1202/Y_Numerator_Constant.java | 28 + .../java/org/jmisb/st1202/Y_Numerator_X.java | 28 + .../java/org/jmisb/st1202/Y_Numerator_Y.java | 28 + .../java/org/jmisb/st1202/package-info.java | 10 + .../org/jmisb/st1202/Denominator_X_Test.java | 62 ++ .../org/jmisb/st1202/Denominator_Y_Test.java | 62 ++ ...GeneralizedTransformationLocalSetTest.java | 351 ++++++++ ...alizedTransformationParametersKeyTest.java | 113 +++ .../java/org/jmisb/st1202/LoggerChecks.java | 63 ++ .../java/org/jmisb/st1202/SDCC_FLP_Test.java | 232 +++++ .../st1202/ST1202DocumentVersionTest.java | 74 ++ .../st1202/TransformationEnumerationTest.java | 106 +++ .../st1202/X_Numerator_Constant_Test.java | 63 ++ .../org/jmisb/st1202/X_Numerator_X_Test.java | 62 ++ .../org/jmisb/st1202/X_Numerator_Y_Test.java | 62 ++ .../st1202/Y_Numerator_Constant_Test.java | 63 ++ .../org/jmisb/st1202/Y_Numerator_X_Test.java | 62 ++ .../org/jmisb/st1202/Y_Numerator_Y_Test.java | 62 ++ st1202/testng-unit.xml | 10 + 129 files changed, 10496 insertions(+), 4 deletions(-) create mode 100644 examples/rangeimagegenerator/pom.xml create mode 100644 examples/rangeimagegenerator/src/main/java/module-info.java create mode 100644 examples/rangeimagegenerator/src/main/java/org/jmisb/examples/rangeimagegenerator/Generator.java create mode 100644 examples/rangeimagegenerator/src/main/java/org/jmisb/examples/rangeimagegenerator/GeneratorCLI.java create mode 100644 examples/rangeimagegenerator/test1280.jpg create mode 100644 st0601/src/main/java/org/jmisb/st0601/NestedRangeImageLocalSet.java create mode 100644 st0601/src/test/java/org/jmisb/st0601/NestedRangeImageLocalSetTest.java create mode 100644 st1002/checkstyle.xml create mode 100644 st1002/checkstyle_suppressions.xml create mode 100644 st1002/pom.xml create mode 100644 st1002/src/main/java/module-info.java create mode 100644 st1002/src/main/java/org/jmisb/st1002/GeneralizedTransformation.java create mode 100644 st1002/src/main/java/org/jmisb/st1002/IRangeImageMetadataValue.java create mode 100644 st1002/src/main/java/org/jmisb/st1002/NumberOfSectionsInX.java create mode 100644 st1002/src/main/java/org/jmisb/st1002/NumberOfSectionsInY.java create mode 100644 st1002/src/main/java/org/jmisb/st1002/RangeImageCompressionMethod.java create mode 100644 st1002/src/main/java/org/jmisb/st1002/RangeImageEnumerations.java create mode 100644 st1002/src/main/java/org/jmisb/st1002/RangeImageLocalSet.java create mode 100644 st1002/src/main/java/org/jmisb/st1002/RangeImageLocalSetFactory.java create mode 100644 st1002/src/main/java/org/jmisb/st1002/RangeImageMetadataKey.java create mode 100644 st1002/src/main/java/org/jmisb/st1002/RangeImageSource.java create mode 100644 st1002/src/main/java/org/jmisb/st1002/RangeImageryDataType.java create mode 100644 st1002/src/main/java/org/jmisb/st1002/ST1002PrecisionTimeStamp.java create mode 100644 st1002/src/main/java/org/jmisb/st1002/ST1002VersionNumber.java create mode 100644 st1002/src/main/java/org/jmisb/st1002/SectionData.java create mode 100644 st1002/src/main/java/org/jmisb/st1002/SectionDataIdentifierKey.java create mode 100644 st1002/src/main/java/org/jmisb/st1002/SectionDataList.java create mode 100644 st1002/src/main/java/org/jmisb/st1002/SinglePointRangeMeasurement.java create mode 100644 st1002/src/main/java/org/jmisb/st1002/SinglePointRangeMeasurementColumn.java create mode 100644 st1002/src/main/java/org/jmisb/st1002/SinglePointRangeMeasurementRow.java create mode 100644 st1002/src/main/java/org/jmisb/st1002/SinglePointRangeMeasurementUncertainty.java create mode 100644 st1002/src/main/java/org/jmisb/st1002/package-info.java create mode 100644 st1002/src/main/javadoc/org/jmisb/st1002/doc-files/coboresightedsensors.png create mode 100644 st1002/src/main/javadoc/org/jmisb/st1002/doc-files/depthrangeimage.png create mode 100644 st1002/src/main/javadoc/org/jmisb/st1002/doc-files/fivehorizontalsections.png create mode 100644 st1002/src/main/javadoc/org/jmisb/st1002/doc-files/nonboresightedsensors.png create mode 100644 st1002/src/main/javadoc/org/jmisb/st1002/doc-files/perspectiverangeimage.png create mode 100644 st1002/src/main/javadoc/org/jmisb/st1002/doc-files/sectiondatavlp.png create mode 100644 st1002/src/main/javadoc/org/jmisb/st1002/doc-files/singlepointrangemeasurement.png create mode 100644 st1002/src/main/javadoc/org/jmisb/st1002/doc-files/threeverticalsections.png create mode 100644 st1002/src/main/resources/META-INF/services/org.jmisb.api.klv.IMisbMessageFactory create mode 100644 st1002/src/test/java/org/jmisb/st1002/GeneralizedTransformationTest.java create mode 100644 st1002/src/test/java/org/jmisb/st1002/LoggerChecks.java create mode 100644 st1002/src/test/java/org/jmisb/st1002/NumberOfSectionsInXTest.java create mode 100644 st1002/src/test/java/org/jmisb/st1002/NumberOfSectionsInYTest.java create mode 100644 st1002/src/test/java/org/jmisb/st1002/PrecisionTimeStampTest.java create mode 100644 st1002/src/test/java/org/jmisb/st1002/RangeImageCompressionMethodTest.java create mode 100644 st1002/src/test/java/org/jmisb/st1002/RangeImageDataTypeTest.java create mode 100644 st1002/src/test/java/org/jmisb/st1002/RangeImageEnumerationsTest.java create mode 100644 st1002/src/test/java/org/jmisb/st1002/RangeImageLocalSetTest.java create mode 100644 st1002/src/test/java/org/jmisb/st1002/RangeImageSourceTest.java create mode 100644 st1002/src/test/java/org/jmisb/st1002/ST1002VersionNumberTest.java create mode 100644 st1002/src/test/java/org/jmisb/st1002/SectionDataIdentifierKeyTest.java create mode 100644 st1002/src/test/java/org/jmisb/st1002/SectionDataListTest.java create mode 100644 st1002/src/test/java/org/jmisb/st1002/SectionDataTest.java create mode 100644 st1002/src/test/java/org/jmisb/st1002/SinglePointRangeMeasurementColumnTest.java create mode 100644 st1002/src/test/java/org/jmisb/st1002/SinglePointRangeMeasurementRowTest.java create mode 100644 st1002/src/test/java/org/jmisb/st1002/SinglePointRangeMeasurementTest.java create mode 100644 st1002/src/test/java/org/jmisb/st1002/SinglePointRangeMeasurementUncertaintyTest.java create mode 100644 st1002/testng-unit.xml create mode 100644 st1010/SpotBugsFilter.xml create mode 100644 st1010/checkstyle.xml create mode 100644 st1010/checkstyle_suppressions.xml create mode 100644 st1010/pom.xml create mode 100644 st1010/src/main/java/module-info.java create mode 100644 st1010/src/main/java/org/jmisb/st1010/EncodingFormat.java create mode 100644 st1010/src/main/java/org/jmisb/st1010/SDCC.java create mode 100644 st1010/src/main/java/org/jmisb/st1010/SDCCParser.java create mode 100644 st1010/src/main/java/org/jmisb/st1010/SDCCParserContext.java create mode 100644 st1010/src/main/java/org/jmisb/st1010/SDCCSerialiser.java create mode 100644 st1010/src/main/java/org/jmisb/st1010/SDCCValueIdentifierKey.java create mode 100644 st1010/src/main/java/org/jmisb/st1010/SDCCValueWrap.java create mode 100644 st1010/src/main/java/org/jmisb/st1010/package-info.java create mode 100644 st1010/src/test/java/org/jmisb/st1010/EncodingFormatTest.java create mode 100644 st1010/src/test/java/org/jmisb/st1010/Mode1ParseControlTest.java create mode 100644 st1010/src/test/java/org/jmisb/st1010/Mode2ParseControlTest.java create mode 100644 st1010/src/test/java/org/jmisb/st1010/SDCCParserTest.java create mode 100644 st1010/src/test/java/org/jmisb/st1010/SDCCTest.java create mode 100644 st1010/src/test/java/org/jmisb/st1010/SDCCValueIdentifierKeyTest.java create mode 100644 st1010/src/test/java/org/jmisb/st1010/SDCCWriterTest.java create mode 100644 st1010/testng-unit.xml create mode 100644 st1202/SpotBugsFilter.xml create mode 100644 st1202/checkstyle.xml create mode 100644 st1202/checkstyle_suppressions.xml create mode 100644 st1202/pom.xml create mode 100644 st1202/src/main/java/module-info.java create mode 100644 st1202/src/main/java/org/jmisb/st1202/AbstractGeneralizedTransformationMetadataValue.java create mode 100644 st1202/src/main/java/org/jmisb/st1202/Denominator_X.java create mode 100644 st1202/src/main/java/org/jmisb/st1202/Denominator_Y.java create mode 100644 st1202/src/main/java/org/jmisb/st1202/GeneralizedTransformationLocalSet.java create mode 100644 st1202/src/main/java/org/jmisb/st1202/GeneralizedTransformationParametersKey.java create mode 100644 st1202/src/main/java/org/jmisb/st1202/IGeneralizedTransformationMetadataValue.java create mode 100644 st1202/src/main/java/org/jmisb/st1202/SDCC_FLP.java create mode 100644 st1202/src/main/java/org/jmisb/st1202/ST1202DocumentVersion.java create mode 100644 st1202/src/main/java/org/jmisb/st1202/TransformationEnumeration.java create mode 100644 st1202/src/main/java/org/jmisb/st1202/X_Numerator_Constant.java create mode 100644 st1202/src/main/java/org/jmisb/st1202/X_Numerator_X.java create mode 100644 st1202/src/main/java/org/jmisb/st1202/X_Numerator_Y.java create mode 100644 st1202/src/main/java/org/jmisb/st1202/Y_Numerator_Constant.java create mode 100644 st1202/src/main/java/org/jmisb/st1202/Y_Numerator_X.java create mode 100644 st1202/src/main/java/org/jmisb/st1202/Y_Numerator_Y.java create mode 100644 st1202/src/main/java/org/jmisb/st1202/package-info.java create mode 100644 st1202/src/test/java/org/jmisb/st1202/Denominator_X_Test.java create mode 100644 st1202/src/test/java/org/jmisb/st1202/Denominator_Y_Test.java create mode 100644 st1202/src/test/java/org/jmisb/st1202/GeneralizedTransformationLocalSetTest.java create mode 100644 st1202/src/test/java/org/jmisb/st1202/GeneralizedTransformationParametersKeyTest.java create mode 100644 st1202/src/test/java/org/jmisb/st1202/LoggerChecks.java create mode 100644 st1202/src/test/java/org/jmisb/st1202/SDCC_FLP_Test.java create mode 100644 st1202/src/test/java/org/jmisb/st1202/ST1202DocumentVersionTest.java create mode 100644 st1202/src/test/java/org/jmisb/st1202/TransformationEnumerationTest.java create mode 100644 st1202/src/test/java/org/jmisb/st1202/X_Numerator_Constant_Test.java create mode 100644 st1202/src/test/java/org/jmisb/st1202/X_Numerator_X_Test.java create mode 100644 st1202/src/test/java/org/jmisb/st1202/X_Numerator_Y_Test.java create mode 100644 st1202/src/test/java/org/jmisb/st1202/Y_Numerator_Constant_Test.java create mode 100644 st1202/src/test/java/org/jmisb/st1202/Y_Numerator_X_Test.java create mode 100644 st1202/src/test/java/org/jmisb/st1202/Y_Numerator_Y_Test.java create mode 100644 st1202/testng-unit.xml diff --git a/.github/workflows/jdk11.yml b/.github/workflows/jdk11.yml index 9f5e08225..c2189a051 100644 --- a/.github/workflows/jdk11.yml +++ b/.github/workflows/jdk11.yml @@ -74,11 +74,26 @@ jobs: with: file: ./st0903vtrack/target/site/jacoco/jacoco.xml flags: unittests-st0903-vtrack + - name: Upload ST 1002 implementation test results to Codecov + uses: codecov/codecov-action@v1.5.0 + with: + file: ./st1002/target/site/jacoco/jacoco.xml + flags: unittests-st1002 + - name: Upload ST 1010 implementation test results to Codecov + uses: codecov/codecov-action@v1.5.0 + with: + file: ./st1010/target/site/jacoco/jacoco.xml + flags: unittests-st1010 - name: Upload ST 1108 implementation test results to Codecov uses: codecov/codecov-action@v1.5.0 with: file: ./st1108/target/site/jacoco/jacoco.xml flags: unittests-st1108 + - name: Upload ST 1202 implementation test results to Codecov + uses: codecov/codecov-action@v1.5.0 + with: + file: ./st1202/target/site/jacoco/jacoco.xml + flags: unittests-st1202 - name: Upload ST 1206 implementation test results to Codecov uses: codecov/codecov-action@v1.5.0 with: diff --git a/README.md b/README.md index 1fc39f4fb..e4a8c5db8 100644 --- a/README.md +++ b/README.md @@ -49,8 +49,11 @@ The table below lists the status of currently-supported standards: | ST 0808 | Ancillary Text Metadata Sets | Implemented as of ST 0808.2. Local Set support only, no universal set support. Deprecated by MISB. | | | ST 0809 | Meteorological Metadata Local Set | Implemented as of ST 0809.2. No interoperability testing. | | | ST 0903 | Video Moving Target Indicator and Track Metadata | VMTI and VTrack Local Sets implemented as of ST 0903.5. We also support pre-ST0903.4 files. | | +| ST 1002 | Range Motion Imagery | Partly implemented as of ST 1002.2. No interoperability testing. | | +| ST 1010 | Generalized Standard Deviation and Correlation Coefficient Metadata | Partly implemented as of ST 1010.3. No support for ST 1201 formatted standard deviation values. | | | ST 1108 | Motion Imagery Interpretability and Quality Metadata | Implemented as of ST 1108.3. ST 1108.2 and earlier is also supported. No interoperability testing. | | | ST 1201 | Floating Point to Integer Mapping | Fully implemented per ST 1201.5. | | +| ST 1202 | Generalized Transformation Parameters | Mostly implemented as of ST 1202.2. | | | ST 1204 | Motion Imagery Identification System (MIIS) Core Identifier | Implemented as of ST 1204.3. | | | ST 1206 | Synthetic Aperture Radar (SAR) Motion Imagery Metadata | Implemented as of ST 1206.1. Unit tests only, no interoperability testing. | | | ST 1301 | Motion Imagery Identification System (MIIS) - Augmentation Identifiers | Implemented as of ST 1301.2. Validated with CMITT. | | diff --git a/api/src/main/java/org/jmisb/api/common/KlvParseException.java b/api/src/main/java/org/jmisb/api/common/KlvParseException.java index 3b05de492..df4328515 100644 --- a/api/src/main/java/org/jmisb/api/common/KlvParseException.java +++ b/api/src/main/java/org/jmisb/api/common/KlvParseException.java @@ -4,6 +4,7 @@ /** Indicates an error occurred during metadata parsing. */ public class KlvParseException extends Exception { + /** Internal store for inner exception. */ private final byte[] buffer; /** diff --git a/examples/README.md b/examples/README.md index 076900851..a980275de 100644 --- a/examples/README.md +++ b/examples/README.md @@ -52,6 +52,10 @@ This example considered complete. See [its README](parserplugin/README.md) for m It does a console dump of the raw KLV in a file to standard output. In this context, "raw" is the de-multiplexed stream content. This example is considered complete. See [its README](rawklv/README.md) for more information. +## rangeimagegenerator + +It generates a test file with video and ST 1002 Range Image KLV metadata. This example is a work-in-progress. + ## systemout It does a console dump of the KLV metadata in a file to standard output (`System.out` in Java, hence the name). diff --git a/examples/pom.xml b/examples/pom.xml index a08d52291..80494a090 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -23,6 +23,7 @@ rawklv annotations timetransfer + rangeimagegenerator diff --git a/examples/rangeimagegenerator/pom.xml b/examples/rangeimagegenerator/pom.xml new file mode 100644 index 000000000..88e6f0551 --- /dev/null +++ b/examples/rangeimagegenerator/pom.xml @@ -0,0 +1,48 @@ + + + 4.0.0 + + org.jmisb + examples + 2.0.0-SNAPSHOT + + rangeimagegenerator + jar + Range image generator example + Example code that generates ST 1002 range image test files. + + org.jmisb.examples.rangeimagegenerator.GeneratorCLI + + + + org.jmisb + jmisb-api-ffmpeg + ${project.version} + + + org.slf4j + slf4j-simple + + + commons-cli + commons-cli + + + org.jmisb + st1002 + ${project.version} + + + + + + com.theoryinpractise + googleformatter-maven-plugin + + + org.apache.maven.plugins + maven-shade-plugin + + + + \ No newline at end of file diff --git a/examples/rangeimagegenerator/src/main/java/module-info.java b/examples/rangeimagegenerator/src/main/java/module-info.java new file mode 100644 index 000000000..5634dedc5 --- /dev/null +++ b/examples/rangeimagegenerator/src/main/java/module-info.java @@ -0,0 +1,11 @@ +module org.jmisb.examples.rangeimagegenerator { + requires org.jmisb.api.ffmpeg; + requires org.jmisb.api; + requires org.jmisb.core; + requires org.jmisb.st1002; + requires org.jmisb.st1010; + requires org.jmisb.st1202; + requires commons.cli; + requires java.desktop; + requires org.slf4j; +} diff --git a/examples/rangeimagegenerator/src/main/java/org/jmisb/examples/rangeimagegenerator/Generator.java b/examples/rangeimagegenerator/src/main/java/org/jmisb/examples/rangeimagegenerator/Generator.java new file mode 100644 index 000000000..04b25a9f8 --- /dev/null +++ b/examples/rangeimagegenerator/src/main/java/org/jmisb/examples/rangeimagegenerator/Generator.java @@ -0,0 +1,211 @@ +package org.jmisb.examples.rangeimagegenerator; + +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.util.Map; +import java.util.SortedMap; +import java.util.TreeMap; +import java.util.UUID; +import javax.imageio.ImageIO; +import org.jmisb.api.common.KlvParseException; +import org.jmisb.api.klv.st1204.CoreIdentifier; +import org.jmisb.api.video.CodecIdentifier; +import org.jmisb.api.video.IVideoFileOutput; +import org.jmisb.api.video.KlvFormat; +import org.jmisb.api.video.MetadataFrame; +import org.jmisb.api.video.VideoFileOutput; +import org.jmisb.api.video.VideoFrame; +import org.jmisb.api.video.VideoOutputOptions; +import org.jmisb.core.video.TimingUtils; +import org.jmisb.st1002.GeneralizedTransformation; +import org.jmisb.st1002.IRangeImageMetadataValue; +import org.jmisb.st1002.RangeImageCompressionMethod; +import org.jmisb.st1002.RangeImageEnumerations; +import org.jmisb.st1002.RangeImageLocalSet; +import org.jmisb.st1002.RangeImageMetadataKey; +import org.jmisb.st1002.RangeImageSource; +import org.jmisb.st1002.RangeImageryDataType; +import org.jmisb.st1002.ST1002PrecisionTimeStamp; +import org.jmisb.st1002.ST1002VersionNumber; +import org.jmisb.st1002.SinglePointRangeMeasurement; +import org.jmisb.st1002.SinglePointRangeMeasurementColumn; +import org.jmisb.st1002.SinglePointRangeMeasurementRow; +import org.jmisb.st1010.SDCC; +import org.jmisb.st1202.Denominator_X; +import org.jmisb.st1202.Denominator_Y; +import org.jmisb.st1202.GeneralizedTransformationLocalSet; +import org.jmisb.st1202.GeneralizedTransformationParametersKey; +import org.jmisb.st1202.IGeneralizedTransformationMetadataValue; +import org.jmisb.st1202.SDCC_FLP; +import org.jmisb.st1202.ST1202DocumentVersion; +import org.jmisb.st1202.TransformationEnumeration; +import org.jmisb.st1202.X_Numerator_Constant; +import org.jmisb.st1202.X_Numerator_X; +import org.jmisb.st1202.X_Numerator_Y; +import org.jmisb.st1202.Y_Numerator_Constant; +import org.jmisb.st1202.Y_Numerator_X; +import org.jmisb.st1202.Y_Numerator_Y; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Generator { + + private static Logger LOG = LoggerFactory.getLogger(Generator.class); + private final int width = 1280; + private final int height = 960; + private final int bitRate = 500_000; + private final int gopSize = 30; + private final double frameRate = 15.0; + private final double frameDuration = 1.0 / frameRate; + private final int duration = 60; + private KlvFormat klvFormat = KlvFormat.Synchronous; + private CodecIdentifier codec = CodecIdentifier.H264; + private String filename = "rangeimage.ts"; + + public Generator() throws KlvParseException {} + + public void setKlvFormat(KlvFormat klvFormat) { + this.klvFormat = klvFormat; + } + + public void setCodec(CodecIdentifier codec) { + this.codec = codec; + } + + public void setOutputFile(String filename) { + this.filename = filename; + } + + public void generate() throws KlvParseException { + showConfiguration(); + CoreIdentifier coreIdentifier = new CoreIdentifier(); + coreIdentifier.setMinorUUID(UUID.randomUUID()); + coreIdentifier.setVersion(1); + + try (IVideoFileOutput output = + new VideoFileOutput( + new VideoOutputOptions( + width, height, bitRate, frameRate, gopSize, klvFormat, codec))) { + output.open(filename); + + BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR); + try { + image = ImageIO.read(new File("test1280.jpg")); + } catch (IOException e) { + // TODO: log + } + + final long numFrames = duration * Math.round(frameRate); + long startTime = System.currentTimeMillis(); + double pts = 1000.0 * System.currentTimeMillis(); // Close enough for this. + for (long i = 0; i < numFrames; ++i) { + output.addVideoFrame(new VideoFrame(image, pts * 1.0e-6)); + SortedMap values = new TreeMap<>(); + values.put( + RangeImageMetadataKey.PrecisionTimeStamp, + new ST1002PrecisionTimeStamp((long) pts)); + values.put(RangeImageMetadataKey.DocumentVersion, new ST1002VersionNumber(2)); + values.put( + RangeImageMetadataKey.RangeImageEnumerations, + new RangeImageEnumerations( + RangeImageCompressionMethod.NO_COMPRESSION, + RangeImageryDataType.PERSPECTIVE, + RangeImageSource.RANGE_SENSOR)); + values.put( + RangeImageMetadataKey.SinglePointRangeMeasurement, + new SinglePointRangeMeasurement(8000)); + values.put( + RangeImageMetadataKey.SinglePointRangeMeasurementRowCoordinate, + new SinglePointRangeMeasurementRow(403)); + values.put( + RangeImageMetadataKey.SinglePointRangeMeasurementColumnCoordinate, + new SinglePointRangeMeasurementColumn(803)); + Map + st1202values = new TreeMap<>(); + st1202values.put( + GeneralizedTransformationParametersKey.X_Numerator_x, new X_Numerator_X(0)); + st1202values.put( + GeneralizedTransformationParametersKey.X_Numerator_y, new X_Numerator_Y(0)); + st1202values.put( + GeneralizedTransformationParametersKey.X_Numerator_Constant, + new X_Numerator_Constant(0)); + st1202values.put( + GeneralizedTransformationParametersKey.Y_Numerator_x, new Y_Numerator_X(0)); + st1202values.put( + GeneralizedTransformationParametersKey.Y_Numerator_y, new Y_Numerator_Y(0)); + st1202values.put( + GeneralizedTransformationParametersKey.Y_Numerator_Constant, + new Y_Numerator_Constant(0)); + st1202values.put( + GeneralizedTransformationParametersKey.Denominator_x, new Denominator_X(0)); + st1202values.put( + GeneralizedTransformationParametersKey.Denominator_y, new Denominator_Y(0)); + st1202values.put( + GeneralizedTransformationParametersKey.DocumentVersion, + new ST1202DocumentVersion(2)); + SDCC sdcc = new SDCC(); + sdcc.setValues( + new double[][] { + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0} + }); + st1202values.put(GeneralizedTransformationParametersKey.SDCC, new SDCC_FLP(sdcc)); + st1202values.put( + GeneralizedTransformationParametersKey.TransformationEnumeration, + TransformationEnumeration.CHILD_PARENT); + values.put( + RangeImageMetadataKey.GeneralizedTransformationLocalSet, + new GeneralizedTransformation( + new GeneralizedTransformationLocalSet(st1202values))); + RangeImageLocalSet localSet = new RangeImageLocalSet(values); + output.addMetadataFrame(new MetadataFrame(localSet, pts)); + pts += frameDuration * 1.0e6; + long elapsedTime = System.currentTimeMillis() - startTime; + long requiredElapsedTime = (long) ((i + 1) * frameDuration * 1000.0); + long waitTime = requiredElapsedTime - elapsedTime; + if (waitTime > 0) { + TimingUtils.shortWait(waitTime); + } + } + + } catch (IOException e) { + LOG.error("Failed to write file", e); + } + } + + private void showConfiguration() { + System.out.println("Generating with configuration:"); + System.out.println(toString()); + } + + @Override + public String toString() { + return "Generator{" + + "width=" + + width + + ", height=" + + height + + ", bitRate=" + + bitRate + + ", gopSize=" + + gopSize + + ", frameRate=" + + frameRate + + ", frameDuration=" + + frameDuration + + ", duration=" + + duration + + ",\nklvFormat=" + + klvFormat + + ",\nfilename=" + + filename + + '}'; + } +} diff --git a/examples/rangeimagegenerator/src/main/java/org/jmisb/examples/rangeimagegenerator/GeneratorCLI.java b/examples/rangeimagegenerator/src/main/java/org/jmisb/examples/rangeimagegenerator/GeneratorCLI.java new file mode 100644 index 000000000..76860ce9f --- /dev/null +++ b/examples/rangeimagegenerator/src/main/java/org/jmisb/examples/rangeimagegenerator/GeneratorCLI.java @@ -0,0 +1,57 @@ +package org.jmisb.examples.rangeimagegenerator; + +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.CommandLineParser; +import org.apache.commons.cli.DefaultParser; +import org.apache.commons.cli.HelpFormatter; +import org.apache.commons.cli.Option; +import org.apache.commons.cli.Options; +import org.apache.commons.cli.ParseException; +import org.jmisb.api.common.KlvParseException; +import org.jmisb.api.video.CodecIdentifier; + +/** Range image file generator */ +public class GeneratorCLI { + + /** @param args the command line arguments */ + public static void main(String[] args) throws KlvParseException { + final Options commandLineOptions = new Options(); + commandLineOptions.addOption(new Option("o", "outputFile", true, "Output file name")); + commandLineOptions.addOption( + new Option(null, "coding", true, "The video coding to use (H.264 or H.265)")); + commandLineOptions.addOption(new Option("h", "help", false, "Show help message")); + CommandLineParser commandLineParser = new DefaultParser(); + CommandLine commandLine; + try { + commandLine = commandLineParser.parse(commandLineOptions, args); + Generator generator = new Generator(); + if (commandLine.hasOption("h")) { + showHelp(commandLineOptions); + return; + } + if (commandLine.hasOption("coding")) { + String codecName = commandLine.getOptionValue("coding"); + if (codecName.equalsIgnoreCase("H.264") || codecName.equalsIgnoreCase("H264")) { + generator.setCodec(CodecIdentifier.H264); + } else if (codecName.equalsIgnoreCase("H.265") + || codecName.equalsIgnoreCase("H265")) { + generator.setCodec(CodecIdentifier.H265); + } + } + if (commandLine.hasOption("outputFileBase")) { + generator.setOutputFile(commandLine.getOptionValue("outputFile")); + } + generator.generate(); + } catch (ParseException ex) { + showHelp(commandLineOptions); + } + } + + private static void showHelp(final Options commandLineOptions) { + String header = "Generate test MISB ST 1002 range image files\n\n"; + String footer = + "\nPlease report issues at https://github.com/WestRidgeSystems/jmisb/issues"; + HelpFormatter formatter = new HelpFormatter(); + formatter.printHelp("generator", header, commandLineOptions, footer, true); + } +} diff --git a/examples/rangeimagegenerator/test1280.jpg b/examples/rangeimagegenerator/test1280.jpg new file mode 100644 index 0000000000000000000000000000000000000000..da768be03c18770ab13a078383ab63876c6b8948 GIT binary patch literal 20534 zcmeHP2UHZvy6$0sK?DH_D>;a$WF(1%0g)tW0SN+z>(_ZO^^uzIX3?=cO6W>FTcf>i?_0uKK&`uPU%#vBLoMd1W};$|EG!({g2y?y z_>Z!%oRB=pFDxP^CdPhTO7`?A89`C8Q;-nEfddC94pJPUq&#wplZErtfB1*32WZHU z^&|ii!37Y}AdoZ&>}!ApKmbHUNCdF|BOyf+BT!^SV5%ZDm_S5ALP1VMgg}x&7z7Cs zl9*JC<`|cSmJ$L zdfPvOm?d!J6dZOp+0D4)duTU(9#8R+Cczs@!iC-#s-&qfZj#~Et8gq4PfuuieVfzk z4hy}ik2{89p04j20n*#EFc^vZrJLhVQ2s` z9ZBc$93BU>+Pwaxu0V^sni}uSR#@hmB%#TOPJDy`4>3i{kXSosiPjsONs6O+nsUi> zZtiMctTTN*+Z`PX7#5&p1i4tf)2u{%Bd63mM$1^CP9^A&{M7_F?3~uiyvx_l&4hi4 zzDQveC(9LYB;y~_y4rM@Xz|8rI2J(*abaI>by@i2z@%SJ;+Yp?BY{YTbr_7OLTrS* zRhwtvTJ5!~l^C*f(jv4y~zF$@g=YpUc@oj=9d6gEd$93G)ptO?9v&m5{H&{eH<)H>Y8(MK<+bR^{Ez1If0zfFl zg=n9MSUlbQN^MswtI6`!dc>0*7z|;Wc=b2CjQhACeYC+!bnHQ)qI20RjZYl{!VKGa zFf;(%NGD;L3WP_BUK9~K{OMc|bTwqC-4Qf$WSD4s1%!#hfXLwVHiS{%6^%vu2hYb} zJJ`n=O8c7f*(NDnMLnf6g3ClILtJo*v@5V>&#@iTi;Z+`AHE&Q!XppE(a`4e8DF9~ zGg_AZMe#^Ro9c50D)y%?QJ37(ZMlA`RjqGXDFM z2>t63hqGE#CBH8!ygfwA0mG3&=0gx?NgO%DbtlvH4x%DHZPmsem1LB?cB(3O0&d&sth(yG5_ zQ=UfoDhzlPG9S#&kR|!t|MEV?^7N#u<8MwS4*9?;*F6{%031GmT%_}yIdQb>Qrhcm z_YTT!8ESXrowqO?5oA8ppFx%+@vSvo#T4DEhHtBKuFp?I{&Ks$9)<W)(YOjLz182!6UGJ`8dUARDtpW&#S>I|_&pDA}MC08fHHTx3`4WP2+ zbw0+!mn$VTR&2gc4Jh;fkX_td64Q}U8L+0atIb=zuT}+jOeLOv0l)Wmy zSZWB|piv5h3l*~ix#*w;KfcrX?W6iqmq{^fWKxJ%HZT|hG9MZ3kR{Qy5eYM04YRaZ z+GdyRq*FcE@O>DD1&B2vE>fV6Z>CrBdcMQ-P;@XriTVnIk&kuW;S=Y-f(wo_9HdF* z_6%Zn&OdAy{P1$%i!KKk8bEe&oS4*r#}Ni1gn`IkS_EMr@)t6oTf#sj5Y7l;AR-SZ zgfI|!0w;tp5Frdi2m=v|tN2b(J6 zn`#W_SkUjRJw-QkS8w$tH93A1pPZuNrub&&AGxe>;n3{Ynv*x==UPY0CUMe9@v5>> z*PYBB)o@&&STbJ0l?aJ1o<6clLg>6%q_l^3o)1p?Exan;TLVeIWC*FUR#Y2Qu zRng1Ox8CcBOF#5aRiy1wrS0_Z+4pTtn~$9c*u1SL9oHsA?*Edn{DV06`HHf>606Og zfGzb#s`qRnF2AO@v|$Pu`)iX=ZV%hLZ(qxt33|X)gRA{*NszE_(s7*`Xj6)LbFD|1 zt2&K8D)V!uea5^$j;~H>cO&sR>8|eA=8cz7=6U~@f2d0f`9YbPXocSyy|sFLP7;>= z_p+4SGS!iqPm0fZV&n&BhT-@k;d3^q?7x_5d_8XAbCRFlfBS#GGQtB_w#GL!(WZw_ zX?6--_~@u_Q})5{Ornn;uiPD0SF$n9OXi*`S~sjm+sGQLZ>7r(qm)^6jQ=x=mQtL~6XKu71E@LrV3e&VMM zvE9P&{w)1iAR}|v62tvs+qz|w83NEeoxi+g`Ds_G0t={XZ#HhLxvn$yjrvg<7xxwd_h|Ig^RgvR)cLCzbu~S?a}$vbEKw8}E>PGfizb zBMpjQz8~LZYa0tumAW)ke8YV;sC8~_bh1{JZOBZ}cPyyn(fgaYWY+&DsWBh*hSvkQ z&&bbXqC4Z#8C+e3evw;l@avx#a;V;`sqIQ_+m(xWI{z-3FSB^3SlZkzV6U@sU|>g< z*W_GDXDoF%`m{pp;Iev=lgAu0zcg)Q&upUkW;l9sIh^%=^{IKq*Mp2+M@OR%yZY(1 zvi&YOD!a6uo%$Z#E9!0A9}x;7RGN6$wlfoDwO{*wThm8B3MjQ(Y^h+Uh0?<`WY@IC zZlvDbXr9gvIDrKmT1VpC<#-?fUA*sfio+V3W+9^M!k*4vds3s|*iB6+{iN_lmrVP# z|Is1#?5y21OqyiyrMH{7bY07ZY@f8xyDGJ4eZ4J}9c5RFs)tLs^z_D|3o9yFn-Mqt zvon_?*28fn$EB-<)MiaY=q<5rV)V7g+2GDta+~!eTy5@vRrJsnWIlF5^P-Fb&Bv`lU)LN-qx6kE$QWS($Qs=Ot&zolw|v8Z zi8Gew!}E?2*Ty<`GHl~NIMuaY$!(eHTrIZUsALw}GmGx86LcNlvW%r(EiXTzEzu_F z67DOq6tXMa-8<7AS7PAZN`;9iOO-UVj#pU;P0A_yaCEEbatnJ=EZS}e&qvp+`f!fj z^sEQjo|~xWb*Vc6r}Lz&*H1Oi;t4ozWlm!9w***MuMZix6iFZ6>3GCf zu!i{8njCtQ-U(kU9=sO%On(12MwkaHeSQ}!U;pcsm&qsk<`D>YUL0|bH+HyFQ*uy~ zI$yx^#}N^F_z@9=xThRv$;{d3`I)aJ{G5}+R*o-Fnk3b3sEdhT_da;w@=sDvdTs2= zEkCL>A6ndbZ%kFQ5WU=P>N>N#TN;Rr{{{!o<-HMWmCnz&{^c8!UGkSN&3g`~uSZj6 zwHQg;pxiFN!GO$4rD3zg{Cty|^8nwsBrh+k^aukiz&%tsHW0^q(eeqB)*DtsREC$} zmY)z7xK>{Mc{P80NGJmf%*TE*m50Fq02LExCTIbVL{dV;#FblKen#JvzkeDacNm7_ z!O`Myq3iQza9dtUk(mu4;@L++j(y^Ake3Ovr`8mJ0-&&)yviB<%Xhj|Buq=~uL^%b{^G3pDqf)%i zZ%zyhe9aQ5%DCy_GCzCa;q=g0(uQeL@whs_7+~cJ&#+HPcVbFRf7SSE9j2rA;9WQh z0G106HhuUh(h?%(@cIV-Ym-LqDHo$o_xwYZDR&H(?X zuAX83V?S@7&cL^tsepjSg_90)8@1XkN^W%pE6W|gA#3HbvSm5)>AEPYi~^v7OYD|p~MFc20cYqA^dKNEf3G|M(P zkV119mV@mFA1ittRdF|KZ$=_hl?=(9(t5a5x*S}Sxg@l(={GKb8r*od<&ZDA zw&!mwkNDsQ2je?bw{DfAo1duGjH5Lc5Mz;63;sNw%UXNb_Cy{?&fmB9RGL>>%EsfQ0iP`8~M(y3Q?Ag^E&E6b-o`}7M z9kMsD7%7RnS-Mf-Yq7u_h+UXwM>+%6tJm5M0dcE?R*TVtDb zw7T`q#!z|kz88+Dn~IrcmiT7KR{Ty+>rt8jul_abBcOr1Hs%xCbiZW1^my+UHkgzhbP6yUjM zn=f?E|7`+3eimR2NN~K@&R)!ekFNqy<`cO5q4;>gdc?m&h+o1zNC^KI=XZj(VeQK8 zI((~+CmbS{mAp3|cBb`XVjWu8ozQbT{Oz&AiAFm|Nj$zXSAD2nlD$<`-O@%M$N8{m zDM=-Zt;l&JxO-aj3vYL!q*sE^s4vpXCoY9gP>~a#EZyk1#xq0j_*3r4&DONf5k|=) zW!ur7VP&(F0~2Q6DfI(`wv%Bkk#BF>wNI<$YAyC+)GC{d*GcDBgk-cWToz8PG}*qj zkrQ=TJNo6gx3hoxfK?t|<8i$D;xVf5URl+(&_QPNEJ>s4qDtB4l}dhd9pIN`v_yYf z?l(#)+4lvdqH=D-#q%{QJoW=$pEWmF%?jV?6PJ1pj{DviiA@Ze*q5U*b~ALDrFwGa z_3L4_Et_2Z5<7=C(b8>B;1GeXpj1!r&xG4WLg0YU9vtvx_&rN--$OxZ4RoxbHxI4! z$zH5%;+vyuiCdI?mH^IXGr_SBvURo91R( zne~-fn$y&xiI^iTJHN)O*_Yz*2EE-d-Gy(gtub#5C+nSRAJ=eff?c5L&v>vA-z06B zYUuzSH4H)qS$ml|7qEbV>2tkd33Dx+2jy?K?0a3=0a>7wuDFwrHYwx4sSVf_`OWh5 zFxsG$+zO3Myf&~CTS2`A>K?Z5ZRL=*tK*RK=iV=nB0W$_j-cL2d_Mv^wh;#GLZx|h z4xjQe$b~n!pJom|C<|y)Yba$FXEG5h(Tk#va9j>4X^MT+9zL{OPsH@q&v$uT{hcd! zhXVP)Txq~B%VVpU9`|R~>~5e%7wWMKFIsO{(tQ+T8y>?6`U)Ny=F~zF@PGz3qT^R>m+zYfJ_ZIIeg#Is3blcxnq_j2f^IYuvfOig=SiqA% zfk`Jg`s9Xnxb=}8tAVJCHnE3WsBAd45Sy4kJ{+Xy6NNL)4VBLvJx_h_#g%;1;25P# zCwj!%?^v^+N89Uswz^We*t_sPb(6O;a^ngyRne(K_U!ME;{(1!Pv{q{Y*;>`A8F$Q z1L~h6egO)0XgR=H=U%CPMcz{Kz{THeQnVfKr!?wd0ao)gvay!T!P!f~!OdDjH&eQd zF+y_(@WW z(~3qN8P2rzw)d{L-b2{W{yuxoS$n$zlkk1dIgo~@9`-fIKggt2g0t7GI4`TP8kf2i zUR%(N{GuMC)vyY z**jidA&KJ$=5O4*)47{H)96^oE4+3|)#)0mGFMIkWj^Nj#x76JLflDK1f}5PS}Z_s zyyoP^-qjg5G@4_U7g+GKtOHjWzRCX_2|oWrIt2cc=z!^#f@p|R?K9wtlDg~?HL;_V z7(q)$CJH~x3CjW&l~;uRlDD(hoHAQZ7UhGW-(Tx{j+70R9l4R8E`h}TuLQY#0v7}> z2st0809 ${project.version} + + org.jmisb + st1002 + ${project.version} + + + org.jmisb + st1010 + ${project.version} + org.jmisb st1108 diff --git a/impl/src/main/java/module-info.java b/impl/src/main/java/module-info.java index 8aeed2650..04c20bab0 100644 --- a/impl/src/main/java/module-info.java +++ b/impl/src/main/java/module-info.java @@ -5,6 +5,7 @@ requires transitive org.jmisb.st0602; requires transitive org.jmisb.st0808; requires transitive org.jmisb.st0809; + requires transitive org.jmisb.st1010; requires transitive org.jmisb.st1108; requires transitive org.jmisb.st1206; requires transitive org.jmisb.st1301; diff --git a/pom.xml b/pom.xml index b2c032948..ed4e1e50d 100644 --- a/pom.xml +++ b/pom.xml @@ -49,7 +49,10 @@ st0809 st0903 st0903vtrack + st1002 + st1010 st1108 + st1202 st1206 st1301 st1403 @@ -64,7 +67,6 @@ viewer elevation examples - @@ -571,6 +573,7 @@ true 11 + true diff --git a/st0601/pom.xml b/st0601/pom.xml index 0d88c323c..060267c45 100644 --- a/st0601/pom.xml +++ b/st0601/pom.xml @@ -30,6 +30,11 @@ st0903 ${project.version} + + ${project.groupId} + st1002 + ${project.version} + ${project.groupId} st1206 diff --git a/st0601/src/main/java/module-info.java b/st0601/src/main/java/module-info.java index bacb494f6..9b3fefe46 100644 --- a/st0601/src/main/java/module-info.java +++ b/st0601/src/main/java/module-info.java @@ -9,6 +9,7 @@ requires org.jmisb.st0102; requires org.jmisb.st0806; requires transitive org.jmisb.st0903; + requires transitive org.jmisb.st1002; requires org.jmisb.st1206; requires org.jmisb.st1601; requires org.jmisb.st1602; diff --git a/st0601/src/main/java/org/jmisb/st0601/NestedRangeImageLocalSet.java b/st0601/src/main/java/org/jmisb/st0601/NestedRangeImageLocalSet.java new file mode 100644 index 000000000..51e6868a2 --- /dev/null +++ b/st0601/src/main/java/org/jmisb/st0601/NestedRangeImageLocalSet.java @@ -0,0 +1,84 @@ +package org.jmisb.st0601; + +import java.util.Set; +import org.jmisb.api.common.KlvParseException; +import org.jmisb.api.klv.IKlvKey; +import org.jmisb.api.klv.INestedKlvValue; +import org.jmisb.st1002.IRangeImageMetadataValue; +import org.jmisb.st1002.RangeImageLocalSet; + +/** + * Range Image Local Set (ST 0601 Item 97). + * + *

From ST: + * + *

+ * + *

The Range Image Local Set item allows users to include the Range Image LS (MISB ST 1002) + * within MISB ST 0601. Range Motion Imagery is a temporal sequence of range images. Each range + * image is a collection of range measurements from a sensor to target scene. A range measurement is + * the distance (e.g., meters) from an object (or area) in the scene to the sensor. The KLV + * structures of this standard are intended to allow for flexibility, efficient packing, and future + * extensions. Range Motion Imagery can be used standalone, or in collaboration with other Motion + * Imagery. + * + *

See MISB ST 1002 for generation and usage requirements. + * + *

+ */ +public class NestedRangeImageLocalSet implements IUasDatalinkValue, INestedKlvValue { + private final RangeImageLocalSet rangeImageLocalSet; + + /** + * Create from value. + * + * @param rangeImage the Range Image data as a local set + */ + public NestedRangeImageLocalSet(RangeImageLocalSet rangeImage) { + this.rangeImageLocalSet = rangeImage; + } + + /** + * Create from encoded bytes. + * + * @param bytes The byte array + * @throws KlvParseException if the input is invalid + */ + public NestedRangeImageLocalSet(byte[] bytes) throws KlvParseException { + this.rangeImageLocalSet = RangeImageLocalSet.fromNestedBytes(bytes, 0, bytes.length); + } + + @Override + public byte[] getBytes() { + return this.rangeImageLocalSet.frameMessage(true); + } + + @Override + public String getDisplayableValue() { + return "[Range Image]"; + } + + @Override + public String getDisplayName() { + return "Range Image"; + } + + /** + * Get the Range Image data. + * + * @return the Range Image data as a local set + */ + public RangeImageLocalSet getRangeImage() { + return this.rangeImageLocalSet; + } + + @Override + public IRangeImageMetadataValue getField(IKlvKey tag) { + return this.rangeImageLocalSet.getField(tag); + } + + @Override + public Set getIdentifiers() { + return this.rangeImageLocalSet.getIdentifiers(); + } +} diff --git a/st0601/src/main/java/org/jmisb/st0601/UasDatalinkFactory.java b/st0601/src/main/java/org/jmisb/st0601/UasDatalinkFactory.java index 0989ab227..932709d80 100644 --- a/st0601/src/main/java/org/jmisb/st0601/UasDatalinkFactory.java +++ b/st0601/src/main/java/org/jmisb/st0601/UasDatalinkFactory.java @@ -214,8 +214,7 @@ public static IUasDatalinkValue createValue(UasDatalinkTag tag, byte[] bytes) case TargetWidthExtended: return new TargetWidthExtended(bytes); case RangeImage: - // TODO Implement ST 1002 - return new OpaqueValue(bytes); + return new NestedRangeImageLocalSet(bytes); case Georegistration: return new NestedGeoRegistrationLocalSet(bytes); case CompositeImaging: diff --git a/st0601/src/main/java/org/jmisb/st0601/UasDatalinkTag.java b/st0601/src/main/java/org/jmisb/st0601/UasDatalinkTag.java index 4b98152c7..9779cf455 100644 --- a/st0601/src/main/java/org/jmisb/st0601/UasDatalinkTag.java +++ b/st0601/src/main/java/org/jmisb/st0601/UasDatalinkTag.java @@ -318,7 +318,8 @@ public enum UasDatalinkTag implements IKlvKey { /** Tag 96; Target width within sensor field of view; Value is a {@link TargetWidthExtended}. */ TargetWidthExtended(96), /** - * Tag 97; MISB ST 1002 Range Imaging Local Set metadata items; Value is a {@link OpaqueValue}. + * Tag 97; MISB ST 1002 Range Imaging Local Set metadata items; Value is a {@link + * NestedRangeImageLocalSet}. */ RangeImage(97), /** diff --git a/st0601/src/test/java/org/jmisb/st0601/NestedRangeImageLocalSetTest.java b/st0601/src/test/java/org/jmisb/st0601/NestedRangeImageLocalSetTest.java new file mode 100644 index 000000000..6667cb8b4 --- /dev/null +++ b/st0601/src/test/java/org/jmisb/st0601/NestedRangeImageLocalSetTest.java @@ -0,0 +1,121 @@ +package org.jmisb.st0601; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; + +import java.util.Set; +import java.util.SortedMap; +import java.util.TreeMap; +import org.jmisb.api.common.KlvParseException; +import org.jmisb.st1002.IRangeImageMetadataValue; +import org.jmisb.st1002.RangeImageLocalSet; +import org.jmisb.st1002.RangeImageMetadataKey; +import org.jmisb.st1002.ST1002PrecisionTimeStamp; +import org.jmisb.st1002.ST1002VersionNumber; +import org.jmisb.st1002.SinglePointRangeMeasurement; +import org.testng.Assert; +import org.testng.annotations.Test; + +public class NestedRangeImageLocalSetTest { + + private final byte[] localSetAsByteArray = + new byte[] { + 0x01, + 0x08, + 0x00, + 0x05, + (byte) 0xf2, + (byte) 0xf6, + 0x17, + 0x66, + 0x25, + 0x00, + 0x0b, + 0x01, + 0x02, + 0x0d, + 0x08, + 0x40, + (byte) 0xa5, + (byte) 0xe8, + 0x33, + 0x33, + 0x33, + 0x33, + 0x33, + 0x15, + 0x02, + (byte) 0x72, + (byte) 0x41 + }; + + @Test + public void testConstructFromLocalSet() { + NestedRangeImageLocalSet uut = new NestedRangeImageLocalSet(makeLocalSet()); + Assert.assertNotNull(uut); + checkLocalSetValues(uut); + assertEquals(uut.getBytes(), localSetAsByteArray); + } + + @Test + public void testConstructFromBytes() throws KlvParseException { + NestedRangeImageLocalSet localSetFromBytes = + new NestedRangeImageLocalSet(localSetAsByteArray); + Assert.assertNotNull(localSetFromBytes); + checkLocalSetValues(localSetFromBytes); + } + + @Test + public void testFactory() throws KlvParseException { + IUasDatalinkValue value = + UasDatalinkFactory.createValue(UasDatalinkTag.RangeImage, localSetAsByteArray); + Assert.assertTrue(value instanceof NestedRangeImageLocalSet); + NestedRangeImageLocalSet localSet = (NestedRangeImageLocalSet) value; + Assert.assertNotNull(localSet); + checkLocalSetValues(localSet); + } + + private void checkLocalSetValues(NestedRangeImageLocalSet nestedLocalSet) { + Assert.assertEquals(nestedLocalSet.getDisplayName(), "Range Image"); + Assert.assertEquals(nestedLocalSet.getDisplayableValue(), "[Range Image]"); + assertTrue(nestedLocalSet.getRangeImage() instanceof RangeImageLocalSet); + assertEquals(nestedLocalSet.getRangeImage().getIdentifiers().size(), 3); + assertEquals(nestedLocalSet.getIdentifiers().size(), 3); + assertTrue( + nestedLocalSet + .getIdentifiers() + .containsAll( + Set.of( + RangeImageMetadataKey.DocumentVersion, + RangeImageMetadataKey.PrecisionTimeStamp, + RangeImageMetadataKey.SinglePointRangeMeasurement))); + IRangeImageMetadataValue docVersion = + nestedLocalSet.getField(RangeImageMetadataKey.DocumentVersion); + assertTrue(docVersion instanceof ST1002VersionNumber); + assertEquals(docVersion.getDisplayName(), "Version Number"); + assertEquals(docVersion.getDisplayableValue(), "ST 1002.2"); + IRangeImageMetadataValue name = + nestedLocalSet.getField(RangeImageMetadataKey.PrecisionTimeStamp); + assertTrue(name instanceof ST1002PrecisionTimeStamp); + assertEquals(name.getDisplayName(), "Precision Time Stamp"); + assertEquals(name.getDisplayableValue(), "1674513652000000"); + IRangeImageMetadataValue version = + nestedLocalSet.getField(RangeImageMetadataKey.SinglePointRangeMeasurement); + assertTrue(version instanceof SinglePointRangeMeasurement); + assertEquals(version.getDisplayName(), "Single Point Range Measurement"); + assertEquals(version.getDisplayableValue(), "2804.100 m"); + } + + private RangeImageLocalSet makeLocalSet() { + SortedMap map = new TreeMap<>(); + map.put(RangeImageMetadataKey.DocumentVersion, new ST1002VersionNumber(2)); + map.put( + RangeImageMetadataKey.PrecisionTimeStamp, + new ST1002PrecisionTimeStamp(1674513652000000L)); + map.put( + RangeImageMetadataKey.SinglePointRangeMeasurement, + new SinglePointRangeMeasurement(2804.1)); + RangeImageLocalSet localSet = new RangeImageLocalSet(map); + return localSet; + } +} diff --git a/st1002/checkstyle.xml b/st1002/checkstyle.xml new file mode 100644 index 000000000..41e751804 --- /dev/null +++ b/st1002/checkstyle.xml @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/st1002/checkstyle_suppressions.xml b/st1002/checkstyle_suppressions.xml new file mode 100644 index 000000000..97784b708 --- /dev/null +++ b/st1002/checkstyle_suppressions.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/st1002/pom.xml b/st1002/pom.xml new file mode 100644 index 000000000..f67f9b07e --- /dev/null +++ b/st1002/pom.xml @@ -0,0 +1,100 @@ + + + 4.0.0 + + org.jmisb + jmisb + 2.0.0-SNAPSHOT + + st1002 + 2.0.0-SNAPSHOT + ST 1002 Range Motion Imagery + jmisb implementation of ST 1002 Range Motion Imagery + + + org.jmisb + jmisb-core + ${project.version} + + + org.jmisb + jmisb-api + ${project.version} + + + org.jmisb + st1202 + ${project.version} + + + org.slf4j + slf4j-api + + + org.testng + testng + test + + + com.github.valfirst + slf4j-test + test + + + + + + + com.theoryinpractise + googleformatter-maven-plugin + + + org.apache.maven.plugins + maven-surefire-plugin + + + testng-unit.xml + + + + surefire.testng.verbose + ${surefire.verbosity} + + + + + + com.github.spotbugs + spotbugs-maven-plugin + + + org.apache.maven.plugins + maven-checkstyle-plugin + + + edu.berkeley.cs.jqf + jqf-maven-plugin + + + + + + + generate-sbom-cyclonedx + + + performRelease + true + + + + + + org.cyclonedx + cyclonedx-maven-plugin + + + + + + diff --git a/st1002/src/main/java/module-info.java b/st1002/src/main/java/module-info.java new file mode 100644 index 000000000..10efd59e4 --- /dev/null +++ b/st1002/src/main/java/module-info.java @@ -0,0 +1,43 @@ +/** + * MISB ST 1002 Range Motion Imagery implementation for jmisb. + * + *

This module provides an implementation of the MISB ST 1002 standard, which describes Range + * Motion Imagery, its format and supporting metadata. + * + *

Range Motion Imagery is a temporal sequence of Range Images. Each Range Image is a collection + * of Range Measurements from a sensor to target scene. A Range Measurement is the distance (e.g., + * meters) from an object (or area) in the scene to the sensor. The KLV structures of this Standard + * are intended to allow for flexibility, efficient packing, and future extensions. Range Motion + * Imagery can be used standalone or in collaboration with other Motion Imagery. MISB ST 1107 Metric + * Geopositioning Metadata Set provides the basis for collaborating with other Motion Imagery types. + * + *

This standard describes the: + * + *

    + *
  • Perspective Range Motion Imagery and Depth Range Motion Imagery; + *
  • the collection methods of Range Motion Imagery; + *
  • the formats used for storing or transmitting Range Motion Imagery; + *
  • the supporting metadata needed for Range Motion Imagery including: + *
      + *
    • temporal + *
    • uncertainty, and + *
    • compression parameters; + *
    + * and + *
  • the alignment to Collaborative Imagery. + *
+ */ +@SuppressWarnings("module") // That is not a version number - its a document number. +module org.jmisb.st1002 { + requires org.jmisb.api; + requires org.jmisb.st1202; + requires org.slf4j; + + uses org.jmisb.api.klv.IMisbMessageFactory; + + // If this is updated, ensure src/main/resources/META-INF/services is updated + provides org.jmisb.api.klv.IMisbMessageFactory with + org.jmisb.st1002.RangeImageLocalSetFactory; + + exports org.jmisb.st1002; +} diff --git a/st1002/src/main/java/org/jmisb/st1002/GeneralizedTransformation.java b/st1002/src/main/java/org/jmisb/st1002/GeneralizedTransformation.java new file mode 100644 index 000000000..ce1ed917d --- /dev/null +++ b/st1002/src/main/java/org/jmisb/st1002/GeneralizedTransformation.java @@ -0,0 +1,85 @@ +package org.jmisb.st1002; + +import java.util.Set; +import org.jmisb.api.common.KlvParseException; +import org.jmisb.api.klv.IKlvKey; +import org.jmisb.api.klv.IKlvValue; +import org.jmisb.api.klv.INestedKlvValue; +import org.jmisb.st1202.GeneralizedTransformationLocalSet; + +/** + * Generalized Transformation (ST 1002 Local Set Item 19). + * + *

The Generalized Transformation is a mathematical transformation used to project information, + * points, or lines from one image plane into a second image plane. The use of the Generalized + * Transformation Local Set, MISB ST 1202, is for specific cases when aligning a Range Image to a + * Collaborative Sensors Image. In this case, the Range Image is said to be a child of the + * Collaborative Image (i.e., the parent image), so the Child-Parent Transformation (CPT) + * enumeration 2 defined in Table 1 of MISB ST 1202, is used. + * + *

The boresighted imaging case is a hardware solution, where multiple focal plane arrays are + * simultaneously imaging through a single aperture. The hardware limits the variation in the + * perspective centres and the principal axis of the system to be coincident. Therefore, the + * three-dimensional scene is imaged on two, dependent, focal plane arrays, where the dependency is + * in the geometry. These focal planes do not necessarily have the same orientation or identical + * pixel sizes. Also, the magnification of the two optical paths can be different causing different + * image scales. These effects can be sufficiently modelled using the Generalized Transformation. + * + *

Co-Boresighted
+ * sensors + * + *

When the Range Imagery does not meet the requirements for being co-boresighted, the Range + * Imagery is called non-boresighted, and a transformation is needed to align the Range Imagery with + * the Collaborative Imagery. + * + *

Non-Boresighted sensors + */ +public class GeneralizedTransformation implements IRangeImageMetadataValue, INestedKlvValue { + + private final GeneralizedTransformationLocalSet localSet; + + /** + * Create from encoded bytes. + * + * @param localset value part of the nested local set, without UniversalLabel or overall length + */ + public GeneralizedTransformation(final GeneralizedTransformationLocalSet localset) { + this.localSet = localset; + } + + /** + * Create from encoded bytes. + * + * @param bytes Encoded byte array for the nested local set. + * @throws KlvParseException if parsing fails + */ + public GeneralizedTransformation(byte[] bytes) throws KlvParseException { + this.localSet = new GeneralizedTransformationLocalSet(bytes); + } + + @Override + public byte[] getBytes() { + return localSet.frameMessage(true); + } + + @Override + public String getDisplayName() { + return "Generalized Transformation Local Set"; + } + + @Override + public String getDisplayableValue() { + return localSet.displayHeader(); + } + + @Override + public IKlvValue getField(IKlvKey tag) { + return localSet.getField(tag); + } + + @Override + public Set getIdentifiers() { + return localSet.getIdentifiers(); + } +} diff --git a/st1002/src/main/java/org/jmisb/st1002/IRangeImageMetadataValue.java b/st1002/src/main/java/org/jmisb/st1002/IRangeImageMetadataValue.java new file mode 100644 index 000000000..aaff4563f --- /dev/null +++ b/st1002/src/main/java/org/jmisb/st1002/IRangeImageMetadataValue.java @@ -0,0 +1,17 @@ +package org.jmisb.st1002; + +import org.jmisb.api.klv.IKlvValue; + +/** + * ST 1002 metadata value. + * + *

All ST 1002 Range Image Local Set values implement this interface. + */ +public interface IRangeImageMetadataValue extends IKlvValue { + /** + * Get the encoded bytes. + * + * @return The encoded byte array + */ + byte[] getBytes(); +} diff --git a/st1002/src/main/java/org/jmisb/st1002/NumberOfSectionsInX.java b/st1002/src/main/java/org/jmisb/st1002/NumberOfSectionsInX.java new file mode 100644 index 000000000..555855a02 --- /dev/null +++ b/st1002/src/main/java/org/jmisb/st1002/NumberOfSectionsInX.java @@ -0,0 +1,84 @@ +package org.jmisb.st1002; + +import org.jmisb.api.klv.Ber; +import org.jmisb.api.klv.BerDecoder; +import org.jmisb.api.klv.BerEncoder; +import org.jmisb.api.klv.BerField; + +/** + * Number of Sections in X (ST 1002 Range Image Local Set Tag 17). + * + *

Range Imagery Data is a rectangular array of Range Measurements. Range Imagery Data can be + * formatted in whole or in separate parts, where each part is called a Section. Sections are + * rectangular areas that when combined form the full image. Each Section can be compressed to + * provide the most efficient transmission and storage. ST 1002.2 requires Sections to be in simple + * layout. A simple Section layout divides the image into either horizontal or vertical strips. All + * horizontal strips have the same width as the full image but can vary in height as needed as + * illustrated below. + * + *

Five
+ * horizontal sections + * + *

All vertical strips have the same height as the full image but can vary in width as + * illustrated below. + * + *

Three
+ * vertical sections + * + *

When the Range Image is formatted into separate Sections, the Range Image Local Set will + * contain multiple Section Data Variable Length Packs. Specifically, the number of Section Data + * Variable Length Packs will be the Number of Sections in X multiplied by the Number of Sections in + * Y. + * + * @see NumberOfSectionsInY + */ +public class NumberOfSectionsInX implements IRangeImageMetadataValue { + + private final int value; + + /** + * Create from value. + * + * @param numberOfSections the number of Sections, at least 1 + */ + public NumberOfSectionsInX(int numberOfSections) { + if (numberOfSections < 1) { + throw new IllegalArgumentException("ST 1002 Number of Sections in X must be positive"); + } + this.value = numberOfSections; + } + + /** + * Create from encoded bytes. + * + * @param bytes Byte array containing BER-OID formatted value number + */ + public NumberOfSectionsInX(byte[] bytes) { + BerField berField = BerDecoder.decode(bytes, 0, true); + this.value = berField.getValue(); + } + + /** + * Get the number of sections. + * + * @return the number of sections + */ + public int getNumberOfSections() { + return value; + } + + @Override + public byte[] getBytes() { + return BerEncoder.encode(value, Ber.OID); + } + + @Override + public String getDisplayName() { + return "Number of Sections in X"; + } + + @Override + public String getDisplayableValue() { + return String.format("%d", value); + } +} diff --git a/st1002/src/main/java/org/jmisb/st1002/NumberOfSectionsInY.java b/st1002/src/main/java/org/jmisb/st1002/NumberOfSectionsInY.java new file mode 100644 index 000000000..4fd168030 --- /dev/null +++ b/st1002/src/main/java/org/jmisb/st1002/NumberOfSectionsInY.java @@ -0,0 +1,84 @@ +package org.jmisb.st1002; + +import org.jmisb.api.klv.Ber; +import org.jmisb.api.klv.BerDecoder; +import org.jmisb.api.klv.BerEncoder; +import org.jmisb.api.klv.BerField; + +/** + * Number of Sections in Y (ST 1002 Range Image Local Set Tag 18). + * + *

Range Imagery Data is a rectangular array of Range Measurements. Range Imagery Data can be + * formatted in whole or in separate parts, where each part is called a Section. Sections are + * rectangular areas that when combined form the full image. Each Section can be compressed to + * provide the most efficient transmission and storage. ST 1002.2 requires Sections to be in simple + * layout. A simple Section layout divides the image into either horizontal or vertical strips. All + * horizontal strips have the same width as the full image but can vary in height as needed as + * illustrated below. + * + *

Five
+ * horizontal sections + * + *

All vertical strips have the same height as the full image but can vary in width as + * illustrated below. + * + *

Three
+ * vertical sections + * + *

When the Range Image is formatted into separate Sections, the Range Image Local Set will + * contain multiple Section Data Variable Length Packs. Specifically, the number of Section Data + * Variable Length Packs will be the Number of Sections in X multiplied by the Number of Sections in + * Y. + * + * @see NumberOfSectionsInX + */ +public class NumberOfSectionsInY implements IRangeImageMetadataValue { + + private final int value; + + /** + * Create from value. + * + * @param numberOfSections the number of Sections, at least 1 + */ + public NumberOfSectionsInY(int numberOfSections) { + if (numberOfSections < 1) { + throw new IllegalArgumentException("ST 1002 Number of Sections in Y must be positive"); + } + this.value = numberOfSections; + } + + /** + * Create from encoded bytes. + * + * @param bytes Byte array containing BER-OID formatted value number + */ + public NumberOfSectionsInY(byte[] bytes) { + BerField berField = BerDecoder.decode(bytes, 0, true); + this.value = berField.getValue(); + } + + /** + * Get the number of sections. + * + * @return the number of sections + */ + public int getNumberOfSections() { + return value; + } + + @Override + public byte[] getBytes() { + return BerEncoder.encode(value, Ber.OID); + } + + @Override + public String getDisplayName() { + return "Number of Sections in Y"; + } + + @Override + public String getDisplayableValue() { + return String.format("%d", value); + } +} diff --git a/st1002/src/main/java/org/jmisb/st1002/RangeImageCompressionMethod.java b/st1002/src/main/java/org/jmisb/st1002/RangeImageCompressionMethod.java new file mode 100644 index 000000000..a6a532a18 --- /dev/null +++ b/st1002/src/main/java/org/jmisb/st1002/RangeImageCompressionMethod.java @@ -0,0 +1,64 @@ +package org.jmisb.st1002; + +/** + * Range Image Compression Method. + * + *

This enumeration describes the available compression used for reducing the number of bytes of + * the range image. There are currently only two valid values - no compression, and planar fit. See + * ST 1002.2 Section 7 for a description of planar fit. + * + * @see RangeImageEnumerations + */ +public enum RangeImageCompressionMethod { + /** + * Unknown value. + * + *

This is not a valid compression method, and indicates a problem with decoding. + */ + UNKNOWN(-1, "Unknown"), + /** No compression. */ + NO_COMPRESSION(0, "No Compression"), + /** Planar fit. */ + PLANAR_FIT(1, "Planar Fit"); + + /** + * Look up Range Image Compression Method by encoded value. + * + * @param value the encoded (integer) value + * @return the corresponding enumeration value + */ + public static RangeImageCompressionMethod lookup(int value) { + for (RangeImageCompressionMethod method : values()) { + if (method.getEncodedValue() == value) { + return method; + } + } + return UNKNOWN; + } + + private final int encodedValue; + private final String textDescription; + + private RangeImageCompressionMethod(int value, String description) { + this.encodedValue = value; + this.textDescription = description; + } + + /** + * Encoded value. + * + * @return integer representation of the enumeration + */ + public int getEncodedValue() { + return encodedValue; + } + + /** + * Text description. + * + * @return human readable description of the enumeration meaning. + */ + public String getTextDescription() { + return textDescription; + } +} diff --git a/st1002/src/main/java/org/jmisb/st1002/RangeImageEnumerations.java b/st1002/src/main/java/org/jmisb/st1002/RangeImageEnumerations.java new file mode 100644 index 000000000..d2a4466e8 --- /dev/null +++ b/st1002/src/main/java/org/jmisb/st1002/RangeImageEnumerations.java @@ -0,0 +1,137 @@ +package org.jmisb.st1002; + +import org.jmisb.api.klv.Ber; +import org.jmisb.api.klv.BerDecoder; +import org.jmisb.api.klv.BerEncoder; +import org.jmisb.api.klv.BerField; + +/** + * Range Image Enumerations (ST 1002 Range Image Local Set Tag 12). + * + *

Range Image Enumerations is a set of enumerated values encoded as a BER-OID integer value. + * Range Image Enumerations contains three separate enumerated values: + * + *

    + *
  • Range Image Source, + *
  • Range Image Data Type, and + *
  • Range Image Compression Method. + *
+ * + *

Range Image Source declares how the Range Imagery was created, either from a Range Sensor or + * Computationally Extracted, as described in Section 5. This enumeration has two values, so it + * consumes one bit of the Range Image Enumerations value. + * + *

Range Imagery Data Type declares the type of Range Imagery, either Perspective Range Image or + * Depth Range Image. To allow for further types to be defined in the future this enumeration has + * eight values (0 through 7), where currently only two values are defined: 0=Perspective Range + * Image and 1=Depth Range Image. + * + *

Range Imagery Compression Method declares the method of compression used for reducing the + * number of bytes of the Range Image. One method of compression is called Planar Fit, described in + * ST 1002.2 Section 7. To allow for further compression techniques to be defined in the future, + * this enumeration has eight values (0 through 7), where currently only two values are defined: + * 0=No Compression and 1=Planar Fit. + */ +public class RangeImageEnumerations implements IRangeImageMetadataValue { + + private final RangeImageCompressionMethod compressionMethod; + private final RangeImageryDataType dataType; + private final RangeImageSource rangeImageSource; + private static final int COMPRESSION_METHOD_MASK = 0b00000111; + private static final int DATA_TYPE_BIT_SHIFT = 3; + private static final int DATA_TYPE_MASK = 0b00111000; + private static final int SOURCE_BIT_SHIFT = 6; + private static final int SOURCE_MASK = 0b01000000; + + /** + * Construct from values. + * + * @param compressionMethod the compression method enumeration value + * @param dataType the range imagery data type enumeration value + * @param rangeImageSource the range image source enumeration value + */ + public RangeImageEnumerations( + RangeImageCompressionMethod compressionMethod, + RangeImageryDataType dataType, + RangeImageSource rangeImageSource) { + this.compressionMethod = compressionMethod; + this.dataType = dataType; + this.rangeImageSource = rangeImageSource; + } + + /** + * Construct from encoded bytes. + * + * @param bytes byte array (currently only length 1) + */ + public RangeImageEnumerations(byte[] bytes) { + BerField ber = BerDecoder.decode(bytes, 0, true); + int value = ber.getValue(); + this.compressionMethod = + RangeImageCompressionMethod.lookup(value & COMPRESSION_METHOD_MASK); + this.dataType = + RangeImageryDataType.lookup((value & DATA_TYPE_MASK) >> DATA_TYPE_BIT_SHIFT); + this.rangeImageSource = RangeImageSource.lookup((value & SOURCE_MASK) >> SOURCE_BIT_SHIFT); + } + + @Override + public byte[] getBytes() { + if (compressionMethod == RangeImageCompressionMethod.UNKNOWN) { + throw new IllegalArgumentException("Range Image Compression Method cannot be UNKNOWN"); + } + if (dataType == RangeImageryDataType.UNKNOWN) { + throw new IllegalArgumentException("Range Imagery Data Type cannot be UNKNOWN"); + } + if (rangeImageSource == RangeImageSource.UNKNOWN) { + throw new IllegalArgumentException("Range Image Source cannot be UNKNOWN"); + } + int value = 0; + value += compressionMethod.getEncodedValue(); + value += (dataType.getEncodedValue() << DATA_TYPE_BIT_SHIFT); + value += (rangeImageSource.getEncodedValue() << SOURCE_BIT_SHIFT); + return BerEncoder.encode(value, Ber.OID); + } + + @Override + public String getDisplayName() { + return "Range Image Enumerations"; + } + + @Override + public String getDisplayableValue() { + StringBuilder sb = new StringBuilder(); + sb.append(rangeImageSource.getTextDescription()); + sb.append(" | "); + sb.append(dataType.getTextDescription()); + sb.append(" | "); + sb.append(compressionMethod.getTextDescription()); + return sb.toString(); + } + + /** + * Range image compression method. + * + * @return the range image compression method as an enumerated value. + */ + public RangeImageCompressionMethod getCompressionMethod() { + return this.compressionMethod; + } + + /** + * Range imagery data type. + * + * @return the range imagery data type as an enumerated value. + */ + public RangeImageryDataType getDataType() { + return dataType; + } + + /** + * Range image source. + * + * @return the range image source as an enumerated value. + */ + public RangeImageSource getRangeImageSource() { + return rangeImageSource; + } +} diff --git a/st1002/src/main/java/org/jmisb/st1002/RangeImageLocalSet.java b/st1002/src/main/java/org/jmisb/st1002/RangeImageLocalSet.java new file mode 100644 index 000000000..a8087d921 --- /dev/null +++ b/st1002/src/main/java/org/jmisb/st1002/RangeImageLocalSet.java @@ -0,0 +1,222 @@ +package org.jmisb.st1002; + +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.SortedMap; +import java.util.TreeMap; +import org.jmisb.api.common.InvalidDataHandler; +import org.jmisb.api.common.KlvParseException; +import org.jmisb.api.klv.ArrayBuilder; +import org.jmisb.api.klv.BerDecoder; +import org.jmisb.api.klv.BerField; +import org.jmisb.api.klv.CrcCcitt; +import org.jmisb.api.klv.IKlvKey; +import org.jmisb.api.klv.IMisbMessage; +import org.jmisb.api.klv.LdsField; +import org.jmisb.api.klv.LdsParser; +import org.jmisb.api.klv.UniversalLabel; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Range Image Local Set. + * + *

This is the core ST 1002 Local Set. + */ +public class RangeImageLocalSet implements IMisbMessage { + + private static final int CRC16_LENGTH = 2; + + /** + * Universal label for Range Image Local Set. + * + *

See ST 1002.2 Table 2. + */ + public static final UniversalLabel RangeImageLocalSetUl = + new UniversalLabel( + new byte[] { + 0x06, 0x0E, 0x2B, 0x34, 0x02, 0x0B, 0x01, 0x01, 0x0E, 0x01, 0x03, 0x03, + 0x0C, 0x00, 0x00, 0x00 + }); + + private static final Logger LOGGER = LoggerFactory.getLogger(RangeImageLocalSet.class); + + /** + * Create a {@link IRangeImageMetadataValue} instance from encoded bytes. + * + * @param tag The tag defining the value type + * @param bytes Encoded bytes + * @return The new instance + * @throws KlvParseException if the parsing of the encoded bytes fails + */ + static IRangeImageMetadataValue createValue(RangeImageMetadataKey tag, byte[] bytes) + throws KlvParseException { + switch (tag) { + case PrecisionTimeStamp: + return new ST1002PrecisionTimeStamp(bytes); + case DocumentVersion: + return new ST1002VersionNumber(bytes); + case RangeImageEnumerations: + return new RangeImageEnumerations(bytes); + case SinglePointRangeMeasurement: + return new SinglePointRangeMeasurement(bytes); + case SinglePointRangeMeasurementUncertainty: + return new SinglePointRangeMeasurementUncertainty(bytes); + case SinglePointRangeMeasurementRowCoordinate: + return new SinglePointRangeMeasurementRow(bytes); + case SinglePointRangeMeasurementColumnCoordinate: + return new SinglePointRangeMeasurementColumn(bytes); + case NumberOfSectionsInX: + return new NumberOfSectionsInX(bytes); + case NumberOfSectionsInY: + return new NumberOfSectionsInY(bytes); + case GeneralizedTransformationLocalSet: + return new GeneralizedTransformation(bytes); + default: + LOGGER.info("Unknown Range Image Metadata tag: {}", tag); + } + return null; + } + + /** Map containing all elements in the message. */ + private final SortedMap map = new TreeMap<>(); + + /** + * Create the local set from the given key/value pairs. + * + * @param values Tag/value pairs to be included in the local set + */ + public RangeImageLocalSet(Map values) { + map.putAll(values); + } + + /** + * Build a Range Image Local Set from encoded bytes. + * + *

The encoding is assumed to be nested (i.e. it does not have the Universal Label or length + * parts). You can use the constructor taking a byte array for the non-nested case. + * + * @param bytes the bytes to build from + * @param offset the index into the {@code bytes} array to start parsing from + * @param len the number of bytes to parse (starting at {@code offset}. + * @return local set corresponding to the provided bytes + * @throws KlvParseException if parsing fails + */ + public static RangeImageLocalSet fromNestedBytes(final byte[] bytes, int offset, int len) + throws KlvParseException { + return new RangeImageLocalSet(parseValues(bytes, offset, len)); + } + + /** + * Build a Range Image Local Set from encoded bytes. + * + * @param bytes the bytes to build from + * @throws KlvParseException if parsing fails + */ + public RangeImageLocalSet(final byte[] bytes) throws KlvParseException { + int offset = UniversalLabel.LENGTH; + BerField len = BerDecoder.decode(bytes, offset, false); + offset += len.getLength(); + SortedMap values = + parseValues(bytes, offset, len.getValue()); + map.putAll(values); + } + + private static SortedMap parseValues( + final byte[] bytes, int offset, int len) throws KlvParseException { + SortedMap map = new TreeMap<>(); + List fields = LdsParser.parseFields(bytes, offset, len); + for (LdsField field : fields) { + RangeImageMetadataKey key = RangeImageMetadataKey.getKey(field.getTag()); + switch (key) { + case Undefined: + LOGGER.info("Unknown Range Image Metadata tag: {}", field.getTag()); + break; + case CRC16CCITT: + if (!CrcCcitt.verify(bytes, field.getData())) { + InvalidDataHandler handler = InvalidDataHandler.getInstance(); + handler.handleInvalidChecksum(LOGGER, "Bad checksum"); + } + break; + case SectionDataVLP: + SectionData sectionData = new SectionData(field.getData()); + if (!map.containsKey(RangeImageMetadataKey.SectionDataVLP)) { + map.put(RangeImageMetadataKey.SectionDataVLP, new SectionDataList()); + } + SectionDataList sectionDataList = + (SectionDataList) map.get(RangeImageMetadataKey.SectionDataVLP); + sectionDataList.add(sectionData); + break; + default: + IRangeImageMetadataValue value = createValue(key, field.getData()); + map.put(key, value); + } + } + return map; + } + + @Override + public byte[] frameMessage(boolean isNested) { + ArrayBuilder builder = new ArrayBuilder(); + for (RangeImageMetadataKey tag : map.keySet()) { + if (tag.equals(RangeImageMetadataKey.Undefined)) { + // We can't serialise this + continue; + } + if (tag.equals(RangeImageMetadataKey.CRC16CCITT)) { + // handled at the end. + continue; + } + if (tag.equals(RangeImageMetadataKey.SectionDataVLP)) { + SectionDataList sectionDataList = (SectionDataList) getField(tag); + List sectionDataPacks = sectionDataList.getPacks(); + for (SectionData sectionData : sectionDataPacks) { + try { + byte[] valueBytes = sectionData.getBytes(); + builder.appendAsOID(tag.getIdentifier()); + builder.appendAsBerLength(valueBytes.length); + builder.append(valueBytes); + } catch (KlvParseException ex) { + LOGGER.warn("Failed to serialize ST 1002 Section Data:" + ex.getMessage()); + } + } + } else { + builder.appendAsOID(tag.getIdentifier()); + byte[] valueBytes = getField(tag).getBytes(); + builder.appendAsBerLength(valueBytes.length); + builder.append(valueBytes); + } + } + builder.appendAsOID(RangeImageMetadataKey.CRC16CCITT.getIdentifier()); + builder.appendAsBerLength(CRC16_LENGTH); + if (!isNested) { + builder.prependLengthPlus(2); + builder.prepend(RangeImageLocalSetUl); + } + CrcCcitt crc = new CrcCcitt(); + crc.addData(builder.toBytes()); + builder.append(crc.getCrc()); + return builder.toBytes(); + } + + @Override + public Set getIdentifiers() { + return map.keySet(); + } + + @Override + public IRangeImageMetadataValue getField(IKlvKey key) { + return map.get((RangeImageMetadataKey) key); + } + + @Override + public UniversalLabel getUniversalLabel() { + return RangeImageLocalSetUl; + } + + @Override + public String displayHeader() { + return "ST 1002 Range Image"; + } +} diff --git a/st1002/src/main/java/org/jmisb/st1002/RangeImageLocalSetFactory.java b/st1002/src/main/java/org/jmisb/st1002/RangeImageLocalSetFactory.java new file mode 100644 index 000000000..6e87d17cb --- /dev/null +++ b/st1002/src/main/java/org/jmisb/st1002/RangeImageLocalSetFactory.java @@ -0,0 +1,19 @@ +package org.jmisb.st1002; + +import org.jmisb.api.common.KlvParseException; +import org.jmisb.api.klv.IMisbMessageFactory; +import org.jmisb.api.klv.UniversalLabel; + +/** Factory method for RangeImageLocalSet. */ +public class RangeImageLocalSetFactory implements IMisbMessageFactory { + + @Override + public RangeImageLocalSet create(byte[] bytes) throws KlvParseException { + return new RangeImageLocalSet(bytes); + } + + @Override + public UniversalLabel getUniversalLabel() { + return RangeImageLocalSet.RangeImageLocalSetUl; + } +} diff --git a/st1002/src/main/java/org/jmisb/st1002/RangeImageMetadataKey.java b/st1002/src/main/java/org/jmisb/st1002/RangeImageMetadataKey.java new file mode 100644 index 000000000..43aac09f8 --- /dev/null +++ b/st1002/src/main/java/org/jmisb/st1002/RangeImageMetadataKey.java @@ -0,0 +1,84 @@ +package org.jmisb.st1002; + +import java.util.HashMap; +import java.util.Map; +import org.jmisb.api.klv.IKlvKey; + +/** + * ST 1002 tags - description and numbers. + * + *

These tags are used to identify each element in the local set. + */ +public enum RangeImageMetadataKey implements IKlvKey { + /** Unknown key. This should not be created. */ + Undefined(0), + /** Range Image Precision Time Stamp. */ + PrecisionTimeStamp(1), + /** Document Version. */ + DocumentVersion(11), + /** Range Image Enumerations. */ + RangeImageEnumerations(12), + /** Single Point Range Measurement (SPRM). */ + SinglePointRangeMeasurement(13), + /** + * Single Point Range Measurement (SPRM) Uncertainty. + * + *

Range measurement uncertainty. + */ + SinglePointRangeMeasurementUncertainty(14), + /** + * Single Point Range Measurement (SPRM) Row Coordinate. + * + *

Measured Row Coordinate for Range. + */ + SinglePointRangeMeasurementRowCoordinate(15), + /** + * Single Point Range Measurement (SPRM) Column Coordinate. + * + *

Measured Column Coordinate for Range. + */ + SinglePointRangeMeasurementColumnCoordinate(16), + /** Number of Sections in X. */ + NumberOfSectionsInX(17), + /** Number of Sections in Y. */ + NumberOfSectionsInY(18), + /** Generalized Transformation Local Set. */ + GeneralizedTransformationLocalSet(19), + /** Section Data Variable Length Pack. */ + SectionDataVLP(20), + /** CRC-16-CCITT. */ + CRC16CCITT(21); + + private final int tag; + + private static final Map tagTable = new HashMap<>(); + + static { + for (RangeImageMetadataKey key : values()) { + tagTable.put(key.tag, key); + } + } + + private RangeImageMetadataKey(int tag) { + this.tag = tag; + } + + /** + * Get the tag value associated with this enumeration value. + * + * @return integer tag value for the metadata key + */ + public int getIdentifier() { + return tag; + } + + /** + * Look up the metadata key by tag identifier. + * + * @param tag the integer tag value to look up + * @return corresponding metadata key + */ + public static RangeImageMetadataKey getKey(int tag) { + return tagTable.getOrDefault(tag, Undefined); + } +} diff --git a/st1002/src/main/java/org/jmisb/st1002/RangeImageSource.java b/st1002/src/main/java/org/jmisb/st1002/RangeImageSource.java new file mode 100644 index 000000000..6fba55562 --- /dev/null +++ b/st1002/src/main/java/org/jmisb/st1002/RangeImageSource.java @@ -0,0 +1,69 @@ +package org.jmisb.st1002; + +/** + * Range Image Source. + * + *

This enumeration describes how the Range Imagery was created, either from a range sensor (e.g. + * laser range finder, or LIDAR) or computationally extracted. + * + * @see RangeImageEnumerations + */ +public enum RangeImageSource { + /** + * Unknown value. + * + *

This is not a valid image source, and indicates a problem with decoding. + */ + UNKNOWN(-1, "Unknown"), + /** Computationally extracted. */ + COMPUTATIONALLY_EXTRACTED(0, "Computationally Extracted"), + /** Range sensor. */ + RANGE_SENSOR(1, "Range Sensor"); + + /** + * Look up Range Image Source by encoded value. + * + *

This looks up the basic value (without any bit shifting applied, so Range Sensor is {@code + * 0b1}). + * + * @param value the encoded (integer) value + * @return the corresponding enumeration value + */ + public static RangeImageSource lookup(int value) { + for (RangeImageSource source : values()) { + if (source.getEncodedValue() == value) { + return source; + } + } + return UNKNOWN; + } + + private final int encodedValue; + private final String textDescription; + + private RangeImageSource(int value, String description) { + this.encodedValue = value; + this.textDescription = description; + } + + /** + * Encoded value. + * + *

This looks up the basic value (without any bit shifting applied, so Range Sensor is {@code + * 0b1}). + * + * @return integer representation of the enumeration + */ + public int getEncodedValue() { + return encodedValue; + } + + /** + * Text description. + * + * @return human readable description of the enumeration meaning. + */ + public String getTextDescription() { + return textDescription; + } +} diff --git a/st1002/src/main/java/org/jmisb/st1002/RangeImageryDataType.java b/st1002/src/main/java/org/jmisb/st1002/RangeImageryDataType.java new file mode 100644 index 000000000..dd51433f8 --- /dev/null +++ b/st1002/src/main/java/org/jmisb/st1002/RangeImageryDataType.java @@ -0,0 +1,78 @@ +package org.jmisb.st1002; + +/** + * Range Imagery Data Type. + * + *

This enumeration describes the range imagery, either Perspective Range Image or Depth Range + * Image. Other types may be added in the future, however these two are the only valid values as of + * ST 1002.2. + * + *

* + * + *

Perspective
+ * Range Image Example + * + *

Depth Range Image
+ * Example + * + * @see RangeImageEnumerations + */ +public enum RangeImageryDataType { + /** + * Unknown value. + * + *

This is not a valid data type, and indicates a problem with decoding. + */ + UNKNOWN(-1, "Unknown"), + /** Perspective range image. */ + PERSPECTIVE(0, "Perspective Range Image"), + /** Depth range image. */ + DEPTH(1, "Depth Range Image"); + + /** + * Look up Range Imagery Data Type by encoded value. + * + *

This looks up the basic value (without any bit shifting applied, so Depth is {@code + * 0b001}). + * + * @param value the encoded (integer) value + * @return the corresponding enumeration value + */ + public static RangeImageryDataType lookup(int value) { + for (RangeImageryDataType dataType : values()) { + if (dataType.getEncodedValue() == value) { + return dataType; + } + } + return UNKNOWN; + } + + private final int encodedValue; + private final String textDescription; + + private RangeImageryDataType(int value, String description) { + this.encodedValue = value; + this.textDescription = description; + } + + /** + * Encoded value. + * + *

This looks up the basic value (without any bit shifting applied, so Depth is {@code + * 0b001}). + * + * @return integer representation of the enumeration + */ + public int getEncodedValue() { + return encodedValue; + } + + /** + * Text description. + * + * @return human readable description of the enumeration meaning. + */ + public String getTextDescription() { + return textDescription; + } +} diff --git a/st1002/src/main/java/org/jmisb/st1002/ST1002PrecisionTimeStamp.java b/st1002/src/main/java/org/jmisb/st1002/ST1002PrecisionTimeStamp.java new file mode 100644 index 000000000..f9a195b53 --- /dev/null +++ b/st1002/src/main/java/org/jmisb/st1002/ST1002PrecisionTimeStamp.java @@ -0,0 +1,61 @@ +package org.jmisb.st1002; + +import java.time.LocalDateTime; +import org.jmisb.api.klv.st0603.ST0603TimeStamp; + +/** + * Range Image Precision Time Stamp (ST 1002 Range Image Local Set Tag 1). + * + *

The Range Image Precision Time Stamp is the time when the measurements of the Range Image + * occurred. This time information is used to coordinate the Range Image with other sources of data, + * such as a collaborative sensors image or other sensor data. The time value is an invocation of + * the MISP Precision Time Stamp, a 64-bit unsigned integer that represents the number of + * microseconds since midnight of January 1st 1970 without leap-seconds, as defined in MISB ST 0603 + * and detailed in the Motion Imagery Handbook. + * + *

The Range Image Precision Time Stamp is required in all Range Image Local Sets, and must be + * the first item. Positioning the Precision Time Stamp tag as the first item facilitates rapidly + * checking whether the Local Set matches the desired time for processing a collaborative image. + */ +public class ST1002PrecisionTimeStamp extends ST0603TimeStamp implements IRangeImageMetadataValue { + /** + * Create from value. + * + * @param microseconds Microseconds since the epoch + */ + public ST1002PrecisionTimeStamp(long microseconds) { + super(microseconds); + } + + /** + * Create from encoded bytes. + * + * @param bytes Encoded byte array, length of 8 bytes. + */ + public ST1002PrecisionTimeStamp(byte[] bytes) { + super(bytes); + if (bytes.length < 8) { + throw new IllegalArgumentException( + this.getDisplayName() + " encoding is an 8-byte unsigned int"); + } + } + + /** + * Create from {@code LocalDateTime}. + * + * @param dateTime The date and time + */ + public ST1002PrecisionTimeStamp(LocalDateTime dateTime) { + super(dateTime); + } + + @Override + public final String getDisplayName() { + return "Precision Time Stamp"; + } + + @Override + public byte[] getBytes() { + return getBytesFull(); + } +} diff --git a/st1002/src/main/java/org/jmisb/st1002/ST1002VersionNumber.java b/st1002/src/main/java/org/jmisb/st1002/ST1002VersionNumber.java new file mode 100644 index 000000000..ea34e82b0 --- /dev/null +++ b/st1002/src/main/java/org/jmisb/st1002/ST1002VersionNumber.java @@ -0,0 +1,77 @@ +package org.jmisb.st1002; + +import org.jmisb.api.klv.Ber; +import org.jmisb.api.klv.BerDecoder; +import org.jmisb.api.klv.BerEncoder; +import org.jmisb.api.klv.BerField; + +/** + * Version Number (ST 1002 Range Image Local Set Tag 11). + * + *

The version number is the same of the minor version number of the standard document. For + * example, with MISB ST 1002.1, the version number value is {@code 1} and with ST 1002.2, the + * version number value is {@code 2}. + */ +public class ST1002VersionNumber implements IRangeImageMetadataValue { + + private final int version; + + /** + * The currently supported revision is 1002.2. + * + *

This may be useful in the constructor. + */ + public static final short ST_VERSION_NUMBER = 2; + + /** + * Create from value. + * + *

The current version is available as {@link #ST_VERSION_NUMBER}. + * + * @param versionNumber The version number + */ + public ST1002VersionNumber(int versionNumber) { + if (versionNumber < 0) { + throw new IllegalArgumentException("ST 1002 Version Number cannot be negative"); + } + this.version = versionNumber; + } + + /** + * Create from encoded bytes. + * + * @param bytes Byte array containing BER-OID formatted version number + */ + public ST1002VersionNumber(byte[] bytes) { + BerField berField = BerDecoder.decode(bytes, 0, true); + this.version = berField.getValue(); + } + + /** + * Get the document version number. + * + * @return The version number + */ + public int getVersion() { + return version; + } + + @Override + public byte[] getBytes() { + return BerEncoder.encode(version, Ber.OID); + } + + @Override + public String getDisplayName() { + return "Version Number"; + } + + @Override + public String getDisplayableValue() { + if (version == 0) { + return "ST 1002"; + } else { + return "ST 1002." + version; + } + } +} diff --git a/st1002/src/main/java/org/jmisb/st1002/SectionData.java b/st1002/src/main/java/org/jmisb/st1002/SectionData.java new file mode 100644 index 000000000..397a95bd1 --- /dev/null +++ b/st1002/src/main/java/org/jmisb/st1002/SectionData.java @@ -0,0 +1,316 @@ +package org.jmisb.st1002; + +import org.jmisb.api.common.KlvParseException; +import org.jmisb.api.klv.ArrayBuilder; +import org.jmisb.api.klv.Ber; +import org.jmisb.api.klv.BerDecoder; +import org.jmisb.api.klv.BerEncoder; +import org.jmisb.api.klv.BerField; +import org.jmisb.api.klv.IKlvValue; +import org.jmisb.api.klv.st1303.MDAPDecoder; +import org.jmisb.api.klv.st1303.NaturalFormatEncoder; +import org.jmisb.core.klv.PrimitiveConverter; + +/** + * Section Data Variable Length Pack. + * + *

Section data, along with its supporting information is formatted in a Variable Length Pack + * (VLP) (see SMPTE ST 336) called the Section Data VLP. The information in each Section Data VLP + * includes Section coordinates, Section data array, uncertainty values, and optional compression + * parameters. The optional compression parameters are truncated from the VLP (along with their + * lengths) as a group (in a similar fashion to MISB RP 0701 Floating Length Packs). The figure + * below illustrates a Section Data VLP with each item in the VLP prefixed with its item length. The + * green items indicate required values (along with their lengths in blue); the pink item can be + * zero-length; and the yellow items can be truncated (along with their lengths). + * + *

Section Data
+ * Variable Length Pack + */ +public class SectionData implements IKlvValue { + + private final int sectionNumberX; + private final int sectionNumberY; + private final double[][] arrayOfMeasuredValues; + private final double[][] arrayOfUncertaintyValues; + private final double planeXScaleFactor; + private final double planeYScaleFactor; + private final double planeConstantValue; + + /** + * Create from values. + * + *

This constructor assumes the planar fit compression factors are not included. + * + * @param x the section number X value + * @param y the section number Y value + * @param measurements the array of measurements + * @param uncertainties the array of uncertainties (can be null) + */ + public SectionData(int x, int y, double[][] measurements, double[][] uncertainties) { + this.sectionNumberX = x; + this.sectionNumberY = y; + this.arrayOfMeasuredValues = measurements.clone(); + if (uncertainties == null) { + this.arrayOfUncertaintyValues = null; + } else { + this.arrayOfUncertaintyValues = uncertainties.clone(); + } + this.planeXScaleFactor = 0.0; + this.planeYScaleFactor = 0.0; + this.planeConstantValue = 0.0; + } + + /** + * Create from values. + * + * @param x the section number X value + * @param y the section number Y value + * @param measurements the array of measurements + * @param uncertainties the array of uncertainties (can be null) + * @param planeXscale the plane X scale factor + * @param planeYscale the plane Y scale factor + * @param planeConstant the plane constant value + */ + public SectionData( + int x, + int y, + double[][] measurements, + double[][] uncertainties, + double planeXscale, + double planeYscale, + double planeConstant) { + this.sectionNumberX = x; + this.sectionNumberY = y; + this.arrayOfMeasuredValues = measurements.clone(); + if (uncertainties == null) { + this.arrayOfUncertaintyValues = null; + } else { + this.arrayOfUncertaintyValues = uncertainties.clone(); + } + this.planeXScaleFactor = planeXscale; + this.planeYScaleFactor = planeYscale; + this.planeConstantValue = planeConstant; + } + + /** + * Create from encoded bytes. + * + *

The encoded byte array is assumed to start from the first item length ({@code L1} in the + * diagram above, and does not include the overall VLP Key or Length field. + * + * @param bytes the encoded byte array + * @throws KlvParseException if parsing fails + */ + public SectionData(byte[] bytes) throws KlvParseException { + MDAPDecoder mdapDecoder = new MDAPDecoder(); + int offset = 0; + BerField l1field = BerDecoder.decode(bytes, offset, false); + offset += l1field.getLength(); + BerField sectionXfield = BerDecoder.decode(bytes, offset, true); + offset += sectionXfield.getLength(); + sectionNumberX = sectionXfield.getValue(); + BerField l2field = BerDecoder.decode(bytes, offset, false); + offset += l2field.getLength(); + BerField sectionYfield = BerDecoder.decode(bytes, offset, true); + offset += sectionYfield.getLength(); + sectionNumberY = sectionYfield.getValue(); + BerField l3field = BerDecoder.decode(bytes, offset, false); + offset += l3field.getLength(); + this.arrayOfMeasuredValues = mdapDecoder.decodeFloatingPoint2D(bytes, offset); + offset += l3field.getValue(); + BerField l4field = BerDecoder.decode(bytes, offset, false); + offset += l4field.getLength(); + if (l4field.getValue() > 0) { + this.arrayOfUncertaintyValues = mdapDecoder.decodeFloatingPoint2D(bytes, offset); + offset += l4field.getValue(); + } else { + this.arrayOfUncertaintyValues = null; + } + if (offset < bytes.length) { + BerField l5field = BerDecoder.decode(bytes, offset, false); + offset += l5field.getLength(); + if (l5field.getValue() == 4) { + this.planeXScaleFactor = PrimitiveConverter.toFloat32(bytes, offset); + } else if (l5field.getValue() == 8) { + this.planeXScaleFactor = PrimitiveConverter.toFloat64(bytes, offset); + } else { + throw new KlvParseException( + "unsupported Plane X Scale Factor size: " + l5field.getValue()); + } + offset += l5field.getValue(); + } else { + this.planeXScaleFactor = 0.0; + } + if (offset < bytes.length) { + BerField l6field = BerDecoder.decode(bytes, offset, false); + offset += l6field.getLength(); + if (l6field.getValue() == 4) { + this.planeYScaleFactor = PrimitiveConverter.toFloat32(bytes, offset); + } else if (l6field.getValue() == 8) { + this.planeYScaleFactor = PrimitiveConverter.toFloat64(bytes, offset); + } else { + throw new KlvParseException( + "unsupported Plane Y Scale Factor size: " + l6field.getValue()); + } + offset += l6field.getValue(); + } else { + this.planeYScaleFactor = 0.0; + } + + if (offset < bytes.length) { + BerField l7field = BerDecoder.decode(bytes, offset, false); + offset += l7field.getLength(); + if (l7field.getValue() == 4) { + this.planeConstantValue = PrimitiveConverter.toFloat32(bytes, offset); + } else if (l7field.getValue() == 8) { + this.planeConstantValue = PrimitiveConverter.toFloat64(bytes, offset); + } else { + throw new KlvParseException( + "unsupported Plane Constant size: " + l7field.getValue()); + } + offset += l7field.getValue(); + } else { + this.planeConstantValue = 0.0; + } + } + + /** + * Copy Constructor. + * + * @param other the section data instance to copy values from + */ + public SectionData(SectionData other) { + this.sectionNumberX = other.getSectionNumberX(); + this.sectionNumberY = other.getSectionNumberY(); + this.arrayOfMeasuredValues = other.getArrayOfMeasuredValues().clone(); + if (other.getArrayOfUncertaintyValues() == null) { + this.arrayOfUncertaintyValues = null; + } else { + this.arrayOfUncertaintyValues = other.getArrayOfUncertaintyValues().clone(); + } + this.planeXScaleFactor = other.getPlaneXScaleFactor(); + this.planeYScaleFactor = other.getPlaneYScaleFactor(); + this.planeConstantValue = other.getPlaneConstantValue(); + } + + /** + * Serialise the Section Data to encoded byte array. + * + * @return the byte array + * @throws KlvParseException if serialisation fails. + */ + public byte[] getBytes() throws KlvParseException { + ArrayBuilder builder = new ArrayBuilder(); + byte[] sectionNumberXbytes = BerEncoder.encode(sectionNumberX, Ber.OID); + builder.appendAsBerLength(sectionNumberXbytes.length); + builder.append(sectionNumberXbytes); + byte[] sectionNumberYbytes = BerEncoder.encode(sectionNumberY, Ber.OID); + builder.appendAsBerLength(sectionNumberYbytes.length); + builder.append(sectionNumberYbytes); + NaturalFormatEncoder mdapEncoder = new NaturalFormatEncoder(); + byte[] arrayOfMeasuredValuesBytes = mdapEncoder.encode(arrayOfMeasuredValues); + builder.appendAsBerLength(arrayOfMeasuredValuesBytes.length); + builder.append(arrayOfMeasuredValuesBytes); + if (arrayOfUncertaintyValues == null) { + builder.appendAsBerLength(0); + } else { + byte[] arrayOfUncertaintyValuesBytes = mdapEncoder.encode(arrayOfUncertaintyValues); + builder.appendAsBerLength(arrayOfUncertaintyValuesBytes.length); + builder.append(arrayOfUncertaintyValuesBytes); + } + if ((this.planeXScaleFactor == 0.0) + && (this.planeYScaleFactor == 0.0) + && (this.planeConstantValue == 0.0)) { + // just omit the rest. + } else { + builder.appendAsBerLength(Double.BYTES); + builder.appendAsFloat64Primitive(this.planeXScaleFactor); + builder.appendAsBerLength(Double.BYTES); + builder.appendAsFloat64Primitive(this.planeYScaleFactor); + builder.appendAsBerLength(Double.BYTES); + builder.appendAsFloat64Primitive(this.planeConstantValue); + } + return builder.toBytes(); + } + + /** + * Section Number in X direction. + * + * @return section number as an integer + */ + public int getSectionNumberX() { + return sectionNumberX; + } + + /** + * Section Number in Y direction. + * + * @return section number as an integer. + */ + public int getSectionNumberY() { + return sectionNumberY; + } + + /** + * Array of measured values. + * + * @return the measured values as a 2-dimensional array + */ + public double[][] getArrayOfMeasuredValues() { + return arrayOfMeasuredValues.clone(); + } + /** + * Array of uncertainty values. + * + * @return the uncertainty values as a 2-dimensional array, or null if not provided. + */ + public double[][] getArrayOfUncertaintyValues() { + if (arrayOfUncertaintyValues == null) { + return null; + } + return arrayOfUncertaintyValues.clone(); + } + + /** + * Plane X scale factor. + * + *

This is used for planar fit compression. See ST 1002.2 Section 7. + * + * @return the scale factor as a double. + */ + public double getPlaneXScaleFactor() { + return planeXScaleFactor; + } + + /** + * Plane Y scale factor. + * + *

This is used for planar fit compression. See ST 1002.2 Section 7. + * + * @return the scale factor as a double. + */ + public double getPlaneYScaleFactor() { + return planeYScaleFactor; + } + + /** + * Plane Constant value. + * + *

This is used for planar fit compression. See ST 1002.2 Section 7. + * + * @return the scale factor as a double. + */ + public double getPlaneConstantValue() { + return planeConstantValue; + } + + @Override + public String getDisplayName() { + return "Section Data"; + } + + @Override + public String getDisplayableValue() { + return String.format("Section [%d,%d]", this.sectionNumberX, this.sectionNumberY); + } +} diff --git a/st1002/src/main/java/org/jmisb/st1002/SectionDataIdentifierKey.java b/st1002/src/main/java/org/jmisb/st1002/SectionDataIdentifierKey.java new file mode 100644 index 000000000..15d9ca4f4 --- /dev/null +++ b/st1002/src/main/java/org/jmisb/st1002/SectionDataIdentifierKey.java @@ -0,0 +1,78 @@ +package org.jmisb.st1002; + +import org.jmisb.api.klv.IKlvKey; + +/** Pseudo-key item for Section Data identifier. */ +public class SectionDataIdentifierKey implements IKlvKey, Comparable { + + private final int sectionX; + private final int sectionY; + + /** + * Constructor. + * + *

Section numbers in the simple layout (mandated by ST 1002.2) only vary in one direction (X + * for horizontal composition, Y for vertical composition). + * + * @param x the section number X identifier. + * @param y the section number Y identifier. + */ + public SectionDataIdentifierKey(final int x, final int y) { + this.sectionX = x; + this.sectionY = y; + } + + @Override + public int getIdentifier() { + return sectionX + sectionY - 1; + } + + /** + * Section Number X value. + * + * @return the section number as an integer + */ + public int getSectionX() { + return sectionX; + } + + /** + * Section Number Y value. + * + * @return the section number as an integer + */ + public int getSectionY() { + return sectionY; + } + + @Override + public int compareTo(SectionDataIdentifierKey other) { + return Integer.compare(getIdentifier(), other.getIdentifier()); + } + + @Override + public int hashCode() { + int hash = 3; + hash = 29 * hash + this.sectionX; + hash = 29 * hash + this.sectionY; + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final SectionDataIdentifierKey other = (SectionDataIdentifierKey) obj; + if (this.sectionX != other.sectionX) { + return false; + } + return this.sectionY == other.sectionY; + } +} diff --git a/st1002/src/main/java/org/jmisb/st1002/SectionDataList.java b/st1002/src/main/java/org/jmisb/st1002/SectionDataList.java new file mode 100644 index 000000000..bfbf859cf --- /dev/null +++ b/st1002/src/main/java/org/jmisb/st1002/SectionDataList.java @@ -0,0 +1,84 @@ +package org.jmisb.st1002; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.SortedSet; +import java.util.TreeSet; +import org.jmisb.api.klv.IKlvKey; +import org.jmisb.api.klv.IKlvValue; +import org.jmisb.api.klv.INestedKlvValue; + +/** + * Section Data list (ST 1002 Range Image Local Set Tag 20). + * + *

Section data, along with its supporting information is formatted in a Variable Length Pack + * (VLP) (see SMPTE ST 336) called the Section Data VLP. + * + *

Section data is repeatable within the Range Image Local Set. {@code SectionDataList} + * represents zero or more Section Data VLPs. + * + * @see NumberOfSectionsInX + * @see NumberOfSectionsInY + */ +public class SectionDataList implements IRangeImageMetadataValue, INestedKlvValue { + + private final List vlps = new ArrayList<>(); + + @Override + public byte[] getBytes() { + throw new UnsupportedOperationException("Should not be called"); + } + + @Override + public String getDisplayName() { + return "Section Data"; + } + + @Override + public String getDisplayableValue() { + return "[VLPs]"; + } + + @Override + public IKlvValue getField(IKlvKey tag) { + SectionDataIdentifierKey key = (SectionDataIdentifierKey) tag; + for (SectionData vlp : vlps) { + if ((vlp.getSectionNumberX() == key.getSectionX()) + && (vlp.getSectionNumberY() == key.getSectionY())) { + return vlp; + } + } + return null; + } + + @Override + public Set getIdentifiers() { + SortedSet identifiers = new TreeSet<>(); + vlps.forEach( + (SectionData vlp) -> { + identifiers.add( + new SectionDataIdentifierKey( + vlp.getSectionNumberX(), vlp.getSectionNumberY())); + }); + return identifiers; + } + + /** + * Add a Section Data VLP to the list. + * + * @param sectionData the data to add + */ + public void add(SectionData sectionData) { + this.vlps.add(new SectionData(sectionData)); + } + + /** + * Get the Section Data Variable Length Packs. + * + * @return copy of the packs as a list. + */ + public List getPacks() { + return new ArrayList<>(vlps); + } +} diff --git a/st1002/src/main/java/org/jmisb/st1002/SinglePointRangeMeasurement.java b/st1002/src/main/java/org/jmisb/st1002/SinglePointRangeMeasurement.java new file mode 100644 index 000000000..a83592711 --- /dev/null +++ b/st1002/src/main/java/org/jmisb/st1002/SinglePointRangeMeasurement.java @@ -0,0 +1,77 @@ +package org.jmisb.st1002; + +import org.jmisb.api.common.KlvParseException; +import org.jmisb.core.klv.PrimitiveConverter; + +/** + * Single Point Range Measurement (ST 1002 Local Set Item 13). + * + *

The Single Point Range Measurement (SPRM) is the measure of distance (in metres) from either + * the principle point, or backplane of a Collaborative Sensor through the image plane to a point in + * the scene. + * + *

These measurement concepts are shown in the following images, which are from MISB ST 1002.2. + * Note that the red line closer to the terrain (green area) represents the focal plane, and that + * the images are unlikely to be to scale in most scenarios. + * + *

Perspective
+ * Range Image Example + * + *

Depth Range Image
+ * Example + * + *

This value can be either a 32-bit or 64-bit IEEE floating point value. + * + * @see SinglePointRangeMeasurementUncertainty + */ +public class SinglePointRangeMeasurement implements IRangeImageMetadataValue { + + private final double value; + + /** + * Create from value. + * + * @param range the range in metres. + */ + public SinglePointRangeMeasurement(double range) { + this.value = range; + } + + /** + * Create from encoded bytes. + * + * @param bytes Encoded byte array of length 4 or 8 + * @throws KlvParseException if the byte array is not of the correct length + */ + public SinglePointRangeMeasurement(byte[] bytes) throws KlvParseException { + try { + this.value = PrimitiveConverter.toFloat64(bytes); + } catch (IllegalArgumentException ex) { + throw new KlvParseException("Single Point Range Measurement is of length 4 or 8 bytes"); + } + } + + @Override + public final String getDisplayName() { + return "Single Point Range Measurement"; + } + + /** + * Get the range. + * + * @return range in metres. + */ + public double getRange() { + return this.value; + } + + @Override + public byte[] getBytes() { + return PrimitiveConverter.float64ToBytes(value); + } + + @Override + public String getDisplayableValue() { + return String.format("%.3f m", this.value); + } +} diff --git a/st1002/src/main/java/org/jmisb/st1002/SinglePointRangeMeasurementColumn.java b/st1002/src/main/java/org/jmisb/st1002/SinglePointRangeMeasurementColumn.java new file mode 100644 index 000000000..3612aaffa --- /dev/null +++ b/st1002/src/main/java/org/jmisb/st1002/SinglePointRangeMeasurementColumn.java @@ -0,0 +1,75 @@ +package org.jmisb.st1002; + +import org.jmisb.api.common.KlvParseException; +import org.jmisb.core.klv.PrimitiveConverter; + +/** + * Single Point Range Measurement Column (ST 1002 Local Set Item 16). + * + *

The Single Point Range Measurement is not necessarily measured directly through the centre of + * the Collaborative Image; therefore, the location within the image needs to be indicated. The + * Single Point Range Measurement Row and Column Coordinates are the coordinates within the + * Collaborative Sensor’s Image where the measurement was taken. + * + *

Single
+ * Point Range Measurement + * + *

These values are either 32-bit or 64-bit IEEE floating point values. If the Row and Column + * values are omitted from the Range Image Local Set, then the default values are set to the centre + * of the Collaborative Sensor's Image. + * + * @see SinglePointRangeMeasurement + * @see SinglePointRangeMeasurementRow + */ +public class SinglePointRangeMeasurementColumn implements IRangeImageMetadataValue { + + private final double value; + + /** + * Create from value. + * + * @param row the row coordinate in pixels. + */ + public SinglePointRangeMeasurementColumn(double row) { + this.value = row; + } + + /** + * Create from encoded bytes. + * + * @param bytes Encoded byte array of length 4 or 8 + * @throws KlvParseException if the byte array is not of the correct length + */ + public SinglePointRangeMeasurementColumn(byte[] bytes) throws KlvParseException { + try { + this.value = PrimitiveConverter.toFloat64(bytes); + } catch (IllegalArgumentException ex) { + throw new KlvParseException( + "Single Point Range Measurement Column Coordinate is of length 4 or 8 bytes"); + } + } + + @Override + public final String getDisplayName() { + return "Single Point Range Measurement Column"; + } + + /** + * Get the column coordinate. + * + * @return column coordinate in pixels. + */ + public double getColumn() { + return this.value; + } + + @Override + public byte[] getBytes() { + return PrimitiveConverter.float64ToBytes(value); + } + + @Override + public String getDisplayableValue() { + return String.format("%.1f", this.value); + } +} diff --git a/st1002/src/main/java/org/jmisb/st1002/SinglePointRangeMeasurementRow.java b/st1002/src/main/java/org/jmisb/st1002/SinglePointRangeMeasurementRow.java new file mode 100644 index 000000000..ebd85de9b --- /dev/null +++ b/st1002/src/main/java/org/jmisb/st1002/SinglePointRangeMeasurementRow.java @@ -0,0 +1,75 @@ +package org.jmisb.st1002; + +import org.jmisb.api.common.KlvParseException; +import org.jmisb.core.klv.PrimitiveConverter; + +/** + * Single Point Range Measurement Row (ST 1002 Local Set Item 15). + * + *

The Single Point Range Measurement is not necessarily measured directly through the centre of + * the Collaborative Image; therefore, the location within the image needs to be indicated. The + * Single Point Range Measurement Row and Column Coordinates are the coordinates within the + * Collaborative Sensor’s Image where the measurement was taken. + * + *

Single
+ * Point Range Measurement + * + *

These values are either 32-bit or 64-bit IEEE floating point values. If the Row and Column + * values are omitted from the Range Image Local Set, then the default values are set to the centre + * of the Collaborative Sensor's Image. + * + * @see SinglePointRangeMeasurement + * @see SinglePointRangeMeasurementColumn + */ +public class SinglePointRangeMeasurementRow implements IRangeImageMetadataValue { + + private final double value; + + /** + * Create from value. + * + * @param row the row coordinate in pixels. + */ + public SinglePointRangeMeasurementRow(double row) { + this.value = row; + } + + /** + * Create from encoded bytes. + * + * @param bytes Encoded byte array of length 4 or 8 + * @throws KlvParseException if the byte array is not of the correct length + */ + public SinglePointRangeMeasurementRow(byte[] bytes) throws KlvParseException { + try { + this.value = PrimitiveConverter.toFloat64(bytes); + } catch (IllegalArgumentException ex) { + throw new KlvParseException( + "Single Point Range Measurement Row Coordinate is of length 4 or 8 bytes"); + } + } + + @Override + public final String getDisplayName() { + return "Single Point Range Measurement Row"; + } + + /** + * Get the row coordinate. + * + * @return row coordinate in pixels. + */ + public double getRow() { + return this.value; + } + + @Override + public byte[] getBytes() { + return PrimitiveConverter.float64ToBytes(value); + } + + @Override + public String getDisplayableValue() { + return String.format("%.1f", this.value); + } +} diff --git a/st1002/src/main/java/org/jmisb/st1002/SinglePointRangeMeasurementUncertainty.java b/st1002/src/main/java/org/jmisb/st1002/SinglePointRangeMeasurementUncertainty.java new file mode 100644 index 000000000..8505d0412 --- /dev/null +++ b/st1002/src/main/java/org/jmisb/st1002/SinglePointRangeMeasurementUncertainty.java @@ -0,0 +1,67 @@ +package org.jmisb.st1002; + +import org.jmisb.api.common.KlvParseException; +import org.jmisb.core.klv.PrimitiveConverter; + +/** + * Single Point Range Measurement Uncertainty (ST 1002 Local Set Item 14). + * + *

The Single Point Range Measurement Uncertainty is the uncertainty (sigma,σ) of the Single + * Point Range Measurement data, in metres, along the measured vector from either the perspective + * centre or depth range measurement backplane to the scene. This value can be either a 32-bit or + * 64-bit IEEE floating point value. + * + * @see SinglePointRangeMeasurement + */ +public class SinglePointRangeMeasurementUncertainty implements IRangeImageMetadataValue { + + private final double value; + + /** + * Create from value. + * + * @param uncertainty the range uncertainty in metres. + */ + public SinglePointRangeMeasurementUncertainty(double uncertainty) { + this.value = uncertainty; + } + + /** + * Create from encoded bytes. + * + * @param bytes Encoded byte array of length 4 or 8 + * @throws KlvParseException if the byte array is not of the correct length + */ + public SinglePointRangeMeasurementUncertainty(byte[] bytes) throws KlvParseException { + try { + this.value = PrimitiveConverter.toFloat64(bytes); + } catch (IllegalArgumentException ex) { + throw new KlvParseException( + "Single Point Range Measurement Uncertainty is of length 4 or 8 bytes"); + } + } + + @Override + public final String getDisplayName() { + return "Single Point Range Measurement Uncertainty"; + } + + /** + * Get the uncertainty. + * + * @return range uncertainty (one standard deviation) in metres. + */ + public double getRange() { + return this.value; + } + + @Override + public byte[] getBytes() { + return PrimitiveConverter.float64ToBytes(value); + } + + @Override + public String getDisplayableValue() { + return String.format("%.3f m", this.value); + } +} diff --git a/st1002/src/main/java/org/jmisb/st1002/package-info.java b/st1002/src/main/java/org/jmisb/st1002/package-info.java new file mode 100644 index 000000000..49e1cbbc0 --- /dev/null +++ b/st1002/src/main/java/org/jmisb/st1002/package-info.java @@ -0,0 +1,17 @@ +/** + * ST 1002: Range Motion Imagery. + * + *

This standard describes Range Motion Imagery, its format and supporting metadata. Range Motion + * Imagery is a temporal sequence of Range Images. Each Range Image is a collection of Range + * Measurements from a sensor to target scene. A Range Measurement is the distance (e.g., meters) + * from an object (or area) in the scene to the sensor. The KLV structures of this Standard are + * intended to allow for flexibility, efficient packing, and future extensions. Range Motion Imagery + * can be used standalone or in collaboration with other Motion Imagery. MISB ST 1107 Metric + * Geopositioning Metadata Set provides the basis for collaborating with other Motion Imagery types. + * + *

This standard describes the: Perspective Range Motion Imagery and Depth Range Motion Imagery; + * the collection methods of Range Motion Imagery; the formats used for storing or transmitting + * Range Motion Imagery; the supporting metadata needed for Range Motion Imagery including, + * temporal, uncertainty, and compression parameters; and the alignment to Collaborative Imagery. + */ +package org.jmisb.st1002; diff --git a/st1002/src/main/javadoc/org/jmisb/st1002/doc-files/coboresightedsensors.png b/st1002/src/main/javadoc/org/jmisb/st1002/doc-files/coboresightedsensors.png new file mode 100644 index 0000000000000000000000000000000000000000..6bf944c2037311b83335fcd1ec666a59c7e21fde GIT binary patch literal 106957 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

(g}(;fX$h;n+7W*u4y{9*k#Ye2c= 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 CJsF7r literal 0 HcmV?d00001 diff --git a/st1002/src/main/javadoc/org/jmisb/st1002/doc-files/nonboresightedsensors.png b/st1002/src/main/javadoc/org/jmisb/st1002/doc-files/nonboresightedsensors.png new file mode 100644 index 0000000000000000000000000000000000000000..1dd860df9ef25d4b0a3a15d79bc0073a488dc1f1 GIT binary patch literal 146534 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%0D+48{R`vyci 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Ο|-5%pgzt)Ec)+O@t3 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 literal 0 HcmV?d00001 diff --git a/st1002/src/main/javadoc/org/jmisb/st1002/doc-files/perspectiverangeimage.png b/st1002/src/main/javadoc/org/jmisb/st1002/doc-files/perspectiverangeimage.png new file mode 100644 index 0000000000000000000000000000000000000000..fe0877acbc3bbf7fb9e256eb1e868fdd77ca247a GIT binary patch literal 51346 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 literal 0 HcmV?d00001 diff --git a/st1002/src/main/javadoc/org/jmisb/st1002/doc-files/sectiondatavlp.png b/st1002/src/main/javadoc/org/jmisb/st1002/doc-files/sectiondatavlp.png new file mode 100644 index 0000000000000000000000000000000000000000..e4d3db69d59a9bee7446131a9cfbc846b1effe32 GIT binary patch literal 131502 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∈i!ZYZCI)t$kvu+1L)f{E(3>A&s8VChi;z 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

B02Ax#lQ^61hcQ66uw`NA3`wU=+8~ zv$L&laBzt`3``j|dd+otx{#qJ>1D~j^ee{i2*jpEtzQF54peURm)) zfMe_aNuqA2@b_}cMF`bFoBm;%w5c@?{5X}+q;-=X?4 zVk>QN+4l?qzb6M(DUbWl4-ngo^f!+4OjtVCL8t4`ZOBgL%zx?3v^SC17psk#tCN>j znoq31atE&rWaWq%<7VgM)VzJL@aNs%FyczJm1IpFcBdcUP(7dFuR&~}K>2931yhmM zwJ!~MfBfZBl06<1Be!Ri>AE`eieK}ESRX&iLagWKmSH1BvxgiLIGg|e{~(KhpkbuR zg+;r+ZIOkp^#&1j#M3C-D{H#{gP<;7$Qn%@{;V%OtLylhV^Y8<3Ks0r)VSp23%;nm zH3-Y%dD+Et;*O+riDKS%0o2$6Z^mLrDQh O;52F&s28c82>xFMxx>f+ literal 0 HcmV?d00001 diff --git a/st1002/src/main/javadoc/org/jmisb/st1002/doc-files/threeverticalsections.png b/st1002/src/main/javadoc/org/jmisb/st1002/doc-files/threeverticalsections.png new file mode 100644 index 0000000000000000000000000000000000000000..c421a09e2604d33b957994576939ab0c7807ee07 GIT binary patch literal 63571 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 z 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 literal 0 HcmV?d00001 diff --git a/st1002/src/main/resources/META-INF/services/org.jmisb.api.klv.IMisbMessageFactory b/st1002/src/main/resources/META-INF/services/org.jmisb.api.klv.IMisbMessageFactory new file mode 100644 index 000000000..349abc422 --- /dev/null +++ b/st1002/src/main/resources/META-INF/services/org.jmisb.api.klv.IMisbMessageFactory @@ -0,0 +1 @@ +org.jmisb.st1002.RangeImageLocalSetFactory diff --git a/st1002/src/test/java/org/jmisb/st1002/GeneralizedTransformationTest.java b/st1002/src/test/java/org/jmisb/st1002/GeneralizedTransformationTest.java new file mode 100644 index 000000000..cade31b05 --- /dev/null +++ b/st1002/src/test/java/org/jmisb/st1002/GeneralizedTransformationTest.java @@ -0,0 +1,87 @@ +package org.jmisb.st1002; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; + +import java.util.HashMap; +import java.util.Map; +import org.jmisb.api.common.KlvParseException; +import org.jmisb.st1202.GeneralizedTransformationLocalSet; +import org.jmisb.st1202.GeneralizedTransformationParametersKey; +import org.jmisb.st1202.IGeneralizedTransformationMetadataValue; +import org.jmisb.st1202.ST1202DocumentVersion; +import org.testng.annotations.Test; + +/** Tests for ST 1002 Generalized Transformation (ST 1002 Tag 19). */ +public class GeneralizedTransformationTest { + + @Test + public void testConstructFromValueMap() throws KlvParseException { + Map + values = new HashMap<>(); + values.put( + GeneralizedTransformationParametersKey.DocumentVersion, + new ST1202DocumentVersion(2)); + GeneralizedTransformationLocalSet localSet = new GeneralizedTransformationLocalSet(values); + + GeneralizedTransformation uut = new GeneralizedTransformation(localSet); + assertEquals(uut.getBytes(), new byte[] {0x0a, 0x01, 0x02}); + assertEquals(uut.getDisplayName(), "Generalized Transformation Local Set"); + assertEquals(uut.getDisplayableValue(), "ST 1202 Generalized Transformation Local Set"); + assertTrue( + uut.getIdentifiers() + .contains(GeneralizedTransformationParametersKey.DocumentVersion)); + assertEquals( + uut.getField(GeneralizedTransformationParametersKey.DocumentVersion) + .getDisplayName(), + "Document Version"); + assertEquals( + uut.getField(GeneralizedTransformationParametersKey.DocumentVersion) + .getDisplayableValue(), + "ST 1202.2"); + } + + @Test + public void testConstructFromEncodedBytes() throws KlvParseException { + GeneralizedTransformation uut = + new GeneralizedTransformation(new byte[] {0x0a, 0x01, 0x02}); + assertEquals(uut.getBytes(), new byte[] {0x0a, 0x01, 0x02}); + assertEquals(uut.getDisplayName(), "Generalized Transformation Local Set"); + assertEquals(uut.getDisplayableValue(), "ST 1202 Generalized Transformation Local Set"); + assertTrue( + uut.getIdentifiers() + .contains(GeneralizedTransformationParametersKey.DocumentVersion)); + assertEquals( + uut.getField(GeneralizedTransformationParametersKey.DocumentVersion) + .getDisplayName(), + "Document Version"); + assertEquals( + uut.getField(GeneralizedTransformationParametersKey.DocumentVersion) + .getDisplayableValue(), + "ST 1202.2"); + } + + @Test + public void testFactoryEncodedBytes() throws KlvParseException { + IRangeImageMetadataValue value = + RangeImageLocalSet.createValue( + RangeImageMetadataKey.GeneralizedTransformationLocalSet, + new byte[] {0x0a, 0x01, 0x02}); + assertTrue(value instanceof GeneralizedTransformation); + GeneralizedTransformation uut = (GeneralizedTransformation) value; + assertEquals(uut.getBytes(), new byte[] {0x0a, 0x01, 0x02}); + assertEquals(uut.getDisplayName(), "Generalized Transformation Local Set"); + assertEquals(uut.getDisplayableValue(), "ST 1202 Generalized Transformation Local Set"); + assertTrue( + uut.getIdentifiers() + .contains(GeneralizedTransformationParametersKey.DocumentVersion)); + assertEquals( + uut.getField(GeneralizedTransformationParametersKey.DocumentVersion) + .getDisplayName(), + "Document Version"); + assertEquals( + uut.getField(GeneralizedTransformationParametersKey.DocumentVersion) + .getDisplayableValue(), + "ST 1202.2"); + } +} diff --git a/st1002/src/test/java/org/jmisb/st1002/LoggerChecks.java b/st1002/src/test/java/org/jmisb/st1002/LoggerChecks.java new file mode 100644 index 000000000..306f52ca6 --- /dev/null +++ b/st1002/src/test/java/org/jmisb/st1002/LoggerChecks.java @@ -0,0 +1,63 @@ +package org.jmisb.st1002; + +import com.github.valfirst.slf4jtest.LoggingEvent; +import com.github.valfirst.slf4jtest.TestLogger; +import com.github.valfirst.slf4jtest.TestLoggerFactory; +import java.util.List; +import org.slf4j.helpers.MessageFormatter; +import org.testng.Assert; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import uk.org.lidalia.slf4jext.Level; + +/** + * Superclass for logging checks in a test case. + * + *

The concept is that there is a test logger that should always contain no log messages after a + * test has been run. That gets verified in the AfterMethod so if there is a message, the logger + * needs to be checked and clear()ed before the test method returns. + * + *

Only ERROR, WARN and INFO levels are checked. DEBUG and lower are implementation detail. + * + *

The subclass is responsible for initialising the LOGGER correctly by calling the super + * constructor with the class that is creating the log messages. + */ +public abstract class LoggerChecks { + protected TestLogger LOGGER; + + public LoggerChecks(Class T) { + LOGGER = TestLoggerFactory.getTestLogger(T); + LOGGER.setEnabledLevelsForAllThreads(Level.ERROR, Level.WARN, Level.INFO); + } + + @BeforeMethod + public void clearLogger() { + LOGGER.clear(); + } + + @AfterMethod + public void checkLogger() { + verifyNoLoggerMessages(); + } + + protected void verifyNoLoggerMessages() { + if (LOGGER.getLoggingEvents().size() > 0) { + List events = LOGGER.getLoggingEvents(); + for (LoggingEvent event : events) { + System.out.println(event.getLevel().name() + ": " + event.getMessage().toString()); + } + } + Assert.assertEquals(LOGGER.getLoggingEvents().size(), 0); + } + + protected void verifySingleLoggerMessage(final String expectedMessage) { + Assert.assertEquals(LOGGER.getLoggingEvents().size(), 1); + LoggingEvent event = LOGGER.getLoggingEvents().get(0); + Assert.assertEquals(event.getArguments().size(), 1); + String message = + MessageFormatter.format(event.getMessage(), event.getArguments().get(0)) + .getMessage(); + Assert.assertEquals(message, expectedMessage); + LOGGER.clear(); + } +} diff --git a/st1002/src/test/java/org/jmisb/st1002/NumberOfSectionsInXTest.java b/st1002/src/test/java/org/jmisb/st1002/NumberOfSectionsInXTest.java new file mode 100644 index 000000000..ccbdd6415 --- /dev/null +++ b/st1002/src/test/java/org/jmisb/st1002/NumberOfSectionsInXTest.java @@ -0,0 +1,82 @@ +package org.jmisb.st1002; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; + +import org.jmisb.api.common.KlvParseException; +import org.testng.annotations.Test; + +/** Tests for ST 1002 Number of Sections in X (ST 1002 Tag 17). */ +public class NumberOfSectionsInXTest { + @Test + public void testConstructFromValue() { + NumberOfSectionsInX uut = new NumberOfSectionsInX(1); + assertEquals(uut.getBytes(), new byte[] {(byte) 0x01}); + assertEquals(uut.getDisplayName(), "Number of Sections in X"); + assertEquals(uut.getDisplayableValue(), "1"); + assertEquals(uut.getNumberOfSections(), 1); + } + + @Test + public void testConstructFromValue127() { + NumberOfSectionsInX uut = new NumberOfSectionsInX(127); + assertEquals(uut.getBytes(), new byte[] {(byte) 0x7f}); + assertEquals(uut.getDisplayName(), "Number of Sections in X"); + assertEquals(uut.getDisplayableValue(), "127"); + assertEquals(uut.getNumberOfSections(), 127); + } + + @Test + public void testConstructFromValue129() { + NumberOfSectionsInX uut = new NumberOfSectionsInX(129); + assertEquals(uut.getBytes(), new byte[] {(byte) 0x81, (byte) 0x01}); + assertEquals(uut.getDisplayName(), "Number of Sections in X"); + assertEquals(uut.getDisplayableValue(), "129"); + assertEquals(uut.getNumberOfSections(), 129); + } + + @Test + public void testConstructFromEncodedBytes() { + NumberOfSectionsInX uut = new NumberOfSectionsInX(new byte[] {(byte) 0x02}); + assertEquals(uut.getBytes(), new byte[] {(byte) 0x02}); + assertEquals(uut.getDisplayName(), "Number of Sections in X"); + assertEquals(uut.getDisplayableValue(), "2"); + assertEquals(uut.getNumberOfSections(), 2); + } + + @Test + public void testConstructFromEncodedBytes127() { + NumberOfSectionsInX uut = new NumberOfSectionsInX(new byte[] {(byte) 0x7F}); + assertEquals(uut.getBytes(), new byte[] {(byte) 0x7F}); + assertEquals(uut.getDisplayName(), "Number of Sections in X"); + assertEquals(uut.getDisplayableValue(), "127"); + assertEquals(uut.getNumberOfSections(), 127); + } + + @Test + public void testConstructFromEncodedBytes255() { + NumberOfSectionsInX uut = new NumberOfSectionsInX(new byte[] {(byte) 0x81, (byte) 0x7F}); + assertEquals(uut.getBytes(), new byte[] {(byte) 0x81, (byte) 0x7F}); + assertEquals(uut.getDisplayName(), "Number of Sections in X"); + assertEquals(uut.getDisplayableValue(), "255"); + assertEquals(uut.getNumberOfSections(), 255); + } + + @Test + public void testFactoryEncodedBytes() throws KlvParseException { + IRangeImageMetadataValue value = + RangeImageLocalSet.createValue( + RangeImageMetadataKey.NumberOfSectionsInX, new byte[] {(byte) 0x02}); + assertTrue(value instanceof NumberOfSectionsInX); + NumberOfSectionsInX uut = (NumberOfSectionsInX) value; + assertEquals(uut.getBytes(), new byte[] {(byte) 0x02}); + assertEquals(uut.getDisplayName(), "Number of Sections in X"); + assertEquals(uut.getDisplayableValue(), "2"); + assertEquals(uut.getNumberOfSections(), 2); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testTooSmall() { + new NumberOfSectionsInX(0); + } +} diff --git a/st1002/src/test/java/org/jmisb/st1002/NumberOfSectionsInYTest.java b/st1002/src/test/java/org/jmisb/st1002/NumberOfSectionsInYTest.java new file mode 100644 index 000000000..0527d76e4 --- /dev/null +++ b/st1002/src/test/java/org/jmisb/st1002/NumberOfSectionsInYTest.java @@ -0,0 +1,82 @@ +package org.jmisb.st1002; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; + +import org.jmisb.api.common.KlvParseException; +import org.testng.annotations.Test; + +/** Tests for ST 1002 Number of Sections in Y (ST 1002 Tag 18). */ +public class NumberOfSectionsInYTest { + @Test + public void testConstructFromValue() { + NumberOfSectionsInY uut = new NumberOfSectionsInY(1); + assertEquals(uut.getBytes(), new byte[] {(byte) 0x01}); + assertEquals(uut.getDisplayName(), "Number of Sections in Y"); + assertEquals(uut.getDisplayableValue(), "1"); + assertEquals(uut.getNumberOfSections(), 1); + } + + @Test + public void testConstructFromValue127() { + NumberOfSectionsInY uut = new NumberOfSectionsInY(127); + assertEquals(uut.getBytes(), new byte[] {(byte) 0x7f}); + assertEquals(uut.getDisplayName(), "Number of Sections in Y"); + assertEquals(uut.getDisplayableValue(), "127"); + assertEquals(uut.getNumberOfSections(), 127); + } + + @Test + public void testConstructFromValue129() { + NumberOfSectionsInY uut = new NumberOfSectionsInY(129); + assertEquals(uut.getBytes(), new byte[] {(byte) 0x81, (byte) 0x01}); + assertEquals(uut.getDisplayName(), "Number of Sections in Y"); + assertEquals(uut.getDisplayableValue(), "129"); + assertEquals(uut.getNumberOfSections(), 129); + } + + @Test + public void testConstructFromEncodedBytes() { + NumberOfSectionsInY uut = new NumberOfSectionsInY(new byte[] {(byte) 0x02}); + assertEquals(uut.getBytes(), new byte[] {(byte) 0x02}); + assertEquals(uut.getDisplayName(), "Number of Sections in Y"); + assertEquals(uut.getDisplayableValue(), "2"); + assertEquals(uut.getNumberOfSections(), 2); + } + + @Test + public void testConstructFromEncodedBytes127() { + NumberOfSectionsInY uut = new NumberOfSectionsInY(new byte[] {(byte) 0x7F}); + assertEquals(uut.getBytes(), new byte[] {(byte) 0x7F}); + assertEquals(uut.getDisplayName(), "Number of Sections in Y"); + assertEquals(uut.getDisplayableValue(), "127"); + assertEquals(uut.getNumberOfSections(), 127); + } + + @Test + public void testConstructFromEncodedBytes255() { + NumberOfSectionsInY uut = new NumberOfSectionsInY(new byte[] {(byte) 0x81, (byte) 0x7F}); + assertEquals(uut.getBytes(), new byte[] {(byte) 0x81, (byte) 0x7F}); + assertEquals(uut.getDisplayName(), "Number of Sections in Y"); + assertEquals(uut.getDisplayableValue(), "255"); + assertEquals(uut.getNumberOfSections(), 255); + } + + @Test + public void testFactoryEncodedBytes() throws KlvParseException { + IRangeImageMetadataValue value = + RangeImageLocalSet.createValue( + RangeImageMetadataKey.NumberOfSectionsInY, new byte[] {(byte) 0x02}); + assertTrue(value instanceof NumberOfSectionsInY); + NumberOfSectionsInY uut = (NumberOfSectionsInY) value; + assertEquals(uut.getBytes(), new byte[] {(byte) 0x02}); + assertEquals(uut.getDisplayName(), "Number of Sections in Y"); + assertEquals(uut.getDisplayableValue(), "2"); + assertEquals(uut.getNumberOfSections(), 2); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testTooSmall() { + new NumberOfSectionsInY(0); + } +} diff --git a/st1002/src/test/java/org/jmisb/st1002/PrecisionTimeStampTest.java b/st1002/src/test/java/org/jmisb/st1002/PrecisionTimeStampTest.java new file mode 100644 index 000000000..d1c4e9634 --- /dev/null +++ b/st1002/src/test/java/org/jmisb/st1002/PrecisionTimeStampTest.java @@ -0,0 +1,134 @@ +package org.jmisb.st1002; + +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.Month; +import java.time.ZoneOffset; +import java.time.temporal.ChronoUnit; +import org.jmisb.api.common.KlvParseException; +import org.testng.Assert; +import org.testng.annotations.Test; + +public class PrecisionTimeStampTest { + // Example from MISB ST 0601 doc + @Test + public void testExample() { + // Convert byte[] -> value + byte[] bytes = + new byte[] { + (byte) 0x00, + (byte) 0x04, + (byte) 0x59, + (byte) 0xf4, + (byte) 0xA6, + (byte) 0xaa, + (byte) 0x4a, + (byte) 0xa8 + }; + ST1002PrecisionTimeStamp pts = new ST1002PrecisionTimeStamp(bytes); + Assert.assertEquals(pts.getDisplayName(), "Precision Time Stamp"); + Assert.assertEquals(pts.getDisplayableValue(), "1224807209913000"); + LocalDateTime dateTime = pts.getDateTime(); + + Assert.assertEquals(dateTime.getYear(), 2008); + Assert.assertEquals(dateTime.getMonth(), Month.OCTOBER); + Assert.assertEquals(dateTime.getDayOfMonth(), 24); + Assert.assertEquals(dateTime.getHour(), 0); + Assert.assertEquals(dateTime.getMinute(), 13); + Assert.assertEquals(dateTime.getSecond(), 29); + Assert.assertEquals(dateTime.getNano(), 913000000); + + // Convert value -> byte[] + long microseconds = dateTime.toInstant(ZoneOffset.UTC).toEpochMilli() * 1000; + ST1002PrecisionTimeStamp pts2 = new ST1002PrecisionTimeStamp(microseconds); + Assert.assertEquals(pts2.getDisplayName(), "Precision Time Stamp"); + Assert.assertEquals( + pts2.getBytes(), + new byte[] { + (byte) 0x00, + (byte) 0x04, + (byte) 0x59, + (byte) 0xf4, + (byte) 0xA6, + (byte) 0xaa, + (byte) 0x4a, + (byte) 0xa8 + }); + + Assert.assertEquals(microseconds, 1224807209913000L); + Assert.assertEquals(pts2.getDisplayableValue(), "1224807209913000"); + } + + @Test + public void testFactoryExample() throws KlvParseException { + byte[] bytes = + new byte[] { + (byte) 0x00, + (byte) 0x04, + (byte) 0x59, + (byte) 0xf4, + (byte) 0xA6, + (byte) 0xaa, + (byte) 0x4a, + (byte) 0xa8 + }; + IRangeImageMetadataValue v = + RangeImageLocalSet.createValue(RangeImageMetadataKey.PrecisionTimeStamp, bytes); + Assert.assertTrue(v instanceof ST1002PrecisionTimeStamp); + Assert.assertEquals(v.getDisplayName(), "Precision Time Stamp"); + ST1002PrecisionTimeStamp pts = (ST1002PrecisionTimeStamp) v; + Assert.assertEquals(pts.getDisplayableValue(), "1224807209913000"); + LocalDateTime dateTime = pts.getDateTime(); + + Assert.assertEquals(dateTime.getYear(), 2008); + Assert.assertEquals(dateTime.getMonth(), Month.OCTOBER); + Assert.assertEquals(dateTime.getDayOfMonth(), 24); + Assert.assertEquals(dateTime.getHour(), 0); + Assert.assertEquals(dateTime.getMinute(), 13); + Assert.assertEquals(dateTime.getSecond(), 29); + Assert.assertEquals(dateTime.getNano(), 913000000); + } + + @Test + public void testNow() { + LocalDateTime now = LocalDateTime.now(); + ST1002PrecisionTimeStamp pts = new ST1002PrecisionTimeStamp(now); + Assert.assertEquals(pts.getDisplayName(), "Precision Time Stamp"); + Assert.assertEquals(pts.getDateTime().getDayOfMonth(), now.getDayOfMonth()); + Assert.assertEquals(pts.getDateTime().getHour(), now.getHour()); + long ptsMicroseconds = pts.getMicroseconds(); + long nowMicroseconds = + ChronoUnit.MICROS.between(Instant.EPOCH, now.toInstant(ZoneOffset.UTC)); + Assert.assertEquals(ptsMicroseconds, nowMicroseconds); + } + + @Test + public void testMinAndMax() { + ST1002PrecisionTimeStamp pts = new ST1002PrecisionTimeStamp(0L); + Assert.assertEquals(pts.getDisplayName(), "Precision Time Stamp"); + Assert.assertEquals(pts.getDateTime().getYear(), 1970); + Assert.assertEquals(pts.getDateTime().getMonth(), Month.JANUARY); + Assert.assertEquals(pts.getDateTime().getDayOfMonth(), 1); + Assert.assertEquals(pts.getDisplayableValue(), "0"); + + // Create max value and ensure no exception is thrown + pts = new ST1002PrecisionTimeStamp(Long.MAX_VALUE); + Assert.assertEquals(pts.getDisplayName(), "Precision Time Stamp"); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testTooSmall() { + new ST1002PrecisionTimeStamp(-1); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testTooBig() { + // Oct 12, 2263 at 08:30 + new ST1002PrecisionTimeStamp(LocalDateTime.of(2263, 10, 12, 8, 30)); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void badArrayLength() { + new ST1002PrecisionTimeStamp(new byte[] {0x00, 0x00, 0x00, 0x00}); + } +} diff --git a/st1002/src/test/java/org/jmisb/st1002/RangeImageCompressionMethodTest.java b/st1002/src/test/java/org/jmisb/st1002/RangeImageCompressionMethodTest.java new file mode 100644 index 000000000..d37116ba4 --- /dev/null +++ b/st1002/src/test/java/org/jmisb/st1002/RangeImageCompressionMethodTest.java @@ -0,0 +1,45 @@ +package org.jmisb.st1002; + +import static org.testng.Assert.assertEquals; + +import org.testng.annotations.Test; + +/** Unit tests for RangeImageCompressionMethod. */ +public class RangeImageCompressionMethodTest { + + @Test + public void checkNoCompression() { + RangeImageCompressionMethod uut = RangeImageCompressionMethod.NO_COMPRESSION; + assertEquals(uut.getEncodedValue(), 0); + assertEquals(uut.getTextDescription(), "No Compression"); + } + + @Test + public void checkPlanarFit() { + RangeImageCompressionMethod uut = RangeImageCompressionMethod.PLANAR_FIT; + assertEquals(uut.getEncodedValue(), 1); + assertEquals(uut.getTextDescription(), "Planar Fit"); + } + + @Test + public void checkLookupNoCompression() { + RangeImageCompressionMethod uut = RangeImageCompressionMethod.lookup(0); + assertEquals(uut.getEncodedValue(), 0); + assertEquals(uut.getTextDescription(), "No Compression"); + } + + @Test + public void checkLookupPlanar() { + RangeImageCompressionMethod uut = RangeImageCompressionMethod.lookup(1); + assertEquals(uut.getEncodedValue(), 1); + assertEquals(uut.getTextDescription(), "Planar Fit"); + } + + @Test + public void checkLookupUnknownValue() { + RangeImageCompressionMethod uut = RangeImageCompressionMethod.lookup(2); + assertEquals(uut, RangeImageCompressionMethod.UNKNOWN); + assertEquals(uut.getEncodedValue(), -1); + assertEquals(uut.getTextDescription(), "Unknown"); + } +} diff --git a/st1002/src/test/java/org/jmisb/st1002/RangeImageDataTypeTest.java b/st1002/src/test/java/org/jmisb/st1002/RangeImageDataTypeTest.java new file mode 100644 index 000000000..1187d5623 --- /dev/null +++ b/st1002/src/test/java/org/jmisb/st1002/RangeImageDataTypeTest.java @@ -0,0 +1,45 @@ +package org.jmisb.st1002; + +import static org.testng.Assert.assertEquals; + +import org.testng.annotations.Test; + +/** Unit tests for RangeImageDataType. */ +public class RangeImageDataTypeTest { + + @Test + public void checkPerspective() { + RangeImageryDataType uut = RangeImageryDataType.PERSPECTIVE; + assertEquals(uut.getEncodedValue(), 0); + assertEquals(uut.getTextDescription(), "Perspective Range Image"); + } + + @Test + public void checkDepth() { + RangeImageryDataType uut = RangeImageryDataType.DEPTH; + assertEquals(uut.getEncodedValue(), 1); + assertEquals(uut.getTextDescription(), "Depth Range Image"); + } + + @Test + public void checkLookupPerspective() { + RangeImageryDataType uut = RangeImageryDataType.lookup(0); + assertEquals(uut.getEncodedValue(), 0); + assertEquals(uut.getTextDescription(), "Perspective Range Image"); + } + + @Test + public void checkLookupDepth() { + RangeImageryDataType uut = RangeImageryDataType.lookup(1); + assertEquals(uut.getEncodedValue(), 1); + assertEquals(uut.getTextDescription(), "Depth Range Image"); + } + + @Test + public void checkLookupUnknownValue() { + RangeImageryDataType uut = RangeImageryDataType.lookup(2); + assertEquals(uut, RangeImageryDataType.UNKNOWN); + assertEquals(uut.getEncodedValue(), -1); + assertEquals(uut.getTextDescription(), "Unknown"); + } +} diff --git a/st1002/src/test/java/org/jmisb/st1002/RangeImageEnumerationsTest.java b/st1002/src/test/java/org/jmisb/st1002/RangeImageEnumerationsTest.java new file mode 100644 index 000000000..ca29c645b --- /dev/null +++ b/st1002/src/test/java/org/jmisb/st1002/RangeImageEnumerationsTest.java @@ -0,0 +1,88 @@ +package org.jmisb.st1002; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; + +import org.jmisb.api.common.KlvParseException; +import org.testng.annotations.Test; + +/** Tests for ST 1002 Range Image Enumerations (ST 1002 Tag 12). */ +public class RangeImageEnumerationsTest { + @Test + public void testConstructFromValue() { + RangeImageEnumerations uut = + new RangeImageEnumerations( + RangeImageCompressionMethod.PLANAR_FIT, + RangeImageryDataType.DEPTH, + RangeImageSource.RANGE_SENSOR); + assertEquals(uut.getBytes(), new byte[] {(byte) 0b01001001}); + assertEquals(uut.getDisplayName(), "Range Image Enumerations"); + assertEquals(uut.getDisplayableValue(), "Range Sensor | Depth Range Image | Planar Fit"); + assertEquals(uut.getCompressionMethod(), RangeImageCompressionMethod.PLANAR_FIT); + assertEquals(uut.getDataType(), RangeImageryDataType.DEPTH); + assertEquals(uut.getRangeImageSource(), RangeImageSource.RANGE_SENSOR); + } + + @Test + public void testConstructFromBytes() { + RangeImageEnumerations uut = new RangeImageEnumerations(new byte[] {(byte) 0b01001001}); + assertEquals(uut.getBytes(), new byte[] {(byte) 0b01001001}); + assertEquals(uut.getDisplayName(), "Range Image Enumerations"); + assertEquals(uut.getDisplayableValue(), "Range Sensor | Depth Range Image | Planar Fit"); + assertEquals(uut.getCompressionMethod(), RangeImageCompressionMethod.PLANAR_FIT); + assertEquals(uut.getDataType(), RangeImageryDataType.DEPTH); + assertEquals(uut.getRangeImageSource(), RangeImageSource.RANGE_SENSOR); + } + + @Test + public void testFactoryEncodedBytes() throws KlvParseException { + IRangeImageMetadataValue value = + RangeImageLocalSet.createValue( + RangeImageMetadataKey.RangeImageEnumerations, + new byte[] {(byte) 0b01001001}); + assertTrue(value instanceof RangeImageEnumerations); + RangeImageEnumerations uut = (RangeImageEnumerations) value; + assertEquals(uut.getBytes(), new byte[] {(byte) 0b01001001}); + assertEquals(uut.getDisplayName(), "Range Image Enumerations"); + assertEquals(uut.getDisplayableValue(), "Range Sensor | Depth Range Image | Planar Fit"); + assertEquals(uut.getCompressionMethod(), RangeImageCompressionMethod.PLANAR_FIT); + assertEquals(uut.getDataType(), RangeImageryDataType.DEPTH); + assertEquals(uut.getRangeImageSource(), RangeImageSource.RANGE_SENSOR); + } + + @Test( + expectedExceptions = IllegalArgumentException.class, + expectedExceptionsMessageRegExp = "Range Image Source cannot be UNKNOWN") + public void testSerialisationBadSource() { + RangeImageEnumerations uut = + new RangeImageEnumerations( + RangeImageCompressionMethod.NO_COMPRESSION, + RangeImageryDataType.DEPTH, + RangeImageSource.UNKNOWN); + uut.getBytes(); + } + + @Test( + expectedExceptions = IllegalArgumentException.class, + expectedExceptionsMessageRegExp = "Range Imagery Data Type cannot be UNKNOWN") + public void testSerialisationBadDataType() { + RangeImageEnumerations uut = + new RangeImageEnumerations( + RangeImageCompressionMethod.NO_COMPRESSION, + RangeImageryDataType.UNKNOWN, + RangeImageSource.COMPUTATIONALLY_EXTRACTED); + uut.getBytes(); + } + + @Test( + expectedExceptions = IllegalArgumentException.class, + expectedExceptionsMessageRegExp = "Range Image Compression Method cannot be UNKNOWN") + public void testSerialisationBadCompressionMethod() { + RangeImageEnumerations uut = + new RangeImageEnumerations( + RangeImageCompressionMethod.UNKNOWN, + RangeImageryDataType.PERSPECTIVE, + RangeImageSource.COMPUTATIONALLY_EXTRACTED); + uut.getBytes(); + } +} diff --git a/st1002/src/test/java/org/jmisb/st1002/RangeImageLocalSetTest.java b/st1002/src/test/java/org/jmisb/st1002/RangeImageLocalSetTest.java new file mode 100644 index 000000000..2b726be9f --- /dev/null +++ b/st1002/src/test/java/org/jmisb/st1002/RangeImageLocalSetTest.java @@ -0,0 +1,358 @@ +package org.jmisb.st1002; + +import static org.testng.Assert.*; + +import java.time.LocalDateTime; +import java.time.Month; +import java.util.HashMap; +import java.util.Map; +import org.jmisb.api.common.KlvParseException; +import org.testng.annotations.Test; + +/** Tests for the ST 1002 Range Image Local Set. */ +public class RangeImageLocalSetTest extends LoggerChecks { + + public RangeImageLocalSetTest() { + super(RangeImageLocalSet.class); + } + + @Test + public void parse() throws KlvParseException { + final byte[] bytes = + new byte[] { + (byte) 0x06, + (byte) 0x0E, + (byte) 0x2B, + (byte) 0x34, + (byte) 0x02, + (byte) 0x0B, + (byte) 0x01, + (byte) 0x01, + (byte) 0x0E, + (byte) 0x01, + (byte) 0x03, + (byte) 0x03, + (byte) 0x0C, + (byte) 0x00, + (byte) 0x00, + (byte) 0x00, + (byte) 0x07, + (byte) 0x0B, + (byte) 0x01, + (byte) 0x02, + (byte) 0x15, + (byte) 0x02, + (byte) 0x32, + (byte) 0x3E + }; + RangeImageLocalSetFactory factory = new RangeImageLocalSetFactory(); + assertEquals( + factory.getUniversalLabel().getBytes(), + new byte[] { + 0x06, 0x0e, 0x2b, 0x34, 0x02, 0x0b, 0x01, 0x01, 0x0e, 0x01, 0x03, 0x03, 0x0c, + 0x00, 0x00, 0x00 + }); + RangeImageLocalSet localSet = factory.create(bytes); + assertNotNull(localSet); + assertEquals(localSet.displayHeader(), "ST 1002 Range Image"); + assertEquals(localSet.getUniversalLabel(), RangeImageLocalSet.RangeImageLocalSetUl); + assertEquals(localSet.getIdentifiers().size(), 1); + } + + @Test + public void parseWithUnknown() throws KlvParseException { + final byte[] bytes = + new byte[] { + (byte) 0x06, + (byte) 0x0E, + (byte) 0x2B, + (byte) 0x34, + (byte) 0x02, + (byte) 0x0B, + (byte) 0x01, + (byte) 0x01, + (byte) 0x0E, + (byte) 0x01, + (byte) 0x03, + (byte) 0x03, + (byte) 0x0C, + (byte) 0x00, + (byte) 0x00, + (byte) 0x00, + (byte) 0x0a, + (byte) 0x7F, + (byte) 0x01, + (byte) 0x00, + (byte) 0x0B, + (byte) 0x01, + (byte) 0x02, + (byte) 0x15, + (byte) 0x02, + (byte) 0x05, + (byte) 0xc7 + }; + RangeImageLocalSetFactory factory = new RangeImageLocalSetFactory(); + assertEquals( + factory.getUniversalLabel().getBytes(), + new byte[] { + 0x06, 0x0e, 0x2b, 0x34, 0x02, 0x0b, 0x01, 0x01, 0x0e, 0x01, 0x03, 0x03, 0x0c, + 0x00, 0x00, 0x00 + }); + verifyNoLoggerMessages(); + RangeImageLocalSet localSet = factory.create(bytes); + verifySingleLoggerMessage("Unknown Range Image Metadata tag: 127"); + assertNotNull(localSet); + assertEquals(localSet.displayHeader(), "ST 1002 Range Image"); + assertEquals(localSet.getUniversalLabel(), RangeImageLocalSet.RangeImageLocalSetUl); + assertEquals(localSet.getIdentifiers().size(), 1); + } + + @Test + public void fromNestedBytes() throws KlvParseException { + final byte[] bytes = + new byte[] { + (byte) 0x06, + (byte) 0x0E, + (byte) 0x2B, + (byte) 0x34, + (byte) 0x02, + (byte) 0x0B, + (byte) 0x01, + (byte) 0x01, + (byte) 0x0E, + (byte) 0x01, + (byte) 0x03, + (byte) 0x03, + (byte) 0x0C, + (byte) 0x00, + (byte) 0x00, + (byte) 0x00, + (byte) 0x07, + (byte) 0x0B, + (byte) 0x01, + (byte) 0x02, + (byte) 0x15, + (byte) 0x02, + (byte) 0x32, + (byte) 0x3E + }; + RangeImageLocalSet localSet = + RangeImageLocalSet.fromNestedBytes( + new byte[] {0x0B, 0x01, 0x2, 0x15, 0x02, (byte) 0xd9, 0x21}, 0, 7); + assertNotNull(localSet); + assertEquals(localSet.displayHeader(), "ST 1002 Range Image"); + assertEquals(localSet.getUniversalLabel(), RangeImageLocalSet.RangeImageLocalSetUl); + assertEquals(localSet.getIdentifiers().size(), 1); + assertEquals(localSet.frameMessage(false), bytes); + assertEquals( + localSet.frameMessage(true), + new byte[] {0x0B, 0x01, 0x2, 0x15, 0x02, (byte) 0xd9, 0x21}); + } + + @Test(expectedExceptions = KlvParseException.class) + public void badChecksum() throws KlvParseException { + byte[] bytes = + new byte[] { + (byte) 0x06, + (byte) 0x0E, + (byte) 0x2B, + (byte) 0x34, + (byte) 0x02, + (byte) 0x0B, + (byte) 0x01, + (byte) 0x01, + (byte) 0x0E, + (byte) 0x01, + (byte) 0x03, + (byte) 0x03, + (byte) 0x0C, + (byte) 0x00, + (byte) 0x00, + (byte) 0x00, + (byte) 0x07, + (byte) 0x0B, + (byte) 0x01, + (byte) 0x02, + (byte) 0x15, + (byte) 0x02, + (byte) 0x31, + (byte) 0x3E + }; + verifyNoLoggerMessages(); + RangeImageLocalSetFactory factory = new RangeImageLocalSetFactory(); + factory.create(bytes); + verifySingleLoggerMessage("Bad checksum"); + } + + @Test + public void buildFromValues() throws KlvParseException { + + Map values = new HashMap<>(); + values.put(RangeImageMetadataKey.DocumentVersion, new ST1002VersionNumber(2)); + RangeImageLocalSet localSet = new RangeImageLocalSet(values); + assertNotNull(localSet); + assertEquals(localSet.displayHeader(), "ST 1002 Range Image"); + assertEquals(localSet.getUniversalLabel(), RangeImageLocalSet.RangeImageLocalSetUl); + assertEquals(localSet.getIdentifiers().size(), 1); + final byte[] expectedBytes = + new byte[] { + (byte) 0x06, + (byte) 0x0E, + (byte) 0x2B, + (byte) 0x34, + (byte) 0x02, + (byte) 0x0B, + (byte) 0x01, + (byte) 0x01, + (byte) 0x0E, + (byte) 0x01, + (byte) 0x03, + (byte) 0x03, + (byte) 0x0C, + (byte) 0x00, + (byte) 0x00, + (byte) 0x00, + (byte) 0x07, + (byte) 0x0B, + (byte) 0x01, + (byte) 0x02, + (byte) 0x15, + (byte) 0x02, + (byte) 0x32, + (byte) 0x3E + }; + assertEquals(localSet.frameMessage(false), expectedBytes); + assertEquals( + localSet.frameMessage(true), + new byte[] {0x0B, 0x01, 0x2, 0x15, 0x02, (byte) 0xd9, 0x21}); + } + + @Test + public void buildFromValuesWithCRCAndUnknown() throws KlvParseException { + final byte[] bytes = + new byte[] { + (byte) 0x06, + (byte) 0x0E, + (byte) 0x2B, + (byte) 0x34, + (byte) 0x02, + (byte) 0x0B, + (byte) 0x01, + (byte) 0x01, + (byte) 0x0E, + (byte) 0x01, + (byte) 0x03, + (byte) 0x03, + (byte) 0x0C, + (byte) 0x00, + (byte) 0x00, + (byte) 0x00, + (byte) 0x07, + (byte) 0x0B, + (byte) 0x01, + (byte) 0x02, + (byte) 0x15, + (byte) 0x02, + (byte) 0x32, + (byte) 0x3E + }; + Map values = new HashMap<>(); + values.put( + RangeImageMetadataKey.Undefined, + new IRangeImageMetadataValue() { + @Override + public byte[] getBytes() { + throw new UnsupportedOperationException("Should not be called"); + } + + @Override + public String getDisplayName() { + return "bogus name"; + } + + @Override + public String getDisplayableValue() { + return "bogus value"; + } + }); + values.put( + RangeImageMetadataKey.CRC16CCITT, + new IRangeImageMetadataValue() { + @Override + public byte[] getBytes() { + throw new UnsupportedOperationException("Should not be called"); + } + + @Override + public String getDisplayName() { + throw new UnsupportedOperationException("Should not be called"); + } + + @Override + public String getDisplayableValue() { + throw new UnsupportedOperationException("Should not be called"); + } + }); + values.put(RangeImageMetadataKey.DocumentVersion, new ST1002VersionNumber(2)); + + RangeImageLocalSet localSet = new RangeImageLocalSet(values); + assertNotNull(localSet); + assertEquals(localSet.frameMessage(false), bytes); + assertEquals( + localSet.frameMessage(true), + new byte[] {0x0B, 0x01, 0x2, 0x15, 0x02, (byte) 0xd9, 0x21}); + } + + @Test + public void createUnknown() throws KlvParseException { + verifyNoLoggerMessages(); + IRangeImageMetadataValue value = + RangeImageLocalSet.createValue(RangeImageMetadataKey.Undefined, new byte[] {0x01}); + verifySingleLoggerMessage("Unknown Range Image Metadata tag: Undefined"); + assertNull(value); + } + + @Test + public void buildFromValuesWithSectionData() throws KlvParseException { + Map values = new HashMap<>(); + values.put( + RangeImageMetadataKey.PrecisionTimeStamp, + new ST1002PrecisionTimeStamp(LocalDateTime.of(2023, Month.JANUARY, 25, 19, 50))); + values.put(RangeImageMetadataKey.DocumentVersion, new ST1002VersionNumber(2)); + values.put( + RangeImageMetadataKey.Undefined, + new IRangeImageMetadataValue() { + @Override + public byte[] getBytes() { + throw new UnsupportedOperationException("Should not be called."); + } + + @Override + public String getDisplayName() { + throw new UnsupportedOperationException("Should not be called."); + } + + @Override + public String getDisplayableValue() { + throw new UnsupportedOperationException("Should not be called."); + } + }); + SectionDataList sectionDataList = new SectionDataList(); + sectionDataList.add( + new SectionData(1, 1, new double[][] {{100.0, 200.0}, {150.0, 250.0}}, null)); + sectionDataList.add( + new SectionData(1, 2, new double[][] {{300.0, 400.0}, {350.0, 450.0}}, null)); + values.put(RangeImageMetadataKey.SectionDataVLP, sectionDataList); + values.put(RangeImageMetadataKey.NumberOfSectionsInX, new NumberOfSectionsInX(1)); + values.put(RangeImageMetadataKey.NumberOfSectionsInY, new NumberOfSectionsInX(2)); + RangeImageLocalSet localSet = new RangeImageLocalSet(values); + assertNotNull(localSet); + assertEquals(localSet.displayHeader(), "ST 1002 Range Image"); + assertEquals(localSet.getUniversalLabel(), RangeImageLocalSet.RangeImageLocalSetUl); + assertEquals(localSet.getIdentifiers().size(), 6); + byte[] bytes = localSet.frameMessage(false); + RangeImageLocalSet parsedLocalSet = new RangeImageLocalSet(bytes); + // Undefined entry got dropped out. + assertEquals(parsedLocalSet.getIdentifiers().size(), 5); + } +} diff --git a/st1002/src/test/java/org/jmisb/st1002/RangeImageSourceTest.java b/st1002/src/test/java/org/jmisb/st1002/RangeImageSourceTest.java new file mode 100644 index 000000000..59317fea2 --- /dev/null +++ b/st1002/src/test/java/org/jmisb/st1002/RangeImageSourceTest.java @@ -0,0 +1,45 @@ +package org.jmisb.st1002; + +import static org.testng.Assert.assertEquals; + +import org.testng.annotations.Test; + +/** Unit tests for RangeImageSource. */ +public class RangeImageSourceTest { + + @Test + public void checkComputationallyExtracted() { + RangeImageSource uut = RangeImageSource.COMPUTATIONALLY_EXTRACTED; + assertEquals(uut.getEncodedValue(), 0); + assertEquals(uut.getTextDescription(), "Computationally Extracted"); + } + + @Test + public void checkRangeSensor() { + RangeImageSource uut = RangeImageSource.RANGE_SENSOR; + assertEquals(uut.getEncodedValue(), 1); + assertEquals(uut.getTextDescription(), "Range Sensor"); + } + + @Test + public void checkLookupComputationallyExtracted() { + RangeImageSource uut = RangeImageSource.lookup(0); + assertEquals(uut.getEncodedValue(), 0); + assertEquals(uut.getTextDescription(), "Computationally Extracted"); + } + + @Test + public void checkLookupRangeSensor() { + RangeImageSource uut = RangeImageSource.lookup(1); + assertEquals(uut.getEncodedValue(), 1); + assertEquals(uut.getTextDescription(), "Range Sensor"); + } + + @Test + public void checkLookupUnknownValue() { + RangeImageSource uut = RangeImageSource.lookup(2); + assertEquals(uut, RangeImageSource.UNKNOWN); + assertEquals(uut.getEncodedValue(), -1); + assertEquals(uut.getTextDescription(), "Unknown"); + } +} diff --git a/st1002/src/test/java/org/jmisb/st1002/ST1002VersionNumberTest.java b/st1002/src/test/java/org/jmisb/st1002/ST1002VersionNumberTest.java new file mode 100644 index 000000000..5815a5018 --- /dev/null +++ b/st1002/src/test/java/org/jmisb/st1002/ST1002VersionNumberTest.java @@ -0,0 +1,92 @@ +package org.jmisb.st1002; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; + +import org.jmisb.api.common.KlvParseException; +import org.testng.annotations.Test; + +/** Tests for ST 1002 Version Number (ST 1002 Tag 11). */ +public class ST1002VersionNumberTest { + @Test + public void testConstructFromValue() { + ST1002VersionNumber version = new ST1002VersionNumber(1); + assertEquals(version.getBytes(), new byte[] {(byte) 0x01}); + assertEquals(version.getDisplayName(), "Version Number"); + assertEquals(version.getDisplayableValue(), "ST 1002.1"); + assertEquals(version.getVersion(), 1); + } + + @Test + public void testConstructFromValue127() { + ST1002VersionNumber version = new ST1002VersionNumber(127); + assertEquals(version.getBytes(), new byte[] {(byte) 0x7f}); + assertEquals(version.getDisplayName(), "Version Number"); + assertEquals(version.getDisplayableValue(), "ST 1002.127"); + assertEquals(version.getVersion(), 127); + } + + @Test + public void testConstructFromValue129() { + ST1002VersionNumber version = new ST1002VersionNumber(129); + assertEquals(version.getBytes(), new byte[] {(byte) 0x81, (byte) 0x01}); + assertEquals(version.getDisplayName(), "Version Number"); + assertEquals(version.getDisplayableValue(), "ST 1002.129"); + assertEquals(version.getVersion(), 129); + } + + @Test + public void testConstructFromEncodedBytes() { + ST1002VersionNumber version = new ST1002VersionNumber(new byte[] {(byte) 0x02}); + assertEquals(version.getBytes(), new byte[] {(byte) 0x02}); + assertEquals(version.getDisplayName(), "Version Number"); + assertEquals(version.getDisplayableValue(), "ST 1002.2"); + assertEquals(version.getVersion(), 2); + } + + @Test + public void testConstructFromEncodedBytes0() { + ST1002VersionNumber version = new ST1002VersionNumber(new byte[] {(byte) 0x00}); + assertEquals(version.getBytes(), new byte[] {(byte) 0x00}); + assertEquals(version.getDisplayName(), "Version Number"); + assertEquals(version.getDisplayableValue(), "ST 1002"); + assertEquals(version.getVersion(), 0); + } + + @Test + public void testConstructFromEncodedBytes127() { + ST1002VersionNumber version = new ST1002VersionNumber(new byte[] {(byte) 0x7F}); + assertEquals(version.getBytes(), new byte[] {(byte) 0x7F}); + assertEquals(version.getDisplayName(), "Version Number"); + assertEquals(version.getDisplayableValue(), "ST 1002.127"); + assertEquals(version.getVersion(), 127); + } + + @Test + public void testConstructFromEncodedBytes255() { + ST1002VersionNumber version = + new ST1002VersionNumber(new byte[] {(byte) 0x81, (byte) 0x7F}); + assertEquals(version.getBytes(), new byte[] {(byte) 0x81, (byte) 0x7F}); + assertEquals(version.getDisplayName(), "Version Number"); + assertEquals(version.getDisplayableValue(), "ST 1002.255"); + assertEquals(version.getVersion(), 255); + } + + @Test + public void testFactoryEncodedBytes() throws KlvParseException { + IRangeImageMetadataValue value = + RangeImageLocalSet.createValue( + RangeImageMetadataKey.DocumentVersion, new byte[] {(byte) 0x02}); + assertTrue(value instanceof ST1002VersionNumber); + ST1002VersionNumber version = (ST1002VersionNumber) value; + assertEquals(version.getBytes(), new byte[] {(byte) 0x02}); + assertEquals(version.getDisplayName(), "Version Number"); + assertEquals(version.getDisplayableValue(), "ST 1002.2"); + assertEquals(version.getVersion(), 2); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testTooSmall() { + new ST1002VersionNumber(-1); + } +} diff --git a/st1002/src/test/java/org/jmisb/st1002/SectionDataIdentifierKeyTest.java b/st1002/src/test/java/org/jmisb/st1002/SectionDataIdentifierKeyTest.java new file mode 100644 index 000000000..2fb4ae91c --- /dev/null +++ b/st1002/src/test/java/org/jmisb/st1002/SectionDataIdentifierKeyTest.java @@ -0,0 +1,56 @@ +package org.jmisb.st1002; + +import static org.testng.Assert.*; + +import org.testng.annotations.Test; + +/** Unit tests for SectionDataIdentifierKey. */ +public class SectionDataIdentifierKeyTest { + + @Test + public void checkDisplayName() { + SectionDataIdentifierKey uut = new SectionDataIdentifierKey(3, 1); + assertEquals(uut.getIdentifier(), 3); + } + + @Test + public void checkSectionNumbers() { + SectionDataIdentifierKey uut = new SectionDataIdentifierKey(3, 1); + assertEquals(uut.getSectionX(), 3); + assertEquals(uut.getSectionY(), 1); + } + + @Test + public void checkSectionNumbersY() { + SectionDataIdentifierKey uut = new SectionDataIdentifierKey(1, 3); + assertEquals(uut.getSectionX(), 1); + assertEquals(uut.getSectionY(), 3); + } + + @Test + public void checkHash() { + SectionDataIdentifierKey uut = new SectionDataIdentifierKey(3, 1); + assertEquals(uut.hashCode(), 2611); + } + + @Test + public void checkEquals() { + SectionDataIdentifierKey uut = new SectionDataIdentifierKey(3, 1); + assertFalse(uut.equals(null)); + assertTrue(uut.equals(new SectionDataIdentifierKey(3, 1))); + assertFalse(uut.equals(new SectionDataIdentifierKey(2, 1))); + assertFalse(uut.equals(new SectionDataIdentifierKey(1, 3))); + assertFalse(uut.equals(new SectionDataIdentifierKey(3, 3))); + assertFalse(uut.equals(3)); + assertTrue(uut.equals(uut)); + } + + @Test + public void checkComparison() { + SectionDataIdentifierKey uut1 = new SectionDataIdentifierKey(1, 3); + SectionDataIdentifierKey uut2 = new SectionDataIdentifierKey(1, 2); + assertEquals(uut1.compareTo(uut2), 1); + assertEquals(uut2.compareTo(uut1), -1); + assertEquals(uut1.compareTo(uut1), 0); + } +} diff --git a/st1002/src/test/java/org/jmisb/st1002/SectionDataListTest.java b/st1002/src/test/java/org/jmisb/st1002/SectionDataListTest.java new file mode 100644 index 000000000..d36c4e6f3 --- /dev/null +++ b/st1002/src/test/java/org/jmisb/st1002/SectionDataListTest.java @@ -0,0 +1,61 @@ +package org.jmisb.st1002; + +import static org.testng.Assert.*; + +import java.util.Set; +import org.jmisb.api.klv.IKlvKey; +import org.testng.annotations.Test; + +/** Unit tests for SectionDataList. */ +public class SectionDataListTest { + + @Test + public void checkDisplayName() { + SectionDataList uut = new SectionDataList(); + assertEquals(uut.getDisplayName(), "Section Data"); + } + + @Test + public void checkDisplayableValue() { + SectionDataList uut = new SectionDataList(); + assertEquals(uut.getDisplayableValue(), "[VLPs]"); + } + + @Test(expectedExceptions = UnsupportedOperationException.class) + public void checkBadGetBytesOperation() { + SectionDataList uut = new SectionDataList(); + uut.getBytes(); + } + + @Test + public void checkWithNoElements() { + SectionDataList uut = new SectionDataList(); + assertTrue(uut.getPacks().isEmpty()); + assertTrue(uut.getIdentifiers().isEmpty()); + SectionDataIdentifierKey someKeyNotPresent = new SectionDataIdentifierKey(1, 1); + assertNull(uut.getField(someKeyNotPresent)); + } + + @Test + public void checkWithTwoSectionDataElements() { + SectionDataList uut = new SectionDataList(); + SectionData sectionData1 = new SectionData(1, 1, new double[][] {}, null); + uut.add(sectionData1); + SectionData sectionData2 = new SectionData(1, 2, new double[][] {}, null); + uut.add(sectionData2); + assertFalse(uut.getPacks().isEmpty()); + Set identifiers = uut.getIdentifiers(); + assertEquals(identifiers.size(), 2); + int totalYnumbers = 0; + for (var key : identifiers) { + var field = uut.getField(key); + assertTrue(field instanceof SectionData); + SectionData sectionData = (SectionData) field; + assertEquals(sectionData.getSectionNumberX(), 1); + totalYnumbers += sectionData.getSectionNumberY(); + } + assertEquals(totalYnumbers, 3); + SectionDataIdentifierKey someKeyNotPresent = new SectionDataIdentifierKey(2, 1); + assertNull(uut.getField(someKeyNotPresent)); + } +} diff --git a/st1002/src/test/java/org/jmisb/st1002/SectionDataTest.java b/st1002/src/test/java/org/jmisb/st1002/SectionDataTest.java new file mode 100644 index 000000000..9c1bbce41 --- /dev/null +++ b/st1002/src/test/java/org/jmisb/st1002/SectionDataTest.java @@ -0,0 +1,838 @@ +package org.jmisb.st1002; + +import static org.testng.Assert.*; + +import org.jmisb.api.common.KlvParseException; +import org.testng.annotations.Test; + +/** Unit tests for Section Data. */ +public class SectionDataTest { + + public SectionDataTest() {} + + @Test + public void checkConstructFromBytes() throws KlvParseException { + byte[] bytes = + new byte[] { + 0x01, + 0x05, + 0x01, + 0x01, + 0x15, + 0x02, + 0x02, + 0x01, + 0x08, + 0x01, + 0x40, + 0x03, + 0x33, + 0x33, + 0x33, + 0x33, + 0x33, + 0x33, + (byte) 0xc0, + 0x21, + 0x57, + 0x0a, + 0x3d, + 0x70, + (byte) 0xa3, + (byte) 0xd7, + 0x15, + 0x02, + 0x02, + 0x01, + 0x08, + 0x01, + 0x3F, + (byte) 0xB9, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x9A, + 0x3F, + (byte) 0xC9, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x9A + }; + SectionData uut = new SectionData(bytes); + assertEquals(uut.getSectionNumberX(), 5); + assertEquals(uut.getSectionNumberY(), 1); + assertEquals(uut.getArrayOfMeasuredValues(), new double[][] {{2.4}, {-8.67}}); + assertEquals(uut.getArrayOfUncertaintyValues(), new double[][] {{0.1}, {0.2}}); + assertEquals(uut.getBytes(), bytes); + assertEquals(uut.getDisplayName(), "Section Data"); + assertEquals(uut.getDisplayableValue(), "Section [5,1]"); + } + + @Test + public void checkConstructFromBytesNoUncertainties() throws KlvParseException { + byte[] bytes = + new byte[] { + 0x01, + 0x05, + 0x01, + 0x01, + 0x15, + 0x02, + 0x02, + 0x01, + 0x08, + 0x01, + 0x40, + 0x03, + 0x33, + 0x33, + 0x33, + 0x33, + 0x33, + 0x33, + (byte) 0xc0, + 0x21, + 0x57, + 0x0a, + 0x3d, + 0x70, + (byte) 0xa3, + (byte) 0xd7, + 0x00, + 0x08, + 0x40, + 0x28, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x08, + 0x40, + 0x54, + (byte) 0xC7, + (byte) 0xAE, + 0x14, + 0x7A, + (byte) 0xE1, + 0x48, + 0x08, + 0x40, + 0x29, + (byte) 0xF5, + (byte) 0xC2, + (byte) 0x8F, + 0x5C, + 0x28, + (byte) 0xF6 + }; + SectionData uut = new SectionData(bytes); + assertEquals(uut.getSectionNumberX(), 5); + assertEquals(uut.getSectionNumberY(), 1); + assertEquals(uut.getArrayOfMeasuredValues(), new double[][] {{2.4}, {-8.67}}); + assertNull(uut.getArrayOfUncertaintyValues()); + assertEquals(uut.getPlaneXScaleFactor(), 12.0); + assertEquals(uut.getPlaneYScaleFactor(), 83.12); + assertEquals(uut.getPlaneConstantValue(), 12.98); + assertEquals(uut.getBytes(), bytes); + } + + @Test + public void checkConstructFromBytesNoScaleFactor() throws KlvParseException { + byte[] bytes = + new byte[] { + 0x01, + 0x05, + 0x01, + 0x01, + 0x15, + 0x02, + 0x02, + 0x01, + 0x08, + 0x01, + 0x40, + 0x03, + 0x33, + 0x33, + 0x33, + 0x33, + 0x33, + 0x33, + (byte) 0xc0, + 0x21, + 0x57, + 0x0a, + 0x3d, + 0x70, + (byte) 0xa3, + (byte) 0xd7, + 0x00, + 0x08, + 0x40, + 0x28, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x08, + 0x40, + 0x54, + (byte) 0xC7, + (byte) 0xAE, + 0x14, + 0x7A, + (byte) 0xE1, + 0x48 + }; + SectionData uut = new SectionData(bytes); + assertEquals(uut.getSectionNumberX(), 5); + assertEquals(uut.getSectionNumberY(), 1); + assertEquals(uut.getArrayOfMeasuredValues(), new double[][] {{2.4}, {-8.67}}); + assertNull(uut.getArrayOfUncertaintyValues()); + assertEquals(uut.getPlaneXScaleFactor(), 12.0); + assertEquals(uut.getPlaneYScaleFactor(), 83.12); + assertEquals(uut.getPlaneConstantValue(), 0.0); + assertEquals(uut.getDisplayName(), "Section Data"); + assertEquals(uut.getDisplayableValue(), "Section [5,1]"); + } + + @Test + public void checkConstructFromBytesNoYScale() throws KlvParseException { + byte[] bytes = + new byte[] { + 0x01, + 0x05, + 0x01, + 0x01, + 0x15, + 0x02, + 0x02, + 0x01, + 0x08, + 0x01, + 0x40, + 0x03, + 0x33, + 0x33, + 0x33, + 0x33, + 0x33, + 0x33, + (byte) 0xc0, + 0x21, + 0x57, + 0x0a, + 0x3d, + 0x70, + (byte) 0xa3, + (byte) 0xd7, + 0x00, + 0x08, + 0x40, + 0x28, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + }; + SectionData uut = new SectionData(bytes); + assertEquals(uut.getSectionNumberX(), 5); + assertEquals(uut.getSectionNumberY(), 1); + assertEquals(uut.getArrayOfMeasuredValues(), new double[][] {{2.4}, {-8.67}}); + assertNull(uut.getArrayOfUncertaintyValues()); + assertEquals(uut.getPlaneXScaleFactor(), 12.0); + assertEquals(uut.getPlaneYScaleFactor(), 0.0); + assertEquals(uut.getPlaneConstantValue(), 0.0); + } + + @Test + public void checkConstructFromBytesNoXScale() throws KlvParseException { + byte[] bytes = + new byte[] { + 0x01, + 0x05, + 0x01, + 0x01, + 0x15, + 0x02, + 0x02, + 0x01, + 0x08, + 0x01, + 0x40, + 0x03, + 0x33, + 0x33, + 0x33, + 0x33, + 0x33, + 0x33, + (byte) 0xc0, + 0x21, + 0x57, + 0x0a, + 0x3d, + 0x70, + (byte) 0xa3, + (byte) 0xd7, + 0x00, + }; + SectionData uut = new SectionData(bytes); + assertEquals(uut.getSectionNumberX(), 5); + assertEquals(uut.getSectionNumberY(), 1); + assertEquals(uut.getArrayOfMeasuredValues(), new double[][] {{2.4}, {-8.67}}); + assertNull(uut.getArrayOfUncertaintyValues()); + assertEquals(uut.getPlaneXScaleFactor(), 0.0); + assertEquals(uut.getPlaneYScaleFactor(), 0.0); + assertEquals(uut.getPlaneConstantValue(), 0.0); + assertEquals(uut.getBytes(), bytes); + } + + @Test(expectedExceptions = KlvParseException.class) + public void checkConstructFromBytesBadXScaleLength() throws KlvParseException { + byte[] bytes = + new byte[] { + 0x01, + 0x05, + 0x01, + 0x01, + 0x15, + 0x02, + 0x02, + 0x01, + 0x08, + 0x01, + 0x40, + 0x03, + 0x33, + 0x33, + 0x33, + 0x33, + 0x33, + 0x33, + (byte) 0xc0, + 0x21, + 0x57, + 0x0a, + 0x3d, + 0x70, + (byte) 0xa3, + (byte) 0xd7, + 0x00, + 0x07, + 0x40, + 0x28, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x08, + 0x40, + 0x54, + (byte) 0xC7, + (byte) 0xAE, + 0x14, + 0x7A, + (byte) 0xE1, + 0x48, + 0x08, + 0x40, + 0x29, + (byte) 0xF5, + (byte) 0xC2, + (byte) 0x8F, + 0x5C, + 0x28, + (byte) 0xF6 + }; + new SectionData(bytes); + } + + @Test(expectedExceptions = KlvParseException.class) + public void checkConstructFromBytesBadYScaleLength() throws KlvParseException { + byte[] bytes = + new byte[] { + 0x01, + 0x05, + 0x01, + 0x01, + 0x15, + 0x02, + 0x02, + 0x01, + 0x08, + 0x01, + 0x40, + 0x03, + 0x33, + 0x33, + 0x33, + 0x33, + 0x33, + 0x33, + (byte) 0xc0, + 0x21, + 0x57, + 0x0a, + 0x3d, + 0x70, + (byte) 0xa3, + (byte) 0xd7, + 0x00, + 0x08, + 0x40, + 0x28, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x07, + 0x40, + 0x54, + (byte) 0xC7, + (byte) 0xAE, + 0x14, + 0x7A, + 0x48, + 0x08, + 0x40, + 0x29, + (byte) 0xF5, + (byte) 0xC2, + (byte) 0x8F, + 0x5C, + 0x28, + (byte) 0xF6 + }; + new SectionData(bytes); + } + + @Test(expectedExceptions = KlvParseException.class) + public void checkConstructFromBytesBadConstantLength() throws KlvParseException { + byte[] bytes = + new byte[] { + 0x01, + 0x05, + 0x01, + 0x01, + 0x15, + 0x02, + 0x02, + 0x01, + 0x08, + 0x01, + 0x40, + 0x03, + 0x33, + 0x33, + 0x33, + 0x33, + 0x33, + 0x33, + (byte) 0xc0, + 0x21, + 0x57, + 0x0a, + 0x3d, + 0x70, + (byte) 0xa3, + (byte) 0xd7, + 0x00, + 0x08, + 0x40, + 0x28, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x08, + 0x40, + 0x54, + (byte) 0xC7, + (byte) 0xAE, + 0x14, + 0x7A, + (byte) 0xE1, + 0x48, + 0x07, + 0x40, + 0x29, + (byte) 0xF5, + (byte) 0xC2, + (byte) 0x8F, + 0x5C, + 0x28 + }; + new SectionData(bytes); + } + + @Test + public void checkConstructFromBytesFloat() throws KlvParseException { + byte[] bytes = + new byte[] { + 0x01, + 0x05, + 0x01, + 0x01, + 0x15, + 0x02, + 0x02, + 0x01, + 0x08, + 0x01, + 0x40, + 0x03, + 0x33, + 0x33, + 0x33, + 0x33, + 0x33, + 0x33, + (byte) 0xc0, + 0x21, + 0x57, + 0x0a, + 0x3d, + 0x70, + (byte) 0xa3, + (byte) 0xd7, + 0x00, + 0x04, + 0x41, + 0x40, + 0x00, + 0x00, + 0x04, + 0x42, + (byte) 0xA6, + 0x3D, + 0x71, + 0x04, + 0x41, + 0x4F, + (byte) 0xAE, + 0x14 + }; + SectionData uut = new SectionData(bytes); + assertEquals(uut.getSectionNumberX(), 5); + assertEquals(uut.getSectionNumberY(), 1); + assertEquals(uut.getArrayOfMeasuredValues(), new double[][] {{2.4}, {-8.67}}); + assertNull(uut.getArrayOfUncertaintyValues()); + assertEquals(uut.getPlaneXScaleFactor(), 12.0, 0.00001); + assertEquals(uut.getPlaneYScaleFactor(), 83.12, 0.00001); + assertEquals(uut.getPlaneConstantValue(), 12.98, 0.00001); + } + + @Test + public void checkConstructFromValues() throws KlvParseException { + SectionData uut = + new SectionData( + 5, 1, new double[][] {{2.4}, {-8.67}}, new double[][] {{0.1}, {0.2}}); + assertEquals(uut.getSectionNumberX(), 5); + assertEquals(uut.getSectionNumberY(), 1); + assertEquals(uut.getArrayOfMeasuredValues(), new double[][] {{2.4}, {-8.67}}); + assertEquals(uut.getArrayOfUncertaintyValues(), new double[][] {{0.1}, {0.2}}); + byte[] expectedBytes = + new byte[] { + 0x01, + 0x05, + 0x01, + 0x01, + 0x15, + 0x02, + 0x02, + 0x01, + 0x08, + 0x01, + 0x40, + 0x03, + 0x33, + 0x33, + 0x33, + 0x33, + 0x33, + 0x33, + (byte) 0xc0, + 0x21, + 0x57, + 0x0a, + 0x3d, + 0x70, + (byte) 0xa3, + (byte) 0xd7, + 0x15, + 0x02, + 0x02, + 0x01, + 0x08, + 0x01, + 0x3F, + (byte) 0xB9, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x9A, + 0x3F, + (byte) 0xC9, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x9A + }; + + assertEquals(uut.getBytes(), expectedBytes); + } + + @Test + public void checkConstructFromValuesNullUncertainties() throws KlvParseException { + SectionData uut = new SectionData(5, 1, new double[][] {{2.4}, {-8.67}}, null); + assertEquals(uut.getSectionNumberX(), 5); + assertEquals(uut.getSectionNumberY(), 1); + assertEquals(uut.getArrayOfMeasuredValues(), new double[][] {{2.4}, {-8.67}}); + assertNull(uut.getArrayOfUncertaintyValues()); + byte[] expectedBytes = + new byte[] { + 0x01, + 0x05, + 0x01, + 0x01, + 0x15, + 0x02, + 0x02, + 0x01, + 0x08, + 0x01, + 0x40, + 0x03, + 0x33, + 0x33, + 0x33, + 0x33, + 0x33, + 0x33, + (byte) 0xc0, + 0x21, + 0x57, + 0x0a, + 0x3d, + 0x70, + (byte) 0xa3, + (byte) 0xd7, + 0x00 + }; + + assertEquals(uut.getBytes(), expectedBytes); + SectionData copy = new SectionData(uut); + assertEquals(copy.getSectionNumberX(), 5); + assertEquals(copy.getSectionNumberY(), 1); + assertEquals(copy.getArrayOfMeasuredValues(), new double[][] {{2.4}, {-8.67}}); + assertNull(copy.getArrayOfUncertaintyValues()); + assertEquals(copy.getPlaneXScaleFactor(), 0.0); + assertEquals(copy.getPlaneYScaleFactor(), 0.0); + assertEquals(copy.getPlaneConstantValue(), 0.0); + assertEquals(copy.getDisplayName(), "Section Data"); + assertEquals(copy.getDisplayableValue(), "Section [5,1]"); + } + + @Test + public void checkConstructFromValuesWithPlanar() throws KlvParseException { + SectionData uut = + new SectionData(5, 1, new double[][] {{2.4}, {-8.67}}, null, 12.0, 83.12, 12.98); + assertEquals(uut.getSectionNumberX(), 5); + assertEquals(uut.getSectionNumberY(), 1); + assertEquals(uut.getArrayOfMeasuredValues(), new double[][] {{2.4}, {-8.67}}); + assertNull(uut.getArrayOfUncertaintyValues()); + assertEquals(uut.getPlaneXScaleFactor(), 12.0); + assertEquals(uut.getPlaneYScaleFactor(), 83.12); + assertEquals(uut.getPlaneConstantValue(), 12.98); + byte[] expectedBytes = + new byte[] { + 0x01, + 0x05, + 0x01, + 0x01, + 0x15, + 0x02, + 0x02, + 0x01, + 0x08, + 0x01, + 0x40, + 0x03, + 0x33, + 0x33, + 0x33, + 0x33, + 0x33, + 0x33, + (byte) 0xc0, + 0x21, + 0x57, + 0x0a, + 0x3d, + 0x70, + (byte) 0xa3, + (byte) 0xd7, + 0x00, + 0x08, + 0x40, + 0x28, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x08, + 0x40, + 0x54, + (byte) 0xC7, + (byte) 0xAE, + 0x14, + 0x7A, + (byte) 0xE1, + 0x48, + 0x08, + 0x40, + 0x29, + (byte) 0xF5, + (byte) 0xC2, + (byte) 0x8F, + 0x5C, + 0x28, + (byte) 0xF6 + }; + assertEquals(uut.getBytes(), expectedBytes); + } + + @Test + public void checkConstructFromValuesWithUncertaintiesAndPlanar() throws KlvParseException { + SectionData uut = + new SectionData( + 5, + 1, + new double[][] {{2.4}, {-8.67}}, + new double[][] {{0.1}, {0.2}}, + 12.0, + 83.12, + 12.98); + assertEquals(uut.getSectionNumberX(), 5); + assertEquals(uut.getSectionNumberY(), 1); + assertEquals(uut.getArrayOfMeasuredValues(), new double[][] {{2.4}, {-8.67}}); + assertEquals(uut.getArrayOfUncertaintyValues(), new double[][] {{0.1}, {0.2}}); + assertEquals(uut.getPlaneXScaleFactor(), 12.0); + assertEquals(uut.getPlaneYScaleFactor(), 83.12); + assertEquals(uut.getPlaneConstantValue(), 12.98); + byte[] expectedBytes = + new byte[] { + 0x01, + 0x05, + 0x01, + 0x01, + 0x15, + 0x02, + 0x02, + 0x01, + 0x08, + 0x01, + 0x40, + 0x03, + 0x33, + 0x33, + 0x33, + 0x33, + 0x33, + 0x33, + (byte) 0xc0, + 0x21, + 0x57, + 0x0a, + 0x3d, + 0x70, + (byte) 0xa3, + (byte) 0xd7, + 0x15, + 0x02, + 0x02, + 0x01, + 0x08, + 0x01, + 0x3F, + (byte) 0xB9, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x9A, + 0x3F, + (byte) 0xC9, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x9A, + 0x08, + 0x40, + 0x28, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x08, + 0x40, + 0x54, + (byte) 0xC7, + (byte) 0xAE, + 0x14, + 0x7A, + (byte) 0xE1, + 0x48, + 0x08, + 0x40, + 0x29, + (byte) 0xF5, + (byte) 0xC2, + (byte) 0x8F, + 0x5C, + 0x28, + (byte) 0xF6 + }; + assertEquals(uut.getBytes(), expectedBytes); + assertEquals(uut.getDisplayName(), "Section Data"); + assertEquals(uut.getDisplayableValue(), "Section [5,1]"); + SectionData copy = new SectionData(uut); + assertEquals(copy.getSectionNumberX(), 5); + assertEquals(copy.getSectionNumberY(), 1); + assertEquals(copy.getArrayOfMeasuredValues(), new double[][] {{2.4}, {-8.67}}); + assertEquals(copy.getArrayOfUncertaintyValues(), new double[][] {{0.1}, {0.2}}); + assertEquals(copy.getPlaneXScaleFactor(), 12.0); + assertEquals(copy.getPlaneYScaleFactor(), 83.12); + assertEquals(copy.getPlaneConstantValue(), 12.98); + assertEquals(copy.getDisplayName(), "Section Data"); + assertEquals(copy.getDisplayableValue(), "Section [5,1]"); + } +} diff --git a/st1002/src/test/java/org/jmisb/st1002/SinglePointRangeMeasurementColumnTest.java b/st1002/src/test/java/org/jmisb/st1002/SinglePointRangeMeasurementColumnTest.java new file mode 100644 index 000000000..5cee9ac1f --- /dev/null +++ b/st1002/src/test/java/org/jmisb/st1002/SinglePointRangeMeasurementColumnTest.java @@ -0,0 +1,128 @@ +package org.jmisb.st1002; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; + +import org.jmisb.api.common.KlvParseException; +import org.testng.annotations.Test; + +/** Tests for SinglePointRangeMeasurementColumn. */ +public class SinglePointRangeMeasurementColumnTest { + + @Test + public void fromValue() { + SinglePointRangeMeasurementColumn uut = new SinglePointRangeMeasurementColumn(984.2); + assertEquals(uut.getColumn(), 984.2, 0.000000001); + assertEquals(uut.getDisplayName(), "Single Point Range Measurement Column"); + assertEquals(uut.getDisplayableValue(), "984.2"); + assertEquals( + uut.getBytes(), + new byte[] { + (byte) 0x40, + (byte) 0x8E, + (byte) 0xC1, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x9A + }); + } + + @Test + public void fromBytesFloat() throws KlvParseException { + SinglePointRangeMeasurementColumn uut = + new SinglePointRangeMeasurementColumn( + new byte[] {(byte) 0x44, (byte) 0x76, (byte) 0x0C, (byte) 0xCD}); + assertEquals(uut.getColumn(), 984.2, 0.0001); + assertEquals(uut.getDisplayName(), "Single Point Range Measurement Column"); + assertEquals(uut.getDisplayableValue(), "984.2"); + assertEquals( + uut.getBytes(), + new byte[] { + (byte) 0x40, + (byte) 0x8E, + (byte) 0xC1, + (byte) 0x99, + (byte) 0xA0, + (byte) 0x00, + (byte) 0x00, + (byte) 0x00 + }); + } + + @Test + public void fromBytesDouble() throws KlvParseException { + SinglePointRangeMeasurementColumn uut = + new SinglePointRangeMeasurementColumn( + new byte[] { + (byte) 0x40, + (byte) 0x8E, + (byte) 0xC1, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x9A + }); + assertEquals(uut.getColumn(), 984.2, 0.000000001); + assertEquals(uut.getDisplayName(), "Single Point Range Measurement Column"); + assertEquals(uut.getDisplayableValue(), "984.2"); + assertEquals( + uut.getBytes(), + new byte[] { + (byte) 0x40, + (byte) 0x8E, + (byte) 0xC1, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x9A + }); + } + + @Test + public void fromBytesFactory() throws KlvParseException { + IRangeImageMetadataValue v = + RangeImageLocalSet.createValue( + RangeImageMetadataKey.SinglePointRangeMeasurementColumnCoordinate, + new byte[] { + (byte) 0x40, + (byte) 0x8E, + (byte) 0xC1, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x9A + }); + assertTrue(v instanceof SinglePointRangeMeasurementColumn); + SinglePointRangeMeasurementColumn uut = (SinglePointRangeMeasurementColumn) v; + assertEquals(uut.getColumn(), 984.2, 0.000000001); + assertEquals(uut.getDisplayName(), "Single Point Range Measurement Column"); + assertEquals(uut.getDisplayableValue(), "984.2"); + assertEquals( + uut.getBytes(), + new byte[] { + (byte) 0x40, + (byte) 0x8E, + (byte) 0xC1, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x9A + }); + } + + @Test(expectedExceptions = KlvParseException.class) + public void testBadLength3() throws KlvParseException { + new SinglePointRangeMeasurementColumn(new byte[] {0x01, 0x02, 0x03}); + } + + @Test(expectedExceptions = KlvParseException.class) + public void testBadLength5() throws KlvParseException { + new SinglePointRangeMeasurementColumn(new byte[] {0x01, 0x02, 0x03, 0x04, 0x05}); + } +} diff --git a/st1002/src/test/java/org/jmisb/st1002/SinglePointRangeMeasurementRowTest.java b/st1002/src/test/java/org/jmisb/st1002/SinglePointRangeMeasurementRowTest.java new file mode 100644 index 000000000..098fbe7cf --- /dev/null +++ b/st1002/src/test/java/org/jmisb/st1002/SinglePointRangeMeasurementRowTest.java @@ -0,0 +1,128 @@ +package org.jmisb.st1002; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; + +import org.jmisb.api.common.KlvParseException; +import org.testng.annotations.Test; + +/** Tests for SinglePointRangeMeasurementRow. */ +public class SinglePointRangeMeasurementRowTest { + + @Test + public void fromValue() { + SinglePointRangeMeasurementRow uut = new SinglePointRangeMeasurementRow(984.2); + assertEquals(uut.getRow(), 984.2, 0.000000001); + assertEquals(uut.getDisplayName(), "Single Point Range Measurement Row"); + assertEquals(uut.getDisplayableValue(), "984.2"); + assertEquals( + uut.getBytes(), + new byte[] { + (byte) 0x40, + (byte) 0x8E, + (byte) 0xC1, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x9A + }); + } + + @Test + public void fromBytesFloat() throws KlvParseException { + SinglePointRangeMeasurementRow uut = + new SinglePointRangeMeasurementRow( + new byte[] {(byte) 0x44, (byte) 0x76, (byte) 0x0C, (byte) 0xCD}); + assertEquals(uut.getRow(), 984.2, 0.0001); + assertEquals(uut.getDisplayName(), "Single Point Range Measurement Row"); + assertEquals(uut.getDisplayableValue(), "984.2"); + assertEquals( + uut.getBytes(), + new byte[] { + (byte) 0x40, + (byte) 0x8E, + (byte) 0xC1, + (byte) 0x99, + (byte) 0xA0, + (byte) 0x00, + (byte) 0x00, + (byte) 0x00 + }); + } + + @Test + public void fromBytesDouble() throws KlvParseException { + SinglePointRangeMeasurementRow uut = + new SinglePointRangeMeasurementRow( + new byte[] { + (byte) 0x40, + (byte) 0x8E, + (byte) 0xC1, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x9A + }); + assertEquals(uut.getRow(), 984.2, 0.000000001); + assertEquals(uut.getDisplayName(), "Single Point Range Measurement Row"); + assertEquals(uut.getDisplayableValue(), "984.2"); + assertEquals( + uut.getBytes(), + new byte[] { + (byte) 0x40, + (byte) 0x8E, + (byte) 0xC1, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x9A + }); + } + + @Test + public void fromBytesFactory() throws KlvParseException { + IRangeImageMetadataValue v = + RangeImageLocalSet.createValue( + RangeImageMetadataKey.SinglePointRangeMeasurementRowCoordinate, + new byte[] { + (byte) 0x40, + (byte) 0x8E, + (byte) 0xC1, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x9A + }); + assertTrue(v instanceof SinglePointRangeMeasurementRow); + SinglePointRangeMeasurementRow uut = (SinglePointRangeMeasurementRow) v; + assertEquals(uut.getRow(), 984.2, 0.000000001); + assertEquals(uut.getDisplayName(), "Single Point Range Measurement Row"); + assertEquals(uut.getDisplayableValue(), "984.2"); + assertEquals( + uut.getBytes(), + new byte[] { + (byte) 0x40, + (byte) 0x8E, + (byte) 0xC1, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x99, + (byte) 0x9A + }); + } + + @Test(expectedExceptions = KlvParseException.class) + public void testBadLength3() throws KlvParseException { + new SinglePointRangeMeasurementRow(new byte[] {0x01, 0x02, 0x03}); + } + + @Test(expectedExceptions = KlvParseException.class) + public void testBadLength5() throws KlvParseException { + new SinglePointRangeMeasurementRow(new byte[] {0x01, 0x02, 0x03, 0x04, 0x05}); + } +} diff --git a/st1002/src/test/java/org/jmisb/st1002/SinglePointRangeMeasurementTest.java b/st1002/src/test/java/org/jmisb/st1002/SinglePointRangeMeasurementTest.java new file mode 100644 index 000000000..95b40d020 --- /dev/null +++ b/st1002/src/test/java/org/jmisb/st1002/SinglePointRangeMeasurementTest.java @@ -0,0 +1,119 @@ +package org.jmisb.st1002; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; + +import org.jmisb.api.common.KlvParseException; +import org.testng.annotations.Test; + +/** Tests for SinglePointRangeMeasurement. */ +public class SinglePointRangeMeasurementTest { + + @Test + public void fromValue() { + SinglePointRangeMeasurement uut = new SinglePointRangeMeasurement(12.0f); + assertEquals(uut.getRange(), 12.0f); + assertEquals(uut.getDisplayName(), "Single Point Range Measurement"); + assertEquals(uut.getDisplayableValue(), "12.000 m"); + assertEquals( + uut.getBytes(), + new byte[] { + (byte) 0x40, + (byte) 0x28, + (byte) 0x00, + (byte) 0x00, + (byte) 0x00, + (byte) 0x00, + (byte) 0x00, + (byte) 0x00 + }); + } + + @Test + public void fromBytesFloat() throws KlvParseException { + SinglePointRangeMeasurement uut = + new SinglePointRangeMeasurement( + new byte[] {(byte) 0x41, (byte) 0x40, (byte) 0x00, (byte) 0x00}); + assertEquals(uut.getRange(), 12.0f); + assertEquals(uut.getDisplayName(), "Single Point Range Measurement"); + assertEquals(uut.getDisplayableValue(), "12.000 m"); + assertEquals( + uut.getBytes(), + new byte[] { + (byte) 0x40, + (byte) 0x28, + (byte) 0x00, + (byte) 0x00, + (byte) 0x00, + (byte) 0x00, + (byte) 0x00, + (byte) 0x00 + }); + } + + @Test + public void fromBytesDouble() throws KlvParseException { + SinglePointRangeMeasurement uut = + new SinglePointRangeMeasurement( + new byte[] { + (byte) 0x40, + (byte) 0x28, + (byte) 0x00, + (byte) 0x00, + (byte) 0x00, + (byte) 0x00, + (byte) 0x00, + (byte) 0x00 + }); + assertEquals(uut.getRange(), 12.0f); + assertEquals(uut.getDisplayName(), "Single Point Range Measurement"); + assertEquals(uut.getDisplayableValue(), "12.000 m"); + assertEquals( + uut.getBytes(), + new byte[] { + (byte) 0x40, + (byte) 0x28, + (byte) 0x00, + (byte) 0x00, + (byte) 0x00, + (byte) 0x00, + (byte) 0x00, + (byte) 0x00 + }); + } + + @Test + public void fromBytesFactory() throws KlvParseException { + IRangeImageMetadataValue v = + RangeImageLocalSet.createValue( + RangeImageMetadataKey.SinglePointRangeMeasurement, + new byte[] {(byte) 0x41, (byte) 0x40, (byte) 0x00, (byte) 0x00}); + assertTrue(v instanceof SinglePointRangeMeasurement); + SinglePointRangeMeasurement uut = (SinglePointRangeMeasurement) v; + assertEquals(uut.getRange(), 12.0f); + assertEquals(uut.getDisplayName(), "Single Point Range Measurement"); + assertEquals(uut.getDisplayableValue(), "12.000 m"); + assertEquals( + uut.getBytes(), + new byte[] { + (byte) 0x40, + (byte) 0x28, + (byte) 0x00, + (byte) 0x00, + (byte) 0x00, + (byte) 0x00, + (byte) 0x00, + (byte) 0x00 + }); + } + + @Test(expectedExceptions = KlvParseException.class) + public void testBadLength3() throws KlvParseException { + new SinglePointRangeMeasurement(new byte[] {0x01, 0x02, 0x03}); + } + + @Test(expectedExceptions = KlvParseException.class) + public void testBadLength5() throws KlvParseException { + new SinglePointRangeMeasurement(new byte[] {0x01, 0x02, 0x03, 0x04, 0x05}); + } +} diff --git a/st1002/src/test/java/org/jmisb/st1002/SinglePointRangeMeasurementUncertaintyTest.java b/st1002/src/test/java/org/jmisb/st1002/SinglePointRangeMeasurementUncertaintyTest.java new file mode 100644 index 000000000..86e943aa0 --- /dev/null +++ b/st1002/src/test/java/org/jmisb/st1002/SinglePointRangeMeasurementUncertaintyTest.java @@ -0,0 +1,120 @@ +package org.jmisb.st1002; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; + +import org.jmisb.api.common.KlvParseException; +import org.testng.annotations.Test; + +/** Tests for SinglePointRangeMeasurementUncertainty. */ +public class SinglePointRangeMeasurementUncertaintyTest { + + @Test + public void fromValue() { + SinglePointRangeMeasurementUncertainty uut = + new SinglePointRangeMeasurementUncertainty(0.15); + assertEquals(uut.getRange(), 0.15); + assertEquals(uut.getDisplayName(), "Single Point Range Measurement Uncertainty"); + assertEquals(uut.getDisplayableValue(), "0.150 m"); + assertEquals( + uut.getBytes(), + new byte[] { + (byte) 0x3F, + (byte) 0xC3, + (byte) 0x33, + (byte) 0x33, + (byte) 0x33, + (byte) 0x33, + (byte) 0x33, + (byte) 0x33 + }); + } + + @Test + public void fromBytesFloat() throws KlvParseException { + SinglePointRangeMeasurementUncertainty uut = + new SinglePointRangeMeasurementUncertainty( + new byte[] {(byte) 0x3E, (byte) 0x19, (byte) 0x99, (byte) 0x9A}); + assertEquals(uut.getRange(), 0.15, 0.00000001); + assertEquals(uut.getDisplayName(), "Single Point Range Measurement Uncertainty"); + assertEquals(uut.getDisplayableValue(), "0.150 m"); + assertEquals( + uut.getBytes(), + new byte[] { + (byte) 0x3F, + (byte) 0xC3, + (byte) 0x33, + (byte) 0x33, + (byte) 0x40, + (byte) 0x00, + (byte) 0x00, + (byte) 0x00 + }); + } + + @Test + public void fromBytesDouble() throws KlvParseException { + SinglePointRangeMeasurementUncertainty uut = + new SinglePointRangeMeasurementUncertainty( + new byte[] { + (byte) 0x3F, + (byte) 0xC3, + (byte) 0x33, + (byte) 0x33, + (byte) 0x33, + (byte) 0x33, + (byte) 0x33, + (byte) 0x33 + }); + assertEquals(uut.getRange(), 0.15); + assertEquals(uut.getDisplayName(), "Single Point Range Measurement Uncertainty"); + assertEquals(uut.getDisplayableValue(), "0.150 m"); + assertEquals( + uut.getBytes(), + new byte[] { + (byte) 0x3F, + (byte) 0xC3, + (byte) 0x33, + (byte) 0x33, + (byte) 0x33, + (byte) 0x33, + (byte) 0x33, + (byte) 0x33 + }); + } + + @Test + public void fromBytesFactory() throws KlvParseException { + IRangeImageMetadataValue v = + RangeImageLocalSet.createValue( + RangeImageMetadataKey.SinglePointRangeMeasurementUncertainty, + new byte[] {(byte) 0x3E, (byte) 0x19, (byte) 0x99, (byte) 0x9A}); + assertTrue(v instanceof SinglePointRangeMeasurementUncertainty); + SinglePointRangeMeasurementUncertainty uut = (SinglePointRangeMeasurementUncertainty) v; + assertEquals(uut.getRange(), 0.15, 0.00000001); + assertEquals(uut.getDisplayName(), "Single Point Range Measurement Uncertainty"); + assertEquals(uut.getDisplayableValue(), "0.150 m"); + assertEquals( + uut.getBytes(), + new byte[] { + (byte) 0x3F, + (byte) 0xC3, + (byte) 0x33, + (byte) 0x33, + (byte) 0x40, + (byte) 0x00, + (byte) 0x00, + (byte) 0x00 + }); + } + + @Test(expectedExceptions = KlvParseException.class) + public void testBadLength3() throws KlvParseException { + new SinglePointRangeMeasurementUncertainty(new byte[] {0x01, 0x02, 0x03}); + } + + @Test(expectedExceptions = KlvParseException.class) + public void testBadLength5() throws KlvParseException { + new SinglePointRangeMeasurementUncertainty(new byte[] {0x01, 0x02, 0x03, 0x04, 0x05}); + } +} diff --git a/st1002/testng-unit.xml b/st1002/testng-unit.xml new file mode 100644 index 000000000..9aff492c4 --- /dev/null +++ b/st1002/testng-unit.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/st1010/SpotBugsFilter.xml b/st1010/SpotBugsFilter.xml new file mode 100644 index 000000000..5e55494a7 --- /dev/null +++ b/st1010/SpotBugsFilter.xml @@ -0,0 +1,3 @@ + + + diff --git a/st1010/checkstyle.xml b/st1010/checkstyle.xml new file mode 100644 index 000000000..41e751804 --- /dev/null +++ b/st1010/checkstyle.xml @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/st1010/checkstyle_suppressions.xml b/st1010/checkstyle_suppressions.xml new file mode 100644 index 000000000..97784b708 --- /dev/null +++ b/st1010/checkstyle_suppressions.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/st1010/pom.xml b/st1010/pom.xml new file mode 100644 index 000000000..230fda152 --- /dev/null +++ b/st1010/pom.xml @@ -0,0 +1,92 @@ + + + 4.0.0 + + org.jmisb + jmisb + 2.0.0-SNAPSHOT + + st1010 + 2.0.0-SNAPSHOT + ST 1010 SDCC + + + ${project.groupId} + jmisb-api + ${project.version} + + + org.slf4j + slf4j-api + + + org.testng + testng + test + + + com.github.valfirst + slf4j-test + test + + + + + + + com.theoryinpractise + googleformatter-maven-plugin + + + org.apache.maven.plugins + maven-surefire-plugin + + + testng-unit.xml + + + + surefire.testng.verbose + ${surefire.verbosity} + + + + + + com.github.spotbugs + spotbugs-maven-plugin + + SpotBugsFilter.xml + + + + org.apache.maven.plugins + maven-checkstyle-plugin + + + edu.berkeley.cs.jqf + jqf-maven-plugin + + + + + + + generate-sbom-cyclonedx + + + performRelease + true + + + + + + org.cyclonedx + cyclonedx-maven-plugin + + + + + + \ No newline at end of file diff --git a/st1010/src/main/java/module-info.java b/st1010/src/main/java/module-info.java new file mode 100644 index 000000000..d319682ce --- /dev/null +++ b/st1010/src/main/java/module-info.java @@ -0,0 +1,20 @@ +/** + * ST 1010: Generalized Standard Deviation and Correlation Coefficient Metadata. + * + *

This standard (ST) defines a bit-efficient method for transmitting standard deviation and + * correlation coefficient data. In support of this method a Standard Deviation and Correlation + * Coefficient Floating Length Pack (SDCC-FLP) construct is defined. The construct leverages the + * symmetry of the variance-covariance matrix and the fixed data range of the correlation + * coefficients to reduce the number of bytes transmitted, in effect compressing the data. This + * method is, therefore, not extendable to more generic matrix cases. This ST is dependent on + * context from an invoking standard (or other document), called a Parent Document, which provides a + * list of values (random variables) that can have corresponding standard deviation and correlation + * coefficients; this list of random variables is called the Source List. + */ +@SuppressWarnings("module") // That is not a version number - its a document number. +module org.jmisb.st1010 { + requires org.jmisb.api; + requires org.slf4j; + + exports org.jmisb.st1010; +} diff --git a/st1010/src/main/java/org/jmisb/st1010/EncodingFormat.java b/st1010/src/main/java/org/jmisb/st1010/EncodingFormat.java new file mode 100644 index 000000000..dc3fbba94 --- /dev/null +++ b/st1010/src/main/java/org/jmisb/st1010/EncodingFormat.java @@ -0,0 +1,60 @@ +package org.jmisb.st1010; + +import org.jmisb.api.common.KlvParseException; + +/** + * Encoding format for Standard Deviation and Correlation Coefficient values. + * + *

ST 1010 supports the encoding of values in two formats (at least in Mode 2 parsing) - IEEE 754 + * floating point, and ST 1201 integer encoding. This enumeration allows identification of the + * parsing format. + * + *

In Mode 1 parsing, the format for standard deviation are externally specified (in the invoking + * specification document), but the correlation coefficients are always in ST 1201 format. + */ +public enum EncodingFormat { + /** + * Value is encoded in an IEEE 754 floating point format. + * + *

The supported formats are per MISB ST 0107. + */ + IEEE(0), + /** + * Value is encoded in MISB ST 1201 format. + * + *

The encoding is IMAPB(-1.0, 1.0). + */ + ST1201(1); + + private EncodingFormat(int value) { + v = value; + } + + private final int v; + + /** + * Get the value associated with this encoding format. + * + * @return 1 if the format is ST1201, otherwise 0 to mean IEEE format. + */ + public int getValue() { + return v; + } + + /** + * Get the encoding from an integer value. + * + * @param v the value to look up (0 or 1) + * @return the corresponding EncodingFormat for the value. + * @throws KlvParseException if the value is out of range. + */ + public static EncodingFormat getEncoding(int v) throws KlvParseException { + if (v == 1) { + return EncodingFormat.ST1201; + } else if (v == 0) { + return EncodingFormat.IEEE; + } else { + throw new KlvParseException("The only encoding format values are 0 or 1, got " + v); + } + } +} diff --git a/st1010/src/main/java/org/jmisb/st1010/SDCC.java b/st1010/src/main/java/org/jmisb/st1010/SDCC.java new file mode 100644 index 000000000..f359b0392 --- /dev/null +++ b/st1010/src/main/java/org/jmisb/st1010/SDCC.java @@ -0,0 +1,187 @@ +package org.jmisb.st1010; + +import java.util.Set; +import java.util.SortedSet; +import java.util.TreeSet; +import org.jmisb.api.klv.IKlvKey; +import org.jmisb.api.klv.INestedKlvValue; + +/** + * Standard Deviation and Correlation Coefficient Matrix. + * + *

An instance of this class represents the "full" version of the Standard Deviation and Cross + * Correlation (SDCC) matrix. The standard deviation values (error estimates) are on the main + * diagonal. The off-diagonal values are the estimates of correlation between the errors on + * corresponding rows / columns. The SDCC is symmetrical about the main diagonal. + * + *

As an example, consider the case where a local set (such as ST 0601) has Sensor Latitude and + * Sensor Longitude information, and there is an estimate of the error (at the one + * standard-deviation level) - say based on the GPS sensor performance and satellite geometry + * (Horizontal Dilution of Precision - HDOP). In this situation, the latitude and longitude parts of + * the position error are probably fairly closely related (and would have cross-correlation values + * approaching 1). SDCC provides the structure to represent this information. + */ +public class SDCC implements INestedKlvValue { + private int stdDevLength = Float.BYTES; + private int corrCoefLength = 3; + private EncodingFormat stdDevFormat = EncodingFormat.IEEE; + private EncodingFormat corrCoefFormat = EncodingFormat.ST1201; + private double[][] values = new double[0][0]; + + /** + * Constructor. + * + *

This will produce an empty SDCC, initialised to use four-byte IEEE format for standard + * deviations, and three-byte ST 1201 for correlation coefficients. + */ + public SDCC() {} + + /** + * Copy constructor. + * + * @param other the object to copy from. + */ + public SDCC(SDCC other) { + this.stdDevLength = other.getStandardDeviationLength(); + this.corrCoefLength = other.getCorrelationCoefficientLength(); + this.stdDevFormat = other.getStandardDeviationFormat(); + this.corrCoefFormat = other.getCorrelationCoefficientFormat(); + this.values = other.getValues().clone(); + } + + /** + * Get the encoded standard deviation length. + * + * @return the length of each encoded value. + */ + public int getStandardDeviationLength() { + return stdDevLength; + } + + /** + * Set the length of each encoded standard deviation value. + * + *

Note that the format needs to be consistent with the standard deviation format. In + * particular, {@code EncodingFormat.IEEE} requires that the length be 2, 4 or 8 bytes, while + * {@code EncodingFormat.ST1201} requires that the length be consistent with the IMAP encoding. + * + *

All standard deviation values in an SDCC instance need to have the same length. + * + * @param length the length in bytes + */ + public void setStandardDeviationLength(int length) { + this.stdDevLength = length; + } + + /** + * Get the encoded correlation coefficient value length. + * + * @return the length of each encoded value. + */ + public int getCorrelationCoefficientLength() { + return corrCoefLength; + } + + /** + * Set the length of each encoded correlation coefficient value. + * + *

Note that the format needs to be consistent with the correlation coefficient format. In + * particular, {@code EncodingFormat.IEEE} requires that the length be 2, 4 or 8 bytes, while + * {@code EncodingFormat.ST1201} requires that the length be consistent with the IMAP encoding. + * + *

All correlation coefficients in an SDCC instance need to have the same length. + * + * @param length the length in bytes + */ + public void setCorrelationCoefficientLength(int length) { + this.corrCoefLength = length; + } + + /** + * Get the standard deviation encoding format. + * + * @return the format for encoding standard deviations. + */ + public EncodingFormat getStandardDeviationFormat() { + return stdDevFormat; + } + + /** + * Set the standard deviation encoding format. + * + *

Note that the format needs to be consistent with the standard deviation length. + * + *

Also, use of {@code EncodingFormat.ST1201} requires specifying the IMAP encoding for the + * standard deviation value. + * + * @param format the format to use for encoding standard deviation values. + */ + public void setStandardDeviationFormat(EncodingFormat format) { + this.stdDevFormat = format; + } + + /** + * Get the correlation coefficient encoding format. + * + * @return the format for encoding correlation coefficients. + */ + public EncodingFormat getCorrelationCoefficientFormat() { + return corrCoefFormat; + } + + /** + * Set the correlation coefficient encoding format. + * + *

Note that the format needs to be consistent with the correlation coefficient length. + * + * @param format the format to use for encoding correlation coefficients. + */ + public void setCorrelationCoefficientFormat(EncodingFormat format) { + this.corrCoefFormat = format; + } + + /** + * Get the reconstructed matrix values. + * + *

The matrix will have the standard deviations on the main diagonal, and the correlation + * coefficients symmetrical about the main diagonal. Any sparse entries from the encoded format + * will be filled with zeros. + * + * @return the reconstructed matrix. + */ + public double[][] getValues() { + return values.clone(); + } + + /** + * Set the matrix values. + * + *

The matrix should have the standard deviations on the main diagonal, and the correlation + * coefficients symmetrical about the main diagonal. + * + * @param values the matrix values. + */ + public void setValues(double[][] values) { + this.values = values.clone(); + } + + @Override + public Set getIdentifiers() { + SortedSet identifiers = new TreeSet<>(); + for (int rowNumber = 0; rowNumber < values.length; rowNumber++) { + for (int columnNumber = 0; columnNumber < values[rowNumber].length; columnNumber++) { + identifiers.add( + new SDCCValueIdentifierKey( + rowNumber, columnNumber, values[rowNumber].length)); + } + } + return identifiers; + } + + @Override + public SDCCValueWrap getField(IKlvKey identifier) { + SDCCValueIdentifierKey key = (SDCCValueIdentifierKey) identifier; + double value = values[key.getRow()][key.getColumn()]; + return new SDCCValueWrap(key.getRow(), key.getColumn(), value); + } +} diff --git a/st1010/src/main/java/org/jmisb/st1010/SDCCParser.java b/st1010/src/main/java/org/jmisb/st1010/SDCCParser.java new file mode 100644 index 000000000..2769cd42a --- /dev/null +++ b/st1010/src/main/java/org/jmisb/st1010/SDCCParser.java @@ -0,0 +1,189 @@ +package org.jmisb.st1010; + +import org.jmisb.api.common.KlvParseException; +import org.jmisb.api.klv.BerDecoder; +import org.jmisb.api.klv.BerField; +import org.jmisb.api.klv.st1201.FpEncoder; +import org.jmisb.api.klv.st1201.OutOfRangeBehaviour; +import org.jmisb.core.klv.PrimitiveConverter; + +/** + * Parsing support for {@link SDCC} instances. + * + *

This turns an ST 1010 encoded byte array into an SDCC structure. + * + *

Note that parsing of an SDCC instance that uses Mode 1 parse control requires out-of-band + * information (defined in the invoking standards document) on the encoding of standard deviation + * values (i.e. either ST 1201 IMAP, or IEEE-754 float). + */ +public class SDCCParser { + + private EncodingFormat standardDeviationFormat = EncodingFormat.IEEE; + + /** + * Constructor. + * + *

Creates a new SDCC Parser, initialized to use IEEE format for standard deviation encoding + * (applicable to Mode 1). Use {@link setStandardDeviationFormat} prior to calling {@link parse} + * if required. + */ + public SDCCParser() {} + + /** + * Get the standard deviation encoding format. + * + * @return the encoding format as an enumerated value. + */ + public EncodingFormat getStandardDeviationFormat() { + return standardDeviationFormat; + } + + /** + * Set the standard deviation encoding format. + * + *

This is only required for "Mode 1" parsing. + * + * @param format the encoding format to use + */ + public void setStandardDeviationFormat(EncodingFormat format) { + this.standardDeviationFormat = format; + } + + /** + * Parse a byte array into an SDCC structure. + * + *

This will automatically detect and handle both Mode 1 and Mode 2 parse control modes. + * + * @param bytes the ST 1010 encoded data + * @return SDCC equivalent to the {@code bytes} data. + * @throws KlvParseException if the byte array could not be parsed. + */ + public SDCC parse(byte[] bytes) throws KlvParseException { + int offset = 0; + BerField berMatrix = BerDecoder.decode(bytes, offset, true); + int matrixSize = berMatrix.getValue(); + offset += berMatrix.getLength(); + SDCCParserContext parserContext; + int modeByte1 = bytes[offset]; + offset += 1; + if (isLastByte(modeByte1)) { + parserContext = initialiseMode1(modeByte1); + } else { + int modeByte2 = bytes[offset]; + offset += 1; + parserContext = initialiseMode2(modeByte1, modeByte2); + } + byte[] bitVector = new byte[0]; + if ((matrixSize > 0) && parserContext.isSparseMode()) { + bitVector = parseBitVector(bytes, offset, matrixSize); + offset += bitVector.length; + } + double[][] values = new double[matrixSize][matrixSize]; + for (int r = 0; r < values.length; r++) { + if (parserContext.getSdcc().getStandardDeviationFormat().equals(EncodingFormat.IEEE)) { + values[r][r] = + PrimitiveConverter.toFloat64( + bytes, + offset, + parserContext.getSdcc().getStandardDeviationLength()); + } else { + throw new UnsupportedOperationException( + "Parsing of ST 1201 encoded SDCC Standard Deviation values needs to be implemented"); + } + offset += parserContext.getSdcc().getStandardDeviationLength(); + } + + if (parserContext.getSdcc().getCorrelationCoefficientLength() > 0) { + FpEncoder correlationCoefficientDecoder = + new FpEncoder( + -1.0, + 1.0, + parserContext.getSdcc().getCorrelationCoefficientLength(), + OutOfRangeBehaviour.Default); + int bitVectorOffset = 7; + int bitVectorValidByte = 0; + for (int r = 0; r < matrixSize; r++) { + for (int c = r + 1; c < matrixSize; c++) { + if (parserContext.isSparseMode() + && ((bitVector[bitVectorValidByte] & (1 << bitVectorOffset)) == 0)) { + values[r][c] = 0.0; + } else { + if (parserContext + .getSdcc() + .getCorrelationCoefficientFormat() + .equals(EncodingFormat.IEEE)) { + values[r][c] = + PrimitiveConverter.toFloat64( + bytes, + offset, + parserContext + .getSdcc() + .getCorrelationCoefficientLength()); + } else { + values[r][c] = correlationCoefficientDecoder.decode(bytes, offset); + } + offset += parserContext.getSdcc().getCorrelationCoefficientLength(); + } + bitVectorOffset -= 1; + if (bitVectorOffset < 0) { + bitVectorOffset = 7; + bitVectorValidByte += 1; + } + values[c][r] = values[r][c]; + } + } + } + parserContext.getSdcc().setValues(values); + return parserContext.getSdcc(); + } + + private byte[] parseBitVector(byte[] bytes, int offset, int matrixSize) { + int numCoefficients = matrixSize * (matrixSize - 1); + int numBits = numCoefficients / 2; + int numBytes = (numBits + 7) / Byte.SIZE; + byte[] bitVector = new byte[numBytes]; + for (int i = 0; i < bitVector.length; i++) { + bitVector[i] = bytes[i + offset]; + } + return bitVector; + } + + private SDCCParserContext initialiseMode2(int modeByte1, int modeByte2) + throws KlvParseException { + // Mode 2 parse control + SDCCParserContext parserContext = new SDCCParserContext(); + if (!isLastByte(modeByte2)) { + throw new KlvParseException( + String.format( + "ST 1010 parsing only supports 1 and 2 byte mode selection, got 0x%02x, 0x%02x", + modeByte1 & 0xFF, modeByte2 & 0xFF)); + } + parserContext.setSparseMode((modeByte1 & 0x20) == 0x20); + int cf = (modeByte1 & 0x10) >> 4; + SDCC sdcc = new SDCC(); + sdcc.setCorrelationCoefficientFormat(EncodingFormat.getEncoding(cf)); + sdcc.setCorrelationCoefficientLength(modeByte1 & 0x0F); + int sf = (modeByte2 & 0x10) >> 4; + sdcc.setStandardDeviationFormat(EncodingFormat.getEncoding(sf)); + sdcc.setStandardDeviationLength(modeByte2 & 0x0F); + parserContext.setSdcc(sdcc); + return parserContext; + } + + private SDCCParserContext initialiseMode1(int modeByte1) { + // Mode 1 parse control + SDCCParserContext parserContext = new SDCCParserContext(); + SDCC sdcc = new SDCC(); + sdcc.setStandardDeviationLength((modeByte1 & 0x70) >> 4); + parserContext.setSparseMode((modeByte1 & 0x08) == 0x08); + sdcc.setCorrelationCoefficientLength(modeByte1 & 0x07); + sdcc.setCorrelationCoefficientFormat(EncodingFormat.ST1201); + sdcc.setStandardDeviationFormat(getStandardDeviationFormat()); + parserContext.setSdcc(sdcc); + return parserContext; + } + + private static boolean isLastByte(int modeByte1) { + return (modeByte1 & 0x80) == 0x00; + } +} diff --git a/st1010/src/main/java/org/jmisb/st1010/SDCCParserContext.java b/st1010/src/main/java/org/jmisb/st1010/SDCCParserContext.java new file mode 100644 index 000000000..2d471f16e --- /dev/null +++ b/st1010/src/main/java/org/jmisb/st1010/SDCCParserContext.java @@ -0,0 +1,49 @@ +package org.jmisb.st1010; + +/** + * Context for {@link SDCC} Parsing. + * + *

This is used by the {@link SDCCParser} implementation, and is an internal implementation + * detail. + */ +class SDCCParserContext { + + private boolean sparseMode; + private SDCC sdcc; + + /** + * Get whether the byte array being parsed uses sparse mode. + * + * @return true if sparse mode is used, false if sparse mode is not used. + */ + public boolean isSparseMode() { + return sparseMode; + } + + /** + * Set whether the byte array being parsed uses spare mode. + * + * @param sparseMode true if sparse mode is used, false if sparse mode is not used. + */ + public void setSparseMode(boolean sparseMode) { + this.sparseMode = sparseMode; + } + + /** + * Get the SDCC matrix. + * + * @return the SDCC matrix. + */ + public SDCC getSdcc() { + return sdcc; + } + + /** + * Set the SDCC matrix. + * + * @param sdcc the matrix. + */ + public void setSdcc(SDCC sdcc) { + this.sdcc = sdcc; + } +} diff --git a/st1010/src/main/java/org/jmisb/st1010/SDCCSerialiser.java b/st1010/src/main/java/org/jmisb/st1010/SDCCSerialiser.java new file mode 100644 index 000000000..088a6b81b --- /dev/null +++ b/st1010/src/main/java/org/jmisb/st1010/SDCCSerialiser.java @@ -0,0 +1,265 @@ +package org.jmisb.st1010; + +import org.jmisb.api.klv.ArrayBuilder; +import org.jmisb.api.klv.Ber; +import org.jmisb.api.klv.BerEncoder; +import org.jmisb.api.klv.st1201.FpEncoder; +import org.jmisb.api.klv.st1201.OutOfRangeBehaviour; +import org.jmisb.core.klv.PrimitiveConverter; + +/** + * Serialization support for {@link SDCC} instances. + * + *

ST 1010 has two encoding formats, referred to as "Parse Modes". Mode 1 is more compact but + * Mode 2 parse control is more flexible, and is required by some standards, and therefore is the + * default. Use {@link setPreferMode1} to select which mode is preferred. There are modes and bit + * lengths that cannot be supported in Mode 1 control. In particular, specifying lengths > 7, or + * {@code EncodingFormat.IEEE} for correlation coefficients will result in Mode 2 being used + * (irrespective of the preferred mode). + * + *

ST 1010 also supports not encoding correlation coefficients that are 0.0 (i.e. no + * correlation), using "sparse mode". This requires adding a bit mask which is not always required. + * By default, sparse mode will be used if it is more efficient (i.e. would save bytes overall). It + * is also possible to disable use of sparse mode using {@link setSparseEnabled}. The result is that + * sparse mode is only used if both it would be more efficient and it is not disabled. + */ +public class SDCCSerialiser { + private boolean preferMode1 = false; + private boolean sparseEnabled = true; + private static final byte NOT_FINAL_BYTE = (byte) (1 << 7); + private static final byte FINAL_BYTE = 0; + private static final byte MODE1_SLEN_SHIFT = 4; + private static final byte MODE1_SPARSE_SHIFT = 3; + private static final byte MODE2_SPARSE_SHIFT = 5; + private static final byte CORRELATION_COEFFICIENT_FORMAT_SHIFT = 4; + private static final byte STANDARD_DEVIATION_FORMAT_SHIFT = 4; + private static final int MAX_MODE1_CORRELATION_COEFFICIENT_LEN = 7; + private static final int MAX_MODE1_STANDARD_DEVIATION_LEN = 7; + + /** + * Get whether encoding should prefer Mode 1 parse control. + * + * @return true if encoding will prefer Mode 1 parse control. + */ + public boolean isPreferMode1() { + return preferMode1; + } + + /** + * Get whether sparse representation is allowed. + * + *

SDCC can reduce space by omitting the encoding of uncorrelated variable covariances (i.e. + * 0 values). See MISB ST 1010.3 for more information. + * + * @return true if sparse encoding is enabled, otherwise false. + */ + public boolean isSparseEnabled() { + return sparseEnabled; + } + + /** + * Set whether sparse representation is allowed. + * + *

SDCC can reduce space by omitting the encoding of uncorrelated variable covariances (i.e. + * 0 values). See MISB ST 1010.3 for more information. + * + *

When serializing, sparse representation will be used if it is enabled and would be more + * efficient than serializing the 0 values (i.e. save bytes). If it is not enabled (set to + * false), full values will be used. If it is not more efficient, full values will be used. + * + *

Sparse representation is enabled by default. + * + * @param sparseEnabled true to enable sparse representation, false to disable sparse + * representation. + */ + public void setSparseEnabled(boolean sparseEnabled) { + this.sparseEnabled = sparseEnabled; + } + + /** + * Set whether encoding should prefer Mode 1 parse control. + * + *

In general, Mode 2 parse control is more flexible, and is required by some standards, and + * therefore is the default. In addition, there are modes and bit lengths that cannot be + * supported in Mode 1 control. In particular, specifying lengths > 7, or {@code + * EncodingFormat.IEEE} for correlation coefficients will result in Mode 2 being used, + * irrespective of this setting. + * + *

If this option is enabled, and the required encoding can work with Mode 1, it will be + * used. + * + * @param preferMode1 true to enable Mode 1 parse control as an option, false to disable Mode 1 + * parse control. + */ + public void setPreferMode1(boolean preferMode1) { + this.preferMode1 = preferMode1; + } + + /** + * Serialize a Standard Deviation and Cross Correlation instance to bytes. + * + * @param sdcc the matrix of values to encode + * @return the corresponding byte array representation + */ + public byte[] encode(SDCC sdcc) { + if (sdcc.getValues().length != sdcc.getValues()[0].length) { + throw new IllegalArgumentException("SDCC requires a square input array"); + } + ArrayBuilder arrayBuilder = new ArrayBuilder(); + byte[] matrixBytes = BerEncoder.encode(sdcc.getValues().length, Ber.OID); + arrayBuilder.append(matrixBytes); + boolean usingSparse = isSparseEnabled() && sparseWouldSaveSpace(sdcc); + arrayBuilder.append(getModeBytes(sdcc, usingSparse)); + byte[] bitVector = new byte[0]; + if (usingSparse) { + bitVector = new byte[getBitVectorLength(sdcc)]; + // The values will get filled in as we work through the coefficients + arrayBuilder.append(bitVector); + } + for (int r = 0; r < sdcc.getValues().length; r++) { + // TODO: ST1201 + double standardDeviation = sdcc.getValues()[r][r]; + switch (sdcc.getStandardDeviationLength()) { + case 4: + arrayBuilder.append( + PrimitiveConverter.float32ToBytes((float) standardDeviation)); + break; + case 8: + arrayBuilder.append(PrimitiveConverter.float64ToBytes(standardDeviation)); + break; + default: + throw new IllegalArgumentException( + "SDCC IEEE format length 4 and 8 is currently supported. More work required for 2 byte. Other lengths not sensible."); + } + } + FpEncoder correlationCoefficientEncoder = + new FpEncoder( + -1.0, + 1.0, + sdcc.getCorrelationCoefficientLength(), + OutOfRangeBehaviour.Default); + int bitVectorOffset = 7; + int bitVectorValidByte = 0; + for (int r = 0; r < sdcc.getValues().length; r++) { + for (int c = r + 1; c < sdcc.getValues().length; c++) { + + double coef = sdcc.getValues()[r][c]; + if (usingSparse) { + if (coef != 0.0) { + bitVector[bitVectorValidByte] |= 1 << bitVectorOffset; + } + bitVectorOffset -= 1; + if (bitVectorOffset < 0) { + bitVectorValidByte += 1; + bitVectorOffset = 7; + } + if (coef == 0.0) { + continue; + } + } + if (sdcc.getCorrelationCoefficientFormat().equals(EncodingFormat.IEEE)) { + switch (sdcc.getCorrelationCoefficientLength()) { + case 4: + arrayBuilder.append(PrimitiveConverter.float32ToBytes((float) coef)); + break; + case 8: + arrayBuilder.append(PrimitiveConverter.float64ToBytes(coef)); + break; + default: + throw new IllegalArgumentException( + "SDCC IEEE format length 4 and 8 is currently supported. More work required for 2 byte. Other lengths not sensible."); + } + } else { + arrayBuilder.append(correlationCoefficientEncoder.encode(coef)); + } + } + } + return arrayBuilder.toBytes(); + } + + private byte[] getModeBytes(SDCC sdcc, boolean usingSparse) { + if (isPreferMode1() && isMode1Compatible(sdcc)) { + return getModeBytesMode1(sdcc, usingSparse); + } + return getModeBytesMode2(sdcc, usingSparse); + } + + private byte[] getModeBytesMode1(SDCC sdcc, boolean usingSparse) { + byte[] parseControl = new byte[1]; + parseControl[0] = FINAL_BYTE; + byte slen = (byte) (sdcc.getStandardDeviationLength() & 0x07); + parseControl[0] |= (slen << MODE1_SLEN_SHIFT); + if (usingSparse) { + parseControl[0] |= 1 << MODE1_SPARSE_SHIFT; + } + byte clen = (byte) (sdcc.getCorrelationCoefficientLength() & 0x07); + parseControl[0] |= clen; + return parseControl; + } + + private byte[] getModeBytesMode2(SDCC sdcc, boolean usingSparse) { + byte[] parseControl = new byte[2]; + parseControl[0] = NOT_FINAL_BYTE; + parseControl[1] = FINAL_BYTE; + int numCoefficients = getNumCoefficients(sdcc); + if (numCoefficients != 0) { + if (usingSparse) { + parseControl[0] |= 1 << MODE2_SPARSE_SHIFT; + } + parseControl[0] |= + (sdcc.getCorrelationCoefficientFormat().getValue() + << CORRELATION_COEFFICIENT_FORMAT_SHIFT); + byte clen = (byte) (sdcc.getCorrelationCoefficientLength() & 0x0F); + parseControl[0] |= clen; + } + parseControl[1] |= + (sdcc.getStandardDeviationFormat().getValue() << STANDARD_DEVIATION_FORMAT_SHIFT); + byte slen = (byte) (sdcc.getStandardDeviationLength() & 0x0F); + parseControl[1] |= slen; + return parseControl; + } + + private int getNumCoefficients(SDCC sdcc) { + return (sdcc.getValues().length * (sdcc.getValues().length - 1)); + } + + private boolean sparseWouldSaveSpace(SDCC sdcc) { + int numZeros = 0; + for (int r = 0; r < sdcc.getValues().length; r++) { + for (int c = r + 1; c < sdcc.getValues().length; c++) { + if (sdcc.getValues()[r][c] == 0.0) { + numZeros += 1; + } + } + } + return (sdcc.getCorrelationCoefficientLength() * numZeros > getBitVectorLength(sdcc)); + } + + /** + * Get the length of the BitVector. + * + * @param sdcc the SDCC to calculate for + * @return the length in bytes + */ + private int getBitVectorLength(SDCC sdcc) { + int numBits = getNumCoefficients(sdcc) / 2; + int numBytes = (numBits + 7) / Byte.SIZE; + return numBytes; + } + + private boolean isMode1Compatible(SDCC sdcc) { + if (sdcc.getCorrelationCoefficientFormat().equals(EncodingFormat.IEEE)) { + return false; + } + if (sdcc.getStandardDeviationFormat().equals(EncodingFormat.ST1201)) { + return false; + } + if (sdcc.getCorrelationCoefficientLength() > MAX_MODE1_CORRELATION_COEFFICIENT_LEN) { + return false; + } + if (sdcc.getStandardDeviationLength() > MAX_MODE1_STANDARD_DEVIATION_LEN) { + return false; + } + return true; + } +} diff --git a/st1010/src/main/java/org/jmisb/st1010/SDCCValueIdentifierKey.java b/st1010/src/main/java/org/jmisb/st1010/SDCCValueIdentifierKey.java new file mode 100644 index 000000000..b322ecae9 --- /dev/null +++ b/st1010/src/main/java/org/jmisb/st1010/SDCCValueIdentifierKey.java @@ -0,0 +1,86 @@ +package org.jmisb.st1010; + +import java.util.Comparator; +import org.jmisb.api.klv.IKlvKey; + +/** + * Pseudo-key item for SDCC value identification. + * + *

Each identifier corresponds to one item in the SDCC value matrix (i.e. a unique row/column + * combination). + */ +public class SDCCValueIdentifierKey implements IKlvKey, Comparable { + + private final int row; + private final int column; + private final int numColumns; + + /** + * Constructor. + * + * @param row row identifier. + * @param column column identifier. + * @param numColumns + */ + public SDCCValueIdentifierKey(final int row, final int column, final int numColumns) { + this.row = row; + this.column = column; + this.numColumns = numColumns; + } + + /** + * Row number. + * + * @return row number as an integer value, zero base. + */ + public int getRow() { + return row; + } + + /** + * Column number. + * + * @return column number as an integer value, zero base. + */ + public int getColumn() { + return column; + } + + @Override + public int getIdentifier() { + return row * numColumns + column; + } + + @Override + public int compareTo(SDCCValueIdentifierKey t) { + return Comparator.comparingInt(SDCCValueIdentifierKey::getRow) + .thenComparingInt(SDCCValueIdentifierKey::getColumn) + .compare(this, t); + } + + @Override + public int hashCode() { + int hash = 5; + hash = 67 * hash + this.row; + hash = 67 * hash + this.column; + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final SDCCValueIdentifierKey other = (SDCCValueIdentifierKey) obj; + if (this.row != other.row) { + return false; + } + return this.column == other.column; + } +} diff --git a/st1010/src/main/java/org/jmisb/st1010/SDCCValueWrap.java b/st1010/src/main/java/org/jmisb/st1010/SDCCValueWrap.java new file mode 100644 index 000000000..5cedf5cd1 --- /dev/null +++ b/st1010/src/main/java/org/jmisb/st1010/SDCCValueWrap.java @@ -0,0 +1,65 @@ +package org.jmisb.st1010; + +import org.jmisb.api.klv.IKlvValue; + +/** + * Wrapper for an item in an SDCC matrix. + * + *

This acts as an adapter (facade) around the double value, to present it as an IKlvValue. + */ +public class SDCCValueWrap implements IKlvValue { + + private final int row; + private final int column; + private final double value; + + /** + * Constructor. + * + * @param row the row number + * @param column the column number + * @param value the value + */ + public SDCCValueWrap(final int row, final int column, final double value) { + this.row = row; + this.column = column; + this.value = value; + } + + @Override + public String getDisplayName() { + return String.format("[%d][%d]", row, column); + } + + @Override + public String getDisplayableValue() { + return String.format("%.3f", value); + } + + /** + * Row index. + * + * @return the row index of the value + */ + public int getRow() { + return row; + } + + /** + * Column index. + * + * @return the column index of the value + */ + public int getColumn() { + return column; + } + + /** + * Value. + * + * @return the wrapped value, as a double. + */ + public double getValue() { + return value; + } +} diff --git a/st1010/src/main/java/org/jmisb/st1010/package-info.java b/st1010/src/main/java/org/jmisb/st1010/package-info.java new file mode 100644 index 000000000..681e71c67 --- /dev/null +++ b/st1010/src/main/java/org/jmisb/st1010/package-info.java @@ -0,0 +1,17 @@ +/** + * ST 1010: Generalized Standard Deviation and Correlation Coefficient Metadata. + * + *

This standard (ST) defines a bit-efficient method for transmitting standard deviation and + * correlation coefficient data. + * + *

In support of this method, a Standard Deviation and Correlation Coefficient Floating Length + * Pack (SDCC-FLP) construct is defined. The construct leverages the symmetry of the + * variance-covariance matrix and the fixed data range of the correlation coefficients to reduce the + * number of bytes transmitted, in effect compressing the data. This method is, therefore, not + * extendable to more generic matrix cases. + * + *

This ST is dependent on context from an invoking standard (or other document), called a Parent + * Document, which provides a list of values (random variables) that can have corresponding standard + * deviation and correlation coefficients; this list of random variables is called the Source List. + */ +package org.jmisb.st1010; diff --git a/st1010/src/test/java/org/jmisb/st1010/EncodingFormatTest.java b/st1010/src/test/java/org/jmisb/st1010/EncodingFormatTest.java new file mode 100644 index 000000000..3677c9e86 --- /dev/null +++ b/st1010/src/test/java/org/jmisb/st1010/EncodingFormatTest.java @@ -0,0 +1,48 @@ +package org.jmisb.st1010; + +import static org.testng.Assert.*; + +import org.jmisb.api.common.KlvParseException; +import org.testng.annotations.Test; + +/** Unit tests for the EncodingFormat enum. */ +public class EncodingFormatTest { + + public EncodingFormatTest() {} + + @Test + public void checkST1201() { + EncodingFormat uut = EncodingFormat.ST1201; + assertEquals(uut.getValue(), 1); + } + + @Test + public void checkST1201Lookup() throws KlvParseException { + EncodingFormat uut = EncodingFormat.getEncoding(1); + assertEquals(uut, EncodingFormat.ST1201); + assertEquals(uut.getValue(), 1); + } + + @Test + public void checkIEEE() { + EncodingFormat uut = EncodingFormat.IEEE; + assertEquals(uut.getValue(), 0); + } + + @Test + public void checkIEEELookup() throws KlvParseException { + EncodingFormat uut = EncodingFormat.getEncoding(0); + assertEquals(uut, EncodingFormat.IEEE); + assertEquals(uut.getValue(), 0); + } + + @Test(expectedExceptions = KlvParseException.class) + public void checkBadLookup2() throws KlvParseException { + EncodingFormat.getEncoding(2); + } + + @Test(expectedExceptions = KlvParseException.class) + public void checkBadLookupNeg() throws KlvParseException { + EncodingFormat.getEncoding(-1); + } +} diff --git a/st1010/src/test/java/org/jmisb/st1010/Mode1ParseControlTest.java b/st1010/src/test/java/org/jmisb/st1010/Mode1ParseControlTest.java new file mode 100644 index 000000000..5b44c13a8 --- /dev/null +++ b/st1010/src/test/java/org/jmisb/st1010/Mode1ParseControlTest.java @@ -0,0 +1,22 @@ +package org.jmisb.st1010; + +import static org.testng.Assert.*; + +import org.jmisb.api.common.KlvParseException; +import org.testng.annotations.Test; + +public class Mode1ParseControlTest { + + public Mode1ParseControlTest() {} + + @Test + public void check4B() throws KlvParseException { + SDCCParser parser = new SDCCParser(); + parser.setStandardDeviationFormat(EncodingFormat.IEEE); + SDCC result = parser.parse(new byte[] {0x00, 0x4B}); + assertEquals(result.getStandardDeviationLength(), 4); + assertEquals(result.getCorrelationCoefficientLength(), 3); + assertEquals(result.getStandardDeviationFormat(), EncodingFormat.IEEE); + assertEquals(result.getCorrelationCoefficientFormat(), EncodingFormat.ST1201); + } +} diff --git a/st1010/src/test/java/org/jmisb/st1010/Mode2ParseControlTest.java b/st1010/src/test/java/org/jmisb/st1010/Mode2ParseControlTest.java new file mode 100644 index 000000000..06bd3080a --- /dev/null +++ b/st1010/src/test/java/org/jmisb/st1010/Mode2ParseControlTest.java @@ -0,0 +1,31 @@ +package org.jmisb.st1010; + +import static org.testng.Assert.*; + +import org.jmisb.api.common.KlvParseException; +import org.testng.annotations.Test; + +public class Mode2ParseControlTest { + + public Mode2ParseControlTest() {} + + @Test + public void checkB308() throws KlvParseException { + SDCCParser parser = new SDCCParser(); + SDCC result = parser.parse(new byte[] {(byte) 0x00, (byte) 0xB3, (byte) 0x08}); + assertEquals(result.getStandardDeviationLength(), 8); + assertEquals(result.getCorrelationCoefficientLength(), 3); + assertEquals(result.getStandardDeviationFormat(), EncodingFormat.IEEE); + assertEquals(result.getCorrelationCoefficientFormat(), EncodingFormat.ST1201); + } + + @Test + public void check8413() throws KlvParseException { + SDCCParser parser = new SDCCParser(); + SDCC result = parser.parse(new byte[] {(byte) 0x00, (byte) 0x84, (byte) 0x13}); + assertEquals(result.getStandardDeviationLength(), 3); + assertEquals(result.getCorrelationCoefficientLength(), 4); + assertEquals(result.getStandardDeviationFormat(), EncodingFormat.ST1201); + assertEquals(result.getCorrelationCoefficientFormat(), EncodingFormat.IEEE); + } +} diff --git a/st1010/src/test/java/org/jmisb/st1010/SDCCParserTest.java b/st1010/src/test/java/org/jmisb/st1010/SDCCParserTest.java new file mode 100644 index 000000000..3c3b1b747 --- /dev/null +++ b/st1010/src/test/java/org/jmisb/st1010/SDCCParserTest.java @@ -0,0 +1,236 @@ +package org.jmisb.st1010; + +import static org.testng.Assert.*; + +import org.jmisb.api.common.KlvParseException; +import org.testng.annotations.Test; + +public class SDCCParserTest { + + public SDCCParserTest() {} + + @Test + public void checkSingleStandardDeviation() throws KlvParseException { + SDCCParser parser = new SDCCParser(); + SDCC result = + parser.parse( + new byte[] { + (byte) 0x01, + (byte) 0x80, + (byte) 0x04, + (byte) 0x40, + (byte) 0x4C, + (byte) 0xCC, + (byte) 0xCD + }); + assertEquals(result.getStandardDeviationLength(), 4); + assertEquals(result.getCorrelationCoefficientLength(), 0); + assertEquals(result.getStandardDeviationFormat(), EncodingFormat.IEEE); + assertEquals(result.getCorrelationCoefficientFormat(), EncodingFormat.IEEE); + assertValuesAreEqual(result.getValues(), new double[][] {{3.2}}); + } + + @Test( + expectedExceptions = KlvParseException.class, + expectedExceptionsMessageRegExp = + "ST 1010 parsing only supports 1 and 2 byte mode selection, got 0x80, 0x84") + public void checkBadModeControl() throws KlvParseException { + SDCCParser parser = new SDCCParser(); + parser.parse( + new byte[] { + (byte) 0x01, + (byte) 0x80, + (byte) 0x84, + (byte) 0x00, + (byte) 0x40, + (byte) 0x4C, + (byte) 0xCC, + (byte) 0xCD + }); + } + + @Test + public void checkSingleStandardDeviationDouble() throws KlvParseException { + SDCCParser parser = new SDCCParser(); + SDCC result = + parser.parse( + new byte[] { + (byte) 0x01, + (byte) 0x90, + (byte) 0x08, + (byte) 0x40, + (byte) 0x2A, + (byte) 0x66, + (byte) 0x66, + (byte) 0x66, + (byte) 0x66, + (byte) 0x66, + (byte) 0x66 + }); + assertEquals(result.getStandardDeviationLength(), 8); + assertEquals(result.getCorrelationCoefficientLength(), 0); + assertEquals(result.getStandardDeviationFormat(), EncodingFormat.IEEE); + assertEquals(result.getCorrelationCoefficientFormat(), EncodingFormat.ST1201); + assertValuesAreEqual(result.getValues(), new double[][] {{13.2}}); + } + + @Test + public void checkTwoVariable() throws KlvParseException { + SDCCParser parser = new SDCCParser(); + SDCC result = + parser.parse( + new byte[] { + (byte) 0x02, + (byte) 0x84, + (byte) 0x04, + (byte) 0x40, + (byte) 0x4C, + (byte) 0xCC, + (byte) 0xCD, + (byte) 0x41, + (byte) 0x81, + (byte) 0x99, + (byte) 0x9a, + (byte) 0x3e, + (byte) 0xfa, + (byte) 0xe1, + (byte) 0x48 + }); + assertEquals(result.getStandardDeviationLength(), 4); + assertEquals(result.getCorrelationCoefficientLength(), 4); + assertEquals(result.getStandardDeviationFormat(), EncodingFormat.IEEE); + assertEquals(result.getCorrelationCoefficientFormat(), EncodingFormat.IEEE); + assertValuesAreEqual(result.getValues(), new double[][] {{3.2, 0.49}, {0.49, 16.2}}); + } + + @Test + public void checkTwoVariableMode1() throws KlvParseException { + SDCCParser parser = new SDCCParser(); + parser.setStandardDeviationFormat(EncodingFormat.IEEE); + SDCC result = + parser.parse( + new byte[] { + (byte) 0x02, + (byte) 0x42, + (byte) 0x40, + (byte) 0x4C, + (byte) 0xCC, + (byte) 0xCD, + (byte) 0x41, + (byte) 0x81, + (byte) 0x99, + (byte) 0x9a, + (byte) 0x5f, + (byte) 0x5c + }); + assertEquals(result.getStandardDeviationLength(), 4); + assertEquals(result.getCorrelationCoefficientLength(), 2); + assertEquals(result.getStandardDeviationFormat(), EncodingFormat.IEEE); + assertEquals(result.getCorrelationCoefficientFormat(), EncodingFormat.ST1201); + assertValuesAreEqual(result.getValues(), new double[][] {{3.2, 0.49}, {0.49, 16.2}}); + } + + private void assertValuesAreEqual(double[][] actual, double[][] expected) { + assertEquals(actual.length, expected.length); + if (expected.length > 0) { + assertEquals(actual[0].length, expected[0].length); + for (int r = 0; r < expected.length; r++) { + for (int c = 0; c < expected[r].length; c++) { + assertEquals(actual[r][c], expected[r][c], 0.00001); + } + } + } + } + + @Test + public void checkThreeVariableSparse() throws KlvParseException { + SDCCParser parser = new SDCCParser(); + SDCC result = + parser.parse( + new byte[] { + (byte) 0x03, + (byte) 0xB3, + (byte) 0x04, + (byte) 0b01000000, + (byte) 0x40, + (byte) 0x4C, + (byte) 0xCC, + (byte) 0xCD, + (byte) 0x41, + (byte) 0x81, + (byte) 0x99, + (byte) 0x9a, + (byte) 0x43, + (byte) 0x6a, + (byte) 0x33, + (byte) 0x33, + (byte) 0x5f, + (byte) 0x5c, + (byte) 0x28 + }); + assertEquals(result.getStandardDeviationLength(), 4); + assertEquals(result.getCorrelationCoefficientLength(), 3); + assertEquals(result.getStandardDeviationFormat(), EncodingFormat.IEEE); + assertEquals(result.getCorrelationCoefficientFormat(), EncodingFormat.ST1201); + assertValuesAreEqual( + result.getValues(), + new double[][] { + {3.2, 0.0, 0.49}, + {0.0, 16.2, 0.0}, + {0.49, 0.0, 234.2} + }); + } + + @Test + public void checkFiveVariableSparse() throws KlvParseException { + SDCCParser parser = new SDCCParser(); + SDCC result = + parser.parse( + new byte[] { + (byte) 0x05, + (byte) 0xB3, + (byte) 0x04, + (byte) 0b01000000, + (byte) 0b10000000, + (byte) 0x40, + (byte) 0x4C, + (byte) 0xCC, + (byte) 0xCD, + (byte) 0x41, + (byte) 0x81, + (byte) 0x99, + (byte) 0x9a, + (byte) 0x43, + (byte) 0x6a, + (byte) 0x33, + (byte) 0x33, + (byte) 0x3e, + (byte) 0xa3, + (byte) 0xd7, + (byte) 0x0a, + (byte) 0x40, + (byte) 0xc9, + (byte) 0x99, + (byte) 0x9a, + (byte) 0x5f, + (byte) 0x5c, + (byte) 0x28, + (byte) 0x80, + (byte) 0x00, + (byte) 0x00 + }); + assertEquals(result.getStandardDeviationLength(), 4); + assertEquals(result.getCorrelationCoefficientLength(), 3); + assertEquals(result.getStandardDeviationFormat(), EncodingFormat.IEEE); + assertEquals(result.getCorrelationCoefficientFormat(), EncodingFormat.ST1201); + assertValuesAreEqual( + result.getValues(), + new double[][] { + {3.2, 0.0, 0.49, 0.0, 0.0}, + {0.0, 16.2, 0.0, 0.0, 0.0}, + {0.49, 0.0, 234.2, 0.0, 1.0}, + {0.0, 0.0, 0.0, 0.32, 0.0}, + {0.0, 0.0, 1.0, 0.0, 6.3} + }); + } +} diff --git a/st1010/src/test/java/org/jmisb/st1010/SDCCTest.java b/st1010/src/test/java/org/jmisb/st1010/SDCCTest.java new file mode 100644 index 000000000..18a49fca6 --- /dev/null +++ b/st1010/src/test/java/org/jmisb/st1010/SDCCTest.java @@ -0,0 +1,97 @@ +package org.jmisb.st1010; + +import static org.testng.Assert.*; + +import org.testng.annotations.Test; + +/** Unit tests for SDCC. */ +public class SDCCTest { + + public SDCCTest() {} + + @Test + public void checkDefaults() { + SDCC uut = new SDCC(); + assertEquals(uut.getCorrelationCoefficientFormat(), EncodingFormat.ST1201); + assertEquals(uut.getStandardDeviationFormat(), EncodingFormat.IEEE); + assertEquals(uut.getCorrelationCoefficientLength(), 3); + assertEquals(uut.getStandardDeviationLength(), 4); + assertEquals(uut.getValues().length, 0); + } + + @Test + public void checkSetterAndCopy() { + SDCC uut = new SDCC(); + uut.setCorrelationCoefficientFormat(EncodingFormat.IEEE); + uut.setStandardDeviationFormat(EncodingFormat.ST1201); + uut.setCorrelationCoefficientLength(8); + uut.setStandardDeviationLength(3); + uut.setValues(new double[][] {{5.3, 0.2}, {0.2, 1.6}}); + assertEquals(uut.getCorrelationCoefficientFormat(), EncodingFormat.IEEE); + assertEquals(uut.getStandardDeviationFormat(), EncodingFormat.ST1201); + assertEquals(uut.getCorrelationCoefficientLength(), 8); + assertEquals(uut.getStandardDeviationLength(), 3); + assertEquals(uut.getValues().length, 2); + assertEquals(uut.getValues()[0].length, 2); + assertEquals(uut.getValues()[0][0], 5.3); + assertEquals(uut.getValues()[0][1], 0.2); + assertEquals(uut.getValues()[1][0], 0.2); + assertEquals(uut.getValues()[1][1], 1.6); + assertEquals(uut.getIdentifiers().size(), 4); + boolean found00 = false; + boolean found01 = false; + boolean found10 = false; + boolean found11 = false; + for (SDCCValueIdentifierKey identifier : uut.getIdentifiers()) { + if ((identifier.getRow() == 0) && (identifier.getColumn() == 0)) { + found00 = true; + assertEquals(uut.getField(identifier).getDisplayName(), "[0][0]"); + assertEquals(uut.getField(identifier).getDisplayableValue(), "5.300"); + assertEquals(uut.getField(identifier).getRow(), 0); + assertEquals(uut.getField(identifier).getColumn(), 0); + assertEquals(uut.getField(identifier).getValue(), 5.3, 0.0001); + } + if ((identifier.getRow() == 0) && (identifier.getColumn() == 1)) { + found01 = true; + assertEquals(uut.getField(identifier).getDisplayName(), "[0][1]"); + assertEquals(uut.getField(identifier).getDisplayableValue(), "0.200"); + assertEquals(uut.getField(identifier).getRow(), 0); + assertEquals(uut.getField(identifier).getColumn(), 1); + assertEquals(uut.getField(identifier).getValue(), 0.2, 0.0001); + } + if ((identifier.getRow() == 1) && (identifier.getColumn() == 0)) { + found10 = true; + assertEquals(uut.getField(identifier).getDisplayName(), "[1][0]"); + assertEquals(uut.getField(identifier).getDisplayableValue(), "0.200"); + assertEquals(uut.getField(identifier).getRow(), 1); + assertEquals(uut.getField(identifier).getColumn(), 0); + assertEquals(uut.getField(identifier).getValue(), 0.2, 0.0001); + } + + if ((identifier.getRow() == 1) && (identifier.getColumn() == 1)) { + found11 = true; + assertEquals(uut.getField(identifier).getDisplayName(), "[1][1]"); + assertEquals(uut.getField(identifier).getDisplayableValue(), "1.600"); + assertEquals(uut.getField(identifier).getRow(), 1); + assertEquals(uut.getField(identifier).getColumn(), 1); + assertEquals(uut.getField(identifier).getValue(), 1.6, 0.0001); + } + } + assertTrue(found00); + assertTrue(found01); + assertTrue(found10); + assertTrue(found11); + SDCC copy = new SDCC(uut); + assertEquals(copy.getCorrelationCoefficientFormat(), EncodingFormat.IEEE); + assertEquals(copy.getStandardDeviationFormat(), EncodingFormat.ST1201); + assertEquals(copy.getCorrelationCoefficientLength(), 8); + assertEquals(copy.getStandardDeviationLength(), 3); + assertEquals(copy.getValues().length, 2); + assertEquals(copy.getValues()[0].length, 2); + assertEquals(copy.getValues()[0][0], 5.3); + assertEquals(copy.getValues()[0][1], 0.2); + assertEquals(copy.getValues()[1][0], 0.2); + assertEquals(copy.getValues()[1][1], 1.6); + assertEquals(uut.getIdentifiers().size(), 4); + } +} diff --git a/st1010/src/test/java/org/jmisb/st1010/SDCCValueIdentifierKeyTest.java b/st1010/src/test/java/org/jmisb/st1010/SDCCValueIdentifierKeyTest.java new file mode 100644 index 000000000..d9e87f9c4 --- /dev/null +++ b/st1010/src/test/java/org/jmisb/st1010/SDCCValueIdentifierKeyTest.java @@ -0,0 +1,49 @@ +package org.jmisb.st1010; + +import static org.testng.Assert.*; + +import org.testng.annotations.Test; + +/** Unit tests for SDCCValueIdentifierKey. */ +public class SDCCValueIdentifierKeyTest { + + @Test + public void checkIdentifier() { + SDCCValueIdentifierKey uut = new SDCCValueIdentifierKey(3, 1, 4); + assertEquals(uut.getIdentifier(), 13); + } + + @Test + public void checkRowAndColumn() { + SDCCValueIdentifierKey uut = new SDCCValueIdentifierKey(3, 1, 4); + assertEquals(uut.getRow(), 3); + assertEquals(uut.getColumn(), 1); + } + + @Test + public void checkHash() { + SDCCValueIdentifierKey uut = new SDCCValueIdentifierKey(3, 1, 4); + assertEquals(uut.hashCode(), 22647); + } + + @Test + public void checkEquals() { + SDCCValueIdentifierKey uut = new SDCCValueIdentifierKey(3, 1, 4); + assertFalse(uut.equals(null)); + assertTrue(uut.equals(new SDCCValueIdentifierKey(3, 1, 4))); + assertFalse(uut.equals(new SDCCValueIdentifierKey(2, 1, 4))); + assertFalse(uut.equals(new SDCCValueIdentifierKey(1, 3, 4))); + assertFalse(uut.equals(new SDCCValueIdentifierKey(3, 3, 4))); + assertFalse(uut.equals(3)); + assertTrue(uut.equals(uut)); + } + + @Test + public void checkComparison() { + SDCCValueIdentifierKey uut1 = new SDCCValueIdentifierKey(1, 3, 4); + SDCCValueIdentifierKey uut2 = new SDCCValueIdentifierKey(1, 2, 4); + assertEquals(uut1.compareTo(uut2), 1); + assertEquals(uut2.compareTo(uut1), -1); + assertEquals(uut1.compareTo(uut1), 0); + } +} diff --git a/st1010/src/test/java/org/jmisb/st1010/SDCCWriterTest.java b/st1010/src/test/java/org/jmisb/st1010/SDCCWriterTest.java new file mode 100644 index 000000000..0592ae1e0 --- /dev/null +++ b/st1010/src/test/java/org/jmisb/st1010/SDCCWriterTest.java @@ -0,0 +1,563 @@ +package org.jmisb.st1010; + +import static org.testng.Assert.*; + +import org.jmisb.api.common.KlvParseException; +import org.testng.annotations.Test; + +/** Unit tests for SDCCWriter */ +public class SDCCWriterTest { + + public SDCCWriterTest() {} + + @Test + public void checkSingleStandardDeviation() throws KlvParseException { + SDCC sdcc = new SDCC(); + sdcc.setValues(new double[][] {{3.2}}); + sdcc.setStandardDeviationLength(4); + sdcc.setStandardDeviationFormat(EncodingFormat.IEEE); + SDCCSerialiser writer = new SDCCSerialiser(); + byte[] encoded = writer.encode(sdcc); + assertEquals( + encoded, + new byte[] { + (byte) 0x01, + (byte) 0x80, + (byte) 0x04, + (byte) 0x40, + (byte) 0x4C, + (byte) 0xCC, + (byte) 0xCD + }); + } + + @Test + public void checkSingleStandardDeviationDouble() throws KlvParseException { + SDCC sdcc = new SDCC(); + sdcc.setValues(new double[][] {{13.2}}); + sdcc.setStandardDeviationLength(8); + sdcc.setStandardDeviationFormat(EncodingFormat.IEEE); + SDCCSerialiser writer = new SDCCSerialiser(); + byte[] encoded = writer.encode(sdcc); + assertEquals( + encoded, + new byte[] { + (byte) 0x01, + (byte) 0x80, + (byte) 0x08, + (byte) 0x40, + (byte) 0x2A, + (byte) 0x66, + (byte) 0x66, + (byte) 0x66, + (byte) 0x66, + (byte) 0x66, + (byte) 0x66 + }); + } + + @Test + public void checkSingleStandardDeviationDoubleMode1Fallback() throws KlvParseException { + SDCC sdcc = new SDCC(); + sdcc.setValues(new double[][] {{13.2}}); + sdcc.setStandardDeviationLength(8); + sdcc.setStandardDeviationFormat(EncodingFormat.IEEE); + SDCCSerialiser writer = new SDCCSerialiser(); + writer.setPreferMode1(true); + byte[] encoded = writer.encode(sdcc); + assertEquals( + encoded, + new byte[] { + (byte) 0x01, + (byte) 0x80, + (byte) 0x08, + (byte) 0x40, + (byte) 0x2A, + (byte) 0x66, + (byte) 0x66, + (byte) 0x66, + (byte) 0x66, + (byte) 0x66, + (byte) 0x66 + }); + } + + @Test + public void checkTwoVariable() throws KlvParseException { + SDCC sdcc = new SDCC(); + sdcc.setValues(new double[][] {{3.2, 0.49}, {0.49, 16.2}}); + sdcc.setStandardDeviationLength(4); + sdcc.setStandardDeviationFormat(EncodingFormat.IEEE); + sdcc.setCorrelationCoefficientLength(4); + sdcc.setCorrelationCoefficientFormat(EncodingFormat.IEEE); + SDCCSerialiser writer = new SDCCSerialiser(); + byte[] encoded = writer.encode(sdcc); + assertEquals( + encoded, + new byte[] { + (byte) 0x02, + (byte) 0x84, + (byte) 0x04, + (byte) 0x40, + (byte) 0x4C, + (byte) 0xCC, + (byte) 0xCD, + (byte) 0x41, + (byte) 0x81, + (byte) 0x99, + (byte) 0x9a, + (byte) 0x3e, + (byte) 0xfa, + (byte) 0xe1, + (byte) 0x48 + }); + } + + @Test + public void checkTwoVariableST1201() throws KlvParseException { + SDCC sdcc = new SDCC(); + sdcc.setValues(new double[][] {{3.2, 0.49}, {0.49, 16.2}}); + sdcc.setStandardDeviationLength(4); + sdcc.setStandardDeviationFormat(EncodingFormat.IEEE); + sdcc.setCorrelationCoefficientLength(3); + sdcc.setCorrelationCoefficientFormat(EncodingFormat.ST1201); + SDCCSerialiser writer = new SDCCSerialiser(); + byte[] encoded = writer.encode(sdcc); + assertEquals( + encoded, + new byte[] { + (byte) 0x02, + (byte) 0x93, + (byte) 0x04, + (byte) 0x40, + (byte) 0x4C, + (byte) 0xCC, + (byte) 0xCD, + (byte) 0x41, + (byte) 0x81, + (byte) 0x99, + (byte) 0x9a, + (byte) 0x5f, + (byte) 0x5c, + (byte) 0x28, + }); + } + + @Test + public void checkTwoVariableST1201Mode1Fallback() throws KlvParseException { + SDCC sdcc = new SDCC(); + sdcc.setValues(new double[][] {{3.2, 0.49}, {0.49, 16.2}}); + sdcc.setStandardDeviationLength(4); + sdcc.setStandardDeviationFormat(EncodingFormat.IEEE); + sdcc.setCorrelationCoefficientLength(8); + sdcc.setCorrelationCoefficientFormat(EncodingFormat.ST1201); + SDCCSerialiser writer = new SDCCSerialiser(); + writer.setSparseEnabled(false); + writer.setPreferMode1(true); + byte[] encoded = writer.encode(sdcc); + assertEquals( + encoded, + new byte[] { + (byte) 0x02, + (byte) 0x98, + (byte) 0x04, + (byte) 0x40, + (byte) 0x4C, + (byte) 0xCC, + (byte) 0xCD, + (byte) 0x41, + (byte) 0x81, + (byte) 0x99, + (byte) 0x9a, + (byte) 0x5f, + (byte) 0x5c, + (byte) 0x28, + (byte) 0xf5, + (byte) 0xc2, + (byte) 0x8f, + (byte) 0x5c, + (byte) 0x00 + }); + } + + @Test + public void checkTwoVariableIEEEDoubleCovariance() throws KlvParseException { + SDCC sdcc = new SDCC(); + sdcc.setValues(new double[][] {{3.2, 0.49}, {0.49, 16.2}}); + sdcc.setStandardDeviationLength(4); + sdcc.setStandardDeviationFormat(EncodingFormat.IEEE); + sdcc.setCorrelationCoefficientLength(8); + sdcc.setCorrelationCoefficientFormat(EncodingFormat.IEEE); + SDCCSerialiser writer = new SDCCSerialiser(); + byte[] encoded = writer.encode(sdcc); + assertEquals( + encoded, + new byte[] { + (byte) 0x02, + (byte) 0x88, + (byte) 0x04, + (byte) 0x40, + (byte) 0x4C, + (byte) 0xCC, + (byte) 0xCD, + (byte) 0x41, + (byte) 0x81, + (byte) 0x99, + (byte) 0x9A, + (byte) 0x3F, + (byte) 0xDF, + (byte) 0x5C, + (byte) 0x28, + (byte) 0xF5, + (byte) 0xC2, + (byte) 0x8F, + (byte) 0x5C + }); + } + + @Test + public void checkTwoVariableIEEEDoubleCovarianceMode1Fallback() throws KlvParseException { + SDCC sdcc = new SDCC(); + sdcc.setValues(new double[][] {{3.2, 0.49}, {0.49, 16.2}}); + sdcc.setStandardDeviationLength(4); + sdcc.setStandardDeviationFormat(EncodingFormat.IEEE); + sdcc.setCorrelationCoefficientLength(8); + sdcc.setCorrelationCoefficientFormat(EncodingFormat.IEEE); + SDCCSerialiser writer = new SDCCSerialiser(); + writer.setPreferMode1(true); + byte[] encoded = writer.encode(sdcc); + assertEquals( + encoded, + new byte[] { + (byte) 0x02, + (byte) 0x88, + (byte) 0x04, + (byte) 0x40, + (byte) 0x4C, + (byte) 0xCC, + (byte) 0xCD, + (byte) 0x41, + (byte) 0x81, + (byte) 0x99, + (byte) 0x9A, + (byte) 0x3F, + (byte) 0xDF, + (byte) 0x5C, + (byte) 0x28, + (byte) 0xF5, + (byte) 0xC2, + (byte) 0x8F, + (byte) 0x5C + }); + } + + @Test + public void checkTwoVariableMode1() throws KlvParseException { + SDCC sdcc = new SDCC(); + sdcc.setValues(new double[][] {{3.2, 0.49}, {0.49, 16.2}}); + sdcc.setStandardDeviationLength(4); + sdcc.setStandardDeviationFormat(EncodingFormat.IEEE); + sdcc.setCorrelationCoefficientLength(2); + sdcc.setCorrelationCoefficientFormat(EncodingFormat.ST1201); + SDCCSerialiser writer = new SDCCSerialiser(); + writer.setPreferMode1(true); + writer.setSparseEnabled(false); + byte[] encoded = writer.encode(sdcc); + assertEquals( + encoded, + new byte[] { + (byte) 0x02, + (byte) 0x42, + (byte) 0x40, + (byte) 0x4C, + (byte) 0xCC, + (byte) 0xCD, + (byte) 0x41, + (byte) 0x81, + (byte) 0x99, + (byte) 0x9a, + (byte) 0x5f, + (byte) 0x5c + }); + assertTrue(writer.isPreferMode1()); + } + + @Test + public void checkThreeVariableNotSparse() throws KlvParseException { + SDCC sdcc = new SDCC(); + sdcc.setValues( + new double[][] { + {3.2, 0.0, 0.49}, + {0.0, 16.2, 0.0}, + {0.49, 0.0, 234.2} + }); + sdcc.setStandardDeviationLength(4); + sdcc.setStandardDeviationFormat(EncodingFormat.IEEE); + sdcc.setCorrelationCoefficientLength(3); + sdcc.setCorrelationCoefficientFormat(EncodingFormat.ST1201); + SDCCSerialiser writer = new SDCCSerialiser(); + writer.setSparseEnabled(false); + byte[] encoded = writer.encode(sdcc); + assertEquals( + encoded, + new byte[] { + (byte) 0x03, + (byte) 0x93, + (byte) 0x04, + (byte) 0x40, + (byte) 0x4C, + (byte) 0xCC, + (byte) 0xCD, + (byte) 0x41, + (byte) 0x81, + (byte) 0x99, + (byte) 0x9a, + (byte) 0x43, + (byte) 0x6a, + (byte) 0x33, + (byte) 0x33, + (byte) 0x40, + (byte) 0x00, + (byte) 0x00, + (byte) 0x5f, + (byte) 0x5c, + (byte) 0x28, + (byte) 0x40, + (byte) 0x00, + (byte) 0x00, + }); + } + + @Test + public void checkThreeVariableSparse() throws KlvParseException { + SDCC sdcc = new SDCC(); + sdcc.setValues( + new double[][] { + {3.2, 0.0, 0.49}, + {0.0, 16.2, 0.0}, + {0.49, 0.0, 234.2} + }); + sdcc.setStandardDeviationLength(4); + sdcc.setStandardDeviationFormat(EncodingFormat.IEEE); + sdcc.setCorrelationCoefficientLength(3); + sdcc.setCorrelationCoefficientFormat(EncodingFormat.ST1201); + SDCCSerialiser writer = new SDCCSerialiser(); + writer.setSparseEnabled(true); + byte[] encoded = writer.encode(sdcc); + assertEquals( + encoded, + new byte[] { + (byte) 0x03, + (byte) 0xB3, + (byte) 0x04, + (byte) 0b01000000, + (byte) 0x40, + (byte) 0x4C, + (byte) 0xCC, + (byte) 0xCD, + (byte) 0x41, + (byte) 0x81, + (byte) 0x99, + (byte) 0x9a, + (byte) 0x43, + (byte) 0x6a, + (byte) 0x33, + (byte) 0x33, + (byte) 0x5f, + (byte) 0x5c, + (byte) 0x28 + }); + } + + @Test( + expectedExceptions = IllegalArgumentException.class, + expectedExceptionsMessageRegExp = "SDCC requires a square input array") + public void checkNonSquareValues() { + SDCC sdcc = new SDCC(); + sdcc.setValues( + new double[][] { + {3.2, 0.0, 0.49}, + {0.0, 16.2, 0.0} + }); + SDCCSerialiser writer = new SDCCSerialiser(); + writer.encode(sdcc); + } + + @Test( + expectedExceptions = IllegalArgumentException.class, + expectedExceptionsMessageRegExp = + "SDCC IEEE format length 4 and 8 is currently supported. More work required for 2 byte. Other lengths not sensible.") + public void checkIEEEBadLengthStandardDeviation() { + SDCC sdcc = new SDCC(); + sdcc.setValues(new double[][] {{3.2, 0.0, 0.49}, {0.0, 16.2, 0.0}, {0.49, 0.0, 234.2}}); + sdcc.setStandardDeviationLength(3); + sdcc.setStandardDeviationFormat(EncodingFormat.IEEE); + sdcc.setCorrelationCoefficientLength(4); + sdcc.setCorrelationCoefficientFormat(EncodingFormat.IEEE); + SDCCSerialiser writer = new SDCCSerialiser(); + writer.encode(sdcc); + } + + @Test( + expectedExceptions = IllegalArgumentException.class, + expectedExceptionsMessageRegExp = + "SDCC IEEE format length 4 and 8 is currently supported. More work required for 2 byte. Other lengths not sensible.") + public void checkIEEEBadLengthCorrelationCoefficients() { + SDCC sdcc = new SDCC(); + sdcc.setValues(new double[][] {{3.2, 0.0, 0.49}, {0.0, 16.2, 0.0}, {0.49, 0.0, 234.2}}); + sdcc.setStandardDeviationLength(4); + sdcc.setStandardDeviationFormat(EncodingFormat.IEEE); + sdcc.setCorrelationCoefficientLength(3); + sdcc.setCorrelationCoefficientFormat(EncodingFormat.IEEE); + SDCCSerialiser writer = new SDCCSerialiser(); + writer.encode(sdcc); + } + + @Test + public void checkThreeVariableSparseDefault() throws KlvParseException { + SDCC sdcc = new SDCC(); + sdcc.setValues( + new double[][] { + {3.2, 0.0, 0.49}, + {0.0, 16.2, 0.0}, + {0.49, 0.0, 234.2} + }); + sdcc.setStandardDeviationLength(4); + sdcc.setStandardDeviationFormat(EncodingFormat.IEEE); + sdcc.setCorrelationCoefficientLength(3); + sdcc.setCorrelationCoefficientFormat(EncodingFormat.ST1201); + SDCCSerialiser writer = new SDCCSerialiser(); + byte[] encoded = writer.encode(sdcc); + assertEquals( + encoded, + new byte[] { + (byte) 0x03, + (byte) 0xB3, + (byte) 0x04, + (byte) 0b01000000, + (byte) 0x40, + (byte) 0x4C, + (byte) 0xCC, + (byte) 0xCD, + (byte) 0x41, + (byte) 0x81, + (byte) 0x99, + (byte) 0x9a, + (byte) 0x43, + (byte) 0x6a, + (byte) 0x33, + (byte) 0x33, + (byte) 0x5f, + (byte) 0x5c, + (byte) 0x28 + }); + } + + @Test + public void checkFiveVariableSparse() throws KlvParseException { + SDCC sdcc = new SDCC(); + sdcc.setValues( + new double[][] { + {3.2, 0.0, 0.49, 0.0, 0.0}, + {0.0, 16.2, 0.0, 0.0, 0.0}, + {0.49, 0.0, 234.2, 0.0, 1.0}, + {0.0, 0.0, 0.0, 0.32, 0.0}, + {0.0, 0.0, 1.0, 0.0, 6.3} + }); + sdcc.setStandardDeviationLength(4); + sdcc.setStandardDeviationFormat(EncodingFormat.IEEE); + sdcc.setCorrelationCoefficientLength(3); + sdcc.setCorrelationCoefficientFormat(EncodingFormat.ST1201); + SDCCSerialiser writer = new SDCCSerialiser(); + byte[] encoded = writer.encode(sdcc); + assertEquals( + encoded, + new byte[] { + (byte) 0x05, + (byte) 0xB3, + (byte) 0x04, + (byte) 0b01000000, + (byte) 0b10000000, + (byte) 0x40, + (byte) 0x4C, + (byte) 0xCC, + (byte) 0xCD, + (byte) 0x41, + (byte) 0x81, + (byte) 0x99, + (byte) 0x9a, + (byte) 0x43, + (byte) 0x6a, + (byte) 0x33, + (byte) 0x33, + (byte) 0x3e, + (byte) 0xa3, + (byte) 0xd7, + (byte) 0x0a, + (byte) 0x40, + (byte) 0xc9, + (byte) 0x99, + (byte) 0x9a, + (byte) 0x5f, + (byte) 0x5c, + (byte) 0x28, + (byte) 0x80, + (byte) 0x00, + (byte) 0x00 + }); + } + + @Test + public void checkFiveVariableSparseMode1() throws KlvParseException { + SDCC sdcc = new SDCC(); + sdcc.setValues( + new double[][] { + {3.2, 0.0, 0.49, 0.0, 0.0}, + {0.0, 16.2, 0.0, 0.0, 0.0}, + {0.49, 0.0, 234.2, 0.0, 1.0}, + {0.0, 0.0, 0.0, 0.32, 0.0}, + {0.0, 0.0, 1.0, 0.0, 6.3} + }); + sdcc.setStandardDeviationLength(4); + sdcc.setStandardDeviationFormat(EncodingFormat.IEEE); + sdcc.setCorrelationCoefficientLength(3); + sdcc.setCorrelationCoefficientFormat(EncodingFormat.ST1201); + SDCCSerialiser writer = new SDCCSerialiser(); + writer.setPreferMode1(true); + byte[] encoded = writer.encode(sdcc); + assertEquals( + encoded, + new byte[] { + (byte) 0x05, + (byte) 0x4B, + (byte) 0b01000000, + (byte) 0b10000000, + (byte) 0x40, + (byte) 0x4C, + (byte) 0xCC, + (byte) 0xCD, + (byte) 0x41, + (byte) 0x81, + (byte) 0x99, + (byte) 0x9a, + (byte) 0x43, + (byte) 0x6a, + (byte) 0x33, + (byte) 0x33, + (byte) 0x3e, + (byte) 0xa3, + (byte) 0xd7, + (byte) 0x0a, + (byte) 0x40, + (byte) 0xc9, + (byte) 0x99, + (byte) 0x9a, + (byte) 0x5f, + (byte) 0x5c, + (byte) 0x28, + (byte) 0x80, + (byte) 0x00, + (byte) 0x00 + }); + } +} diff --git a/st1010/testng-unit.xml b/st1010/testng-unit.xml new file mode 100644 index 000000000..0c28a01b9 --- /dev/null +++ b/st1010/testng-unit.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/st1202/SpotBugsFilter.xml b/st1202/SpotBugsFilter.xml new file mode 100644 index 000000000..5e55494a7 --- /dev/null +++ b/st1202/SpotBugsFilter.xml @@ -0,0 +1,3 @@ + + + diff --git a/st1202/checkstyle.xml b/st1202/checkstyle.xml new file mode 100644 index 000000000..41e751804 --- /dev/null +++ b/st1202/checkstyle.xml @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/st1202/checkstyle_suppressions.xml b/st1202/checkstyle_suppressions.xml new file mode 100644 index 000000000..97784b708 --- /dev/null +++ b/st1202/checkstyle_suppressions.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/st1202/pom.xml b/st1202/pom.xml new file mode 100644 index 000000000..f74bc1dd1 --- /dev/null +++ b/st1202/pom.xml @@ -0,0 +1,97 @@ + + + 4.0.0 + + org.jmisb + jmisb + 2.0.0-SNAPSHOT + + st1202 + jar + ST 1202 Generalized Transformation Parameters + + + ${project.groupId} + jmisb-api + ${project.version} + + + ${project.groupId} + st1010 + ${project.version} + + + org.slf4j + slf4j-api + + + org.testng + testng + test + + + com.github.valfirst + slf4j-test + test + + + + + + + com.theoryinpractise + googleformatter-maven-plugin + + + org.apache.maven.plugins + maven-surefire-plugin + + + testng-unit.xml + + + + surefire.testng.verbose + ${surefire.verbosity} + + + + + + com.github.spotbugs + spotbugs-maven-plugin + + SpotBugsFilter.xml + + + + org.apache.maven.plugins + maven-checkstyle-plugin + + + edu.berkeley.cs.jqf + jqf-maven-plugin + + + + + + + generate-sbom-cyclonedx + + + performRelease + true + + + + + + org.cyclonedx + cyclonedx-maven-plugin + + + + + + \ No newline at end of file diff --git a/st1202/src/main/java/module-info.java b/st1202/src/main/java/module-info.java new file mode 100644 index 000000000..d27c9343f --- /dev/null +++ b/st1202/src/main/java/module-info.java @@ -0,0 +1,28 @@ +/** + * MISB ST 1202.2 Generalized Transformation Parameters. + * + *

This standard describes a generalized method of transforming two-dimensional data (or points) + * from one coordinate system into a second two-dimensional coordinate system. This Generalized + * Transformation may be used for various image-to-image transformations such as an affine + * transformation by simply equating some parameters to be equal to zero. In addition, this + * Generalized Transformation may describe some homographic-like transformations. + * + *

This standard defines three items: + * + *

+ */ +@SuppressWarnings("module") // That is not a version number - its a document number. +module org.jmisb.st1202 { + requires org.jmisb.api; + requires org.jmisb.st1010; + requires org.slf4j; + + exports org.jmisb.st1202; +} diff --git a/st1202/src/main/java/org/jmisb/st1202/AbstractGeneralizedTransformationMetadataValue.java b/st1202/src/main/java/org/jmisb/st1202/AbstractGeneralizedTransformationMetadataValue.java new file mode 100644 index 000000000..7af8ace13 --- /dev/null +++ b/st1202/src/main/java/org/jmisb/st1202/AbstractGeneralizedTransformationMetadataValue.java @@ -0,0 +1,69 @@ +package org.jmisb.st1202; + +import org.jmisb.api.common.KlvParseException; +import org.jmisb.core.klv.PrimitiveConverter; + +/** + * Abstract shared representation for 4 byte float values. + * + *

Since so much of the local set is common, this is a single representation. + */ +public abstract class AbstractGeneralizedTransformationMetadataValue + implements IGeneralizedTransformationMetadataValue { + + private final float value; + private final String displayName; + + /** + * Create from value. + * + * @param value the value as a float. + * @param displayName the human-readable display name for the value + */ + protected AbstractGeneralizedTransformationMetadataValue( + final float value, final String displayName) { + this.value = value; + this.displayName = displayName; + } + + /** + * Create from encoded bytes. + * + * @param bytes Encoded byte array of length 4 + * @param displayName the human-readable display name for the value + * @throws KlvParseException if the byte array is not of the correct length + */ + protected AbstractGeneralizedTransformationMetadataValue(byte[] bytes, final String displayName) + throws KlvParseException { + try { + this.value = PrimitiveConverter.toFloat32(bytes); + this.displayName = displayName; + } catch (IllegalArgumentException ex) { + throw new KlvParseException(getDisplayName() + " is of length 4 bytes"); + } + } + + @Override + public final String getDisplayName() { + return displayName; + } + + /** + * Get the value. + * + * @return value as a floating point value. + */ + public float getValue() { + return this.value; + } + + @Override + public byte[] getBytes() { + return PrimitiveConverter.float32ToBytes(value); + } + + @Override + public String getDisplayableValue() { + return String.format("%.3f", this.value); + } +} diff --git a/st1202/src/main/java/org/jmisb/st1202/Denominator_X.java b/st1202/src/main/java/org/jmisb/st1202/Denominator_X.java new file mode 100644 index 000000000..8ea3926ae --- /dev/null +++ b/st1202/src/main/java/org/jmisb/st1202/Denominator_X.java @@ -0,0 +1,28 @@ +package org.jmisb.st1202; + +import org.jmisb.api.common.KlvParseException; + +/** Denominator - x factor (ST 1202 Local Set Item 7). */ +public class Denominator_X extends AbstractGeneralizedTransformationMetadataValue { + + private static final String DISPLAY_NAME = "Denominator - x factor"; + + /** + * Create from value. + * + * @param value the value as a float. + */ + public Denominator_X(float value) { + super(value, DISPLAY_NAME); + } + + /** + * Create from encoded bytes. + * + * @param bytes Encoded byte array of length 4 + * @throws KlvParseException if the byte array is not of the correct length + */ + public Denominator_X(byte[] bytes) throws KlvParseException { + super(bytes, DISPLAY_NAME); + } +} diff --git a/st1202/src/main/java/org/jmisb/st1202/Denominator_Y.java b/st1202/src/main/java/org/jmisb/st1202/Denominator_Y.java new file mode 100644 index 000000000..3decf444a --- /dev/null +++ b/st1202/src/main/java/org/jmisb/st1202/Denominator_Y.java @@ -0,0 +1,28 @@ +package org.jmisb.st1202; + +import org.jmisb.api.common.KlvParseException; + +/** Denominator - y factor (ST 1202 Local Set Item 8). */ +public class Denominator_Y extends AbstractGeneralizedTransformationMetadataValue { + + private static final String DISPLAY_NAME = "Denominator - y factor"; + + /** + * Create from value. + * + * @param value the value as a float. + */ + public Denominator_Y(float value) { + super(value, DISPLAY_NAME); + } + + /** + * Create from encoded bytes. + * + * @param bytes Encoded byte array of length 4 + * @throws KlvParseException if the byte array is not of the correct length + */ + public Denominator_Y(byte[] bytes) throws KlvParseException { + super(bytes, DISPLAY_NAME); + } +} diff --git a/st1202/src/main/java/org/jmisb/st1202/GeneralizedTransformationLocalSet.java b/st1202/src/main/java/org/jmisb/st1202/GeneralizedTransformationLocalSet.java new file mode 100644 index 000000000..13e9fcba8 --- /dev/null +++ b/st1202/src/main/java/org/jmisb/st1202/GeneralizedTransformationLocalSet.java @@ -0,0 +1,156 @@ +package org.jmisb.st1202; + +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.SortedMap; +import java.util.TreeMap; +import org.jmisb.api.common.KlvParseException; +import org.jmisb.api.klv.ArrayBuilder; +import org.jmisb.api.klv.IKlvKey; +import org.jmisb.api.klv.IMisbMessage; +import org.jmisb.api.klv.LdsField; +import org.jmisb.api.klv.LdsParser; +import org.jmisb.api.klv.UniversalLabel; +import org.jmisb.st1010.SDCC; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Generalized Transformation Local Set. + * + *

This is the core ST 1202 Local Set. + */ +public class GeneralizedTransformationLocalSet implements IMisbMessage { + + /** + * Universal label for Generalized Transformation Local Set. + * + *

See ST 1202.2 Table 2. + */ + public static final UniversalLabel GeneralizedTransformationLocalSetUl = + new UniversalLabel( + new byte[] { + 0x06, 0x0E, 0x2B, 0x34, 0x02, 0x0B, 0x01, 0x01, 0x0E, 0x01, 0x03, 0x05, + 0x05, 0x00, 0x00, 0x00 + }); + + private static final Logger LOGGER = + LoggerFactory.getLogger(GeneralizedTransformationLocalSet.class); + + /** + * Create a {@link IGeneralizedTransformationMetadataValue} instance from encoded bytes. + * + * @param tag The tag defining the value type + * @param bytes Encoded bytes + * @return The new instance + * @throws KlvParseException if the parsing of the encoded bytes fails + */ + static IGeneralizedTransformationMetadataValue createValue( + GeneralizedTransformationParametersKey tag, byte[] bytes) throws KlvParseException { + switch (tag) { + case X_Numerator_x: + return new X_Numerator_X(bytes); + case X_Numerator_y: + return new X_Numerator_Y(bytes); + case X_Numerator_Constant: + return new X_Numerator_Constant(bytes); + case Y_Numerator_x: + return new Y_Numerator_X(bytes); + case Y_Numerator_y: + return new Y_Numerator_Y(bytes); + case Y_Numerator_Constant: + return new Y_Numerator_Constant(bytes); + case Denominator_x: + return new Denominator_X(bytes); + case Denominator_y: + return new Denominator_Y(bytes); + case SDCC: + return new SDCC_FLP(bytes); + case DocumentVersion: + return new ST1202DocumentVersion(bytes); + case TransformationEnumeration: + return TransformationEnumeration.fromBytes(bytes); + default: + LOGGER.info("Unknown Generalized Transformation Metadata tag: {}", tag); + } + return null; + } + + /** Map containing all elements in the message. */ + private final SortedMap< + GeneralizedTransformationParametersKey, IGeneralizedTransformationMetadataValue> + map = new TreeMap<>(); + + /** + * Create the local set from the given key/value pairs. + * + * @param values Tag/value pairs to be included in the local set + */ + public GeneralizedTransformationLocalSet( + Map + values) { + map.putAll(values); + } + + /** + * Build a Generalized Transformation Local Set from encoded bytes. + * + *

This assumes the byte array is always nested (see requirement ST 1202.1-09). + * + * @param bytes the bytes to build from + * @throws KlvParseException if parsing fails + */ + public GeneralizedTransformationLocalSet(final byte[] bytes) throws KlvParseException { + List fields = LdsParser.parseFields(bytes, 0, bytes.length); + for (LdsField field : fields) { + GeneralizedTransformationParametersKey key = + GeneralizedTransformationParametersKey.getKey(field.getTag()); + switch (key) { + case Undefined: + LOGGER.info("Unknown Generalized Transformation tag: {}", field.getTag()); + break; + default: + IGeneralizedTransformationMetadataValue value = + createValue(key, field.getData()); + map.put(key, value); + } + } + } + + @Override + public byte[] frameMessage(boolean isNested) { + if (!isNested) { + throw new IllegalArgumentException( + "Generalized Tranformation Local Set must be nested"); + } + ArrayBuilder builder = new ArrayBuilder(); + for (GeneralizedTransformationParametersKey tag : map.keySet()) { + builder.appendAsOID(tag.getIdentifier()); + byte[] valueBytes = getField(tag).getBytes(); + builder.appendAsBerLength(valueBytes.length); + builder.append(valueBytes); + } + return builder.toBytes(); + } + + @Override + public Set getIdentifiers() { + return map.keySet(); + } + + @Override + public IGeneralizedTransformationMetadataValue getField(IKlvKey key) { + return map.get((GeneralizedTransformationParametersKey) key); + } + + @Override + public UniversalLabel getUniversalLabel() { + return GeneralizedTransformationLocalSetUl; + } + + @Override + public String displayHeader() { + return "ST 1202 Generalized Transformation Local Set"; + } +} diff --git a/st1202/src/main/java/org/jmisb/st1202/GeneralizedTransformationParametersKey.java b/st1202/src/main/java/org/jmisb/st1202/GeneralizedTransformationParametersKey.java new file mode 100644 index 000000000..c8fc695e7 --- /dev/null +++ b/st1202/src/main/java/org/jmisb/st1202/GeneralizedTransformationParametersKey.java @@ -0,0 +1,148 @@ +package org.jmisb.st1202; + +import java.util.HashMap; +import java.util.Map; +import org.jmisb.api.klv.IKlvKey; + +/** + * ST 1202 tags - description and numbers. + * + *

This enumeration maps the Generalized Transformation Local Set tag values to a name, and names + * to tag values. It conceptually corresponds to the Tag ID and Name columns in ST 1202.2 Table 2. + */ +public enum GeneralizedTransformationParametersKey implements IKlvKey { + /** + * Unknown key. + * + *

This should not be created. It does not correspond to any known ST 1202 tag / key. + */ + Undefined(0), + + /** + * x Equation Numerator - x factor. + * + *

ST 1202 Local Set Tag 1. + * + *

This is {code A} in ST 1202.2 Equation 1. + */ + X_Numerator_x(1), + + /** + * x Equation Numerator - y factor. + * + *

ST 1202 Local Set Tag 2. + * + *

This is {code B} in ST 1202.2 Equation 1. + */ + X_Numerator_y(2), + + /** + * x Equation Numerator - constant factor. + * + *

ST 1202 Local Set Tag 3. + * + *

This is {code C} in ST 1202.2 Equation 1. + */ + X_Numerator_Constant(3), + + /** + * y Equation Numerator - x factor. + * + *

ST 1202 Local Set Tag 4. + * + *

This is {code D} in ST 1202.2 Equation 2. + */ + Y_Numerator_x(4), + + /** + * y Equation Numerator - y factor. + * + *

ST 1202 Local Set Tag 5. + * + *

This is {code E} in ST 1202.2 Equation 2. + */ + Y_Numerator_y(5), + + /** + * y Equation Numerator - constant factor. + * + *

ST 1202 Local Set Tag 6. + * + *

This is {code F} in ST 1202.2 Equation 2. + */ + Y_Numerator_Constant(6), + + /** + * Denominator - x factor. + * + *

ST 1202 Local Set Tag 7. + * + *

This is {code G} in ST 1202.2 Equations 1 and 2. + */ + Denominator_x(7), + + /** + * Denominator - y factor. + * + *

ST 1202 Local Set Tag 8. + * + *

This is {code H} in ST 1202.2 Equations 1 and 2. + */ + Denominator_y(8), + + /** + * Standard Deviation and Correlation Coefficients (SDCC). + * + *

ST 1202 Local Set Tag 9. + */ + SDCC(9), + + /** + * Document Version. + * + *

ST 1202 Local Set Tag 10. + */ + DocumentVersion(10), + + /** + * Transformation Enumeration. + * + *

ST 1202 Local Set Tag 11. + */ + TransformationEnumeration(11); + + private final int tag; + + private static final Map tagTable = + new HashMap<>(); + + static { + for (GeneralizedTransformationParametersKey key : values()) { + tagTable.put(key.tag, key); + } + } + + private GeneralizedTransformationParametersKey(int tag) { + this.tag = tag; + } + + /** + * Get the tag value associated with this enumeration value. + * + * @return integer tag value for the local set identifier + */ + @Override + public int getIdentifier() { + return tag; + } + + /** + * Look up the key by tag identifier. + * + * @param tag the integer tag value to look up + * @return corresponding local set key + */ + public static GeneralizedTransformationParametersKey getKey(int tag) { + return tagTable.getOrDefault(tag, Undefined); + } +} diff --git a/st1202/src/main/java/org/jmisb/st1202/IGeneralizedTransformationMetadataValue.java b/st1202/src/main/java/org/jmisb/st1202/IGeneralizedTransformationMetadataValue.java new file mode 100644 index 000000000..b8b0254c7 --- /dev/null +++ b/st1202/src/main/java/org/jmisb/st1202/IGeneralizedTransformationMetadataValue.java @@ -0,0 +1,19 @@ +package org.jmisb.st1202; + +import org.jmisb.api.klv.IKlvValue; + +/** + * ST 1202 Generalized Transformation Local Set value. + * + *

All Generalized Transformation Local Set values implement this interface. Users are unlikely + * to need to implement this interface. Instead, use one of the implementations either directly, or + * via the Local Set implementation. + */ +public interface IGeneralizedTransformationMetadataValue extends IKlvValue { + /** + * Get the encoded bytes. + * + * @return The encoded byte array + */ + byte[] getBytes(); +} diff --git a/st1202/src/main/java/org/jmisb/st1202/SDCC_FLP.java b/st1202/src/main/java/org/jmisb/st1202/SDCC_FLP.java new file mode 100644 index 000000000..829972b46 --- /dev/null +++ b/st1202/src/main/java/org/jmisb/st1202/SDCC_FLP.java @@ -0,0 +1,91 @@ +package org.jmisb.st1202; + +import java.util.Set; +import org.jmisb.api.common.KlvParseException; +import org.jmisb.api.klv.IKlvKey; +import org.jmisb.api.klv.IKlvValue; +import org.jmisb.api.klv.INestedKlvValue; +import org.jmisb.st1010.SDCC; +import org.jmisb.st1010.SDCCParser; +import org.jmisb.st1010.SDCCSerialiser; + +/** + * Standard Deviation and Correlation Coefficient (SDCC) Floating Length Pack (FLP). + * + *

In many applications, the knowledge of the uncertainty of all estimated values is critical to + * understand the performance of a system. Thus, it is desirable to provide a means to propagate the + * uncertainty information of the transformation parameters. The Generalized Transformation LS + * utilizes the format described in MISB ST 1010 for transmitting the standard deviation and + * correlation coefficient information. + */ +public class SDCC_FLP implements IGeneralizedTransformationMetadataValue, INestedKlvValue { + + /** Underlying SDCC value. */ + private SDCC sdcc; + + /** + * Construct from value. + * + * @param value the SDCC instance to copy values from + */ + public SDCC_FLP(final SDCC value) { + this.sdcc = new SDCC(value); + } + /** + * Construct from encoded bytes. + * + * @param bytes encoded byte array, per ST 1010. + * @throws KlvParseException if parsing fails + */ + public SDCC_FLP(byte[] bytes) throws KlvParseException { + SDCCParser parser = new SDCCParser(); + this.sdcc = parser.parse(bytes); + } + + @Override + public byte[] getBytes() { + SDCCSerialiser serialiser = new SDCCSerialiser(); + serialiser.setPreferMode1(true); + serialiser.setSparseEnabled(false); + return serialiser.encode(sdcc); + } + + @Override + public String getDisplayName() { + return "Standard Deviation and Correlation Coefficients"; + } + + @Override + public String getDisplayableValue() { + // TODO: see if we can do better + return "[SDCC]"; + } + + /** + * Get the standard deviation and correlation coefficient object. + * + * @return copy of the ST 1010 SDCC object. + */ + public SDCC getSDCC() { + return new SDCC(sdcc); + } + + /** + * Get the standard deviation and correlation coefficient matrix. + * + * @return copy of the ST 1010 SDCC values matrix. + */ + public double[][] getSDCCMatrix() { + return sdcc.getValues(); + } + + @Override + public IKlvValue getField(IKlvKey identifier) { + return sdcc.getField(identifier); + } + + @Override + public Set getIdentifiers() { + return sdcc.getIdentifiers(); + } +} diff --git a/st1202/src/main/java/org/jmisb/st1202/ST1202DocumentVersion.java b/st1202/src/main/java/org/jmisb/st1202/ST1202DocumentVersion.java new file mode 100644 index 000000000..d7044c01d --- /dev/null +++ b/st1202/src/main/java/org/jmisb/st1202/ST1202DocumentVersion.java @@ -0,0 +1,78 @@ +package org.jmisb.st1202; + +import org.jmisb.core.klv.PrimitiveConverter; + +/** + * ST 1202 Document Version (ST 1202 Generalized Transformation Local Set Tag 10). + * + *

The version number is the same of the minor version number of the standard document. For + * example, with MISB ST 1202.1, the version number value is {@code 1} and with ST 1202.2, the + * version number value is {@code 2}. + * + *

This implementation assumes the document version is UINT8 encoded - the standard states + * BER-OID encoded, but also states 1 byte, and a valid range of 0 to 255. That is inconsistent, + * although it makes no practical difference for feasible version numbers. MISB have indicated that + * a future update (assuming there ever is one) to ST 1202 would change this to UINT8. + */ +public class ST1202DocumentVersion implements IGeneralizedTransformationMetadataValue { + + private final int version; + + /** + * The currently supported revision is 1202.2. + * + *

This may be useful in the constructor. + */ + public static final short ST_VERSION_NUMBER = 2; + + /** + * Create from value. + * + *

The current version is available as {@link #ST_VERSION_NUMBER}. + * + * @param versionNumber The version number + */ + public ST1202DocumentVersion(int versionNumber) { + if (versionNumber < 0) { + throw new IllegalArgumentException("ST 1202 Document Version cannot be negative"); + } + this.version = versionNumber; + } + + /** + * Create from encoded bytes. + * + * @param bytes Byte array containing UINT8 formatted version number + */ + public ST1202DocumentVersion(byte[] bytes) { + this.version = PrimitiveConverter.toUint8(bytes); + } + + /** + * Get the document version number. + * + * @return The version number + */ + public int getVersion() { + return version; + } + + @Override + public byte[] getBytes() { + return PrimitiveConverter.uint8ToBytes((short) version); + } + + @Override + public String getDisplayName() { + return "Document Version"; + } + + @Override + public String getDisplayableValue() { + if (version == 0) { + return "ST 1202"; + } else { + return "ST 1202." + version; + } + } +} diff --git a/st1202/src/main/java/org/jmisb/st1202/TransformationEnumeration.java b/st1202/src/main/java/org/jmisb/st1202/TransformationEnumeration.java new file mode 100644 index 000000000..af768f802 --- /dev/null +++ b/st1202/src/main/java/org/jmisb/st1202/TransformationEnumeration.java @@ -0,0 +1,157 @@ +package org.jmisb.st1202; + +import org.jmisb.api.common.KlvParseException; + +/** Transformation type enumeration. */ +public enum TransformationEnumeration implements IGeneralizedTransformationMetadataValue { + /** + * Unknown value. + * + *

This is not a valid enumeration value, and typically indicates a problem with decoding + * (e.g. bad data or implementation bug). + */ + UNKNOWN(-1, "UNKNOWN", ""), + + /** + * Other – No Defined Transformation. + * + *

An enumeration value equal to {@code 0} implies the transformation type is not defined; + * however, this does not prevent the user from exploiting the information contained within the + * Generalized Transformation LS. + */ + OTHER(0, "Other - No Defined Transformation (NDT)", ""), + + /** + * Chipping Transformation. + * + *

An enumeration value equal to {@code 1} signifies the transmitted image is a chip (or + * sub-region) from a larger image. Examples of a chipped image are: 1) a sub-region of an image + * that may be digitally enlarged (zoom); 2) a sub-region of an image selected to reduce + * bandwidth, or to provide higher quality within the sub-region. + */ + CHIPPING(1, "Chipping Transformation (CT)", "px"), + + /** + * Child-Parent Transformation. + * + *

An enumeration value equal to {@code 2} indicates the transformation of a child focal + * plane array (FPA) to its parent FPA (e.g. example defined in MISB ST 1002). This CPT is a + * plane-to-plane transformation used to transform between FPA's in image space. + */ + CHILD_PARENT(2, "Child-Parent Transformation (CPT)", "mm"), + + /** + * Default Pixel-Space to Image-Space Transformation. + * + *

An enumeration value equal to {@code 3} is the default pixel-space to image-space + * transformation. + */ + DPIT(3, "Default Pixel-Space to Image-Space Transformation (DPIT)", "mm"), + + /** + * Optical Transformation. + * + *

An enumeration value equal to {@code 4} indicates the pixel data of an image is a + * translation, rotation, scale or skew from the originating FPA to final optical focal plane. + * This may occur when the originating FPA is a subset of an entire optical focal plane. An + * example is a Combined Composite Focal Plane Array (CCFPA) sensor, where multiple focal plane + * array detectors combine to image a single optical focal plane. This optical transformation is + * a plane-to-plane transformation to transform from FPA to the optical image plane. In addition + * to providing a transformation from FPA to CCFPA, the optical transformation may also support + * the effects of Coudé paths or Fast Steering Mirrors (FSM). Coudé path and FSM effects may + * mimic that of the transformation between FPA and CCFPA. They may also differ, however, by + * translating, rotating, scaling or skewing the optical image plane. + */ + OPTICAL(4, "Optical Transformation (OT)", "mm"); + + /** + * Get the enumeration value for a byte array. + * + * @param bytes the byte array, length 1 + * @return the corresponding enumeration value, or UNKNOWN if there is no matching enumeration + * value. + * @throws KlvParseException if the parsing fails (e.g. wrong length byte array) + */ + static TransformationEnumeration fromBytes(byte[] bytes) throws KlvParseException { + if (bytes.length != 1) { + throw new KlvParseException( + "Transformation Enumeration should be encoded as a 1 byte array"); + } + int value = bytes[0]; + return TransformationEnumeration.lookup(value); + } + + /** + * Look up enumeration value by encoded value. + * + * @param value the encoded (integer) value + * @return the corresponding enumeration value, or UNKNOWN if the value did not match any entry + */ + public static TransformationEnumeration lookup(int value) { + for (TransformationEnumeration transformationType : values()) { + if (transformationType.getEncodedValue() == value) { + return transformationType; + } + } + return UNKNOWN; + } + + private final int encodedValue; + private final String description; + private final String units; + + private TransformationEnumeration( + final int encodedValue, final String description, final String units) { + this.encodedValue = encodedValue; + this.description = description; + this.units = units; + } + + @Override + public byte[] getBytes() { + if (this == UNKNOWN) { + throw new IllegalArgumentException( + "Cannot serialise UNKNOWN Transformation Enumeration"); + } + return new byte[] {(byte) encodedValue}; + } + + @Override + public String getDisplayName() { + return "Transformation Enumeration"; + } + + @Override + public String getDisplayableValue() { + return description; + } + + /** + * Encoded value. + * + * @return integer encoded value for the enumeration + */ + public int getEncodedValue() { + return encodedValue; + } + + /** + * Text description. + * + * @return String containing human-readable enumeration description. + */ + public String getDescription() { + return description; + } + + /** + * Transformation units. + * + *

The transformation units as provided in ST 1202.2 Table 1. + * + * @return units as a text string (blank if "None"). + */ + public String getUnits() { + return units; + } +} diff --git a/st1202/src/main/java/org/jmisb/st1202/X_Numerator_Constant.java b/st1202/src/main/java/org/jmisb/st1202/X_Numerator_Constant.java new file mode 100644 index 000000000..d8560b8d9 --- /dev/null +++ b/st1202/src/main/java/org/jmisb/st1202/X_Numerator_Constant.java @@ -0,0 +1,28 @@ +package org.jmisb.st1202; + +import org.jmisb.api.common.KlvParseException; + +/** x Equation Numerator - Constant factor (ST 1202 Local Set Item 3). */ +public class X_Numerator_Constant extends AbstractGeneralizedTransformationMetadataValue { + + private static final String DISPLAY_NAME = "x Equation Numerator - Constant factor"; + + /** + * Create from value. + * + * @param value the value as a float. + */ + public X_Numerator_Constant(float value) { + super(value, DISPLAY_NAME); + } + + /** + * Create from encoded bytes. + * + * @param bytes Encoded byte array of length 4 + * @throws KlvParseException if the byte array is not of the correct length + */ + public X_Numerator_Constant(byte[] bytes) throws KlvParseException { + super(bytes, DISPLAY_NAME); + } +} diff --git a/st1202/src/main/java/org/jmisb/st1202/X_Numerator_X.java b/st1202/src/main/java/org/jmisb/st1202/X_Numerator_X.java new file mode 100644 index 000000000..cd3f4bf5e --- /dev/null +++ b/st1202/src/main/java/org/jmisb/st1202/X_Numerator_X.java @@ -0,0 +1,28 @@ +package org.jmisb.st1202; + +import org.jmisb.api.common.KlvParseException; + +/** x Equation Numerator - x factor (ST 1202 Local Set Item 1). */ +public class X_Numerator_X extends AbstractGeneralizedTransformationMetadataValue { + + private static final String DISPLAY_NAME = "x Equation Numerator - x factor"; + + /** + * Create from value. + * + * @param value the value as a float. + */ + public X_Numerator_X(float value) { + super(value, DISPLAY_NAME); + } + + /** + * Create from encoded bytes. + * + * @param bytes Encoded byte array of length 4 + * @throws KlvParseException if the byte array is not of the correct length + */ + public X_Numerator_X(byte[] bytes) throws KlvParseException { + super(bytes, DISPLAY_NAME); + } +} diff --git a/st1202/src/main/java/org/jmisb/st1202/X_Numerator_Y.java b/st1202/src/main/java/org/jmisb/st1202/X_Numerator_Y.java new file mode 100644 index 000000000..a4d0ed074 --- /dev/null +++ b/st1202/src/main/java/org/jmisb/st1202/X_Numerator_Y.java @@ -0,0 +1,28 @@ +package org.jmisb.st1202; + +import org.jmisb.api.common.KlvParseException; + +/** x Equation Numerator - y factor (ST 1202 Local Set Item 2). */ +public class X_Numerator_Y extends AbstractGeneralizedTransformationMetadataValue { + + private static final String DISPLAY_NAME = "x Equation Numerator - y factor"; + + /** + * Create from value. + * + * @param value the value as a float. + */ + public X_Numerator_Y(float value) { + super(value, DISPLAY_NAME); + } + + /** + * Create from encoded bytes. + * + * @param bytes Encoded byte array of length 4 + * @throws KlvParseException if the byte array is not of the correct length + */ + public X_Numerator_Y(byte[] bytes) throws KlvParseException { + super(bytes, DISPLAY_NAME); + } +} diff --git a/st1202/src/main/java/org/jmisb/st1202/Y_Numerator_Constant.java b/st1202/src/main/java/org/jmisb/st1202/Y_Numerator_Constant.java new file mode 100644 index 000000000..5242c141b --- /dev/null +++ b/st1202/src/main/java/org/jmisb/st1202/Y_Numerator_Constant.java @@ -0,0 +1,28 @@ +package org.jmisb.st1202; + +import org.jmisb.api.common.KlvParseException; + +/** y Equation Numerator - Constant factor (ST 1202 Local Set Item 6). */ +public class Y_Numerator_Constant extends AbstractGeneralizedTransformationMetadataValue { + + private static final String DISPLAY_NAME = "y Equation Numerator - Constant factor"; + + /** + * Create from value. + * + * @param value the value as a float. + */ + public Y_Numerator_Constant(float value) { + super(value, DISPLAY_NAME); + } + + /** + * Create from encoded bytes. + * + * @param bytes Encoded byte array of length 4 + * @throws KlvParseException if the byte array is not of the correct length + */ + public Y_Numerator_Constant(byte[] bytes) throws KlvParseException { + super(bytes, DISPLAY_NAME); + } +} diff --git a/st1202/src/main/java/org/jmisb/st1202/Y_Numerator_X.java b/st1202/src/main/java/org/jmisb/st1202/Y_Numerator_X.java new file mode 100644 index 000000000..cd62ce6ca --- /dev/null +++ b/st1202/src/main/java/org/jmisb/st1202/Y_Numerator_X.java @@ -0,0 +1,28 @@ +package org.jmisb.st1202; + +import org.jmisb.api.common.KlvParseException; + +/** y Equation Numerator - x factor (ST 1202 Local Set Item 4). */ +public class Y_Numerator_X extends AbstractGeneralizedTransformationMetadataValue { + + private static final String DISPLAY_NAME = "y Equation Numerator - x factor"; + + /** + * Create from value. + * + * @param value the value as a float. + */ + public Y_Numerator_X(float value) { + super(value, DISPLAY_NAME); + } + + /** + * Create from encoded bytes. + * + * @param bytes Encoded byte array of length 4 + * @throws KlvParseException if the byte array is not of the correct length + */ + public Y_Numerator_X(byte[] bytes) throws KlvParseException { + super(bytes, DISPLAY_NAME); + } +} diff --git a/st1202/src/main/java/org/jmisb/st1202/Y_Numerator_Y.java b/st1202/src/main/java/org/jmisb/st1202/Y_Numerator_Y.java new file mode 100644 index 000000000..ea1ec41a0 --- /dev/null +++ b/st1202/src/main/java/org/jmisb/st1202/Y_Numerator_Y.java @@ -0,0 +1,28 @@ +package org.jmisb.st1202; + +import org.jmisb.api.common.KlvParseException; + +/** y Equation Numerator - y factor (ST 1202 Local Set Item 5). */ +public class Y_Numerator_Y extends AbstractGeneralizedTransformationMetadataValue { + + private static final String DISPLAY_NAME = "y Equation Numerator - y factor"; + + /** + * Create from value. + * + * @param value the value as a float. + */ + public Y_Numerator_Y(float value) { + super(value, DISPLAY_NAME); + } + + /** + * Create from encoded bytes. + * + * @param bytes Encoded byte array of length 4 + * @throws KlvParseException if the byte array is not of the correct length + */ + public Y_Numerator_Y(byte[] bytes) throws KlvParseException { + super(bytes, DISPLAY_NAME); + } +} diff --git a/st1202/src/main/java/org/jmisb/st1202/package-info.java b/st1202/src/main/java/org/jmisb/st1202/package-info.java new file mode 100644 index 000000000..34174d2b2 --- /dev/null +++ b/st1202/src/main/java/org/jmisb/st1202/package-info.java @@ -0,0 +1,10 @@ +/** + * MISB ST 1202.2 Generalized Transformation Parameters. + * + *

This standard describes a generalized method of transforming two-dimensional data (or points) + * from one coordinate system into a second two-dimensional coordinate system. This Generalized + * Transformation may be used for various image-to-image transformations such as an affine + * transformation by simply equating some parameters to be equal to zero. In addition, this + * Generalized Transformation may describe some homographic-like transformations. + */ +package org.jmisb.st1202; diff --git a/st1202/src/test/java/org/jmisb/st1202/Denominator_X_Test.java b/st1202/src/test/java/org/jmisb/st1202/Denominator_X_Test.java new file mode 100644 index 000000000..455ed191e --- /dev/null +++ b/st1202/src/test/java/org/jmisb/st1202/Denominator_X_Test.java @@ -0,0 +1,62 @@ +package org.jmisb.st1202; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; + +import org.jmisb.api.common.KlvParseException; +import org.testng.annotations.Test; + +/** Tests for Denominator_X. */ +public class Denominator_X_Test { + + @Test + public void fromValue() { + Denominator_X uut = new Denominator_X(0.0f); + assertEquals(uut.getValue(), 0.0f); + assertEquals(uut.getDisplayName(), "Denominator - x factor"); + assertEquals(uut.getDisplayableValue(), "0.000"); + assertEquals( + uut.getBytes(), new byte[] {(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00}); + } + + @Test + public void fromBytes() throws KlvParseException { + Denominator_X uut = + new Denominator_X(new byte[] {(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00}); + assertEquals(uut.getValue(), 0.0f); + assertEquals(uut.getDisplayName(), "Denominator - x factor"); + assertEquals(uut.getDisplayableValue(), "0.000"); + assertEquals( + uut.getBytes(), new byte[] {(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00}); + } + + @Test + public void fromBytesFactory() throws KlvParseException { + IGeneralizedTransformationMetadataValue v = + GeneralizedTransformationLocalSet.createValue( + GeneralizedTransformationParametersKey.Denominator_x, + new byte[] {(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00}); + assertTrue(v instanceof Denominator_X); + Denominator_X uut = (Denominator_X) v; + assertEquals(uut.getValue(), 0.0f); + assertEquals(uut.getDisplayName(), "Denominator - x factor"); + assertEquals(uut.getDisplayableValue(), "0.000"); + assertEquals( + uut.getBytes(), new byte[] {(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00}); + } + + @Test(expectedExceptions = KlvParseException.class) + public void testTooShort() throws KlvParseException { + new Denominator_X(new byte[] {0x01, 0x02, 0x03}); + } + + @Test(expectedExceptions = KlvParseException.class) + public void testTooLong() throws KlvParseException { + new Denominator_X(new byte[] {0x01, 0x02, 0x03, 0x04, 0x05}); + } + + @Test(expectedExceptions = KlvParseException.class) + public void testNotDouble() throws KlvParseException { + new Denominator_X(new byte[] {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}); + } +} diff --git a/st1202/src/test/java/org/jmisb/st1202/Denominator_Y_Test.java b/st1202/src/test/java/org/jmisb/st1202/Denominator_Y_Test.java new file mode 100644 index 000000000..d1331933c --- /dev/null +++ b/st1202/src/test/java/org/jmisb/st1202/Denominator_Y_Test.java @@ -0,0 +1,62 @@ +package org.jmisb.st1202; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; + +import org.jmisb.api.common.KlvParseException; +import org.testng.annotations.Test; + +/** Tests for Denominator_Y. */ +public class Denominator_Y_Test { + + @Test + public void fromValue() { + Denominator_Y uut = new Denominator_Y(0.2f); + assertEquals(uut.getValue(), 0.2f); + assertEquals(uut.getDisplayName(), "Denominator - y factor"); + assertEquals(uut.getDisplayableValue(), "0.200"); + assertEquals( + uut.getBytes(), new byte[] {(byte) 0x3E, (byte) 0x4C, (byte) 0xCC, (byte) 0xCD}); + } + + @Test + public void fromBytes() throws KlvParseException { + Denominator_Y uut = + new Denominator_Y(new byte[] {(byte) 0x3E, (byte) 0x4C, (byte) 0xCC, (byte) 0xCD}); + assertEquals(uut.getValue(), 0.2f); + assertEquals(uut.getDisplayName(), "Denominator - y factor"); + assertEquals(uut.getDisplayableValue(), "0.200"); + assertEquals( + uut.getBytes(), new byte[] {(byte) 0x3E, (byte) 0x4C, (byte) 0xCC, (byte) 0xCD}); + } + + @Test + public void fromBytesFactory() throws KlvParseException { + IGeneralizedTransformationMetadataValue v = + GeneralizedTransformationLocalSet.createValue( + GeneralizedTransformationParametersKey.Denominator_y, + new byte[] {(byte) 0x3E, (byte) 0x4C, (byte) 0xCC, (byte) 0xCD}); + assertTrue(v instanceof Denominator_Y); + Denominator_Y uut = (Denominator_Y) v; + assertEquals(uut.getValue(), 0.2f); + assertEquals(uut.getDisplayName(), "Denominator - y factor"); + assertEquals(uut.getDisplayableValue(), "0.200"); + assertEquals( + uut.getBytes(), new byte[] {(byte) 0x3E, (byte) 0x4C, (byte) 0xCC, (byte) 0xCD}); + } + + @Test(expectedExceptions = KlvParseException.class) + public void testTooShort() throws KlvParseException { + new Denominator_Y(new byte[] {0x01, 0x02, 0x03}); + } + + @Test(expectedExceptions = KlvParseException.class) + public void testTooLong() throws KlvParseException { + new Denominator_Y(new byte[] {0x01, 0x02, 0x03, 0x04, 0x05}); + } + + @Test(expectedExceptions = KlvParseException.class) + public void testNotDouble() throws KlvParseException { + new Denominator_Y(new byte[] {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}); + } +} diff --git a/st1202/src/test/java/org/jmisb/st1202/GeneralizedTransformationLocalSetTest.java b/st1202/src/test/java/org/jmisb/st1202/GeneralizedTransformationLocalSetTest.java new file mode 100644 index 000000000..c9c389975 --- /dev/null +++ b/st1202/src/test/java/org/jmisb/st1202/GeneralizedTransformationLocalSetTest.java @@ -0,0 +1,351 @@ +package org.jmisb.st1202; + +import static org.testng.Assert.*; + +import java.util.HashMap; +import java.util.Map; +import org.jmisb.api.common.KlvParseException; +import org.testng.annotations.Test; + +/** Unit tests for Generalized Transformation Local Set implementation. */ +public class GeneralizedTransformationLocalSetTest extends LoggerChecks { + + private final byte[] bytesAll = + new byte[] { + 0x01, + 0x04, + 0x3F, + (byte) 0x80, + 0x00, + 0x00, + 0x02, + 0x04, + 0x40, + 0x00, + 0x00, + 0x00, + 0x03, + 0x04, + 0x40, + 0x40, + 0x00, + 0x00, + 0x04, + 0x04, + 0x40, + (byte) 0x80, + 0x00, + 0x00, + 0x05, + 0x04, + 0x40, + (byte) 0xa0, + 0x00, + 0x00, + 0x06, + 0x04, + 0x40, + (byte) 0xc0, + 0x00, + 0x00, + 0x07, + 0x04, + 0x40, + (byte) 0xe0, + 0x00, + 0x00, + 0x08, + 0x04, + 0x41, + 0x00, + 0x00, + 0x00, + 0x09, + 90, + 0x08, + 0b01000010, + (byte) 0x3d, + (byte) 0xcc, + (byte) 0xcc, + (byte) 0xcd, + (byte) 0x3e, + (byte) 0x4c, + (byte) 0xcc, + (byte) 0xcd, + (byte) 0x3e, + (byte) 0x99, + (byte) 0x99, + (byte) 0x9a, + (byte) 0x3e, + (byte) 0xcc, + (byte) 0xcc, + (byte) 0xcd, + (byte) 0x3f, + (byte) 0x00, + (byte) 0x00, + (byte) 0x00, + (byte) 0x3f, + (byte) 0x19, + (byte) 0x99, + (byte) 0x9a, + (byte) 0x3f, + (byte) 0x33, + (byte) 0x33, + (byte) 0x33, + (byte) 0x3f, + (byte) 0x4c, + (byte) 0xcc, + (byte) 0xcd, + (byte) 0x40, + (byte) 0xa3, + (byte) 0x41, + (byte) 0x47, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + 0x0a, + 0x01, + 0x02, + 0x0b, + 0x01, + 0x02 + }; + + public GeneralizedTransformationLocalSetTest() { + super(GeneralizedTransformationLocalSet.class); + } + + @Test + public void checkFromBytesSimple() throws KlvParseException { + // This is not a reasonable local set, just serves for testing + byte[] bytes = new byte[] {0x0a, 0x01, 0x02}; + GeneralizedTransformationLocalSet uut = new GeneralizedTransformationLocalSet(bytes); + verifyNoLoggerMessages(); + assertEquals( + uut.getUniversalLabel(), + GeneralizedTransformationLocalSet.GeneralizedTransformationLocalSetUl); + assertEquals(uut.displayHeader(), "ST 1202 Generalized Transformation Local Set"); + assertEquals(uut.getIdentifiers().size(), 1); + assertTrue( + uut.getIdentifiers() + .contains(GeneralizedTransformationParametersKey.DocumentVersion)); + assertEquals( + uut.getField(GeneralizedTransformationParametersKey.DocumentVersion) + .getDisplayableValue(), + "ST 1202.2"); + assertEquals(uut.frameMessage(true), bytes); + verifyNoLoggerMessages(); + } + + @Test + public void checkFromBytesWithUnknown() throws KlvParseException { + // This is not a reasonable local set, just serves for testing + byte[] bytes = new byte[] {0x7f, 0x01, 0x02, 0x0a, 0x01, 0x02}; + GeneralizedTransformationLocalSet uut = new GeneralizedTransformationLocalSet(bytes); + this.verifySingleLoggerMessage("Unknown Generalized Transformation tag: 127"); + assertEquals( + uut.getUniversalLabel(), + GeneralizedTransformationLocalSet.GeneralizedTransformationLocalSetUl); + assertEquals(uut.displayHeader(), "ST 1202 Generalized Transformation Local Set"); + assertEquals(uut.getIdentifiers().size(), 1); + assertTrue( + uut.getIdentifiers() + .contains(GeneralizedTransformationParametersKey.DocumentVersion)); + assertEquals( + uut.getField(GeneralizedTransformationParametersKey.DocumentVersion) + .getDisplayableValue(), + "ST 1202.2"); + assertEquals(uut.frameMessage(true), new byte[] {0x0a, 0x01, 0x02}); + verifyNoLoggerMessages(); + } + + @Test + public void checkFromValues() throws KlvParseException { + Map map = + new HashMap<>(); + map.put( + GeneralizedTransformationParametersKey.DocumentVersion, + new ST1202DocumentVersion(2)); + GeneralizedTransformationLocalSet uut = new GeneralizedTransformationLocalSet(map); + verifyNoLoggerMessages(); + assertEquals( + uut.getUniversalLabel(), + GeneralizedTransformationLocalSet.GeneralizedTransformationLocalSetUl); + assertEquals(uut.displayHeader(), "ST 1202 Generalized Transformation Local Set"); + assertEquals(uut.getIdentifiers().size(), 1); + assertTrue( + uut.getIdentifiers() + .contains(GeneralizedTransformationParametersKey.DocumentVersion)); + assertEquals( + uut.getField(GeneralizedTransformationParametersKey.DocumentVersion) + .getDisplayableValue(), + "ST 1202.2"); + assertEquals(uut.frameMessage(true), new byte[] {0x0a, 0x01, 0x02}); + verifyNoLoggerMessages(); + } + + @Test + public void checkFromBytesAll() throws KlvParseException { + verifyNoLoggerMessages(); + GeneralizedTransformationLocalSet uut = new GeneralizedTransformationLocalSet(bytesAll); + verifyNoLoggerMessages(); + assertEquals( + uut.getUniversalLabel(), + GeneralizedTransformationLocalSet.GeneralizedTransformationLocalSetUl); + assertEquals(uut.displayHeader(), "ST 1202 Generalized Transformation Local Set"); + assertEquals(uut.getIdentifiers().size(), 11); + assertTrue( + uut.getIdentifiers() + .contains(GeneralizedTransformationParametersKey.X_Numerator_x)); + assertEquals( + uut.getField(GeneralizedTransformationParametersKey.X_Numerator_x) + .getDisplayableValue(), + "1.000"); + assertTrue( + uut.getIdentifiers() + .contains(GeneralizedTransformationParametersKey.X_Numerator_y)); + assertEquals( + uut.getField(GeneralizedTransformationParametersKey.X_Numerator_y) + .getDisplayableValue(), + "2.000"); + assertTrue( + uut.getIdentifiers() + .contains(GeneralizedTransformationParametersKey.X_Numerator_Constant)); + assertEquals( + uut.getField(GeneralizedTransformationParametersKey.X_Numerator_Constant) + .getDisplayableValue(), + "3.000"); + assertTrue( + uut.getIdentifiers() + .contains(GeneralizedTransformationParametersKey.Y_Numerator_x)); + assertEquals( + uut.getField(GeneralizedTransformationParametersKey.Y_Numerator_x) + .getDisplayableValue(), + "4.000"); + assertTrue( + uut.getIdentifiers() + .contains(GeneralizedTransformationParametersKey.Y_Numerator_y)); + assertEquals( + uut.getField(GeneralizedTransformationParametersKey.Y_Numerator_y) + .getDisplayableValue(), + "5.000"); + assertTrue( + uut.getIdentifiers() + .contains(GeneralizedTransformationParametersKey.Y_Numerator_Constant)); + assertEquals( + uut.getField(GeneralizedTransformationParametersKey.Y_Numerator_Constant) + .getDisplayableValue(), + "6.000"); + assertTrue( + uut.getIdentifiers() + .contains(GeneralizedTransformationParametersKey.Denominator_x)); + assertEquals( + uut.getField(GeneralizedTransformationParametersKey.Denominator_x) + .getDisplayableValue(), + "7.000"); + assertTrue( + uut.getIdentifiers() + .contains(GeneralizedTransformationParametersKey.Denominator_y)); + assertEquals( + uut.getField(GeneralizedTransformationParametersKey.Denominator_y) + .getDisplayableValue(), + "8.000"); + assertTrue(uut.getIdentifiers().contains(GeneralizedTransformationParametersKey.SDCC)); + assertEquals( + uut.getField(GeneralizedTransformationParametersKey.SDCC).getDisplayableValue(), + "[SDCC]"); + assertTrue(uut.getField(GeneralizedTransformationParametersKey.SDCC) instanceof SDCC_FLP); + SDCC_FLP sdccFlp = (SDCC_FLP) uut.getField(GeneralizedTransformationParametersKey.SDCC); + assertEquals(sdccFlp.getSDCCMatrix()[0][0], 0.1, 0.0000001); + assertEquals(sdccFlp.getSDCCMatrix()[0][1], 0.01, 0.001); + assertEquals(sdccFlp.getSDCCMatrix()[1][0], 0.01, 0.001); + assertEquals(sdccFlp.getSDCCMatrix()[7][7], 0.8, 0.0000001); + assertTrue( + uut.getIdentifiers() + .contains(GeneralizedTransformationParametersKey.DocumentVersion)); + assertEquals( + uut.getField(GeneralizedTransformationParametersKey.DocumentVersion) + .getDisplayableValue(), + "ST 1202.2"); + assertTrue( + uut.getIdentifiers() + .contains( + GeneralizedTransformationParametersKey.TransformationEnumeration)); + assertEquals( + uut.getField(GeneralizedTransformationParametersKey.TransformationEnumeration) + .getDisplayableValue(), + "Child-Parent Transformation (CPT)"); + assertEquals(uut.frameMessage(true), bytesAll); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void badSerialisationNonNested() { + Map map = + new HashMap<>(); + map.put( + GeneralizedTransformationParametersKey.DocumentVersion, + new ST1202DocumentVersion(2)); + GeneralizedTransformationLocalSet uut = new GeneralizedTransformationLocalSet(map); + uut.frameMessage(false); + } + + @Test + public void lookupUnknown() throws KlvParseException { + verifyNoLoggerMessages(); + IGeneralizedTransformationMetadataValue uut = + GeneralizedTransformationLocalSet.createValue( + GeneralizedTransformationParametersKey.Undefined, new byte[] {0x03}); + this.verifySingleLoggerMessage( + "Unknown Generalized Transformation Metadata tag: Undefined"); + assertNull(uut); + } +} diff --git a/st1202/src/test/java/org/jmisb/st1202/GeneralizedTransformationParametersKeyTest.java b/st1202/src/test/java/org/jmisb/st1202/GeneralizedTransformationParametersKeyTest.java new file mode 100644 index 000000000..8a7a3a095 --- /dev/null +++ b/st1202/src/test/java/org/jmisb/st1202/GeneralizedTransformationParametersKeyTest.java @@ -0,0 +1,113 @@ +package org.jmisb.st1202; + +import static org.testng.Assert.assertEquals; + +import org.testng.annotations.Test; + +/** Unit tests for GeneralizedTransformationParametersKey. */ +public class GeneralizedTransformationParametersKeyTest { + + @Test + public void Enum0Test() { + GeneralizedTransformationParametersKey key = + GeneralizedTransformationParametersKey.getKey(0); + assertEquals(key, GeneralizedTransformationParametersKey.Undefined); + assertEquals(key.getIdentifier(), 0); + } + + @Test + public void EnumUnknownTest() { + GeneralizedTransformationParametersKey key = + GeneralizedTransformationParametersKey.getKey(999); + assertEquals(key, GeneralizedTransformationParametersKey.Undefined); + assertEquals(key.getIdentifier(), 0); + } + + @Test + public void Enum1Test() { + GeneralizedTransformationParametersKey key = + GeneralizedTransformationParametersKey.getKey(1); + assertEquals(key, GeneralizedTransformationParametersKey.X_Numerator_x); + assertEquals(key.getIdentifier(), 1); + } + + @Test + public void Enum2Test() { + GeneralizedTransformationParametersKey key = + GeneralizedTransformationParametersKey.getKey(2); + assertEquals(key, GeneralizedTransformationParametersKey.X_Numerator_y); + assertEquals(key.getIdentifier(), 2); + } + + @Test + public void Enum3Test() { + GeneralizedTransformationParametersKey key = + GeneralizedTransformationParametersKey.getKey(3); + assertEquals(key, GeneralizedTransformationParametersKey.X_Numerator_Constant); + assertEquals(key.getIdentifier(), 3); + } + + @Test + public void Enum4Test() { + GeneralizedTransformationParametersKey key = + GeneralizedTransformationParametersKey.getKey(4); + assertEquals(key, GeneralizedTransformationParametersKey.Y_Numerator_x); + assertEquals(key.getIdentifier(), 4); + } + + @Test + public void Enum5Test() { + GeneralizedTransformationParametersKey key = + GeneralizedTransformationParametersKey.getKey(5); + assertEquals(key, GeneralizedTransformationParametersKey.Y_Numerator_y); + assertEquals(key.getIdentifier(), 5); + } + + @Test + public void Enum6Test() { + GeneralizedTransformationParametersKey key = + GeneralizedTransformationParametersKey.getKey(6); + assertEquals(key, GeneralizedTransformationParametersKey.Y_Numerator_Constant); + assertEquals(key.getIdentifier(), 6); + } + + @Test + public void Enum7Test() { + GeneralizedTransformationParametersKey key = + GeneralizedTransformationParametersKey.getKey(7); + assertEquals(key, GeneralizedTransformationParametersKey.Denominator_x); + assertEquals(key.getIdentifier(), 7); + } + + @Test + public void Enum8Test() { + GeneralizedTransformationParametersKey key = + GeneralizedTransformationParametersKey.getKey(8); + assertEquals(key, GeneralizedTransformationParametersKey.Denominator_y); + assertEquals(key.getIdentifier(), 8); + } + + @Test + public void Enum9Test() { + GeneralizedTransformationParametersKey key = + GeneralizedTransformationParametersKey.getKey(9); + assertEquals(key, GeneralizedTransformationParametersKey.SDCC); + assertEquals(key.getIdentifier(), 9); + } + + @Test + public void Enum10Test() { + GeneralizedTransformationParametersKey key = + GeneralizedTransformationParametersKey.getKey(10); + assertEquals(key, GeneralizedTransformationParametersKey.DocumentVersion); + assertEquals(key.getIdentifier(), 10); + } + + @Test + public void Enum11Test() { + GeneralizedTransformationParametersKey key = + GeneralizedTransformationParametersKey.getKey(11); + assertEquals(key, GeneralizedTransformationParametersKey.TransformationEnumeration); + assertEquals(key.getIdentifier(), 11); + } +} diff --git a/st1202/src/test/java/org/jmisb/st1202/LoggerChecks.java b/st1202/src/test/java/org/jmisb/st1202/LoggerChecks.java new file mode 100644 index 000000000..a68731645 --- /dev/null +++ b/st1202/src/test/java/org/jmisb/st1202/LoggerChecks.java @@ -0,0 +1,63 @@ +package org.jmisb.st1202; + +import com.github.valfirst.slf4jtest.LoggingEvent; +import com.github.valfirst.slf4jtest.TestLogger; +import com.github.valfirst.slf4jtest.TestLoggerFactory; +import java.util.List; +import org.slf4j.helpers.MessageFormatter; +import org.testng.Assert; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import uk.org.lidalia.slf4jext.Level; + +/** + * Superclass for logging checks in a test case. + * + *

The concept is that there is a test logger that should always contain no log messages after a + * test has been run. That gets verified in the AfterMethod so if there is a message, the logger + * needs to be checked and clear()ed before the test method returns. + * + *

Only ERROR, WARN and INFO levels are checked. DEBUG and lower are implementation detail. + * + *

The subclass is responsible for initialising the LOGGER correctly by calling the super + * constructor with the class that is creating the log messages. + */ +public abstract class LoggerChecks { + protected TestLogger LOGGER; + + public LoggerChecks(Class T) { + LOGGER = TestLoggerFactory.getTestLogger(T); + LOGGER.setEnabledLevelsForAllThreads(Level.ERROR, Level.WARN, Level.INFO); + } + + @BeforeMethod + public void clearLogger() { + LOGGER.clear(); + } + + @AfterMethod + public void checkLogger() { + verifyNoLoggerMessages(); + } + + protected void verifyNoLoggerMessages() { + if (LOGGER.getLoggingEvents().size() > 0) { + List events = LOGGER.getLoggingEvents(); + for (LoggingEvent event : events) { + System.out.println(event.getLevel().name() + ": " + event.getMessage().toString()); + } + } + Assert.assertEquals(LOGGER.getLoggingEvents().size(), 0); + } + + protected void verifySingleLoggerMessage(final String expectedMessage) { + Assert.assertEquals(LOGGER.getLoggingEvents().size(), 1); + LoggingEvent event = LOGGER.getLoggingEvents().get(0); + Assert.assertEquals(event.getArguments().size(), 1); + String message = + MessageFormatter.format(event.getMessage(), event.getArguments().get(0)) + .getMessage(); + Assert.assertEquals(message, expectedMessage); + LOGGER.clear(); + } +} diff --git a/st1202/src/test/java/org/jmisb/st1202/SDCC_FLP_Test.java b/st1202/src/test/java/org/jmisb/st1202/SDCC_FLP_Test.java new file mode 100644 index 000000000..d0b6ad3e9 --- /dev/null +++ b/st1202/src/test/java/org/jmisb/st1202/SDCC_FLP_Test.java @@ -0,0 +1,232 @@ +package org.jmisb.st1202; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; + +import org.jmisb.api.common.KlvParseException; +import org.jmisb.api.klv.IKlvKey; +import org.jmisb.st1010.EncodingFormat; +import org.jmisb.st1010.SDCC; +import org.jmisb.st1010.SDCCValueIdentifierKey; +import org.jmisb.st1010.SDCCValueWrap; +import org.testng.annotations.Test; + +/** Tests for ST 1202 SDCC Floating Length Pack. */ +public class SDCC_FLP_Test { + private final double[][] matrix = + new double[][] { + {0.10, 0.01, 0.02, 0.00, 0.00, 0.00, 0.00, 0.00}, + {0.01, 0.20, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00}, + {0.02, 0.00, 0.30, 0.00, 0.00, 0.00, 0.00, 0.00}, + {0.00, 0.00, 0.00, 0.40, 0.00, 0.00, 0.00, 0.00}, + {0.00, 0.00, 0.00, 0.00, 0.50, 0.00, 0.00, 0.00}, + {0.00, 0.00, 0.00, 0.00, 0.00, 0.60, 0.00, 0.00}, + {0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.70, 0.00}, + {0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.80}, + }; + + private final byte[] sdccBytes = + new byte[] { + 0x08, + 0b01000010, + (byte) 0x3d, + (byte) 0xcc, + (byte) 0xcc, + (byte) 0xcd, + (byte) 0x3e, + (byte) 0x4c, + (byte) 0xcc, + (byte) 0xcd, + (byte) 0x3e, + (byte) 0x99, + (byte) 0x99, + (byte) 0x9a, + (byte) 0x3e, + (byte) 0xcc, + (byte) 0xcc, + (byte) 0xcd, + (byte) 0x3f, + (byte) 0x00, + (byte) 0x00, + (byte) 0x00, + (byte) 0x3f, + (byte) 0x19, + (byte) 0x99, + (byte) 0x9a, + (byte) 0x3f, + (byte) 0x33, + (byte) 0x33, + (byte) 0x33, + (byte) 0x3f, + (byte) 0x4c, + (byte) 0xcc, + (byte) 0xcd, + (byte) 0x40, + (byte) 0xa3, + (byte) 0x41, + (byte) 0x47, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + (byte) 0x40, + (byte) 0x00, + }; + + @Test + public void testConstructFromSdccValue() { + SDCC sdcc = new SDCC(); + sdcc.setStandardDeviationFormat(EncodingFormat.IEEE); + sdcc.setStandardDeviationLength(Float.BYTES); + sdcc.setCorrelationCoefficientFormat(EncodingFormat.ST1201); + sdcc.setCorrelationCoefficientLength(2); + sdcc.setValues(matrix); + SDCC_FLP uut = new SDCC_FLP(sdcc); + assertEquals(uut.getDisplayName(), "Standard Deviation and Correlation Coefficients"); + assertEquals(uut.getDisplayableValue(), "[SDCC]"); + assertEquals(uut.getBytes(), sdccBytes); + assertEquals(uut.getSDCC().getStandardDeviationFormat(), EncodingFormat.IEEE); + assertEquals(uut.getSDCC().getStandardDeviationLength(), 4); + assertEquals(uut.getSDCC().getCorrelationCoefficientFormat(), EncodingFormat.ST1201); + assertEquals(uut.getSDCC().getCorrelationCoefficientLength(), 2); + assertEquals(uut.getSDCC().getValues(), matrix); + assertEquals(uut.getSDCCMatrix(), matrix); + assertEquals(uut.getIdentifiers().size(), 64); + } + + @Test + public void testConstructFromBytes() throws KlvParseException { + SDCC_FLP uut = new SDCC_FLP(sdccBytes); + assertEquals(uut.getDisplayName(), "Standard Deviation and Correlation Coefficients"); + assertEquals(uut.getDisplayableValue(), "[SDCC]"); + assertEquals(uut.getBytes(), sdccBytes); + assertEquals(uut.getSDCC().getStandardDeviationFormat(), EncodingFormat.IEEE); + assertEquals(uut.getSDCC().getStandardDeviationLength(), 4); + assertEquals(uut.getSDCC().getCorrelationCoefficientFormat(), EncodingFormat.ST1201); + assertEquals(uut.getSDCC().getCorrelationCoefficientLength(), 2); + assertEquals(uut.getSDCC().getValues().length, matrix.length); + assertEquals(uut.getSDCC().getValues()[0].length, matrix[0].length); + double[][] values = uut.getSDCC().getValues(); + for (int i = 0; i < matrix.length; i++) { + for (int j = 0; j < matrix[i].length; j++) { + if (i == j) { + assertEquals(values[i][j], matrix[i][j], 0.0000001); + } else { + assertEquals(values[i][j], matrix[i][j], 0.0001); + } + } + } + values = uut.getSDCCMatrix(); + for (int i = 0; i < matrix.length; i++) { + for (int j = 0; j < matrix[i].length; j++) { + if (i == j) { + assertEquals(values[i][j], matrix[i][j], 0.0000001); + } else { + assertEquals(values[i][j], matrix[i][j], 0.0001); + } + } + } + assertEquals(uut.getIdentifiers().size(), 64); + } + + @Test + public void testFactoryEncodedBytes() throws KlvParseException { + IGeneralizedTransformationMetadataValue value = + GeneralizedTransformationLocalSet.createValue( + GeneralizedTransformationParametersKey.SDCC, sdccBytes); + assertTrue(value instanceof SDCC_FLP); + SDCC_FLP uut = (SDCC_FLP) value; + assertEquals(uut.getDisplayName(), "Standard Deviation and Correlation Coefficients"); + assertEquals(uut.getDisplayableValue(), "[SDCC]"); + assertEquals(uut.getBytes(), sdccBytes); + assertEquals(uut.getSDCC().getStandardDeviationFormat(), EncodingFormat.IEEE); + assertEquals(uut.getSDCC().getStandardDeviationLength(), 4); + assertEquals(uut.getSDCC().getCorrelationCoefficientFormat(), EncodingFormat.ST1201); + assertEquals(uut.getSDCC().getCorrelationCoefficientLength(), 2); + assertEquals(uut.getSDCC().getValues().length, matrix.length); + assertEquals(uut.getSDCC().getValues()[0].length, matrix[0].length); + assertEquals(uut.getSDCC().getValues().length, matrix.length); + assertEquals(uut.getSDCC().getValues()[0].length, matrix[0].length); + double[][] values = uut.getSDCC().getValues(); + for (int i = 0; i < matrix.length; i++) { + for (int j = 0; j < matrix[i].length; j++) { + if (i == j) { + assertEquals(values[i][j], matrix[i][j], 0.0000001); + } else { + assertEquals(values[i][j], matrix[i][j], 0.0001); + } + } + } + values = uut.getSDCCMatrix(); + for (int i = 0; i < matrix.length; i++) { + for (int j = 0; j < matrix[i].length; j++) { + if (i == j) { + assertEquals(values[i][j], matrix[i][j], 0.0000001); + } else { + assertEquals(values[i][j], matrix[i][j], 0.0001); + } + } + } + assertEquals(uut.getIdentifiers().size(), 64); + for (IKlvKey identifier : uut.getIdentifiers()) { + assertTrue(identifier instanceof SDCCValueIdentifierKey); + SDCCValueIdentifierKey id = (SDCCValueIdentifierKey) identifier; + int row = id.getRow(); + int column = id.getColumn(); + var fieldValue = uut.getField(id); + assertTrue(fieldValue instanceof SDCCValueWrap); + SDCCValueWrap wrappedValue = (SDCCValueWrap) fieldValue; + if (row == column) { + assertEquals(wrappedValue.getValue(), matrix[row][column], 0.0000001); + } else { + assertEquals(wrappedValue.getValue(), matrix[row][column], 0.0001); + } + } + } +} diff --git a/st1202/src/test/java/org/jmisb/st1202/ST1202DocumentVersionTest.java b/st1202/src/test/java/org/jmisb/st1202/ST1202DocumentVersionTest.java new file mode 100644 index 000000000..326284caa --- /dev/null +++ b/st1202/src/test/java/org/jmisb/st1202/ST1202DocumentVersionTest.java @@ -0,0 +1,74 @@ +package org.jmisb.st1202; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; + +import org.jmisb.api.common.KlvParseException; +import org.testng.annotations.Test; + +/** Tests for ST 1202 Document Version. */ +public class ST1202DocumentVersionTest { + @Test + public void testConstructFromValue() { + ST1202DocumentVersion version = new ST1202DocumentVersion(1); + assertEquals(version.getBytes(), new byte[] {(byte) 0x01}); + assertEquals(version.getDisplayName(), "Document Version"); + assertEquals(version.getDisplayableValue(), "ST 1202.1"); + assertEquals(version.getVersion(), 1); + } + + @Test + public void testConstructFromValue127() { + ST1202DocumentVersion version = new ST1202DocumentVersion(127); + assertEquals(version.getBytes(), new byte[] {(byte) 0x7f}); + assertEquals(version.getDisplayName(), "Document Version"); + assertEquals(version.getDisplayableValue(), "ST 1202.127"); + assertEquals(version.getVersion(), 127); + } + + @Test + public void testConstructFromEncodedBytes() { + ST1202DocumentVersion version = new ST1202DocumentVersion(new byte[] {(byte) 0x02}); + assertEquals(version.getBytes(), new byte[] {(byte) 0x02}); + assertEquals(version.getDisplayName(), "Document Version"); + assertEquals(version.getDisplayableValue(), "ST 1202.2"); + assertEquals(version.getVersion(), 2); + } + + @Test + public void testConstructFromEncodedBytes0() { + ST1202DocumentVersion version = new ST1202DocumentVersion(new byte[] {(byte) 0x00}); + assertEquals(version.getBytes(), new byte[] {(byte) 0x00}); + assertEquals(version.getDisplayName(), "Document Version"); + assertEquals(version.getDisplayableValue(), "ST 1202"); + assertEquals(version.getVersion(), 0); + } + + @Test + public void testConstructFromEncodedBytes127() { + ST1202DocumentVersion version = new ST1202DocumentVersion(new byte[] {(byte) 0x7F}); + assertEquals(version.getBytes(), new byte[] {(byte) 0x7F}); + assertEquals(version.getDisplayName(), "Document Version"); + assertEquals(version.getDisplayableValue(), "ST 1202.127"); + assertEquals(version.getVersion(), 127); + } + + @Test + public void testFactoryEncodedBytes() throws KlvParseException { + IGeneralizedTransformationMetadataValue value = + GeneralizedTransformationLocalSet.createValue( + GeneralizedTransformationParametersKey.DocumentVersion, + new byte[] {(byte) 0x02}); + assertTrue(value instanceof ST1202DocumentVersion); + ST1202DocumentVersion version = (ST1202DocumentVersion) value; + assertEquals(version.getBytes(), new byte[] {(byte) 0x02}); + assertEquals(version.getDisplayName(), "Document Version"); + assertEquals(version.getDisplayableValue(), "ST 1202.2"); + assertEquals(version.getVersion(), 2); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testTooSmall() { + new ST1202DocumentVersion(-1); + } +} diff --git a/st1202/src/test/java/org/jmisb/st1202/TransformationEnumerationTest.java b/st1202/src/test/java/org/jmisb/st1202/TransformationEnumerationTest.java new file mode 100644 index 000000000..d6714ab20 --- /dev/null +++ b/st1202/src/test/java/org/jmisb/st1202/TransformationEnumerationTest.java @@ -0,0 +1,106 @@ +package org.jmisb.st1202; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; + +import org.jmisb.api.common.KlvParseException; +import org.testng.annotations.Test; + +/** Tests for ST 1202 Transformation Enumeration. */ +public class TransformationEnumerationTest { + @Test + public void testConstructFromValue() { + TransformationEnumeration uut = TransformationEnumeration.CHIPPING; + assertEquals(uut.getBytes(), new byte[] {(byte) 0x01}); + assertEquals(uut.getDisplayName(), "Transformation Enumeration"); + assertEquals(uut.getDisplayableValue(), "Chipping Transformation (CT)"); + assertEquals(uut.getEncodedValue(), 1); + assertEquals(uut.getDescription(), "Chipping Transformation (CT)"); + assertEquals(uut.getUnits(), "px"); + } + + @Test + public void testConstructFromEncodedBytes() throws KlvParseException { + TransformationEnumeration uut = + TransformationEnumeration.fromBytes(new byte[] {(byte) 0x02}); + assertEquals(uut.getBytes(), new byte[] {(byte) 0x02}); + assertEquals(uut.getDisplayName(), "Transformation Enumeration"); + assertEquals(uut.getDisplayableValue(), "Child-Parent Transformation (CPT)"); + assertEquals(uut.getEncodedValue(), 2); + assertEquals(uut.getDescription(), "Child-Parent Transformation (CPT)"); + assertEquals(uut.getUnits(), "mm"); + } + + @Test + public void testConstructFromEncodedBytes4() throws KlvParseException { + TransformationEnumeration uut = + TransformationEnumeration.fromBytes(new byte[] {(byte) 0x04}); + assertEquals(uut.getBytes(), new byte[] {(byte) 0x04}); + assertEquals(uut.getDisplayName(), "Transformation Enumeration"); + assertEquals(uut.getDisplayableValue(), "Optical Transformation (OT)"); + assertEquals(uut.getEncodedValue(), 4); + assertEquals(uut.getDescription(), "Optical Transformation (OT)"); + assertEquals(uut.getUnits(), "mm"); + } + + @Test + public void testFactoryEncodedBytes() throws KlvParseException { + IGeneralizedTransformationMetadataValue value = + GeneralizedTransformationLocalSet.createValue( + GeneralizedTransformationParametersKey.TransformationEnumeration, + new byte[] {(byte) 0x02}); + assertTrue(value instanceof TransformationEnumeration); + TransformationEnumeration uut = (TransformationEnumeration) value; + assertEquals(uut.getDisplayName(), "Transformation Enumeration"); + assertEquals(uut.getDisplayableValue(), "Child-Parent Transformation (CPT)"); + assertEquals(uut.getEncodedValue(), 2); + assertEquals(uut.getDescription(), "Child-Parent Transformation (CPT)"); + assertEquals(uut.getUnits(), "mm"); + } + + @Test( + expectedExceptions = KlvParseException.class, + expectedExceptionsMessageRegExp = + "Transformation Enumeration should be encoded as a 1 byte array") + public void testConstructFromEncodedBytesTooLong() throws KlvParseException { + TransformationEnumeration.fromBytes(new byte[] {(byte) 0x01, (byte) 0x02}); + } + + @Test( + expectedExceptions = KlvParseException.class, + expectedExceptionsMessageRegExp = + "Transformation Enumeration should be encoded as a 1 byte array") + public void testConstructFromEncodedBytesTooShort() throws KlvParseException { + TransformationEnumeration.fromBytes(new byte[] {}); + } + + @Test + public void testLookup() throws KlvParseException { + TransformationEnumeration uut = TransformationEnumeration.lookup(4); + assertEquals(uut, TransformationEnumeration.OPTICAL); + assertEquals(uut.getBytes(), new byte[] {(byte) 0x04}); + assertEquals(uut.getDisplayName(), "Transformation Enumeration"); + assertEquals(uut.getDisplayableValue(), "Optical Transformation (OT)"); + assertEquals(uut.getEncodedValue(), 4); + assertEquals(uut.getDescription(), "Optical Transformation (OT)"); + assertEquals(uut.getUnits(), "mm"); + } + + @Test + public void testLookupUnknown() throws KlvParseException { + TransformationEnumeration uut = TransformationEnumeration.lookup(5); + assertEquals(uut, TransformationEnumeration.UNKNOWN); + } + + @Test() + public void testSerialiseOther() throws KlvParseException { + assertEquals(TransformationEnumeration.OTHER.getBytes(), new byte[] {(byte) 0x00}); + } + + @Test( + expectedExceptions = IllegalArgumentException.class, + expectedExceptionsMessageRegExp = "Cannot serialise UNKNOWN Transformation Enumeration") + public void testSerialiseUnknown() throws KlvParseException { + TransformationEnumeration.UNKNOWN.getBytes(); + } +} diff --git a/st1202/src/test/java/org/jmisb/st1202/X_Numerator_Constant_Test.java b/st1202/src/test/java/org/jmisb/st1202/X_Numerator_Constant_Test.java new file mode 100644 index 000000000..963eb5599 --- /dev/null +++ b/st1202/src/test/java/org/jmisb/st1202/X_Numerator_Constant_Test.java @@ -0,0 +1,63 @@ +package org.jmisb.st1202; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; + +import org.jmisb.api.common.KlvParseException; +import org.testng.annotations.Test; + +/** Tests for X_Numerator_Constant. */ +public class X_Numerator_Constant_Test { + + @Test + public void fromValue() { + X_Numerator_Constant uut = new X_Numerator_Constant(262.5f); + assertEquals(uut.getValue(), 262.5f); + assertEquals(uut.getDisplayName(), "x Equation Numerator - Constant factor"); + assertEquals(uut.getDisplayableValue(), "262.500"); + assertEquals( + uut.getBytes(), new byte[] {(byte) 0x43, (byte) 0x83, (byte) 0x40, (byte) 0x00}); + } + + @Test + public void fromBytes() throws KlvParseException { + X_Numerator_Constant uut = + new X_Numerator_Constant( + new byte[] {(byte) 0x43, (byte) 0x83, (byte) 0x40, (byte) 0x00}); + assertEquals(uut.getValue(), 262.5f); + assertEquals(uut.getDisplayName(), "x Equation Numerator - Constant factor"); + assertEquals(uut.getDisplayableValue(), "262.500"); + assertEquals( + uut.getBytes(), new byte[] {(byte) 0x43, (byte) 0x83, (byte) 0x40, (byte) 0x00}); + } + + @Test + public void fromBytesFactory() throws KlvParseException { + IGeneralizedTransformationMetadataValue v = + GeneralizedTransformationLocalSet.createValue( + GeneralizedTransformationParametersKey.X_Numerator_Constant, + new byte[] {(byte) 0x43, (byte) 0x83, (byte) 0x40, (byte) 0x00}); + assertTrue(v instanceof X_Numerator_Constant); + X_Numerator_Constant uut = (X_Numerator_Constant) v; + assertEquals(uut.getValue(), 262.5f); + assertEquals(uut.getDisplayName(), "x Equation Numerator - Constant factor"); + assertEquals(uut.getDisplayableValue(), "262.500"); + assertEquals( + uut.getBytes(), new byte[] {(byte) 0x43, (byte) 0x83, (byte) 0x40, (byte) 0x00}); + } + + @Test(expectedExceptions = KlvParseException.class) + public void testTooShort() throws KlvParseException { + new X_Numerator_Constant(new byte[] {0x01, 0x02, 0x03}); + } + + @Test(expectedExceptions = KlvParseException.class) + public void testTooLong() throws KlvParseException { + new X_Numerator_Constant(new byte[] {0x01, 0x02, 0x03, 0x04, 0x05}); + } + + @Test(expectedExceptions = KlvParseException.class) + public void testNotDouble() throws KlvParseException { + new X_Numerator_Constant(new byte[] {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}); + } +} diff --git a/st1202/src/test/java/org/jmisb/st1202/X_Numerator_X_Test.java b/st1202/src/test/java/org/jmisb/st1202/X_Numerator_X_Test.java new file mode 100644 index 000000000..c9a5003b0 --- /dev/null +++ b/st1202/src/test/java/org/jmisb/st1202/X_Numerator_X_Test.java @@ -0,0 +1,62 @@ +package org.jmisb.st1202; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; + +import org.jmisb.api.common.KlvParseException; +import org.testng.annotations.Test; + +/** Tests for X_Numerator_X. */ +public class X_Numerator_X_Test { + + @Test + public void fromValue() { + X_Numerator_X uut = new X_Numerator_X(0.5f); + assertEquals(uut.getValue(), 0.5f); + assertEquals(uut.getDisplayName(), "x Equation Numerator - x factor"); + assertEquals(uut.getDisplayableValue(), "0.500"); + assertEquals( + uut.getBytes(), new byte[] {(byte) 0x3f, (byte) 0x00, (byte) 0x00, (byte) 0x00}); + } + + @Test + public void fromBytes() throws KlvParseException { + X_Numerator_X uut = + new X_Numerator_X(new byte[] {(byte) 0x3f, (byte) 0x00, (byte) 0x00, (byte) 0x00}); + assertEquals(uut.getValue(), 0.5f); + assertEquals(uut.getDisplayName(), "x Equation Numerator - x factor"); + assertEquals(uut.getDisplayableValue(), "0.500"); + assertEquals( + uut.getBytes(), new byte[] {(byte) 0x3f, (byte) 0x00, (byte) 0x00, (byte) 0x00}); + } + + @Test + public void fromBytesFactory() throws KlvParseException { + IGeneralizedTransformationMetadataValue v = + GeneralizedTransformationLocalSet.createValue( + GeneralizedTransformationParametersKey.X_Numerator_x, + new byte[] {(byte) 0x3f, (byte) 0x00, (byte) 0x00, (byte) 0x00}); + assertTrue(v instanceof X_Numerator_X); + X_Numerator_X uut = (X_Numerator_X) v; + assertEquals(uut.getValue(), 0.5f); + assertEquals(uut.getDisplayName(), "x Equation Numerator - x factor"); + assertEquals(uut.getDisplayableValue(), "0.500"); + assertEquals( + uut.getBytes(), new byte[] {(byte) 0x3f, (byte) 0x00, (byte) 0x00, (byte) 0x00}); + } + + @Test(expectedExceptions = KlvParseException.class) + public void testTooShort() throws KlvParseException { + new X_Numerator_X(new byte[] {0x01, 0x02, 0x03}); + } + + @Test(expectedExceptions = KlvParseException.class) + public void testTooLong() throws KlvParseException { + new X_Numerator_X(new byte[] {0x01, 0x02, 0x03, 0x04, 0x05}); + } + + @Test(expectedExceptions = KlvParseException.class) + public void testNotDouble() throws KlvParseException { + new X_Numerator_X(new byte[] {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}); + } +} diff --git a/st1202/src/test/java/org/jmisb/st1202/X_Numerator_Y_Test.java b/st1202/src/test/java/org/jmisb/st1202/X_Numerator_Y_Test.java new file mode 100644 index 000000000..feed67621 --- /dev/null +++ b/st1202/src/test/java/org/jmisb/st1202/X_Numerator_Y_Test.java @@ -0,0 +1,62 @@ +package org.jmisb.st1202; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; + +import org.jmisb.api.common.KlvParseException; +import org.testng.annotations.Test; + +/** Tests for X_Numerator_Y. */ +public class X_Numerator_Y_Test { + + @Test + public void fromValue() { + X_Numerator_Y uut = new X_Numerator_Y(0.5f); + assertEquals(uut.getValue(), 0.5f); + assertEquals(uut.getDisplayName(), "x Equation Numerator - y factor"); + assertEquals(uut.getDisplayableValue(), "0.500"); + assertEquals( + uut.getBytes(), new byte[] {(byte) 0x3f, (byte) 0x00, (byte) 0x00, (byte) 0x00}); + } + + @Test + public void fromBytes() throws KlvParseException { + X_Numerator_Y uut = + new X_Numerator_Y(new byte[] {(byte) 0x3f, (byte) 0x00, (byte) 0x00, (byte) 0x00}); + assertEquals(uut.getValue(), 0.5f); + assertEquals(uut.getDisplayName(), "x Equation Numerator - y factor"); + assertEquals(uut.getDisplayableValue(), "0.500"); + assertEquals( + uut.getBytes(), new byte[] {(byte) 0x3f, (byte) 0x00, (byte) 0x00, (byte) 0x00}); + } + + @Test + public void fromBytesFactory() throws KlvParseException { + IGeneralizedTransformationMetadataValue v = + GeneralizedTransformationLocalSet.createValue( + GeneralizedTransformationParametersKey.X_Numerator_y, + new byte[] {(byte) 0x3f, (byte) 0x00, (byte) 0x00, (byte) 0x00}); + assertTrue(v instanceof X_Numerator_Y); + X_Numerator_Y uut = (X_Numerator_Y) v; + assertEquals(uut.getValue(), 0.5f); + assertEquals(uut.getDisplayName(), "x Equation Numerator - y factor"); + assertEquals(uut.getDisplayableValue(), "0.500"); + assertEquals( + uut.getBytes(), new byte[] {(byte) 0x3f, (byte) 0x00, (byte) 0x00, (byte) 0x00}); + } + + @Test(expectedExceptions = KlvParseException.class) + public void testTooShort() throws KlvParseException { + new X_Numerator_Y(new byte[] {0x01, 0x02, 0x03}); + } + + @Test(expectedExceptions = KlvParseException.class) + public void testTooLong() throws KlvParseException { + new X_Numerator_Y(new byte[] {0x01, 0x02, 0x03, 0x04, 0x05}); + } + + @Test(expectedExceptions = KlvParseException.class) + public void testNotDouble() throws KlvParseException { + new X_Numerator_Y(new byte[] {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}); + } +} diff --git a/st1202/src/test/java/org/jmisb/st1202/Y_Numerator_Constant_Test.java b/st1202/src/test/java/org/jmisb/st1202/Y_Numerator_Constant_Test.java new file mode 100644 index 000000000..a5623206b --- /dev/null +++ b/st1202/src/test/java/org/jmisb/st1202/Y_Numerator_Constant_Test.java @@ -0,0 +1,63 @@ +package org.jmisb.st1202; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; + +import org.jmisb.api.common.KlvParseException; +import org.testng.annotations.Test; + +/** Tests for Y_Numerator_Constant. */ +public class Y_Numerator_Constant_Test { + + @Test + public void fromValue() { + Y_Numerator_Constant uut = new Y_Numerator_Constant(556.25f); + assertEquals(uut.getValue(), 556.25f); + assertEquals(uut.getDisplayName(), "y Equation Numerator - Constant factor"); + assertEquals(uut.getDisplayableValue(), "556.250"); + assertEquals( + uut.getBytes(), new byte[] {(byte) 0x44, (byte) 0x0B, (byte) 0x10, (byte) 0x00}); + } + + @Test + public void fromBytes() throws KlvParseException { + Y_Numerator_Constant uut = + new Y_Numerator_Constant( + new byte[] {(byte) 0x44, (byte) 0x0B, (byte) 0x10, (byte) 0x00}); + assertEquals(uut.getValue(), 556.25f); + assertEquals(uut.getDisplayName(), "y Equation Numerator - Constant factor"); + assertEquals(uut.getDisplayableValue(), "556.250"); + assertEquals( + uut.getBytes(), new byte[] {(byte) 0x44, (byte) 0x0B, (byte) 0x10, (byte) 0x00}); + } + + @Test + public void fromBytesFactory() throws KlvParseException { + IGeneralizedTransformationMetadataValue v = + GeneralizedTransformationLocalSet.createValue( + GeneralizedTransformationParametersKey.Y_Numerator_Constant, + new byte[] {(byte) 0x44, (byte) 0x0B, (byte) 0x10, (byte) 0x00}); + assertTrue(v instanceof Y_Numerator_Constant); + Y_Numerator_Constant uut = (Y_Numerator_Constant) v; + assertEquals(uut.getValue(), 556.25f); + assertEquals(uut.getDisplayName(), "y Equation Numerator - Constant factor"); + assertEquals(uut.getDisplayableValue(), "556.250"); + assertEquals( + uut.getBytes(), new byte[] {(byte) 0x44, (byte) 0x0B, (byte) 0x10, (byte) 0x00}); + } + + @Test(expectedExceptions = KlvParseException.class) + public void testTooShort() throws KlvParseException { + new Y_Numerator_Constant(new byte[] {0x01, 0x02, 0x03}); + } + + @Test(expectedExceptions = KlvParseException.class) + public void testTooLong() throws KlvParseException { + new Y_Numerator_Constant(new byte[] {0x01, 0x02, 0x03, 0x04, 0x05}); + } + + @Test(expectedExceptions = KlvParseException.class) + public void testNotDouble() throws KlvParseException { + new Y_Numerator_Constant(new byte[] {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}); + } +} diff --git a/st1202/src/test/java/org/jmisb/st1202/Y_Numerator_X_Test.java b/st1202/src/test/java/org/jmisb/st1202/Y_Numerator_X_Test.java new file mode 100644 index 000000000..55387f0e9 --- /dev/null +++ b/st1202/src/test/java/org/jmisb/st1202/Y_Numerator_X_Test.java @@ -0,0 +1,62 @@ +package org.jmisb.st1202; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; + +import org.jmisb.api.common.KlvParseException; +import org.testng.annotations.Test; + +/** Tests for Y_Numerator_X. */ +public class Y_Numerator_X_Test { + + @Test + public void fromValue() { + Y_Numerator_X uut = new Y_Numerator_X(0.5f); + assertEquals(uut.getValue(), 0.5f); + assertEquals(uut.getDisplayName(), "y Equation Numerator - x factor"); + assertEquals(uut.getDisplayableValue(), "0.500"); + assertEquals( + uut.getBytes(), new byte[] {(byte) 0x3f, (byte) 0x00, (byte) 0x00, (byte) 0x00}); + } + + @Test + public void fromBytes() throws KlvParseException { + Y_Numerator_X uut = + new Y_Numerator_X(new byte[] {(byte) 0x3f, (byte) 0x00, (byte) 0x00, (byte) 0x00}); + assertEquals(uut.getValue(), 0.5f); + assertEquals(uut.getDisplayName(), "y Equation Numerator - x factor"); + assertEquals(uut.getDisplayableValue(), "0.500"); + assertEquals( + uut.getBytes(), new byte[] {(byte) 0x3f, (byte) 0x00, (byte) 0x00, (byte) 0x00}); + } + + @Test + public void fromBytesFactory() throws KlvParseException { + IGeneralizedTransformationMetadataValue v = + GeneralizedTransformationLocalSet.createValue( + GeneralizedTransformationParametersKey.Y_Numerator_x, + new byte[] {(byte) 0x3f, (byte) 0x00, (byte) 0x00, (byte) 0x00}); + assertTrue(v instanceof Y_Numerator_X); + Y_Numerator_X uut = (Y_Numerator_X) v; + assertEquals(uut.getValue(), 0.5f); + assertEquals(uut.getDisplayName(), "y Equation Numerator - x factor"); + assertEquals(uut.getDisplayableValue(), "0.500"); + assertEquals( + uut.getBytes(), new byte[] {(byte) 0x3f, (byte) 0x00, (byte) 0x00, (byte) 0x00}); + } + + @Test(expectedExceptions = KlvParseException.class) + public void testTooShort() throws KlvParseException { + new Y_Numerator_X(new byte[] {0x01, 0x02, 0x03}); + } + + @Test(expectedExceptions = KlvParseException.class) + public void testTooLong() throws KlvParseException { + new Y_Numerator_X(new byte[] {0x01, 0x02, 0x03, 0x04, 0x05}); + } + + @Test(expectedExceptions = KlvParseException.class) + public void testNotDouble() throws KlvParseException { + new Y_Numerator_X(new byte[] {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}); + } +} diff --git a/st1202/src/test/java/org/jmisb/st1202/Y_Numerator_Y_Test.java b/st1202/src/test/java/org/jmisb/st1202/Y_Numerator_Y_Test.java new file mode 100644 index 000000000..14e04deee --- /dev/null +++ b/st1202/src/test/java/org/jmisb/st1202/Y_Numerator_Y_Test.java @@ -0,0 +1,62 @@ +package org.jmisb.st1202; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; + +import org.jmisb.api.common.KlvParseException; +import org.testng.annotations.Test; + +/** Tests for Y_Numerator_Y. */ +public class Y_Numerator_Y_Test { + + @Test + public void fromValue() { + Y_Numerator_Y uut = new Y_Numerator_Y(0.5f); + assertEquals(uut.getValue(), 0.5f); + assertEquals(uut.getDisplayName(), "y Equation Numerator - y factor"); + assertEquals(uut.getDisplayableValue(), "0.500"); + assertEquals( + uut.getBytes(), new byte[] {(byte) 0x3f, (byte) 0x00, (byte) 0x00, (byte) 0x00}); + } + + @Test + public void fromBytes() throws KlvParseException { + Y_Numerator_Y uut = + new Y_Numerator_Y(new byte[] {(byte) 0x3f, (byte) 0x00, (byte) 0x00, (byte) 0x00}); + assertEquals(uut.getValue(), 0.5f); + assertEquals(uut.getDisplayName(), "y Equation Numerator - y factor"); + assertEquals(uut.getDisplayableValue(), "0.500"); + assertEquals( + uut.getBytes(), new byte[] {(byte) 0x3f, (byte) 0x00, (byte) 0x00, (byte) 0x00}); + } + + @Test + public void fromBytesFactory() throws KlvParseException { + IGeneralizedTransformationMetadataValue v = + GeneralizedTransformationLocalSet.createValue( + GeneralizedTransformationParametersKey.Y_Numerator_y, + new byte[] {(byte) 0x3f, (byte) 0x00, (byte) 0x00, (byte) 0x00}); + assertTrue(v instanceof Y_Numerator_Y); + Y_Numerator_Y uut = (Y_Numerator_Y) v; + assertEquals(uut.getValue(), 0.5f); + assertEquals(uut.getDisplayName(), "y Equation Numerator - y factor"); + assertEquals(uut.getDisplayableValue(), "0.500"); + assertEquals( + uut.getBytes(), new byte[] {(byte) 0x3f, (byte) 0x00, (byte) 0x00, (byte) 0x00}); + } + + @Test(expectedExceptions = KlvParseException.class) + public void testTooShort() throws KlvParseException { + new Y_Numerator_Y(new byte[] {0x01, 0x02, 0x03}); + } + + @Test(expectedExceptions = KlvParseException.class) + public void testTooLong() throws KlvParseException { + new Y_Numerator_Y(new byte[] {0x01, 0x02, 0x03, 0x04, 0x05}); + } + + @Test(expectedExceptions = KlvParseException.class) + public void testNotDouble() throws KlvParseException { + new Y_Numerator_Y(new byte[] {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}); + } +} diff --git a/st1202/testng-unit.xml b/st1202/testng-unit.xml new file mode 100644 index 000000000..43b67fd60 --- /dev/null +++ b/st1202/testng-unit.xml @@ -0,0 +1,10 @@ + + + + + + + + + +