py-neuromodulation 0.0.3__py3-none-any.whl → 0.0.5__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (233) hide show
  1. py_neuromodulation/ConnectivityDecoding/Automated Anatomical Labeling 3 (Rolls 2020).nii +0 -0
  2. py_neuromodulation/ConnectivityDecoding/_get_grid_hull.m +34 -0
  3. py_neuromodulation/ConnectivityDecoding/_get_grid_whole_brain.py +95 -0
  4. py_neuromodulation/ConnectivityDecoding/_helper_write_connectome.py +107 -0
  5. py_neuromodulation/ConnectivityDecoding/mni_coords_cortical_surface.mat +0 -0
  6. py_neuromodulation/ConnectivityDecoding/mni_coords_whole_brain.mat +0 -0
  7. py_neuromodulation/ConnectivityDecoding/rmap_func_all.nii +0 -0
  8. py_neuromodulation/ConnectivityDecoding/rmap_struc.nii +0 -0
  9. py_neuromodulation/FieldTrip.py +589 -589
  10. py_neuromodulation/__init__.py +74 -13
  11. py_neuromodulation/_write_example_dataset_helper.py +83 -65
  12. py_neuromodulation/data/README +6 -0
  13. py_neuromodulation/data/dataset_description.json +8 -0
  14. py_neuromodulation/data/participants.json +32 -0
  15. py_neuromodulation/data/participants.tsv +2 -0
  16. py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_space-mni_coordsystem.json +5 -0
  17. py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_space-mni_electrodes.tsv +11 -0
  18. py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_channels.tsv +11 -0
  19. py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_ieeg.eeg +0 -0
  20. py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_ieeg.json +18 -0
  21. py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_ieeg.vhdr +35 -0
  22. py_neuromodulation/data/sub-testsub/ses-EphysMedOff/ieeg/sub-testsub_ses-EphysMedOff_task-gripforce_run-0_ieeg.vmrk +13 -0
  23. py_neuromodulation/data/sub-testsub/ses-EphysMedOff/sub-testsub_ses-EphysMedOff_scans.tsv +2 -0
  24. py_neuromodulation/grid_cortex.tsv +40 -0
  25. py_neuromodulation/grid_subcortex.tsv +1429 -0
  26. py_neuromodulation/liblsl/libpugixml.so.1.12 +0 -0
  27. py_neuromodulation/liblsl/linux/bionic_amd64/liblsl.1.16.2.so +0 -0
  28. py_neuromodulation/liblsl/linux/bookworm_amd64/liblsl.1.16.2.so +0 -0
  29. py_neuromodulation/liblsl/linux/focal_amd46/liblsl.1.16.2.so +0 -0
  30. py_neuromodulation/liblsl/linux/jammy_amd64/liblsl.1.16.2.so +0 -0
  31. py_neuromodulation/liblsl/linux/jammy_x86/liblsl.1.16.2.so +0 -0
  32. py_neuromodulation/liblsl/linux/noble_amd64/liblsl.1.16.2.so +0 -0
  33. py_neuromodulation/liblsl/macos/amd64/liblsl.1.16.2.dylib +0 -0
  34. py_neuromodulation/liblsl/macos/arm64/liblsl.1.16.0.dylib +0 -0
  35. py_neuromodulation/liblsl/windows/amd64/liblsl.1.16.2.dll +0 -0
  36. py_neuromodulation/liblsl/windows/x86/liblsl.1.16.2.dll +0 -0
  37. py_neuromodulation/nm_IO.py +413 -417
  38. py_neuromodulation/nm_RMAP.py +496 -531
  39. py_neuromodulation/nm_analysis.py +993 -1074
  40. py_neuromodulation/nm_artifacts.py +30 -25
  41. py_neuromodulation/nm_bispectra.py +154 -168
  42. py_neuromodulation/nm_bursts.py +292 -198
  43. py_neuromodulation/nm_coherence.py +251 -205
  44. py_neuromodulation/nm_database.py +149 -0
  45. py_neuromodulation/nm_decode.py +918 -992
  46. py_neuromodulation/nm_define_nmchannels.py +300 -302
  47. py_neuromodulation/nm_features.py +144 -116
  48. py_neuromodulation/nm_filter.py +219 -219
  49. py_neuromodulation/nm_filter_preprocessing.py +79 -91
  50. py_neuromodulation/nm_fooof.py +139 -159
  51. py_neuromodulation/nm_generator.py +45 -37
  52. py_neuromodulation/nm_hjorth_raw.py +52 -73
  53. py_neuromodulation/nm_kalmanfilter.py +71 -58
  54. py_neuromodulation/nm_linelength.py +21 -33
  55. py_neuromodulation/nm_logger.py +66 -0
  56. py_neuromodulation/nm_mne_connectivity.py +149 -112
  57. py_neuromodulation/nm_mnelsl_generator.py +90 -0
  58. py_neuromodulation/nm_mnelsl_stream.py +116 -0
  59. py_neuromodulation/nm_nolds.py +96 -93
  60. py_neuromodulation/nm_normalization.py +173 -214
  61. py_neuromodulation/nm_oscillatory.py +423 -448
  62. py_neuromodulation/nm_plots.py +585 -612
  63. py_neuromodulation/nm_preprocessing.py +83 -0
  64. py_neuromodulation/nm_projection.py +370 -394
  65. py_neuromodulation/nm_rereference.py +97 -95
  66. py_neuromodulation/nm_resample.py +59 -50
  67. py_neuromodulation/nm_run_analysis.py +325 -435
  68. py_neuromodulation/nm_settings.py +289 -68
  69. py_neuromodulation/nm_settings.yaml +244 -0
  70. py_neuromodulation/nm_sharpwaves.py +423 -401
  71. py_neuromodulation/nm_stats.py +464 -480
  72. py_neuromodulation/nm_stream.py +398 -0
  73. py_neuromodulation/nm_stream_abc.py +166 -218
  74. py_neuromodulation/nm_types.py +193 -0
  75. py_neuromodulation/plots/STN_surf.mat +0 -0
  76. py_neuromodulation/plots/Vertices.mat +0 -0
  77. py_neuromodulation/plots/faces.mat +0 -0
  78. py_neuromodulation/plots/grid.mat +0 -0
  79. {py_neuromodulation-0.0.3.dist-info → py_neuromodulation-0.0.5.dist-info}/METADATA +185 -182
  80. py_neuromodulation-0.0.5.dist-info/RECORD +83 -0
  81. {py_neuromodulation-0.0.3.dist-info → py_neuromodulation-0.0.5.dist-info}/WHEEL +1 -2
  82. {py_neuromodulation-0.0.3.dist-info → py_neuromodulation-0.0.5.dist-info/licenses}/LICENSE +21 -21
  83. docs/build/_downloads/09df217f95985497f45d69e2d4bdc5b1/plot_2_example_add_feature.py +0 -68
  84. docs/build/_downloads/3b4900a2b2818ff30362215b76f7d5eb/plot_1_example_BIDS.py +0 -233
  85. docs/build/_downloads/7e92dd2e6cc86b239d14cafad972ae4f/plot_3_example_sharpwave_analysis.py +0 -219
  86. docs/build/_downloads/c2db0bf2b334d541b00662b991682256/plot_6_real_time_demo.py +0 -97
  87. docs/build/_downloads/ce3914826f782cbd1ea8fd024eaf0ac3/plot_5_example_rmap_computing.py +0 -64
  88. docs/build/_downloads/da36848a41e6a3235d91fb7cfb6d59b4/plot_0_first_demo.py +0 -192
  89. docs/build/_downloads/eaa4305c75b19a1e2eea941f742a6331/plot_4_example_gridPointProjection.py +0 -210
  90. docs/build/html/_downloads/09df217f95985497f45d69e2d4bdc5b1/plot_2_example_add_feature.py +0 -68
  91. docs/build/html/_downloads/3b4900a2b2818ff30362215b76f7d5eb/plot_1_example_BIDS.py +0 -239
  92. docs/build/html/_downloads/7e92dd2e6cc86b239d14cafad972ae4f/plot_3_example_sharpwave_analysis.py +0 -219
  93. docs/build/html/_downloads/c2db0bf2b334d541b00662b991682256/plot_6_real_time_demo.py +0 -97
  94. docs/build/html/_downloads/ce3914826f782cbd1ea8fd024eaf0ac3/plot_5_example_rmap_computing.py +0 -64
  95. docs/build/html/_downloads/da36848a41e6a3235d91fb7cfb6d59b4/plot_0_first_demo.py +0 -192
  96. docs/build/html/_downloads/eaa4305c75b19a1e2eea941f742a6331/plot_4_example_gridPointProjection.py +0 -210
  97. docs/source/_build/html/_downloads/09df217f95985497f45d69e2d4bdc5b1/plot_2_example_add_feature.py +0 -76
  98. docs/source/_build/html/_downloads/0d0d0a76e8f648d5d3cbc47da6351932/plot_real_time_demo.py +0 -97
  99. docs/source/_build/html/_downloads/3b4900a2b2818ff30362215b76f7d5eb/plot_1_example_BIDS.py +0 -240
  100. docs/source/_build/html/_downloads/5d73cadc59a8805c47e3b84063afc157/plot_example_BIDS.py +0 -233
  101. docs/source/_build/html/_downloads/7660317fa5a6bfbd12fcca9961457fc4/plot_example_rmap_computing.py +0 -63
  102. docs/source/_build/html/_downloads/7e92dd2e6cc86b239d14cafad972ae4f/plot_3_example_sharpwave_analysis.py +0 -219
  103. docs/source/_build/html/_downloads/839e5b319379f7fd9e867deb00fd797f/plot_example_gridPointProjection.py +0 -210
  104. docs/source/_build/html/_downloads/ae8be19afe5e559f011fc9b138968ba0/plot_first_demo.py +0 -192
  105. docs/source/_build/html/_downloads/b8b06cacc17969d3725a0b6f1d7741c5/plot_example_sharpwave_analysis.py +0 -219
  106. docs/source/_build/html/_downloads/c2db0bf2b334d541b00662b991682256/plot_6_real_time_demo.py +0 -121
  107. docs/source/_build/html/_downloads/c31a86c0b68cb4167d968091ace8080d/plot_example_add_feature.py +0 -68
  108. docs/source/_build/html/_downloads/ce3914826f782cbd1ea8fd024eaf0ac3/plot_5_example_rmap_computing.py +0 -64
  109. docs/source/_build/html/_downloads/da36848a41e6a3235d91fb7cfb6d59b4/plot_0_first_demo.py +0 -189
  110. docs/source/_build/html/_downloads/eaa4305c75b19a1e2eea941f742a6331/plot_4_example_gridPointProjection.py +0 -210
  111. docs/source/auto_examples/plot_0_first_demo.py +0 -189
  112. docs/source/auto_examples/plot_1_example_BIDS.py +0 -240
  113. docs/source/auto_examples/plot_2_example_add_feature.py +0 -76
  114. docs/source/auto_examples/plot_3_example_sharpwave_analysis.py +0 -219
  115. docs/source/auto_examples/plot_4_example_gridPointProjection.py +0 -210
  116. docs/source/auto_examples/plot_5_example_rmap_computing.py +0 -64
  117. docs/source/auto_examples/plot_6_real_time_demo.py +0 -121
  118. docs/source/conf.py +0 -105
  119. examples/plot_0_first_demo.py +0 -189
  120. examples/plot_1_example_BIDS.py +0 -240
  121. examples/plot_2_example_add_feature.py +0 -76
  122. examples/plot_3_example_sharpwave_analysis.py +0 -219
  123. examples/plot_4_example_gridPointProjection.py +0 -210
  124. examples/plot_5_example_rmap_computing.py +0 -64
  125. examples/plot_6_real_time_demo.py +0 -121
  126. packages/realtime_decoding/build/lib/realtime_decoding/__init__.py +0 -4
  127. packages/realtime_decoding/build/lib/realtime_decoding/decoder.py +0 -104
  128. packages/realtime_decoding/build/lib/realtime_decoding/features.py +0 -163
  129. packages/realtime_decoding/build/lib/realtime_decoding/helpers.py +0 -15
  130. packages/realtime_decoding/build/lib/realtime_decoding/run_decoding.py +0 -345
  131. packages/realtime_decoding/build/lib/realtime_decoding/trainer.py +0 -54
  132. packages/tmsi/build/lib/TMSiFileFormats/__init__.py +0 -37
  133. packages/tmsi/build/lib/TMSiFileFormats/file_formats/__init__.py +0 -36
  134. packages/tmsi/build/lib/TMSiFileFormats/file_formats/lsl_stream_writer.py +0 -200
  135. packages/tmsi/build/lib/TMSiFileFormats/file_formats/poly5_file_writer.py +0 -496
  136. packages/tmsi/build/lib/TMSiFileFormats/file_formats/poly5_to_edf_converter.py +0 -236
  137. packages/tmsi/build/lib/TMSiFileFormats/file_formats/xdf_file_writer.py +0 -977
  138. packages/tmsi/build/lib/TMSiFileFormats/file_readers/__init__.py +0 -35
  139. packages/tmsi/build/lib/TMSiFileFormats/file_readers/edf_reader.py +0 -116
  140. packages/tmsi/build/lib/TMSiFileFormats/file_readers/poly5reader.py +0 -294
  141. packages/tmsi/build/lib/TMSiFileFormats/file_readers/xdf_reader.py +0 -229
  142. packages/tmsi/build/lib/TMSiFileFormats/file_writer.py +0 -102
  143. packages/tmsi/build/lib/TMSiPlotters/__init__.py +0 -2
  144. packages/tmsi/build/lib/TMSiPlotters/gui/__init__.py +0 -39
  145. packages/tmsi/build/lib/TMSiPlotters/gui/_plotter_gui.py +0 -234
  146. packages/tmsi/build/lib/TMSiPlotters/gui/plotting_gui.py +0 -440
  147. packages/tmsi/build/lib/TMSiPlotters/plotters/__init__.py +0 -44
  148. packages/tmsi/build/lib/TMSiPlotters/plotters/hd_emg_plotter.py +0 -446
  149. packages/tmsi/build/lib/TMSiPlotters/plotters/impedance_plotter.py +0 -589
  150. packages/tmsi/build/lib/TMSiPlotters/plotters/signal_plotter.py +0 -1326
  151. packages/tmsi/build/lib/TMSiSDK/__init__.py +0 -54
  152. packages/tmsi/build/lib/TMSiSDK/device.py +0 -588
  153. packages/tmsi/build/lib/TMSiSDK/devices/__init__.py +0 -34
  154. packages/tmsi/build/lib/TMSiSDK/devices/saga/TMSi_Device_API.py +0 -1764
  155. packages/tmsi/build/lib/TMSiSDK/devices/saga/__init__.py +0 -34
  156. packages/tmsi/build/lib/TMSiSDK/devices/saga/saga_device.py +0 -1366
  157. packages/tmsi/build/lib/TMSiSDK/devices/saga/saga_types.py +0 -520
  158. packages/tmsi/build/lib/TMSiSDK/devices/saga/xml_saga_config.py +0 -165
  159. packages/tmsi/build/lib/TMSiSDK/error.py +0 -95
  160. packages/tmsi/build/lib/TMSiSDK/sample_data.py +0 -63
  161. packages/tmsi/build/lib/TMSiSDK/sample_data_server.py +0 -99
  162. packages/tmsi/build/lib/TMSiSDK/settings.py +0 -45
  163. packages/tmsi/build/lib/TMSiSDK/tmsi_device.py +0 -111
  164. packages/tmsi/build/lib/__init__.py +0 -4
  165. packages/tmsi/build/lib/apex_sdk/__init__.py +0 -34
  166. packages/tmsi/build/lib/apex_sdk/device/__init__.py +0 -41
  167. packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_API.py +0 -1009
  168. packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_API_enums.py +0 -239
  169. packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_API_structures.py +0 -668
  170. packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_device.py +0 -1611
  171. packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_dongle.py +0 -38
  172. packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_event_reader.py +0 -57
  173. packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_structures/apex_channel.py +0 -44
  174. packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_structures/apex_config.py +0 -150
  175. packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_structures/apex_const.py +0 -36
  176. packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_structures/apex_impedance_channel.py +0 -48
  177. packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_structures/apex_info.py +0 -108
  178. packages/tmsi/build/lib/apex_sdk/device/devices/apex/apex_structures/dongle_info.py +0 -39
  179. packages/tmsi/build/lib/apex_sdk/device/devices/apex/measurements/download_measurement.py +0 -77
  180. packages/tmsi/build/lib/apex_sdk/device/devices/apex/measurements/eeg_measurement.py +0 -150
  181. packages/tmsi/build/lib/apex_sdk/device/devices/apex/measurements/impedance_measurement.py +0 -129
  182. packages/tmsi/build/lib/apex_sdk/device/threads/conversion_thread.py +0 -59
  183. packages/tmsi/build/lib/apex_sdk/device/threads/sampling_thread.py +0 -57
  184. packages/tmsi/build/lib/apex_sdk/device/tmsi_channel.py +0 -83
  185. packages/tmsi/build/lib/apex_sdk/device/tmsi_device.py +0 -201
  186. packages/tmsi/build/lib/apex_sdk/device/tmsi_device_enums.py +0 -103
  187. packages/tmsi/build/lib/apex_sdk/device/tmsi_dongle.py +0 -43
  188. packages/tmsi/build/lib/apex_sdk/device/tmsi_event_reader.py +0 -50
  189. packages/tmsi/build/lib/apex_sdk/device/tmsi_measurement.py +0 -118
  190. packages/tmsi/build/lib/apex_sdk/sample_data_server/__init__.py +0 -33
  191. packages/tmsi/build/lib/apex_sdk/sample_data_server/event_data.py +0 -44
  192. packages/tmsi/build/lib/apex_sdk/sample_data_server/sample_data.py +0 -50
  193. packages/tmsi/build/lib/apex_sdk/sample_data_server/sample_data_server.py +0 -136
  194. packages/tmsi/build/lib/apex_sdk/tmsi_errors/error.py +0 -126
  195. packages/tmsi/build/lib/apex_sdk/tmsi_sdk.py +0 -113
  196. packages/tmsi/build/lib/apex_sdk/tmsi_utilities/apex/apex_structure_generator.py +0 -134
  197. packages/tmsi/build/lib/apex_sdk/tmsi_utilities/decorators.py +0 -60
  198. packages/tmsi/build/lib/apex_sdk/tmsi_utilities/logger_filter.py +0 -42
  199. packages/tmsi/build/lib/apex_sdk/tmsi_utilities/singleton.py +0 -42
  200. packages/tmsi/build/lib/apex_sdk/tmsi_utilities/support_functions.py +0 -72
  201. packages/tmsi/build/lib/apex_sdk/tmsi_utilities/tmsi_logger.py +0 -98
  202. py_neuromodulation/nm_EpochStream.py +0 -92
  203. py_neuromodulation/nm_across_patient_decoding.py +0 -927
  204. py_neuromodulation/nm_cohortwrapper.py +0 -435
  205. py_neuromodulation/nm_eval_timing.py +0 -239
  206. py_neuromodulation/nm_features_abc.py +0 -39
  207. py_neuromodulation/nm_stream_offline.py +0 -358
  208. py_neuromodulation/utils/_logging.py +0 -24
  209. py_neuromodulation-0.0.3.dist-info/RECORD +0 -188
  210. py_neuromodulation-0.0.3.dist-info/top_level.txt +0 -5
  211. tests/__init__.py +0 -0
  212. tests/conftest.py +0 -117
  213. tests/test_all_examples.py +0 -10
  214. tests/test_all_features.py +0 -63
  215. tests/test_bispectra.py +0 -70
  216. tests/test_bursts.py +0 -105
  217. tests/test_feature_sampling_rates.py +0 -143
  218. tests/test_fooof.py +0 -16
  219. tests/test_initalization_offline_stream.py +0 -41
  220. tests/test_multiprocessing.py +0 -58
  221. tests/test_nan_values.py +0 -29
  222. tests/test_nm_filter.py +0 -95
  223. tests/test_nm_resample.py +0 -63
  224. tests/test_normalization_settings.py +0 -146
  225. tests/test_notch_filter.py +0 -31
  226. tests/test_osc_features.py +0 -424
  227. tests/test_preprocessing_filter.py +0 -151
  228. tests/test_rereference.py +0 -171
  229. tests/test_sampling.py +0 -57
  230. tests/test_settings_change_after_init.py +0 -76
  231. tests/test_sharpwave.py +0 -165
  232. tests/test_target_channel_add.py +0 -100
  233. tests/test_timing.py +0 -80
@@ -1,54 +0,0 @@
1
- """
2
- (c) 2022 Twente Medical Systems International B.V., Oldenzaal The Netherlands
3
-
4
- Licensed under the Apache License, Version 2.0 (the "License");
5
- you may not use this file except in compliance with the License.
6
- You may obtain a copy of the License at
7
-
8
- http://www.apache.org/licenses/LICENSE-2.0
9
-
10
- Unless required by applicable law or agreed to in writing, software
11
- distributed under the License is distributed on an "AS IS" BASIS,
12
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- See the License for the specific language governing permissions and
14
- limitations under the License.
15
-
16
- ####### # # ##### #
17
- # ## ## #
18
- # # # # # # #
19
- # # # # ##### #
20
- # # # # #
21
- # # # # #
22
- # # # ##### #
23
-
24
- /**
25
- * @file ${__init__.py}
26
- * @brief Initialisation of the TMSiSDK directory classes.
27
- *
28
- */
29
-
30
-
31
- """
32
- from os.path import join, dirname, realpath
33
-
34
- from . import (
35
- device,
36
- error,
37
- sample_data_server,
38
- sample_data,
39
- settings,
40
- tmsi_device,
41
- )
42
- from . import devices
43
- from .device import DeviceInterfaceType, DeviceState
44
- from .devices.saga import SagaDevice
45
- from .devices.saga import xml_saga_config
46
- from .error import TMSiError, TMSiErrorCode, DeviceErrorLookupTable
47
- from .tmsi_device import DeviceType, discover, initialize
48
-
49
-
50
- def get_config(config_name):
51
- TMSiSDK_dir = dirname(realpath(__file__)) # directory of this file
52
- configs_dir = join(TMSiSDK_dir, "configs")
53
- config_fname = join(configs_dir, config_name + ".xml")
54
- return config_fname
@@ -1,588 +0,0 @@
1
- """
2
- (c) 2022 Twente Medical Systems International B.V., Oldenzaal The Netherlands
3
-
4
- Licensed under the Apache License, Version 2.0 (the "License");
5
- you may not use this file except in compliance with the License.
6
- You may obtain a copy of the License at
7
-
8
- http://www.apache.org/licenses/LICENSE-2.0
9
-
10
- Unless required by applicable law or agreed to in writing, software
11
- distributed under the License is distributed on an "AS IS" BASIS,
12
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- See the License for the specific language governing permissions and
14
- limitations under the License.
15
-
16
- ####### # # ##### #
17
- # ## ## #
18
- # # # # # # #
19
- # # # # ##### #
20
- # # # # #
21
- # # # # #
22
- # # # ##### #
23
-
24
- /**
25
- * @file ${device.py}
26
- * @brief Main Device Interface
27
- *
28
- */
29
-
30
-
31
- """
32
-
33
- from enum import Enum, unique
34
-
35
-
36
- @unique
37
- class DeviceInterfaceType(Enum):
38
- none = 0
39
- usb = 1
40
- network = 2
41
- wifi = 3
42
- docked = 4
43
- optical = 5
44
- bluetooth = 6
45
-
46
-
47
- @unique
48
- class DeviceState(Enum):
49
- disconnected = 0
50
- connected = 1
51
- sampling = 2
52
-
53
-
54
- @unique
55
- class ChannelType(Enum):
56
- unknown = 0
57
- UNI = 1
58
- BIP = 2
59
- AUX = 3
60
- sensor = 4
61
- status = 5
62
- counter = 6
63
- all_types = 7
64
-
65
-
66
- @unique
67
- class MeasurementType(Enum):
68
- normal = 0
69
- impedance = 1
70
-
71
-
72
- @unique
73
- class ReferenceMethod(Enum):
74
- common = 0
75
- average = 1
76
-
77
-
78
- @unique
79
- class ReferenceSwitch(Enum):
80
- fixed = 0
81
- auto = 1
82
-
83
-
84
- class DeviceChannel:
85
- """'DeviceChannel' represents a device channel. It has the next properties:
86
-
87
- type : 'ChannelType' Indicates the group-type of a channel.
88
-
89
- sample_rate : 'int' The curring sampling rate of the channel during a 'normal' measurement.
90
-
91
- bandwidth : 'int' Bandwidth (in bits/s) required for transfer from DR to DS,
92
- used by bandwidth manager in application software.
93
-
94
- name : 'string' The name of the channel.
95
-
96
- unit_name : 'string' The name of the unit (e.g. 'μVolt) of the sample-data of the channel.
97
-
98
- enabled : 'bool' Indicates if a channel is enabled for measuring
99
-
100
- Note: The properties 'name' and 'enabled' can be modified. The other properties
101
- are read-only.
102
- """
103
-
104
- def __init__(
105
- self,
106
- type,
107
- sample_rate,
108
- name,
109
- unit_name,
110
- enabled,
111
- bandwidth=0,
112
- sensor=None,
113
- ):
114
- self.__type = type
115
- self.__sample_rate = sample_rate
116
- self.__unit_name = unit_name
117
- self.__name = name
118
- self.__enabled = enabled
119
- self.__sensor = sensor
120
- self.__bandwidth = bandwidth
121
-
122
- @property
123
- def type(self):
124
- """'ChannelType' Indicates the group-type of a channel."""
125
- return self.__type
126
-
127
- @property
128
- def sample_rate(self):
129
- """'int' The curring sampling rate of the channel during a 'normal' measurement."""
130
- return self.__sample_rate
131
-
132
- @property
133
- def bandwidth(self):
134
- """'int' Bandwidth (in bits/s) required for transfer from DR to DS, used by bandwidth manager in application software."""
135
- return self.__bandwidth
136
-
137
- @property
138
- def name(self):
139
- """'string' The name of the channel."""
140
- return self.__name
141
-
142
- @name.setter
143
- def name(self, var):
144
- """'string' Sets the name of the channel."""
145
- self.__name = var
146
-
147
- @property
148
- def unit_name(self):
149
- """'string' The name of the unit (e.g. 'μVolt) of the sample-data of the channel."""
150
- return self.__unit_name
151
-
152
- @property
153
- def enabled(self):
154
- """'bool' Indicates if a channel is enabled for measuring"""
155
- return self.__enabled
156
-
157
- @enabled.setter
158
- def enabled(self, var):
159
- """'bool' Enables (True) or disables (False) a channel for measurement"""
160
- self.__enabled = var
161
-
162
- @property
163
- def sensor(self):
164
- """'DeviceSensor' contains an object if a sensor is attached to the channel."""
165
- return self.__sensor
166
-
167
-
168
- class DeviceInfo:
169
- """'DeviceInfo' holds the static device information. It has the next properties:
170
-
171
- ds_interface : 'DeviceInterfaceType' Indicates interface-type between the PC
172
- and the docking station.
173
-
174
- dr_interface : 'DeviceInterfaceType' Indicates interface-type between the
175
- PC / docking station and the data recorder.
176
-
177
- ds_serial_number : 'int' The serial number of the docking station.
178
-
179
- dr_serial_number : 'int' The serial number of the data recorder.
180
-
181
- """
182
-
183
- def __init__(
184
- self,
185
- ds_interface=DeviceInterfaceType.none,
186
- dr_interface=DeviceInterfaceType.none,
187
- ):
188
- self.__ds_interface = ds_interface
189
- self.__dr_interface = dr_interface
190
- self.__ds_serial_number = 0
191
- self.__dr_serial_number = 0
192
-
193
- @property
194
- def ds_interface(self):
195
- """ds_interface : 'DeviceInterfaceType' Indicates interface-type between the PC
196
- and the docking station.
197
- """
198
- return self.__ds_interface
199
-
200
- @property
201
- def dr_interface(self):
202
- """dr_interface : 'DeviceInterfaceType' Indicates interface-type between the
203
- PC / docking station and the data recorder.
204
- """
205
- return self.__dr_interface
206
-
207
- @property
208
- def ds_serial_number(self):
209
- """'int' The serial number of the docking station."""
210
- return self.__ds_serial_number
211
-
212
- @property
213
- def dr_serial_number(self):
214
- """'int' The serial number of the data recorder."""
215
- return self.__dr_serial_number
216
-
217
-
218
- class DeviceStatus:
219
- """'DeviceStatus' holds the runtime device information. It has the next properties:
220
-
221
- state : 'DeviceState' Indicates the connection-state towards the device which can be :
222
-
223
- - connected : The connection to the device is open
224
- - disconnected : The connection to the device is closed
225
- - sampling : The connection to the device is open and the device
226
- has an ongoing measurement active.
227
-
228
- error : 'int' The return-code of the last made call to the device. A '0'
229
- indicates that the call was succesfull.
230
- """
231
-
232
- def __init__(self, state, error):
233
- self.__state = state
234
- self.__error = error
235
-
236
- @property
237
- def state(self):
238
- """'DeviceState' Indicates the connection-state towards the device"""
239
- return self.__state
240
-
241
- @property
242
- def error(self):
243
- """'int' The return-code of the last made call to the device."""
244
- return self.__error
245
-
246
-
247
- class DeviceSensor:
248
- """'DeviceSensor' represents the sensor-data of a channel. It has the next properties:
249
-
250
- channel_list_idx : 'int' Index of the channel in the total channel list. Index starts at 0.
251
- The total channel list can be accessed with [Device.config.channels]
252
-
253
- id : 'int' ID-code of the sensor used to identify BIP-sensors.
254
-
255
- serial_nr : 'int' Serial number of an attached AUX-sensor.
256
-
257
- product_id : 'int' Product identified of an attached AUX-sensor.
258
-
259
- exp : 'int' Exponent for the unit, e.g. milli = -3 this gives for a
260
- unit_name V a result mV.
261
-
262
- name : 'string' The name of the sensor-channel.
263
-
264
- unit_name : 'string' The name of the unit (e.g. 'Volt) of the sensor-data.
265
-
266
- """
267
-
268
- def __init__(
269
- self, channel_list_idx, id, serial_nr, product_id, name, unit_name, exp
270
- ):
271
- self.__channel_list_idx = channel_list_idx
272
- self.__id = id
273
- self.__serial_nr = serial_nr
274
- self.__name = name
275
- self.__unit_name = unit_name
276
- self.__product_id = product_id
277
- self.__exp = exp
278
-
279
- @property
280
- def channel_list_idx(self):
281
- """''int' Index of the channel in the total channel list."""
282
- return self.__channel_list_idx
283
-
284
- @property
285
- def id(self):
286
- """'int' ID-code of the sensor used to identify BIP-sensors."""
287
- return self.__id
288
-
289
- @property
290
- def serial_nr(self):
291
- """'int' Serial number of an attached AUX-sensor"""
292
- return self.__serial_nr
293
-
294
- @property
295
- def product_id(self):
296
- """'int' Product identified of an attached AUX-sensor"""
297
- return self.__product_id
298
-
299
- @property
300
- def name(self):
301
- """'string' The name of the sensor-channel."""
302
- return self.__name
303
-
304
- @property
305
- def unit_name(self):
306
- """'string' Exponent for the unit, e.g. milli = -3 this gives for a
307
- unit_name V a result mV.
308
- """
309
- return self.__unit_name
310
-
311
- @property
312
- def exp(self):
313
- """'int' The name of the channel."""
314
- return self.__exp
315
-
316
-
317
- class DeviceConfig:
318
- """'DeviceConfig' holds the actual device configuration"""
319
-
320
- def __init__(self, sample_rate, num_channels):
321
- pass
322
-
323
- @property
324
- def num_channels(self):
325
- """'int' The total number of channels (enabled and disabled)"""
326
- pass
327
-
328
- @property
329
- def channels(self):
330
- """'list DeviceChannel' The total list of channels (enabled and disabled)"""
331
- pass
332
-
333
- @channels.setter
334
- def channels(self, ch_list):
335
- """Updates the channel lists in the device.
336
-
337
- Args:
338
- ch_list : 'list DeviceChannel'
339
-
340
- The channel-properties 'enabled' and 'name' can be modified. The other
341
- channel-properties are read-only.
342
-
343
- Note:
344
- 'ch_list' must contain all channels (enabled and disabled), in the
345
- same sequence as retrieved with 'Device.config.channels'
346
-
347
- It is advised to "refresh" the applications' local "variables"
348
- after the channel list has been updated.
349
- """
350
- pass
351
-
352
- @property
353
- def base_sample_rate(self):
354
- """'int' The active base-sample-rate of the device"""
355
- pass
356
-
357
- @base_sample_rate.setter
358
- def base_sample_rate(self, sample_rate):
359
- """Sets the base-sample-rate of the device.
360
-
361
- Args:
362
- sample_rate : 'int' new base sample rate
363
-
364
- Note:
365
- Upon a change of the base-sample-rate, automatically the sample-rate
366
- of the channel-type-groups (and thus also the sample-rate of every channel)
367
- changes.
368
-
369
- It is advised to "refresh" the applications' local "variables"
370
- after the base-sample-rate has been updated.
371
- """
372
- pass
373
-
374
- @property
375
- def sample_rate(self):
376
- """'int' The rate of the current configuration, with which
377
- sample-sets are sent during a measurement.
378
- """
379
- pass
380
-
381
- def get_sample_rate(self, channel_type):
382
- """'int' the sample-rate of the specified channel-type-group.
383
-
384
- Args:
385
- channel_type : 'ChannelType' The channel-type-group.
386
- """
387
- pass
388
-
389
- def set_sample_rate(self, channel_type, base_sample_rate_divider):
390
- """Sets the sample-rate of the specified channel-type-group.
391
-
392
- Args:
393
- channel_type : 'ChannelType' The channel-type-group of which the
394
- sample-rate must be updated.
395
- It is possible to set all channels to the same sample-rate within one
396
- call. Then 'ChannelType.all_types' must be used.
397
-
398
- base_sample_rate_divider: 'int' The divider to indicate to what fraction
399
- of the active base-sample-rate the sample-rate of the channel-type-group
400
- must be set. Only the values 1, 2, 4 and 8 are possible.
401
- For example if the base-sample-rate=4000 and base_sample_rate_divider=8,
402
- the sample-rate will become 4000/8 = 500 Hz
403
-
404
- Note:
405
- Upon a change of the sample-rate of a channel-type-group, automatically
406
- the sample-rate of the channels of that channel-type are updated.
407
-
408
- It is advised to "refresh" the applications' local "variables"
409
- after the sample-rate of a channel-type-group has been updated.
410
- """
411
- pass
412
-
413
- def set_interface_type(self, dr_interface_type):
414
- """Changes the configured interface type of the device
415
-
416
- Args:
417
- interface_type: 'DeviceInterfaceType' The interface type that needs
418
- to be updated.
419
- """
420
- pass
421
-
422
- @property
423
- def interface_bandwidth(self):
424
- """'int' Data bandwidth in Mbits/s for current interface."""
425
- pass
426
-
427
- @property
428
- def reference_method(self):
429
- """'ReferenceMethod' the reference method applied to the UNI channels"""
430
- pass
431
-
432
- @reference_method.setter
433
- def reference_method(self, reference_type):
434
- """Sets the reference method for the UNI channels
435
-
436
- Args:
437
- reference_type: 'ReferenceMethod' the type of reference method that
438
- should be used for measuring the UNI channels
439
-
440
- """
441
-
442
-
443
- class Device:
444
- """'Device' handles the connection to a TMSi Measurement System like the SAGA.
445
-
446
- The Device class interfaces with the measurement system to :
447
- - open/close a connection to the system
448
- - configure the system
449
- - forward the received sample data to Python-clients for display and/or storage.
450
-
451
- Args:
452
- ds-interface: The interface-type between the PC and the docking-station.
453
- This might be 'usb' or 'network''
454
-
455
- dr-interface: The interface-type between the docking-station and data recorder.
456
- This might be 'docked', 'optical' or 'wifi'
457
- """
458
-
459
- @property
460
- def id(self):
461
- """'int' : Unique id within all available devices. The id can be used to
462
- register as a client at the 'sample_data_server' for retrieval of
463
- sample-data of a specific device
464
- """
465
- pass
466
-
467
- @property
468
- def info(self):
469
- """'class DeviceInfo' : Static information of a device like used interfaces, serial numbers"""
470
- pass
471
-
472
- @property
473
- def status(self):
474
- """'class DeviceStatus' : Runtime information of a device like device state"""
475
- pass
476
-
477
- @property
478
- def config(self):
479
- """'class DeviceConfig' : The configuration of a device which exists
480
- out of individual properties (like base-sample-rate) and the total
481
- channel list (with enabled and disabled channels)
482
- """
483
- pass
484
-
485
- @property
486
- def channels(self):
487
- """'list of class DeviceChannel' : The list of enabled channels.
488
- Enabled channels are active during an 'normal' measurement.
489
- """
490
- pass
491
-
492
- @property
493
- def imp_channels(self):
494
- """'list of class DeviceChannel' : The list of impedance channels.
495
- Impedance channels are active during an 'impedance' measurement.
496
- """
497
- pass
498
-
499
- @property
500
- def sensors(self):
501
- """'list of class DeviceSensor' : The complete list of sensor-information
502
- for the sensor-type channels : BIP and AUX
503
- """
504
-
505
- @property
506
- def datetime(self):
507
- """'datetime' Current date and time of the device"""
508
- pass
509
-
510
- @datetime.setter
511
- def datetime(self, dt):
512
- """'datetime' Sets date and time of the device"""
513
- pass
514
-
515
- def open(self):
516
- """Opens the connection to the device.
517
-
518
- The open-function will first initiate a discovery on attached systems to the PC
519
- based on the interface-types which were registered upon the creation of the Device-object.
520
-
521
- A connection will be established with the first available system.
522
-
523
- The functionailty a device offers will only be available when a connection
524
- to the system has been established.
525
- """
526
- pass
527
-
528
- def close(self):
529
- """Closes the connection to the device."""
530
- pass
531
-
532
- def start_measurement(self, measurement_type=MeasurementType.normal):
533
- """Starts a measurement on the device.
534
- Clients, which want to receive the sample-data of a measurement,
535
- must be registered at the 'sample data server' before the measurement is started.
536
-
537
- Args:
538
- measurement_type : - MeasurementType.normal (default), starts a measurement
539
- with the 'enabled' channels: 'Device.channels[]'.
540
- - MeasurementType.impedance, starts an impedance-measurement
541
- with all 'impedance' channels: 'Device.imp_channels[]'
542
- """
543
- pass
544
-
545
- def stop_measurement(self):
546
- """Stops an ongoing measurement on the device."""
547
- pass
548
-
549
- def set_factory_defaults(self):
550
- """Initiates a factory reset to restore the systems' default configuration."""
551
- pass
552
-
553
- def load_config(self, filename):
554
- """Loads a device configuration from file into the attached system.
555
-
556
- 1. The device configuration is read from the specified file.
557
- 2. This configuration is uploaded into the attached system.
558
- 3. The configuration is downloaded from the system to be sure that
559
- the configuration of the Python-interface is in sync with the
560
- configuration of the device.
561
-
562
- Note : It is advised to "refresh" the applications' local "variables"
563
- after a new device configuration has been load.
564
-
565
- Args:
566
- filename : path and filename of the file that must be loaded
567
- """
568
- pass
569
-
570
- def save_config(self, filename):
571
- """Saves the current device configuration to file.
572
-
573
- Args:
574
- filename : path and filename of the file to which the current
575
- device configuration must be saved.
576
- """
577
- pass
578
-
579
- def update_sensors(self):
580
- """Called when sensors have been attached or detached to/from the device.
581
- The complete configuration including the new sensor-configuration
582
- is reloaded from the device.
583
-
584
- Note:
585
- It is advised to "refresh" the applications' local "variables"
586
- after the the complete configuration has been reloaded.
587
- """
588
- pass
@@ -1,34 +0,0 @@
1
- """
2
- (c) 2022 Twente Medical Systems International B.V., Oldenzaal The Netherlands
3
-
4
- Licensed under the Apache License, Version 2.0 (the "License");
5
- you may not use this file except in compliance with the License.
6
- You may obtain a copy of the License at
7
-
8
- http://www.apache.org/licenses/LICENSE-2.0
9
-
10
- Unless required by applicable law or agreed to in writing, software
11
- distributed under the License is distributed on an "AS IS" BASIS,
12
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- See the License for the specific language governing permissions and
14
- limitations under the License.
15
-
16
- ####### # # ##### #
17
- # ## ## #
18
- # # # # # # #
19
- # # # # ##### #
20
- # # # # #
21
- # # # # #
22
- # # # ##### #
23
-
24
- /**
25
- * @file ${__init__.py}
26
- * @brief Initialisation of the devices directory.
27
- *
28
- */
29
-
30
-
31
- """
32
-
33
- from . import saga
34
- from .saga import SagaDevice