Skip to content

Commit d3578e2

Browse files
committed
Avoid any possible cast ambiguity
Yes, I know, this probably doesn't change anything... And may make the code slightly slower... But, in my mind, this is the least ambiguous way to convert the big endian bytes to int32_t.
1 parent 650a2ea commit d3578e2

File tree

1 file changed

+54
-9
lines changed

1 file changed

+54
-9
lines changed

src/ICM_20948.cpp

Lines changed: 54 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,12 @@ ICM_20948_Status_e ICM_20948::GetBiasGyroX( int32_t* bias)
281281
ICM_20948_Status_e result = ICM_20948_Stat_Ok;
282282
unsigned char bias_data[4] = { 0 };
283283
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
285290
return result;
286291
}
287292

@@ -290,7 +295,12 @@ ICM_20948_Status_e ICM_20948::GetBiasGyroY( int32_t* bias)
290295
ICM_20948_Status_e result = ICM_20948_Stat_Ok;
291296
unsigned char bias_data[4] = { 0 };
292297
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
294304
return result;
295305
}
296306

@@ -299,7 +309,12 @@ ICM_20948_Status_e ICM_20948::GetBiasGyroZ( int32_t* bias)
299309
ICM_20948_Status_e result = ICM_20948_Stat_Ok;
300310
unsigned char bias_data[4] = { 0 };
301311
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
303318
return result;
304319
}
305320
//Accel Bias
@@ -344,7 +359,12 @@ ICM_20948_Status_e ICM_20948::GetBiasAccelX( int32_t* bias)
344359
ICM_20948_Status_e result = ICM_20948_Stat_Ok;
345360
unsigned char bias_data[4] = { 0 };
346361
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
348368
return result;
349369
}
350370

@@ -353,7 +373,12 @@ ICM_20948_Status_e ICM_20948::GetBiasAccelY( int32_t* bias)
353373
ICM_20948_Status_e result = ICM_20948_Stat_Ok;
354374
unsigned char bias_data[4] = { 0 };
355375
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
357382
return result;
358383
}
359384

@@ -362,7 +387,12 @@ ICM_20948_Status_e ICM_20948::GetBiasAccelZ( int32_t* bias)
362387
ICM_20948_Status_e result = ICM_20948_Stat_Ok;
363388
unsigned char bias_data[4] = { 0 };
364389
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
366396
return result;
367397
}
368398
//CPass Bias
@@ -407,7 +437,12 @@ ICM_20948_Status_e ICM_20948::GetBiasCPassX( int32_t* bias)
407437
ICM_20948_Status_e result = ICM_20948_Stat_Ok;
408438
unsigned char bias_data[4] = { 0 };
409439
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
411446
return result;
412447
}
413448

@@ -416,7 +451,12 @@ ICM_20948_Status_e ICM_20948::GetBiasCPassY( int32_t* bias)
416451
ICM_20948_Status_e result = ICM_20948_Stat_Ok;
417452
unsigned char bias_data[4] = { 0 };
418453
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
420460
return result;
421461
}
422462

@@ -425,7 +465,12 @@ ICM_20948_Status_e ICM_20948::GetBiasCPassZ( int32_t* bias)
425465
ICM_20948_Status_e result = ICM_20948_Stat_Ok;
426466
unsigned char bias_data[4] = { 0 };
427467
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
429474
return result;
430475
}
431476

0 commit comments

Comments
 (0)