Compare commits
No commits in common. "master" and "v2.1.5" have entirely different histories.
18
.github/workflows/pypi-deploy.yml
vendored
18
.github/workflows/pypi-deploy.yml
vendored
@ -20,8 +20,6 @@ jobs:
|
||||
with:
|
||||
name: wheel-config
|
||||
path: python/
|
||||
- name: Display files
|
||||
run: ls -lR
|
||||
|
||||
build_wheels:
|
||||
name: Build binary wheels on ${{ matrix.os }}
|
||||
@ -29,7 +27,8 @@ jobs:
|
||||
needs: [build_setup]
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ubuntu-latest, windows-latest]
|
||||
os: [ubuntu-24.04, windows-2022]
|
||||
arch: [auto32, auto64, aarch64]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
@ -44,10 +43,12 @@ jobs:
|
||||
- name: Build wheels
|
||||
run: python -m cibuildwheel --output-dir wheelhouse
|
||||
working-directory: python/
|
||||
# env:
|
||||
# CIBW_BUILD: cp36-* cp37-* cp38-* cp39-* cp310-*
|
||||
- name: Store binary wheels
|
||||
uses: actions/upload-artifact@v4.6.0
|
||||
with:
|
||||
name: binary-wheels-${{matrix.os}}-${{ strategy.job-index }}
|
||||
name: binary-wheels-${{matrix.os}}-${{matrix.arch}}
|
||||
path: python/wheelhouse/*.whl
|
||||
|
||||
build_sdist:
|
||||
@ -71,12 +72,10 @@ jobs:
|
||||
with:
|
||||
name: source-wheels
|
||||
path: python/dist/*.tar.gz
|
||||
- name: Display files
|
||||
run: ls -lR
|
||||
|
||||
|
||||
upload_pypi:
|
||||
name: Upload wheels to PyPI
|
||||
name: Upload binary wheels to PyPI
|
||||
runs-on: ubuntu-24.04
|
||||
needs: [build_wheels, build_sdist]
|
||||
|
||||
@ -89,11 +88,8 @@ jobs:
|
||||
- name: Get binary wheels
|
||||
uses: actions/download-artifact@v4.1.7
|
||||
with:
|
||||
name: binary-wheels
|
||||
path: dist/
|
||||
pattern: binary-wheels-*
|
||||
merge-multiple: true
|
||||
- name: Display files
|
||||
run: ls -lR
|
||||
|
||||
- uses: pypa/gh-action-pypi-publish@release/v1
|
||||
with:
|
||||
|
32
README.md
32
README.md
@ -2,7 +2,7 @@
|
||||
[](https://img.shields.io/github/license/RecordEvolution/IMCtermite)
|
||||
[](https://img.shields.io/github/stars/RecordEvolution/IMCtermite)
|
||||

|
||||
[](https://pypi.org/project/imctermite/)
|
||||
[](https://pypi.org/project/IMCtermite/)
|
||||
|
||||
# IMCtermite
|
||||
|
||||
@ -131,21 +131,24 @@ which may require root permissions.
|
||||
|
||||
### Python
|
||||
|
||||
To integrate the library into a customized ETL toolchain, several python targets
|
||||
To integrate the library into a customized ETL toolchain, several cython targets
|
||||
are available. For a local build that enables you to run the examples, use:
|
||||
|
||||
```
|
||||
make python-build
|
||||
make cython-build
|
||||
```
|
||||
|
||||
However, in a production environment, a proper installation of the module with
|
||||
`make cython-install` is recommended for system-wide availability of the module.
|
||||
|
||||
#### Installation with pip
|
||||
|
||||
The package is also available in the [Python Package Index](https://pypi.org)
|
||||
at [imctermite](https://pypi.org/project/imctermite/).
|
||||
at [IMCtermite](https://pypi.org/project/IMCtermite/).
|
||||
To install the latest version simply do
|
||||
|
||||
```Shell
|
||||
python3 -m pip install imctermite
|
||||
python3 -m pip install IMCtermite
|
||||
```
|
||||
|
||||
which provides binary wheels for multiple architectures on _Windows_ and _Linux_
|
||||
@ -192,9 +195,9 @@ Given the `IMCtermite` module is available, we can import it and declare an inst
|
||||
of it by passing a _raw_ file to the constructor:
|
||||
|
||||
```Python
|
||||
import imctermite
|
||||
import IMCtermite
|
||||
|
||||
imcraw = imctermite.imctermite(b"sample/sampleA.raw")
|
||||
imcraw = IMCtermite.imctermite(b"sample/sampleA.raw")
|
||||
```
|
||||
|
||||
An example of how to create an instance and obtain the list of channels is:
|
||||
@ -219,31 +222,18 @@ can be found in the `python/examples` folder.
|
||||
|
||||
## References
|
||||
|
||||
### IMC
|
||||
|
||||
- https://www.imc-tm.de/produkte/messtechnik-software/imc-famos/funktionen/im-und-export/
|
||||
- https://www.imc-tm.de/produkte/messtechnik-hardware/imc-cronosflex/ueberblick/
|
||||
- https://www.imc-tm.de/download-center/produkt-downloads/imc-famos/handbuecher
|
||||
- https://www.imc-tm.de/fileadmin/Public/Downloads/Manuals/imc_FAMOS/imcGemeinsameKomponenten.pdf
|
||||
- https://cython.readthedocs.io/en/latest/src/userguide/wrapping_CPlusPlus.html
|
||||
- https://github.com/Apollo3zehn/ImcFamosFile
|
||||
- https://apollo3zehn.github.io/ImcFamosFile/api/ImcFamosFile.FamosFileKeyType.html
|
||||
|
||||
### Cython
|
||||
|
||||
- https://cython.readthedocs.io/en/latest/src/userguide/wrapping_CPlusPlus.html
|
||||
|
||||
### PyPI
|
||||
|
||||
- https://pypi.org/help/#apitoken
|
||||
- https://sgoel.dev/posts/uploading-binary-wheels-to-pypi-from-github-actions/
|
||||
- https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idstepsrun
|
||||
- https://github.com/pypa/cibuildwheel/blob/main/examples/github-deploy.yml
|
||||
- https://cibuildwheel.readthedocs.io/en/stable/deliver-to-pypi/
|
||||
- https://github.com/actions/download-artifact#download-all-artifacts
|
||||
- https://github.com/actions/download-artifact?tab=readme-ov-file#download-multiple-filtered-artifacts-to-the-same-directory
|
||||
|
||||
### iconv
|
||||
|
||||
- https://www.gnu.org/software/libiconv/
|
||||
- https://vcpkg.io/en/packages.html
|
||||
- https://vcpkg.io/en/getting-started
|
||||
|
@ -314,11 +314,10 @@ namespace imc
|
||||
std::vector<unsigned char>* buffer_;
|
||||
|
||||
imc::origin_data NO_;
|
||||
imc::language NL_;
|
||||
|
||||
imc::text CT_;
|
||||
imc::groupobj CB_;
|
||||
imc::datafield CG_;
|
||||
imc::channelobj CN_;
|
||||
|
||||
// collect meta-data of channels according to env,
|
||||
// just everything valueable in here
|
||||
@ -350,7 +349,7 @@ namespace imc
|
||||
double xoffset_, yoffset_;
|
||||
|
||||
// group reference the channel belongs to
|
||||
unsigned long int group_index_;
|
||||
int group_index_;
|
||||
std::string group_uuid_, group_name_, group_comment_;
|
||||
|
||||
// constructor takes channel's block environment
|
||||
@ -363,22 +362,6 @@ namespace imc
|
||||
// use uuid from CN block
|
||||
uuid_ = chnenv_.CNuuid_;
|
||||
|
||||
// extract associated NO data
|
||||
if ( blocks_->count(chnenv_.NOuuid_) == 1 )
|
||||
{
|
||||
NO_.parse(buffer_, blocks_->at(chnenv_.NOuuid_).get_parameters());
|
||||
origin_ = NO_.generator_;
|
||||
comment_ = NO_.comment_;
|
||||
}
|
||||
|
||||
// extract associated NL data
|
||||
if ( blocks_->count(chnenv_.NLuuid_) == 1 )
|
||||
{
|
||||
NL_.parse(buffer_, blocks_->at(chnenv_.NLuuid_).get_parameters());
|
||||
codepage_ = NL_.codepage_;
|
||||
language_code_ = NL_.language_code_;
|
||||
}
|
||||
|
||||
// extract associated CB data
|
||||
if ( blocks_->count(chnenv_.CBuuid_) == 1 )
|
||||
{
|
||||
@ -394,15 +377,6 @@ namespace imc
|
||||
+ CT_.comment_;
|
||||
}
|
||||
|
||||
// extract associated CN data
|
||||
if ( blocks_->count(chnenv_.CNuuid_) == 1 )
|
||||
{
|
||||
CN_.parse(buffer_, blocks_->at(chnenv_.CNuuid_).get_parameters());
|
||||
group_index_ = CN_.group_index_;
|
||||
group_name_ = CN_.name_;
|
||||
group_comment_ = CN_.comment_;
|
||||
}
|
||||
|
||||
if ( !chnenv_.compenv1_.uuid_.empty() && chnenv_.compenv2_.uuid_.empty() )
|
||||
{
|
||||
// normal dataset (single component)
|
||||
@ -419,6 +393,7 @@ namespace imc
|
||||
ybuffer_offset_ = comp_group1.Cb_.offset_buffer_;
|
||||
ybuffer_size_ = comp_group1.Cb_.number_bytes_;
|
||||
xstart_ = comp_group1.Cb_.x0_;
|
||||
addtime_ = static_cast<long int>(comp_group1.Cb_.add_time_);
|
||||
yfactor_ = comp_group1.CR_.factor_;
|
||||
yoffset_ = comp_group1.CR_.offset_;
|
||||
yunit_ = comp_group1.CR_.unit_;
|
||||
@ -432,10 +407,6 @@ namespace imc
|
||||
std::time_t ts = timegm(&comp_group1.NT_.tms_); // std::mktime(&tms);
|
||||
trigger_time_ = std::chrono::system_clock::from_time_t(ts);
|
||||
trigger_time_frac_secs_ = comp_group1.NT_.trigger_time_frac_secs_;
|
||||
// calculate absolute trigger-time
|
||||
addtime_ = static_cast<long int>(comp_group1.Cb_.add_time_);
|
||||
absolute_trigger_time_ = trigger_time_ + std::chrono::seconds(addtime_);
|
||||
// + std::chrono::nanoseconds((long int)(trigger_time_frac_secs_*1.e9));
|
||||
}
|
||||
else if ( !chnenv_.compenv1_.uuid_.empty() && !chnenv_.compenv2_.uuid_.empty() )
|
||||
{
|
||||
@ -467,7 +438,6 @@ namespace imc
|
||||
std::time_t ts = timegm(&comp_group2.NT_.tms_); // std::mktime(&tms);
|
||||
trigger_time_ = std::chrono::system_clock::from_time_t(ts);
|
||||
trigger_time_frac_secs_ = comp_group2.NT_.trigger_time_frac_secs_;
|
||||
absolute_trigger_time_ = trigger_time_;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -477,9 +447,12 @@ namespace imc
|
||||
// start converting binary buffer to imc::datatype
|
||||
if ( !chnenv_.CSuuid_.empty() ) convert_buffer();
|
||||
|
||||
// convert any non-UTF-8 codepage to UTF-8 and cleanse any text
|
||||
// calculate absolute trigger-time
|
||||
absolute_trigger_time_ = trigger_time_ + std::chrono::seconds(addtime_);
|
||||
// + std::chrono::nanoseconds((long int)(trigger_time_frac_secs_*1.e9));
|
||||
|
||||
// convert any non-UTF-8 codepage to UTF-8
|
||||
convert_encoding();
|
||||
cleanse_text();
|
||||
}
|
||||
|
||||
// convert buffer to actual datatype
|
||||
@ -535,8 +508,6 @@ namespace imc
|
||||
throw std::runtime_error("x and y data have different number of values");
|
||||
}
|
||||
|
||||
xprec_ = 9;
|
||||
|
||||
process_data(xdata_, xnum_values, xdatatp_, xCSbuffer);
|
||||
process_data(ydata_, ynum_values, ydatatp_, yCSbuffer);
|
||||
}
|
||||
@ -629,35 +600,6 @@ namespace imc
|
||||
}
|
||||
}
|
||||
|
||||
void cleanse_text()
|
||||
{
|
||||
escape_backslash(name_);
|
||||
escape_backslash(comment_);
|
||||
escape_backslash(origin_);
|
||||
escape_backslash(origin_comment_);
|
||||
escape_backslash(text_);
|
||||
escape_backslash(language_code_);
|
||||
escape_backslash(yname_);
|
||||
escape_backslash(yunit_);
|
||||
escape_backslash(xname_);
|
||||
escape_backslash(xunit_);
|
||||
escape_backslash(group_name_);
|
||||
escape_backslash(group_comment_);
|
||||
}
|
||||
|
||||
void escape_backslash(std::string &text)
|
||||
{
|
||||
char backslash = 0x5c;
|
||||
std::string doublebackslash("\\\\");
|
||||
for ( std::string::iterator it = text.begin(); it != text.end(); ++it )
|
||||
{
|
||||
if ( int(*it) == backslash ) {
|
||||
text.replace(it,it+1,doublebackslash);
|
||||
++it;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// get info string
|
||||
std::string get_info(int width = 20)
|
||||
{
|
||||
@ -682,6 +624,7 @@ namespace imc
|
||||
<<std::setw(width)<<std::left<<"significant bits:"<<ysignbits_<<"\n"
|
||||
<<std::setw(width)<<std::left<<"buffer-offset:"<<ybuffer_offset_<<"\n"
|
||||
<<std::setw(width)<<std::left<<"buffer-size:"<<ybuffer_size_<<"\n"
|
||||
<<std::setw(width)<<std::left<<"add-time:"<<addtime_<<"\n"
|
||||
<<std::setw(width)<<std::left<<"xname:"<<xname_<<"\n"
|
||||
<<std::setw(width)<<std::left<<"xunit:"<<xunit_<<"\n"
|
||||
<<std::setw(width)<<std::left<<"xstepwidth:"<<xstepwidth_<<"\n"
|
||||
@ -717,6 +660,7 @@ namespace imc
|
||||
<<"\",\"yname\":\""<<prepjsonstr(yname_)
|
||||
<<"\",\"yunit\":\""<<prepjsonstr(yunit_)
|
||||
<<"\",\"significantbits\":\""<<ysignbits_
|
||||
<<"\",\"addtime\":\""<<addtime_
|
||||
<<"\",\"buffer-size\":\""<<ybuffer_size_
|
||||
<<"\",\"xname\":\""<<prepjsonstr(xname_)
|
||||
<<"\",\"xunit\":\""<<prepjsonstr(xunit_)
|
||||
|
@ -482,7 +482,7 @@ namespace imc
|
||||
// construct members by parsing particular parameters from buffer
|
||||
void parse(const std::vector<unsigned char>* buffer, const std::vector<parameter>& parameters)
|
||||
{
|
||||
if ( parameters.size() < 7 ) throw std::runtime_error("invalid number of parameters in NO");
|
||||
if ( parameters.size() < 7 ) throw std::runtime_error("invalid number of parameters in CD2");
|
||||
origin_ = ( get_parameter(buffer,¶meters[2]) == std::string("1") );
|
||||
generator_ = get_parameter(buffer,¶meters[4]);
|
||||
comment_ = get_parameter(buffer,¶meters[6]);
|
||||
@ -508,7 +508,7 @@ namespace imc
|
||||
// construct members by parsing particular parameters from buffer
|
||||
void parse(const std::vector<unsigned char>* buffer, const std::vector<parameter>& parameters)
|
||||
{
|
||||
if ( parameters.size() < 8 ) throw std::runtime_error("invalid number of parameters in NT1");
|
||||
if ( parameters.size() < 8 ) throw std::runtime_error("invalid number of parameters in CD2");
|
||||
tms_ = std::tm();
|
||||
tms_.tm_mday = std::stoi( get_parameter(buffer,¶meters[2]) );
|
||||
tms_.tm_mon = std::stoi( get_parameter(buffer,¶meters[3]) ) - 1;
|
||||
|
4
makefile
4
makefile
@ -88,11 +88,11 @@ docker-run:
|
||||
|
||||
python-build: check-tags $(GVSN)
|
||||
make -C python/ build-inplace
|
||||
cp python/imctermite*.so ./ -v
|
||||
cp python/IMCtermite*.so ./ -v
|
||||
|
||||
python-clean:
|
||||
make -C python/ clean
|
||||
rm -vf imctermite*.so
|
||||
rm -vf IMCtermite*.so
|
||||
|
||||
python-test:
|
||||
PYTHONPATH=./ python python/examples/usage.py
|
||||
|
@ -1,7 +1,7 @@
|
||||
# distutils: language = c++
|
||||
# cython: language_level = 3
|
||||
|
||||
from imctermite cimport cppimctermite
|
||||
from IMCtermite cimport cppimctermite
|
||||
|
||||
import json as jn
|
||||
import decimal
|
@ -1 +1 @@
|
||||
2.1.18
|
||||
2.1.5
|
||||
|
@ -1,5 +1,5 @@
|
||||
|
||||
import imctermite
|
||||
import IMCtermite
|
||||
import pandas
|
||||
import datetime
|
||||
|
||||
@ -11,7 +11,7 @@ def add_trigger_time(trigger_time, add_time) :
|
||||
if __name__ == "__main__" :
|
||||
|
||||
# read file and extract data
|
||||
imctm = imctermite.imctermite(b"Measurement.raw")
|
||||
imctm = IMCtermite.imctermite(b"Measurement.raw")
|
||||
chns = imctm.get_channels(True)
|
||||
|
||||
# prepare abscissa
|
||||
|
@ -1,11 +1,11 @@
|
||||
|
||||
import imctermite
|
||||
import IMCtermite
|
||||
import json
|
||||
import os
|
||||
|
||||
# declare and initialize instance of "imctermite" by passing a raw-file
|
||||
try :
|
||||
imcraw = imctermite.imctermite(b"samples/exampleB.raw")
|
||||
imcraw = IMCtermite.imctermite(b"samples/exampleB.raw")
|
||||
except RuntimeError as e :
|
||||
raise Exception("failed to load/parse raw-file: " + str(e))
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
|
||||
import imctermite
|
||||
import IMCtermite
|
||||
import json
|
||||
import os
|
||||
|
||||
@ -15,7 +15,7 @@ for fl in rawlist1:
|
||||
|
||||
# declare and initialize instance of "imctermite" by passing a raw-file
|
||||
try :
|
||||
imcraw = imctermite.imctermite(fl.encode())
|
||||
imcraw = IMCtermite.imctermite(fl.encode())
|
||||
except RuntimeError as e :
|
||||
raise Exception("failed to load/parse raw-file: " + str(e))
|
||||
|
||||
|
@ -1,12 +1,12 @@
|
||||
|
||||
import imctermite
|
||||
import IMCtermite
|
||||
import json
|
||||
import os
|
||||
import datetime
|
||||
|
||||
# declare and initialize instance of "imctermite" by passing a raw-file
|
||||
try :
|
||||
imcraw = imctermite.imctermite(b"samples/sampleB.raw")
|
||||
imcraw = IMCtermite.imctermite(b"samples/sampleB.raw")
|
||||
except RuntimeError as e :
|
||||
raise Exception("failed to load/parse raw-file: " + str(e))
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
|
||||
import imctermite import imctermite
|
||||
from IMCtermite import imctermite
|
||||
|
||||
def show_results(imcraw) :
|
||||
|
||||
|
@ -29,7 +29,6 @@ build-clean:
|
||||
rm -vf imctermite*.so imctermite*.cpp
|
||||
rm -vf IMCtermite*.so IMCtermite*.cpp
|
||||
rm -rvf dist/ IMCtermite.egg-info/
|
||||
rm -rvf dist/ imctermite.egg-info/
|
||||
|
||||
cibuildwheel-build: setup
|
||||
cibuildwheel --platform linux
|
||||
|
@ -1,6 +1,6 @@
|
||||
|
||||
[metadata]
|
||||
name = imctermite
|
||||
name = IMCtermite
|
||||
description = Enables extraction of measurement data from binary files with extension 'raw' used by proprietary software imcFAMOS and imcSTUDIO and facilitates its storage in open source file formats
|
||||
long_description = file: README.md
|
||||
# long_description_content_type = text/x-rst
|
||||
|
@ -11,8 +11,8 @@ cmpArgs = {
|
||||
}
|
||||
|
||||
extension = Extension(
|
||||
"imctermite",
|
||||
sources=["imctermite.pyx"],
|
||||
"IMCtermite",
|
||||
sources=["IMCtermite.pyx"],
|
||||
extra_compile_args=cmpArgs[sys.platform]
|
||||
)
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user