Decode Status Register into Human-Readable Flags

Code

#include <stdio.h>
#include <stdint.h>

#define POWER_ON_FLAG (1U << 0)
#define ERROR_FLAG (1U << 1)
#define TX_READY_FLAG (1U << 2)
#define RX_READY_FLAG (1U << 3)
#define OVERHEAT_FLAG (1U << 4)
#define UNDERVOLTAGE_FLAG (1U << 5)
#define TIMEOUT_FLAG (1U << 6)
#define RESERVED_FLAG (1U << 7)

#define FLAG_COUNT 8U

struct flag_entry {
    uint8_t flag;
    const char *name;
};

static const struct flag_entry flags[FLAG_COUNT] = {
    {POWER_ON_FLAG, "Power On"},
    {ERROR_FLAG, "Error"},
    {TX_READY_FLAG, "Tx Ready"},
    {RX_READY_FLAG, "Rx Ready"},
    {OVERHEAT_FLAG, "Overheat"},
    {UNDERVOLTAGE_FLAG, "Undervoltage"},
    {TIMEOUT_FLAG, "Timeout"},
    {RESERVED_FLAG, "Reserved"}
};

void decode_status(uint8_t status_reg) {
    for (unsigned i = 0; i < FLAG_COUNT; i++) {
        if (status_reg & flags[i].flag)
            printf("%s\n", flags[i].name);
    }
}

int main() {
    uint8_t reg;
    scanf("%hhu", &reg);
    decode_status(reg);
    return 0;
}

Solving Approach

 

 

 

Upvote
Downvote
Loading...

Input

13

Expected Output

Power On Tx Ready Rx Ready