Added functionality to print a value difference.
Also call GWEN_MsgEndpoint_IoLoop() only after checking all messages in the endpoint's list.
This commit is contained in:
@@ -28,6 +28,7 @@
|
|||||||
|
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
|
||||||
#define I18S(msg) msg
|
#define I18S(msg) msg
|
||||||
@@ -35,8 +36,8 @@
|
|||||||
|
|
||||||
|
|
||||||
static int _doGetDataPoints(GWEN_DB_NODE *dbArgs);
|
static int _doGetDataPoints(GWEN_DB_NODE *dbArgs);
|
||||||
static int _awaitAndCalcAndPrintResponse(GWEN_MSG_ENDPOINT *epTcp, int timeoutInSeconds, int printMean);
|
static int _awaitAndCalcAndPrintResponse(GWEN_MSG_ENDPOINT *epTcp, int timeoutInSeconds, int printMean, int printDiff);
|
||||||
static void _handleDataResponse(GWEN_MSG *msg, int printMean);
|
static void _handleDataResponse(GWEN_MSG *msg, int printMean, int printDiff);
|
||||||
static uint64_t _getTimeStampFromString(const char *s);
|
static uint64_t _getTimeStampFromString(const char *s);
|
||||||
|
|
||||||
|
|
||||||
@@ -135,6 +136,17 @@ int AQH_Tool_GetDataPoints(GWEN_DB_NODE *dbGlobalArgs, int argc, char **argv)
|
|||||||
I18S("Print mean value of data received"),
|
I18S("Print mean value of data received"),
|
||||||
I18S("Print mean value of data received")
|
I18S("Print mean value of data received")
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
0, /* flags */
|
||||||
|
GWEN_ArgsType_Int, /* type */
|
||||||
|
"printDiff", /* name */
|
||||||
|
0, /* minnum */
|
||||||
|
1, /* maxnum */
|
||||||
|
"D", /* short option */
|
||||||
|
"diff", /* long option */
|
||||||
|
I18S("Print difference between last and first datapoint received"),
|
||||||
|
I18S("Print difference between last and first datapoint received")
|
||||||
|
},
|
||||||
{
|
{
|
||||||
GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */
|
GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */
|
||||||
GWEN_ArgsType_Char, /* type */
|
GWEN_ArgsType_Char, /* type */
|
||||||
@@ -220,9 +232,11 @@ int _doGetDataPoints(GWEN_DB_NODE *dbArgs)
|
|||||||
uint64_t num;
|
uint64_t num;
|
||||||
GWEN_MSG *msgOut;
|
GWEN_MSG *msgOut;
|
||||||
int printMean;
|
int printMean;
|
||||||
|
int printDiff;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
printMean=GWEN_DB_GetIntValue(dbArgs, "printMean", 0, 0);
|
printMean=GWEN_DB_GetIntValue(dbArgs, "printMean", 0, 0);
|
||||||
|
printDiff=GWEN_DB_GetIntValue(dbArgs, "printDiff", 0, 0);
|
||||||
timeoutInSeconds=GWEN_DB_GetIntValue(dbArgs, "timeout", 0, 5);
|
timeoutInSeconds=GWEN_DB_GetIntValue(dbArgs, "timeout", 0, 5);
|
||||||
valueName=GWEN_DB_GetCharValue(dbArgs, "valueName", 0, NULL);
|
valueName=GWEN_DB_GetCharValue(dbArgs, "valueName", 0, NULL);
|
||||||
num=GWEN_DB_GetIntValue(dbArgs, "numOfLastDatapoints", 0, 0);
|
num=GWEN_DB_GetIntValue(dbArgs, "numOfLastDatapoints", 0, 0);
|
||||||
@@ -247,7 +261,7 @@ int _doGetDataPoints(GWEN_DB_NODE *dbArgs)
|
|||||||
msgOut=AQH_GetDataDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_GETDATA_REQ, valueName, tsBegin, tsEnd, num);
|
msgOut=AQH_GetDataDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_GETDATA_REQ, valueName, tsBegin, tsEnd, num);
|
||||||
GWEN_MsgEndpoint_AddSendMessage(epTcp, msgOut);
|
GWEN_MsgEndpoint_AddSendMessage(epTcp, msgOut);
|
||||||
|
|
||||||
rv=_awaitAndCalcAndPrintResponse(epTcp, timeoutInSeconds, printMean?1:0);
|
rv=_awaitAndCalcAndPrintResponse(epTcp, timeoutInSeconds, printMean?1:0, printDiff?1:0);
|
||||||
if (rv!=0) {
|
if (rv!=0) {
|
||||||
GWEN_MsgEndpoint_free(epTcp);
|
GWEN_MsgEndpoint_free(epTcp);
|
||||||
return rv;
|
return rv;
|
||||||
@@ -259,7 +273,7 @@ int _doGetDataPoints(GWEN_DB_NODE *dbArgs)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int _awaitAndCalcAndPrintResponse(GWEN_MSG_ENDPOINT *epTcp, int timeoutInSeconds, int printMean)
|
int _awaitAndCalcAndPrintResponse(GWEN_MSG_ENDPOINT *epTcp, int timeoutInSeconds, int printMean, int printDiff)
|
||||||
{
|
{
|
||||||
for (;;) {
|
for (;;) {
|
||||||
GWEN_MSG *msg;
|
GWEN_MSG *msg;
|
||||||
@@ -272,7 +286,7 @@ int _awaitAndCalcAndPrintResponse(GWEN_MSG_ENDPOINT *epTcp, int timeoutInSeconds
|
|||||||
}
|
}
|
||||||
code=GWEN_IpcMsg_GetCode(msg);
|
code=GWEN_IpcMsg_GetCode(msg);
|
||||||
if (code==AQH_MSGTYPE_IPC_DATA_GETDATA_RSP) {
|
if (code==AQH_MSGTYPE_IPC_DATA_GETDATA_RSP) {
|
||||||
_handleDataResponse(msg, printMean);
|
_handleDataResponse(msg, printMean, printDiff);
|
||||||
GWEN_Msg_free(msg);
|
GWEN_Msg_free(msg);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -295,7 +309,7 @@ int _awaitAndCalcAndPrintResponse(GWEN_MSG_ENDPOINT *epTcp, int timeoutInSeconds
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _handleDataResponse(GWEN_MSG *msg, int printMean)
|
void _handleDataResponse(GWEN_MSG *msg, int printMean, int printDiff)
|
||||||
{
|
{
|
||||||
AQH_VALUE *value;
|
AQH_VALUE *value;
|
||||||
const GWEN_TAG16 *tag;
|
const GWEN_TAG16 *tag;
|
||||||
@@ -313,6 +327,8 @@ void _handleDataResponse(GWEN_MSG *msg, int printMean)
|
|||||||
if (numberOfPoints>0 && dataPoints) {
|
if (numberOfPoints>0 && dataPoints) {
|
||||||
if (printMean)
|
if (printMean)
|
||||||
Utils_PrintMeanData(dataPoints, numberOfPoints, valueUnits);
|
Utils_PrintMeanData(dataPoints, numberOfPoints, valueUnits);
|
||||||
|
else if (printDiff)
|
||||||
|
Utils_PrintDiffData(dataPoints, numberOfPoints, valueUnits);
|
||||||
else
|
else
|
||||||
Utils_PrintDataPoints(dataPoints, numberOfPoints, valueUnits);
|
Utils_PrintDataPoints(dataPoints, numberOfPoints, valueUnits);
|
||||||
}
|
}
|
||||||
@@ -326,15 +342,27 @@ uint64_t _getTimeStampFromString(const char *s)
|
|||||||
{
|
{
|
||||||
if (s && *s) {
|
if (s && *s) {
|
||||||
if (*s=='-') {
|
if (*s=='-') {
|
||||||
unsigned long int x;
|
uint64_t x=0;
|
||||||
unsigned long int now=time(NULL);
|
uint64_t now=time(NULL);
|
||||||
|
|
||||||
s++;
|
s++;
|
||||||
if (1!=sscanf(s, "%lu", &x)) {
|
while(*s && isdigit(*s)) {
|
||||||
DBG_ERROR(NULL, "ERROR: Invalid timestamp");
|
unsigned int i;
|
||||||
return (uint64_t) (-1);
|
|
||||||
|
i=*(s++)-'0';
|
||||||
|
x*=10;
|
||||||
|
x+=i;
|
||||||
}
|
}
|
||||||
return (uint64_t) (now-x);
|
if (*s) {
|
||||||
|
switch(*s) {
|
||||||
|
case 0:
|
||||||
|
case 'm': x*=60; break;
|
||||||
|
case 'h': x*=(60*60); break;
|
||||||
|
case 'd': x*=(60*60*24); break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (now-x);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
unsigned long int x;
|
unsigned long int x;
|
||||||
|
|||||||
@@ -137,9 +137,7 @@ GWEN_MSG *Utils_WaitForSpecificNodeMessage(GWEN_MSG_ENDPOINT *epTcp,
|
|||||||
GWEN_MSG *msg;
|
GWEN_MSG *msg;
|
||||||
time_t now;
|
time_t now;
|
||||||
|
|
||||||
GWEN_MsgEndpoint_IoLoop(epTcp, 2000); /* 2000 ms */
|
while( (msg=GWEN_MsgEndpoint_TakeFirstReceivedMessage(epTcp)) ) {
|
||||||
msg=GWEN_MsgEndpoint_TakeFirstReceivedMessage(epTcp);
|
|
||||||
if (msg) {
|
|
||||||
if (GWEN_IpcMsg_GetCode(msg)==AQH_MSGTYPE_IPC_NODES_FORWARD) {
|
if (GWEN_IpcMsg_GetCode(msg)==AQH_MSGTYPE_IPC_NODES_FORWARD) {
|
||||||
GWEN_MSG *nodeMsg;
|
GWEN_MSG *nodeMsg;
|
||||||
|
|
||||||
@@ -160,12 +158,13 @@ GWEN_MSG *Utils_WaitForSpecificNodeMessage(GWEN_MSG_ENDPOINT *epTcp,
|
|||||||
DBG_INFO(NULL, "Received IPC message %d, ignoring", GWEN_IpcMsg_GetCode(msg));
|
DBG_INFO(NULL, "Received IPC message %d, ignoring", GWEN_IpcMsg_GetCode(msg));
|
||||||
}
|
}
|
||||||
GWEN_Msg_free(msg);
|
GWEN_Msg_free(msg);
|
||||||
}
|
} /* while */
|
||||||
now=time(NULL);
|
now=time(NULL);
|
||||||
if (now-startTime>timeoutInSeconds) {
|
if (now-startTime>timeoutInSeconds) {
|
||||||
DBG_INFO(NULL, "Timeout");
|
DBG_INFO(NULL, "Timeout");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
GWEN_MsgEndpoint_IoLoop(epTcp, 2000); /* 2000 ms */
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -415,6 +414,42 @@ void Utils_PrintMeanData(const uint64_t *dataPoints, uint32_t numValues, const c
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void Utils_PrintDiffData(const uint64_t *dataPoints, uint32_t numValues, const char *valueUnits)
|
||||||
|
{
|
||||||
|
if (numValues) {
|
||||||
|
if (numValues>1) {
|
||||||
|
uint64_t timestamp=0;
|
||||||
|
double valueFirst=0.0;
|
||||||
|
double valueLast=0.0;
|
||||||
|
double valueDiff=0.0;
|
||||||
|
union {double f; uint64_t i;} u;
|
||||||
|
|
||||||
|
/* ignore timestamp of first datapoint */
|
||||||
|
u.i=dataPoints[1];
|
||||||
|
valueFirst=u.f;
|
||||||
|
|
||||||
|
timestamp=dataPoints[(numValues-1)*2];
|
||||||
|
u.i=dataPoints[((numValues-1)*2)+1];
|
||||||
|
valueLast=u.f;
|
||||||
|
|
||||||
|
valueDiff=valueLast-valueFirst;
|
||||||
|
|
||||||
|
Utils_PrintSingleDataPoint(timestamp, valueDiff, valueUnits);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
uint64_t timestamp;
|
||||||
|
union {double f; uint64_t i;} u;
|
||||||
|
|
||||||
|
timestamp=dataPoints[0];
|
||||||
|
u.i=dataPoints[1];
|
||||||
|
|
||||||
|
Utils_PrintSingleDataPoint(timestamp, u.f, valueUnits);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Utils_PrintDevice(const AQH_DEVICE *device, int printHeader)
|
void Utils_PrintDevice(const AQH_DEVICE *device, int printHeader)
|
||||||
{
|
{
|
||||||
GWEN_TIMESTAMP *ts;
|
GWEN_TIMESTAMP *ts;
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ GWEN_MSG_ENDPOINT *Utils_OpenBrokerConnection(GWEN_DB_NODE *dbArgs, uint32_t fla
|
|||||||
void Utils_PrintDataPoints(const uint64_t *dataPoints, uint32_t numValues, const char *valueUnits);
|
void Utils_PrintDataPoints(const uint64_t *dataPoints, uint32_t numValues, const char *valueUnits);
|
||||||
void Utils_PrintSingleDataPoint(uint64_t timestamp, double data, const char *valueUnits);
|
void Utils_PrintSingleDataPoint(uint64_t timestamp, double data, const char *valueUnits);
|
||||||
void Utils_PrintMeanData(const uint64_t *dataPoints, uint32_t numValues, const char *valueUnits);
|
void Utils_PrintMeanData(const uint64_t *dataPoints, uint32_t numValues, const char *valueUnits);
|
||||||
|
void Utils_PrintDiffData(const uint64_t *dataPoints, uint32_t numValues, const char *valueUnits);
|
||||||
void Utils_PrintFormattedSingleDataPoint(const AQH_VALUE *v, uint64_t timestamp, double data, const char *tmpl);
|
void Utils_PrintFormattedSingleDataPoint(const AQH_VALUE *v, uint64_t timestamp, double data, const char *tmpl);
|
||||||
|
|
||||||
void Utils_PrintDevice(const AQH_DEVICE *device, int printHeader);
|
void Utils_PrintDevice(const AQH_DEVICE *device, int printHeader);
|
||||||
|
|||||||
Reference in New Issue
Block a user