is there possible to simplify this statement ?

There are same if I using the case statement and while loop.

void decode (unsigned char* msg) {

     if (strstr (msg, "DO=0x00") != NULL) // 0
     {
        //00000
        LATGbits.LATG1    = 0 ; //DO1 OFF
        LATGbits.LATG0    = 1 ; //DO2 OFF
        LATGbits.LATG13   = 1 ; //DO3 OFF
        LATGbits.LATG14   = 1 ; //DO4 OFF
        LATGbits.LATG12   = 1 ; //DO5 OFF
     }
     else if (strstr (msg, "DO=0x01") != NULL)// 1
     {
        //00001
        LATGbits.LATG1    = 1 ; //DO1 ON
        LATGbits.LATG0    = 1 ; //DO2 OFF
        LATGbits.LATG13   = 1 ; //DO3 OFF
        LATGbits.LATG14   = 1 ; //DO4 OFF
        LATGbits.LATG12   = 1 ; //DO5 OFF
     }
         else if (strstr (msg, "DO=0x02") != NULL)// 2
     {
        //00010
        LATGbits.LATG1    = 0 ; //DO1 OFF
        LATGbits.LATG0    = 0 ; //DO2 ON
        LATGbits.LATG13   = 1 ; //DO3 OFF
        LATGbits.LATG14   = 1 ; //DO4 OFF
        LATGbits.LATG12   = 1 ; //DO5 OFF
     }
             else if (strstr (msg, "DO=0x03") != NULL)// 3
     {
        //00011
        LATGbits.LATG1    = 1 ; //DO1 ON
        LATGbits.LATG0    = 0 ; //DO2 ON
        LATGbits.LATG13   = 1 ; //DO3 OFF
        LATGbits.LATG14   = 1 ; //DO4 OFF
        LATGbits.LATG12   = 1 ; //DO5 OFF
     }
             else if (strstr (msg, "DO=0x04") != NULL)// 4
     {
        //00100
        LATGbits.LATG1    = 0 ; //DO1 OFF
        LATGbits.LATG0    = 1 ; //DO2 OFF
        LATGbits.LATG13   = 0 ; //DO3 ON
        LATGbits.LATG14   = 1 ; //DO4 OFF
        LATGbits.LATG12   = 1 ; //DO5 OFF
     }
             else if (strstr (msg, "DO=0x05") != NULL)// 5
     {
        //00101
        LATGbits.LATG1    = 1 ; //DO1 ON
        LATGbits.LATG0    = 1 ; //DO2 OFF
        LATGbits.LATG13   = 0 ; //DO3 ON
        LATGbits.LATG14   = 1 ; //DO4 OFF
        LATGbits.LATG12   = 1 ; //DO5 OFF
     }
             else if (strstr (msg, "DO=0x06") != NULL)// 6
     {
        //00110
        LATGbits.LATG1    = 0 ; //DO1 OFF
        LATGbits.LATG0    = 0 ; //DO2 ON
        LATGbits.LATG13   = 0 ; //DO3 ON
        LATGbits.LATG14   = 1 ; //DO4 OFF
        LATGbits.LATG12   = 1 ; //DO5 OFF
     }
             else if (strstr (msg, "DO=0x07") != NULL)// 7
     {
        //00111
        LATGbits.LATG1    = 1 ; //DO1 ON
        LATGbits.LATG0    = 0 ; //DO2 ON
        LATGbits.LATG13   = 0 ; //DO3 ON
        LATGbits.LATG14   = 1 ; //DO4 OFF
        LATGbits.LATG12   = 1 ; //DO5 OFF
     }
             else if (strstr (msg, "DO=0x08") != NULL)// 8
     {
        //01000
        LATGbits.LATG1    = 0 ; //DO1 OFF
        LATGbits.LATG0    = 1 ; //DO2 OFF
        LATGbits.LATG13   = 1 ; //DO3 OFF
        LATGbits.LATG14   = 0 ; //DO4 ON
        LATGbits.LATG12   = 1 ; //DO5 OFF
     }
             else if (strstr (msg, "DO=0x09") != NULL)// 9
     {
        //01001
        LATGbits.LATG1    = 1 ; //DO1 ON
        LATGbits.LATG0    = 1 ; //DO2 OFF
        LATGbits.LATG13   = 1 ; //DO3 OFF
        LATGbits.LATG14   = 0 ; //DO4 ON
        LATGbits.LATG12   = 1 ; //DO5 OFF
     }
             else if (strstr (msg, "DO=0x0A") != NULL)// 10
     {
        //01010
        LATGbits.LATG1    = 1 ; //DO1 OFF
        LATGbits.LATG0    = 1 ; //DO2 ON
        LATGbits.LATG13   = 1 ; //DO3 OFF
        LATGbits.LATG14   = 0 ; //DO4 ON
        LATGbits.LATG12   = 1 ; //DO5 OFF
     }
             else if (strstr (msg, "DO=0x0B") != NULL)// 11
     {
        //01011
        LATGbits.LATG1    = 1 ; //DO1 ON
        LATGbits.LATG0    = 0 ; //DO2 ON
        LATGbits.LATG13   = 1 ; //DO3 OFF
        LATGbits.LATG14   = 0 ; //DO4 ON
        LATGbits.LATG12   = 1 ; //DO5 OFF
     }
             else if (strstr (msg, "DO=0x0C") != NULL)// 12
     {
        //01100
        LATGbits.LATG1    = 0 ; //DO1 OFF
        LATGbits.LATG0    = 1 ; //DO2 OFF
        LATGbits.LATG13   = 1 ; //DO3 OFF
        LATGbits.LATG14   = 0 ; //DO4 ON
        LATGbits.LATG12   = 0 ; //DO5 ON
     }
             else if (strstr (msg, "DO=0x0D") != NULL)// 13
     {
        //01101
        LATGbits.LATG1    = 1 ; //DO1 ON
        LATGbits.LATG0    = 1 ; //DO2 OFF
        LATGbits.LATG13   = 0 ; //DO3 ON
        LATGbits.LATG14   = 0 ; //DO4 ON
        LATGbits.LATG12   = 1 ; //DO5 OFF
     }
             else if (strstr (msg, "DO=0x0E") != NULL)// 14
     {
        //01110
        LATGbits.LATG1    = 0 ; //DO1 OFF
        LATGbits.LATG0    = 0 ; //DO2 ON
        LATGbits.LATG13   = 0 ; //DO3 ON
        LATGbits.LATG14   = 0 ; //DO4 ON
        LATGbits.LATG12   = 1 ; //DO5 OFF
     }
             else if (strstr (msg, "DO=0x0F") != NULL)// 15
     {
        //01111
        LATGbits.LATG1    = 1 ; //DO1 ON
        LATGbits.LATG0    = 0 ; //DO2 ON
        LATGbits.LATG13   = 0 ; //DO3 ON
        LATGbits.LATG14   = 0 ; //DO4 ON
        LATGbits.LATG12   = 1 ; //DO5 OFF
     }
             else if (strstr (msg, "DO=0x10") != NULL)// 16
     {
        //10000
        LATGbits.LATG1    = 0 ; //DO1 OFF
        LATGbits.LATG0    = 1 ; //DO2 OFF
        LATGbits.LATG13   = 1 ; //DO3 OFF
        LATGbits.LATG14   = 1 ; //DO4 OFF
        LATGbits.LATG12   = 0 ; //DO5 O1
     }
             else if (strstr (msg, "DO=0x11") != NULL)// 17
     {
        //10001
        LATGbits.LATG1    = 1 ; //DO1 ON
        LATGbits.LATG0    = 1 ; //DO2 OFF
        LATGbits.LATG13   = 1 ; //DO3 OFF
        LATGbits.LATG14   = 1 ; //DO4 OFF
        LATGbits.LATG12   = 0 ; //DO5 ON
     }
                else if (strstr (msg, "DO=0x12") != NULL)// 18
     {
        //10010
        LATGbits.LATG1    = 0 ; //DO1 OFF
        LATGbits.LATG0    = 0 ; //DO2 ON
        LATGbits.LATG13   = 1 ; //DO3 OFF
        LATGbits.LATG14   = 1 ; //DO4 OFF
        LATGbits.LATG12   = 0 ; //DO5 ON
     }
                else if (strstr (msg, "DO=0x13") != NULL)// 19
     {
        //10011
        LATGbits.LATG1    = 1 ; //DO1 ON
        LATGbits.LATG0    = 1 ; //DO2 OFF
        LATGbits.LATG13   = 1 ; //DO3 OFF
        LATGbits.LATG14   = 0 ; //DO4 ON
        LATGbits.LATG12   = 0 ; //DO5 ON
     }
                else if (strstr (msg, "DO=0x14") != NULL)// 20
     {
        //10100
        LATGbits.LATG1    = 0 ; //DO1 OFF
        LATGbits.LATG0    = 1 ; //DO2 OFF
        LATGbits.LATG13   = 0 ; //DO3 ON
        LATGbits.LATG14   = 1 ; //DO4 OFF
        LATGbits.LATG12   = 0 ; //DO5 ON
     }
                else if (strstr (msg, "DO=0x15") != NULL)// 21
     {
        //10101
        LATGbits.LATG1    = 1 ; //DO1 ON
        LATGbits.LATG0    = 1 ; //DO2 OFF
        LATGbits.LATG13   = 0 ; //DO3 ON
        LATGbits.LATG14   = 1 ; //DO4 OFF
        LATGbits.LATG12   = 0 ; //DO5 ON
     }
                else if (strstr (msg, "DO=0x16") != NULL)// 22
     {
        //10110
        LATGbits.LATG1    = 0 ; //DO1 OFF
        LATGbits.LATG0    = 0 ; //DO2 ON
        LATGbits.LATG13   = 0 ; //DO3 ON
        LATGbits.LATG14   = 1 ; //DO4 OFF
        LATGbits.LATG12   = 0 ; //DO5 ON
     }
                else if (strstr (msg, "DO=0x17") != NULL)// 23
     {
        //10111
        LATGbits.LATG1    = 1 ; //DO1 ON
        LATGbits.LATG0    = 0 ; //DO2 ON
        LATGbits.LATG13   = 0 ; //DO3 ON
        LATGbits.LATG14   = 1 ; //DO4 OFF
        LATGbits.LATG12   = 0 ; //DO5 ON
     }
                else if (strstr (msg, "DO=0x18") != NULL)// 24
     {
        //11000
        LATGbits.LATG1    = 0 ; //DO1 OFF
        LATGbits.LATG0    = 1 ; //DO2 OFF
        LATGbits.LATG13   = 1 ; //DO3 OFF
        LATGbits.LATG14   = 0 ; //DO4 ON
        LATGbits.LATG12   = 0 ; //DO5 ON
     }
                else if (strstr (msg, "DO=0x19") != NULL)// 25
     {
        //11001
        LATGbits.LATG1    = 1 ; //DO1 ON
        LATGbits.LATG0    = 1 ; //DO2 OFF
        LATGbits.LATG13   = 1 ; //DO3 OFF
        LATGbits.LATG14   = 0 ; //DO4 ON
        LATGbits.LATG12   = 0 ; //DO5 ON
     }
                else if (strstr (msg, "DO=0x1A") != NULL)// 26
     {
        //11010
        LATGbits.LATG1    = 0 ; //DO1 OFF
        LATGbits.LATG0    = 0 ; //DO2 ON
        LATGbits.LATG13   = 1 ; //DO3 OFF
        LATGbits.LATG14   = 0 ; //DO4 ON
        LATGbits.LATG12   = 0 ; //DO5 ON
     }
                else if (strstr (msg, "DO=0x1B") != NULL)// 27
     {
        //11011
        LATGbits.LATG1    = 1 ; //DO1 ON
        LATGbits.LATG0    = 0 ; //DO2 ON
        LATGbits.LATG13   = 1 ; //DO3 OFF
        LATGbits.LATG14   = 0 ; //DO4 ON
        LATGbits.LATG12   = 0 ; //DO5 ON
     }
                else if (strstr (msg, "DO=0x1C") != NULL)// 28
     {
        //11100
        LATGbits.LATG1    = 0 ; //DO1 OFF
        LATGbits.LATG0    = 1 ; //DO2 OFF
        LATGbits.LATG13   = 0 ; //DO3 ON
        LATGbits.LATG14   = 0 ; //DO4 ON
        LATGbits.LATG12   = 0 ; //DO5 ON
     }
                else if (strstr (msg, "DO=0x1D") != NULL)//29
     {
        //11101
        LATGbits.LATG1    = 1 ; //DO1 ON
        LATGbits.LATG0    = 1 ; //DO2 OFF
        LATGbits.LATG13   = 0 ; //DO3 ON
        LATGbits.LATG14   = 0 ; //DO4 ON
        LATGbits.LATG12   = 0 ; //DO5 ON
     }
                else if (strstr (msg, "DO=0x1E") != NULL)// 30
     {
        //11110
        LATGbits.LATG1    = 0 ; //DO1 OFF
        LATGbits.LATG0    = 1 ; //DO2 OFF
        LATGbits.LATG13   = 0 ; //DO3 ON
        LATGbits.LATG14   = 0 ; //DO4 ON
        LATGbits.LATG12   = 0 ; //DO5 ON
     }
                else if (strstr (msg, "DO=0x1F") != NULL)// 31
     {
        //11111
        LATGbits.LATG1    = 1 ; //DO1 ON
        LATGbits.LATG0    = 0 ; //DO2 ON
        LATGbits.LATG13   = 0 ; //DO3 ON
        LATGbits.LATG14   = 0 ; //DO4 ON
        LATGbits.LATG12   = 0 ; //DO5 ON
     }
}

The above code shows, when the string is write in HyperTerminal, it will do some action to LED. For example, DO=0x1F will turn on all five LED. Because, based on the 0x1F in binary is IIIII (5-Bit). Is there any ways to simplify the code using bitwise function ?

Recommended Answers

All 2 Replies

I see 2 easy reductions in code.

Take the msg, "DO=0x00" and if this is the always case for the string, convert the last srting number into a number. Now you can use a classic switch to set those values.

Next, why not set all 5 bit to off, and only set the bits you need in each case to on?

Those 2 alone could shrink the source by half the lines.

Now back to school. If I wanted to be really clever I'd look at this as if it was a circuit and use a circuit optimizer to reduce it to a truth table.
https://en.wikipedia.org/wiki/Espresso_heuristic_logic_minimizer

Yes, you can simplify this code - I would suggest to dismiss branching statements in "decode" procedure and make use of static array of LED patterns. Something like:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAKE_PATTERN(b1, b2, b3, b4, b5) ((b1 << 4) | (b2<<3) | (b3<<2) | (b4<<1) | b5)
#define EXTRACT_BIT(pattern, bit) (((1<<bit) & pattern) != 0)

static int ledStates[] = {
                        MAKE_PATTERN(0,1,1,1,1),
                        MAKE_PATTERN(1,1,1,1,1),
                        MAKE_PATTERN(0,0,1,1,1),
                        MAKE_PATTERN(1,0,1,1,1),
                        MAKE_PATTERN(0,1,0,1,1),
                        MAKE_PATTERN(1,1,0,1,1),
                        MAKE_PATTERN(0,0,0,1,1),
                        MAKE_PATTERN(1,0,0,1,1),
                        MAKE_PATTERN(0,1,1,0,1),
                        MAKE_PATTERN(1,1,1,0,1),
                        MAKE_PATTERN(1,1,1,0,1),
                        MAKE_PATTERN(1,0,1,0,1),
                        MAKE_PATTERN(0,1,1,0,0),
                        MAKE_PATTERN(1,1,0,0,1),
                        MAKE_PATTERN(0,0,0,0,1),
                        MAKE_PATTERN(1,0,0,0,1),
                        MAKE_PATTERN(0,1,1,1,0),
                        MAKE_PATTERN(1,1,1,1,0),
                        MAKE_PATTERN(0,0,1,1,0),
                        MAKE_PATTERN(1,1,1,0,0),
                        MAKE_PATTERN(0,1,0,1,0),
                        MAKE_PATTERN(1,1,0,1,0),
                        MAKE_PATTERN(0,0,0,1,0),
                        MAKE_PATTERN(1,0,0,1,0),
                        MAKE_PATTERN(0,1,1,0,0),
                        MAKE_PATTERN(1,1,1,0,0),
                        MAKE_PATTERN(0,0,1,0,0),
                        MAKE_PATTERN(1,0,1,0,0),
                        MAKE_PATTERN(0,1,0,0,0),
                        MAKE_PATTERN(1,1,0,0,0),
                        MAKE_PATTERN(0,1,0,0,0),
                        MAKE_PATTERN(1,0,0,0,0),
                         };

typedef struct LATGbits
{
    unsigned char LATG1;
    unsigned char LATG0;
    unsigned char LATG13;
    unsigned char LATG14;
    unsigned char LATG12;

} LATGbits;

void decode (unsigned char * msg) {
    char * found = strstr(msg, "DO=");

    if (found == NULL)
        return;

    int ledPatternIndex = (int)strtol(found+3, NULL, 16);

    // something wrong with input string parsing
    if (ledPatternIndex == 0 && strstr(msg, "DO=0x00") == NULL)
        return;

    if (ledPatternIndex > 31)
        return;

    int pattern = ledStates[ledPatternIndex];

    LATGbits lATGbits;

    lATGbits.LATG1    = EXTRACT_BIT(pattern, 4);
    lATGbits.LATG0    = EXTRACT_BIT(pattern, 3) ;
    lATGbits.LATG13   = EXTRACT_BIT(pattern, 2) ;
    lATGbits.LATG14   = EXTRACT_BIT(pattern, 1) ;
    lATGbits.LATG12   = EXTRACT_BIT(pattern, 0) ;
}

int main()
{
    decode("DO=0x07");
    return 0;
}

Hope that helps !

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.