
/*********************************************************************
 *
 *                Microchip USB C18 Firmware Version 1.0
 *
 *********************************************************************
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * Rawin Rojvanit       11/19/04    Original.
 ********************************************************************/

/** I N C L U D E S **********************************************************/
#include <p18f25k20.h>



//#pragma config FOSC = HS
//#pragma config FCMEN = OFF
#pragma config PWRT = OFF
//#pragma config IESO = OFF 
//#pragma config BOREN = OFF 
//#pragma config BORV = 30
#pragma config WDTEN = OFF  //; WDT is controlled by SWDTEN bit of the WDTCON register
//#pragma config MCLRE = ON
//#pragma config WDT = OFF
//#pragma config CCP2MX = OFF
#pragma config LVP = OFF
#pragma config FOSC = INTIO67

//#pragma config FOSC = HSPLL //; HS oscillator, PLL enabled (Clock Frequency = 4 x FOSC1)     

//#pragma config HFOFST = ON // ;HF-INTOSC starts clocking the CPU without waiting for the    oscillator   to stablize
/*    CONFIG XINST = OFF ; Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
    CONFIG CP0 = OFF   ; Block 0 (000800-001FFFh) not code-protected
    CONFIG CP1 = OFF   ; Block 1 (002000-003FFFh) not code-protected 
    CONFIG CP2 = OFF   ; Block 2 (004000-005FFFh) not code-protected
    CONFIG CP3 = OFF   ; Block 3 (006000-007FFFh) not code-protected
*/



// MCLR pin enabled, RE3 input pin disabled

    //CONFIG DEBUG = OFF  ; haven't got the PCB to do it
 


//#pragma config FOSC = INTOSCIO_EC //;Internal oscillator, port function on RA6


//CONFIG  _FCMEN_OFF &_IESO_OFF & _BOD_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_OFF & _WDT_OFF & _INTOSC ; _EXTRC ;   
#include "io.h"
#include "system\typedefs.h"                        // Required
//#include "system\usb\usb.h"                         // Required
#include "io_cfg.h"                                 // Required

//#include "system\usb\usb_compile_time_validation.h" // Optional
#include "user\user.h"                              // Modifiable
#include <i2c.h>

//#define USBSERIAL
#define mInitPWM()  TRISCbits.TRISC2=0; CCP1CON=0b00001100; T3CON=0b10001001;

// Timer 3
#define T3_DISABLED         0
#define T3_DIV_BY_1         0
#define T3_DIV_BY_2         0x10
#define T3_DIV_BY_4         0x20
#define T3_DIV_BY_8         0x30

//P1M1 P1M0 DC1B1 DC1B0 CCP1M3 CCP1M2 CCP1M1 CCP1M0
//   0    0     0     0      1      1      0      0
// PWM: Single CCP CCP1 = 0Ch
// CCP Functions: SETUP_CCP, SET_PWM_DUTY
#define CCP_OFF            0
#define CCP_PWM            0xC
#define CCP_PWM_PLUS_1      0x1c
#define CCP_PWM_PLUS_2      0x2c
#define CCP_PWM_PLUS_3      0x3c

//RD16 T3CCP2 T3CKPS1 T3CKPS0 T3CCP1 T3SYNC TMR3CS TMR3ON
//   1      0       0       0      1      0      0      1
#define CCP_USE_TIMER3      0x100
#define T3_CCP1_TO_5      0x48
#define T3_CCP2_TO_5      0x8
#define T3_CCP3_TO_5      0x40

/** V A R I A B L E S ********************************************************/
#pragma udata

/** P R I V A T E  P R O T O T Y P E S ***************************************/
static void InitializeSystem(void);

/** V E C T O R  R E M A P P I N G *******************************************/

extern void _startup (void);        // See c018i.c in your C18 compiler dir
#pragma code _RESET_INTERRUPT_VECTOR = 0x000800
void _reset (void)
{
    _asm goto _startup _endasm
}
#pragma code

/** D E C L A R A T I O N S **************************************************/
#pragma code
byte debug_buffer[64];
byte coeff_buffer[64];
int _counter=0;
byte pd=0xff;


typedef int s16;
typedef unsigned int u16;
typedef long s32;
typedef unsigned long u32;
typedef unsigned char u8;

long gnSensorState;
long gnSmpCnt;
long gnTraw;

int soundclk=0;
s16 gAC1;
s16 gAC2;
s16 gAC3;
u16 gAC4;
u16 gAC5;
u16 gAC6;
s16 gB1;
s16 gB2;
s32 gB5;
s16 gMb;
s16 gMc;
s16 gMd;

#define SENSOR_OSS 3

s32 t,x1,x2,x3,b3,b5,b6,p;
u32 dw,b4,b7;

#define WTIME 36
#define SZERO 0x55
#define SPLUS 0xff
#define SNEG 0x00
int sc,clk,bc;
int dataclk;
byte BY;
int tim=0;


void SendDebug(void) {   
TRISB=0;

  _counter++;


  if (_counter>5001)
	{
//	PORTD=pd;pd^=255;
	_counter	=0;		

//===============================================================================
//							send microphone data
//===============================================================================
//20*0
	for (clk=0;clk<20;clk++) {
		for (sc=0;sc<WTIME*2;sc++) PORTB=SZERO;
	}


//temperature
  for (dataclk=0;dataclk<5;dataclk++) {
	//byte1
	if (dataclk<3) BY=coeff_buffer[3+dataclk];
	else BY=coeff_buffer[5+dataclk];
//1*1
	for (sc=0;sc<WTIME;sc++) PORTB=SPLUS;for (sc=0;sc<WTIME;sc++) PORTB=SNEG;
//8*B
	for (bc=0;bc<8;bc++) {
		if (BY&0x80) {
			for (sc=0;sc<WTIME;sc++) PORTB=SPLUS;for (sc=0;sc<WTIME;sc++) PORTB=SNEG;
		} else {
			for (sc=0;sc<WTIME;sc++) PORTB=SZERO;for (sc=0;sc<WTIME;sc++) PORTB=SZERO;
		}
		BY<<=1;
	}
//1*1
	for (sc=0;sc<WTIME;sc++) PORTB=SPLUS;for (sc=0;sc<WTIME;sc++) PORTB=SNEG;
  }

//end
	PORTB=SZERO;

		
	

//===============================================================================
		
    }
}
/*
void Setup_Audio(void) {
	TRISCbits.TRISC2=0; CCP1CON=0b00001100; T3CON=0b10001001;//SETUP_CCP1(CCP_PWM);   

   TMR2=0xff;PR2=0x7f;
//   T2CONbits = 0b00000111; // start tmr2//setup_timer_2(0, 255, 1);
   T2CON = 0b00001111; // start tmr2//setup_timer_2(0, 255, 1);
   T3CON = 0b00001111; // start tmr2//setup_timer_2(0, 255, 1);
   CCPR1L=0x3f;//set_pwm1_duty(100);


}*/


int time1=0,time2=0;
int tmode=0;
int mode=0;//0=ures


#define VALVE_LESZORIT 0xc0
#define VALVE_ROGZIT 0x20
#define VALVE_MERES 0x10
#define VALVE_TIME 30
#define LED_WORK 2
int control=1;
int clk;
int meres=-1;
int maxmeres=3;
#define I2C_ID_BMP085  0xEE
#define I2C_ACK 		0
#define I2C_NAK 		1
#define I2C_WADDR(x) ((x) & 0xFE) //clear R/W bit of I2C addr
#define I2C_RADDR(x) ((x) | 0x01) //set R/W bit of I2C addr

void delay (void)  {
int i;
int j=0;
 for (i = 0; i < 1000; i++) {
   j++;
//	USBTasks();         // USB Tasks			// EZ INTÉZI AZ USB ÜGYEKET
  //ProcessIO();        // See user\user.c & .h  //ez a saját usb-vel kapcsolatos kódot futtató rész
//mUSBUSARTIsTxTrfReady();
  }
} 

int old=0;


void mainx(void)						//fő ciklus, ez ismétlődik egyfolytában
{

    //InitializeSystem();		//inicializáló rész

while (1) {
	//TRISD=0;//outpit mode for D
	//LATD=0xFF;
	tim++;
	//TRISC=0;//outpit mode for D
	//PORTC=tim>>8;//0xFF;
	TRISB=0;//outpit mode for D
	PORTB=0xAA;//tim>>8;//0xFF;
	//TRISA=0;//outpit mode for D
	//PORTA=tim>>8;//0xFF;
}
}
void main(void)						//fő ciklus, ez ismétlődik egyfolytában
{


    InitializeSystem();		//inicializáló rész

TRISC=0;//outpit mode for D
//TRISB=0xff;//input mode for B
LATC=0x00;
//LATB=0xff;
//TRISB=0xff;//input mode for B
TRISA=0xff;//input mode for A
 
 ADCON1 = 0x0F;
 //TRISB = TRISB & 0xfc;
 //LATB = LATB & 0xfc;
 //TRISB = TRISB | 0x03;
 //I2C_init(100000) ;

  OSCCON = OSCCON | 0x72; // fix #2 - set intosc speed
  // port directions: 1=input, 0=output
  TRISC = 0b00000000;
  //TRISB = 0b11111111;
  ADCON1 = 0x0F; // fix #1 - disable analog

  //=====
  TRISC=0x00;
  OSCCON=0b01110010;    //

//  Setup_Audio();


  //RESETSLV = 0;
  //Delay10KTCYx(10);   // reset for 10*10K cycles
  //RESETSLV = 1;
  //OpenI2C(MASTER, SLEW_OFF);
  SSPCON1bits.CKP = 1;
  SSPADD = 0x09;   // baud rate generator
  TRISCbits.TRISC4 = 1;   // SDA
  TRISCbits.TRISC3 = 1;   // SCL 
//=====
  OpenI2C(MASTER, SLEW_OFF);
	StartI2C();
    IdleI2C();
    WriteI2C(I2C_ID_BMP085);
    IdleI2C();
    WriteI2C(0xAA);//AA
    IdleI2C();
    RestartI2C(); // Initiate a RESTART command
    IdleI2C();
	WriteI2C( I2C_ID_BMP085 | 1 ); // address device w/read
    IdleI2C();

//	for (clk=0;clk<2;clk++) {
for (clk=0;clk<21;clk++) {
	 coeff_buffer[clk] = 0;
	 coeff_buffer[clk] = ReadI2C(); // returns the LSB of
     IdleI2C();
     AckI2C(); // Send back Acknowledge
     IdleI2C();
}
	 coeff_buffer[21] = ReadI2C(); // returns the LSB of
     IdleI2C();
     NotAckI2C();
    IdleI2C();
    StopI2C();

delay();

   gAC1 = (s16)((((u16)coeff_buffer[0])<<8) | (u16)coeff_buffer[1]);
   gAC2 = (s16)((((u16)coeff_buffer[2])<<8) | (u16)coeff_buffer[3]);
   gAC3 = (s16)((((u16)coeff_buffer[4])<<8) | (u16)coeff_buffer[5]);

   gAC4 = (((u16)coeff_buffer[6])<<8) | (u16)coeff_buffer[7];
   gAC5 = (((u16)coeff_buffer[8])<<8) | (u16)coeff_buffer[9];
   gAC6 = (((u16)coeff_buffer[10])<<8) | (u16)coeff_buffer[11];

   gB1 = (s16)((((u16)coeff_buffer[12])<<8) | (u16)coeff_buffer[13]);
   gB2 = (s16)((((u16)coeff_buffer[14])<<8) | (u16)coeff_buffer[15]);
   gMb = -32768;
   gMc = (s16)((((u16)coeff_buffer[18])<<8) | (u16)coeff_buffer[19]);
   gMd = (s16)((((u16)coeff_buffer[20])<<8) | (u16)coeff_buffer[21]);


	debug_buffer[2] = 0;
	debug_buffer[3] = 0;




while(1) {

  
	if (_counter==0) {
  StartI2C();
  IdleI2C();
  
  IdleI2C();
  WriteI2C(I2C_ID_BMP085);
  IdleI2C();
  WriteI2C(0xF4);
  IdleI2C();
  WriteI2C(0x2E);
  IdleI2C();
  StopI2C();
}
if (_counter==1000) {

//read header
    StartI2C();
    IdleI2C();
    WriteI2C(I2C_ID_BMP085);
    IdleI2C();
    WriteI2C(0xF6);
    IdleI2C();
    RestartI2C(); // Initiate a RESTART command
    IdleI2C();
	WriteI2C( I2C_ID_BMP085 | 1 ); // address device w/read
    IdleI2C();
	debug_buffer[0] = ReadI2C(); // Returns the MSB byte
    IdleI2C();
    AckI2C(); // Send back Acknowledge
    IdleI2C();
	debug_buffer[1] = ReadI2C(); // returns the LSB of
    IdleI2C();
    NotAckI2C();
    IdleI2C();
    StopI2C();
//temperature
//traw=8cd9

  

   gnTraw = (((u32)debug_buffer[0])<<8) | (u32)debug_buffer[1];
   x1 = (((s32) gnTraw - (s32) gAC6) * (s32) gAC5) / 32768;
   x2 = ((s32) gMc * 2048) / (x1 + gMd);
   gB5 = x1 + x2;
   t = ((gB5+8)/16);

    coeff_buffer[6]=debug_buffer[0];  coeff_buffer[7]=debug_buffer[1];
//		coeff_buffer[30]=debug_buffer[0];  coeff_buffer[31]=debug_buffer[1];
	//coeff_buffer[20]=x1>>8;
	//coeff_buffer[21]=x1&255;
  
	coeff_buffer[8]=(t>>8);	coeff_buffer[9]=t&255;

}


//============================
//pressure
//============================
 
if (_counter==1001  ) {
StartI2C();
  IdleI2C();
  WriteI2C(I2C_ID_BMP085);
  IdleI2C();
 WriteI2C(0xF4);
  IdleI2C();
   
   WriteI2C(0xf4);//+(SENSOR_OSS<<6));
  //WriteI2C(0x2E);
  IdleI2C();
  StopI2C();
}
if (_counter==5000  ) {
//read header
	StartI2C();
    IdleI2C();
    WriteI2C(I2C_ID_BMP085);
    IdleI2C();
    WriteI2C(0xF6);
    IdleI2C();
    RestartI2C(); // Initiate a RESTART command
    IdleI2C();
	WriteI2C( I2C_ID_BMP085 | 1 ); // address device w/read
    IdleI2C();
	debug_buffer[0] = ReadI2C(); // Returns the MSB byte
    IdleI2C();
    AckI2C(); 
    IdleI2C();
	debug_buffer[1] = ReadI2C(); // Returns the MSB byte
    IdleI2C();
    AckI2C(); 
    IdleI2C();
	debug_buffer[2] = ReadI2C(); // returns the LSB of
    IdleI2C();
    NotAckI2C();
    IdleI2C();
    StopI2C();

   	
   dw = (((u32)debug_buffer[0])<<16) | (((u32)debug_buffer[1])<<8) | (u32)debug_buffer[2];
   dw = (dw >> (8-SENSOR_OSS));
	coeff_buffer[0]=debug_buffer[0];	coeff_buffer[1]=debug_buffer[1];	coeff_buffer[2]=debug_buffer[2];
	//coeff_buffer[22]=debug_buffer[0];	coeff_buffer[23]=debug_buffer[1];	coeff_buffer[24]=debug_buffer[2];  coeff_buffer[25]=0;//!!


//calc pressure
   
   b6 = gB5 - 4000L;
   x1 = (b6*b6) >> 12;
   x1 *= gB2;
   x1 /= 2048;

   x2 = (gAC2*b6);

   x2 /= 2048;
   x3 = x1 +x2;
   b3 = (((((s32)gAC1 )*4 + x3) << SENSOR_OSS) + 2) >> 2;


   x1 = (gAC3* b6) / 8192;
   x2 = (gB1 * ((b6*b6) /4096) ) /65536;
   x3 = ((x1 + x2) + 2) /4;
   b4 = (gAC4 * (u32) (x3 + 32768L)) /32768;


   b7 = ((u32)(dw - b3) * (50000L >> SENSOR_OSS));   
   if (b7 < (u32)0x80000000) {
      p = (b7 *2) / b4;
      }
   else { 
      p = (b7 / b4) *2;
      }

   x1 = p / 256;
   x1 *= x1;
   x1 = (x1 * 3038L) /65536;
   x2 = (p * -7357L) /65536;
   p += ((x1 + x2 + 3791L) /16);	// p in Pa  

	coeff_buffer[5]=p;coeff_buffer[4]=p>>8;	coeff_buffer[3]=p>>16;
	//coeff_buffer[26]=p;coeff_buffer[27]=p>>8;	coeff_buffer[28]=p>>16;coeff_buffer[29]=0;

	old-=p;
	if ((old<-20 ) || (old>20)) soundclk=5;
	T2CON = 0b00000000;
	old=p;
 	
}
	SendDebug();

	//a főciklusban végrehajtódó egyéb kódrészeket ide lehet beírni
	}

CloseI2C();

}//end main

/******************************************************************************
 * Function:        static void InitializeSystem(void)
 *
 * PreCondition:    None
 *
 * Input:           None
 *
 * Output:          None
 *
 * Side Effects:    None
 *
 * Overview:        InitializeSystem is a centralize initialization routine.
 *                  All required USB initialization routines are called from
 *                  here.
 *
 *                  User application initialization routine should also be
 *                  called from here.                  
 *
 * Note:            None
 *****************************************************************************/
static void InitializeSystem(void)
{
    ADCON1 |= 0x0F;                 // Default all pins to digital        

    //UserInit();                     // See user.c & .h// A SAJÁT INICIALIZÁLÁST EZ INTÉZI
				
}//end InitializeSystem

/******************************************************************************
 * Function:        void USBTasks(void)
 *
 * PreCondition:    InitializeSystem has been called.
 *
 * Input:           None
 *
 * Output:          None
 *
 * Side Effects:    None
 *
 * Overview:        Service loop for USB tasks.
 *
 * Note:            None
 *****************************************************************************/

/** EOF main.c ***************************************************************/
