/* * gnss.cpp * * Created on: Dec 29, 2014 * Author: aras */ #include "gnss.h" namespace te_gnss{ /** * \fn configure * \brief Realiza la configuracion inicial antes de operar. * Establece el baudrate del operacion. Primero autodetecta el baudrate del * receptor y luego la cambia ala deseada. * Tambien activa las trmas NMEA deseadas. * \param gcs estructura de configuracion del receptor gnss * \return "true" si se ha configurado correctamente. * \see gnss_config_struct */ bool configure(gnss_config_struct &gcs) { bool r; r = activate(); r = r && set_baudrate(gcs.baudrate); r = r && set_position(gcs.lat,gcs.lon); return r && activate_nmea_frames(gcs.nmea_mask); } /** * \fn activate * \brief Le da energia de fuente al receptor GNSS a traves de un regulador * con pin de "enable". * \return '0', si falla. Diferente de '0' ("true") si se ha configurado * correctamente. * \see deactivate */ bool activate() { PORTD |= (1<= 5) return; stack[stk_ptr++]=pfunc; } /** * \fn pop * \brief Recupera de la pila la primera funcion y la devuelve en "pfunc" * \param pfunc apuntara a la funcion recuperada de la pila. * \see push */ void pop(void (*pfunc)()){ if(stk_ptr == 0) return; pfunc = stack[--stk_ptr]; stack[stk_ptr]=NULL; } /** * \fn scan_baudrate * \brief Inicia la funcion de escaneo en el puerto uart conectado al GNSS, * con la finalidad de determinar que baudrate esta configurado * \see scan_baudrate_func */ void scan_baudrate(){ baud_idx = 0; write_baud(GNSS_PORT,BAUDRATE(baud_idx)); push(pfunc_pps); pfunc_pps = &scan_baud_func; } /** * \fn scan_baudrate_func * \brief Escanea el puerto uart conectado al GNSS, con la finalidad de * determinar que baudrate esta configurado. * \see scan_baudrate */ void scan_baud_func(){ if(is_gnss_frame_valid()){ pop(pfunc_pps); scan_baud_finish = true; scan_baud_success = true; }else{ baud_idx++; if(baud_idx < BAUD_IDX_MAX){ write_baud(GNSS_PORT,BAUDRATE(baud_idx)); }else{ pop(pfunc_pps); scan_baud_finish = true; scan_baud_success = false; } } } /** * \fn scan_lock_func * \brief Escanea las tramas generadas por el receptor GNSS, con la finalidad de * determinar si esta enganchado o no. * \see wait_to_be_locked */ void scan_lock_func(){ if(is_locked()){ pop(pfunc_pps); scan_lock_finish = true; scan_lock_success = true; }else{ lock_idx++; if(lock_idx >= LOCK_IDX_MAX){ pop(pfunc_pps); scan_lock_finish = true; scan_lock_success = false; } } } /** * \fn get_pps_data_func * \brief lee y procesa las tramas generadas por el receptor GNSS * \see get_pps_data */ void get_pps_data_func(){ char* fr = readline(GNSS_PORT); if(!is_raw){ process_frame(fr); }else{ writeline(RBP_PORT,fr); } } /** * \fn is_gnss_frame_valid * \brief Si todos los caracteres de la trama leida son imprimibles, entonces * la trama sera considerada valida. * Se utiliza para determinar si el baudrate es correcto, ya que de no serlo, * habran caracteres no imprimibles por la desincronizacion. * \return "true" si la trama es valida; "false" de lo contrario. */ bool is_gnss_frame_valid(){ uint8_t idx; char* fr = readline(GNSS_PORT); uint8_t sz = strlen(fr); for(idx=0;idx