Merge pull request #6 from shufps/non-blocking-rx
uses non-blocking read for asic response
This commit is contained in:
commit
a05f666031
@ -362,24 +362,23 @@ bool BM1397_receive_work(uint16_t timeout, asic_result *result)
|
|||||||
{
|
{
|
||||||
uint8_t *rcv_buf = (uint8_t*) result;
|
uint8_t *rcv_buf = (uint8_t*) result;
|
||||||
|
|
||||||
// wait for a response, wait time is pretty arbitrary
|
// non blocking read
|
||||||
int received = SERIAL_rx(rcv_buf, 9, timeout);
|
int received = SERIAL_rx_non_blocking(rcv_buf, 9);
|
||||||
|
|
||||||
if (received < 0)
|
if (received < 0)
|
||||||
{
|
{
|
||||||
Serial.println("Error in serial RX");
|
Serial.println("Error in serial RX");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else if (received == 0)
|
else if (!received)
|
||||||
{
|
{
|
||||||
// Didn't find a solution, restart and try again
|
// we have not received any data
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (received != 9 || rcv_buf[0] != 0xAA || rcv_buf[1] != 0x55)
|
if (received != 9 || rcv_buf[0] != 0xAA || rcv_buf[1] != 0x55)
|
||||||
{
|
{
|
||||||
Serial.println("Serial RX invalid. Resetting receive buffer ...");
|
Serial.println("Serial RX invalid. Resetting receive buffer ...");
|
||||||
//ESP_LOG_BUFFER_HEX(TAG, asic_response_buffer, received);
|
|
||||||
SERIAL_clear_buffer();
|
SERIAL_clear_buffer();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -57,6 +57,28 @@ size_t SERIAL_check_for_data() {
|
|||||||
return length;
|
return length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// @brief waits for a serial response from the device
|
||||||
|
/// @param buf buffer to read data into
|
||||||
|
/// @param buf number of ms to wait before timing out
|
||||||
|
/// @return number of bytes read, or -1 on error
|
||||||
|
int16_t SERIAL_rx_non_blocking(uint8_t *buf, uint16_t size) {
|
||||||
|
// check how much data we have
|
||||||
|
size_t available = SERIAL_check_for_data();
|
||||||
|
|
||||||
|
// no data available, return 0
|
||||||
|
if (!available) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check for incomplete data
|
||||||
|
if (available && available < size) {
|
||||||
|
Serial.printf("not returning incomplete data ... %d vs %d\n", (int) available, (int) size);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
// timeout 0 means non_blocking read
|
||||||
|
return SERIAL_rx(buf, size, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// @brief waits for a serial response from the device
|
/// @brief waits for a serial response from the device
|
||||||
/// @param buf buffer to read data into
|
/// @param buf buffer to read data into
|
||||||
@ -64,13 +86,6 @@ size_t SERIAL_check_for_data() {
|
|||||||
/// @return number of bytes read, or -1 on error
|
/// @return number of bytes read, or -1 on error
|
||||||
int16_t SERIAL_rx(uint8_t *buf, uint16_t size, uint16_t timeout_ms)
|
int16_t SERIAL_rx(uint8_t *buf, uint16_t size, uint16_t timeout_ms)
|
||||||
{
|
{
|
||||||
// don't return incomplete data
|
|
||||||
size_t available = SERIAL_check_for_data();
|
|
||||||
if (available && available < size) {
|
|
||||||
Serial.printf("not returning parts of data ... %d vs %d\n", (int) available, (int) size);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int16_t bytes_read = uart_read_bytes(UART_NUM_1, buf, size, timeout_ms / portTICK_PERIOD_MS);
|
int16_t bytes_read = uart_read_bytes(UART_NUM_1, buf, size, timeout_ms / portTICK_PERIOD_MS);
|
||||||
// if (bytes_read > 0) {
|
// if (bytes_read > 0) {
|
||||||
// printf("rx: ");
|
// printf("rx: ");
|
||||||
@ -83,21 +98,6 @@ int16_t SERIAL_rx(uint8_t *buf, uint16_t size, uint16_t timeout_ms)
|
|||||||
return bytes_read;
|
return bytes_read;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SERIAL_debug_rx(void)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
uint8_t buf[CHUNK_SIZE];
|
|
||||||
|
|
||||||
ret = SERIAL_rx(buf, 100, 20);
|
|
||||||
if (ret < 0)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "unable to read data\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(buf, 0, 1024);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SERIAL_clear_buffer(void)
|
void SERIAL_clear_buffer(void)
|
||||||
{
|
{
|
||||||
uart_flush(UART_NUM_1);
|
uart_flush(UART_NUM_1);
|
||||||
|
@ -4,8 +4,8 @@
|
|||||||
|
|
||||||
int SERIAL_send(uint8_t *, int, bool);
|
int SERIAL_send(uint8_t *, int, bool);
|
||||||
void SERIAL_init(void);
|
void SERIAL_init(void);
|
||||||
void SERIAL_debug_rx(void);
|
|
||||||
int16_t SERIAL_rx(uint8_t *, uint16_t, uint16_t);
|
int16_t SERIAL_rx(uint8_t *, uint16_t, uint16_t);
|
||||||
|
int16_t SERIAL_rx_non_blocking(uint8_t *buf, uint16_t size);
|
||||||
void SERIAL_clear_buffer(void);
|
void SERIAL_clear_buffer(void);
|
||||||
void SERIAL_set_baud(int baud);
|
void SERIAL_set_baud(int baud);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user