| [1491313] | 1 | <!doctype html>
 | 
|---|
 | 2 | <html lang="en">
 | 
|---|
 | 3 | <head>
 | 
|---|
 | 4 | <meta charset="utf-8">
 | 
|---|
 | 5 | <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
 | 
|---|
 | 6 | <meta name="generator" content="pdoc 0.10.0" />
 | 
|---|
 | 7 | <title>ammosreader.AmmosIFReader API documentation</title>
 | 
|---|
 | 8 | <meta name="description" content="I provide a specialized Ammos Reader for IF data." />
 | 
|---|
 | 9 | <link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
 | 
|---|
 | 10 | <link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
 | 
|---|
 | 11 | <link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
 | 
|---|
 | 12 | <style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 | 
|---|
 | 13 | <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 | 
|---|
 | 14 | <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
 | 
|---|
 | 15 | <script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
 | 
|---|
 | 16 | <script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 | 
|---|
 | 17 | </head>
 | 
|---|
 | 18 | <body>
 | 
|---|
 | 19 | <main>
 | 
|---|
 | 20 | <article id="content">
 | 
|---|
 | 21 | <header>
 | 
|---|
 | 22 | <h1 class="title">Module <code>ammosreader.AmmosIFReader</code></h1>
 | 
|---|
 | 23 | </header>
 | 
|---|
 | 24 | <section id="section-intro">
 | 
|---|
 | 25 | <p>I provide a specialized Ammos Reader for IF data.</p>
 | 
|---|
 | 26 | <details class="source">
 | 
|---|
 | 27 | <summary>
 | 
|---|
 | 28 | <span>Expand source code</span>
 | 
|---|
 | 29 | </summary>
 | 
|---|
 | 30 | <pre><code class="python">"""I provide a specialized Ammos Reader for IF data."""
 | 
|---|
 | 31 | import logging
 | 
|---|
 | 32 | 
 | 
|---|
 | 33 | from ammosreader.AbstractAmmosReader import AbstractAmmosReader
 | 
|---|
 | 34 | from ammosreader.AmmosGlobalFrameBody import AmmosGlobalFrameBody
 | 
|---|
 | 35 | from ammosreader.AmmosIFDataHeader import AmmosIFDataHeader
 | 
|---|
 | 36 | from ammosreader.AmmosExtendedIFDataHeader import AmmosExtendedIFDataHeader
 | 
|---|
 | 37 | from ammosreader.AmmosIFDataBody import AmmosIFDataBody
 | 
|---|
 | 38 | from ammosreader.AmmosIFDataBlock import AmmosIFDataBlock
 | 
|---|
 | 39 | from ammosreader.AmmosIFDataBlockHeader import AmmosIFDataBlockHeader
 | 
|---|
 | 40 | 
 | 
|---|
 | 41 | 
 | 
|---|
 | 42 | class AmmosIFReader(AbstractAmmosReader):
 | 
|---|
 | 43 |     """I read the IF data embedded in an R&S AMMOS recording."""
 | 
|---|
 | 44 | 
 | 
|---|
 | 45 |     def __init__(self, file_name):
 | 
|---|
 | 46 |         super().__init__(file_name)
 | 
|---|
 | 47 | 
 | 
|---|
 | 48 |     def read_next_global_frame_body_data_header(self):
 | 
|---|
 | 49 | 
 | 
|---|
 | 50 |         header_size = AmmosIFDataHeader.HEADER_SIZE
 | 
|---|
 | 51 | 
 | 
|---|
 | 52 |         bytes = self.ammos_file.read(header_size)
 | 
|---|
 | 53 | 
 | 
|---|
 | 54 |         logging.info("\nReading global frame body standard data header\n")
 | 
|---|
 | 55 |         if ((not bytes) or (len(bytes) < header_size)):
 | 
|---|
 | 56 |             logging.debug("Can not read all %s bytes of global frame body data header", header_size)
 | 
|---|
 | 57 |             return None
 | 
|---|
 | 58 |         return AmmosIFDataHeader.from_bytes(bytes)
 | 
|---|
 | 59 | 
 | 
|---|
 | 60 |     def read_next_global_frame_body_extended_data_header(self):
 | 
|---|
 | 61 |         """
 | 
|---|
 | 62 |         I return the next global frame body extended data header from current position in file.
 | 
|---|
 | 63 | 
 | 
|---|
 | 64 |         :return: the next Ammos Extended IF data header or None if incomplete
 | 
|---|
 | 65 |         :rtype: AmmosExtendedIFDataHeader
 | 
|---|
 | 66 |         """
 | 
|---|
 | 67 |         header_size = AmmosExtendedIFDataHeader.HEADER_SIZE
 | 
|---|
 | 68 | 
 | 
|---|
 | 69 |         bytes = self.ammos_file.read(header_size)
 | 
|---|
 | 70 | 
 | 
|---|
 | 71 |         logging.info("\nReading global frame body extended data header\n")
 | 
|---|
 | 72 |         if ((not bytes) or (len(bytes) < header_size)):
 | 
|---|
 | 73 |             logging.debug("Can not read all %s bytes of global frame extended data header", header_size)
 | 
|---|
 | 74 |             return None
 | 
|---|
 | 75 |         return AmmosExtendedIFDataHeader.from_bytes(bytes)
 | 
|---|
 | 76 | 
 | 
|---|
 | 77 |     def read_next_if_data_body(self, number_of_data_blocks, data_length):
 | 
|---|
 | 78 |         """
 | 
|---|
 | 79 |         I return the next data body read from current position in file.
 | 
|---|
 | 80 | 
 | 
|---|
 | 81 |         :param number_of_data_blocks: the number of data blocks inside the body
 | 
|---|
 | 82 |         :type number_of_data_blocks: int
 | 
|---|
 | 83 | 
 | 
|---|
 | 84 |         :param data_length: the length of the raw data inside a single block
 | 
|---|
 | 85 |         :type data_length: int
 | 
|---|
 | 86 |         """
 | 
|---|
 | 87 |         header_size = AmmosIFDataBlockHeader.HEADER_SIZE
 | 
|---|
 | 88 | 
 | 
|---|
 | 89 |         data_body = AmmosIFDataBody()
 | 
|---|
 | 90 | 
 | 
|---|
 | 91 |         block_length = header_size + data_length
 | 
|---|
 | 92 | 
 | 
|---|
 | 93 |         total = number_of_data_blocks*block_length
 | 
|---|
 | 94 | 
 | 
|---|
 | 95 |         byte_string = self.ammos_file.read(block_length)
 | 
|---|
 | 96 | 
 | 
|---|
 | 97 |         if len(byte_string) != total:
 | 
|---|
 | 98 |             logging.debug("Can not read all %s bytes of data body", total)
 | 
|---|
 | 99 |             return None
 | 
|---|
 | 100 | 
 | 
|---|
 | 101 |         for i in range(0, number_of_data_blocks):
 | 
|---|
 | 102 |             result = byte_string[i*block_length:(i*block_length+block_length)]
 | 
|---|
 | 103 |             data_body.add_data_block(AmmosIFDataBlock(AmmosIFDataBlockHeader.from_bytes(result[0:header_size]),
 | 
|---|
 | 104 |                                                       result[header_size:]))
 | 
|---|
 | 105 | 
 | 
|---|
 | 106 |         return data_body
 | 
|---|
 | 107 | 
 | 
|---|
 | 108 |     def read_next_global_frame_body(self, data_header_length):
 | 
|---|
 | 109 |         """
 | 
|---|
 | 110 |         I return the next global frame body read from current position in file.
 | 
|---|
 | 111 | 
 | 
|---|
 | 112 |         :param data_header_length: the length of the data header
 | 
|---|
 | 113 |         :type data_header_length: int
 | 
|---|
 | 114 |         """
 | 
|---|
 | 115 |         if_data_header = None
 | 
|---|
 | 116 | 
 | 
|---|
 | 117 |         if data_header_length == AmmosIFDataHeader.HEADER_SIZE:
 | 
|---|
 | 118 |             if_data_header = self.read_next_global_frame_body_data_header()
 | 
|---|
 | 119 |         if data_header_length == AmmosExtendedIFDataHeader.HEADER_SIZE:
 | 
|---|
 | 120 |             if_data_header = self.read_next_global_frame_body_extended_data_header()
 | 
|---|
 | 121 | 
 | 
|---|
 | 122 |         if if_data_header is None:
 | 
|---|
 | 123 |             logging.debug("Data header missing")
 | 
|---|
 | 124 |             return None
 | 
|---|
 | 125 | 
 | 
|---|
 | 126 |         if_data_body = self.read_next_if_data_body(if_data_header.block_count, if_data_header.block_length)
 | 
|---|
 | 127 | 
 | 
|---|
 | 128 |         if if_data_body is None:
 | 
|---|
 | 129 |             logging.debug("Data body missing")
 | 
|---|
 | 130 |             return None
 | 
|---|
 | 131 | 
 | 
|---|
 | 132 |         return AmmosGlobalFrameBody(if_data_header, if_data_body)
 | 
|---|
 | 133 | 
 | 
|---|
 | 134 |     def data(self):
 | 
|---|
 | 135 |         return b"".join([each.global_frame_body.data_body.data for each in self.container.global_frames])</code></pre>
 | 
|---|
 | 136 | </details>
 | 
|---|
 | 137 | </section>
 | 
|---|
 | 138 | <section>
 | 
|---|
 | 139 | </section>
 | 
|---|
 | 140 | <section>
 | 
|---|
 | 141 | </section>
 | 
|---|
 | 142 | <section>
 | 
|---|
 | 143 | </section>
 | 
|---|
 | 144 | <section>
 | 
|---|
 | 145 | <h2 class="section-title" id="header-classes">Classes</h2>
 | 
|---|
 | 146 | <dl>
 | 
|---|
 | 147 | <dt id="ammosreader.AmmosIFReader.AmmosIFReader"><code class="flex name class">
 | 
|---|
 | 148 | <span>class <span class="ident">AmmosIFReader</span></span>
 | 
|---|
 | 149 | <span>(</span><span>file_name)</span>
 | 
|---|
 | 150 | </code></dt>
 | 
|---|
 | 151 | <dd>
 | 
|---|
 | 152 | <div class="desc"><p>I read the IF data embedded in an R&S AMMOS recording.</p>
 | 
|---|
 | 153 | <p>I am the standard constructor for Ammos Readers.</p>
 | 
|---|
 | 154 | <p>Additional information about the file can be added as key/value pairs in tags</p>
 | 
|---|
 | 155 | <p>:param file_name: The file to read Ammos data from
 | 
|---|
 | 156 | :type file_name: str</p></div>
 | 
|---|
 | 157 | <details class="source">
 | 
|---|
 | 158 | <summary>
 | 
|---|
 | 159 | <span>Expand source code</span>
 | 
|---|
 | 160 | </summary>
 | 
|---|
 | 161 | <pre><code class="python">class AmmosIFReader(AbstractAmmosReader):
 | 
|---|
 | 162 |     """I read the IF data embedded in an R&S AMMOS recording."""
 | 
|---|
 | 163 | 
 | 
|---|
 | 164 |     def __init__(self, file_name):
 | 
|---|
 | 165 |         super().__init__(file_name)
 | 
|---|
 | 166 | 
 | 
|---|
 | 167 |     def read_next_global_frame_body_data_header(self):
 | 
|---|
 | 168 | 
 | 
|---|
 | 169 |         header_size = AmmosIFDataHeader.HEADER_SIZE
 | 
|---|
 | 170 | 
 | 
|---|
 | 171 |         bytes = self.ammos_file.read(header_size)
 | 
|---|
 | 172 | 
 | 
|---|
 | 173 |         logging.info("\nReading global frame body standard data header\n")
 | 
|---|
 | 174 |         if ((not bytes) or (len(bytes) < header_size)):
 | 
|---|
 | 175 |             logging.debug("Can not read all %s bytes of global frame body data header", header_size)
 | 
|---|
 | 176 |             return None
 | 
|---|
 | 177 |         return AmmosIFDataHeader.from_bytes(bytes)
 | 
|---|
 | 178 | 
 | 
|---|
 | 179 |     def read_next_global_frame_body_extended_data_header(self):
 | 
|---|
 | 180 |         """
 | 
|---|
 | 181 |         I return the next global frame body extended data header from current position in file.
 | 
|---|
 | 182 | 
 | 
|---|
 | 183 |         :return: the next Ammos Extended IF data header or None if incomplete
 | 
|---|
 | 184 |         :rtype: AmmosExtendedIFDataHeader
 | 
|---|
 | 185 |         """
 | 
|---|
 | 186 |         header_size = AmmosExtendedIFDataHeader.HEADER_SIZE
 | 
|---|
 | 187 | 
 | 
|---|
 | 188 |         bytes = self.ammos_file.read(header_size)
 | 
|---|
 | 189 | 
 | 
|---|
 | 190 |         logging.info("\nReading global frame body extended data header\n")
 | 
|---|
 | 191 |         if ((not bytes) or (len(bytes) < header_size)):
 | 
|---|
 | 192 |             logging.debug("Can not read all %s bytes of global frame extended data header", header_size)
 | 
|---|
 | 193 |             return None
 | 
|---|
 | 194 |         return AmmosExtendedIFDataHeader.from_bytes(bytes)
 | 
|---|
 | 195 | 
 | 
|---|
 | 196 |     def read_next_if_data_body(self, number_of_data_blocks, data_length):
 | 
|---|
 | 197 |         """
 | 
|---|
 | 198 |         I return the next data body read from current position in file.
 | 
|---|
 | 199 | 
 | 
|---|
 | 200 |         :param number_of_data_blocks: the number of data blocks inside the body
 | 
|---|
 | 201 |         :type number_of_data_blocks: int
 | 
|---|
 | 202 | 
 | 
|---|
 | 203 |         :param data_length: the length of the raw data inside a single block
 | 
|---|
 | 204 |         :type data_length: int
 | 
|---|
 | 205 |         """
 | 
|---|
 | 206 |         header_size = AmmosIFDataBlockHeader.HEADER_SIZE
 | 
|---|
 | 207 | 
 | 
|---|
 | 208 |         data_body = AmmosIFDataBody()
 | 
|---|
 | 209 | 
 | 
|---|
 | 210 |         block_length = header_size + data_length
 | 
|---|
 | 211 | 
 | 
|---|
 | 212 |         total = number_of_data_blocks*block_length
 | 
|---|
 | 213 | 
 | 
|---|
 | 214 |         byte_string = self.ammos_file.read(block_length)
 | 
|---|
 | 215 | 
 | 
|---|
 | 216 |         if len(byte_string) != total:
 | 
|---|
 | 217 |             logging.debug("Can not read all %s bytes of data body", total)
 | 
|---|
 | 218 |             return None
 | 
|---|
 | 219 | 
 | 
|---|
 | 220 |         for i in range(0, number_of_data_blocks):
 | 
|---|
 | 221 |             result = byte_string[i*block_length:(i*block_length+block_length)]
 | 
|---|
 | 222 |             data_body.add_data_block(AmmosIFDataBlock(AmmosIFDataBlockHeader.from_bytes(result[0:header_size]),
 | 
|---|
 | 223 |                                                       result[header_size:]))
 | 
|---|
 | 224 | 
 | 
|---|
 | 225 |         return data_body
 | 
|---|
 | 226 | 
 | 
|---|
 | 227 |     def read_next_global_frame_body(self, data_header_length):
 | 
|---|
 | 228 |         """
 | 
|---|
 | 229 |         I return the next global frame body read from current position in file.
 | 
|---|
 | 230 | 
 | 
|---|
 | 231 |         :param data_header_length: the length of the data header
 | 
|---|
 | 232 |         :type data_header_length: int
 | 
|---|
 | 233 |         """
 | 
|---|
 | 234 |         if_data_header = None
 | 
|---|
 | 235 | 
 | 
|---|
 | 236 |         if data_header_length == AmmosIFDataHeader.HEADER_SIZE:
 | 
|---|
 | 237 |             if_data_header = self.read_next_global_frame_body_data_header()
 | 
|---|
 | 238 |         if data_header_length == AmmosExtendedIFDataHeader.HEADER_SIZE:
 | 
|---|
 | 239 |             if_data_header = self.read_next_global_frame_body_extended_data_header()
 | 
|---|
 | 240 | 
 | 
|---|
 | 241 |         if if_data_header is None:
 | 
|---|
 | 242 |             logging.debug("Data header missing")
 | 
|---|
 | 243 |             return None
 | 
|---|
 | 244 | 
 | 
|---|
 | 245 |         if_data_body = self.read_next_if_data_body(if_data_header.block_count, if_data_header.block_length)
 | 
|---|
 | 246 | 
 | 
|---|
 | 247 |         if if_data_body is None:
 | 
|---|
 | 248 |             logging.debug("Data body missing")
 | 
|---|
 | 249 |             return None
 | 
|---|
 | 250 | 
 | 
|---|
 | 251 |         return AmmosGlobalFrameBody(if_data_header, if_data_body)
 | 
|---|
 | 252 | 
 | 
|---|
 | 253 |     def data(self):
 | 
|---|
 | 254 |         return b"".join([each.global_frame_body.data_body.data for each in self.container.global_frames])</code></pre>
 | 
|---|
 | 255 | </details>
 | 
|---|
 | 256 | <h3>Ancestors</h3>
 | 
|---|
 | 257 | <ul class="hlist">
 | 
|---|
 | 258 | <li><a title="ammosreader.AbstractAmmosReader.AbstractAmmosReader" href="AbstractAmmosReader.html#ammosreader.AbstractAmmosReader.AbstractAmmosReader">AbstractAmmosReader</a></li>
 | 
|---|
 | 259 | <li>abc.ABC</li>
 | 
|---|
 | 260 | </ul>
 | 
|---|
 | 261 | <h3>Methods</h3>
 | 
|---|
 | 262 | <dl>
 | 
|---|
 | 263 | <dt id="ammosreader.AmmosIFReader.AmmosIFReader.data"><code class="name flex">
 | 
|---|
 | 264 | <span>def <span class="ident">data</span></span>(<span>self)</span>
 | 
|---|
 | 265 | </code></dt>
 | 
|---|
 | 266 | <dd>
 | 
|---|
 | 267 | <div class="desc"></div>
 | 
|---|
 | 268 | <details class="source">
 | 
|---|
 | 269 | <summary>
 | 
|---|
 | 270 | <span>Expand source code</span>
 | 
|---|
 | 271 | </summary>
 | 
|---|
 | 272 | <pre><code class="python">def data(self):
 | 
|---|
 | 273 |     return b"".join([each.global_frame_body.data_body.data for each in self.container.global_frames])</code></pre>
 | 
|---|
 | 274 | </details>
 | 
|---|
 | 275 | </dd>
 | 
|---|
 | 276 | <dt id="ammosreader.AmmosIFReader.AmmosIFReader.read_next_global_frame_body"><code class="name flex">
 | 
|---|
 | 277 | <span>def <span class="ident">read_next_global_frame_body</span></span>(<span>self, data_header_length)</span>
 | 
|---|
 | 278 | </code></dt>
 | 
|---|
 | 279 | <dd>
 | 
|---|
 | 280 | <div class="desc"><p>I return the next global frame body read from current position in file.</p>
 | 
|---|
 | 281 | <p>:param data_header_length: the length of the data header
 | 
|---|
 | 282 | :type data_header_length: int</p></div>
 | 
|---|
 | 283 | <details class="source">
 | 
|---|
 | 284 | <summary>
 | 
|---|
 | 285 | <span>Expand source code</span>
 | 
|---|
 | 286 | </summary>
 | 
|---|
 | 287 | <pre><code class="python">def read_next_global_frame_body(self, data_header_length):
 | 
|---|
 | 288 |     """
 | 
|---|
 | 289 |     I return the next global frame body read from current position in file.
 | 
|---|
 | 290 | 
 | 
|---|
 | 291 |     :param data_header_length: the length of the data header
 | 
|---|
 | 292 |     :type data_header_length: int
 | 
|---|
 | 293 |     """
 | 
|---|
 | 294 |     if_data_header = None
 | 
|---|
 | 295 | 
 | 
|---|
 | 296 |     if data_header_length == AmmosIFDataHeader.HEADER_SIZE:
 | 
|---|
 | 297 |         if_data_header = self.read_next_global_frame_body_data_header()
 | 
|---|
 | 298 |     if data_header_length == AmmosExtendedIFDataHeader.HEADER_SIZE:
 | 
|---|
 | 299 |         if_data_header = self.read_next_global_frame_body_extended_data_header()
 | 
|---|
 | 300 | 
 | 
|---|
 | 301 |     if if_data_header is None:
 | 
|---|
 | 302 |         logging.debug("Data header missing")
 | 
|---|
 | 303 |         return None
 | 
|---|
 | 304 | 
 | 
|---|
 | 305 |     if_data_body = self.read_next_if_data_body(if_data_header.block_count, if_data_header.block_length)
 | 
|---|
 | 306 | 
 | 
|---|
 | 307 |     if if_data_body is None:
 | 
|---|
 | 308 |         logging.debug("Data body missing")
 | 
|---|
 | 309 |         return None
 | 
|---|
 | 310 | 
 | 
|---|
 | 311 |     return AmmosGlobalFrameBody(if_data_header, if_data_body)</code></pre>
 | 
|---|
 | 312 | </details>
 | 
|---|
 | 313 | </dd>
 | 
|---|
 | 314 | <dt id="ammosreader.AmmosIFReader.AmmosIFReader.read_next_global_frame_body_data_header"><code class="name flex">
 | 
|---|
 | 315 | <span>def <span class="ident">read_next_global_frame_body_data_header</span></span>(<span>self)</span>
 | 
|---|
 | 316 | </code></dt>
 | 
|---|
 | 317 | <dd>
 | 
|---|
 | 318 | <div class="desc"></div>
 | 
|---|
 | 319 | <details class="source">
 | 
|---|
 | 320 | <summary>
 | 
|---|
 | 321 | <span>Expand source code</span>
 | 
|---|
 | 322 | </summary>
 | 
|---|
 | 323 | <pre><code class="python">def read_next_global_frame_body_data_header(self):
 | 
|---|
 | 324 | 
 | 
|---|
 | 325 |     header_size = AmmosIFDataHeader.HEADER_SIZE
 | 
|---|
 | 326 | 
 | 
|---|
 | 327 |     bytes = self.ammos_file.read(header_size)
 | 
|---|
 | 328 | 
 | 
|---|
 | 329 |     logging.info("\nReading global frame body standard data header\n")
 | 
|---|
 | 330 |     if ((not bytes) or (len(bytes) < header_size)):
 | 
|---|
 | 331 |         logging.debug("Can not read all %s bytes of global frame body data header", header_size)
 | 
|---|
 | 332 |         return None
 | 
|---|
 | 333 |     return AmmosIFDataHeader.from_bytes(bytes)</code></pre>
 | 
|---|
 | 334 | </details>
 | 
|---|
 | 335 | </dd>
 | 
|---|
 | 336 | <dt id="ammosreader.AmmosIFReader.AmmosIFReader.read_next_global_frame_body_extended_data_header"><code class="name flex">
 | 
|---|
 | 337 | <span>def <span class="ident">read_next_global_frame_body_extended_data_header</span></span>(<span>self)</span>
 | 
|---|
 | 338 | </code></dt>
 | 
|---|
 | 339 | <dd>
 | 
|---|
 | 340 | <div class="desc"><p>I return the next global frame body extended data header from current position in file.</p>
 | 
|---|
 | 341 | <p>:return: the next Ammos Extended IF data header or None if incomplete
 | 
|---|
 | 342 | :rtype: AmmosExtendedIFDataHeader</p></div>
 | 
|---|
 | 343 | <details class="source">
 | 
|---|
 | 344 | <summary>
 | 
|---|
 | 345 | <span>Expand source code</span>
 | 
|---|
 | 346 | </summary>
 | 
|---|
 | 347 | <pre><code class="python">def read_next_global_frame_body_extended_data_header(self):
 | 
|---|
 | 348 |     """
 | 
|---|
 | 349 |     I return the next global frame body extended data header from current position in file.
 | 
|---|
 | 350 | 
 | 
|---|
 | 351 |     :return: the next Ammos Extended IF data header or None if incomplete
 | 
|---|
 | 352 |     :rtype: AmmosExtendedIFDataHeader
 | 
|---|
 | 353 |     """
 | 
|---|
 | 354 |     header_size = AmmosExtendedIFDataHeader.HEADER_SIZE
 | 
|---|
 | 355 | 
 | 
|---|
 | 356 |     bytes = self.ammos_file.read(header_size)
 | 
|---|
 | 357 | 
 | 
|---|
 | 358 |     logging.info("\nReading global frame body extended data header\n")
 | 
|---|
 | 359 |     if ((not bytes) or (len(bytes) < header_size)):
 | 
|---|
 | 360 |         logging.debug("Can not read all %s bytes of global frame extended data header", header_size)
 | 
|---|
 | 361 |         return None
 | 
|---|
 | 362 |     return AmmosExtendedIFDataHeader.from_bytes(bytes)</code></pre>
 | 
|---|
 | 363 | </details>
 | 
|---|
 | 364 | </dd>
 | 
|---|
 | 365 | <dt id="ammosreader.AmmosIFReader.AmmosIFReader.read_next_if_data_body"><code class="name flex">
 | 
|---|
 | 366 | <span>def <span class="ident">read_next_if_data_body</span></span>(<span>self, number_of_data_blocks, data_length)</span>
 | 
|---|
 | 367 | </code></dt>
 | 
|---|
 | 368 | <dd>
 | 
|---|
 | 369 | <div class="desc"><p>I return the next data body read from current position in file.</p>
 | 
|---|
 | 370 | <p>:param number_of_data_blocks: the number of data blocks inside the body
 | 
|---|
 | 371 | :type number_of_data_blocks: int</p>
 | 
|---|
 | 372 | <p>:param data_length: the length of the raw data inside a single block
 | 
|---|
 | 373 | :type data_length: int</p></div>
 | 
|---|
 | 374 | <details class="source">
 | 
|---|
 | 375 | <summary>
 | 
|---|
 | 376 | <span>Expand source code</span>
 | 
|---|
 | 377 | </summary>
 | 
|---|
 | 378 | <pre><code class="python">def read_next_if_data_body(self, number_of_data_blocks, data_length):
 | 
|---|
 | 379 |     """
 | 
|---|
 | 380 |     I return the next data body read from current position in file.
 | 
|---|
 | 381 | 
 | 
|---|
 | 382 |     :param number_of_data_blocks: the number of data blocks inside the body
 | 
|---|
 | 383 |     :type number_of_data_blocks: int
 | 
|---|
 | 384 | 
 | 
|---|
 | 385 |     :param data_length: the length of the raw data inside a single block
 | 
|---|
 | 386 |     :type data_length: int
 | 
|---|
 | 387 |     """
 | 
|---|
 | 388 |     header_size = AmmosIFDataBlockHeader.HEADER_SIZE
 | 
|---|
 | 389 | 
 | 
|---|
 | 390 |     data_body = AmmosIFDataBody()
 | 
|---|
 | 391 | 
 | 
|---|
 | 392 |     block_length = header_size + data_length
 | 
|---|
 | 393 | 
 | 
|---|
 | 394 |     total = number_of_data_blocks*block_length
 | 
|---|
 | 395 | 
 | 
|---|
 | 396 |     byte_string = self.ammos_file.read(block_length)
 | 
|---|
 | 397 | 
 | 
|---|
 | 398 |     if len(byte_string) != total:
 | 
|---|
 | 399 |         logging.debug("Can not read all %s bytes of data body", total)
 | 
|---|
 | 400 |         return None
 | 
|---|
 | 401 | 
 | 
|---|
 | 402 |     for i in range(0, number_of_data_blocks):
 | 
|---|
 | 403 |         result = byte_string[i*block_length:(i*block_length+block_length)]
 | 
|---|
 | 404 |         data_body.add_data_block(AmmosIFDataBlock(AmmosIFDataBlockHeader.from_bytes(result[0:header_size]),
 | 
|---|
 | 405 |                                                   result[header_size:]))
 | 
|---|
 | 406 | 
 | 
|---|
 | 407 |     return data_body</code></pre>
 | 
|---|
 | 408 | </details>
 | 
|---|
 | 409 | </dd>
 | 
|---|
 | 410 | </dl>
 | 
|---|
 | 411 | <h3>Inherited members</h3>
 | 
|---|
 | 412 | <ul class="hlist">
 | 
|---|
 | 413 | <li><code><b><a title="ammosreader.AbstractAmmosReader.AbstractAmmosReader" href="AbstractAmmosReader.html#ammosreader.AbstractAmmosReader.AbstractAmmosReader">AbstractAmmosReader</a></b></code>:
 | 
|---|
 | 414 | <ul class="hlist">
 | 
|---|
 | 415 | <li><code><a title="ammosreader.AbstractAmmosReader.AbstractAmmosReader.add_tag" href="AbstractAmmosReader.html#ammosreader.AbstractAmmosReader.AbstractAmmosReader.add_tag">add_tag</a></code></li>
 | 
|---|
 | 416 | <li><code><a title="ammosreader.AbstractAmmosReader.AbstractAmmosReader.read_all_frames_left" href="AbstractAmmosReader.html#ammosreader.AbstractAmmosReader.AbstractAmmosReader.read_all_frames_left">read_all_frames_left</a></code></li>
 | 
|---|
 | 417 | <li><code><a title="ammosreader.AbstractAmmosReader.AbstractAmmosReader.read_next_global_frame_header" href="AbstractAmmosReader.html#ammosreader.AbstractAmmosReader.AbstractAmmosReader.read_next_global_frame_header">read_next_global_frame_header</a></code></li>
 | 
|---|
 | 418 | <li><code><a title="ammosreader.AbstractAmmosReader.AbstractAmmosReader.read_next_single_frame" href="AbstractAmmosReader.html#ammosreader.AbstractAmmosReader.AbstractAmmosReader.read_next_single_frame">read_next_single_frame</a></code></li>
 | 
|---|
 | 419 | <li><code><a title="ammosreader.AbstractAmmosReader.AbstractAmmosReader.rewind_to_start" href="AbstractAmmosReader.html#ammosreader.AbstractAmmosReader.AbstractAmmosReader.rewind_to_start">rewind_to_start</a></code></li>
 | 
|---|
 | 420 | </ul>
 | 
|---|
 | 421 | </li>
 | 
|---|
 | 422 | </ul>
 | 
|---|
 | 423 | </dd>
 | 
|---|
 | 424 | </dl>
 | 
|---|
 | 425 | </section>
 | 
|---|
 | 426 | </article>
 | 
|---|
 | 427 | <nav id="sidebar">
 | 
|---|
 | 428 | <h1>Index</h1>
 | 
|---|
 | 429 | <div class="toc">
 | 
|---|
 | 430 | <ul></ul>
 | 
|---|
 | 431 | </div>
 | 
|---|
 | 432 | <ul id="index">
 | 
|---|
 | 433 | <li><h3>Super-module</h3>
 | 
|---|
 | 434 | <ul>
 | 
|---|
 | 435 | <li><code><a title="ammosreader" href="index.html">ammosreader</a></code></li>
 | 
|---|
 | 436 | </ul>
 | 
|---|
 | 437 | </li>
 | 
|---|
 | 438 | <li><h3><a href="#header-classes">Classes</a></h3>
 | 
|---|
 | 439 | <ul>
 | 
|---|
 | 440 | <li>
 | 
|---|
 | 441 | <h4><code><a title="ammosreader.AmmosIFReader.AmmosIFReader" href="#ammosreader.AmmosIFReader.AmmosIFReader">AmmosIFReader</a></code></h4>
 | 
|---|
 | 442 | <ul class="">
 | 
|---|
 | 443 | <li><code><a title="ammosreader.AmmosIFReader.AmmosIFReader.data" href="#ammosreader.AmmosIFReader.AmmosIFReader.data">data</a></code></li>
 | 
|---|
 | 444 | <li><code><a title="ammosreader.AmmosIFReader.AmmosIFReader.read_next_global_frame_body" href="#ammosreader.AmmosIFReader.AmmosIFReader.read_next_global_frame_body">read_next_global_frame_body</a></code></li>
 | 
|---|
 | 445 | <li><code><a title="ammosreader.AmmosIFReader.AmmosIFReader.read_next_global_frame_body_data_header" href="#ammosreader.AmmosIFReader.AmmosIFReader.read_next_global_frame_body_data_header">read_next_global_frame_body_data_header</a></code></li>
 | 
|---|
 | 446 | <li><code><a title="ammosreader.AmmosIFReader.AmmosIFReader.read_next_global_frame_body_extended_data_header" href="#ammosreader.AmmosIFReader.AmmosIFReader.read_next_global_frame_body_extended_data_header">read_next_global_frame_body_extended_data_header</a></code></li>
 | 
|---|
 | 447 | <li><code><a title="ammosreader.AmmosIFReader.AmmosIFReader.read_next_if_data_body" href="#ammosreader.AmmosIFReader.AmmosIFReader.read_next_if_data_body">read_next_if_data_body</a></code></li>
 | 
|---|
 | 448 | </ul>
 | 
|---|
 | 449 | </li>
 | 
|---|
 | 450 | </ul>
 | 
|---|
 | 451 | </li>
 | 
|---|
 | 452 | </ul>
 | 
|---|
 | 453 | </nav>
 | 
|---|
 | 454 | </main>
 | 
|---|
 | 455 | <footer id="footer">
 | 
|---|
 | 456 | <p>Generated by <a href="https://pdoc3.github.io/pdoc" title="pdoc: Python API documentation generator"><cite>pdoc</cite> 0.10.0</a>.</p>
 | 
|---|
 | 457 | </footer>
 | 
|---|
 | 458 | </body>
 | 
|---|
 | 459 | </html> | 
|---|