/* * Copyright 2023 Ingemar Hedvall * SPDX-License-Identifier: MIT */ #include "a2l/a2lenums.h" #include namespace { template T StringToEnum(const std::string& text, const std::array, S>& list) { auto type = T::UNKNOWN; for (const auto& [idx_text, idx_type] : list) { if (idx_text == text) { type = idx_type; break; } } return type; } template std::string_view EnumToString(T type, const std::array, S>& list) { for (const auto& [idx_text, idx_type] : list) { if (idx_type == type) { return idx_text; } } return "UNKNOWN"; } template a2l::EnumStringList EnumToStringList( const std::array, S>& list) { a2l::EnumStringList enum_list; const auto end_type = T::UNKNOWN; for (const auto& [idx_text, idx_type] : list) { if (idx_type == end_type) { break; } enum_list.emplace_back(idx_text); } return enum_list; } } // end namespace namespace a2l { /*------------- ADDRESS TYPE ---------------------------*/ using StringAddressType = std::pair; constexpr std::array kAddressTypeList = { StringAddressType("PBYTE", A2lAddressType::PBYTE), StringAddressType("PWORD", A2lAddressType::PWORD), StringAddressType("PLONG", A2lAddressType::PLONG), StringAddressType("PLONGLONG", A2lAddressType::PLONGLONG), StringAddressType("DIRECT", A2lAddressType::DIRECT) }; A2lAddressType StringToAddressType(const std::string& text) { return StringToEnum(text, kAddressTypeList); } std::string_view AddressTypeToString(A2lAddressType type) { return EnumToString(type, kAddressTypeList); } EnumStringList AddressTypeToStringList() { return EnumToStringList(kAddressTypeList); } /* ----------------AXIS TYPE ------------------------*/ using StringAxisType = std::pair; constexpr std::array kAxisTypeList = { StringAxisType("CURVE_AXIS", A2lAxisType::CURVE_AXIS), StringAxisType("COM_AXIS", A2lAxisType::COM_AXIS), StringAxisType("FIX_AXIS", A2lAxisType::FIX_AXIS), StringAxisType("RES_AXIS", A2lAxisType::RES_AXIS), StringAxisType("STD_AXIS", A2lAxisType::STD_AXIS) }; A2lAxisType StringToAxisType(const std::string& text) { return StringToEnum(text, kAxisTypeList); } std::string_view AxisTypeToString(A2lAxisType type) { return EnumToString(type, kAxisTypeList); } EnumStringList AxisTypeToStringList() { return EnumToStringList(kAxisTypeList); } /*----------------- BYTE ORDER -------------------------*/ using StringByteOrder = std::pair; constexpr std::array kByteOrderList = { StringByteOrder("MSB_FIRST", A2lByteOrder::MSB_FIRST), StringByteOrder("MSB_LAST", A2lByteOrder::MSB_LAST), StringByteOrder("MSB_FIRST_MSW_LAST", A2lByteOrder::MSB_FIRST_MSW_LAST), StringByteOrder("MSB_LAST_MSW_FIRST", A2lByteOrder::MSB_LAST_MSW_FIRST) }; A2lByteOrder StringToByteOrder(const std::string& text) { return StringToEnum(text, kByteOrderList); } std::string_view ByteOrderToString(A2lByteOrder type) { return EnumToString(type, kByteOrderList); } EnumStringList ByteOrderToStringList() { return EnumToStringList(kByteOrderList); } /*--------------- CALIBRATION ACCESS ---------------------*/ using StringCalibrationAccess = std::pair; constexpr std::array kCalibrationAccessList = { StringCalibrationAccess("CALIBRATION", A2lCalibrationAccess::CALIBRATION), StringCalibrationAccess("NO_CALIBRATION", A2lCalibrationAccess::NO_CALIBRATION), StringCalibrationAccess("NOT_IN_MCD_SYSTEM", A2lCalibrationAccess::NOT_IN_MCD_SYSTEM), StringCalibrationAccess("OFFLINE_CALIBRATION", A2lCalibrationAccess::OFFLINE_CALIBRATION) }; A2lCalibrationAccess StringToCalibrationAccess(const std::string& text) { return StringToEnum(text, kCalibrationAccessList); } std::string_view CalibrationAccessToString(A2lCalibrationAccess access) { return EnumToString(access, kCalibrationAccessList); } EnumStringList CalibrationAccessToStringList() { return EnumToStringList(kCalibrationAccessList); } /*----------------- CHARACTERISTIC TYPE -----------------------------*/ using StringCharacteristicType= std::pair; constexpr std::array kCharacteristicTypeList = { StringCharacteristicType("ASCII", A2lCharacteristicType::ASCII), StringCharacteristicType("CURVE", A2lCharacteristicType::CURVE), StringCharacteristicType("MAP", A2lCharacteristicType::MAP), StringCharacteristicType("CUBOID", A2lCharacteristicType::CUBOID), StringCharacteristicType("CUBE_4", A2lCharacteristicType::CUBE_4), StringCharacteristicType("CUBE_5", A2lCharacteristicType::CUBE_5), StringCharacteristicType("VAL_BLK", A2lCharacteristicType::VAL_BLK), StringCharacteristicType("VALUE", A2lCharacteristicType::VALUE), }; A2lCharacteristicType StringToCharacteristicType(const std::string& text) { return StringToEnum(text, kCharacteristicTypeList); } std::string_view CharacteristicTypeToString(A2lCharacteristicType type) { return EnumToString(type, kCharacteristicTypeList); } EnumStringList CharacteristicTypeToStringList() { return EnumToStringList(kCharacteristicTypeList); } /*---------------------- CONVERSION TYPE ------------------------*/ using StringConversionType = std::pair; constexpr std::array kConversionTypeList = { StringConversionType("IDENTICAL", A2lConversionType::IDENTICAL), StringConversionType("FORM", A2lConversionType::FORM), StringConversionType("LINEAR", A2lConversionType::LINEAR), StringConversionType("RAT_FUNC", A2lConversionType::RAT_FUNC), StringConversionType("TAB_INP", A2lConversionType::TAB_INP), StringConversionType("TAB_NOINTP", A2lConversionType::TAB_NOINTP), StringConversionType("TAB_VERB", A2lConversionType::TAB_VERB), }; A2lConversionType StringToConversionType(const std::string& text) { return StringToEnum(text, kConversionTypeList); } std::string_view ConversionTypeToString(A2lConversionType type) { return EnumToString(type, kConversionTypeList); } EnumStringList ConversionTypeToStringList() { return EnumToStringList(kConversionTypeList); } /*-------------- DAtA TYPE --------------------------*/ using StringDataType = std::pair; constexpr std::array kDataTypeList = { StringDataType("UBYTE", A2lDataType::UBYTE), StringDataType("SBYTE", A2lDataType::SBYTE), StringDataType("UWORD", A2lDataType::UWORD), StringDataType("SWORD", A2lDataType::SWORD), StringDataType("ULONG", A2lDataType::ULONG), StringDataType("SLONG", A2lDataType::SLONG), StringDataType("A_UINT64", A2lDataType::A_UINT64), StringDataType("A_INT64", A2lDataType::A_INT64), StringDataType("FLOAT16_IEEE", A2lDataType::FLOAT16_IEEE), StringDataType("FLOAT32_IEEE", A2lDataType::FLOAT32_IEEE), StringDataType("FLOAT64_IEEE", A2lDataType::FLOAT64_IEEE), }; A2lDataType StringToDataType(const std::string& text) { return StringToEnum(text, kDataTypeList); } std::string_view DataTypeToString(A2lDataType type) { return EnumToString(type, kDataTypeList); } EnumStringList DataTypeToStringList() { return EnumToStringList(kDataTypeList); } /*--------------- DEPOSIT ---------------------*/ using StringDeposit = std::pair; constexpr std::array kDepositList = { StringDeposit("ABSOLUTE", A2lDeposit::A2L_ABSOLUTE), StringDeposit("DIFFERENCE", A2lDeposit::A2L_DIFFERENCE) }; A2lDeposit StringToDeposit(const std::string& text) { return StringToEnum(text, kDepositList); } std::string_view DepositToString(A2lDeposit deposit) { return EnumToString(deposit, kDepositList); } EnumStringList DepositToStringList() { return EnumToStringList(kDepositList); } /*----------------- ENCODING ---------------------------*/ using StringEncoding = std::pair; constexpr std::array kEncodingList = { StringEncoding("", A2lEncoding::ASCII), StringEncoding("UTF8", A2lEncoding::UTF8), StringEncoding("UTF16", A2lEncoding::UTF16), StringEncoding("UTF32", A2lEncoding::UTF32) }; A2lEncoding StringToEncoding(const std::string& text) { return StringToEnum(text, kEncodingList); } std::string_view EncodingToString(A2lEncoding encoding) { return EnumToString(encoding, kEncodingList); } EnumStringList EncodingToStringList() { return EnumToStringList(kEncodingList); } /*----------------------- INDEX MODE --------------------*/ using StringIndexMode = std::pair; constexpr std::array kIndexModeList = { StringIndexMode("ALTERNATE_CURVES", A2lIndexMode::ALTERNATE_CURVES), StringIndexMode("ALTERNATE_WITH_X", A2lIndexMode::ALTERNATE_WITH_X), StringIndexMode("ALTERNATE_WITH_Y", A2lIndexMode::ALTERNATE_WITH_Y), StringIndexMode("COLUMN_DIR", A2lIndexMode::COLUMN_DIR), StringIndexMode("ROW_DIR", A2lIndexMode::ROW_DIR) }; A2lIndexMode StringToIndexMode(const std::string& text) { return StringToEnum(text, kIndexModeList); } std::string_view IndexModeToString(A2lIndexMode mode) { return EnumToString(mode, kIndexModeList); } EnumStringList IndexModeToStringList() { return EnumToStringList(kIndexModeList); } /*----------------- INDEX ORDER --------------------------*/ using StringIndexOrder = std::pair; constexpr std::array kIndexOrderList = { StringIndexOrder("INDEX_INCR", A2lIndexOrder::INDEX_INCR), StringIndexOrder("INDEX_DECR", A2lIndexOrder::INDEX_DECR) }; A2lIndexOrder StringToIndexOrder(const std::string& text) { return StringToEnum(text, kIndexOrderList); } std::string_view IndexOrderToString(A2lIndexOrder order) { return EnumToString(order, kIndexOrderList); } EnumStringList IndexOrderToStringList() { return EnumToStringList(kIndexOrderList); } /*------------------ LAYOUT -----------------------------*/ using StringLayout = std::pair; constexpr std::array kLayoutList = { StringLayout("ROW_DIR", A2lLayout::ROW_DIR), StringLayout("COLUMN_DIR", A2lLayout::COLUMN_DIR) }; A2lLayout StringToLayout(const std::string& text) { return StringToEnum(text, kLayoutList); } std::string_view LayoutToString(A2lLayout layout) { return EnumToString(layout, kLayoutList); } EnumStringList LayoutToStringList() { return EnumToStringList(kLayoutList); } /*------------------- MEMORY TYPE ------------------------*/ using StringMemoryType = std::pair; constexpr std::array kMemoryList = { StringMemoryType("EEPROM", A2lMemoryType::EEPROM), StringMemoryType("EPROM", A2lMemoryType::EPROM), StringMemoryType("FLASH", A2lMemoryType::FLASH), StringMemoryType("RAM", A2lMemoryType::RAM), StringMemoryType("ROM", A2lMemoryType::ROM), StringMemoryType("REGISTER", A2lMemoryType::REGISTER), StringMemoryType("NOT_IN_ECU", A2lMemoryType::NOT_IN_ECU), }; A2lMemoryType StringToMemoryType(const std::string& text) { return StringToEnum(text, kMemoryList); } std::string_view MemoryTypeToString(A2lMemoryType type) { return EnumToString(type, kMemoryList); } EnumStringList MemoryTypeToStringList() { return EnumToStringList(kMemoryList); } /*------------ MEMORY ATTRIBUTE -------------------------*/ using StringMemoryAttribute = std::pair; constexpr std::array kAttributeList = { StringMemoryAttribute("INTERN", A2lMemoryAttribute::INTERN), StringMemoryAttribute("EXTERN", A2lMemoryAttribute::EXTERN), }; A2lMemoryAttribute StringToMemoryAttribute(const std::string& text) { return StringToEnum(text, kAttributeList); } std::string_view MemoryAttributeToString(A2lMemoryAttribute attr) { return EnumToString(attr, kAttributeList); } EnumStringList MemoryAttributeToStringList() { return EnumToStringList(kAttributeList); } /*-------------------------- MONOTONY -------------------------*/ using StringMonotony = std::pair; constexpr std::array kMonotonyList = { StringMonotony("MON_DECREASE", A2lMonotony::MON_DECREASE), StringMonotony("MON_INCREASE", A2lMonotony::MON_INCREASE), StringMonotony("STRICT_DECREASE", A2lMonotony::STRICT_DECREASE), StringMonotony("STRICT_INCREASE", A2lMonotony::STRICT_INCREASE), StringMonotony("MONOTONOUS", A2lMonotony::MONOTONOUS), StringMonotony("STRICT_MON", A2lMonotony::STRICT_MON), StringMonotony("NOT_MON", A2lMonotony::NOT_MON), }; A2lMonotony StringToMonotony(const std::string& text) { return StringToEnum(text, kMonotonyList); } std::string_view MonotonyToString(A2lMonotony type) { return EnumToString(type, kMonotonyList); } EnumStringList MonotonyToStringList() { return EnumToStringList(kMonotonyList); } /*------------------ PRG TYPE -----------------------------*/ using StringPrgType = std::pair; constexpr std::array kPrgList = { std::pair("PRG_CODE", A2lPrgType::PRG_CODE), std::pair("PRG_DATA", A2lPrgType::PRG_DATA), std::pair("PRG_RESERVED", A2lPrgType::PRG_RESERVED), }; A2lPrgType StringToPrgType(const std::string& text) { return StringToEnum(text, kPrgList); } std::string_view PrgTypeToString(A2lPrgType type) { return EnumToString(type, kPrgList); } EnumStringList PrgTypeToStringList() { return EnumToStringList(kPrgList); } /*----------------- SEGMENT TYPE -----------------------*/ using StringSegmentType = std::pair; constexpr std::array kSegmentList = { std::pair("CALIBRATION_VARIABLES", A2lSegmentType::CALIBRATION_VARIABLES), std::pair("CODE", A2lSegmentType::CODE), std::pair("DATA", A2lSegmentType::DATA), std::pair("EXCLUDE_FROM_FLASH", A2lSegmentType::EXCLUDE_FROM_FLASH), std::pair("OFFLINE_DATA", A2lSegmentType::OFFLINE_DATA), std::pair("RESERVED", A2lSegmentType::RESERVED), std::pair("SERAM", A2lSegmentType::SERAM), std::pair("VARIABLES", A2lSegmentType::VARIABLES), }; A2lSegmentType StringToSegmentType(const std::string& text) { return StringToEnum(text, kSegmentList); } std::string_view SegmentTypeToString(A2lSegmentType type) { return EnumToString(type, kSegmentList); } EnumStringList SegmentTypeToStringList() { return EnumToStringList(kSegmentList); } /*------------------- TRIGGER ------------------------------*/ using StringTrigger = std::pair; constexpr std::array kTriggerList = { std::pair("ON_CHANGE", A2lTrigger::ON_CHANGE), std::pair("ON_USER_REQUEST", A2lTrigger::ON_USER_REQUEST), }; A2lTrigger StringToTrigger(const std::string& text) { return StringToEnum(text, kTriggerList); } std::string_view TriggerToString(A2lTrigger trigger) { return EnumToString(trigger, kTriggerList); } EnumStringList TriggerToStringList() { return EnumToStringList(kTriggerList); } /*------------------ TYPEDEF TYPE ---------------------*/ using StringTypedef = std::pair; constexpr std::array kTypedefList = { std::pair("TYPEDEF_AXIS", A2lTypedefType::TYPEDEF_AXIS), std::pair("TYPEDEF_BLOB", A2lTypedefType::TYPEDEF_BLOB), std::pair("TYPEDEF_CHARACTERISTIC", A2lTypedefType::TYPEDEF_CHARACTERISTIC), std::pair("TYPEDEF_MEASUREMENT", A2lTypedefType::TYPEDEF_MEASUREMENT), std::pair("TYPEDEF_STRUCTURE", A2lTypedefType::TYPEDEF_STRUCTURE), }; A2lTypedefType StringToTypedefType(const std::string& text) { return StringToEnum(text, kTypedefList); } std::string_view TypedefTypeToString(A2lTypedefType type) { return EnumToString(type, kTypedefList); } EnumStringList TypedefTypeToStringList() { return EnumToStringList(kTypedefList); } /*------------------- UNIT TYPE ----------------------*/ using StringUnit = std::pair; constexpr std::array kUnitList = { std::pair("DERIVED", A2lUnitType::DERIVED), std::pair("EXTENDED_SI", A2lUnitType::EXTENDED_SI), }; A2lUnitType StringToUnitType(const std::string& text) { return StringToEnum(text, kUnitList); } std::string_view UnitTypeToString(A2lUnitType type) { return EnumToString(type, kUnitList); } EnumStringList UnitTypeToStringList() { return EnumToStringList(kUnitList); } }