/*
 * app_thermostat_msp_command_handler.c
 *
 *  Created on: 16.05.2017
 *      Author: j.huebner
 */


/****************************************************************************/
/***        Include files                                                 ***/
/****************************************************************************/
#include <jendefs.h>
#include "zps_gen.h"
#include "App_Thermostat.h"
#include "dbg.h"
#include <string.h>
#include "app_main.h"
#include "app_events.h"
#include "Thermostat.h"

#include "app_thermostat_msp_commands.h"
/****************************************************************************/
/***        Macro Definitions                                             ***/
/****************************************************************************/
#ifdef DEBUG_APP_THERMOSTAT_MSP_COMMAND_HANDLER
    #define TRACE_MSP_HANDLER   TRUE
#else
    #define TRACE_MSP_HANDLER   FALSE
#endif

#define THERMOSTAT_SETPOINTS_BUFFER_SIZE 56
/****************************************************************************/
/***        Type Definitions                                              ***/
/****************************************************************************/
/****************************************************************************/
/***        Local Function Prototypes                                     ***/
/****************************************************************************/
PRIVATE void vMSP_COMMAND_decodeSwitchpoints(uint8 * u8ReceivedSwitchpoints, uint8 u8Switchpointslength);
/****************************************************************************/
/***        Exported Variables                                            ***/
/****************************************************************************/
/****************************************************************************/
/***        Local Variables                                               ***/
/****************************************************************************/
/****************************************************************************/
/***        Exported Functions                                            ***/
/****************************************************************************/
/****************************************************************************
 **
 ** NAME:       eCLD_ThermostatHandleSetpointRaiseOrLower
 **
 ** DESCRIPTION:
 ** Handles Thermostat Setpoint raise or lower command
 **
 ** PARAMETERS:               Name                      Usage
 ** ZPS_tsAfEvent            *pZPSevent                 Zigbee stack event structure
 ** tsZCL_EndPointDefinition *psEndPointDefinition      EP structure
 ** tsZCL_ClusterInstance    *psClusterInstance         Cluster structure
 **
 ** RETURN:
 ** teZCL_Status
 **
 ****************************************************************************/
PUBLIC  teZCL_Status 		eCLD_ThermostatHandleSetHostSchedule(
                            ZPS_tsAfEvent               *pZPSevent,
                            tsZCL_EndPointDefinition    *psEndPointDefinition,
                            tsZCL_ClusterInstance       *psClusterInstance)
{

    teZCL_Status eStatus;
    tsCLD_Thermostat_HostSchedulePayload sPayload;
    tsCLD_ThermostatCustomDataStructure *psCommon;

    /* Get pointer to custom data structure */
    psCommon = (tsCLD_ThermostatCustomDataStructure*)psClusterInstance->pvEndPointCustomStructPtr;

    /* Receive the command */
    eStatus = eCLD_ThermostatCommandHostScheduleReceive(
                                            pZPSevent,
                                            &u8TransactionSequenceNumber,
                                            &sPayload);
    if(eStatus != E_ZCL_SUCCESS)
    {
        DBG_vPrintf(TRACE_MSP_HANDLER, "eCLD_ThermostatCommandHostScheduleReceive Error: %d\r\n", eStatus);
        return (eStatus);
    }

#ifdef MANUFACTURER_LEVARYS


#ifdef   TRACE_ENABLED
    DBG_vPrintf(TRACE_MSP_HANDLER, "\n<----RECEIVE HOST SCHEDULE----> \r\n");
    int i = 0;

	for (i = 0; i < THERMOSTAT_SETPOINTS_BUFFER_SIZE; i++) {

		DBG_vPrintf(TRACE_MSP_HANDLER,"Set HOST SCHEDULE %d.Data =  %x  \r\n", i,sPayload.u8_ScheduleBuffer[i]);

		if(i == 5 || i == 11 || i== 17 || i == 23 || i == 29 || i == 35 || i == 41){

			DBG_vPrintf(TRACE_MSP_HANDLER,"\n");
		}
	}

#endif

	vMSP_COMMAND_decodeSwitchpoints(sPayload.u8_ScheduleBuffer,THERMOSTAT_SETPOINTS_BUFFER_SIZE);

#endif

    /* call callback */
    psEndPointDefinition->pCallBackFunctions(&psCommon->sCustomCallBackEvent);

    return (E_ZCL_SUCCESS);
}
/****************************************************************************
 **
 ** NAME:       eCLD_ThermostatHandleSetHostHoliday
 **
 ** DESCRIPTION:
 ** Handles Thermostat Setpoint raise or lower command
 **
 ** PARAMETERS:               Name                      Usage
 ** ZPS_tsAfEvent            *pZPSevent                 Zigbee stack event structure
 ** tsZCL_EndPointDefinition *psEndPointDefinition      EP structure
 ** tsZCL_ClusterInstance    *psClusterInstance         Cluster structure
 **
 ** RETURN:
 ** teZCL_Status
 **
 ****************************************************************************/
/*PUBLIC  teZCL_Status 		eCLD_ThermostatHandleSetHostHoliday(
                            ZPS_tsAfEvent               *pZPSevent,
                            tsZCL_EndPointDefinition    *psEndPointDefinition,
                            tsZCL_ClusterInstance       *psClusterInstance)
{

    teZCL_Status eStatus;
    tsCLD_Thermostat_SetHostHolidayPayload sPayload;
    tsCLD_ThermostatCustomDataStructure *psCommon;
    DBG_vPrintf(TRACE_MSP_HANDLER, "RECEIVE HOST HOLIDAY \r\n");
     Get pointer to custom data structure
    psCommon = (tsCLD_ThermostatCustomDataStructure*)psClusterInstance->pvEndPointCustomStructPtr;

     Receive the command
    eStatus = eCLD_ThermostatCommandSetHostHolidayReceive(
                                            pZPSevent,
                                            &u8TransactionSequenceNumber,
                                            &sPayload);
    if(eStatus != E_ZCL_SUCCESS)
    {
        DBG_vPrintf(TRACE_MSP_HANDLER, "eCLD_ThermostatCommandSetHostHolidayReceive Error: %d\r\n", eStatus);
        return (eStatus);
    }


    DBG_vPrintf(TRACE_MSP_HANDLER, "Set HOST HOLIDAY 1.Data: %x und Last Data :%x \r\n", sPayload.u8_SetHolidayBuffer[0],sPayload.u8_SetHolidayBuffer[8]);
    memcpy(&sUartWandThermostat.p_Holiday[0], &sPayload.u8_SetHolidayBuffer[0],9 );
    sUartWandThermostat.SetDaten.ThermostatSetHoliday = TRUE;
     Message data for callback
    psCommon->sCallBackMessage.uMessage.psSetHostHolidayPayload= &sPayload;

     call callback
    psEndPointDefinition->pCallBackFunctions(&psCommon->sCustomCallBackEvent);
    // Send Uart Queue for writing host holiday by uart
	  App_tsEventUart sAppUartEvent;
	  sAppUartEvent.eType_UartNextState = UART_WRITE_THERMOSTAT_DATA;
	  ZQ_bQueueSend(&APP_msgUartEvents, &sAppUartEvent);
    return (E_ZCL_SUCCESS);
}*/

/****************************************************************************
 **
 ** NAME:       eCLD_ThermostatHandleGetHostSchedule
 **
 ** DESCRIPTION:
 ** Handles Thermostat Setpoint raise or lower command
 **
 ** PARAMETERS:               Name                      Usage
 ** ZPS_tsAfEvent            *pZPSevent                 Zigbee stack event structure
 ** tsZCL_EndPointDefinition *psEndPointDefinition      EP structure
 ** tsZCL_ClusterInstance    *psClusterInstance         Cluster structure
 **
 ** RETURN:
 ** teZCL_Status
 **
 ****************************************************************************/
PUBLIC  teZCL_Status 		eCLD_ThermostatHandleGetHostSchedule(
                            ZPS_tsAfEvent               *pZPSevent,
                            tsZCL_EndPointDefinition    *psEndPointDefinition,
                            tsZCL_ClusterInstance       *psClusterInstance)
{
	DBG_vPrintf(TRACE_MSP_HANDLER, "\nTRACE_MSP_HANDLER:                           eCLD_ThermostatHandleGetHostSchedule---------------------->\n" );
   // tsCLD_Thermostat_HostSchedulePayload sPayload;
	u8TransactionSequenceNumber++;
    //tsCLD_ThermostatCustomDataStructure *psCommon;
   // uint16 u16ActualQuantity;
    void * thisNet = ZPS_pvAplZdoGetNwkHandle();
    ZPS_tsNwkNib * thisNib = ZPS_psNwkNibGetHandle(thisNet);
    tsCLD_Thermostat_HostSchedulePayload psPayload;
    tsZCL_Address sAddress;

    sAddress.eAddressMode = E_ZCL_AM_BOUND;
    sAddress.uAddress.u16DestinationAddress = thisNib->sTbl.psNtDisc[0].u16NwkAddr;

	int8 i;
	for (i = 0; i < 42; i++) {
		psPayload.u8_ScheduleBuffer[i] = (0x03 + i);
	}


    tsZCL_TxPayloadItem asPayloadDefinition[] = {{42,E_ZCL_ENUM8, &psPayload.u8_ScheduleBuffer},};
    DBG_vPrintf(TRACE_MSP_HANDLER, "\nAPP_MSP_COMMANDS:              u8TransactionSequenceNumber = %x",u8TransactionSequenceNumber);

#ifdef DEBUG_APP_THERMOSTAT_MSP_COMMAND_HANDLER
    teZCL_Status eStatus =  	eZCL_CustomCommandSend(0x01,//u8SourceEndPointId,
	  	  	   	   	   	   	   	u8DestinationEndpointID,//u8DestinationEndPointId,
								&sAddress,
								HVAC_CLUSTER_ID_THERMOSTAT,
								TRUE,
								E_CLD_THERMOSTAT_CMD_GET_HOST_SCHEDULE,
								&u8TransactionSequenceNumber,
								asPayloadDefinition,
								TRUE,
								ZCL_MANUFACTURER_CODE,
								sizeof(asPayloadDefinition) / sizeof(tsZCL_TxPayloadItem));
#else
    		eZCL_CustomCommandSend(0x01,//u8SourceEndPointId,
    				  	  	  	   u8DestinationEndpointID,//u8DestinationEndPointId,
    							   &sAddress,
    							   HVAC_CLUSTER_ID_THERMOSTAT,
    							   TRUE,
    							   E_CLD_THERMOSTAT_CMD_GET_HOST_SCHEDULE,
    							   &u8TransactionSequenceNumber,
    							   asPayloadDefinition,
    							   TRUE,
    							   ZCL_MANUFACTURER_CODE,
    							   sizeof(asPayloadDefinition) / sizeof(tsZCL_TxPayloadItem));
#endif


#ifdef DEBUG_APP_THERMOSTAT_MSP_COMMAND_HANDLER
	if (E_ZCL_SUCCESS == eStatus) {
		DBG_vPrintf(TRACE_MSP_HANDLER,"\neZCL_CustomCommandSend Status E_ZCL_SUCCESS \n");
	} else if (E_ZCL_ERR_PARAMETER_NULL == eStatus) {
		DBG_vPrintf(TRACE_MSP_HANDLER,"\neZCL_CustomCommandSend Status E_ZCL_ERR_PARAMETER_NULL \n");
	} else if (E_ZCL_ERR_EP_RANGE == eStatus) {
		DBG_vPrintf(TRACE_MSP_HANDLER,"\neZCL_CustomCommandSend Status E_ZCL_ERR_EP_RANGE \n");
	} else if (E_ZCL_ERR_ATTRIBUTES_0 == eStatus) {
		DBG_vPrintf(TRACE_MSP_HANDLER,"\neZCL_CustomCommandSend Status E_ZCL_ERR_ATTRIBUTES_0 \n");
	} else if (E_ZCL_ERR_ZBUFFER_FAIL == eStatus) {
		DBG_vPrintf(TRACE_MSP_HANDLER,"\neZCL_CustomCommandSend Status E_ZCL_ERR_ZBUFFER_FAIL \n");
	} else if (E_ZCL_ERR_ZTRANSMIT_FAIL == eStatus) {
		DBG_vPrintf(TRACE_MSP_HANDLER,"\neZCL_CustomCommandSend Status E_ZCL_ERR_ZTRANSMIT_FAIL \n");
	} else if (E_ZCL_FAIL == eStatus) {
		DBG_vPrintf(TRACE_MSP_HANDLER,"\neZCL_CustomCommandSend Status E_ZCL_FAIL \n");
	} else if (E_ZCL_ERR_EP_UNKNOWN == eStatus) {
		DBG_vPrintf(TRACE_MSP_HANDLER,"\neZCL_CustomCommandSend Status E_ZCL_ERR_EP_UNKNOWN \n");
	}

#endif
	return (0);
}
/****************************************************************************
 **
 ** NAME:       vMSP_COMMAND_decodeSwitchpoints
 **
 ** DESCRIPTION:
 ** Handles Thermostat Switchpoints decoding
 **
 ** PARAMETERS:
 ** uint8 * u8ReceivedSwitch
 ** uint8 u8Switchpointslength
 **
 ** RETURN:
 ** void
 **
 ****************************************************************************/
PRIVATE void vMSP_COMMAND_decodeSwitchpoints(uint8 * u8ReceivedSwitchpoints,uint8 u8Switchpointslength) {


int8 i;
	for (i = 1; i < 113; i++) {

		u8decodedSwitchpointsArray[i] = 0xFF;

	}
// Send Switchpoint command
	u8decodedSwitchpointsArray[0] = 0xFB;

	uint8 u8switchPointOffsetHour;
	uint8 u8switchPointOffsetMinute;

	for (i = 0; i < 42; i++) {

		if (SWITCHPOINT_MONTAG == i) {
			u8switchPointOffsetHour = 1;//0
			u8switchPointOffsetMinute = 2;//1

		} else if (SWITCHPOINT_DIENSTAG == i) {
			u8switchPointOffsetHour = 5;//4
			u8switchPointOffsetMinute = 6;//5

		} else if (SWITCHPOINT_MITTWOCH == i) {
			u8switchPointOffsetHour = 9;//8
			u8switchPointOffsetMinute = 10;//9

		} else if (SWITCHPOINT_DONNERSTAG == i) {
			u8switchPointOffsetHour = 13;//12
			u8switchPointOffsetMinute = 14;//13

		} else if (SWITCHPOINT_FREITAG == i) {
			u8switchPointOffsetHour = 17;//16
			u8switchPointOffsetMinute = 18;//17

		} else if (SWITCHPOINT_SAMSTAG == i) {
			u8switchPointOffsetHour = 21;//20
			u8switchPointOffsetMinute = 22;//21

		} else if (SWITCHPOINT_SONNTAG == i) {
			u8switchPointOffsetHour = 25;//24
			u8switchPointOffsetMinute = 26;//25

		}
		u8decodedSwitchpointsArray[i * 2 + u8switchPointOffsetHour] = (u8ReceivedSwitchpoints[i] * 10) / 60;
		u8decodedSwitchpointsArray[i * 2 + u8switchPointOffsetMinute] =	(u8ReceivedSwitchpoints[i] * 10) % 60;

	}

	App_tsEventUart sAppUartEvent;
	sAppUartEvent.eType_UartNextState = APP_E_EVENT_UART_SEND_SWITCHPOINTS;
	ZQ_bQueueSend(&APP_msgUartEvents, &sAppUartEvent);
}
/****************************************************************************/
/***        END OF FILE                                                   ***/
/****************************************************************************/
