passage au tout objet en cours
This commit is contained in:
parent
a8b1fb8f44
commit
34d1cb6bd8
24 changed files with 2212 additions and 370 deletions
|
@ -1,189 +0,0 @@
|
|||
/*
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "comgui.h"
|
||||
#include <iostream>
|
||||
#include <sys/socket.h>
|
||||
|
||||
#include <netdb.h>
|
||||
#include <unistd.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
#include <algorithm>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
|
||||
/*
|
||||
* Constants used for sending commands to gui
|
||||
*/
|
||||
const string LABEL_GUI_ANGULAR_POSITION = "AngularPosition";
|
||||
const string LABEL_GUI_ANGULAR_SPEED = "AngularSpeed";
|
||||
const string LABEL_GUI_BATTERY_LEVEL = "Battery";
|
||||
const string LABEL_GUI_LINEAR_SPEED = "LinearSpeed";
|
||||
const string LABEL_GUI_USER_PRESENCE = "User";
|
||||
const string LABEL_GUI_BETA_ANGLE = "Beta";
|
||||
const string LABEL_GUI_TORQUE = "Torque";
|
||||
const string LABEL_GUI_EMERGENCY_STOP = "Emergency";
|
||||
const string LABEL_GUI_LOG = "Log";
|
||||
|
||||
/**
|
||||
* Create a server and open a socket over TCP
|
||||
*
|
||||
* @param port Port used for communication
|
||||
* @return Socket number
|
||||
* @throw std::runtime_error if it fails
|
||||
*/
|
||||
int ComGui::Open(int port) {
|
||||
struct sockaddr_in server;
|
||||
|
||||
socketFD = socket(AF_INET, SOCK_STREAM, 0);
|
||||
if (socketFD < 0) {
|
||||
throw std::runtime_error{"ComGui::Open : Can not create socket"};
|
||||
}
|
||||
|
||||
server.sin_addr.s_addr = INADDR_ANY;
|
||||
server.sin_family = AF_INET;
|
||||
server.sin_port = htons(port);
|
||||
|
||||
if (bind(socketFD, (struct sockaddr *) &server, sizeof (server)) < 0) {
|
||||
throw std::runtime_error{"ComGui::Open : Can not bind socket on port " + std::to_string(port)};
|
||||
}
|
||||
|
||||
listen(socketFD, 1);
|
||||
|
||||
return socketFD;
|
||||
}
|
||||
|
||||
/**
|
||||
* Close socket and server
|
||||
*/
|
||||
void ComGui::Close() {
|
||||
close(socketFD);
|
||||
|
||||
socketFD = -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Wait for a client to connect
|
||||
* @return Client number
|
||||
* @throw std::runtime_error if it fails
|
||||
*/
|
||||
int ComGui::AcceptClient() {
|
||||
struct sockaddr_in client;
|
||||
int c = sizeof (struct sockaddr_in);
|
||||
|
||||
clientID = accept(socketFD, (struct sockaddr *) &client, (socklen_t*) & c);
|
||||
|
||||
if (clientID < 0)
|
||||
throw std::runtime_error {
|
||||
"ComGui::AcceptClient : Accept failed"
|
||||
};
|
||||
|
||||
return clientID;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a message to GUI
|
||||
*
|
||||
* @param msg Message to send to GUI
|
||||
* @attention Message given in parameter will be destroyed (delete) after being sent. No need for user to delete message after that.
|
||||
* @warning Write is not thread safe : check that multiple tasks can't access this method simultaneously
|
||||
*/
|
||||
void ComGui::Write(Message* msg) {
|
||||
string *str;
|
||||
|
||||
// Call user method before Write
|
||||
Write_Pre();
|
||||
|
||||
/* Convert message to string to send to GUI */
|
||||
str = MessageToString(msg);
|
||||
|
||||
//cout << "Message sent to GUI: " << str->c_str() << endl;
|
||||
write(clientID, str->c_str(), str->length());
|
||||
|
||||
delete(str);
|
||||
|
||||
// Call user method after write
|
||||
Write_Post();
|
||||
}
|
||||
|
||||
/**
|
||||
* Method used internally to convert a message content to a string that can be sent over TCP
|
||||
* @param msg Message to be converted
|
||||
* @return A string, image of the message
|
||||
*/
|
||||
string *ComGui::MessageToString(Message *msg) {
|
||||
int id;
|
||||
string *str;
|
||||
|
||||
if (msg != NULL) {
|
||||
id = msg->GetID();
|
||||
|
||||
switch (id) {
|
||||
case MESSAGE_ANGLE_POSITION:
|
||||
str = new string(LABEL_GUI_ANGULAR_POSITION + "=" + to_string(((MessageFloat*) msg)->GetValue()) + "\n");
|
||||
replace(str->begin(), str->end(), '.', ','); // Mono C# require float to have a , instead of a .
|
||||
break;
|
||||
case MESSAGE_ANGULAR_SPEED:
|
||||
str = new string(LABEL_GUI_ANGULAR_SPEED + "=" + to_string(((MessageFloat*) msg)->GetValue()) + "\n");
|
||||
replace(str->begin(), str->end(), '.', ','); // Mono C# require float to have a , instead of a .
|
||||
break;
|
||||
case MESSAGE_BATTERY:
|
||||
str = new string(LABEL_GUI_BATTERY_LEVEL + "=" + to_string(((MessageFloat*) msg)->GetValue()) + "\n");
|
||||
replace(str->begin(), str->end(), '.', ','); // Mono C# require float to have a , instead of a .
|
||||
break;
|
||||
case MESSAGE_BETA:
|
||||
str = new string(LABEL_GUI_BETA_ANGLE + "=" + to_string(((MessageFloat*) msg)->GetValue()) + "\n");
|
||||
replace(str->begin(), str->end(), '.', ','); // Mono C# require float to have a , instead of a .
|
||||
break;
|
||||
case MESSAGE_LINEAR_SPEED:
|
||||
str = new string(LABEL_GUI_LINEAR_SPEED + "=" + to_string(((MessageFloat*) msg)->GetValue()) + "\n");
|
||||
replace(str->begin(), str->end(), '.', ','); // Mono C# require float to have a , instead of a .
|
||||
break;
|
||||
case MESSAGE_TORQUE:
|
||||
str = new string(LABEL_GUI_TORQUE + "=" + to_string(((MessageFloat*) msg)->GetValue()) + "\n");
|
||||
replace(str->begin(), str->end(), '.', ','); // Mono C# require float to have a , instead of a .
|
||||
break;
|
||||
case MESSAGE_EMERGENCY_STOP:
|
||||
str = new string(LABEL_GUI_EMERGENCY_STOP + "=");
|
||||
if (((MessageBool*) msg)->GetState())
|
||||
str->append("True\n");
|
||||
else
|
||||
str->append("False\n");
|
||||
break;
|
||||
case MESSAGE_USER_PRESENCE:
|
||||
str = new string(LABEL_GUI_USER_PRESENCE + "=");
|
||||
if (((MessageBool*) msg)->GetState())
|
||||
str->append("True\n");
|
||||
else
|
||||
str->append("False\n");
|
||||
break;
|
||||
case MESSAGE_EMPTY:
|
||||
str = new string(""); //empty string
|
||||
break;
|
||||
case MESSAGE_LOG:
|
||||
str = new string(LABEL_GUI_LOG + "=" + ((MessageString*) msg)->GetString() + "\n");
|
||||
break;
|
||||
default:
|
||||
str = new string(""); //empty string
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return str;
|
||||
}
|
336
software/raspberry/superviseur-robot/lib/commonitor.cpp
Normal file
336
software/raspberry/superviseur-robot/lib/commonitor.cpp
Normal file
|
@ -0,0 +1,336 @@
|
|||
/*
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "commonitor.h"
|
||||
#include <iostream>
|
||||
#include <sys/socket.h>
|
||||
|
||||
#include <netdb.h>
|
||||
#include <unistd.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
#include <algorithm>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
|
||||
/*
|
||||
* @brief Constants used for sending commands to monitor
|
||||
*/
|
||||
const string LABEL_MONITOR_ANSWER_ACK = "AACK";
|
||||
const string LABEL_MONITOR_ANSWER_NACK = "ANAK";
|
||||
const string LABEL_MONITOR_ANSWER_LOST_DMB= "ATIM";
|
||||
const string LABEL_MONITOR_ANSWER_TIMEOUT= "ATIM";
|
||||
const string LABEL_MONITOR_ANSWER_CMD_REJECTED= "ACRJ";
|
||||
const string LABEL_MONITOR_MESSAGE = "MSSG";
|
||||
const string LABEL_MONITOR_CAMERA_OPEN= "COPN";
|
||||
const string LABEL_MONITOR_CAMERA_CLOSE= "CCLS";
|
||||
const string LABEL_MONITOR_CAMERA_IMAGE = "CIMG";
|
||||
const string LABEL_MONITOR_CAMERA_ARENA_ASK = "CASA";
|
||||
const string LABEL_MONITOR_CAMERA_ARENA_INFIRME = "CAIN";
|
||||
const string LABEL_MONITOR_CAMERA_ARENA_CONFIRM = "CACO";
|
||||
const string LABEL_MONITOR_CAMERA_POSITION_COMPUTE= "CPCO";
|
||||
const string LABEL_MONITOR_CAMERA_POSITION_STOP= "CPST";
|
||||
const string LABEL_MONITOR_CAMERA_POSITION = "CPOS";
|
||||
const string LABEL_MONITOR_ROBOT_COM_OPEN = "ROPN";
|
||||
const string LABEL_MONITOR_ROBOT_COM_CLOSE = "RCLS";
|
||||
const string LABEL_MONITOR_ROBOT_PING = "RPIN";
|
||||
const string LABEL_MONITOR_ROBOT_RESET = "RRST";
|
||||
const string LABEL_MONITOR_ROBOT_START_WITHOUT_WD= "RSOW";
|
||||
const string LABEL_MONITOR_ROBOT_START_WITH_WD= "RSWW";
|
||||
const string LABEL_MONITOR_ROBOT_RELOAD_WD = "RLDW";
|
||||
const string LABEL_MONITOR_ROBOT_MOVE = "RMOV";
|
||||
const string LABEL_MONITOR_ROBOT_TURN = "RTRN";
|
||||
const string LABEL_MONITOR_ROBOT_GO_FORWARD = "RGFW";
|
||||
const string LABEL_MONITOR_ROBOT_GO_BACKWARD = "RGBW";
|
||||
const string LABEL_MONITOR_ROBOT_GO_LEFT = "RGLF";
|
||||
const string LABEL_MONITOR_ROBOT_GO_RIGHT = "RGRI";
|
||||
const string LABEL_MONITOR_ROBOT_STOP = "RSTP";
|
||||
const string LABEL_MONITOR_ROBOT_POWEROFF = "RPOF";
|
||||
const string LABEL_MONITOR_ROBOT_BATTERY_LEVEL = "RBLV";
|
||||
const string LABEL_MONITOR_ROBOT_GET_BATTERY = "RGBT";
|
||||
const string LABEL_MONITOR_ROBOT_GET_STATE = "RGST";
|
||||
const string LABEL_MONITOR_ROBOT_CURRENT_STATE = "RCST";
|
||||
|
||||
const string LABEL_SEPARATOR_CHAR = ":";
|
||||
|
||||
/**
|
||||
* Create a server and open a socket over TCP
|
||||
*
|
||||
* @param port Port used for communication
|
||||
* @return Socket number
|
||||
* @throw std::runtime_error if it fails
|
||||
*/
|
||||
int ComMonitor::Open(int port) {
|
||||
struct sockaddr_in server;
|
||||
|
||||
socketFD = socket(AF_INET, SOCK_STREAM, 0);
|
||||
if (socketFD < 0) {
|
||||
throw std::runtime_error{"ComMonitor::Open : Can not create socket"};
|
||||
}
|
||||
|
||||
server.sin_addr.s_addr = INADDR_ANY;
|
||||
server.sin_family = AF_INET;
|
||||
server.sin_port = htons(port);
|
||||
|
||||
if (bind(socketFD, (struct sockaddr *) &server, sizeof (server)) < 0) {
|
||||
throw std::runtime_error{"ComMonitor::Open : Can not bind socket on port " + std::to_string(port)};
|
||||
}
|
||||
|
||||
listen(socketFD, 1);
|
||||
|
||||
return socketFD;
|
||||
}
|
||||
|
||||
/**
|
||||
* Close socket and server
|
||||
*/
|
||||
void ComMonitor::Close() {
|
||||
close(socketFD);
|
||||
|
||||
socketFD = -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Wait for a client to connect
|
||||
* @return Client number
|
||||
* @throw std::runtime_error if it fails
|
||||
*/
|
||||
int ComMonitor::AcceptClient() {
|
||||
struct sockaddr_in client;
|
||||
int c = sizeof (struct sockaddr_in);
|
||||
|
||||
clientID = accept(socketFD, (struct sockaddr *) &client, (socklen_t*) & c);
|
||||
|
||||
if (clientID < 0)
|
||||
throw std::runtime_error {
|
||||
"ComMonitor::AcceptClient : Accept failed"
|
||||
};
|
||||
|
||||
return clientID;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a message to monitor
|
||||
*
|
||||
* @param msg Message to send to monitor
|
||||
* @attention Message given in parameter will be destroyed (delete) after being sent. No need for user to delete message after that.
|
||||
* @warning Write is not thread safe : check that multiple tasks can't access this method simultaneously
|
||||
*/
|
||||
void ComMonitor::Write(Message &msg) {
|
||||
string str;
|
||||
|
||||
// Call user method before Write
|
||||
Write_Pre();
|
||||
|
||||
/* Convert message to string to send to monitor */
|
||||
str = MessageToString(msg);
|
||||
|
||||
//cout << "Message sent to monitor: " << str->c_str() << endl;
|
||||
write(clientID, str.c_str(), str.length());
|
||||
|
||||
delete(&msg);
|
||||
|
||||
// Call user method after write
|
||||
Write_Post();
|
||||
}
|
||||
|
||||
/**
|
||||
* Receive a message from monitor
|
||||
*
|
||||
* @return Message received from monitor
|
||||
* @attention Message provided is produced by the method. You must delete it when you are done using it
|
||||
* @warning Read is not thread safe : check that multiple tasks can't access this method simultaneously
|
||||
*/
|
||||
Message *ComMonitor::Read() {
|
||||
char length = 0;
|
||||
string s;
|
||||
char data;
|
||||
bool endReception=false;
|
||||
Message *msg;
|
||||
|
||||
// Call user method before read
|
||||
Read_Pre();
|
||||
|
||||
if (clientID > 0) {
|
||||
while (!endReception) {
|
||||
if ((length = recv(clientID, (void*) &data, 1, MSG_WAITALL)) > 0) {
|
||||
if (data != '\n') {
|
||||
s+=data;
|
||||
} else endReception = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (length<=0) msg = new Message(MESSAGE_MONITOR_LOST);
|
||||
else {
|
||||
msg=StringToMessage(s);
|
||||
}
|
||||
}
|
||||
|
||||
// Call user method after read
|
||||
Read_Post();
|
||||
|
||||
return msg;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method used internally to convert a message content to a string that can be sent over TCP
|
||||
* @param msg Message to be converted
|
||||
* @return A string, image of the message
|
||||
*/
|
||||
string ComMonitor::MessageToString(Message &msg) {
|
||||
int id;
|
||||
string str;
|
||||
Message *localMsg = &msg;
|
||||
Position pos;
|
||||
|
||||
id = msg.GetID();
|
||||
|
||||
switch (id) {
|
||||
case MESSAGE_ANSWER:
|
||||
switch (((MessageAnswer*)localMsg)->GetAnswer()) {
|
||||
case ANSWER_ACK:
|
||||
str.append(LABEL_MONITOR_ANSWER_ACK);
|
||||
break;
|
||||
case ANSWER_NACK:
|
||||
str.append(LABEL_MONITOR_ANSWER_NACK);
|
||||
break;
|
||||
case ANSWER_LOST_ROBOT:
|
||||
str.append(LABEL_MONITOR_ANSWER_LOST_DMB);
|
||||
break;
|
||||
case ANSWER_ROBOT_TIMEOUT:
|
||||
str.append(LABEL_MONITOR_ANSWER_TIMEOUT);
|
||||
break;
|
||||
case ANSWER_ROBOT_UNKNOWN_COMMAND:
|
||||
str.append(LABEL_MONITOR_ANSWER_CMD_REJECTED);
|
||||
break;
|
||||
case ANSWER_ROBOT_ERROR:
|
||||
str.append(LABEL_MONITOR_ANSWER_CMD_REJECTED);
|
||||
break;
|
||||
default:
|
||||
str.append(LABEL_MONITOR_ANSWER_NACK);
|
||||
};
|
||||
|
||||
break;
|
||||
case MESSAGE_POSITION:
|
||||
pos = ((MessagePosition*)&msg)->GetPosition();
|
||||
|
||||
str.append(LABEL_MONITOR_CAMERA_POSITION + LABEL_SEPARATOR_CHAR + to_string(pos.robotId) + ";" +
|
||||
to_string(pos.angle) + ";" + to_string(pos.center.x) + ";" + to_string(pos.center.y) + ";" +
|
||||
to_string(pos.direction.x) + ";" + to_string(pos.direction.y));
|
||||
break;
|
||||
case MESSAGE_IMAGE:
|
||||
str.append(LABEL_MONITOR_CAMERA_IMAGE + LABEL_SEPARATOR_CHAR + ((MessageImg*) &msg)->GetImage()->ToBase64());
|
||||
break;
|
||||
case MESSAGE_ROBOT_BATTERY_LEVEL:
|
||||
str.append(LABEL_MONITOR_ROBOT_BATTERY_LEVEL + LABEL_SEPARATOR_CHAR + to_string(((MessageBattery*) &msg)->GetLevel()));
|
||||
break;
|
||||
case MESSAGE_ROBOT_CURRENT_STATE:
|
||||
str.append(LABEL_MONITOR_ROBOT_CURRENT_STATE + LABEL_SEPARATOR_CHAR + to_string(((MessageState*) &msg)->GetState()));
|
||||
break;
|
||||
case MESSAGE_LOG:
|
||||
str.append(LABEL_MONITOR_MESSAGE + LABEL_SEPARATOR_CHAR + ((MessageString*) &msg)->GetString());
|
||||
break;
|
||||
case MESSAGE_EMPTY:
|
||||
str.append(""); //empty string
|
||||
break;
|
||||
default:
|
||||
throw std::runtime_error
|
||||
{
|
||||
"ComMonitor::MessageToString (from ComMonitor::Write): Invalid message to send (" + msg.ToString()
|
||||
};
|
||||
}
|
||||
|
||||
str.append("\n");
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method used internally to convert a string received over TCP to a message
|
||||
* @param s String containing message
|
||||
* @return A message, image of the string
|
||||
*/
|
||||
Message *ComMonitor::StringToMessage(string &s) {
|
||||
Message *msg;
|
||||
size_t pos;
|
||||
string org =s;
|
||||
string tokenCmd;
|
||||
string tokenData;
|
||||
|
||||
/* Separate command from data if string contains a ':' */
|
||||
if ((pos=org.find(LABEL_SEPARATOR_CHAR)) != string::npos) {
|
||||
tokenCmd = org.substr(0,pos);
|
||||
org.erase(0,pos+1);
|
||||
tokenData=org;
|
||||
} else tokenCmd=org;
|
||||
|
||||
/* Convert command to message */
|
||||
if (tokenCmd.find(LABEL_MONITOR_ROBOT_MOVE)!= string::npos) {
|
||||
msg = new MessageInt(MESSAGE_ROBOT_MOVE,stoi(tokenData));
|
||||
} else if (tokenCmd.find(LABEL_MONITOR_ROBOT_TURN)!= string::npos) {
|
||||
msg = new MessageInt(MESSAGE_ROBOT_TURN,stoi(tokenData));
|
||||
} else if (tokenCmd.find(LABEL_MONITOR_ROBOT_START_WITHOUT_WD)!= string::npos) {
|
||||
msg = new Message(MESSAGE_ROBOT_START_WITHOUT_WD);
|
||||
} else if (tokenCmd.find(LABEL_MONITOR_ROBOT_START_WITH_WD)!= string::npos) {
|
||||
msg = new Message(MESSAGE_ROBOT_START_WITH_WD);
|
||||
} else if (tokenCmd.find(LABEL_MONITOR_ROBOT_RELOAD_WD)!= string::npos) {
|
||||
msg = new Message(MESSAGE_ROBOT_RELOAD_WD);
|
||||
} else if (tokenCmd.find(LABEL_MONITOR_ROBOT_PING)!= string::npos) {
|
||||
msg = new Message(MESSAGE_ROBOT_PING);
|
||||
} else if (tokenCmd.find(LABEL_MONITOR_ROBOT_RESET)!= string::npos) {
|
||||
msg = new Message(MESSAGE_ROBOT_RESET);
|
||||
} else if (tokenCmd.find(LABEL_MONITOR_CAMERA_ARENA_ASK)!= string::npos) {
|
||||
msg = new Message(MESSAGE_ASK_ARENA);
|
||||
} else if (tokenCmd.find(LABEL_MONITOR_CAMERA_ARENA_CONFIRM)!= string::npos) {
|
||||
msg = new Message(MESSAGE_ARENA_CONFIRM);
|
||||
} else if (tokenCmd.find(LABEL_MONITOR_CAMERA_ARENA_INFIRME)!= string::npos) {
|
||||
msg = new Message(MESSAGE_ARENA_INFIRM);
|
||||
} else if (tokenCmd.find(LABEL_MONITOR_CAMERA_CLOSE)!= string::npos) {
|
||||
msg = new Message(MESSAGE_CAM_CLOSE);
|
||||
} else if (tokenCmd.find(LABEL_MONITOR_CAMERA_OPEN)!= string::npos) {
|
||||
msg = new Message(MESSAGE_CAM_OPEN);
|
||||
} else if (tokenCmd.find(LABEL_MONITOR_CAMERA_POSITION_COMPUTE)!= string::npos) {
|
||||
msg = new Message(MESSAGE_COMPUTE_POSITION);
|
||||
} else if (tokenCmd.find(LABEL_MONITOR_CAMERA_POSITION_STOP)!= string::npos) {
|
||||
msg = new Message(MESSAGE_STOP_COMPUTE_POSITION);
|
||||
} else if (tokenCmd.find(LABEL_MONITOR_MESSAGE)!= string::npos) {
|
||||
msg = new MessageString(MESSAGE_LOG,tokenData);
|
||||
} else if (tokenCmd.find(LABEL_MONITOR_ROBOT_COM_CLOSE)!= string::npos) {
|
||||
msg = new Message(MESSAGE_CLOSE_COM);
|
||||
} else if (tokenCmd.find(LABEL_MONITOR_ROBOT_COM_OPEN)!= string::npos) {
|
||||
msg = new Message(MESSAGE_OPEN_COM);
|
||||
} else if (tokenCmd.find(LABEL_MONITOR_ROBOT_GET_BATTERY)!= string::npos) {
|
||||
msg = new Message(MESSAGE_ROBOT_GET_BATTERY);
|
||||
} else if (tokenCmd.find(LABEL_MONITOR_ROBOT_GET_STATE)!= string::npos) {
|
||||
msg = new Message(MESSAGE_ROBOT_GET_STATE);
|
||||
} else if (tokenCmd.find(LABEL_MONITOR_ROBOT_GO_FORWARD)!= string::npos) {
|
||||
msg = new Message(MESSAGE_ROBOT_GO_FORWARD);
|
||||
} else if (tokenCmd.find(LABEL_MONITOR_ROBOT_GO_BACKWARD)!= string::npos) {
|
||||
msg = new Message(MESSAGE_ROBOT_GO_BACK);
|
||||
} else if (tokenCmd.find(LABEL_MONITOR_ROBOT_GO_LEFT)!= string::npos) {
|
||||
msg = new Message(MESSAGE_ROBOT_GO_LEFT);
|
||||
} else if (tokenCmd.find(LABEL_MONITOR_ROBOT_GO_RIGHT)!= string::npos) {
|
||||
msg = new Message(MESSAGE_ROBOT_GO_RIGHT);
|
||||
} else if (tokenCmd.find(LABEL_MONITOR_ROBOT_POWEROFF)!= string::npos) {
|
||||
msg = new Message(MESSAGE_ROBOT_POWEROFF);
|
||||
} else {
|
||||
msg = new Message(MESSAGE_EMPTY);
|
||||
}
|
||||
|
||||
return msg;
|
||||
}
|
|
@ -15,8 +15,8 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __COMGUI_H__
|
||||
#define __COMGUI_H__
|
||||
#ifndef __COMMONITOR_H__
|
||||
#define __COMMONITOR_H__
|
||||
|
||||
#include "messages.h"
|
||||
#include <string>
|
||||
|
@ -24,22 +24,22 @@
|
|||
using namespace std;
|
||||
|
||||
/**
|
||||
* Class used for generating a server and communicating through it with GUI
|
||||
* Class used for generating a server and communicating through it with monitor
|
||||
*
|
||||
* @brief Communication class with GUI (server)
|
||||
* @brief Communication class with monitor (server)
|
||||
*
|
||||
*/
|
||||
class ComGui {
|
||||
class ComMonitor {
|
||||
public:
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
ComGui() {}
|
||||
ComMonitor() {}
|
||||
|
||||
/**
|
||||
* Destructor
|
||||
*/
|
||||
virtual ~ComGui() {}
|
||||
virtual ~ComMonitor() {}
|
||||
|
||||
/**
|
||||
* Create a server and open a socket over TCP
|
||||
|
@ -63,13 +63,13 @@ public:
|
|||
int AcceptClient();
|
||||
|
||||
/**
|
||||
* Send a message to GUI
|
||||
* Send a message to monitor
|
||||
*
|
||||
* @param msg Message to send to GUI
|
||||
* @param msg Message to send to monitor
|
||||
* @attention Message given in parameter will be destroyed (delete) after being sent. No need for user to delete message after that.
|
||||
* @warning Write is not thread safe : check that multiple tasks can't access this method simultaneously
|
||||
*/
|
||||
void Write(Message* msg);
|
||||
void Write(Message &msg);
|
||||
|
||||
/**
|
||||
* Function called at beginning of Write method
|
||||
|
@ -82,6 +82,27 @@ public:
|
|||
* Use it to do some synchronization (release of mutex, for example)
|
||||
*/
|
||||
virtual void Write_Post() {}
|
||||
|
||||
/**
|
||||
* Receive a message from monitor
|
||||
*
|
||||
* @return Message received from monitor
|
||||
* @attention Message provided is produced by the method. You must delete it when you are done using it
|
||||
* @warning Read is not thread safe : check that multiple tasks can't access this method simultaneously
|
||||
*/
|
||||
Message *Read();
|
||||
|
||||
/**
|
||||
* Function called at beginning of Read method
|
||||
* Use it to do some synchronization (call of mutex, for example)
|
||||
*/
|
||||
virtual void Read_Pre() {}
|
||||
|
||||
/**
|
||||
* Function called at end of Read method
|
||||
* Use it to do some synchronization (release of mutex, for example)
|
||||
*/
|
||||
virtual void Read_Post() {}
|
||||
protected:
|
||||
/**
|
||||
* Socket descriptor
|
||||
|
@ -98,7 +119,14 @@ protected:
|
|||
* @param msg Message to be converted
|
||||
* @return A string, image of the message
|
||||
*/
|
||||
string *MessageToString(Message *msg);
|
||||
string MessageToString(Message &msg);
|
||||
|
||||
/**
|
||||
* Method used internally to convert a string received over TCP to a message
|
||||
* @param s String containing message
|
||||
* @return A message, image of the string
|
||||
*/
|
||||
Message *StringToMessage(string &s);
|
||||
};
|
||||
|
||||
#endif /* __COMGUI_H__ */
|
||||
#endif /* __COMMONITOR_H__ */
|
334
software/raspberry/superviseur-robot/lib/comrobot.cpp
Normal file
334
software/raspberry/superviseur-robot/lib/comrobot.cpp
Normal file
|
@ -0,0 +1,334 @@
|
|||
/*
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "comrobot.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <termios.h>
|
||||
|
||||
#include <string>
|
||||
#include <stdexcept>
|
||||
|
||||
#ifdef __FOR_PC__
|
||||
#define USART_FILENAME "/dev/ttyUSB0"
|
||||
#else
|
||||
#define USART_FILENAME "/dev/ttyS0"
|
||||
#endif /* __FOR_PC__ */
|
||||
|
||||
/*
|
||||
* Constants to be used for communicating with robot. Contains command tag
|
||||
*/
|
||||
typedef enum {
|
||||
LABEL_ANGLE_POSITION = 'p',
|
||||
LABEL_ANGULAR_SPEED = 's',
|
||||
LABEL_BATTERY_LEVEL = 'b',
|
||||
LABEL_BETA_ANGLE = 'v',
|
||||
LABEL_USER_PRESENCE = 'u',
|
||||
|
||||
LABEL_TORQUE = 'c',
|
||||
LABEL_EMERGENCY_STOP = 'a'
|
||||
} LabelRobot;
|
||||
|
||||
/**
|
||||
* Open serial link with robot
|
||||
* @return File descriptor
|
||||
* @throw std::runtime_error if it fails
|
||||
*/
|
||||
int ComRobot::Open() {
|
||||
fd = open(USART_FILENAME, O_RDWR | O_NOCTTY /*| O_NDELAY*/); //Open in blocking read/write mode
|
||||
if (fd == -1) {
|
||||
//ERROR - CAN'T OPEN SERIAL PORT
|
||||
throw std::runtime_error{"Error - Unable to open UART " + string(USART_FILENAME) + ". Ensure it is not in use by another application"};
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
//Configuration of the serial port 115 520 Bauds
|
||||
struct termios options;
|
||||
tcgetattr(fd, &options);
|
||||
options.c_cflag = B115200 | CS8 | CLOCAL | CREAD; //<Set baud rate
|
||||
options.c_iflag = IGNPAR; // ignores bytes with bad parity
|
||||
options.c_oflag = 0;
|
||||
options.c_lflag = 0;
|
||||
tcflush(fd, TCIFLUSH);
|
||||
tcsetattr(fd, TCSANOW, &options);
|
||||
|
||||
return fd;
|
||||
}
|
||||
|
||||
/**
|
||||
* Close serial link
|
||||
* @return Success if above 0, failure if below 0
|
||||
*/
|
||||
int ComRobot::Close() {
|
||||
return close(fd);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a message from robot
|
||||
* @return Message currently received
|
||||
* @attention A message object is created (new) when receiving data from robot. You MUST remember to destroy is (delete) after use
|
||||
* @attention Read method is blocking until a message is received
|
||||
* @warning Read is not thread safe : Do not call it in multiple tasks simultaneously
|
||||
*/
|
||||
Message* ComRobot::Read() {
|
||||
int rxLength;
|
||||
unsigned char rxBuffer[6];
|
||||
unsigned char receivedChar;
|
||||
bool messageComplete = false;
|
||||
Message *msg;
|
||||
unsigned int i;
|
||||
|
||||
/* Call pre method for read */
|
||||
Read_Pre();
|
||||
|
||||
/* a message is composed of 7 bytes.
|
||||
the byte 0 should always be '<'
|
||||
the byte 1 should be an ascii char that is the label. It define what the data represent
|
||||
the bytes 2 to 5 are the float value
|
||||
the byte 6 should always be a '\n'
|
||||
*/
|
||||
while (messageComplete == false) {
|
||||
rxLength = read(this->fd, (void*) &receivedChar, 1); //Filestream, buffer to store in, number of bytes to read (max)
|
||||
//printf ("W=%02X ", receivedChar);
|
||||
|
||||
if (rxLength <= -1) {
|
||||
this->lostCom = true;
|
||||
printf("Warning: communication lost in ComStm32::Read\n");
|
||||
msg = new Message();
|
||||
|
||||
return msg;
|
||||
} else if (rxLength == 0) {
|
||||
// nothing to do
|
||||
} else if (receivedChar == '<') { // start of frame received
|
||||
i = 0;
|
||||
|
||||
do {
|
||||
rxLength = read(this->fd, (void*) &rxBuffer[i], 6 - i); //Filestream, buffer to store in, number of bytes to read (max)
|
||||
|
||||
if (rxLength >= 0)
|
||||
i = i + rxLength;
|
||||
else {
|
||||
printf("Error while reading (%i)", rxLength);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
} while (i < 6);
|
||||
|
||||
if (rxBuffer[5] == '\n') {
|
||||
messageComplete = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Treatment of received message */
|
||||
msg = CharToMessage(rxBuffer);
|
||||
|
||||
/* Call Post method for read */
|
||||
Read_Post();
|
||||
|
||||
return msg;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert an array of char to its message representation (when receiving data from stm32)
|
||||
* @param bytes Array of char
|
||||
* @return Message corresponding to received array of char
|
||||
*/
|
||||
Message* ComRobot::CharToMessage(unsigned char *bytes) {
|
||||
Message *msg = __null;
|
||||
MessageFloat *msgf;
|
||||
MessageBool *msgb;
|
||||
|
||||
switch (bytes[0]) {
|
||||
case LABEL_ANGLE_POSITION:
|
||||
msgf = new MessageFloat();
|
||||
msgf->SetID(MESSAGE_ANGLE_POSITION);
|
||||
msgf->SetValue(CharToFloat(&bytes[1]));
|
||||
msg = (Message*) msgf;
|
||||
|
||||
break;
|
||||
case LABEL_ANGULAR_SPEED:
|
||||
msgf = new MessageFloat();
|
||||
msgf->SetID(MESSAGE_ANGULAR_SPEED);
|
||||
msgf->SetValue(CharToFloat(&bytes[1]));
|
||||
msg = (Message*) msgf;
|
||||
|
||||
break;
|
||||
case LABEL_BATTERY_LEVEL:
|
||||
msgf = new MessageFloat();
|
||||
msgf->SetID(MESSAGE_BATTERY);
|
||||
msgf->SetValue(CharToFloat(&bytes[1]));
|
||||
msg = (Message*) msgf;
|
||||
|
||||
break;
|
||||
case LABEL_BETA_ANGLE:
|
||||
msgf = new MessageFloat();
|
||||
msgf->SetID(MESSAGE_BETA);
|
||||
msgf->SetValue(CharToFloat(&bytes[1]));
|
||||
msg = (Message*) msgf;
|
||||
|
||||
break;
|
||||
case LABEL_USER_PRESENCE:
|
||||
msgb = new MessageBool();
|
||||
msgb->SetID(MESSAGE_USER_PRESENCE);
|
||||
msgb->SetState(CharToBool(&bytes[1]));
|
||||
msg = (Message*) msgb;
|
||||
|
||||
break;
|
||||
default:
|
||||
printf("Unknown message received from robot (%i)\n", bytes[0]);
|
||||
fflush(stdout);
|
||||
msg = new Message();
|
||||
}
|
||||
|
||||
if (msg == NULL) {
|
||||
printf("Message is null (%02X)\n", bytes[0]);
|
||||
fflush(stdout);
|
||||
msg = new Message();
|
||||
}
|
||||
|
||||
return msg;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert an array of char to float
|
||||
* @param bytes Array of char, containing a binary image of a float
|
||||
* @return Float value
|
||||
*/
|
||||
float ComRobot::CharToFloat(unsigned char *bytes) {
|
||||
unsigned long value;
|
||||
|
||||
union {
|
||||
unsigned char buffer[4];
|
||||
float f;
|
||||
} convert;
|
||||
|
||||
convert.buffer[0] = bytes[0];
|
||||
convert.buffer[1] = bytes[1];
|
||||
convert.buffer[2] = bytes[2];
|
||||
convert.buffer[3] = bytes[3];
|
||||
|
||||
//value = (bytes[3] << 24) | (bytes[2] << 16) | (bytes[1] << 8) | (bytes[0]);
|
||||
|
||||
return convert.f;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert an array of char to integer
|
||||
* @param bytes Array of char, containing a binary image of an integer
|
||||
* @return Integer value
|
||||
*/
|
||||
unsigned int ComRobot::CharToInt(unsigned char *bytes) {
|
||||
unsigned long value;
|
||||
|
||||
value = (bytes[3] << 24) | (bytes[2] << 16) | (bytes[1] << 8) | (bytes[0]);
|
||||
|
||||
return (unsigned int) value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert an array of char to boolean
|
||||
* @param bytes Array of char, containing a binary image of a boolean
|
||||
* @return Boolean value
|
||||
*/
|
||||
bool ComRobot::CharToBool(unsigned char *bytes) {
|
||||
unsigned long value;
|
||||
|
||||
value = (bytes[3] << 24) | (bytes[2] << 16) | (bytes[1] << 8) | (bytes[0]);
|
||||
|
||||
if (value == 0) return false;
|
||||
|
||||
else return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a message to robot
|
||||
* @param msg Message to send to robot
|
||||
* @return 1 if success, 0 otherwise
|
||||
* @attention Message is destroyed (delete) after being sent. You do not need to delete it yourself
|
||||
* @attention Write is blocking until message is written into buffer (linux side)
|
||||
* @warning Write is not thread save : check that multiple tasks can't access this method simultaneously
|
||||
*/
|
||||
int ComRobot::Write(Message* msg) {
|
||||
unsigned char buffer[7];
|
||||
int ret_val = 0;
|
||||
|
||||
MessageToChar(msg, buffer);
|
||||
|
||||
Write_Pre();
|
||||
|
||||
if (this->fd != -1) {
|
||||
int count = write(this->fd, &buffer[0], 7); //Filestream, bytes to write, number of bytes to write
|
||||
if (count < 0) {
|
||||
printf("Warning: UART TX error in ComStm32::Write\n");
|
||||
} else {
|
||||
ret_val = 1;
|
||||
}
|
||||
}
|
||||
|
||||
// deallocation of msg
|
||||
delete(msg);
|
||||
|
||||
Write_Post();
|
||||
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a message to its array of char representation (for sending command to stm32)
|
||||
* @param msg Message to be sent to robot
|
||||
* @param buffer Array of char, image of message to send
|
||||
*/
|
||||
void ComRobot::MessageToChar(Message *msg, unsigned char *buffer) {
|
||||
float val_f;
|
||||
int val_i;
|
||||
unsigned char *b;
|
||||
|
||||
buffer[0] = '<';
|
||||
buffer[6] = '\n';
|
||||
|
||||
switch (msg->GetID()) {
|
||||
case MESSAGE_TORQUE:
|
||||
buffer[1] = LABEL_TORQUE;
|
||||
val_f = ((MessageFloat*) msg)->GetValue();
|
||||
b = (unsigned char *) &val_f;
|
||||
|
||||
break;
|
||||
case MESSAGE_EMERGENCY_STOP:
|
||||
buffer[1] = LABEL_EMERGENCY_STOP;
|
||||
if (((MessageBool*) msg)->GetState())
|
||||
val_i = 1;
|
||||
else
|
||||
val_i = 0;
|
||||
b = (unsigned char *) &val_i;
|
||||
|
||||
break;
|
||||
default:
|
||||
printf("Invalid message to send");
|
||||
val_i = 0;
|
||||
b = (unsigned char *) &val_i;
|
||||
}
|
||||
|
||||
buffer[2] = b[0];
|
||||
buffer[3] = b[1];
|
||||
buffer[4] = b[2];
|
||||
buffer[5] = b[3];
|
||||
}
|
||||
|
143
software/raspberry/superviseur-robot/lib/comrobot.h
Normal file
143
software/raspberry/superviseur-robot/lib/comrobot.h
Normal file
|
@ -0,0 +1,143 @@
|
|||
/*
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __COMROBOT_H__
|
||||
#define __COMROBOT_H__
|
||||
|
||||
#include "messages.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
/**
|
||||
* Class used for communicating with robot over serial
|
||||
*
|
||||
* @brief Communication class with robot
|
||||
*
|
||||
*/
|
||||
class ComRobot {
|
||||
public:
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
ComRobot() {}
|
||||
|
||||
/**
|
||||
* Destructor
|
||||
*/
|
||||
virtual ~ComRobot() {}
|
||||
|
||||
/**
|
||||
* Open serial link with robot
|
||||
* @return File descriptor
|
||||
* @throw std::runtime_error if it fails
|
||||
*/
|
||||
int Open();
|
||||
|
||||
/**
|
||||
* Close serial link
|
||||
* @return Success if above 0, failure if below 0
|
||||
*/
|
||||
int Close();
|
||||
|
||||
/**
|
||||
* Get a message from robot
|
||||
* @return Message currently received
|
||||
* @attention A message object is created (new) when receiving data from robot. You MUST remember to destroy is (delete) after use
|
||||
* @attention Read method is blocking until a message is received
|
||||
* @warning Read is not thread safe : Do not call it in multiple tasks simultaneously
|
||||
*/
|
||||
Message* Read();
|
||||
|
||||
/**
|
||||
* Send a message to robot
|
||||
* @param msg Message to send to robot
|
||||
* @return 1 if success, 0 otherwise
|
||||
* @attention Message is destroyed (delete) after being sent. You do not need to delete it yourself
|
||||
* @attention Write is blocking until message is written into buffer (linux side)
|
||||
* @warning Write is not thread save : check that multiple tasks can't access this method simultaneously
|
||||
*/
|
||||
int Write(Message* msg);
|
||||
|
||||
/**
|
||||
* Function called at beginning of Read method
|
||||
* Use it to do some synchronization (call of mutex, for example)
|
||||
*/
|
||||
virtual void Read_Pre() {}
|
||||
|
||||
/**
|
||||
* Function called at end of Read method
|
||||
* Use it to do some synchronization (call of mutex, for example)
|
||||
*/
|
||||
virtual void Read_Post() {}
|
||||
|
||||
/**
|
||||
* Function called at beginning of Write method
|
||||
* Use it to do some synchronization (call of mutex, for example)
|
||||
*/
|
||||
virtual void Write_Pre() {}
|
||||
|
||||
/**
|
||||
* Function called at end of Write method
|
||||
* Use it to do some synchronization (call of mutex, for example)
|
||||
*/
|
||||
virtual void Write_Post() {}
|
||||
|
||||
static Message *Ping();
|
||||
|
||||
protected:
|
||||
/**
|
||||
* Serial link file descriptor
|
||||
*/
|
||||
int fd;
|
||||
|
||||
/**
|
||||
* Convert an array of char to float
|
||||
* @param bytes Array of char, containing a binary image of a float
|
||||
* @return Float value
|
||||
*/
|
||||
float CharToFloat(unsigned char *bytes);
|
||||
|
||||
/**
|
||||
* Convert an array of char to boolean
|
||||
* @param bytes Array of char, containing a binary image of a boolean
|
||||
* @return Boolean value
|
||||
*/
|
||||
bool CharToBool(unsigned char *bytes);
|
||||
|
||||
/**
|
||||
* Convert an array of char to integer
|
||||
* @param bytes Array of char, containing a binary image of an integer
|
||||
* @return Integer value
|
||||
*/
|
||||
unsigned int CharToInt(unsigned char *bytes);
|
||||
|
||||
/**
|
||||
* Convert an array of char to its message representation (when receiving data from stm32)
|
||||
* @param bytes Array of char
|
||||
* @return Message corresponding to received array of char
|
||||
*/
|
||||
Message* CharToMessage(unsigned char *bytes);
|
||||
|
||||
/**
|
||||
* Convert a message to its array of char representation (for sending command to stm32)
|
||||
* @param msg Message to be sent to robot
|
||||
* @param buffer Array of char, image of message to send
|
||||
*/
|
||||
void MessageToChar(Message *msg, unsigned char *buffer);
|
||||
};
|
||||
|
||||
#endif /* __COMROBOT_H__ */
|
|
@ -18,7 +18,6 @@
|
|||
#include "img.h"
|
||||
|
||||
bool Arene::empty() {
|
||||
|
||||
if ((this->arene.height==0) || (this->arene.width==0)) return true;
|
||||
else return false;
|
||||
}
|
||||
|
@ -27,6 +26,14 @@ Img::Img(ImageMat imgMatrice) {
|
|||
this->img = imgMatrice.clone();
|
||||
}
|
||||
|
||||
string Img::ToString() {
|
||||
return "Image size: "+this->img.cols+"x"this->img.rows+" (dim="+this->img.dims+")";
|
||||
}
|
||||
|
||||
Img* Img::Copy() {
|
||||
return new Img(this->img);
|
||||
}
|
||||
|
||||
float Img::calculAngle(Position robot) {
|
||||
float a = robot.direction.x - robot.center.x;
|
||||
float b = robot.direction.y - robot.center.y ;
|
||||
|
@ -93,6 +100,14 @@ Jpg Img::toJpg() {
|
|||
return imgJpg;
|
||||
}
|
||||
|
||||
string Img::ToBase64() {
|
||||
string imgBase64;
|
||||
Jpg imgJpg = toJpg();
|
||||
|
||||
/* faire la convertion Jpg vers base 64 */
|
||||
return imgBase64;
|
||||
}
|
||||
|
||||
std::list<Position> Img::search_robot(Arene monArene) {
|
||||
|
||||
std::list<Position> robotsFind;
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
|
||||
#include <iostream>
|
||||
#include <list>
|
||||
#include <string>
|
||||
|
||||
#include <opencv2/highgui/highgui.hpp>
|
||||
#include <opencv2/imgproc/imgproc.hpp>
|
||||
|
@ -33,16 +34,18 @@
|
|||
|
||||
#define ARENA_NOT_DETECTED -1
|
||||
|
||||
using namespace std;
|
||||
|
||||
typedef cv::Mat ImageMat;
|
||||
|
||||
typedef std::vector<unsigned char> Jpg;
|
||||
typedef vector<unsigned char> Jpg;
|
||||
|
||||
struct Position {
|
||||
typedef struct {
|
||||
cv::Point2f center;
|
||||
cv::Point2f direction;
|
||||
float angle;
|
||||
int robotId;
|
||||
};
|
||||
} Position;
|
||||
|
||||
class Arene {
|
||||
public:
|
||||
|
@ -55,7 +58,12 @@ public:
|
|||
class Img {
|
||||
public:
|
||||
Img(ImageMat imgMatrice);
|
||||
|
||||
string ToString();
|
||||
Img* Copy();
|
||||
|
||||
Jpg toJpg();
|
||||
string ToBase64();
|
||||
Arene search_arena();
|
||||
|
||||
int draw_robot(Position robot);
|
||||
|
@ -63,11 +71,12 @@ public:
|
|||
int draw_arena(Arene areneToDraw);
|
||||
std::list<Position> search_robot(Arene monArene);
|
||||
|
||||
|
||||
#ifdef __WITH_ARUCO__
|
||||
std::list<Position> search_aruco(Arene monArene = NULL);
|
||||
list<Position> search_aruco(Arene monArene = NULL);
|
||||
#endif // __WITH_ARUCO__
|
||||
private:
|
||||
cv::Mat img;
|
||||
ImageMat img;
|
||||
|
||||
#ifdef __WITH_ARUCO__
|
||||
Ptr<std::Dictionary> dictionary;
|
||||
|
|
|
@ -21,13 +21,14 @@
|
|||
#include <string>
|
||||
|
||||
/*
|
||||
* Constants used with ToString method, for printing message id
|
||||
* @brief Constants used with ToString method, for printing message id
|
||||
*/
|
||||
|
||||
const string MESSAGE_ID_STRING[] = {
|
||||
"Empty",
|
||||
"Log",
|
||||
"Answer",
|
||||
"Monitor connection lost",
|
||||
"Open serial com",
|
||||
"Close serial com",
|
||||
"Open camera",
|
||||
|
@ -37,7 +38,7 @@ const string MESSAGE_ID_STRING[] = {
|
|||
"Arena infirmed",
|
||||
"Compute position",
|
||||
"Stop compute position",
|
||||
"Position,
|
||||
"Position",
|
||||
"Image",
|
||||
"Robot ping",
|
||||
"Robot reset",
|
||||
|
@ -56,7 +57,19 @@ const string MESSAGE_ID_STRING[] = {
|
|||
"Robot battery level",
|
||||
"Robot get state",
|
||||
"Robot current state"
|
||||
};
|
||||
|
||||
/*
|
||||
* @brief Constants used with ToString method, for printing answer id
|
||||
*/
|
||||
const string ANSWER_ID_STRING[] = {
|
||||
"Acknowledge",
|
||||
"Not Acknowledge",
|
||||
"Robot lost",
|
||||
"Timeout error",
|
||||
"Unknown command",
|
||||
"Invalid or refused command",
|
||||
"Checksum error"
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -66,12 +79,29 @@ Message::Message() {
|
|||
this->messageID = MESSAGE_EMPTY;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new, empty message
|
||||
*/
|
||||
Message::Message(MessageID id) {
|
||||
SetID(id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Destroy message
|
||||
*/
|
||||
Message::~Message() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Set message ID
|
||||
* @param id Message ID
|
||||
*/
|
||||
void Message::SetID(MessageID id) {
|
||||
if (CheckID(id)) {
|
||||
this->messageID = id;
|
||||
} else throw std::runtime_error {"Invalid message id for Message"};
|
||||
}
|
||||
|
||||
/**
|
||||
* Translate content of message into a string that can be displayed
|
||||
* @return A string describing message contents
|
||||
|
@ -99,6 +129,7 @@ Message* Message::Copy() {
|
|||
*/
|
||||
bool Message::CheckID(MessageID id) {
|
||||
if ((id != MESSAGE_EMPTY) &&
|
||||
(id != MESSAGE_MONITOR_LOST) &&
|
||||
(id != MESSAGE_ARENA_CONFIRM) &&
|
||||
(id != MESSAGE_ARENA_INFIRM) &&
|
||||
(id != MESSAGE_ASK_ARENA) &&
|
||||
|
@ -125,23 +156,23 @@ bool Message::CheckID(MessageID id) {
|
|||
} else return true;
|
||||
}
|
||||
|
||||
/* MessageFloat */
|
||||
/* MessageInt */
|
||||
|
||||
/**
|
||||
* Create a new, empty float message
|
||||
* Create a new, empty int message
|
||||
*/
|
||||
MessageFloat::MessageFloat() {
|
||||
MessageInt::MessageInt() {
|
||||
value = 0.0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new float message, with given ID and value
|
||||
* Create a new int message, with given ID and value
|
||||
* @param id Message ID
|
||||
* @param val Message value
|
||||
* @throw std::runtime_error if message ID is incompatible with float data
|
||||
* @throw std::runtime_error if message ID is incompatible with int data
|
||||
*/
|
||||
MessageFloat::MessageFloat(MessageID id, float val) {
|
||||
MessageFloat::SetID(id);
|
||||
MessageInt::MessageInt(MessageID id, int val) {
|
||||
MessageInt::SetID(id);
|
||||
|
||||
value = val;
|
||||
}
|
||||
|
@ -151,12 +182,12 @@ MessageFloat::MessageFloat(MessageID id, float val) {
|
|||
* @param id Message ID
|
||||
* @throw std::runtime_error if message ID is incompatible with float data
|
||||
*/
|
||||
void MessageFloat::SetID(MessageID id) {
|
||||
void MessageInt::SetID(MessageID id) {
|
||||
if (CheckID(id))
|
||||
messageID = id;
|
||||
else
|
||||
throw std::runtime_error {
|
||||
"Invalid message id for MessageFloat"
|
||||
"Invalid message id for MessageInt"
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -164,7 +195,7 @@ void MessageFloat::SetID(MessageID id) {
|
|||
* Translate content of message into a string that can be displayed
|
||||
* @return A string describing message contents
|
||||
*/
|
||||
string MessageFloat::ToString() {
|
||||
string MessageInt::ToString() {
|
||||
if (CheckID(this->messageID))
|
||||
return "Id: \"" + MESSAGE_ID_STRING[this->messageID] + "\"\nValue: " + to_string(this->value);
|
||||
else
|
||||
|
@ -172,11 +203,11 @@ string MessageFloat::ToString() {
|
|||
}
|
||||
|
||||
/**
|
||||
* Allocate a new mesage and copy contents of current message
|
||||
* Allocate a new message and copy contents of current message
|
||||
* @return A message, copy of current
|
||||
*/
|
||||
Message* MessageFloat::Copy() {
|
||||
return new MessageFloat(this->messageID, this->value);
|
||||
Message* MessageInt::Copy() {
|
||||
return new MessageInt(this->messageID, this->value);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -184,13 +215,9 @@ Message* MessageFloat::Copy() {
|
|||
* @param id Message ID
|
||||
* @return true, if message ID is acceptable, false otherwise
|
||||
*/
|
||||
bool MessageFloat::CheckID(MessageID id) {
|
||||
if ((id != MESSAGE_ANGLE_POSITION) &&
|
||||
(id != MESSAGE_ANGULAR_SPEED) &&
|
||||
(id != MESSAGE_BATTERY) &&
|
||||
(id != MESSAGE_BETA) &&
|
||||
(id != MESSAGE_LINEAR_SPEED) &&
|
||||
(id != MESSAGE_TORQUE)) {
|
||||
bool MessageInt::CheckID(MessageID id) {
|
||||
if ((id != MESSAGE_ROBOT_TURN) &&
|
||||
(id != MESSAGE_ROBOT_MOVE)) {
|
||||
return false;
|
||||
} else return true;
|
||||
}
|
||||
|
@ -260,48 +287,62 @@ bool MessageString::CheckID(MessageID id) {
|
|||
} else return true;
|
||||
}
|
||||
|
||||
/* class MessageBool */
|
||||
/* class MessageImg */
|
||||
|
||||
/**
|
||||
* Create a new, empty boolean message
|
||||
* Create a new, empty image message
|
||||
*/
|
||||
MessageBool::MessageBool() {
|
||||
state = false;
|
||||
MessageImg::MessageImg() {
|
||||
image = NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new boolean message, with given ID and boolean value
|
||||
* Create a new image message, with given ID and image
|
||||
* @param id Message ID
|
||||
* @param state Boolean value
|
||||
* @throw std::runtime_error if message ID is incompatible with boolean data
|
||||
* @param image Image
|
||||
* @throw std::runtime_error if message ID is incompatible with image
|
||||
*/
|
||||
MessageBool::MessageBool(MessageID id, bool state) {
|
||||
MessageBool::SetID(id);
|
||||
MessageImg::MessageImg(MessageID id, Img* image) {
|
||||
MessageImg::SetID(id);
|
||||
MessageImg::SetImage(image);
|
||||
}
|
||||
|
||||
this->state = state;
|
||||
/**
|
||||
* Destroy Image message
|
||||
*/
|
||||
MessageImg::~MessageImg() {
|
||||
delete (this->image);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set message ID
|
||||
* @param id Message ID
|
||||
* @throw std::runtime_error if message ID is incompatible with boolean data
|
||||
* @throw std::runtime_error if message ID is incompatible with image
|
||||
*/
|
||||
void MessageBool::SetID(MessageID id) {
|
||||
void MessageImg::SetID(MessageID id) {
|
||||
if (CheckID(id))
|
||||
messageID = id;
|
||||
else
|
||||
throw std::runtime_error {
|
||||
"Invalid message id for MessageBool"
|
||||
"Invalid message id for MessageImg"
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Set message image
|
||||
* @param image Reference to image object
|
||||
*/
|
||||
void MessageImg::SetImage(Img* image) {
|
||||
this->image = image->Copy();
|
||||
}
|
||||
|
||||
/**
|
||||
* Translate content of message into a string that can be displayed
|
||||
* @return A string describing message contents
|
||||
*/
|
||||
string MessageBool::ToString() {
|
||||
string MessageImg::ToString() {
|
||||
if (CheckID(this->messageID))
|
||||
return "Id: \"" + MESSAGE_ID_STRING[this->messageID] + "\"\nState: \"" + to_string(this->state) + "\"";
|
||||
return "Id: \"" + MESSAGE_ID_STRING[this->messageID] + "\"\n" + this->image->ToString();
|
||||
else
|
||||
return "Invalid message";
|
||||
}
|
||||
|
@ -310,8 +351,9 @@ string MessageBool::ToString() {
|
|||
* Allocate a new message and copy contents of current message
|
||||
* @return A message, copy of current
|
||||
*/
|
||||
Message* MessageBool::Copy() {
|
||||
return new MessageBool(this->messageID, this->state);
|
||||
Message* MessageImg::Copy() {
|
||||
|
||||
return new MessageImg(this->messageID, this->image->Copy());
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -319,9 +361,352 @@ Message* MessageBool::Copy() {
|
|||
* @param id Message ID
|
||||
* @return true, if message ID is acceptable, false otherwise
|
||||
*/
|
||||
bool MessageBool::CheckID(MessageID id) {
|
||||
if ((id != MESSAGE_EMERGENCY_STOP) &&
|
||||
(id != MESSAGE_USER_PRESENCE)) {
|
||||
bool MessageImg::CheckID(MessageID id) {
|
||||
if (id != MESSAGE_IMAGE) {
|
||||
return false;
|
||||
} else return true;
|
||||
}
|
||||
|
||||
/* class MessageAnswer*/
|
||||
|
||||
/**
|
||||
* Create a new, empty answer message
|
||||
*/
|
||||
MessageAnswer::MessageAnswer() {
|
||||
answer=ANSWER_ACK;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new answer message, with given ID and answer
|
||||
* @param id Message ID
|
||||
* @param ans Answer ID
|
||||
* @throw std::runtime_error if message ID is incompatible with string data
|
||||
*/
|
||||
MessageAnswer::MessageAnswer(MessageID id, AnswerID ans) {
|
||||
MessageAnswer::SetID(id);
|
||||
MessageAnswer::SetAnswer(ans);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set message ID
|
||||
* @param id Message ID
|
||||
* @throw std::runtime_error if message ID is incompatible with answer message
|
||||
*/
|
||||
void MessageAnswer::SetID(MessageID id) {
|
||||
if (CheckID(id))
|
||||
messageID = id;
|
||||
else
|
||||
throw std::runtime_error {
|
||||
"Invalid message id for MessageAnswer"
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Set message answer
|
||||
* @param ans Answer ID
|
||||
* @throw std::runtime_error if answer ID is incompatible with answer data
|
||||
*/
|
||||
void MessageAnswer::SetAnswer(AnswerID ans) {
|
||||
if ((ans != ANSWER_ACK) &&
|
||||
(ans != ANSWER_NACK) &&
|
||||
(ans != ANSWER_LOST_ROBOT) &&
|
||||
(ans != ANSWER_ROBOT_CHECKSUM) &&
|
||||
(ans != ANSWER_ROBOT_ERROR) &&
|
||||
(ans != ANSWER_ROBOT_TIMEOUT) &&
|
||||
(ans != ANSWER_ROBOT_UNKNOWN_COMMAND)) {
|
||||
this->answer = answer;
|
||||
} else {
|
||||
throw std::runtime_error{
|
||||
"Invalid answer for MessageAnswer"};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Translate content of message into a string that can be displayed
|
||||
* @return A string describing message contents
|
||||
*/
|
||||
string MessageAnswer::ToString() {
|
||||
if (CheckID(this->messageID))
|
||||
return "Id: \"" + MESSAGE_ID_STRING[this->messageID] + "\"\nAnswer: \"" + ANSWER_ID_STRING[this->answer] + "\"";
|
||||
else
|
||||
return "Invalid message";
|
||||
}
|
||||
|
||||
/**
|
||||
* Allocate a new message and copy contents of current message
|
||||
* @return A message, copy of current
|
||||
*/
|
||||
Message* MessageAnswer::Copy() {
|
||||
return new MessageAnswer(this->messageID, this->answer);
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify if message ID is compatible with current message type
|
||||
* @param id Message ID
|
||||
* @return true, if message ID is acceptable, false otherwise
|
||||
*/
|
||||
bool MessageAnswer::CheckID(MessageID id) {
|
||||
if ((id != MESSAGE_ANSWER)) {
|
||||
return false;
|
||||
} else return true;
|
||||
}
|
||||
|
||||
/* class MessageBattery */
|
||||
|
||||
/**
|
||||
* Create a new, empty battery message
|
||||
*/
|
||||
MessageBattery::MessageBattery() {
|
||||
this->level = BATTERY_UNKNOWN;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new battery message, with given ID and battery level
|
||||
* @param id Message ID
|
||||
* @param level Battery level
|
||||
* @throw std::runtime_error if message ID is incompatible with battery
|
||||
*/
|
||||
MessageBattery::MessageBattery(MessageID id, BatteryLevel level) {
|
||||
MessageBattery::SetID(id);
|
||||
MessageBattery::SetLevel(level);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set message ID
|
||||
* @param id Message ID
|
||||
* @throw std::runtime_error if message ID is incompatible with battery
|
||||
*/
|
||||
void MessageBattery::SetID(MessageID id) {
|
||||
if (CheckID(id))
|
||||
messageID = id;
|
||||
else
|
||||
throw std::runtime_error {
|
||||
"Invalid message id for MessageBattery"
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Set battery level
|
||||
* @param level Battery level
|
||||
*/
|
||||
void MessageBattery::SetLevel(BatteryLevel level) {
|
||||
if ((level < BATTERY_UNKNOWN) || (level > BATTERY_FULL)) {
|
||||
throw std::runtime_error{
|
||||
"Invalid battery level for MessageBattery"};
|
||||
} else {
|
||||
this->level = level;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Translate content of message into a string that can be displayed
|
||||
* @return A string describing message contents
|
||||
*/
|
||||
string MessageBattery::ToString() {
|
||||
string levelString;
|
||||
|
||||
switch (this->level) {
|
||||
case BATTERY_UNKNOWN:
|
||||
levelString="Unknown";
|
||||
break;
|
||||
case BATTERY_EMPTY:
|
||||
levelString="Empty";
|
||||
break;
|
||||
case BATTERY_LOW:
|
||||
levelString="Low";
|
||||
break;
|
||||
case BATTERY_FULL:
|
||||
levelString="Full";
|
||||
break;
|
||||
default:
|
||||
levelString="Invalid";
|
||||
}
|
||||
|
||||
if (CheckID(this->messageID))
|
||||
return "Id: \"" + MESSAGE_ID_STRING[this->messageID] + "\"\nBattery level: \"" + levelString + "\"";
|
||||
else
|
||||
return "Invalid message";
|
||||
}
|
||||
|
||||
/**
|
||||
* Allocate a new message and copy contents of current message
|
||||
* @return A message, copy of current
|
||||
*/
|
||||
Message* MessageBattery::Copy() {
|
||||
return new MessageBattery(this->messageID, this->level);
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify if message ID is compatible with current message type
|
||||
* @param id Message ID
|
||||
* @return true, if message ID is acceptable, false otherwise
|
||||
*/
|
||||
bool MessageBattery::CheckID(MessageID id) {
|
||||
if ((id != MESSAGE_ROBOT_BATTERY_LEVEL)) {
|
||||
return false;
|
||||
} else return true;
|
||||
}
|
||||
|
||||
/* class MessagePosition */
|
||||
|
||||
/**
|
||||
* Create a new, empty string message
|
||||
*/
|
||||
MessagePosition::MessagePosition() {
|
||||
this->pos.angle = 0.0;
|
||||
this->pos.robotId = 0;
|
||||
this->pos.center.x=0.0;
|
||||
this->pos.center.y=0.0;
|
||||
this->pos.direction.x=0.0;
|
||||
this->pos.direction.y=0.0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new string message, with given ID and string
|
||||
* @param id Message ID
|
||||
* @param s Message string
|
||||
* @throw std::runtime_error if message ID is incompatible with string data
|
||||
*/
|
||||
MessagePosition::MessagePosition(MessageID id, Position& pos) {
|
||||
MessagePosition::SetID(id);
|
||||
MessagePosition::SetPosition(pos);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set message ID
|
||||
* @param id Message ID
|
||||
* @throw std::runtime_error if message ID is incompatible with string data
|
||||
*/
|
||||
void MessagePosition::SetID(MessageID id) {
|
||||
if (CheckID(id))
|
||||
messageID = id;
|
||||
else
|
||||
throw std::runtime_error {
|
||||
"Invalid message id for MessagePosition"
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Set position
|
||||
* @param pos Reference to position
|
||||
*/
|
||||
void MessagePosition::SetPosition(Position& pos) {
|
||||
this->pos.angle = pos.angle;
|
||||
this->pos.robotId = pos.robotId;
|
||||
this->pos.center = pos.center;
|
||||
this->pos.direction = pos.direction;
|
||||
}
|
||||
|
||||
/**
|
||||
* Translate content of message into a string that can be displayed
|
||||
* @return A string describing message contents
|
||||
*/
|
||||
string MessagePosition::ToString() {
|
||||
if (CheckID(this->messageID))
|
||||
return "Id: \"" + MESSAGE_ID_STRING[this->messageID] + "\"\nPosition: \"" + to_string(this->pos.center.x) + ";" + to_string(this->pos.center.y) + "\"";
|
||||
else
|
||||
return "Invalid message";
|
||||
}
|
||||
|
||||
/**
|
||||
* Allocate a new message and copy contents of current message
|
||||
* @return A message, copy of current
|
||||
*/
|
||||
Message* MessagePosition::Copy() {
|
||||
return new MessagePosition(this->messageID, this->pos);
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify if message ID is compatible with current message type
|
||||
* @param id Message ID
|
||||
* @return true, if message ID is acceptable, false otherwise
|
||||
*/
|
||||
bool MessagePosition::CheckID(MessageID id) {
|
||||
if ((id != MESSAGE_POSITION)) {
|
||||
return false;
|
||||
} else return true;
|
||||
}
|
||||
|
||||
|
||||
/* class MessageState */
|
||||
|
||||
/**
|
||||
* Create a new, empty state message
|
||||
*/
|
||||
MessageState::MessageState() {
|
||||
state = ROBOT_NOT_BUSY;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new string message, with given ID and string
|
||||
* @param id Message ID
|
||||
* @param s Message string
|
||||
* @throw std::runtime_error if message ID is incompatible with string data
|
||||
*/
|
||||
MessageState::MessageState(MessageID id, RobotState state) {
|
||||
MessageState::SetID(id);
|
||||
MessageState::SetState(state);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set message ID
|
||||
* @param id Message ID
|
||||
* @throw std::runtime_error if message ID is incompatible with robot state
|
||||
*/
|
||||
void MessageState::SetID(MessageID id) {
|
||||
if (CheckID(id))
|
||||
messageID = id;
|
||||
else
|
||||
throw std::runtime_error {
|
||||
"Invalid message id for MessageState"
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Set robot state
|
||||
* @param state Robot state
|
||||
*/
|
||||
void MessageState::SetState(RobotState state) {
|
||||
if ((state != ROBOT_NOT_BUSY) && (state != ROBOT_BUSY)) {
|
||||
throw std::runtime_error{
|
||||
"Invalid state for MessageState"};
|
||||
} else {
|
||||
this->state = state;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Translate content of message into a string that can be displayed
|
||||
* @return A string describing message contents
|
||||
*/
|
||||
string MessageState::ToString() {
|
||||
string stateString;
|
||||
|
||||
if (this->state == ROBOT_NOT_BUSY) stateString="Not busy";
|
||||
else if (this->state == ROBOT_BUSY) stateString="Busy";
|
||||
else stateString="Invalid state";
|
||||
|
||||
if (CheckID(this->messageID))
|
||||
return "Id: \"" + MESSAGE_ID_STRING[this->messageID] + "\"\nState: \"" + stateString + "\"";
|
||||
else
|
||||
return "Invalid message";
|
||||
}
|
||||
|
||||
/**
|
||||
* Allocate a new message and copy contents of current message
|
||||
* @return A message, copy of current
|
||||
*/
|
||||
Message* MessageState::Copy() {
|
||||
return new MessageState(this->messageID, this->state);
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify if message ID is compatible with current message type
|
||||
* @param id Message ID
|
||||
* @return true, if message ID is acceptable, false otherwise
|
||||
*/
|
||||
bool MessageState::CheckID(MessageID id) {
|
||||
if ((id != MESSAGE_ROBOT_CURRENT_STATE)) {
|
||||
return false;
|
||||
} else return true;
|
||||
}
|
|
@ -38,7 +38,10 @@ typedef enum {
|
|||
// messages for serial communication with robot
|
||||
MESSAGE_OPEN_COM,
|
||||
MESSAGE_CLOSE_COM,
|
||||
|
||||
|
||||
// Messages specific to server
|
||||
MESSAGE_MONITOR_LOST,
|
||||
|
||||
// Messages for camera
|
||||
MESSAGE_CAM_OPEN,
|
||||
MESSAGE_CAM_CLOSE,
|
||||
|
@ -75,12 +78,13 @@ typedef enum {
|
|||
ANSWER_NACK,
|
||||
ANSWER_LOST_ROBOT,
|
||||
ANSWER_ROBOT_TIMEOUT,
|
||||
ANSWER_ROBOT_UNKNWON_COMMAND,
|
||||
ANSWER_ROBOT_UNKNOWN_COMMAND,
|
||||
ANSWER_ROBOT_ERROR,
|
||||
ANSWER_ROBOT_CHECKSUM
|
||||
} AnswerID;
|
||||
|
||||
typedef enum {
|
||||
BATTERY_UNKNOWN=-1,
|
||||
BATTERY_EMPTY=0,
|
||||
BATTERY_LOW,
|
||||
BATTERY_FULL
|
||||
|
@ -106,6 +110,11 @@ public:
|
|||
*/
|
||||
Message();
|
||||
|
||||
/**
|
||||
* Create a new, empty message
|
||||
*/
|
||||
Message(MessageID id);
|
||||
|
||||
/**
|
||||
* Destroy message
|
||||
*/
|
||||
|
@ -135,8 +144,7 @@ public:
|
|||
* Set message ID
|
||||
* @param id Message ID
|
||||
*/
|
||||
virtual void SetID(MessageID id) {
|
||||
}
|
||||
virtual void SetID(MessageID id);
|
||||
|
||||
/**
|
||||
* Comparison operator
|
||||
|
@ -259,93 +267,6 @@ protected:
|
|||
bool CheckID(MessageID id);
|
||||
};
|
||||
|
||||
/**
|
||||
* Message class for holding float value, based on Message class
|
||||
*
|
||||
* @brief Float message class
|
||||
*
|
||||
*/
|
||||
class MessageFloat : public Message {
|
||||
public:
|
||||
/**
|
||||
* Create a new, empty float message
|
||||
*/
|
||||
MessageFloat();
|
||||
|
||||
/**
|
||||
* Create a new float message, with given ID and value
|
||||
* @param id Message ID
|
||||
* @param val Message value
|
||||
* @throw std::runtime_error if message ID is incompatible with float data
|
||||
*/
|
||||
MessageFloat(MessageID id, float val);
|
||||
|
||||
/**
|
||||
* Set message ID
|
||||
* @param id Message ID
|
||||
* @throw std::runtime_error if message ID is incompatible with float data
|
||||
*/
|
||||
void SetID(MessageID id);
|
||||
|
||||
/**
|
||||
* Get message value (float)
|
||||
* @return Float value
|
||||
*/
|
||||
float GetValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set message value (float)
|
||||
* @param val Float value to store in message
|
||||
*/
|
||||
void SetValue(float val) {
|
||||
this->value = val;
|
||||
}
|
||||
|
||||
/**
|
||||
* Translate content of message into a string that can be displayed
|
||||
* @return A string describing message contents
|
||||
*/
|
||||
string ToString();
|
||||
|
||||
/**
|
||||
* Allocate a new mesage and copy contents of current message
|
||||
* @return A message, copy of current
|
||||
*/
|
||||
Message* Copy();
|
||||
|
||||
/**
|
||||
* Comparison operator
|
||||
* @param msg Message to be compared
|
||||
* @return true if message are equal, false otherwise
|
||||
*/
|
||||
virtual bool operator==(const MessageFloat& msg) {
|
||||
return ((messageID == msg.messageID) && (value == msg.value));
|
||||
}
|
||||
|
||||
/**
|
||||
* Difference operator
|
||||
* @param msg Message to be compared
|
||||
* @return true if message are different, false otherwise
|
||||
*/
|
||||
virtual bool operator!=(const MessageFloat& msg) {
|
||||
return !((messageID == msg.messageID) && (value == msg.value));
|
||||
}
|
||||
protected:
|
||||
/**
|
||||
* Message float value
|
||||
*/
|
||||
float value;
|
||||
|
||||
/**
|
||||
* Verify if message ID is compatible with current message type
|
||||
* @param id Message ID
|
||||
* @return true, if message ID is acceptable, false otherwise
|
||||
*/
|
||||
bool CheckID(MessageID id);
|
||||
};
|
||||
|
||||
/**
|
||||
* Message class for holding string value, based on Message class
|
||||
*
|
||||
|
@ -454,6 +375,11 @@ public:
|
|||
*/
|
||||
MessageImg(MessageID id, Img* image);
|
||||
|
||||
/**
|
||||
* Destroy Image message
|
||||
*/
|
||||
virtual ~MessageImg();
|
||||
|
||||
/**
|
||||
* Set message ID
|
||||
* @param id Message ID
|
||||
|
@ -473,9 +399,7 @@ public:
|
|||
* Set message image
|
||||
* @param image Pointer to image object
|
||||
*/
|
||||
void SetImage(Img* image) {
|
||||
this->image = image;
|
||||
}
|
||||
void SetImage(Img* image);
|
||||
|
||||
/**
|
||||
* Translate content of message into a string that can be displayed
|
||||
|
@ -519,10 +443,10 @@ public:
|
|||
/**
|
||||
* Create a new image message, with given ID and boolean value
|
||||
* @param id Message ID
|
||||
* @param image Pointer to image
|
||||
* @param pos Position
|
||||
* @throw std::runtime_error if message ID is incompatible with image message
|
||||
*/
|
||||
MessagePosition(MessageID id, Position pos);
|
||||
MessagePosition(MessageID id, Position& pos);
|
||||
|
||||
/**
|
||||
* Set message ID
|
||||
|
@ -543,9 +467,7 @@ public:
|
|||
* Set message image
|
||||
* @param image Pointer to image object
|
||||
*/
|
||||
void SetPosition(Position pos) {
|
||||
this->pos = pos;
|
||||
}
|
||||
void SetPosition(Position& pos);
|
||||
|
||||
/**
|
||||
* Translate content of message into a string that can be displayed
|
||||
|
@ -613,9 +535,7 @@ public:
|
|||
* Set message image
|
||||
* @param image Pointer to image object
|
||||
*/
|
||||
void SetLevel(BatteryLevel level) {
|
||||
this->level = level;
|
||||
}
|
||||
void SetLevel(BatteryLevel level);
|
||||
|
||||
/**
|
||||
* Translate content of message into a string that can be displayed
|
||||
|
@ -659,10 +579,10 @@ public:
|
|||
/**
|
||||
* Create a new image message, with given ID and boolean value
|
||||
* @param id Message ID
|
||||
* @param image Pointer to image
|
||||
* @param ans Answer ID
|
||||
* @throw std::runtime_error if message ID is incompatible with image message
|
||||
*/
|
||||
MessageAnswer(MessageID id, AnswerID answer);
|
||||
MessageAnswer(MessageID id, AnswerID ans);
|
||||
|
||||
/**
|
||||
* Set message ID
|
||||
|
@ -680,12 +600,10 @@ public:
|
|||
}
|
||||
|
||||
/**
|
||||
* Set message image
|
||||
* @param image Pointer to image object
|
||||
* Set message answer
|
||||
* @param ans Answer ID
|
||||
*/
|
||||
void SetAnswer(AnswerID answer) {
|
||||
this->answer = answer;
|
||||
}
|
||||
void SetAnswer(AnswerID ans);
|
||||
|
||||
/**
|
||||
* Translate content of message into a string that can be displayed
|
||||
|
@ -753,9 +671,7 @@ public:
|
|||
* Set message image
|
||||
* @param image Pointer to image object
|
||||
*/
|
||||
void SetState(RobotState state) {
|
||||
this->state = state;
|
||||
}
|
||||
void SetState(RobotState state);
|
||||
|
||||
/**
|
||||
* Translate content of message into a string that can be displayed
|
||||
|
@ -771,7 +687,7 @@ public:
|
|||
|
||||
protected:
|
||||
/**
|
||||
* Message answer
|
||||
* Robot state
|
||||
*/
|
||||
RobotState state;
|
||||
|
||||
|
|
|
@ -41,7 +41,10 @@ OBJECTFILES= \
|
|||
${OBJECTDIR}/lib/robot.o \
|
||||
${OBJECTDIR}/lib/server.o \
|
||||
${OBJECTDIR}/main.o \
|
||||
${OBJECTDIR}/tasks.o
|
||||
${OBJECTDIR}/tasks.o \
|
||||
${OBJECTDIR}/_ext/6cc0dc4a/commonitor.o \
|
||||
${OBJECTDIR}/_ext/6cc0dc4a/comrobot.o \
|
||||
${OBJECTDIR}/tasks_pthread.o
|
||||
|
||||
|
||||
# C Compiler Flags
|
||||
|
@ -103,6 +106,21 @@ ${OBJECTDIR}/tasks.o: tasks.cpp
|
|||
${RM} "$@.d"
|
||||
$(COMPILE.cc) -g -D_WITH_TRACE_ -D__FOR_PC__ -I./ -I./lib -I/usr/xenomai/include -I/usr/xenomai/include/mercury `pkg-config --cflags opencv` -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/tasks.o tasks.cpp
|
||||
|
||||
${OBJECTDIR}/_ext/6cc0dc4a/commonitor.o: /home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/commonitor.cpp
|
||||
${MKDIR} -p ${OBJECTDIR}/_ext/6cc0dc4a
|
||||
${RM} "$@.d"
|
||||
$(COMPILE.cc) -g -D_WITH_TRACE_ -D__FOR_PC__ -I./ -I./lib -I/usr/xenomai/include -I/usr/xenomai/include/mercury `pkg-config --cflags opencv` -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/6cc0dc4a/commonitor.o /home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/commonitor.cpp
|
||||
|
||||
${OBJECTDIR}/_ext/6cc0dc4a/comrobot.o: /home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/comrobot.cpp
|
||||
${MKDIR} -p ${OBJECTDIR}/_ext/6cc0dc4a
|
||||
${RM} "$@.d"
|
||||
$(COMPILE.cc) -g -D_WITH_TRACE_ -D__FOR_PC__ -I./ -I./lib -I/usr/xenomai/include -I/usr/xenomai/include/mercury `pkg-config --cflags opencv` -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/6cc0dc4a/comrobot.o /home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/comrobot.cpp
|
||||
|
||||
${OBJECTDIR}/tasks_pthread.o: tasks_pthread.cpp
|
||||
${MKDIR} -p ${OBJECTDIR}
|
||||
${RM} "$@.d"
|
||||
$(COMPILE.cc) -g -D_WITH_TRACE_ -D__FOR_PC__ -I./ -I./lib -I/usr/xenomai/include -I/usr/xenomai/include/mercury `pkg-config --cflags opencv` -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/tasks_pthread.o tasks_pthread.cpp
|
||||
|
||||
# Subprojects
|
||||
.build-subprojects:
|
||||
|
||||
|
|
|
@ -0,0 +1,131 @@
|
|||
#
|
||||
# Generated Makefile - do not edit!
|
||||
#
|
||||
# Edit the Makefile in the project folder instead (../Makefile). Each target
|
||||
# has a -pre and a -post target defined where you can add customized code.
|
||||
#
|
||||
# This makefile implements configuration specific macros and targets.
|
||||
|
||||
|
||||
# Environment
|
||||
MKDIR=mkdir
|
||||
CP=cp
|
||||
GREP=grep
|
||||
NM=nm
|
||||
CCADMIN=CCadmin
|
||||
RANLIB=ranlib
|
||||
CC=gcc
|
||||
CCC=g++
|
||||
CXX=g++
|
||||
FC=gfortran
|
||||
AS=as
|
||||
|
||||
# Macros
|
||||
CND_PLATFORM=GNU-Linux
|
||||
CND_DLIB_EXT=so
|
||||
CND_CONF=Debug__Pthread_
|
||||
CND_DISTDIR=dist
|
||||
CND_BUILDDIR=build
|
||||
|
||||
# Include project Makefile
|
||||
include ./Makefile
|
||||
|
||||
# Object Directory
|
||||
OBJECTDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}
|
||||
|
||||
# Object Files
|
||||
OBJECTFILES= \
|
||||
${OBJECTDIR}/lib/message.o \
|
||||
${OBJECTDIR}/lib/messages.o \
|
||||
${OBJECTDIR}/lib/monitor.o \
|
||||
${OBJECTDIR}/lib/robot.o \
|
||||
${OBJECTDIR}/lib/server.o \
|
||||
${OBJECTDIR}/main.o \
|
||||
${OBJECTDIR}/_ext/6cc0dc4a/commonitor.o \
|
||||
${OBJECTDIR}/_ext/6cc0dc4a/comrobot.o \
|
||||
${OBJECTDIR}/tasks_pthread.o
|
||||
|
||||
|
||||
# C Compiler Flags
|
||||
CFLAGS=-I/usr/xenomai/include/mercury -I/usr/xenomai/include -D_GNU_SOURCE -D_REENTRANT -fasynchronous-unwind-tables -D__MERCURY__ -I/usr/xenomai/include/alchemy
|
||||
|
||||
# CC Compiler Flags
|
||||
CCFLAGS=-D_GNU_SOURCE -D_REENTRANT -fasynchronous-unwind-tables
|
||||
CXXFLAGS=-D_GNU_SOURCE -D_REENTRANT -fasynchronous-unwind-tables
|
||||
|
||||
# Fortran Compiler Flags
|
||||
FFLAGS=
|
||||
|
||||
# Assembler Flags
|
||||
ASFLAGS=
|
||||
|
||||
# Link Libraries and Options
|
||||
LDLIBSOPTIONS=`pkg-config --libs opencv`
|
||||
|
||||
# Build Targets
|
||||
.build-conf: ${BUILD_SUBPROJECTS}
|
||||
"${MAKE}" -f nbproject/Makefile-${CND_CONF}.mk ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/superviseur-robot
|
||||
|
||||
${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/superviseur-robot: ${OBJECTFILES}
|
||||
${MKDIR} -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}
|
||||
${LINK.cc} -o ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/superviseur-robot ${OBJECTFILES} ${LDLIBSOPTIONS} -lpthread -lrt
|
||||
|
||||
${OBJECTDIR}/lib/message.o: lib/message.cpp
|
||||
${MKDIR} -p ${OBJECTDIR}/lib
|
||||
${RM} "$@.d"
|
||||
$(COMPILE.cc) -g -D_WITH_TRACE_ -D__FOR_PC__ -D__WITH_PTHREAD__ -I./ -I./lib `pkg-config --cflags opencv` -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/lib/message.o lib/message.cpp
|
||||
|
||||
${OBJECTDIR}/lib/messages.o: lib/messages.cpp
|
||||
${MKDIR} -p ${OBJECTDIR}/lib
|
||||
${RM} "$@.d"
|
||||
$(COMPILE.cc) -g -D_WITH_TRACE_ -D__FOR_PC__ -D__WITH_PTHREAD__ -I./ -I./lib `pkg-config --cflags opencv` -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/lib/messages.o lib/messages.cpp
|
||||
|
||||
${OBJECTDIR}/lib/monitor.o: lib/monitor.cpp
|
||||
${MKDIR} -p ${OBJECTDIR}/lib
|
||||
${RM} "$@.d"
|
||||
$(COMPILE.cc) -g -D_WITH_TRACE_ -D__FOR_PC__ -D__WITH_PTHREAD__ -I./ -I./lib `pkg-config --cflags opencv` -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/lib/monitor.o lib/monitor.cpp
|
||||
|
||||
${OBJECTDIR}/lib/robot.o: lib/robot.cpp
|
||||
${MKDIR} -p ${OBJECTDIR}/lib
|
||||
${RM} "$@.d"
|
||||
$(COMPILE.cc) -g -D_WITH_TRACE_ -D__FOR_PC__ -D__WITH_PTHREAD__ -I./ -I./lib `pkg-config --cflags opencv` -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/lib/robot.o lib/robot.cpp
|
||||
|
||||
${OBJECTDIR}/lib/server.o: lib/server.cpp
|
||||
${MKDIR} -p ${OBJECTDIR}/lib
|
||||
${RM} "$@.d"
|
||||
$(COMPILE.cc) -g -D_WITH_TRACE_ -D__FOR_PC__ -D__WITH_PTHREAD__ -I./ -I./lib `pkg-config --cflags opencv` -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/lib/server.o lib/server.cpp
|
||||
|
||||
${OBJECTDIR}/main.o: main.cpp
|
||||
${MKDIR} -p ${OBJECTDIR}
|
||||
${RM} "$@.d"
|
||||
$(COMPILE.cc) -g -D_WITH_TRACE_ -D__FOR_PC__ -D__WITH_PTHREAD__ -I./ -I./lib `pkg-config --cflags opencv` -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/main.o main.cpp
|
||||
|
||||
${OBJECTDIR}/_ext/6cc0dc4a/commonitor.o: /home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/commonitor.cpp
|
||||
${MKDIR} -p ${OBJECTDIR}/_ext/6cc0dc4a
|
||||
${RM} "$@.d"
|
||||
$(COMPILE.cc) -g -D_WITH_TRACE_ -D__FOR_PC__ -D__WITH_PTHREAD__ -I./ -I./lib `pkg-config --cflags opencv` -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/6cc0dc4a/commonitor.o /home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/commonitor.cpp
|
||||
|
||||
${OBJECTDIR}/_ext/6cc0dc4a/comrobot.o: /home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/comrobot.cpp
|
||||
${MKDIR} -p ${OBJECTDIR}/_ext/6cc0dc4a
|
||||
${RM} "$@.d"
|
||||
$(COMPILE.cc) -g -D_WITH_TRACE_ -D__FOR_PC__ -D__WITH_PTHREAD__ -I./ -I./lib `pkg-config --cflags opencv` -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/6cc0dc4a/comrobot.o /home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/comrobot.cpp
|
||||
|
||||
${OBJECTDIR}/tasks_pthread.o: tasks_pthread.cpp
|
||||
${MKDIR} -p ${OBJECTDIR}
|
||||
${RM} "$@.d"
|
||||
$(COMPILE.cc) -g -D_WITH_TRACE_ -D__FOR_PC__ -D__WITH_PTHREAD__ -I./ -I./lib `pkg-config --cflags opencv` -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/tasks_pthread.o tasks_pthread.cpp
|
||||
|
||||
# Subprojects
|
||||
.build-subprojects:
|
||||
|
||||
# Clean Targets
|
||||
.clean-conf: ${CLEAN_SUBPROJECTS}
|
||||
${RM} -r ${CND_BUILDDIR}/${CND_CONF}
|
||||
|
||||
# Subprojects
|
||||
.clean-subprojects:
|
||||
|
||||
# Enable dependency checking
|
||||
.dep.inc: .depcheck-impl
|
||||
|
||||
include .dep.inc
|
|
@ -42,7 +42,10 @@ OBJECTFILES= \
|
|||
${OBJECTDIR}/lib/robot.o \
|
||||
${OBJECTDIR}/lib/server.o \
|
||||
${OBJECTDIR}/main.o \
|
||||
${OBJECTDIR}/tasks.o
|
||||
${OBJECTDIR}/tasks.o \
|
||||
${OBJECTDIR}/_ext/6cc0dc4a/commonitor.o \
|
||||
${OBJECTDIR}/_ext/6cc0dc4a/comrobot.o \
|
||||
${OBJECTDIR}/tasks_pthread.o
|
||||
|
||||
|
||||
# C Compiler Flags
|
||||
|
@ -109,6 +112,21 @@ ${OBJECTDIR}/tasks.o: tasks.cpp
|
|||
${RM} "$@.d"
|
||||
$(COMPILE.cc) -g -D_WITH_TRACE_ -I./ -I./lib -I/usr/xenomai/include -I/usr/xenomai/include/mercury `pkg-config --cflags opencv` -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/tasks.o tasks.cpp
|
||||
|
||||
${OBJECTDIR}/_ext/6cc0dc4a/commonitor.o: /home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/commonitor.cpp
|
||||
${MKDIR} -p ${OBJECTDIR}/_ext/6cc0dc4a
|
||||
${RM} "$@.d"
|
||||
$(COMPILE.cc) -g -D_WITH_TRACE_ -I./ -I./lib -I/usr/xenomai/include -I/usr/xenomai/include/mercury `pkg-config --cflags opencv` -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/6cc0dc4a/commonitor.o /home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/commonitor.cpp
|
||||
|
||||
${OBJECTDIR}/_ext/6cc0dc4a/comrobot.o: /home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/comrobot.cpp
|
||||
${MKDIR} -p ${OBJECTDIR}/_ext/6cc0dc4a
|
||||
${RM} "$@.d"
|
||||
$(COMPILE.cc) -g -D_WITH_TRACE_ -I./ -I./lib -I/usr/xenomai/include -I/usr/xenomai/include/mercury `pkg-config --cflags opencv` -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/6cc0dc4a/comrobot.o /home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/comrobot.cpp
|
||||
|
||||
${OBJECTDIR}/tasks_pthread.o: tasks_pthread.cpp
|
||||
${MKDIR} -p ${OBJECTDIR}
|
||||
${RM} "$@.d"
|
||||
$(COMPILE.cc) -g -D_WITH_TRACE_ -I./ -I./lib -I/usr/xenomai/include -I/usr/xenomai/include/mercury `pkg-config --cflags opencv` -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/tasks_pthread.o tasks_pthread.cpp
|
||||
|
||||
# Subprojects
|
||||
.build-subprojects:
|
||||
|
||||
|
|
|
@ -42,7 +42,10 @@ OBJECTFILES= \
|
|||
${OBJECTDIR}/lib/robot.o \
|
||||
${OBJECTDIR}/lib/server.o \
|
||||
${OBJECTDIR}/main.o \
|
||||
${OBJECTDIR}/tasks.o
|
||||
${OBJECTDIR}/tasks.o \
|
||||
${OBJECTDIR}/_ext/6cc0dc4a/commonitor.o \
|
||||
${OBJECTDIR}/_ext/6cc0dc4a/comrobot.o \
|
||||
${OBJECTDIR}/tasks_pthread.o
|
||||
|
||||
|
||||
# C Compiler Flags
|
||||
|
@ -109,6 +112,21 @@ ${OBJECTDIR}/tasks.o: tasks.cpp
|
|||
${RM} "$@.d"
|
||||
$(COMPILE.cc) -O2 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/tasks.o tasks.cpp
|
||||
|
||||
${OBJECTDIR}/_ext/6cc0dc4a/commonitor.o: /home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/commonitor.cpp
|
||||
${MKDIR} -p ${OBJECTDIR}/_ext/6cc0dc4a
|
||||
${RM} "$@.d"
|
||||
$(COMPILE.cc) -O2 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/6cc0dc4a/commonitor.o /home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/commonitor.cpp
|
||||
|
||||
${OBJECTDIR}/_ext/6cc0dc4a/comrobot.o: /home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/comrobot.cpp
|
||||
${MKDIR} -p ${OBJECTDIR}/_ext/6cc0dc4a
|
||||
${RM} "$@.d"
|
||||
$(COMPILE.cc) -O2 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/6cc0dc4a/comrobot.o /home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/comrobot.cpp
|
||||
|
||||
${OBJECTDIR}/tasks_pthread.o: tasks_pthread.cpp
|
||||
${MKDIR} -p ${OBJECTDIR}
|
||||
${RM} "$@.d"
|
||||
$(COMPILE.cc) -O2 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/tasks_pthread.o tasks_pthread.cpp
|
||||
|
||||
# Subprojects
|
||||
.build-subprojects:
|
||||
|
||||
|
|
|
@ -31,7 +31,7 @@ DEFAULTCONF=Debug
|
|||
CONF=${DEFAULTCONF}
|
||||
|
||||
# All Configurations
|
||||
ALLCONFS=Debug Release Debug__RPI_
|
||||
ALLCONFS=Debug Release Debug__RPI_ Debug__Pthread_
|
||||
|
||||
|
||||
# build
|
||||
|
|
|
@ -30,6 +30,14 @@ CND_ARTIFACT_PATH_Debug__RPI_=dist/Debug__RPI_/GNU-Linux/superviseur-robot
|
|||
CND_PACKAGE_DIR_Debug__RPI_=dist/Debug__RPI_/GNU-Linux/package
|
||||
CND_PACKAGE_NAME_Debug__RPI_=superviseur-robot.tar
|
||||
CND_PACKAGE_PATH_Debug__RPI_=dist/Debug__RPI_/GNU-Linux/package/superviseur-robot.tar
|
||||
# Debug__Pthread_ configuration
|
||||
CND_PLATFORM_Debug__Pthread_=GNU-Linux
|
||||
CND_ARTIFACT_DIR_Debug__Pthread_=dist/Debug__Pthread_/GNU-Linux
|
||||
CND_ARTIFACT_NAME_Debug__Pthread_=superviseur-robot
|
||||
CND_ARTIFACT_PATH_Debug__Pthread_=dist/Debug__Pthread_/GNU-Linux/superviseur-robot
|
||||
CND_PACKAGE_DIR_Debug__Pthread_=dist/Debug__Pthread_/GNU-Linux/package
|
||||
CND_PACKAGE_NAME_Debug__Pthread_=superviseur-robot.tar
|
||||
CND_PACKAGE_PATH_Debug__Pthread_=dist/Debug__Pthread_/GNU-Linux/package/superviseur-robot.tar
|
||||
#
|
||||
# include compiler specific variables
|
||||
#
|
||||
|
|
|
@ -0,0 +1,76 @@
|
|||
#!/bin/bash -x
|
||||
|
||||
#
|
||||
# Generated - do not edit!
|
||||
#
|
||||
|
||||
# Macros
|
||||
TOP=`pwd`
|
||||
CND_PLATFORM=GNU-Linux
|
||||
CND_CONF=Debug__Pthread_
|
||||
CND_DISTDIR=dist
|
||||
CND_BUILDDIR=build
|
||||
CND_DLIB_EXT=so
|
||||
NBTMPDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}/tmp-packaging
|
||||
TMPDIRNAME=tmp-packaging
|
||||
OUTPUT_PATH=${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/superviseur-robot
|
||||
OUTPUT_BASENAME=superviseur-robot
|
||||
PACKAGE_TOP_DIR=superviseur-robot/
|
||||
|
||||
# Functions
|
||||
function checkReturnCode
|
||||
{
|
||||
rc=$?
|
||||
if [ $rc != 0 ]
|
||||
then
|
||||
exit $rc
|
||||
fi
|
||||
}
|
||||
function makeDirectory
|
||||
# $1 directory path
|
||||
# $2 permission (optional)
|
||||
{
|
||||
mkdir -p "$1"
|
||||
checkReturnCode
|
||||
if [ "$2" != "" ]
|
||||
then
|
||||
chmod $2 "$1"
|
||||
checkReturnCode
|
||||
fi
|
||||
}
|
||||
function copyFileToTmpDir
|
||||
# $1 from-file path
|
||||
# $2 to-file path
|
||||
# $3 permission
|
||||
{
|
||||
cp "$1" "$2"
|
||||
checkReturnCode
|
||||
if [ "$3" != "" ]
|
||||
then
|
||||
chmod $3 "$2"
|
||||
checkReturnCode
|
||||
fi
|
||||
}
|
||||
|
||||
# Setup
|
||||
cd "${TOP}"
|
||||
mkdir -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package
|
||||
rm -rf ${NBTMPDIR}
|
||||
mkdir -p ${NBTMPDIR}
|
||||
|
||||
# Copy files and create directories and links
|
||||
cd "${TOP}"
|
||||
makeDirectory "${NBTMPDIR}/superviseur-robot/bin"
|
||||
copyFileToTmpDir "${OUTPUT_PATH}" "${NBTMPDIR}/${PACKAGE_TOP_DIR}bin/${OUTPUT_BASENAME}" 0755
|
||||
|
||||
|
||||
# Generate tar file
|
||||
cd "${TOP}"
|
||||
rm -f ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/superviseur-robot.tar
|
||||
cd ${NBTMPDIR}
|
||||
tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/superviseur-robot.tar *
|
||||
checkReturnCode
|
||||
|
||||
# Cleanup
|
||||
cd "${TOP}"
|
||||
rm -rf ${NBTMPDIR}
|
|
@ -5,6 +5,8 @@
|
|||
displayName="Header Files"
|
||||
projectFiles="true">
|
||||
<itemPath>./lib/camera.h</itemPath>
|
||||
<itemPath>/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/commonitor.h</itemPath>
|
||||
<itemPath>/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/comrobot.h</itemPath>
|
||||
<itemPath>./lib/definitions.h</itemPath>
|
||||
<itemPath>./lib/image.h</itemPath>
|
||||
<itemPath>./lib/img.h</itemPath>
|
||||
|
@ -14,6 +16,7 @@
|
|||
<itemPath>./lib/robot.h</itemPath>
|
||||
<itemPath>./lib/server.h</itemPath>
|
||||
<itemPath>./tasks.h</itemPath>
|
||||
<itemPath>tasks_pthread.h</itemPath>
|
||||
</logicalFolder>
|
||||
<logicalFolder name="ResourceFiles"
|
||||
displayName="Resource Files"
|
||||
|
@ -24,6 +27,8 @@
|
|||
displayName="Source Files"
|
||||
projectFiles="true">
|
||||
<itemPath>./lib/camera.cpp</itemPath>
|
||||
<itemPath>/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/commonitor.cpp</itemPath>
|
||||
<itemPath>/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/comrobot.cpp</itemPath>
|
||||
<itemPath>./lib/image.cpp</itemPath>
|
||||
<itemPath>./lib/img.cpp</itemPath>
|
||||
<itemPath>./main.cpp</itemPath>
|
||||
|
@ -33,6 +38,7 @@
|
|||
<itemPath>./lib/robot.cpp</itemPath>
|
||||
<itemPath>./lib/server.cpp</itemPath>
|
||||
<itemPath>./tasks.cpp</itemPath>
|
||||
<itemPath>tasks_pthread.cpp</itemPath>
|
||||
</logicalFolder>
|
||||
<logicalFolder name="TestFiles"
|
||||
displayName="Test Files"
|
||||
|
@ -46,6 +52,9 @@
|
|||
<itemPath>./Makefile</itemPath>
|
||||
</logicalFolder>
|
||||
</logicalFolder>
|
||||
<sourceRootList>
|
||||
<Elem>/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib</Elem>
|
||||
</sourceRootList>
|
||||
<projectmakefile>./Makefile</projectmakefile>
|
||||
<confs>
|
||||
<conf name="Debug" type="1">
|
||||
|
@ -122,6 +131,30 @@
|
|||
</item>
|
||||
<item path="./tasks.h" ex="false" tool="3" flavor2="0">
|
||||
</item>
|
||||
<item path="/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/commonitor.cpp"
|
||||
ex="false"
|
||||
tool="1"
|
||||
flavor2="0">
|
||||
</item>
|
||||
<item path="/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/commonitor.h"
|
||||
ex="false"
|
||||
tool="3"
|
||||
flavor2="0">
|
||||
</item>
|
||||
<item path="/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/comrobot.cpp"
|
||||
ex="false"
|
||||
tool="1"
|
||||
flavor2="0">
|
||||
</item>
|
||||
<item path="/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/comrobot.h"
|
||||
ex="false"
|
||||
tool="3"
|
||||
flavor2="0">
|
||||
</item>
|
||||
<item path="tasks_pthread.cpp" ex="false" tool="1" flavor2="0">
|
||||
</item>
|
||||
<item path="tasks_pthread.h" ex="false" tool="3" flavor2="0">
|
||||
</item>
|
||||
</conf>
|
||||
<conf name="Release" type="1">
|
||||
<toolsSet>
|
||||
|
@ -185,6 +218,30 @@
|
|||
</item>
|
||||
<item path="./tasks.h" ex="false" tool="3" flavor2="0">
|
||||
</item>
|
||||
<item path="/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/commonitor.cpp"
|
||||
ex="false"
|
||||
tool="1"
|
||||
flavor2="0">
|
||||
</item>
|
||||
<item path="/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/commonitor.h"
|
||||
ex="false"
|
||||
tool="3"
|
||||
flavor2="0">
|
||||
</item>
|
||||
<item path="/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/comrobot.cpp"
|
||||
ex="false"
|
||||
tool="1"
|
||||
flavor2="0">
|
||||
</item>
|
||||
<item path="/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/comrobot.h"
|
||||
ex="false"
|
||||
tool="3"
|
||||
flavor2="0">
|
||||
</item>
|
||||
<item path="tasks_pthread.cpp" ex="false" tool="1" flavor2="0">
|
||||
</item>
|
||||
<item path="tasks_pthread.h" ex="false" tool="3" flavor2="0">
|
||||
</item>
|
||||
</conf>
|
||||
<conf name="Debug__RPI_" type="1">
|
||||
<toolsSet>
|
||||
|
@ -265,6 +322,128 @@
|
|||
</item>
|
||||
<item path="./tasks.h" ex="false" tool="3" flavor2="0">
|
||||
</item>
|
||||
<item path="/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/commonitor.cpp"
|
||||
ex="false"
|
||||
tool="1"
|
||||
flavor2="0">
|
||||
</item>
|
||||
<item path="/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/commonitor.h"
|
||||
ex="false"
|
||||
tool="3"
|
||||
flavor2="0">
|
||||
</item>
|
||||
<item path="/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/comrobot.cpp"
|
||||
ex="false"
|
||||
tool="1"
|
||||
flavor2="0">
|
||||
</item>
|
||||
<item path="/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/comrobot.h"
|
||||
ex="false"
|
||||
tool="3"
|
||||
flavor2="0">
|
||||
</item>
|
||||
<item path="tasks_pthread.cpp" ex="false" tool="1" flavor2="0">
|
||||
</item>
|
||||
<item path="tasks_pthread.h" ex="false" tool="3" flavor2="0">
|
||||
</item>
|
||||
</conf>
|
||||
<conf name="Debug__Pthread_" type="1">
|
||||
<toolsSet>
|
||||
<compilerSet>default</compilerSet>
|
||||
<dependencyChecking>true</dependencyChecking>
|
||||
<rebuildPropChanged>false</rebuildPropChanged>
|
||||
</toolsSet>
|
||||
<compileType>
|
||||
<cTool>
|
||||
<incDir>
|
||||
<pElem>./</pElem>
|
||||
<pElem>./lib</pElem>
|
||||
</incDir>
|
||||
<commandLine>-I/usr/xenomai/include/mercury -I/usr/xenomai/include -D_GNU_SOURCE -D_REENTRANT -fasynchronous-unwind-tables -D__MERCURY__ -I/usr/xenomai/include/alchemy</commandLine>
|
||||
</cTool>
|
||||
<ccTool>
|
||||
<incDir>
|
||||
<pElem>./</pElem>
|
||||
<pElem>./lib</pElem>
|
||||
</incDir>
|
||||
<commandLine>-D_GNU_SOURCE -D_REENTRANT -fasynchronous-unwind-tables</commandLine>
|
||||
<preprocessorList>
|
||||
<Elem>_WITH_TRACE_</Elem>
|
||||
<Elem>__FOR_PC__</Elem>
|
||||
<Elem>__WITH_PTHREAD__</Elem>
|
||||
</preprocessorList>
|
||||
</ccTool>
|
||||
<linkerTool>
|
||||
<linkerLibItems>
|
||||
<linkerOptionItem>`pkg-config --libs opencv`</linkerOptionItem>
|
||||
</linkerLibItems>
|
||||
<commandLine>-lpthread -lrt</commandLine>
|
||||
</linkerTool>
|
||||
</compileType>
|
||||
<item path="./gdbsudo.sh" ex="false" tool="3" flavor2="0">
|
||||
</item>
|
||||
<item path="./lib/camera.cpp" ex="false" tool="3" flavor2="0">
|
||||
</item>
|
||||
<item path="./lib/camera.h" ex="false" tool="3" flavor2="0">
|
||||
</item>
|
||||
<item path="./lib/definitions.h" ex="false" tool="3" flavor2="0">
|
||||
</item>
|
||||
<item path="./lib/image.cpp" ex="true" tool="1" flavor2="9">
|
||||
</item>
|
||||
<item path="./lib/image.h" ex="false" tool="3" flavor2="0">
|
||||
</item>
|
||||
<item path="./lib/img.cpp" ex="false" tool="3" flavor2="0">
|
||||
</item>
|
||||
<item path="./lib/img.h" ex="false" tool="3" flavor2="0">
|
||||
</item>
|
||||
<item path="./lib/message.cpp" ex="false" tool="1" flavor2="9">
|
||||
</item>
|
||||
<item path="./lib/message.h" ex="false" tool="3" flavor2="0">
|
||||
</item>
|
||||
<item path="./lib/messages.cpp" ex="false" tool="1" flavor2="9">
|
||||
</item>
|
||||
<item path="./lib/messages.h" ex="false" tool="3" flavor2="0">
|
||||
</item>
|
||||
<item path="./lib/monitor.cpp" ex="false" tool="1" flavor2="9">
|
||||
</item>
|
||||
<item path="./lib/monitor.h" ex="false" tool="3" flavor2="0">
|
||||
</item>
|
||||
<item path="./lib/robot.cpp" ex="false" tool="1" flavor2="9">
|
||||
</item>
|
||||
<item path="./lib/robot.h" ex="false" tool="3" flavor2="0">
|
||||
</item>
|
||||
<item path="./lib/server.cpp" ex="false" tool="1" flavor2="9">
|
||||
</item>
|
||||
<item path="./lib/server.h" ex="false" tool="3" flavor2="0">
|
||||
</item>
|
||||
<item path="./main.cpp" ex="false" tool="1" flavor2="9">
|
||||
</item>
|
||||
<item path="./tasks.cpp" ex="true" tool="1" flavor2="9">
|
||||
</item>
|
||||
<item path="/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/commonitor.cpp"
|
||||
ex="false"
|
||||
tool="1"
|
||||
flavor2="0">
|
||||
</item>
|
||||
<item path="/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/commonitor.h"
|
||||
ex="false"
|
||||
tool="3"
|
||||
flavor2="0">
|
||||
</item>
|
||||
<item path="/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/comrobot.cpp"
|
||||
ex="false"
|
||||
tool="1"
|
||||
flavor2="0">
|
||||
</item>
|
||||
<item path="/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/comrobot.h"
|
||||
ex="false"
|
||||
tool="3"
|
||||
flavor2="0">
|
||||
</item>
|
||||
<item path="tasks_pthread.cpp" ex="false" tool="1" flavor2="9">
|
||||
</item>
|
||||
<item path="tasks_pthread.h" ex="false" tool="3" flavor2="0">
|
||||
</item>
|
||||
</conf>
|
||||
</confs>
|
||||
</configurationDescriptor>
|
||||
|
|
|
@ -6,3 +6,4 @@
|
|||
# Debug configuration
|
||||
# Release configuration
|
||||
# Debug__RPI_ configuration
|
||||
# Debug__Pthread_ configuration
|
||||
|
|
|
@ -105,5 +105,42 @@
|
|||
</environment>
|
||||
</runprofile>
|
||||
</conf>
|
||||
<conf name="Debug__Pthread_" type="1">
|
||||
<toolsSet>
|
||||
<developmentServer>localhost</developmentServer>
|
||||
<platform>2</platform>
|
||||
</toolsSet>
|
||||
<dbx_gdbdebugger version="1">
|
||||
<gdb_pathmaps>
|
||||
</gdb_pathmaps>
|
||||
<gdb_interceptlist>
|
||||
<gdbinterceptoptions gdb_all="false" gdb_unhandled="true" gdb_unexpected="true"/>
|
||||
</gdb_interceptlist>
|
||||
<gdb_options>
|
||||
<DebugOptions>
|
||||
</DebugOptions>
|
||||
</gdb_options>
|
||||
<gdb_buildfirst gdb_buildfirst_overriden="false" gdb_buildfirst_old="false"/>
|
||||
</dbx_gdbdebugger>
|
||||
<nativedebugger version="1">
|
||||
<engine>gdb</engine>
|
||||
</nativedebugger>
|
||||
<runprofile version="9">
|
||||
<runcommandpicklist>
|
||||
<runcommandpicklistitem>sudo "${OUTPUT_PATH}"</runcommandpicklistitem>
|
||||
<runcommandpicklistitem>sudo -E "${OUTPUT_PATH}"</runcommandpicklistitem>
|
||||
<runcommandpicklistitem>pkexec "${OUTPUT_PATH}"</runcommandpicklistitem>
|
||||
<runcommandpicklistitem>"${OUTPUT_PATH}"</runcommandpicklistitem>
|
||||
</runcommandpicklist>
|
||||
<runcommand>"${OUTPUT_PATH}"</runcommand>
|
||||
<rundir></rundir>
|
||||
<buildfirst>true</buildfirst>
|
||||
<console-type>1</console-type>
|
||||
<terminal-type>0</terminal-type>
|
||||
<remove-instrumentation>0</remove-instrumentation>
|
||||
<environment>
|
||||
</environment>
|
||||
</runprofile>
|
||||
</conf>
|
||||
</confs>
|
||||
</configurationDescriptor>
|
||||
|
|
|
@ -2,21 +2,27 @@
|
|||
<project-private xmlns="http://www.netbeans.org/ns/project-private/1">
|
||||
<data xmlns="http://www.netbeans.org/ns/make-project-private/1">
|
||||
<activeConfTypeElem>1</activeConfTypeElem>
|
||||
<activeConfIndexElem>0</activeConfIndexElem>
|
||||
<activeConfIndexElem>3</activeConfIndexElem>
|
||||
</data>
|
||||
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="0"/>
|
||||
<open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2">
|
||||
<group>
|
||||
<file>file:/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/monitor.h</file>
|
||||
<file>file:/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/comrobot.cpp</file>
|
||||
<file>file:/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/comrobot.h</file>
|
||||
<file>file:/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/commonitor.h</file>
|
||||
<file>file:/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/img.h</file>
|
||||
<file>file:/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/img.cpp</file>
|
||||
<file>file:/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/messages.h</file>
|
||||
<file>file:/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/robot.h</file>
|
||||
<file>file:/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/commonitor.cpp</file>
|
||||
<file>file:/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/camera.cpp</file>
|
||||
<file>file:/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/tasks_pthread.cpp</file>
|
||||
<file>file:/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/image.h</file>
|
||||
<file>file:/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/server.h</file>
|
||||
<file>file:/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/camera.h</file>
|
||||
<file>file:/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/tasks.cpp</file>
|
||||
<file>file:/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/tasks_pthread.h</file>
|
||||
<file>file:/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/message.h</file>
|
||||
<file>file:/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/main.cpp</file>
|
||||
<file>file:/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib/messages.cpp</file>
|
||||
|
|
|
@ -9,7 +9,9 @@
|
|||
<header-extensions>h</header-extensions>
|
||||
<sourceEncoding>UTF-8</sourceEncoding>
|
||||
<make-dep-projects/>
|
||||
<sourceRootList/>
|
||||
<sourceRootList>
|
||||
<sourceRootElem>/home/dimercur/Documents/Travail/git/dumber/software/raspberry/superviseur-robot/lib</sourceRootElem>
|
||||
</sourceRootList>
|
||||
<confList>
|
||||
<confElem>
|
||||
<name>Debug</name>
|
||||
|
@ -23,6 +25,10 @@
|
|||
<name>Debug__RPI_</name>
|
||||
<type>1</type>
|
||||
</confElem>
|
||||
<confElem>
|
||||
<name>Debug__Pthread_</name>
|
||||
<type>1</type>
|
||||
</confElem>
|
||||
</confList>
|
||||
<formatting>
|
||||
<project-formatting-style>false</project-formatting-style>
|
||||
|
|
|
@ -23,8 +23,8 @@
|
|||
* \brief Miscellaneous functions used for destijl project.
|
||||
*/
|
||||
|
||||
#ifndef FUNCTIONS_H
|
||||
#define FUNCTIONS_H
|
||||
#ifndef __TASKS_H__
|
||||
#define __TASKS_H__
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
|
263
software/raspberry/superviseur-robot/tasks_pthread.cpp
Normal file
263
software/raspberry/superviseur-robot/tasks_pthread.cpp
Normal file
|
@ -0,0 +1,263 @@
|
|||
/*
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file functions.h
|
||||
* \author PE.Hladik
|
||||
* \version 1.0
|
||||
* \date 06/06/2017
|
||||
* \brief Miscellaneous functions used for destijl project.
|
||||
*/
|
||||
|
||||
#include "tasks_pthread.h"
|
||||
|
||||
#ifdef __WITH_PTHREAD__
|
||||
char mode_start;
|
||||
|
||||
void write_in_queue(RT_QUEUE *, MessageToMon);
|
||||
|
||||
void f_server(void *arg) {
|
||||
int err;
|
||||
/* INIT */
|
||||
RT_TASK_INFO info;
|
||||
rt_task_inquire(NULL, &info);
|
||||
printf("Init %s\n", info.name);
|
||||
rt_sem_p(&sem_barrier, TM_INFINITE);
|
||||
|
||||
err=openServer(DEFAULT_SERVER_PORT);
|
||||
|
||||
if (err < 0) {
|
||||
printf("Failed to start server: %s\n", strerror(-err));
|
||||
exit(EXIT_FAILURE);
|
||||
} else {
|
||||
#ifdef _WITH_TRACE_
|
||||
printf("%s: server started\n", info.name);
|
||||
#endif
|
||||
//Waiting for a client to connect
|
||||
err=acceptClient();
|
||||
|
||||
if (err<0) {
|
||||
printf("Client accept failed: %s\n", strerror(-err));
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
#ifdef _WITH_TRACE_
|
||||
printf ("client connected: %d\n", err);
|
||||
printf ("Rock'n'roll baby !\n");
|
||||
#endif
|
||||
rt_sem_broadcast(&sem_serverOk);
|
||||
}
|
||||
}
|
||||
|
||||
void f_sendToMon(void * arg) {
|
||||
int err;
|
||||
MessageToMon msg;
|
||||
|
||||
/* INIT */
|
||||
RT_TASK_INFO info;
|
||||
rt_task_inquire(NULL, &info);
|
||||
printf("Init %s\n", info.name);
|
||||
rt_sem_p(&sem_barrier, TM_INFINITE);
|
||||
|
||||
#ifdef _WITH_TRACE_
|
||||
printf("%s : waiting for sem_serverOk\n", info.name);
|
||||
#endif
|
||||
rt_sem_p(&sem_serverOk, TM_INFINITE);
|
||||
while (1) {
|
||||
|
||||
#ifdef _WITH_TRACE_
|
||||
printf("%s : waiting for a message in queue\n", info.name);
|
||||
#endif
|
||||
if (rt_queue_read(&q_messageToMon, &msg, sizeof (MessageToRobot), TM_INFINITE) >= 0) {
|
||||
#ifdef _WITH_TRACE_
|
||||
printf("%s : message {%s,%s} in queue\n", info.name, msg.header, (char*)msg.data);
|
||||
#endif
|
||||
|
||||
send_message_to_monitor(msg.header, msg.data);
|
||||
free_msgToMon_data(&msg);
|
||||
rt_queue_free(&q_messageToMon, &msg);
|
||||
} else {
|
||||
printf("Error msg queue write: %s\n", strerror(-err));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void f_receiveFromMon(void *arg) {
|
||||
MessageFromMon msg;
|
||||
int err;
|
||||
|
||||
/* INIT */
|
||||
RT_TASK_INFO info;
|
||||
rt_task_inquire(NULL, &info);
|
||||
printf("Init %s\n", info.name);
|
||||
rt_sem_p(&sem_barrier, TM_INFINITE);
|
||||
|
||||
#ifdef _WITH_TRACE_
|
||||
printf("%s : waiting for sem_serverOk\n", info.name);
|
||||
#endif
|
||||
rt_sem_p(&sem_serverOk, TM_INFINITE);
|
||||
do {
|
||||
#ifdef _WITH_TRACE_
|
||||
printf("%s : waiting for a message from monitor\n", info.name);
|
||||
#endif
|
||||
err = receive_message_from_monitor(msg.header, msg.data);
|
||||
#ifdef _WITH_TRACE_
|
||||
printf("%s: msg {header:%s,data=%s} received from UI\n", info.name, msg.header, msg.data);
|
||||
#endif
|
||||
if (strcmp(msg.header, HEADER_MTS_COM_DMB) == 0) {
|
||||
if (msg.data[0] == OPEN_COM_DMB) { // Open communication supervisor-robot
|
||||
#ifdef _WITH_TRACE_
|
||||
printf("%s: message open Xbee communication\n", info.name);
|
||||
#endif
|
||||
rt_sem_v(&sem_openComRobot);
|
||||
}
|
||||
} else if (strcmp(msg.header, HEADER_MTS_DMB_ORDER) == 0) {
|
||||
if (msg.data[0] == DMB_START_WITHOUT_WD) { // Start robot
|
||||
#ifdef _WITH_TRACE_
|
||||
printf("%s: message start robot\n", info.name);
|
||||
#endif
|
||||
rt_sem_v(&sem_startRobot);
|
||||
|
||||
} else if ((msg.data[0] == DMB_GO_BACK)
|
||||
|| (msg.data[0] == DMB_GO_FORWARD)
|
||||
|| (msg.data[0] == DMB_GO_LEFT)
|
||||
|| (msg.data[0] == DMB_GO_RIGHT)
|
||||
|| (msg.data[0] == DMB_STOP_MOVE)) {
|
||||
|
||||
rt_mutex_acquire(&mutex_move, TM_INFINITE);
|
||||
robotMove = msg.data[0];
|
||||
rt_mutex_release(&mutex_move);
|
||||
#ifdef _WITH_TRACE_
|
||||
printf("%s: message update movement with %c\n", info.name, robotMove);
|
||||
#endif
|
||||
|
||||
}
|
||||
}
|
||||
} while (err > 0);
|
||||
|
||||
}
|
||||
|
||||
void f_openComRobot(void * arg) {
|
||||
int err;
|
||||
|
||||
/* INIT */
|
||||
RT_TASK_INFO info;
|
||||
rt_task_inquire(NULL, &info);
|
||||
printf("Init %s\n", info.name);
|
||||
rt_sem_p(&sem_barrier, TM_INFINITE);
|
||||
|
||||
while (1) {
|
||||
#ifdef _WITH_TRACE_
|
||||
printf("%s : Wait sem_openComRobot\n", info.name);
|
||||
#endif
|
||||
rt_sem_p(&sem_openComRobot, TM_INFINITE);
|
||||
#ifdef _WITH_TRACE_
|
||||
printf("%s : sem_openComRobot arrived => open communication robot\n", info.name);
|
||||
#endif
|
||||
err = open_communication_robot();
|
||||
if (err == 0) {
|
||||
#ifdef _WITH_TRACE_
|
||||
printf("%s : the communication is opened\n", info.name);
|
||||
#endif
|
||||
MessageToMon msg;
|
||||
set_msgToMon_header(&msg, (char*)HEADER_STM_ACK);
|
||||
write_in_queue(&q_messageToMon, msg);
|
||||
} else {
|
||||
MessageToMon msg;
|
||||
set_msgToMon_header(&msg, (char*)HEADER_STM_NO_ACK);
|
||||
write_in_queue(&q_messageToMon, msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void f_startRobot(void * arg) {
|
||||
int err;
|
||||
|
||||
/* INIT */
|
||||
RT_TASK_INFO info;
|
||||
rt_task_inquire(NULL, &info);
|
||||
printf("Init %s\n", info.name);
|
||||
rt_sem_p(&sem_barrier, TM_INFINITE);
|
||||
|
||||
while (1) {
|
||||
#ifdef _WITH_TRACE_
|
||||
printf("%s : Wait sem_startRobot\n", info.name);
|
||||
#endif
|
||||
rt_sem_p(&sem_startRobot, TM_INFINITE);
|
||||
#ifdef _WITH_TRACE_
|
||||
printf("%s : sem_startRobot arrived => Start robot\n", info.name);
|
||||
#endif
|
||||
err = send_command_to_robot(DMB_START_WITHOUT_WD);
|
||||
if (err == 0) {
|
||||
#ifdef _WITH_TRACE_
|
||||
printf("%s : the robot is started\n", info.name);
|
||||
#endif
|
||||
rt_mutex_acquire(&mutex_robotStarted, TM_INFINITE);
|
||||
robotStarted = 1;
|
||||
rt_mutex_release(&mutex_robotStarted);
|
||||
MessageToMon msg;
|
||||
set_msgToMon_header(&msg, (char*)HEADER_STM_ACK);
|
||||
write_in_queue(&q_messageToMon, msg);
|
||||
} else {
|
||||
MessageToMon msg;
|
||||
set_msgToMon_header(&msg, (char*)HEADER_STM_NO_ACK);
|
||||
write_in_queue(&q_messageToMon, msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void f_move(void *arg) {
|
||||
/* INIT */
|
||||
RT_TASK_INFO info;
|
||||
rt_task_inquire(NULL, &info);
|
||||
printf("Init %s\n", info.name);
|
||||
rt_sem_p(&sem_barrier, TM_INFINITE);
|
||||
|
||||
/* PERIODIC START */
|
||||
#ifdef _WITH_PERIODIC_TRACE_
|
||||
printf("%s: start period\n", info.name);
|
||||
#endif
|
||||
rt_task_set_periodic(NULL, TM_NOW, 100000000);
|
||||
while (1) {
|
||||
#ifdef _WITH_PERIODIC_TRACE_
|
||||
printf("%s: Wait period \n", info.name);
|
||||
#endif
|
||||
rt_task_wait_period(NULL);
|
||||
#ifdef _WITH_PERIODIC_TRACE_
|
||||
printf("%s: Periodic activation\n", info.name);
|
||||
printf("%s: move equals %c\n", info.name, robotMove);
|
||||
#endif
|
||||
rt_mutex_acquire(&mutex_robotStarted, TM_INFINITE);
|
||||
if (robotStarted) {
|
||||
rt_mutex_acquire(&mutex_move, TM_INFINITE);
|
||||
send_command_to_robot(robotMove);
|
||||
rt_mutex_release(&mutex_move);
|
||||
#ifdef _WITH_TRACE_
|
||||
printf("%s: the movement %c was sent\n", info.name, robotMove);
|
||||
#endif
|
||||
}
|
||||
rt_mutex_release(&mutex_robotStarted);
|
||||
}
|
||||
}
|
||||
|
||||
void write_in_queue(RT_QUEUE *queue, MessageToMon msg) {
|
||||
void *buff;
|
||||
buff = rt_queue_alloc(&q_messageToMon, sizeof (MessageToMon));
|
||||
memcpy(buff, &msg, sizeof (MessageToMon));
|
||||
rt_queue_send(&q_messageToMon, buff, sizeof (MessageToMon), Q_NORMAL);
|
||||
}
|
||||
#endif //__WITH_PTHREAD__
|
104
software/raspberry/superviseur-robot/tasks_pthread.h
Normal file
104
software/raspberry/superviseur-robot/tasks_pthread.h
Normal file
|
@ -0,0 +1,104 @@
|
|||
/*
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file functions.h
|
||||
* \author PE.Hladik
|
||||
* \version 1.0
|
||||
* \date 06/06/2017
|
||||
* \brief Miscellaneous functions used for destijl project.
|
||||
*/
|
||||
|
||||
#ifndef __TASKS_H__
|
||||
#define __TASKS_H__
|
||||
|
||||
#ifdef __WITH_PTHREAD__
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <sys/mman.h>
|
||||
|
||||
#include "monitor.h"
|
||||
#include "robot.h"
|
||||
#include "image.h"
|
||||
#include "message.h"
|
||||
#include "server.h"
|
||||
|
||||
extern RT_TASK th_server;
|
||||
extern RT_TASK th_sendToMon;
|
||||
extern RT_TASK th_receiveFromMon;
|
||||
extern RT_TASK th_openComRobot;
|
||||
extern RT_TASK th_startRobot;
|
||||
extern RT_TASK th_move;
|
||||
|
||||
extern RT_MUTEX mutex_robotStarted;
|
||||
extern RT_MUTEX mutex_move;
|
||||
|
||||
extern RT_SEM sem_barrier;
|
||||
extern RT_SEM sem_openComRobot;
|
||||
extern RT_SEM sem_serverOk;
|
||||
extern RT_SEM sem_startRobot;
|
||||
|
||||
extern RT_QUEUE q_messageToMon;
|
||||
|
||||
extern int etatCommMoniteur;
|
||||
extern int robotStarted;
|
||||
extern char robotMove;
|
||||
|
||||
extern int MSG_QUEUE_SIZE;
|
||||
|
||||
extern int PRIORITY_TSERVER;
|
||||
extern int PRIORITY_TOPENCOMROBOT;
|
||||
extern int PRIORITY_TMOVE;
|
||||
extern int PRIORITY_TSENDTOMON;
|
||||
extern int PRIORITY_TRECEIVEFROMMON;
|
||||
extern int PRIORITY_TSTARTROBOT;
|
||||
|
||||
/**
|
||||
* \brief Thread handling server communication.
|
||||
*/
|
||||
void f_server(void *arg);
|
||||
|
||||
/**
|
||||
* \brief Thread handling communication to monitor.
|
||||
*/
|
||||
void f_sendToMon(void *arg);
|
||||
|
||||
/**
|
||||
* \brief Thread handling communication from monitor.
|
||||
*/
|
||||
void f_receiveFromMon(void *arg);
|
||||
|
||||
/**
|
||||
* \brief Thread handling opening of robot communication.
|
||||
*/
|
||||
void f_openComRobot(void * arg);
|
||||
|
||||
/**
|
||||
* \brief Thread handling robot mouvements.
|
||||
*/
|
||||
void f_move(void *arg);
|
||||
|
||||
/**
|
||||
* \brief Thread handling robot activation.
|
||||
*/
|
||||
void f_startRobot(void *arg);
|
||||
|
||||
#endif // __WITH_PTHREAD__
|
||||
#endif /* __TASKS_H__ */
|
||||
|
Loading…
Reference in a new issue