multi_converter_units.h 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. #pragma once
  2. #include <input/input.h>
  3. #include <gui/gui.h>
  4. #include "multi_converter_definitions.h"
  5. #define MULTI_CONVERTER_AVAILABLE_UNITS 14
  6. #define multi_converter_get_unit(unit_type) multi_converter_available_units[unit_type]
  7. #define multi_converter_get_unit_type_offset(unit_type, offset) \
  8. (((unit_type + offset) % MULTI_CONVERTER_AVAILABLE_UNITS + MULTI_CONVERTER_AVAILABLE_UNITS) % \
  9. MULTI_CONVERTER_AVAILABLE_UNITS)
  10. // the modulo operation will fail with extremely large values on the units array
  11. // DEC / HEX / BIN
  12. void multi_converter_unit_dec_hex_bin_convert(MultiConverterState* const multi_converter_state);
  13. uint8_t multi_converter_unit_dec_hex_bin_allowed(MultiConverterUnitType);
  14. // CEL / FAR / KEL
  15. void multi_converter_unit_temperature_convert(MultiConverterState* const multi_converter_state);
  16. uint8_t multi_converter_unit_temperature_allowed(MultiConverterUnitType);
  17. // KM / M / CM / MILES / FEET / INCHES
  18. void multi_converter_unit_distance_convert(MultiConverterState* const multi_converter_state);
  19. uint8_t multi_converter_unit_distance_allowed(MultiConverterUnitType);
  20. // DEG / RAD
  21. void multi_converter_unit_angle_convert(MultiConverterState* const multi_converter_state);
  22. uint8_t multi_converter_unit_angle_allowed(MultiConverterUnitType unit_type);
  23. //
  24. // each unit is made of comma? + negative? + keyboard_length + mini_name + name + convert function + allowed function
  25. // (setting functions as NULL will cause convert / select options to be ignored)
  26. //
  27. static const MultiConverterUnit multi_converter_unit_dec = {
  28. 0,
  29. 0,
  30. 10,
  31. "DEC\0",
  32. "Decimal\0",
  33. multi_converter_unit_dec_hex_bin_convert,
  34. multi_converter_unit_dec_hex_bin_allowed};
  35. static const MultiConverterUnit multi_converter_unit_hex = {
  36. 0,
  37. 0,
  38. 16,
  39. "HEX\0",
  40. "Hexadecimal\0",
  41. multi_converter_unit_dec_hex_bin_convert,
  42. multi_converter_unit_dec_hex_bin_allowed};
  43. static const MultiConverterUnit multi_converter_unit_bin = {
  44. 0,
  45. 0,
  46. 2,
  47. "BIN\0",
  48. "Binary\0",
  49. multi_converter_unit_dec_hex_bin_convert,
  50. multi_converter_unit_dec_hex_bin_allowed};
  51. static const MultiConverterUnit multi_converter_unit_cel = {
  52. 1,
  53. 1,
  54. 10,
  55. "CEL\0",
  56. "Celsius\0",
  57. multi_converter_unit_temperature_convert,
  58. multi_converter_unit_temperature_allowed};
  59. static const MultiConverterUnit multi_converter_unit_far = {
  60. 1,
  61. 1,
  62. 10,
  63. "FAR\0",
  64. "Fahernheit\0",
  65. multi_converter_unit_temperature_convert,
  66. multi_converter_unit_temperature_allowed};
  67. static const MultiConverterUnit multi_converter_unit_kel = {
  68. 1,
  69. 1,
  70. 10,
  71. "KEL\0",
  72. "Kelvin\0",
  73. multi_converter_unit_temperature_convert,
  74. multi_converter_unit_temperature_allowed};
  75. static const MultiConverterUnit multi_converter_unit_km = {
  76. 1,
  77. 0,
  78. 10,
  79. "KM\0",
  80. "Kilometers\0",
  81. multi_converter_unit_distance_convert,
  82. multi_converter_unit_distance_allowed};
  83. static const MultiConverterUnit multi_converter_unit_m = {
  84. 1,
  85. 0,
  86. 10,
  87. "M\0",
  88. "Meters\0",
  89. multi_converter_unit_distance_convert,
  90. multi_converter_unit_distance_allowed};
  91. static const MultiConverterUnit multi_converter_unit_cm = {
  92. 1,
  93. 0,
  94. 10,
  95. "CM\0",
  96. "Centimeters\0",
  97. multi_converter_unit_distance_convert,
  98. multi_converter_unit_distance_allowed};
  99. static const MultiConverterUnit multi_converter_unit_mi = {
  100. 1,
  101. 0,
  102. 10,
  103. "MI\0",
  104. "Miles\0",
  105. multi_converter_unit_distance_convert,
  106. multi_converter_unit_distance_allowed};
  107. static const MultiConverterUnit multi_converter_unit_ft = {
  108. 1,
  109. 0,
  110. 10,
  111. "FT\0",
  112. "Feet\0",
  113. multi_converter_unit_distance_convert,
  114. multi_converter_unit_distance_allowed};
  115. static const MultiConverterUnit multi_converter_unit_in = {
  116. 1,
  117. 0,
  118. 10,
  119. " \"\0",
  120. "Inches\0",
  121. multi_converter_unit_distance_convert,
  122. multi_converter_unit_distance_allowed};
  123. static const MultiConverterUnit multi_converter_unit_deg = {
  124. 1,
  125. 0,
  126. 10,
  127. "DEG\0",
  128. "Degree\0",
  129. multi_converter_unit_angle_convert,
  130. multi_converter_unit_angle_allowed};
  131. static const MultiConverterUnit multi_converter_unit_rad = {
  132. 1,
  133. 0,
  134. 10,
  135. "RAD\0",
  136. "Radian\0",
  137. multi_converter_unit_angle_convert,
  138. multi_converter_unit_angle_allowed};
  139. // index order set by the MultiConverterUnitType enum element (multi_converter_definitions.h)
  140. static const MultiConverterUnit multi_converter_available_units[MULTI_CONVERTER_AVAILABLE_UNITS] = {
  141. [UnitTypeDec] = multi_converter_unit_dec,
  142. [UnitTypeHex] = multi_converter_unit_hex,
  143. [UnitTypeBin] = multi_converter_unit_bin,
  144. [UnitTypeCelsius] = multi_converter_unit_cel,
  145. [UnitTypeFahernheit] = multi_converter_unit_far,
  146. [UnitTypeKelvin] = multi_converter_unit_kel,
  147. [UnitTypeKilometers] = multi_converter_unit_km,
  148. [UnitTypeMeters] = multi_converter_unit_m,
  149. [UnitTypeCentimeters] = multi_converter_unit_cm,
  150. [UnitTypeMiles] = multi_converter_unit_mi,
  151. [UnitTypeFeet] = multi_converter_unit_ft,
  152. [UnitTypeInches] = multi_converter_unit_in,
  153. [UnitTypeDegree] = multi_converter_unit_deg,
  154. [UnitTypeRadian] = multi_converter_unit_rad,
  155. };