66
77#include <zephyr/kernel.h>
88#include <zephyr/logging/log.h>
9+ #include <zephyr/zbus/zbus.h>
910#include <zephyr/drivers/sensor.h>
1011#include <zephyr/drivers/sensor/npm13xx_charger.h>
1112#include <nrf_fuel_gauge.h>
1213
14+ #include "app_common.h"
15+ #include "battery.h"
1316#include "lp803448_model.h"
1417
1518LOG_MODULE_REGISTER (battery , CONFIG_APP_BATTERY_LOG_LEVEL );
@@ -20,12 +23,33 @@ LOG_MODULE_REGISTER(battery, CONFIG_APP_BATTERY_LOG_LEVEL);
2023#define CHG_STATUS_CC_MASK BIT(3)
2124#define CHG_STATUS_CV_MASK BIT(4)
2225
23- #define SAMPLE_INTERVAL K_SECONDS(CONFIG_APP_BATTERY_SAMPLE_INTERVAL_SECONDS)
26+ ZBUS_CHAN_DEFINE (battery_chan ,
27+ struct battery_msg ,
28+ NULL ,
29+ NULL ,
30+ ZBUS_OBSERVERS_EMPTY ,
31+ ZBUS_MSG_INIT (0 ));
2432
25- static const struct device * const charger = DEVICE_DT_GET ( DT_NODELABEL ( npm1300_charger ) );
33+ ZBUS_MSG_SUBSCRIBER_DEFINE ( battery );
2634
27- static int read_sensors (float * voltage , float * current , float * temp , int32_t * chg_status ,
28- bool * vbus )
35+ #define CHANNEL_LIST (X ) X(battery_chan, struct battery_msg)
36+
37+ #define MAX_MSG_SIZE MAX_MSG_SIZE_FROM_LIST(CHANNEL_LIST)
38+
39+ #define ADD_OBSERVERS (_chan , _type ) ZBUS_CHAN_ADD_OBS(_chan, battery, 0);
40+
41+ CHANNEL_LIST (ADD_OBSERVERS )
42+
43+ static int read_sensors (const struct device * charger , float * voltage , float * current ,
44+ float * temp , int32_t * chg_status , bool * vbus );
45+ static void update_charge_state (int32_t chg_status , int32_t * prev );
46+ static int fuel_gauge_setup (const struct device * charger );
47+ static void battery_sample (const struct device * charger , int64_t * ref_time ,
48+ int32_t * prev_chg_status );
49+ static void battery_thread (void );
50+
51+ static int read_sensors (const struct device * charger , float * voltage , float * current ,
52+ float * temp , int32_t * chg_status , bool * vbus )
2953{
3054 int err ;
3155 struct sensor_value val = {0 };
@@ -96,15 +120,15 @@ static void update_charge_state(int32_t chg_status, int32_t *prev)
96120 & ext );
97121}
98122
99- static int fuel_gauge_setup (void )
123+ static int fuel_gauge_setup (const struct device * charger )
100124{
101125 int err ;
102126 int32_t chg_status ;
103127 bool vbus ;
104128 struct nrf_fuel_gauge_init_parameters params = { .model = & battery_model };
105129 struct sensor_value desired ;
106130
107- err = read_sensors (& params .v0 , & params .i0 , & params .t0 , & chg_status , & vbus );
131+ err = read_sensors (charger , & params .v0 , & params .i0 , & params .t0 , & chg_status , & vbus );
108132 if (err ) {
109133 return err ;
110134 }
@@ -139,55 +163,69 @@ static int fuel_gauge_setup(void)
139163/* Owns the fuel gauge: init once, then keep it fed. Memfault reads SoC/SoH via
140164 * nrf_fuel_gauge_soc_get()/soh_get() on its own heartbeat.
141165 */
166+ static void battery_sample (const struct device * charger , int64_t * ref_time ,
167+ int32_t * prev_chg_status )
168+ {
169+ int err ;
170+ float voltage ;
171+ float current ;
172+ float temp ;
173+ float soc ;
174+ int32_t chg_status ;
175+ bool vbus ;
176+
177+ err = read_sensors (charger , & voltage , & current , & temp , & chg_status , & vbus );
178+ if (err ) {
179+ LOG_WRN ("read_sensors, error: %d" , err );
180+ return ;
181+ }
182+
183+ (void )nrf_fuel_gauge_ext_state_update (
184+ vbus ? NRF_FUEL_GAUGE_EXT_STATE_INFO_VBUS_CONNECTED
185+ : NRF_FUEL_GAUGE_EXT_STATE_INFO_VBUS_DISCONNECTED , NULL );
186+ update_charge_state (chg_status , prev_chg_status );
187+
188+ float delta = (float )k_uptime_delta (ref_time ) / 1000.0f ;
189+
190+ err = nrf_fuel_gauge_process (voltage , current , temp , delta , & soc , NULL );
191+ if (err ) {
192+ LOG_WRN ("nrf_fuel_gauge_process, error: %d" , err );
193+ return ;
194+ }
195+
196+ LOG_DBG ("SoC %d%%, %d mV, %s" , (int )soc , (int )(voltage * 1000 ),
197+ vbus ? "VBUS" : "battery" );
198+ }
199+
142200static void battery_thread (void )
143201{
144202 int err ;
203+ const struct zbus_channel * chan ;
204+ uint8_t msg_buf [MAX_MSG_SIZE ];
145205 int64_t ref_time ;
146206 int32_t prev_chg_status = -1 ;
207+ const struct device * const charger = DEVICE_DT_GET (DT_NODELABEL (npm1300_charger ));
147208
148209 if (!device_is_ready (charger )) {
149210 LOG_ERR ("Charger device not ready" );
150211 return ;
151212 }
152213
153- err = fuel_gauge_setup ();
214+ err = fuel_gauge_setup (charger );
154215 if (err ) {
155216 LOG_ERR ("fuel_gauge_setup, error: %d" , err );
156217 return ;
157218 }
158219 ref_time = k_uptime_get ();
159220
160221 while (true) {
161- float voltage ;
162- float current ;
163- float temp ;
164- float soc ;
165- int32_t chg_status ;
166- bool vbus ;
167-
168- k_sleep (SAMPLE_INTERVAL );
169-
170- err = read_sensors (& voltage , & current , & temp , & chg_status , & vbus );
171- if (err ) {
172- LOG_WRN ("read_sensors, error: %d" , err );
173- continue ;
174- }
175-
176- (void )nrf_fuel_gauge_ext_state_update (
177- vbus ? NRF_FUEL_GAUGE_EXT_STATE_INFO_VBUS_CONNECTED
178- : NRF_FUEL_GAUGE_EXT_STATE_INFO_VBUS_DISCONNECTED , NULL );
179- update_charge_state (chg_status , & prev_chg_status );
180-
181- float delta = (float )k_uptime_delta (& ref_time ) / 1000.0f ;
182-
183- err = nrf_fuel_gauge_process (voltage , current , temp , delta , & soc , NULL );
222+ err = zbus_sub_wait_msg (& battery , & chan , msg_buf , K_FOREVER );
184223 if (err ) {
185- LOG_WRN ( "nrf_fuel_gauge_process , error: %d" , err );
186- continue ;
224+ LOG_ERR ( "zbus_sub_wait_msg , error: %d" , err );
225+ return ;
187226 }
188227
189- LOG_DBG ("SoC %d%%, %d mV, %s" , (int )soc , (int )(voltage * 1000 ),
190- vbus ? "VBUS" : "battery" );
228+ battery_sample (charger , & ref_time , & prev_chg_status );
191229 }
192230}
193231
0 commit comments