From 324bc5646de6bbb1ceba350b9d83034aaa75361d Mon Sep 17 00:00:00 2001 From: Patrick Laport Date: Mon, 15 Dec 2025 09:16:18 +0100 Subject: [PATCH 1/5] added xtce decoding example --- .gitignore | 3 + xtce-decoding/.gitignore | 1 + xtce-decoding/mdb/xtce_v12_UT.xml | 84 ++++++++++++++++++ xtce-decoding/pom.xml | 26 ++++++ .../snippets/XtceDecodingSnippet.java | 56 ++++++++++++ xtce-decoding/src/main/resources/mdb.yaml | 6 ++ xtce-decoding/target/classes/mdb.yaml | 6 ++ .../snippets/XtceDecodingSnippet.class | Bin 0 -> 2548 bytes .../target/maven-archiver/pom.properties | 3 + .../compile/default-compile/createdFiles.lst | 1 + .../compile/default-compile/inputFiles.lst | 1 + .../target/snippets-5.12.4-SNAPSHOT.jar | Bin 0 -> 3855 bytes 12 files changed, 187 insertions(+) create mode 100644 xtce-decoding/.gitignore create mode 100644 xtce-decoding/mdb/xtce_v12_UT.xml create mode 100644 xtce-decoding/pom.xml create mode 100644 xtce-decoding/src/main/java/org/yamcs/examples/snippets/XtceDecodingSnippet.java create mode 100644 xtce-decoding/src/main/resources/mdb.yaml create mode 100644 xtce-decoding/target/classes/mdb.yaml create mode 100644 xtce-decoding/target/classes/org/yamcs/examples/snippets/XtceDecodingSnippet.class create mode 100644 xtce-decoding/target/maven-archiver/pom.properties create mode 100644 xtce-decoding/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 xtce-decoding/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 xtce-decoding/target/snippets-5.12.4-SNAPSHOT.jar diff --git a/.gitignore b/.gitignore index 56d98aa..9b993eb 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,6 @@ # re-include specifically what is desired from images folder !/images/contact.jpg !/ccsds-frames-cfdp + +# include xtce-decoding folder +!/xtce-decoding diff --git a/xtce-decoding/.gitignore b/xtce-decoding/.gitignore new file mode 100644 index 0000000..0a2101f --- /dev/null +++ b/xtce-decoding/.gitignore @@ -0,0 +1 @@ +/cache/ diff --git a/xtce-decoding/mdb/xtce_v12_UT.xml b/xtce-decoding/mdb/xtce_v12_UT.xml new file mode 100644 index 0000000..ea97654 --- /dev/null +++ b/xtce-decoding/mdb/xtce_v12_UT.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + 8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 4 + + + + + + + + + + + + + + + + + + diff --git a/xtce-decoding/pom.xml b/xtce-decoding/pom.xml new file mode 100644 index 0000000..a1ce075 --- /dev/null +++ b/xtce-decoding/pom.xml @@ -0,0 +1,26 @@ + + + 4.0.0 + + + org.yamcs.examples + examples + 5.12.4-SNAPSHOT + + + snippets + jar + Yamcs :: Examples :: Snippets + + A number of snippets demonstrating how to use parts of Yamcs + outside of a server context. + + + + + org.yamcs + yamcs-core + ${project.version} + + + diff --git a/xtce-decoding/src/main/java/org/yamcs/examples/snippets/XtceDecodingSnippet.java b/xtce-decoding/src/main/java/org/yamcs/examples/snippets/XtceDecodingSnippet.java new file mode 100644 index 0000000..7e91544 --- /dev/null +++ b/xtce-decoding/src/main/java/org/yamcs/examples/snippets/XtceDecodingSnippet.java @@ -0,0 +1,56 @@ +package org.yamcs.examples.snippets; + +import java.util.logging.LogManager; + +import org.yamcs.mdb.ContainerProcessingResult; +import org.yamcs.mdb.Mdb; +import org.yamcs.mdb.MdbFactory; +import org.yamcs.mdb.XtceTmExtractor; +import org.yamcs.parameter.ParameterValue; +import org.yamcs.parameter.Value; +import org.yamcs.utils.TimeEncoding; + +/** + * Shows how to use Yamcs as a general-purpose library for decoding packets based on an XTCE XML definition. + */ +public class XtceDecodingSnippet { + + public static void main(String... args) { + // Make Yamcs aware of leap seconds + TimeEncoding.setUp(); + + // Silence log messages from Yamcs libraries + LogManager.getLogManager().reset(); + + // The name here must match with an entry in mdb.yaml which by + // default is scanned from the classpath. + Mdb mdb = MdbFactory.createInstanceByConfig("example", false); + XtceTmExtractor extractor = new XtceTmExtractor(mdb); + + // Tell the extractor to do a full scan. For efficiency reasons + // you may also instruct it to scan only the parameters or containers + // of your choice. + extractor.provideAll(); + + // Generate a fake packet that matches our example XTCE definition. + byte[] p1 = new byte[] { + (byte) 0xA7, // SyncByte1 + (byte) 0xF3, // SyncByte2 + (byte) ((5 << 5) | 31), // SubsystemID + 0x00, 0x00, 0x00, 0x06, // NumberOfDataBytesFollowing + 0x00, 0x10, 0x02, 0x00, 0x30, 0x04 + }; // 4 Samples + + long t = TimeEncoding.getWallclockTime(); + ContainerProcessingResult result = extractor.processPacket(p1, t, t, 0); + + System.out.printf("%-30s %-15s %-15s\n", "Parameter", "Engineering", "Raw"); + System.out.printf("%-30s %-15s %-15s\n", "---------", "-----------", "---"); + for (ParameterValue value : result.getParameterResult()) { + String parameterName = value.getParameter().getName(); + Value engValue = value.getEngValue(); + Value rawValue = value.getRawValue(); + System.out.printf("%-30s %-15s %-15s\n", parameterName, engValue, rawValue); + } + } +} diff --git a/xtce-decoding/src/main/resources/mdb.yaml b/xtce-decoding/src/main/resources/mdb.yaml new file mode 100644 index 0000000..b1a66ef --- /dev/null +++ b/xtce-decoding/src/main/resources/mdb.yaml @@ -0,0 +1,6 @@ +example: + - type: org.yamcs.xtce.XtceLoader + args: + # This path reference is resolved from the file system. + # Relative paths start from your cwd + file: "mdb/xtce_v12_UT.xml" diff --git a/xtce-decoding/target/classes/mdb.yaml b/xtce-decoding/target/classes/mdb.yaml new file mode 100644 index 0000000..b1a66ef --- /dev/null +++ b/xtce-decoding/target/classes/mdb.yaml @@ -0,0 +1,6 @@ +example: + - type: org.yamcs.xtce.XtceLoader + args: + # This path reference is resolved from the file system. + # Relative paths start from your cwd + file: "mdb/xtce_v12_UT.xml" diff --git a/xtce-decoding/target/classes/org/yamcs/examples/snippets/XtceDecodingSnippet.class b/xtce-decoding/target/classes/org/yamcs/examples/snippets/XtceDecodingSnippet.class new file mode 100644 index 0000000000000000000000000000000000000000..775e6faa34c66c73431f7f68aaaa1f930b283824 GIT binary patch literal 2548 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 o;=dd3kNn%6b}D}9$4`+Op9{>OV literal 0 HcmV?d00001 From d59a06b9bc0ff9e3aa5875aefc388d9a480bedf3 Mon Sep 17 00:00:00 2001 From: Patrick Laport Date: Mon, 15 Dec 2025 10:17:56 +0100 Subject: [PATCH 2/5] updated pom file to reflect new project structure --- xtce-decoding/pom.xml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/xtce-decoding/pom.xml b/xtce-decoding/pom.xml index a1ce075..249462a 100644 --- a/xtce-decoding/pom.xml +++ b/xtce-decoding/pom.xml @@ -2,25 +2,25 @@ 4.0.0 - - org.yamcs.examples - examples - 5.12.4-SNAPSHOT - + org.yamcs + xtce-decoding + jar + 1.0.0 snippets jar - Yamcs :: Examples :: Snippets + + Yamcs :: Examples :: XTCE Decoding - A number of snippets demonstrating how to use parts of Yamcs - outside of a server context. + Example demonstrating XTCE Decoding org.yamcs yamcs-core - ${project.version} + ${yamcsVersion} + provided From 9cb2b8a11830bcc24c094cb55cf10e5d68652396 Mon Sep 17 00:00:00 2001 From: Patrick Laport Date: Mon, 15 Dec 2025 10:28:22 +0100 Subject: [PATCH 3/5] added yamcs version and build plugin to pom file --- xtce-decoding/pom.xml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/xtce-decoding/pom.xml b/xtce-decoding/pom.xml index 249462a..7b5e002 100644 --- a/xtce-decoding/pom.xml +++ b/xtce-decoding/pom.xml @@ -15,6 +15,11 @@ Example demonstrating XTCE Decoding + + UTF-8 + 5.12.4-SNAPSHOT + + org.yamcs @@ -23,4 +28,20 @@ provided + + + + org.yamcs + yamcs-maven-plugin + 1.3.1 + + + + detect + + + + + + From 5d9f7e8a8674dd335a647eb3a38a05cd3dbbd5fd Mon Sep 17 00:00:00 2001 From: Patrick Laport Date: Mon, 15 Dec 2025 13:35:26 +0100 Subject: [PATCH 4/5] many changes after testing --- xtce-decoding/pom.xml | 40 +++++++++--------- .../snippets/XtceDecodingSnippet.java | 2 +- .../snippets/XtceDecodingSnippet.class | Bin 2548 -> 2530 bytes .../target/maven-archiver/pom.properties | 8 ++-- .../compile/default-compile/createdFiles.lst | 1 - .../compile/default-compile/inputFiles.lst | 1 - .../target/snippets-5.12.4-SNAPSHOT.jar | Bin 3855 -> 0 bytes xtce-decoding/target/xtce-decoding-1.0.0.jar | Bin 0 -> 3810 bytes 8 files changed, 25 insertions(+), 27 deletions(-) rename xtce-decoding/src/main/java/org/yamcs/{examples => }/snippets/XtceDecodingSnippet.java (98%) rename xtce-decoding/target/classes/org/yamcs/{examples => }/snippets/XtceDecodingSnippet.class (77%) delete mode 100644 xtce-decoding/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst delete mode 100644 xtce-decoding/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst delete mode 100644 xtce-decoding/target/snippets-5.12.4-SNAPSHOT.jar create mode 100644 xtce-decoding/target/xtce-decoding-1.0.0.jar diff --git a/xtce-decoding/pom.xml b/xtce-decoding/pom.xml index 7b5e002..22dc8b7 100644 --- a/xtce-decoding/pom.xml +++ b/xtce-decoding/pom.xml @@ -2,21 +2,17 @@ 4.0.0 - org.yamcs + org.yamcs.snippets xtce-decoding jar 1.0.0 - snippets - jar - Yamcs :: Examples :: XTCE Decoding Example demonstrating XTCE Decoding - UTF-8 5.12.4-SNAPSHOT @@ -28,20 +24,22 @@ provided - - - - org.yamcs - yamcs-maven-plugin - 1.3.1 - - - - detect - - - - - - + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.8 + 1.8 + + + + org.yamcs + yamcs-maven-plugin + 1.2.9 + + + diff --git a/xtce-decoding/src/main/java/org/yamcs/examples/snippets/XtceDecodingSnippet.java b/xtce-decoding/src/main/java/org/yamcs/snippets/XtceDecodingSnippet.java similarity index 98% rename from xtce-decoding/src/main/java/org/yamcs/examples/snippets/XtceDecodingSnippet.java rename to xtce-decoding/src/main/java/org/yamcs/snippets/XtceDecodingSnippet.java index 7e91544..7bfcc11 100644 --- a/xtce-decoding/src/main/java/org/yamcs/examples/snippets/XtceDecodingSnippet.java +++ b/xtce-decoding/src/main/java/org/yamcs/snippets/XtceDecodingSnippet.java @@ -1,4 +1,4 @@ -package org.yamcs.examples.snippets; +package org.yamcs.snippets; import java.util.logging.LogManager; diff --git a/xtce-decoding/target/classes/org/yamcs/examples/snippets/XtceDecodingSnippet.class b/xtce-decoding/target/classes/org/yamcs/snippets/XtceDecodingSnippet.class similarity index 77% rename from xtce-decoding/target/classes/org/yamcs/examples/snippets/XtceDecodingSnippet.class rename to xtce-decoding/target/classes/org/yamcs/snippets/XtceDecodingSnippet.class index 775e6faa34c66c73431f7f68aaaa1f930b283824..df12a62680aa265847a185dab030d5b7567ce6d8 100644 GIT binary patch delta 51 zcmew&{79JN)W2Q(7#J8#HgZIn~;ih+P@q diff --git a/xtce-decoding/target/maven-archiver/pom.properties b/xtce-decoding/target/maven-archiver/pom.properties index aab04d0..42d5bdb 100644 --- a/xtce-decoding/target/maven-archiver/pom.properties +++ b/xtce-decoding/target/maven-archiver/pom.properties @@ -1,3 +1,5 @@ -artifactId=snippets -groupId=org.yamcs.examples -version=5.12.4-SNAPSHOT +#Generated by Maven +#Mon Dec 15 13:32:11 CET 2025 +groupId=org.yamcs.snippets +artifactId=xtce-decoding +version=1.0.0 diff --git a/xtce-decoding/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/xtce-decoding/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst deleted file mode 100644 index 3767005..0000000 --- a/xtce-decoding/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ /dev/null @@ -1 +0,0 @@ -org/yamcs/examples/snippets/XtceDecodingSnippet.class diff --git a/xtce-decoding/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/xtce-decoding/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted file mode 100644 index b3f9318..0000000 --- a/xtce-decoding/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ /dev/null @@ -1 +0,0 @@ -/home/pla/dev/git_yamcs/yamcs/examples/snippets/src/main/java/org/yamcs/examples/snippets/XtceDecodingSnippet.java diff --git a/xtce-decoding/target/snippets-5.12.4-SNAPSHOT.jar b/xtce-decoding/target/snippets-5.12.4-SNAPSHOT.jar deleted file mode 100644 index e69812e37dc8129a4a04f62ac27c5562e4bc985d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3855 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 o;=dd3kNn%6b}D}9$4`+Op9{>OV diff --git a/xtce-decoding/target/xtce-decoding-1.0.0.jar b/xtce-decoding/target/xtce-decoding-1.0.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..d419f3ff9156e405458a442e6f238d1dd0df6815 GIT binary patch literal 3810 zcmbVO2{@GN7avK(SQ=TcMzWM_V=E%b*cm&Ko$RvDSSr~gWbE4w{|r&KvL)MCMzU`S zS!0NhB}?SuKXWDBOZU0YJ@dTZ_s#R2-|s!={oeO?js~3gI0!(n6AqDve?EM_km2vD zayl?RB{g||jqh%x01~{LnH5=sJ^r;Xe$f8xrV3M2l9$ugfvU={sJ6AL!1jdH|@l_dw3Dg7%*pKaS3dixWIlI~X zi2kq#A$5YsZF5Hp#6S4a{KXI9War{yg**U|{<(TH)|+21lK=n{_@(1L8gK(?VI^y2 z;cRK=WTU;u0<~~3M<60};Ygb6j5|&%ubM5RSfyB{rzq|06mQ=Oyb!5t@K#IdLQt4^ z>Sz{mtV&99T%RariEp+AG5qQ#PM#qhV|>@B(&9}APFWAyu&c(TXj}I&W%$b1oye`R z#jRc6kNv(iTV%D8-dT?+iBONj!1WY^B=-!|4eyjENs9Tv7|+OTMCprEV=4SCr=JFp zq9I{nNjj#^S6;8?nFtLd-wE@Hri#MR&m9J6tjn9gZudPa&}P4#`Ea8^8Vf2~j*ObM zYlYG)38t2Y%iPiD2ZfmHYkIZMMKpKJZ}STEY%9~{T1v1gbVXB_2)hVoByuNcyr3sT z0k7v_?*x~6vO!fJW`~?_+;Ybjr|JiLV5uuOPqY+dCsMj1*OQFXE`DNawp^#;73)j~ z2u+I@lS^1#K67)%cI4XJZ)~QskCq|35EABr3w5Ki!1D~ttbz-*^mK+(_v6AW)F07I zJg`!lDa#%3=jfI_o7&CS`oaN+ZWy+)(J=6MHW2DmAI(cSUcp}BstJy`+FY0s7)b0H zqUyPdEapv#t`Hyj9OsgokQjQCp$Br6+rvT~ZaryjtR6R`SgDNC>#r01yh_T7qn4EB zw_+Q310G8l9KtybCk$5m`slD-t_3r9Ggos+jLR+w$mBg&$po?bM?6l1{I7?f>vE8S z7*(zpMWk?^(ImK~JRz{0?azR)G%BH}>D0$*vFlHg1!YwX z=Hfhr-v2&lYvyx}M&?YmnEdsWI(-l_9TeXaw?GyCTc>&vqGuu{Oi-d7%)2#|%Y=DU z_|Yrad}UW5=YvF=cDh9h%&{@lK#p8mSVzgzfh?Ac6s1Hbr&3Dmk<0d4-6X_apCjMD zV>*=LLqJ&giw7QBPaIZ>Gqf;38O%T#PwtD;9&sfYKinpL*l>~lGt$mA!#Y<@XH@yO z^DwWrw8t3U>VglANfq3)UUJ;OFlXjw6?Pb`LB zD;=8eIhp!%WN1yF%HQU2vM5@Rd=P~eK6z|y;?uV(cQPd?t~Zr!#9@lfTx(SGUbI8B zhtho>rs{ZenRQHiV#yG9r5$5NfX#8q)0t-`+WK)lhV1DHD^H(OeWLpx1F99mBAj;v z%<_iLenPBrmJvM`M^RuLlx6&-WgrMt{c!3zr3waRhqR5)O74ctR#2^%@_X1(Y&~L< zV0u?^EGH>z)7Yq9Wh7~vOik;>2gnAbmuX`8oxfOKvriJ}}?(0`cVVum!O&Z`Op0VB-6?MU)(Ga~Q?&_LQU{!Fdq_Z#1y$Z&AZV5QrVAzo3 z&%Z2EprNC^acmJB2@@aZ9>s1otOG4ei5$x`h^IHAaO@~5R4xoflX6FB2bM5=Z-TQa zdzWZm{Pz^tY-Bn!8n3+d_(6&vj+Qr}cxiXIifRYd3xIEN z*Ybk&tG6S?Mau@;xE69w?uUK2BAvvC{iEzUntNC|{XhNR& z{|fJgFIs$-->cS-Xh;FGw;~O9=^7Zj!-X0hxj;W=eGjj#<8#3 zH{OjlI#sg5;;f_v$TA~TXM-ByxM88lhL;Xy?Liw08|ppc7X!QX)<+PYk-pV0U(F1j zaD<(PzTWf>Wk4V`J3vpSXavHIbdy##GfKHRGoKiOlek;X5W$UOhaTN>3ueG@Us&l_ zs=iY;G(KY2l}{gjuDk|gP+6Z~ZNvyCA=b0lb=qCWa7QZHy}v`KiQBAb z0u5D+S(cuj2j&}Rd7~@NhUBWRcePrT6sx9^4oYvf8%o_qL9YzvoT%U2S-_tA_KJlu z2!lR`y{IQrBDL_AAsuA!$>kPMuNUWLsvv*At|S38e5JNQUQSBT?@nMMk9R_TO;wGt zZ$&virqkkCl;}$&=wo$Md|%V28IuC8-8{oVHuAVBsdtHU^)bXO?GKgD+sYTdN@G*{ zd&EY+fN}yF?p{=CgvM@-vyO>Yy^ma5`aNPRpq({F_Dx-e!q>Zy#EL~k!`Wx5Y0RE! z&AQ7cko4i%wH#B#p>&e3bJ+z#qm-6w=OVH^gjfVyBCJ2?ZsyA{cD|K{yHkpQwpNy9 zza&OGRi8J*pq5q*RM{iQ>FahFI?tJmd-5+yh+LBmzQ?vLecv>C7YMbf`P+eR3lh$8 z#&0Vmen|eu?d9U;>|*7Hw6j7`HWyOWp9KTDwlNbi9j8!P@K`nbhcab5fO;jyDt5n! z?X7Qpq7pY=ee0k$1s3?&_?us^I}OYvvrADBr5Rttq!&8{=&Tv0xpx2FHhwKV`FuI; z0;Tuo&CfEsi_d`=St_Ptj)C%*c|}o$jrC+2aH3krsZz4rmb;UiDziT4Z)*oI;8k9!^RuS4BSfPf(&roJQgJLX^G2tD(j z5pa}5KX=+cY12Nz(LMA&MTx)U(FDKjs1Fw5=-P0=Tzlf6QXHTTFC9Ue_Y4f!-Sq_i zwD|i%y`RisFhQyhz?p}^M+*0^`3TZ|z&H7?`2H^B`|L+c`96P%zYxBb{@7=GsU8vS vU)jG4`@wqdeTBat=z~e3@%!w*Omc9%HQ*%pF9`rp;D0W}0DuuW;otuOBf_zy literal 0 HcmV?d00001 From 0f7472e43c4a39c75039dbdfb6487ba2f876a842 Mon Sep 17 00:00:00 2001 From: Patrick Laport Date: Mon, 15 Dec 2025 14:44:44 +0100 Subject: [PATCH 5/5] now runs successfully and added some notes to the readme --- README.md | 6 ++++++ ccsds-frames-cfdp/.classpath | 19 +++++++++++++++++- .../.settings/org.eclipse.jdt.apt.core.prefs | 2 ++ .../.settings/org.eclipse.jdt.core.prefs | 9 +++++---- xtce-decoding/pom.xml | 11 ++++++++-- xtce-decoding/src/main/resources/mdb.yaml | 2 +- xtce-decoding/target/classes/mdb.yaml | 2 +- .../yamcs/snippets/XtceDecodingSnippet.class | Bin 2530 -> 2531 bytes .../target/maven-archiver/pom.properties | 2 +- xtce-decoding/target/xtce-decoding-1.0.0.jar | Bin 3810 -> 3790 bytes 10 files changed, 43 insertions(+), 10 deletions(-) create mode 100644 ccsds-frames-cfdp/.settings/org.eclipse.jdt.apt.core.prefs diff --git a/README.md b/README.md index 2f833eb..cb3a9ac 100644 --- a/README.md +++ b/README.md @@ -49,3 +49,9 @@ When a stream of CCSDS telemetry is available from a TCP client only, this clien ### ccsds-frames-cfdp This is the same as the ccsds-frames example from yamcs but with the addition of the CFDP service. The CFDP shares the same virtual channel with the regular TCs but has lower priority. + +### xtce-decoding +Shows how to use Yamcs as a general-purpose library for decoding packets based on an XTCE XML definition. +It decodes a single packet initialized in the code, and prints the result to the terminal. +To run: $ mvn exec:java + diff --git a/ccsds-frames-cfdp/.classpath b/ccsds-frames-cfdp/.classpath index c6bb293..a896564 100644 --- a/ccsds-frames-cfdp/.classpath +++ b/ccsds-frames-cfdp/.classpath @@ -13,7 +13,7 @@ - + @@ -36,5 +36,22 @@ + + + + + + + + + + + + + + + + + diff --git a/ccsds-frames-cfdp/.settings/org.eclipse.jdt.apt.core.prefs b/ccsds-frames-cfdp/.settings/org.eclipse.jdt.apt.core.prefs new file mode 100644 index 0000000..d4313d4 --- /dev/null +++ b/ccsds-frames-cfdp/.settings/org.eclipse.jdt.apt.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.apt.aptEnabled=false diff --git a/ccsds-frames-cfdp/.settings/org.eclipse.jdt.core.prefs b/ccsds-frames-cfdp/.settings/org.eclipse.jdt.core.prefs index eeac0e7..1b6e1ef 100644 --- a/ccsds-frames-cfdp/.settings/org.eclipse.jdt.core.prefs +++ b/ccsds-frames-cfdp/.settings/org.eclipse.jdt.core.prefs @@ -1,8 +1,9 @@ eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=17 -org.eclipse.jdt.core.compiler.compliance=17 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore -org.eclipse.jdt.core.compiler.release=enabled -org.eclipse.jdt.core.compiler.source=17 +org.eclipse.jdt.core.compiler.processAnnotations=disabled +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/xtce-decoding/pom.xml b/xtce-decoding/pom.xml index 22dc8b7..5b42b70 100644 --- a/xtce-decoding/pom.xml +++ b/xtce-decoding/pom.xml @@ -9,7 +9,7 @@ Yamcs :: Examples :: XTCE Decoding - Example demonstrating XTCE Decoding + Shows how to use Yamcs as a general-purpose library for decoding packets based on an XTCE XML definition. @@ -21,7 +21,6 @@ org.yamcs yamcs-core ${yamcsVersion} - provided @@ -40,6 +39,14 @@ yamcs-maven-plugin 1.2.9 + + org.codehaus.mojo + exec-maven-plugin + 3.1.0 + + org.yamcs.snippets.XtceDecodingSnippet + + diff --git a/xtce-decoding/src/main/resources/mdb.yaml b/xtce-decoding/src/main/resources/mdb.yaml index b1a66ef..d673b47 100644 --- a/xtce-decoding/src/main/resources/mdb.yaml +++ b/xtce-decoding/src/main/resources/mdb.yaml @@ -1,5 +1,5 @@ example: - - type: org.yamcs.xtce.XtceLoader + - type: org.yamcs.mdb.XtceLoader args: # This path reference is resolved from the file system. # Relative paths start from your cwd diff --git a/xtce-decoding/target/classes/mdb.yaml b/xtce-decoding/target/classes/mdb.yaml index b1a66ef..d673b47 100644 --- a/xtce-decoding/target/classes/mdb.yaml +++ b/xtce-decoding/target/classes/mdb.yaml @@ -1,5 +1,5 @@ example: - - type: org.yamcs.xtce.XtceLoader + - type: org.yamcs.mdb.XtceLoader args: # This path reference is resolved from the file system. # Relative paths start from your cwd diff --git a/xtce-decoding/target/classes/org/yamcs/snippets/XtceDecodingSnippet.class b/xtce-decoding/target/classes/org/yamcs/snippets/XtceDecodingSnippet.class index df12a62680aa265847a185dab030d5b7567ce6d8..3a6c3161f23b4710608d2d471a35d32692d282ca 100644 GIT binary patch delta 1257 zcmZWo-BTM?6#w1qX76URv>~Yp5o~FIK!BJ4A~vYCe5AG#tb|fSEp|h;G;I>n5Gd4- z)UW!j#5>a&9bX(De5Cr2g4zyGcE&d!e04@UX4-+=~_+kJRHzCPk{)$H2{1BVWuB_+MuG@gY`Ph|T@w!^4Tokl1ktM_ zY?aiCrNxzO#yphES;QkcqUaMhS+g3%fKER>D1K+-$`B54JR$mQ9^xItuo$zo9)60! z-4Py$F12=q`v(7)nu>!Aj$=m2$eU%eq~Z{RbG)#SEtqC0TUbyr${iSsW2R*^c%bIU;<{STQ2YKpm%Hh`8J;&oczXwiM7bq+#kf zg9UL_jw)H4=Qt;Rk(&uIhrIYpZd21()KSC*;j>4hX)Ng|;{uUgFw69FGe&ONbmA0N zbX>$L4fL$BG-j$+@tz9d(c=Vcpmzp^B&S=1G$U>Az7F-%j&#i zn($~SuktEQ`k#=H5GRC$kl^5^yw8X;;=%*(mkY(RZM(&CK}U)~Icl9Z z@E{)Icv#>OJj&40KrB|wS@QDIo@-kr=_-?Bj}hGPtxv~6g1e;=*D*nGBp5i1BOH?g zk7J6VS6pvMr1}6nh;c5Ak+R0AKztmoR4rc@`%*(!DGMtCaaaN#! z1$jEyE-wVT$zf68931&^Fd3giS)c-kexqP})Q97ivqUk^ZbbSygLO+s`I~l1 zUe`<+);=AKq&+KlZrZA5ta*ogFLGRAXs);gbJZ&4YGx@vZ%*guIW9?u53W^d!u&4) znh|J3UD8bAjCgS18rWwIbB(BP1`U`;RQ&INB`lNnCeCApZYY>-fs++X-2~r+s3R8J zrfi~Z>PvKF2d^P9Jyb_mH1d_6Rb;E)w5BPUET^N>iE2@esINx#Xq0FuNW}2aId>d#yM4)klK;z*C z=tno}e$N#6J)59)+|uJ~ISgR|!_+$y>qz1g+KwNv8$V(Xex_Z&fl+GiUZ!BI(ciN$ z$TomgJckf@bmMuvKzBE=122*krsxq|z#8o#^%^hXB4vx>PrQs*=q2L#9k1dwde|I3 z#OsG}i3(c4`*?#MOQjU+cnfdSlfFY?2?TDU4$g6z<6Vvpj&+seFsC8L-VKBu?oj{$ diff --git a/xtce-decoding/target/maven-archiver/pom.properties b/xtce-decoding/target/maven-archiver/pom.properties index 42d5bdb..6177063 100644 --- a/xtce-decoding/target/maven-archiver/pom.properties +++ b/xtce-decoding/target/maven-archiver/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven -#Mon Dec 15 13:32:11 CET 2025 +#Mon Dec 15 13:54:48 CET 2025 groupId=org.yamcs.snippets artifactId=xtce-decoding version=1.0.0 diff --git a/xtce-decoding/target/xtce-decoding-1.0.0.jar b/xtce-decoding/target/xtce-decoding-1.0.0.jar index d419f3ff9156e405458a442e6f238d1dd0df6815..0f9dce9908f7251fb5467f11b1742b30aaf76f0b 100644 GIT binary patch delta 2358 zcmZWrc{CJi8)pVHn6VTZ``DtfW{`_4(}IvjwyqhKr6LS+HMSx(=ioo5}MPLKw=yvnZ&;}3+vj}V{mAv?D<|%$rBXt))(45P1-P6#)%Rr_wzQ@ z6veN{{AB!dY;X0O32XQJ>TMIw@dv{qb?^>h`%$9My%Td^dHP_=k_W7oNdvp*9KMmSe9Q)hO>z48Nr6 zEHtzeFz7dNo!+^JNlWtc(6BGc&9Ct?ILdp@Ti7r3l6F8R6RmAsx}uk?7KTWt&3 zE_lW37D}pKE&i3G=wwo^mT>j;KL)kcCSNMbtrZ|ubekP~`UJYNb)a(;1xkSB1z6Z2 z_dWs-2*mm$ll6J=nx(#iZUAM{YtB(kQ@Znfp?;|SN*Am6^`AqOY!zy9a14Z873oeZ z6-MBF`wHQk)qeI8wtBd48j7>dSs@y^3f)sauf!=t(M5?r;z ze{Zjt)sk7z&!-wJ=JzXvcc zCp^VLnc$fN}Oivlv_-L8pBaoLSR-FMM1yJMKt+1HgU-fR-%8_-YDiR z#N}ymuaKS>`68{~<7P!`WJst1QEJFPp-lh5txum(!ib_{Q_^C{>>LkfQE!N-I{}{| z=lr$5e5paQhJla0I=>%QHVeqUnCJe?%=cA%Su1azcv)dHCAy!BtFMp)lbX>O zj$8S3rIY8)(@|?LPnwyl4_{zFoCw7EuKvY&F|?cbiEK)Y}jV8^-}}8YhH}E zh3LX(Pv&G@@EcX=3FW1+GBXhum9rs=tSc|JIqxUsA_W0k^hH`r2(P8a-n%Tol+S{^ zpWQS%LKv4EY#F1v)S8lq+~{CfQPmf)Itl1bBp?TBCm6t34p^*AzAzX{c;^(i`9k){ zBULF`WQFsrY@dTS{Zca>mOt}E7*lJJ7CfNp4jkBo4PNF?3xDJlbmM7$`shbm1aReM z&KD}|YrKS!#QO{mL|X9<7Sn5OlfK7$9#cIlg%=%U3kkhX;}e!iD7*yv3#VSdds)firsEp8X1qI3o-#XjgrC{*gG1j@b-yWxUY86pS6Y4fX=|qi|D32? z23uMP_^JK^l2dTG>MNvu7KPK7siIFH5~lBC(p!noh^?bMnd=1bM1raZQfAB7wH=!> z&KO*&4vrXZ4vrI~ zeGrm#7YruYV{wykk%(ck>8LBTX3{cqfs)a1F7sVgik-uhLU*G^78Gnj_ofkKc?>%r zHYXZ&HZd_nCz~t-rt6`!C_N0Z)|2RD738YHSF~_g>jB0gt#+ZH9-&-VpZI_RM;9p@TsOJ#1+j4WJ@;>zA9SJ6bRNUW@%UWzCo`e^D#N2^ z2<9&D@0!fa+-Wh**%l0SBR}uZdXuuHp7aAEZ*QiG{YX3Lo6?rC{qCK= z&U}qio&vmy-ofz>YYv4MUX4Lj@26ZRB6okL7$v?*{PU%)hqKDQ;o`pgU=QwsmH6L# zn$4a>7tez4N&W{rJLupT|HBY2f`1^+-!m}C%kvhrzlN_%ONe7+uZ^BtD_07&$RiQ; zgEm0)1&DYHzopvt>Q*K0WsN^HOTqXyrn?u=T^4oZXpqcQ!1i0CthMln*&F79rAs9r z=ks;bPqvh%A8it0K~Z0JM4#_}n~WDswscSBk{nBQ5W8Mcvv$C3PJjq6@RyJvdGqTY zC<#&?zbTv7^ZZ(D5QXTm!3JXTe_|p9f@TLlL!=}qJRBUp9&Q>TSABi{TkwDNWS~-< z0VG4H3_I5aDh0>}kvc#}NjXqHcBK3uG7WkR)*0z>mS&2Mq-x fT@ir5|Mi)_5)ZI0GMw-4TrN_VfCP^PKl|}Ni7`TS delta 2397 zcmZWr2{aVy7q`TiF*A*1iLuKbW{AkMj6H->Vh9moB3Ykg8f(amX{?2p8Bs&$;J2_q*rUCp9evcCzE$2jbc@ehd+O zn1>HT)VagMIrq!%#bqTq8AxED&F{g9 zDulD{Z%^5(B&8b`O_cGH>Q+zrGW8H95M0?0rc3 z;lHUx`8wM9fAaTq%$~DpJb`x| zp(DPn3dpg9j8R$_<(aQwlewcGSRrG%qs`cO7x`nYFsT8lW<{eZizRLI%E$JlAURy- zy*&6IgIcP`lB^A&)EF>9r_$pSth+ZI>*0WeyC;#KejV>B{L*AyX{}o3!V;s0rK{!y zjn0+l&zaGI;49#Ym;-JpQg%tVZ^+U@ChMQR&%r2B24Ur)>iGGyXZ##SC~%n$TfC5n zSNY8k3GwRfR%qlPC6b)cbW7ertpGZb!*U)aTHbv9Ns@)z6 z^sk}mVa}oW`Yk21nAgSkD7n}G)$kPR{jjM|Yhf8t({3N$JaQgK%*4j)%sCWjMwWgZ z91G|qTNtQ*kwM3-^f|v*mKdopKj`(q>UYHu-|9uaU$&Yefwr2gp(6Ql z%#6IxsR`%nL<}*?Hd$SwImgF*oz|OI^FggKP@Iwwu+LbsRC@aL2x}0FRw&6`dGHwe zMdS}Ld=Fekr}7+3=9Ng$v_a#%IC(M~T;-Wm=J}(WnFMOSHS-u^Ps0aBT*@gc7=X_= zK-X)vq5{F}yAnnc?;3b2^2;_oJ=*NY^S6N~Pd)hv-+&KEOfSE~8B}(~6Yy<)3ry`H zPlo^H_xp(`)5ct_eYMz@AIVwk;WQZZlVIVF&{nX|5qpY9kdOlfAwf1HF60lJQ@U3e z;mjy)W>L`o=K$WL5$h=}W@_!$#0T0Df&G5p7 zvB({>+_CG^%AMuA+`sm%0B7HlI{0h%*6VeE`W{pOjQ3z3U@tTuOhE67bQptpxVR{M zTwMC3O@I#eO6Xlrzh|h|&g@W;)C#b=a}Skc9T< zn7ZDijl~VeK||fd0oV2M@Mr?I`T2{vQU1$jlA13!!Bb@s{_h*E)Gd#}buWV9k z)s#!`qha}K-O}84o}>?VgRiED(bQB{`j(nw>po0j#{=Iy63sYV-$HY5Y|Hic5Vzyw zb-fr9f?7I(3`$JHLd~^Q4Nt%H7L8zz&(45L$T=dqUM%&VEcH$my_E|0p3E(eoGOv{ zvLiZ7fvSV&PG`x@M!KMPOba4M`jDM!-qq7&O`F@xsM)W8N1kPI+>Ec_l5|I0sE5QKQA=Xtd zYpY~>O)hBccx$_rr77Y@Y+{~zT<)WmrWQ|ZLp`S{Ny9P-`6wTmhYmgRvt(90Kf&aJ zv?6f)UT6N$lJe?3xOefN_TRQosQg4R3P-Sm1`|I(6$$OvbZt8{N$e@PN&TkxgtetR zne2pKx!V@6=oIUp*Wh^#-^1HwA379EMHhFSUFMGv%_whGoZ(FqF@8x^&`!&;U2a{- zEQ>$S7G)O+(F3tpmMwnd5ks1lylMEQRd)x4OhHllj#&TU^HVC( zT1!THCKf5z<+oAEUc_C1W zg4!H0LCO>~-5ctDPR0Rlu-+aRfKC2SPvF4LGJER6dwjN($SG~(xB$n0Sq-k0vtrb o|IoR(YH&ya4joCdgbM%N|Nmaw2P(ot1pR$c0hQ+W5Zo*I3ms%i2><{9