I am trying to compile my project, but unfortunately get errors.
I created class and separated implementation and declaration (cpp file and h file)
Here they are
sensor.h
#ifndef SENSOR_H
#define SENSOR_H
#include <stdint.h>
#include "Arduino.h"
// Sensor types
enum SensorType {
ANY_SENSOR,
UNKNOWN_SENSOR,
WATER_SENSOR,
TEMPERATURE_SENSOR,
VIBRATION_SENSOR,
INTERCOM_SENSOR,
HUMIDITY_SENSOR,
PIR_SENSOR,
SOUND_SENSOR,
LIGHT_SENSOR
};
class Sensor {
public:
// Variables declaration
uint32_t sensorId;
SensorType sensorType;
float currentValue;
bool isEnabled;
float criticalLowerLevel;
float criticalUpperLevel;
// Methods declaration
Sensor();
Sensor(uint32_t id,SensorType type,long currentValue,bool isEnabled,long lower,long upper);
String toString();
bool isCriticalLevelRised() {
return (this->currentValue >= this->criticalUpperLevel || this->currentValue <= this->criticalLowerLevel);
};
void enable(bool enable);
void toggle();
static String convertSensorTypeToString(SensorType sensorType);
};
#endif
And cpp file
#include "sensor.h"
Sensor::Sensor()
{
this->sensorId = 0;
this->sensorType = UNKNOWN_SENSOR;
this->currentValue = 0;
this->isEnabled = false;
this->criticalLowerLevel = 0;
this->criticalUpperLevel = 0;
}
Sensor::Sensor(uint32_t id,SensorType type,long currentValue,bool isEnabled,long lower,long upper) {
this->sensorId = id;
this->sensorType = type;
this->currentValue = currentValue;
this->isEnabled = isEnabled;
this->criticalLowerLevel = lower;
this->criticalUpperLevel = upper;
}
void Sensor::enable(bool enable) {
this->isEnabled = enable;
}
void Sensor::toggle() {
this->enable(!this->isEnabled);
}
String Sensor::toString()
{
String response = "";
response += F("Sensor id is ");
response += this->sensorId;
response += '\n';
response += F("Sensor type is ");
response += convertSensorTypeToString(this->sensorType);
response += '\n';
response += F("Sensor current value is ");
response += this->currentValue;
response += '\n';
response += F("Sensor isEnabled is ");
response += this->isEnabled;
response += '\n';
response += F("Sensor criticalLowerLevel is ");
response += this->criticalLowerLevel;
response += '\n';
response += F("Sensor criticalLowerLevel is ");
response += this->criticalUpperLevel;
response += '\n';
return response;
}
String Sensor::convertSensorTypeToString(SensorType sensorType) {
switch (sensorType) {
case UNKNOWN_SENSOR:
return F("UNKNOWN SENSOR");
case ANY_SENSOR:
return F("ANY_SENSOR");
case WATER_SENSOR:
return F("WATER_SENSOR");
case TEMPERATURE_SENSOR:
return F("TEMPERATURE_SENSOR");
case VIBRATION_SENSOR:
return F("VIBRATION_SENSOR");
case HUMIDITY_SENSOR:
return F("HUMIDITY_SENSOR");
case PIR_SENSOR:
return F("PIR_SENSOR");
case SOUND_SENSOR:
return F("SOUND_SENSOR");
case LIGHT_SENSOR:
return F("LIGHT_SENSOR");
default:
return F("UNKNOWN TYPE");
}
}
And I got following errors
ketch/NodeIntercom.ino.cpp.o: In function `sendSensorMessageToMaster(RF24Mesh*, SensorDataMessage*, char, unsigned int, bool)':
/home/iron/Arduino/What'sHappening/NetworkMaster/additional_functions.h:48: undefined reference to `Sensor::toString()'
sketch/NodeIntercom.ino.cpp.o: In function `handleSetSensorDataRequest(RF24NetworkHeader*)':
/home/iron/Arduino/What'sHappening/NodeIntercom/NodeIntercom.ino:97: undefined reference to `Sensor::toggle()'
/home/iron/Arduino/What'sHappening/NodeIntercom/NodeIntercom.ino:89: undefined reference to `Sensor::enable(bool)'
sketch/NodeIntercom.ino.cpp.o: In function `SensorDataMessage':
/home/iron/Arduino/What'sHappening/NetworkMaster/common.h:40: undefined reference to `Sensor::Sensor()'
sketch/NodeIntercom.ino.cpp.o: In function `__static_initialization_and_destruction_0':
/home/iron/Arduino/What'sHappening/NodeIntercom/NodeIntercom.ino:35: undefined reference to `Sensor::Sensor(unsigned long, SensorType, long, bool, long, long)'
collect2: error: ld returned 1 exit status
What I am doing wrong ? Please help.
EDIT
Yes main sketch compiles perfectly where this files are located.
But I don't want to duplicate common files in my all my arduino sketches withing the project, they are the same for whole project. Here my files location
--ArduinoProjects
---NodeIntercom
----NodeIntercom.ino
---MasterNode
----MasterNode.ino
----sensor.h
----sensor.cpp
----common.h
So this files are only located in MasterNode directory
And I tried to include them like this
#include "/home/iron/Arduino/What'sHappening/NetworkMaster/common.h"
#include "/home/iron/Arduino/What'sHappening/NetworkMaster/additional_functions.h"
And in common.h I include sensor.h Also tried to include directly, but still the same
But headers files included as above works perfectly.
What is the right way to solve this problem, I don't want to duplicate this class in each folder whenever I change it.
If there is no way, maybe create symbolic link (I am using linux) ?
PARTIAL SOLUTION
Just use symbolic links in the sketch directory and this works perfectly