Skip to content

Commit f9c4a10

Browse files
committed
sensors: add bin_data_age attribute
1 parent 1408921 commit f9c4a10

18 files changed

+216
-31
lines changed

brickpi/brickpi_i2c_sensor.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ static int brickpi_i2c_sensor_set_mode(void *context, u8 mode)
7676
return err;
7777

7878
lego_port_set_raw_data_ptr_and_func(port, mode_info->raw_data, size,
79+
&mode_info->last_changed_time,
7980
NULL, NULL);
8081

8182
return 0;
@@ -205,7 +206,8 @@ static int brickpi_i2c_sensor_remove(struct lego_device *ldev)
205206
{
206207
struct brickpi_i2c_sensor_data *data = dev_get_drvdata(&ldev->dev);
207208

208-
lego_port_set_raw_data_ptr_and_func(ldev->port, NULL, 0, NULL, NULL);
209+
lego_port_set_raw_data_ptr_and_func(ldev->port, NULL, 0, NULL,
210+
NULL, NULL);
209211
unregister_lego_sensor(&data->sensor);
210212
dev_set_drvdata(&ldev->dev, NULL);
211213
kfree(data->sensor.mode_info);

brickpi/brickpi_serdev.c

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -401,11 +401,25 @@ int brickpi_get_values(struct brickpi_channel_data *ch_data)
401401

402402
if (port->sensor_type == BRICKPI_SENSOR_TYPE_NXT_I2C
403403
|| port->sensor_type == BRICKPI_SENSOR_TYPE_NXT_I2C_9V) {
404-
memcpy(raw_data, port->i2c_msg[0].read_data,
405-
port->i2c_msg[0].read_size);
404+
405+
if (port->port.last_changed_time
406+
&& memcmp(raw_data, port->i2c_msg[0].read_data,
407+
port->i2c_msg[0].read_size) != 0) {
408+
*port->port.last_changed_time = ktime_get();
409+
memcpy(raw_data, port->i2c_msg[0].read_data,
410+
port->i2c_msg[0].read_size);
411+
}
412+
413+
406414
} else {
407-
memcpy(raw_data, sensor_values,
408-
sizeof(s32) * NUM_BRICKPI_SENSOR_VALUES);
415+
int bytes = sizeof(s32) * NUM_BRICKPI_SENSOR_VALUES;
416+
417+
if (port->port.last_changed_time
418+
&& memcmp(raw_data, sensor_values, bytes) != 0) {
419+
*port->port.last_changed_time = ktime_get();
420+
memcpy(raw_data, sensor_values, bytes);
421+
}
422+
409423
}
410424
lego_port_call_raw_data_func(&port->port);
411425
}

brickpi3/brickpi3_ports_in.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,9 +165,20 @@ static void brickpi3_in_port_poll_work(struct work_struct *work)
165165
struct brickpi3_in_port *data =
166166
container_of(work, struct brickpi3_in_port, poll_work);
167167
u8 *raw_data = data->port.raw_data;
168+
ktime_t *last_changed_ptr = data->port.last_changed_time;
169+
u8 old_data[32];
170+
int check_size = 0;
168171
u8 msg[16];
169172
int ret;
170173

174+
if (raw_data && last_changed_ptr) {
175+
check_size = data->port.raw_data_size <= 32
176+
? data->port.raw_data_size : 32;
177+
}
178+
179+
if (check_size)
180+
memcpy(old_data, raw_data, check_size);
181+
171182
switch (data->sensor_type) {
172183
case BRICKPI3_SENSOR_TYPE_CUSTOM:
173184
ret = brickpi3_read_sensor(data->bp, data->address, data->index,
@@ -277,6 +288,11 @@ static void brickpi3_in_port_poll_work(struct work_struct *work)
277288
return;
278289
}
279290

291+
if (check_size) {
292+
if (memcmp(old_data, raw_data, check_size) != 0)
293+
*last_changed_ptr = ktime_get();
294+
}
295+
280296
if (raw_data) {
281297
lego_port_call_raw_data_func(&data->port);
282298
}

ev3/ev3_ports_in.c

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -526,16 +526,30 @@ static struct lego_port_nxt_analog_ops ev3_input_port_nxt_analog_ops = {
526526

527527
static void ev3_input_port_nxt_analog_cb(struct ev3_input_port_data *data)
528528
{
529-
if (data->port.raw_data)
530-
*(s32 *)data->port.raw_data = data->pin1_mv;
529+
s32 new_value = data->pin1_mv;
530+
s32 *raw_data = (s32 *)data->port.raw_data;
531+
532+
if (raw_data) {
533+
if (*raw_data != new_value && data->port.last_changed_time)
534+
*data->port.last_changed_time = ktime_get();
535+
536+
*raw_data = new_value;
537+
}
531538
if (data->port.notify_raw_data_func)
532539
data->port.notify_raw_data_func(data->port.notify_raw_data_context);
533540
}
534541

535542
static void ev3_input_port_ev3_analog_cb(struct ev3_input_port_data *data)
536543
{
537-
if (data->port.raw_data)
538-
*(s32 *)data->port.raw_data = data->pin6_mv;
544+
s32 new_value = data->pin6_mv;
545+
s32 *raw_data = (s32 *)data->port.raw_data;
546+
547+
if (raw_data) {
548+
if (*raw_data != new_value && data->port.last_changed_time)
549+
*data->port.last_changed_time = ktime_get();
550+
551+
*raw_data = new_value;
552+
}
539553
if (data->port.notify_raw_data_func)
540554
data->port.notify_raw_data_func(data->port.notify_raw_data_context);
541555
}

include/lego_port_class.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ struct lego_port_ev3_uart_ops {
8484
* @dev: The device data structure.
8585
* @raw_data: Pointer to raw data storage.
8686
* @raw_data_size: Size of raw_data in bytes.
87+
* @last_changed_time: Time at which the raw_data last changed its contents.
8788
* @notify_raw_data_func: Registered by sensor drivers to be notified of new
8889
* raw data.
8990
* @notify_raw_data_context: Send to notify_raw_data_func as parameter.
@@ -112,6 +113,7 @@ struct lego_port_device {
112113
struct device dev;
113114
u8 *raw_data;
114115
unsigned raw_data_size;
116+
ktime_t *last_changed_time;
115117
lego_port_notify_raw_data_func_t notify_raw_data_func;
116118
void *notify_raw_data_context;
117119
};
@@ -126,11 +128,13 @@ extern void lego_port_unregister(struct lego_port_device *lego_port);
126128
static inline void
127129
lego_port_set_raw_data_ptr_and_func(struct lego_port_device *port,
128130
u8 *raw_data, unsigned raw_data_size,
131+
ktime_t *last_changed_time,
129132
lego_port_notify_raw_data_func_t func,
130133
void *context)
131134
{
132135
port->raw_data = raw_data;
133136
port->raw_data_size = raw_data_size;
137+
port->last_changed_time = last_changed_time;
134138
port->notify_raw_data_func = func;
135139
port->notify_raw_data_context = context;
136140
}

include/lego_sensor_class.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
#include <linux/device.h>
2121
#include <linux/types.h>
22+
#include <linux/ktime.h>
2223

2324
#define LEGO_SENSOR_NAME_SIZE 30
2425
#define LEGO_SENSOR_FW_VERSION_SIZE 8
@@ -62,6 +63,7 @@ extern size_t lego_sensor_data_size[];
6263
* @figures: Number of digits that should be displayed, including decimal point.
6364
* @decimals: Decimal point position.
6465
* @raw_data: Raw data read from the sensor.
66+
* @last_changed_time: Time at which the raw_data last changed its contents.
6567
*/
6668
struct lego_sensor_mode_info {
6769
char name[LEGO_SENSOR_MODE_NAME_SIZE + 1];
@@ -80,6 +82,7 @@ struct lego_sensor_mode_info {
8082
u8 figures;
8183
u8 decimals;
8284
u8 raw_data[LEGO_SENSOR_RAW_DATA_SIZE];
85+
ktime_t last_changed_time;
8386
};
8487

8588
/**

pistorms/pistorms_ports_in.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,10 +230,21 @@ static void pistorms_poll_work(struct work_struct *work)
230230
container_of(work, struct pistorms_in_port_data, poll_work);
231231
u8 *raw_data = in_port->port.raw_data;
232232
int ret;
233+
u32 old_data[32];
234+
int check_size = 0;
233235

234236
if (!raw_data)
235237
return;
236238

239+
if (in_port->port.last_changed_time) {
240+
check_size = in_port->port.raw_data_size <= 32
241+
? in_port->port.raw_data_size : 32;
242+
}
243+
244+
if (check_size) {
245+
memcpy(old_data, raw_data, check_size);
246+
}
247+
237248
switch (in_port->port.mode) {
238249
case PS_IN_PORT_MODE_NXT_ANALOG:
239250
ret = i2c_smbus_read_word_data(in_port->client,
@@ -277,6 +288,11 @@ static void pistorms_poll_work(struct work_struct *work)
277288
}
278289

279290
lego_port_call_raw_data_func(&in_port->port);
291+
292+
if (check_size) {
293+
if (memcmp(old_data, raw_data, check_size) != 0)
294+
*in_port->port.last_changed_time = ktime_get();
295+
}
280296
}
281297

282298
enum hrtimer_restart pistorms_poll_timer_function(struct hrtimer *timer)

sensors/ev3_analog_sensor_core.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,8 @@ static int ev3_analog_sensor_set_mode(void *context, u8 mode)
6161
else
6262
context = NULL;
6363
lego_port_set_raw_data_ptr_and_func(data->ldev->port, mode_info->raw_data,
64-
lego_sensor_get_raw_data_size(mode_info), func, context);
64+
lego_sensor_get_raw_data_size(mode_info),
65+
&mode_info->last_changed_time, func, context);
6566

6667
return 0;
6768
}
@@ -108,7 +109,8 @@ static int ev3_analog_sensor_remove(struct lego_device *ldev)
108109
{
109110
struct ev3_analog_sensor_data *data = dev_get_drvdata(&ldev->dev);
110111

111-
lego_port_set_raw_data_ptr_and_func(ldev->port, NULL, 0, NULL, NULL);
112+
lego_port_set_raw_data_ptr_and_func(ldev->port, NULL, 0, NULL,
113+
NULL, NULL);
112114
unregister_lego_sensor(&data->sensor);
113115
dev_set_drvdata(&ldev->dev, NULL);
114116
kfree(data);

sensors/ev3_uart_sensor_core.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@ static int ev3_uart_sensor_set_mode(void *context, u8 mode)
5959
return -EOPNOTSUPP;
6060

6161
lego_port_set_raw_data_ptr_and_func(data->ldev->port, mode_info->raw_data,
62-
lego_sensor_get_raw_data_size(mode_info), NULL, NULL);
62+
lego_sensor_get_raw_data_size(mode_info),
63+
&mode_info->last_changed_time, NULL, NULL);
6364

6465
return 0;
6566
}
@@ -112,7 +113,8 @@ static int ev3_uart_sensor_remove(struct lego_device *ldev)
112113
{
113114
struct ev3_uart_sensor_data *data = dev_get_drvdata(&ldev->dev);
114115

115-
lego_port_set_raw_data_ptr_and_func(ldev->port, NULL, 0, NULL, NULL);
116+
lego_port_set_raw_data_ptr_and_func(ldev->port, NULL, 0, NULL,
117+
NULL, NULL);
116118
unregister_lego_sensor(&data->sensor);
117119
dev_set_drvdata(&ldev->dev, NULL);
118120
kfree(data);

sensors/ev3_uart_sensor_ld.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -953,7 +953,16 @@ static int ev3_uart_receive_buf2(struct tty_struct *tty,
953953
if (!completion_done(&port->set_mode_completion)
954954
&& mode == port->new_mode)
955955
complete(&port->set_mode_completion);
956-
memcpy(port->mode_info[mode].raw_data, message + 1, msg_size - 2);
956+
957+
if (memcmp(port->mode_info[mode].raw_data, message + 1,
958+
msg_size - 2) != 0) {
959+
port->mode_info[mode].last_changed_time =
960+
ktime_get();
961+
memcpy(port->mode_info[mode].raw_data,
962+
message + 1,
963+
msg_size - 2);
964+
}
965+
957966
port->data_rec = 1;
958967
if (port->num_data_err)
959968
port->num_data_err--;

0 commit comments

Comments
 (0)