0

Hey guys I am very new to C programming but i find it super interesting,

I am currently working on a robot to improve my C skills, I am programming it so that it does not crash(with the help of its IR sensors)

I want to be ableto make the C code i have written cleaner and more proffessional lets say, so far i have packed everything in the main(), all my functions/methods etc.

I want to make header files for each switch case and/or function I have used in the main(). I have watched a few youtube tutorials and some google sites but i do not know how to implement it for my code I have written.

IN ORDER FOR ME TO SHOW YOU WHAT I MEAN I HAVE TO POST THE WHOLE CODE BUT PLEASE HAVE SOME PATIENCE AND READ THROUGH IF YOU GUYS CAN. I know Stackoverflow does not reccommend posting the whole code.

Anyways could you guys help me out? If you guys can show me how i can do that with a few examples I would very much appreciate it.

And if you guys can give me a few pointers on how exactly to comment code that would be nice too. Yes pointers was a pun.

The main.h has all the libraries neccassary for the robot.

#include "main.h"

/**
 * The Main
 */

int main() {

    sei();

    bot_init();
    display_init(DISPLAY_TYPE_TXT);
    gfx_init();
    floor_init();
    leds_init();
    spi_init();
    i2c_init();

    /**
     * 2 Different states for of the distance sensor
     */
    enum new_State
    {
        OBJECT_DETECTED, NO_OBJECT_DETECTED
    };

    /**
     * There are 5 distance sensors and each of them need a state variable
     */

    typedef enum new_State state_t;
    state_t state0;
    state_t state1;
    state_t state2;
    state_t state3;
    state_t state4;

    /**
     * The s3 button needs two states
     * TRUE = ON
     * FALSE = OFF
     */
    enum s3_State
    {
        S3_TRUE, S3_FALSE
    };
    typedef enum s3_State s3_State;

    s3_State s3; /// state of the s3 button

    /*
     * The following is a distance measuring Function
     * The coprozessor needs to be initialized for this because
     * the distance measurement is done with the help of the IR sensors
     * and the coprozessor handles it
     * Function is derived from the HelloDistance example
     */
    copro_ir_startMeasure();

    /// Text output
    ///char output[20]= "";
    /// Vairbale for storing/ buffering sensor values
    int current_distance = 0;

    /// Sign for different movement switch cases
    int sign = 0;

    while (1 == 1)
    {
        /// Default state of the s3 button
        s3 = S3_FALSE;

        if (s3_was_pressed())
        {
            if (s3 == S3_FALSE)
            {
                s3 = S3_TRUE; /// Switches s3 button ON/TRUE
            }
            else
            {
                s3 = S3_FALSE; /// Switches s3 button OFF/FALSE
            }

    }
        while (s3 == S3_TRUE)
        {
            /**
             * When/If the s3 Button is pressed all LEDs MUST
             * turn off
             */

        if (s3_was_pressed()) {
            copro_stop(); /// Stops Coprozessor
                leds_set_status(LEDS_OFF, 0);
                leds_set_status(LEDS_OFF, 1);
                leds_set_status(LEDS_OFF, 2);
                leds_set_status(LEDS_OFF, 3);
                leds_set_status(LEDS_OFF, 4);
                leds_set_status(LEDS_OFF, 5);
                leds_set_status(LEDS_OFF, 6);
                break;
            }


        /// initiating the distance sensors
        /// output displays the distance from each sensor


            char output[20] = "";
            sprintf(output, "%3i", current_distance);
            gfx_move(25, 25);
            gfx_print_text(output);

            for(int i = 1; i < 5; i++){

                current_distance = copro_distance[i]/256;

            ///uint8_t distance = nds3_get_dist();
            uint8_t distance = copro_ir_startMeasure();
            char text[20] = "";
            sprintf(text, "Distance: %3i", (int) distance);
            gfx_move(0, 0);
            gfx_print_text(text);
            copro_update();
            ///current_distance = copro_distance[0] / 256;
            }











            /**
             * A Switch case function for measuring distance
             * from each sensor. If distance < 200 then there is no object
             * LEDs will stay green if no objects are detected (200 <)
             * If the distance between object and sensor > 200 then there is an object near the sensor
             * LED will turn RED indicating Object detection
             */
            for (int i = 0; i < 5; i++) {
                current_distance = copro_distance[i] / 256;

                switch (i)
                {
                case 0:
                    if (current_distance < 120)
                    {
                        state0 = NO_OBJECT_DETECTED;
                        leds_set_status(LEDS_GREEN, 7);

                    } else

                    {
                        state0 = OBJECT_DETECTED;
                        leds_set_status(LEDS_RED, 7);
                    }
                    break;

                case 1:
                    if (current_distance < 120)
                    {
                        state1 = NO_OBJECT_DETECTED;
                        leds_set_status(LEDS_GREEN, 6);
                    } else

                    {
                        state1 = OBJECT_DETECTED;
                        leds_set_status(LEDS_RED, 6);
                    }
                    break;

                case 2:
                    /*
                     * Sensors in front need more space
                     * hence a it needs more distance to react to objects
                     * Turn left or right
                     */
                    if (current_distance < 100)
                    {
                        state2 = NO_OBJECT_DETECTED;
                        leds_set_status(LEDS_GREEN, 4);
                        leds_set_status(LEDS_GREEN, 5);
                    } else
                    {
                        state2 = OBJECT_DETECTED;
                        leds_set_status(LEDS_RED, 4);
                        leds_set_status(LEDS_RED, 5);
                    }
                    break;
                case 3:
                    if (current_distance < 100)

                    {
                        state3 = NO_OBJECT_DETECTED;
                        leds_set_status(LEDS_GREEN, 3);
                    } else

                    {
                        state3 = OBJECT_DETECTED;
                        leds_set_status(LEDS_RED, 3);
                    }
                    break;
                case 4:
                    if (current_distance < 100)

                    {
                        state4 = NO_OBJECT_DETECTED;
                        leds_set_status(LEDS_GREEN, 2);
                    } else

                    {
                        state4 = OBJECT_DETECTED;
                        leds_set_status(LEDS_RED, 2);
                    }
                    break;
                }

                /*
                 * If the front sensors do not detect any objects
                 */
                if (state1 == NO_OBJECT_DETECTED && state2 == NO_OBJECT_DETECTED
                        && state3 == NO_OBJECT_DETECTED)

                {
                    /*
                     * If the path is clear with no objects
                     * This would indicate sign 0
                     * The robo will keep going straight
                     */

                    if (sign == 0)

                    {
                        copro_setSpeed(14, 14); /// Controlling the speed on both motors L & R
                    }


                    /*
                     * If there are Objects in front and on R or L < 200
                     * robo will drive backwards
                     */


                    else if (sign == 1)
                    {
                        copro_setSpeed(-14, -14);
                        if (state0 == NO_OBJECT_DETECTED || state4 == NO_OBJECT_DETECTED)
                        {
                            sign = 2;
                        }
                    }



                    /*
                     * sign 2 indicates that the robo is out of the "Deadlock"
                     * Should avoid "Deadlock"
                     * robo will find open path
                     */



                    else if (sign == 2)
                    {
                        copro_setTargetRel(-200, -200, 20);
                        delay(1000);

                        if(state0 == NO_OBJECT_DETECTED)

                        {
                            copro_setTargetRel(200, -200, 28);
                        }

                        else
                        {
                            copro_setTargetRel(-200,200, 28);
                        }

                        delay(1000);
                        sign = 0;
                    }

                }
                /*
                 * OBJECT_DETECTED on R at distance < 200
                 * robo turns L
                 */
                else if (state1 == OBJECT_DETECTED && state2 == NO_OBJECT_DETECTED
                        && state3 == NO_OBJECT_DETECTED)
                {
                    //copro_stop();
                    copro_setSpeed(0, 14);
                }
                /*
                 * OBJECT_DETECTED on L at distance < 200
                 * robo turns R
                 */
                else if (state1 == NO_OBJECT_DETECTED && state2 == NO_OBJECT_DETECTED
                        && state3 == OBJECT_DETECTED)
                {
                    //copro_stop();
                    copro_setSpeed(14, 0);
                }
                /*
                 * robo is stuck in a deadlock and can reverse backwards
                 * signg1 means deadlock
                 */
                else if (state0 == OBJECT_DETECTED && state2 == OBJECT_DETECTED
                        && state4 == OBJECT_DETECTED)
                {
                    sign = 1;
                    ///copro_stop();
                    copro_setSpeed(-28, -28);

                }
                /*
                 * Object In front
                 * Object on R > 200 robo turns R
                 * Object on L > 200 robo turns L
                 * If both are clear? then what ?
                 */
                else if (state2 == OBJECT_DETECTED)
                {
                    //copro_stop();
                    if (copro_distance[1] / 256 > 100 || copro_distance[0] / 256 > 100)

                    {
                        copro_setSpeed(0, 14);
                    }

                    else if(copro_distance[3] / 256 > 100 || copro_distance[4] / 256 > 100)
                    {
                        copro_setSpeed(14, 0);
                    }

                    else
                    {
                        //copro_stop();
                        copro_setSpeed(0,14);
                    }
                }
            }
        }
    }
}

I would like to once again exaggerate on the fact that I posted all the code because there are several functions withing the function so i need to know how i can make a header file for it.

Ramas
  • 1
  • 5
  • Do *not* put function definitions in a header file. Header files are for declarations only. – William Pursell Nov 02 '21 at 15:20
  • How do you eat an elephant? Bite by bite. Don't try to move everything at once. Start with e.g. `enum new_State`, that's just 4 lines. – MSalters Nov 02 '21 at 15:20
  • 1
    A good [C book](https://stackoverflow.com/questions/562303/the-definitive-c-book-guide-and-list) should explain you how to do so... – Aconcagua Nov 02 '21 at 15:34
  • If you write headers keep in mind to add [include guards](https://en.wikipedia.org/wiki/Include_guard). – Aconcagua Nov 02 '21 at 15:36
  • Minimalistic introduction: Assume you have a function `int f(int n) { return n; }` – then you move that function *definition* to the designated .c file, lets say `f.c`, exactly as is, and you add the *declaration* (`int f(int n);` – note the terminating semicolon and missing function block, i.e. the braces and the code within) to the corresponding header `f.h`. Then `#include `/`#include "f.h"` from whereever you use function `f` (including `f.c` to assure conforming declaration and definition!). – Aconcagua Nov 02 '21 at 15:42

1 Answers1

0

Here is your dream code:

#include "main.h"

/**
 * The Main
 */

/** MY COMMENT: These can be public. */

/**
 * 2 Different states for of the distance sensor
 */
enum new_State
{
    OBJECT_DETECTED, NO_OBJECT_DETECTED
};

/**
 * There are 5 distance sensors and each of them need a state variable
 */

typedef enum new_State state_t;
state_t state0;
state_t state1;
state_t state2;
state_t state3;
state_t state4;

/**
     * The s3 button needs two states
     * TRUE = ON
     * FALSE = OFF
     */
enum s3_State
{
    S3_TRUE, S3_FALSE
};
typedef enum s3_State s3_State;

s3_State s3; /// state of the s3 button

/***********************************************************/

void init_properties (void)
{
    sei();

    bot_init();
    display_init(DISPLAY_TYPE_TXT);
    gfx_init();
    floor_init();
    leds_init();
    spi_init();
    i2c_init();
}

void loop ()
{
    copro_ir_startMeasure();

    int current_distance = 0, sign = 0;

    while (1)
    {
        /// Default state of the s3 button
        s3 = S3_FALSE;

        if (s3_was_pressed())
        {
            if (s3 == S3_FALSE)
            {
                s3 = S3_TRUE; /// Switches s3 button ON/TRUE
            }
            else
            {
                s3 = S3_FALSE; /// Switches s3 button OFF/FALSE
            }

        }
        while (s3 == S3_TRUE)
        {
            /**
             * When/If the s3 Button is pressed all LEDs MUST
             * turn off
             */

        if (s3_was_pressed()) {
            copro_stop(); /// Stops Coprozessor
                leds_set_status(LEDS_OFF, 0);
                leds_set_status(LEDS_OFF, 1);
                leds_set_status(LEDS_OFF, 2);
                leds_set_status(LEDS_OFF, 3);
                leds_set_status(LEDS_OFF, 4);
                leds_set_status(LEDS_OFF, 5);
                leds_set_status(LEDS_OFF, 6);
                break;
            }


        /// initiating the distance sensors
        /// output displays the distance from each sensor


            char output[20] = "";
            sprintf(output, "%3i", current_distance);
            gfx_move(25, 25);
            gfx_print_text(output);

            for(int i = 1; i < 5; i++){

                current_distance = copro_distance[i]/256;

            ///uint8_t distance = nds3_get_dist();
            uint8_t distance = copro_ir_startMeasure();
            char text[20] = "";
            sprintf(text, "Distance: %3i", (int) distance);
            gfx_move(0, 0);
            gfx_print_text(text);
            copro_update();
            ///current_distance = copro_distance[0] / 256;
            }


            /**
             * A Switch case function for measuring distance
             * from each sensor. If distance < 200 then there is no object
             * LEDs will stay green if no objects are detected (200 <)
             * If the distance between object and sensor > 200 then there is 
             * an object near the sensor
             * LED will turn RED indicating Object detection
             */
            for (int i = 0; i < 5; i++) {
                current_distance = copro_distance[i] / 256;

                switch (i)
                {
                case 0:
                    if (current_distance < 120)
                    {
                        state0 = NO_OBJECT_DETECTED;
                        leds_set_status(LEDS_GREEN, 7);

                    } else

                    {
                        state0 = OBJECT_DETECTED;
                        leds_set_status(LEDS_RED, 7);
                    }
                    break;

                case 1:
                    if (current_distance < 120)
                    {
                        state1 = NO_OBJECT_DETECTED;
                        leds_set_status(LEDS_GREEN, 6);
                    } else

                    {
                        state1 = OBJECT_DETECTED;
                        leds_set_status(LEDS_RED, 6);
                    }
                    break;

                case 2:
                    /*
                     * Sensors in front need more space
                     * hence a it needs more distance to react to objects
                     * Turn left or right
                     */
                    if (current_distance < 100)
                    {
                        state2 = NO_OBJECT_DETECTED;
                        leds_set_status(LEDS_GREEN, 4);
                        leds_set_status(LEDS_GREEN, 5);
                    } else
                    {
                        state2 = OBJECT_DETECTED;
                        leds_set_status(LEDS_RED, 4);
                        leds_set_status(LEDS_RED, 5);
                    }
                    break;
                case 3:
                    if (current_distance < 100)

                    {
                        state3 = NO_OBJECT_DETECTED;
                        leds_set_status(LEDS_GREEN, 3);
                    } else

                    {
                        state3 = OBJECT_DETECTED;
                        leds_set_status(LEDS_RED, 3);
                    }
                    break;
                case 4:
                    if (current_distance < 100)

                    {
                        state4 = NO_OBJECT_DETECTED;
                        leds_set_status(LEDS_GREEN, 2);
                    } else

                    {
                        state4 = OBJECT_DETECTED;
                        leds_set_status(LEDS_RED, 2);
                    }
                    break;
                }

                /*
                 * If the front sensors do not detect any objects
                 */
                if (state1 == NO_OBJECT_DETECTED && state2 == NO_OBJECT_DETECTED
                        && state3 == NO_OBJECT_DETECTED)

                {
                    /*
                     * If the path is clear with no objects
                     * This would indicate sign 0
                     * The robo will keep going straight
                     */

                    if (sign == 0)

                    {
                        copro_setSpeed(14, 14); /// Controlling the speed on both motors L & R
                    }


                    /*
                     * If there are Objects in front and on R or L < 200
                     * robo will drive backwards
                     */


                    else if (sign == 1)
                    {
                        copro_setSpeed(-14, -14);
                        if (state0 == NO_OBJECT_DETECTED || state4 == NO_OBJECT_DETECTED)
                        {
                            sign = 2;
                        }
                    }



                    /*
                     * sign 2 indicates that the robo is out of the "Deadlock"
                     * Should avoid "Deadlock"
                     * robo will find open path
                     */



                    else if (sign == 2)
                    {
                        copro_setTargetRel(-200, -200, 20);
                        delay(1000);

                        if(state0 == NO_OBJECT_DETECTED)

                        {
                            copro_setTargetRel(200, -200, 28);
                        }

                        else
                        {
                            copro_setTargetRel(-200,200, 28);
                        }

                        delay(1000);
                        sign = 0;
                    }

                }
                /*
                 * OBJECT_DETECTED on R at distance < 200
                 * robo turns L
                 */
                else if (state1 == OBJECT_DETECTED && state2 == NO_OBJECT_DETECTED
                        && state3 == NO_OBJECT_DETECTED)
                {
                    //copro_stop();
                    copro_setSpeed(0, 14);
                }
                /*
                 * OBJECT_DETECTED on L at distance < 200
                 * robo turns R
                 */
                else if (state1 == NO_OBJECT_DETECTED && state2 == NO_OBJECT_DETECTED
                        && state3 == OBJECT_DETECTED)
                {
                    //copro_stop();
                    copro_setSpeed(14, 0);
                }
                /*
                 * robo is stuck in a deadlock and can reverse backwards
                 * signg1 means deadlock
                 */
                else if (state0 == OBJECT_DETECTED && state2 == OBJECT_DETECTED
                        && state4 == OBJECT_DETECTED)
                {
                    sign = 1;
                    ///copro_stop();
                    copro_setSpeed(-28, -28);

                }
                /*
                 * Object In front
                 * Object on R > 200 robo turns R
                 * Object on L > 200 robo turns L
                 * If both are clear? then what ?
                 */
                else if (state2 == OBJECT_DETECTED)
                {
                    //copro_stop();
                    if (copro_distance[1] / 256 > 100 || copro_distance[0] / 256 > 100)

                    {
                        copro_setSpeed(0, 14);
                    }

                    else if(copro_distance[3] / 256 > 100 || copro_distance[4] / 256 > 100)
                    {
                        copro_setSpeed(14, 0);
                    }

                    else
                    {
                        //copro_stop();
                        copro_setSpeed(0,14);
                    }
                }
            }
        }
    }
}

/**********************************************************/

int main() {
    init_properties();
    loop();
}

I am pretty sure that i accounted for variable scope things. If you put the new functions in a utils.c file, create a utils.h file with the function declarations (as opposed to function definitions.).

ADBeveridge
  • 650
  • 3
  • 15
  • That `for (int i = 0; i < 5; i++)` should really go into a function, too. – Neil Nov 03 '21 at 02:09
  • THanks a lot guys I really appreciate it. But i took your Idea @ADBeveridge and then made more functions and onlc called them from the main – Ramas Nov 04 '21 at 09:11