/**
 * 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];
char SvrSendBuff_bak[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;
			NRF_LOG_RAW_INFO("==========================>\n\n");
		}

		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;
	}
}






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


void ParseEventServer()
{

	int i;

	if( SystemManager.RxEvent == 0 )
		return;

	SystemManager.RxEvent = 0;


	NRF_LOG_RAW_INFO("\n\n");
	NRF_LOG_RAW_INFO("SERVER ==> RECEVER 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 NUM_TYPE_SVR:
		case COM_TYPE_BAND:		//

			switch(SvrRxBuffer[3]){


				// 수신기 비상신호에 대한 ACK 신호
				case COM_TYPE_SVR_EMG_ACK:

					SystemManager.Emg_Ack_Flag = 0;

				break;


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

					SystemManager.System_State = SYSTEM_NONE;

					NRF_LOG_INFO("Recv : Normal");

					PKLedOff();
					PKBuzzerOff();
					PKMicOff();
					PKSpeakerOff();					
					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:

					SystemManager.System_State = SYSTEM_SERVER_COMM;

					SystemTimer.SYSTEM_SERVER_COMM_CNT = 0;
				
					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_REQ");

					if(SystemManager.System_State == SYSTEM_NONE){

						SystemManager.System_State = SYSTEM_REGISTER;

						SystemManager.LedBlinkRun = COM_TYPE_SVR_RECV_REG_REQ;
						SystemManager.RegRequst = 1;

						SendAck(COM_TYPE_SVR_RECV_REG_ANSWER);

						SystemTimer.DEV_REG_TIMER = 0;
					}else{
						
						NRF_LOG_INFO("SYSTEM is BUSY : [%d]\n", SystemManager.System_State);
					}

				break;

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

					NRF_LOG_INFO("Recv : COM_TYPE_SVR_RECV_INIT_REQ");

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

//					SystemManager.SwitchOn = 1;
					
					SendAck(COM_TYPE_SVR_RECV_INIT_ANSWER);


					//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_REQ");

//					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);
	}

}






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

void SendParkingApp()
{
	int i;

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


  	SystemManager.SwitchOn = 0;
	SystemManager.LedBlinkRun = COM_TYPE_APP_PARKING;
	SystemManager.LedBlinkTimer = 1200;
	SystemTimer.LED_TOGGLE_TIMER = 0;


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

	SvrSendBuff[0] =  COM_STX;
	SvrSendBuff[1] =  COM_COMM_ONEPASS;
	
	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] =  0x12;
	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];	//DONG


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

	SvrSendBuff[24] =  SystemManager.Key_Num; //KEY NUM
	SvrSendBuff[25] =  SystemManager.Key_Type; //KEY TYPE

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

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

	SvrSendBuff[29] =  COM_ETX;

	SendToEventServer(&SvrSendBuff[0], 30);

}



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


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;

	SystemManager.System_State = SYSTEM_EMERGENCY_SIREN;
	SystemManager.Emg_Ack_Flag = 2;

	PKBuzzerOn();

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

	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] =  0x12;
	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;  

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

	SvrSendBuff[29] =  COM_ETX;

	memcpy(SvrSendBuff_bak, SvrSendBuff, sizeof(SvrSendBuff));

	NRF_LOG_INFO("SendEmergencyBand===");


	SendToEventServer(&SvrSendBuff[0], 30);


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

}




void SendParkingBand()
{

	uint8_t i;

	uint8_t check_sum = 0;

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

	SystemManager.DevType = 0;
	SystemManager.LedBlinkRun = COM_TYPE_BAND_PARKING;
	SystemManager.LedBlinkTimer = 1200;
	SystemTimer.LED_TOGGLE_TIMER = 0;

  	SystemManager.SwitchOn = 0;


	memset(SvrSendBuff, 0x00, sizeof(SvrSendBuff));
	
	SvrSendBuff[0] =  COM_STX;
	SvrSendBuff[1] =  COM_COMM_SMART_BAND;
	
	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] =  0x12;
	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;  

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

	SvrSendBuff[29] =  COM_ETX;

	NRF_LOG_INFO("SendParkingBand ===");

	SendToEventServer(&SvrSendBuff[0], 30);

}



void ReSendEmergency()
{

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

	memcpy(SvrSendBuff, SvrSendBuff_bak, sizeof(SvrSendBuff));

	NRF_LOG_INFO("ReSendEmergency ===");
	
	switch(SystemManager.Emg_Ack_Flag){

		case 1:	// 비상벨 EMG
			SendToEventServer(&SvrSendBuff[0], 20);
		break;

		case 2:	// 밴드 EMG
			SendToEventServer(&SvrSendBuff[0], 30);
		break;
	}
}




/******************************************************************************
*
*			비상벨 --->   송신기 --------> 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_COMM_EMG_SWTICH;
	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()
{

	uint8_t i;

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



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


	SystemManager.System_State = SYSTEM_EMERGENCY_SIREN;

	SystemManager.Emg_Ack_Flag = 1;


	if( SystemManager.RegRequst == 1 )		// 등록모드일경우 등록모드 해제, 비상모드 전환
	{
		SystemManager.RegRequst = 0;
//			return;
	}

	memset(SvrSendBuff, 0x00, sizeof(SvrSendBuff));
	
	SvrSendBuff[0] =  COM_STX;
	SvrSendBuff[1] =  COM_COMM_EMG_SWTICH;
	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.TransferVerHigh;
	SvrSendBuff[12] =  SystemManager.TransferVerLow;
	SvrSendBuff[13] =  SystemManager.BatLevel;
	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;

	memcpy(SvrSendBuff_bak, SvrSendBuff, sizeof(SvrSendBuff));

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

	SystemManager.SwitchOn = 1;

	PKBuzzerOn();

}




void SendAlive()
{

	uint8_t i;

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

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

	SvrSendBuff[0] =  COM_STX;
	SvrSendBuff[1] =  COM_COMM_EMG_SWTICH;
	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;

	SvrSendBuff[11] =  SystemManager.TransferVerHigh;
	SvrSendBuff[12] =  SystemManager.TransferVerLow;
	SvrSendBuff[13] =  SystemManager.BatLevel;
	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("SendAlive ===");
	SendToEventServer(&SvrSendBuff[0], 20);

}



void SendTest()
{
	uint8_t i;

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

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

	SvrSendBuff[0] =  COM_STX;
	SvrSendBuff[1] =  COM_COMM_EMG_SWTICH;
	
	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;

	SvrSendBuff[11] =  SystemManager.TransferVerHigh;
	SvrSendBuff[12] =  SystemManager.TransferVerLow;
	SvrSendBuff[13] =  SystemManager.BatLevel;

	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("SendTest ===");
	SendToEventServer(&SvrSendBuff[0], 20);

}



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

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

	uint8_t i;

	SystemTimer.SYSTEM_REGISTER_CNT = 0;

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

	SvrSendBuff[0] =  COM_STX;
	SvrSendBuff[1] =  COM_COMM_EMG_SWTICH;

	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;
	uint8_t j;
	

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

	i = 0;
	
	if( RegMacPool.Count == 0 )
	{

#if 1
		memset(SvrSendBuff, 0x00, sizeof(SvrSendBuff));
	
		SvrSendBuff[0] =  COM_STX;
		SvrSendBuff[1] =  COM_COMM_EMG_SWTICH;

		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[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;
#endif

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

		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);

		return;
	}	


	for( i=0; i<RegMacPool.Count; i++)
	{
		memset(SvrSendBuff, 0x00, sizeof(SvrSendBuff));

		SvrSendBuff[0] =  COM_STX;
		SvrSendBuff[1] =  COM_COMM_EMG_SWTICH;

		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(j=1; j<18; j++){
			SvrSendBuff[18] = SvrSendBuff[18] + SvrSendBuff[j];
		}

		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;
	uint8_t j;

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

	NRF_LOG_INFO("Server_Answer_Call()");

	SystemManager.System_State = SYSTEM_SERVER_COMM_REQ;

	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_COMM_EMG_SWTICH;

		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(j=1; j<18; j++){
			SvrSendBuff[18] = SvrSendBuff[18] + SvrSendBuff[j];
		}

		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(22)\n");

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

	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_COMM_EMG_SWTICH;

		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_delay_ms(1000);

}


void Server_Answer_Upgread()
{

	uint8_t i;

	uint8_t check_sum = 0;

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

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

	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_COMM_EMG_SWTICH;

		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] =  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_delay_ms(3000);

	nrf_power_gpregret_set(0xB1);
	
	NVIC_SystemReset();
	
}




// 사용않함
void SendEmergencyLocal()
{

	uint8_t i;

	uint8_t check_sum = 0;

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

	SvrSendBuff[0] =  COM_STX;
	SvrSendBuff[1] =  COM_COMM_EMG_SWTICH;

	SvrSendBuff[2] =  0;
	SvrSendBuff[3] =  COM_TYPE_BELL_EMG;

	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 = 1;
	PKBuzzerOn();

}



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

	int buz_cnt = 0;
	int led_cnt = 0;
	char blink_cnt = 0;
	char blink_flag = 0;
	
	uint8_t ex = 1;

	NRF_LOG_RAW_INFO("Void AliveTest()\n");

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

}






void LedToggle()
{

	static char toggle = 0;

	
	// 송신기 등록모드시 항상 ON


	switch(SystemManager.LedBlinkRun){
		
		case COM_TYPE_SVR_RECV_REG_REQ:
			PKLedOn();
			return;
		break;

		case COM_TYPE_SVR_RECV_REG_ANSWER:

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

			if( SystemTimer.LED_TOGGLE_TIMER < 500 )
				return;

			SystemTimer.LED_TOGGLE_TIMER = 0;

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

		break;

		case COM_TYPE_SVR_TEST:

			if( SystemManager.LedBlinkTimer < 0 )
			{
				SystemManager.LedBlinkRun = 0;
				PKLedOff(); 
				PKBuzzerOff();
				toggle = 0;
				return;
			}
			
			
			if( SystemTimer.LED_TOGGLE_TIMER < 500 )
				return;
			
			SystemTimer.LED_TOGGLE_TIMER = 0;
			
			if( ++toggle & 0x01)
			{
				PKLedOn();
			}else{
				PKLedOff();
			}
		break;


		case COM_TYPE_BAND_PARKING:
		case COM_TYPE_APP_PARKING:
		case COM_TYPE_IOS_APP_PARKING:
		case COM_TYPE_NEW_IOS_APP_PARKING:

			if( SystemManager.LedBlinkTimer < 0 )
			 {
				 SystemManager.LedBlinkRun = 0;
				 PKLedOff();
				 toggle = 0;
				 return;
			 }
			
			
			 if( SystemTimer.LED_TOGGLE_TIMER < 300 )
				 return;
			
			 SystemTimer.LED_TOGGLE_TIMER = 0;
			
			 if( ++toggle & 0x01)
			 {
				 PKLedOn();
			 }else{
				 PKLedOff();
			 }
		break;
	}			




	if( SystemManager.SwitchOn == 0 )
		return;

	if( SystemManager.LedBlinkRun == 0 )
		return;


	if( SystemTimer.LED_TOGGLE_TIMER < 500 )
		return;

	SystemTimer.LED_TOGGLE_TIMER = 0;

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


