I’ve been trying to pack 3 rotations (ranging from 0 - 360) and 3 button states into a unsigned long variable. This worked great, and to make it more clear, here is a visual representation:
bits stored in a 32 bit unsigned long. I mapped the bits with square brackets, and from right to left:
- 3 bits for 3 button states, 1 is on, 0 is off
- 9 bits for Z axis (0-360 degrees), and 2 other groups for Y and X
00[000000 000][00000 0000][0000 00000]
I used this code to map those values:
where x, y and z are int values, and packedInfo is an unsigned long value
x = (ypr * 180 / M_PI); if( x < 0) x += 360; y = (ypr * 180 / M_PI); if( y < 0) y += 360; z = (ypr * 180 / M_PI); if( z < 0) z += 360; packedInfo = (x << 21UL | y << 12UL | z << 3 | (digitalRead(5) == LOW ? 1 : 0) << 2 | (digitalRead(6) == LOW ? 1 : 0) << 1 | (digitalRead(7) == LOW ? 1 : 0));
Now I want to unpack those values, and this is where everything goes wrong. First I had problems assigning the x and y values by bitshifting, but this was due to a problem with 21 and 12 (bitshift values for x and y) being normal integers but those are 16 bit, while I want to assign it to a 32 bit unsigned long, so the data got lost. I think I fixed this by converting the number to a unsigned long by adding ‘UL’ to it, altho I’m not 100% sure this works.
So, to unpack these values, I tried this piece of code:
unsigned long mask = 511; Serial.print("x1: "); Serial.print(x); Serial.print(" y1: "); Serial.print(y); Serial.print(" z1: "); Serial.print(z); Serial.println(""); Serial.print("x: "); int xResult = packedInfo >> 21UL; Serial.print((unsigned long)xResult); Serial.print(" y: "); int yResult = packedInfo >> 12UL & mask; Serial.print((unsigned long)yResult); Serial.print(" z: "); int zResult = packedInfo >> 3 & mask; Serial.print((unsigned long)zResult); Serial.println("");
Which works perfectly for my button states, and Z axis, but y and x (which are the bits packed at the most elft side of the unsigned long) are number bigger than 360. X mostly is around 2047 and y around 511.
I think this has something to do with converting datatypes, from unsigned to signed ? Would be nice if someone could explain my struggle here!
Thanks a lot