shepherd-core 2025.6.4__py3-none-any.whl → 2025.10.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.
Files changed (45) hide show
  1. shepherd_core/data_models/__init__.py +4 -2
  2. shepherd_core/data_models/base/content.py +2 -0
  3. shepherd_core/data_models/content/__init__.py +4 -2
  4. shepherd_core/data_models/content/{virtual_harvester.py → virtual_harvester_config.py} +3 -3
  5. shepherd_core/data_models/content/{virtual_source.py → virtual_source_config.py} +82 -58
  6. shepherd_core/data_models/content/virtual_source_fixture.yaml +24 -24
  7. shepherd_core/data_models/content/virtual_storage_config.py +426 -0
  8. shepherd_core/data_models/content/virtual_storage_fixture_creator.py +267 -0
  9. shepherd_core/data_models/content/virtual_storage_fixture_ideal.yaml +637 -0
  10. shepherd_core/data_models/content/virtual_storage_fixture_lead.yaml +49 -0
  11. shepherd_core/data_models/content/virtual_storage_fixture_lipo.yaml +735 -0
  12. shepherd_core/data_models/content/virtual_storage_fixture_mlcc.yaml +200 -0
  13. shepherd_core/data_models/content/virtual_storage_fixture_param_experiments.py +151 -0
  14. shepherd_core/data_models/content/virtual_storage_fixture_super.yaml +150 -0
  15. shepherd_core/data_models/content/virtual_storage_fixture_tantal.yaml +550 -0
  16. shepherd_core/data_models/experiment/observer_features.py +8 -2
  17. shepherd_core/data_models/experiment/target_config.py +1 -1
  18. shepherd_core/data_models/task/emulation.py +9 -6
  19. shepherd_core/data_models/task/firmware_mod.py +1 -0
  20. shepherd_core/data_models/task/harvest.py +4 -4
  21. shepherd_core/data_models/task/observer_tasks.py +5 -2
  22. shepherd_core/data_models/task/programming.py +1 -0
  23. shepherd_core/data_models/task/testbed_tasks.py +6 -1
  24. shepherd_core/decoder_waveform/uart.py +2 -1
  25. shepherd_core/fw_tools/patcher.py +60 -34
  26. shepherd_core/fw_tools/validation.py +7 -1
  27. shepherd_core/inventory/system.py +1 -1
  28. shepherd_core/reader.py +4 -3
  29. shepherd_core/version.py +1 -1
  30. shepherd_core/vsource/__init__.py +4 -0
  31. shepherd_core/vsource/virtual_converter_model.py +27 -26
  32. shepherd_core/vsource/virtual_harvester_model.py +27 -19
  33. shepherd_core/vsource/virtual_harvester_simulation.py +38 -39
  34. shepherd_core/vsource/virtual_source_model.py +17 -13
  35. shepherd_core/vsource/virtual_source_simulation.py +71 -73
  36. shepherd_core/vsource/virtual_storage_model.py +164 -0
  37. shepherd_core/vsource/virtual_storage_model_fixed_point_math.py +58 -0
  38. shepherd_core/vsource/virtual_storage_models_kibam.py +449 -0
  39. shepherd_core/vsource/virtual_storage_simulator.py +104 -0
  40. {shepherd_core-2025.6.4.dist-info → shepherd_core-2025.10.1.dist-info}/METADATA +4 -6
  41. {shepherd_core-2025.6.4.dist-info → shepherd_core-2025.10.1.dist-info}/RECORD +44 -32
  42. shepherd_core/data_models/virtual_source_doc.txt +0 -207
  43. {shepherd_core-2025.6.4.dist-info → shepherd_core-2025.10.1.dist-info}/WHEEL +0 -0
  44. {shepherd_core-2025.6.4.dist-info → shepherd_core-2025.10.1.dist-info}/top_level.txt +0 -0
  45. {shepherd_core-2025.6.4.dist-info → shepherd_core-2025.10.1.dist-info}/zip-safe +0 -0
@@ -0,0 +1,550 @@
1
+ - datatype: VirtualStorageConfig
2
+ comment: created by script 'virtual_storage_fixture_creator.py'
3
+ created: 2025-09-11 19:47:04.417937+02:00
4
+ parameters:
5
+ id: 658115076921762514
6
+ name: AVX TAJB106x006
7
+ description: Tantal-Capacitor similar to ideal Model, but with R_leak & R_series,
8
+ R_leak = 19600.000 Ohm, R_serial = 3 Ohm
9
+ comment: null
10
+ created: 2025-09-11 19:47:04.396525
11
+ updated_last: 2025-09-11 19:47:04.396525
12
+ owner: NES Lab
13
+ group: NES Lab
14
+ visible2group: true
15
+ visible2all: true
16
+ SoC_init: 0.8
17
+ q_As: 6.299999999999999e-05
18
+ p_VOC:
19
+ - 0.0
20
+ - 0.0
21
+ - 0.0
22
+ - 6.3
23
+ - 0.0
24
+ - 0.0
25
+ p_Rs:
26
+ - 0.0
27
+ - 0.0
28
+ - 3.0
29
+ - 0.0
30
+ - 0.0
31
+ - 0.0
32
+ p_RtS:
33
+ - 0.0
34
+ - 0.0
35
+ - 0.0
36
+ p_CtS:
37
+ - 0.0
38
+ - 0.0
39
+ - 0.0
40
+ p_RtL:
41
+ - 0.0
42
+ - 0.0
43
+ - 0.0
44
+ p_CtL:
45
+ - 0.0
46
+ - 0.0
47
+ - 0.0
48
+ p_rce: 1.0
49
+ kdash: 2.2250738585072014e-308
50
+ R_leak_Ohm: 19600000.0
51
+ - datatype: VirtualStorageConfig
52
+ comment: created by script 'virtual_storage_fixture_creator.py'
53
+ created: 2025-09-11 19:47:04.417991+02:00
54
+ parameters:
55
+ id: 717348422201116595
56
+ name: AVX TAJB156x006
57
+ description: Tantal-Capacitor similar to ideal Model, but with R_leak & R_series,
58
+ R_leak = 13066.667 Ohm, R_serial = 2 Ohm
59
+ comment: null
60
+ created: 2025-09-11 19:47:04.396569
61
+ updated_last: 2025-09-11 19:47:04.396569
62
+ owner: NES Lab
63
+ group: NES Lab
64
+ visible2group: true
65
+ visible2all: true
66
+ SoC_init: 0.8
67
+ q_As: 9.449999999999999e-05
68
+ p_VOC:
69
+ - 0.0
70
+ - 0.0
71
+ - 0.0
72
+ - 6.3
73
+ - 0.0
74
+ - 0.0
75
+ p_Rs:
76
+ - 0.0
77
+ - 0.0
78
+ - 2.0
79
+ - 0.0
80
+ - 0.0
81
+ - 0.0
82
+ p_RtS:
83
+ - 0.0
84
+ - 0.0
85
+ - 0.0
86
+ p_CtS:
87
+ - 0.0
88
+ - 0.0
89
+ - 0.0
90
+ p_RtL:
91
+ - 0.0
92
+ - 0.0
93
+ - 0.0
94
+ p_CtL:
95
+ - 0.0
96
+ - 0.0
97
+ - 0.0
98
+ p_rce: 1.0
99
+ kdash: 2.2250738585072014e-308
100
+ R_leak_Ohm: 13066666.666666666
101
+ - datatype: VirtualStorageConfig
102
+ comment: created by script 'virtual_storage_fixture_creator.py'
103
+ created: 2025-09-11 19:47:04.418033+02:00
104
+ parameters:
105
+ id: 259188812671774089
106
+ name: AVX TAJB226x006
107
+ description: Tantal-Capacitor similar to ideal Model, but with R_leak & R_series,
108
+ R_leak = 8909.091 Ohm, R_serial = 2 Ohm
109
+ comment: null
110
+ created: 2025-09-11 19:47:04.396610
111
+ updated_last: 2025-09-11 19:47:04.396611
112
+ owner: NES Lab
113
+ group: NES Lab
114
+ visible2group: true
115
+ visible2all: true
116
+ SoC_init: 0.8
117
+ q_As: 0.00013859999999999998
118
+ p_VOC:
119
+ - 0.0
120
+ - 0.0
121
+ - 0.0
122
+ - 6.3
123
+ - 0.0
124
+ - 0.0
125
+ p_Rs:
126
+ - 0.0
127
+ - 0.0
128
+ - 2.5
129
+ - 0.0
130
+ - 0.0
131
+ - 0.0
132
+ p_RtS:
133
+ - 0.0
134
+ - 0.0
135
+ - 0.0
136
+ p_CtS:
137
+ - 0.0
138
+ - 0.0
139
+ - 0.0
140
+ p_RtL:
141
+ - 0.0
142
+ - 0.0
143
+ - 0.0
144
+ p_CtL:
145
+ - 0.0
146
+ - 0.0
147
+ - 0.0
148
+ p_rce: 1.0
149
+ kdash: 2.2250738585072014e-308
150
+ R_leak_Ohm: 8909090.909090908
151
+ - datatype: VirtualStorageConfig
152
+ comment: created by script 'virtual_storage_fixture_creator.py'
153
+ created: 2025-09-11 19:47:04.418067+02:00
154
+ parameters:
155
+ id: 405126271430376935
156
+ name: AVX TAJB336x006
157
+ description: Tantal-Capacitor similar to ideal Model, but with R_leak & R_series,
158
+ R_leak = 5939.394 Ohm, R_serial = 2 Ohm
159
+ comment: null
160
+ created: 2025-09-11 19:47:04.396648
161
+ updated_last: 2025-09-11 19:47:04.396649
162
+ owner: NES Lab
163
+ group: NES Lab
164
+ visible2group: true
165
+ visible2all: true
166
+ SoC_init: 0.8
167
+ q_As: 0.00020789999999999996
168
+ p_VOC:
169
+ - 0.0
170
+ - 0.0
171
+ - 0.0
172
+ - 6.3
173
+ - 0.0
174
+ - 0.0
175
+ p_Rs:
176
+ - 0.0
177
+ - 0.0
178
+ - 2.2
179
+ - 0.0
180
+ - 0.0
181
+ - 0.0
182
+ p_RtS:
183
+ - 0.0
184
+ - 0.0
185
+ - 0.0
186
+ p_CtS:
187
+ - 0.0
188
+ - 0.0
189
+ - 0.0
190
+ p_RtL:
191
+ - 0.0
192
+ - 0.0
193
+ - 0.0
194
+ p_CtL:
195
+ - 0.0
196
+ - 0.0
197
+ - 0.0
198
+ p_rce: 1.0
199
+ kdash: 2.2250738585072014e-308
200
+ R_leak_Ohm: 5939393.939393939
201
+ - datatype: VirtualStorageConfig
202
+ comment: created by script 'virtual_storage_fixture_creator.py'
203
+ created: 2025-09-11 19:47:04.418098+02:00
204
+ parameters:
205
+ id: 438724114000062422
206
+ name: AVX TAJB476x006
207
+ description: Tantal-Capacitor similar to ideal Model, but with R_leak & R_series,
208
+ R_leak = 4170.213 Ohm, R_serial = 2 Ohm
209
+ comment: null
210
+ created: 2025-09-11 19:47:04.396689
211
+ updated_last: 2025-09-11 19:47:04.396689
212
+ owner: NES Lab
213
+ group: NES Lab
214
+ visible2group: true
215
+ visible2all: true
216
+ SoC_init: 0.8
217
+ q_As: 0.0002961
218
+ p_VOC:
219
+ - 0.0
220
+ - 0.0
221
+ - 0.0
222
+ - 6.3
223
+ - 0.0
224
+ - 0.0
225
+ p_Rs:
226
+ - 0.0
227
+ - 0.0
228
+ - 2.0
229
+ - 0.0
230
+ - 0.0
231
+ - 0.0
232
+ p_RtS:
233
+ - 0.0
234
+ - 0.0
235
+ - 0.0
236
+ p_CtS:
237
+ - 0.0
238
+ - 0.0
239
+ - 0.0
240
+ p_RtL:
241
+ - 0.0
242
+ - 0.0
243
+ - 0.0
244
+ p_CtL:
245
+ - 0.0
246
+ - 0.0
247
+ - 0.0
248
+ p_rce: 1.0
249
+ kdash: 2.2250738585072014e-308
250
+ R_leak_Ohm: 4170212.765957447
251
+ - datatype: VirtualStorageConfig
252
+ comment: created by script 'virtual_storage_fixture_creator.py'
253
+ created: 2025-09-11 19:47:04.418129+02:00
254
+ parameters:
255
+ id: 1009176866204862382
256
+ name: AVX TAJB686x006
257
+ description: Tantal-Capacitor similar to ideal Model, but with R_leak & R_series,
258
+ R_leak = 2882.353 Ohm, R_serial = 1 Ohm
259
+ comment: null
260
+ created: 2025-09-11 19:47:04.396727
261
+ updated_last: 2025-09-11 19:47:04.396727
262
+ owner: NES Lab
263
+ group: NES Lab
264
+ visible2group: true
265
+ visible2all: true
266
+ SoC_init: 0.8
267
+ q_As: 0.0004284
268
+ p_VOC:
269
+ - 0.0
270
+ - 0.0
271
+ - 0.0
272
+ - 6.3
273
+ - 0.0
274
+ - 0.0
275
+ p_Rs:
276
+ - 0.0
277
+ - 0.0
278
+ - 0.9
279
+ - 0.0
280
+ - 0.0
281
+ - 0.0
282
+ p_RtS:
283
+ - 0.0
284
+ - 0.0
285
+ - 0.0
286
+ p_CtS:
287
+ - 0.0
288
+ - 0.0
289
+ - 0.0
290
+ p_RtL:
291
+ - 0.0
292
+ - 0.0
293
+ - 0.0
294
+ p_CtL:
295
+ - 0.0
296
+ - 0.0
297
+ - 0.0
298
+ p_rce: 1.0
299
+ kdash: 2.2250738585072014e-308
300
+ R_leak_Ohm: 2882352.9411764704
301
+ - datatype: VirtualStorageConfig
302
+ comment: created by script 'virtual_storage_fixture_creator.py'
303
+ created: 2025-09-11 19:47:04.418164+02:00
304
+ parameters:
305
+ id: 729681208823285712
306
+ name: AVX TAJB107x006
307
+ description: Tantal-Capacitor similar to ideal Model, but with R_leak & R_series,
308
+ R_leak = 1960.000 Ohm, R_serial = 2 Ohm
309
+ comment: null
310
+ created: 2025-09-11 19:47:04.396770
311
+ updated_last: 2025-09-11 19:47:04.396770
312
+ owner: NES Lab
313
+ group: NES Lab
314
+ visible2group: true
315
+ visible2all: true
316
+ SoC_init: 0.8
317
+ q_As: 0.0006299999999999999
318
+ p_VOC:
319
+ - 0.0
320
+ - 0.0
321
+ - 0.0
322
+ - 6.3
323
+ - 0.0
324
+ - 0.0
325
+ p_Rs:
326
+ - 0.0
327
+ - 0.0
328
+ - 1.7
329
+ - 0.0
330
+ - 0.0
331
+ - 0.0
332
+ p_RtS:
333
+ - 0.0
334
+ - 0.0
335
+ - 0.0
336
+ p_CtS:
337
+ - 0.0
338
+ - 0.0
339
+ - 0.0
340
+ p_RtL:
341
+ - 0.0
342
+ - 0.0
343
+ - 0.0
344
+ p_CtL:
345
+ - 0.0
346
+ - 0.0
347
+ - 0.0
348
+ p_rce: 1.0
349
+ kdash: 2.2250738585072014e-308
350
+ R_leak_Ohm: 1960000.0
351
+ - datatype: VirtualStorageConfig
352
+ comment: created by script 'virtual_storage_fixture_creator.py'
353
+ created: 2025-09-11 19:47:04.418195+02:00
354
+ parameters:
355
+ id: 978798746708642073
356
+ name: AVX TAJC157x006
357
+ description: Tantal-Capacitor similar to ideal Model, but with R_leak & R_series,
358
+ R_leak = 1306.667 Ohm, R_serial = 1 Ohm
359
+ comment: null
360
+ created: 2025-09-11 19:47:04.396807
361
+ updated_last: 2025-09-11 19:47:04.396807
362
+ owner: NES Lab
363
+ group: NES Lab
364
+ visible2group: true
365
+ visible2all: true
366
+ SoC_init: 0.8
367
+ q_As: 0.0009449999999999999
368
+ p_VOC:
369
+ - 0.0
370
+ - 0.0
371
+ - 0.0
372
+ - 6.3
373
+ - 0.0
374
+ - 0.0
375
+ p_Rs:
376
+ - 0.0
377
+ - 0.0
378
+ - 1.3
379
+ - 0.0
380
+ - 0.0
381
+ - 0.0
382
+ p_RtS:
383
+ - 0.0
384
+ - 0.0
385
+ - 0.0
386
+ p_CtS:
387
+ - 0.0
388
+ - 0.0
389
+ - 0.0
390
+ p_RtL:
391
+ - 0.0
392
+ - 0.0
393
+ - 0.0
394
+ p_CtL:
395
+ - 0.0
396
+ - 0.0
397
+ - 0.0
398
+ p_rce: 1.0
399
+ kdash: 2.2250738585072014e-308
400
+ R_leak_Ohm: 1306666.6666666667
401
+ - datatype: VirtualStorageConfig
402
+ comment: created by script 'virtual_storage_fixture_creator.py'
403
+ created: 2025-09-11 19:47:04.418225+02:00
404
+ parameters:
405
+ id: 403726628035571227
406
+ name: AVX TAJC227x006
407
+ description: Tantal-Capacitor similar to ideal Model, but with R_leak & R_series,
408
+ R_leak = 890.909 Ohm, R_serial = 1 Ohm
409
+ comment: null
410
+ created: 2025-09-11 19:47:04.396844
411
+ updated_last: 2025-09-11 19:47:04.396845
412
+ owner: NES Lab
413
+ group: NES Lab
414
+ visible2group: true
415
+ visible2all: true
416
+ SoC_init: 0.8
417
+ q_As: 0.0013859999999999999
418
+ p_VOC:
419
+ - 0.0
420
+ - 0.0
421
+ - 0.0
422
+ - 6.3
423
+ - 0.0
424
+ - 0.0
425
+ p_Rs:
426
+ - 0.0
427
+ - 0.0
428
+ - 1.2
429
+ - 0.0
430
+ - 0.0
431
+ - 0.0
432
+ p_RtS:
433
+ - 0.0
434
+ - 0.0
435
+ - 0.0
436
+ p_CtS:
437
+ - 0.0
438
+ - 0.0
439
+ - 0.0
440
+ p_RtL:
441
+ - 0.0
442
+ - 0.0
443
+ - 0.0
444
+ p_CtL:
445
+ - 0.0
446
+ - 0.0
447
+ - 0.0
448
+ p_rce: 1.0
449
+ kdash: 2.2250738585072014e-308
450
+ R_leak_Ohm: 890909.0909090909
451
+ - datatype: VirtualStorageConfig
452
+ comment: created by script 'virtual_storage_fixture_creator.py'
453
+ created: 2025-09-11 19:47:04.418255+02:00
454
+ parameters:
455
+ id: 9706982809086515
456
+ name: AVX TAJC337x006
457
+ description: Tantal-Capacitor similar to ideal Model, but with R_leak & R_series,
458
+ R_leak = 593.939 Ohm, R_serial = 0 Ohm
459
+ comment: null
460
+ created: 2025-09-11 19:47:04.396886
461
+ updated_last: 2025-09-11 19:47:04.396886
462
+ owner: NES Lab
463
+ group: NES Lab
464
+ visible2group: true
465
+ visible2all: true
466
+ SoC_init: 0.8
467
+ q_As: 0.002079
468
+ p_VOC:
469
+ - 0.0
470
+ - 0.0
471
+ - 0.0
472
+ - 6.3
473
+ - 0.0
474
+ - 0.0
475
+ p_Rs:
476
+ - 0.0
477
+ - 0.0
478
+ - 0.5
479
+ - 0.0
480
+ - 0.0
481
+ - 0.0
482
+ p_RtS:
483
+ - 0.0
484
+ - 0.0
485
+ - 0.0
486
+ p_CtS:
487
+ - 0.0
488
+ - 0.0
489
+ - 0.0
490
+ p_RtL:
491
+ - 0.0
492
+ - 0.0
493
+ - 0.0
494
+ p_CtL:
495
+ - 0.0
496
+ - 0.0
497
+ - 0.0
498
+ p_rce: 1.0
499
+ kdash: 2.2250738585072014e-308
500
+ R_leak_Ohm: 593939.3939393939
501
+ - datatype: VirtualStorageConfig
502
+ comment: created by script 'virtual_storage_fixture_creator.py'
503
+ created: 2025-09-11 19:47:04.418284+02:00
504
+ parameters:
505
+ id: 472122620116510153
506
+ name: AVX TAJD477x006
507
+ description: Tantal-Capacitor similar to ideal Model, but with R_leak & R_series,
508
+ R_leak = 417.021 Ohm, R_serial = 0 Ohm
509
+ comment: null
510
+ created: 2025-09-11 19:47:04.396929
511
+ updated_last: 2025-09-11 19:47:04.396929
512
+ owner: NES Lab
513
+ group: NES Lab
514
+ visible2group: true
515
+ visible2all: true
516
+ SoC_init: 0.8
517
+ q_As: 0.0029609999999999997
518
+ p_VOC:
519
+ - 0.0
520
+ - 0.0
521
+ - 0.0
522
+ - 6.3
523
+ - 0.0
524
+ - 0.0
525
+ p_Rs:
526
+ - 0.0
527
+ - 0.0
528
+ - 0.4
529
+ - 0.0
530
+ - 0.0
531
+ - 0.0
532
+ p_RtS:
533
+ - 0.0
534
+ - 0.0
535
+ - 0.0
536
+ p_CtS:
537
+ - 0.0
538
+ - 0.0
539
+ - 0.0
540
+ p_RtL:
541
+ - 0.0
542
+ - 0.0
543
+ - 0.0
544
+ p_CtL:
545
+ - 0.0
546
+ - 0.0
547
+ - 0.0
548
+ p_rce: 1.0
549
+ kdash: 2.2250738585072014e-308
550
+ R_leak_Ohm: 417021.27659574465
@@ -37,9 +37,15 @@ class PowerTracing(ShpModel, title="Config for Power-Tracing"):
37
37
 
38
38
  # further processing of IV-Samples
39
39
  only_power: bool = False
40
- """ ⤷ reduce file-size by calculating power and automatically discard I&V"""
40
+ """ ⤷ reduce file-size by calculating power and automatically discard I&V
41
+ Caution: increases cpu-utilization on observer - power @ 100 kHz is not recommended
42
+ """
41
43
  samplerate: Annotated[int, Field(ge=10, le=100_000)] = 100_000
42
44
  """ ⤷ reduce file-size by re-sampling (mean over x samples)
45
+
46
+ Caution: this option is available for IV-Samples (not only .only_power)
47
+ but results might be faulty for use-cases that are not const-voltage
48
+ Sum(U * I) != Sum(U) * Sum(I)
43
49
  Timestamps will be taken from the start of that sample-window.
44
50
  example: 10 Hz samplerate will be binning 10k samples via mean() and
45
51
  the timestamp for that new sample will be value[0] of the 10k long vector
@@ -148,7 +154,7 @@ class GpioTracing(ShpModel, title="Config for GPIO-Tracing"):
148
154
  See doc for nRF_FRAM_Target_v1.3+ to see mapping of target port.
149
155
 
150
156
  Example for skipping UART (pin 0 & 1):
151
- .gpio = range(2,18)
157
+ .gpios = range(2,18)
152
158
 
153
159
  Note:
154
160
  - Cape 2.4 (2023) and lower only has 9x GPIO + 1x PwrGood
@@ -10,7 +10,7 @@ from shepherd_core.data_models.base.content import IdInt
10
10
  from shepherd_core.data_models.base.shepherd import ShpModel
11
11
  from shepherd_core.data_models.content.energy_environment import EnergyEnvironment
12
12
  from shepherd_core.data_models.content.firmware import Firmware
13
- from shepherd_core.data_models.content.virtual_source import VirtualSourceConfig
13
+ from shepherd_core.data_models.content.virtual_source_config import VirtualSourceConfig
14
14
  from shepherd_core.data_models.testbed.target import IdInt16
15
15
  from shepherd_core.data_models.testbed.target import Target
16
16
 
@@ -17,7 +17,7 @@ from typing_extensions import Self
17
17
  from shepherd_core.data_models.base.content import IdInt
18
18
  from shepherd_core.data_models.base.shepherd import ShpModel
19
19
  from shepherd_core.data_models.base.timezone import local_tz
20
- from shepherd_core.data_models.content.virtual_source import VirtualSourceConfig
20
+ from shepherd_core.data_models.content.virtual_source_config import VirtualSourceConfig
21
21
  from shepherd_core.data_models.experiment.experiment import Experiment
22
22
  from shepherd_core.data_models.experiment.observer_features import GpioActuation
23
23
  from shepherd_core.data_models.experiment.observer_features import GpioTracing
@@ -35,8 +35,8 @@ from .helper_paths import path_posix
35
35
  class Compression(str, Enum):
36
36
  """Options for choosing a dataset-compression."""
37
37
 
38
- lzf = default = "lzf" # not native hdf5
39
- gzip1 = gzip = 1 # higher compr & load
38
+ lzf = "lzf" # not native hdf5
39
+ gzip1 = gzip = default = 1 # higher compr & load
40
40
  null = None
41
41
  # NOTE: lzf & external file-compression (xz or zstd) work better than gzip
42
42
  # -> even with additional compression
@@ -127,14 +127,13 @@ class EmulationTask(ShpModel):
127
127
 
128
128
  @model_validator(mode="after")
129
129
  def post_validation(self) -> Self:
130
- # TODO: limit paths
131
- time_now = datetime.now().astimezone()
130
+ time_now = datetime.now().astimezone() - timedelta(hours=24)
132
131
  if self.time_start is not None and self.time_start < time_now:
133
132
  msg = (
134
133
  "Start-Time for Emulation can't be in the past "
135
134
  f"('{self.time_start}' vs '{time_now}'."
136
135
  )
137
- raise ValueError(msg)
136
+ log.error(msg) # do not raise anymore - server & clients do not have to match
138
137
  if self.duration and self.duration.total_seconds() < 0:
139
138
  raise ValueError("Task-Duration can't be negative.")
140
139
  if isinstance(self.voltage_aux, str) and self.voltage_aux not in {
@@ -181,6 +180,10 @@ class EmulationTask(ShpModel):
181
180
  )
182
181
 
183
182
  def is_contained(self, paths: AbstractSet[PurePosixPath]) -> bool:
183
+ """Limit paths to allowed directories.
184
+
185
+ TODO: could be added to validator (with a switch)
186
+ """
184
187
  all_ok = any(self.input_path.is_relative_to(path) for path in paths)
185
188
  all_ok &= any(self.output_path.is_relative_to(path) for path in paths)
186
189
  return all_ok
@@ -93,6 +93,7 @@ class FirmwareModTask(ShpModel):
93
93
  return cls(**kwargs)
94
94
 
95
95
  def is_contained(self, paths: AbstractSet[PurePosixPath]) -> bool:
96
+ """Limit paths to allowed directories."""
96
97
  all_ok = any(self.firmware_file.is_relative_to(path) for path in paths)
97
98
  if isinstance(self.data, Path):
98
99
  all_ok = any(self.data.is_relative_to(path) for path in paths)
@@ -13,7 +13,7 @@ from typing_extensions import Self
13
13
 
14
14
  from shepherd_core.data_models.base.shepherd import ShpModel
15
15
  from shepherd_core.data_models.base.timezone import local_tz
16
- from shepherd_core.data_models.content.virtual_harvester import VirtualHarvesterConfig
16
+ from shepherd_core.data_models.content.virtual_harvester_config import VirtualHarvesterConfig
17
17
  from shepherd_core.data_models.experiment.observer_features import PowerTracing
18
18
  from shepherd_core.data_models.experiment.observer_features import SystemLogging
19
19
 
@@ -72,12 +72,11 @@ class HarvestTask(ShpModel):
72
72
  @model_validator(mode="after")
73
73
  def post_validation(self) -> Self:
74
74
  # TODO: limit paths
75
- has_time = self.time_start is not None
75
+ has_time = False # TODO: deactivated, self.time_start is not None
76
76
  time_now = datetime.now().astimezone()
77
77
  if has_time and self.time_start < time_now:
78
78
  msg = (
79
- "Start-Time for Emulation can't be in the past "
80
- f"('{self.time_start}' vs '{time_now}'."
79
+ f"Start-Time for Harvest can't be in the past ('{self.time_start}' vs '{time_now}'."
81
80
  )
82
81
  raise ValueError(msg)
83
82
  if self.duration and self.duration.total_seconds() < 0:
@@ -85,4 +84,5 @@ class HarvestTask(ShpModel):
85
84
  return self
86
85
 
87
86
  def is_contained(self, paths: AbstractSet[PurePosixPath]) -> bool:
87
+ """Limit paths to allowed directories."""
88
88
  return any(self.output_path.is_relative_to(path) for path in paths)
@@ -52,12 +52,14 @@ class ObserverTasks(ShpModel):
52
52
 
53
53
  @classmethod
54
54
  @validate_call
55
- def from_xp(cls, xp: Experiment, tb: Testbed, tgt_id: IdInt) -> Self:
55
+ def from_xp(cls, xp: Experiment, xp_folder: str | None, tb: Testbed, tgt_id: IdInt) -> Self:
56
56
  if not tb.shared_storage:
57
57
  raise ValueError("Implementation currently relies on shared storage!")
58
58
 
59
59
  obs = tb.get_observer(tgt_id)
60
- root_path = tb.data_on_observer / "experiments" / xp.folder_name()
60
+ if xp_folder is None:
61
+ xp_folder = xp.folder_name() # moved a layer up for consistent naming
62
+ root_path = tb.data_on_observer / "experiments" / xp_folder
61
63
  fw_paths = [root_path / f"fw{_i}_{obs.name}.hex" for _i in [1, 2]]
62
64
 
63
65
  return cls(
@@ -93,6 +95,7 @@ class ObserverTasks(ShpModel):
93
95
  return values
94
96
 
95
97
  def is_contained(self, paths: AbstractSet[PurePosixPath]) -> bool:
98
+ """Limit paths to allowed directories."""
96
99
  all_ok = any(self.root_path.is_relative_to(path) for path in paths)
97
100
  all_ok &= self.fw1_mod.is_contained(paths)
98
101
  all_ok &= self.fw2_mod.is_contained(paths)
@@ -78,4 +78,5 @@ class ProgrammingTask(ShpModel):
78
78
  )
79
79
 
80
80
  def is_contained(self, paths: AbstractSet[PurePosixPath]) -> bool:
81
+ """Limit paths to allowed directories."""
81
82
  return any(self.firmware_file.is_relative_to(path) for path in paths)