//----------------------------------------------------// 
//-------------------programa central----------------//
int16 precio_banderazo;
float kilometro_extra;
void  operacion(int16 *pago, float *distancia){
   int1 tiempo_cortesia, kilometro_cortesia;   
   int16 pulsos_mts, general;
   int32 x, x2, x3, contador_pulsos, control_tiempo, calculo_tiempo;
   float metros_float, pulsos_float, pulsos_auto, tiempo_mem;
   tiempo_cortesia = 0;
   contador_pulsos = 0;
   kilometro_cortesia = 0;   
   pulsos_auto = make16(read_eeprom(6), read_eeprom(5));  
   *distancia = 0; 
   x = 0;
   x2 = 0;                         
   x3 = 0;
   precio_banderazo = make16(read_eeprom(2), read_eeprom(1));
   *pago = precio_banderazo; //-------                       
   kilometro_extra = make16(read_eeprom(4), read_eeprom(3));
   //calculo de tres             
   pulsos_float = pulsos_auto;                        
   pulsos_mts =   ceil((pulsos_auto*10)/kilometro_extra);
   metros_float = (pulsos_mts*1000)/pulsos_float; 
   tiempo_mem = (make16(read_eeprom(13), read_eeprom(12)));
   control_tiempo = ceil(((10*3600)/tiempo_mem)*1000);
   general = pulsos_auto; //<-- convertimos float a int16 para compara pulsos 
   //---------------//     
   borrar;
   pantalla_precio(precio_banderazo);                                             
   calculo_tiempo = 345000;      
   do{
     delay_ms(1);
     if(sensor_odometro == 0){ 
          do{ 
               off(led_status); 
               delay_ms(1);                  
               if(x++ >= 500){ //medio segundo para saber que estamos detenidos 
                    //control de tiempo nuevo si el kilometro no a sido pasado
                    if((tiempo_cortesia == 0)){
                         calculo_tiempo = 345000 - ((contador_pulsos*345000)/pulsos_auto); 
                         x2 = 0;
                         do{
                              delay_ms(1);             
                              if(x2++ >= calculo_tiempo){
                                 *distancia = (contador_pulsos*1000)/pulsos_auto;
                                 tiempo_cortesia = 1;
                                 kilometro_cortesia = 1;
                                 break;
                              }
                         }while((sensor_odometro == 0)&&(boton_dos == 1));
                         general = pulsos_auto-ceil((x2 * pulsos_auto)/345000);
                         if(general == 0){                         
                              general = pulsos_auto;
                         }
                    } 
                    while((sensor_odometro == 0)&&(boton_dos == 1)){ 
                         delay_ms(1);
                         if((x2++ >= control_tiempo)&&(tiempo_cortesia == 1)){
                              x2 = 0;
                              *pago = *pago + 10;
                              borrar;
                              pantalla_precio(*pago); 
                         }
                    }
               }
          }while((sensor_odometro == 0)&&(boton_dos == 1));
          x = 0;
          contador_pulsos++;
          if((contador_pulsos >= general)||(kilometro_cortesia == 1)){
               kilometro_cortesia = 1;
               tiempo_cortesia = 1;
               if(contador_pulsos >= pulsos_mts){
                    contador_pulsos = 0;
                    *distancia = *distancia + metros_float;
                    *pago = *pago + 10; 
                    borrar;
                    pantalla_precio(*pago);
               }                                          
          }
     }
     if(sensor_odometro == 1){
          do{
               on(led_status); 
               delay_ms(1);                  
               if(x++ >= 500){ //medio segundo para saber que estamos detenidos 
                    //control de tiempo nuevo si el kilometro no a sido pasado
                    if((tiempo_cortesia == 0)){
                         calculo_tiempo = 345000 - ((contador_pulsos*345000)/pulsos_auto); 
                         x2 = 0;
                         do{
                              delay_ms(1);             
                              if(x2++ >= calculo_tiempo){ 
                                 tiempo_cortesia = 1;
                                 kilometro_cortesia = 1; 
                                 *distancia = (contador_pulsos*1000)/pulsos_auto;
                                 break;
                              }
                         }while((sensor_odometro == 1)&&(boton_dos == 1));
                         general = pulsos_auto-ceil((x2 * pulsos_auto)/345000);
                         if(general == 0){                         
                              general = pulsos_auto;
                         }       
                    }
                    x2 = 0;
                    while((sensor_odometro == 1)&&(boton_dos == 1)){ 
                         delay_ms(1);
                         if((x2++ >= control_tiempo)&&(tiempo_cortesia == 1)){
                              x2 = 0;
                              *pago = *pago + 10;
                              borrar;
                              pantalla_precio(*pago);
                         }
                    }
               }
          }while((sensor_odometro == 1)&&(boton_dos == 1));
          x = 0;
     }
   }while(boton_dos == 1);
   for(int z = 0; z <= 4; z++){
      borrar;
      delay_ms(500);
      pantalla_precio(*pago);
      delay_ms(1500);
   }
}
//--------------------------------------------------//
//----------------programa main---------------------//
void main() {
   char voice_status;
   int8  memoria_hora_inicial, memoria_minutos_inicial, memoria_hora_final, memoria_minutos_final;
   int16 pago;
   int32 apagado_pantalla, control_monetario;
   float distancia;
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);      //1,4 s overflow
   enable_interrupts(INT_RTCC);
   enable_interrupts(GLOBAL);
   set_rtcc(18661);
   segundos = 0;
   fprintf(voice, "\n");
   on(led_status);
   while(true){
      voice_status = fgetc(voice);
      if(voice_status == '1'){
         off(led_status);
         break;
      }
   }
   if(read_eeprom(9) == 255){
     write_eeprom(9, 0x00); 
   }    
   if(read_eeprom(10) == 255){
     write_eeprom(10, 0x00);
   }   
   if(read_eeprom(11) == 255){
     write_eeprom(11, 0x00);
   }                 
   lcd_init();
   on(backlight);
   borrar;
   lcd_putc("Distribuido por\nCasadelasmarias");
   delay_ms(3000);
   borrar;
   configuracion();
   configurar_lcd();
   borrar;                                                
   pantalla_libre();
   while(TRUE){
     delay_ms(1);
     if(apagado_pantalla++ >= 30000){
         off(backlight);
         apagado_pantalla = 0;
     }                                  
     if(boton_uno == 0){
         on(backlight);
         delay_ms(100);
         memoria_hora_inicial = hora;
         memoria_minutos_inicial = minutos;
         while(boton_uno == 1){}
         pago = 0;
         distancia = 0;
         operacion(&pago, &distancia); 
         control_monetario = make32(read_eeprom(11),read_eeprom(10),read_eeprom(9)); 
         control_monetario = control_monetario + pago;
         write_eeprom(9, make8(control_monetario, 0));
         write_eeprom(10, make8(control_monetario, 1));   
         write_eeprom(11, make8(control_monetario, 2)); 
         memoria_hora_final = hora;       
         memoria_minutos_final = minutos;
         off(led_status);
         borrar;
         pantalla_libre();
     }
     if(boton_dos == 0){
         int16 x = 0;
         on(backlight);
         while(boton_dos == 0){
            delay_ms(1);
            if(x++ >= 5000){
               programacion();
               borrar;
               pantalla_libre();
            }
         }
     }
   } 
}