#include "vn.h"


//#define MAXDUTY   (int16)160   // 50 kHz
#define MAXDUTY   (int16)400   // 20 kHz
//#define MAXDUTY   (int16)800   // 10 kHz
#define HALFDUTY  (int16)MAXDUTY/2
//#define DIVISOR   199 // 10 kHz  
#define DIVISOR   99 // 20 kHz  
//#define DIVISOR   39  // 50 kHz

#define regreseM  (2.02)
#define regreseN  (-451)

void main()
{

   setup_adc_ports(sAN0|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);  
   setup_timer_2(T2_DIV_BY_1,DIVISOR,1);  
   setup_ccp1(CCP_PWM);
   setup_ccp2(CCP_PWM);
   set_pwm1_duty(HALFDUTY);
   set_pwm2_duty(MAXDUTY);
   setup_comparator(NC_NC_NC_NC);
   setup_oscillator(OSC_8MHZ);

   set_adc_channel(0);
   delay_ms(500);

   unsigned int16 reg;
   float given;
   printf("Cvak\r\n");
   
   reg=400;
   given=regreseM*reg+regreseN;

   while(true)
   {
      unsigned int16 value;
           
      value = read_adc();
      if(kbhit())
      {
         char c;
         
         set_pwm2_duty((int16)MAXDUTY);
         c=getc();

         if(c=='u')
         {
            if (reg<600) reg++;
            printf("up*");
         }

         if(c=='d')
         {
            if (reg>250) reg--;
            printf("down*");
         }

         if((c>='a')&&(c<='z'))
         {
            given=regreseM*reg+regreseN;
            printf("reg: %Lu\r\n",reg);         
         }
      }

      if (value >= given)
      {
         set_pwm2_duty((int16)MAXDUTY);
      }
      else
      {
         set_pwm2_duty((int16)255);
      }
      delay_us(200);
   }
}