Marshall,

Looks like we'll have to give some thought to whether bigEndian and LSBF can go 
together. We've had no actual examples of this until now. I will bring that up 
with the OGF DFDL Workgroup.


But to deal with this today, these kinds of mixed bit order situations 
generally require use of the dfdl:inputValueCalc and dfdl:outputValueCalc 
properties.


A simple example is here:


https://github.com/rchampag/dfdl/blob/master/arinc429-label/localizer-deviation-label.dfdl.xsd


This was for individual bits, but in your case they would be wider integers.


For your 3 fields in the example I suggest you parse as 4 fields


h_slot2LSBs - 20 bits

h_slot1 - 12 bits

h_slot3 - 20 bits

h_slot2MSBs - 12 bits


You would do this all bigEndian and mostSignificantBitFirst.


The above would go into a hidden group so they wouldn't show up in the logical 
data.


Then you would have 3 logical ordinary, not hidden elements

slot1 dfdl:inputValueCalc='{ ../h_slot1 }'

slot2 dfdl:inputValueCalc='{ ( ../h_slot2MSBs * dfdl:int('x80000' ) + 
../h_slot2LSBs }'

slot3 dfdl:inputValueCalc='{ ../h_slot3 }'


dfdl:int('x80000') constructs a integer from a hex string, and I think that's 
the right value. Or maybe it's 'x100000'.


You can also use math.pow function as in


xs:int(math:pow(2, 19))


(you need to add this namespace to your xs:schema element 
xmlns:math='http://www.w3.org/2005/xpath-functions/math')


The tricky part is that for unparsing you must invert this using 
dfdl:outputValueCalc. So the 4 hidden elements would be like this:


h_slot2LSBs dfdl:outputValueCalc="{ ../slot2  mod dfdl:int('x80000') }"

h_slot1 dfdl:outputValueCalc='{ ../slot1 }'

h_slot3 dfdl:outputValueCalc='{ ../slot3 }'

h_slot2MSBs dfdl:outputValueCalc="{ ../slot2 idiv dfdl:int('x80000') }"


or something like that. My details here are probably off by 1 or something.


DFDL's Xpath-like expression language has the operators +, -, *, div, idiv, 
mod, and the math.pow() function. Alas there's no shift nor a bit-wise & and | 
operator. Generally it is possible to figure out how to achieve what you want 
by way of mathematical operations.


Also note: If you want Link16 specific support we have a channel for FOUO email 
support which is [email protected].


...mike beckerle

Tresys



________________________________
From: Marshall Miller <[email protected]>
Sent: Thursday, January 11, 2018 2:34:46 PM
To: [email protected]
Subject: Help implementing schema for SISO-J

Hello,

I am trying to implement a schema to describe a LINK-16 message
embedded within a DIS Signal PDU as described by SISO-STD-002 [1],
paragraph 5.2.2.9 and table 5.2.3; commonly referred to as SISO-J.
The problem is that fields are packed into 32 bit words with big
endian byte order, and little endian bitfield order.  It is currently
an error to specify a byteOrder of bigEndian with a bitOrder of
leastSignificantBitFirst.  Also, I have not found a way to set word
size; it appears that word size is implicitly set to the size of each
field.

Following is a simple example to demonstrate how fields need to be
interpreted.  It is just an example and does not represent any part of
a SISO-J message.

Data is comprised of 3 unsigned integer bitfields:
slot1 is 12 bits
slot2 is 32 bits
slot3 is 20 bits

Given an input with the following bytes in hex:
01 23 45 67 89 AB CD EF

Parsed results need to be (in hex):
slot1: 0567
slot2: DEF01234
slot3: 089ABC

Explanation of results:

Since the bitfields need to consume data in a leastSignificantBitFirst
order, it is easier to represent the input in right-to-left order
where bits are consumed starting at the right and moving toward the
left.  Since words are 4 bytes, and in big endian order, the lowest
bit in the 4th byte is the first bit to be consumed.  Reordering the
input data and consuming data from right to left yields the correct
field boundaries.

89 AB CD EF 01 23 45 67      parse fields right to left
05 06 07 08 01 02 03 04      input byte position

slot1 consumes the right 3 nibbles, slot2 consumes the next 8 nibbles,
and slot3 consumes the left 5 nibbles.

Could you please let me know if there is a way to parse fields in this manner?



Marshall Miller


[1] 
https://www.sisostds.org/DesktopModules/Bring2mind/DMX/Download.aspx?Command=Core_Download&EntryId=43048&PortalId=0&TabId=105

Reply via email to