Fix receiveByte timeout and add global timeout
This commit is contained in:
parent
6f9d8bae42
commit
8979066420
@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
#include "uart/uart.hpp"
|
#include "uart/uart.hpp"
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
#include <avr/boot.h>
|
#include <avr/boot.h>
|
||||||
#include <avr/interrupt.h>
|
#include <avr/interrupt.h>
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
@ -9,7 +11,10 @@
|
|||||||
|
|
||||||
#include "command.hpp"
|
#include "command.hpp"
|
||||||
|
|
||||||
using uart_interface = uart::Hardware0<uart::Config<115200>, uart::Driven::BLOCKING>;
|
static constexpr auto TIMEOUT = 5000;
|
||||||
|
static constexpr auto BAUD_RATE = 115200;
|
||||||
|
|
||||||
|
using uart_interface = uart::Hardware0<uart::Config<BAUD_RATE>, uart::Driven::BLOCKING>;
|
||||||
uart::Uart<uart_interface> serial;
|
uart::Uart<uart_interface> serial;
|
||||||
|
|
||||||
struct Message {
|
struct Message {
|
||||||
@ -21,13 +26,28 @@ struct Message {
|
|||||||
uint8_t checksum;
|
uint8_t checksum;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline bool receiveByte(uint8_t &data, uint32_t timeout = 100000)
|
static inline bool receiveByte(uint8_t &data, uint16_t &timeout)
|
||||||
{
|
{
|
||||||
for (uint32_t i = 0; i < timeout; ++i) {
|
constexpr auto MICROSECOND = 1000.0 * 1000;
|
||||||
if (serial.rxByte(data))
|
constexpr auto SYMBOL_SIZE = 9;
|
||||||
|
constexpr auto BYTE_DELAY_US = (SYMBOL_SIZE * MICROSECOND) / BAUD_RATE;
|
||||||
|
constexpr auto NUM_MS_DELAY_STEPS = static_cast<uint16_t>(round(1000 / BYTE_DELAY_US));
|
||||||
|
uint16_t msDelay = NUM_MS_DELAY_STEPS;
|
||||||
|
|
||||||
|
while (timeout) {
|
||||||
|
if (serial.rxByte(data)) {
|
||||||
|
timeout = TIMEOUT;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_delay_us(BYTE_DELAY_US);
|
||||||
|
|
||||||
|
if (--msDelay == 0) {
|
||||||
|
msDelay = NUM_MS_DELAY_STEPS;
|
||||||
|
--timeout;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -42,23 +62,23 @@ static inline uint8_t calcChecksum(const Message &msg)
|
|||||||
return checksum;
|
return checksum;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool receiveMessage(Message &msg)
|
static inline bool receiveMessage(Message &msg, uint16_t &timeout)
|
||||||
{
|
{
|
||||||
if (!receiveByte(msg.start) || msg.start != MESSAGE_START)
|
if (!receiveByte(msg.start, timeout) || msg.start != MESSAGE_START)
|
||||||
return false;
|
return false;
|
||||||
if (!receiveByte(msg.number))
|
if (!receiveByte(msg.number, timeout))
|
||||||
return false;
|
return false;
|
||||||
if (!receiveByte(*(reinterpret_cast<uint8_t *>(&msg.size) + 1)))
|
if (!receiveByte(*(reinterpret_cast<uint8_t *>(&msg.size) + 1), timeout))
|
||||||
return false;
|
return false;
|
||||||
if (!receiveByte(*reinterpret_cast<uint8_t *>(&msg.size)) || msg.size > sizeof(msg.body))
|
if (!receiveByte(*reinterpret_cast<uint8_t *>(&msg.size), timeout) || msg.size > sizeof(msg.body))
|
||||||
return false;
|
return false;
|
||||||
if (!receiveByte(msg.token) || msg.token != TOKEN)
|
if (!receiveByte(msg.token, timeout) || msg.token != TOKEN)
|
||||||
return false;
|
return false;
|
||||||
for (uint16_t i = 0; i < msg.size; ++i) {
|
for (uint16_t i = 0; i < msg.size; ++i) {
|
||||||
if (!receiveByte(msg.body[i]))
|
if (!receiveByte(msg.body[i], timeout))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!receiveByte(msg.checksum) || msg.checksum != calcChecksum(msg))
|
if (!receiveByte(msg.checksum, timeout) || msg.checksum != calcChecksum(msg))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -551,11 +571,15 @@ int main()
|
|||||||
Message msg;
|
Message msg;
|
||||||
uint32_t addr = 0x0000;
|
uint32_t addr = 0x0000;
|
||||||
ChipEraseState chipEraseFlag = ChipEraseState::NONE;
|
ChipEraseState chipEraseFlag = ChipEraseState::NONE;
|
||||||
|
uint16_t timeout = TIMEOUT;
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
if (receiveMessage(msg)) {
|
if (receiveMessage(msg, timeout)) {
|
||||||
handleMessage(msg, addr, chipEraseFlag);
|
handleMessage(msg, addr, chipEraseFlag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (timeout == 0)
|
||||||
|
timeout = TIMEOUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user