[RESOLU] Accès a des variables d'une classe

Bonjour a tous
mais cours de cpp sont déjà loin et je sèche vraiment la
Le projet :
Dialoguer avec mon compteur EDF via la sortie téléinformation et mettre les informations récupérés a disposition d’un scada en MODBUS
La lecture des infos du compteur fonctionne
Le serveur modbus fonctionne
Maintenant je cherche a faire quelque chose de propre et je suis bloquer sur la récupération des variables de ma classe
Voici le code :

Le headers : _04_Headers.h

#define nodebug

#include "Arduino.h"
#include <SPI.h>
#include <Ethernet.h>
#include <SoftwareSerial.h>

class TeleInfo
{
public:
  TeleInfo(String version);
  boolean readTeleInfo();
  boolean recordTeleInfoOnMySQLServer();
  void displayTeleInfo();
  
private :
  SoftwareSerial* mySerial;

  char HHPHC;
  
  int ISOUSC;             // intensité souscrite  
  int IINST;              // intensité instantanée en A
  int IMAX;               // intensité maxi en A
  int PAPP;               // puissance apparente en VA
  
  unsigned long BBRHCJB;  // compteur Heures Creuses Bleu  en W
  unsigned long BBRHPJB;  // compteur Heures Pleines Bleu  en W
  unsigned long BBRHCJW;  // compteur Heures Creuses Blanc en W
  unsigned long BBRHPJW;  // compteur Heures Pleines Blanc en W
  unsigned long BBRHCJR;  // compteur Heures Creuses Rouge en W
  unsigned long BBRHPJR;  // compteur Heures Pleines Rouge en W
  
  String PTEC;            // Régime actuel : HPJB, HCJB, HPJW, HCJW, HPJR, HCJR
  String DEMAIN;          // Régime demain ; ----, BLEU, BLAN, ROUG
  String ADCO;            // adresse compteur
  String OPTARIF;         // option tarifaire
  String MOTDETAT;        // status word
  String pgmVersion;      // TeleInfo program version

  char chksum(char *buff, uint8_t len);
  boolean handleBuffer(char *bufferTeleinfo, int sequenceNumnber);
};

Le cpp : _05_Classes.cpp

#include "_04_Headers.h"
// Basic constructor
TeleInfo::TeleInfo(String version)
{
 //  Serial.begin(1200,SERIAL_7E1);
  mySerial = new SoftwareSerial(8, 9); // RX, TX
  mySerial->begin(1200);
  pgmVersion = version;

  // variables initializations
  ADCO = "031328141543";
  OPTARIF = "----";
  ISOUSC = 0;
  BBRHCJB = 0L;  // compteur Heures Creuses Bleu  en W
  BBRHPJB = 0L;  // compteur Heures Pleines Bleu  en W
  BBRHCJW = 0L;  // compteur Heures Creuses Blanc en W
  BBRHPJW = 0L;  // compteur Heures Pleines Blanc en W
  BBRHCJR = 0L;  // compteur Heures Creuses Rouge en W
  BBRHPJR = 0L;  // compteur Heures Pleines Rouge en W
  PTEC = "----";    // Régime actuel : HPJB, HCJB, HPJW, HCJW, HPJR, HCJR
  DEMAIN = "----";  // Régime demain ; ----, BLEU, BLAN, ROUG
  HHPHC = '-';
  IINST = 0;        // intensité instantanée en A
  IMAX = 0;         // intensité maxi en A
  PAPP = 0;         // puissance apparente en VA
  MOTDETAT = "------";
}

boolean TeleInfo::readTeleInfo()
{
#define startFrame 0x02
#define endFrame 0x03
#define startLine 0x0A
#define endLine 0x0D
#define maxFrameLen 280

  int comptChar=0; // variable de comptage des caractères reçus 
  char charIn=0; // variable de mémorisation du caractère courant en réception

  char bufferTeleinfo[21] = "";
  int bufferLen = 0;
  int checkSum;

  //--- wait for starting frame character 
  while (charIn != startFrame)
  { // "Start Text" STX (002 h) is the beginning of the frame
 //   if (Serial.available())
//      charIn = Serial.read(); // Serial.read() vide buffer au fur et à mesure
   if (mySerial->available())
     charIn = mySerial->read()& 0x7F; // Serial.read() vide buffer au fur et à mesure
  }
  
  int sequenceNumnber= 0;    // number of information group

  //  while (charIn != endFrame and comptChar<=maxFrameLen)
  while (charIn != endFrame)
  { // tant que des octets sont disponibles en lecture : on lit les caractères
//    if (Serial.available())
   if (mySerial->available())
    {
//      charIn = Serial.read();
      charIn = mySerial->read()& 0x7F;
      // incrémente le compteur de caractère reçus
      comptChar++;
      if (comptChar > maxFrameLen)
        return false;
      if (charIn == startLine)
        bufferLen = 0;
      bufferTeleinfo[bufferLen] = charIn;
      // on utilise une limite max pour éviter String trop long en cas erreur réception
      // ajoute le caractère reçu au String pour les N premiers caractères
      if (charIn == endLine)
      {
        checkSum = bufferTeleinfo[bufferLen -1];
        if (chksum(bufferTeleinfo, bufferLen) == checkSum)
        {// we clear the 1st character
          strncpy(&bufferTeleinfo[0], &bufferTeleinfo[1], bufferLen -3);
          bufferTeleinfo[bufferLen -3] =  0x00;
          sequenceNumnber++;
          if (! handleBuffer(bufferTeleinfo, sequenceNumnber))
            return false;
        }
        else
          return false;
      }
      else
        bufferLen++;
    }
  }
  return true;
}

boolean TeleInfo::handleBuffer(char *bufferTeleinfo, int sequenceNumnber)
{
  // create a pointer to the first char after the space
  char* resultString = strchr(bufferTeleinfo,' ') + 1;
  boolean sequenceIsOK;

  switch(sequenceNumnber)
  {
  case 1:
    //  ADCO 031328141543 :
    if (sequenceIsOK = bufferTeleinfo[0]=='A')
      ADCO = String(resultString);
    break;
  case 2:
    // OPTARIF BBR( S
    // OPTARIF HC.. <
    if (sequenceIsOK = bufferTeleinfo[0]=='O')
      OPTARIF = String(resultString);
    break;
  case 3:
    // ISOUSC 45 ?
    if (sequenceIsOK = bufferTeleinfo[1]=='S')
      ISOUSC = atol(resultString);
    break;
  case 4:
    // BBRHCJB 000010828 0
    // HCHC 014460852 $
    if (sequenceIsOK = bufferTeleinfo[6]=='B')
      BBRHCJB = atol(resultString);
    break;
  case 5:
    // BBRHPJB 000007345 =
    // HCHP 012506372 -
    if (sequenceIsOK = bufferTeleinfo[4]=='P')
      BBRHPJB = atol(resultString);
    break;
  case 6:
    // BBRHCJW 000000000 2
    // *
    if (sequenceIsOK = bufferTeleinfo[6]=='W')
      BBRHCJW = atol(resultString);
    break;
  case 7:
    // BBRHPJW 000000000 ?
    // *
    if (sequenceIsOK = bufferTeleinfo[4]=='P')
      BBRHPJW = atol(resultString);
    break;
  case 8:
    // BBRHCJR 000000000 -
    // *
    if (sequenceIsOK = bufferTeleinfo[6]=='R')
      BBRHCJR = atol(resultString);
    break;
  case 9:
    // BBRHPJR 000000000 :
    // *
    if (sequenceIsOK = bufferTeleinfo[4]=='P')
      BBRHPJR = atol(resultString);
    break;
  case 10:
    // PTEC HPJB P
    if (sequenceIsOK = bufferTeleinfo[1]=='T')
      PTEC = String(resultString);
    break;
  case 11:
    // DEMAIN ---- "
    // *
    if (sequenceIsOK = bufferTeleinfo[1]=='E')
      DEMAIN = String(resultString);
    break;
  case 12:
    // IINST 002 Y
    if (sequenceIsOK = bufferTeleinfo[1]=='I')
      IINST =atol(resultString);
    break;
  case 13:
    // IMAX 030 B
    if (sequenceIsOK = bufferTeleinfo[1]=='M')
      IMAX =atol(resultString);
    break;
  case 14:
    // PAPP 00430 (
    if (sequenceIsOK = bufferTeleinfo[1]=='A')
      PAPP =atol(resultString);
    break;
  case 15:
    // HHPHC Y D
    if (sequenceIsOK = bufferTeleinfo[1]=='H')
      HHPHC = resultString[0];
    break;
  case 16:
    // MOTDETAT 000000 B
    if (sequenceIsOK = bufferTeleinfo[1]=='O')
      MOTDETAT = String(resultString);
    break;
  }
#ifdef debug
  if(!sequenceIsOK)
  {
    Serial.print(F("Out of sequence ..."));
    Serial.println(bufferTeleinfo);
    Serial.print(F("\n"));
  }
#endif
  return sequenceIsOK;
}

char TeleInfo::chksum(char *buff, uint8_t len)
{
  int i;
  char sum = 0;
  for (i=1; i<(len-2); i++) 
    sum = sum + buff[i];
  sum = (sum & 0x3F) + 0x20;
  return(sum);
}

Le setup et le loop :

#include "_04_Headers.h"
#include "Arduino.h"
#include <SPI.h>
#include <Ethernet.h>
#include <SoftwareSerial.h>
#include "Mudbus.h"
char version[21] = "TeleInfoLight V 1.01";
Mudbus Mb;
unsigned long loopCounter = 0L;

TeleInfo* myTeleInfo;
void setup() 
{
  Serial.begin(115200);
  Serial.println(F("\nStarting ..."));
  delay(300);

  myTeleInfo = new TeleInfo(version);
}
void loop() 
{
 Mb.Run();
  boolean teleInfoReceived;

  teleInfoReceived = myTeleInfo->readTeleInfo();

Mb.R[0]=La valeurs ADCO (par exemple) récupéré dans la classe TeleInfo 
}

J’ai donc besoin de récupérer la valeur de ADCO (par exemple) récupéré dans la classe TeleInfo et la je sèche
Je pensé que le blocage venait du faite que ADCO est privé j’ai donc fait des essaies sur des variables public idem je n’y arrive pas
La question est donc la suivante :
Comment récupéré dans mon loop() des variables Privé et/ou Public de ma classe TeleInfo

D’avance merci pour votre aide

Fru

Salut,

Déclare ta variable en public, ensuite tu peux y accéder par TaClasse.Tavariable

Bonjour merci pour la réponse J'ai fait le teste cela ne fonctionne pas J'ai mis ADCO en Public et dans le loop quand je met MonStr=TeleInfo.ADCO; j'ai une erreur de compilation :

"expected unqualified-id berofe '.' token

En toute rigueur, en C++ la bonne pratique consiste en la création d'une méthode getNomDeMaVariable() qui retourne la valeur et setNomDeMaVariable(valeur) pour la modifier.

Maintenant, pour faire plus léger la déclaration des variables comme étant public doit fonctionner. Il ne faut pas perdre de vu que ADCO et une chaîne de caractères constante. Donc pour l'utiliser il doit falloir la copier avec strcpy.

edit:

Fru06: J'ai mis ADCO en Public et dans le loop quand je met MonStr=TeleInfo.ADCO; j'ai une erreur de compilation :

"expected unqualified-id berofe '.' token

Normal l'instance de ta classe s'appelle myTeleInfo MonStr=myTeleInfo.ADCO;

Merci pour les infos fdufnews

J'ai testé avec MonStr=myTeleInfo.ADCO; et voila le résulta :

request for member 'ADCO' in 'myTeleInfo', which is of non-class type 'TeleInfo*'

Dans le doute j'ai testé aussi avec PAPP un int que j'ai déclaré en public et j'ai la même erreur

Bonjour,

La solution ne serait pas :

int zzz;
zzz=myTeleInfo->ISOUSC;
// ou :
zzz=(*myTeleInfo).ISOUSC;

puisque tu déclare myTeleInfo comme un pointeur :

TeleInfo* myTeleInfo;

A tester...

A+ Olivier

;) Effectivement ça fonctionne !!!

Merci a tous pour vos réponse rapide vous êtes au top

Fru