shepherd-core 2024.4.1__py3-none-any.whl → 2024.5.1__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.
- shepherd_core/__init__.py +3 -3
- shepherd_core/calibration_hw_def.py +9 -1
- shepherd_core/commons.py +2 -0
- shepherd_core/data_models/__init__.py +11 -0
- shepherd_core/data_models/base/__init__.py +4 -1
- shepherd_core/data_models/base/cal_measurement.py +18 -6
- shepherd_core/data_models/base/calibration.py +39 -15
- shepherd_core/data_models/base/content.py +10 -2
- shepherd_core/data_models/base/shepherd.py +21 -12
- shepherd_core/data_models/base/timezone.py +5 -0
- shepherd_core/data_models/base/wrapper.py +3 -3
- shepherd_core/data_models/content/__init__.py +5 -4
- shepherd_core/data_models/content/_external_fixtures.yaml +410 -0
- shepherd_core/data_models/content/energy_environment.py +7 -5
- shepherd_core/data_models/content/energy_environment_fixture.yaml +53 -0
- shepherd_core/data_models/content/firmware.py +12 -5
- shepherd_core/data_models/content/firmware_datatype.py +7 -0
- shepherd_core/data_models/content/virtual_harvester.py +24 -19
- shepherd_core/data_models/content/virtual_harvester_fixture.yaml +160 -0
- shepherd_core/data_models/content/virtual_source.py +22 -10
- shepherd_core/data_models/content/virtual_source_fixture.yaml +230 -0
- shepherd_core/data_models/experiment/__init__.py +5 -4
- shepherd_core/data_models/experiment/experiment.py +7 -6
- shepherd_core/data_models/experiment/observer_features.py +14 -7
- shepherd_core/data_models/experiment/target_config.py +11 -7
- shepherd_core/data_models/readme.md +88 -0
- shepherd_core/data_models/task/__init__.py +10 -3
- shepherd_core/data_models/task/emulation.py +10 -7
- shepherd_core/data_models/task/firmware_mod.py +4 -2
- shepherd_core/data_models/task/harvest.py +5 -4
- shepherd_core/data_models/task/observer_tasks.py +3 -1
- shepherd_core/data_models/task/programming.py +3 -1
- shepherd_core/data_models/task/testbed_tasks.py +3 -1
- shepherd_core/data_models/testbed/__init__.py +5 -2
- shepherd_core/data_models/testbed/cape.py +7 -5
- shepherd_core/data_models/testbed/cape_fixture.yaml +94 -0
- shepherd_core/data_models/testbed/gpio.py +10 -8
- shepherd_core/data_models/testbed/gpio_fixture.yaml +166 -0
- shepherd_core/data_models/testbed/mcu.py +9 -9
- shepherd_core/data_models/testbed/mcu_fixture.yaml +19 -0
- shepherd_core/data_models/testbed/observer.py +9 -4
- shepherd_core/data_models/testbed/observer_fixture.yaml +221 -0
- shepherd_core/data_models/testbed/target.py +4 -2
- shepherd_core/data_models/testbed/target_fixture.yaml +137 -0
- shepherd_core/data_models/testbed/testbed.py +5 -2
- shepherd_core/data_models/testbed/testbed_fixture.yaml +25 -0
- shepherd_core/decoder_waveform/__init__.py +2 -0
- shepherd_core/decoder_waveform/uart.py +43 -25
- shepherd_core/fw_tools/__init__.py +2 -0
- shepherd_core/fw_tools/converter.py +20 -9
- shepherd_core/fw_tools/converter_elf.py +3 -0
- shepherd_core/fw_tools/patcher.py +17 -5
- shepherd_core/fw_tools/validation.py +27 -6
- shepherd_core/inventory/__init__.py +15 -5
- shepherd_core/inventory/python.py +4 -0
- shepherd_core/inventory/system.py +6 -2
- shepherd_core/inventory/target.py +4 -0
- shepherd_core/logger.py +5 -0
- shepherd_core/reader.py +38 -23
- shepherd_core/testbed_client/__init__.py +2 -0
- shepherd_core/testbed_client/cache_path.py +2 -0
- shepherd_core/testbed_client/client.py +15 -8
- shepherd_core/testbed_client/fixtures.py +27 -11
- shepherd_core/testbed_client/user_model.py +8 -3
- shepherd_core/vsource/__init__.py +2 -0
- shepherd_core/vsource/virtual_converter_model.py +10 -3
- shepherd_core/vsource/virtual_harvester_model.py +7 -1
- shepherd_core/vsource/virtual_source_model.py +9 -5
- shepherd_core/writer.py +26 -21
- {shepherd_core-2024.4.1.dist-info → shepherd_core-2024.5.1.dist-info}/METADATA +2 -1
- shepherd_core-2024.5.1.dist-info/RECORD +75 -0
- shepherd_core-2024.4.1.dist-info/RECORD +0 -64
- /shepherd_core/data_models/{doc_virtual_source.py → virtual_source_doc.txt} +0 -0
- {shepherd_core-2024.4.1.dist-info → shepherd_core-2024.5.1.dist-info}/WHEEL +0 -0
- {shepherd_core-2024.4.1.dist-info → shepherd_core-2024.5.1.dist-info}/top_level.txt +0 -0
- {shepherd_core-2024.4.1.dist-info → shepherd_core-2024.5.1.dist-info}/zip-safe +0 -0
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
"""Current implementation of a file-based database."""
|
|
2
|
+
|
|
1
3
|
import copy
|
|
2
4
|
import os
|
|
3
5
|
import pickle
|
|
@@ -29,7 +31,7 @@ from .cache_path import cache_user_path
|
|
|
29
31
|
|
|
30
32
|
|
|
31
33
|
class Fixture:
|
|
32
|
-
"""Current implementation of a file-based database"""
|
|
34
|
+
"""Current implementation of a file-based database."""
|
|
33
35
|
|
|
34
36
|
def __init__(self, model_type: str) -> None:
|
|
35
37
|
self.model_type: str = model_type.lower()
|
|
@@ -63,7 +65,8 @@ class Fixture:
|
|
|
63
65
|
key = int(key) if key.isdigit() else None
|
|
64
66
|
if key in self.elements_by_id:
|
|
65
67
|
return self.elements_by_id[int(key)]
|
|
66
|
-
|
|
68
|
+
msg = f"{self.model_type} '{key}' not found!"
|
|
69
|
+
raise ValueError(msg)
|
|
67
70
|
|
|
68
71
|
def __iter__(self) -> Self:
|
|
69
72
|
self._iter_index = 0
|
|
@@ -95,12 +98,14 @@ class Fixture:
|
|
|
95
98
|
if "name" in values and len(chain) < 1:
|
|
96
99
|
base_name = values.get("name")
|
|
97
100
|
if base_name in chain:
|
|
101
|
+
msg = f"Inheritance-Circle detected ({base_name} already in {chain})"
|
|
98
102
|
raise ValueError(
|
|
99
|
-
|
|
103
|
+
msg,
|
|
100
104
|
)
|
|
101
105
|
if base_name == fixture_name:
|
|
106
|
+
msg = f"Inheritance-Circle detected ({base_name} == {fixture_name})"
|
|
102
107
|
raise ValueError(
|
|
103
|
-
|
|
108
|
+
msg,
|
|
104
109
|
)
|
|
105
110
|
chain.append(base_name)
|
|
106
111
|
fixture_base = copy.copy(self[fixture_name])
|
|
@@ -149,15 +154,18 @@ class Fixture:
|
|
|
149
154
|
def query_id(self, _id: int) -> dict:
|
|
150
155
|
if isinstance(_id, int) and _id in self.elements_by_id:
|
|
151
156
|
return self.elements_by_id[_id]
|
|
152
|
-
|
|
157
|
+
msg = f"Initialization of {self.model_type} by ID failed - {_id} is unknown!"
|
|
158
|
+
raise ValueError(msg)
|
|
153
159
|
|
|
154
160
|
def query_name(self, name: str) -> dict:
|
|
155
161
|
if isinstance(name, str) and name.lower() in self.elements_by_name:
|
|
156
162
|
return self.elements_by_name[name.lower()]
|
|
157
|
-
|
|
163
|
+
msg = f"Initialization of {self.model_type} by name failed - {name} is unknown!"
|
|
164
|
+
raise ValueError(msg)
|
|
158
165
|
|
|
159
166
|
|
|
160
167
|
def file_older_than(file: Path, delta: timedelta) -> bool:
|
|
168
|
+
"""Decide if file is older than a specific duration of time."""
|
|
161
169
|
cutoff = local_now() - delta
|
|
162
170
|
mtime = datetime.fromtimestamp(file.stat().st_mtime, tz=local_tz())
|
|
163
171
|
if mtime < cutoff:
|
|
@@ -166,6 +174,8 @@ def file_older_than(file: Path, delta: timedelta) -> bool:
|
|
|
166
174
|
|
|
167
175
|
|
|
168
176
|
class Fixtures:
|
|
177
|
+
"""A collection of individual fixture-elements."""
|
|
178
|
+
|
|
169
179
|
suffix = ".yaml"
|
|
170
180
|
|
|
171
181
|
@validate_call
|
|
@@ -194,9 +204,12 @@ class Fixtures:
|
|
|
194
204
|
for file in files:
|
|
195
205
|
self.insert_file(file)
|
|
196
206
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
207
|
+
if len(self.components) < 1:
|
|
208
|
+
logger.error(f"No fixture-components found at {self.file_path.as_posix()}")
|
|
209
|
+
else:
|
|
210
|
+
save_path.parent.mkdir(parents=True, exist_ok=True)
|
|
211
|
+
with save_path.open("wb", buffering=-1) as fd:
|
|
212
|
+
pickle.dump(self.components, fd)
|
|
200
213
|
|
|
201
214
|
@validate_call
|
|
202
215
|
def insert_file(self, file: Path) -> None:
|
|
@@ -218,17 +231,20 @@ class Fixtures:
|
|
|
218
231
|
key = key.lower()
|
|
219
232
|
if key in self.components:
|
|
220
233
|
return self.components[key]
|
|
221
|
-
|
|
234
|
+
msg = f"Component '{key}' not found!"
|
|
235
|
+
raise ValueError(msg)
|
|
222
236
|
|
|
223
237
|
def keys(self): # noqa: ANN201
|
|
224
238
|
return self.components.keys()
|
|
225
239
|
|
|
226
240
|
@staticmethod
|
|
227
241
|
def to_file(file: Path) -> None:
|
|
228
|
-
|
|
242
|
+
msg = f"TODO (val={file})"
|
|
243
|
+
raise NotImplementedError(msg)
|
|
229
244
|
|
|
230
245
|
|
|
231
246
|
def get_files(start_path: Path, suffix: str, recursion_depth: int = 0) -> List[Path]:
|
|
247
|
+
"""Generate a recursive list of all files in a directory."""
|
|
232
248
|
if recursion_depth == 0:
|
|
233
249
|
suffix = suffix.lower().split(".")[-1]
|
|
234
250
|
dir_items = os.scandir(start_path)
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
"""Model for user-management."""
|
|
2
|
+
|
|
1
3
|
import secrets
|
|
2
4
|
from hashlib import pbkdf2_hmac
|
|
3
5
|
from typing import Optional
|
|
@@ -21,8 +23,11 @@ from ..data_models.base.shepherd import ShpModel
|
|
|
21
23
|
|
|
22
24
|
@validate_call
|
|
23
25
|
def hash_password(pw: Annotated[str, StringConstraints(min_length=20, max_length=100)]) -> bytes:
|
|
24
|
-
|
|
26
|
+
"""Generate a hash of a string.
|
|
27
|
+
|
|
25
28
|
# NOTE: 1M Iterations need 25s on beaglebone
|
|
29
|
+
# TODO: add salt of testbed -> this fn should be part of Testbed-Object
|
|
30
|
+
"""
|
|
26
31
|
return pbkdf2_hmac(
|
|
27
32
|
"sha512",
|
|
28
33
|
password=pw.encode("utf-8"),
|
|
@@ -33,9 +38,9 @@ def hash_password(pw: Annotated[str, StringConstraints(min_length=20, max_length
|
|
|
33
38
|
|
|
34
39
|
|
|
35
40
|
class User(ShpModel):
|
|
36
|
-
"""meta-data representation of a testbed-component (physical object)"""
|
|
41
|
+
"""meta-data representation of a testbed-component (physical object)."""
|
|
37
42
|
|
|
38
|
-
# id: UUID4 = Field( # TODO db-migration - temp fix for documentation
|
|
43
|
+
# id: UUID4 = Field( # TODO: db-migration - temp fix for documentation
|
|
39
44
|
id: Union[UUID4, int] = Field(
|
|
40
45
|
description="Unique ID",
|
|
41
46
|
default_factory=uuid4,
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
"""
|
|
1
|
+
"""This is ported py-version of the pru-code.
|
|
2
|
+
|
|
3
|
+
Goals:
|
|
4
|
+
|
|
2
5
|
- stay close to original code-base
|
|
3
6
|
- offer a comparison for the tests
|
|
4
7
|
- step 1 to a virtualization of emulation
|
|
@@ -6,6 +9,7 @@
|
|
|
6
9
|
NOTE: DO NOT OPTIMIZE -> stay close to original code-base
|
|
7
10
|
|
|
8
11
|
Compromises:
|
|
12
|
+
|
|
9
13
|
- bitshifted values (i.e. _n28) are converted to float without shift
|
|
10
14
|
|
|
11
15
|
"""
|
|
@@ -19,7 +23,7 @@ from ..data_models.content.virtual_source import ConverterPRUConfig
|
|
|
19
23
|
|
|
20
24
|
|
|
21
25
|
class PruCalibration:
|
|
22
|
-
"""part of calibration.h"""
|
|
26
|
+
"""part of calibration.h."""
|
|
23
27
|
|
|
24
28
|
def __init__(self, cal_emu: Optional[CalibrationEmulator] = None) -> None:
|
|
25
29
|
self.cal = cal_emu if cal_emu else CalibrationEmulator()
|
|
@@ -30,7 +34,8 @@ class PruCalibration:
|
|
|
30
34
|
|
|
31
35
|
@staticmethod
|
|
32
36
|
def conv_adc_raw_to_uV(voltage_raw: int) -> float:
|
|
33
|
-
|
|
37
|
+
msg = f"This Fn should not been used (val={voltage_raw})"
|
|
38
|
+
raise RuntimeError(msg)
|
|
34
39
|
|
|
35
40
|
def conv_uV_to_dac_raw(self, voltage_uV: float) -> int:
|
|
36
41
|
dac_raw = self.cal.dac_V_A.si_to_raw(float(voltage_uV) / (10**6))
|
|
@@ -40,6 +45,8 @@ class PruCalibration:
|
|
|
40
45
|
|
|
41
46
|
|
|
42
47
|
class VirtualConverterModel:
|
|
48
|
+
"""Ported python version of the pru vCnv."""
|
|
49
|
+
|
|
43
50
|
def __init__(self, cfg: ConverterPRUConfig, cal: PruCalibration) -> None:
|
|
44
51
|
self._cal: PruCalibration = cal
|
|
45
52
|
self._cfg: ConverterPRUConfig = cfg
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
"""this is ported py-version of the pru-code
|
|
1
|
+
"""this is ported py-version of the pru-code.
|
|
2
|
+
|
|
3
|
+
Goals:
|
|
4
|
+
|
|
2
5
|
- stay close to original code-base
|
|
3
6
|
- offer a comparison for the tests
|
|
4
7
|
- step 1 to a virtualization of emulation
|
|
@@ -7,6 +10,7 @@ NOTE1: DO NOT OPTIMIZE -> stay close to original c-code-base
|
|
|
7
10
|
NOTE2: adc-harvest-routines are not part of this model (virtual_harvester lines 66:289)
|
|
8
11
|
|
|
9
12
|
Compromises:
|
|
13
|
+
|
|
10
14
|
- Py has to map the settings-list to internal vars -> is kernel-task
|
|
11
15
|
- Python has no static vars -> FName_reset is handling the class-vars
|
|
12
16
|
|
|
@@ -18,6 +22,8 @@ from ..data_models.content.virtual_harvester import HarvesterPRUConfig
|
|
|
18
22
|
|
|
19
23
|
|
|
20
24
|
class VirtualHarvesterModel:
|
|
25
|
+
"""Ported python version of the pru vHrv."""
|
|
26
|
+
|
|
21
27
|
HRV_IVCURVE: int = 2**4
|
|
22
28
|
HRV_CV: int = 2**8
|
|
23
29
|
HRV_MPPT_VOC: int = 2**12
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
"""
|
|
1
|
+
"""This is ported py-version of the pru-code.
|
|
2
|
+
|
|
3
|
+
Goals:
|
|
4
|
+
|
|
2
5
|
- stay close to original code-base
|
|
3
6
|
- offer a comparison for the tests
|
|
4
|
-
- step 1 to a virtualization of emulation
|
|
7
|
+
- step 1 to a virtualization of emulation.
|
|
5
8
|
|
|
6
9
|
NOTE: DO NOT OPTIMIZE -> stay close to original code-base
|
|
7
10
|
|
|
@@ -20,7 +23,7 @@ from .virtual_harvester_model import VirtualHarvesterModel
|
|
|
20
23
|
|
|
21
24
|
|
|
22
25
|
class VirtualSourceModel:
|
|
23
|
-
"""part of sampling.c"""
|
|
26
|
+
"""part of sampling.c."""
|
|
24
27
|
|
|
25
28
|
def __init__(
|
|
26
29
|
self,
|
|
@@ -53,8 +56,9 @@ class VirtualSourceModel:
|
|
|
53
56
|
self.W_out_fWs: float = 0.0
|
|
54
57
|
|
|
55
58
|
def iterate_sampling(self, V_inp_uV: int = 0, I_inp_nA: int = 0, I_out_nA: int = 0) -> int:
|
|
56
|
-
"""TEST-SIMPLIFICATION - code below is not part of pru-code
|
|
57
|
-
|
|
59
|
+
"""TEST-SIMPLIFICATION - code below is not part of pru-code.
|
|
60
|
+
|
|
61
|
+
It originates from sample_emulator() in sampling.c.
|
|
58
62
|
|
|
59
63
|
:param V_inp_uV:
|
|
60
64
|
:param I_inp_nA:
|
shepherd_core/writer.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""Writer that inherits from Reader-Baseclass"""
|
|
1
|
+
"""Writer that inherits from Reader-Baseclass."""
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
4
|
import math
|
|
@@ -35,10 +35,12 @@ from .reader import Reader
|
|
|
35
35
|
def path2str(
|
|
36
36
|
dumper: Dumper, data: Union[pathlib.Path, pathlib.WindowsPath, pathlib.PosixPath]
|
|
37
37
|
) -> ScalarNode:
|
|
38
|
+
"""Add a yaml-representation for a specific datatype."""
|
|
38
39
|
return dumper.represent_scalar("tag:yaml.org,2002:str", str(data.as_posix()))
|
|
39
40
|
|
|
40
41
|
|
|
41
42
|
def time2int(dumper: Dumper, data: timedelta) -> ScalarNode:
|
|
43
|
+
"""Add a yaml-representation for a specific datatype."""
|
|
42
44
|
return dumper.represent_scalar("tag:yaml.org,2002:int", str(int(data.total_seconds())))
|
|
43
45
|
|
|
44
46
|
|
|
@@ -49,7 +51,7 @@ yaml.add_representer(timedelta, time2int, SafeDumper)
|
|
|
49
51
|
|
|
50
52
|
|
|
51
53
|
def unique_path(base_path: Union[str, Path], suffix: str) -> Path:
|
|
52
|
-
"""
|
|
54
|
+
"""Find an unused filename in case it already exists.
|
|
53
55
|
|
|
54
56
|
:param base_path: file-path to test
|
|
55
57
|
:param suffix: file-suffix
|
|
@@ -64,7 +66,7 @@ def unique_path(base_path: Union[str, Path], suffix: str) -> Path:
|
|
|
64
66
|
|
|
65
67
|
|
|
66
68
|
class Writer(Reader):
|
|
67
|
-
"""Stores data for Shepherd in HDF5 format
|
|
69
|
+
"""Stores data for Shepherd in HDF5 format.
|
|
68
70
|
|
|
69
71
|
Choose lossless compression filter
|
|
70
72
|
- lzf: low to moderate compression, VERY fast, no options
|
|
@@ -124,7 +126,8 @@ class Writer(Reader):
|
|
|
124
126
|
self.file_path: Path = file_path.resolve()
|
|
125
127
|
self._logger.info("Storing data to '%s'", self.file_path)
|
|
126
128
|
elif file_path.exists() and not file_path.is_file():
|
|
127
|
-
|
|
129
|
+
msg = f"Path is not a file ({file_path})"
|
|
130
|
+
raise TypeError(msg)
|
|
128
131
|
else:
|
|
129
132
|
base_dir = file_path.resolve().parents[0]
|
|
130
133
|
self.file_path = unique_path(base_dir / file_path.stem, file_path.suffix)
|
|
@@ -135,15 +138,15 @@ class Writer(Reader):
|
|
|
135
138
|
)
|
|
136
139
|
|
|
137
140
|
if isinstance(mode, str) and mode not in self.mode_dtype_dict:
|
|
138
|
-
|
|
141
|
+
msg = f"Can't handle mode '{mode}' (choose one of {self.mode_dtype_dict})"
|
|
142
|
+
raise ValueError(msg)
|
|
139
143
|
|
|
140
|
-
_dtypes = self.mode_dtype_dict[mode
|
|
144
|
+
_dtypes = self.mode_dtype_dict[mode or self.mode_default]
|
|
141
145
|
if isinstance(datatype, str):
|
|
142
146
|
datatype = EnergyDType[datatype]
|
|
143
147
|
if isinstance(datatype, EnergyDType) and datatype not in _dtypes:
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
)
|
|
148
|
+
msg = f"Can't handle value '{datatype}' of datatype (choose one of {_dtypes})"
|
|
149
|
+
raise ValueError(msg)
|
|
147
150
|
|
|
148
151
|
if self._modify:
|
|
149
152
|
self._mode = mode
|
|
@@ -223,10 +226,10 @@ class Writer(Reader):
|
|
|
223
226
|
self.h5file.close()
|
|
224
227
|
|
|
225
228
|
def _create_skeleton(self) -> None:
|
|
226
|
-
"""
|
|
229
|
+
"""Initialize the structure of the HDF5 file.
|
|
227
230
|
|
|
228
231
|
HDF5 is hierarchically structured and before writing data, we have to
|
|
229
|
-
|
|
232
|
+
set up this structure, i.e. creating the right groups with corresponding
|
|
230
233
|
data types. We will store 3 types of data in a database: The
|
|
231
234
|
actual IV samples recorded either from the harvester (during recording)
|
|
232
235
|
or the target (during emulation). Any log messages, that can be used to
|
|
@@ -279,7 +282,7 @@ class Writer(Reader):
|
|
|
279
282
|
voltage: np.ndarray,
|
|
280
283
|
current: np.ndarray,
|
|
281
284
|
) -> None:
|
|
282
|
-
"""
|
|
285
|
+
"""Write raw data to database.
|
|
283
286
|
|
|
284
287
|
Args:
|
|
285
288
|
----
|
|
@@ -298,7 +301,7 @@ class Writer(Reader):
|
|
|
298
301
|
if isinstance(timestamp, np.ndarray):
|
|
299
302
|
len_new = min(len_new, timestamp.size)
|
|
300
303
|
else:
|
|
301
|
-
raise
|
|
304
|
+
raise TypeError("timestamp-data was not usable")
|
|
302
305
|
|
|
303
306
|
len_old = self.ds_voltage.shape[0]
|
|
304
307
|
|
|
@@ -318,7 +321,9 @@ class Writer(Reader):
|
|
|
318
321
|
voltage: np.ndarray,
|
|
319
322
|
current: np.ndarray,
|
|
320
323
|
) -> None:
|
|
321
|
-
"""
|
|
324
|
+
"""Write data (provided in SI / physical unit) to file.
|
|
325
|
+
|
|
326
|
+
This will convert it to raw-data first.
|
|
322
327
|
|
|
323
328
|
SI-value [SI-Unit] = raw-value * gain + offset,
|
|
324
329
|
|
|
@@ -336,7 +341,7 @@ class Writer(Reader):
|
|
|
336
341
|
self.append_iv_data_raw(timestamp, voltage, current)
|
|
337
342
|
|
|
338
343
|
def _align(self) -> None:
|
|
339
|
-
"""Align datasets with buffer-size of shepherd"""
|
|
344
|
+
"""Align datasets with buffer-size of shepherd."""
|
|
340
345
|
self._refresh_file_stats()
|
|
341
346
|
n_buff = self.ds_voltage.size / self.samples_per_buffer
|
|
342
347
|
size_new = int(math.floor(n_buff) * self.samples_per_buffer)
|
|
@@ -353,21 +358,21 @@ class Writer(Reader):
|
|
|
353
358
|
self.ds_current.resize((size_new,))
|
|
354
359
|
|
|
355
360
|
def __setitem__(self, key: str, item: Any) -> None:
|
|
356
|
-
"""
|
|
361
|
+
"""Conveniently store relevant key-value data (attribute) in H5-structure."""
|
|
357
362
|
self.h5file.attrs.__setitem__(key, item)
|
|
358
363
|
|
|
359
364
|
def store_config(self, data: dict) -> None:
|
|
360
|
-
"""
|
|
365
|
+
"""Get a better self-describing Output-File.
|
|
366
|
+
|
|
361
367
|
TODO: use data-model?
|
|
362
|
-
:param data: from virtual harvester or converter / source
|
|
368
|
+
:param data: from virtual harvester or converter / source.
|
|
363
369
|
"""
|
|
364
|
-
self.h5file
|
|
370
|
+
self.h5file.attrs["config"] = yaml.safe_dump(
|
|
365
371
|
data, default_flow_style=False, sort_keys=False
|
|
366
372
|
)
|
|
367
373
|
|
|
368
374
|
def store_hostname(self, name: str) -> None:
|
|
369
|
-
"""Option to distinguish the host, target or data-source
|
|
370
|
-
-> perfect for plotting later
|
|
375
|
+
"""Option to distinguish the host, target or data-source -> perfect for plotting later.
|
|
371
376
|
|
|
372
377
|
:param name: something unique, or "artificial" in case of generated content
|
|
373
378
|
"""
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: shepherd_core
|
|
3
|
-
Version: 2024.
|
|
3
|
+
Version: 2024.5.1
|
|
4
4
|
Summary: Programming- and CLI-Interface for the h5-dataformat of the Shepherd-Testbed
|
|
5
5
|
Author-email: Ingmar Splitt <ingmar.splitt@tu-dresden.de>
|
|
6
6
|
Maintainer-email: Ingmar Splitt <ingmar.splitt@tu-dresden.de>
|
|
@@ -39,6 +39,7 @@ Requires-Dist: intelhex
|
|
|
39
39
|
Requires-Dist: requests
|
|
40
40
|
Requires-Dist: pyelftools
|
|
41
41
|
Requires-Dist: zstandard
|
|
42
|
+
Requires-Dist: typing-extensions
|
|
42
43
|
Provides-Extra: dev
|
|
43
44
|
Requires-Dist: twine ; extra == 'dev'
|
|
44
45
|
Requires-Dist: pre-commit ; extra == 'dev'
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
shepherd_core/__init__.py,sha256=4NA3rBcPFRofOC838u_oynZbUA60WoPANSpON--HiMM,1385
|
|
2
|
+
shepherd_core/calibration_hw_def.py,sha256=m5HDxHJ_blnn-C0Og5v6by1ApJRDT7RhytFbL-P5730,2548
|
|
3
|
+
shepherd_core/commons.py,sha256=vymKXWcy_1bz7ChzzEATUkJ4p3czCzjIdsSehVjJOY8,218
|
|
4
|
+
shepherd_core/logger.py,sha256=4Q4hTI-nccOZ1_A68fo4UEctfu3pJx3IeHfa9VuDDEo,1804
|
|
5
|
+
shepherd_core/reader.py,sha256=qyc0MBHa-wMGRDglEaMtyB6OxCiODnOMJsxJH8NCcAo,26245
|
|
6
|
+
shepherd_core/writer.py,sha256=xcLCw-YokKaN8TrkwD0IjRmn8xZU0Q8wwWp_1K8JFVY,14475
|
|
7
|
+
shepherd_core/data_models/__init__.py,sha256=IVjKbT2Ilz5bev325EvAuuhd9LfQgQ1u7qKo6dhVA2k,1866
|
|
8
|
+
shepherd_core/data_models/readme.md,sha256=1bdfEypY_0NMhXLxOPRnLAsFca0HuHdq7_01yEWxvUs,2470
|
|
9
|
+
shepherd_core/data_models/virtual_source_doc.txt,sha256=KizMcfGKj7BnHIbaJHT7KeTF01SV__UXv01qV_DGHSs,6057
|
|
10
|
+
shepherd_core/data_models/base/__init__.py,sha256=PSJ6acWViqBm0Eiom8DIgKfFVrp5lzYr8OsDvP79vwI,94
|
|
11
|
+
shepherd_core/data_models/base/cal_measurement.py,sha256=Ie35wWfH4spjETQ6SKHlbY_Ie2Bkt0dIQAKAn4ELOTc,3354
|
|
12
|
+
shepherd_core/data_models/base/calibration.py,sha256=HPhDEaApOCKxfX2q9RD8YCvA3Gqls-2bHqvLLvOM7kY,10415
|
|
13
|
+
shepherd_core/data_models/base/content.py,sha256=13j7GSgT73xn27jgDP508thUEJR4U-nCb5n7CJ50c9Y,2463
|
|
14
|
+
shepherd_core/data_models/base/shepherd.py,sha256=DNrx59o1VBuy_liJuUzZRzmTTYB73D_pUWiNyMQyjYY,6112
|
|
15
|
+
shepherd_core/data_models/base/timezone.py,sha256=2T6E46hJ1DAvmqKfu6uIgCK3RSoAKjGXRyzYNaqKyjY,665
|
|
16
|
+
shepherd_core/data_models/base/wrapper.py,sha256=duOdIXJeSOab4lVhe9ujhnjhJv3ue0mhimuUjy1xy3A,635
|
|
17
|
+
shepherd_core/data_models/content/__init__.py,sha256=wVa5lw6bS-fBgeo-SWydg6rw8AsScxqNgDo81dzteaE,537
|
|
18
|
+
shepherd_core/data_models/content/_external_fixtures.yaml,sha256=0CH7YSWT_hzL-jcg4JjgN9ryQOzbS8S66_pd6GbMnHw,12259
|
|
19
|
+
shepherd_core/data_models/content/energy_environment.py,sha256=HeMcM01fS2YzhvIh5bt6lC9vW2sBrPt7X_jGdEe8k_g,1374
|
|
20
|
+
shepherd_core/data_models/content/energy_environment_fixture.yaml,sha256=UBXTdGT7MK98zx5w_RBCu-f9uNCKxRgiFBQFbmDUxPc,1301
|
|
21
|
+
shepherd_core/data_models/content/firmware.py,sha256=rv5gAOYq4Al-sAg3v5TuYrxONMKLngBsdln3hbmISTA,5659
|
|
22
|
+
shepherd_core/data_models/content/firmware_datatype.py,sha256=XPU9LOoT3h5qFOlE8WU0vAkw-vymNxzor9kVFyEqsWg,255
|
|
23
|
+
shepherd_core/data_models/content/virtual_harvester.py,sha256=5eEHAZrgHPHZlTxDGaJrckDQgupFNC3Zax67EcCSqR8,9448
|
|
24
|
+
shepherd_core/data_models/content/virtual_harvester_fixture.yaml,sha256=-IRyoQU0HXCEtIIcFmkFdz4snLB7bjFFqNcFVGSMiSA,4332
|
|
25
|
+
shepherd_core/data_models/content/virtual_source.py,sha256=aoD8oam1POid0JG2ppttPA_Jl3y4ko5FNqzoaNKyBD8,14142
|
|
26
|
+
shepherd_core/data_models/content/virtual_source_fixture.yaml,sha256=kx_lpBx0bLKqEHxS09GTnk8kuSbhuGhLgKHeaM6UviE,10481
|
|
27
|
+
shepherd_core/data_models/experiment/__init__.py,sha256=9TE9_aSnCNRhagsIWLTE8XkyjyMGB7kEGdswl-296v0,645
|
|
28
|
+
shepherd_core/data_models/experiment/experiment.py,sha256=QX3-oeBe5dRx1a_RHF6kxjdQAyCRcLiMmSw4gYDjbEg,3949
|
|
29
|
+
shepherd_core/data_models/experiment/observer_features.py,sha256=qxnb7anuQz9ZW5IUlPdUXYPIl5U7O9uXkJqZtMnAb0Y,5156
|
|
30
|
+
shepherd_core/data_models/experiment/target_config.py,sha256=XIsjbbo7yn_A4q3GMxWbiNzEGA0Kk5gH7-XfQQ7Kg0E,3674
|
|
31
|
+
shepherd_core/data_models/task/__init__.py,sha256=rZLbgqX-dTWY4026-bqW-IWVHbA6C_xP9y0aeRze8FY,3374
|
|
32
|
+
shepherd_core/data_models/task/emulation.py,sha256=z3BEqERy2m3_rxqKo6w89sSnBQhFwHDEdCgwJh2XUOQ,6376
|
|
33
|
+
shepherd_core/data_models/task/firmware_mod.py,sha256=Rw_TA1ykQ7abUd_U0snqZlpZyrS8Nx6f4BEax1Xnji0,2818
|
|
34
|
+
shepherd_core/data_models/task/harvest.py,sha256=HHnqWwRsJupaZJxuohs7NrK6VaDyoRzGOaG2h9y3s1Y,3360
|
|
35
|
+
shepherd_core/data_models/task/observer_tasks.py,sha256=XlH_-EGRrdodTn0c2pjGvpcauc0a9NOnLhysKw8iRwk,3511
|
|
36
|
+
shepherd_core/data_models/task/programming.py,sha256=6Pmyeze2UxNyyDUACbIL18GzUCN9wn6PuGrYwA2h8VI,2305
|
|
37
|
+
shepherd_core/data_models/task/testbed_tasks.py,sha256=yU4YhNN1ObYkcts7UOwkWWhCmW67f_Gjx3dhvzMnKWI,2036
|
|
38
|
+
shepherd_core/data_models/testbed/__init__.py,sha256=cL3swgijyIpZIW1vl51OVR2seAlWt6Ke9oB_cBkPniU,612
|
|
39
|
+
shepherd_core/data_models/testbed/cape.py,sha256=D23ZKXpZRPIIOMn6LCoJrwHiRbSaYg-y7B6fAt1ap64,1246
|
|
40
|
+
shepherd_core/data_models/testbed/cape_fixture.yaml,sha256=uwZxe6hsqvofn5tzg4sffjbVtTVUkextL1GCri_z2A4,2197
|
|
41
|
+
shepherd_core/data_models/testbed/gpio.py,sha256=m4U8-KotpZbdSkRkXm2GqoADiubr_1-3BWOT1qlgQic,2195
|
|
42
|
+
shepherd_core/data_models/testbed/gpio_fixture.yaml,sha256=yXvoXAau2hancKi2yg1xIkErPWQa6gIxNUG3y8JuF9Y,3076
|
|
43
|
+
shepherd_core/data_models/testbed/mcu.py,sha256=pUyT8gwPcqh18I7FC6iE6gYYISo69TvDfuq2zSwfmxs,1375
|
|
44
|
+
shepherd_core/data_models/testbed/mcu_fixture.yaml,sha256=lRZMLs27cTeERSFGkbMt5xgxbn11Gh9G1mQqOZK136I,522
|
|
45
|
+
shepherd_core/data_models/testbed/observer.py,sha256=AezYNm9mW5WCdxm5TXT-UQUwIhKDHchMIugsLGy1PMA,3225
|
|
46
|
+
shepherd_core/data_models/testbed/observer_fixture.yaml,sha256=w4VS6lTzaVs5IqWjkHanxcjDhIEydQPCV6z_DlsLFqA,4812
|
|
47
|
+
shepherd_core/data_models/testbed/target.py,sha256=KeJaLradQ3oHeeowCg_X0lDHDqyi3R3La0YPKC5Rv90,1838
|
|
48
|
+
shepherd_core/data_models/testbed/target_fixture.yaml,sha256=6YbCV3aTtDUKzC40kPURq9nFwTjT97LNy7imOb_35sk,3668
|
|
49
|
+
shepherd_core/data_models/testbed/testbed.py,sha256=jLgidZMB0LhoP99s_OOADFPZgCipio1q3kLLiXg9Ekw,3353
|
|
50
|
+
shepherd_core/data_models/testbed/testbed_fixture.yaml,sha256=9i2cmYRrHOHTJG9zp40h8h0LgO9DdrCJz8tyGdiQCzc,714
|
|
51
|
+
shepherd_core/decoder_waveform/__init__.py,sha256=-ohGz0fA2tKxUJk4FAQXKtI93d6YGdy0CrkdhOod1QU,120
|
|
52
|
+
shepherd_core/decoder_waveform/uart.py,sha256=sHsXHOsDU1j9zMSZO7CCMTMinT4U_S5NgsEkl1lJK1U,11029
|
|
53
|
+
shepherd_core/fw_tools/__init__.py,sha256=_RZpgHsNN1Zhd-x0-A9aJPI3pjULKhR9iuR9eKPa8zQ,2137
|
|
54
|
+
shepherd_core/fw_tools/converter.py,sha256=3igRT33tghrBCao5njuPmePS-Y_lSa6EUHvwCakMo2s,3539
|
|
55
|
+
shepherd_core/fw_tools/converter_elf.py,sha256=GQDVqIqMW4twNMvZIV3sowFMezhs2TN-IYREjRP7Xt4,1089
|
|
56
|
+
shepherd_core/fw_tools/patcher.py,sha256=D6MHaCvKRRVQYSZozODAp_l7UnqxVsvnulPzpkfXWW8,4108
|
|
57
|
+
shepherd_core/fw_tools/validation.py,sha256=gVyJrNZLSiX9T8vFxH2RfulefTZEvO9Z4t-KCKBxkNk,4790
|
|
58
|
+
shepherd_core/inventory/__init__.py,sha256=nRO11HG4eJ_FaXebSkE0dd1H6qvjrX5n3OQHOzKXVvk,3841
|
|
59
|
+
shepherd_core/inventory/python.py,sha256=OWNnyEt0IDPW9XGW-WloU0FExwgZzYNA05VpRj4cZGc,1250
|
|
60
|
+
shepherd_core/inventory/system.py,sha256=hmUuaeg6_6Xsykp47YAtTeUbDa5B8sxV0EICQJG9rx4,2304
|
|
61
|
+
shepherd_core/inventory/target.py,sha256=Lq11j25tWieXheOxIDaQb-lc-2omxYVex5P6uGiLUyk,507
|
|
62
|
+
shepherd_core/testbed_client/__init__.py,sha256=lzi7F5Go-AsbTbiUCf9Rnu6pzmTZqmpIqoS1yCPal_c,175
|
|
63
|
+
shepherd_core/testbed_client/cache_path.py,sha256=tS0er9on5fw8wddMCt1jkc2uyYOdSTvX_UmfmYJf6tY,445
|
|
64
|
+
shepherd_core/testbed_client/client.py,sha256=3vbJ9XdWe9YA28AXgzXThHJtYJU5RUUCpDRBH1mDIr8,5917
|
|
65
|
+
shepherd_core/testbed_client/fixtures.py,sha256=db10P0c6kJvG525mLZYuFE98kI0PvoA67jeJgCiUaZ4,9782
|
|
66
|
+
shepherd_core/testbed_client/user_model.py,sha256=5M3vWkAGBwdGDUYAanAjrZwpzMBlh3XLOVvNYWiLmms,2107
|
|
67
|
+
shepherd_core/vsource/__init__.py,sha256=dS33KYLq5GQ9_D8HfdP8iWSocWTghCi2ZZG2AJWNfaM,391
|
|
68
|
+
shepherd_core/vsource/virtual_converter_model.py,sha256=ZSoWVLfRmFEjeCNoQCg3BctzhdfayINUBDU_AJK1CR0,10404
|
|
69
|
+
shepherd_core/vsource/virtual_harvester_model.py,sha256=wCbFfsqDRC5Rfu8qANkmkP9XGJOPHJY9-iSnI850JI4,7817
|
|
70
|
+
shepherd_core/vsource/virtual_source_model.py,sha256=fjN8myTY3I_LpikF_aGAcxes3RGu1GP23P7XKC_UIyA,2737
|
|
71
|
+
shepherd_core-2024.5.1.dist-info/METADATA,sha256=b8rOT-zSwCa2jfHdDIj8VHx4_pHJ7Dq0NKXwP-77WWw,7651
|
|
72
|
+
shepherd_core-2024.5.1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
|
73
|
+
shepherd_core-2024.5.1.dist-info/top_level.txt,sha256=wy-t7HRBrKARZxa-Y8_j8d49oVHnulh-95K9ikxVhew,14
|
|
74
|
+
shepherd_core-2024.5.1.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
75
|
+
shepherd_core-2024.5.1.dist-info/RECORD,,
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
shepherd_core/__init__.py,sha256=UPDbfToRQ7BvvtGOE2ogINDK22SdlYdS3Z4TQp9JLUI,1358
|
|
2
|
-
shepherd_core/calibration_hw_def.py,sha256=VBPgekKtoA6xc5pLOADGdAIuJUNz5kdDf3pm3A13F0U,2158
|
|
3
|
-
shepherd_core/commons.py,sha256=8HLrOq30Zrgh0AcrtakJYyu3hwMgQks7mF7JyaBMcdw,170
|
|
4
|
-
shepherd_core/logger.py,sha256=mIJQ5eCpamsCnc_R7qoceYVXe8JM4-YZriqfzvTt9Yk,1656
|
|
5
|
-
shepherd_core/reader.py,sha256=NPpyMa0aArTyfz1vPHNbIzOGZQxkii96JUMX3jZ6_dY,26082
|
|
6
|
-
shepherd_core/writer.py,sha256=VeBqJZYw6M5CeswPaYWWeAjtQ2xH9ROqA6ziEBK-Npg,14355
|
|
7
|
-
shepherd_core/data_models/__init__.py,sha256=mem0m4nZY3EgG1ctBdGGGt128lhmglF9a4e5w9OGJu0,1651
|
|
8
|
-
shepherd_core/data_models/doc_virtual_source.py,sha256=KizMcfGKj7BnHIbaJHT7KeTF01SV__UXv01qV_DGHSs,6057
|
|
9
|
-
shepherd_core/data_models/base/__init__.py,sha256=ugVEWXfYRCmK4o94RG4N_GKR7AbBQLfn5PCbEKVpZMU,44
|
|
10
|
-
shepherd_core/data_models/base/cal_measurement.py,sha256=ZlSnHXOiY--AzQ1-g0BnU7I4g9sMDqF3g52jsl5IHDY,2873
|
|
11
|
-
shepherd_core/data_models/base/calibration.py,sha256=QTUGpW_YZ4slvfzUwkImp67u13gX90r5ua_qgbVPRXw,9711
|
|
12
|
-
shepherd_core/data_models/base/content.py,sha256=oCefaykxq9HnuRe-6ruk_hC96WECZldriBFeX-PBb8M,2254
|
|
13
|
-
shepherd_core/data_models/base/shepherd.py,sha256=kasSaMZ2baq160WNJMwEhdko2x13fsWYtE5VfHhg8Fs,5822
|
|
14
|
-
shepherd_core/data_models/base/timezone.py,sha256=OBzPPfrD__z1aTO7qlVWD1uD8eZFJ6CoDLac_mTrYCg,443
|
|
15
|
-
shepherd_core/data_models/base/wrapper.py,sha256=mzAMdX9-BeSAeTzlWKFnjj3v2wV6NJgaSHULFHEiWes,600
|
|
16
|
-
shepherd_core/data_models/content/__init__.py,sha256=JLj2zzjDeyqLrz9KiWDMW1shCeJjj676zjcXj8ly10Y,545
|
|
17
|
-
shepherd_core/data_models/content/energy_environment.py,sha256=bH6jB93e_XAAZ_NixNPlF2syEKzRtpMbImA7aD3lyTo,1342
|
|
18
|
-
shepherd_core/data_models/content/firmware.py,sha256=cuh8tURI39ZzTF-wuh4ofsNfRC1TK8lHrGKYm-o9SC0,5533
|
|
19
|
-
shepherd_core/data_models/content/firmware_datatype.py,sha256=WHVJu-LIP_snjeITIKkuZo7aIapoTIZeFXkUNqyEqy8,154
|
|
20
|
-
shepherd_core/data_models/content/virtual_harvester.py,sha256=M23YRfmXPkW145GNFoMHJvsVvJE8wUc_sNOU3OBXZtc,9268
|
|
21
|
-
shepherd_core/data_models/content/virtual_source.py,sha256=rBjfX1a22x_JF4MiQiEpaaWz2LVoHplMSrkHQnqHjDQ,13958
|
|
22
|
-
shepherd_core/data_models/experiment/__init__.py,sha256=DX9kylCe8zFm4PpVT8YS4csip7-MDoSrdah3nhBdiJE,651
|
|
23
|
-
shepherd_core/data_models/experiment/experiment.py,sha256=-qsmogEgHbijxrSfV0mLWj8biOMmDU1sEssZHo97HNI,3912
|
|
24
|
-
shepherd_core/data_models/experiment/observer_features.py,sha256=80z_U3fVFagROtMlWy2vZdbLn1-G8fZm9k8rZlyo4Lo,4997
|
|
25
|
-
shepherd_core/data_models/experiment/target_config.py,sha256=IBWxf3yVF5dUBi7mS5mJXfN1rL2S7QYhu_4IL6u6Yig,3532
|
|
26
|
-
shepherd_core/data_models/task/__init__.py,sha256=g0l4dtIgTPKhfFvnClJrCm3zLFiZpBVbbQ2f4gzdwK0,3180
|
|
27
|
-
shepherd_core/data_models/task/emulation.py,sha256=HE7L3GWKdsAkUPgvdDHxYJG92GNodP9CUEtKgQJghjA,6221
|
|
28
|
-
shepherd_core/data_models/task/firmware_mod.py,sha256=8uXMFVk3Z96gUW0gVY95VeUx-YtZnMc2yw3paC5S5Mw,2730
|
|
29
|
-
shepherd_core/data_models/task/harvest.py,sha256=QcNJjgixiq70NogdcYXwpj91_6Jl7s7CaAnEw_xEWck,3254
|
|
30
|
-
shepherd_core/data_models/task/observer_tasks.py,sha256=_fgG_xqPHQN34jdWxXVvtgJuY_05YiLGPftTGtglTfk,3437
|
|
31
|
-
shepherd_core/data_models/task/programming.py,sha256=uO6IZR8wb0N3791QgAZE7AF0CB7XoyOkFBiDH395IvE,2244
|
|
32
|
-
shepherd_core/data_models/task/testbed_tasks.py,sha256=5T_aTUE6Fby-TG5ZZAcqXVolzs4oCQ_ttNXoinREE4U,1966
|
|
33
|
-
shepherd_core/data_models/testbed/__init__.py,sha256=kQG0EUqJ5ylGRuwYZTbppWue9zDcSytpsHtUnohbGgA,566
|
|
34
|
-
shepherd_core/data_models/testbed/cape.py,sha256=_u38jvy_7yv_J3HSjGblwZXX3iOm0JF7IpTEkF9zhyg,1140
|
|
35
|
-
shepherd_core/data_models/testbed/gpio.py,sha256=9LlaxsWzEnjwaCobO-YcCWi1HZ67OsPKg5ExvtnVglQ,2086
|
|
36
|
-
shepherd_core/data_models/testbed/mcu.py,sha256=enaKdwgmasJuyHlru3UqMIA-mUq1xAoafqAgzVITxoU,1287
|
|
37
|
-
shepherd_core/data_models/testbed/observer.py,sha256=OjdvVa6uxreqIV9VM8jK1OM-RPsH4FGbKklY25_oTqg,3096
|
|
38
|
-
shepherd_core/data_models/testbed/target.py,sha256=bKrPpVcdUNYcpEudbySQ6mPFibedeNsPy9kzUMu-Um0,1762
|
|
39
|
-
shepherd_core/data_models/testbed/testbed.py,sha256=dR4yEwQKSMSXSGyPsuQ7zG2cp2LqCAQZjAzmuFOWvJo,3260
|
|
40
|
-
shepherd_core/decoder_waveform/__init__.py,sha256=HEdjRcm3m4ySEXpJ_D3lZqnxiuobJqC8axZAaAHBwDk,43
|
|
41
|
-
shepherd_core/decoder_waveform/uart.py,sha256=M4k5ymWeGP28i-_tl2FMG0YivY_WGpiZN2JOwSzlSBQ,10672
|
|
42
|
-
shepherd_core/fw_tools/__init__.py,sha256=9W-MXU5j3iJ8AgRzoGUaljD0bN29jh8LtY-pyj5HWbY,2071
|
|
43
|
-
shepherd_core/fw_tools/converter.py,sha256=2g0CZBZLn-CfUTpJljghf8AEpjIt4X7Q1FoCTsmx3A0,3273
|
|
44
|
-
shepherd_core/fw_tools/converter_elf.py,sha256=SEkrPuYUsr1VICDlZiZzr0B1njWcl9mW3J_oZk32Sb4,1008
|
|
45
|
-
shepherd_core/fw_tools/patcher.py,sha256=nXgYKGQjcEE4IYd8yNl4-t5kjlB43iFdp24oYlEaras,3774
|
|
46
|
-
shepherd_core/fw_tools/validation.py,sha256=pdZ4Q7_GyMUarELBt3OOTPIqZIGtDF3MBqOhlF75n4E,4261
|
|
47
|
-
shepherd_core/inventory/__init__.py,sha256=vTeAXOHk3paE3McpWQNBlsll40wY-IQT8alPh3n_1dE,3690
|
|
48
|
-
shepherd_core/inventory/python.py,sha256=Ar_M4cmmQgViY4caU5XH9Iye5X3jNFDnJiWGaZwNpo4,1168
|
|
49
|
-
shepherd_core/inventory/system.py,sha256=lD70oYMF0dPDvYDglhYIXIfjEFtxVoY9Zhoiwvj-oo0,2181
|
|
50
|
-
shepherd_core/inventory/target.py,sha256=XywiKmDpYKIBQt1Jo_k3bJeCOKxnzy5ob_9PYdFrjGE,421
|
|
51
|
-
shepherd_core/testbed_client/__init__.py,sha256=V38uxXOhwB8tlAjR0jH1MPSWB1LltwC0g8ipwaIyC9o,103
|
|
52
|
-
shepherd_core/testbed_client/cache_path.py,sha256=ZAoYi0je5Bg6fcP_OJa32zL6rXNPL5Ef-8vSungW9_M,401
|
|
53
|
-
shepherd_core/testbed_client/client.py,sha256=83RynaL7MiezZky-Iw-K6m8QWqRV4hAHW8awKNcTUFk,5776
|
|
54
|
-
shepherd_core/testbed_client/fixtures.py,sha256=vhSYWd3OgMP4fL5I_n1Y6flR68aSJlJnR6yFwX-D38Y,9233
|
|
55
|
-
shepherd_core/testbed_client/user_model.py,sha256=6HfDSRs4WgttEA1znVLdNwV8Pv7R_0YKxK0b30hr6mQ,2026
|
|
56
|
-
shepherd_core/vsource/__init__.py,sha256=x84_0M8Dg8R7DLKE5zyNAAGFiuOHPehDOWPt2KeBhKw,344
|
|
57
|
-
shepherd_core/vsource/virtual_converter_model.py,sha256=DCNf-O3gFmU1DIbZkESNvveCJ5sN-5dZoqAxBUogzO4,10332
|
|
58
|
-
shepherd_core/vsource/virtual_harvester_model.py,sha256=MoMa2S0VKfK1Q8fZ9CEx7sNnr3b3ae8M4YhsyY5DSgY,7764
|
|
59
|
-
shepherd_core/vsource/virtual_source_model.py,sha256=5AcNG7s_GqGn4hTzCWKTz0CNIBjF8g3YsZtc8HF0D5Q,2724
|
|
60
|
-
shepherd_core-2024.4.1.dist-info/METADATA,sha256=G0Lc2ETRLVsNDAKlpq3Od7xYsClqjbwjJiYyeEwFiv0,7618
|
|
61
|
-
shepherd_core-2024.4.1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
|
62
|
-
shepherd_core-2024.4.1.dist-info/top_level.txt,sha256=wy-t7HRBrKARZxa-Y8_j8d49oVHnulh-95K9ikxVhew,14
|
|
63
|
-
shepherd_core-2024.4.1.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
64
|
-
shepherd_core-2024.4.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|