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

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



stSystemTimer SystemTimer;
stSystemManager SystemManager;




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




void ParseEventServer()
{
	int i;


	if( SystemManager.RxEvent == 0 )
		return;


	for( i=0; i<20; i++)
	{
	  //printf("0x%02x ", SvrRxBuffer[i]);
	}

	SystemManager.RxEvent = 0;


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



  if( SvrRxBuffer[1] == COM_TYPE_SVR )
  {
  
    if( SvrRxBuffer[3] == COM_TYPE_SVR_NORMAL )
    {
      NRF_LOG_INFO("Recv : Normal");
        PKLedOff();
        PKBuzzerOff();
        PKMicOff();
        SystemManager.SwitchOn = 0;
         
  
    }else if( SvrRxBuffer[3] == COM_TYPE_SVR_TALKING )
    {
        NRF_LOG_INFO("Recv : Talking");
        PKLedOn();
        PKBuzzerOff();
        SystemManager.SwitchOn = 0;
      
  
    }else if( SvrRxBuffer[3] == COM_TYPE_SVR_DISCON )
    {
  
      NRF_LOG_INFO("Recv : Disconnect");
      SystemManager.SwitchOn = 0;
      //bsp_board_leds_off();
  
    }else if( SvrRxBuffer[3] == COM_TYPE_SVR_BUSY )
    {
  
      NRF_LOG_INFO("Recv : Busy");
  
    }else if( SvrRxBuffer[3] == COM_TYPE_SVR_ALIVE )
    {
  
      NRF_LOG_INFO("Recv : Keep Alive");
  
    }else if( SvrRxBuffer[3] == COM_TYPE_SVR_MIC )
    {
  
      NRF_LOG_INFO("Recv : mic on/off");
      if( SvrRxBuffer[11] == 0 )
      {  
        NRF_LOG_INFO("mic off"); 
         NRF_LOG_INFO("speaker off");  
         PKSpeakerOff();
          PKMicOn();
           PKBuzzerOff();
           PKLedOn();
        SystemManager.SwitchOn = 0;
      }else{
        NRF_LOG_INFO("mic on"); 
         NRF_LOG_INFO("speaker on");  
         PKMicOff();
         PKSpeakerOn();
         PKLedOn();
      }
  
    }
  
  }else if( SvrRxBuffer[1] == COM_TYPE_BAND )
  {
  
  
  
  }


}



void SendToEventServer(char* data, int len)
{

  int i;


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



}


char SvrSendBuff[50];
void SendEmergency()
{
  
  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;

  NRF_LOG_INFO("SendEmergency");
  SendToEventServer(&SvrSendBuff[1], 19);
  SystemManager.SwitchOn = 1;
  PKBuzzerOn();
   NRF_LOG_INFO("SendEmergency");

}


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 LedToggle()
{
  static char toggle = 0;

  if( SystemManager.SwitchOn == 0 )
    return;


  if( SystemTimer.LED_TOGGLE_TIMER < 500 )
    return;

    SystemTimer.LED_TOGGLE_TIMER = 0;
  

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


}


