First working pimpl example

master
Kerem Yollu 4 years ago
parent f28dc3e09c
commit 066aac8f6d

@ -0,0 +1,126 @@
/*
* Authors : Kerem Yollu & Edwin Koch
* Date : 07.03.2021
*
* Description :
* TODO : Write description or doxygene
*
*/
#include <iostream>
#include <stdint.h>
#include <unistd.h>
#include <bitset>
#include "./management/errorHandling.h"
#include "./management/commandManager.h"
//#include "./drivers/bh1750/bh1750.h"
//#include "./drivers/pf8574/pf8574lcd.h"
#include "./algorithms/bitgestion.h"
//#include "./periferals/i2c/i2c.hpp"
#include "./pimpl/implementation.hpp"
ErrorHandler errorHandle;
CommandManager commander;
Device pimplTest;
//i2c_ch1_pImpL i2c(1, &errorHandle);
/*
char char_array[TOTAL_CHAR_CAP];
int freq = 0;
int initPlatform()
{
lcd_init(&i2c);
return 0;
}
void pca9685_test()
{
Pca9685 pwmGenarator(&i2c, &errorHandle);
pwmGenarator.setOnDutyPercent(0,50);
for(int i = 3 ; i <= 255; i++)
{
pwmGenarator.setPwmRaw(i);
strcpy(char_array, "Pwm Freq: ");
lcd_display_string(1,0,char_array,0);
std::string Msg = std::to_string(pwmGenarator.getPwmFreq());
strcpy(char_array, Msg.c_str());
lcd_display_string(1,10, char_array, 7);
strcpy(char_array, "Hz");
lcd_display_string(1,18, char_array, 7);
usleep(200000);
freq = getchar();
}
}
void bh1750_test()
{
Bh1750 lightSens(&i2c);
while(1)
{
// std::cout << "value "<< lightSens.continious(BH1750_CONTINUOUS_HIGH_RES_MODE_1,1) << " Lux" <<std::endl;
std::string Msg = std::to_string(lightSens.continious(BH1750_CONTINUOUS_HIGH_RES_MODE_1,1));
char char_array[TOTAL_CHAR_CAP];
strcpy(char_array, Msg.c_str());
lcd_display_string(2,0, char_array,5);
usleep(150*1000);
}
}
void dummy()
{
uint16_t conf = 0;
float conv = 0;
Ads1015 adc(&i2c,&errorHandle);
conf = adc.getConfig();
adc.setOperationMode(ADS1015_MODE_SINGLE);
adc.setMultiplexer(ADS1015_MUX_AIN0_GND);
adc.setGain(ADS1015_GAIN_6144);
adc.writeConfig();
adc.pointToConvReg();
conv = adc.getConversion();
conv = (5.0 * conv)/2047.0;
std::cout << "Convertion " << conv << std::endl;
exit(1);
}
int main(int argc, char *argv[])
{
// Init
initPlatform();
std::cout << "Main Begin" << std::endl;
commander.addNewCommand("bh1750", "The test command for testing the bh1750", bh1750_test);
commander.addNewCommand("pca9685", "The test command for testing the pca8695", pca9685_test);
commander.addNewCommand("dummy", "The test command for testing the test", dummy);
commander(argv[1]);
std::cout << "Main End" << std::endl;
return 1;
}
*/
int initPlatform()
{
return 0;
}
void dummy()
{
}
int main(int argc, char *argv[])
{
// Init
initPlatform();
std::cout << "Main Begin" << std::endl;
commander.addNewCommand("dummy", "The test command for testing the test", dummy);
commander(argv[1]);
std::cout << "Main End" << std::endl;
return 1;
}

@ -1,10 +1,11 @@
cpp_src = $(wildcard *.cpp) $(wildcard ./drivers/bh1750/*.cpp) $(wildcard ./drivers/pca9685/*.cpp) $(wildcard ./management/*.cpp) $(wildcard ./systems/*.cpp) $(wildcard ./periferals/i2c/*.cpp) cpp_src += $(wildcard ./pimpl/*.cpp)
cpp_src += $(wildcard ./drivers/ads1015/*.cpp) cpp_src += $(wildcard *.cpp)
cpp_src += $(wildcard ./management/*.cpp) $(wildcard ./systems/*.cpp)
c_src = $(wildcard ./drivers/pf8574/*.c)
c_src += $(wildcard ./algorithms/*.c) c_src += $(wildcard ./algorithms/*.c)
cpp_obj = $(cpp_src:.cpp=.o) cpp_obj = $(cpp_src:.cpp=.o)
impl_obj = $(impl_src:.cpp=.o)
c_obj = $(c_src:.c=.o) c_obj = $(c_src:.c=.o)
CC = g++ CC = g++
CFLAGS = -Wall -pedantic -li2c CFLAGS = -Wall -pedantic -li2c
@ -14,7 +15,7 @@ EXEC = runtest
all : $(EXEC) all : $(EXEC)
$(EXEC): $(cpp_obj) $(c_obj) $(EXEC): $(impl_obj) $(cpp_obj) $(c_obj)
$(CC) -o $@ $^ $(LDFLAGS) $(CC) -o $@ $^ $(LDFLAGS)
clean: clean:

@ -0,0 +1,15 @@
#define STM 0
#define LINUX 1
#define PLATFORM STM

@ -13,7 +13,6 @@ Ads1015::Ads1015(i2c_ch1_pImpL* i2c,ErrorHandler* err)
void Ads1015::writeConfig() void Ads1015::writeConfig()
{ {
std::cout << "To be written conf = "<< unsigned(configuration) << std::endl;
i2c_ads1015->writeWordWithReg(ADS1015_I2C_ADRS,ADS1015_REG_CONFIG,configuration); i2c_ads1015->writeWordWithReg(ADS1015_I2C_ADRS,ADS1015_REG_CONFIG,configuration);
} }
@ -79,10 +78,16 @@ void Ads1015::setComparatorQueue(uint8_t queue)
{ {
} }
void Ads1015::pointToConvReg()
{
i2c_ads1015 -> writeByte(ADS1015_I2C_ADRS,ADS1015_REG_CONVERSION);
}
uint8_t Ads1015::checkConversion() uint16_t Ads1015::checkConversion()
{ {
bitNo = ADS1015_OS_CONVERTING; bitNo = ADS1015_OS_CONVERTING;
getConfig();
return getBitUint16(&configuration,bitNo); return getBitUint16(&configuration,bitNo);
} }

@ -106,7 +106,8 @@ class Ads1015
void setComparatorLatch(uint8_t latch); void setComparatorLatch(uint8_t latch);
void setComparatorQueue(uint8_t queue); void setComparatorQueue(uint8_t queue);
void startSingleConvertion(); void startSingleConvertion();
uint8_t checkConversion(); void pointToConvReg();
uint16_t checkConversion();
int16_t getConversion(); int16_t getConversion();
uint16_t getConfig(); uint16_t getConfig();
void configMode(); void configMode();

@ -13,17 +13,22 @@
#include <bitset> #include <bitset>
#include "./management/errorHandling.h" #include "./management/errorHandling.h"
#include "./management/commandManager.h" #include "./management/commandManager.h"
#include "./drivers/bh1750/bh1750.h" //#include "./drivers/bh1750/bh1750.h"
#include "./drivers/pf8574/pf8574lcd.h" //#include "./drivers/pf8574/pf8574lcd.h"
#include "./drivers/pca9685/pca9685.h"
#include "./drivers/ads1015/ads1050.h"
#include "./algorithms/bitgestion.h" #include "./algorithms/bitgestion.h"
//#include "./periferals/i2c/i2c.hpp"
//#include "./pimpl/implementation.hpp"
#include "./pimpl/interface.hpp"
ErrorHandler errorHandle; ErrorHandler errorHandle;
CommandManager commander; CommandManager commander;
i2c_ch1_pImpL i2c(1, &errorHandle);
Ads1015 adc(&i2c,&errorHandle);
Device pimplTest;
//i2c_ch1_pImpL i2c(1, &errorHandle);
/*
char char_array[TOTAL_CHAR_CAP]; char char_array[TOTAL_CHAR_CAP];
int freq = 0; int freq = 0;
@ -70,24 +75,21 @@ void bh1750_test()
void dummy() void dummy()
{ {
uint16_t conf = 0; uint16_t conf = 0;
float conv = 0;
Ads1015 adc(&i2c,&errorHandle);
conf = adc.getConfig(); conf = adc.getConfig();
adc.setOperationMode(ADS1015_MODE_SINGLE); adc.setOperationMode(ADS1015_MODE_SINGLE);
adc.setMultiplexer(ADS1015_MUX_AIN0_GND); adc.setMultiplexer(ADS1015_MUX_AIN0_GND);
adc.setGain(ADS1015_GAIN_6144); adc.setGain(ADS1015_GAIN_6144);
adc.writeConfig(); adc.writeConfig();
adc.pointToConvReg();
while(adc.checkConversion() == 0) conv = adc.getConversion();
{ conv = (5.0 * conv)/2047.0;
std::cout << "converting" << std::endl; std::cout << "Convertion " << conv << std::endl;
usleep(100000);
}
uint16_t conv = adc.getConversion();
std::cout << "Convertion " << unsigned(conv) << std::endl;
exit(1); exit(1);
} }
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
// Init // Init
@ -101,3 +103,25 @@ int main(int argc, char *argv[])
return 1; return 1;
} }
*/
int initPlatform()
{
return 0;
}
void dummy()
{
pimplTest.printNumber(3);
}
int main(int argc, char *argv[])
{
// Init
initPlatform();
std::cout << "Main Begin" << std::endl;
commander.addNewCommand("dummy", "The test command for testing the test", dummy);
commander(argv[1]);
std::cout << "Main End" << std::endl;
return 1;
}

@ -1,5 +1,6 @@
#ifndef _I2C_H_ #ifndef _I2C_H_
#define _I2C_H_ #define _I2C_H_
#include <memory>
namespace serial namespace serial
{ {
@ -33,24 +34,24 @@ namespace serial
class I2C <i2c_ch0> class I2C <i2c_ch0>
{ {
public: public:
I2C(const uint8_t& mode):pImpL(mode) I2C(const uint8_t& mode)
{ {
} }
uint8_t readByte(const uint8_t& address, const uint8_t& reg) uint8_t readByte(const uint8_t& address, const uint8_t& reg)
{ {
return pImpL -> readByte(address, reg); return pImpL.readByte(address, reg);
} }
uint16_t readWord(const uint8_t& address, const uint8_t& reg) uint16_t readWord(const uint8_t& address, const uint8_t& reg)
{ {
return pImpL -> readWord(address,reg); return pImpL.readWord(address,reg);
} }
uint8_t writeByte(const uint8_t& address, const uint8_t& data) uint8_t writeByte(const uint8_t& address, const uint8_t& data)
{ {
return pImpL -> writeByte(address, data); return pImpL.writeByte(address, data);
} }
uint8_t writeWord(const uint8_t& address, const uint8_t& reg, const uint16_t& data) uint8_t writeWord(const uint8_t& address, const uint8_t& reg, const uint16_t& data)
{ {
return pImpL -> writeWord(address, reg, data); return pImpL.writeWord(address, reg, data);
} }
private: private:
@ -65,24 +66,24 @@ namespace serial
class I2C <i2c_ch1> class I2C <i2c_ch1>
{ {
public: public:
I2C(const uint8_t& mode):pImpL(mode) I2C(const uint8_t& mode)
{ {
} }
uint8_t readByte(const uint8_t& address, const uint8_t& reg) uint8_t readByte(const uint8_t& address, const uint8_t& reg)
{ {
return pImpL -> readByte(address, reg); return pImpL.readByte(address, reg);
} }
uint16_t readWord(const uint8_t& address, const uint8_t& reg) uint16_t readWord(const uint8_t& address, const uint8_t& reg)
{ {
return pImpL -> readWord(address,reg); return pImpL.readWord(address,reg);
} }
uint8_t writeByte(const uint8_t& address, const uint8_t& data) uint8_t writeByte(const uint8_t& address, const uint8_t& data)
{ {
return pImpL -> writeByte(address, data); return pImpL.writeByte(address, data);
} }
uint8_t writeWord(const uint8_t& address, const uint8_t& reg, const uint16_t& data) uint8_t writeWord(const uint8_t& address, const uint8_t& reg, const uint16_t& data)
{ {
return pImpL -> writeWord(address, reg, data); return pImpL.writeWord(address, reg, data);
} }
private: private:

@ -1,18 +1,5 @@
#include "i2c_ch0_pImpL.h"
#include <cstdio>
#include <ostream>
#include <iostream>
#include <linux/i2c-dev.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#define PORT_I2C "/dev/i2c-1"
#include "i2c_ch0_pImpL.hpp"
// some curious things https://www.john.geek.nz/2012/12/update-reading-data-from-a-bosch-bmp085-with-a-raspberry-pi/ // some curious things https://www.john.geek.nz/2012/12/update-reading-data-from-a-bosch-bmp085-with-a-raspberry-pi/

@ -2,10 +2,23 @@
#define _I2C_CH0_PIMPL_H_ #define _I2C_CH0_PIMPL_H_
#include <stdint.h> #include <stdint.h>
#include <unistd.h>
#include <cstdio>
#include <ostream>
#include <iostream> #include <iostream>
#include <string>
#include "../../management/errorHandling.h" #include <linux/i2c-dev.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#define PORT_I2C "/dev/i2c-1"
#include "../../systems/systemCall.h" #include "../../systems/systemCall.h"
#include "../../management/errorHandling.h"
#include "i2c.hpp"
class i2c_ch0_pImpL class i2c_ch0_pImpL
{ {

@ -1,18 +1,4 @@
#include "i2c_ch1_pImpL.hpp" #include "i2c_ch1_pImpL.hpp"
#include <cstdio>
#include <ostream>
#include <iostream>
#include <linux/i2c-dev.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#define PORT_I2C "/dev/i2c-1"
// some curious things https://www.john.geek.nz/2012/12/update-reading-data-from-a-bosch-bmp085-with-a-raspberry-pi/ // some curious things https://www.john.geek.nz/2012/12/update-reading-data-from-a-bosch-bmp085-with-a-raspberry-pi/

@ -2,11 +2,24 @@
#define _I2C_CH1_PIMPL_H_ #define _I2C_CH1_PIMPL_H_
#include <stdint.h> #include <stdint.h>
#include <unistd.h>
#include <cstdio>
#include <ostream>
#include <iostream> #include <iostream>
#include <string>
#include <linux/i2c-dev.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#define PORT_I2C "/dev/i2c-1"
#include "../../systems/systemCall.h" #include "../../systems/systemCall.h"
#include "../../management/errorHandling.h" #include "../../management/errorHandling.h"
#include "i2c.hpp"
class i2c_ch1_pImpL class i2c_ch1_pImpL
{ {
public: public:

@ -0,0 +1,20 @@
#ifndef _IMPLEMENTATION_H_
#define _IMPLEMENTATION_H_
#include "interface.hpp"
#include <iostream>
#include <unistd.h>
struct Device::deviceImpl
{
deviceImpl()
{
std::cout << "Device implementation Constarctor For Liunx "<< std::endl;
}
void printNumber(const uint8_t& no)
{
std::cout << "selected no: "<< unsigned(no*2) << std::endl;
}
};
#endif // _IMPLEMENTATION_H_

@ -0,0 +1,20 @@
#ifndef _IMPLEMENTATION2_H_
#define _IMPLEMENTATION2_H_
#include "interface.hpp"
#include <iostream>
#include <unistd.h>
struct Device::deviceImpl
{
deviceImpl()
{
std::cout << "Device implementation Constarctor For STM "<< std::endl;
}
void printNumber(const uint8_t& no)
{
std::cout << "selected no: "<< unsigned(no) << std::endl;
}
};
#endif // _IMPLEMENTATION2_H_

@ -0,0 +1,24 @@
#include "interface.hpp"
#if PLATFORM == STM
#include "implementations2.hpp"
#endif
#if PLATFORM == LINUX
#include "implementations.hpp"
#endif
Device::Device()
:pImpl(new deviceImpl())
{
}
void Device::printNumber(const uint8_t& no)
{
pImpl->printNumber(no);
}
Device::~Device()
{
}

@ -0,0 +1,22 @@
#ifndef _INTERFACE_H_
#define _INTERFACE_H_
#include "../config.h"
#include <stdint.h>
#include <memory>
class Device
{
public:
Device();
~Device();
void printNumber(const uint8_t& no);
private:
struct deviceImpl;
std::unique_ptr<deviceImpl> pImpl;
};
#endif // _INTERFACE_H_
Loading…
Cancel
Save