/**
 * 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"


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 COM_TYPE_SVR_NORMAL   0x02
#define COM_TYPE_SVR_TALKING  0x03
#define COM_TYPE_SVR_DISCON   0x04
#define COM_TYPE_SVR_BUSY     0x05
#define COM_TYPE_SVR_ALIVE    0x06
#define COM_TYPE_SVR_MIC      0x07
#define COM_TYPE_SVR_RECV_REG 	0x08		// 서버에서 수신기에게 송신기 등록 요청
#define COM_TYPE_SVR_RECV_INIT 	0x0a
#define COM_TYPE_SVR_RECV_LIST	0x0c		// 서버에서 수신기에게 송신기 목록 요청
#define COM_TYPE_SVR_VER_REQ	0x10		//
#define COM_TYPE_SVR_CALL_REQ	0x12











/* 이벤트 서버에서 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;

				case COM_TYPE_SVR_BUSY:

					NRF_LOG_INFO("Recv : Busy");

				break;

				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:

					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:

					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:

					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;

					SendDevList();

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

				break;

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

					NRF_LOG_INFO("Recv : COM_TYPE_SVR_CALL_REQ");

					Server_Call_Request();

				break;

				case COM_TYPE_SVR_VER_REQ:

					NRF_LOG_INFO("Recv : COM_TYPE_SVR_VER_REQ");

					Server_Ver_Request();

				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 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] =  8;
	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;

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

	SystemManager.SwitchOn = 1;

	PKBuzzerOn();

}




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] =  SystemManager.PeerAddr[3];
//	SvrSendBuff[5] =  SystemManager.PeerAddr[4];
//	SvrSendBuff[6] =  SystemManager.PeerAddr[5];

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

	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("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] =  SystemManager.PeerAddr[3];
//	SvrSendBuff[5] =  SystemManager.PeerAddr[4];
//	SvrSendBuff[6] =  SystemManager.PeerAddr[5];

	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()
{
	int i;

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

	
	SvrSendBuff[0] =  COM_STX;
	SvrSendBuff[1] =  2;
	SvrSendBuff[2] =  0;
	SvrSendBuff[3] =  2;
//	SvrSendBuff[4] =  SystemManager.PeerAddr[3];
//	SvrSendBuff[5] =  SystemManager.PeerAddr[4];
//	SvrSendBuff[6] =  SystemManager.PeerAddr[5];

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

}


void SendAck(uint8_t cmd)
{

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


	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] =  8;
	SvrSendBuff[11] =  'A';
	SvrSendBuff[12] =  'C';
	SvrSendBuff[13] =  'K';
	SvrSendBuff[14] =  0;
	SvrSendBuff[15] =  0;
	SvrSendBuff[16] =  0;
	SvrSendBuff[17] =  0;
	SvrSendBuff[18] =  0;
	SvrSendBuff[19] =  COM_ETX;

//	NRF_LOG_INFO("cmd:0x%02x ACK ==== ", cmd);
	SendToEventServer(&SvrSendBuff[0], 20);

}






void SendDevList()
{

	char tmpStr[10];

	int i;

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

	
	if( RegMacPool.Count == 0 )
	{
		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] =  0x0D;
		
		SvrSendBuff[7] =  new_ble_addr.addr[3];
		SvrSendBuff[8] =  new_ble_addr.addr[4];
		SvrSendBuff[9] =  new_ble_addr.addr[5];

		SvrSendBuff[10] =  8;
		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;

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

		nrf_delay_ms(50);

	}	
	

	for( i=0; i<RegMacPool.Count; i++)
	{
		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] =  0x0d;
		//SvrSendBuff[4] =  RegMacPool.Mac[i][];
		//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] =  8;
		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;

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

	}
}
  



void SendCurrentRegDev()
{

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


	SvrSendBuff[0] =  COM_STX;
	SvrSendBuff[1] =  COM_TYPE_SVR;
	SvrSendBuff[2] =  0;
	SvrSendBuff[3] =  0x0d;
	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] =  8;
	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;

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

	nrf_delay_ms(50);

}



void Server_Call_Request()
{

	char tmpStr[10];

	int i;


	NRF_LOG_INFO("Server_Call_Request");
	
	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_REQ+1;

		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] =  8;
//		SvrSendBuff[11] =  'A';
//		SvrSendBuff[12] =  'C';
//		SvrSendBuff[13] =  'K';

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

//		SendAck(COM_TYPE_SVR_CALL_REQ+1);
	}
}




void Server_Ver_Request()
{

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

	if( SystemManager.ServerCon == 0)
	{
		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_REQ+1;
		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] =  8;
		
		SvrSendBuff[11] =  0x00;	//ver
		SvrSendBuff[12] =  0x01;
		
		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("Send Server ===> ");
		SendToEventServer(&SvrSendBuff[0], 20);

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

   
	}
	
}



// 사용않함
void SendEmergencyLocal()
{
  
	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] =  8;
	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;

}





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

	SystemTimer.SEND_TEST_TIMER = 0;

	SendEmergency();
  
}



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


