#pragma once #define MULTI_CONVERTER_NUMBER_DIGITS 9 typedef enum { EventTypeKey, } EventType; typedef struct { InputEvent input; EventType type; } MultiConverterEvent; typedef enum { ModeDisplay, ModeSelector, } MultiConverterMode; typedef enum { None, Reset, Convert, } MultiConverterModeTrigger; // new units goes here, used as index to the main multi_converter_available_units array (multi_converter_units.h) typedef enum { UnitTypeDec, UnitTypeHex, UnitTypeBin, UnitTypeCelsius, UnitTypeFahernheit, UnitTypeKelvin, UnitTypeKilometers, UnitTypeMeters, UnitTypeCentimeters, UnitTypeMiles, UnitTypeFeet, UnitTypeInches, UnitTypeDegree, UnitTypeRadian, } MultiConverterUnitType; typedef struct { MultiConverterUnitType selected_unit_type_orig; MultiConverterUnitType selected_unit_type_dest; uint8_t select_orig; } MultiConverterModeSelect; typedef struct { uint8_t cursor; // cursor position when typing int8_t key; // hover key uint8_t comma; // comma already added? (only one comma allowed) uint8_t negative; // is negative? } MultiConverterModeDisplay; typedef struct MultiConverterUnit MultiConverterUnit; typedef struct MultiConverterState MultiConverterState; struct MultiConverterUnit { uint8_t allow_comma; uint8_t allow_negative; uint8_t max_number_keys; char mini_name[4]; char name[12]; void (*convert_function)(MultiConverterState * const); uint8_t (*allowed_function)(MultiConverterUnitType); }; struct MultiConverterState { char buffer_orig[MULTI_CONVERTER_NUMBER_DIGITS + 1]; char buffer_dest[MULTI_CONVERTER_NUMBER_DIGITS + 1]; MultiConverterUnitType unit_type_orig; MultiConverterUnitType unit_type_dest; MultiConverterMode mode; MultiConverterModeDisplay display; MultiConverterModeSelect select; uint8_t keyboard_lock; // used to create a small lock when switching from SELECT to DISPLAY modes // (debouncing, basically; otherwise it switch modes twice 'cause it's too fast!) };