Subversion Repositories Projects

Rev

Rev 2147 | Blame | Last modification | View Log | RSS feed

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

//############################################################################
//# HISTORY  gpsmouse.c
//#
//# 30.07.2015 CB
//# - add: Anzeige von CRC Fehlern im NMEA Datensatz in GPSMouse_ShowData
//#
//# 28.07.2015 CB
//# - fix: Überprüfung von führenden 00 in der MAC-Adresse der BT Maus abgeschaltet
//#
//# 28.06.2014 OG
//# - fix: GPSMouse_ShowData() - wenn BT-Datenverlust dann immer GPSMouse_Disconnect()
//#        auch wenn waitsatfix Modus aktiv ist
//# - fix: GPSMouse_ShowData() - Rueckgabe von 0 wenn Verbindung bereits vorhanden war
//#        und dabei aber ein Verbindungsverlust zur BT GPS-Maus auftrat
//#
//# 27.06.2014 OG
//# - chg: GPSMouse_Disconnect() - Anzeige von BT-Datenverlust optimiert
//# - chg: GPSMouse_ShowData() - nach GPSMouse_Connect ein clear_key_all() eingefuegt
//#
//# 24.06.2014 OG
//# - add: GPSMouse_Connect(), GPSMouse_Disconnect()
//#
//# 23.06.2014 OG
//# - chg: GPSMouse_ShowData() - neue Parameter und Return-Codes fuer
//#        hoehere Flexibilitaet
//#
//# 22.06.2014 OG - NEU
//# ehemals BT_ShowGPSData() in setup.c
//############################################################################

#include "../cpu.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <string.h>
#include <util/delay.h>

#include "../main.h"
#include "../lcd/lcd.h"
#include "../setup/setup.h"
#include "../eeprom/eeprom.h"
#include "../lipo/lipo.h"
#include "../timer/timer.h"
#include "../bluetooth/fifo.h"
#include "../bluetooth/bluetooth.h"
#include "../uart/uart1.h"
#include "../utils/menuctrl.h"
#include "../utils/xutils.h"
#include "../pkt/pkt.h"
#include "../messages.h"
//#include "../gps/gps_nmea.h"
#include "../avr-nmea-gps-library/nmea.h"
#include "../gps/gpsmouse.h"


static const char STR_FIX0[]     PROGMEM = "  no";
static const char STR_FIX1[]     PROGMEM = " GPS";
static const char STR_FIX2[]     PROGMEM = "DGPS";
static const char STR_FIX6[]     PROGMEM = "esti";
static const char STR_FIX[]      PROGMEM = " ---";





//--------------------------------------------------------------
// retcode = GPSMouse_Connect()
//
// RUECKGABE:
//  -2: kein BTM222 eingebaut
//  -1: keine GPS Maus konfiguriert
//   0: Fehler bei connect, kein connect durchgeführt (evtl. GPS Maus nicht eingeschaltet)
//   1: verbunden
//--------------------------------------------------------------
int8_t GPSMouse_Connect( void )
{
    uint8_t status;

    if( !BT_CheckBTM222() )
    {
        // PKT_Message_P( text, error, timeout, beep, clearscreen)
        PKT_Message_P( strGet(STR_NOBTM222), true, 1000, true, true);           // 1000 = max. 10 Sekunden anzeigen; "kein BTM222 vorh."
        return -2;                                                              // -2: kein BTM222 eingebaut
    }

//      deaktiviert, MAC Adressen von Handys haben keine 00 in der MAC-Adresse
//    if( (Config.gps_UsedMac[5] == '0') || (Config.gps_UsedMac[6] == '0') )
//    {
        // PKT_Message_P( text, error, timeout, beep, clearscreen)
//        PKT_Message_P( strGet(STR_NOGPSMOUSE), true, 1000, true, true);         // 1000 = max. 10 Sekunden anzeigen; "keine GPS-Maus!"
//        return -1;                                                              // -1: keine GPS Maus konfiguriert
//    }


    //--------------------
    // verbinde BT GPS-Maus
    //--------------------
    PKT_Title( Config.gps_UsedDevName, true, true);                             // PKT_Title( text, lShowLipo, clearscreen )

    lcdx_printp_center( 2, strGet(STR_GPSMOUSECONNECT), MNORMAL, 0,1);          // "suche GPS-Maus"

    PKT_Gauge_Begin( 0 );                                                       // Gauge: 0 = Default fuer y verwenden

    set_BTOn();

    if( Config.BTIsSlave )
    {
        bt_downlink_init();
    }

    status = bt_connect( Config.gps_UsedMac );

    uart1_flush();
    fifo_clear(&in_fifo);

    UART1_receiveNMEA = true;                                                   // Uartflag setzen zur Erkennung der NMEA Datensätze

    PKT_Gauge_End();                                                            // Gauge: Ende

    if( !status )                                                               // keine Verbindung zum BT-Device
    {
        set_BTOff();

        // PKT_Message_P( text, error, timeout, beep, clearscreen)
        PKT_Message_P( strGet(STR_GPSMOUSECONNECTION), true, 1000, true, true); // 1000 = max. 10 Sekunden anzeigen; "GPS-Maus Verbindung"
        return 0;                                                               // 0: Fehler bei connect, kein connect durchgeführt (evtl. GPS Maus nicht eingeschaltet)
    }

    return 1;                                                                   // 1 = ok, Verbindung steht
}



//--------------------------------------------------------------
// GPSMouse_Disconnect()
//--------------------------------------------------------------
void GPSMouse_Disconnect( void )
{
    PKT_Title( Config.gps_UsedDevName, true, true);                             //PKT_Title( text, lShowLipo, clearscreen )

    //---------------------
    // GPS beenden
    //---------------------
    UART1_receiveNMEA = false;
    if( !receiveNMEA )                                                          // ggf. anders implementieren, z.B. via Parameter; aber erstmal geht's auch so
    {
      //lcdx_cls_row( y, mode, yoffs )
        lcdx_cls_row( 7, MINVERSX, 0 );
        lcdx_printp_center( 7, strGet(STR_BT_LOSTDATA), MINVERSX, 0,0);         // "BT Datenverlust"
        set_beep( 600, 0xffff, BeepNormal);
    }

    lcdx_printp_center( 2, strGet(STR_GPSMOUSEDISCONNECT), MNORMAL, 0,1);       // "trenne GPS-Maus"

    PKT_Gauge_Begin( 0 );                                                       // Gauge: 0 = Default fuer y verwenden

    receiveNMEA = false;                                                        // Uartflag zurücksetzen, es kommen keine NMEA Datensätze mehr

    if (!bt_disconnect());
    {
//        lcdx_printp_center( 2, PSTR("Error on disconnect"), MNORMAL, 0,1);       // Fehler beim Disconncet aufgetreten
//        _delay_ms(2000);                                                         // 09.08.2015 cebra, muss noch untersucht werden, ist aber jetzt kein Problem
    }

    set_BTOff();

    PKT_Gauge_End();                                                            // Gauge: Ende
}



//--------------------------------------------------------------
// retcode = GPSMouse_ShowData( mode, waitsatfix )
//
// zeigt GPS-Daten der aktuellen BT-Maus an
//
// PARAMETER:
//  show:
//     was soll in der 2. Zeile angezeigt werden
//     GPSMOUSE_SHOW_TIME || GPSMOUSE_SHOW_WAITSATFIX
//
//  waitsatifix:
//      0 = Verbindungsaufbau; Daten anzeigen und beenden der
//          BT-Verbindung (fuer setup.c)
//      n = Zeit (via timer) die nach einem erfolgreichen Satfix gewartet wird bis
//          GPSMouse_ShowData() beendet wird - die Verbindung zur GPS-Maus bleibt erhalten
//          und kann weiterverwendet werden! (z.B. in followme.c)
//
// RUECKGABE:
//  -2: kein BTM222 eingebaut
//  -1: keine GPS Maus konfiguriert
//   0: Fehler bei connect, kein connect durchgeführt (evtl. GPS Maus nicht eingeschaltet)
//   1: connect zur GPS Maus ok, Benutzer hat Anzeige beenden
//   2: connect zur GPS Maus ok, Satix hat Anzeige beendet
//
// zusammengefasst:
//  >0 : Ok
//  <=0: Fehler
//--------------------------------------------------------------
int8_t GPSMouse_ShowData( uint8_t show, uint16_t waitsatfix )
{
    uint8_t redraw = true;
    uint8_t state_posfix = 0;
    const char *pStr;
    int8_t yoffs;
    int8_t retcode;



    //--------------------
    // BT GPS-Maus verbinden
    //--------------------
    retcode = GPSMouse_Connect();
    if( retcode <= 0 )
    {
        return retcode;
    }
    timer_nmea_timeout = NMEA_TIMEOUT;                      // Timeout Timer setzen
    clear_key_all();



    //---------------------
    // zeige GPS-Daten
    //---------------------

    receiveNMEA  = true;


    do
    {
        //-------------------------
        // Screen redraw
        //-------------------------
        if( redraw )
        {
            PKT_Title( Config.gps_UsedDevName, true, true);                             //PKT_Title( text, lShowLipo, clearscreen )

            if( show == GPSMOUSE_SHOW_TIME )                                            // Zeile 2: GPS-Zeit
            {
                lcdx_printp_at( 6, 1, PSTR("["), MNORMAL, -1,2);                            // Mitte: GPS Time
                lcdx_printp_at(15, 1, PSTR("]"), MNORMAL, -2,2);                            // ..
                lcd_line( 0, 13,  34, 13, 1);                                               // ..
                lcd_line(92, 13, 127, 13, 1);                                               // ..
            }

            if( show == GPSMOUSE_SHOW_WAITSATFIX )                                      // Zeile 2: "warte auf Satfix..."
            {
                yoffs = 1;
                lcdx_cls_row( 1, MINVERS, yoffs);
                lcdx_printp_center( 1, strGet(STR_WAITSATFIX), MINVERS, 0,yoffs);           // "warte auf Satfix..."
            }

//            yoffs = 1;
//            lcdx_cls_row( 1, MINVERS, yoffs);
//            lcdx_printp_center( 1,strGet(STR_WAITNMEA), MINVERS, 0,yoffs);           // "warte auf NMEA..."

            lcdx_printp_at( 0, 2, PSTR("Fix:") , MNORMAL, 0,3);                         // Links; Fix
            lcdx_printp_at( 0, 3, PSTR("Sat:") , MNORMAL, 0,3);                         // Links; Sat
            lcdx_printp_at( 0, 4, PSTR("Alt:") , MNORMAL, 0,3);                         // Links; Alt

            lcdx_printp_at(11, 2, PSTR("RCnt:"), MNORMAL, 0,3);                         // Rechts: RCnt - Zaehler empfangener GPGGA Datenpakete
            lcdx_printp_at(11, 3, PSTR("CErr:"), MNORMAL, 0,3);                         // Rechts: RErr - Zaehler fehlerhafte NMEA Pakete
            lcdx_printp_at(11, 4, PSTR("HDOP:"), MNORMAL, 0,3);                         // Rechts: HDOP

            lcdx_cls_row( 5, MINVERS, 4);                                               // Hintergrund invers
            lcdx_printp_at( 1, 5, strGet(START_LASTPOS1), MINVERS, 0,4);                //   "Breitengr.  Längengr."

            lcd_rect( 0, (4*8)+11, 127, (2*8)+4, 1);                                    // Rahmen

            redraw = false;
        }


        //-------------------------
        // PKT-LiPo anzeigen
        //-------------------------
        show_Lipo();


        //-------------------------
        // PKT-Update geht hier nicht...
        // wegen der Hardware-Verbindung
        //-------------------------
        //if( PKT_CtrlHook() )
        //{
        //    redraw = true;
        //}

        //-------------------------
        //-------------------------

       if(NMEA_isdataready())                                                                        // NMEA Daten vorhanden?
        {

          if( show == GPSMOUSE_SHOW_TIME )
          {
              lcdx_print_at(7, 1, (uint8_t *)NMEA.Time, MNORMAL, -2,2);                          // Mitte: GPS Time
          }

          //--------------
          // Sat-Fix
          //--------------
          //writex_ndigit_number_u( 6, 2, NMEA.SatFix , 2,0, MNORMAL, 0,3);                       // Links: Fix (als Zahl)
          switch( NMEA.SatFix )
          {
              case 0:  pStr = STR_FIX0;   break;                                                  // kein Sat-Fix!
              case 1:  pStr = STR_FIX1;   break;                                                  // GPS - Fix: OK
              case 2:  pStr = STR_FIX2;   break;                                                  // DGPS - Fix: OK
              case 6:  pStr = STR_FIX6;   break;                                                  // Estimated - wird hier als nicht Ok angesehen weil nicht klar was es bedeutet
              default: pStr = 0;                                                                  // Sat-Fix Code unbekannt!
                       lcdx_printf_at_P( 4, 2, MNORMAL, 1,3, PSTR(" ? %d"), NMEA.SatFix);         //  -> Zahl wird angezeigt - ggf. recherchieren was da bedeutet (Fix ok oder nicht)
                       break;
          }

          if( pStr )
          {
              lcdx_printf_at_P( 4, 2, MNORMAL, 1,3, PSTR("%4S"), pStr);                           // GPS Fix als String ausgeben
          }

          if( NMEA.SatFix==1 || NMEA.SatFix==2 )                                                  // Sat-Fix OK  =>  einen Haken anzeigen
              lcdx_putc( 8, 2, SYMBOL_CHECK, MNORMAL, 2,3 );
          else
              lcdx_putc( 8, 2, ' ',          MNORMAL, 2,3 );


          //--------------
          // Sat-Anzahl
          //--------------
          writex_ndigit_number_u( 6, 3, NMEA.SatsInUse, 2,0, MNORMAL, 1,3);                       // Links: Sat-Anzahl
          if( NMEA.SatsInUse >= GPSMOUSE_MINSAT )                                                 //   Haken angezeigt wenn MINSAT ok
              lcdx_putc( 8, 3, SYMBOL_CHECK, MNORMAL, 2,3 );
          else
              lcdx_putc( 8, 3, ' ',          MNORMAL, 2,3 );


          //--------------
          // Altitude
          //--------------
          lcdx_printf_at_P( 4, 4, MNORMAL, 1,3, PSTR("%4.1d"), NMEA.Altitude);                    // Links: Altitude


          //--------------
          // empfangene GPGGA Datenpakete
          //--------------
          lcdx_printf_at_P(16, 2, MNORMAL, 0,3, PSTR("%5ld"), NMEA.Counter );                     // Rechts: Anzahl empfangener NMEA GPGGA-Pakete


          //--------------
          // NMEA CRC Fehler
          //--------------
          lcdx_printf_at_P(16, 3, MNORMAL, 0,3, PSTR("%5ld"), NMEA_getCRCerror() );              // Rechts: Anzahl CRC Fehler im NMEA GPGGA-Pakete
//          lcdx_printf_at( 15, 3, mode, 0, 3, "%3.5ld", (uint32_t)NMEA_getBearing());
//          writex_ndigit_number_u_10th(15, 3, NMEA_getBearing(), 4,0, MNORMAL, 0,3);

          //--------------
          // HDOP
          //--------------
          if( NMEA.HDOP == 0 )                                                                    // Rechts:: HDOP
            lcdx_printp_at(16, 4, PSTR("  ---"), MNORMAL, 0,3);
          else
            writex_ndigit_number_u_10th(16, 4, NMEA.HDOP, 4,0, MNORMAL, 0,3);


          //--------------
          // Lat / Lon
          //--------------
          writex_gpspos( 1, 6, NMEA.Latitude , MNORMAL, 0,6 );                                     // unten links: Latitude
          writex_gpspos(12, 6, NMEA.Longitude, MNORMAL, 0,6 );                                     // unten rechts: Longitude


          //--------------
          //--------------
          if( waitsatfix > 0 )
          {
              if( (NMEA.SatFix==1 || NMEA.SatFix==2) && (state_posfix==0) )
              {
                  state_posfix = 1;
                  timer = waitsatfix;                                                             // Verzoegerung bzgl. Exit (z.B. 600 = 6 Sekunden)
              }

              if( (NMEA.SatFix!=1 && NMEA.SatFix!=2) && (state_posfix==1) && (timer!=0) )
              {
                  state_posfix = 0;
              }

              if( (NMEA.SatFix==1 || NMEA.SatFix==2) && (state_posfix==1) && (timer==0) )
              {
                  clear_key_all();
                  return 2;                                                                       // 2: connect zur GPS Maus ok, Satix hat Anzeige beendet
              }
          }

      }

       if (timer_nmea_timeout == 0) receiveNMEA = false;

    } while( !get_key_press(1 << KEY_ESC) && receiveNMEA );



    //---------------------
    // GPS beenden
    //---------------------
    if( (waitsatfix == 0) || !receiveNMEA )
    {

       GPSMouse_Disconnect();
    }

    clear_key_all();
    return (receiveNMEA ? 1 : 0);                                                               // 1: connect zur GPS Maus ok, Benutzer hat Anzeige beenden
}


// save, Anzeige der Daten im Format der neuen NMEA Routinen, nach Umbau auf NMEA Structur nicht mehr notwendig
//              {
//
//
//                if( show == GPSMOUSE_SHOW_TIME )
//                {
////                    lcdx_print_at(7, 1, (uint8_t *)NMEA.Time, MNORMAL, -2,2);                          // Mitte: GPS Time
//
//                    writex_ndigit_number_u( 7, 1, NMEA_getHour(), 2,0, MNORMAL, -2,2);
//                    lcdx_printp_at( 9, 1, PSTR(":") , MNORMAL, -2,2);
//                    writex_ndigit_number_u( 10, 1, NMEA_getMinute(), 2,0, MNORMAL, -2,2);
//                    lcdx_printp_at( 12, 1, PSTR(":") , MNORMAL, -2,2);
//                    writex_ndigit_number_u( 13, 1, NMEA_getSecond(), 2,0, MNORMAL, -2,2);
//
//                }
//
//                //--------------
//                // Sat-Fix
//                //--------------
//                //writex_ndigit_number_u( 6, 2, NMEA.SatFix , 2,0, MNORMAL, 0,3);                       // Links: Fix (als Zahl)
//                switch( NMEA_getGPSfix() )
//                {
//                    case 0:  pStr = STR_FIX0;   break;                                                  // kein Sat-Fix!
//                    case 1:  pStr = STR_FIX1;   break;                                                  // GPS - Fix: OK
//                    case 2:  pStr = STR_FIX2;   break;                                                  // DGPS - Fix: OK
//                    case 6:  pStr = STR_FIX6;   break;                                                  // Estimated - wird hier als nicht Ok angesehen weil nicht klar was es bedeutet
//                    default: pStr = 0;                                                                  // Sat-Fix Code unbekannt!
//                             lcdx_printf_at_P( 4, 2, MNORMAL, 1,3, PSTR(" ? %d"), NMEA_getGPSfix());         //  -> Zahl wird angezeigt - ggf. recherchieren was da bedeutet (Fix ok oder nicht)
//                             break;
//                }
//
//                if( pStr )
//                {
//                    lcdx_printf_at_P( 4, 2, MNORMAL, 1,3, PSTR("%4S"), pStr);                           // GPS Fix als String ausgeben
//                }
//
//                if( NMEA_getGPSfix()==1 || NMEA_getGPSfix()==2 )                                                  // Sat-Fix OK  =>  einen Haken anzeigen
//                    lcdx_putc( 8, 2, SYMBOL_CHECK, MNORMAL, 2,3 );
//                else
//                    lcdx_putc( 8, 2, ' ',          MNORMAL, 2,3 );
//
//
//                //--------------
//                // Sat-Anzahl
//                //--------------
//                writex_ndigit_number_u( 6, 3, NMEA_getSatellites(), 2,0, MNORMAL, 1,3);                       // Links: Sat-Anzahl
//                if( NMEA_getSatellites() >= GPSMOUSE_MINSAT )                                                 //   Haken angezeigt wenn MINSAT ok
//                    lcdx_putc( 8, 3, SYMBOL_CHECK, MNORMAL, 2,3 );
//                else
//                    lcdx_putc( 8, 3, ' ',          MNORMAL, 2,3 );
//
//
//                //--------------
//                // Altitude
//                //--------------
//                lcdx_printf_at_P( 4, 4, MNORMAL, 1,3, PSTR("%4.1d"), NMEA_getAltitude());                    // Links: Altitude
//
//
//                //--------------
//                // empfangene GPGGA Datenpakete
//                //--------------
//                lcdx_printf_at_P(16, 2, MNORMAL, 0,3, PSTR("%5ld"), NMEA_getNMEAcounter() );                     // Rechts: Anzahl empfangener NMEA GPGGA-Pakete
//
//
//                //--------------
//                // NMEA CRC Fehler
//                //--------------
//                lcdx_printf_at_P(16, 3, MNORMAL, 0,3, PSTR("%5ld"), NMEA_getCRCerror() );                     // Rechts: Anzahl empfangener NMEA GPGGA-Pakete
//
////                writex_ndigit_number_u(1, 5, UART1_GPGGA   , 4,0, MNORMAL, 0,3);
////                writex_ndigit_number_u(5, 5, bt_overrun   , 4,0, MNORMAL, 0,3);
////                writex_ndigit_number_u(10, 5, bt_bufferoverflow   , 4,0, MNORMAL, 0,3);
//
//
//                //--------------
//                // HDOP
//                //--------------
//                if(NMEA_getHDOP() == 0 )                                                                    // Rechts:: HDOP
//                  lcdx_printp_at(16, 4, PSTR("  ---"), MNORMAL, 0,3);
//                else
//                  writex_ndigit_number_u_10th(16, 4, NMEA_getHDOP(), 4,0, MNORMAL, 0,3);
//
//
//                //--------------
//                // Lat / Lon
//                //--------------
//                writex_gpspos( 1, 6, NMEA_getLatitude() , MNORMAL, 0,6 );                                     // unten links: Latitude
//                writex_gpspos(12, 6, NMEA_getLongitude(), MNORMAL, 0,6 );                                     // unten rechts: Longitude
//
//
//                //--------------
//                //--------------
//                if( waitsatfix > 0 )
//                {
//                    if( (NMEA_getGPSfix()==1 || NMEA_getGPSfix()==2) && (state_posfix==0) )
//                    {
//                        state_posfix = 1;
//                        timer = waitsatfix;                                                             // Verzoegerung bzgl. Exit (z.B. 600 = 6 Sekunden)
//                    }
//
//                    if( (NMEA_getGPSfix()!=1 && NMEA_getGPSfix()!=2) && (state_posfix==1) && (timer!=0) )
//                    {
//                        state_posfix = 0;
//                    }
//
//                    if( (NMEA_getGPSfix()==1 || NMEA_getGPSfix()==2) && (state_posfix==1) && (timer==0) )
//                    {
//                        clear_key_all();
//                        return 2;                                                                       // 2: connect zur GPS Maus ok, Satix hat Anzeige beendet
//                    }
//                }
//
//          }