//----------------------------------------------------//
//-------------------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();
}
}
}
}
}