shepherd-core 2024.4.1__tar.gz → 2024.4.2__tar.gz
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-2024.4.1 → shepherd_core-2024.4.2}/PKG-INFO +2 -1
- shepherd_core-2024.4.2/examples/experiment_from_yaml.yaml +30 -0
- shepherd_core-2024.4.2/examples/experiment_generic_var1.py +74 -0
- shepherd_core-2024.4.2/examples/experiment_generic_var2.py +67 -0
- shepherd_core-2024.4.2/examples/experiment_models.py +91 -0
- shepherd_core-2024.4.2/examples/firmware_model.py +49 -0
- shepherd_core-2024.4.2/examples/firmware_modification.py +43 -0
- shepherd_core-2024.4.2/examples/inventory.py +24 -0
- shepherd_core-2024.4.2/examples/uart_decode_waveform.py +32 -0
- shepherd_core-2024.4.2/examples/uart_raw2.csv +15536 -0
- shepherd_core-2024.4.2/examples/vharvester_simulation.py +85 -0
- shepherd_core-2024.4.2/examples/vsource_simulation.py +105 -0
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/pyproject.toml +2 -1
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/__init__.py +3 -3
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/calibration_hw_def.py +9 -1
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/commons.py +2 -0
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/data_models/__init__.py +11 -0
- shepherd_core-2024.4.2/shepherd_core/data_models/base/__init__.py +4 -0
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/data_models/base/cal_measurement.py +18 -6
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/data_models/base/calibration.py +38 -15
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/data_models/base/content.py +10 -2
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/data_models/base/shepherd.py +21 -12
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/data_models/base/timezone.py +5 -0
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/data_models/base/wrapper.py +3 -3
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/data_models/content/__init__.py +5 -4
- shepherd_core-2024.4.2/shepherd_core/data_models/content/_external_fixtures.yaml +410 -0
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/data_models/content/energy_environment.py +7 -5
- shepherd_core-2024.4.2/shepherd_core/data_models/content/energy_environment_fixture.yaml +53 -0
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/data_models/content/firmware.py +12 -5
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/data_models/content/firmware_datatype.py +7 -0
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/data_models/content/virtual_harvester.py +24 -19
- shepherd_core-2024.4.2/shepherd_core/data_models/content/virtual_harvester_fixture.yaml +160 -0
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/data_models/content/virtual_source.py +22 -10
- shepherd_core-2024.4.2/shepherd_core/data_models/content/virtual_source_fixture.yaml +230 -0
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/data_models/experiment/__init__.py +5 -4
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/data_models/experiment/experiment.py +7 -6
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/data_models/experiment/observer_features.py +14 -7
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/data_models/experiment/target_config.py +11 -7
- shepherd_core-2024.4.2/shepherd_core/data_models/readme.md +88 -0
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/data_models/task/__init__.py +10 -3
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/data_models/task/emulation.py +9 -6
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/data_models/task/firmware_mod.py +4 -2
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/data_models/task/harvest.py +5 -4
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/data_models/task/observer_tasks.py +3 -1
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/data_models/task/programming.py +3 -1
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/data_models/task/testbed_tasks.py +3 -1
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/data_models/testbed/__init__.py +5 -2
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/data_models/testbed/cape.py +7 -5
- shepherd_core-2024.4.2/shepherd_core/data_models/testbed/cape_fixture.yaml +94 -0
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/data_models/testbed/gpio.py +10 -8
- shepherd_core-2024.4.2/shepherd_core/data_models/testbed/gpio_fixture.yaml +166 -0
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/data_models/testbed/mcu.py +9 -9
- shepherd_core-2024.4.2/shepherd_core/data_models/testbed/mcu_fixture.yaml +19 -0
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/data_models/testbed/observer.py +9 -4
- shepherd_core-2024.4.2/shepherd_core/data_models/testbed/observer_fixture.yaml +221 -0
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/data_models/testbed/target.py +4 -2
- shepherd_core-2024.4.2/shepherd_core/data_models/testbed/target_fixture.yaml +137 -0
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/data_models/testbed/testbed.py +5 -2
- shepherd_core-2024.4.2/shepherd_core/data_models/testbed/testbed_fixture.yaml +25 -0
- shepherd_core-2024.4.2/shepherd_core/decoder_waveform/__init__.py +5 -0
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/decoder_waveform/uart.py +43 -25
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/fw_tools/__init__.py +2 -0
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/fw_tools/converter.py +20 -9
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/fw_tools/converter_elf.py +3 -0
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/fw_tools/patcher.py +16 -4
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/fw_tools/validation.py +26 -5
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/inventory/__init__.py +15 -5
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/inventory/python.py +4 -0
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/inventory/system.py +6 -2
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/inventory/target.py +4 -0
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/logger.py +5 -0
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/reader.py +38 -23
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/testbed_client/__init__.py +2 -0
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/testbed_client/cache_path.py +2 -0
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/testbed_client/client.py +15 -8
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/testbed_client/fixtures.py +27 -11
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/testbed_client/user_model.py +8 -3
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/vsource/__init__.py +2 -0
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/vsource/virtual_converter_model.py +10 -3
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/vsource/virtual_harvester_model.py +7 -1
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/vsource/virtual_source_model.py +9 -5
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core/writer.py +24 -19
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core.egg-info/PKG-INFO +2 -1
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core.egg-info/SOURCES.txt +65 -2
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core.egg-info/requires.txt +1 -0
- shepherd_core-2024.4.2/tests/__init__.py +0 -0
- shepherd_core-2024.4.2/tests/conftest.py +64 -0
- shepherd_core-2024.4.2/tests/data_models/__init__.py +0 -0
- shepherd_core-2024.4.2/tests/data_models/conftest.py +14 -0
- shepherd_core-2024.4.2/tests/data_models/example_cal_data.yaml +31 -0
- shepherd_core-2024.4.2/tests/data_models/example_cal_data_faulty.yaml +29 -0
- shepherd_core-2024.4.2/tests/data_models/example_cal_meas.yaml +178 -0
- shepherd_core-2024.4.2/tests/data_models/example_cal_meas_faulty1.yaml +142 -0
- shepherd_core-2024.4.2/tests/data_models/example_cal_meas_faulty2.yaml +136 -0
- shepherd_core-2024.4.2/tests/data_models/example_config_emulator.yaml +41 -0
- shepherd_core-2024.4.2/tests/data_models/example_config_experiment.yaml +16 -0
- shepherd_core-2024.4.2/tests/data_models/example_config_experiment_alternative.yaml +14 -0
- shepherd_core-2024.4.2/tests/data_models/example_config_harvester.yaml +15 -0
- shepherd_core-2024.4.2/tests/data_models/example_config_testbed.yaml +26 -0
- shepherd_core-2024.4.2/tests/data_models/example_config_virtsource.yaml +78 -0
- shepherd_core-2024.4.2/tests/data_models/test_base_models.py +205 -0
- shepherd_core-2024.4.2/tests/data_models/test_content_fixtures.py +41 -0
- shepherd_core-2024.4.2/tests/data_models/test_content_models.py +282 -0
- shepherd_core-2024.4.2/tests/data_models/test_examples.py +48 -0
- shepherd_core-2024.4.2/tests/data_models/test_experiment_models.py +278 -0
- shepherd_core-2024.4.2/tests/data_models/test_task_generation.py +52 -0
- shepherd_core-2024.4.2/tests/data_models/test_task_models.py +132 -0
- shepherd_core-2024.4.2/tests/data_models/test_testbed_fixtures.py +47 -0
- shepherd_core-2024.4.2/tests/data_models/test_testbed_models.py +188 -0
- shepherd_core-2024.4.2/tests/decoder_waveform/__init__.py +0 -0
- shepherd_core-2024.4.2/tests/decoder_waveform/test_decoder.py +34 -0
- shepherd_core-2024.4.2/tests/fw_tools/__init__.py +0 -0
- shepherd_core-2024.4.2/tests/fw_tools/build_msp.elf +0 -0
- shepherd_core-2024.4.2/tests/fw_tools/build_nrf.elf +0 -0
- shepherd_core-2024.4.2/tests/fw_tools/conftest.py +5 -0
- shepherd_core-2024.4.2/tests/fw_tools/test_converter.py +76 -0
- shepherd_core-2024.4.2/tests/fw_tools/test_patcher.py +66 -0
- shepherd_core-2024.4.2/tests/fw_tools/test_validation.py +56 -0
- shepherd_core-2024.4.2/tests/inventory/__init__.py +0 -0
- shepherd_core-2024.4.2/tests/inventory/test_inventory.py +20 -0
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/tests/test_writer.py +5 -5
- shepherd_core-2024.4.2/tests/testbed_client/__init__.py +0 -0
- shepherd_core-2024.4.2/tests/vsource/__init__.py +0 -0
- shepherd_core-2024.4.2/tests/vsource/conftest.py +49 -0
- shepherd_core-2024.4.2/tests/vsource/test_converter.py +160 -0
- shepherd_core-2024.4.2/tests/vsource/test_harvester.py +73 -0
- shepherd_core-2024.4.2/tests/vsource/test_z.py +6 -0
- shepherd_core-2024.4.1/shepherd_core/data_models/base/__init__.py +0 -1
- shepherd_core-2024.4.1/shepherd_core/decoder_waveform/__init__.py +0 -3
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/README.md +0 -0
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/setup.cfg +0 -0
- /shepherd_core-2024.4.1/shepherd_core/data_models/doc_virtual_source.py → /shepherd_core-2024.4.2/shepherd_core/data_models/virtual_source_doc.txt +0 -0
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core.egg-info/dependency_links.txt +0 -0
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core.egg-info/top_level.txt +0 -0
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/shepherd_core.egg-info/zip-safe +0 -0
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/tests/test_cal_hw.py +0 -0
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/tests/test_examples.py +0 -0
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/tests/test_logger.py +0 -0
- {shepherd_core-2024.4.1 → shepherd_core-2024.4.2}/tests/test_reader.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: shepherd_core
|
|
3
|
-
Version: 2024.4.
|
|
3
|
+
Version: 2024.4.2
|
|
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: elf
|
|
43
44
|
Requires-Dist: pwntools-elf-only; extra == "elf"
|
|
44
45
|
Provides-Extra: inventory
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
datatype: Experiment
|
|
2
|
+
parameters:
|
|
3
|
+
id: 4567
|
|
4
|
+
name: meaningful Test-Name
|
|
5
|
+
time_start: 2033-03-13 14:15:16
|
|
6
|
+
target_configs:
|
|
7
|
+
- target_IDs: [9, 10, 11]
|
|
8
|
+
custom_IDs: [0, 1, 2]
|
|
9
|
+
energy_env:
|
|
10
|
+
name: SolarSunny
|
|
11
|
+
virtual_source:
|
|
12
|
+
name: diode+capacitor
|
|
13
|
+
firmware1:
|
|
14
|
+
name: nrf52_demo_rf
|
|
15
|
+
- target_IDs:
|
|
16
|
+
- 1
|
|
17
|
+
- 2
|
|
18
|
+
- 3
|
|
19
|
+
- 4
|
|
20
|
+
custom_IDs: [7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]
|
|
21
|
+
energy_env:
|
|
22
|
+
name: ThermoelectricWashingMachine
|
|
23
|
+
virtual_source:
|
|
24
|
+
name: BQ25570-Schmitt
|
|
25
|
+
harvester:
|
|
26
|
+
name: mppt_bq_thermoelectric
|
|
27
|
+
firmware1:
|
|
28
|
+
name: nrf52_demo_rf
|
|
29
|
+
firmware2:
|
|
30
|
+
name: msp430_deep_sleep
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"""How-to for defining an experiment - variant 1.
|
|
2
|
+
|
|
3
|
+
What the code does:
|
|
4
|
+
- recommended approach for missing testbed-client
|
|
5
|
+
- variants
|
|
6
|
+
- var1 - references a server-path for the firmware
|
|
7
|
+
- var2 - embeds local firmware in yaml (elf-support is linux-only)
|
|
8
|
+
- assumption:
|
|
9
|
+
- start ASAP,
|
|
10
|
+
- no custom IDs,
|
|
11
|
+
- static Power-Supply
|
|
12
|
+
- no power-tracing
|
|
13
|
+
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
|
|
18
|
+
from shepherd_core import TestbedClient
|
|
19
|
+
from shepherd_core.data_models import FirmwareDType
|
|
20
|
+
from shepherd_core.data_models import GpioTracing
|
|
21
|
+
from shepherd_core.data_models.content import EnergyEnvironment
|
|
22
|
+
from shepherd_core.data_models.content import Firmware
|
|
23
|
+
from shepherd_core.data_models.experiment import Experiment
|
|
24
|
+
from shepherd_core.data_models.experiment import TargetConfig
|
|
25
|
+
from shepherd_core.data_models.task import TestbedTasks
|
|
26
|
+
from shepherd_core.data_models.testbed import MCU
|
|
27
|
+
|
|
28
|
+
# for online-queries the lib can be connected to the testbed-server
|
|
29
|
+
# NOTE: there are 3 states:
|
|
30
|
+
# - unconnected -> demo-fixture is queried (locally)
|
|
31
|
+
# - connected -> publicly available data is queried online
|
|
32
|
+
# - logged in with token -> also private data is queried online
|
|
33
|
+
tb_client = TestbedClient()
|
|
34
|
+
do_connect = False
|
|
35
|
+
|
|
36
|
+
if do_connect:
|
|
37
|
+
tb_client.connect()
|
|
38
|
+
|
|
39
|
+
xp = Experiment(
|
|
40
|
+
id="4567",
|
|
41
|
+
name="meaningful_TestName",
|
|
42
|
+
# time_start could be "2033-03-13 14:15:16" or "datetime.now() + timedelta(minutes=30)"
|
|
43
|
+
duration=30,
|
|
44
|
+
target_configs=[
|
|
45
|
+
TargetConfig(
|
|
46
|
+
target_IDs=range(7, 13),
|
|
47
|
+
custom_IDs=range(1, 100), # note: longer list is OK
|
|
48
|
+
energy_env=EnergyEnvironment(name="eenv_static_3000mV_50mA_3600s"),
|
|
49
|
+
firmware1=Firmware(
|
|
50
|
+
name="FW_TestXYZ",
|
|
51
|
+
data=Path("/var/shepherd/content/fw/nes_lab/nrf52_demo_rf/build.elf"),
|
|
52
|
+
data_type=FirmwareDType.path_elf,
|
|
53
|
+
data_local=False,
|
|
54
|
+
mcu=MCU(name="nRF52"),
|
|
55
|
+
),
|
|
56
|
+
power_tracing=None,
|
|
57
|
+
gpio_tracing=GpioTracing(
|
|
58
|
+
uart_decode=True, # enables logging uart from userspace
|
|
59
|
+
uart_baudrate=115_200,
|
|
60
|
+
),
|
|
61
|
+
),
|
|
62
|
+
],
|
|
63
|
+
)
|
|
64
|
+
xp.to_file("experiment_generic_var1.yaml")
|
|
65
|
+
|
|
66
|
+
# Create a tasks-list for the testbed
|
|
67
|
+
tb_tasks = TestbedTasks.from_xp(xp)
|
|
68
|
+
tb_tasks.to_file("experiment_generic_var1_tbt.yaml")
|
|
69
|
+
|
|
70
|
+
# next steps:
|
|
71
|
+
# - copy to server:
|
|
72
|
+
# scp ./experiment_generic_varX_tbt.yaml user@shepherd.cfaed.tu-dresden.de:/var/shepherd/content/
|
|
73
|
+
# - run with herd-tool:
|
|
74
|
+
# shepherd-herd --verbose run --attach /var/shepherd/content/experiment_generic_varX_tbt.yaml
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"""How-to for defining an experiment.
|
|
2
|
+
|
|
3
|
+
- recommended approach for missing testbed-client
|
|
4
|
+
- variants
|
|
5
|
+
- var1 - references a server-path for the firmware
|
|
6
|
+
- var2 - embeds local firmware in yaml (elf-support is linux-only)
|
|
7
|
+
- assumption:
|
|
8
|
+
- start ASAP,
|
|
9
|
+
- no custom IDs,
|
|
10
|
+
- static Power-Supply
|
|
11
|
+
- no power-tracing
|
|
12
|
+
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
|
|
17
|
+
from shepherd_core import TestbedClient
|
|
18
|
+
from shepherd_core.data_models import GpioTracing
|
|
19
|
+
from shepherd_core.data_models.content import EnergyEnvironment
|
|
20
|
+
from shepherd_core.data_models.content import Firmware
|
|
21
|
+
from shepherd_core.data_models.experiment import Experiment
|
|
22
|
+
from shepherd_core.data_models.experiment import TargetConfig
|
|
23
|
+
from shepherd_core.data_models.task import TestbedTasks
|
|
24
|
+
|
|
25
|
+
# for online-queries the lib can be connected to the testbed-server
|
|
26
|
+
# NOTE: there are 3 states:
|
|
27
|
+
# - unconnected -> demo-fixture is queried (locally)
|
|
28
|
+
# - connected -> publicly available data is queried online
|
|
29
|
+
# - logged in with token -> also private data is queried online
|
|
30
|
+
tb_client = TestbedClient()
|
|
31
|
+
do_connect = False
|
|
32
|
+
|
|
33
|
+
if do_connect:
|
|
34
|
+
tb_client.connect()
|
|
35
|
+
|
|
36
|
+
xp = Experiment(
|
|
37
|
+
id="4567",
|
|
38
|
+
name="meaningful_TestName",
|
|
39
|
+
# time_start could be "2033-03-13 14:15:16" or "datetime.now() + timedelta(minutes=30)"
|
|
40
|
+
duration=30,
|
|
41
|
+
target_configs=[
|
|
42
|
+
TargetConfig(
|
|
43
|
+
target_IDs=range(7, 13),
|
|
44
|
+
custom_IDs=range(1, 100), # note: longer list is OK
|
|
45
|
+
energy_env=EnergyEnvironment(name="eenv_static_3000mV_50mA_3600s"),
|
|
46
|
+
firmware1=Firmware.from_firmware(
|
|
47
|
+
file=Path("./firmware_nrf.elf").absolute(),
|
|
48
|
+
),
|
|
49
|
+
power_tracing=None,
|
|
50
|
+
gpio_tracing=GpioTracing(
|
|
51
|
+
uart_decode=True, # enables logging uart from userspace
|
|
52
|
+
uart_baudrate=115_200,
|
|
53
|
+
),
|
|
54
|
+
),
|
|
55
|
+
],
|
|
56
|
+
)
|
|
57
|
+
xp.to_file("experiment_generic_var2.yaml")
|
|
58
|
+
|
|
59
|
+
# Create a tasks-list for the testbed
|
|
60
|
+
tb_tasks = TestbedTasks.from_xp(xp)
|
|
61
|
+
tb_tasks.to_file("experiment_generic_var2_tbt.yaml")
|
|
62
|
+
|
|
63
|
+
# next steps:
|
|
64
|
+
# - copy to server:
|
|
65
|
+
# scp ./experiment_generic_varX_tbt.yaml user@shepherd.cfaed.tu-dresden.de:/var/shepherd/content/
|
|
66
|
+
# - run with herd-tool:
|
|
67
|
+
# shepherd-herd --verbose run --attach /var/shepherd/content/experiment_generic_varX_tbt.yaml
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"""Shows different ways to define an experiment.
|
|
2
|
+
|
|
3
|
+
How to define an experiment:
|
|
4
|
+
|
|
5
|
+
- within python (shown in this example)
|
|
6
|
+
- object-oriented data-models of
|
|
7
|
+
- experiment
|
|
8
|
+
- TargetConfig -> shared for group of targets
|
|
9
|
+
- virtualSource -> defines energy environment and converters
|
|
10
|
+
- sub-elements reusable
|
|
11
|
+
- scriptable for range of experiments
|
|
12
|
+
- check for plausibility right away
|
|
13
|
+
- as yaml (shown in experiment_from_yaml.yaml)
|
|
14
|
+
- default file-format for storing meta-data (for shepherd)
|
|
15
|
+
- minimal writing
|
|
16
|
+
- easy to copy parts
|
|
17
|
+
- submittable through web-interface
|
|
18
|
+
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from shepherd_core import TestbedClient
|
|
22
|
+
from shepherd_core.data_models.content import EnergyEnvironment
|
|
23
|
+
from shepherd_core.data_models.content import Firmware
|
|
24
|
+
from shepherd_core.data_models.content import VirtualHarvesterConfig
|
|
25
|
+
from shepherd_core.data_models.content import VirtualSourceConfig
|
|
26
|
+
from shepherd_core.data_models.experiment import Experiment
|
|
27
|
+
from shepherd_core.data_models.experiment import TargetConfig
|
|
28
|
+
from shepherd_core.data_models.task import TestbedTasks
|
|
29
|
+
|
|
30
|
+
# generate description for all parameters -> base for web-forms
|
|
31
|
+
Experiment.schema_to_file("experiment_schema.yaml")
|
|
32
|
+
|
|
33
|
+
# for online-queries the lib can be connected to the testbed-server
|
|
34
|
+
# NOTE: there are 3 states:
|
|
35
|
+
# - unconnected -> demo-fixture is queried (locally)
|
|
36
|
+
# - connected -> publicly available data is queried online
|
|
37
|
+
# - logged in with token -> also private data is queried online
|
|
38
|
+
tb_client = TestbedClient()
|
|
39
|
+
do_connect = False
|
|
40
|
+
|
|
41
|
+
if do_connect:
|
|
42
|
+
tb_client.connect()
|
|
43
|
+
|
|
44
|
+
# Defining an Experiment in Python
|
|
45
|
+
hrv = VirtualHarvesterConfig(name="mppt_bq_thermoelectric")
|
|
46
|
+
|
|
47
|
+
target_cfgs = [
|
|
48
|
+
# first Instance similar to yaml-syntax
|
|
49
|
+
TargetConfig(
|
|
50
|
+
target_IDs=[9, 10, 11],
|
|
51
|
+
custom_IDs=[0, 1, 2],
|
|
52
|
+
energy_env={"name": "SolarSunny"},
|
|
53
|
+
virtual_source={"name": "diode+capacitor"},
|
|
54
|
+
firmware1={"name": "nrf52_demo_rf"},
|
|
55
|
+
),
|
|
56
|
+
# second Instance fully object-oriented (recommended)
|
|
57
|
+
TargetConfig(
|
|
58
|
+
target_IDs=list(range(1, 5)),
|
|
59
|
+
custom_IDs=list(range(7, 18)), # note: longer list is OK
|
|
60
|
+
energy_env=EnergyEnvironment(name="ThermoelectricWashingMachine"),
|
|
61
|
+
virtual_source=VirtualSourceConfig(name="BQ25570-Schmitt", harvester=hrv),
|
|
62
|
+
firmware1=Firmware(name="nrf52_demo_rf"),
|
|
63
|
+
firmware2=Firmware(name="msp430_deep_sleep"),
|
|
64
|
+
),
|
|
65
|
+
]
|
|
66
|
+
|
|
67
|
+
xperi1 = Experiment(
|
|
68
|
+
id="4567",
|
|
69
|
+
name="meaningful Test-Name",
|
|
70
|
+
time_start="2033-03-13 14:15:16", # or: datetime.now() + timedelta(minutes=30)
|
|
71
|
+
target_configs=target_cfgs,
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
# Safe, reload and compare content
|
|
75
|
+
xperi1.to_file("experiment_from_py.yaml", minimal=False)
|
|
76
|
+
xperi2 = Experiment.from_file("experiment_from_py.yaml")
|
|
77
|
+
print(f"xp1 hash: {xperi1.get_hash()}")
|
|
78
|
+
print(f"xp2 hash: {xperi2.get_hash()}")
|
|
79
|
+
|
|
80
|
+
# comparison to same config (in yaml) fails due to internal variables, BUT:
|
|
81
|
+
xperi3 = Experiment.from_file("experiment_from_yaml.yaml")
|
|
82
|
+
print(f"xp3 hash: {xperi3.get_hash()} (won't match)")
|
|
83
|
+
|
|
84
|
+
# Create a tasks-list for the testbed
|
|
85
|
+
tb_tasks2 = TestbedTasks.from_xp(xperi2)
|
|
86
|
+
tb_tasks2.to_file("experiment_tb_tasks.yaml")
|
|
87
|
+
|
|
88
|
+
# Comparison between task-Lists succeed (experiment-comparison failed)
|
|
89
|
+
tb_tasks3 = TestbedTasks.from_xp(xperi3)
|
|
90
|
+
print(f"tasks2 hash: {tb_tasks2.get_hash()}")
|
|
91
|
+
print(f"tasks3 hash: {tb_tasks3.get_hash()}")
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"""This example shows ways to embed firmware into the data-model.
|
|
2
|
+
|
|
3
|
+
Note: the new semi-automatic way to generate a data-model needs pwntools installed
|
|
4
|
+
or shepherd-core[elf].
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
from shepherd_core import TestbedClient
|
|
10
|
+
from shepherd_core import fw_tools
|
|
11
|
+
from shepherd_core.data_models import Firmware
|
|
12
|
+
from shepherd_core.data_models import FirmwareDType
|
|
13
|
+
|
|
14
|
+
path_elf = Path(__file__).parent.parent / "tests/fw_tools/build_msp.elf"
|
|
15
|
+
|
|
16
|
+
# Option 1 - fully manual
|
|
17
|
+
|
|
18
|
+
fw1 = Firmware(
|
|
19
|
+
name="msp_deep_sleep1",
|
|
20
|
+
data=fw_tools.file_to_base64(path_elf),
|
|
21
|
+
data_type=FirmwareDType.base64_elf,
|
|
22
|
+
mcu={"name": "MSP430FR"},
|
|
23
|
+
owner="example",
|
|
24
|
+
group="test",
|
|
25
|
+
)
|
|
26
|
+
fw1.to_file(Path(__file__).parent / "firmware.yaml")
|
|
27
|
+
|
|
28
|
+
# Option 2 - semi-automatic -> MCU and data-type get derived
|
|
29
|
+
|
|
30
|
+
fw2 = Firmware.from_firmware(
|
|
31
|
+
file=path_elf,
|
|
32
|
+
name="msp_deep_sleep2",
|
|
33
|
+
owner="example",
|
|
34
|
+
group="test",
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
# store embedded data
|
|
38
|
+
path_elf2 = fw2.extract_firmware(Path(__file__).parent)
|
|
39
|
+
print(f"stored firmware to '{path_elf2.name}'")
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
# Option 3 - fully automatic (with login) -> owner and group get prefilled
|
|
43
|
+
|
|
44
|
+
tb_client = TestbedClient()
|
|
45
|
+
do_connect = False
|
|
46
|
+
|
|
47
|
+
if do_connect:
|
|
48
|
+
tb_client.connect(token="your_personal_login_token") # noqa: S106
|
|
49
|
+
fw3 = Firmware.from_firmware(file=path_elf, name="msp_deep_sleep3")
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"""This example manipulates elf-files and embeds firmware into the data-model.
|
|
2
|
+
|
|
3
|
+
Note: make sure to have installed
|
|
4
|
+
- shepherd-core[elf] via pip
|
|
5
|
+
- build-essential or binutils-$ARCH installed.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import shutil
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
from shepherd_core import fw_tools
|
|
12
|
+
from shepherd_core.data_models import Firmware
|
|
13
|
+
from shepherd_core.data_models import FirmwareDType
|
|
14
|
+
|
|
15
|
+
path_src = Path(__file__).parent.parent / "tests/fw_tools/build_msp.elf"
|
|
16
|
+
path_elf = Path(__file__).with_name("firmware_msp.elf")
|
|
17
|
+
|
|
18
|
+
# make local copy to play with
|
|
19
|
+
shutil.copy(path_src, path_elf)
|
|
20
|
+
|
|
21
|
+
print(f"UID old = 0x{fw_tools.read_uid(path_elf):X}")
|
|
22
|
+
fw_tools.modify_uid(path_elf, 0xCAFE)
|
|
23
|
+
print(f"UID new = 0x{fw_tools.read_uid(path_elf):X}")
|
|
24
|
+
|
|
25
|
+
path_hex = fw_tools.elf_to_hex(path_elf)
|
|
26
|
+
|
|
27
|
+
# just PoC - there is an easier way to generate data-model, see other fw-example
|
|
28
|
+
b64 = fw_tools.file_to_base64(path_elf)
|
|
29
|
+
|
|
30
|
+
fw = Firmware(
|
|
31
|
+
name="msp_deep_sleep",
|
|
32
|
+
data=b64,
|
|
33
|
+
data_type=FirmwareDType.base64_elf,
|
|
34
|
+
mcu={"name": "MSP430FR"},
|
|
35
|
+
owner="example",
|
|
36
|
+
group="test",
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
# for completion also generate hex for nrf
|
|
40
|
+
path_src = Path(__file__).parent.parent / "tests/fw_tools/build_nrf.elf"
|
|
41
|
+
path_elf = Path(__file__).with_name("firmware_nrf.elf")
|
|
42
|
+
shutil.copy(path_src, path_elf)
|
|
43
|
+
fw_tools.elf_to_hex(path_elf)
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"""Shows how to use inventory functionality."""
|
|
2
|
+
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
5
|
+
from shepherd_core.inventory import Inventory
|
|
6
|
+
from shepherd_core.inventory import InventoryList
|
|
7
|
+
from shepherd_core.inventory import PythonInventory
|
|
8
|
+
from shepherd_core.inventory import SystemInventory
|
|
9
|
+
from shepherd_core.inventory import TargetInventory
|
|
10
|
+
|
|
11
|
+
pi = PythonInventory.collect()
|
|
12
|
+
print(f"PyInv: {pi}")
|
|
13
|
+
si = SystemInventory.collect()
|
|
14
|
+
print(f"SysInv: {si}")
|
|
15
|
+
ti = TargetInventory.collect()
|
|
16
|
+
print(f"TgtInv: {ti}")
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
inv = Inventory.collect()
|
|
20
|
+
print(f"Complete Inventory: {inv}")
|
|
21
|
+
inv.to_file("inventory.yaml", minimal=True, comment="just a test")
|
|
22
|
+
|
|
23
|
+
inl = InventoryList(elements=[inv])
|
|
24
|
+
inl.to_csv(Path(__file__).parent / "inventory.csv")
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"""Demonstrates decoding of a sampled waveform to UART-symbols."""
|
|
2
|
+
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from timeit import timeit
|
|
5
|
+
|
|
6
|
+
from shepherd_core import logger
|
|
7
|
+
from shepherd_core.decoder_waveform import Uart
|
|
8
|
+
|
|
9
|
+
# file captured with logic analyzer, 15.5k events (2700 symbols, 61 lines)
|
|
10
|
+
trace = Path(__file__).parent / "uart_raw2.csv"
|
|
11
|
+
uwd = Uart(trace)
|
|
12
|
+
|
|
13
|
+
sym = uwd.get_symbols()
|
|
14
|
+
lne = uwd.get_lines()
|
|
15
|
+
txt = uwd.get_text()
|
|
16
|
+
logger.info(txt)
|
|
17
|
+
|
|
18
|
+
do_analysis = False
|
|
19
|
+
if do_analysis:
|
|
20
|
+
l0 = timeit("Uart(trace)", globals=globals(), number=1000)
|
|
21
|
+
l1 = timeit("uwd.get_symbols(force_redo=True)", globals=globals(), number=100)
|
|
22
|
+
l2 = timeit("uwd.get_lines(force_redo=True)", globals=globals(), number=1000)
|
|
23
|
+
l3 = timeit("uwd.get_text(force_redo=True)", globals=globals(), number=1000)
|
|
24
|
+
print("t_init\t", l0)
|
|
25
|
+
print("t_symb\t", l1 * 10)
|
|
26
|
+
print("t_line\t", l2)
|
|
27
|
+
print("t_text\t", l3)
|
|
28
|
+
# Results:
|
|
29
|
+
# t_init 5.8 [ms/run]
|
|
30
|
+
# t_symb 70.4 [!!!!!]
|
|
31
|
+
# t_line 3.9
|
|
32
|
+
# t_text 0.1
|