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;
}
class Com {
public:
Com(int port); // paramètre port
// ...
private:
// ...
WiFiServer wifiServer; // sans (port)
// dans le .cpp
Com::Com(int port) :
wifiServer(port)
{
}
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()'
#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;
}
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
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.
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.