ENTS-tock
Environmental NeTworked Sensor firmware on Tock OS
Loading...
Searching...
No Matches
communication.c
Go to the documentation of this file.
1#include "communication.h"
2
3#include <libtock/peripherals/i2c_master.h>
4#include <stdlib.h>
5
10static bool g_controller_mutex_lock = false;
11
18static const int g_i2c_buffer_size = 32;
19
26static const uint8_t g_esp32_i2c_addr = 0x20 << 1;
27
29static Buffer tx = {0};
30
32static Buffer rx = {0};
33
40void ControllerWakeupEsp32(void);
41
43 // Lock mutex
44 g_controller_mutex_lock = true;
45
46 // return code storage
48
49 // wakeup esp32
51
52 // create small buffer
53 Buffer chunk = {0};
54 chunk.data = malloc(g_i2c_buffer_size);
55 chunk.size = g_i2c_buffer_size;
56 chunk.len = 0;
57
58 // shallow copy tx
59 Buffer tx_idx = tx;
60
61 // flag for final tx
62 bool done = false;
63
64 // handle data being larger than i2c buffer size
65 do {
66 // calculate number of bytes to cpy
67 size_t num_bytes = 0;
68 if (tx_idx.len > (chunk.size - 1)) {
69 num_bytes = chunk.size - 1;
70 } else {
71 num_bytes = tx_idx.len;
72 done = true;
73 }
74
75 // first byte is flag
76 chunk.data[0] = (uint8_t)done;
77 // rest of the data
78 memcpy(chunk.data + 1, tx_idx.data, num_bytes);
79 chunk.len = num_bytes + 1;
80
81 // transmit data
82 int tock_status = RETURNCODE_SUCCESS;
83 tock_status =
84 i2c_master_write_sync(g_esp32_i2c_addr, chunk.data, chunk.len);
85 if (tock_status < 0) {
86 cont_status = CONTROLLER_ERROR;
87 break;
88 }
89
90 // increment to next block of data
91 tx_idx.data += num_bytes;
92 tx_idx.len -= num_bytes;
93 } while (!done);
94
95 // free allocated memory
96 free(chunk.data);
97
98 return cont_status;
99}
100
102 int tock_status = RETURNCODE_SUCCESS;
103
105
106 // receive number of incoming bytes
107 uint8_t len_bytes[2] = {};
108 tock_status =
109 i2c_master_read_sync(g_esp32_i2c_addr, len_bytes, sizeof(len_bytes));
110 if (tock_status < 0) {
111 return CONTROLLER_ERROR;
112 }
113
114 // convert 2 byte array to 16-bit int
115 uint16_t len = (((uint16_t)len_bytes[0]) << 8) | ((uint16_t)len_bytes[1]);
116
117 // set number of bytes
118 rx.len = len;
119
120 // create small buffer
121 Buffer chunk = {};
122 chunk.data = malloc(g_i2c_buffer_size);
123 chunk.size = g_i2c_buffer_size;
124 chunk.len = 0;
125
126 // copy reference to receive
127 Buffer rx_idx = rx;
128
129 bool done = false;
130
131 do {
132 // calculate number of bytes to receive
133 size_t num_bytes = 0;
134 if (rx_idx.len < (chunk.size - 1)) {
135 num_bytes = rx_idx.len;
136 done = true;
137 } else {
138 num_bytes = chunk.size - 1;
139 }
140 // add 1 for done flag
141 chunk.len = num_bytes + 1;
142
143 tock_status = i2c_master_read_sync(g_esp32_i2c_addr, chunk.data, chunk.len);
144 if (tock_status < 0) {
145 cont_status = CONTROLLER_ERROR;
146 break;
147 }
148
149 // check done flag
150 if (done != chunk.data[0]) {
151 cont_status = CONTROLLER_ERROR;
152 break;
153 }
154
155 // copy data to rx
156 memcpy(rx_idx.data, chunk.data + 1, num_bytes);
157
158 // increment idx
159 rx_idx.data += num_bytes;
160 rx_idx.len -= num_bytes;
161 } while (!done);
162
163 // free buffer space
164 free(chunk.data);
165
166 // unlock mutex
167 g_controller_mutex_lock = false;
168
169 return cont_status;
170}
171
173 // status code
175
176 // transmit, stop early if error
177 status = ControllerTransmit();
178 if (status != CONTROLLER_SUCCESS) {
179 return status;
180 }
181
182 // Receive
183 status = ControllerReceive();
184 return status;
185}
186
187Buffer* ControllerTx(void) { return &tx; }
188
189Buffer* ControllerRx(void) { return &rx; }
190
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.
ControllerStatus
@ CONTROLLER_ERROR
@ CONTROLLER_SUCCESS
size_t len
size_t size
uint8_t * data