#define ADS8320_CLK  PIN_B6
#define ADS8320_DOUT PIN_B7
#define ADS8320_CS   PIN_B5


#include "core.h"
#include "ads8320n.c"

long value[5], sum, wait_time;
unsigned long ex_value[8], ex_sum_low, ex_sum_hi;
int display_mode, spool_mode, ex_mode, rf_mode;

const char object_id = 'F';

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;
}

#use rs232(baud=115200,xmit=PIN_C6,rcv=PIN_C7)
void put_long(unsigned long ldata)
{
	#byte ldataL = ldata
	#byte ldataH = ldata+1

	putchar(ldataL); // low byte first
	putchar(ldataH);
}

#SEPARATE
#use rs232(baud=115200,xmit=PIN_C6,rcv=PIN_C7)
print_version()
{
   printf("LoadAddOn build 002\r\n");
}

#SEPARATE
#use rs232(baud=115200,xmit=PIN_C6,rcv=PIN_C7)
void read_all()
{
	int i;
	for(i=0;i<=4;++i) {
		set_adc_channel( i );
		delay_us(50);
		value[i] = Read_ADC();
	}
	sum =  value[0] + value[1] + value[2] + value[3];
}

#SEPARATE
#use rs232(baud=115200,xmit=PIN_C6,rcv=PIN_C7)
void read_ex_all()
{
	int i;
	unsigned long tmp;
	
	for(i=0;i<8;i++) {
		sel_mux_ch(i);
		delay_us(50);
		init_ext_adc();
		ex_value[i] = read_ext_adc();
	}	
	ex_sum_low=ex_value[0]+ex_value[2]+ex_value[2]+ex_value[3];
	ex_sum_hi=ex_value[4]+ex_value[5]+ex_value[6]+ex_value[7];
}

#SEPARATE
#use rs232(baud=115200,xmit=PIN_C6,rcv=PIN_C7)
void print_ex_values()
{
	int i;
	float ex1, ex2;
	for(i=0;i<4;i++){
		ex1 = convert_to_volts(ex_value[i]);
		ex2 = convert_to_volts(ex_value[i+4]);
		printf("(%1.3f|%1.3f|%lu)", ex1,ex2,value[i]); 
	}
	if (display_mode == 3) {
		printf("\r");
	} else {
		printf("\n\r");
	}
}  


#SEPARATE
#use rs232(baud=115200,xmit=PIN_C6,rcv=PIN_C7)
void print_bin_value()
{
	put_long(value[0]);
	put_long(value[1]);
	put_long(value[2]);
	put_long(value[3]);
	put_long(sum);
	put_long(value[4]);
}


#SEPARATE
#use rs232(baud=115200,xmit=PIN_C6,rcv=PIN_C7)
void print_ex_low_bin_value()
{
	unsigned long dummy;
	dummy = 0xffff;
	put_long(ex_value[0]);
	put_long(ex_value[1]);
	put_long(ex_value[2]);
	put_long(ex_value[3]);
	put_long(ex_sum_low);
	put_long(dummy);
}


#SEPARATE
#use rs232(baud=115200,xmit=PIN_C6,rcv=PIN_C7)
void print_ex_hi_bin_value()
{
	unsigned long dummy;
	dummy = 0xffff;
	put_long(ex_value[4]);
	put_long(ex_value[5]);
	put_long(ex_value[6]);
	put_long(ex_value[7]);
	put_long(ex_sum_hi);
	put_long(dummy);
}

#SEPARATE
#use rs232(baud=115200,xmit=PIN_C6,rcv=PIN_C7)
void print_values()
{
	if (display_mode == 0 || display_mode ==3) {
		printf("%4lu:%4lu:%4lu:%4lu#%4lu@%4lu", value[0], value[1], value[2], value[3], sum, value[4]);
		if (display_mode == 3) {
			printf("\r");
		} else {
			printf("\n\r");
		}
	}
	if (display_mode == 1) {
		put_long(value[0]);
		put_long(value[1]);
		put_long(value[2]);
		put_long(value[3]);
		put_long(sum);
		put_long(value[4]);
		putchar(0);
	}
	if (display_mode == 2) {
		printf("%x:%x:%x:%x#%x@%x\r\n", value[0], value[1], value[2], value[3], sum, value[4]);
	}
}  

#SEPARATE
void print_ex_values_rf()
{
	int i;

	float ex1, ex2;
	
	disable_interrupts(global);
	disable_interrupts(int_rda);

	reset_rf_buffer();
	printf(to_rf_buffer, "%c:", object_id);
	
	for(i=0;i<4;i++){
		ex1 = convert_to_volts(ex_value[i]);
		ex2 = convert_to_volts(ex_value[i+4]);
		printf(to_rf_buffer, "(%1.3f|%1.3f)", ex1,ex2); 
	}
	if (display_mode == 3) {
		printf(to_rf_buffer,"\r");
	} else {
		printf(to_rf_buffer,"\n\r");
	}
	RF_printf();

	enable_interrupts(global);
	enable_interrupts(int_rda);
}  


#SEPARATE
print_values_rf()
{
	disable_interrupts(global);
	disable_interrupts(int_rda);

	reset_rf_buffer();
	if (display_mode != 2 ) {
		printf(to_rf_buffer, "%c:%4lu:%4lu:%4lu:%4lu;%4lu;%4lu\r\n", object_id, value[0], value[1], value[2], value[3], sum, value[4]);
	} else {
		printf(to_rf_buffer, "%c:%x:%x:%x:%x#%x@%x", object_id, value[0], value[1], value[2], value[3], sum, value[4]);
	}
	RF_printf();

	enable_interrupts(global);
	enable_interrupts(int_rda);

}

#SEPARATE
void set_time()
{
#use rs232(baud=115200,xmit=PIN_C6,rcv=PIN_C7)
	int i;
	char inp_c;
	printf("\n\r *** Timing Sub Menu            ***\n\r");
	printf("\n\r ----\n\r");
	printf("\n\r 5 ~ 1000  Hz\n\r");
	printf("\n\r 4 ~  250  Hz\n\r");
	printf("\n\r 3 ~  100  Hz\n\r");
	printf("\n\r 2 ~   10  Hz\n\r");
	printf("\n\r 1 ~    1  Hz\n\r");
	printf("\n\r ----\n\r");
	printf("\n\r ----------------please select ...\n\r");

	inp_c=0;
	while (inp_c==0) // wait for the start id '10011001'
	{
		// check if a character is available
		if (kbhit())
		{
			// if yes then get
			inp_c=getc();
		}
		restart_wdt();
	}
	printf("\n\rOK ... %c\n\r", inp_c);
	switch (inp_c) {
		case '5':	wait_time = 1;
				break;
		case '4':	wait_time = 4;
				break;
		case '3':	wait_time = 10;
				break;
		case '2':	wait_time = 100;
				break;
		case '1':	wait_time = 1000;
				break;
	};
}


#SEPARATE
void write_ram()
{
#use rs232(baud=115200,xmit=PIN_C6,rcv=PIN_C7)
	int i;
	char add_c, data_c;
	long addr;
	printf("\n\r *** address (0...9) ***\n\r");

	
	add_c=0;
	while (add_c==0) 
	{
		// check if a character is available
		if (kbhit())
		{
			// if yes then get
			add_c=getc();
		}
		restart_wdt();
	}
	printf("\n\rOK ... %c\n\r", add_c);
	printf("\n\rData-in (char)...\n\r");

	data_c=0;
	while (data_c==0) 
	{
		// check if a character is available
		if (kbhit())
		{
			// if yes then get
			data_c=getc();
		}
		restart_wdt();
	}
	
	addr = (long)(add_c-'0');
	
	write_ext_eeprom(addr, data_c);

		restart_wdt();
	
	printf("\n\rOK ... written %c at %c (real %li)\n\r", data_c, add_c, addr);
}

#SEPARATE
void read_ram()
{
#use rs232(baud=115200,xmit=PIN_C6,rcv=PIN_C7)
	int i;
	char add_c, data_c;
	long addr;
	printf("\n\r *** address (0...9) ***\n\r");

	
	add_c=0;
	while (add_c==0) 
	{
		// check if a character is available
		if (kbhit())
		{
			// if yes then get
			add_c=getc();
		}
		restart_wdt();
	}
	printf("\n\rOK ... %c\n\r", add_c);
	
	addr = (long)(add_c-'0');
	restart_wdt();
	
	data_c=read_ext_eeprom(addr);

	
	printf("\n\rOK ... result: %c  at %c, (real %li)\n\r", data_c, add_c, addr);
}


#use rs232(baud=115200,xmit=PIN_C6,rcv=PIN_C7)
#int_rda
void data_in()
{
  
	char input_char;
	restart_wdt();
	
	input_char = getc();

	if ((input_char=='G')||(input_char=='g')||(input_char=='p')||(input_char=='X')) {
		if (input_char =='G') {
						
			read_all();
			print_bin_value();
			
			//read_ex_all();		
			//print_ex_values();
			//print_ex_low_bin_value();
			// print_ex_hi_bin_value();
		} else {
			if (input_char == 'g') {
				//read_all();
				//print_values();
				read_ex_all();		
				print_ex_values();
			
			} else {
				if (input_char == 'p') {
					//read_ex_all();		
					//print_ex_values_rf();
					read_all();
					print_values();
				} else {
					read_ex_all();		
					print_ex_values();
					//print_ex_low_bin_value();
					//print_ex_hi_bin_value();
				}
			}
		}
	} else {
#use rs232(baud=115200,xmit=PIN_C6,rcv=PIN_C7)
		switch (input_char) {
			case 'a':	display_mode = 0;
					printf("\n\rASCII\n\r");
					break;
			case 'h':	display_mode = 2;
					printf("\n\rHEX\n\r");
					break;
			case 'e':	display_mode = 3;
					printf("\n\rEXCEL\n\r");
					break;
			case 'i':	set_time();
					break;
			case 't':	if (rf_mode==2) { 
						rf_mode =0;
					} else {
						rf_mode = 2;
					}
					printf("\n\rRF\n\r");
					break;
			case 's':	if (spool_mode==1) { 
						spool_mode =0;
					} else {
						spool_mode = 1;
					}
					printf("\n\rIN-AD\n\r");
					break;
			case 'x':	if (ex_mode==1) { 
						ex_mode =0;
					} else {
						ex_mode = 1;
					}
					printf("\n\rEX-AD\n\r");
					break;
			case 'v':	print_version();
					break;
			case 'w':	write_ram();
					break;
			case 'r':	read_ram();
					break;
			
			default:	printf("\n\r *** Mini ex-Load/RF OS 0.2 ***\n\r");
					printf(" ----\n\r");
					printf(" m = menu\n\r");
					printf("\n\r a = ascii\n\r");
					printf(" e = excel mode\n\r");
					printf(" h = hex\n\r");
					printf("\n\r t = rf on/off\n\r");
					printf("\n\r s = streaming on/off\n\r");
					printf("\n\r x = ex-ad on/off\n\r");
					printf("\n\r g = get a ascii value\n\r");
					printf(" p = get int values rf\n\r");
					printf(" G = get ex-ad values\n\r");
					printf(" X = get ex-ad values\n\r");
					printf(" w = write FRAM\n\r");
					printf(" r = read FRAM\n\r");
					printf("\n\r i = time interval\n\r");
					printf(" 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 );

   display_mode = 0;
   spool_mode = 0;
   rf_mode=0;
   ex_mode=0;

   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 );


   while(1) {
	restart_wdt();

     	if (spool_mode == 1) {
		read_all();
		print_values();
	}

     	if (ex_mode == 1) {
		read_ex_all();
		print_ex_values();
	}

	disable_interrupts(global);
	disable_interrupts(int_rda);

     	if (rf_mode == 2) {
		read_all();
		print_values_rf();
	}

	enable_interrupts(global);
	enable_interrupts(int_rda);
     	
   } while (TRUE);
}
