From ae20412ee7ff0bcfc46aed504b680341ec37fa99 Mon Sep 17 00:00:00 2001 From: jas <1790731762@qq.com> Date: Thu, 14 Dec 2023 01:16:01 +0800 Subject: [PATCH] =?UTF-8?q?[zhoulongyu]:=20=E5=AE=8C=E6=88=90=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E5=BA=93=E7=9A=84=20float=20=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- middleware/IpcConfig/include/IIpcConfig.h | 1 + middleware/IpcConfig/src/IpcConfig.cpp | 31 ++++++++++++----- middleware/IpcConfig/src/IpcConfig.h | 3 +- .../IpcConfig/src/IpcConfig_Test.cpp | 9 +++-- utils/Config/include/Config.h | 4 +++ utils/Config/src/Config.c | 15 ++++++++- utils/Config/src/ConfigImpl.c | 33 ++++++++++++++++--- 7 files changed, 80 insertions(+), 16 deletions(-) diff --git a/middleware/IpcConfig/include/IIpcConfig.h b/middleware/IpcConfig/include/IIpcConfig.h index 1f37241..81f211b 100644 --- a/middleware/IpcConfig/include/IIpcConfig.h +++ b/middleware/IpcConfig/include/IIpcConfig.h @@ -27,6 +27,7 @@ enum class IpcConfigKey TEST_LLONG, TEST_CHAR, TEST_BOOL, + TEST_FLOAT, TEST_DOUBLE, TEST_STRING, END diff --git a/middleware/IpcConfig/src/IpcConfig.cpp b/middleware/IpcConfig/src/IpcConfig.cpp index 2716fb6..d30494c 100644 --- a/middleware/IpcConfig/src/IpcConfig.cpp +++ b/middleware/IpcConfig/src/IpcConfig.cpp @@ -46,6 +46,10 @@ IpcConfig::IpcConfig() innerMapBool.insert(std::make_pair("test_bool", std::reference_wrapper(mAllData.testBool))); mCfgMapBool.insert(std::make_pair(IpcConfigKey::TEST_BOOL, innerMapBool)); + std::map> innerMapFloat; + innerMapFloat.insert(std::make_pair("test_float", std::reference_wrapper(mAllData.testFloat))); + mCfgMapFloat.insert(std::make_pair(IpcConfigKey::TEST_FLOAT, innerMapFloat)); + std::map> innerMapDouble; innerMapDouble.insert(std::make_pair("test_double", std::reference_wrapper(mAllData.testDouble))); mCfgMapDouble.insert(std::make_pair(IpcConfigKey::TEST_DOUBLE, innerMapDouble)); @@ -203,21 +207,23 @@ void IpcConfig::SetChar(const IpcConfigKey &key, const char &character) } const float IpcConfig::GetFloat(const IpcConfigKey &key) { - std::map>::iterator iter; + std::map>>::iterator iter; iter = mCfgMapFloat.find(key); - if (iter != mCfgMapFloat.end()) { - return iter->second; + if (iter != mCfgMapFloat.end() && CHECK_MAP(iter->second)) { + return iter->second.begin()->second; } LogError("Can't find the key.\n"); - constexpr float UNKNOWN_CONFIG = -1.0; + constexpr float UNKNOWN_CONFIG = -1.00; return UNKNOWN_CONFIG; } void IpcConfig::SetFloat(const IpcConfigKey &key, const float &value) { - std::map>::iterator iter; + std::map>>::iterator iter; iter = mCfgMapFloat.find(key); - if (iter != mCfgMapFloat.end()) { - iter->second.get() = value; + if (iter != mCfgMapFloat.end() && CHECK_MAP(iter->second)) { + iter->second.begin()->second.get() = value; + const char *name = iter->second.begin()->first.c_str(); // const std::strinbg --> const char * + ConfigSetFloat(mCfg, name, iter->second.begin()->second); mCfgChanged = CONFIG_HAS_CHANGED; } else { @@ -380,11 +386,20 @@ void IpcConfig::ReadAllConfigParameters(void) ConfigSetBool(mCfg, "test_bool", mAllData.testBool); } + StatusCode floatCode = ConfigGetFloat(mCfg, "test_float", &(mAllData.testFloat)); + if (StatusCodeEqual(floatCode, "CONFIG_CODE_PARAM_NOT_EXIST")) { + LogWarning("test_float doesn't exist, will make it as default.\n"); + mCfgChanged = CONFIG_HAS_CHANGED; + constexpr float DEFAULT_TEST_FLOAT_NUM = 1.123456; + mAllData.testFloat = DEFAULT_TEST_FLOAT_NUM; + ConfigSetFloat(mCfg, "test_float", mAllData.testFloat); + } + StatusCode doubleCode = ConfigGetDouble(mCfg, "test_double", &(mAllData.testDouble)); if (StatusCodeEqual(doubleCode, "CONFIG_CODE_PARAM_NOT_EXIST")) { LogWarning("test_double doesn't exist, will make it as default.\n"); mCfgChanged = CONFIG_HAS_CHANGED; - constexpr double DEFAULT_TEST_DOUBLE_NUM = 3.123456789; + constexpr double DEFAULT_TEST_DOUBLE_NUM = 3.123456; mAllData.testDouble = DEFAULT_TEST_DOUBLE_NUM; ConfigSetDouble(mCfg, "test_double", mAllData.testDouble); } diff --git a/middleware/IpcConfig/src/IpcConfig.h b/middleware/IpcConfig/src/IpcConfig.h index 70ed224..73008bb 100644 --- a/middleware/IpcConfig/src/IpcConfig.h +++ b/middleware/IpcConfig/src/IpcConfig.h @@ -31,6 +31,7 @@ typedef struct Config_s long long testLLong; char testChar; bool testBool; + float testFloat; double testDouble; CHAR_STRING testString; } Config_s; @@ -81,7 +82,7 @@ private: std::map>> mCfgMapLong; std::map>> mCfgMapLLong; std::map>> mCfgMapChar; - std::map> mCfgMapFloat; + std::map>> mCfgMapFloat; std::map>> mCfgMapDouble; std::map> mCfgMapLongDouble; std::map>> mCfgMapBool; diff --git a/test/middleware/IpcConfig/src/IpcConfig_Test.cpp b/test/middleware/IpcConfig/src/IpcConfig_Test.cpp index 5ef50af..eae0604 100644 --- a/test/middleware/IpcConfig/src/IpcConfig_Test.cpp +++ b/test/middleware/IpcConfig/src/IpcConfig_Test.cpp @@ -41,9 +41,14 @@ TEST(IpcConfigTest, Demo) const bool numBool = false; IIpcConfig::GetInstance()->SetBool(IpcConfigKey::TEST_BOOL, numBool); + float testFloat = IIpcConfig::GetInstance()->GetFloat(IpcConfigKey::TEST_FLOAT); + LogInfo("Get test_float = %lf\n", testFloat); + const float numFloat = 1.123456; + IIpcConfig::GetInstance()->SetFloat(IpcConfigKey::TEST_FLOAT, numFloat); + double testDouble = IIpcConfig::GetInstance()->GetDouble(IpcConfigKey::TEST_DOUBLE); - LogInfo("Get test_double = %le\n", testDouble); - const double numDouble = 2.123456789; + LogInfo("Get test_double = %lf\n", testDouble); + const double numDouble = 123456789.123456; IIpcConfig::GetInstance()->SetDouble(IpcConfigKey::TEST_DOUBLE, numDouble); const std::string testString = IIpcConfig::GetInstance()->GetString(IpcConfigKey::TEST_STRING); diff --git a/utils/Config/include/Config.h b/utils/Config/include/Config.h index b497759..81b64e8 100644 --- a/utils/Config/include/Config.h +++ b/utils/Config/include/Config.h @@ -38,6 +38,8 @@ typedef struct v_config const StatusCode (*set_char)(VConfig *, const char *, const char); const StatusCode (*get_bool)(VConfig *, const char *, bool *); const StatusCode (*set_bool)(VConfig *, const char *, const bool); + const StatusCode (*get_float)(VConfig *, const char *, float *); + const StatusCode (*set_float)(VConfig *, const char *, const float); const StatusCode (*get_double)(VConfig *, const char *, double *); const StatusCode (*set_double)(VConfig *, const char *, const double); const StatusCode (*get_string)(VConfig *, const char *, const char **); @@ -61,6 +63,8 @@ const StatusCode ConfigGetChar(VConfig *cfg, const char *name, char *value); const StatusCode ConfigSetChar(VConfig *cfg, const char *name, const char value); const StatusCode ConfigGetBool(VConfig *cfg, const char *name, bool *value); const StatusCode ConfigSetBool(VConfig *cfg, const char *name, const bool value); +const StatusCode ConfigGetFloat(VConfig *cfg, const char *name, float *value); +const StatusCode ConfigSetFloat(VConfig *cfg, const char *name, const float value); const StatusCode ConfigGetDouble(VConfig *cfg, const char *name, double *value); const StatusCode ConfigSetDouble(VConfig *cfg, const char *name, const double value); const StatusCode ConfigGetString(VConfig *cfg, const char *name, const char **value); diff --git a/utils/Config/src/Config.c b/utils/Config/src/Config.c index aea0077..a4f37e4 100644 --- a/utils/Config/src/Config.c +++ b/utils/Config/src/Config.c @@ -118,6 +118,20 @@ const StatusCode ConfigSetBool(VConfig *cfg, const char *name, const bool value) } return cfg->set_bool(cfg, name, value); } +const StatusCode ConfigGetFloat(VConfig *cfg, const char *name, float *value) +{ + if (NULL == cfg) { + return CreateStatusCode(STATUS_CODE_NOT_OK); + } + return cfg->get_float(cfg, name, value); +} +const StatusCode ConfigSetFloat(VConfig *cfg, const char *name, const float value) +{ + if (NULL == cfg) { + return CreateStatusCode(STATUS_CODE_NOT_OK); + } + return cfg->set_float(cfg, name, value); +} const StatusCode ConfigGetDouble(VConfig *cfg, const char *name, double *value) { if (NULL == cfg) { @@ -132,7 +146,6 @@ const StatusCode ConfigSetDouble(VConfig *cfg, const char *name, const double va } return cfg->set_double(cfg, name, value); } - const StatusCode ConfigGetString(VConfig *cfg, const char *name, const char **value) { if (NULL == cfg) { diff --git a/utils/Config/src/ConfigImpl.c b/utils/Config/src/ConfigImpl.c index 88ec389..912828a 100644 --- a/utils/Config/src/ConfigImpl.c +++ b/utils/Config/src/ConfigImpl.c @@ -16,6 +16,7 @@ #include "ConfigCode.h" #include "ILog.h" #include +#include #include #include #include @@ -23,6 +24,7 @@ #define CHECK_SHORT_LIMIT(value) (value > SHRT_MAX ? false : (value < SHRT_MIN ? false : true)) #define CHECK_LONG_LIMIT(value) (value > LONG_MAX ? false : (value < LONG_MIN ? false : true)) #define CHECK_CHAR_LIMIT(value) (value > CHAR_MAX ? false : (value < CHAR_MIN ? false : true)) +#define CHECK_FLOAT_LIMIT(value) (fabs(value - ((float)value)) < 0.000001 ? false : true) static const StatusCode ConfigSaveFileImpl(VConfig *cfg) { @@ -72,7 +74,7 @@ static const StatusCode ConfigGetShortImpl(VConfig *cfg, const char *name, short int intValue = 0; int result = 0; result = config_lookup_int(&(((Config *)cfg)->cfg), name, &intValue); - if (CONFIG_FALSE == result && CHECK_SHORT_LIMIT(intValue)) { + if (CONFIG_FALSE == result || CHECK_SHORT_LIMIT(intValue)) { return CreateConfigCode(CONFIG_CODE_PARAM_NOT_EXIST); } *value = (short)intValue; @@ -95,7 +97,7 @@ static const StatusCode ConfigGetLongImpl(VConfig *cfg, const char *name, long * long long llongValue = 0; int result = 0; result = config_lookup_int64(&(((Config *)cfg)->cfg), name, &llongValue); - if (CONFIG_FALSE == result && CHECK_LONG_LIMIT(llongValue)) { + if (CONFIG_FALSE == result || CHECK_LONG_LIMIT(llongValue)) { return CreateConfigCode(CONFIG_CODE_PARAM_NOT_EXIST); } *value = (long)llongValue; @@ -176,7 +178,29 @@ static const StatusCode ConfigSetBoolImpl(VConfig *cfg, const char *name, const config_setting_set_bool(setting, (int)value); return CreateStatusCode(STATUS_CODE_OK); } - +static const StatusCode ConfigGetFloatImpl(VConfig *cfg, const char *name, float *value) +{ + double dValue = 0; + int result = 0; + result = config_lookup_float(&(((Config *)cfg)->cfg), name, &dValue); + if (CONFIG_FALSE == result || CHECK_FLOAT_LIMIT(dValue)) { + return CreateConfigCode(CONFIG_CODE_PARAM_NOT_EXIST); + } + *value = (float)dValue; + return CreateStatusCode(STATUS_CODE_OK); +} +static const StatusCode ConfigSetFloatImpl(VConfig *cfg, const char *name, const float value) +{ + config_setting_t *root, *setting; + root = config_root_setting(&(((Config *)cfg)->cfg)); + setting = config_setting_get_member(root, name); + if (!setting) { + setting = config_setting_add(root, name, CONFIG_TYPE_FLOAT); + } + double dValue = value; + config_setting_set_float(setting, dValue); + return CreateStatusCode(STATUS_CODE_OK); +} static const StatusCode ConfigGetDoubleImpl(VConfig *cfg, const char *name, double *value) { int result = 0; @@ -197,7 +221,6 @@ static const StatusCode ConfigSetDoubleImpl(VConfig *cfg, const char *name, cons config_setting_set_float(setting, value); return CreateStatusCode(STATUS_CODE_OK); } - static const StatusCode ConfigGetStringImpl(VConfig *cfg, const char *name, const char **value) { int result = 0; @@ -239,6 +262,8 @@ static void ConfigImplInit(Config *cfg) cfg->base.set_char = ConfigSetCharImpl; cfg->base.get_bool = ConfigGetBoolImpl; cfg->base.set_bool = ConfigSetBoolImpl; + cfg->base.get_float = ConfigGetFloatImpl; + cfg->base.set_float = ConfigSetFloatImpl; cfg->base.get_double = ConfigGetDoubleImpl; cfg->base.set_double = ConfigSetDoubleImpl; cfg->base.get_string = ConfigGetStringImpl;