MZ@ !L!This program cannot be run in DOS mode. $<թRթRթRԩRPԩRRichթRPEL!   h@ 0.rdatap@@.rsrc @@~W T.rdataT.rdata$zzzdbg .rsrc$01)W.rsrc$028P h!9?@E(F@LXMpNOPQRSXY0^H_`exfklmnop q8rPshwx~(D@Xp(8HXhx(8HXhx))*h*^P+X,./1635.8 :;*H<X=x>d?APBC E H|JXLPT XZ&[\ \LX\0^^&^ _|b| GlFx$ MUIIDR_XML_BATTERY_TRANSFORMIDR_XML_DEFAULT_TRANSFORM.XSL"IDR_XML_SLEEPDIAGNOSTICS_TRANSFORMIDR_XML_SLEEPSTUDY_TRANSFORMP?xqrcwnt%o MUI zh-CNRg1Y%Rg1Y%0ُS/f1uN]_cOWߍ*eNb]"N_NN bv0RgRRg1Y%0SN_gN~g FOُN~gS N[te0RgbRRgbR0*g~b0RHe0*gԏVNUOOo`0|~Oo`|~Oo`|~Oo``{:g T|~6R FU|~NT TyBIOS egBIOS Hr,gOS QHr,gSs^S҉rۏ zpe~ zpec5unPAs^SehVRss^SehVRsc؞vs^SehVRs/f 15.6ms (15625000ns) ^(W|~zzeO(u0YgcؚehVvRs RYthV5un{tb/gSeHe0S1uNd>eYZSOb6R\OVb_R;u cؚehVvRs0PAS_MRehVRs(100ns *NUSMO)g'YehVhTg(100ns *NUSMO) *g[bvehVBl z^b gRBlvehVRs\Ns^Sg'YehVRs0]BlhTg ck(WBlۏ z IDck(WBlۏ z_ *g[bv8h_ehVBl!8h_~NbYqR z^BlvehVRs\Ns^Sg'YehVRs0]BlhTgBlpe z^b gRBlvehVRs'YNbI{Ns^Sg'YehVRs0ehVBlXh!jWWXh#ۏ z-NvgNOs^SehVn0(u!jWW5unV{eu;mR5unR S_MRO(uv5unRR GUID5unR*NNn(O(u5u`l)|~O(u5u`lO5ueS_MR5unRv*NNn0*NNn5unR*NNn:Nؚ'`(O(u5u`l)S_|~O(u5u`lO5ue S_MR5unR*NNn:Nؚ'`0>f:yhVe]y(u(O(u5u`l)*g\>f:yhVMn:NNke N;mRTsQ0 >f:yhVe(O(u5u`l)>f:yhVMn:NǏ 5 RTsQ0e(y) Sfe]y(u(O(u5u`l)*g\>f:yhVMn:N(WNke N;mRTꁨRSf0 Sfe(O(u5u`l)>f:yhVMn:N(W 5 RTꁨRSf0e(y) xvzz]y(u(O(u5u`l)*g\xvMn:NxvNke N;mRTsQ0 xve(O(u5u`l)xvMn:N(W 30 RTsQ0e(y) aw we]y(u(O(u5u`l)*g\{:gMn:NNke N;mRTꁨRaw w0 aw we(O(u5u`l){:gMn:N(W 30 RTꁨRaw w0e(y)YthVvg\'`r`:N 100% (O(u5u`l)*g\YthVMn:N9hnc;mR`QꁨRMNO5unm0PAYthVvg\'`r`:Nؚ(O(u5u`l)YthVvgNO'`r`'YNYthVg'Y'`v 75%0g\'`r`(g'Y'`v %)YthVzzr`]y(u(O(u5u`l)S_MRYthV5un{tV{eu]y(uNORYthVzzr`0USB b'`f\P]y(u(O(u5u`l)S_MR5unV{eu]hQ@\y(u USB b'`f\P0802.11 e~5u5unV{eu:Ng'Y'`(O(u5u`l)&*g\&{T 802.11 ve~Q~MhVvS_MR5unV{euMn:NO(uNOR!j_0PCI Express ASPM ]y(u(O(u5u`l)'PCI Express ;mRr`5un{t(ASPM)vS_MR5unV{euMn:NsQ0PA5unR*NNn(c5un)|~c5uneS_MR5unRv*NNn05unR*NNn:Nؚ'`(c5un)|~c5uneS_MR5unRv*NNn:Nؚ'`0>f:yhVe]y(u(c5un)*g\>f:yhVMn:NNke N;mRTsQ0 >f:yhVe(c5un)\>f:yhVMn:N(W 10 RTsQ0 Sfe]y(u(c5un)*g\>f:yhVMn:N(WNke N;mRTꁨRSf0 Sfe(c5un)>f:yhVMn:N(W 10 RTꁨRSf0 xvzz]y(u(c5un)*g\xvMn:NxvNke N;mRTsQ0PA xve(c5un)xvMn:N(W 30 RTsQ0 aw we]y(u(c5un)*g\{:gMn:NNke N;mRTꁨRaw w0 aw we(c5un){:gMn:N(W 30 RTꁨRaw w0YthVvg\'`r`:N 100% (c5un)*g\YthVMn:N9hnc;mR`QꁨRMNO5unm0YthVvg\'`r`:Nؚ(c5un)YthVvgNO'`r`'YNYthVg'Y'`v 75%0YthVzzr`]y(u(c5un)S_MRYthV5un{tV{eu]y(uNORYthVzzr`0USB b'`f\P]y(u(c5un)S_MR5unV{eu]hQ@\y(u USB b'`f\P0PA802.11 e~5u5unV{eu:Ng'Y'`(c5un)&*g\&{T 802.11 ve~Q~MhVvS_MR5unV{euMn:NO(uNOR!j_0PCI Express ASPM ]y(u(c5un)'PCI Express ;mRr`5un{t(ASPM)vS_MR5unV{euMn:NsQ0 Ɖ(ϑ((u5u`l))(Wd>eƉe /T(u Windows Media Player SNcؚ;u(b0(ϑ!j_ Ɖ(ϑ(]ceQ))(Wd>eƉe /T(u Windows Media Player SNcؚ;u(b0|~S(u'`Bl|~vBl z^]Bl;bk|~ꁨRۏeQaw wr`0ck(WBlۏ z|~vBl gR]Bl;bk|~ꁨRۏeQaw wr`0ck(WBl gR|~vBlYbqR z^]Bl;bk|~ꁨRۏeQaw wr`0 ck(WBlqR z^[O ck(WBlqR z^YPA|~vBlQ8h~N]Bl;bk|~ꁨRۏeQaw wr`0>f:yhVvBl z^]Bl;bk>f:yhVꁨRۏeQNOR!j_0y_!j_Bl z^]Bl/T(uy_!j_0y_!j_Bl gR]Bl/T(uy_!j_0gbLvBl z^]SQgbLvBl0gbLvBl gR]SQgbLvBl0PAUSB f\PUSB Y*gۏeQ b'`f\Pr`K勾Y*gۏeQ USB b'`f\Pr`0Yg USB Y*gYN b'`f\Pr` RSO;bkYthV5un{tvЏL0l: dk NO;bk|~ۏeQO wr`0;Nc6RhV ID;Nc6RhVMOnY IDzS_PAUSB Y_\ۏeQ b'`f\Pr`S勾Y(Wߍ*Ǐ z-NGk'`ۏeQ USB b'`f\Pr`0Yg USB Y*gYN b'`f\Pr` RSO;bkYthV5un{tvЏL0l: dk NO;bk|~ۏeQO wr`0f\Pe(%)SVdk݄Yr USB Y N/ec b'`f\P V:NdkY N/f]O5u0 dk݄Yr USB Y N/ec b'`f\P V:NdkY N/ec܏ z$U0CPU O(usYthV)R(usNO,(Wߍ*Ǐ z-N YthVvs^GW)R(us_NO0S_YthVvs^GW)R(us_NOe |~\m\v5un0s^GW)R(us(%) YthV)R(us:N-NI{Sߍ*gYthVvs^GW)R(us:N-NI{0S_YthVvs^GW)R(us_NOe |~\m\v5un0g wUS*NYthVvYthV)R(us Nnx[TN^(u z^T gR`SncN'YRYthV)R(us0YthV)R(usؚQߍ*gYthVvs^GW)R(usؚ0S_YthVvs^GW)R(us_NOe |~\m\v5un0g wUS*NYthVvYthV)R(us Nnx[TN^(u z^T gR`SncN'YRYthV)R(us0YthV)R(usؚvUS*NYthV0dkۏ z#ߍ*gU_v'YRv;`YthV)R(us0ۏ z TPIDs^GW)R(us(%)!jWW s^GW!jWW)R(us(%)5u`l5u`lOo`5u`l ID6R FU6R eg^RSSf[bRg_spe[ϑ N!k[hQEQ5u N!k[hQEQ5u(%) N!k5u`l[hQEQ5uT [X[Pv5uϑ\N[ϑv 50%0 N!k[hQEQ5u(%)PA N!k[hQEQ5u(%) N!k5u`l[hQEQ5uT [X[Pv5uϑ\N[ϑv 40%05u`l[ϑ*gwelnx[5u`l[ϑ0ُSh:yVN(BIOS)Qs0][\PAs^S5un{tR/ecvaw wr`maw wr`AQ{:g(WNke N;mRTۏeQNOR!j_0S3 aw wr`/f Windows s^Sv؞aw wr`0S3 aw wr`NmYOYuQX[-NQ[v5unNAQ{:g_b` Y]\O0_\ gs^S/ec S1 b S2 aw wr`0S1 aw wS/ecS2 aw wS/ecS3 aw wS/ecS4 aw wS/ec"1uNX[(WNdk{:glxNv]w N|Q[ Vdky(uN S1 aw wr`07Windows (WgNwQ gNaw w N|Q[vlxNv{:g NꁨRy(uaw w0[ňgeVN(BIOS)SO㉳Qdk0PA"1uNX[(WNdk{:glxNv]w N|Q[ Vdky(uN S2 aw wr`07Windows (WgNwQ gNaw w N|Q[vlxNv{:g NꁨRy(uaw w0[ňgeVN(BIOS)SO㉳Qdk0"1uNX[(WNdk{:glxNv]w N|Q[ Vdky(uN S3 aw wr`07Windows (WgNwQ gNaw w N|Q[vlxNv{:g NꁨRy(uaw w0[ňgeVN(BIOS)SO㉳Qdk0|~VN(BIOS) N/ec S30dk{:g-NvlxN N/ec S3 aw wr`0|~VN(BIOS) N/ec S4 (O w)0dk{:g-NvlxN N/ec S4 (O w)r`0"1uNX[(WNdk{:glxNv]w N|Q[ Vdky(uN S3 aw wr`07Windows (WgNwQ gNaw w N|Q[vlxNv{:g NꁨRy(uaw w0[ňgeVN(BIOS)SO㉳Qdk0 ](W5unV{eu-Ny(uaw w0|~{tXT](Wdk|~ Ny(uaw w01uN|~wQ g*YYvirtQX[ Vdk]y(uO w01uNX[PP[|~X[(W*gw Vdk]y(uO w01uNelubbO weN Vdk]y(uO w01uN[ňNeHrqR z^ Vdk]y(uaw w0/aw wBl@b gYqR z^NsScsS(uT5un{tv|Q[0Yg[ňNeHrqR z^ ROꁨRy(uaw w0qR z^ Tyg*N|~~N]4Ney(u S1 aw wr`0[ňN N~Nbck(WgbLNRe {:gS NǏ!n0Raw wr`0&Microsoft W,g>f:yqR z^b Microsoft W,g2ngqR z^Zb:gvc z^ NZblxveN(VHD)/TR|~0g*N|~~N]4Ney(u S2 aw wr`0[ňN N~Nbck(WgbLNRe {:gS NǏ!n0Raw wr`0g*N|~~N]4Ney(u S3 aw wr`0[ňN N~Nbck(WgbLNRe {:gS NǏ!n0Raw wr`0g*N|~~N]4Ney(u S4 (O w)r`0[ňN N~Nbck(WgbLNRe {:gS NǏ!n0Raw wr`0 /ec^>f:yhVN^0dk{:gAQ Windows ꁨRc6RƖb>f:yhVvN^0 ^>f:yhVN^/ec5dk{:g NAQ Windows ꁨRc6RƖb>f:yhVvN^0[ňgev|~VN(BIOS)SO㉳Qdk0 YthV5un{tR gHevYthV5un{tAQ{:gꁨRs^a'`Tϑm0~"}_ zz(C)r`pe '`(P)r`pe Am(T)r`peACPI C2 r`1Y%,dk{:g Nv C2 zzr`v[INX[(W0[ňge|~VN(BIOS)S㉳Qdk0 ACPI C3 1Y%,dk{:g Nv C3 zzr`v[INX[(W0[ňge|~VN(BIOS)S㉳Qdk0 ACPI Amr`1Y%(dk{:g NvAmr`v[INX[(W0[ňge|~VN(BIOS)S㉳Qdk0ACPI _CST [a1Y%1dk{:g Nv ACPI _CST [av[INX[(W0[ňge|~VN(BIOS)S㉳Qdk0ACPI _CSD [a1Y%1dk{:g Nv ACPI _CSD [av[INX[(W0[ňge|~VN(BIOS)S㉳Qdk0ACPI _PCT [a1Y%1dk{:g Nv ACPI _PCT [av[INX[(W0[ňge|~VN(BIOS)S㉳Qdk0ACPI _PSS [a1Y%1dk{:g Nv ACPI _PSS [av[INX[(W0[ňge|~VN(BIOS)S㉳Qdk0ACPI XPSS [a1Y%2dk{:g Nv ACPI XPSS [av[INX[(W0[ňge|~VN(BIOS)S㉳Qdk0ACPI _PPC [a1Y%PA1dk{:g Nv ACPI _PPC [av[INX[(W0[ňge|~VN(BIOS]S㉳Qdk0ACPI _PSD [a1Y%1dk{:g Nv ACPI _PSD [av[INX[(W0[ňge|~VN(BIOS)S㉳Qdk0ACPI _PTC [a1Y%1dk{:g Nv ACPI _PTC [av[INX[(W0[ňge|~VN(BIOS)S㉳Qdk0ACPI _TSS [a1Y%1dk{:g Nv ACPI _TSS [av[INX[(W0[ňge|~VN(BIOS)S㉳Qdk0ACPI _TPC [a1Y%1dk{:g Nv ACPI _TPC [av[INX[(W0[ňge|~VN(BIOS)S㉳Qdk0ACPI _TSD [a1Y%1dk{:g Nv ACPI _TSD [av[INX[(W0[ňge|~VN(BIOS]S㉳Qdk0YthVzzr`WbXTpe Ncknx,[IN:NYthVzzWvbXTvYthVpeX[(W0[ňge|~VN(BIOS)S㉳Qdk0W IDgbXTpe[EbXTpePAYthV'`bAmr`WbXTpe Ncknx1[IN:NYthV'`bAmr`WvbXTvYthVpeX[(W0[ňge|~VN(BIOS)S㉳Qdk0 YthVzzr`]y(u71uNX[(WNdk{:glxNv]w N|Q[ ]ꁨRy(uYthVzzr`0[ňge|~VN(BIOS)S㉳Qdk0 YthV'`r`]y(u71uNX[(WNdk{:glxNv]w N|Q[ ]ꁨRy(uYthV'`r`0[ňge|~VN(BIOS]S㉳Qdk0 YthVAmr`]y(u:1uNdk{:gvlxNX[(W]wv N|Q[ VdkYthVAmr`]ꁨRy(u0[ňgev|~VN(BIOS)S㉳Qdk0PCI Express ;mRr`5un{t(ASPM)]y(u81uNNdk{:g NvlxNNuN]wv N|Q[ Vdk]y(u PCI Express ;mRr`5un{t(ASPM)0e~p N/ec WMM ={:gޏc0Rve~ceQp N/ec WMM !j_0e~Q~MhVelۏeQ!j_eg cgqe~MhV5unV{eu-N[INve_0SSIDMAC 0W@Wޏc_:g/ec;ޏc_:gSNO{:gۏeQNORs!j_ (W!j_ N {:gY~_/TTޏc0YgS/ec RO(uޏc_:g N/f|~aw wr`0PAޏc_:gS/ecACPI PCCP [a1Y%1dk{:g Nv ACPI PCCP [av[INX[(W0[ňge|~VN(BIOS)S㉳Qdk0ACPI _CPC [a1Y%1dk{:g Nv ACPI _CPC [av[INX[(W0[ňge|~VN(BIOS)S㉳Qdk0zzr`pezzr`{|W hys(MHz)g'Y'`~vRkgNO'`~vRkgNOP6R~vRk'`c6R{|WeACPI '`(P)r`/P6R(T)r`s^Sec6RACPI OS\OYthV'`c6R5un_dcN ACPI zz(C)r` Windows To Go1uNlxN N|Q[ ]y(u ޏc_:g 01ُS{:g]/ec ޏc_:g FO/fN*NbY*NlxN~N N&{Tdkr`vBl0 N&{TُNBlv~NY N:X[PlxNe~Q~MhVyR[&^lxN󗑘lxN&{T N&{T_5un_dcNPAYqR z^YqR z^:1YbMn NS_SO[5uϑXR0Y TY IDYr`YNx*gwYaw wRgla: dkbJT-N NS+T,{N*Nޏc_:gO݋vOo`0,{N*Nޏc_:gO݋](WeveVQ/TR0傁N勃eveV O(u&lt;code&gt;powercfg sleepstudy -duration DURATION&lt;/code&gt;0OY 傁[ǏS 10 )YۏLRg ^O(u:&lt;br /&gt;&lt;pre&gt;powercfg sleepstudy -duration 10&lt;/pre&gt; Sso;mhVvRg ~b0R Fx YvRg~b0R PDC 6kvRgPDC 6kvc~e;`T'YN CS c~e0PAY TPAPPOo` |4VS_VERSION_INFO 98 98?StringFileInfo080404B0LCompanyNameMicrosoft Corporation6FileDescription5unHesʋen'FileVersion10.0.14393.0 (rs1_release.160715-1616)6 InternalNameenergy.dll.LegalCopyright Microsoft Corporation. All rights reserved.FOriginalFilenameenergy.dll.muij%ProductNameMicrosoft Windows Operating System> ProductVersion10.0.14393.0DVarFileInfo$Translation Suspended Active Report generated Battery changed Connected standby Screen off Battery AC even odd // Formats a number using the current locale (to handle the 1000's separator). // The result is rounded so no decimal point is shown. function numberToLocaleString(value) { var localeString = Math.round(parseFloat(value + '')).toLocaleString(); return localeString.substring(0, localeString.indexOf('.')); } function padLeft(number, length) { var str = '' + number; while (str.length < length) { str = '0' + str; } return str; } // Returns the number of milliseconds between 2 date-times represented as strings. function msBetween(startTime, endTime) { return startTime > endTime ? msBetween(endTime, startTime) : parseDateTime(endTime) - parseDateTime(startTime); } var dateFormat = /(\d{4})-(\d{2})-(\d{2})[T](\d{2}):(\d{2}):(\d{2})/ // Parses a date-time string and returns a Date (i.e. number of milliseconds) function parseDateTime(value) { if (!value) { return 0; } var match = dateFormat.exec(value) if (!match) { return 0; } return Date.parse(match[1] + '/' + match[2] + '/' + match[3] + ' ' + match[4] + ':' + match[5] + ':' + match[6]) } // Parses just the date portion of a date-time string and returns a Date // (i.e. number of milliseconds) function parseDate(value) { if (!value) { return 0; } var match = dateFormat.exec(value) if (!match) { return 0; } return Date.parse(match[1] + '/' + match[2] + '/' + match[3]) } var durationFormat = /P((\d+)D)?T((\d+)H)?((\d+)M)?(\d+)S/ // Convert a string of the form P10DT1H15M40S to a count of milliseconds function parseDurationToMs(value) { var match = durationFormat.exec(value) if (!match) { return 0 } var days = parseInt(match[2] || '0'); var hrs = parseInt(match[4] || '0'); var mins = parseInt(match[6] || '0'); var secs = parseInt(match[7] || '0'); return ((((((days * 24) + hrs) * 60) + mins) * 60) + secs) * 1000; } // Converts milliseconds to days function msToDays(ms) { return (ms / 1000 / 60 / 60 / 24); } function daysToMs(days) { return (days * 24 * 60 * 60 * 1000); } // Formats a number of milliseconds as h:mm:ss function formatDurationMs(value) { var ms = parseInt(value); var secs = ms / 1000; var mins = secs / 60; var hrs = Math.floor(mins / 60); mins = Math.floor(mins % 60); secs = Math.floor(secs % 60); return hrs + ':' + padLeft(mins,2) + ':' + padLeft(secs,2); } // Converts a millisecond timestamp to a day and month string // Note: dayOffset is forward from date. function dateToDayAndMonth(ms, dayOffset) { var adjustedDate = new Date(ms + (dayOffset * 24 * 60 * 60 * 1000)); return padLeft(adjustedDate.getMonth() + 1, 2) + "-" + padLeft(adjustedDate.getDate(), 2); } // Takes a millisecond timestamp and returns a new millisecond timestamp // rounded down to the current day. function dateFloor(ms) { var dt = new Date(ms); return Date.parse(dt.getFullYear() + '/' + (dt.getMonth() + 1) + '/' + dt.getDate()); } Timegraph = { axisTop: 9.5, axisRight: 24.5, axisBottom: 25.5, axisLeft: 25.5, ticks: 10, // Maximum number of 24 hour ticks for showing 12 and 6 hour ticks ticks12Hour: 8, ticks6Hour: 4, // Shading lineColor: "#B82830", shadingColor: "#4d1d35", precompute: function (graph) { var canvas = graph.canvas; var data = graph.data; var min = 0; var max = 0; graph.height = canvas.height - Timegraph.axisTop - Timegraph.axisBottom; graph.width = canvas.width - Timegraph.axisLeft - Timegraph.axisRight; for (var i = 0; i < data.length; i++) { data[i].t0 = parseDateTime(data[i].x0); data[i].t1 = parseDateTime(data[i].x1); if (i == 0) { min = data[i].t0; max = data[i].t1; } if (data[i].t0 < min) { min = data[i].t0; } if (data[i].t1 > max) { max = data[i].t1; } data[i].yy0 = Timegraph.axisTop + graph.height - data[i].y0 * graph.height; data[i].yy1 = Timegraph.axisTop + graph.height - data[i].y1 * graph.height; } if (graph.startTime != null) { graph.startMs = parseDateTime(graph.startTime); } else { graph.startMs = min; } graph.endMs = max; graph.durationMs = max - min; }, drawFrame: function (graph) { var canvas = graph.canvas; var context = graph.context; graph.width = canvas.width - Timegraph.axisRight - Timegraph.axisLeft; graph.height = canvas.height - Timegraph.axisTop - Timegraph.axisBottom; context.beginPath(); context.moveTo(Timegraph.axisLeft, Timegraph.axisTop); context.lineTo(Timegraph.axisLeft + graph.width, Timegraph.axisTop); context.lineTo(Timegraph.axisLeft + graph.width, Timegraph.axisTop + graph.height); context.lineTo(Timegraph.axisLeft, Timegraph.axisTop + graph.height); context.lineTo(Timegraph.axisLeft, Timegraph.axisTop); context.strokeStyle = "#c0c0c0"; context.stroke(); }, drawRange: function (graph) { var canvas = graph.canvas; var context = graph.context; context.font = "12pt Segoe UI"; context.fillStyle = "#00b0f0"; context.fillText("%", 0, Timegraph.axisTop + 5, Timegraph.axisLeft); var tickSpacing = graph.height / 10; var offset = Timegraph.axisTop + tickSpacing; var tickValue = 90; for (var i = 0; i < 9; i++) { context.beginPath(); context.moveTo(Timegraph.axisLeft, offset); context.lineTo(Timegraph.axisLeft + graph.width, offset); context.stroke(); context.fillText(tickValue.toString(), 0, offset + 5, Timegraph.axisLeft); offset += tickSpacing; tickValue -= 10; } }, drawDomain: function (graph, start, end) { var canvas = graph.canvas; var context = graph.context; var data = graph.data; var duration = end - start; if ((end < start)) { return; } var startDay = dateFloor(start); var t0 = startDay; var t1 = dateFloor(end); var dayOffset = 0; if (start > t0) { t0 = t0 + daysToMs(1); dayOffset++; } if (t0 >= t1) { return; } var increment = Math.max(Math.floor((t1 - t0) / daysToMs(Timegraph.ticks)), 1); var incrementMs = daysToMs(increment); var spacing = (incrementMs / duration) * graph.width; var offset = (t0 - start) / duration; var ticksCount = Math.floor((t1 - t0) / incrementMs); for (offset = offset * graph.width + Timegraph.axisLeft; offset < (graph.width + Timegraph.axisLeft); offset += spacing) { context.beginPath(); context.moveTo(offset, Timegraph.axisTop); context.lineTo(offset, Timegraph.axisTop + graph.height); context.stroke(); context.fillText(dateToDayAndMonth(startDay, dayOffset), offset, Timegraph.axisTop + graph.height + 15, spacing); dayOffset += increment; } }, plot: function (graph, start, end) { var canvas = graph.canvas; var context = graph.context var data = graph.data; if ((end < start)) { return; } var duration = end - start; Timegraph.drawDomain(graph, start, end); context.fillStyle = Timegraph.shadingColor; for (var i = 0; i < data.length - 1; i++) { if ((data[i].t0 < start) || (data[i].t0 > end) || (data[i].t1 > end)) { continue; } var x1 = (data[i].t0 - start) / duration; x1 = x1 * graph.width + Timegraph.axisLeft; var x2 = (data[i].t1 - start) / duration; x2 = x2 * graph.width + Timegraph.axisLeft; context.globalAlpha = 0.3; context.fillRect(x1, Timegraph.axisTop, (x2 - x1), graph.height); context.globalAlpha = 1; context.beginPath(); context.strokeStyle = Timegraph.lineColor; context.lineWidth = 1.5; context.moveTo(x1, data[i].yy0); context.lineTo(x2, data[i].yy1); context.stroke(); } }, draw: function (graph) { var canvas = document.getElementById(graph.element); if (canvas == null) { return; } var context = canvas.getContext('2d'); if (context == null) { return; } graph.width = 0; graph.height = 0; graph.context = context; graph.canvas = canvas; Timegraph.precompute(graph); Timegraph.drawFrame(graph); Timegraph.drawRange(graph); Timegraph.plot(graph, graph.startMs, graph.endMs); } }; { x0: "", x1: "", y0: , y1: }, drainGraphData = [ ];

Battery report

COMPUTER NAME
SYSTEM PRODUCT NAME
BIOS
OS BUILD
PLATFORM ROLE
CONNECTED STANDBY Supported Not supported
REPORT TIME

Installed batteries

Information about each currently installed battery
No batteries are currently installed
BATTERY
NAME
MANUFACTURER
SERIAL NUMBER
CHEMISTRY
DESIGN CAPACITY -
FULL CHARGE CAPACITY -
CYCLE COUNT

Recent usage

Power states over the last days
START TIME STATE SOURCE CAPACITY REMAINING
- - - - -

Battery usage

Battery drains over the last days
START TIME STATE DURATION ENERGY DRAINED
- - - - -

Usage history

History of system usage on AC and battery
BATTERY DURATION AC DURATION
PERIOD ACTIVE CONNECTED STANDBY ACTIVE CONNECTED STANDBY
- - - - -
- - - - -

Battery capacity history

Charge capacity history of the system's batteries
PERIOD FULL CHARGE CAPACITY DESIGN CAPACITY
- - -

Battery life estimates

Battery life estimates based on observed drains
AT FULL CHARGE AT DESIGN CAPACITY
PERIOD ACTIVE CONNECTED STANDBY ACTIVE CONNECTED STANDBY
- - - - -
Current estimate of battery life based on all observed drains since OS install
Since OS install - -
/ 16 h
- -
/ 16 h
- -
/ 16 h
- -
/ 16 h
Battery report


- - mWh - mWh - % - % - endTime ? msBetween(endTime, startTime) : parseDateTime(endTime) - parseDateTime(startTime); } var dateFormat = /(\d{4})-(\d{2})-(\d{2})[T](\d{2}):(\d{2}):(\d{2})/ // Parses a date-time string and returns a Date (i.e. number of milliseconds) function parseDateTime(value) { if (!value) { return 0; } var match = dateFormat.exec(value) if (!match) { return 0; } return Date.parse(match[1] + '/' + match[2] + '/' + match[3] + ' ' + match[4] + ':' + match[5] + ':' + match[6]) } // Parses just the date portion of a date-time string and returns a Date (i.e. number of milliseconds) function parseDate(value) { if (!value) { return 0; } var match = dateFormat.exec(value) if (!match) { return 0; } return Date.parse(match[1] + '/' + match[2] + '/' + match[3]) } var durationFormat = /P((\d+)D)?T((\d+)H)?((\d+)M)?(\d+)S/ // Convert a string of the form P10DT1H15M40S to a count of milliseconds function parseDurationToMs(value) { var match = durationFormat.exec(value) if (!match) { return 0 } var days = parseInt(match[2] || '0'); var hrs = parseInt(match[4] || '0'); var mins = parseInt(match[6] || '0'); var secs = parseInt(match[7] || '0'); return ((((((days * 24) + hrs) * 60) + mins) * 60) + secs) * 1000; } // Formats a number of milliseconds as h:mm:ss function formatDurationMs(value) { var ms = parseInt(value); var secs = ms / 1000; var mins = secs / 60; var hrs = Math.floor(mins / 60); mins = Math.floor(mins % 60); secs = Math.floor(secs % 60); return hrs + ':' + padLeft(mins,2) + ':' + padLeft(secs,2); } // Converts a string representing a date time to a day and month string function dateToDayAndMonth(date, dayOffset) { var adjustedDate = new Date(parseDate(date) - (dayOffset * 24 * 60 * 60 * 1000)); return padLeft(adjustedDate.getMonth() + 1, 2) + "-" + adjustedDate.getDate(); } ]]>

电源效率诊断报告

计算机名
扫描时间
扫描持续时间
系统制造商
系统产品名称
BIOS 日期
BIOS 版本
OS 内部版本
平台角色
接通电源
进程计数
线程计数
报告 GUID {}

分析结果

警告: 跟踪期间事件丢失。这可能导致分析结果不完整。

错误

警告

信息

error-log-entry warning-log-entry info-log-entry
:
节能 高性能 平衡 计划名 OEM 节能 OEM 高性能 OEM 平衡 自定义 优化视频质量 在视频质量和节能之间寻求平衡 优化节能 模块 模块的平均利用率(%) 调用模块堆栈 未知模块
 Button or Lid Thermal Zone Battery Application API Kernel API Hibernate from Sleep - Fixed Timeout System Idle Battery Hibernate from Sleep - User Away Predicted Hibernate from Sleep without Wake - User Away Predicted Unknown reason // Add support for drawing dashed lines to Canvas CanvasRenderingContext2D.prototype.dashedLine = function (x0, y0, x1, y1, dashArray) { if (dashArray == null) { dashArray = [4, 4]; } var dx = x1 - x0; var dy = y1 - y0; var distance = Math.sqrt(Math.pow((x1 - x0), 2) + Math.pow((y1 - y0), 2)); var theta = Math.atan(dy / dx); if (dx < 0) { theta += Math.PI; } var i = 0; while (distance > 0) { var length = Math.min(distance, dashArray[i]); x0 += length * Math.cos(theta); y0 += length * Math.sin(theta); if (i % 2 == 0) { this.lineTo(x0, y0); } else { this.moveTo(x0, y0); } distance -= length; i = (i + 1) % dashArray.length; } }; // Formats a number using the current locale (to handle the 1000's separator). // The result is rounded so no decimal point is shown. function numberToLocaleString(value) { var localeString = Math.round(parseFloat(value + '')).toLocaleString(); return localeString.substring(0, localeString.indexOf('.')); } function padLeft(number, length) { var str = '' + number; while (str.length < length) { str = '0' + str; } return str; } // Returns the number of milliseconds between 2 date-times represented as strings. function msBetween(startTime, endTime) { return startTime > endTime ? msBetween(endTime, startTime) : parseDateTime(endTime) - parseDateTime(startTime); } var dateFormat = /(\d{4})-(\d{2})-(\d{2})[T](\d{2}):(\d{2}):(\d{2})/ // Parses a date-time string and returns a Date (i.e. number of milliseconds) function parseDateTime(value) { if (!value) { return 0; } var match = dateFormat.exec(value) if (!match) { return 0; } return Date.parse(match[1] + '/' + match[2] + '/' + match[3] + ' ' + match[4] + ':' + match[5] + ':' + match[6]) } // Parses just the date portion of a date-time string and returns a Date // (i.e. number of milliseconds) function parseDate(value) { if (!value) { return 0; } var match = dateFormat.exec(value) if (!match) { return 0; } return Date.parse(match[1] + '/' + match[2] + '/' + match[3]) } var durationFormat = /P((\d+)D)?T((\d+)H)?((\d+)M)?(\d+)S/ // Convert a string of the form P10DT1H15M40S to a count of milliseconds function parseDurationToMs(value) { var match = durationFormat.exec(value) if (!match) { return 0 } var days = parseInt(match[2] || '0'); var hrs = parseInt(match[4] || '0'); var mins = parseInt(match[6] || '0'); var secs = parseInt(match[7] || '0'); return ((((((days * 24) + hrs) * 60) + mins) * 60) + secs) * 1000; } // Converts milliseconds to days function msToDays(ms) { return (ms / 1000 / 60 / 60 / 24); } function daysToMs(days) { return (days * 24 * 60 * 60 * 1000); } // Formats a number of milliseconds as h:mm:ss function formatDurationMs(value) { var ms = parseInt(value); var secs = ms / 1000; var mins = secs / 60; var hrs = Math.floor(mins / 60); mins = Math.floor(mins % 60); secs = Math.floor(secs % 60); return hrs + ':' + padLeft(mins,2) + ':' + padLeft(secs,2); } // Converts a millisecond timestamp to a day and month string // Note: dayOffset is forward from date. function dateToDayAndMonth(ms, dayOffset) { var adjustedDate = new Date(ms + (dayOffset * 24 * 60 * 60 * 1000)); return padLeft(adjustedDate.getMonth() + 1, 2) + "-" + padLeft(adjustedDate.getDate(), 2); } // Takes a millisecond timestamp and returns a new millisecond timestamp // rounded down to the current day. function dateFloor(ms) { var dt = new Date(ms); return Date.parse(dt.getFullYear() + '/' + (dt.getMonth() + 1) + '/' + dt.getDate()); } Timegraph = { axisTop: 9.5, axisRight: 24.5, axisBottom: 25.5, axisLeft: 25.5, ticks: 10, // Maximum number of 24 hour ticks for showing 12 and 6 hour ticks ticks12Hour: 360, ticks6Hour: 180, // Shading shadingColor: "#d0d0d0", precompute: function (graph) { var canvas = graph.canvas; var data = graph.data; var min = 0; var max = 0; graph.height = canvas.height - Timegraph.axisTop - Timegraph.axisBottom; graph.width = canvas.width - Timegraph.axisLeft - Timegraph.axisRight; for (var i = 0; i < data.length; i++) { data[i].t0 = parseDateTime(data[i].x0); data[i].t1 = parseDateTime(data[i].x1); if (i == 0) { min = data[i].t0; max = data[i].t1; } if (data[i].t0 < min) { min = data[i].t0; } if (data[i].t1 > max) { max = data[i].t1; } data[i].yy0 = Timegraph.axisTop + graph.height - data[i].y0 * graph.height; data[i].yy1 = Timegraph.axisTop + graph.height - data[i].y1 * graph.height; } if (graph.startTime != null) { graph.startMs = parseDateTime(graph.startTime); } else { graph.startMs = min; } graph.endMs = max; graph.durationMs = max - min; }, drawFrame: function (graph) { var canvas = graph.canvas; var context = graph.context; graph.width = canvas.width - Timegraph.axisRight - Timegraph.axisLeft; graph.height = canvas.height - Timegraph.axisTop - Timegraph.axisBottom; context.beginPath(); context.moveTo(Timegraph.axisLeft, Timegraph.axisTop); context.lineTo(Timegraph.axisLeft + graph.width, Timegraph.axisTop); context.lineTo(Timegraph.axisLeft + graph.width, Timegraph.axisTop + graph.height); context.lineTo(Timegraph.axisLeft, Timegraph.axisTop + graph.height); context.lineTo(Timegraph.axisLeft, Timegraph.axisTop); context.strokeStyle = "#c0c0c0"; context.stroke(); }, drawRange: function (graph) { var canvas = graph.canvas; var context = graph.context; context.font = "12pt Segoe UI"; context.fillStyle = "#00b0f0"; context.fillText("%", 0, Timegraph.axisTop + 5, Timegraph.axisLeft); var tickSpacing = graph.height / 10; var offset = Timegraph.axisTop + tickSpacing; var tickValue = 90; for (var i = 0; i < 9; i++) { context.beginPath(); context.moveTo(Timegraph.axisLeft, offset); context.lineTo(Timegraph.axisLeft + graph.width, offset); context.stroke(); context.fillText(tickValue.toString(), 0, offset + 5, Timegraph.axisLeft); offset += tickSpacing; tickValue -= 10; } }, drawDomain: function (graph, start, end) { var canvas = graph.canvas; var context = graph.context; var data = graph.data; var duration = end - start; if ((end < start)) { return; } var startDay = dateFloor(start); var t0 = startDay; var t1 = dateFloor(end); var dayOffset = 0; if (start > t0) { t0 = t0 + daysToMs(1); dayOffset++; } if (t0 >= t1) { return; } var increment = Math.max(Math.floor((t1 - t0) / daysToMs(Timegraph.ticks)), 1); var incrementMs = daysToMs(increment); var spacing = (incrementMs / duration) * graph.width; var offset = (t0 - start) / duration; var ticksCount = Math.floor((t1 - t0) / incrementMs); for (offset = offset * graph.width + Timegraph.axisLeft; offset < (graph.width + Timegraph.axisLeft); offset += spacing) { context.beginPath(); context.moveTo(offset, Timegraph.axisTop); context.lineTo(offset, Timegraph.axisTop + graph.height); context.stroke(); context.fillText(dateToDayAndMonth(startDay, dayOffset), offset, Timegraph.axisTop + graph.height + 15, spacing); dayOffset += increment; } }, plot: function (graph, start, end) { var canvas = graph.canvas; var context = graph.context var data = graph.data; if ((end < start)) { return; } var duration = end - start; Timegraph.drawDomain(graph, start, end); context.fillStyle = Timegraph.shadingColor; for (var i = 0; i < data.length - 1; i++) { if ((data[i].t0 < start) || (data[i].t0 > end) || (data[i].t1 > end)) { continue; } var x1 = (data[i].t0 - start) / duration; x1 = x1 * graph.width + Timegraph.axisLeft; var x2 = (data[i].t1 - start) / duration; x2 = x2 * graph.width + Timegraph.axisLeft; context.globalAlpha = 0.3; context.fillRect(x1, Timegraph.axisTop, (x2 - x1), graph.height); context.globalAlpha = 1; context.beginPath(); context.strokeStyle = graph.lineTypes[data[i].type].color; context.lineWidth = 1.5; if (graph.lineTypes[data[i].type].dotted == 1) { context.dashedLine(x1, data[i].yy0, x2, data[i].yy1); } else { context.moveTo(x1, data[i].yy0); context.lineTo(x2, data[i].yy1); } context.stroke(); } }, draw: function (graph) { var canvas = document.getElementById(graph.element); if (canvas == null) { return; } var context = canvas.getContext('2d'); if (context == null) { return; } graph.width = 0; graph.height = 0; graph.context = context; graph.canvas = canvas; Timegraph.precompute(graph); Timegraph.drawFrame(graph); Timegraph.drawRange(graph); Timegraph.plot(graph, graph.startMs, graph.endMs); } }; Collapser = { topActiveBlockerDivs: {}, detailsContainers: {}, getContainerBody: function (container) { var children = container.childNodes; var containerBody = null; for (var i = 0; i < children.length; i++) { if (children[i].tagName == "DIV" && (children[i].className == "analysis-body-collapsed" || children[i].className == "analysis-body")) { containerBody = children[i]; break; } } return containerBody; }, togglePanel: function (container) { var containerBody = Collapser.getContainerBody(container); if (containerBody == null) { return; } var heading = container.getElementsByTagName("H1")[0]; var expander = heading.getElementsByClassName("expander")[0]; if (containerBody.className == "analysis-body-collapsed") { containerBody.className = "analysis-body"; expander.innerHTML = "- "; } else { containerBody.className = "analysis-body-collapsed"; expander.innerHTML = "+ "; } }, toggleDetails: function (element) { if (element.className == "scenario-details-collapsed") { element.className = "scenario-details"; } else { element.className = "scenario-details-collapsed"; } }, initializePanels: function () { var elements = document.getElementsByClassName("analysis-container"); for (var i = 0; i < elements.length; i++) { var element = elements[i]; var heading = element.getElementsByTagName("h1")[0]; if (heading == null) { continue; } heading.onclick = function () { var container = this.parentNode; Collapser.togglePanel(container); }; } }, initializeDetails: function() { var elements = document.getElementsByClassName("details-expander"); for (var i = 0; i < elements.length; i++) { var element = elements[i]; var targetId = "details-" + element.id.replace("details-expand-", ""); var targetElement = document.getElementById(targetId); Collapser.detailsContainers[element.id] = targetElement; element.onclick = function () { var targetElement = Collapser.detailsContainers[this.id]; Collapser.toggleDetails(targetElement); }; } }, initializeLinks: function () { var links = document.getElementsByClassName("top-active-link"); for (var i = 0; i < links.length; i++) { var link = links[i]; var targetId = link.getAttribute("href").substring(1); var targetElement = document.getElementById(targetId); if (targetElement.tagName.toLowerCase() == "tr") { // tr, tbody, table, div.analysis-body-*, div.analysis-container Collapser.topActiveBlockerDivs[targetId] = targetElement.parentNode.parentNode.parentNode.parentNode; } else { Collapser.topActiveBlockerDivs[targetId] = targetElement; } link.onclick = function () { var targetId = this.getAttribute("href").substring(1); var targetContainer = Collapser.topActiveBlockerDivs[targetId]; var container = targetContainer; while ((container != null) && (container.tagName == "DIV")) { var containerBody = Collapser.getContainerBody(container); if (containerBody == null) { return; } if (containerBody.className == "analysis-body-collapsed") { Collapser.togglePanel(container); } container = container.parentNode.parentNode; } targetContainer.scrollIntoView(true); }; } }, initializeCollapser: function () { Collapser.initializePanels(); Collapser.initializeDetails(); TableDecorator.decorate({ element: ".top-blocker", withClass: "top-active-link" }); Collapser.initializeLinks(); }, initialize: function () { if (window.addEventListener != null) { window.addEventListener("load", Collapser.initializeCollapser, false); } else if (window.attachEvent != null) { window.attachEvent("onload", Collapser.initializeCollapser); } } }; TableDecorator = { decorateTable: function (table, linkClass) { if (table == null) { return; } var rows = table.getElementsByTagName("tr"); for (var i = 0; i < rows.length; i++) { var row = rows[i]; var anchor = row.getElementsByClassName("row-link")[0]; if (anchor == null || anchor.tagName.toLowerCase() != "a") { continue; } var link = anchor.getAttribute("href"); for (var j = 0; j < row.children.length; j++) { var cell = row.children[j]; if (cell == anchor.parentNode) { continue; } var classString = ""; if (linkClass != null) { classString = " class=\"" + linkClass + "\""; } cell.innerHTML = "<a href=\"" + link + "\"" + classString + ">" + cell.innerHTML + "</a>"; } } }, decorate: function (tableData) { var selection = tableData.element; if (selection.charAt(0) == ".") { var className = selection.substring(1); var elements = document.getElementsByClassName(className); for (var i = 0; i < elements.length; i++) { if (elements[i].tagName.toLowerCase() == "table") { TableDecorator.decorateTable(elements[i], tableData.withClass); } } } else if (selection.charAt(0) == "#") { var idName = selection.substring(1); var element = document.getElementById(idName); if (element.tagName.toLowerCase() == "table") { TableDecorator.decorateTable(element, tableData.withClass); } } }, }; function initializeScrollTop() { var elements = document.getElementsByClassName("scroll-top-button"); for (var i = 0; i < elements.length; i++) { var element = elements[i]; element.onclick = function () { window.scroll(0, 0); window.location.replace("#"); if (typeof window.history.replaceState == "function") { history.replaceState({}, "", window.location.href.slice(0, -1)); } } } } Timegraph.draw({ element: "idle-time-graph- ", data: idleTimeGraphData_ , rangeMax: 100, lineTypes: idleTimeGraphLineTypes, startTime: " ", endTime: " " }); idleTimeGraphData_ = [ ]; { x0: " ", x1: " ", y0: , y1: , type: 2 4 },
REPORT TIME
TIME USER WENT IDLE IDLE DURATION SLEEP STATE ENTERED
- - - -
row-low #user-not-present-session- row-link user-not-present-session-
Top

User Not Present Session

row-low
TIME USER WENT IDLE IDLE DURATION SLEEP STATE ENTERED

Idle Time Graph

Diagnostics of system idle.
idle-time-graph- 864 300
analysis-container analysis-

+ Power Requests

No power requests present during this session.
analysis-container analysis-

+

START TIME DURATION TYPE TOKEN
analysis-container analysis-info

+ System Idle Events

No system idle events present during this session.
EVENT FROM START TIME
row-info
analysis-container analysis-info

+ Smart User Presence Prediction Information

SUPPORTED GLOBAL USER PRESENT USER PREDICTION MODE MIN CONFIDENCE SUSPEND COUNT LAST USER AWAY END
analysis-container analysis-info

+ Weekly Prediction Intervals

No intervals.
analysis-container analysis-info

+ Intervals for User Sid

INTERVAL NUMBER WEEKLY START OFFSET WEEKLY END OFFSET CONFIDENCE
analysis-container analysis-info

+ Events

No smart user presence events present during this session.
EVENT FROM START TIME
analysis-container analysis-info

+ Sleep Intervals

The system did not sleep during this session.
analysis-container analysis- low high

+

START TIME DURATION STATE ACTION REASON ID STATUS SUCCESSFUL
System Sleep Diagnostics

System Sleep Diagnostics

User Not Present Intervals

Analysis Results

Analysis of intervals where the user went away and the machine might not have slept when the user expected it to.



P Connected standby Screen off // Add support for drawing dashed lines to Canvas CanvasRenderingContext2D.prototype.dashedLine = function (x0, y0, x1, y1, dashArray) { if (dashArray == null) { dashArray = [4, 4]; } var dx = x1 - x0; var dy = y1 - y0; var distance = Math.sqrt(Math.pow((x1 - x0), 2) + Math.pow((y1 - y0), 2)); var theta = Math.atan(dy / dx); if (dx < 0) { theta += Math.PI; } var i = 0; while (distance > 0) { var length = Math.min(distance, dashArray[i]); x0 += length * Math.cos(theta); y0 += length * Math.sin(theta); if (i % 2 == 0) { this.lineTo(x0, y0); } else { this.moveTo(x0, y0); } distance -= length; i = (i + 1) % dashArray.length; } }; // Formats a number using the current locale (to handle the 1000's separator). // The result is rounded so no decimal point is shown. function numberToLocaleString(value) { var localeString = Math.round(parseFloat(value + '')).toLocaleString(); return localeString.substring(0, localeString.indexOf('.')); } function padLeft(number, length) { var str = '' + number; while (str.length < length) { str = '0' + str; } return str; } // Returns the number of milliseconds between 2 date-times represented as strings. function msBetween(startTime, endTime) { return startTime > endTime ? msBetween(endTime, startTime) : parseDateTime(endTime) - parseDateTime(startTime); } var dateFormat = /(\d{4})-(\d{2})-(\d{2})[T](\d{2}):(\d{2}):(\d{2})/ // Parses a date-time string and returns a Date (i.e. number of milliseconds) function parseDateTime(value) { if (!value) { return 0; } var match = dateFormat.exec(value) if (!match) { return 0; } return Date.parse(match[1] + '/' + match[2] + '/' + match[3] + ' ' + match[4] + ':' + match[5] + ':' + match[6]) } // Parses just the date portion of a date-time string and returns a Date // (i.e. number of milliseconds) function parseDate(value) { if (!value) { return 0; } var match = dateFormat.exec(value) if (!match) { return 0; } return Date.parse(match[1] + '/' + match[2] + '/' + match[3]) } var durationFormat = /P((\d+)D)?T((\d+)H)?((\d+)M)?(\d+)S/ // Convert a string of the form P10DT1H15M40S to a count of milliseconds function parseDurationToMs(value) { var match = durationFormat.exec(value) if (!match) { return 0 } var days = parseInt(match[2] || '0'); var hrs = parseInt(match[4] || '0'); var mins = parseInt(match[6] || '0'); var secs = parseInt(match[7] || '0'); return ((((((days * 24) + hrs) * 60) + mins) * 60) + secs) * 1000; } // Converts milliseconds to days function msToDays(ms) { return (ms / 1000 / 60 / 60 / 24); } function daysToMs(days) { return (days * 24 * 60 * 60 * 1000); } // Formats a number of milliseconds as h:mm:ss function formatDurationMs(value) { var ms = parseInt(value); var secs = ms / 1000; var mins = secs / 60; var hrs = Math.floor(mins / 60); mins = Math.floor(mins % 60); secs = Math.floor(secs % 60); return hrs + ':' + padLeft(mins,2) + ':' + padLeft(secs,2); } // Converts a millisecond timestamp to a day and month string // Note: dayOffset is forward from date. function dateToDayAndMonth(ms, dayOffset) { var adjustedDate = new Date(ms + (dayOffset * 24 * 60 * 60 * 1000)); return padLeft(adjustedDate.getMonth() + 1, 2) + "-" + padLeft(adjustedDate.getDate(), 2); } // Takes a millisecond timestamp and returns a new millisecond timestamp // rounded down to the current day. function dateFloor(ms) { var dt = new Date(ms); return Date.parse(dt.getFullYear() + '/' + (dt.getMonth() + 1) + '/' + dt.getDate()); } Timegraph = { axisTop: 9.5, axisRight: 24.5, axisBottom: 25.5, axisLeft: 25.5, ticks: 10, // Maximum number of 24 hour ticks for showing 12 and 6 hour ticks ticks12Hour: 8, ticks6Hour: 4, // Shading shadingColor: "#d0d0d0", precompute: function (graph) { var canvas = graph.canvas; var data = graph.data; var min = 0; var max = 0; graph.height = canvas.height - Timegraph.axisTop - Timegraph.axisBottom; graph.width = canvas.width - Timegraph.axisLeft - Timegraph.axisRight; for (var i = 0; i < data.length; i++) { data[i].t0 = parseDateTime(data[i].x0); data[i].t1 = parseDateTime(data[i].x1); if (i == 0) { min = data[i].t0; max = data[i].t1; } if (data[i].t0 < min) { min = data[i].t0; } if (data[i].t1 > max) { max = data[i].t1; } data[i].yy0 = Timegraph.axisTop + graph.height - data[i].y0 * graph.height; data[i].yy1 = Timegraph.axisTop + graph.height - data[i].y1 * graph.height; } if (graph.startTime != null) { graph.startMs = parseDateTime(graph.startTime); } else { graph.startMs = min; } graph.endMs = max; graph.durationMs = max - min; }, drawFrame: function (graph) { var canvas = graph.canvas; var context = graph.context; graph.width = canvas.width - Timegraph.axisRight - Timegraph.axisLeft; graph.height = canvas.height - Timegraph.axisTop - Timegraph.axisBottom; context.beginPath(); context.moveTo(Timegraph.axisLeft, Timegraph.axisTop); context.lineTo(Timegraph.axisLeft + graph.width, Timegraph.axisTop); context.lineTo(Timegraph.axisLeft + graph.width, Timegraph.axisTop + graph.height); context.lineTo(Timegraph.axisLeft, Timegraph.axisTop + graph.height); context.lineTo(Timegraph.axisLeft, Timegraph.axisTop); context.strokeStyle = "#c0c0c0"; context.stroke(); }, drawRange: function (graph) { var canvas = graph.canvas; var context = graph.context; context.font = "12pt Segoe UI"; context.fillStyle = "#00b0f0"; context.fillText("%", 0, Timegraph.axisTop + 5, Timegraph.axisLeft); var tickSpacing = graph.height / 10; var offset = Timegraph.axisTop + tickSpacing; var tickValue = 90; for (var i = 0; i < 9; i++) { context.beginPath(); context.moveTo(Timegraph.axisLeft, offset); context.lineTo(Timegraph.axisLeft + graph.width, offset); context.stroke(); context.fillText(tickValue.toString(), 0, offset + 5, Timegraph.axisLeft); offset += tickSpacing; tickValue -= 10; } }, drawDomain: function (graph, start, end) { var canvas = graph.canvas; var context = graph.context; var data = graph.data; var duration = end - start; if ((end < start)) { return; } var startDay = dateFloor(start); var t0 = startDay; var t1 = dateFloor(end); var dayOffset = 0; if (start > t0) { t0 = t0 + daysToMs(1); dayOffset++; } if (t0 >= t1) { return; } var increment = Math.max(Math.floor((t1 - t0) / daysToMs(Timegraph.ticks)), 1); var incrementMs = daysToMs(increment); var spacing = (incrementMs / duration) * graph.width; var offset = (t0 - start) / duration; var ticksCount = Math.floor((t1 - t0) / incrementMs); for (offset = offset * graph.width + Timegraph.axisLeft; offset < (graph.width + Timegraph.axisLeft); offset += spacing) { context.beginPath(); context.moveTo(offset, Timegraph.axisTop); context.lineTo(offset, Timegraph.axisTop + graph.height); context.stroke(); context.fillText(dateToDayAndMonth(startDay, dayOffset), offset, Timegraph.axisTop + graph.height + 15, spacing); dayOffset += increment; } }, plot: function (graph, start, end) { var canvas = graph.canvas; var context = graph.context var data = graph.data; if ((end < start)) { return; } var duration = end - start; Timegraph.drawDomain(graph, start, end); context.fillStyle = Timegraph.shadingColor; for (var i = 0; i < data.length - 1; i++) { if ((data[i].t0 < start) || (data[i].t0 > end) || (data[i].t1 > end)) { continue; } var x1 = (data[i].t0 - start) / duration; x1 = x1 * graph.width + Timegraph.axisLeft; var x2 = (data[i].t1 - start) / duration; x2 = x2 * graph.width + Timegraph.axisLeft; context.globalAlpha = 0.3; context.fillRect(x1, Timegraph.axisTop, (x2 - x1), graph.height); context.globalAlpha = 1; context.beginPath(); context.strokeStyle = graph.lineTypes[data[i].type].color; context.lineWidth = 1.5; if (graph.lineTypes[data[i].type].dotted == 1) { context.dashedLine(x1, data[i].yy0, x2, data[i].yy1); } else { context.moveTo(x1, data[i].yy0); context.lineTo(x2, data[i].yy1); } context.stroke(); } }, draw: function (graph) { var canvas = document.getElementById(graph.element); if (canvas == null) { return; } var context = canvas.getContext('2d'); if (context == null) { return; } graph.width = 0; graph.height = 0; graph.context = context; graph.canvas = canvas; Timegraph.precompute(graph); Timegraph.drawFrame(graph); Timegraph.drawRange(graph); Timegraph.plot(graph, graph.startMs, graph.endMs); } }; Histogram = { // Constants yTicks: 10, axisLeft: 30.5, axisBottom: 25.5, paddingTop: 5, maxPadding: 25, barColor: "#1191c1", // Functions precompute: function (graph) { var canvas = graph.canvas; var bucketCount = 0; for (var i = 0; i < graph.data.length; i++) { if (graph.data[i].value > graph.max) { graph.max = graph.data[i].value; } bucketCount++; } if (graph.rangeMax != null) { graph.max = Math.max(graph.max, graph.rangeMax); } graph.bucketCount = bucketCount; graph.tickSpacing = (canvas.width - Histogram.axisLeft) / bucketCount; graph.height = canvas.height; graph.width = canvas.width; }, drawFrame: function (graph) { var context = graph.context; var canvas = graph.canvas; context.beginPath(); context.moveTo(Histogram.axisLeft, Histogram.paddingTop); context.lineTo(Histogram.axisLeft, canvas.height - Histogram.axisBottom); context.lineTo(canvas.width, canvas.height - Histogram.axisBottom); context.stroke(); }, drawDomain: function (graph) { var context = graph.context; var tickOffset = 0; context.font = "8pt Segoe UI"; context.fillStyle = "#00b0f0"; for (var i = 0; i < graph.bucketCount; i++) { context.fillText(graph.data[i].interval, Histogram.axisLeft + tickOffset + 2, graph.height - 10, graph.tickSpacing); tickOffset += graph.tickSpacing; } }, drawRange: function (graph) { var context = graph.context; var tickSpacing = (graph.height - Histogram.axisBottom - 25) / Histogram.yTicks; var tickIncrement = Math.round(graph.max / Histogram.yTicks); var tickOffset = graph.height - Histogram.axisBottom - tickSpacing; var tickValue = tickIncrement; context.font = "12pt Segoe UI"; context.fillStyle = "#00b0f0"; for (var i = 0; i < Histogram.yTicks; i++) { context.beginPath(); context.moveTo(Histogram.axisLeft, tickOffset); context.lineTo(Histogram.axisLeft + 5, tickOffset); context.stroke(); context.fillText(tickValue.toString(), 0, tickOffset + 5, Histogram.axisLeft); tickValue += tickIncrement; tickOffset -= tickSpacing; } }, plot: function (graph) { var tickOffset = 0; var context = graph.context; context.fillStyle = Histogram.barColor; for (var i = 0; i < graph.bucketCount; i++) { if (graph.data[i].value == 0) { tickOffset += graph.tickSpacing;; continue; } var barHeight = Math.round((graph.data[i].value * (graph.height - 50)) / graph.max); context.fillRect(Histogram.axisLeft + tickOffset + Histogram.paddingTop, graph.height - Histogram.axisBottom - barHeight, graph.tickSpacing - 10, barHeight); tickOffset += graph.tickSpacing; } }, draw: function (graph) { var canvas = document.getElementById(graph.element); if (canvas == null) { return; } var context = canvas.getContext("2d"); if (context == null) { return; } if (graph.data == null) { return; } graph.bucketCount = 0; graph.max = 0; graph.tickSpacing = 0; graph.width = 0; graph.height = 0; graph.context = context; graph.canvas = canvas; context.strokeStyle = "#c0c0c0"; Histogram.precompute(graph); Histogram.drawFrame(graph); Histogram.drawRange(graph); Histogram.drawDomain(graph); Histogram.plot(graph); } }; Collapser = { topActiveBlockerDivs: {}, detailsContainers: {}, getContainerBody: function (container) { var children = container.childNodes; var containerBody = null; for (var i = 0; i < children.length; i++) { if (children[i].tagName == "DIV" && (children[i].className == "analysis-body-collapsed" || children[i].className == "analysis-body")) { containerBody = children[i]; break; } } return containerBody; }, togglePanel: function (container) { var containerBody = Collapser.getContainerBody(container); if (containerBody == null) { return; } var heading = container.getElementsByTagName("H1")[0]; var expander = heading.getElementsByClassName("expander")[0]; if (containerBody.className == "analysis-body-collapsed") { containerBody.className = "analysis-body"; expander.innerHTML = "- "; } else { containerBody.className = "analysis-body-collapsed"; expander.innerHTML = "+ "; } }, toggleDetails: function (element) { if (element.className == "scenario-details-collapsed") { element.className = "scenario-details"; } else { element.className = "scenario-details-collapsed"; } }, initializePanels: function () { var elements = document.getElementsByClassName("analysis-container"); for (var i = 0; i < elements.length; i++) { var element = elements[i]; var heading = element.getElementsByTagName("h1")[0]; if (heading == null) { continue; } heading.onclick = function () { var container = this.parentNode; Collapser.togglePanel(container); }; } }, initializeDetails: function() { var elements = document.getElementsByClassName("details-expander"); for (var i = 0; i < elements.length; i++) { var element = elements[i]; var targetId = "details-" + element.id.replace("details-expand-", ""); var targetElement = document.getElementById(targetId); Collapser.detailsContainers[element.id] = targetElement; element.onclick = function () { var targetElement = Collapser.detailsContainers[this.id]; Collapser.toggleDetails(targetElement); }; } }, initializeLinks: function () { var links = document.getElementsByClassName("top-active-link"); for (var i = 0; i < links.length; i++) { var link = links[i]; var targetId = link.getAttribute("href").substring(1); var targetElement = document.getElementById(targetId); if (targetElement.tagName.toLowerCase() == "tr") { // tr, tbody, table, div.analysis-body-*, div.analysis-container Collapser.topActiveBlockerDivs[targetId] = targetElement.parentNode.parentNode.parentNode.parentNode; } else { Collapser.topActiveBlockerDivs[targetId] = targetElement; } link.onclick = function () { var targetId = this.getAttribute("href").substring(1); var targetContainer = Collapser.topActiveBlockerDivs[targetId]; var container = targetContainer; while ((container != null) && (container.tagName == "DIV")) { var containerBody = Collapser.getContainerBody(container); if (containerBody == null) { return; } if (containerBody.className == "analysis-body-collapsed") { Collapser.togglePanel(container); } container = container.parentNode.parentNode; } targetContainer.scrollIntoView(true); }; } }, initializeCollapser: function () { Collapser.initializePanels(); Collapser.initializeDetails(); TableDecorator.decorate({ element: ".top-blocker", withClass: "top-active-link" }); Collapser.initializeLinks(); }, initialize: function () { if (window.addEventListener != null) { window.addEventListener("load", Collapser.initializeCollapser, false); } else if (window.attachEvent != null) { window.attachEvent("onload", Collapser.initializeCollapser); } } }; TableDecorator = { decorateTable: function (table, linkClass) { if (table == null) { return; } var rows = table.getElementsByTagName("tr"); for (var i = 0; i < rows.length; i++) { var row = rows[i]; var anchor = row.getElementsByClassName("row-link")[0]; if (anchor == null || anchor.tagName.toLowerCase() != "a") { continue; } var link = anchor.getAttribute("href"); for (var j = 0; j < row.children.length; j++) { var cell = row.children[j]; if (cell == anchor.parentNode) { continue; } var classString = ""; if (linkClass != null) { classString = " class=\"" + linkClass + "\""; } cell.innerHTML = "<a href=\"" + link + "\"" + classString + ">" + cell.innerHTML + "</a>"; } } }, decorate: function (tableData) { var selection = tableData.element; if (selection.charAt(0) == ".") { var className = selection.substring(1); var elements = document.getElementsByClassName(className); for (var i = 0; i < elements.length; i++) { if (elements[i].tagName.toLowerCase() == "table") { TableDecorator.decorateTable(elements[i], tableData.withClass); } } } else if (selection.charAt(0) == "#") { var idName = selection.substring(1); var element = document.getElementById(idName); if (element.tagName.toLowerCase() == "table") { TableDecorator.decorateTable(element, tableData.withClass); } } }, }; function initializeScrollTop() { var elements = document.getElementsByClassName("scroll-top-button"); for (var i = 0; i < elements.length; i++) { var element = elements[i]; element.onclick = function () { window.scroll(0, 0); window.location.replace("#"); if (typeof window.history.replaceState == "function") { history.replaceState({}, "", window.location.href.slice(0, -1)); } } } } { x0: "", x1: "", y0: , y1: , type: 2 3 4 1 0 4 }, drainGraphData = [ ]; Histogram.draw({ element: "drips-histogram-", data: dripsBuckets_, rangeMax: 100 }); dripsBuckets_ = [ ]; { interval : " ", value : },

+

COMPUTER NAME
SYSTEM PRODUCT NAME
BIOS
OS BUILD
PLATFORM ROLE
REPORT TIME
 
Legend
GRAPH LINE DESCRIPTION
Dotted AC power
Solid Battery power
No line System powered off
Grey Active Scenario
Green Low System Activity
Orange Moderate System Activity
Red High System Activity
START TIME DURATION ENERGY CHANGE CHANGE RATE % LOW POWER STATE TIME
- - - - - - - -
row- #connected-standby-session- row-link % HW: % % HW: - % connected-standby-session-
Top

Connected Standby Session

row-
START TIME DURATION ENERGY CHANGE CHANGE RATE % LOW POWER STATE TIME
% HW: % % HW: - % details-expander details-expand-
scenario-details-collapsed details-
IR TRUNCATE PERCENTAGE %
NETWORKING IN STANDBY Connected Disconnected
ENERGY SAVER IN STANDBY OFF ON
SYSTEM GPU ADAPTER COUNT
PEP PRE-VETO COUNT
CS ENTER REASON
CS EXIT REASON
CS EXIT LATENCY [ms]
CS EXIT LATENCY PHASE BREAKDOWN [ms]
CS EXIT TIME SPENT IN RESILIENCY
CS EXIT TIME SPENT IN RESILIENCY NOTIFICATION
CS EXIT TIME SPENT IN LOW POWER EPOCH
CS EXIT TIME SPENT IN DAM
CS EXIT TIME SPENT IN MAINTENANCE
CS EXIT TIME SPENT IN PLM
CS EXIT TIME SPENT IN SHELL
CS EXIT TIME SPENT IN CONNECTION
CS EXIT TIME SPENT TURNING SCREEN ON
CS SESSION TIMEOUT VALUES [seconds]
TURN OFF DISPLAY AFTER TIMEOUT
CONSOLE LOCK DISPLAY OFF TIMEOUT
SLEEP AFTER TIMEOUT

DRIPS Histogram

Percent of time spent in DRIPS bucketed by time interval length
drips-histogram- 864 300

Top Offenders

Top 5 offenders, ranked by active time
NAME TYPE % ACTIVE TIME ACTIVE TIME
n/a n/a % row- #offender- top-active-link row-link Unknown

+

analysis-container analysis-

+ Processors

No processor activity reported.
analysis-container analysis- offender-

+

% ACTIVE TIME ACTIVE TIME
analysis-container analysis-

+ Activators

No activator activity reported.
analysis-container analysis- offender-

+

% ACTIVE TIME ACTIVE TIME
offender- row-
analysis-container analysis-

+ PDC Phases

PHASE % TIME TIME
analysis-container analysis-

+

analysis-container analysis-

+ Fx Devices

No device activity reported.
analysis-container analysis- offender-

+

% ACTIVE TIME ACTIVE TIME
COMPONENT % ACTIVE TIME ACTIVE TIME
3 row- No active components.
row-
analysis-container analysis- offender-

+ PEP Pre-Vetoes

No PEP pre-veto activity reported.
analysis-container analysis- offender-

+ SoC Subsystems

No SoC subsystem activity reported.
analysis-container analysis-

+ Other

analysis-container analysis- offender-

+

% ACTIVE TIME ACTIVE TIME

Srum Data

Data obtained from the SRUM database. * in Energy Estimation means the energy is from energy meter. Otherwise, it is from software model estimation.
analysis-container analysis-

+ Energy Meter

No energy meter data obtained.
Power Rail Energy (mJ) Power (mW)
row-info
analysis-container analysis-

+ Energy Estimation

No energy estimation data obtained.
APP ID TOTAL (mJ) CPU (mJ)* CPU (mJ) DISPLAY (mJ)* DISPLAY (mJ) DISK (mJ)* DISK (mJ) MBB (mJ)* MBB (mJ) NETWORK (mJ)* NETWORK (mJ) SOC (mJ)* SOC (mJ) LOSS (mJ) OTHER (mJ)
row-info []

Installed batteries

Information about each currently installed battery
No batteries are currently installed.
BATTERY
NAME
MANUFACTURER
SERIAL NUMBER
CHEMISTRY
DESIGN CAPACITY -
CAPACITY RATIO %
CYCLE COUNT
Sleep Study

Sleep Study

Connected Standby Transitions

Battery drains over the last days
Connected Standby transitions over the last days

Analysis Results

Analysis of issues that might cause poor battery life



- - mWh - mWh % of battery - - % - mW - % - endTime ? msBetween(endTime, startTime) : parseDateTime(endTime) - parseDateTime(startTime); } var dateFormat = /(\d{4})-(\d{2})-(\d{2})[T](\d{2}):(\d{2}):(\d{2})/ // Parses a date-time string and returns a Date (i.e. number of milliseconds) function parseDateTime(value) { if (!value) { return 0; } var match = dateFormat.exec(value) if (!match) { return 0; } return Date.parse(match[1] + '/' + match[2] + '/' + match[3] + ' ' + match[4] + ':' + match[5] + ':' + match[6]) } // Parses just the date portion of a date-time string and returns a Date (i.e. number of milliseconds) function parseDate(value) { if (!value) { return 0; } var match = dateFormat.exec(value) if (!match) { return 0; } return Date.parse(match[1] + '/' + match[2] + '/' + match[3]) } var durationFormat = /P((\d+)D)?T((\d+)H)?((\d+)M)?(\d+)S/ // Convert a string of the form P10DT1H15M40S to a count of milliseconds function parseDurationToMs(value) { var match = durationFormat.exec(value) if (!match) { return 0 } var days = parseInt(match[2] || '0'); var hrs = parseInt(match[4] || '0'); var mins = parseInt(match[6] || '0'); var secs = parseInt(match[7] || '0'); return ((((((days * 24) + hrs) * 60) + mins) * 60) + secs) * 1000; } // Formats a number of milliseconds as h:mm:ss function formatDurationMs(value) { var ms = parseInt(value); var secs = ms / 1000; var mins = secs / 60; var hrs = Math.floor(mins / 60); mins = Math.floor(mins % 60); secs = Math.floor(secs % 60); return hrs + ':' + padLeft(mins,2) + ':' + padLeft(secs,2); } // Converts a string representing a date time to a day and month string function dateToDayAndMonth(date, dayOffset) { var adjustedDate = new Date(parseDate(date) - (dayOffset * 24 * 60 * 60 * 1000)); return padLeft(adjustedDate.toLocaleDateString()); } // Format Charge and Drain strings that sometimes reflect extra text // for special cases around transitioning from CS to S4/S5 due to: // - transitioning to S4 due to a critically low battery, // - transitioning to S4 or S5 due to a thermal condition, // - doze to S4 after a specified duration in CS. function createChargeDrainString(onAc, scenarioStopReason) { var _onAc = parseInt(onAc); // BOOLEAN var _scenarioStopReason = parseInt(scenarioStopReason); // SLEEPSTUDY_SPM_SCENARIO_STOP_REASON var str; if (_onAc) { str = 'Charge'; } else { str = 'Drain'; } if (_scenarioStopReason == 1) { // PolicyDeviceThermalZone str = str + ' (thermal)'; } else if (_scenarioStopReason == 2) { // PolicyDeviceBattery str = str + ' (critical battery)'; } else if (_scenarioStopReason == 6) { // PolicyImmediateDozeS4 str = str + ' (dozed to hibernate)'; } else if (_scenarioStopReason == 11) { // PolicyImmediateDozeS4Predicted str = str + ' (dozed to hibernate because the user was predicted to be away)'; } else if (_scenarioStopReason == 12) { // PolicyImmediateDozeS4PredictedNoWake str = str + ' (dozed to hibernate because the user was predicted to be away)'; } else if (_scenarioStopReason == 13) { // PolicyImmediateDozeS4AdaptiveBudget str = str + ' (dozed to hibernate because the standby battery budget was exceeded)'; } else if (_scenarioStopReason == 14) { // PolicyImmediateDozeS4AdaptiveReserveNoWake str = str + ' (dozed to hibernate because the reserve battery level was reached)'; } else if (_scenarioStopReason == 16) { // SpmScenarioStopReasonUnspecified str = str + ' (unspecified sleep reason)'; } else if (_scenarioStopReason == 17) { // SpmScenarioStopReasonCsExit str = str; // nop } else { str = str + ' (unrecognized sleep reason ' + _scenarioStopReason + ')'; } return str; } ]]>
PADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDING