#include "core.h"

long value[4], sum, wait_time;
int display_mode, spool_mode, rf_mode;

const char object_id = 'T';

#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("Load OS 2.0 build 004, 15.07.02\r\n");
   printf("A. Schmidt, Lancaster University\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];
}

#use rs232(baud=115200,xmit=PIN_C6,rcv=PIN_C7)
void print_bin_value()
{
	long dummy;
	dummy = 1024;
	put_long(value[0]);
	put_long(value[1]);
	put_long(value[2]);
	put_long(value[3]);
	put_long(sum);
	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:%5lu", value[0], value[1], value[2], value[3], sum);
		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);
		putchar(0);
	}
	if (display_mode == 2) {
		printf("%x:%x:%x:%x:%x\r\n", value[0], value[1], value[2], value[3], sum);
	}
}  

#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:%5lu\r\n", object_id, value[0], value[1], value[2], value[3], sum);
	} else {
		printf(to_rf_buffer, "%c:%x:%x:%x:%x:%x", object_id, value[0], value[1], value[2], value[3], sum);
	}
	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;
	};
}

#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')) {
		read_all();
		if (input_char =='G') {
			print_bin_value(); // sent two bytes
		}
		if (input_char =='g') {
			print_values();
		} 
		if (input_char =='p') {
			print_values_rf();
		}
	} 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':	rf_mode = 2;
					printf("\n\rRF transmitter on\n\r");
					break;
			case 'r':	rf_mode = 1;
					printf("\n\rRF receiver mode\n\r");
					break;
			case 'n':	rf_mode = 0;
					printf("\n\rRF module OFF\n\r");
					break;

			case 's':	if (spool_mode==1) { 
						spool_mode =0;
					} else {
						spool_mode = 1;
					}
					printf("\n\rIN-AD\n\r");
					break;
			
			case 'v':	print_version();
					break;
			
			default:	printf("\n\r *** Mini Load/RF OS 0.1 ***\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 transmitter ON\n\r");
					printf(    " r = RF receive mode\n\r");
					printf(	   " n = RF module OFF\n\r");

					printf("\n\r s = data streaming on/off\n\r");
					printf("\n\r g = get all value\n\r");
					printf(" G = get 16Bit ints\n\r");
					printf(" p = print all values via RF\n\r");

					printf("\n\r i = set 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 ret;
   
   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 );

   wait_time=10;
   display_mode = 0;
   spool_mode = 0;
   rf_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();
	}
		
	disable_interrupts(global);
	disable_interrupts(int_rda);
     	if (rf_mode == 1) {
		ret = rfReceiveOnCD(rf_buffer, MAXBUF, 900);
		if (ret==0) {
			printf("%s", rf_buffer);
		}
	}
	
	enable_interrupts(global);
	enable_interrupts(int_rda);
 

	if (rf_mode != 1) {
		delay_ms(wait_time);	
	}
     	
	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);
}
