Skip to content

Commit de7c004

Browse files
authored
test str to varval
1 parent 710df17 commit de7c004

File tree

5 files changed

+37
-0
lines changed

5 files changed

+37
-0
lines changed

src/Datapoint/Converter.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ int Converter::toString(char* buf, std::size_t maxLen, VariantValue value) const
1717
return 0;
1818
}
1919

20+
void Converter::fromString(const char* buf, VariantValue* result) const {
21+
(void) buf;
22+
return VariantValue(0ULL);
23+
}
24+
2025
VariantValue Div10Convert::decode(const uint8_t* data, uint8_t len) const {
2126
assert(len == 1 || len == 2);
2227
float retVal = 0;
@@ -46,6 +51,15 @@ int Div10Convert::toString(char* buf, std::size_t maxLen, VariantValue value) co
4651
return snprintf(buf, maxLen, "%.1f", static_cast<float>(value));
4752
}
4853

54+
void Div10Convert::fromString(const char* buf, VariantValue* result) const {
55+
char* end = nullptr;
56+
float ret = std::strtof(buf, &end);
57+
if (buf == end || ret == HUGE_VALF) {
58+
vw_log_e("Could not convert string to float");
59+
}
60+
result = VariantValue(ret);
61+
}
62+
4963
VariantValue Div2Convert::decode(const uint8_t* data, uint8_t len) const {
5064
assert(len == 1);
5165
float retVal = 0;

src/Datapoint/Converter.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ the LICENSE file.
1313
#include <cmath>
1414
#include <cstring>
1515
#include <cstddef>
16+
#include <cstdlib> // std::stof... conversions
1617

1718
#include "../Logging.h"
1819
#include "ConversionHelpers.h"
@@ -55,6 +56,7 @@ class Converter {
5556
virtual VariantValue decode(const uint8_t* data, uint8_t len) const = 0;
5657
virtual void encode(uint8_t* buf, uint8_t len, const VariantValue& val) const = 0;
5758
virtual int toString(char* buf, std::size_t maxLen, VariantValue value) const;
59+
virtual void fromString(const char* buf, VariantValue* result) const;
5860
bool operator==(const Converter& rhs) const {
5961
return (this == &rhs);
6062
}
@@ -65,6 +67,7 @@ class Div10Convert : public Converter {
6567
VariantValue decode(const uint8_t* data, uint8_t len) const override;
6668
void encode(uint8_t* buf, uint8_t len, const VariantValue& val) const override;
6769
int toString(char* buf, std::size_t maxLen, VariantValue value) const override;
70+
void fromString(const char* buf, VariantValue* result) const override; // C-string = 0-terminated
6871
};
6972

7073
class Div2Convert : public Converter {

src/Datapoint/Datapoint.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,13 @@ void Datapoint::encode(uint8_t* buf, uint8_t len, const VariantValue& value) con
5151
return (*_converter).encode(buf, len, value);
5252
}
5353

54+
void Datapoint::encode(uint8_t* buf, uint8_t len, const char* value) const {
55+
VariantValue convertedVal;
56+
if ((*_converter).fromString(value, &convertedVal)) {
57+
encode(buf, len, convertedVal);
58+
}
59+
}
60+
5461
int Datapoint::decodeToString(char* buffer, std::size_t maxLen, const uint8_t* data, uint8_t length) const {
5562
return (*_converter).toString(buffer, maxLen, (*_converter).decode(data, length));
5663
}

src/Datapoint/Datapoint.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class Datapoint {
2828
int decodeToString(char* buffer, std::size_t maxLen, const uint8_t* data, uint8_t length) const;
2929
int decodeToString(char* buffer, std::size_t maxLen, const PacketVS2& packet) const;
3030
void encode(uint8_t* buf, uint8_t len, const VariantValue& value) const;
31+
void encode(uint8_t* buf, uint8_t len, const char* value) const;
3132

3233
protected:
3334
const char* _name;

test/test_Datapoint/test_Datapoint.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,18 @@ void test_TempEncode() {
7474
TEST_ASSERT_EQUAL_HEX8_ARRAY(expected, buffer, len);
7575
}
7676

77+
void test_TempEncodeStr() {
78+
Datapoint dp("temp", 0x0000, 2, VitoWiFi::div10);
79+
const uint8_t expected[] = {0x07, 0x01};
80+
const char* value = "26.3";
81+
const uint8_t len = 2;
82+
uint8_t buffer[len] = {0};
83+
84+
dp.encode(buffer, len, value);
85+
86+
TEST_ASSERT_EQUAL_HEX8_ARRAY(expected, buffer, len);
87+
}
88+
7789
void test_TempShortDecode() {
7890
Datapoint dp("temp", 0x0000, 1, VitoWiFi::noconv);
7991
const uint8_t data[] = {0x10};

0 commit comments

Comments
 (0)