diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 99f6068..0000000 --- a/LICENSE +++ /dev/null @@ -1,36 +0,0 @@ -Copyright (c) 2016 The Pybind Development Team, All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -("Enhancements") to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to the author of this software, without -imposing a separate written license agreement for such Enhancements, then you -hereby grant the following license: a non-exclusive, royalty-free perpetual -license to install, use, modify, prepare derivative works, incorporate into -other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. diff --git a/README.md b/README.md index e093067..829b885 100644 --- a/README.md +++ b/README.md @@ -12,19 +12,11 @@ Test call Need binary file from new LDN system for tests. ```python -from stormpci_bin_reader import StrikeReader +from stormpci_bin_reader import BlockReader -sr = StrikeReader("2022-04-23-00:00:37.bin") -strikes = sr.read_all_strikes() +br = BlockReader("2022-04-23-00:00:37.bin") +blocks = br.read_all_blocks() -for strike in strikes: - lts2 = strike.strike.lts2_data - print( - lts2.year, - lts2.month, - lts2.day, - lts2.hours, - lts2.minutes, - lts2.seconds + lts2.TS_time / lts2.TS_Osc, - ) +for block in blocks: + print(block) ``` \ No newline at end of file diff --git a/conda.recipe/meta.yaml b/conda.recipe/meta.yaml deleted file mode 100644 index 964116b..0000000 --- a/conda.recipe/meta.yaml +++ /dev/null @@ -1,35 +0,0 @@ -package: - name: python_example - version: 0.0.1 - -source: - path: .. - -build: - number: 0 - script: python -m pip install . -vvv - -requirements: - build: - - {{ compiler('cxx') }} - - host: - - python - - pip - - pybind11 >=2.6.0 - - run: - - python - - -test: - imports: - - python_example - source_files: - - tests - commands: - - python tests/test.py - -about: - summary: An example project built with pybind11. - license_file: LICENSE diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index 4c1a0fe..0000000 --- a/docs/Makefile +++ /dev/null @@ -1,216 +0,0 @@ -# Makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -PAPER = -BUILDDIR = _build - -# User-friendly check for sphinx-build -ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) -$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) -endif - -# Internal variables. -PAPEROPT_a4 = -D latex_paper_size=a4 -PAPEROPT_letter = -D latex_paper_size=letter -ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . -# the i18n builder cannot share the environment and doctrees with the others -I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . - -.PHONY: help -help: - @echo "Please use \`make ' where is one of" - @echo " html to make standalone HTML files" - @echo " dirhtml to make HTML files named index.html in directories" - @echo " singlehtml to make a single large HTML file" - @echo " pickle to make pickle files" - @echo " json to make JSON files" - @echo " htmlhelp to make HTML files and a HTML help project" - @echo " qthelp to make HTML files and a qthelp project" - @echo " applehelp to make an Apple Help Book" - @echo " devhelp to make HTML files and a Devhelp project" - @echo " epub to make an epub" - @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" - @echo " latexpdf to make LaTeX files and run them through pdflatex" - @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" - @echo " text to make text files" - @echo " man to make manual pages" - @echo " texinfo to make Texinfo files" - @echo " info to make Texinfo files and run them through makeinfo" - @echo " gettext to make PO message catalogs" - @echo " changes to make an overview of all changed/added/deprecated items" - @echo " xml to make Docutils-native XML files" - @echo " pseudoxml to make pseudoxml-XML files for display purposes" - @echo " linkcheck to check all external links for integrity" - @echo " doctest to run all doctests embedded in the documentation (if enabled)" - @echo " coverage to run coverage check of the documentation (if enabled)" - -.PHONY: clean -clean: - rm -rf $(BUILDDIR)/* - -.PHONY: html -html: - $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." - -.PHONY: dirhtml -dirhtml: - $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." - -.PHONY: singlehtml -singlehtml: - $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml - @echo - @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." - -.PHONY: pickle -pickle: - $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle - @echo - @echo "Build finished; now you can process the pickle files." - -.PHONY: json -json: - $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json - @echo - @echo "Build finished; now you can process the JSON files." - -.PHONY: htmlhelp -htmlhelp: - $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp - @echo - @echo "Build finished; now you can run HTML Help Workshop with the" \ - ".hhp project file in $(BUILDDIR)/htmlhelp." - -.PHONY: qthelp -qthelp: - $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp - @echo - @echo "Build finished; now you can run "qcollectiongenerator" with the" \ - ".qhcp project file in $(BUILDDIR)/qthelp, like this:" - @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/python_example.qhcp" - @echo "To view the help file:" - @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/python_example.qhc" - -.PHONY: applehelp -applehelp: - $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp - @echo - @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." - @echo "N.B. You won't be able to view it unless you put it in" \ - "~/Library/Documentation/Help or install it in your application" \ - "bundle." - -.PHONY: devhelp -devhelp: - $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp - @echo - @echo "Build finished." - @echo "To view the help file:" - @echo "# mkdir -p $$HOME/.local/share/devhelp/python_example" - @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/python_example" - @echo "# devhelp" - -.PHONY: epub -epub: - $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub - @echo - @echo "Build finished. The epub file is in $(BUILDDIR)/epub." - -.PHONY: latex -latex: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo - @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." - @echo "Run \`make' in that directory to run these through (pdf)latex" \ - "(use \`make latexpdf' here to do that automatically)." - -.PHONY: latexpdf -latexpdf: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through pdflatex..." - $(MAKE) -C $(BUILDDIR)/latex all-pdf - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -.PHONY: latexpdfja -latexpdfja: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through platex and dvipdfmx..." - $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -.PHONY: text -text: - $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text - @echo - @echo "Build finished. The text files are in $(BUILDDIR)/text." - -.PHONY: man -man: - $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man - @echo - @echo "Build finished. The manual pages are in $(BUILDDIR)/man." - -.PHONY: texinfo -texinfo: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo - @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." - @echo "Run \`make' in that directory to run these through makeinfo" \ - "(use \`make info' here to do that automatically)." - -.PHONY: info -info: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo "Running Texinfo files through makeinfo..." - make -C $(BUILDDIR)/texinfo info - @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." - -.PHONY: gettext -gettext: - $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale - @echo - @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." - -.PHONY: changes -changes: - $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes - @echo - @echo "The overview file is in $(BUILDDIR)/changes." - -.PHONY: linkcheck -linkcheck: - $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck - @echo - @echo "Link check complete; look for any errors in the above output " \ - "or in $(BUILDDIR)/linkcheck/output.txt." - -.PHONY: doctest -doctest: - $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest - @echo "Testing of doctests in the sources finished, look at the " \ - "results in $(BUILDDIR)/doctest/output.txt." - -.PHONY: coverage -coverage: - $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage - @echo "Testing of coverage in the sources finished, look at the " \ - "results in $(BUILDDIR)/coverage/python.txt." - -.PHONY: xml -xml: - $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml - @echo - @echo "Build finished. The XML files are in $(BUILDDIR)/xml." - -.PHONY: pseudoxml -pseudoxml: - $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml - @echo - @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." diff --git a/docs/conf.py b/docs/conf.py deleted file mode 100644 index 73013ab..0000000 --- a/docs/conf.py +++ /dev/null @@ -1,300 +0,0 @@ -# -# python_example documentation build configuration file, created by -# sphinx-quickstart on Fri Feb 26 00:29:33 2016. -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -import os -import sys - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# sys.path.insert(0, os.path.abspath('.')) - -# -- General configuration ------------------------------------------------ - -# If your documentation needs a minimal Sphinx version, state it here. -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ - "sphinx.ext.autodoc", - "sphinx.ext.intersphinx", - "sphinx.ext.autosummary", - "sphinx.ext.napoleon", -] - -autosummary_generate = True - -# Add any paths that contain templates here, relative to this directory. -templates_path = ["_templates"] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# source_suffix = ['.rst', '.md'] -source_suffix = ".rst" - -# The encoding of source files. -# source_encoding = 'utf-8-sig' - -# The master toctree document. -master_doc = "index" - -# General information about the project. -project = "python_example" -copyright = "2016, Sylvain Corlay" -author = "Sylvain Corlay" - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -# The short X.Y version. -version = "0.0.1" -# The full version, including alpha/beta/rc tags. -release = "0.0.1" - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# There are two options for replacing |today|: either, you set today to some -# non-false value, then it is used: -# today = '' -# Else, today_fmt is used as the format for a strftime call. -# today_fmt = '%B %d, %Y' - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -exclude_patterns = ["_build"] - -# The reST default role (used for this markup: `text`) to use for all -# documents. -# default_role = None - -# If true, '()' will be appended to :func: etc. cross-reference text. -# add_function_parentheses = True - -# If true, the current module name will be prepended to all description -# unit titles (such as .. function::). -# add_module_names = True - -# If true, sectionauthor and moduleauthor directives will be shown in the -# output. They are ignored by default. -# show_authors = False - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = "sphinx" - -# A list of ignored prefixes for module index sorting. -# modindex_common_prefix = [] - -# If true, keep warnings as "system message" paragraphs in the built documents. -# keep_warnings = False - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = False - - -# -- Options for HTML output ---------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -html_theme = "alabaster" - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -# html_theme_options = {} - -# Add any paths that contain custom themes here, relative to this directory. -# html_theme_path = [] - -# The name for this set of Sphinx documents. If None, it defaults to -# " v documentation". -# html_title = None - -# A shorter title for the navigation bar. Default is the same as html_title. -# html_short_title = None - -# The name of an image file (relative to this directory) to place at the top -# of the sidebar. -# html_logo = None - -# The name of an image file (within the static path) to use as favicon of the -# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 -# pixels large. -# html_favicon = None - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ["_static"] - -# Add any extra paths that contain custom files (such as robots.txt or -# .htaccess) here, relative to this directory. These files are copied -# directly to the root of the documentation. -# html_extra_path = [] - -# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, -# using the given strftime format. -# html_last_updated_fmt = '%b %d, %Y' - -# If true, SmartyPants will be used to convert quotes and dashes to -# typographically correct entities. -# html_use_smartypants = True - -# Custom sidebar templates, maps document names to template names. -# html_sidebars = {} - -# Additional templates that should be rendered to pages, maps page names to -# template names. -# html_additional_pages = {} - -# If false, no module index is generated. -# html_domain_indices = True - -# If false, no index is generated. -# html_use_index = True - -# If true, the index is split into individual pages for each letter. -# html_split_index = False - -# If true, links to the reST sources are added to the pages. -# html_show_sourcelink = True - -# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -# html_show_sphinx = True - -# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -# html_show_copyright = True - -# If true, an OpenSearch description file will be output, and all pages will -# contain a tag referring to it. The value of this option must be the -# base URL from which the finished HTML is served. -# html_use_opensearch = '' - -# This is the file name suffix for HTML files (e.g. ".xhtml"). -# html_file_suffix = None - -# Language to be used for generating the HTML full-text search index. -# Sphinx supports the following languages: -# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' -# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr' -# html_search_language = 'en' - -# A dictionary with options for the search language support, empty by default. -# Now only 'ja' uses this config value -# html_search_options = {'type': 'default'} - -# The name of a javascript file (relative to the configuration directory) that -# implements a search results scorer. If empty, the default will be used. -# html_search_scorer = 'scorer.js' - -# Output file base name for HTML help builder. -htmlhelp_basename = "python_exampledoc" - -# -- Options for LaTeX output --------------------------------------------- - -latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - #'papersize': 'letterpaper', - # The font size ('10pt', '11pt' or '12pt'). - #'pointsize': '10pt', - # Additional stuff for the LaTeX preamble. - #'preamble': '', - # Latex figure (float) alignment - #'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, -# author, documentclass [howto, manual, or own class]). -latex_documents = [ - ( - master_doc, - "python_example.tex", - "python_example Documentation", - "Sylvain Corlay", - "manual", - ), -] - -# The name of an image file (relative to this directory) to place at the top of -# the title page. -# latex_logo = None - -# For "manual" documents, if this is true, then toplevel headings are parts, -# not chapters. -# latex_use_parts = False - -# If true, show page references after internal links. -# latex_show_pagerefs = False - -# If true, show URL addresses after external links. -# latex_show_urls = False - -# Documents to append as an appendix to all manuals. -# latex_appendices = [] - -# If false, no module index is generated. -# latex_domain_indices = True - - -# -- Options for manual page output --------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - (master_doc, "python_example", "python_example Documentation", [author], 1) -] - -# If true, show URL addresses after external links. -# man_show_urls = False - - -# -- Options for Texinfo output ------------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - ( - master_doc, - "python_example", - "python_example Documentation", - author, - "python_example", - "One line description of project.", - "Miscellaneous", - ), -] - -# Documents to append as an appendix to all manuals. -# texinfo_appendices = [] - -# If false, no module index is generated. -# texinfo_domain_indices = True - -# How to display URL addresses: 'footnote', 'no', or 'inline'. -# texinfo_show_urls = 'footnote' - -# If true, do not generate a @detailmenu in the "Top" node's menu. -# texinfo_no_detailmenu = False - - -# Example configuration for intersphinx: refer to the Python standard library. -intersphinx_mapping = {"https://docs.python.org/": None} diff --git a/docs/index.rst b/docs/index.rst deleted file mode 100644 index 4b3ddca..0000000 --- a/docs/index.rst +++ /dev/null @@ -1,9 +0,0 @@ -python_example Documentation -============================ - -Contents: - -.. toctree:: - :maxdepth: 2 - - python_example diff --git a/docs/make.bat b/docs/make.bat deleted file mode 100644 index a81981e..0000000 --- a/docs/make.bat +++ /dev/null @@ -1,263 +0,0 @@ -@ECHO OFF - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set BUILDDIR=_build -set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . -set I18NSPHINXOPTS=%SPHINXOPTS% . -if NOT "%PAPER%" == "" ( - set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% - set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% -) - -if "%1" == "" goto help - -if "%1" == "help" ( - :help - echo.Please use `make ^` where ^ is one of - echo. html to make standalone HTML files - echo. dirhtml to make HTML files named index.html in directories - echo. singlehtml to make a single large HTML file - echo. pickle to make pickle files - echo. json to make JSON files - echo. htmlhelp to make HTML files and a HTML help project - echo. qthelp to make HTML files and a qthelp project - echo. devhelp to make HTML files and a Devhelp project - echo. epub to make an epub - echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter - echo. text to make text files - echo. man to make manual pages - echo. texinfo to make Texinfo files - echo. gettext to make PO message catalogs - echo. changes to make an overview over all changed/added/deprecated items - echo. xml to make Docutils-native XML files - echo. pseudoxml to make pseudoxml-XML files for display purposes - echo. linkcheck to check all external links for integrity - echo. doctest to run all doctests embedded in the documentation if enabled - echo. coverage to run coverage check of the documentation if enabled - goto end -) - -if "%1" == "clean" ( - for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i - del /q /s %BUILDDIR%\* - goto end -) - - -REM Check if sphinx-build is available and fallback to Python version if any -%SPHINXBUILD% 1>NUL 2>NUL -if errorlevel 9009 goto sphinx_python -goto sphinx_ok - -:sphinx_python - -set SPHINXBUILD=python -m sphinx.__init__ -%SPHINXBUILD% 2> nul -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -:sphinx_ok - - -if "%1" == "html" ( - %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/html. - goto end -) - -if "%1" == "dirhtml" ( - %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. - goto end -) - -if "%1" == "singlehtml" ( - %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. - goto end -) - -if "%1" == "pickle" ( - %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can process the pickle files. - goto end -) - -if "%1" == "json" ( - %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can process the JSON files. - goto end -) - -if "%1" == "htmlhelp" ( - %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can run HTML Help Workshop with the ^ -.hhp project file in %BUILDDIR%/htmlhelp. - goto end -) - -if "%1" == "qthelp" ( - %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can run "qcollectiongenerator" with the ^ -.qhcp project file in %BUILDDIR%/qthelp, like this: - echo.^> qcollectiongenerator %BUILDDIR%\qthelp\python_example.qhcp - echo.To view the help file: - echo.^> assistant -collectionFile %BUILDDIR%\qthelp\python_example.ghc - goto end -) - -if "%1" == "devhelp" ( - %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. - goto end -) - -if "%1" == "epub" ( - %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The epub file is in %BUILDDIR%/epub. - goto end -) - -if "%1" == "latex" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "latexpdf" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - cd %BUILDDIR%/latex - make all-pdf - cd %~dp0 - echo. - echo.Build finished; the PDF files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "latexpdfja" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - cd %BUILDDIR%/latex - make all-pdf-ja - cd %~dp0 - echo. - echo.Build finished; the PDF files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "text" ( - %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The text files are in %BUILDDIR%/text. - goto end -) - -if "%1" == "man" ( - %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The manual pages are in %BUILDDIR%/man. - goto end -) - -if "%1" == "texinfo" ( - %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. - goto end -) - -if "%1" == "gettext" ( - %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The message catalogs are in %BUILDDIR%/locale. - goto end -) - -if "%1" == "changes" ( - %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes - if errorlevel 1 exit /b 1 - echo. - echo.The overview file is in %BUILDDIR%/changes. - goto end -) - -if "%1" == "linkcheck" ( - %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck - if errorlevel 1 exit /b 1 - echo. - echo.Link check complete; look for any errors in the above output ^ -or in %BUILDDIR%/linkcheck/output.txt. - goto end -) - -if "%1" == "doctest" ( - %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest - if errorlevel 1 exit /b 1 - echo. - echo.Testing of doctests in the sources finished, look at the ^ -results in %BUILDDIR%/doctest/output.txt. - goto end -) - -if "%1" == "coverage" ( - %SPHINXBUILD% -b coverage %ALLSPHINXOPTS% %BUILDDIR%/coverage - if errorlevel 1 exit /b 1 - echo. - echo.Testing of coverage in the sources finished, look at the ^ -results in %BUILDDIR%/coverage/python.txt. - goto end -) - -if "%1" == "xml" ( - %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The XML files are in %BUILDDIR%/xml. - goto end -) - -if "%1" == "pseudoxml" ( - %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. - goto end -) - -:end diff --git a/docs/python_example.rst b/docs/python_example.rst deleted file mode 100644 index 2048d23..0000000 --- a/docs/python_example.rst +++ /dev/null @@ -1 +0,0 @@ -.. automodule:: python_example diff --git a/setup.py b/setup.py index 82d32bb..c9884f6 100644 --- a/setup.py +++ b/setup.py @@ -1,36 +1,29 @@ import sys from pybind11 import get_cmake_dir + # Available at setup time due to pyproject.toml from pybind11.setup_helpers import Pybind11Extension, build_ext from setuptools import setup __version__ = "0.0.1" -# The main interface is through Pybind11Extension. -# * You can add cxx_std=11/14/17, and then build_ext can be removed. -# * You can set include_pybind11=false to add the include directory yourself, -# say from a submodule. -# -# Note: -# Sort input source files if you glob sources to ensure bit-for-bit -# reproducible builds (https://github.com/pybind/python_example/pull/53) - ext_modules = [ - Pybind11Extension("python_example", + Pybind11Extension( + "stormpci_bin_reader", ["src/main.cpp"], # Example: passing in the version to the compiled code - define_macros = [('VERSION_INFO', __version__)], - ), + define_macros=[("VERSION_INFO", __version__)], + ), ] setup( - name="python_example", + name="stormpci_bin_reader", version=__version__, - author="Sylvain Corlay", - author_email="sylvain.corlay@gmail.com", - url="https://github.com/pybind/python_example", - description="A test project using pybind11", + author="Fedor Sarafanov", + author_email="sfg180@yandex.ru", + url="", + description="Read binary files from lightning detection network based on Boltek-StormPCI", long_description="", ext_modules=ext_modules, extras_require={"test": "pytest"}, diff --git a/src/main.cpp b/src/main.cpp index e341369..472ed89 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,39 +1,162 @@ #include +#include +#include +#include +#include +#include "stormpci.h" #define STRINGIFY(x) #x #define MACRO_STRINGIFY(x) STRINGIFY(x) -int add(int i, int j) { - return i + j; -} + +typedef StormProcess_tBOARDDATA_t StrikeData; + +typedef struct { + unsigned device_id; + unsigned experiment_id; + StrikeData strike; +} BlockBinary; + + +class BlockReader +{ +public: + BlockReader(const std::string &fn){ + f = std::ifstream(fn, std::fstream::binary); + } + BlockBinary& read_block(){ + f.read(reinterpret_cast(&_single_block), sizeof(BlockBinary)); + if (not f){ + throw; + } else { + pos += sizeof(BlockBinary); + } + return _single_block; + } + std::vector& read_all_blocks(){ + bool read_successfully = true; + while (read_successfully){ + f.read(reinterpret_cast(&_single_block), sizeof(BlockBinary)); + if (not f){ + read_successfully = false; + } + _blocks_vector.push_back(_single_block); + } + return _blocks_vector; + } + ~BlockReader() { + f.close(); + }; +private: + int pos = 0; + BlockBinary _single_block; + std::ifstream f; + std::vector _blocks_vector; +}; namespace py = pybind11; -PYBIND11_MODULE(python_example, m) { +PYBIND11_MODULE(stormpci_bin_reader, m) { m.doc() = R"pbdoc( - Pybind11 example plugin + Read binary blocks from file based on boltek c-structs ----------------------- - .. currentmodule:: python_example + .. currentmodule:: stormpci_bin_reader .. autosummary:: :toctree: _generate - add - subtract )pbdoc"; - m.def("add", &add, R"pbdoc( - Add two numbers - Some other explanation about the add function. - )pbdoc"); + py::class_(m, "BlockReader") + .def(py::init()) + .def("read_block", &BlockReader::read_block) + .def("read_all_blocks", &BlockReader::read_all_blocks); + + py::class_(m, "BlockBinary").def(py::init<>()) + .def_readonly("strike", &BlockBinary::strike) + .def_readonly("device_id", &BlockBinary::device_id) + .def_readonly("experiment_id", &BlockBinary::experiment_id) + .def("__repr__", + [](const BlockBinary &bb) { + std::stringstream stream; + stream << ""; + return stream.str(); + } + ); + ; + + py::class_(m, "StormProcess_tSATELLITETYPE") + .def(py::init<>()) + .def_readwrite("SVID", &StormProcess_tSATELLITETYPE::SVID) + .def_readwrite("mode", &StormProcess_tSATELLITETYPE::mode) + .def_readwrite("signal_strength", &StormProcess_tSATELLITETYPE::signal_strength) + .def_readwrite("channel_status", &StormProcess_tSATELLITETYPE::channel_status) + ; + + py::class_(m, "StormProcess_tTIMESTAMPINFO") + .def(py::init<>()) + .def_readwrite("TS_valid", &StormProcess_tTIMESTAMPINFO::TS_valid) + .def_readwrite("TS_Osc", &StormProcess_tTIMESTAMPINFO::TS_Osc) + .def_readwrite("TS_time", &StormProcess_tTIMESTAMPINFO::TS_time) + .def_readwrite("TS_10ms", &StormProcess_tTIMESTAMPINFO::TS_10ms) + .def_readwrite("capture_time", &StormProcess_tTIMESTAMPINFO::capture_time) + .def_readwrite("gps_data_valid", &StormProcess_tTIMESTAMPINFO::gps_data_valid) + .def_readwrite("month", &StormProcess_tTIMESTAMPINFO::month) + .def_readwrite("day", &StormProcess_tTIMESTAMPINFO::day) + .def_readwrite("year", &StormProcess_tTIMESTAMPINFO::year) + .def_readwrite("hours", &StormProcess_tTIMESTAMPINFO::hours) + .def_readwrite("minutes", &StormProcess_tTIMESTAMPINFO::minutes) + .def_readwrite("seconds", &StormProcess_tTIMESTAMPINFO::seconds) + .def_readwrite("latitude_mas", &StormProcess_tTIMESTAMPINFO::latitude_mas) + .def_readwrite("longitude_mas", &StormProcess_tTIMESTAMPINFO::longitude_mas) + .def_readwrite("latitude_ns", &StormProcess_tTIMESTAMPINFO::latitude_ns) + .def_readwrite("longitude_ew", &StormProcess_tTIMESTAMPINFO::longitude_ew) + .def_readwrite("height_cm", &StormProcess_tTIMESTAMPINFO::height_cm) + .def_readwrite("dop", &StormProcess_tTIMESTAMPINFO::dop) + .def_readwrite("satellites_visible", &StormProcess_tTIMESTAMPINFO::satellites_visible) + .def_readwrite("satellites_tracked", &StormProcess_tTIMESTAMPINFO::satellites_tracked) + .def_readwrite("receiver_status", &StormProcess_tTIMESTAMPINFO::receiver_status) + .def_readwrite("oscillator_temperature", &StormProcess_tTIMESTAMPINFO::oscillator_temperature) + .def_readwrite("serial_number", &StormProcess_tTIMESTAMPINFO::serial_number) + .def_property_readonly("satellite", [](const StormProcess_tTIMESTAMPINFO <s2) { + return std::vector (lts2.satellite, lts2.satellite + sizeof(lts2.satellite)); + }) + ; - m.def("subtract", [](int i, int j) { return i - j; }, R"pbdoc( - Subtract two numbers + py::class_(m, "StrikeData") + .def(py::init<>()) + .def_property_readonly("EFieldBuf", [](const StrikeData &sdata) { + return std::vector (sdata.EFieldBuf, sdata.EFieldBuf + BOLTEK_BUFFERSIZE); + }) + .def_property_readonly("NorthBuf", [](const StrikeData &sdata) { + return std::vector (sdata.NorthBuf, sdata.NorthBuf + BOLTEK_BUFFERSIZE); + }) + .def_property_readonly("EastBuf", [](const StrikeData &sdata) { + return std::vector (sdata.EastBuf, sdata.EastBuf + BOLTEK_BUFFERSIZE); + }) + .def_readwrite("NorthMaxPos", &StrikeData::NorthMaxPos) + .def_readwrite("NorthMinPos", &StrikeData::NorthMinPos) + .def_readwrite("EastMaxPos", &StrikeData::EastMaxPos) + .def_readwrite("EastMinPos", &StrikeData::EastMinPos) + .def_readwrite("North_Pk", &StrikeData::North_Pk) + .def_readwrite("East_Pk", &StrikeData::East_Pk) + .def_readwrite("NorthPol", &StrikeData::NorthPol) + .def_readwrite("EastPol", &StrikeData::EastPol) + .def_readwrite("EFieldPol", &StrikeData::EFieldPol) + .def_readwrite("lts2_data", &StrikeData::lts2_data) + ; - Some other explanation about the subtract function. - )pbdoc"); #ifdef VERSION_INFO m.attr("__version__") = MACRO_STRINGIFY(VERSION_INFO); diff --git a/src/stormpci.h b/src/stormpci.h new file mode 100644 index 0000000..a7c68af --- /dev/null +++ b/src/stormpci.h @@ -0,0 +1,225 @@ +#ifndef STORMPCI_H +#define STORMPCI_H + +#include + +/** + * \brief + * \~english Capture Buffer goes from 0 - 511 = 512 bytes. + * \~russian Размер буфера данных с платы. 512 байт. + */ +#define BOLTEK_BUFFERSIZE 512 + +/** + * \brief + * \~english tSATELLITETYPE is the detailed satellite info from the gps + * \~russian tSATELLITETYPE Подробная информация о спутнике + */ +struct StormProcess_tSATELLITETYPE +{ + /** + * \brief + * \~english Satellite ID. 0..37 + * \~russian ID спутника. 0..37 + */ + char SVID; + + /** 0..8 + * where 0 = code search 5 = message sync detect + * 1 = code acquire 6 = satellite time available + * 2 = AGC set 7 = ephemeris acquire + * 3 = freq acquire 8 available for position + * 4 = bit sync detect + */ + char mode; + unsigned char signal_strength; ///< 0..255 + /** 16 bits + * where (msb) bit 15 = reserved + * bit 14 = reserved + * bit 13 = reserved + * bit 12 = narrow-band search mode + * bit 11 = channel used for time solution + * bit 10 = differential corrections available + * bit 9 = invalid data + * bit 8 = parity error + * bit 7 = channel used for position fix + * bit 6 = satellite momentum alert flag + * bit 5 = satellite anti-spoof flag set + * bit 4 = satellite reported unhealthy + * bit 3 = satellite accuracy (msb) + * bit 2 = satellite accuracy + * bit 1 = satellite accuracy + * bit 0 = satellite accuracy (lsb) + */ + unsigned short channel_status; +}; + +/** \brief + * \~english tTIMESTAMPINFO is the detailed gps and timestamp data + * \~russian tTIMESTAMPINFO Детальная информация + */ +typedef struct +{ + int TS_valid; + unsigned long TS_Osc; ///< actual frequency of timestamp's 50MHz osc + unsigned long TS_time; ///< 0..999,999,999 ns of trigger (вообще-то это число колебаний осциллятора) + unsigned char TS_10ms; ///< 0..99 (сколько раз прошло по 10 ms с предыдущей секунды) + unsigned long capture_time; ///< 0..999,999,999 ns of first peak + + int gps_data_valid; + unsigned char month; ///< 1..12 + unsigned char day; ///< 1..31 + unsigned short year; ///< 1998 to 2079 + unsigned char hours; ///< 0..23 + unsigned char minutes; ///< 0..59 + unsigned char seconds; ///< 0..60 + int latitude_mas; ///< 324,000,000..324,000,000 (-90°..+90°) + int longitude_mas; ///< 648,000,000..648,000,000 (-180°..+176°) + char latitude_ns; ///< 'N' or 'S' + char longitude_ew; ///< 'E' or 'W' + int height_cm; ///< -100,000..+1,800,000 (-1000..+18,000m) + unsigned short dop; ///< 0..999 (0.0 to 99.9 DOP) + unsigned char satellites_visible; ///< 0..12 + unsigned char satellites_tracked; ///< 0..12 + struct StormProcess_tSATELLITETYPE satellite[12]; ///< individual satellite data + + /** 16 bits + * where (msb) bit 15..13 111 = 3D fix + * 110 = 2D fix + * 101 = propogate mode + * 100 = position hold + * 011 = acquiring satellites + * 010 = bad geometry + * 001 = reserved + * 000 = reserved + * bit 12..11 = reserved + * bit 10 = narrow band tracking mode + * bit 9 = fast acquisition position + * bit 8 = filter reset to raw gps solution + * bit 7 = cold start (no almanac or almanac out of date or time & position unknown) + * bit 6 = differential fix + * bit 5 = position lock + * bit 4 = autosurvey mode + * bit 3 = insufficient visible satellites + * bit 2..1 = antenna sense + * where 00 = Ok + * 01 = over current + * 10 = under current + * 11 = no bias voltage + * bit 0 = code location + */ + unsigned short receiver_status; + short oscillator_temperature; ///< -110..250 half degrees C (-55..+125°C) + short serial_number; +} StormProcess_tTIMESTAMPINFO; + + +typedef struct StormProcess_tBOARDDATA_t +{ + int EFieldBuf[BOLTEK_BUFFERSIZE]; ///< essentially a 1 bit a-to-d converter + int NorthBuf[BOLTEK_BUFFERSIZE]; ///< 0-255 data, we use int so we have room to filter the data + int EastBuf[BOLTEK_BUFFERSIZE]; ///< 0-255 data, we use int so we have room to filter the data + + StormProcess_tTIMESTAMPINFO lts2_data; ///< timestamp and gps data + int NorthMaxPos, NorthMinPos, EastMaxPos, EastMinPos; ///< pos of signal peaks + int North_Pk, East_Pk; ///< signal pk-pk amplitude + int NorthPol, EastPol, EFieldPol; ///< signal polarity +} StormProcess_tBOARDDATA; + + +/// this is the structure passed to the device driver GET_DATA ioctl +typedef struct stormpci_packed_data +{ + __u16 usNorth[BOLTEK_BUFFERSIZE]; + __u16 usWest [BOLTEK_BUFFERSIZE]; +} StormProcess_tPACKEDDATA; + + +typedef struct StormProcess_tSTRIKE { + int valid; ///< data appars to be valid signal, not just noise + float distance; ///< miles away, for close strike detection + float distance_averaged; ///< miles away, for close strike detection + float direction; ///< 0-360 degrees +} StormProcess_tSTRIKE; + + +#define STORMTRACKER_DEVICE_NAME "/dev/lightning-0" + +#ifdef __cplusplus +extern "C" { +#endif + +/** \brief + * \~english connect to the StormTracker card - non-zero on success + * \~russian Инициализация PCI-карты Boltek StromTracker. Возвращает не 0 в случае успеха. + */ +int StormPCI_OpenPciCard(void); + +/** \brief + * \~english clean up, all done + * \~russian Деинициализация PCI-карты Boltek StromTracker. + */ +void StormPCI_ClosePciCard(void); + +/** \brief + * \~english after reading the data, wait for the next strike + * \~russian После считывания данных ждать следующую вспышку. + */ +void StormPCI_RestartBoard(void); + +/** \brief + * \~english force StormTracker to give you a capture + * \~russian Принудить PCI-карту Boltek StromTracker очуществить захват данных. + */ +void StormPCI_ForceTrigger(void); + +/** \brief + * \~english check if a strike is waiting to be read by GetCapture() + * \~russian Проверить, не захвачена ли вспышка. Возвращает не ноль, если захвачена. + */ +int StormPCI_StrikeReady(void); + +/** \brief + * \~english 0-15, 0:most sensitive (preferred), 15: least sensitive + * \~russian Установить чувствительность, значения из диапазона 0-15. 0 - самая высокая чуствительность, 15 - самая низкая. + */ +void StormPCI_SetSquelch(char trig_level); + +/** \brief + * \~english retrieve the waiting capture + * \~russian Получить упакованные захваченные данные с PCI-платы Boltek StormTracker. + * + * \param board_data + * \~english Packed data + * \~russian Упакованные даные будут помещены в структуру по этому адресу. + */ +void StormPCI_GetBoardData(StormProcess_tPACKEDDATA* board_data); + +/** \brief + * \~english Unpack raw data from board. GPS timestamps, 1 bit electric field and two 8 bit magnetic fields extracted. + * \~russian Распаковать первичные данные с платы: метку точного времени, 1-битное электрическое поле и два перпендикулярных 8-битных магнитных поля. + * + * \param packed_data + * \~english Raw data from board + * \~russian Первичные данные с платы + * + * \param board_data + * \~english Unpacked data + * \~russian Распакованные данные: метка точного времени, 1-битное электрическое поле и два перпендикулярных 8-битных магнитных поля. + */ +void StormProcess_UnpackCaptureData(StormProcess_tPACKEDDATA *packed_data, StormProcess_tBOARDDATA* board_data); + +/** + * \brief + * \~english Process capture data: calculate lightning direction and distance. + * \~russian Обработка распакованного сигнала: определение положения вспышки. + */ +StormProcess_tSTRIKE StormProcess_SSProcessCapture(StormProcess_tBOARDDATA* capture); + +#ifdef __cplusplus +} +#endif + + +#endif + diff --git a/tests/2022-04-23-00:00:37.bin b/tests/2022-04-23-00:00:37.bin new file mode 100644 index 0000000..d12278c Binary files /dev/null and b/tests/2022-04-23-00:00:37.bin differ diff --git a/tests/test.py b/tests/test.py index f877b62..09c81a5 100644 --- a/tests/test.py +++ b/tests/test.py @@ -1,5 +1,7 @@ -import python_example as m +from stormpci_bin_reader import BlockReader -assert m.__version__ == '0.0.1' -assert m.add(1, 2) == 3 -assert m.subtract(1, 2) == -1 +br = BlockReader("2022-04-23-00:00:37.bin") +blocks = br.read_all_blocks() + +for block in blocks: + print(block)