@@ -69,6 +69,34 @@ static const struct iio_event_spec iio_dummy_event = {
69
69
.mask_separate = BIT (IIO_EV_INFO_VALUE ) | BIT (IIO_EV_INFO_ENABLE ),
70
70
};
71
71
72
+ /*
73
+ * simple step detect event - triggered when a step is detected
74
+ */
75
+ static const struct iio_event_spec step_detect_event = {
76
+ .type = IIO_EV_TYPE_INSTANCE ,
77
+ .dir = IIO_EV_DIR_NONE ,
78
+ .mask_separate = BIT (IIO_EV_INFO_ENABLE ),
79
+ };
80
+
81
+ /*
82
+ * simple transition event - triggered when the reported running confidence
83
+ * value rises above a threshold value
84
+ */
85
+ static const struct iio_event_spec iio_running_event = {
86
+ .type = IIO_EV_TYPE_THRESH ,
87
+ .dir = IIO_EV_DIR_RISING ,
88
+ .mask_separate = BIT (IIO_EV_INFO_VALUE ) | BIT (IIO_EV_INFO_ENABLE ),
89
+ };
90
+
91
+ /*
92
+ * simple transition event - triggered when the reported walking confidence
93
+ * value falls under a threshold value
94
+ */
95
+ static const struct iio_event_spec iio_walking_event = {
96
+ .type = IIO_EV_TYPE_THRESH ,
97
+ .dir = IIO_EV_DIR_FALLING ,
98
+ .mask_separate = BIT (IIO_EV_INFO_VALUE ) | BIT (IIO_EV_INFO_ENABLE ),
99
+ };
72
100
#endif
73
101
74
102
/*
@@ -215,6 +243,37 @@ static const struct iio_chan_spec iio_dummy_channels[] = {
215
243
.indexed = 1 ,
216
244
.channel = 0 ,
217
245
},
246
+ {
247
+ .type = IIO_STEPS ,
248
+ .info_mask_shared_by_type = BIT (IIO_CHAN_INFO_ENABLE ) |
249
+ BIT (IIO_CHAN_INFO_CALIBHEIGHT ),
250
+ .info_mask_separate = BIT (IIO_CHAN_INFO_PROCESSED ),
251
+ .scan_index = -1 ,
252
+ #ifdef CONFIG_IIO_SIMPLE_DUMMY_EVENTS
253
+ .event_spec = & step_detect_event ,
254
+ .num_event_specs = 1 ,
255
+ #endif /* CONFIG_IIO_SIMPLE_DUMMY_EVENTS */
256
+ },
257
+ {
258
+ .type = IIO_ACTIVITY ,
259
+ .modified = 1 ,
260
+ .channel2 = IIO_MOD_RUNNING ,
261
+ .info_mask_separate = BIT (IIO_CHAN_INFO_PROCESSED ),
262
+ #ifdef CONFIG_IIO_SIMPLE_DUMMY_EVENTS
263
+ .event_spec = & iio_running_event ,
264
+ .num_event_specs = 1 ,
265
+ #endif /* CONFIG_IIO_SIMPLE_DUMMY_EVENTS */
266
+ },
267
+ {
268
+ .type = IIO_ACTIVITY ,
269
+ .modified = 1 ,
270
+ .channel2 = IIO_MOD_WALKING ,
271
+ .info_mask_separate = BIT (IIO_CHAN_INFO_PROCESSED ),
272
+ #ifdef CONFIG_IIO_SIMPLE_DUMMY_EVENTS
273
+ .event_spec = & iio_walking_event ,
274
+ .num_event_specs = 1 ,
275
+ #endif /* CONFIG_IIO_SIMPLE_DUMMY_EVENTS */
276
+ },
218
277
};
219
278
220
279
/**
@@ -263,24 +322,55 @@ static int iio_dummy_read_raw(struct iio_dev *indio_dev,
263
322
break ;
264
323
}
265
324
break ;
325
+ case IIO_CHAN_INFO_PROCESSED :
326
+ switch (chan -> type ) {
327
+ case IIO_STEPS :
328
+ * val = st -> steps ;
329
+ ret = IIO_VAL_INT ;
330
+ break ;
331
+ case IIO_ACTIVITY :
332
+ switch (chan -> channel2 ) {
333
+ case IIO_MOD_RUNNING :
334
+ * val = st -> activity_running ;
335
+ ret = IIO_VAL_INT ;
336
+ break ;
337
+ case IIO_MOD_WALKING :
338
+ * val = st -> activity_walking ;
339
+ ret = IIO_VAL_INT ;
340
+ break ;
341
+ default :
342
+ break ;
343
+ }
344
+ break ;
345
+ default :
346
+ break ;
347
+ }
348
+ break ;
266
349
case IIO_CHAN_INFO_OFFSET :
267
350
/* only single ended adc -> 7 */
268
351
* val = 7 ;
269
352
ret = IIO_VAL_INT ;
270
353
break ;
271
354
case IIO_CHAN_INFO_SCALE :
272
- switch (chan -> differential ) {
273
- case 0 :
274
- /* only single ended adc -> 0.001333 */
275
- * val = 0 ;
276
- * val2 = 1333 ;
277
- ret = IIO_VAL_INT_PLUS_MICRO ;
355
+ switch (chan -> type ) {
356
+ case IIO_VOLTAGE :
357
+ switch (chan -> differential ) {
358
+ case 0 :
359
+ /* only single ended adc -> 0.001333 */
360
+ * val = 0 ;
361
+ * val2 = 1333 ;
362
+ ret = IIO_VAL_INT_PLUS_MICRO ;
363
+ break ;
364
+ case 1 :
365
+ /* all differential adc channels ->
366
+ * 0.000001344 */
367
+ * val = 0 ;
368
+ * val2 = 1344 ;
369
+ ret = IIO_VAL_INT_PLUS_NANO ;
370
+ }
371
+ break ;
372
+ default :
278
373
break ;
279
- case 1 :
280
- /* all differential adc channels -> 0.000001344 */
281
- * val = 0 ;
282
- * val2 = 1344 ;
283
- ret = IIO_VAL_INT_PLUS_NANO ;
284
374
}
285
375
break ;
286
376
case IIO_CHAN_INFO_CALIBBIAS :
@@ -298,6 +388,27 @@ static int iio_dummy_read_raw(struct iio_dev *indio_dev,
298
388
* val2 = 33 ;
299
389
ret = IIO_VAL_INT_PLUS_NANO ;
300
390
break ;
391
+ case IIO_CHAN_INFO_ENABLE :
392
+ switch (chan -> type ) {
393
+ case IIO_STEPS :
394
+ * val = st -> steps_enabled ;
395
+ ret = IIO_VAL_INT ;
396
+ break ;
397
+ default :
398
+ break ;
399
+ }
400
+ break ;
401
+ case IIO_CHAN_INFO_CALIBHEIGHT :
402
+ switch (chan -> type ) {
403
+ case IIO_STEPS :
404
+ * val = st -> height ;
405
+ ret = IIO_VAL_INT ;
406
+ break ;
407
+ default :
408
+ break ;
409
+ }
410
+ break ;
411
+
301
412
default :
302
413
break ;
303
414
}
@@ -330,14 +441,45 @@ static int iio_dummy_write_raw(struct iio_dev *indio_dev,
330
441
331
442
switch (mask ) {
332
443
case IIO_CHAN_INFO_RAW :
333
- if (chan -> output == 0 )
444
+ switch (chan -> type ) {
445
+ case IIO_VOLTAGE :
446
+ if (chan -> output == 0 )
447
+ return - EINVAL ;
448
+
449
+ /* Locking not required as writing single value */
450
+ mutex_lock (& st -> lock );
451
+ st -> dac_val = val ;
452
+ mutex_unlock (& st -> lock );
453
+ return 0 ;
454
+ default :
334
455
return - EINVAL ;
335
-
336
- /* Locking not required as writing single value */
337
- mutex_lock (& st -> lock );
338
- st -> dac_val = val ;
339
- mutex_unlock (& st -> lock );
340
- return 0 ;
456
+ }
457
+ case IIO_CHAN_INFO_PROCESSED :
458
+ switch (chan -> type ) {
459
+ case IIO_STEPS :
460
+ mutex_lock (& st -> lock );
461
+ st -> steps = val ;
462
+ mutex_unlock (& st -> lock );
463
+ return 0 ;
464
+ case IIO_ACTIVITY :
465
+ if (val < 0 )
466
+ val = 0 ;
467
+ if (val > 100 )
468
+ val = 100 ;
469
+ switch (chan -> channel2 ) {
470
+ case IIO_MOD_RUNNING :
471
+ st -> activity_running = val ;
472
+ return 0 ;
473
+ case IIO_MOD_WALKING :
474
+ st -> activity_walking = val ;
475
+ return 0 ;
476
+ default :
477
+ return - EINVAL ;
478
+ }
479
+ break ;
480
+ default :
481
+ return - EINVAL ;
482
+ }
341
483
case IIO_CHAN_INFO_CALIBSCALE :
342
484
mutex_lock (& st -> lock );
343
485
/* Compare against table - hard matching here */
@@ -356,6 +498,24 @@ static int iio_dummy_write_raw(struct iio_dev *indio_dev,
356
498
st -> accel_calibbias = val ;
357
499
mutex_unlock (& st -> lock );
358
500
return 0 ;
501
+ case IIO_CHAN_INFO_ENABLE :
502
+ switch (chan -> type ) {
503
+ case IIO_STEPS :
504
+ mutex_lock (& st -> lock );
505
+ st -> steps_enabled = val ;
506
+ mutex_unlock (& st -> lock );
507
+ return 0 ;
508
+ default :
509
+ return - EINVAL ;
510
+ }
511
+ case IIO_CHAN_INFO_CALIBHEIGHT :
512
+ switch (chan -> type ) {
513
+ case IIO_STEPS :
514
+ st -> height = val ;
515
+ return 0 ;
516
+ default :
517
+ return - EINVAL ;
518
+ }
359
519
360
520
default :
361
521
return - EINVAL ;
@@ -395,6 +555,9 @@ static int iio_dummy_init_device(struct iio_dev *indio_dev)
395
555
st -> accel_val = 34 ;
396
556
st -> accel_calibbias = -7 ;
397
557
st -> accel_calibscale = & dummy_scales [0 ];
558
+ st -> steps = 47 ;
559
+ st -> activity_running = 98 ;
560
+ st -> activity_walking = 4 ;
398
561
399
562
return 0 ;
400
563
}
0 commit comments