work on clean version of i2c pImpl idom

master
polymurph 4 years ago
parent 8e21b7b8f8
commit a61a6b1c6d

@ -21,3 +21,8 @@ pImpl idom:
https://www.youtube.com/watch?v=lETcZQuKQBs
Good C++ guide:
https://www.youtube.com/watch?v=PakbXnLht1I

@ -0,0 +1,20 @@
cpp_src = $(wildcard *.cpp)
cpp_obj = $(cpp_src:.cpp=.o)
c_obj = $(c_src:.c=.o)
CC = g++
CFLAGS = -Wall -pedantic -li2c
LDFLAGS =
EXEC = runtest
all : $(EXEC)
$(EXEC): $(cpp_obj) $(c_obj)
$(CC) -o $@ $^ $(LDFLAGS)
clean:
rm -rf $(c_obj) $(cpp_obj) $(EXEC)
cleanall:
rm -rf $(c_obj) $(cpp_obj) $(EXEC)

@ -0,0 +1,110 @@
#include "ii2c.hpp"
#include <memory>
#include <iostream>
//
// implementation
//
/**
* dummy implementation version
*/
class I2C::I2C_impl
{
public:
I2C_impl()
{
std::cout << "dummy I2C Ctor" << std::endl;
}
uint8_t readByte(const uint8_t& address,
const uint8_t& reg)
{
std::cout << "dummy I2C readByte()" << std::endl;
std::cout << "address: " << static_cast<int>(address) << std::endl;
std::cout << "reg : " << static_cast<int>(reg) << std::endl;
std::cout << "returning 0" << std::endl;
return 0;
}
void writeByte(const uint8_t& address,
const uint8_t& reg,
const uint8_t& byte)
{
std::cout << "dummy I2C writeByte()" << std::endl;
std::cout << "address: " << static_cast<int>(address) << std::endl;
std::cout << "reg : " << static_cast<int>(reg) << std::endl;
std::cout << "byte : " << static_cast<int>(byte) << std::endl;
}
#if 0
uint16_t readWord(const uint8_t& address,
const uint8_t& reg);
void writeWord(const uint8_t& address,
const uint8_t& reg,
const uint16_t& byte);
void readBuffer(const uint8_t& address,
const uint8_t& reg,
uint8_t data[],
uint8_t len);
void writeBuffer(const uint8_t& address,
const uint8_t& reg,
const uint8_t data[],
uint8_t len);
#endif
};
//
// information relay
//
I2C::I2C() :
impl{std::make_unique<I2C_impl>()}
{
}
I2C::~I2C()
{
}
uint8_t I2C::readByte(const uint8_t& address,
const uint8_t& reg)
{
return impl->readByte(address,
reg);
}
void I2C::writeByte(const uint8_t& address,
const uint8_t& reg,
const uint8_t& byte)
{
impl->writeByte(address,
reg,
byte);
}
#if 0
uint16_t readWord(const uint8_t& address,
const uint8_t& reg);
void writeWord(const uint8_t& address,
const uint8_t& reg,
const uint16_t& byte);
void readBuffer(const uint8_t& address,
const uint8_t& reg,
uint8_t data[],
uint8_t len);
void writeBuffer(const uint8_t& address,
const uint8_t& reg,
const uint8_t data[],
uint8_t len);
#endif

@ -0,0 +1,50 @@
#ifndef _II2C_HPP_
#define _II2C_HPP_
#include <memory>
#include <stdint.h>
/**
* Interface class for i2c
*
* It's basedon the pointer to implementation idom (pImpl idom).
*/
class I2C
{
public:
I2C();
~I2C();
uint8_t readByte(const uint8_t& address,
const uint8_t& reg);
void writeByte(const uint8_t& address,
const uint8_t& reg,
const uint8_t& byte);
#if 0
uint16_t readWord(const uint8_t& address,
const uint8_t& reg);
void writeWord(const uint8_t& address,
const uint8_t& reg,
const uint16_t& byte);
void readBuffer(const uint8_t& address,
const uint8_t& reg,
uint8_t data[],
uint8_t len);
void writeBuffer(const uint8_t& address,
const uint8_t& reg,
const uint8_t data[],
uint8_t len);
#endif
private:
class I2C_impl;//< forward declaration
std::unique_ptr<I2C_impl> impl; // pointer to implementation
};
#endif // _II2C_HPP_

@ -0,0 +1,15 @@
#include <iostream>
#include "ii2c.hpp"
#include <iostream>
int main(void)
{
I2C i2c;
std::cout << static_cast<int>(i2c.readByte(100,50)) << std::endl;
i2c.writeByte(20,30,40);
return 0;
}

Binary file not shown.
Loading…
Cancel
Save