C++ Rapsberry pour servomoteur et turbine.

Portrait de widston

*

Portrait de widston

Euh oui ? La case présentation c'est à dire ?

Portrait de widston

Merci! Oui elle est en rapport mais il n'y a pas d'apprentissage approfondi du langage dans les cours. Je sais un peu près lire un code et de savoir de quoi il en coule mais je ne pourrais pas recoder tout seul.

Portrait de widston

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <fcntl.h>
#include <string>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <sstream>
#include <iostream>
#include "Aeroglisseur.h"
using namespace std;
using namespace Aeroglisseur;
#define BS 8
#define LF 0x0a
#define RC 0x0d
void TraiteCmd (CAeroGlisseur &aeroglisseur, int socketclient, char *commande);
int main(int argc, char* argv[])
{
struct sockaddr_in serveur;
struct sockaddr_in client;
int sock,socketclient;
int port = 16000;
socklen_t recsize = sizeof(serveur);
char requete [100];
char Cmd [200];
int iCmd = 0;
CAeroGlisseur aeroglisseur (0x40, 50, 0, 1);
sock = socket(AF_INET, SOCK_STREAM, 0);
cout <<"La socket " << sock << " est maintenant ouverte en mode TCP/IP " << endl;
serveur.sin_addr.s_addr = htonl(INADDR_ANY);
serveur.sin_family = AF_INET;
serveur.sin_port = htons(port);
bind(sock, (struct sockaddr *)&serveur, sizeof(serveur));
listen(sock, 5);
cout <<"Listage du port " << port << endl;
cout<<"Patientez pendant que le client se connecte " << endl;
socklen_t AdrLen = sizeof (struct sockaddr_in);
while (1) {
socketclient = accept (sock, (struct sockaddr *)&client, &AdrLen );
cout << "connexion client " << endl;
while (1) {
int CodeRet =recv(socketclient, (char *)requete, sizeof(requete),0);
if (CodeRet <= 0) // Pour multiple clients ou multiple connection de clients
{
close(socketclient);
cout << "deconnexion client " << endl;
break;
}
for (int i=0; i < CodeRet; i++) {
char carac = requete[i];
if (isalpha(carac))
carac = tolower(carac);
switch (carac)
{
case BS:
if (iCmd) iCmd--;
break;
case RC:
case LF:
if (iCmd == 0) break;
Cmd [iCmd++] = '\0';
TraiteCmd (aeroglisseur, socketclient,Cmd);
iCmd = 0;
break;
default:
if (iCmd < 200)
Cmd [iCmd++] = carac;
else
{
cout<<"Commande trop longue \n";
iCmd = 0;
} // else
} // switch
}// for
} // while
}
cin.ignore(1);
return 0;
}
void TraiteCmd (CAeroGlisseur &aeroglisseur, int socketclient, char *commande)
{
char reponse[100];
if ((strncmp(commande, "accelere",8) == 0)
|| (strncmp(commande, "+", 1) == 0)){
cout << "Serveur.cpp:commande acceleration " << endl;
aeroglisseur.accelere();
sprintf(reponse, "OK\n\r"); cout << reponse;
send(socketclient, (char*)reponse, strlen(reponse), 0);
return;
}
if ((strncmp(commande, "decelere",8) == 0)
|| (strncmp(commande, "-", 1) == 0)){
cout << "Serveur.cpp:commande deceleration " << endl;
aeroglisseur.decelere();
sprintf(reponse, "OK\n\r"); cout << reponse;
send(socketclient, (char*)reponse, strlen(reponse), 0);
return;
}
if ((strncmp(commande, "droite", 6) == 0)
|| (strncmp(commande, "r", 1) == 0)){
cout << "Serveur.cpp:commande droite " << endl;
aeroglisseur.tourne(DROITE);
sprintf(reponse, "OK\n\r"); cout << reponse;
send(socketclient, (char*)reponse, strlen(reponse), 0);
return;
}
if ((strncmp(commande, "gauche", 6) == 0)
|| (strncmp(commande, "l", 1) == 0)){
cout << "Serveur.cpp:commande gauche " << endl;
// traitement commande
aeroglisseur.tourne(GAUCHE);
sprintf(reponse, "OK\n\r"); cout << reponse;
send(socketclient, (char*)reponse, strlen(reponse), 0);
return;
}
if (strncmp(commande, "angle", 5) == 0)
{
cout << "Serveur.cpp:commande angle " << endl;
int angle = aeroglisseur.donneAngle();
sprintf(reponse, "%03d\n\r", angle); cout << reponse;
send(socketclient, (char*)reponse, strlen(reponse), 0);
return;
}
if (strncmp(commande, "vitesse", 7) == 0)

{
cout << "Serveur.cpp:commande vitesse " << endl;
int vitesse = aeroglisseur.donneVitesse();
sprintf(reponse, "%03d\n\r", vitesse); cout << reponse;
send(socketclient, (char*)reponse, strlen(reponse), 0);
return;
}
if (strncmp(commande, "exit", 5) == 0)
{
for (int i=0; i < 10; i++) aeroglisseur.decelere();
cout << "Serveur.cpp:commande exit arret raspberry " << endl;
system ("halt");
return;
}
}

(c'est le nouveau nom que porte l'Alsace, ça fait plus classe :p )

Portrait de widston

Pardon ? Qu'est-ce que vous insinuez alors ? Je vous ai donné l'intitulé du BTS en question, vous pouvez vérifier par vous même s'il assure des cours de C++ au lieu de sous entendre que je suis un menteur. Je viens demander de l'aide sur un forum que je trouve professionnel et sérieux et c'est de cette manière qu'on me répond ?

Portrait de widston

Pardon ? Qu'est-ce que vous insinuez alors ? Je vous ai donné l'intitulé du BTS en question, vous pouvez vérifier par vous même s'il assure des cours de C++ au lieu de sous entendre que je suis un menteur. Je viens demander de l'aide sur un forum que je trouve professionnel et sérieux et c'est de cette manière qu'on me répond ?

Portrait de widston

Mais je comprends pas ce que vous insinuez, je serais en train de mentir ? Dans quel but si je vous demande de l'aide ? Soit je suis en train de mentir et donc censé avoir eu des cours dessus dans quel cas je vous demande de l'aide, soit je n'ai jamais eu de cours de c++ et je demande de l'aide ? C'est un projet qui a été donné 1 mois avant la date butoir. On ne sait pas d'avance ce qu'il y a dans le projet. De plus on me demande pas de connaître 100% du code, mais plus j'en sais mieux c'est. J'ai dit que j'avais plus ou moins compris sauf que si on fait du cas par cas j'ai un peu de mal, comme par exemple l'utilité du serveur TCP etc... Vraiment je comprends pas pourquoi vous réagissez comme ça

Portrait de widston

Non, je n'ai aucun matériel, pour l'instant c'est plus de la théorie plutôt que de la pratique. Je dois m'approprier le sujet et le comprendre en détail. C'est seulement des docs et mes recherches personnels.

Portrait de widston

J'ai l'intégral du sujet en pdf et je peux vous assurer qu'il n'y a pas la fonction de chaque librérique, je suis censé savoir un peu près ce que fait le serveur TCP

Portrait de widston

Déjà j'suis sûr que t'as toujours pas compris ce qu'on me demande dans l'exercice pour me sortir un discours pareil. De 1, je ne suis pas à l'école, je le passe indépendamment. Deuxièmement, le dossier comporte 30 pages, la session 8 matières divers et variés, et je pose une question simplement sur une question et tu me traites d'incompétent ? A quel moment je te demande de le faire à ma place ? Et oui merci je ne suis pas complètement stupide je sais ce que c'est qu'une bibliothèque, ca va deux minutes de prendre les gens pour des abrutis je demande simplement de l'aide, si tu veux ne pas m'aider y'a aucun utilité à répondre sous le topic ? Et pour finir la date d'échéance pour rendre le dossier c'était en début de semaine, tout est rendu, c'est pour moi et pour mieux comprendre que je demande de l'aide. J'trouve ça complètement aberrant de me parler de cette manière

Portrait de aurelien

Bonjour,

au lieu de t'énerver pose tes questions clairement sur les parties que tu ne comprends pas. Car on a l'impression que tu nous demandes de te traduire tout le code et c'est ce que brossden essaye de te dire qu'il ne va pas le faire pour une question d'éthique. voilà :)

Portrait de widston

Très bien :) J'vais faire preuve de noblesse et ignorer son comportement et sa forfanterie.
Alors j'aurai besoin d'aide plutôt pour les Classe CServo, CPWM et CAeroglisseur. J'ai du mal à comprendre la fonctionnalité des classes. Si j'me trompe pas le CAeroglisseur sert de "tableau de bord" pour récolter les différentes infos et envoyé sur le serveur TCP ? (que je ne dois pas faire, je le répète)

Portrait de Walter

Bonjour,

Ton code est plutôt assez simple, j'ai du mal a voir ce que tu comprend pas?
Il faudrait que tu pose des questions plus détailler avec le raisonnement que tu as fait par rapport à celui-ci

Les Classes CServo, CPWM ne semblent pas utilisées dans ton code.

La classe CAeroglisseur est plutôt simple puisqu'une dirige ton aéroglisseur(aeroglisseur.tourne, aeroglisseur.decelere), pourquoi pense tu qu'il s'agit d'un tableau de bords?
Sais tu sur quoi le code est censé s'exécuter et à quoi il sert ou doit tu le déterminer?

Ensuite non, la socket tcp est en écoute, donc c'est un serveur TCP, qui attend des commandes et les exécutent, ex la commande "decelere" qui est alors appliqué à ton objet aeroglisseur.
Est répond au client le résultat de la commande (OK pour tourne et la vitesse actuel pour "vitesse" ).

Pour les même raison que 'Brossden', j'ai peur de déjà t'en avoir trop dis.

Portrait de Walter

Je ne sais pas ce que renferme les classes à proprement parlé, je suppose juste de ce que fais le code de la fonction
void TraiteCmd (CAeroGlisseur &aeroglisseur, int socketclient, char *commande)
qui utilise les fonction de l'objet aeroglisseur(accelere, decelere, tourne, donneAngle, ...).

Sans le code de cette classe, on peut quand même supposer que c'est une classe assez banale pour la gestion du déplacement d'un Aeroglisseur?
Ceci étant branché sur un serveur TCP, qui accepte des commandes textes équivalentes aux fonctions de la classe Aeroglisseur.

cout << "Serveur.cpp:commande acceleration " << endl;
écrit le texte (Serveur.cpp:commande acceleration) sur le fux de la sortie standard avec un retour à la ligne, permettant de "flusher" la ligne.

la syntaxe lourde donnerait :
std::cout << "Hello world!" << std::endl;

Le premier message de Widston contient uniquement le caractère *, donc difficile de vraiment savoir ce qu'est censé faire ce code.