/**
 * Copyright (c) 2014 - 2018, Nordic Semiconductor ASA
 * 
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 * 
 * 1. Redistributions of source code must retain the above copyright notice, this
 *    list of conditions and the following disclaimer.
 * 
 * 2. Redistributions in binary form, except as embedded into a Nordic
 *    Semiconductor ASA integrated circuit in a product or a software update for
 *    such product, must reproduce the above copyright notice, this list of
 *    conditions and the following disclaimer in the documentation and/or other
 *    materials provided with the distribution.
 * 
 * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
 *    contributors may be used to endorse or promote products derived from this
 *    software without specific prior written permission.
 * 
 * 4. This software, with or without modification, must only be used with a
 *    Nordic Semiconductor ASA integrated circuit.
 * 
 * 5. Any software provided in binary form under this license must not be reverse
 *    engineered, decompiled, modified and/or disassembled.
 * 
 * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * 
 */

#include <stdint.h>
#include <string.h>
#include "nrf_gpio.h"
#include "our_service.h"
#include "ble_srv_common.h"
#include "app_error.h"
#include "SEGGER_RTT.h"
#include "board_gpi.h"
#include "nrf_log.h"

#include "sysmgr.h"
#include "main.h"
#include "nrf_power.h"


char SvrRxBuffer[100];
int SvrRxBufferPos;
char SvrEvent;


stSystemTimer SystemTimer;
stSystemManager SystemManager;
char SvrSendBuff[50];

void delete_all_begin(void);



void USART_DataCheck()
{
	if( SystemTimer.UART_LAST_RECV_TIMER > 10 && SystemManager.RxValild )
	{

		SvrRxBuffer[SvrRxBufferPos] = 0;

		//printf("[%d]%s\r\n", SvrRxBufferPos, SvrRxBuffer);
		SystemManager.RxValild = 0;

		if( SvrRxBufferPos == 20 )
		{
			SystemManager.RxEvent = 1;
		}

		SvrRxBufferPos = 0;
	}

	if( SystemTimer.UART_LAST_RECV_TIMER > 10 && SvrRxBufferPos )
	{
		SystemManager.RxValild = 0;
		SvrRxBufferPos = 0;
	}

}


void USART_Handler(void)
{

	char ch;
	
	uint8_t cr;

// 	SystemTimer.UART1_LAST_RECV_TIMER = 0;

	if( app_uart_get(&cr) == NRF_SUCCESS )
	{
		SystemManager.RxValild = 1;
		SvrRxBuffer[SvrRxBufferPos++] = cr;
		SvrRxBufferPos %= 100;
		SystemTimer.UART_LAST_RECV_TIMER = 0;
	}
}



#define SERVER_COMM_DATA_LEN		0x08


#define COM_TYPE_SVR_EMG_REQ			0x01		// SERVER EMG 응답
#define COM_TYPE_SVR_NORMAL   			0x02		// 수신기 Normal 신호		( BleEventServer --> IES600 )
#define COM_TYPE_SVR_TALKING  			0x03		// 수신기 Talking 신호		( BleEventServer --> IES600 )
#define COM_TYPE_SVR_DISCON   			0x04		// 수신기 DisConnect 신호	( BleEventServer --> IES600 )
#define COM_TYPE_SVR_BUSY     			0x05		// 수신기 Busy 신호			( BleEventServer --> IES600 )
#define COM_TYPE_SVR_ALIVE    			0x06		// 수신기 Alive 신호			( IES600 --> BleEventServer )
#define COM_TYPE_SVR_MIC      			0x07		// 수신기 Mic 상태 			( BleEventServer --> IES600 )
#define COM_TYPE_SVR_RECV_REG_REQ		0x08		// 송신기 등록 요청 		( BleEventServer --> IES600 )
#define COM_TYPE_SEV_RECV_REG_ANSWER	0x09		// 송신기 등록 응답 		( IES600 --> BleEventServer )
#define COM_TYPE_SVR_RECV_INIT_REQ		0x0a		// 수신기 초기화 요청 		( BleEventServer --> IES600 ) 
#define COM_TYPE_SVR_RECV_INIT_ANSWER	0x0b		// 수신기 초기화 응답 		( IES600 --> BleEventServer )
#define COM_TYPE_SVR_RECV_LIST_REQ		0x0c		// 송신기 목록 요청		( BleEventServer --> IES600 )
#define COM_TYPE_SVR_RECV_LIST_ANSWER	0x0d		// 송신기 목록 응답		( IES600 --> BleEventServer )
#define COM_TYPE_SVR_VER_REQ			0x10		// 수신기 버전 요청 		( BleEventServer --> IES600 )
#define COM_TYPE_SVR_VER_ANSWER			0x11		// 수신기 버전 응답 		( IES600 --> BleEventServer )
#define COM_TYPE_SVR_CALL_REQ			0x12		// 수신기 통화 요청 		( BleEventServer --> IES600 )
#define COM_TYPE_SVR_CALL_ANSWER		0x13		// 수신기 통화 응답 		( IES600 --> BleEventServer )

#define COM_TYPE_SVR_UPGREAD_REQ		0x14		// 수신기 업그레이드 요청	( BleEventServer --> IES600 ) 
#define COM_TYPE_SVR_UPGREAD_ANSWER		0x15		// 수신기 업그레이드 응답	( IES600 --> BleEventServer ) 





/* 이벤트 서버에서 20byte 들어왔을때 */


void ParseEventServer()
{

	int i;

	if( SystemManager.RxEvent == 0 )
		return;

	SystemManager.RxEvent = 0;


	NRF_LOG_RAW_INFO("\n\n");
	NRF_LOG_RAW_INFO("SERVER TO DATA : ")
	for( i=0; i<20; i++)
	{
		NRF_LOG_RAW_INFO("0x%02x ", SvrRxBuffer[i]);
	}
	NRF_LOG_RAW_INFO("\n\n");


	if(SvrRxBuffer[0] != 0x02)
		return;


	switch(SvrRxBuffer[1]){

		case COM_TYPE_SVR:

			switch(SvrRxBuffer[3]){

				// 수신기 대기상태 요청
				case COM_TYPE_SVR_NORMAL:

					NRF_LOG_INFO("Recv : Normal");

					PKLedOff();
					PKBuzzerOff();
					PKMicOff();
					SystemManager.SwitchOn = 0;
 
				break;

				// 수신기 통화상태 요청 
				case COM_TYPE_SVR_TALKING:

					NRF_LOG_INFO("Recv : Talking");

					PKLedOn();
					PKBuzzerOff();
					SystemManager.SwitchOn = 0;
				break;

				// 수신기 서버와 통화 종료 요청
				case COM_TYPE_SVR_DISCON:
					
					NRF_LOG_INFO("Recv : Disconnect");

					SystemManager.SwitchOn = 0;
					//bsp_board_leds_off();
				break;

				// 서버 Busy 상태 알림
				case COM_TYPE_SVR_BUSY:

					NRF_LOG_INFO("Recv : Busy");

				break;

				// 송신기 Alive신호 서버로 전송
				case COM_TYPE_SVR_ALIVE:

					NRF_LOG_INFO("Recv : Keep Alive");
				break;

				// 수신기 마이크 상태 변경 요청 
				case COM_TYPE_SVR_MIC:
					
					NRF_LOG_INFO("Recv : mic on/off");

					if( SvrRxBuffer[11] == 0 )
					{  
						NRF_LOG_INFO("mic on"); 
						NRF_LOG_INFO("speaker off");  
						PKSpeakerOff();
						PKMicOn();
						PKBuzzerOff();
						PKLedOn();
						SystemManager.SwitchOn = 0;
					}else{
						NRF_LOG_INFO("mic off"); 
						NRF_LOG_INFO("speaker on");  
						PKMicOff();
						PKSpeakerOn();
						PKLedOn();
					}
				break;

				// 송신기 등록요청
				case COM_TYPE_SVR_RECV_REG_REQ:

					NRF_LOG_INFO("Recv : COM_TYPE_SVR_RECV_REG");

					SystemManager.LedBlinkRun = COM_TYPE_SVR_RECV_REG;
					SystemManager.RegRequst = 1;

					SendAck(COM_TYPE_SVR_RECV_REG+1);

					SystemTimer.DEV_REG_TIMER = 0;

				break;

				// 송신기 등록 초기화 요청
				case COM_TYPE_SVR_RECV_INIT_REQ:

					NRF_LOG_INFO("Recv : COM_TYPE_SVR_RECV_INIT");

//					SystemManager.LedBlinkRun = COM_TYPE_SVR_RECV_INIT;
//					SystemManager.LedBlinkTimer = 2500;
//					SystemTimer.LED_TOGGLE_TIMER = 0;

//					SystemManager.SwitchOn = 1;
					
					SendAck(COM_TYPE_SVR_RECV_INIT+1);

					//for( i=0; i<RegMacPool.Count; i++)
					//{
					//RegMacDelteAll();
					// }
					memset( &RegMacPool, 0, sizeof(RegMacPool));

					delete_all_begin();

					for(i=0; i<2; i++){
						PKLedOn();
						nrf_delay_ms(300);
						PKLedOff();
						nrf_delay_ms(300);
					}
				break;

				// 송신기에 등록된 수신기 리스트 요청 
				case COM_TYPE_SVR_RECV_LIST_REQ:

					NRF_LOG_INFO("Recv : COM_TYPE_SVR_RECV_LIST");

//					SystemManager.LedBlinkRun = COM_TYPE_SVR_RECV_LIST;
//					SystemManager.LedBlinkTimer = 1500;
//					SystemTimer.LED_TOGGLE_TIMER = 0;

//					SystemManager.SwitchOn = 1;

					Server_Answer_Reg_List();

					PKLedOn();
					nrf_delay_ms(300);
					PKLedOff();

				break;

				// 서버로 부터 통화 요청
				case COM_TYPE_SVR_CALL_REQ:

					NRF_LOG_INFO("Recv : COM_TYPE_SVR_CALL_REQ");

					Server_Answer_Call();

				break;

				// 서버로 부터 수신기 버전 요청
				case COM_TYPE_SVR_VER_REQ:

					NRF_LOG_INFO("Recv : COM_TYPE_SVR_VER_REQ");

					Server_Answer_Version();

				break;


				case COM_TYPE_SVR_UPGREAD_REQ:

					NRF_LOG_INFO("Recv : COM_TYPE_SVR_UPGREAD_REQ");
					
					Server_Answer_Upgread();

				break;
			}
		break;

		case COM_TYPE_BAND:

		break;
	}
}



void SendToEventServer(char* data, int len)
{

	int i;

	NRF_LOG_RAW_INFO("SendToEventServer ==> ");
	for( i=0; i<len; i++)
	{
		NRF_LOG_RAW_INFO("%02x ", data[i]);
	}
	NRF_LOG_RAW_INFO("\n");


	for( i=0; i<len; i++)
	{
		while (app_uart_put(data[i]) != NRF_SUCCESS);
	}

}





void SendParkingApp()
{
	int i;

	NRF_LOG_RAW_INFO("===> SendParkingApp()\n");

	SvrSendBuff[0] =  COM_STX;
	SvrSendBuff[1] =  3;
	SvrSendBuff[2] =  0;
	SvrSendBuff[3] =  1;

	SvrSendBuff[4] =  0;
	SvrSendBuff[5] =  0;
	SvrSendBuff[6] =  0;
	
	SvrSendBuff[7] =  new_ble_addr.addr[3];		// 수신기 MAC 
	SvrSendBuff[8] =  new_ble_addr.addr[4];		// 수신기 MAC
	SvrSendBuff[9] =  new_ble_addr.addr[5];		// 수신기 MAC

	SvrSendBuff[10] =  0x11;
	SvrSendBuff[11] =  0x74;

	SvrSendBuff[12] =  0;
	SvrSendBuff[13] =  0;
	SvrSendBuff[14] =  0;
	SvrSendBuff[15] =  0;

	SvrSendBuff[16] =  SystemManager.Site[0]; //SITE
	SvrSendBuff[17] =  SystemManager.Site[1];
	SvrSendBuff[18] =  SystemManager.Site[2];
	SvrSendBuff[19] =  SystemManager.Site[3];

	SvrSendBuff[20] =  SystemManager.Dong[0]; //DONG
	SvrSendBuff[21] =  SystemManager.Dong[1];


	SvrSendBuff[22] =  SystemManager.Ho[0]; //HO
	SvrSendBuff[23] =  SystemManager.Ho[1];

	SvrSendBuff[24] =  0; //KEY NUM
	SvrSendBuff[25] =  0; //KEY TYPE

	SvrSendBuff[26] =  0; //Random
	SvrSendBuff[27] =  0;  

	SvrSendBuff[28] =  COM_ETX;


	NRF_LOG_INFO("SendParkingApp ===");
	
	SendToEventServer(&SvrSendBuff[0], 1);

	SendToEventServer(&SvrSendBuff[0], 29);


	for(i=0; i<2; i++){
		PKLedOn();
		nrf_delay_ms(300);
		PKLedOff();
		nrf_delay_ms(300);
	}

	nrf_delay_ms(2000);		// 중복해서 들어오는 데이타로 인한 연속 동작 방지 

}





void SendEmergencyBand()
{
	int i;

	char tmpStr[10];

	NRF_LOG_RAW_INFO("===> SendEmergencyBand()\n");

	SystemManager.LedBlinkRun = 1;
	SystemManager.LedBlinkTimer = 5000;
	SystemTimer.LED_TOGGLE_TIMER = 0;
	SystemManager.DevType = 0;
	
	SystemManager.SwitchOn = 1;

	PKBuzzerOn();
  
	SvrSendBuff[0] =  COM_STX;
	SvrSendBuff[1] =  2;
	SvrSendBuff[2] =  0;
	SvrSendBuff[3] =  COM_TYPE_BELL_EMG;

	SvrSendBuff[4] =  0;
	SvrSendBuff[5] =  0;
	SvrSendBuff[6] =  0;

	if( RegMacPool.Count != 0 ){  // 등록된 송신기가 있으면 첫번째 MAC 전송
	
		strcpy( tmpStr, &RegMacPool.Mac[0][6]);
	
		tmpStr[6] = 0;
		SvrSendBuff[6] = strtoul( &tmpStr[4], NULL, 16 );
	
		tmpStr[4] = 0;
		SvrSendBuff[5] = strtoul( &tmpStr[2], NULL, 16 );
		
		tmpStr[2] = 0;
		SvrSendBuff[4] = strtoul( &tmpStr[0], NULL, 16 );
	
	}else{						// 없으면 000000 전송
		
		SvrSendBuff[4] =  0;
		SvrSendBuff[5] =  0;
		SvrSendBuff[6] =  0;
	}



	SvrSendBuff[7] =  new_ble_addr.addr[3];
	SvrSendBuff[8] =  new_ble_addr.addr[4];
	SvrSendBuff[9] =  new_ble_addr.addr[5];
	SvrSendBuff[10] =  0x11;
	SvrSendBuff[11] =  0x72;

	SvrSendBuff[12] =  0; //uuid
	SvrSendBuff[13] =  0;
	SvrSendBuff[14] =  0;
	SvrSendBuff[15] =  0;

	SvrSendBuff[16] =  SystemManager.Site[0]; //Site
	SvrSendBuff[17] =  SystemManager.Site[1];
	SvrSendBuff[18] =  SystemManager.Site[2];
	SvrSendBuff[19] =  SystemManager.Site[3];

	SvrSendBuff[20] =  SystemManager.Dong[0]; //Dong
	SvrSendBuff[21] =  SystemManager.Dong[1];


	SvrSendBuff[22] =  SystemManager.Ho[0]; //Ho
	SvrSendBuff[23] =  SystemManager.Ho[1];

	SvrSendBuff[24] =  0; //KEY NUM
	SvrSendBuff[25] =  0; //KEY TYPE

	SvrSendBuff[26] =  0; //Random
	SvrSendBuff[27] =  0;  

	SvrSendBuff[28] =  COM_ETX;

	NRF_LOG_INFO("SendEmergencyBand===");

	SendToEventServer(&SvrSendBuff[0], 1);

	nrf_delay_ms(500);
	
	SendToEventServer(&SvrSendBuff[0], 29);


	//NRF_LOG_RAW_INFO("================= EmergencyBand \n");
	for( i=0; i<29; i++)
	{
		//NRF_LOG_RAW_INFO("%02x ", SvrSendBuff[i]);
	}
	NRF_LOG_RAW_INFO("\n");
	

}






void SendParkingBand()
{

	uint8_t i;

	uint8_t check_sum = 0;

	NRF_LOG_RAW_INFO("===> SendParkingBand()\n");
	
	SvrSendBuff[0] =  COM_STX;
	SvrSendBuff[1] =  2;
	SvrSendBuff[2] =  0;
	SvrSendBuff[3] =  2;


	SvrSendBuff[4] =  0;
	SvrSendBuff[5] =  0;
	SvrSendBuff[6] =  0;

	SvrSendBuff[7] =  new_ble_addr.addr[3];
	SvrSendBuff[8] =  new_ble_addr.addr[4];
	SvrSendBuff[9] =  new_ble_addr.addr[5];
	
	SvrSendBuff[10] =  0x11;
	SvrSendBuff[11] =  0x73;

	SvrSendBuff[12] =  0; //uuid
	SvrSendBuff[13] =  0;
	SvrSendBuff[14] =  0;
	SvrSendBuff[15] =  0;

	SvrSendBuff[16] =  SystemManager.Site[0]; //Site
	SvrSendBuff[17] =  SystemManager.Site[1];
	SvrSendBuff[18] =  SystemManager.Site[2];
	SvrSendBuff[19] =  SystemManager.Site[3];

	SvrSendBuff[20] =  SystemManager.Dong[0]; //Dong
	SvrSendBuff[21] =  SystemManager.Dong[1];

	SvrSendBuff[22] =  SystemManager.Ho[0]; //Ho
	SvrSendBuff[23] =  SystemManager.Ho[1];

	SvrSendBuff[24] =  0; //KEY NUM
	SvrSendBuff[25] =  0; //KEY TYPE

	SvrSendBuff[26] =  0; //Random
	SvrSendBuff[27] =  0;  

	SvrSendBuff[28] =  COM_ETX;

//	NRF_LOG_INFO("SendParkingBand ===");
	SendToEventServer(&SvrSendBuff[0], 1);

	SendToEventServer(&SvrSendBuff[0], 29);

//	SystemManager.SwitchOn = 1;
	SystemManager.SwitchOn = 0;


	for(i=0; i<2; i++){
		PKLedOn();
		nrf_delay_ms(300);
		PKLedOff();
		nrf_delay_ms(300);
	}

}



/******************************************************************************
*
*						 송신기 --------> Event Server
*
*******************************************************************************/

void SendAck(uint8_t cmd)
{

	uint8_t i;

	NRF_LOG_RAW_INFO("===> SendAck()\n");

	memset(SvrSendBuff, 0x00, sizeof(SvrSendBuff));
	
	SvrSendBuff[0] =  COM_STX;
	SvrSendBuff[1] =  COM_TYPE_SVR;
	SvrSendBuff[2] =  0;

	SvrSendBuff[3] =  cmd;

	SvrSendBuff[4] =  0;
	SvrSendBuff[5] =  0;
	SvrSendBuff[6] =  0;
	SvrSendBuff[7] =  new_ble_addr.addr[3];
	SvrSendBuff[8] =  new_ble_addr.addr[4];
	SvrSendBuff[9] =  new_ble_addr.addr[5];
	
	SvrSendBuff[10] =  SERVER_COMM_DATA_LEN;
	
	SvrSendBuff[11] =  'A';
	SvrSendBuff[12] =  'C';
	SvrSendBuff[13] =  'K';
	SvrSendBuff[14] =  0;
	SvrSendBuff[15] =  0;
	SvrSendBuff[16] =  0;
	SvrSendBuff[17] =  0;
	SvrSendBuff[18] =  0;

	for(i=1; i<18; i++){
		SvrSendBuff[18] = SvrSendBuff[18] + SvrSendBuff[i];
	}

	SvrSendBuff[19] =  COM_ETX;

	SendToEventServer(&SvrSendBuff[0], 20);

}


void SendEmergency()
{

	NRF_LOG_RAW_INFO("===> SendEmergency()\n");

	if( SystemManager.RegRequst == 1 )
	{
		SystemManager.RegRequst = 0;
			return;
	}
  
	SvrSendBuff[0] =  COM_STX;
	SvrSendBuff[1] =  COM_TYPE_SVR;
	SvrSendBuff[2] =  0;
	SvrSendBuff[3] =  COM_TYPE_BELL_EMG;

	SvrSendBuff[4] =  SystemManager.PeerAddr[3];
	SvrSendBuff[5] =  SystemManager.PeerAddr[4];
	SvrSendBuff[6] =  SystemManager.PeerAddr[5];
	SvrSendBuff[7] =  new_ble_addr.addr[3];
	SvrSendBuff[8] =  new_ble_addr.addr[4];
	SvrSendBuff[9] =  new_ble_addr.addr[5];
	
	SvrSendBuff[10] =  SERVER_COMM_DATA_LEN;

	SvrSendBuff[11] =  SystemManager.BatLevel;
	SvrSendBuff[12] =  0;
	SvrSendBuff[13] =  0;
	SvrSendBuff[14] =  0;
	SvrSendBuff[15] =  0;
	SvrSendBuff[16] =  0;
	SvrSendBuff[17] =  0;
	SvrSendBuff[18] =  0;
	SvrSendBuff[19] =  COM_ETX;

	NRF_LOG_INFO("SendEmergency ===");
	SendToEventServer(&SvrSendBuff[0], 20);

	SystemManager.SwitchOn = 1;

	PKBuzzerOn();

}




void SendAlive()
{

	NRF_LOG_RAW_INFO("===> SendAlive()\n");

	SvrSendBuff[0] =  COM_STX;
	SvrSendBuff[1] =  COM_TYPE_SVR;
	SvrSendBuff[2] =  0;
	SvrSendBuff[3] =  COM_TYPE_SVR_ALIVE;
	SvrSendBuff[4] =  SystemManager.PeerAddr[3];
	SvrSendBuff[5] =  SystemManager.PeerAddr[4];
	SvrSendBuff[6] =  SystemManager.PeerAddr[5];
	SvrSendBuff[7] =  new_ble_addr.addr[3];
	SvrSendBuff[8] =  new_ble_addr.addr[4];
	SvrSendBuff[9] =  new_ble_addr.addr[5];
	
	SvrSendBuff[10] =  SERVER_COMM_DATA_LEN;		// Data Length

	SvrSendBuff[11] =  SystemManager.BatLevel;
	SvrSendBuff[12] =  0;
	SvrSendBuff[13] =  0;
	SvrSendBuff[14] =  0;
	SvrSendBuff[15] =  0;
	SvrSendBuff[16] =  0;
	SvrSendBuff[17] =  0;
	SvrSendBuff[18] =  0;
	SvrSendBuff[19] =  COM_ETX;

	NRF_LOG_INFO("SendAlive ===");
	SendToEventServer(&SvrSendBuff[0], 20);

}



// 김효섭 차장 요청을 추가
void SendTest()
{

	NRF_LOG_RAW_INFO("===> SendAlive()\n");

	SvrSendBuff[0] =  COM_STX;
	SvrSendBuff[1] =  COM_TYPE_SVR;
	SvrSendBuff[2] =  0;
	SvrSendBuff[3] =  COM_TYPE_SVR_TEST;
	SvrSendBuff[4] =  SystemManager.PeerAddr[3];
	SvrSendBuff[5] =  SystemManager.PeerAddr[4];
	SvrSendBuff[6] =  SystemManager.PeerAddr[5];
	SvrSendBuff[7] =  new_ble_addr.addr[3];
	SvrSendBuff[8] =  new_ble_addr.addr[4];
	SvrSendBuff[9] =  new_ble_addr.addr[5];
	
	SvrSendBuff[10] =  SERVER_COMM_DATA_LEN;		// Data Length

	SvrSendBuff[11] =  SystemManager.BatLevel;
	SvrSendBuff[12] =  0;
	SvrSendBuff[13] =  0;
	SvrSendBuff[14] =  0;
	SvrSendBuff[15] =  0;
	SvrSendBuff[16] =  0;
	SvrSendBuff[17] =  0;
	SvrSendBuff[18] =  0;
	SvrSendBuff[19] =  COM_ETX;

	NRF_LOG_INFO("SendAlive ===");
	SendToEventServer(&SvrSendBuff[0], 20);

}



// 송신기 등록시마다 송신기 데이타 전송 
void SendCurrentRegDev()
{

	NRF_LOG_RAW_INFO("===> SendCurrentRegDev()\n");

	uint8_t i;

	memset(SvrSendBuff, 0x00, sizeof(SvrSendBuff));

	SvrSendBuff[0] =  COM_STX;
	SvrSendBuff[1] =  COM_TYPE_SVR;
	SvrSendBuff[2] =  0;

	SvrSendBuff[3] =  COM_TYPE_SVR_RECV_LIST_ANSWER;

	SvrSendBuff[4] =  SystemManager.PeerAddr[3];
	SvrSendBuff[5] =  SystemManager.PeerAddr[4];
	SvrSendBuff[6] =  SystemManager.PeerAddr[5];
	SvrSendBuff[7] =  new_ble_addr.addr[3];
	SvrSendBuff[8] =  new_ble_addr.addr[4];
	SvrSendBuff[9] =  new_ble_addr.addr[5];
	
	SvrSendBuff[10] =  SERVER_COMM_DATA_LEN;

	SvrSendBuff[11] =  0;
	SvrSendBuff[12] =  0;
	SvrSendBuff[13] =  0;
	SvrSendBuff[14] =  0;
	SvrSendBuff[15] =  0;
	SvrSendBuff[16] =  0;
	SvrSendBuff[17] =  0;

	for(i=1; i<18; i++){
		SvrSendBuff[18] = SvrSendBuff[18] + SvrSendBuff[i];
	}

	SvrSendBuff[19] =  COM_ETX;

	SendToEventServer(&SvrSendBuff[0], 20);

	nrf_delay_ms(50);

}




// 비상벨 목록 응답.
void Server_Answer_Reg_List()
{

	char tmpStr[10];

	uint8_t i;

	NRF_LOG_RAW_INFO("===> Server_Answer_Reg_List(%d)\n", RegMacPool.Count);

#if 1
	if( RegMacPool.Count == 0 )
	{
		memset(SvrSendBuff, 0x00, sizeof(SvrSendBuff));
	
		SvrSendBuff[0] =  COM_STX;
		SvrSendBuff[1] =  COM_TYPE_SVR;
		SvrSendBuff[2] =  0;
		SvrSendBuff[3] =  COM_TYPE_SVR_RECV_LIST_ANSWER;

		strcpy( tmpStr, &RegMacPool.Mac[i][6]);
		tmpStr[6] = 0;
		SvrSendBuff[6] = strtoul( &tmpStr[4], NULL, 16 );
		tmpStr[4] = 0;
		SvrSendBuff[5] = strtoul( &tmpStr[2], NULL, 16 );
		tmpStr[2] = 0;
		SvrSendBuff[4] = strtoul( &tmpStr[0], NULL, 16 );

		SvrSendBuff[7] =  new_ble_addr.addr[3];
		SvrSendBuff[8] =  new_ble_addr.addr[4];
		SvrSendBuff[9] =  new_ble_addr.addr[5];

		SvrSendBuff[10] =  SERVER_COMM_DATA_LEN;
		SvrSendBuff[11] =  0;
		SvrSendBuff[12] =  0;
		SvrSendBuff[13] =  0;
		SvrSendBuff[14] =  0;
		SvrSendBuff[15] =  0;
		SvrSendBuff[16] =  0;
		SvrSendBuff[17] =  0;
		
		for(i=1; i<18; i++){
			SvrSendBuff[18] = SvrSendBuff[18] + SvrSendBuff[i];
		}

		SvrSendBuff[19] =  COM_ETX;

		NRF_LOG_INFO("DevList %02x%02x%02x ===== ", SvrSendBuff[4], SvrSendBuff[5], SvrSendBuff[6]);
		SendToEventServer(&SvrSendBuff[0], 20);

		nrf_delay_ms(50);
	}	
#endif	

	for( i=0; i<RegMacPool.Count; i++)
	{

		memset(SvrSendBuff, 0x00, sizeof(SvrSendBuff));
	
		strcpy( tmpStr, &RegMacPool.Mac[i][6]);
		tmpStr[6] = 0;
		SvrSendBuff[6] = strtoul( &tmpStr[4], NULL, 16 );

		tmpStr[4] = 0;
		SvrSendBuff[5] = strtoul( &tmpStr[2], NULL, 16 );

		tmpStr[2] = 0;
		SvrSendBuff[4] = strtoul( &tmpStr[0], NULL, 16 );

		SvrSendBuff[0] =  COM_STX;
		SvrSendBuff[1] =  COM_TYPE_SVR;
		SvrSendBuff[2] =  0;
		
		SvrSendBuff[3] =  COM_TYPE_SVR_RECV_LIST_ANSWER;

		SvrSendBuff[7] =  new_ble_addr.addr[3];
		SvrSendBuff[8] =  new_ble_addr.addr[4];
		SvrSendBuff[9] =  new_ble_addr.addr[5];

		SvrSendBuff[10] =  SERVER_COMM_DATA_LEN;

		SvrSendBuff[11] =  0;
		SvrSendBuff[12] =  0;
		SvrSendBuff[13] =  0;
		SvrSendBuff[14] =  0;
		SvrSendBuff[15] =  0;
		SvrSendBuff[16] =  0;
		SvrSendBuff[17] =  0;
		
		for(i=1; i<18; i++){
			SvrSendBuff[18] = SvrSendBuff[18] + SvrSendBuff[i];
		}

		SvrSendBuff[19] =  COM_ETX;

		NRF_LOG_INFO("DevList %02x%02x%02x ===== ", SvrSendBuff[4], SvrSendBuff[5], SvrSendBuff[6]);
		SendToEventServer(&SvrSendBuff[0], 20);
		nrf_delay_ms(200);

	}
}
  



void Server_Answer_Call()
{

	char tmpStr[10];

	uint8_t i;

	memset(SvrSendBuff, 0x00, sizeof(SvrSendBuff));

	NRF_LOG_INFO("Server_Answer_Call()");
	
	if( SystemManager.ServerCon == 0 )
	{
		SystemManager.LedBlinkRun = 1;
		SystemManager.LedBlinkTimer = 5000;
		SystemTimer.LED_TOGGLE_TIMER = 0;
		SystemManager.DevType = 0;

		SystemManager.SwitchOn = 1;

  		PKBuzzerOn();
	
		SvrSendBuff[0] =  COM_STX;
		SvrSendBuff[1] =  COM_TYPE_SVR;
		SvrSendBuff[2] =  0;

		SvrSendBuff[3] =  COM_TYPE_SVR_CALL_ANSWER;

		if( RegMacPool.Count != 0 ){  // 등록된 송신기가 있으면 첫번째 MAC 전송

			strcpy( tmpStr, &RegMacPool.Mac[0][6]);

			tmpStr[6] = 0;
			SvrSendBuff[6] = strtoul( &tmpStr[4], NULL, 16 );

			tmpStr[4] = 0;
			SvrSendBuff[5] = strtoul( &tmpStr[2], NULL, 16 );
			
			tmpStr[2] = 0;
			SvrSendBuff[4] = strtoul( &tmpStr[0], NULL, 16 );

		}else{						// 없으면 000000 전송
			
			SvrSendBuff[4] =  0;
			SvrSendBuff[5] =  0;
			SvrSendBuff[6] =  0;
		}
		SvrSendBuff[7] =  new_ble_addr.addr[3];
		SvrSendBuff[8] =  new_ble_addr.addr[4];
		SvrSendBuff[9] =  new_ble_addr.addr[5];
		
		SvrSendBuff[10] =  SERVER_COMM_DATA_LEN;


		SvrSendBuff[11] = 0;
		SvrSendBuff[12] = 0;
		SvrSendBuff[13] = 0;
		SvrSendBuff[14] = 0;
		SvrSendBuff[15] = 0;
		SvrSendBuff[16] = 0;
		SvrSendBuff[17] = 0;
		
		for(i=1; i<18; i++){
			SvrSendBuff[18] = SvrSendBuff[18] + SvrSendBuff[i];
		}

		SvrSendBuff[19] =  COM_ETX;
		
		SendToEventServer(&SvrSendBuff[0], 20);

	}
}




void Server_Answer_Version()
{

	uint8_t i;

	uint8_t check_sum = 0;

	NRF_LOG_RAW_INFO("===> Server_Version_Answer()\n");



	if( SystemManager.ServerCon == 0)
	{
		memset(SvrSendBuff, 0x00, sizeof(SvrSendBuff));
		
		SystemManager.LedBlinkRun = COM_TYPE_SVR_VER_REQ;
		SystemManager.LedBlinkTimer = 1500;
		SystemTimer.LED_TOGGLE_TIMER = 0;

		SystemManager.DevType = 0;

		SvrSendBuff[0] =  COM_STX;
		SvrSendBuff[1] =  COM_TYPE_SVR;
		SvrSendBuff[2] =  0;

		SvrSendBuff[3] =  COM_TYPE_SVR_VER_ANSWER;

		SvrSendBuff[4] =  0;
		SvrSendBuff[5] =  0;
		SvrSendBuff[6] =  0;
		SvrSendBuff[7] =  new_ble_addr.addr[3];
		SvrSendBuff[8] =  new_ble_addr.addr[4];
		SvrSendBuff[9] =  new_ble_addr.addr[5];

		SvrSendBuff[10] =  SERVER_COMM_DATA_LEN;
		
		SvrSendBuff[11] =  IES600RB_VER_HIGH;
		SvrSendBuff[12] =  IES600RB_VER_LOW;
		SvrSendBuff[13] =  0;
		SvrSendBuff[14] =  0;
		SvrSendBuff[15] =  0;
		SvrSendBuff[16] =  0;
		SvrSendBuff[17] =  0;

		for(i=1; i<18; i++){
			SvrSendBuff[18] = SvrSendBuff[18] + SvrSendBuff[i];
		}

		SvrSendBuff[19] =  COM_ETX;

		SendToEventServer(&SvrSendBuff[0], 20);

		SystemManager.SwitchOn = 0;

	}


	NRF_LOG_RAW_INFO("================================================================================\n");
	NRF_LOG_RAW_INFO("======================== Reboot To BootLoad Start ==============================\n");
	NRF_LOG_RAW_INFO("================================================================================\n");	

	nrf_delay_ms(1000);

	for(i=0; i<5; i++){
	
		PKLedOn();
		nrf_delay_ms(100);
		PKLedOff();
		nrf_delay_ms(100);
	}


	nrf_power_gpregret_set(0xB1);
	NVIC_SystemReset();


}


void Server_Answer_Upgread()
{

	uint8_t i;

	uint8_t check_sum = 0;

	NRF_LOG_RAW_INFO("===> Server_Answer_Upgread()\n");

	if( SystemManager.ServerCon == 0)
	{
		memset(SvrSendBuff, 0x00, sizeof(SvrSendBuff));
		
		SystemManager.LedBlinkRun = COM_TYPE_SVR_VER_REQ;
		SystemManager.LedBlinkTimer = 1500;
		SystemTimer.LED_TOGGLE_TIMER = 0;

		SystemManager.DevType = 0;

		SvrSendBuff[0] =  COM_STX;
		SvrSendBuff[1] =  COM_TYPE_SVR;
		SvrSendBuff[2] =  0;

		SvrSendBuff[3] =  COM_TYPE_SVR_UPGREAD_ANSWER;

		SvrSendBuff[4] =  0;
		SvrSendBuff[5] =  0;
		SvrSendBuff[6] =  0;
		SvrSendBuff[7] =  new_ble_addr.addr[3];
		SvrSendBuff[8] =  new_ble_addr.addr[4];
		SvrSendBuff[9] =  new_ble_addr.addr[5];

		SvrSendBuff[10] =  SERVER_COMM_DATA_LEN;
		
		SvrSendBuff[11] =  0;
		SvrSendBuff[12] =  0;
		SvrSendBuff[13] =  0;
		SvrSendBuff[14] =  0;
		SvrSendBuff[15] =  0;
		SvrSendBuff[16] =  0;
		SvrSendBuff[17] =  0;
		
		for(i=1; i<18; i++){
			SvrSendBuff[18] = SvrSendBuff[18] + SvrSendBuff[i];
		}

		SvrSendBuff[19] =  COM_ETX;

		SendToEventServer(&SvrSendBuff[0], 20);

		SystemManager.SwitchOn = 0;
	}


	NRF_LOG_RAW_INFO("================================================================================\n");
	NRF_LOG_RAW_INFO("======================== Reboot To BootLoad Start ==============================\n");
	NRF_LOG_RAW_INFO("================================================================================\n");	

	nrf_delay_ms(1000);

	for(i=0; i<5; i++){
	
		PKLedOn();
		nrf_delay_ms(100);
		PKLedOff();
		nrf_delay_ms(100);
	}

	nrf_power_gpregret_set(0xB1);
	NVIC_SystemReset();
	
}




// 사용않함
void SendEmergencyLocal()
{

	uint8_t i;

	uint8_t check_sum = 0;


	SvrSendBuff[0] =  COM_STX;
	SvrSendBuff[1] =  COM_TYPE_SVR;
	SvrSendBuff[2] =  0;
	
	SvrSendBuff[3] =  COM_TYPE_BELL_EMG;

	SvrSendBuff[4] =  0xaa;
	SvrSendBuff[5] =  0xaa;
	SvrSendBuff[6] =  0xaa;
	SvrSendBuff[7] =  0xbb;
	SvrSendBuff[8] =  0xbb;
	SvrSendBuff[9] =  0xbb;
	
	SvrSendBuff[10] =  SERVER_COMM_DATA_LEN;

	SvrSendBuff[11] =  0;
	SvrSendBuff[12] =  0;
	SvrSendBuff[13] =  0;
	SvrSendBuff[14] =  0;
	SvrSendBuff[15] =  0;
	SvrSendBuff[16] =  0;
	SvrSendBuff[17] =  0;
	SvrSendBuff[18] =  0;

	SvrSendBuff[19] =  COM_ETX;	
	

	SendToEventServer(&SvrSendBuff[0], 20);
	SystemManager.SwitchOn = 1;
	PKBuzzerOn();

}



// 송신기 테스트 버튼눌렀을시 동작 
void AliveTest()
{

  	SystemManager.SwitchOn = 1;
	PKBuzzerOn();
	SystemManager.LedBlinkRun = COM_TYPE_SVR_ALIVE;
	SystemManager.LedBlinkTimer = 3300;
	SystemTimer.LED_TOGGLE_TIMER = 0;

}




#if 0
// 사용않함
void SendTest()
{
	if( SystemTimer.SEND_TEST_TIMER < 3000 )
		return;

	SystemTimer.SEND_TEST_TIMER = 0;

	SendEmergency();
  
}
#endif


void LedToggle()
{

	static char toggle = 0;

	if( SystemManager.RegRequst )
	{

		if( SystemTimer.DEV_REG_TIMER >= 60000 )
		{
			SystemManager.RegRequst = 0;
			PKLedOff();
			SystemManager.LedBlinkRun = 0;
		}
	}
  
	// 송신기 등록모드시 항상 ON
	if( SystemManager.LedBlinkRun == COM_TYPE_SVR_RECV_REG )
	{
		PKLedOn();
		return;
	}


	if( SystemManager.LedBlinkRun == COM_TYPE_SVR_RECV_REG+1 )
	{

		if( SystemManager.RegRequst == 1 )
		{
			if( SystemManager.LedBlinkTimer < 0 )
			{
				SystemManager.LedBlinkRun = COM_TYPE_SVR_RECV_REG;
				PKLedOn(); 	
				return;
			}
		}


		if( SystemTimer.LED_TOGGLE_TIMER < 500 )
			return;

		SystemTimer.LED_TOGGLE_TIMER = 0;


		if( toggle++&0x01)
		{
			PKLedOn();
		}else{
			PKLedOff();
		}
	}


#if 0
	if( SystemManager.LedBlinkRun == COM_TYPE_SVR_PARKING )
	{
		if( SystemManager.LedBlinkTimer < 0 )
		{
			SystemManager.LedBlinkRun = 0;
			PKLedOff(); 	
			return;
		}


		if( SystemTimer.LED_TOGGLE_TIMER < 500 )
			return;

		SystemTimer.LED_TOGGLE_TIMER = 0;

		if( toggle++&0x01)
		{
			PKLedOn();
		}else{
			PKLedOff();
		}
	}
#endif

#if 0	
	if( SystemManager.LedBlinkRun == COM_TYPE_SVR_RECV_INIT )
	{
		if( SystemManager.LedBlinkTimer < 0 )
		{
			SystemManager.LedBlinkRun = 0;
			PKLedOff();	  

			return;
		}

		if( SystemTimer.LED_TOGGLE_TIMER < 500 )
			return;

		SystemTimer.LED_TOGGLE_TIMER = 0;

		if( toggle++&0x01)
		{
			PKLedOn();
		}else{
			PKLedOff();
		}
	}
#endif


#if 0
	if( SystemManager.LedBlinkRun == COM_TYPE_SVR_RECV_LIST || SystemManager.LedBlinkRun == COM_TYPE_SVR_VER_REQ)
	{
		if( SystemManager.LedBlinkTimer < 0 )
		{
			SystemManager.LedBlinkRun = 0;
			PKLedOff();	  

			return;
		}

		if( SystemTimer.LED_TOGGLE_TIMER < 500 )
			return;

		SystemTimer.LED_TOGGLE_TIMER = 0;

		if( toggle++&0x01)
		{
			PKLedOn();
		}else{
			PKLedOff();
		}
	}
#endif




	if( SystemManager.LedBlinkRun == COM_TYPE_SVR_ALIVE )
	{
		if( SystemManager.LedBlinkTimer < 0 )
		{
			SystemManager.LedBlinkRun = 0;
			PKLedOff();	
			PKBuzzerOff();

			return;
		}


		if( SystemTimer.LED_TOGGLE_TIMER < 500 )
			return;

		SystemTimer.LED_TOGGLE_TIMER = 0;

		if( toggle++&0x01)
		{
			PKLedOn();
		}else{
			PKLedOff();
		}
	}	

	if( SystemManager.SwitchOn == 0 )
		return;

	if( SystemManager.LedBlinkRun == 0 )
		return;


#if 0
	if( SystemManager.LedBlinkTimer < 0 )
	{

		SystemManager.LedBlinkRun = 0;
		PKLedOff();  	

		return;
	}
#endif

	if( SystemTimer.LED_TOGGLE_TIMER < 500 )
		return;

	SystemTimer.LED_TOGGLE_TIMER = 0;


	if( toggle++&0x01)
	{
		PKLedOn();
	}else{
		PKLedOff();
	}
}


