uint16_t uiTestVar = 0xE402;
enum class permission
{
READ,
WRITE
};
template <typename tVar>
auto bitManipulation (permission p, tVar &input, byte byBitPos, bool x) -> bool;
auto bitRangeCheck(uint8_t uiSize, byte byBitPos) -> bool;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
// Try to read out of range;
Serial.println(bitManipulation(permission::READ, uiTestVar, 17, false));
// reading a in Range bit:
Serial.println(bitManipulation(permission::READ, uiTestVar, 7, false));
// writing a bit:
bitManipulation(permission::WRITE, uiTestVar, 4, false);
Serial.println(uiTestVar);
}
void loop() {
// put your main code here, to run repeatedly:
}
// The counting of the bitpositions is starting with index 0
template <typename tVar>
auto bitManipulation (permission p, tVar &input, byte byBitPos, bool x ) -> bool
{
auto size = sizeof(input);
if(!bitRangeCheck(size, byBitPos))
{
Serial.println("Error: Bitposition is out of range!");
return false;
}
else
{
switch (p)
{
case permission::READ :
return (input >> byBitPos) & 1UL;
break;
case permission::WRITE :
if (x)
input |= 1UL << byBitPos; // set bit to 1
else
input &= ~(1UL << byBitPos); // Set Bit to 0
break;
default:
Serial.println("No valid permission option!");
break;
}
}
}
// checking whether the passed bitPosition is out of range of the variable
auto bitRangeCheck(uint8_t uiSize, byte byBitPos) -> bool
{
switch (uiSize)
{
case 1:
if (byBitPos > 7)
return false;
else
return true;
break;
// uint16 or int16
case 2:
if (byBitPos > 15)
return false;
else
return true;
break;
// uint32 or int32
case 4:
if (byBitPos > 31)
return false;
else
return true;
break;
// uint64 or int64
case 8:
if (byBitPos > 63)
return false;
else
return true;
break;
// uint8 or int8
default:
Serial.println("This Size is not programmed to check: " + String(uiSize));
break;
}
}