/****************************************************************************
 * This file is part of the project AqHome.
 * AqHome (c) by 2023 Martin Preuss, all rights reserved.
 *
 * The license for this file can be found in the file COPYING which you
 * should have received along with this file.
 ****************************************************************************/

#ifdef HAVE_CONFIG_H
# include <config.h>
#endif

#include "./loop_ipc.h"
#include "./aqhome_mqtt_p.h"
#include "./c_setdata.h"
#include "aqhome/ipc/data/ipc_data.h"

#include <gwenhywfar/gwenhywfar.h>
#include <gwenhywfar/debug.h>
#include <gwenhywfar/endpoint.h>
#include <gwenhywfar/text.h>
#include <gwenhywfar/json_read.h>
#include <gwenhywfar/db.h>


#define FULL_DEBUG


/* ------------------------------------------------------------------------------------------------
 * forward declarations
 * ------------------------------------------------------------------------------------------------
 */

static void _handleIpcMsg(AQHOME_MQTT *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MSG *msg);



/* ------------------------------------------------------------------------------------------------
 * implementations
 * ------------------------------------------------------------------------------------------------
 */


void AqHomeMqttLog_ReadAndHandleIpcMessages(AQHOME_MQTT *aqh)
{
  GWEN_MSG_ENDPOINT *epTcp;
  GWEN_MSG *msg;

  epTcp=aqh->brokerEndpoint;
  while( (msg=GWEN_MsgEndpoint_TakeFirstReceivedMessage(epTcp)) ) {
    _handleIpcMsg(aqh, epTcp, msg);
    GWEN_Msg_free(msg);
  }
}



void _handleIpcMsg(AQHOME_MQTT *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MSG *msg)
{
  uint16_t code;
  uint8_t protoId;

  /* exec IPC message */
  code=GWEN_IpcMsg_GetCode(msg);
  protoId=GWEN_IpcMsg_GetProtoId(msg);
  if (protoId==AQH_IPC_PROTOCOL_DATA_ID) {
    DBG_DEBUG(AQH_LOGDOMAIN, "Received IPC packet %d (%x)", (int) code, code);
    switch(code) {
    case AQH_MSGTYPE_IPC_DATA_SETDATA:               AqHomeMqttLog_HandleSetData(aqh, ep, msg); break;
    default:                                         break;
    }
  }
  else if (protoId==0 && code==AQH_MSGTYPE_IPC_DATA_RESULT) {
    /* result received */
  }
  else {
    DBG_ERROR(NULL, "Invalid IPC protocol %d (%02x)", protoId, protoId);
  }
}








