aqhome-nodes: re-implemented setdata request received via broker.

This commit is contained in:
Martin Preuss
2024-09-30 22:43:35 +02:00
parent 03f9178dd2
commit 8199f7c3b0
14 changed files with 260 additions and 326 deletions

View File

@@ -15,6 +15,8 @@
#include "./aqhomed_p.h"
#include "./tty_log.h"
#include "./db.h"
#include "./requests.h"
#include "./r_setdata.h"
#include "aqhome/msg/endpoint_tty.h"
#include "aqhome/msg/msg_node.h"
@@ -62,9 +64,6 @@ void _handleIpcMsgPing(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg)
void _handleIpcMsgSetAccMsgGrps(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg);
void _handleIpcMsgForward(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg);
void _handleIpcMsgGetDevicesReq(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg);
void _handleIpcMsgSetData(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MSG *msg);
static int _readDataFromString(const char *s, uint16_t *pDataVal, uint16_t *pValDenom);
static AQH_NODE_INFO *_getNodeInfoFromValue(AQHOMED *aqh, const AQH_VALUE *value);
@@ -94,7 +93,8 @@ void _handleIpcEndpoint(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep)
GWEN_MSG *msg;
while( (msg=GWEN_MsgEndpoint_TakeFirstReceivedMessage(ep)) ) {
_handleIpcMsg(aqh, ep, msg);
if (AqHomeNodes_Requests_HandleIpcMsg(aqh, ep, msg)!=GWEN_MSG_REQUEST_RESULT_HANDLED)
_handleIpcMsg(aqh, ep, msg);
GWEN_Msg_free(msg);
}
}
@@ -113,7 +113,7 @@ void _handleIpcMsg(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MSG *msg)
case AQH_MSGTYPE_IPC_NODES_SETACCMSGGRPS: _handleIpcMsgSetAccMsgGrps(aqh, ep, msg); break;
case AQH_MSGTYPE_IPC_NODES_FORWARD: _handleIpcMsgForward(aqh, ep, msg); break;
case AQH_MSGTYPE_IPC_NODES_GETDEVICES_REQ: _handleIpcMsgGetDevicesReq(aqh, ep, msg); break;
case AQH_MSGTYPE_IPC_DATA_SETDATA: _handleIpcMsgSetData(aqh, ep, msg); break;
// case AQH_MSGTYPE_IPC_DATA_SETDATA: AqHomeNodes_HandleNodeSetData(aqh, ep, msg); break;
default: break;
}
}
@@ -195,103 +195,3 @@ void _handleIpcMsgGetDevicesReq(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_
void _handleIpcMsgSetData(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MSG *msg)
{
if (aqh->ttyEndpoint && GWEN_MsgEndpoint_GetState(aqh->ttyEndpoint)==GWEN_MSG_ENDPOINT_STATE_CONNECTED) {
AQH_VALUE *value;
DBG_DEBUG(AQH_LOGDOMAIN, "Received IPC SetDataRequest message");
AQH_SetDataIpcMsg_Parse(msg, 0);
value=AQH_SetDataIpcMsg_ReadValue(msg);
if (value) {
char *data;
data=AQH_SetDataIpcMsg_ReadData(msg);
if (data) {
uint16_t dataVal=0;
uint16_t dataDenom=0;
if (_readDataFromString(data, &dataVal, &dataDenom)==0) {
AQH_NODE_INFO *nodeInfo;
nodeInfo=_getNodeInfoFromValue(aqh, value);
if (nodeInfo) {
int valueId=0;
const char *s;
s=AQH_Value_GetName(value);
if (s && *s && 1==sscanf(s, "%d", &valueId)) {
GWEN_MSG *msgOut;
int destAddr;
destAddr=AQH_NodeInfo_GetBusAddress(nodeInfo);
msgOut=AQH_Value3Msg_new(aqh->nodeAddress, destAddr, AQH_MSG_TYPE_VALUE_SET, 0 /* msgid*/, valueId, dataVal, dataDenom);
GWEN_MsgEndpoint_AddSendMessage(aqh->ttyEndpoint, msgOut);
}
else {
DBG_ERROR(AQH_LOGDOMAIN, "Invalid value id \"%s\"", s);
}
}
else {
DBG_ERROR(AQH_LOGDOMAIN, "No matching node found");
}
}
free(data);
}
AQH_Value_free(value);
}
else {
DBG_ERROR(AQH_LOGDOMAIN, "Could not read value from message");
}
}
}
int _readDataFromString(const char *s, uint16_t *pDataVal, uint16_t *pDataDenom)
{
if (s && *s) {
if (*s=='&') {
unsigned long int v=0;
s++;
if (1==sscanf(s, "%lx", &v)) {
*pDataVal=(v>>16) & 0xffff;
*pDataDenom=v & 0xffff;
return 0;
}
else {
DBG_ERROR(AQH_LOGDOMAIN, "Bad hex value \"%s\"", s);
}
}
}
return GWEN_ERROR_GENERIC;
}
AQH_NODE_INFO *_getNodeInfoFromValue(AQHOMED *aqh, const AQH_VALUE *value)
{
const char *s;
unsigned long int uid;
s=AQH_Value_GetDeviceName(value);
if (s && *s && 1==sscanf(s, "%lx", &uid)) {
AQH_NODE_INFO *ni;
ni=AQH_NodeDb_GetNodeInfoByUid(aqh->nodeDb, uid);
if (ni==NULL) {
DBG_INFO(AQH_LOGDOMAIN, "Node \"%08lx\" not found", uid);
return NULL;
}
return ni;
}
return NULL;
}