/* * Copyright (C) 2018 dimercur * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /** * \file main.cpp * \author PE.Hladik * \version 1.0 * \date 06/06/2017 * \brief main program */ #include #include #include #include #include #include #include #include #include #include "tasks.h" // Déclaration des taches RT_TASK th_server; RT_TASK th_sendToMon; RT_TASK th_receiveFromMon; RT_TASK th_openComRobot; RT_TASK th_startRobot; RT_TASK th_move; // Déclaration des priorités des taches int PRIORITY_TSERVER = 30; int PRIORITY_TOPENCOMROBOT = 20; int PRIORITY_TMOVE = 10; int PRIORITY_TSENDTOMON = 25; int PRIORITY_TRECEIVEFROMMON = 22; int PRIORITY_TSTARTROBOT = 20; RT_MUTEX mutex_robotStarted; RT_MUTEX mutex_move; // Déclaration des sémaphores RT_SEM sem_barrier; RT_SEM sem_openComRobot; RT_SEM sem_serverOk; RT_SEM sem_startRobot; // Déclaration des files de message RT_QUEUE q_messageToMon; int MSG_QUEUE_SIZE = 10; // Déclaration des ressources partagées int etatCommMoniteur = 1; int robotStarted = 0; char robotMove = DMB_STOP_MOVE; /** * \fn void initStruct(void) * \brief Initialisation des structures de l'application (tâches, mutex, * semaphore, etc.) */ void initStruct(void); /** * \fn void startTasks(void) * \brief Démarrage des tâches */ void startTasks(void); /** * \fn void deleteTasks(void) * \brief Arrêt des tâches */ void deleteTasks(void); int main(int argc, char **argv) { int err; //Lock the memory to avoid memory swapping for this program mlockall(MCL_CURRENT | MCL_FUTURE); printf("#################################\n"); printf("# DE STIJL PROJECT #\n"); printf("#################################\n"); initStruct(); startTasks(); rt_sem_broadcast(&sem_barrier); pause(); deleteTasks(); return 0; } void initStruct(void) { int err; /* Creation des mutex */ if (err = rt_mutex_create(&mutex_robotStarted, NULL)) { printf("Error mutex create: %d %s\n", err, strerror(-err)); exit(EXIT_FAILURE); } if (err = rt_mutex_create(&mutex_move, NULL)) { printf("Error mutex create: %s\n", strerror(-err)); exit(EXIT_FAILURE); } /* Creation du semaphore */ if (err = rt_sem_create(&sem_barrier, "truc", 0, S_FIFO)) { printf("Error semaphore create 1: %d %s\n", err, strerror(-err)); exit(EXIT_FAILURE); } if (err = rt_sem_create(&sem_openComRobot, NULL, 0, S_FIFO)) { printf("Error semaphore create 2: %s\n", strerror(-err)); exit(EXIT_FAILURE); } if (err = rt_sem_create(&sem_serverOk, NULL, 0, S_FIFO)) { printf("Error semaphore create 3: %s\n", strerror(-err)); exit(EXIT_FAILURE); } if (err = rt_sem_create(&sem_startRobot, NULL, 0, S_FIFO)) { printf("Error semaphore create 4: %s\n", strerror(-err)); exit(EXIT_FAILURE); } /* Creation des taches */ if (err = rt_task_create(&th_server, "th_server", 0, PRIORITY_TSERVER, 0)) { printf("Error task create: %s\n", strerror(-err)); exit(EXIT_FAILURE); } if (err = rt_task_create(&th_receiveFromMon, "th_receiveFromMon", 0, PRIORITY_TRECEIVEFROMMON, 0)) { printf("Error task create: %s\n", strerror(-err)); exit(EXIT_FAILURE); } if (err = rt_task_create(&th_sendToMon, "th_sendToMon", 0, PRIORITY_TSENDTOMON, 0)) { printf("Error task create: %s\n", strerror(-err)); exit(EXIT_FAILURE); } if (err = rt_task_create(&th_openComRobot, "th_openComRobot", 0, PRIORITY_TOPENCOMROBOT, 0)) { printf("Error task create: %s\n", strerror(-err)); exit(EXIT_FAILURE); } if (err = rt_task_create(&th_startRobot, "th_startRobot", 0, PRIORITY_TSTARTROBOT, 0)) { printf("Error task create: %s\n", strerror(-err)); exit(EXIT_FAILURE); } if (err = rt_task_create(&th_move, "th_move", 0, PRIORITY_TMOVE, 0)) { printf("Error task create: %s\n", strerror(-err)); exit(EXIT_FAILURE); } /* Creation des files de messages */ if (err = rt_queue_create(&q_messageToMon, "toto", MSG_QUEUE_SIZE * sizeof (MessageToRobot), MSG_QUEUE_SIZE, Q_FIFO)) { printf("Error msg queue create: %s\n", strerror(-err)); exit(EXIT_FAILURE); } } void startTasks() { int err; if (err = rt_task_start(&th_startRobot, &f_startRobot, NULL)) { printf("Error task start: %s\n", strerror(-err)); exit(EXIT_FAILURE); } if (err = rt_task_start(&th_receiveFromMon, &f_receiveFromMon, NULL)) { printf("Error task start: %s\n", strerror(-err)); exit(EXIT_FAILURE); } if (err = rt_task_start(&th_sendToMon, &f_sendToMon, NULL)) { printf("Error task start: %s\n", strerror(-err)); exit(EXIT_FAILURE); } if (err = rt_task_start(&th_openComRobot, &f_openComRobot, NULL)) { printf("Error task start: %s\n", strerror(-err)); exit(EXIT_FAILURE); } if (err = rt_task_start(&th_move, &f_move, NULL)) { printf("Error task start: %s\n", strerror(-err)); exit(EXIT_FAILURE); } if (err = rt_task_start(&th_server, &f_server, NULL)) { printf("Error task start: %s\n", strerror(-err)); exit(EXIT_FAILURE); } } void deleteTasks() { rt_task_delete(&th_server); rt_task_delete(&th_openComRobot); rt_task_delete(&th_move); }