Hello PaulS, thanks for your interest. In response to your answer:
About first try:
#include "utilities/CpuOutput.h"
Cpu::Cpu(): outputObject(){}
Did you define a destructor? Did you implement the destructor?
Yes I did for CpuOutut files, definition in .h (inside 'public:' members, after constructor definition): ~CpuOutput();
and the implementation in .cpp, at the end of file: CpuOutput::~CpuOutput(){}
The same things in .h and .cpp files of Cpu class, for respective destructor (~Cpu(); etc.)
About second try:
#include "utilities/CpuOutput.h"
Cpu::Cpu(){ cpuObject(); }
That is NOT how to create an instance of the class. You NEVER call the constructor directly.
I understood, so I will never try it again
The gist:
I tried with your example, but I still have the same error:
undefined reference to `CpuOutput::~CpuOutput()'
undefined reference to `CpuOutput::CpuOutput()'
So as you requested me, here are the Cpu .h and Cpu .cpp files:
note: Cpu class name = Cpu1284. CpuOutput class name = Cpu1284ExtendedInput.
Cpu1284.h
#if(ARDUINO >= 100)
#include <Arduino.h>
#else
#include <WProgram.h>
#endif
#include "utilities/Cpu1284ExtendedInput.h"
#include <inttypes.h>
#ifndef Cpu1284_h
#define Cpu1284_h
class Cpu1284{
public:
Cpu1284();
~Cpu1284();
private:
// Analog/digital Input pins sector1
uint8_t d18; // control0 extendedInput library
uint8_t d19; // control1 "
uint8_t d20; // control2 "
uint8_t d21; // control3 "
uint8_t a0; // analogData "
// Digital Input pins sector2 (both sectors share d18-d21 pins)
uint8_t a1; // digitalData "
// Digital Output pins sector3
uint8_t d22; // latchPin extendedOutput library (maybe clockPin)
uint8_t d23; // clockPin extendedOutput library (maybe latchPin)
uint8_t d0; // dataPin extendedOutput library
// Lcd pins (digital outputs)
uint8_t d4;
uint8_t d5;
uint8_t d6;
uint8_t d7;
uint8_t a2;
uint8_t a3;
uint8_t a4;
uint8_t a5;
uint8_t a6;
// Motor1 pins (digital outputs)
uint8_t d3;
uint8_t d12;
// Motor2 pins (digital outputs)
uint8_t d13;
uint8_t d14;
// Encoder pins (digital inputs)
uint8_t d1;
uint8_t d2;
// Interruptor pins
uint8_t d10;
// rs485 pins
uint8_t rx0;
uint8_t tx0;
uint8_t a7;
uint8_t lcdEnabled;
uint8_t encoderEnabled;
uint8_t motorEnabled;
uint8_t digitalInputsSector1Enabled;
Cpu1284ExtendedInput extendedInput;
// Internal functions
void enableFeatures();
void enableLCD();
void enableEncoder();
void enableMotor();
void enableMuxPins();
};
#endif
Cpu1284.cpp
#if(ARDUINO >= 100)
#include <Arduino.h>
#else
#include <WProgram.h>
#endif
#include "Cpu1284.h"
#include "utilities/Cpu1284ExtendedInput.h"
#include <inttypes.h>
// CONSTRUCTOR
Cpu1284::Cpu1284() : extendedInput(){
lcdEnabled = 0;
encoderEnabled = 0;
motorEnabled = 0;
digitalInputsSector1Enabled = 0;
enableMuxPins();
}
// INTERNAL FUNCTIONS
void Cpu1284::enableFeatures(){
if(lcdEnabled != 0){
enableLCD();
}
if(encoderEnabled != 0){
enableEncoder();
}
if(motorEnabled != 0){
enableMotor();
}
enableMuxPins();
}
void Cpu1284::enableLCD(){
/* lcdEnabled = 1: 20x2 size, 6 pins needed
= 2: 20x4 size, 7 pins needed
= 3: 40x2 size, 7 pins needed
= 4: 40x4 size, 8 pins needed
*/
d4 = 4;
d5 = 5;
d6 = 6;
d7 = 7;
a2 = 26;
a3 = 27;
pinMode(d4, OUTPUT);
pinMode(d5, OUTPUT);
pinMode(d6, OUTPUT);
pinMode(d7, OUTPUT);
pinMode(a2, OUTPUT);
pinMode(a3, OUTPUT);
if(lcdEnabled > 1){
a4 = 28;
pinMode(a4, OUTPUT);
if(lcdEnabled > 3){
a5 = 29;
pinMode(a5, OUTPUT);
}
}
}
void Cpu1284::enableEncoder(){
d1 = 1;
d2 = 2;
pinMode(d1, INPUT);
pinMode(d2, INPUT);
}
void Cpu1284::enableMotor(){
d3 = 3;
d12 = 12;
pinMode(d3, OUTPUT);
pinMode(d12, OUTPUT);
if(motorEnabled == 2){
d13 = 13;
d14 = 14;
pinMode(d13, OUTPUT);
pinMode(d14, OUTPUT);
}
}
void Cpu1284::enableMuxPins(){
// Activate analog/ditigal Input Mux pins from Sector 1
d18 = 18;
d19 = 19;
d20 = 20;
d21 = 21;
a0 = 24;
pinMode(d18, INPUT);
pinMode(d19, INPUT);
pinMode(d20, INPUT);
pinMode(d21, INPUT);
pinMode(a0, INPUT);
// Activate digital Input Mux pins from Sector 2
a1 = 25;
pinMode(a1, INPUT);
// Activate digital Output Mux pins from Sector 3
d22 = 22;
d23 = 23;
d0 = 0;
pinMode(d22, OUTPUT);
pinMode(d23, OUTPUT);
pinMode(d0, OUTPUT);
}
Cpu1284::~Cpu1284(){
}
Cpu1284ExtendedInput Files (runs and compiles ok, tested)
Cpu1284ExtendedInput.h (located at /Cpu1284/utilities)
#include <inttypes.h>
#ifndef Cpu1284ExtendedInput_h
#define Cpu1284ExtendedInput_h
class Cpu1284ExtendedInput{
public:
// Constructor
Cpu1284ExtendedInput();
// Destructor
~Cpu1284ExtendedInput();
void setParameters(uint8_t Control0, uint8_t Control1, uint8_t Control2, uint8_t Control3, uint8_t digitalData, uint8_t analogData);
void inputsRead(uint8_t *muxDigital, int *muxAnalog);
private:
uint8_t c0;
uint8_t c1;
uint8_t c2;
uint8_t c3;
uint8_t dD;
uint8_t aD;
};
#endif
Cpu1284ExtendedInput.cpp (located at /Cpu1284/utilities)
#include "Cpu1284ExtendedInput.h"
#if(ARDUINO >= 100)
#include <Arduino.h>
#else
#include <WProgram.h>
#endif
#include <stdlib.h>
#include <inttypes.h>
// Constructor
Cpu1284ExtendedInput::Cpu1284ExtendedInput(){
}
void Cpu1284ExtendedInput::setParameters(uint8_t Control0, uint8_t Control1, uint8_t Control2, uint8_t Control3, uint8_t digitalData, uint8_t analogData){
c0 = Control0;
c1 = Control1;
c2 = Control2;
c3 = Control3;
dD = digitalData;
aD = analogData;
digitalWrite(dD, HIGH);
}
void Cpu1284ExtendedInput::inputsRead(uint8_t *muxDigital, int *muxAnalog){
//This for loop is used to scroll through and store the 16 inputs on the FIRST multiplexer
for (uint8_t i=0; i<16; i++){
//The following 4 commands set the correct logic for the control pins to select the desired input
//See the Arduino Bitwise AND Reference: http://www.arduino.cc/en/Reference/BitwiseAnd
//See the Aruino Bitshift Reference: http://www.arduino.cc/en/Reference/Bitshift
digitalWrite(c0, (i&15)>>3);
digitalWrite(c1, (i&7)>>2);
digitalWrite(c2, (i&3)>>1);
digitalWrite(c3, (i&1));
//Read and store the input
//Since internal pullup is on, the pin goes low on changing, so the value needs to be flipped from 0 to 1 (!)
muxDigital[i] = !digitalRead(dD);
muxAnalog[i] = analogRead(aD);
}
}
// Deconstructor
Cpu1284ExtendedInput::~Cpu1284ExtendedInput(){
}
I hope you can help me. Thanks again