/****************************************************************************/
/* Copyright 2007 MBARI.                                                    */
/* Monterey Bay Aquarium Research Institute Proprietary Information.        */
/* All rights reserved.       																						  */
/*																																					*/
/* Command_Handler.c - Handles all incoming RS485nds												*/
/*																																					*/
/* Rev History:																															*/
/* Initial Creation 11/2007		B.Kieft							     											*/
/*																																					*/
/*																																					*/
/****************************************************************************/

#include <stdlib.h>
#include "loadControl_main.h"

char received_spi_data_mastr[MAX_SPI_CHARS];
char sent_spi_data_mastr[MAX_SPI_CHARS];

//////
////// Control Commands
#SEPARATE
void handle_load_power() {
  sprintf(response_message, "handle_load_power\r\n");  
  send_response(response_message);	
  if(parameter == 0) {
    output_bit(PIN_B3, LO); // Turn off load
    output_bit(PIN_B4, LO); // Turn off PIC
  }
  else if(parameter == 1) {
  	output_bit(PIN_B3, HI); // Turn on load
  	delay_ms(5); // wait for voltage to rise on "slave" pin
  	output_bit(PIN_B4, HI); // Turn on PIC
  }
  else {
  	//send error here
  }
}

#SEPARATE
void handle_comm_relay() {
  sprintf(response_message, "handle_comm_relay\r\n");  
  send_response(response_message);	
  if(parameter == 0) {
    output_bit(PIN_B1, HI); 
    delay_ms(8);
    output_bit(PIN_B1, LO); 
    relay_status_closed = false;
  }
  else if(parameter == 1) {
    output_bit(PIN_B2, HI); 
    delay_ms(8);
    output_bit(PIN_B2, LO); 
    relay_status_closed = true;
  }
  else {
  	//send error here
  }
}

#SEPARATE
void handle_write_flash() { 
  sprintf(response_message, "handle_write_flash\r\n");  
  send_response(response_message);	
  if(parameter == 12345) {
    // okay to write flash   
  }
  else {
  	//send error here
  }  
}

//////
////// Read Status Commands
#SEPARATE
void handle_read_bus_voltage() { 
 
  sprintf(response_message, "handle_read_bus_voltage\r\n");  
  send_response(response_message);
  
  output_bit(PIN_C2, HI); // Flip on the reference voltage
  set_adc_channel(0);	
  delay_ms(6);
  do_adc_voltage_calcs(25.000);
  output_bit(PIN_C2, LO); // Turn off the reference voltage
  
  sprintf(response_message, "Volts:%f\r\n",adc_value_glob); 
  send_response(response_message);
  
}

#SEPARATE
void handle_read_load_voltage() { 
  sprintf(response_message, "handle_read_load_voltage\r\n");  
  send_response(response_message);	

  spi_write(50);                
  delay_ms(1000); //Pause for write to occur   
  
  SPI_strread(received_spi_data_mastr);
 	sprintf(response_message, "got:%s\r\n",received_spi_data_mastr); 
 	send_response(response_message);   
 
}

#SEPARATE
void handle_read_bus_current() {
  float adc_value_loc;

	sprintf(response_message, "handle_read_bus_current\r\n");  
  send_response(response_message);

  output_bit(PIN_C2, HI); // Flip on the reference voltage
  set_adc_channel(1);	
  delay_ms(9);

  do_adc_current_calcs(VREF, RSENSE, CURRDIVISOR);

  output_bit(PIN_C2, LO); // Flip off the reference voltage	
  
  sprintf(response_message, "I:%f\r\n",adc_value_glob); 
  send_response(response_message);

}

#SEPARATE
void handle_read_load_current() { 
	//char received_spi_data[MAX_SPI_CHARS];
	//int spi_char = 0;
	
	sprintf(response_message, "handle_read_load_current\r\n");  
  send_response(response_message);	

  //strcpy(sent_spi_data_mastr, testStr);
  //SPI_strwrite(sent_spi_data_mastr);   //Write data to buffer  

  spi_write(51);                
  delay_ms(1000); //Pause for write to occur 

  // Get repsonse from slave
  SPI_strread(received_spi_data_mastr);
 	sprintf(response_message, "got:%s\r\n",received_spi_data_mastr); 
 	send_response(response_message); 
}


#SEPARATE
void handle_read_gf_current() { 
  sprintf(response_message, "handle_read_gf_current. Param:%u\r\n", parameter);  
  send_response(response_message);	
  if( (parameter >= 0) && (parameter <= 3) ) {
    spi_write(parameter+1);    	
  
    delay_ms(1); //Pause for write to occur 
  
    SPI_strread(received_spi_data_mastr);
   	sprintf(response_message, "got:%s\r\n",received_spi_data_mastr); 
   	send_response(response_message); 

  }
  else {
  	//send error here
  }  

}

#SEPARATE
void handle_read_startup_oc_threshold() { 
  sprintf(response_message, "handle_read_startup_oc_threshold: %Lu\r\n",startup_oc_threshold);  
  send_response(response_message);	
}

#SEPARATE
void handle_read_q_oc_threshold() {
  sprintf(response_message, "handle_read_q_oc_threshold: %Lu\r\n",steady_oc_threshold);  
  send_response(response_message);	
}

#SEPARATE
void handle_read_startup_oc_time() { 
  sprintf(response_message, "handle_read_startup_oc_time: %Lu\r\n",startup_oc_time);  
  send_response(response_message);	

}

#SEPARATE
void handle_read_comm_realy_status() { 
	if(relay_status_closed) {
    sprintf(response_message, "handle_read_comm_realy_status: 1\r\n");  
    send_response(response_message);	
  }
  else {
    sprintf(response_message, "handle_read_comm_realy_status: 0\r\n");  
    send_response(response_message);	
  }

}

#SEPARATE
void handle_read_device_serial_number() { 
  sprintf(response_message, "EEEE\r\n");  
  send_485_response(response_message);	

}

#SEPARATE
void handle_read_errors() {
  sprintf(response_message, "handle_read_errors\r\n");  
  send_response(response_message);	

}


//////
////// Set Threshold Commands

#SEPARATE
void handle_oc_threshold_startup() {
	sprintf(response_message, "handle_oc_threshold_startup\r\n");  
  send_response(response_message);	
  if( (parameter >= 0) && (parameter <= 10000) ) {
    startup_oc_threshold = parameter;
    sprintf(response_message, "thresh:%Lu\r\n",startup_oc_threshold);  
    send_response(response_message);	
  }
  else {
  	//send error here
  }   
}

#SEPARATE
void handle_oc_threshold_q() {
	sprintf(response_message, "handle_oc_threshold_q\r\n");  
  send_response(response_message);	
  if( (parameter >= 0) && (parameter <= 10000) ) {
    steady_oc_threshold = parameter;
    sprintf(response_message, "thresh:%Lu\r\n",steady_oc_threshold);  
    send_response(response_message);	
  }
  else {
  	//send error here
  }  
}

#SEPARATE
void handle_oc_time_startup() {
	sprintf(response_message, "handle_oc_time_startup\r\n");  
  send_response(response_message);	
  if( (parameter >= 0) && (parameter <= 10000) ) {
    startup_oc_time = parameter;
    sprintf(response_message, "time:%Lu\r\n",startup_oc_time);  
    send_response(response_message);    
  }
  else {
  	//send error here
  }  
}

#SEPARATE
void handle_set_address() {
	sprintf(response_message, "Set Address\r\n");  
  send_response(response_message);
  if( (parameter >= 0) && (parameter <= 99) ) {
    RS485_ID = parameter;        
  }
  else {
  	//send error here
  }    

	
}
        	  

