Vehicle Control Unit 0.01
This is the c library for controlling the car.
Loading...
Searching...
No Matches
Units.c
Go to the documentation of this file.
1#include "../../Inc/Utils/Units.h"
2#include "../../Inc/Utils/MessageFormat.h"
3#include <string.h>
4#include <math.h>
5
7 // Voltage units
8 [UNIT_VOLTS] = {"Volts", "Volts", UNIT_TYPE_FLOAT, UNIT_CATEGORY_VOLTAGE,
9 -1000.0f, 1000.0f, -50.0f, 50.0f, 3, 1.0f},
10 [UNIT_MILLIVOLTS] = {"Millivolts", "Millivolts", UNIT_TYPE_FLOAT, UNIT_CATEGORY_VOLTAGE,
11 -1000000.0f, 1000000.0f, -50000.0f, 50000.0f, 1, 0.001f},
12
13 // Current units
14 [UNIT_AMPERES] = {"Amperes", "Amperes", UNIT_TYPE_FLOAT, UNIT_CATEGORY_CURRENT,
15 -1000.0f, 1000.0f, -100.0f, 100.0f, 3, 1.0f},
16 [UNIT_MILLIAMPERES] = {"Milliamperes", "Milliamperes", UNIT_TYPE_FLOAT, UNIT_CATEGORY_CURRENT,
17 -1000000.0f, 1000000.0f, -100000.0f, 100000.0f, 1, 0.001f},
18
19 // Pressure units
21 -1.0f, 10000.0f, 0.0f, 3000.0f, 1, 6894.76f}, // Scale to Pascal
23 -1.0f, 1000.0f, 0.0f, 300.0f, 2, 100000.0f}, // Scale to Pascal
25 -1.0f, 100000000.0f, 0.0f, 30000000.0f, 0, 1.0f},
26
27 // Temperature units
29 -273.15f, 3000.0f, -50.0f, 200.0f, 1, 1.0f},
31 -459.67f, 5432.0f, -58.0f, 392.0f, 1, 1.0f},
33 0.0f, 3273.15f, 223.15f, 473.15f, 2, 1.0f},
34
35 // Position/angle units
37 -1000.0f, 1000.0f, 0.0f, 100.0f, 1, 1.0f},
39 -3600.0f, 3600.0f, -180.0f, 180.0f, 1, 0.017453f}, // Scale to radians
41 -62.83f, 62.83f, -3.14159f, 3.14159f, 3, 1.0f},
42
43 // Speed units
44 [UNIT_RPM] = {"RPM", "RPM", UNIT_TYPE_FLOAT, UNIT_CATEGORY_SPEED,
45 0.0f, 50000.0f, 0.0f, 10000.0f, 0, 0.10472f}, // Scale to rad/s
47 0.0f, 1000000.0f, 0.0f, 10000.0f, 2, 1.0f},
48 [UNIT_KMH] = {"km/h", "KMH", UNIT_TYPE_FLOAT, UNIT_CATEGORY_SPEED,
49 0.0f, 1000.0f, 0.0f, 300.0f, 1, 0.27778f}, // Scale to m/s
50 [UNIT_MPH] = {"mph", "MPH", UNIT_TYPE_FLOAT, UNIT_CATEGORY_SPEED,
51 0.0f, 600.0f, 0.0f, 200.0f, 1, 0.44704f}, // Scale to m/s
52
53 // Time units
54 [UNIT_SECONDS] = {"s", "Seconds", UNIT_TYPE_FLOAT, UNIT_CATEGORY_TIME,
55 0.0f, 86400.0f, 0.0f, 3600.0f, 3, 1.0f},
56 [UNIT_MILLISECONDS] = {"ms", "Milliseconds", UNIT_TYPE_UINT32, UNIT_CATEGORY_TIME,
57 0.0f, 86400000.0f, 0.0f, 10000.0f, 0, 0.001f},
58 [UNIT_MICROSECONDS] = {"μs", "Microseconds", UNIT_TYPE_UINT32, UNIT_CATEGORY_TIME,
59 0.0f, 86400000000.0f, 0.0f, 10000000.0f, 0, 0.000001f},
60
61 // Status units
62 [UNIT_BOOLEAN] = {"bool", "Boolean", UNIT_TYPE_BOOL, UNIT_CATEGORY_STATUS,
63 0.0f, 1.0f, 0.0f, 1.0f, 0, 1.0f},
64 [UNIT_ENUM] = {"enum", "Enum", UNIT_TYPE_UINT16, UNIT_CATEGORY_STATUS,
65 0.0f, 65535.0f, 0.0f, 100.0f, 0, 1.0f},
66
67 // Additional units
69 0.0f, 100.0f, 0.0f, 100.0f, 1, 1.0f},
71 -1000000.0f, 1000000.0f, -1000.0f, 1000.0f, 3, 1.0f}
72};
73
74void initUnits(void) {
75 sendMessage("Units", MSG_DEBUG, "Units system initialized with %d unit types", UNIT_COUNT);
76}
77
79 if (unit_id >= UNIT_COUNT) {
80 return &unit_definitions[UNIT_DIMENSIONLESS]; // Fallback
81 }
82 return &unit_definitions[unit_id];
83}
84
85UnitId getUnitIdBySymbol(const char* symbol) {
86 for (UnitId i = 0; i < UNIT_COUNT; i++) {
87 if (strcmp(unit_definitions[i].symbol, symbol) == 0) {
88 return i;
89 }
90 }
91 return UNIT_DIMENSIONLESS; // Fallback
92}
93
94bool validateUnitValue(UnitId unit_id, float value) {
95 const UnitDefinition* unit = getUnitDefinition(unit_id);
96 return (value >= unit->absolute_min && value <= unit->absolute_max);
97}
98
99float convertUnits(float value, UnitId from_unit, UnitId to_unit) {
100 const UnitDefinition* from_def = getUnitDefinition(from_unit);
101 const UnitDefinition* to_def = getUnitDefinition(to_unit);
102
103 // Only convert within same category
104 if (from_def->category != to_def->category) {
105 return value; // No conversion possible
106 }
107
108 // Convert to base unit, then to target unit
109 float base_value = value * from_def->scale_factor;
110 return base_value / to_def->scale_factor;
111}
@ MSG_DEBUG
Definition: MessageFormat.h:14
void sendMessage(const char *sender, MessageType type, const char *format,...)
Definition: MessageFormat.c:5
bool validateUnitValue(UnitId unit_id, float value)
Definition: Units.c:94
const UnitDefinition * getUnitDefinition(UnitId unit_id)
Definition: Units.c:78
static const UnitDefinition unit_definitions[UNIT_COUNT]
Definition: Units.c:6
float convertUnits(float value, UnitId from_unit, UnitId to_unit)
Definition: Units.c:99
UnitId getUnitIdBySymbol(const char *symbol)
Definition: Units.c:85
void initUnits(void)
Definition: Units.c:74
@ UNIT_TYPE_UINT16
Definition: Units.h:11
@ UNIT_TYPE_UINT32
Definition: Units.h:12
@ UNIT_TYPE_BOOL
Definition: Units.h:13
@ UNIT_TYPE_FLOAT
Definition: Units.h:8
@ UNIT_CATEGORY_STATUS
Definition: Units.h:27
@ UNIT_CATEGORY_FREQUENCY
Definition: Units.h:25
@ UNIT_CATEGORY_TIME
Definition: Units.h:24
@ UNIT_CATEGORY_TEMPERATURE
Definition: Units.h:21
@ UNIT_CATEGORY_DIMENSIONLESS
Definition: Units.h:26
@ UNIT_CATEGORY_PRESSURE
Definition: Units.h:20
@ UNIT_CATEGORY_POSITION
Definition: Units.h:22
@ UNIT_CATEGORY_SPEED
Definition: Units.h:23
@ UNIT_CATEGORY_VOLTAGE
Definition: Units.h:18
@ UNIT_CATEGORY_CURRENT
Definition: Units.h:19
UnitId
Definition: Units.h:44
@ UNIT_DEGREES
Definition: Units.h:56
@ UNIT_AMPERES
Definition: Units.h:47
@ UNIT_PERCENT
Definition: Units.h:55
@ UNIT_PSI
Definition: Units.h:49
@ UNIT_MILLIVOLTS
Definition: Units.h:46
@ UNIT_CELSIUS
Definition: Units.h:52
@ UNIT_MICROSECONDS
Definition: Units.h:65
@ UNIT_FAHRENHEIT
Definition: Units.h:53
@ UNIT_VOLTS
Definition: Units.h:45
@ UNIT_COUNT
Definition: Units.h:70
@ UNIT_PASCAL
Definition: Units.h:51
@ UNIT_DIMENSIONLESS
Definition: Units.h:69
@ UNIT_MILLIAMPERES
Definition: Units.h:48
@ UNIT_SECONDS
Definition: Units.h:63
@ UNIT_ENUM
Definition: Units.h:67
@ UNIT_BOOLEAN
Definition: Units.h:66
@ UNIT_RADIANS
Definition: Units.h:57
@ UNIT_HZ
Definition: Units.h:59
@ UNIT_KELVIN
Definition: Units.h:54
@ UNIT_MPH
Definition: Units.h:61
@ UNIT_MILLISECONDS
Definition: Units.h:64
@ UNIT_PERCENTAGE
Definition: Units.h:68
@ UNIT_KMH
Definition: Units.h:60
@ UNIT_BAR
Definition: Units.h:50
@ UNIT_RPM
Definition: Units.h:58
float absolute_min
Definition: Units.h:35
float scale_factor
Definition: Units.h:40
UnitCategory category
Definition: Units.h:34