return r;
}
+td_graph_temps td_graph_temperature(const td_graph_render_options* options) {
+ // These countries predominantly use Fahrenheit
+ const char* fahrenheit[] = {
+ // United States
+ "en_US",
+ // Bahamas
+ "en_BS",
+ // Belize
+ "en_BZ",
+ // Cayman Islands
+ "en_KY",
+ // Liberia
+ "en_LR",
+ // Palau
+ "en_PW",
+ // Marshall Islands
+ "en_MH",
+ // Micronesia
+ "en_FM",
+ NULL,
+ };
+
+ // If there is no locale, we will use Kelvin
+ if (!options->locale || !*options->locale || td_string_equals(options->locale, "C"))
+ return TD_GRAPH_TEMP_KELVIN;
+
+ // Find anyone using Fahrenheit
+ for (const char** code = fahrenheit; *code; code++) {
+ if (td_string_startswith(options->locale, *code))
+ return TD_GRAPH_TEMP_FAHRENHEIT;
+ }
+
+ // Otherwise use Celsius
+ return TD_GRAPH_TEMP_CELSIUS;
+}
+
int td_graph_vlabel_bps(td_ctx* ctx, td_graph* graph,
const char* object, char* vlabel, size_t length) {
return __td_string_set(vlabel, length, _("Bits Per Second"));
// Temperatures
#define KELVIN "%%12.2lf K"
+#define CELSIUS "%%11.2lf °C"
+#define FAHRENHEIT "%%11.2lf °F"
// Macro to terminate a line
#define EOL "\\j"
#define FIELD_INF(field) field "_inf"
#define FIELD_NEGINF(field) field "_neginf"
#define FIELD_BITS(field) field "_bits"
+#define FIELD_CELSIUS(field) field "_c"
+#define FIELD_FAHRENHEIT(field) field "_f"
#define VALUE_CURRENT(args, field, object) SCRIPT(args, "VDEF:" FIELD_CURRENT(FIELD) "=" FIELD ",LAST", FIELD_AND_OBJECT(field, object), FIELD_AND_OBJECT(field, object))
#define VALUE_AVERAGE(args, field, object) SCRIPT(args, "VDEF:" FIELD_AVERAGE(FIELD) "=" FIELD ",AVERAGE", FIELD_AND_OBJECT(field, object), FIELD_AND_OBJECT(field, object))
#define COMPUTE_BITS(args, bits, object, bytes) \
COMPUTE_MULTIPLY(args, bits, object, bytes, object, 8)
+// Convert Kelvin to Celsius
+#define COMPUTE_CELSIUS(args, field, object) \
+ do { \
+ COMPUTE_CDEF(args, FIELD "=" FIELD ",273.15,-", \
+ FIELD_AND_OBJECT(FIELD_CELSIUS(field), object), \
+ FIELD_AND_OBJECT(field, object) \
+ ); \
+ VALUE_ALL(args, FIELD_CELSIUS(field), object); \
+ } while (0)
+
+#define COMPUTE_FAHRENHEIT(args, field, object) \
+ do { \
+ COMPUTE_CDEF(args, FIELD "=" FIELD ",273.15,-,9,*,5,/,32,+", \
+ FIELD_AND_OBJECT(FIELD_FAHRENHEIT(field), object), \
+ FIELD_AND_OBJECT(field, object) \
+ ); \
+ VALUE_ALL(args, FIELD_FAHRENHEIT(field), object); \
+ } while (0)
+
#define COMPUTE_DIVIDE(args, fraction, object1, dividend, object2, divisor) \
do { \
COMPUTE_CDEF(args, FIELD "=" FIELD "," TOSTRING(divisor) ",/", \
/*
This draws a temperature graph
*/
-#define DRAW_TEMPERATURE_KELVIN(args, field, object, ...) \
+#define DRAW_TEMPERATURE(args, options, field, object, ...) \
+ do { \
+ switch (td_graph_temperature(options)) { \
+ case TD_GRAPH_TEMP_KELVIN: \
+ DRAW_TEMPERATURE_K(args, field, object, __VA_ARGS__); \
+ break; \
+ \
+ case TD_GRAPH_TEMP_CELSIUS: \
+ DRAW_TEMPERATURE_C(args, field, object, __VA_ARGS__); \
+ break; \
+ \
+ case TD_GRAPH_TEMP_FAHRENHEIT: \
+ DRAW_TEMPERATURE_F(args, field, object, __VA_ARGS__); \
+ break; \
+ } \
+ } while (0)
+
+#define DRAW_TEMPERATURE_K(args, field, object, ...) \
do { \
DRAW_LINE_WITH_LABEL(args, 1, field, object, COLOR_TEMPERATURE, 0, ##__VA_ARGS__); \
PRINT_CAMM(args, field, object, KELVIN); \
} while (0)
+#define DRAW_TEMPERATURE_C(args, field, object, ...) \
+ do { \
+ COMPUTE_CELSIUS(args, field, object); \
+ DRAW_LINE_WITH_LABEL(args, 1, FIELD_CELSIUS(field), object, COLOR_TEMPERATURE, 0, ##__VA_ARGS__); \
+ PRINT_CAMM(args, FIELD_CELSIUS(field), object, CELSIUS); \
+ } while (0)
+
+#define DRAW_TEMPERATURE_F(args, field, object, ...) \
+ do { \
+ COMPUTE_FAHRENHEIT(args, field, object); \
+ DRAW_LINE_WITH_LABEL(args, 1, FIELD_FAHRENHEIT(field), object, COLOR_TEMPERATURE, 0, ##__VA_ARGS__); \
+ PRINT_CAMM(args, FIELD_FAHRENHEIT(field), object, FAHRENHEIT); \
+ } while (0)
+
#endif /* TELEMETRY_GRAPHS_GRAPH_H */