C++ main entry point: Difference between revisions
(→CMake) |
(→Main) |
||
(13 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
Back to [[Robobot B]]. | Back to [[Robobot B]]. | ||
Back to [[Robobot software description]] | Back to [[Robobot software description]] | ||
== Main == | == Main == | ||
C++ starts executing a function called ''main(int argc, char ** argv)'' | C++ starts executing a function called ''main(int argc, char ** argv)''. | ||
In Robobot, this is relatively simple, and the intention is explained here. | |||
In Robobot, this is | |||
The main.cpp file looks like this (slightly reduced): | The main.cpp file looks like this (slightly reduced): | ||
Line 23: | Line 23: | ||
#include <string> | #include <string> | ||
// | // | ||
// | // Include local files for data values and functions | ||
#include "uservice.h" | #include "uservice.h" | ||
#include "cmixer.h" | #include "cmixer.h" | ||
Line 36: | Line 36: | ||
{ // turn on LED on port 16 | { // turn on LED on port 16 | ||
gpio.setPin(16, 1); | gpio.setPin(16, 1); | ||
// | // | ||
// Run the behaviour plans in this sequence | |||
plan20.run(); | |||
plan40.run(); | |||
// | |||
mixer.setVelocity(0.0); | mixer.setVelocity(0.0); | ||
mixer.setTurnrate(0.0); | mixer.setTurnrate(0.0); | ||
sleep(1); // to allow robot to stop while logging is running | sleep(1); // to allow the robot to stop while logging is running | ||
// turn off led 16 | // turn off led 16 | ||
gpio.setPin(16, 0); | gpio.setPin(16, 0); | ||
Line 58: | Line 54: | ||
The main function handles: | The main function handles: | ||
* '''setup''' | * '''setup''' all modules by calling ''setup(...)'' in the service module. | ||
* '''run''' the mission (or missions) needed. | * '''run''' the mission (or missions) needed. | ||
* '''stop and terminate''' | * '''stop and terminate''' properly; the service module handles the termination details. | ||
=== Run mission === | === Run mission === | ||
Line 66: | Line 62: | ||
The entire mission can be divided into smaller parts that can be tested individually. | The entire mission can be divided into smaller parts that can be tested individually. | ||
One example could be ''plan20''. | One example could be ''plan20'' in the example above in the '''main.cpp''' file. | ||
int main(...) | |||
{ | |||
... | |||
'''plan20.run'''(); | |||
... | |||
} | |||
The behaviour plan itself (in '''bplan20.cpp''') tests whether the plan should be active. | |||
void BPlan20::run() | |||
{ | |||
if (not setupDone) | |||
setup(); | |||
'''if (ini["plan20"]["run"] == "false")''' | |||
''' return;''' | |||
bool finished = false; | |||
bool lost = false; | |||
... | |||
} | |||
The '''ini["plan20"]["run"]''' refers to the configuration file. | |||
The plan can be activated by setting the ''run'' flag to "true" in the ''robot.ini'' configuration file. | |||
; part of robot.ini file | ; part of robot.ini file | ||
Line 81: | Line 95: | ||
print = true | print = true | ||
The sequence of the entire mission is handled | The sequence of the entire mission is handled in this ''main'' function. In this case, the mission consists of ''plan20'' and ''plan40''. | ||
You are, of course, allowed to change whatever you like, especially if you find more innovative ways to do it. | You are, of course, allowed to change whatever you like, especially if you find more innovative ways to do it. | ||
Line 88: | Line 102: | ||
=== Copyright === | === Copyright === | ||
All software, specific for Robobot, is free to use and change, according to the MIT License | All software, specific for Robobot, is free to use and change, according to the MIT License, one of the least restrictive copyright types. | ||
=== Include files === | === Include files === | ||
The compiler needs to know where these functions are defined to call functions. C++ handles this by including the needed files before compiling. | |||
Where to look for these files is indicated by the brackets, like | Where to look for these files is indicated by the brackets, like | ||
Line 102: | Line 116: | ||
The second file ''bplan20.h'' is in ".." bracket, indicating that the file is in the same directory as the file that includes the file. | The second file ''bplan20.h'' is in ".." bracket, indicating that the file is in the same directory as the file that includes the file. | ||
Latest revision as of 09:08, 23 January 2024
Back to Robobot B.
Back to Robobot software description
Main
C++ starts executing a function called main(int argc, char ** argv). In Robobot, this is relatively simple, and the intention is explained here.
The main.cpp file looks like this (slightly reduced):
/* #*************************************************************************** #* Copyright (C) 2023 by DTU #* jcan@dtu.dk #* #* The MIT License (MIT) https://mit-license.org/ #***************************************************************************/ // System libraries #include <iostream> #include <stdio.h> #include <string.h> #include <string> // // Include local files for data values and functions #include "uservice.h" #include "cmixer.h" #include "sgpiod.h" #include "bplan20.h" #include "bplan40.h" int main (int argc, char **argv) { // prepare all modules and start data flow bool setupOK = service.setup(argc, argv); if (setupOK) { // turn on LED on port 16 gpio.setPin(16, 1); // // Run the behaviour plans in this sequence plan20.run(); plan40.run(); // mixer.setVelocity(0.0); mixer.setTurnrate(0.0); sleep(1); // to allow the robot to stop while logging is running // turn off led 16 gpio.setPin(16, 0); } // close all logfiles service.terminate(); }
The main() function
The main function handles:
- setup all modules by calling setup(...) in the service module.
- run the mission (or missions) needed.
- stop and terminate properly; the service module handles the termination details.
Run mission
The entire mission can be divided into smaller parts that can be tested individually.
One example could be plan20 in the example above in the main.cpp file.
int main(...) { ... plan20.run(); ... }
The behaviour plan itself (in bplan20.cpp) tests whether the plan should be active.
void BPlan20::run() { if (not setupDone) setup(); if (ini["plan20"]["run"] == "false") return; bool finished = false; bool lost = false; ... }
The ini["plan20"]["run"] refers to the configuration file.
The plan can be activated by setting the run flag to "true" in the robot.ini configuration file.
; part of robot.ini file [plan20] log = true run = true print = true
The sequence of the entire mission is handled in this main function. In this case, the mission consists of plan20 and plan40.
You are, of course, allowed to change whatever you like, especially if you find more innovative ways to do it. The main objective has been to make it readable, understandable and then functional.
Copyright
All software, specific for Robobot, is free to use and change, according to the MIT License, one of the least restrictive copyright types.
Include files
The compiler needs to know where these functions are defined to call functions. C++ handles this by including the needed files before compiling.
Where to look for these files is indicated by the brackets, like
#include <string> #include "bplan20.h"
The first file included is string in <..> brackets, indicating that this is a system library, and the path for such libraries is part of the compile parameters.
The second file bplan20.h is in ".." bracket, indicating that the file is in the same directory as the file that includes the file.