Skip to content

Commit d3fa845

Browse files
marekmaskarinechubpav
authored andcommitted
drivers: ctr_x4: Fix line state initialization
Signed-off-by: Marek Maškarinec <[email protected]>
1 parent 2184d42 commit d3fa845

File tree

3 files changed

+38
-25
lines changed

3 files changed

+38
-25
lines changed

drivers/ctr_x4/ctr_x4.c

+12-17
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ struct ctr_x4_data {
4848
int16_t adc_buf[1];
4949
ctr_x4_user_cb user_cb;
5050
void *user_data;
51-
bool is_line_present;
51+
enum ctr_x4_line_state line_state;
5252
};
5353

5454
static inline const struct ctr_x4_config *get_config(const struct device *dev)
@@ -138,10 +138,10 @@ static int ctr_x4_get_line_voltage_(const struct device *dev, int *line_voltage_
138138
return 0;
139139
}
140140

141-
static int ctr_x4_get_line_present_(const struct device *dev, bool *is_line_present)
141+
static int ctr_x4_get_line_state_(const struct device *dev, enum ctr_x4_line_state *line_state)
142142
{
143143
k_mutex_lock(&get_data(dev)->lock, K_FOREVER);
144-
*is_line_present = get_data(dev)->is_line_present;
144+
*line_state = get_data(dev)->line_state;
145145
k_mutex_unlock(&get_data(dev)->lock);
146146

147147
return 0;
@@ -168,19 +168,23 @@ static void work_handler(struct k_work *work)
168168
}
169169

170170
k_mutex_lock(&get_data(dev)->lock, K_FOREVER);
171+
enum ctr_x4_line_state line_state = get_data(dev)->line_state;
171172

172-
if (get_data(dev)->is_line_present) {
173+
if (line_state == CTR_X4_LINE_STATE_CONNECTED || line_state == CTR_X4_LINE_STATE_UNKNOWN) {
173174
if (voltage_mv < get_config(dev)->line_threshold_min) {
174-
get_data(dev)->is_line_present = false;
175+
get_data(dev)->line_state = CTR_X4_LINE_STATE_DISCONNECTED;
175176

176177
if (get_data(dev)->user_cb) {
177178
get_data(dev)->user_cb(dev, CTR_X4_EVENT_LINE_DISCONNECTED,
178179
get_data(dev)->user_data);
179180
}
180181
}
181-
} else {
182+
}
183+
184+
if (line_state == CTR_X4_LINE_STATE_DISCONNECTED ||
185+
line_state == CTR_X4_LINE_STATE_UNKNOWN) {
182186
if (voltage_mv > get_config(dev)->line_threshold_max) {
183-
get_data(dev)->is_line_present = true;
187+
get_data(dev)->line_state = CTR_X4_LINE_STATE_CONNECTED;
184188

185189
if (get_data(dev)->user_cb) {
186190
get_data(dev)->user_cb(dev, CTR_X4_EVENT_LINE_CONNECTED,
@@ -248,23 +252,14 @@ static int ctr_x4_init(const struct device *dev)
248252
k_timer_start(&get_data(dev)->timer, K_MSEC(get_config(dev)->line_measurement_interval),
249253
K_MSEC(get_config(dev)->line_measurement_interval));
250254

251-
int line_voltage_mv;
252-
ret = ctr_x4_get_line_voltage(dev, &line_voltage_mv);
253-
if (ret) {
254-
LOG_ERR("Call `ctr_x4_get_line_voltage` failed: %d", ret);
255-
return ret;
256-
}
257-
258-
get_data(dev)->is_line_present = line_voltage_mv > get_config(dev)->line_threshold_min;
259-
260255
return 0;
261256
}
262257

263258
static const struct ctr_x4_driver_api ctr_x4_driver_api = {
264259
.set_handler = ctr_x4_set_handler_,
265260
.set_output = ctr_x4_set_output_,
266261
.get_line_voltage = ctr_x4_get_line_voltage_,
267-
.get_line_present = ctr_x4_get_line_present_,
262+
.get_line_state = ctr_x4_get_line_state_,
268263
};
269264

270265
#define CTR_X4_INIT(n) \

include/chester/drivers/ctr_x4.h

+12-4
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ enum ctr_x4_output {
3535
CTR_X4_OUTPUT_4 = 3,
3636
};
3737

38+
enum ctr_x4_line_state {
39+
CTR_X4_LINE_STATE_UNKNOWN = 0,
40+
CTR_X4_LINE_STATE_DISCONNECTED = 1,
41+
CTR_X4_LINE_STATE_CONNECTED = 2,
42+
};
43+
3844
/** @private */
3945
typedef void (*ctr_x4_user_cb)(const struct device *dev, enum ctr_x4_event event, void *user_data);
4046
/** @private */
@@ -46,14 +52,15 @@ typedef int (*ctr_x4_api_set_output)(const struct device *dev, enum ctr_x4_outpu
4652
/** @private */
4753
typedef int (*ctr_x4_api_get_line_voltage)(const struct device *dev, int *line_voltage_mv);
4854
/** @private */
49-
typedef int (*ctr_x4_api_get_line_present)(const struct device *dev, bool *is_line_present);
55+
typedef int (*ctr_x4_api_get_line_state)(const struct device *dev,
56+
enum ctr_x4_line_state *line_state);
5057

5158
/** @private */
5259
struct ctr_x4_driver_api {
5360
ctr_x4_api_set_handler set_handler;
5461
ctr_x4_api_set_output set_output;
5562
ctr_x4_api_get_line_voltage get_line_voltage;
56-
ctr_x4_api_get_line_present get_line_present;
63+
ctr_x4_api_get_line_state get_line_state;
5764
};
5865

5966
static inline int ctr_x4_set_handler(const struct device *dev, ctr_x4_user_cb user_cb,
@@ -78,11 +85,12 @@ static inline int ctr_x4_get_line_voltage(const struct device *dev, int *line_vo
7885
return api->get_line_voltage(dev, line_voltage_mv);
7986
}
8087

81-
static inline int ctr_x4_get_line_present(const struct device *dev, bool *is_line_present)
88+
static inline int ctr_x4_get_line_state(const struct device *dev,
89+
enum ctr_x4_line_state *line_state)
8290
{
8391
const struct ctr_x4_driver_api *api = (const struct ctr_x4_driver_api *)dev->api;
8492

85-
return api->get_line_present(dev, is_line_present);
93+
return api->get_line_state(dev, line_state);
8694
}
8795

8896
/** @} */

samples/chester_x4/src/main.c

+14-4
Original file line numberDiff line numberDiff line change
@@ -64,14 +64,24 @@ int main(void)
6464

6565
LOG_INF("Line voltage: %d mV", line_voltage_mv);
6666

67-
bool is_line_present;
68-
ret = ctr_x4_get_line_present(dev, &is_line_present);
67+
enum ctr_x4_line_state line_state;
68+
ret = ctr_x4_get_line_state(dev, &line_state);
6969
if (ret) {
70-
LOG_ERR("Call `ctr_x4_get_line_present` failed: %d", ret);
70+
LOG_ERR("Call `ctr_x4_get_line_state` failed: %d", ret);
7171
k_oops();
7272
}
7373

74-
LOG_INF("Line present: %s", is_line_present ? "true" : "false");
74+
switch (line_state) {
75+
case CTR_X4_LINE_STATE_UNKNOWN:
76+
LOG_INF("Line state: unknown");
77+
break;
78+
case CTR_X4_LINE_STATE_CONNECTED:
79+
LOG_INF("Line state: connected");
80+
break;
81+
case CTR_X4_LINE_STATE_DISCONNECTED:
82+
LOG_INF("Line state: disconnected");
83+
break;
84+
}
7585

7686
ret = ctr_x4_set_output(dev, CTR_X4_OUTPUT_1, true);
7787
if (ret) {

0 commit comments

Comments
 (0)