Felícito Manzano
/
CCN_Control_Bahia_TFMiniPlus
Actualizacion General del codigo para CCN con el objetivo de proveer mantenimiento estable.
Embed:
(wiki syntax)
Show/hide line numbers
f_basicas.cpp
Go to the documentation of this file.
00001 /** 00002 * @file f_basicas.cpp 00003 * @author Felícito Manzano (felicito.manzano@detektor.com.sv) 00004 * @brief 00005 * @version 0.1 00006 * @date 2021-05-23 00007 * 00008 * @copyright Copyright (c) 2021 00009 * 00010 */ 00011 00012 #include "mbed.h" 00013 #include "BufferedSerial.h" 00014 #include "constantes.hpp " 00015 #include "tagid.hpp " 00016 #include "f_basicas.hpp " 00017 00018 00019 00020 /** 00021 * @brief 00022 * Esta función recibe un entero que es el contador de tramas 00023 realiza el incremento en uno y verifica si el valor es mayor 00024 o igual que 65535 que es equivalente a 0xFFFF. Si se cumple 00025 la condución se regresa el valor a 1. 00026 Esta función siempre retorna 0. 00027 * 00028 * @param tramas 00029 * @return true 00030 * @return false 00031 */ 00032 bool incrementar_trama(int *tramas) 00033 { 00034 00035 int actual = *tramas; 00036 int limite = 65535; 00037 actual++; 00038 00039 if (actual > limite) { 00040 *tramas = 1; 00041 } else { 00042 *tramas = actual; 00043 } 00044 return(false); 00045 } 00046 00047 00048 00049 /** 00050 * @brief 00051 * 00052 * @param puerto_usb 00053 * @param puerto_cp 00054 * @return true 00055 * @return false 00056 */ 00057 bool booting_gtdat (Serial *puerto_usb, Serial *puerto_cp) { 00058 wait_us(1000000); 00059 puerto_usb -> printf("\r\n*** DETEKTOR LATAM ***\r\n"); 00060 puerto_usb -> printf("INICIANDO NUCLEO STM32\r\n"); 00061 puerto_usb -> printf("CCN TIEMPO EN PLANTA\r\n"); 00062 puerto_usb -> printf("R.0A.1 - 2021-05-24\r\n\r\n"); 00063 puerto_usb -> printf("BAHIA-%d\r\n", BAY_ADDRESS); 00064 puerto_cp -> printf("%s*INICIA BAHIA-%d*%s0001%s\r\n", 00065 CABECERA_TX, BAY_ADDRESS, FIN_CABECERA_TX, ULTIMO_CARACTER); 00066 wait_us(T_TX); 00067 return(false); 00068 } 00069 00070 00071 00072 /** 00073 * @brief 00074 * 00075 * Esta función recibe los digitos correspondientes a las horas, decenas y 00076 minutos que representan la hora y que deben presentarse en los tres 00077 display de siete segmentos. La función siempre retorna 0. 00078 * @param horas 00079 * @param decenas 00080 * @param minutos 00081 * @param d7_h 00082 * @param d7_d 00083 * @param d7_m 00084 * @return int 00085 */ 00086 int presentar_tiempo(int *horas, int *decenas, int *minutos, 00087 BusOut *d7_h, BusOut *d7_d, BusOut *d7_m) 00088 { 00089 // Digito más significativo (HORAS) 00090 switch (*horas) { 00091 case 0 : 00092 d7_h -> write(DIGITOS[CERO_7S]); 00093 break; 00094 case 1 : 00095 d7_h -> write(DIGITOS[UNO_7S]); 00096 break; 00097 case 2 : 00098 d7_h -> write(DIGITOS[DOS_7S]); 00099 break; 00100 case 3 : 00101 d7_h -> write(DIGITOS[TRES_7S]); 00102 break; 00103 case 4 : 00104 d7_h -> write(DIGITOS[CUATRO_7S]); 00105 break; 00106 case 5 : 00107 d7_h -> write(DIGITOS[CINCO_7S]); 00108 break; 00109 case 6 : 00110 d7_h -> write(DIGITOS[SEIS_7S]); 00111 break; 00112 case 7 : 00113 d7_h -> write(DIGITOS[SIETE_7S]); 00114 break; 00115 case 8 : 00116 d7_h -> write(DIGITOS[OCHO_7S]); 00117 break; 00118 case 9 : 00119 d7_h -> write(DIGITOS[NUEVE_7S]); 00120 break; 00121 case 10: 00122 d7_h -> write(DIGITOS[APAGADO_7S]); 00123 break; 00124 } 00125 00126 // DECENAS DE MINUTOS 00127 switch (*decenas) { 00128 case 0 : 00129 d7_d -> write(DIGITOS[CERO_7S]); 00130 break; 00131 case 1 : 00132 d7_d -> write(DIGITOS[UNO_7S]); 00133 break; 00134 case 2 : 00135 d7_d -> write(DIGITOS[DOS_7S]); 00136 break; 00137 case 3 : 00138 d7_d -> write(DIGITOS[TRES_7S]); 00139 break; 00140 case 4 : 00141 d7_d -> write(DIGITOS[CUATRO_7S]); 00142 break; 00143 case 5 : 00144 d7_d -> write(DIGITOS[CINCO_7S]); 00145 break; 00146 case 6 : 00147 d7_d -> write(DIGITOS[SEIS_7S]); 00148 break; 00149 case 7 : 00150 d7_d -> write(DIGITOS[SIETE_7S]); 00151 break; 00152 case 8 : 00153 d7_d -> write(DIGITOS[OCHO_7S]); 00154 break; 00155 case 9 : 00156 d7_d -> write(DIGITOS[NUEVE_7S]); 00157 break; 00158 case 10: 00159 d7_d -> write(DIGITOS[APAGADO_7S]); 00160 break; 00161 } 00162 00163 // Digito menos significativo (MINUTOS ) 00164 switch (*minutos) { 00165 case 0 : 00166 d7_m -> write(DIGITOS[CERO_7S]); 00167 break; 00168 case 1 : 00169 d7_m -> write(DIGITOS[UNO_7S]); 00170 break; 00171 case 2 : 00172 d7_m -> write(DIGITOS[DOS_7S]); 00173 break; 00174 case 3 : 00175 d7_m -> write(DIGITOS[TRES_7S]); 00176 break; 00177 case 4 : 00178 d7_m -> write(DIGITOS[CUATRO_7S]); 00179 break; 00180 case 5 : 00181 d7_m -> write(DIGITOS[CINCO_7S]); 00182 break; 00183 case 6 : 00184 d7_m -> write(DIGITOS[SEIS_7S]); 00185 break; 00186 case 7 : 00187 d7_m -> write(DIGITOS[SIETE_7S]); 00188 break; 00189 case 8 : 00190 d7_m -> write(DIGITOS[OCHO_7S]); 00191 break; 00192 case 9 : 00193 d7_m -> write(DIGITOS[NUEVE_7S]); 00194 break; 00195 case 10: 00196 d7_m -> write(DIGITOS[APAGADO_7S]); 00197 break; 00198 } 00199 00200 return(0); 00201 } 00202 00203 int presentar_torre(const int *color, BusOut *torre_luz) 00204 { 00205 /* 00206 Esta función recibe el código de color correspondiente a la torre de luz 00207 estilo semaforo para activar el LED correspondiente. 00208 La función siempre retorna 0 00209 */ 00210 00211 switch (*color) { 00212 case 0 : 00213 torre_luz -> write(COLOR_TORRE_LUZ[APAGADO_TL]); 00214 break; 00215 case 1 : 00216 torre_luz -> write(COLOR_TORRE_LUZ[VERDE]); 00217 break; 00218 case 2 : 00219 torre_luz -> write(COLOR_TORRE_LUZ[AMARILLO]); 00220 break; 00221 case 3 : 00222 torre_luz -> write(COLOR_TORRE_LUZ[ROJO]); 00223 break; 00224 } 00225 00226 return(0); 00227 } 00228 00229 00230 00231 /** 00232 * @brief 00233 * Esta función se encarga de buscar el grupo al que está asignado el TAGRFiD 00234 que ha sido leido por el lector. Se ha predefinido 3 arreglos con los TAG 00235 validos. En función del arreglo en que se genere la coincidencia se retorna 00236 el tiempo para cambiar. 00237 La función retorna 1 cuando encuentra coincidencia. 0 cuando no encuentra coincidencia y 00238 se define el tiempo de la torre de luz amarillo y rojo en 50 minutos y 1 hora. 00239 * 00240 * @param id 00241 * @param amarillo 00242 * @param rojo 00243 * @return int 00244 */ 00245 int tiempo_asignado(char id[9], int *amarillo, int *rojo) 00246 { 00247 int i = 0; 00248 int v = 0; 00249 int busca_id = 0; 00250 00251 for (i=0; i<TOTAL_PLACAS_A; i++) { 00252 busca_id = strncmp(PLACAS_A[i], id, 10); 00253 if (busca_id == 0) { 00254 *amarillo = GRUPO_A_AMARILLO; 00255 *rojo = GRUPO_A_ROJO; 00256 v = 1; return(1); 00257 } 00258 } 00259 00260 for (i=0; i<TOTAL_PLACAS_B; i++) { 00261 busca_id = strncmp(PLACAS_B[i], id, 10); 00262 if (busca_id == 0) { 00263 *amarillo = GRUPO_B_AMARILLO; 00264 *rojo = GRUPO_B_ROJO; 00265 v = 1; return(1); 00266 } 00267 } 00268 00269 for (i=0; i<TOTAL_PLACAS_C; i++) { 00270 busca_id = strncmp(PLACAS_C[i], id, 10); 00271 if (busca_id == 0) { 00272 *amarillo = GRUPO_C_AMARILLO; 00273 *rojo = GRUPO_C_ROJO; 00274 v = 1; return(1); 00275 } 00276 } 00277 00278 if (v) { 00279 return(1); 00280 } else { 00281 *amarillo = GRUPO_DEFAULT_AMARILLO; 00282 *rojo = GRUPO_DEFAULT_ROJO; 00283 return(0); 00284 } 00285 } 00286 00287 00288 00289 /** 00290 * @brief 00291 * 00292 * Esta función se encarga de analisar el payload de una 00293 huella que es enviada dentro de una cadena (char array) 00294 expresada de manera hexadecimal. en su equivalente de código 00295 ASCII que es guardado en otra cadena. 00296 00297 * @param id_original 00298 * @param id_hex 00299 * @param tamano_id 00300 * @return int 00301 */ 00302 int convertir_id(char id_original[256], char id_hex[15], int *tamano_id) 00303 { 00304 int i = 0; 00305 int j = 0; 00306 int limite = *tamano_id; 00307 int k = 0; 00308 char tmp_buffer_ascii[77]; 00309 00310 memset(tmp_buffer_ascii, '\0', sizeof tmp_buffer_ascii); 00311 memset(id_hex, '\0', sizeof id_hex); 00312 00313 for (i=0; i<limite; i++) { 00314 snprintf(&tmp_buffer_ascii[j*2], 3,"%02X", id_original[i]); 00315 j++; 00316 } 00317 00318 limite = strlen(tmp_buffer_ascii); 00319 k = limite - 14; 00320 00321 strncpy(id_hex, &tmp_buffer_ascii[k], 14); 00322 id_hex[15] = '\0'; 00323 00324 return(1); 00325 } 00326 00327 00328 00329 /** 00330 * @brief 00331 * Esta funsión se utiliza para limpiar el buffer de recepción del puerto seleccionado. 00332 No se guarda ninguna información. Siempre devuelve true 00333 * 00334 * @param uart 00335 * @return true 00336 * @return false 00337 */ 00338 bool flush_uart_rx(BufferedSerial *uart) 00339 { 00340 while (uart -> readable()) { 00341 uart -> getc(); 00342 } 00343 return(true); 00344 } 00345 00346 00347 00348 00349 00350 00351 /** 00352 * @brief 00353 * 00354 */ 00355 extern Serial pcusb; 00356 extern BusOut torreLuz; 00357 extern BusOut display_H; 00358 extern BusOut display_dM; 00359 extern BusOut display_uM; 00360 extern Ticker ticker_minuto; 00361 extern Timer t_ocupado; 00362 extern Timer t_apagado; 00363 extern float tiempo_actual; 00364 extern bool mostrar_tiempo; 00365 extern char actual_trailerID_HEX[]; 00366 extern char antena_trailerID_HEX[]; 00367 extern int rtc_delta; 00368 extern int uminutos; 00369 extern int dminutos; 00370 extern int horas; 00371 extern int tiempo_luz_amarilla; 00372 extern int tiempo_luz_roja; 00373 00374 void actualizar_minuto() { 00375 // ACTUALIZACIÓN DE PANTALLA DE CRONOMETRO 00376 uminutos++; // Acumular un minuto 00377 if (uminutos >= 10) { // Si es 10 cambiar 0 00378 uminutos = 0; 00379 dminutos++; // Acumularse las decenas de minutos 00380 } 00381 if (dminutos >= 6) { // Si es 6 cambiar 0 00382 dminutos = 0; // Acumular una hora 00383 horas++; 00384 } 00385 00386 if (mostrar_tiempo) { 00387 rtc_delta = (int)t_ocupado.read(); 00388 pcusb.printf("\r\nTiempo total en Bahia: %d segundos", rtc_delta); 00389 00390 if ((rtc_delta >= tiempo_luz_amarilla) && (rtc_delta < tiempo_luz_roja)) { // Si estamos en el rango de 50 - 59 minutos 00391 pcusb.printf("\r\nSemaforo AMARILLO..."); 00392 presentar_torre(&AMARILLO, &torreLuz); // Activar luz ambar 00393 } else if (rtc_delta >= tiempo_luz_roja) { 00394 pcusb.printf("\r\nSemaforo ROJO..."); 00395 presentar_torre(&ROJO, &torreLuz); // Activar luz roja 00396 } else { 00397 presentar_torre(&VERDE, &torreLuz); // Activar luz ambar 00398 } 00399 presentar_tiempo(&horas, &dminutos, &uminutos, &display_H, &display_dM, &display_uM);// Actualizar la vista del cronometro 00400 pcusb.printf("\r\nTiempo actual [H:MM] = %d:%d%d\r\n\r\n", horas, dminutos, uminutos); 00401 } else { 00402 tiempo_actual = t_apagado.read(); 00403 if (tiempo_actual >= (TIEMPO_RECARGA)) { 00404 pcusb.printf("\r\nSobrepasa limite de %d segundos con pantallas apagadas", TIEMPO_RECARGA); 00405 pcusb.printf("\r\nSe descarta TAG actual y reinicia contadores.\r\n"); 00406 ticker_minuto.detach(); 00407 t_apagado.stop(); 00408 } 00409 } 00410 00411 00412 } 00413 00414 00415 /** 00416 * @brief 00417 * 00418 */ 00419 extern Serial gv300; 00420 extern char skytrack_frame[]; 00421 extern int contador_tramas; 00422 void tx_skytrack() 00423 { 00424 sprintf(skytrack_frame, "%s%s%s%s%04X%s", 00425 CABECERA_TX,CODIGO_INT,ALIVE, FIN_CABECERA_TX, contador_tramas, ULTIMO_CARACTER); 00426 gv300.printf("%s\r\n", skytrack_frame); 00427 00428 incrementar_trama(&contador_tramas); 00429 pcusb.printf("\r\n%s", ALIVE); 00430 }
Generated on Wed Jul 13 2022 06:43:22 by 1.7.2