Pedro Campos
/
SERVOS_V0_3
test
estado.cpp
- Committer:
- dapi08
- Date:
- 2021-09-07
- Revision:
- 8:b4465148d206
- Parent:
- 6:c21017e969af
File content as of revision 8:b4465148d206:
#include "declaraciones.h" extern volatile st_datos_servo datos_servo; // ESTRUCTURA DE VARIABLES DE ESTADO DEL SERVO DE DIRECCION extern volatile st_datos_servo datos_otro_servo; // ESTRUCTURA DE VARIABLES DE ESTADO DEL OTRO SERVO DE DIRECCION extern long desviacion_servo; extern volatile int pos_actual_servo; extern volatile int pos_objetivo_servo; extern byte pulsadores; // Estado pulsadores del mando extern byte estado_old; // ultimo estado enviado /***************************************************** * PROCESA CAMBIO DE ESTADO * De acuerdo con la lectura del servo y el estado recibido del mando *****************************************************/ void procesa_estado(void) // PROCESA CAMBIO DE ESTADO { static long timer_recto = millis(); static long timer_rumbo = millis(); if(datos_otro_servo.estado != DIR_REPOSO) { // Si el otro servo está activo if((datos_otro_servo.estado == DIR_END_PILOT && (datos_servo.estado==DIR_RUMBO || datos_servo.estado == DIR_PILOTO)) ) { datos_servo.estado = DIR_REPOSO; printf("En REPOSO estado otro:%d estado:%d\r\n", datos_otro_servo.estado, datos_servo.estado); } else if( (datos_otro_servo.estado == DIR_RUMBO || datos_otro_servo.estado == DIR_PILOTO) && (abs(desviacion_servo) >= 50) ) datos_servo.estado = DIR_END_PILOT; // PARA FINALIZAR PILOTO AUTOMATICO DEL OTRO MANDO else { datos_servo.estado = DIR_REPOSO; } } else { // SI EL OTRO SERVO ESTÁ EN REPOSO if(datos_servo.estado == DIR_END_PILOT) { datos_servo.estado = DIR_REPOSO; pos_objetivo_servo = 0; // } else if(datos_servo.estado == DIR_RUMBO || datos_servo.estado == DIR_PILOTO || datos_servo.estado == DIR_REPOSO) { } else if( (datos_servo.estado == DIR_REPOSO && abs(desviacion_servo) >= 50) || ( (datos_servo.estado == DIR_RUMBO || datos_servo.estado == DIR_PILOTO) && abs(desviacion_servo) >= 90) ) { datos_servo.estado = DIR_MASTER; printf("De PILOTO a MASTER por desviacion_servo\r\n"); } else if(datos_servo.estado == DIR_MASTER) { // Si está en master pasa a reposo si el mando se deja recto durante 1s if(abs(desviacion_servo) < 50) { if((millis() - timer_recto) > 1000) { datos_servo.estado = DIR_REPOSO; printf("De MASTER a REPOSO por tiempo centrado\r\n"); // envia_posicion_mando(datos_servo.posicion_mando); } } else { timer_recto = millis(); } } } // PROCESA ACTIVACION O DESACTIVACION DE RUMBO if(pulsadores & MASK_PULS_RUMBO == MASK_PULS_RUMBO) { // Si pulsado rumbo if(timer_rumbo==0) timer_rumbo = millis(); } else { // Se ha soltado pulsador if(timer_rumbo>0) { long tiempo = millis() - timer_rumbo; printf("tiempo:%d \r\n", tiempo); printf("datos_servo.estado:%d \r\n", datos_servo.estado); printf("datos_otro_servo.estado:%d\r\n", datos_otro_servo.estado); if(datos_otro_servo.estado == DIR_REPOSO && datos_servo.estado == DIR_REPOSO) { // Los dos en reposo para activa RUMBO o PILOTO if(tiempo > 50 && tiempo <= 2000) { // Pulsacion corta datos_servo.estado = DIR_RUMBO; escribe_parametro_servo(1, 1, 10); escribe_parametro_servo(1, 2, 2000); printf("en RUMBO\r\n"); } else if(tiempo > 2000 && tiempo < 8000) { // Pulsacion larga datos_servo.estado = DIR_PILOTO; escribe_parametro_servo(1, 1, 10); escribe_parametro_servo(1, 2, 2000); printf("en PILOTO\r\n"); } } else { if(datos_servo.estado == DIR_RUMBO || datos_servo.estado == DIR_PILOTO) { datos_servo.estado = DIR_REPOSO; printf("en REPOSO\r\n"); pos_objetivo_servo = 0; } else if(datos_otro_servo.estado == DIR_RUMBO || datos_otro_servo.estado == DIR_PILOTO) { datos_servo.estado = DIR_END_PILOT; // PARA FINALIZAR PILOTO AUTOMATICO DEL OTRO MANDO printf("en END_PILOT\r\n"); } } timer_rumbo = 0; } } // PROCESA EL CAMBIO DE ESTADO if((estado_old == DIR_RUMBO || estado_old == DIR_PILOTO) && (datos_servo.estado == DIR_REPOSO || datos_servo.estado == DIR_MASTER)) { pos_objetivo_servo = 0; escribe_parametro_servo(1, 1, 50); // velocidad de respuesta del servo escribe_parametro_servo(1, 2, 10000); } if(estado_old != datos_servo.estado) { // envia_posicion_mando(datos_servo.posicion_mando); // SI CAMBIO ESTADO ENVIA POSICION Y ESTADO estado_old = datos_servo.estado; // Actualiza ultimo estado enviado } }