Une classe qui envoie et recois des informations par usb ou wifi

Bonjour, pour un (voire plusieurs par la suite) projet, je veux faire une classe simple qui permet de recevoir et envoyer des info par USB ou WIFI selon le canal disponible

Au final, une fonction permet de contrôler / traduire/renvoyer sous forme d'un tableau de 3 string les info en entrées, une autre pour la sortie.

Mon problème viens de l’intégration de la classe WiFiServer dans ma classe maison. La nécessitée de déclarer dans le .h

WiFiServer wifiServer(port);

pause problème du fait de l'envoie du paramètre port

le .h :

#ifndef COM_H
#define COM_H
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
//#include <Arduino.h>


using namespace std;

class Com {
  public:
    Com();
    boolean init(char* ssid,char* password, IPAddress IP, int port, int bood);
    array<string,3> traitement();
  private:
    char* canal="";
    char* ssid = "***";           // Identifiant WiFi
    char* password = "***";  // Mot de passe WiFi
    IPAddress IP;
    WiFiClient client;
    int   port = 3333;
    int   bood = 115200;
    WiFiServer wifiServer(port);
};
#endif

et dans le .cpp :

boolean Com::init(char* ssid, char* password, IPAddress IP, int port, int bood) {
  this->ssid = ssid;
  this->password = password;
  this->IP = IP;
  this->port = port;
  this->bood = bood;

  Serial.begin(bood); // initialisation de la connexion série
  delay(100);
  WiFi.begin(ssid, password);
  Serial.println("");
  // on attend d'etre connecte au WiFi avant de continuer
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  // on affiche l'adresse IP attribuee pour le serveur DSN
  Serial.println("");
  Serial.print("IP address: ");
  IP = WiFi.localIP();
  Serial.println(IP);
  wifiServer.begin();
  return true;
}

Avez vous une idée ?

Il faut un constructeur :

class Com {
  public:
    Com(int port);              // paramètre port
    // ...
  private:
    // ...
    WiFiServer wifiServer;      // sans (port)

// dans le .cpp

Com::Com(int port) :
    wifiServer(port)
{
}

Merci mais ca fonctionne pas :wink:

F:\Mes documents\Ma Programation\arduino\com\Com.cpp: In constructor 'Com::Com(int)':
Com.cpp:2:18: error: no matching function for call to 'WiFiServer::WiFiServer()'
 Com::Com(int port){ 
                  ^
F:\Mes documents\Ma Programation\arduino\com\Com.cpp:2:18: note: candidates are:
In file included from C:\Users\johann\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.3\libraries\ESP8266WiFi\src/ESP8266WiFi.h:40:0,
                 from C:\Users\johann\AppData\Local\Temp\arduino_build_753012\sketch\Com.h:3,
                 from F:\Mes documents\Ma Programation\arduino\com\Com.cpp:1:
C:\Users\johann\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.3\libraries\ESP8266WiFi\src/WiFiServer.h:50:3: note: WiFiServer::WiFiServer(uint16_t)
   WiFiServer(uint16_t port);
   ^
C:\Users\johann\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.3\libraries\ESP8266WiFi\src/WiFiServer.h:50:3: note:   candidate expects 1 argument, 0 provided
C:\Users\johann\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.3\libraries\ESP8266WiFi\src/WiFiServer.h:49:3: note: WiFiServer::WiFiServer(const IPAddress&, uint16_t)
   WiFiServer(const IPAddress& addr, uint16_t port);
   ^
C:\Users\johann\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.3\libraries\ESP8266WiFi\src/WiFiServer.h:49:3: note:   candidate expects 2 arguments, 0 provided
C:\Users\johann\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.3\libraries\ESP8266WiFi\src/WiFiServer.h:37:7: note: WiFiServer::WiFiServer(const WiFiServer&)
 class WiFiServer : public Server {
       ^
C:\Users\johann\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.3\libraries\ESP8266WiFi\src/WiFiServer.h:37:7: note:   candidate expects 1 argument, 0 provided
Com.cpp:4:18: error: no match for call to '(WiFiServer) (int&)'
   wifiServer(port);
                  ^
Utilisation de la bibliothèque ESP8266WiFi version 1.0 dans le dossier: C:\Users\johann\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.3\libraries\ESP8266WiFi 
Utilisation de la bibliothèque ESP8266WebServer version 1.0 dans le dossier: C:\Users\johann\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.3\libraries\ESP8266WebServer 
exit status 1
no matching function for call to 'WiFiServer::WiFiServer()'

Reposte le code

.h

#ifndef COM_H
#define COM_H
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
//#include <Arduino.h>


using namespace std;

class Com {
  public:
    Com(int port);
    boolean init(char* ssid,char* password, IPAddress IP, int bood);
    array<string,3> traitement();
  private:
    char* canal="";
    char* ssid = "freebox_MUGHSX_5g";           // Identifiant WiFi
    char* password = "supermantiptop";  // Mot de passe WiFi
    IPAddress IP;
    WiFiClient client;
    int   port = 3333;
    int   bood = 115200;
    WiFiServer wifiServer;
};
#endif

.cpp

#include "Com.h"
Com::Com(int port){ 
  this->port = port; 
  wifiServer(port);
}
array<string, 3> Com::traitement() { //fncComSerieE
  delay(100);

  string tbl[3];//type,element,variable
  string type;
  string element;
  string variable;
  char inChar;
  const char* inputString = "";         // a String to hold incoming data
  const char* chaine = "";
  int i = 0;
  int u = 0;
  int nb = 0;
  if (canal == "usb") {
    nb = Serial.available();
  } else {
    nb = client.available();
  }
  for (i == 0; i < nb; i++) { // les données sont envoyées par bite, ou unité donc 'etre' sera en 4 envois 'e', 't', 'r', 'e'
    if (canal == "usb") {
      inChar = (char)Serial.read();// je transforme le bit en caractaire
    } else {
      inChar = (char)client.read();// je transforme le bit en caractaire
    }
    inputString += inChar;
    if (inChar == '_') { //suivant
      u++;
      if (u == 1) { //suivant
        type = chaine;// type de commande, 'fnc' pour une fonction, 'var' pour le renvoie d'une valeur de variable
        chaine = "";
      }
      if (u == 2) { //suivant
        element = chaine;// element
        chaine = "";
      }
      if (u > 2) { //suivant
        variable = chaine;//variable
        chaine = "";
      }
    } else {
      chaine += inChar;
    }
  }
  return {type, element, variable};
}
boolean Com::init(char* ssid, char* password, IPAddress IP, int bood) {
  this->ssid = ssid;
  this->password = password;
  this->IP = IP;
  this->bood = bood;
  Serial.begin(bood); // initialisation de la connexion série
  delay(100);
  WiFi.begin(ssid, password);
  Serial.println("");
  // on attend d'etre connecte au WiFi avant de continuer
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  // on affiche l'adresse IP attribuee pour le serveur DSN
  Serial.println("");
  Serial.print("IP address: ");
  IP = WiFi.localIP();
  Serial.println(IP);
  wifiServer.begin();
  return true;
}

Il faudrait se documenter sur les constructeurs :

Com::Com(int port) :
    wifiServer(port)
{
  this->port = port; 
}

Merci, effectivement, je m'habitue sur c++ qui n'est pas ma prédilection, je viens de voire les classe depuis 2 semaines et j’adhère pas encore a la logique du c++ coté POO

Ça fonctionne mais j'avais pas encore vus ce type de syntaxe je vais regarder ça, merci pour la piste :wink:

PS, une piste plus précise sur ce type de constructeurs qui semblent prendre ' 2 niveaux ' ?

un nom spécifique?

Ok vus, Classe Fille / Mere, j'avais pas fait attention a cette syntaxe , merci

mackerjoga:
un nom spécifique?
Ok vus, Classe Fille / Mere, j'avais pas fait attention a cette syntaxe , merci

Non.
Classe fille/mère se rapporte à la notion d"héritage, qui n'est pas utilisée ici.

un nom spécifique?

Agrégation interne.

agregation

merci

Voici le pourquoi de cette construction.
Je veux écrire une classe Com qui a dans ses membres un objet (que je n'ai pas écrit moi-même) WiFIServer.
Cette classe WiFiServer ne propose qu'un seul constructeur, qui prend un argument

class WiFiServer {
public:
WiFiServer ( int port);
...
};

et voici ma classe Com

class Com {
...
int  identifiant;
WiFiServer mServer;
...
};

Quand un objet de la classe Com est construit, il construit tous ses membres, avant d'exécuter le code explicite de son constructeur.
identifiant est un int, qui n'a pas de constructeur. OK, rien à faire.
mServer est un objet de type WiFiServer. Il y a au moins un constructeur fourni, donc Il faut invoquer un constructeur (le constructeur par défaut ne convient pas). Il n'y en a qu'un seul, et il attend un argument de type int.
Là ça coince. A ce stade il n'y a aucun moyen de fournir cet int.
On pourrait essayer ça :

Com::Com () {
  mServer = WifiServer ( 80 );
  ...
}

Ca n'aidera pas car l'erreur se produit avant de réaliser le code ci-dessus.
Le Langage C++ offre la solution par l'agrégation : declarer explicitement comment construire les membres, avant le code du constructeur.

Com::Com () 
: mServer ( 80 )
{
  ...
}

merci, tu viens de décrire mes étapes de découverte de cette solution que j'avais contourné précédemment mais la solution manquait de classe ;-p

Pour la suite, j'avais prevus une classe qui gerre les fonction et communique avec plusieurs classe déclarées sur le meme ino, mais je vais simplifier, je reviendrais dessus plus tard probablement que la bonne méthode sera des pointeurs de fonctions

Merci a vous, depuis 20 ans sur d'autres languages, on m'avais rarement aidé si bien et si vite, j'ai pris l'habitude de me débrouiller mais j'avous que sur 10 resultat de recherche sur des cas specifique en c++, je ne trouve que rarement des information précises.

Merci