Metadata-Version: 2.1
Name: xtce-generator
Version: 1.2.4
Summary: A tool to generate xtce files from a sqlite database. 
Home-page: https://github.com/WindhoverLabs/xtce_generator
Author: Lorenzo Gomez
Author-email: lgomez@windhoverlabs.com
License: 3BSD-3-Clause
Platform: UNKNOWN
Requires-Python: >=3.6.0
Description-Content-Type: text/markdown
Requires-Dist: PyYAML (~=5.3.1)
Requires-Dist: bitarray
Requires-Dist: lxml (>=4.6)
Requires-Dist: setuptools (~=50.3.2)
Requires-Dist: six (==1.15.0)

[![PyPI version](https://badge.fury.io/py/xtce-generator.svg)](https://badge.fury.io/py/xtce-generator)
# xtce_generator
A tool to generate xtce files from a sqlite database. This database is assumed to have been generated by [jucier](https://github.com/WindhoverLabs/juicer). 
We follow the XTCE specifications described on **XTCE Verison 1.2** as per OMG document number:**formal/18-10-04**. You may find this document [here](https://www.omg.org/spec/XTCE/1.2/PDF).

[XTCE Patterns, Conventions and Caveats](#XTCE-Patterns-and-Conventions)

[Notes For Developers](#Dev_Notes)

## Dependencies
`six==1.15.0`  
`PyYAML~=5.3.1`  
`setuptools~=50.3.2`  
`flake8`  
`twine`

**NOTE:** If you have issues running venv for python3.6 on Ubuntu 16, you should be able to fix it with this:
```
sudo apt install python3.6-venv python3.6-dev
```


## How to use 

Be sure to run this from a virtual environment:
```
python xtce_generator.py  --sqlite_path /home/vagrant/auto-yamcs/juicer/newdb --log_level ['DEBUG', 'INFO', `WARNING`, `ERROR`, `CRITICAL`, `SILENT`] --config_yaml /home/vagrant/xtce_generator/src/xtce_generator/config.yaml  --spacesystem ocpoc
```

After xtce_generator is done, you should have a file with the name of space_system_name.xml. In our case this is `ocpoc.xml` since we passed `ocpoc` as our root spacesystem.
Please beware that you may pass in any name for your spacesystem; this depends on your working context. It could be a vehicle name, machine architecture or the name of a space mission itself!


### Using The XML

The auto-generated xtce file, `ocpoc.xml` in our case, is ready for use for any ground system that is xtce-compliant. For now we use `yamcs`. Here is an example demonstrating such use:

1. Copy your xtce to your yamcs project:
```
cp ~/xtce_generator/src/ocpoc.xml /home/vagrant/yamcs-cfs/src/main/yamcs/mdb
```

2. Be sure to add this file to your `yamcs` instance file:

```
...
mdb:
    # Configuration of the active loaders
    # Valid loaders are: sheet, xtce or fully qualified name of the class
    - type: "xtce"
      spec: "mdb/cfs-ccsds.xml"
    - type: "xtce"
      spec: "mdb/CFE_EVS.xml"
    - type: "xtce"
      spec: "mdb/ocpoc.xml"

```

3. Then all you do is run yamcs!

```
mvn yamcs:run
```


## XTCE Compliance

In the future we will strive to be 100% xtce compliant. However, given that we use `yamcs` as our ground system, if there are quirks yamcs has we will be adhering to those quirks. For more info on this, you may go [here](https://docs.yamcs.org/yamcs-server-manual/mdb/loaders/xtce/).




### XTCE  Data Structures
Our xtce data structures are generated with `generateDS 2.36.2`. There is a quirk with this tool where it will be name `SpaceSystem` objects to  `SpaceSystemType` after generating the python code the xtce schema. This is very easy to fix.


Go to the `export` method of your  `SpaceSystemType`.
Change it from 
```
 def export(self, outfile, level, namespaceprefix_='', namespacedef_='', name_='SpaceSystemType', pretty_print=True):
```

to
```
 def export(self, outfile, level, namespaceprefix_='', namespacedef_='', name_='SpaceSystem', pretty_print=True):
```

After renaming that parameter, you are good to go! 
**NOTE: **Beware that if you do not change this, `yamcs` will *not* run.




# XTCE Patterns and Conventions <a name="XTCE-Patterns-and-Conventions"></a>
While we strive for 100% XTCE compliance, we lean towards YAMCS's version of XTCE, which is *almost* fully XTCE compliant. Below are the specifications of the patterns, naming conventions and overall structure we follow  to generate our XTCE files.


## Namespaces
As the XTCE standard mandates, our namespaces are enclosed with the `<xtce:SpaceSystem>` tag. More specfically, we have a `BaseType` namespace. This namespace has *all* of the necessary base types that a SpaceSystem may use. Please note that we use the terms `Namespace` and `SpaceSystem` interchangeably. A base type is something that is not *usually* user-defined, but is rather machine-defined. Below is a table with examples of base types that may be part of our `BaseType` namespace.

|Name | Description  | Size in bits   | Encoding   | Endianness   |
|---|---|---|---|---|
| uint1_LE | An unsigned integer. | 1   | unsigned  | Little Endian  |
|uint16_BE| An unsigned integer.  |  16 | unsigned  | Big endian   |
|char160_LE| A string with 160 bits, or 20 characters. | 160  | UTF-8  | Little Endian  |

Our naming conventions for base types will *always* be [type][number_of_bits][under_score][Endianness] just lke you see in the table above.

Please note that these base types are nearly identical to what you'd find in a programming language like C. That is because that is what they are meant to represent. Our goal is to auto-generate our XTCE files by extracting data(structs, variables, etc) from binary and executable files. Our reasons for this approach are simple; writing XTCE files by hand is error-prone and time consuming. At the moment the tool chain that will allow us to do this is *almost* done. One of those tools is [juicer](https://github.com/WindhoverLabs/juicer/tree/develop), which extracts DWARF data from ELF files, such as executable binary files. 

### DefaultRateInStream
```
<SequenceContainer name="HES_HK_TLM_MID">
    <xtce:DefaultRateInStream basis="perSecond"
        xsi:type="xtce:RateInStreamType"
        minimumValue="250" />
    <EntryList>
        <ParameterRefEntry parameterRef="HES_HK_TLM_MID"/>
    </EntryList>
    <BaseContainer containerRef="cfs/cfs-tlm-hdr">
        <RestrictionCriteria>
            <ComparisonList>
                <Comparison parameterRef="cfs/ccsds-apid" value="865"/>
            </ComparisonList>
        </RestrictionCriteria>
    </BaseContainer>
</SequenceContainer>
```
This xtce xml node allows users to specify the min/max rate a container packet is supposed to be received by the ground station.
At the moment only `minimumValue` is supported as that is what YAMCS supports(`Yamcs 5.7.9, build c654828f93607440ffee33c5bed72a98af775cd8`) at the time of writing.

### ParameterTypes
Our parameter types are *always* defined under `<TelemetryMetaData>`. The naming of our parameter types follows the convention shown in the table above.

### ArgumentTypes
Our argument types, as per XTCE design and standard, are *always* defined under `<CommandMetaData>`. The naming of our arguments types follows the convention shown in the table above.


## User-defined Types
`EnumeratedParameterType`, `AggregateParamterType`, `AggregateArgumentType` and `EnumeratedArgumentType` types are what we consider user-defined types. This means that these types are *not* part of the `BaseType` namespace.  `EnumeratedParameterType` and `AggregateParamterType` types are *always* defined on `<TelemetryMetaData>`. `AggregateArgumentType` and  `EnumeratedArgumentType` are *always* defined on `<CommandMetaData>`. 

`AggregateArgumentType` members are flattened. This won't affect much of anything since the outcome is the same as if they were bundled inside an AAggregate.

## Arrays

### Arrays Inside Structures(*AggregateType)

**Standalone( that is it does not appear inside a structure) arrays are _not_ supported**  
The following is the example of a structure(`AggregateParamterType`) using an array:
```
                        <AggregateParameterType name="CFE_ES_MemPoolStats_t">
                            <MemberList>
                                <Member name="PoolSize" typeRef="BaseType/uint32_LE"/>
                                <Member name="NumBlocksRequested" typeRef="BaseType/uint32_LE"/>
                                <Member name="CheckErrCtr" typeRef="BaseType/uint32_LE"/>
                                <Member name="NumFreeBytes" typeRef="BaseType/uint32_LE"/>
                                <Member name="BlockStats" typeRef="BaseType/Array_16Dim__simlink_core_cfe_cfe_es_CFE_ES_BlockStats_t"/>
                            </MemberList>
                        </AggregateParameterType>
```
Here we have a structure called `CFE_ES_MemPoolStats_t`(notice the naming convention explained above). It has an array called BlockStats which points to an array in BaseType namespace.  
The way arrays are constructed was heavily inspired by [DWARF4](https://dwarfstd.org/doc/DWARF4.pdf) and [XTCE](https://www.omg.org/spec/XTCE/1.2/PDF) standards.

## Base types(Intrinsic types)
The types shown above such as uint16_LE are what is known as a base type. These are the types that represent things like int, float, char, etc in code. As mentioned above these *will* always be part of the `BaseType` namespace. Below is a table with all of our base types. Please note that this table is subject as we have not fully standarized our xtce format yet.
The endianness cells marked with a "*" at the end are _exclusively_ describing _just_ bit ordering and NOT byte-ordering.
As you see on the table this just applies to the types that are 8 bits or less as byte-ordering is irrelevant for these.
We consider _bit_ ordering for all of our types for the rare case where there is an architecture that takes into count bit ordering.


|Name | Description  | Size in bits   | Encoding   | Endianness   |
|---|---|---|---|---|
| uint1_BE | An unsigned integer. | 1   | unsigned  | Big Endian*  |
| uint1_LE | An unsigned integer. | 1   | unsigned  | Big Endian*  |
| uint2_BE | An unsigned integer. | 2   | unsigned  | Big Endian*  |
| uint2_LE | An unsigned integer. | 2   | unsigned  | Little Endian*  |
| int2_BE | A signed integer. | 2   | signed  | Big Endian*  |
| int2_LE | A signed integer. | 2   | signed  | Little Endian*  |
| uint3_BE | An unsigned integer. | 3   | unsigned  | Big Endian*  |
| uint3_LE | An unsigned integer. | 3   | unsigned  | Little Endian*  |
| int3_BE | A signed integer. | 3   | signed  | Big Endian*  |
| int3_LE | A signed integer. | 3   | signed  | Little Endian*  |
| uint4_BE | An unsigned integer. | 4   | unsigned  | Big Endian*  |
| uint4_LE | An unsigned integer. | 4   | unsigned  | Little Endian*  |
| int4_BE | A signed integer. | 4   | signed  | Big Endian*  |
| int4_LE | A signed integer. | 4   | signed  | Little Endian*  |
| uint5_BE | An unsigned integer. | 5   | unsigned  | Big Endian*  |
| uint5_LE | An unsigned integer. | 5   | unsigned  | Little Endian*  |
| int5_BE | A signed integer. | 5  | signed  | Big Endian*  |
| int5_LE | A signed integer. | 5   | signed  | Little Endian*  |
| uint6_BE | An unsigned integer. | 6   | unsigned  | Big Endian*  |
| uint6_LE | An unsigned integer. | 6   | unsigned  | Little Endian*  |
| int6_BE | A signed integer. | 6   | signed  | Big Endian*  |
| int6_LE | A signed integer. | 6   | signed  | Little Endian*  |
| uint7_BE | An unsigned integer. | 7   | unsigned  | Big Endian*  |
| uint7_LE | An unsigned integer. | 7   | unsigned  | Little Endian*  |
| int7_BE | A signed integer. | 7   | signed  | Big Endian*  |
| int7_LE | A signed integer. | 7   | signed  | Little Endian*  |
| uint8_BE | An unsigned integer. | 8   | unsigned  | Big Endian*  |
| uint8_LE | An unsigned integer. | 8   | unsigned  | Little Endian*  |
| int8_BE | A signed integer. | 8   | signed  | Big Endian*  |
| int8_LE | A signed integer. | 8   | signed  | Little Endian*  |
| uint9_BE | An unsigned integer. | 9   | unsigned  | Big Endian  |
| uint9_LE | An unsigned integer. | 9   | unsigned  | Little Endian  |
| int9_BE | A signed integer. | 9   | signed  | Big Endian  |
| int9_LE | A signed integer. | 9   | signed  | Little Endian  |
| uint10_BE | An unsigned integer. | 10   | unsigned  | Big Endian  |
| uint10_LE | An unsigned integer. | 10   | unsigned  | Little Endian  |
| int10_BE | A signed integer. | 10   | signed  | Big Endian  |
| int10_LE | A signed integer. | 10   | signed  | Little Endian  |
| uint11_BE | An unsigned integer. | 11   | unsigned  | Big Endian  |
| uint11_LE | An unsigned integer. | 11   | unsigned  | Little Endian  |
| int11_BE | A signed integer. | 11   | signed  | Big Endian  |
| int11_LE | A signed integer. | 11   | signed  | Little Endian  |
| uint12_BE | An unsigned integer. | 12   | unsigned  | Big Endian  |
| uint12_LE | An unsigned integer. | 12   | unsigned  | Little Endian  |
| int12_BE | A signed integer. | 12   | signed  | Big Endian  |
| int12_LE | A signed integer. | 12   | signed  | Little Endian  |
| uin13_BE | An unsigned integer. | 13   | unsigned  | Big Endian  |
| uint13_LE | An unsigned integer. | 13   | unsigned  | Little Endian  |
| int13_BE | A signed integer. | 13   | signed  | Big Endian  |
| int13_LE | A signed integer. | 13   | signed  | Little Endian  |
| uint14_BE | An unsigned integer. | 14   | unsigned  | Big Endian  |
| uint14_LE | An unsigned integer. | 14   | unsigned  | Little Endian  |
| int14_BE | A signed integer. | 14   | signed  | Big Endian  |
| int14_LE | A signed integer. | 14   | signed  | Little Endian  |
| uint15_BE | An unsigned integer. | 15   | unsigned  | Big Endian  |
| uint15_LE | An unsigned integer. | 15   | unsigned  | Little Endian  |
| int15_BE | A signed integer. | 15   | signed  | Big Endian  |
| int15_LE | A signed integer. | 15   | signed  | Little Endian  |
| uint16_BE | An unsigned integer. | 16   | unsigned  | Big Endian  |
| uint16_LE | An unsigned integer. | 16   | unsigned  | Little Endian  |
| int16_BE | A signed integer. | 16   | signed  | Big Endian  |
| int16_LE | A signed integer. | 16   | signed  | Little Endian  |
| uint17_BE | An unsigned integer. | 17   | unsigned  | Big Endian  |
| uint17_LE | An unsigned integer. | 17   | unsigned  | Little Endian  |
| int17_BE | A signed integer. | 17   | signed  | Big Endian  |
| int17_LE | A signed integer. | 17   | signed  | Little Endian  |
| uint18_BE | An unsigned integer. | 18   | unsigned  | Big Endian  |
| uint18_LE | An unsigned integer. | 18   | unsigned  | Little Endian  |
| int18_BE | A signed integer. | 18   | signed  | Big Endian  |
| int18_LE | A signed integer. | 18   | signed  | Little Endian  |
| uint19_BE | An unsigned integer. | 19   | unsigned  | Big Endian  |
| uint19_LE | An unsigned integer. | 19   | unsigned  | Little Endian  |
| int19_BE | A signed integer. | 19   | signed  | Big Endian  |
| int19_LE | A signed integer. | 19   | signed  | Little Endian  |
| uint20_BE | An unsigned integer. | 20   | unsigned  | Big Endian  |
| uint20_LE | An unsigned integer. | 20   | unsigned  | Little Endian  |
| int20_BE | A signed integer. | 20   | signed  | Big Endian  |
| int20_LE | A signed integer. | 20   | signed  | Little Endian  |
| uint21_BE | An unsigned integer. | 21   | unsigned  | Big Endian  |
| uint21_LE | An unsigned integer. | 21   | unsigned  | Little Endian  |
| int21_BE | A signed integer. | 21   | signed  | Big Endian  |
| int21_LE | A signed integer. | 21   | signed  | Little Endian  |
| uint22_BE | An unsigned integer. | 22   | unsigned  | Big Endian  |
| uint22_LE | An unsigned integer. | 22   | unsigned  | Little Endian  |
| int22_BE | A signed integer. | 22   | signed  | Big Endian  |
| int22_LE | A signed integer. | 22   | signed  | Little Endian  |
| uint23_BE | An unsigned integer. |   23 | unsigned  | Big Endian  |
| uint23_LE | An unsigned integer. |  23  | unsigned  | Little Endian  |
| int23_BE | A signed integer. |   23 | signed  | Big Endian  |
| int23_LE | A signed integer. |  23  | signed  | Little Endian  |
| uint24_BE | An unsigned integer. |  24  | unsigned  | Big Endian  |
| uint24_LE | An unsigned integer. |  24  | unsigned  | Little Endian  |
| int24_BE | A signed integer. |  24  | signed  | Big Endian  |
| int24_LE | A signed integer. |  24  | signed  | Little Endian  |
| uint25_BE | An unsigned integer. |  25  | unsigned  | Big Endian  |
| uint25_LE | An unsigned integer. |  25  | unsigned  | Little Endian  |
| int25_BE | A signed integer. |  25  | signed  | Big Endian  |
| int25_LE | A signed integer. |  25  | signed  | Little Endian  |
| uint26_BE | An unsigned integer. |  26  | unsigned  | Big Endian  |
| uint26_LE | An unsigned integer. |  26  | unsigned  | Little Endian  |
| int26_BE | A signed integer. |  26  | signed  | Big Endian  |
| int26_LE | A signed integer. |  26  | signed  | Little Endian  |
| uint27_BE | An unsigned integer. |   27 | unsigned  | Big Endian  |
| uint27_LE | An unsigned integer. | 27   | unsigned  | Little Endian  |
| int27_BE | A signed integer. |  27  | signed  | Big Endian  |
| int27_LE | A signed integer. |   27 | signed  | Little Endian  |
| uint28_BE | An unsigned integer. |  28  | unsigned  | Big Endian  |
| uint28_LE | An unsigned integer. | 28   | unsigned  | Little Endian  |
| int28_BE | A signed integer. |  28  | signed  | Big Endian  |
| int28_LE | A signed integer. |   28 | signed  | Little Endian  |
| uint29_BE | An unsigned integer. |  29  | unsigned  | Big Endian  |
| uint29_LE | An unsigned integer. |  29  | unsigned  | Little Endian  |
| int29_BE | A signed integer. |  29  | signed  | Big Endian  |
| int29_LE | A signed integer. |  29  | signed  | Little Endian  |
| uint30_BE | An unsigned integer. |  30  | unsigned  | Big Endian  |
| uint30_LE | An unsigned integer. | 30   | unsigned  | Little Endian  |
| int30_BE | A signed integer. |  30  | signed  | Big Endian  |
| int30_LE | A signed integer. | 30   | signed  | Little Endian  |
| uint31_BE | An unsigned integer. |   31 | unsigned  | Big Endian  |
| uint31_LE | An unsigned integer. |  31  | unsigned  | Little Endian  |
| int31_BE | A signed integer. |  31  | signed  | Big Endian  |
| int31_LE | A signed integer. | 31   | signed  | Little Endian  |
| uint32_BE | An unsigned integer. |   32 | unsigned  | Big Endian  |
| uint32_LE | An unsigned integer. |  32  | unsigned  | Little Endian  |
| int32_BE | A signed integer. |  32  | signed  | Big Endian  |
| int32_LE | A signed integer. |  32  | signed  | Little Endian  |
| uint33_BE | An unsigned integer. |  33  | unsigned  | Big Endian  |
| uint33_LE | An unsigned integer. |   33 | unsigned  | Little Endian  |
| int33_BE | A signed integer. |  33  | signed  | Big Endian  |
| int33_LE | A signed integer. | 33   | signed  | Little Endian  |
| uint34_BE | An unsigned integer. |   34 | unsigned  | Big Endian  |
| uint34_LE | An unsigned integer. |  34  | unsigned  | Little Endian  |
| int34_BE | A signed integer. |  34  | signed  | Big Endian  |
| int34_LE | A signed integer. |   34 | signed  | Little Endian  |
| uint34_BE | An unsigned integer. |  34  | unsigned  | Big Endian  |
| uint34_LE | An unsigned integer. |  34  | unsigned  | Little Endian  |
| int35_BE | A signed integer. |  35  | signed  | Big Endian  |
| int35_LE | A signed integer. | 35 | uint_BE | An unsigned integer. |    | unsigned  | Big Endian  |
| uint35_LE | An unsigned integer. |  35  | unsigned  | Little Endian  |
| int35_BE | A signed integer. |  35  | signed  | Big Endian  |
| uint36_BE | An unsigned integer. |  36  | unsigned  | Big Endian  |
| uint36_LE | An unsigned integer. |   36 | unsigned  | Little Endian  |
| int36_BE | A signed integer. |  36  | signed  | Big Endian  |
| int36_LE | A signed integer. | 36   | signed  | Little Endian  
| uint37_BE | An unsigned integer. |   37 | unsigned  | Big Endian  |
| uint37_LE | An unsigned integer. |  37  | unsigned  | Little Endian  |
| int37_BE | A signed integer. |  37  | signed  | Big Endian  |
| int37_LE | A signed integer. |  37  | signed  | Little Endian  |
| uint38_BE | An unsigned integer. |  38  | unsigned  | Big Endian  |
| uint38_LE | An unsigned integer. | 38   | unsigned  | Little Endian  |
| int38_BE | A signed integer. |  38  | signed  | Big Endian  |
| int38_LE | A signed integer. |  38  | signed  | Little Endian  |
| uint39_BE | An unsigned integer. |   39 | unsigned  | Big Endian  |
| uint39_LE | An unsigned integer. |  39  | unsigned  | Little Endian  |
| int39_BE | A signed integer. |  39  | signed  | Big Endian  |
| int39_LE | A signed integer. |  39  | signed  | Little Endian  |
| uint40_BE | An unsigned integer. |   40 | unsigned  | Big Endian  |
| uint40_LE | An unsigned integer. |  40  | unsigned  | Little Endian  |
| int40_BE | A signed integer. |  40  | signed  | Big Endian  |
| int40_LE | A signed integer. |  40  | signed  | Little Endian  |
| uint41_BE | An unsigned integer. |   41 | unsigned  | Big Endian  |
| uint41_LE | An unsigned integer. |  41  | unsigned  | Little Endian  |
| int41_BE | A signed integer. |  41  | signed  | Big Endian  |
| int41_LE | A signed integer. |  41  | signed  | Little Endian  |
| uint42_BE | An unsigned integer. |   42 | unsigned  | Big Endian  |
| uint42_LE | An unsigned integer. |  42  | unsigned  | Little Endian  |
| int42_BE | A signed integer. |  42  | signed  | Big Endian  |
| int42_LE | A signed integer. | 42   | signed  | Little Endian 
| uint43_BE | An unsigned integer. |  43  | unsigned  | Big Endian  |
| uint43_LE | An unsigned integer. | 43   | unsigned  | Little Endian  |
| int43_BE | A signed integer. |   43 | signed  | Big Endian  |
| int43_LE | A signed integer. |  43  | signed  | Little Endian  |
| uint44_BE | An unsigned integer. |  44  | unsigned  | Big Endian  |
| uint44_LE | An unsigned integer. | 44   | unsigned  | Little Endian  |
| int44_BE | A signed integer. |  44  | signed  | Big Endian  |
| int44_LE | A signed integer. |  44  | signed  | Little Endian  |
| uint45_BE | An unsigned integer. |  45  | unsigned  | Big Endian  |
| uint45_LE | An unsigned integer. | 45   | unsigned  | Little Endian  |
| int45_BE | A signed integer. |   45 | signed  | Big Endian  |
| int45_LE | A signed integer. |  45  | signed  | Little Endian  |
| uint46_BE | An unsigned integer. |  46  | unsigned  | Big Endian  |
| uint46_LE | An unsigned integer. |  46  | unsigned  | Little Endian  |
| int46_BE | A signed integer. |   46 | signed  | Big Endian  |
| int46_LE | A signed integer. | 46   | signed  | Little Endian  |
| uint47_BE | An unsigned integer. |  47  | unsigned  | Big Endian  |
| uint47_LE | An unsigned integer. |  47  | unsigned  | Little Endian  |
| int47_BE | A signed integer. |   47 | signed  | Big Endian  |
| int47_LE | A signed integer. |  47  | signed  | Little Endian  |
| uint48_BE | An unsigned integer. |  48  | unsigned  | Big Endian  |
| uint48_LE | An unsigned integer. | 48   | unsigned  | Little Endian  |
| int48_BE | A signed integer. |  48  | signed  | Big Endian  |
| int48_LE | A signed integer. |  48  | signed  | Little Endian  
| uint49_BE | An unsigned integer. |  49  | unsigned  | Big Endian  |
| uint49_LE | An unsigned integer. |  49  | unsigned  | Little Endian  |
| int49_BE | A signed integer. |  49  | signed  | Big Endian  |
| int49_LE | A signed integer. |49    | signed  | Little Endian 
| uint50_BE | An unsigned integer. |  50  | unsigned  | Big Endian  |
| uint50_LE | An unsigned integer. | 50   | unsigned  | Little Endian  |
| int50_BE | A signed integer. |  50  | signed  | Big Endian  |
| int50_LE | A signed integer. |  50  | signed  | Little Endian  |
| uint51_BE | An unsigned integer. |   51 | unsigned  | Big Endian  |
| uint51_LE | An unsigned integer. |  51  | unsigned  | Little Endian  |
| int51_BE | A signed integer. |  51  | signed  | Big Endian  |
| int51_LE | A signed integer. |  51  | signed  | Little Endian  |
| uint52_BE | An unsigned integer. |   52 | unsigned  | Big Endian  |
| uint52_LE | An unsigned integer. | 52   | unsigned  | Little Endian  |
| int52_BE | A signed integer. |  52  | signed  | Big Endian  |
| int52_LE | A signed integer. |  52  | signed  | Little Endian  |
| uint53_BE | An unsigned integer. |  53  | unsigned  | Big Endian  |
| uint53_LE | An unsigned integer. |  53  | unsigned  | Little Endian  |
| int53_BE | A signed integer. |   53 | signed  | Big Endian  |
| int53_LE | A signed integer. |  53  | signed  | Little Endian  |
| uint54_BE | An unsigned integer. |   54 | unsigned  | Big Endian  |
| uint54_LE | An unsigned integer. |  54  | unsigned  | Little Endian  |
| int54_BE | A signed integer. |  54  | signed  | Big Endian  |
| int54_LE | A signed integer. |  54  | signed  | Little Endian  |
| uint55_BE | An unsigned integer. |   55 | unsigned  | Big Endian  |
| uint55_LE | An unsigned integer. |  55  | unsigned  | Little Endian  |
| int55_BE | A signed integer. |  55  | signed  | Big Endian  |
| int55_LE | A signed integer. |  55  | signed  | Little Endian  |
| uint56_BE | An unsigned integer. |  56  | unsigned  | Big Endian  |
| uint56_LE | An unsigned integer. | 56   | unsigned  | Little Endian  |
| int56_BE | A signed integer. |  56  | signed  | Big Endian  |
| int56_LE | A signed integer. |  56  | signed  | Little Endian  |
| uint57_BE | An unsigned integer. |  57  | unsigned  | Big Endian  |
| uint57_LE | An unsigned integer. |  57  | unsigned  | Little Endian  |
| int57_BE | A signed integer. |  57  | signed  | Big Endian  |
| int57_LE | A signed integer. |  57  | signed  | Little Endian  |
| uint58_BE | An unsigned integer. |  58  | unsigned  | Big Endian  |
| uint58_LE | An unsigned integer. |  58  | unsigned  | Little Endian  |
| int58_BE | A signed integer. |  58  | signed  | Big Endian  |
| int58_LE | A signed integer. |   58 | signed  | Little Endian  |
| uint59_BE | An unsigned integer. |  59  | unsigned  | Big Endian  |
| uint59_LE | An unsigned integer. | 59   | unsigned  | Little Endian  |
| int59_BE | A signed integer. |   59 | signed  | Big Endian  |
| int59_LE | A signed integer. |   59 | signed  | Little Endian  |
| uint60_BE | An unsigned integer. |   60 | unsigned  | Big Endian  |
| uint60_LE | An unsigned integer. | 60   | unsigned  | Little Endian  |
| int60_BE | A signed integer. |  60 | signed  | Big Endian  |
| int60_LE | A signed integer. |  60  | signed  | Little Endian  |
| uint61_BE | An unsigned integer. |  61  | unsigned  | Big Endian  |
| uint61_LE | An unsigned integer. | 61   | unsigned  | Little Endian  |
| int61_BE | A signed integer. |  61  | signed  | Big Endian  |
| int61_LE | A signed integer. |  61  | signed  | Little Endian  |
| uint62_BE | An unsigned integer. |  62  | unsigned  | Big Endian  |
| uint62_LE | An unsigned integer. |  62  | unsigned  | Little Endian  |
| int62_BE | A signed integer. |  62  | signed  | Big Endian  |
| int62_LE | A signed integer. |  62  | signed  | Little Endian  |
| uint63_BE | An unsigned integer. | 63   | unsigned  | Big Endian  |
| uint63_LE | An unsigned integer. |  63  | unsigned  | Little Endian  |
| int63_BE | A signed integer. |  63  | signed  | Big Endian  |
| int63_LE | A signed integer. |  63  | signed  | Little Endian  |
| uint64_BE | An unsigned integer. |  64  | unsigned  | Big Endian  |
| uint64_LE | An unsigned integer. |  64  | unsigned  | Little Endian  |
| int64_BE | A signed integer. | 64   | signed  | Big Endian  |
| int64_LE | A signed integer. |  64  | signed  | Little Endian  |
| float32_LE | A signed floating point number. |  32  | signed  | Little Endian  |
| float32_BE | A signed floating point number. |  32  | signed  | Big Endian  |
| float64_LE | A signed floating point number. |  64  | signed  | Little Endian  |
| float64_BE | A signed floating point number. |  64  | signed  | Big Endian  |
| boolean8_LE | A boolean. "1" means TRUE; "0" FALSE. |  8  | N/A  | Little Endian  |

## Caveats
- The name `string` is special. Any type in the database with the type name of `string` is assumed to be a string
  and parsed as such by the XTCE tool. This means do *not* do things like this in code:  
  ```
  struct string
  {
    char buffer[64];
  };
   ```
- `unsigned` is assumed to be the same as `unsigned int ` as per [c++ standards ](https://en.cppreference.com/w/cpp/language/types).

## YAMCS-XTCE Quirks
Our xtce flavor adheres to yamcs. In the future, we'll try our best to design our toolchain in such a way we can
be 100% compliant with `xtce`, but at the moment we adhere to yamcs-flavored xtce _only_. As a result of this, we will 
need to deal with any quirks this yamcs-flavored xtce standard may have. Below are a list of quirks we've discovered
so far:
- It seems that yamcs has issues processing any `Paramter` entries that have a '#' in the name.

# Notes For Developers <a name="Dev_Notes"></a>
This project can also be used as a library and devs can obtain it from Pypi(particularly useful to parse XTCE files):
```
pip install xtce-generator
```

Make *sure* you have `lxml>=4.6` installed. Otherwise some of the parse methods will not work properly on `xtce` module.  

# Testing
All testing of this tool is done with [auto-yamcs](https://github.com/WindhoverLabs/auto-yamcs)

Documentation updated on April 5, 2022


