38 lines
1.4 KiB
C++
38 lines
1.4 KiB
C++
#include "serial.h"
|
|
#include "../hal/usart.h"
|
|
|
|
namespace modules {
|
|
|
|
namespace serial {
|
|
|
|
bool WriteToUSART(const uint8_t *src, uint8_t len) {
|
|
// How to properly enqueue the message? Especially in case of a full buffer.
|
|
// We neither can stay here in an endless loop until the buffer drains.
|
|
// Nor can we save the message elsewhere ... it must be just skipped and the protocol must handle it.
|
|
// Under normal circumstances, such a situation should not happen.
|
|
// The MMU cannot produce response messages on its own - it only responds to requests from the printer.
|
|
// That means there is only one message in the output buffer at once as long as the printer waits for the response before sending another request.
|
|
for (uint8_t i = 0; i < len; ++i) {
|
|
if (hu::usart1.CanWrite()) {
|
|
// should not block waiting for the TX buffer to drain as there was an empty spot for at least 1 byte
|
|
hu::usart1.Write(src[i]);
|
|
} else {
|
|
//buffer full - must skip the rest of the message - the communication will drop out anyway
|
|
return false;
|
|
}
|
|
}
|
|
return true; // not sure if we can actually leverage the knowledge of success while sending the message
|
|
}
|
|
|
|
bool Available() {
|
|
return !hu::usart1.ReadEmpty();
|
|
}
|
|
|
|
uint8_t ConsumeByte() {
|
|
return hu::usart1.Read();
|
|
}
|
|
|
|
} // namespace serial
|
|
|
|
} // namespace modules
|