#include <18F2550.h>           //Microchip PIC18F2550 hardware layer
#device adc=10
#define __USB_PIC_PERIF__ 1    //Only for PIC18f4550


#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)
#define USB_USE_FULL_SPEED  TRUE

#define I2C_SCL      PIN_B1
#define I2C_SDA      PIN_B0
#define SERIAL_RX    PIN_C7
#define SERIAL_TX    PIN_C6

#use rs232(baud=115200,parity=N,xmit=SERIAL_TX,rcv=SERIAL_RX,bits=8,stream=serial)
#use i2c(Master,Fast,sda=I2C_SDA,scl=I2C_SCL,force_hw)

#include <pic18_usb.h>                   //Microchip 18Fxx5x hardware layer for usb.c

#define USB_CONFIG_HID_TX_POLL   1
#define USB_CONFIG_HID_TX_SIZE   10
#define USB_CONFIG_HID_RX_SIZE   10

#define  USB_CONFIG_PID       0x0020
#define  USB_CONFIG_VID       0x0461
#define  USB_CONFIG_BUS_POWER 100           //100mA  (range is 0..500)
#define  USB_CONFIG_VERSION   0x0100         //01.00  //range is 00.00 to 99.99

#DEFINE USB_HID_DEVICE     TRUE
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK  //turn on EP1 for IN bulk/interrupt transfers
#define USB_EP1_RX_ENABLE  USB_ENABLE_BULK  //turn on EP1 for OUT bulk/interrupt transfers

#include <usb_desc_hid.h>       //USB Configuration and Device descriptors for this UBS device
#include <usb.c>                //handles usb setup tokens and get descriptor reports
//#include <usb.h>

#include <stdlib.h>
#include <.\flex_lcd416.c>          // LCD
#include <.\DS1307.C>               // RTC
#include <.\LM75.C>                 // THERMOMETER
#include <.\hih3610.c>              // HUMIDITY
#include <.\mpx4115a.c>             // PRESSURE
#include <.\cmd.c>                  // USB Command interpreter


#define LEDY1 PIN_B4               //Red LED is connected to Pin No:25
#define LEDG  PIN_B5               //Green LED is connected to Pin No:26
#define BUTTON PIN_B3                //A Button is connected to Pin No:11

#define LED_ON output_high         //output_high SETS GIVEN PIN TO HIGH
#define LED_OFF output_low         //output_low SETS GIVEN PIN TO LOW
#define DELAY 1000

int8 out_data[9];


boolean ShowData = false;

#INT_RDA  //interrupt fires when receive data available
void serial_isr()
{      
}

#int_EXT2
void EXT2_isr(void)
{
   ShowData = true;
}



void main() {
   char* s[30];

   enable_interrupts(INT_RDA);
   enable_interrupts(INT_EXT2);
   enable_interrupts(GLOBAL);
   setup_adc(ADC_CLOCK_DIV_16);
   setup_adc_ports( AN0_TO_AN2|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_32);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   usb_init();
   usb_task();                  //Will call usb_attach().To attach USB Device to the bus.
   usb_wait_for_enumeration();
   if(usb_enumerated()){       //Checks if device Enumeration Successful or Not
      LED_ON(LEDG);
      delay_ms(DELAY);
      LED_OFF(LEDG);
        }
   else
      LED_OFF(LEDG);

   // init
   DS1307_Init();                   // init RTC
   init_temp();                     // init thermometer 
   lcd_init () ;                    // LCD
   
   delay_ms( 20 );
   lcd_init_custom_chars ();        // karakterek feltöltése
   lcd_putc ("/f");
   delay_ms( 20 );
   lcd_gotoxy (1, 1);
   lcd_putc( getenv( "DEVICE" ) );
   delay_ms( 20 );
   lcd_gotoxy (1, 2);
   printf( lcd_putc "%Lu Hz", getenv( "CLOCK" ) );
   lcd_gotoxy (1, 3);
   printf( lcd_putc "USB HID mode" );
   lcd_gotoxy (1, 4);
   printf( lcd_putc "Weather station" );
   delay_ms( 1500 );
    
   while(TRUE) 
      {
      if ( ShowData ) {
         float32 temp, hum, press;
         // mérések, adatok kiolvasása
         DS1307_read_date_time();               // RTC kiolvasás
         temp = read_full_temp();
         hum = read_humidity( false );
         press = read_pressure();

/*
         // adatok a sorosportra
         fprintf( serial, "\n\r20%02d.%02d.%02d  %2d:%02d:%02d %s\n\r",
                  gca_ds1307_regs[DS1307_YEAR_REG],
                  gca_ds1307_regs[DS1307_MONTH_REG],
                  gca_ds1307_regs[DS1307_DATE_REG],
                  gca_ds1307_regs[DS1307_HOURS_REG],
                  gca_ds1307_regs[DS1307_MINUTES_REG],
                  gca_ds1307_regs[DS1307_SECONDS_REG],
                  day_names[gca_ds1307_regs[DS1307_DAY_OF_WEEK_REG]] );
         fprintf( serial, "%3.1f°C\r\n", temp );
         fprintf( serial, "%3.1f%%\r\n", hum );
         fprintf( serial, "%4.1f hPa\r\n", press );
*/      
         // és a kijelzóre
         lcd_gotoxy( 1, 1 );
         printf( lcd_putc, "20%02d.%02d.%02d %02d:%02d",
                  gca_ds1307_regs[DS1307_YEAR_REG],
                  gca_ds1307_regs[DS1307_MONTH_REG],
                  gca_ds1307_regs[DS1307_DATE_REG],
                  gca_ds1307_regs[DS1307_HOURS_REG],
                  gca_ds1307_regs[DS1307_MINUTES_REG] );
         lcd_gotoxy( 1, 2 );
         printf( lcd_putc, "hőmérs:   %3.1f°C", temp );
         lcd_gotoxy( 1, 3 );
         printf( lcd_putc, "páratart:  %3.1f%%", hum );  
         /*
         lcd_gotoxy( 1, 4 );
         printf( lcd_putc, "légny:   N/A hPa" );
         */
         if(usb_enumerated()) {        
            LED_ON( LEDG );
            out_data[ 0 ] = "D"; 
            out_data[ 1 ] = gca_ds1307_regs[DS1307_YEAR_REG];
            out_data[ 2 ] = gca_ds1307_regs[DS1307_MONTH_REG];
            out_data[ 3 ] = gca_ds1307_regs[DS1307_DATE_REG];
            out_data[ 4 ] = gca_ds1307_regs[DS1307_HOURS_REG];
            out_data[ 5 ] = gca_ds1307_regs[DS1307_MINUTES_REG];
            out_data[ 6 ] = gca_ds1307_regs[DS1307_SECONDS_REG];
            out_data[ 7 ] = gca_ds1307_regs[DS1307_DAY_OF_WEEK_REG];
            usb_puts( 1, (int8 *)out_data, 11, 500 );
            ShowData = false;
            if ( usb_kbhit(1) ) { usb_command(); }
            LED_OFF( LEDG );
         }
      }
      
      LED_ON(LEDY1);
      delay_ms(100);
      LED_OFF(LEDY1); 
      delay_ms(100);
      }
}
