fixed dpt 9.* add new value api to linux example

This commit is contained in:
Thomas Kunze 2019-05-29 22:43:21 +02:00
parent ab9644b920
commit a35c0616ac
6 changed files with 86 additions and 87 deletions

View File

@ -1,6 +1,7 @@
#include "knx_facade.h"
#include "knx/bau57B0.h"
#include "knx/group_object_table_object.h"
#include "knx/bits.h"
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
@ -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));

View File

@ -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));
}

View File

@ -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;

View File

@ -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);
}

View File

@ -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);

View File

@ -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");