@em-foundation/emscope 25.2.0 → 25.4.0
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.
- package/CHANGELOG.md +11 -0
- package/README.md +14 -3
- package/dist/emscope +157 -49
- package/package.json +4 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
## VERSION-25-4.0
|
|
2
|
+
|
|
3
|
+
* added `--json` option
|
|
4
|
+
* port enumeration fix for PPK
|
|
5
|
+
|
|
6
|
+
## VERSION-25-3.0
|
|
7
|
+
|
|
8
|
+
* aligned with new `BlueJoule/capture` directory structure
|
|
9
|
+
* streamlined generation of `ABOUT.md` with automatic HW/SW inclusion
|
|
10
|
+
* one digit of precision after the decimal point in most results
|
|
11
|
+
|
|
1
12
|
## VERSION-25-2.0
|
|
2
13
|
|
|
3
14
|
* new `emscope grab -p, --ppk-supply` option
|
package/README.md
CHANGED
|
@@ -1,4 +1,15 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
<img src="docs/images/logo.png" alt="EM•Scope Logo" width="400">
|
|
3
|
+
</p>
|
|
4
|
+
<br>
|
|
5
|
+
<p align="center">
|
|
6
|
+
<img src="docs/images/tagline.png" alt="EM•Scope TagLine" width="750">
|
|
7
|
+
</p>
|
|
8
|
+
|
|
9
|
+
-----
|
|
10
|
+
|
|
11
|
+
The **EM•Scope** tool streamlines the capture, analysis, display, and delivery of real-time power-consumption measurements – used to characterize the overall energy efficiency of resource-constrained embedded systems.  To encourage benchmarks for different HW/SW configurations performing comparable tasks, **EM•Scope** introduces a novel metric for quantifying energy efficiency – the **EM•erald**.
|
|
12
|
+
|
|
13
|
+
<p align="right">
|
|
14
|
+
<a href="https://github.com/em-foundation/emscope/blob/docs-stable/docs/ReadMore.md">read more<b> ➦</b></a>
|
|
15
|
+
</p>
|
package/dist/emscope
CHANGED
|
@@ -12614,9 +12614,6 @@ var Window = class {
|
|
|
12614
12614
|
return this.#off >= 0 && this.#off + this.#wid <= this.#sig.data.length;
|
|
12615
12615
|
}
|
|
12616
12616
|
};
|
|
12617
|
-
function amps(val) {
|
|
12618
|
-
return toEng(val, "A");
|
|
12619
|
-
}
|
|
12620
12617
|
function fail(msg, cond = true) {
|
|
12621
12618
|
if (cond) {
|
|
12622
12619
|
console.log(`*** ${msg} ***`);
|
|
@@ -12627,7 +12624,7 @@ function infoMsg(msg) {
|
|
|
12627
12624
|
console.log(`${TAB}${msg}`);
|
|
12628
12625
|
}
|
|
12629
12626
|
function joules(j) {
|
|
12630
|
-
return toEng(j, "J");
|
|
12627
|
+
return toEng(j, "J", 0);
|
|
12631
12628
|
}
|
|
12632
12629
|
function parseHms(s) {
|
|
12633
12630
|
if (/^\d+$/.test(s)) return Number(s);
|
|
@@ -12645,12 +12642,18 @@ function secsToHms(total) {
|
|
|
12645
12642
|
const pad = (n) => n.toString().padStart(2, "0");
|
|
12646
12643
|
return `${pad(h)}:${pad(m)}:${pad(s)}`;
|
|
12647
12644
|
}
|
|
12648
|
-
function toEng(x, u) {
|
|
12645
|
+
function toEng(x, u, e) {
|
|
12649
12646
|
if (x == 0) return `0 ${u}`;
|
|
12650
|
-
const exp = Math.floor(Math.log10(Math.abs(x)) / 3) * 3;
|
|
12647
|
+
const exp = e ?? Math.floor(Math.log10(Math.abs(x)) / 3) * 3;
|
|
12651
12648
|
const mantissa = x / 10 ** exp;
|
|
12652
12649
|
const unit = { [-9]: ` n${u}`, [-6]: ` \xB5${u}`, [-3]: ` m${u}`, [0]: ` ${u}`, [3]: ` k${u}` }[exp] || `e${exp} ${u}`;
|
|
12653
|
-
return `${mantissa.toFixed(
|
|
12650
|
+
return `${mantissa.toFixed(1).padStart(4, " ")}${unit}`;
|
|
12651
|
+
}
|
|
12652
|
+
function uAmps(val) {
|
|
12653
|
+
return toEng(val, "A", -6);
|
|
12654
|
+
}
|
|
12655
|
+
function uJoules(j) {
|
|
12656
|
+
return toEng(j, "J", -6);
|
|
12654
12657
|
}
|
|
12655
12658
|
function version() {
|
|
12656
12659
|
const path = import_path.default.resolve(__dirname, "..", "package.json");
|
|
@@ -12817,6 +12820,7 @@ function trimEvents(cap, markers, count) {
|
|
|
12817
12820
|
}
|
|
12818
12821
|
|
|
12819
12822
|
// src/AboutFile.ts
|
|
12823
|
+
var ChildProc = __toESM(require("child_process"));
|
|
12820
12824
|
var Fs3 = __toESM(require("fs"));
|
|
12821
12825
|
var Path3 = __toESM(require("path"));
|
|
12822
12826
|
var TAG = "@emscope-pack";
|
|
@@ -12825,25 +12829,10 @@ var END = `<!-- ${TAG}:end -->`;
|
|
|
12825
12829
|
var RE = /<!--\s*@emscope-pack:start\s*-->[\s\S]*?<!--\s*@emscope-pack:end\s*-->/m;
|
|
12826
12830
|
function update(capdir) {
|
|
12827
12831
|
const cap = Capture.load(capdir);
|
|
12828
|
-
const TXT =
|
|
12829
|
-
<h1 align="center">Hardware Platform \xB7 Software Environment</h1>
|
|
12830
|
-
|
|
12831
|
-
## HW/SW configuration
|
|
12832
|
-
|
|
12833
|
-
## EM•Scope results
|
|
12832
|
+
const TXT = `<h1 align="center">Hardware Platform \xB7 Software Environment \xB7 xVx</h1>
|
|
12834
12833
|
|
|
12835
12834
|
${START}
|
|
12836
|
-
|
|
12837
12835
|
${END}
|
|
12838
|
-
|
|
12839
|
-
## Typical event
|
|
12840
|
-
|
|
12841
|
-
<p align="center">
|
|
12842
|
-
<img src="event-ID.png" alt="Event" width="900">
|
|
12843
|
-
</p>
|
|
12844
|
-
|
|
12845
|
-
## Observations
|
|
12846
|
-
|
|
12847
12836
|
`;
|
|
12848
12837
|
const file = Path3.join(cap.rootdir, "ABOUT.md");
|
|
12849
12838
|
if (!Fs3.existsSync(file)) {
|
|
@@ -12851,10 +12840,7 @@ ${END}
|
|
|
12851
12840
|
}
|
|
12852
12841
|
const src = Fs3.readFileSync(file, "utf-8");
|
|
12853
12842
|
const gen = mkGen(cap);
|
|
12854
|
-
const block = `${START}
|
|
12855
|
-
|
|
12856
|
-
${gen}
|
|
12857
|
-
|
|
12843
|
+
const block = `${START}${gen}
|
|
12858
12844
|
${END}`;
|
|
12859
12845
|
const out = RE.test(src) ? src.replace(RE, block) : `${src.replace(/\s*$/, "")}
|
|
12860
12846
|
|
|
@@ -12862,8 +12848,25 @@ ${block}
|
|
|
12862
12848
|
`;
|
|
12863
12849
|
Fs3.writeFileSync(file, out);
|
|
12864
12850
|
}
|
|
12851
|
+
function getBuildDir(cap) {
|
|
12852
|
+
const bn = Path3.basename(cap.rootdir).split("-")[0];
|
|
12853
|
+
return Path3.join(Path3.dirname(cap.rootdir), bn);
|
|
12854
|
+
}
|
|
12855
|
+
function getEvtId(cap) {
|
|
12856
|
+
for (const fn of Fs3.readdirSync(cap.rootdir)) {
|
|
12857
|
+
const m = fn.match(/^event\-([A-Z])\.png$/);
|
|
12858
|
+
if (m) return m[1];
|
|
12859
|
+
}
|
|
12860
|
+
fail(`no 'event-ID.png' file found`);
|
|
12861
|
+
return "";
|
|
12862
|
+
}
|
|
12865
12863
|
function mkGen(cap) {
|
|
12866
12864
|
fail(`no prior analysis: run 'emscope scan ...'`, cap.analysis === void 0);
|
|
12865
|
+
const brd = Path3.basename(Path3.dirname(cap.rootdir));
|
|
12866
|
+
const brd_txt = readBrdTxt(brd);
|
|
12867
|
+
const bld_dir = getBuildDir(cap);
|
|
12868
|
+
const bld_txt = readBldTxt(bld_dir);
|
|
12869
|
+
const eid = getEvtId(cap);
|
|
12867
12870
|
const aobj = cap.analysis;
|
|
12868
12871
|
const si = aobj.sleep;
|
|
12869
12872
|
const sl_v = cap.avg_voltage;
|
|
@@ -12877,31 +12880,83 @@ function mkGen(cap) {
|
|
|
12877
12880
|
const egy10_s = sl_pwr * 10 + egy1_e;
|
|
12878
12881
|
const egy10_d = egy10_s * 86400 / 10;
|
|
12879
12882
|
const ems10 = 80 / egy10_d;
|
|
12880
|
-
const
|
|
12883
|
+
const cap_date = mkTimestamp(cap.creation_date);
|
|
12884
|
+
const gen_date = mkTimestamp(/* @__PURE__ */ new Date());
|
|
12881
12885
|
const GEN = `
|
|
12886
|
+
|
|
12887
|
+
<!-- *** AUTOMATICALLY GENERATED CONTENT \u2013 DO NOT EDIT *** -->
|
|
12888
|
+
|
|
12889
|
+
<p align="right"><sub>captured on ${cap_date}<br>generated on ${gen_date}</sub></p>
|
|
12890
|
+
|
|
12891
|
+
## HW/SW Configuration
|
|
12892
|
+
|
|
12893
|
+
${brd_txt}
|
|
12894
|
+
${bld_txt}
|
|
12895
|
+
|
|
12896
|
+
|
|
12897
|
+
## EM•Scope results \xB7 ${cap.device}
|
|
12898
|
+
|
|
12882
12899
|
### \u{1F7E0} sleep
|
|
12883
12900
|
|
|
12884
12901
|
| supply voltage |  current (avg)  |  current (std)  |  average power 
|
|
12885
12902
|
|:---:|:---:|:---:|:---:|
|
|
12886
|
-
| ${sl_v.toFixed(
|
|
12903
|
+
| ${sl_v.toFixed(1)} V | ${uAmps(sl_avg)} | ${uAmps(sl_std)} | ${toEng(sl_pwr, "W")} |
|
|
12887
12904
|
|
|
12888
12905
|
### \u{1F7E0} 1 s event period
|
|
12889
12906
|
|
|
12890
12907
|
|   event energy (avg)   |   energy per period   |   energy per day   |    **EM•eralds**   
|
|
12891
12908
|
|:---:|:---:|:---:|:---:|
|
|
12892
|
-
| ${
|
|
12909
|
+
| ${uJoules(egy1_e)} | ${uJoules(egy1_s)} | ${joules(egy1_d)} | ${ems1.toFixed(2)} |
|
|
12893
12910
|
|
|
12894
12911
|
### \u{1F7E0} 10 s event period
|
|
12895
12912
|
|
|
12896
12913
|
|   event energy (avg)   |   energy per period   |   energy per day   |    **EM•eralds**   
|
|
12897
12914
|
|:---:|:---:|:---:|:---:|
|
|
12898
|
-
| ${
|
|
12915
|
+
| ${uJoules(egy1_e)} | ${uJoules(egy10_s)} | ${joules(egy10_d)} | ${ems10.toFixed(2)} |
|
|
12916
|
+
|
|
12917
|
+
## Typical Event
|
|
12899
12918
|
|
|
12900
|
-
<
|
|
12901
|
-
|
|
12902
|
-
|
|
12919
|
+
<p align="center"><img src="event-${eid}.png" alt="Event" width="900"></p>
|
|
12920
|
+
|
|
12921
|
+
## Notes
|
|
12922
|
+
`;
|
|
12903
12923
|
return GEN;
|
|
12904
12924
|
}
|
|
12925
|
+
function mkTimestamp(d) {
|
|
12926
|
+
const ds = d.toISOString().split("T")[0];
|
|
12927
|
+
const pad = (n) => String(n).padStart(2, "0");
|
|
12928
|
+
const HH = pad(d.getUTCHours());
|
|
12929
|
+
const MM = pad(d.getUTCMinutes());
|
|
12930
|
+
const SS = pad(d.getUTCSeconds());
|
|
12931
|
+
const ts = `${HH}:${MM}:${SS}`;
|
|
12932
|
+
return `${ds} @ ${ts}`;
|
|
12933
|
+
}
|
|
12934
|
+
function readBldTxt(bld_dir) {
|
|
12935
|
+
try {
|
|
12936
|
+
const txt = Fs3.readFileSync(Path3.join(bld_dir, "BUILD.md"), { encoding: "utf-8" });
|
|
12937
|
+
return `${txt}
|
|
12938
|
+
* [BUILD ARTIFACTS](../${Path3.basename(bld_dir)})  \u2699\uFE0F
|
|
12939
|
+
`;
|
|
12940
|
+
} catch (e) {
|
|
12941
|
+
console.log(`... skipping 'BUILD.md' inclusion`);
|
|
12942
|
+
}
|
|
12943
|
+
return "";
|
|
12944
|
+
}
|
|
12945
|
+
function readBrdTxt(brd) {
|
|
12946
|
+
const url = `https://raw.githubusercontent.com/em-foundation/emscope/docs-stable/docs/boards/${brd}.md`;
|
|
12947
|
+
const is_win = process.platform === "win32";
|
|
12948
|
+
const cmd = is_win ? "curl.exe" : "curl";
|
|
12949
|
+
const args = is_win ? ["-fsSL", "--tlsv1.2", "--ssl-no-revoke", url] : ["-fsSL", url];
|
|
12950
|
+
try {
|
|
12951
|
+
const txt = ChildProc.execFileSync(cmd, args, { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] });
|
|
12952
|
+
return `${txt}
|
|
12953
|
+
* [BOARD PINOUT](https://github.com/em-foundation/emscope/blob/docs-stable/docs/boards/${brd}.png)  \u2699\uFE0F
|
|
12954
|
+
`;
|
|
12955
|
+
} catch (e) {
|
|
12956
|
+
console.log(`... skipping 'BOARD.md' inclusion`);
|
|
12957
|
+
}
|
|
12958
|
+
return "";
|
|
12959
|
+
}
|
|
12905
12960
|
|
|
12906
12961
|
// src/Exporter.ts
|
|
12907
12962
|
var import_adm_zip = __toESM(require_adm_zip());
|
|
@@ -13112,6 +13167,7 @@ async function findDevices() {
|
|
|
13112
13167
|
}
|
|
13113
13168
|
}
|
|
13114
13169
|
fail("no PPK2 analyzer found", res.length == 0);
|
|
13170
|
+
res.sort();
|
|
13115
13171
|
return res;
|
|
13116
13172
|
}
|
|
13117
13173
|
function parseMods(mods) {
|
|
@@ -13454,8 +13510,9 @@ function exec4(opts) {
|
|
|
13454
13510
|
const cap = Capture.load(opts.capture);
|
|
13455
13511
|
fail(`no prior analysis: run 'emscope scan ...'`, cap.analysis === void 0);
|
|
13456
13512
|
const aobj = cap.analysis;
|
|
13513
|
+
const json2 = !!opts.json;
|
|
13457
13514
|
if (opts.eventInfo) {
|
|
13458
|
-
printEventInfo(cap, aobj.events);
|
|
13515
|
+
json2 ? printEventInfoJson(cap, aobj.events) : printEventInfo(cap, aobj.events);
|
|
13459
13516
|
return;
|
|
13460
13517
|
}
|
|
13461
13518
|
if (opts.jlsFile) {
|
|
@@ -13463,16 +13520,16 @@ function exec4(opts) {
|
|
|
13463
13520
|
return;
|
|
13464
13521
|
}
|
|
13465
13522
|
if (opts.sleepInfo) {
|
|
13466
|
-
printSleepInfo(cap, aobj.sleep);
|
|
13523
|
+
json2 ? printSleepInfoJson(cap, aobj.sleep) : printSleepInfo(cap, aobj.sleep);
|
|
13467
13524
|
return;
|
|
13468
13525
|
}
|
|
13469
13526
|
if (opts.whatIf !== void 0) {
|
|
13470
13527
|
const ev_rate = opts.whatIf === true ? 1 : opts.whatIf;
|
|
13471
|
-
printResults(cap, aobj, ev_rate, opts.score);
|
|
13528
|
+
json2 ? printResultsJson(cap, aobj, ev_rate) : printResults(cap, aobj, ev_rate, opts.score);
|
|
13472
13529
|
return;
|
|
13473
13530
|
}
|
|
13474
13531
|
if (opts.score) {
|
|
13475
|
-
printResults(cap, aobj, 1, true);
|
|
13532
|
+
json2 ? printResultsJson(cap, aobj, 1) : printResults(cap, aobj, 1, true);
|
|
13476
13533
|
return;
|
|
13477
13534
|
}
|
|
13478
13535
|
fail(`no options found: run 'emscope view -h'`);
|
|
@@ -13514,34 +13571,84 @@ function printEventInfo(cap, markers) {
|
|
|
13514
13571
|
for (const m of markers) {
|
|
13515
13572
|
const egy = cap.energyWithin(m);
|
|
13516
13573
|
avg += egy * scale;
|
|
13517
|
-
const dur = (cap.current_sig.offToSecs(m.width) * 1e3).toFixed(
|
|
13518
|
-
const dur_s = cap.current_sig.offToSecs(m.width);
|
|
13574
|
+
const dur = (cap.current_sig.offToSecs(m.width) * 1e3).toFixed(2).padStart(5, " ");
|
|
13519
13575
|
const off_s = cap.current_sig.offToSecs(m.offset).toFixed(2).padStart(5, " ");
|
|
13520
|
-
infoMsg(`${lab} :: time = ${off_s} s, energy = ${
|
|
13576
|
+
infoMsg(`${lab} :: time = ${off_s} s, energy = ${uJoules(egy)}, duration = ${dur} s`);
|
|
13521
13577
|
lab = String.fromCharCode(lab.charCodeAt(0) + 1);
|
|
13522
13578
|
}
|
|
13523
13579
|
infoMsg("----");
|
|
13524
|
-
infoMsg(`average energy over ${markers.length} event(s): ${
|
|
13580
|
+
infoMsg(`average energy over ${markers.length} event(s): ${uJoules(avg)}`);
|
|
13581
|
+
}
|
|
13582
|
+
function printEventInfoJson(cap, markers) {
|
|
13583
|
+
const events = markers.map((m, i) => {
|
|
13584
|
+
const energy = cap.energyWithin(m);
|
|
13585
|
+
const duration = cap.current_sig.offToSecs(m.width);
|
|
13586
|
+
const time = cap.current_sig.offToSecs(m.offset);
|
|
13587
|
+
return {
|
|
13588
|
+
id: String.fromCharCode("A".charCodeAt(0) + i),
|
|
13589
|
+
time,
|
|
13590
|
+
energy,
|
|
13591
|
+
duration
|
|
13592
|
+
};
|
|
13593
|
+
});
|
|
13594
|
+
const totalEnergy = events.reduce((sum, e) => sum + e.energy, 0);
|
|
13595
|
+
const avgEnergy = events.length > 0 ? totalEnergy / events.length : 0;
|
|
13596
|
+
console.log(JSON.stringify({
|
|
13597
|
+
type: "event_info",
|
|
13598
|
+
eventCount: events.length,
|
|
13599
|
+
averageEnergy: avgEnergy,
|
|
13600
|
+
events
|
|
13601
|
+
}));
|
|
13525
13602
|
}
|
|
13526
13603
|
function printResults(cap, aobj, ev_rate, score_only) {
|
|
13527
13604
|
const sleep_pwr = aobj.sleep.avg * cap.avg_voltage;
|
|
13528
|
-
score_only || infoMsg(`event period:
|
|
13529
|
-
score_only || infoMsg(`average sleep power:
|
|
13605
|
+
score_only || infoMsg(`event period: ${secsToHms(ev_rate)}`);
|
|
13606
|
+
score_only || infoMsg(`average sleep power: ${toEng(sleep_pwr, "W")}`);
|
|
13530
13607
|
score_only || infoMsg("----");
|
|
13531
13608
|
const egy_1s = cap.energyWithin(aobj.span) / cap.current_sig.offToSecs(aobj.span.width);
|
|
13532
13609
|
const egy_1e = egy_1s - sleep_pwr * 1;
|
|
13533
13610
|
const egy_1c = sleep_pwr * ev_rate + egy_1e;
|
|
13534
|
-
score_only || infoMsg(`representative event: ${
|
|
13535
|
-
score_only || infoMsg(`energy per period:
|
|
13611
|
+
score_only || infoMsg(`representative event: ${uJoules(egy_1e)}`);
|
|
13612
|
+
score_only || infoMsg(`energy per period: ${uJoules(egy_1c)}`);
|
|
13536
13613
|
const egy_1d = egy_1c * 86400 / ev_rate;
|
|
13537
|
-
score_only || infoMsg(`energy per day:
|
|
13614
|
+
score_only || infoMsg(`energy per day: ${joules(egy_1d)}`);
|
|
13538
13615
|
const egy_1m = egy_1d * 30;
|
|
13539
13616
|
const ems = 2400 / egy_1m;
|
|
13540
13617
|
score_only || infoMsg("----");
|
|
13541
13618
|
infoMsg(`${ems.toFixed(2)} EM\u2022eralds`);
|
|
13542
13619
|
}
|
|
13620
|
+
function printResultsJson(cap, aobj, ev_rate) {
|
|
13621
|
+
const sleep_pwr = aobj.sleep.avg * cap.avg_voltage;
|
|
13622
|
+
const egy_1s = cap.energyWithin(aobj.span) / cap.current_sig.offToSecs(aobj.span.width);
|
|
13623
|
+
const egy_1e = egy_1s - sleep_pwr * 1;
|
|
13624
|
+
const egy_1c = sleep_pwr * ev_rate + egy_1e;
|
|
13625
|
+
const egy_1d = egy_1c * 86400 / ev_rate;
|
|
13626
|
+
const egy_1m = egy_1d * 30;
|
|
13627
|
+
const ems = 2400 / egy_1m;
|
|
13628
|
+
console.log(JSON.stringify({
|
|
13629
|
+
type: "score",
|
|
13630
|
+
emeralds: parseFloat(ems.toFixed(2)),
|
|
13631
|
+
cycleRate: ev_rate,
|
|
13632
|
+
sleepCurrent: aobj.sleep.avg,
|
|
13633
|
+
sleepPower: sleep_pwr,
|
|
13634
|
+
voltage: cap.avg_voltage,
|
|
13635
|
+
eventEnergy: egy_1e,
|
|
13636
|
+
energyPerCycle: egy_1c,
|
|
13637
|
+
energyPerDay: egy_1d,
|
|
13638
|
+
energyPerMonth: egy_1m
|
|
13639
|
+
}));
|
|
13640
|
+
}
|
|
13543
13641
|
function printSleepInfo(cap, si) {
|
|
13544
|
-
infoMsg(`sleep current = ${
|
|
13642
|
+
infoMsg(`sleep current = ${uAmps(si.avg).trim()} @ ${cap.avg_voltage.toFixed(1)} V, standard deviation = ${uAmps(si.std).trim()}`);
|
|
13643
|
+
}
|
|
13644
|
+
function printSleepInfoJson(cap, si) {
|
|
13645
|
+
console.log(JSON.stringify({
|
|
13646
|
+
type: "sleep_info",
|
|
13647
|
+
sleepCurrent: si.avg,
|
|
13648
|
+
standardDeviation: si.std,
|
|
13649
|
+
voltage: cap.avg_voltage,
|
|
13650
|
+
sleepPower: si.avg * cap.avg_voltage
|
|
13651
|
+
}));
|
|
13545
13652
|
}
|
|
13546
13653
|
|
|
13547
13654
|
// node_modules/commander/esm.mjs
|
|
@@ -13567,7 +13674,7 @@ var VERS = version();
|
|
|
13567
13674
|
var CMD = new Command("emscope").option("-C, --capture-glob [name pattern]", `apply this command to each matching child capture directory (default "**")`).version(VERS);
|
|
13568
13675
|
CMD.command("grab").description("record power signals with an attached capture device").option(CAP[0], CAP[1], CAP[2]).option("-d --duration <value>", "capture duration in seconds", parseFloat, 3).option("-J --js220", "use a Joulescope JS220 device").option("-P --ppk2", "use a Nordic PPK2 device").addOption(new Option("-A --ampere-mode", "enable PPK ampere mode").conflicts(["sourceMode", "js220"])).addOption(new Option("-S --source-mode", "enable PPK source mode").default(true).conflicts(["ampereMode", "js220"])).addOption(new Option("-p, --ppk2-supply [voltage]", "supply JS220 voltage from a PPK").argParser(parseFloat).conflicts("ppk2")).addOption(new Option("-v, --voltage [value]", "source voltage").argParser(parseFloat).default(3.3).conflicts("js220")).action((opts, cmd) => execCmd(exec3, opts, cmd.parent.opts()));
|
|
13569
13676
|
CMD.command("scan").description("analyze captured data and locate active events").option(CAP[0], CAP[1], CAP[2]).option("-d, --min-duration <milliseconds>", "remove events whose duration is under a threshold", parseFloat).option("-e, --min-energy <microJoules>", "remove events whose energy is under a threshold", parseFloat).option("-g, --gap <milliseconds>", "combine adjacent events whose gap is under a threshold", parseFloat).option("-t --trim <event count>", "remove extra events", parseFloat).option("--refresh", "(re-)scan using the last set of options").action((opts, cmd) => execCmd(exec, opts, cmd.parent.opts()));
|
|
13570
|
-
CMD.command("view").description("present captured data in different formats").option(CAP[0], CAP[1], CAP[2]).option("-e --event-info", "characterize power consumption when active").option("-j --jls-file [event ID]", "generate a Joulescope .jls file containing events").option("-s --sleep-info", "characterize power consumption when inactive").option("-w --what-if [event period]", `extrapolate results for a given event period (default: '00:00:01')`, parseHms).option("--score", "only print the EM\u2022eralds benchmark score").action((opts, cmd) => execCmd(exec4, opts, cmd.parent.opts()));
|
|
13677
|
+
CMD.command("view").description("present captured data in different formats").option(CAP[0], CAP[1], CAP[2]).option("-e --event-info", "characterize power consumption when active").option("-j --jls-file [event ID]", "generate a Joulescope .jls file containing events").option("-s --sleep-info", "characterize power consumption when inactive").option("-w --what-if [event period]", `extrapolate results for a given event period (default: '00:00:01')`, parseHms).option("--score", "only print the EM\u2022eralds benchmark score").option("--json", "output results as JSON (machine-readable)").action((opts, cmd) => execCmd(exec4, opts, cmd.parent.opts()));
|
|
13571
13678
|
CMD.command("pack").description(`bundle captured data into an 'emscope.zip' file`).option(CAP[0], CAP[1], CAP[2]).option("-a --about-file", `update the 'ABOUT.md' file only`).option("-s,--status", `status of the 'emscope.zip' file`).option("-u --unpack", `deflate the 'emscope.zip' file for local use`).option("-z --zip-file", `generate the 'emscope.zip' file`).option("--restore", `restores the 'emscope.zip' LFS descriptor (debug only)`).action((opts, cmd) => execCmd(exec2, opts, cmd.parent.opts()));
|
|
13572
13679
|
try {
|
|
13573
13680
|
CMD.parse(process.argv);
|
|
@@ -13580,3 +13687,4 @@ try {
|
|
|
13580
13687
|
js-yaml/dist/js-yaml.mjs:
|
|
13581
13688
|
(*! js-yaml 4.1.0 https://github.com/nodeca/js-yaml @license MIT *)
|
|
13582
13689
|
*/
|
|
13690
|
+
//# sourceMappingURL=emscope.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@em-foundation/emscope",
|
|
3
|
-
"version": "25.
|
|
3
|
+
"version": "25.4.0",
|
|
4
4
|
"description": "benchmark energy efficiency in resource-constrained embedded systems",
|
|
5
5
|
"bin": {
|
|
6
6
|
"emscope": "dist/emscope"
|
|
@@ -29,6 +29,9 @@
|
|
|
29
29
|
"author": "The EM Foundation",
|
|
30
30
|
"license": "MIT",
|
|
31
31
|
"preferGlobal": true,
|
|
32
|
+
"publishConfig": {
|
|
33
|
+
"access": "public"
|
|
34
|
+
},
|
|
32
35
|
"bugs": {
|
|
33
36
|
"url": "https://github.com/em-foundation/emscope/issues"
|
|
34
37
|
},
|