@@ -281,7 +281,12 @@ ICM_20948_Status_e ICM_20948::GetBiasGyroX( int32_t* bias)
281
281
ICM_20948_Status_e result = ICM_20948_Stat_Ok;
282
282
unsigned char bias_data[4 ] = { 0 };
283
283
result = inv_icm20948_read_mems (&_device, GYRO_BIAS_X, 4 , bias_data);
284
- bias[0 ] = (int32_t )(bias_data[0 ] << 24 ) | (bias_data[1 ] << 16 ) | (bias_data[2 ] << 8 ) | (bias_data[3 ]);
284
+ union {
285
+ int32_t signed32;
286
+ uint32_t unsigned32;
287
+ } signedUnsigned32;
288
+ signedUnsigned32.unsigned32 = (((uint32_t )bias_data[0 ]) << 24 ) | (((uint32_t )bias_data[1 ]) << 16 ) | (((uint32_t )bias_data[2 ]) << 8 ) | (bias_data[3 ]);
289
+ *bias = signedUnsigned32.signed32 ; // Convert from unsigned to signed with no cast ambiguity
285
290
return result;
286
291
}
287
292
@@ -290,7 +295,12 @@ ICM_20948_Status_e ICM_20948::GetBiasGyroY( int32_t* bias)
290
295
ICM_20948_Status_e result = ICM_20948_Stat_Ok;
291
296
unsigned char bias_data[4 ] = { 0 };
292
297
result = inv_icm20948_read_mems (&_device, GYRO_BIAS_Y, 4 , bias_data);
293
- bias[0 ] = (int32_t )(bias_data[0 ] << 24 ) | (bias_data[1 ] << 16 ) | (bias_data[2 ] << 8 ) | (bias_data[3 ]);
298
+ union {
299
+ int32_t signed32;
300
+ uint32_t unsigned32;
301
+ } signedUnsigned32;
302
+ signedUnsigned32.unsigned32 = (((uint32_t )bias_data[0 ]) << 24 ) | (((uint32_t )bias_data[1 ]) << 16 ) | (((uint32_t )bias_data[2 ]) << 8 ) | (bias_data[3 ]);
303
+ *bias = signedUnsigned32.signed32 ; // Convert from unsigned to signed with no cast ambiguity
294
304
return result;
295
305
}
296
306
@@ -299,7 +309,12 @@ ICM_20948_Status_e ICM_20948::GetBiasGyroZ( int32_t* bias)
299
309
ICM_20948_Status_e result = ICM_20948_Stat_Ok;
300
310
unsigned char bias_data[4 ] = { 0 };
301
311
result = inv_icm20948_read_mems (&_device, GYRO_BIAS_Z, 4 , bias_data);
302
- bias[0 ] = (int32_t )(bias_data[0 ] << 24 ) | (bias_data[1 ] << 16 ) | (bias_data[2 ] << 8 ) | (bias_data[3 ]);
312
+ union {
313
+ int32_t signed32;
314
+ uint32_t unsigned32;
315
+ } signedUnsigned32;
316
+ signedUnsigned32.unsigned32 = (((uint32_t )bias_data[0 ]) << 24 ) | (((uint32_t )bias_data[1 ]) << 16 ) | (((uint32_t )bias_data[2 ]) << 8 ) | (bias_data[3 ]);
317
+ *bias = signedUnsigned32.signed32 ; // Convert from unsigned to signed with no cast ambiguity
303
318
return result;
304
319
}
305
320
// Accel Bias
@@ -344,7 +359,12 @@ ICM_20948_Status_e ICM_20948::GetBiasAccelX( int32_t* bias)
344
359
ICM_20948_Status_e result = ICM_20948_Stat_Ok;
345
360
unsigned char bias_data[4 ] = { 0 };
346
361
result = inv_icm20948_read_mems (&_device, ACCEL_BIAS_X, 4 , bias_data);
347
- bias[0 ] = (int32_t )(bias_data[0 ] << 24 ) | (bias_data[1 ] << 16 ) | (bias_data[2 ] << 8 ) | (bias_data[3 ]);
362
+ union {
363
+ int32_t signed32;
364
+ uint32_t unsigned32;
365
+ } signedUnsigned32;
366
+ signedUnsigned32.unsigned32 = (((uint32_t )bias_data[0 ]) << 24 ) | (((uint32_t )bias_data[1 ]) << 16 ) | (((uint32_t )bias_data[2 ]) << 8 ) | (bias_data[3 ]);
367
+ *bias = signedUnsigned32.signed32 ; // Convert from unsigned to signed with no cast ambiguity
348
368
return result;
349
369
}
350
370
@@ -353,7 +373,12 @@ ICM_20948_Status_e ICM_20948::GetBiasAccelY( int32_t* bias)
353
373
ICM_20948_Status_e result = ICM_20948_Stat_Ok;
354
374
unsigned char bias_data[4 ] = { 0 };
355
375
result = inv_icm20948_read_mems (&_device, ACCEL_BIAS_Y, 4 , bias_data);
356
- bias[0 ] = (int32_t )(bias_data[0 ] << 24 ) | (bias_data[1 ] << 16 ) | (bias_data[2 ] << 8 ) | (bias_data[3 ]);
376
+ union {
377
+ int32_t signed32;
378
+ uint32_t unsigned32;
379
+ } signedUnsigned32;
380
+ signedUnsigned32.unsigned32 = (((uint32_t )bias_data[0 ]) << 24 ) | (((uint32_t )bias_data[1 ]) << 16 ) | (((uint32_t )bias_data[2 ]) << 8 ) | (bias_data[3 ]);
381
+ *bias = signedUnsigned32.signed32 ; // Convert from unsigned to signed with no cast ambiguity
357
382
return result;
358
383
}
359
384
@@ -362,7 +387,12 @@ ICM_20948_Status_e ICM_20948::GetBiasAccelZ( int32_t* bias)
362
387
ICM_20948_Status_e result = ICM_20948_Stat_Ok;
363
388
unsigned char bias_data[4 ] = { 0 };
364
389
result = inv_icm20948_read_mems (&_device, ACCEL_BIAS_Z, 4 , bias_data);
365
- bias[0 ] = (int32_t )(bias_data[0 ] << 24 ) | (bias_data[1 ] << 16 ) | (bias_data[2 ] << 8 ) | (bias_data[3 ]);
390
+ union {
391
+ int32_t signed32;
392
+ uint32_t unsigned32;
393
+ } signedUnsigned32;
394
+ signedUnsigned32.unsigned32 = (((uint32_t )bias_data[0 ]) << 24 ) | (((uint32_t )bias_data[1 ]) << 16 ) | (((uint32_t )bias_data[2 ]) << 8 ) | (bias_data[3 ]);
395
+ *bias = signedUnsigned32.signed32 ; // Convert from unsigned to signed with no cast ambiguity
366
396
return result;
367
397
}
368
398
// CPass Bias
@@ -407,7 +437,12 @@ ICM_20948_Status_e ICM_20948::GetBiasCPassX( int32_t* bias)
407
437
ICM_20948_Status_e result = ICM_20948_Stat_Ok;
408
438
unsigned char bias_data[4 ] = { 0 };
409
439
result = inv_icm20948_read_mems (&_device, CPASS_BIAS_X, 4 , bias_data);
410
- bias[0 ] = (int32_t )(bias_data[0 ] << 24 ) | (bias_data[1 ] << 16 ) | (bias_data[2 ] << 8 ) | (bias_data[3 ]);
440
+ union {
441
+ int32_t signed32;
442
+ uint32_t unsigned32;
443
+ } signedUnsigned32;
444
+ signedUnsigned32.unsigned32 = (((uint32_t )bias_data[0 ]) << 24 ) | (((uint32_t )bias_data[1 ]) << 16 ) | (((uint32_t )bias_data[2 ]) << 8 ) | (bias_data[3 ]);
445
+ *bias = signedUnsigned32.signed32 ; // Convert from unsigned to signed with no cast ambiguity
411
446
return result;
412
447
}
413
448
@@ -416,7 +451,12 @@ ICM_20948_Status_e ICM_20948::GetBiasCPassY( int32_t* bias)
416
451
ICM_20948_Status_e result = ICM_20948_Stat_Ok;
417
452
unsigned char bias_data[4 ] = { 0 };
418
453
result = inv_icm20948_read_mems (&_device, CPASS_BIAS_Y, 4 , bias_data);
419
- bias[0 ] = (int32_t )(bias_data[0 ] << 24 ) | (bias_data[1 ] << 16 ) | (bias_data[2 ] << 8 ) | (bias_data[3 ]);
454
+ union {
455
+ int32_t signed32;
456
+ uint32_t unsigned32;
457
+ } signedUnsigned32;
458
+ signedUnsigned32.unsigned32 = (((uint32_t )bias_data[0 ]) << 24 ) | (((uint32_t )bias_data[1 ]) << 16 ) | (((uint32_t )bias_data[2 ]) << 8 ) | (bias_data[3 ]);
459
+ *bias = signedUnsigned32.signed32 ; // Convert from unsigned to signed with no cast ambiguity
420
460
return result;
421
461
}
422
462
@@ -425,7 +465,12 @@ ICM_20948_Status_e ICM_20948::GetBiasCPassZ( int32_t* bias)
425
465
ICM_20948_Status_e result = ICM_20948_Stat_Ok;
426
466
unsigned char bias_data[4 ] = { 0 };
427
467
result = inv_icm20948_read_mems (&_device, CPASS_BIAS_Z, 4 , bias_data);
428
- bias[0 ] = (int32_t )(bias_data[0 ] << 24 ) | (bias_data[1 ] << 16 ) | (bias_data[2 ] << 8 ) | (bias_data[3 ]);
468
+ union {
469
+ int32_t signed32;
470
+ uint32_t unsigned32;
471
+ } signedUnsigned32;
472
+ signedUnsigned32.unsigned32 = (((uint32_t )bias_data[0 ]) << 24 ) | (((uint32_t )bias_data[1 ]) << 16 ) | (((uint32_t )bias_data[2 ]) << 8 ) | (bias_data[3 ]);
473
+ *bias = signedUnsigned32.signed32 ; // Convert from unsigned to signed with no cast ambiguity
429
474
return result;
430
475
}
431
476
0 commit comments