19#include "soft_i2c_slave_states.h"
20#include "soft_i2c_slave.h"
28 _context.setState(&_context._read_addr);
31 _context.setState(&_context._idle);
40 _context._sda.gpioWrite(HIGH);
41 _context._scl.gpioWrite(HIGH);
47void READ_ADDR::enter() {
50 _context._byte_index = 0;
52void READ_ADDR::high() {
56void READ_ADDR::low() {
59void READ_ADDR::scl_falling() {
62 _context._send = _data & 0x01;
64 _context._ack = (_data == _context._i2c_address);
66 _context.setState(&_context._write_ack);
73void WRITE_ACK::enter() {
74 _context._sda.gpioDisableIrq();
75 _context._sda.gpioWrite(!_context._ack);
76 _context._sda.gpioEnableIrq();
79void WRITE_ACK::scl_falling() {
81 _context._sda.gpioWrite(HIGH);
85 _context.setState(&_context._write_data );
87 _context.setState(&_context._read_data );
90 _context.setState(&_context._idle);
97void READ_DATA::enter() {
101void READ_DATA::high() {
105void READ_DATA::low() {
108void READ_DATA::scl_falling() {
110 _context._ack = _context._receive(_context._byte_index++, _data);
111 _context.setState(&_context._write_ack);
118void WRITE_DATA::enter() {
120 _context._sda.gpioDisableIrq();
122 _data = _context._transmit(_context._byte_index++);
125 _context._sda.gpioWrite(_data & _bit_mask);
128void WRITE_DATA::scl_falling() {
131 _context._sda.gpioWrite(_data & _bit_mask);
135 _context._sda.gpioWrite(HIGH);
136 _context._sda.gpioEnableIrq();
137 _context.setState(&_context._read_ack);
144void READ_ACK::high() {
145 _context._ack =
false;
147void READ_ACK::low() {
148 _context._ack =
true;
150void READ_ACK::scl_falling() {
152 _context.setState(&_context._write_data);
154 _context.setState(&_context._idle);