3#include <libtock/peripherals/i2c_master.h>
10static bool g_controller_mutex_lock =
false;
18static const int g_i2c_buffer_size = 32;
26static const uint8_t g_esp32_i2c_addr = 0x20 << 1;
44 g_controller_mutex_lock =
true;
54 chunk.
data = malloc(g_i2c_buffer_size);
55 chunk.
size = g_i2c_buffer_size;
68 if (tx_idx.
len > (chunk.
size - 1)) {
69 num_bytes = chunk.
size - 1;
71 num_bytes = tx_idx.
len;
76 chunk.
data[0] = (uint8_t)done;
78 memcpy(chunk.
data + 1, tx_idx.
data, num_bytes);
79 chunk.
len = num_bytes + 1;
82 int tock_status = RETURNCODE_SUCCESS;
84 i2c_master_write_sync(g_esp32_i2c_addr, chunk.
data, chunk.
len);
85 if (tock_status < 0) {
91 tx_idx.
data += num_bytes;
92 tx_idx.
len -= num_bytes;
102 int tock_status = RETURNCODE_SUCCESS;
107 uint8_t len_bytes[2] = {};
109 i2c_master_read_sync(g_esp32_i2c_addr, len_bytes,
sizeof(len_bytes));
110 if (tock_status < 0) {
115 uint16_t len = (((uint16_t)len_bytes[0]) << 8) | ((uint16_t)len_bytes[1]);
122 chunk.
data = malloc(g_i2c_buffer_size);
123 chunk.
size = g_i2c_buffer_size;
133 size_t num_bytes = 0;
134 if (rx_idx.
len < (chunk.
size - 1)) {
135 num_bytes = rx_idx.
len;
138 num_bytes = chunk.
size - 1;
141 chunk.
len = num_bytes + 1;
143 tock_status = i2c_master_read_sync(g_esp32_i2c_addr, chunk.
data, chunk.
len);
144 if (tock_status < 0) {
150 if (done != chunk.
data[0]) {
156 memcpy(rx_idx.
data, chunk.
data + 1, num_bytes);
159 rx_idx.
data += num_bytes;
160 rx_idx.
len -= num_bytes;
167 g_controller_mutex_lock =
false;
Buffer * ControllerTx(void)
Get reference to transmit buffer.
Buffer * ControllerRx(void)
Get reference to receive buffer.
void ControllerWakeupEsp32(void)
Wakeup esp32 from deep sleep.
ControllerStatus ControllerTransmit(void)
Send bytes to esp32.
ControllerStatus ControllerReceive(void)
Receive bytes from esp32.
ControllerStatus ControllerTransaction(void)
Send message and receive response from esp32.
Communication interface for the controller.