diff --git a/telldus-core/common/Strings.cpp b/telldus-core/common/Strings.cpp index fe0b7ca1..c563fa49 100644 --- a/telldus-core/common/Strings.cpp +++ b/telldus-core/common/Strings.cpp @@ -144,6 +144,14 @@ std::wstring TelldusCore::intToWStringSafe(int value){ } */ +uint64_t TelldusCore::hexTo64l(const std::string data){ +#ifdef _WINDOWS + return _strtoui64(data.c_str(), NULL, 16); +#else + return strtol(data.c_str(), NULL, 16); +#endif +} + int TelldusCore::wideToInteger(const std::wstring &input){ std::wstringstream inputstream; inputstream << input; diff --git a/telldus-core/common/Strings.h b/telldus-core/common/Strings.h index ad898424..7c5f85ad 100644 --- a/telldus-core/common/Strings.h +++ b/telldus-core/common/Strings.h @@ -3,6 +3,14 @@ #include #include +#ifdef _MSC_VER +typedef unsigned __int8 uint8_t; +typedef unsigned __int16 uint16_t; +typedef unsigned __int32 uint32_t; +typedef unsigned __int64 uint64_t; +#else +#include +#endif namespace TelldusCore { std::wstring charToWstring(const char *value); @@ -13,6 +21,7 @@ namespace TelldusCore { std::wstring intToWstring(int value); //std::wstring intToWStringSafe(int value); std::string intToString(int value); + uint64_t hexTo64l(const std::string data); std::string wideToString(const std::wstring &input); int wideToInteger(const std::wstring &input); diff --git a/telldus-core/service/ProtocolFineoffset.cpp b/telldus-core/service/ProtocolFineoffset.cpp index 31d150a0..4ed310d0 100644 --- a/telldus-core/service/ProtocolFineoffset.cpp +++ b/telldus-core/service/ProtocolFineoffset.cpp @@ -1,13 +1,8 @@ #include "ProtocolFineoffset.h" +#include "Strings.h" #include #include #include -#ifdef _MSC_VER -typedef unsigned __int8 uint8_t; -typedef unsigned __int16 uint16_t; -#else -#include -#endif std::string ProtocolFineoffset::decodeData(ControllerMessage &dataMsg) { @@ -16,13 +11,13 @@ std::string ProtocolFineoffset::decodeData(ControllerMessage &dataMsg) return ""; } - uint8_t checksum = strtol(data.substr(data.length()-2).c_str(), NULL, 16); + uint8_t checksum = (uint8_t)TelldusCore::hexTo64l(data.substr(data.length()-2)); data = data.substr(0, data.length()-2); - uint8_t humidity = strtol(data.substr(data.length()-2).c_str(), NULL, 16); + uint8_t humidity = (uint8_t)TelldusCore::hexTo64l(data.substr(data.length()-2)); data = data.substr(0, data.length()-2); - uint16_t value = strtol(data.substr(data.length()-3).c_str(), NULL, 16); + uint16_t value = (uint16_t)TelldusCore::hexTo64l(data.substr(data.length()-3)); double temperature = (value & 0x7FF)/10.0; value >>= 11; @@ -31,7 +26,7 @@ std::string ProtocolFineoffset::decodeData(ControllerMessage &dataMsg) } data = data.substr(0, data.length()-3); - uint16_t id = strtol(data.c_str(), NULL, 16) & 0xFF; + uint16_t id = (uint16_t)TelldusCore::hexTo64l(data) & 0xFF; std::stringstream retString; retString << "class:sensor;protocol:fineoffset;id:" << id << ";model:"; diff --git a/telldus-core/service/ProtocolMandolyn.cpp b/telldus-core/service/ProtocolMandolyn.cpp index 420d6bdb..b8f5aae5 100644 --- a/telldus-core/service/ProtocolMandolyn.cpp +++ b/telldus-core/service/ProtocolMandolyn.cpp @@ -1,19 +1,13 @@ #include "ProtocolMandolyn.h" +#include "Strings.h" #include #include #include -#ifdef _MSC_VER -typedef unsigned __int8 uint8_t; -typedef unsigned __int32 uint32_t; -#else -#include -#endif - std::string ProtocolMandolyn::decodeData(ControllerMessage &dataMsg) { std::string data = dataMsg.getParameter("data"); - uint32_t value = strtol(data.c_str(), NULL, 16); + uint32_t value = (uint32_t)TelldusCore::hexTo64l(data); bool parity = value & 0x1; value >>= 1; diff --git a/telldus-core/service/ProtocolOregon.cpp b/telldus-core/service/ProtocolOregon.cpp index 704ebeeb..c5847952 100644 --- a/telldus-core/service/ProtocolOregon.cpp +++ b/telldus-core/service/ProtocolOregon.cpp @@ -1,13 +1,8 @@ #include "ProtocolOregon.h" +#include "Strings.h" #include #include #include -#ifdef _MSC_VER -typedef unsigned __int8 uint8_t; -typedef unsigned __int64 uint64_t; -#else -#include -#endif std::string ProtocolOregon::decodeData(ControllerMessage &dataMsg) { @@ -24,8 +19,8 @@ std::string ProtocolOregon::decodeData(ControllerMessage &dataMsg) } std::string ProtocolOregon::decodeEA4C(const std::string &data) { - uint64_t value = strtol(data.c_str(), NULL, 16); - + uint64_t value = TelldusCore::hexTo64l(data); + uint8_t checksum = 0xE + 0xA + 0x4 + 0xC; checksum -= (value & 0xF) * 0x10; checksum -= 0xA; @@ -69,7 +64,7 @@ std::string ProtocolOregon::decodeEA4C(const std::string &data) { } std::string ProtocolOregon::decode1A2D(const std::string &data) { - uint64_t value = strtol(data.c_str(), NULL, 16); + uint64_t value = TelldusCore::hexTo64l(data); uint8_t checksum2 = value & 0xFF; value >>= 8; uint8_t checksum1 = value & 0xFF;