Use an easy I2CSlave class to imitate an I2C slave with address 42
cmake_minimum_required(VERSION 3.12)
project(I2CSlave_Demo)
create_simple_executable(${PROJECT_NAME} I2CSlave_Demo.cpp)
public:
static const int ADDRESS = 42;
static const int SHIFTED_ADDRESS = ADDRESS << 1;
public:
template<size_t I2C_BUFFER_SIZE, size_t STACK_SIZE, size_t QUEUE_BUFFER_SIZE>
MyI2CSlave (uint8_t (&buffer)[I2C_BUFFER_SIZE],
const uint32_t (&stack)[STACK_SIZE],
uint8_t (&queueBuffer)[QUEUE_BUFFER_SIZE])
m_queue(queueBuffer),
m_sum(0) {
}
private:
void on_request () {
this->m_sum += this->m_queue.
dequeue();
this->
write(this->m_sum);
}
void on_receive () {
int result;
while (-1 != (result = this->
read()))
this->m_queue.
insert(
static_cast<uint8_t
>(result));
}
private:
Queue<uint8_t> m_queue;
uint8_t m_sum;
};
uint8_t buffer[32];
uint32_t stack[128];
uint8_t queueBuffer[32];
Runnable::invoke(slave);
I2CMaster master;
master.set_frequency(1000);
if (master.ping(MyI2CSlave::SHIFTED_ADDRESS)) {
pwOut <<
"ACK received!\n";
pwOut <<
"Expecting 0: " << master.get(MyI2CSlave::SHIFTED_ADDRESS,
static_cast<uint8_t
>(0)) <<
'\n';
pwOut <<
"Expecting 1: " << master.get(MyI2CSlave::SHIFTED_ADDRESS,
static_cast<uint8_t
>(1)) <<
'\n';
pwOut <<
"Expecting 3: " << master.get(MyI2CSlave::SHIFTED_ADDRESS,
static_cast<uint8_t
>(2)) <<
'\n';
pwOut <<
"Expecting 6: " << master.get(MyI2CSlave::SHIFTED_ADDRESS,
static_cast<uint8_t
>(3)) <<
'\n';
pwOut <<
"Expecting 10: " << master.get(MyI2CSlave::SHIFTED_ADDRESS,
static_cast<uint8_t
>(4)) <<
'\n';
pwOut <<
"Expecting 80: " << master.get(MyI2CSlave::SHIFTED_ADDRESS,
static_cast<uint16_t
>(0x1234)) <<
'\n';
} else
pwOut <<
"No ack! :(\n I guess we're done.\n";
}
I2CSlave(const uint8_t address, uint8_t(&buffer)[BUFFER_SIZE], const uint32_t(&stack)[STACK_SIZE], const Pin::Mask sclMask=DEFAULT_SCL_MASK, const Pin::Mask sdaMask=DEFAULT_SDA_MASK)
Create an I2CSlave object (requires static allocation of buffer and stack)