#define ADS8320_CLK  PIN_B6
#define ADS8320_DOUT PIN_B7
#define ADS8320_CS   PIN_B5


#include "core.h"
#include "ads8320.c"

//long value[5], sum, wait_time;
//float ex_value[8];
//int display_mode, spool_mode, ex_mode, rf_mode;


#SEPARATE
float abs(float i)
{
   float r;

   r = (i < 0) ? -i : i;
   return(r);
}

#SEPARATE
#use rs232(baud=115200,xmit=PIN_C6,rcv=PIN_C7)
int sel_mux_ch(int ch)
{
    // remove printf if code is working ...
    //printf("debug_sel_mux(%i) ", ch);
    if ((ch<0) || ch>7) 
    { 
    	// error condition
    	printf("wrong param\n");
    	return 1;
    }
    if (bit_test(ch,0)) 
    {	
    	//printf("B2-1");
    	output_high(PIN_B2);
    } else {
    	output_low(PIN_B2);
    	//printf("B2-0");
    }
    if (bit_test(ch,1)) 
    {	
    	//printf("B3-1");
    	output_high(PIN_B3);
    } else {
    	//output_low(PIN_B3);
    	printf("B3-0");
    }
    if (bit_test(ch,2)) 
    {	
    	//printf("B4-1\n");
    	output_high(PIN_B4);
    } else {
    	output_low(PIN_B4);
    	//printf("B4-0\n");
    }
    return 0;
}


#SEPARATE
#use rs232(baud=115200,xmit=PIN_C6,rcv=PIN_C7)
int sel_mux_ch_debug(int ch)
{
    // remove printf if code is working ...
    printf("debug_sel_mux(%i) ", ch);
    
    reset_rf_buffer();
    printf(to_rf_buffer, "debug_sel_mux(%i) ", ch);
    RF_printf();

    
    if ((ch<0) || ch>7) 
    { 
    	// error condition
    	printf("wrong param\n");
    	return 1;
    }
    if (bit_test(ch,0)) 
    {	
    	printf("B2-1");
    	output_high(PIN_B2);
    } else {
    	output_low(PIN_B2);
    	printf("B2-0");
    }
    if (bit_test(ch,1)) 
    {	
    	printf("B3-1");
    	output_high(PIN_B3);
    } else {
    	output_low(PIN_B3);
    	printf("B3-0");
    }
    if (bit_test(ch,2)) 
    {	
    	printf("B4-1\n");
    	output_high(PIN_B4);
    } else {
    	output_low(PIN_B4);
    	printf("B4-0\n");
    }
    return 0;
}

#SEPARATE
#use rs232(baud=115200,xmit=PIN_C6,rcv=PIN_C7)
print_version()
{
   printf("LoadDebugger build 002\r\n");
   
   reset_rf_buffer();
   printf(to_rf_buffer, "LoadDebugger build 002\r\n");
   RF_printf();

}

#SEPARATE
#use rs232(baud=115200,xmit=PIN_C6,rcv=PIN_C7)
void read_an5()
{
	int i;
	unsigned long tmp;
	set_adc_channel( 4 );
	delay_us(50);
	tmp = Read_ADC();
	printf("%x : %4lu\r\n",tmp,tmp);

    	reset_rf_buffer();
   	printf(to_rf_buffer, "%x : %4lu\r\n",tmp,tmp);
   	RF_printf();
}

#SEPARATE
#use rs232(baud=115200,xmit=PIN_C6,rcv=PIN_C7)
void read_int()
{
	int i;
	unsigned long tmp;
	reset_rf_buffer();
	for(i=0;i<4;i++){
		set_adc_channel( i );
		delay_us(50);
		tmp = Read_ADC();
		printf("(%i|%x:%4lu)",i,tmp,tmp);
	   	printf(to_rf_buffer, "(%i|%x:%4lu)",i,tmp,tmp);
	}
	printf("\r\n");
	printf(to_rf_buffer, "\r\n");
   	RF_printf();

}

#SEPARATE
#use rs232(baud=115200,xmit=PIN_C6,rcv=PIN_C7)
void read_ex()
{
	int i;
	unsigned long tmp;
	float tmp1;
	
	init_ext_adc();
	tmp = read_ext_adc();
	tmp1=convert_to_volts(tmp);
	printf("%x : %4lu : %1.5f\r\n",tmp,tmp, tmp1);
	
    	reset_rf_buffer();
   	printf(to_rf_buffer, "%x : %4lu : %1.5f\r\n",tmp,tmp, tmp1);
   	RF_printf();
}

#SEPARATE
#use rs232(baud=115200,xmit=PIN_C6,rcv=PIN_C7)
void read_ex_stat()
{
	int i;
	unsigned long tmp;
	float tmp1[10];
	float sum, min, max, avg, delta;

	for(i=0;i<10;i++){
		init_ext_adc();
		tmp = read_ext_adc();
		tmp1[i]=convert_to_volts(tmp);
	}
	sum = 0;
	for(i=0;i<10;i++){
		sum = sum + tmp1[i];
	}
	avg = sum/10;
	min = avg;
	max = avg;
	delta =0;
	for(i=0;i<10;i++){
		if (tmp1[i]<min) { min = tmp1[i]; }
		if (tmp1[i]>max) { max = tmp1[i]; }
		delta = delta + abs(tmp[i]-avg);
	}
	delta = delta /10;
	
	printf("avg  : %1.5f\r\n",avg);
	printf("min  : %1.5f\r\n",min);	
	printf("max  : %1.5f\r\n",max);	
	printf("delta: %1.5f\r\n",delta);	

    	reset_rf_buffer();
    	printf(to_rf_buffer, "avg  : %1.5f\r\n",avg);	
	printf(to_rf_buffer, "delta: %1.5f\r\n",delta);	
   	RF_printf();

}

#SEPARATE
#use rs232(baud=115200,xmit=PIN_C6,rcv=PIN_C7)
void read_ex_all()
{
	int i;
	unsigned long tmp;
	float tmp1;
	
	reset_rf_buffer();
	for(i=0;i<8;i++) {
		sel_mux_ch(i);
		delay_ms(1);

		init_ext_adc();
		tmp = read_ext_adc();
		tmp1=convert_to_volts(tmp);
		printf("(%i|%x:%4lu:%1.5f)",i,tmp,tmp, tmp1);
		printf(to_rf_buffer, "(%i|%x:%4lu:%1.5f)",i,tmp,tmp, tmp1);
	}	
	printf("\r\n");
	printf(to_rf_buffer, "\r\n");
   	RF_printf();
}

#SEPARATE
void set_channel()
{
#use rs232(baud=115200,xmit=PIN_C6,rcv=PIN_C7)
	int i;
	unsigned int chan;
	char inp_c;
	printf("\n\r *sel chan(0..7)*\n\r");
	
	inp_c=0;
	while (inp_c==0) 
	{
		// check if a character is available
		if (kbhit())
		{
			// if yes then get
			inp_c=getc();
		}
		restart_wdt();
	}
	printf("\n\rOK ... got: %c\n\r", inp_c);
	
	chan = (inp_c-'0');
	
	printf("\n\ris channel: %ui\n\r", chan);
	
	sel_mux_ch_debug(chan);
}


#use rs232(baud=115200,xmit=PIN_C6,rcv=PIN_C7)
#int_rda
void data_in()
{
  
	char input_char;
	restart_wdt();
	
	input_char = getc();

#use rs232(baud=115200,xmit=PIN_C6,rcv=PIN_C7)
	switch (input_char) {
			case 's':	set_channel();
					break;
			case 'i':	read_an5();
					break;
			case 'a':	read_int();
					break;
			case 'c':	read_ex();
					break;
			
			case 'r':	read_ex_stat();
					break;
			
			case 'x':	read_ex_all();
					break;
			
//			case 'v':	print_version();
//					break;
			
			default:	printf("\n\r *** Mini Load/RF OS 0.11 ***\n\r");
					printf(" ----\n\r");
					printf(" m = menu\n\r");
					printf("\n\r s = select MUX channel\n\r");
					printf("\n\r i = read internal channel AN5\n\r");
					printf(" c = read external channel\n\r");
					printf(" r = read external channel statistics\n\r");
					printf("\n\r a = read all internal channels\n\r");
					printf(" x = read all external channels\n\r");
//					printf(" n\r v = version\n\r");
					printf("\n\r ----");
					printf(" ----------------please select ...\n\r");
	}
	
}


#use rs232(baud=115200,xmit=PIN_C6,rcv=PIN_C7)
main() {
   int i,j, ret;
   
   init_ext_eeprom();
   setup_wdt(WDT_2304MS);
   printf("booting...\r\n");
//   print_version();
	   
   led_on();
   delay_ms(200);
   led_off();
   delay_ms(200);
   led_on();
   delay_ms(200);
   led_off();
   delay_ms(200);
   led_on();
   delay_ms(200);
   led_off();
   
   restart_wdt();
   setup_port_a( ALL_ANALOG );
   setup_adc( ADC_CLOCK_INTERNAL );

   enable_interrupts(global);
   enable_interrupts(int_rda);

#use rs232(baud=115200,xmit=PIN_C6,rcv=PIN_C7)  
   printf("\n\r('M' for menu)\r\n");
 
   set_adc_channel( 0 );
//   sel_mux_ch_debug(0);
 sel_mux_ch(0);
   while(1) {
	restart_wdt();

     	delay_ms(10);
     	
   } while (TRUE);
}
