feat(miner): scale displayed hashrate units dynamically
This commit is contained in:
42
utils.c
42
utils.c
@@ -15,6 +15,48 @@ static char to_hex_digit(unsigned int v) {
|
||||
return (char)('a' + (v - 10U));
|
||||
}
|
||||
|
||||
static void format_hashrate_core(double rate_hs, char *out, size_t out_len) {
|
||||
static const char *units[] = {"H/s", "kH/s", "MH/s", "GH/s", "TH/s", "PH/s", "EH/s"};
|
||||
size_t unit_idx = 0;
|
||||
const size_t unit_count = sizeof(units) / sizeof(units[0]);
|
||||
double value;
|
||||
|
||||
if (out == NULL || out_len == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(rate_hs >= 0.0)) {
|
||||
rate_hs = 0.0;
|
||||
}
|
||||
value = rate_hs;
|
||||
|
||||
while (value >= 999.95 && unit_idx + 1 < unit_count) {
|
||||
value /= 1000.0;
|
||||
unit_idx++;
|
||||
}
|
||||
|
||||
while (value > 0.0 && value < 1.0 && unit_idx > 0) {
|
||||
value *= 1000.0;
|
||||
unit_idx--;
|
||||
}
|
||||
|
||||
if (value >= 100.0) {
|
||||
snprintf(out, out_len, "%.0f %s", value, units[unit_idx]);
|
||||
} else if (value >= 10.0) {
|
||||
snprintf(out, out_len, "%.1f %s", value, units[unit_idx]);
|
||||
} else {
|
||||
snprintf(out, out_len, "%.2f %s", value, units[unit_idx]);
|
||||
}
|
||||
}
|
||||
|
||||
void format_hashrate_hz(double rate_hz, char *out, size_t out_len) {
|
||||
format_hashrate_core(rate_hz, out, out_len);
|
||||
}
|
||||
|
||||
void format_hashrate_khs(double rate_khs, char *out, size_t out_len) {
|
||||
format_hashrate_core(rate_khs * 1000.0, out, out_len);
|
||||
}
|
||||
|
||||
void sb_init(StrBuf *sb) {
|
||||
sb->data = NULL;
|
||||
sb->len = 0;
|
||||
|
||||
Reference in New Issue
Block a user