Updated printable to reduce mutex operations when printing newlines

This commit is contained in:
dario
2024-06-26 11:29:23 +02:00
committed by dario
parent bcdec5de60
commit 1e41189480
7 changed files with 126 additions and 72 deletions

View File

@@ -27,82 +27,76 @@ namespace sta
println(str);
}
void Printable::print(char c)
void Printable::print(char c, bool newline /* = false */)
{
print(&c, 1);
print(&c, 1, newline);
}
void Printable::print(bool b)
void Printable::print(bool b, bool newline /* = false */)
{
print(b ? "true" : "false");
print(b ? "true" : "false", newline);
}
void Printable::print(double d)
void Printable::print(double d, bool newline /* = false */)
{
char buffer[64];
snprintf(buffer, sizeof(buffer), "%f", d);
print(buffer);
print(buffer, newline);
}
void Printable::print(uint8_t num, IntegerBase base)
void Printable::print(uint8_t num, IntegerBase base, bool newline /* = false */)
{
printBase(num, base, "%" PRIu8, sizeof(num));
printBase(num, base, "%" PRIu8, sizeof(num), newline);
}
void Printable::print(uint16_t num, IntegerBase base)
void Printable::print(uint16_t num, IntegerBase base, bool newline /* = false */)
{
printBase(num, base, "%" PRIu16, sizeof(num));
printBase(num, base, "%" PRIu16, sizeof(num), newline);
}
void Printable::print(uint32_t num, IntegerBase base)
void Printable::print(uint32_t num, IntegerBase base, bool newline /* = false */)
{
printBase(num, base, "%" PRIu32, sizeof(num));
printBase(num, base, "%" PRIu32, sizeof(num), newline);
}
void Printable::print(const char * str)
void Printable::print(const char * str, bool newline /* = false */)
{
print(str, strlen(str));
print(str, strlen(str), newline);
}
void Printable::println()
{
print("\r\n", 2);
print("\r\n", 2, false);
}
void Printable::println(char c)
{
print(&c, 1);
println();
print(&c, 1, true);
}
void Printable::println(bool b)
{
print(b);
println();
print(b, true);
}
void Printable::println(double d)
{
print(d);
println();
print(d, true);
}
void Printable::println(uint8_t num, IntegerBase base)
{
print(num, base);
println();
print(num, base, true);
}
void Printable::println(uint16_t num, IntegerBase base)
{
print(num, base);
println();
print(num, base, true);
}
void Printable::println(uint32_t num, IntegerBase base)
{
print(num, base);
println();
print(num, base, true);
}
void Printable::println(const char * str)
@@ -112,26 +106,25 @@ namespace sta
void Printable::println(const char * str, size_t length)
{
print(str, length);
println();
print(str, length, true);
}
void Printable::printBase(uintmax_t num, IntegerBase base, const char * fmt, size_t size)
void Printable::printBase(uintmax_t num, IntegerBase base, const char * fmt, size_t size, bool newline /* = false */)
{
switch (base)
{
case IntegerBase::DEC:
printDec(num, fmt);
printDec(num, fmt, newline);
break;
case IntegerBase::BIN:
// Digits in base 2 = size in bytes * 8
printBin(num, size * 8);
printBin(num, size * 8, newline);
break;
case IntegerBase::HEX:
// Digits in base 16 = size in bytes * 2
printHex(num, size * 2);
printHex(num, size * 2, newline);
break;
default:
@@ -139,14 +132,14 @@ namespace sta
}
}
void Printable::printDec(uintmax_t num, const char * fmt)
void Printable::printDec(uintmax_t num, const char * fmt, bool newline /* = false */)
{
char buffer[64];
snprintf(buffer, sizeof(buffer), fmt, static_cast<uint32_t>(num));
print(buffer);
print(buffer, newline);
}
void Printable::printBin(uintmax_t value, size_t digits)
void Printable::printBin(uintmax_t value, size_t digits, bool newline /* = false */)
{
// Need 8 digits for every byte
char buffer[sizeof(value) * 8];
@@ -168,10 +161,10 @@ namespace sta
buffer[i] = '0' + ((value >> (digits - 1 - i)) & 0x1);
}
print(buffer, digits);
print(buffer, digits, newline);
}
void Printable::printHex(uintmax_t value, size_t digits)
void Printable::printHex(uintmax_t value, size_t digits, bool newline /* = false */)
{
// Need 2 digits for every byte
char buffer[sizeof(value) * 2];
@@ -179,7 +172,7 @@ namespace sta
// Check bounds
if (digits > sizeof(buffer))
{
print("<hex_value_too_big>");
print("<hex_value_too_big>", newline);
return;
}
// Nothing to do
@@ -197,7 +190,7 @@ namespace sta
buffer[i] = '0' + hex;
}
print(buffer, digits);
print(buffer, digits, newline);
}
} // namespace sta

View File

@@ -1,5 +1,6 @@
#include <sta/debug/printing/printable_printf.hpp>
#include <sta/debug/assert.hpp>
#include <sta/lang.hpp>
#include <cstdio>
@@ -10,11 +11,20 @@ namespace sta
}
void PrintablePrintf::print(const char * str, size_t length)
void PrintablePrintf::print(const char * str, size_t length, bool newline /* = false */)
{
STA_ASSERT(str != nullptr);
STA_ASSERT(length > 0);
printf("%.*s", length, str);
printf("\r\n");
}
void PrintablePrintf::read(char * str, size_t length)
{
STA_ASSERT(str != nullptr);
STA_ASSERT(length > 0);
STA_NOT_IMPLEMENTED();
}
} // namespace sta

View File

@@ -17,11 +17,21 @@ namespace sta
STA_ASSERT(intf->settings().mode == UARTMode::RX || intf->settings().mode == UARTMode::RX_TX);
}
void PrintableUART::print(const char * str, size_t length)
void PrintableUART::print(const char * str, size_t length, bool newline /* = false */)
{
const char * linebreak = "\r\n";
intf_->acquire();
intf_->transfer(reinterpret_cast<const uint8_t *>(str), length);
intf_->transfer(reinterpret_cast<const uint8_t *>(linebreak), 2);
intf_->release();
}
void PrintableUART::read(char * str, size_t length)
{
intf_->acquire();
intf_->receive(reinterpret_cast<uint8_t *>(str), length);
intf_->release();
}
} // namespace sta