Hello Everyone, thank you in advance for your help.
I'm running a project, and I made a few custom libraries. One of them is called Pisada_c, this is the code:
Pisada:c.h
#ifndef Pisada_c_h
#define Pisada_c_h
#include <Arduino.h>
#include "Buzzer_c.h"
#include "Led_c.h"
#include "FlexiForce_c.h"
enum EstadoPisada_t
{
Apoyo,
Balanceo
};
enum Programa_t
{ Inicio,
Calibracion,
Comparacion
};
class Pisada_c
{
public:
//ATRIBUTOS
Pisada_c();
unsigned long tiempoPaso;
unsigned long tiempoApoyo;
unsigned long porcentajeApoyo;
bool flagApoyo;
bool flagPorcentaje;
int contPasos;//hace que en el primer paso no se active la alarma ya que no se juntaron los datos para hacer el calculo
Programa_t Programa;
int porcentajeReferencia;
int porcentajeReferencia_min;
int porcentajeReferencia_max;
//METODOS
void fsmFaseMarcha();
bool detectarPisada(FlexiForce_c *Sensor1, FlexiForce_c *Sensor2, FlexiForce_c *Sensor3);
void calcularPorcentajeApoyo();
void enviarAlerta(Buzzer_c* Buzzer, Led_c* Led);
void calcularReferencias();
private:
//ATRIBUTOS
unsigned long t0;//Inicio de la fase de apoyo
unsigned long t1;//inicio de la fase de balanceo
unsigned long tf;//Fin de la fase de balanceo y comienzo de una nueva fase de apoyo
bool flagAlerta;
EstadoPisada_t Estado;
bool activarAlertas;
int timeThreshold;//Genera efecto antirrebote en la fsmFaseMarcha
};
#endif
In Pisada_c.cpp i have the following function (it works fine).
Pisada_c.cpp
void Pisada_c::fsmFaseMarcha()
{
switch(Estado)
{
case Apoyo:
if(flagApoyo==false && millis()>t0+timeThreshold)
{
t1=millis();
tiempoApoyo=t1-t0;
Estado=Balanceo;
}
break;
case Balanceo:
if(flagApoyo==true && millis()>t1+timeThreshold)
{
tf=millis();
tiempoPaso=tf-t0;
t0=tf;
flagPorcentaje=true;
Estado=Apoyo;
if(contPasos<10)contPasos++;
if(contPasos>1 && Programa==Comparacion) activarAlertas=true;
}
break;
}
}
As you see, I use the variable Estado for the switch, and everything is ok.
Anotherone of the libraries is FlexiForce_c
Flexiforce_c.h
#ifndef FlexiForce_c_h
#define FlexiForce_c_h
#include <Arduino.h>
#include <MedianFilterLib.h>
#define MAXRES 1023 //bit mas grande al que llega el ADC
#define WINLENGTH 61
enum estadoFF_t {
Vacio,
Ventana_VP,
Presionado,
Ventana_PV
};
class FlexiForce_c
{
public:
//ATRIBUTOS
FlexiForce_c(int _pin); //pin donde esta conectado el sensor
int Vacio;//resultado del sensado en vacio
int Umbral;//umbral con el que se considera valida la presion del sensor
estadoFF_t Estado;
bool cambio_presionado;//flag que detecta el cambio de vacio a presionado
bool cambio_vacio;//flag que detecta el cambio de presionado a vacio
int pin;
//METODOS
//void sensarVacio(int tf);//tiempo en ms durante el cual se sensa
void calcularUmbral(int multiplicador_vacio); //cantidad de veces por la que se multiplica el valor en vacio para hallar el umbral
void fsmUmbral(int Value);
void llenarVentana();
int adquirirFiltrado();
private:
//ATRIBUTOS
//MedianFilter<int> medianFilter(WINLENGTH);
//MedianFilter<int> medianFilter(61);
MedianFilter<int> medianFilter=MedianFilter<int>(WINLENGTH);
//METODOS
};
#endif
and in FlexiForce_c.cpp I've got a function really similar to the previous one
void FlexiForce_c::fsmUmbral(int Value)
{
switch(Estado)
{
case Vacio:
if(Value>Umbral)
{
Estado=Ventana_VP;
}
break;
case Ventana_VP: //puede ser que esto afecte el rendimiento al entrar en un ciclo for de mediciones?
int cont,val;
cont=val=0;
for(int i=0;i<5;i++)
{
val=adquirirFiltrado();
if(val>Umbral)cont++;
}
if(cont>3)
{
Estado=Presionado;
Serial.print("Sensor ");
//Serial.print(Sensor->pin);
Serial.println(" presionado.");
}else
{
Estado=Vacio;
}
break;
case Presionado:
if(Value<Umbral)
{
Estado=Ventana_PV;
}
break;
case Ventana_PV:
// int cont,val;
cont=val=0;
for(int i=0;i<5;i++)
{
val=adquirirFiltrado();
if(val<Umbral)cont++;
}
if(cont>3)
{
Estado=Vacio;
Serial.print("Sensor ");
//Serial.print(Sensor->pin);
Serial.println(" vaciado.");
}else
{
Estado=Presionado;
}
break;
}
}
Well, this one is not working. I get an error with the use of Estado and it's cases, but in the other library is fine. Can you help me? The error log is
C:\Users\brian\OneDrive\Documentos2\Arduino\libraries\FlexiForce_c\FlexiForce_c.cpp: In member function 'void FlexiForce_c::fsmUmbral(int)':
C:\Users\brian\OneDrive\Documentos2\Arduino\libraries\FlexiForce_c\FlexiForce_c.cpp:52:10: error: use of 'this' in a constant expression
case Vacio:
^
C:\Users\brian\OneDrive\Documentos2\Arduino\libraries\FlexiForce_c\FlexiForce_c.cpp:52:10: error: 'this' is not a constant expression
C:\Users\brian\OneDrive\Documentos2\Arduino\libraries\FlexiForce_c\FlexiForce_c.cpp:75:15: warning: invalid conversion from 'int' to 'estadoFF_t' [-fpermissive]
Estado=Vacio;
Thank you again!