diff --git a/knx-linux/main.cpp b/knx-linux/main.cpp index 200c5c1..0a0bae9 100644 --- a/knx-linux/main.cpp +++ b/knx-linux/main.cpp @@ -1,6 +1,7 @@ #include "knx_facade.h" #include "knx/bau57B0.h" #include "knx/group_object_table_object.h" +#include "knx/bits.h" #include #include #include @@ -9,9 +10,6 @@ LinuxPlatform platfrom; Bau57B0 bau(platfrom); KnxFacade knx(bau); -float currentValue = 0; -float maxValue = 0; -float minValue = RAND_MAX; long lastsend = 0; #define CURR knx.getGroupObject(1) @@ -22,35 +20,32 @@ long lastsend = 0; void measureTemp() { long now = platfrom.millis(); - if ((now - lastsend) < 2000) + if ((now - lastsend) < 10000) return; lastsend = now; int r = rand(); - currentValue = (r * 1.0) / (RAND_MAX * 1.0); - currentValue *= 100 * 100; + float currentValue = (r * 1.0) / (RAND_MAX * 1.0); + currentValue *= (670433.28 + 273); + currentValue -= 273; + println(currentValue); + CURR.value(currentValue); - CURR.objectWrite(currentValue); + double max = MAX.value(); + if (currentValue > max) + MAX.value(currentValue); - if (currentValue > maxValue) - { - maxValue = currentValue; - MAX.objectWrite(maxValue); - } - - if (currentValue < minValue) - { - minValue = currentValue; - MIN.objectWrite(minValue); - } + double min = MIN.value(); + if (currentValue < MIN.value().doubleValue()) + MIN.value(currentValue); } void resetCallback(GroupObject& go) { - if (go.objectReadBool()) + if (go.value().boolValue()) { - maxValue = 0; - minValue = 10000; + MAX.valueNoSend(-273.0); + MIN.valueNoSend(670433.28); } } @@ -72,6 +67,12 @@ void setup() if (knx.configured()) { + CURR.dataPointType(Dpt(9, 1)); + MIN.dataPointType(Dpt(9, 1)); + MIN.value(670433.28); + MAX.dataPointType(Dpt(9, 1)); + MAX.valueNoSend(-273.0); + RESET.dataPointType(Dpt(1, 15)); RESET.callback(resetCallback); printf("Timeout: %d\n", bau.parameters().getWord(0)); printf("Zykl. senden: %d\n", bau.parameters().getByte(2)); diff --git a/src/knx/dptconvert.cpp b/src/knx/dptconvert.cpp index e0d34cd..799e048 100644 --- a/src/knx/dptconvert.cpp +++ b/src/knx/dptconvert.cpp @@ -6,9 +6,10 @@ #define ASSERT_PAYLOAD(x) \ if (payload_length != (x)) \ return false -#define ENSURE_PAYLOAD(x) \ - for (int pi = 0; pi < (x); ++pi) \ - payload[pi] = 0 +#define ENSURE_PAYLOAD(x) +//\ +// for (int pi = 0; pi < (x); ++pi) \ +// payload[pi] = 0 int KNX_Decode_Value(uint8_t* payload, int payload_length, const Dpt& datatype, KNXValue& value) { @@ -1116,83 +1117,49 @@ int valueToBusValueTimeDelta(const KNXValue& value, uint8_t* payload, int payloa int valueToBusValueFloat16(const KNXValue& value, uint8_t* payload, int payload_length, const Dpt& datatype) { double numValue = value; + + // bigger values like 670760.0 result in 0x7FFF which denotes invalid data. + // I'm not sure if the GO shouldn't be updated to this value instead + if (numValue > 670433.28) + return false; + + if (numValue < -671088.64) + return false; + switch (datatype.subGroup) { case 1: - if (numValue < -273.0 || numValue > 670760.0) + if (numValue < -273.0) return false; break; - case 4: - case 7: - case 8: - if (numValue < 0.0 || numValue > 670760.0) - return false; - break; - case 5: - { - if (numValue < 0.0 || numValue > 670760.0) - return false; - break; - } - case 6: - { - if (numValue < 0.0 || numValue > 670760.0) - return false; - break; - } - case 10: - { - if (numValue < -670760.0 || numValue > 670760.0) - return false; - break; - } - case 11: - { - if (numValue < -670760.0 || numValue > 670760.0) - return false; - break; - } - case 20: - { - if (numValue < -670760.0 || numValue > 670760.0) - return false; - break; - } - case 21: - { - if (numValue < -670760.0 || numValue > 670760.0) - return false; - break; - } case 2: case 3: + case 10: + case 11: + case 20: + case 21: case 22: case 23: case 24: - if (numValue < -670760.0 || numValue > 670760.0) - return false; - break; case 25: - { - if (numValue < -670760.0 || numValue > 670760.0) + if (numValue < -670760.0) return false; break; - } - case 27: - { - if (numValue < -459.6) - return false; - break; - } + case 4: + case 5: + case 6: + case 7: + case 8: case 28: if (numValue < 0.0) return false; break; + case 27: + if (numValue < -459.6) + return false; + break; } - if (numValue < -671088.64 || numValue > 670760.96) - return false; - float16ToPayload(payload, payload_length, 0, numValue, 0xFFFF); return true; } @@ -1819,9 +1786,20 @@ void signed32ToPayload(uint8_t* payload, int payload_length, int index, int32_t void float16ToPayload(uint8_t* payload, int payload_length, int index, double value, uint16_t mask) { + bool wasNegative = false; + if (value < 0) + { + wasNegative = true; + value *= -1; + } + value *= 100.0; - unsigned short exponent = ceil(log2(value) - 10.0); + unsigned short exponent = ceil(log2(value) - 11.0); short mantissa = roundf(value / (1 << exponent)); + + if (wasNegative) + mantissa *= -1; + signed16ToPayload(payload, payload_length, index, mantissa, mask); unsigned8ToPayload(payload, payload_length, index, exponent << 3, 0x78 & (mask >> 8)); } diff --git a/src/knx/dptconvert.h b/src/knx/dptconvert.h index 83e6f34..219916f 100644 --- a/src/knx/dptconvert.h +++ b/src/knx/dptconvert.h @@ -35,7 +35,7 @@ class Dpt { public: Dpt() {} - Dpt(short mainGroup, short subGroup, short index) + Dpt(short mainGroup, short subGroup, short index = 0) { this->mainGroup = mainGroup; this->subGroup = subGroup; diff --git a/src/knx/group_object.cpp b/src/knx/group_object.cpp index 38fb85d..e1b9ef7 100644 --- a/src/knx/group_object.cpp +++ b/src/knx/group_object.cpp @@ -274,7 +274,7 @@ GroupObjectUpdatedHandler GroupObject::callback() void GroupObject::value(const KNXValue& value, const Dpt& type) { - KNX_Encode_Value(value, _data, _dataLength, type); + valueNoSend(value, type); objectWritten(); } @@ -320,3 +320,15 @@ KNXValue GroupObject::value() { return value(_datapointType); } + + +void GroupObject::valueNoSend(const KNXValue& value) +{ + valueNoSend(value, _datapointType); +} + + +void GroupObject::valueNoSend(const KNXValue& value, const Dpt& type) +{ + KNX_Encode_Value(value, _data, _dataLength, type); +} diff --git a/src/knx/group_object.h b/src/knx/group_object.h index 4ce1059..4734ddc 100644 --- a/src/knx/group_object.h +++ b/src/knx/group_object.h @@ -121,11 +121,14 @@ public: GroupObjectUpdatedHandler callback(); KNXValue value(const Dpt& type); - void value(const KNXValue& value, const Dpt& type); - bool tryValue(KNXValue& value, const Dpt& type); KNXValue value(); + void value(const KNXValue& value, const Dpt& type); void value(const KNXValue& value); + void valueNoSend(const KNXValue& value, const Dpt& type); + void valueNoSend(const KNXValue& value); + bool tryValue(KNXValue& value, const Dpt& type); bool tryValue(KNXValue& value); + Dpt dataPointType(); void dataPointType(Dpt value); diff --git a/src/linux_platform.cpp b/src/linux_platform.cpp index 541f7b5..ed763fd 100644 --- a/src/linux_platform.cpp +++ b/src/linux_platform.cpp @@ -488,6 +488,11 @@ void println(double num) printf("%f\n", num); } +void println(double num, int places) +{ + printf("%f\n", num); +} + void println(void) { printf("\n");