@@ -26,17 +26,13 @@ LOG_MODULE_REGISTER(battery, CONFIG_APP_BATTERY_LOG_LEVEL);
26
26
ZBUS_MSG_SUBSCRIBER_DEFINE (battery );
27
27
28
28
/* Observe channels */
29
- ZBUS_CHAN_ADD_OBS (TRIGGER_CHAN , battery , 0 );
30
- ZBUS_CHAN_ADD_OBS (NETWORK_CHAN , battery , 0 );
31
- ZBUS_CHAN_ADD_OBS (TIME_CHAN , battery , 0 );
29
+ ZBUS_CHAN_ADD_OBS (BATTERY_CHAN , battery , 0 );
32
30
33
- #define MAX_MSG_SIZE \
34
- (MAX(sizeof(enum trigger_type), \
35
- (MAX(sizeof(struct network_msg), sizeof(enum time_status)))))
31
+ #define MAX_MSG_SIZE sizeof(struct battery_msg)
36
32
37
33
BUILD_ASSERT (CONFIG_APP_BATTERY_WATCHDOG_TIMEOUT_SECONDS >
38
- CONFIG_APP_BATTERY_EXEC_TIME_SECONDS_MAX ,
39
- "Watchdog timeout must be greater than maximum execution time" );
34
+ CONFIG_APP_BATTERY_EXEC_TIME_SECONDS_MAX ,
35
+ "Watchdog timeout must be greater than maximum execution time" );
40
36
41
37
/* nPM1300 register bitmasks */
42
38
@@ -50,20 +46,17 @@ BUILD_ASSERT(CONFIG_APP_BATTERY_WATCHDOG_TIMEOUT_SECONDS >
50
46
static const struct device * charger = DEVICE_DT_GET (DT_NODELABEL (npm1300_charger ));
51
47
52
48
/* Forward declarations */
53
- static struct s_object s_obj ;
54
49
static int charger_read_sensors (float * voltage , float * current , float * temp , int32_t * chg_status );
55
50
static void sample (int64_t * ref_time );
56
51
57
52
/* State machine */
58
53
59
54
/* Defininig the module states.
60
55
*
61
- * STATE_INIT: The battery module is initializing and waiting for time to be available.
62
- * STATE_SAMPLING: The battery module is ready to sample upon receiving a trigger.
56
+ * STATE_RUNNING: The battery module is initializing and waiting battery percentage to be requested.
63
57
*/
64
58
enum battery_module_state {
65
- STATE_INIT ,
66
- STATE_SAMPLING ,
59
+ STATE_RUNNING ,
67
60
};
68
61
69
62
/* User defined state object.
@@ -84,25 +77,18 @@ struct s_object {
84
77
};
85
78
86
79
/* Forward declarations of state handlers */
87
- static void state_init_entry (void * o );
88
- static void state_init_run (void * o );
89
- static void state_sampling_run (void * o );
80
+ static void state_running_entry (void * o );
81
+ static void state_running_run (void * o );
90
82
91
83
static struct s_object battery_state_object ;
92
84
static const struct smf_state states [] = {
93
- [STATE_INIT ] =
94
- SMF_CREATE_STATE (state_init_entry , state_init_run , NULL ,
95
- NULL , /* No parent state */
96
- NULL ), /* No initial transition */
97
- [STATE_SAMPLING ] =
98
- SMF_CREATE_STATE (NULL , state_sampling_run , NULL ,
99
- NULL ,
100
- NULL ),
85
+ [STATE_RUNNING ] =
86
+ SMF_CREATE_STATE (state_running_entry , state_running_run , NULL , NULL , NULL ),
101
87
};
102
88
103
89
/* State handlers */
104
90
105
- static void state_init_entry (void * o )
91
+ static void state_running_entry (void * o )
106
92
{
107
93
int err ;
108
94
struct sensor_value value ;
@@ -142,30 +128,15 @@ static void state_init_entry(void *o)
142
128
}
143
129
}
144
130
145
- static void state_init_run (void * o )
131
+ static void state_running_run (void * o )
146
132
{
147
133
struct s_object * state_object = o ;
148
134
149
- if (& TIME_CHAN == state_object -> chan ) {
150
- enum time_status time_status = MSG_TO_TIME_STATUS (state_object -> msg_buf );
135
+ if (& BATTERY_CHAN == state_object -> chan ) {
136
+ struct battery_msg msg = MSG_TO_BATTERY_MSG (state_object -> msg_buf );
151
137
152
- if (time_status == TIME_AVAILABLE ) {
153
- LOG_DBG ("Time available, sampling can start" );
154
-
155
- STATE_SET (battery_state_object , STATE_SAMPLING );
156
- }
157
- }
158
- }
159
-
160
- static void state_sampling_run (void * o )
161
- {
162
- struct s_object * state_object = o ;
163
-
164
- if (& TRIGGER_CHAN == state_object -> chan ) {
165
- enum trigger_type trigger_type = MSG_TO_TRIGGER_TYPE (state_object -> msg_buf );
166
-
167
- if (trigger_type == TRIGGER_DATA_SAMPLE ) {
168
- LOG_DBG ("Data sample trigger received, getting battery data" );
138
+ if (msg .type == BATTERY_PERCENTAGE_SAMPLE_REQUEST ) {
139
+ LOG_DBG ("Battery percentage sample request received, getting battery data" );
169
140
sample (& state_object -> fuel_gauge_ref_time );
170
141
}
171
142
}
@@ -209,13 +180,6 @@ static void sample(int64_t *ref_time)
209
180
float temp ;
210
181
float state_of_charge ;
211
182
float delta ;
212
- int64_t system_time ;
213
-
214
- err = date_time_now (& system_time );
215
- if (err ) {
216
- LOG_ERR ("Failed to convert uptime to unix time, error: %d" , err );
217
- return ;
218
- }
219
183
220
184
err = charger_read_sensors (& voltage , & current , & temp , & chg_status );
221
185
if (err ) {
@@ -235,7 +199,17 @@ static void sample(int64_t *ref_time)
235
199
LOG_DBG ("State of charge: %f" , (double )roundf (state_of_charge ));
236
200
LOG_DBG ("The battery is %s" , charging ? "charging" : "not charging" );
237
201
238
- /* No further use of the battery data is implemented */
202
+ struct battery_msg msg = {
203
+ .type = BATTERY_PERCENTAGE_SAMPLE_RESPONSE ,
204
+ .percentage = (double )roundf (state_of_charge )
205
+ };
206
+
207
+ err = zbus_chan_pub (& BATTERY_CHAN , & msg , K_NO_WAIT );
208
+ if (err ) {
209
+ LOG_ERR ("zbus_chan_pub, error: %d" , err );
210
+ SEND_FATAL_ERROR ();
211
+ return ;
212
+ }
239
213
}
240
214
241
215
static void task_wdt_callback (int channel_id , void * user_data )
@@ -258,7 +232,7 @@ static void battery_task(void)
258
232
259
233
task_wdt_id = task_wdt_add (wdt_timeout_ms , task_wdt_callback , (void * )k_current_get ());
260
234
261
- STATE_SET_INITIAL (battery_state_object , STATE_INIT );
235
+ STATE_SET_INITIAL (battery_state_object , STATE_RUNNING );
262
236
263
237
while (true) {
264
238
err = task_wdt_feed (task_wdt_id );
@@ -268,7 +242,10 @@ static void battery_task(void)
268
242
return ;
269
243
}
270
244
271
- err = zbus_sub_wait_msg (& battery , & s_obj .chan , s_obj .msg_buf , zbus_wait_ms );
245
+ err = zbus_sub_wait_msg (& battery ,
246
+ & battery_state_object .chan ,
247
+ battery_state_object .msg_buf ,
248
+ zbus_wait_ms );
272
249
if (err == - ENOMSG ) {
273
250
continue ;
274
251
} else if (err ) {
0 commit comments