#include "main.h"

unsigned int position;
unsigned int32 section[4];
unsigned int32 time;   // pocitadlo preteceni casovace

#Define INORDER 1

#int_RTCC
void  RTCC_isr(void)    // preruseni od pretekleho casovace 
{
  time++;
}

#define LCD_ENABLE_PIN  PIN_E0
#define LCD_RS_PIN      PIN_E1
#define LCD_RW_PIN      PIN_E2
#define LCD_DATA4       PIN_D4
#define LCD_DATA5       PIN_D5
#define LCD_DATA6       PIN_D6
#define LCD_DATA7       PIN_D7

#include <lcd.c>

#define BUTTON1    PIN_D0
#define BUTTON2    PIN_D1
#define BUTTON3    PIN_D2
#define BUTTON4   PIN_D3

#define BEEPER    PIN_C0

unsigned int32 run;

// Includes all USB code and interrupts, as well as the CDC API
#include <usb_cdc.h>

void beep(int16 period)
{
  while(period){
    output_toggle(BEEPER);
    delay_us(800);
    period--;
  }  
}

void test_mode()     //Testovaci mod stopek
{
   printf(lcd_putc,"\f   TEST MODE");
   lcd_gotoxy(1,2);
   printf(lcd_putc,"ESC");
   while(input(BUTTON1))  // testuje dokud nekdo nezmackne tlacitlo
   {
      lcd_gotoxy(5,2);
      Output_toggle(PIN_A0);
      delay_ms(100);
      printf(lcd_putc,"%d %d %d %d",bit_test(input_b(),0), bit_test(input_b(),1), bit_test(input_b(),2), bit_test(input_b(),3));
   }
}
void send_measuring()
{
   printf(usb_cdc_putc, "\n\r %5ld %5ld %5ld %5ld %5ld", run, section[0]*0.000010667, section[1]*0.000010667, section[2]*0.000010667, section[3]*0.000010667);
}

void exeption_inorder()
{
}

void main()
{
unsigned int8 last, input;
unsigned int16 timer;
int exception;

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   port_b_pullups(TRUE);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(INT_TIMER0);

   lcd_init();
   usb_init();

   lcd_gotoxy(1,1);
   printf(lcd_putc,"\f STOPWATCH01A");
   lcd_gotoxy(1,2);
   printf(lcd_putc,"  Kaklik 2010");
   delay_ms(1000);
   lcd_gotoxy(1,1);
   printf(lcd_putc,"\f Waiting for PC... ");
   lcd_gotoxy(1,2);
   printf(lcd_putc,"TEST");

   while(!usb_cdc_connected()) if(!input(BUTTON1)) test_mode();
 
   lcd_gotoxy(1,1);
   printf(lcd_putc,"\f PC connected...");
   beep(10);
   
   run=0;
   while (TRUE)
   {
     run++;
     printf(lcd_putc,"\f\nSTART");
     section[0]=0;
     section[1]=0;
     section[2]=0;
     section[3]=0;
     last!=input_b();

     while(input(BUTTON1));
     printf(lcd_putc,"\f\n   STOP");
     time = 0;
     set_timer0(0);
     enable_interrupts(GLOBAL);
     position = 0;
     exception = 0;

     while((position < 4) && (input(BUTTON2)))     // cekame na tlacitko stop nebo na preruseni vsech paprsku
      {
       if(last!=(input=input_b()))  // pri preruseni nektereho z paprsku zjistime ktery to byl
       {
         timer=get_timer0();
         if(bit_test(last ^ input, position))section[position] = (time << 16) + timer; // kontroluje, jestli jsou paprsky preruseny ve spravnem poradi.
         else exception=INORDER;
         time=0;
         set_timer0(0);
         position++;
       }
       last=input_b();
      }
     if (exception == INORDER) exeption_inorder();
     else send_measuring();
   }
}