/* Put the datalogger into lowest possible power consumption */
#inline
void shutdown() {
	/* go to sleep */
	sleep();
}

int16 read_int_ulong(int8 address) {
	int16 value;
	
	value = read_eeprom(address);
	value = value << 8;
	value += read_eeprom(address+1);
	
	return value;
}

#define	BLANK	10
#define DIGIT_L 11

void displayDigit(int8 num) {
	switch (num) {
		case 0:
			output_low(LED_A);
			output_low(LED_B);
			output_low(LED_C);
			output_low(LED_D);
			output_low(LED_E);
			output_low(LED_F);
			output_high(LED_G);
			break;
		case 1:
			output_high(LED_A);
			output_low(LED_B);
			output_low(LED_C);
			output_high(LED_D);
			output_high(LED_E);
			output_high(LED_F);
			output_high(LED_G);
			break;
		case 2:
			output_low(LED_A);
			output_low(LED_B);
			output_high(LED_C);
			output_low(LED_D);
			output_low(LED_E);
			output_high(LED_F);
			output_low(LED_G);
			break;
		case 3:
			output_low(LED_A);
			output_low(LED_B);
			output_low(LED_C);
			output_low(LED_D);
			output_high(LED_E);
			output_high(LED_F);
			output_low(LED_G);
			break;
		case 4:
			output_high(LED_A);
			output_low(LED_B);
			output_low(LED_C);
			output_high(LED_D);
			output_high(LED_E);
			output_low(LED_F);
			output_low(LED_G);
			break;
		case 5:
			output_low(LED_A);
			output_high(LED_B);
			output_low(LED_C);
			output_low(LED_D);
			output_high(LED_E);
			output_low(LED_F);
			output_low(LED_G);
			break;
		case 6:
			output_low(LED_A);
			output_high(LED_B);
			output_low(LED_C);
			output_low(LED_D);
			output_low(LED_E);
			output_low(LED_F);
			output_low(LED_G);
			break;
		case 7:
			output_low(LED_A);
			output_low(LED_B);
			output_low(LED_C);
			output_high(LED_D);
			output_high(LED_E);
			output_high(LED_F);
			output_high(LED_G);
			break;
		case 8:
			output_low(LED_A);
			output_low(LED_B);
			output_low(LED_C);
			output_low(LED_D);
			output_low(LED_E);
			output_low(LED_F);
			output_low(LED_G);
			break;
		case 9:
			output_low(LED_A);
			output_low(LED_B);
			output_low(LED_C);
			output_high(LED_D);
			output_high(LED_E);
			output_low(LED_F);
			output_low(LED_G);
			break;
		case BLANK:
			output_high(LED_A);
			output_high(LED_B);
			output_high(LED_C);
			output_high(LED_D);
			output_high(LED_E);
			output_high(LED_F);
			output_high(LED_G);
			break;
		default:
		//case DIGIT_L:
			output_high(LED_A);
			output_high(LED_B);
			output_high(LED_C);
			output_low(LED_D);
			output_low(LED_E);
			output_low(LED_F);
			output_high(LED_G);
			break;
	}
}


void update_digits(int8 val) {
	tensdigit=0;
	
	while ( val >= 10 ) {
		val -= 10;
		tensdigit++;
	}
	
	onesdigit=val;
}


void printCal(void) {
//	printf("cal = ");
	print_hex(cal);
	crnl();
	write_eeprom(E_CAL,cal);
}

void printSpeedOffset(void) {
	print_hex(speed_offset);
	crnl();
	write_eeprom(E_SPEED_OFFSET,speed_offset);
}

#include <CTYPE.H>

byte gethex1() {
   int8 digit;

   digit = getchar();

   putchar(digit);

   if(digit<='9')
     return(digit-'0');
   else
     return((toupper(digit)-'A')+10);
}

byte gethex() {
   int8 lo;
   int8 high;

   high = gethex1();
   lo = gethex1();
   if( 0xDD == lo )
     return(high);
   else
     return( high*16+lo );
}

void delay_half_seconds(int16 n) {
	for ( ; n != 0 ; n-- )
		delay_ms( 490 );
}
