Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
85 commits
Select commit Hold shift + click to select a range
31ee748
Add npm1012 device
kopuu1 Nov 24, 2025
b396a92
npm1012: Add minimal set of unit test
kopuu1 Nov 26, 2025
6517761
npm1012/tests/exportImport.test.ts: Add file
kopuu1 Nov 26, 2025
f8ec8fe
npm1012: Copy over charger module from 1300
kopuu1 Dec 2, 2025
33195cd
npm1012: Add the charger module to the device
kopuu1 Dec 3, 2025
fc8a7d8
npm/types/charger: Add vTricklefast and optional iTrickle for 1012
kopuu1 Dec 4, 2025
e5df614
npm1012/charger: Add iTrickle command support
kopuu1 Dec 4, 2025
ea404b2
PowerCard: Add optional iTrickle dropdown
kopuu1 Dec 4, 2025
3daaf1d
npm/types/charger: Remove abstract from optional methods
kopuu1 Dec 10, 2025
618ad20
npm/types/charger: Change current range type in ChargerModuleRanges t…
kopuu1 Dec 10, 2025
3835216
npm1012/charger: Modify VTerm range
kopuu1 Dec 10, 2025
5c633d5
npm/pmicHelpers: Update 1012 USB id's
kopuu1 Dec 10, 2025
be18f62
npm1012/tests/helpers: Fix number of GPIO's
kopuu1 Dec 10, 2025
a6a3edb
npm1012: Disable generateOverlay() for now
kopuu1 Dec 10, 2025
45fb83d
deviceSetups: Remove useless comment from npm1012DeviceSetup
kopuu1 Dec 10, 2025
9a379ee
Revert "npm/types/charger: Change current range type in ChargerModule…
kopuu1 Dec 11, 2025
dd8ebaa
utils/helpers: Add RangeOrNumberArray type with helper functions
kopuu1 Dec 11, 2025
b992176
npm/types/charger: Change current range type to RangeOrNumberArray
kopuu1 Dec 11, 2025
68c8d4e
npm1012/charger: Modify current range
kopuu1 Dec 11, 2025
2f249e5
utils/helpers: Add few improvements
kopuu1 Dec 11, 2025
b9506b1
npm/types/charger: Add optional enableWeakBatteryCharging
kopuu1 Dec 11, 2025
0dc47ad
npm1012/charger: Add support for enabledWeakBatteryCharging, remove b…
kopuu1 Dec 11, 2025
e3ad8e6
PowerCard: Add optional enableWeakBatteryCharging
kopuu1 Dec 11, 2025
572a58a
npm/types/charger: Add optional vWeak
kopuu1 Dec 12, 2025
d52d5e2
npm1012/charger: Add support for vWeak
kopuu1 Dec 12, 2025
39e1f9c
PowerCard: Add optional vWeak
kopuu1 Dec 12, 2025
dfbddf4
npm1012/charger: Add missing callbacks
kopuu1 Dec 12, 2025
95eaf79
Charger/Jeita.tsx: Add external label control
kopuu1 Dec 15, 2025
bab7fce
Charger/Charger.tsx: Increase MasonryLayout minWidth
kopuu1 Dec 15, 2025
3faadc2
npm1012/charger: Add default jeita labels
kopuu1 Dec 15, 2025
6c44502
npm130x/charger: Add default jeita labels
kopuu1 Dec 15, 2025
1606ebe
npm2100/charger: Add default jeita labels
kopuu1 Dec 15, 2025
ac9a56c
npm/types/charger: Require iChg input parameter for getting values.iT…
kopuu1 Dec 16, 2025
65bbfe9
npm1012/charger: Add getITrickleValues() with iChg as input parameter
kopuu1 Dec 16, 2025
bbf3d69
charger/PowerCard: Get iTrickle values using iChg as input parameter
kopuu1 Dec 16, 2025
339787f
npm/types: Add iChgCool, iChgWarm, vTermCool, vTermWarm
kopuu1 Dec 17, 2025
5678478
npm/types: Add enableAdvancedChargingProfile and enableNtcMonitoring
kopuu1 Dec 17, 2025
8da7ac3
npm1012/charger: Add iChgCool, iChgWarm, vTermCool, vTermWarm
kopuu1 Dec 17, 2025
9df5101
npm1012/charger: Add enableAdvancedChargingProfile and enableNtcMonit…
kopuu1 Dec 17, 2025
0b5141d
Charger/Jeita.tsx: Add support for advanced charging profile
kopuu1 Dec 17, 2025
5fa1219
Charger/Jeita.tsx: Add option to disable number input for temperature
kopuu1 Dec 18, 2025
62ec8ae
npm/types: Add types and methods for battery life and safety card
kopuu1 Dec 19, 2025
e23902c
npm1012/charger: Add functionality for battery life and safety card
kopuu1 Dec 19, 2025
1c9fc08
Charger: Add battery life and safety card
kopuu1 Dec 19, 2025
830ee83
npm1012/charger: Move iTrickle values get method
kopuu1 Dec 19, 2025
bb562c8
npm/types/charger: Add iChg as an optional parameter for charger.valu…
kopuu1 Jan 8, 2026
ee68c72
npm1012/charger: Fix iTerm values in get values()
kopuu1 Jan 8, 2026
91704b7
npm130x/charger: Change get values.iTerm return to have iChg parameter
kopuu1 Jan 8, 2026
01a417f
PowerCard.tsx: Use iChg as a parameter for getting iTerm values
kopuu1 Jan 8, 2026
43bb32d
ConfigurationDialog.tsx: Use iChg as a parameter for getting iTerm va…
kopuu1 Jan 8, 2026
be2ca7f
npm1012/charger/getters.ts: Add missing vWeak() call from all()
kopuu1 Jan 8, 2026
5a3bd70
npm/types/charger: Add jeita labels
kopuu1 Dec 15, 2025
edc5379
PowerCard.tsx: Remove 'Charging Below Vbatlow' toggle
kopuu1 Jan 8, 2026
4970783
npm1012/charger/setters: Remove unneeded undefined check for functions
kopuu1 Jan 12, 2026
372f7f6
npm/types/charger: Make ntcBeta and ntcThermistor optional
kopuu1 Jan 12, 2026
e355c6a
Charger/Jeita.tsx: Handle nTCBeta and nTCThermistor as optional
kopuu1 Jan 12, 2026
c499de9
ChecklistDialog.tsx: Handle set.nTCThermistor() as optional
kopuu1 Jan 12, 2026
47a22ac
npm130x/charger: Handle methods for nTC Beta and Thermistor as optional
kopuu1 Jan 12, 2026
20df8da
npm1012/charger: Remove unused code for ntc beta and thermistor
kopuu1 Jan 12, 2026
8d32c56
npm1012/charger: Add missing commands for advanced charging profile
kopuu1 Jan 12, 2026
51e38f6
npm/types/charger: Add missing get commands for advanced charging pro…
kopuu1 Jan 12, 2026
b67123e
npm1012/charger: Remove unneeded disabling of charging before sending…
kopuu1 Jan 12, 2026
b1d4969
npm1012/charger/setters: Remove unneeded undefined check for functions
kopuu1 Jan 13, 2026
2ea1ebc
npm1012/charger: Keep type as RangeType for values
kopuu1 Jan 13, 2026
83d39c3
npm/types/charger: Make tChgStop optional, add tChgReduce
kopuu1 Jan 14, 2026
49b52af
npm130x/charger: Handle tChgStop as optional
kopuu1 Jan 14, 2026
588d87c
npm1012/charger: Add methods for tChgReduce, remove tChgStop
kopuu1 Jan 15, 2026
b002ece
Charger/ThermalRegulation.tsx: Add tChgReduce
kopuu1 Jan 15, 2026
1fbc70d
npm1012/charger: Add callback for tChgReduce
kopuu1 Jan 15, 2026
4bb8f49
npm1012/charger: Update shell commands
kopuu1 Feb 10, 2026
04111fb
pmic1012Device.tsx: Fix initial FW version
kopuu1 Feb 12, 2026
33cc15a
npm/types/charger: Make vTermR optional
kopuu1 Feb 12, 2026
d28de04
Jeita.tsx: Handle vTermR as optional
kopuu1 Feb 12, 2026
ddf6fbb
npm130x/charger: Handle vTermR as optional
kopuu1 Feb 12, 2026
5318e13
npm1300/overlay: Handle vTermR as optional
kopuu1 Feb 12, 2026
4585316
Merge branch 'update_thermal_regulation_card' into add_npm1012_support
kopuu1 Feb 13, 2026
284afe7
Merge branch 'add_battery_life_and_safety_card' into add_npm1012_support
kopuu1 Feb 13, 2026
0c5252b
useNpmDevice.tsx: Fix hiding the "System Features" tab if not a suppo…
kopuu1 Feb 6, 2026
ae7176b
BatteryLifeAndSafety.tsx: Add toggle for enableBatteryDischargeCurren…
kopuu1 Feb 18, 2026
227308c
npm1012/charger: Add tests
kopuu1 Feb 18, 2026
10a90c0
DeviceSelector.tsx: Add support for npm1012
kopuu1 Feb 12, 2026
ec08bee
package.json: Update nrfutil device version
kopuu1 Feb 20, 2026
8ab7c5e
PowerCard.tsx: Move iTrickle, vWeak and weakBatteryCharging under def…
kopuu1 Feb 20, 2026
c37482a
pmic1012Device.tsx: Override startAdcSample() in BaseNpmDevice
kopuu1 Feb 20, 2026
b08cbce
npm1012/tests: Update requestUpdates test
kopuu1 Feb 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
"nrfConnectForDesktop": {
"nrfutil": {
"device": [
"2.12.8"
"2.17.1"
],
"npm": [
"0.3.1"
Expand Down
7 changes: 6 additions & 1 deletion src/components/Battery/BatteryStatus.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {
getPmicChargingState,
isReceivingBatteryVoltageAboveThreshold,
} from '../../features/pmicControl/pmicControlSlice';
import { getMaxNumDecimalsForRangeOrNumberArray } from '../../utils/helpers';

import './battery.scss';

Expand Down Expand Up @@ -81,7 +82,11 @@ export default ({ disabled }: { disabled: boolean }) => {
latestAdcSample.iBat ?? 0,
).toFixed(
npmDevice?.chargerModule?.ranges.current
.decimals ?? 0,
? getMaxNumDecimalsForRangeOrNumberArray(
npmDevice?.chargerModule?.ranges
.current,
)
: 0,
)} mA`
: 'N/A'
}
Expand Down
283 changes: 283 additions & 0 deletions src/components/Cards/Battery/BatteryLifeAndSafety.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,283 @@
/*
* Copyright (c) 2025 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
*/

import React from 'react';
import {
Card,
Dropdown,
Toggle,
} from '@nordicsemiconductor/pc-nrfconnect-shared';

import { DocumentationTooltip } from '../../../features/pmicControl/npm/documentation/documentation';
import {
Charger,
ChargerModule,
} from '../../../features/pmicControl/npm/types';

export default ({
chargerModule,
charger,
disabled,
}: {
chargerModule: ChargerModule;
charger: Charger;
disabled: boolean;
}) => (
<Card
title={
<div className="tw-flex tw-justify-between">
<DocumentationTooltip
card="battery"
item="BatteryLifeAndSafety"
>
<span>Battery Life and Safety</span>
</DocumentationTooltip>
</div>
}
>
<>
<ChargeCurrentThrottling
chargerModule={chargerModule}
charger={charger}
disabled={disabled}
/>
{charger.enableBatteryDischargeCurrentLimit !== undefined && (
<Toggle
label={
<DocumentationTooltip
card="battery"
item="BatteryDischargeCurrentLimit"
>
<span>Enable Battery Discharge Current Limit</span>
</DocumentationTooltip>
}
isToggled={charger.enableBatteryDischargeCurrentLimit}
disabled={disabled}
onToggle={enabled =>
chargerModule.set.enableBatteryDischargeCurrentLimit?.(
enabled,
)
}
/>
)}
<VBatLow
chargerModule={chargerModule}
charger={charger}
disabled={disabled}
/>
<TimeOut
chargerModule={chargerModule}
charger={charger}
disabled={disabled}
/>
</>
</Card>
);

const ChargeCurrentThrottling = ({
chargerModule,
charger,
disabled,
}: {
chargerModule: ChargerModule;
charger: Charger;
disabled: boolean;
}) => {
if (
charger.enableChargeCurrentThrottling === undefined ||
chargerModule.values.vThrottle === undefined ||
chargerModule.values.iThrottle === undefined
) {
return null;
}

// convert string values to react nodes
const vThrottleValues = chargerModule.values.vThrottle.map(item => ({
label: (
<>
<span>V</span>
<span className="subscript">TERM</span> - {item.label}
</>
),
value: item.value,
}));

return (
<>
<Toggle
label={
<DocumentationTooltip
card="battery"
item="ChargeCurrentThrottling"
>
<span>Enable Charge Current Throttling</span>
</DocumentationTooltip>
}
isToggled={charger.enableChargeCurrentThrottling}
disabled={disabled}
onToggle={enabled =>
chargerModule.set.enableChargeCurrentThrottling?.(enabled)
}
/>
<Dropdown
label={
<DocumentationTooltip card="battery" item="VThrottle">
<>
<span>V</span>
<span className="subscript">THROTTLE</span>
</>
</DocumentationTooltip>
}
items={vThrottleValues}
onSelect={item => chargerModule.set.vThrottle?.(item.value)}
selectedItem={
vThrottleValues.find(
item => item.value === charger.vThrottle,
) ?? vThrottleValues[0]
}
disabled={disabled}
/>
<Dropdown
label={
<DocumentationTooltip card="battery" item="IThrottle">
<>
<span>I</span>
<span className="subscript">THROTTLE</span>
</>
</DocumentationTooltip>
}
items={chargerModule.values.iThrottle}
onSelect={item => chargerModule.set.iThrottle?.(item.value)}
selectedItem={
chargerModule.values.iThrottle.find(
item => item.value === charger.iThrottle,
) ?? chargerModule.values.iThrottle[0]
}
disabled={disabled}
/>
</>
);
};

const VBatLow = ({
chargerModule,
charger,
disabled,
}: {
chargerModule: ChargerModule;
charger: Charger;
disabled: boolean;
}) => {
const enableToggle = (
<Toggle
label={
<DocumentationTooltip
card="battery"
item="ChargeCurrentThrottling"
>
<>
<span>Enable Charging Below V</span>
<span className="subscript">BATLOW</span>
</>
</DocumentationTooltip>
}
isToggled={charger.enableVBatLow}
disabled={disabled}
onToggle={enabled => chargerModule.set.enabledVBatLow?.(enabled)}
/>
);

if (
charger.vBatLow === undefined ||
chargerModule.values.vBatLow === undefined
) {
return enableToggle; // No control available for VBatLow, show only the enable toggle
}

return (
<>
{enableToggle}
<Dropdown
label={
<DocumentationTooltip card="battery" item="VBatLow">
<>
<span>V</span>
<span className="subscript">BATLOW</span>
</>
</DocumentationTooltip>
}
items={chargerModule.values.vBatLow}
onSelect={item => chargerModule.set.vBatLow?.(item.value)}
selectedItem={
chargerModule.values.vBatLow.find(
item => item.value === charger.vBatLow,
) ?? chargerModule.values.vBatLow[0]
}
disabled={disabled}
/>
</>
);
};

const TimeOut = ({
chargerModule,
charger,
disabled,
}: {
chargerModule: ChargerModule;
charger: Charger;
disabled: boolean;
}) => {
if (
charger.tOutCharge === undefined ||
charger.tOutTrickle === undefined ||
chargerModule.values.tOutCharge === undefined ||
chargerModule.values.tOutTrickle === undefined
) {
return null;
}

return (
<>
<Dropdown
label={
<DocumentationTooltip card="battery" item="TOutTrickle">
<>
<span>T</span>
<span className="subscript">OUTTRICKLE</span>
</>
</DocumentationTooltip>
}
items={chargerModule.values.tOutTrickle}
onSelect={item => chargerModule.set.tOutTrickle?.(item.value)}
selectedItem={
chargerModule.values.tOutTrickle.find(
item => item.value === charger.tOutTrickle,
) ?? chargerModule.values.tOutTrickle[0]
}
disabled={disabled}
/>
<Dropdown
label={
<DocumentationTooltip card="battery" item="TOutCharge">
<>
<span>T</span>
<span className="subscript">OUTCHARGE</span>
</>
</DocumentationTooltip>
}
items={chargerModule.values.tOutCharge}
onSelect={item => chargerModule.set.tOutCharge?.(item.value)}
selectedItem={
chargerModule.values.tOutCharge.find(
item => item.value === charger.tOutCharge,
) ?? chargerModule.values.tOutCharge[0]
}
disabled={disabled}
/>
</>
);
};
Loading