@@ -313,25 +313,44 @@ static int get_frame_count(const uint8_t *buffer, struct sensor_chan_spec channe
313
313
314
314
switch (channel .chan_type ) {
315
315
case SENSOR_CHAN_ACCEL_XYZ :
316
- channel .chan_type = SENSOR_CHAN_ACCEL_X ;
317
- break ;
318
316
case SENSOR_CHAN_GYRO_XYZ :
319
- channel .chan_type = SENSOR_CHAN_GYRO_X ;
320
- break ;
321
317
case SENSOR_CHAN_MAGN_XYZ :
322
- channel .chan_type = SENSOR_CHAN_MAGN_X ;
323
- break ;
324
318
case SENSOR_CHAN_POS_DXYZ :
325
- channel .chan_type = SENSOR_CHAN_POS_DX ;
319
+ for (size_t i = 0 ; i < header -> num_channels ; ++ i ) {
320
+ /* For 3-axis channels, we need to verify we have each individual axis */
321
+ struct sensor_chan_spec channel_x = {
322
+ .chan_type = channel .chan_type - 3 ,
323
+ .chan_idx = channel .chan_idx ,
324
+ };
325
+ struct sensor_chan_spec channel_y = {
326
+ .chan_type = channel .chan_type - 2 ,
327
+ .chan_idx = channel .chan_idx ,
328
+ };
329
+ struct sensor_chan_spec channel_z = {
330
+ .chan_type = channel .chan_type - 1 ,
331
+ .chan_idx = channel .chan_idx ,
332
+ };
333
+
334
+ /** The three axes don't need to be at the beginning of the header, but
335
+ * they should be consecutive.
336
+ */
337
+ if (((header -> num_channels - i ) >= 3 ) &&
338
+ sensor_chan_spec_eq (header -> channels [i ], channel_x ) &&
339
+ sensor_chan_spec_eq (header -> channels [i + 1 ], channel_y ) &&
340
+ sensor_chan_spec_eq (header -> channels [i + 2 ], channel_z )) {
341
+ * frame_count = 1 ;
342
+ return 0 ;
343
+ }
344
+ }
326
345
break ;
327
346
default :
328
- break ;
329
- }
330
- for (size_t i = 0 ; i < header -> num_channels ; ++ i ) {
331
- if (sensor_chan_spec_eq (header -> channels [i ], channel )) {
332
- * frame_count = 1 ;
333
- return 0 ;
347
+ for (size_t i = 0 ; i < header -> num_channels ; ++ i ) {
348
+ if (sensor_chan_spec_eq (header -> channels [i ], channel )) {
349
+ * frame_count = 1 ;
350
+ return 0 ;
351
+ }
334
352
}
353
+ break ;
335
354
}
336
355
337
356
return - ENOTSUP ;
@@ -348,21 +367,9 @@ int sensor_natively_supported_channel_size_info(struct sensor_chan_spec channel,
348
367
}
349
368
350
369
switch (channel .chan_type ) {
351
- case SENSOR_CHAN_ACCEL_X :
352
- case SENSOR_CHAN_ACCEL_Y :
353
- case SENSOR_CHAN_ACCEL_Z :
354
370
case SENSOR_CHAN_ACCEL_XYZ :
355
- case SENSOR_CHAN_GYRO_X :
356
- case SENSOR_CHAN_GYRO_Y :
357
- case SENSOR_CHAN_GYRO_Z :
358
371
case SENSOR_CHAN_GYRO_XYZ :
359
- case SENSOR_CHAN_MAGN_X :
360
- case SENSOR_CHAN_MAGN_Y :
361
- case SENSOR_CHAN_MAGN_Z :
362
372
case SENSOR_CHAN_MAGN_XYZ :
363
- case SENSOR_CHAN_POS_DX :
364
- case SENSOR_CHAN_POS_DY :
365
- case SENSOR_CHAN_POS_DZ :
366
373
case SENSOR_CHAN_POS_DXYZ :
367
374
* base_size = sizeof (struct sensor_three_axis_data );
368
375
* frame_size = sizeof (struct sensor_three_axis_sample_data );
@@ -475,33 +482,21 @@ static int decode(const uint8_t *buffer, struct sensor_chan_spec chan_spec,
475
482
476
483
/* Check for 3d channel mappings */
477
484
switch (chan_spec .chan_type ) {
478
- case SENSOR_CHAN_ACCEL_X :
479
- case SENSOR_CHAN_ACCEL_Y :
480
- case SENSOR_CHAN_ACCEL_Z :
481
485
case SENSOR_CHAN_ACCEL_XYZ :
482
486
count = decode_three_axis (header , q , data_out , SENSOR_CHAN_ACCEL_X ,
483
487
SENSOR_CHAN_ACCEL_Y , SENSOR_CHAN_ACCEL_Z ,
484
488
chan_spec .chan_idx );
485
489
break ;
486
- case SENSOR_CHAN_GYRO_X :
487
- case SENSOR_CHAN_GYRO_Y :
488
- case SENSOR_CHAN_GYRO_Z :
489
490
case SENSOR_CHAN_GYRO_XYZ :
490
491
count = decode_three_axis (header , q , data_out , SENSOR_CHAN_GYRO_X ,
491
492
SENSOR_CHAN_GYRO_Y , SENSOR_CHAN_GYRO_Z ,
492
493
chan_spec .chan_idx );
493
494
break ;
494
- case SENSOR_CHAN_MAGN_X :
495
- case SENSOR_CHAN_MAGN_Y :
496
- case SENSOR_CHAN_MAGN_Z :
497
495
case SENSOR_CHAN_MAGN_XYZ :
498
496
count = decode_three_axis (header , q , data_out , SENSOR_CHAN_MAGN_X ,
499
497
SENSOR_CHAN_MAGN_Y , SENSOR_CHAN_MAGN_Z ,
500
498
chan_spec .chan_idx );
501
499
break ;
502
- case SENSOR_CHAN_POS_DX :
503
- case SENSOR_CHAN_POS_DY :
504
- case SENSOR_CHAN_POS_DZ :
505
500
case SENSOR_CHAN_POS_DXYZ :
506
501
count = decode_three_axis (header , q , data_out , SENSOR_CHAN_POS_DX ,
507
502
SENSOR_CHAN_POS_DY , SENSOR_CHAN_POS_DZ ,
0 commit comments