Subversion Repositories NaviCtrl

Rev

Rev 480 | Rev 483 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 480 Rev 482
Line 61... Line 61...
61
#include "91x_lib.h"
61
#include "91x_lib.h"
62
#include "main.h"
62
#include "main.h"
63
#include "config.h"
63
#include "config.h"
64
#include "menu.h"
64
#include "menu.h"
65
#include "GPS.h"
65
#include "GPS.h"
66
#include "i2c0.h"
-
 
67
#include "i2c1.h"
66
#include "i2c.h"
68
#include "uart0.h"
67
#include "uart0.h"
69
#include "uart1.h"
68
#include "uart1.h"
70
#include "uart2.h"
69
#include "uart2.h"
71
#include "timer1.h"
70
#include "timer1.h"
72
#include "timer2.h"
71
#include "timer2.h"
Line 684... Line 683...
684
//$GPGGA,191410,4735.5634,N,00739.3538,E,1,04,4.4,351.5,M,48.0,M,,*45
683
//$GPGGA,191410,4735.5634,N,00739.3538,E,1,04,4.4,351.5,M,48.0,M,,*45
685
//$GPGGA,092120.20,,,,,0,00,99.99,,,,,,*6C
684
//$GPGGA,092120.20,,,,,0,00,99.99,,,,,,*6C
686
//http://www.kowoma.de/gps/zusatzerklaerungen/NMEA.htm
685
//http://www.kowoma.de/gps/zusatzerklaerungen/NMEA.htm
687
void CreateNmeaGGA(void)
686
void CreateNmeaGGA(void)
688
{
687
{
689
 unsigned char array[200], i = 0, crc = 0, x;
688
        u8 array[200], i = 0, crc = 0, x;
690
 long tmp1, tmp2;
689
        s32 tmp1, tmp2;
-
 
690
       
691
 i += sprintf(array, "$GPGGA,");
691
        i += sprintf(array, "$GPGGA,");
692
// +++++++++++++++++++++++++++++++++++++++++++
692
        // +++++++++++++++++++++++++++++++++++++++++++
693
 if(SystemTime.Valid)
693
        if(SystemTime.Valid)
694
  {
694
        {
695
   i += sprintf(&array[i], "%02d%02d%02d.%02d,",SystemTime.Hour,SystemTime.Min,SystemTime.Sec,SystemTime.mSec/10);
695
                i += sprintf(&array[i], "%02d%02d%02d.%02d,", SystemTime.Hour, SystemTime.Min, SystemTime.Sec, SystemTime.mSec/10);
696
  }
696
        }
697
 else
697
        else
698
  {
698
        {
699
  i += sprintf(&array[i], ",");
699
                i += sprintf(&array[i], ",");
700
  }
700
        }
701
// +++++++++++++++++++++++++++++++++++++++++++
701
        // +++++++++++++++++++++++++++++++++++++++++++
702
 if(GPSData.Flags & FLAG_GPSFIXOK)
702
        if(GPSData.Flags & FLAG_GPSFIXOK)
703
 {
703
        {
704
  tmp1 = abs(GPSData.Position.Latitude)/10000000L;
704
                tmp1 = abs(GPSData.Position.Latitude)/10000000L;
705
  i += sprintf(&array[i],"%02d",(int)tmp1);
705
                i += sprintf(&array[i],"%02d",(s16)tmp1);
706
 
706
 
707
  tmp1 = abs(GPSData.Position.Latitude)%10000000L;
707
                tmp1 = abs(GPSData.Position.Latitude)%10000000L;
708
  tmp1 *= 6; // in Minuten
708
                tmp1 *= 6; // in Minuten
709
  tmp2 = tmp1 / 1000000L;
709
                tmp2 = tmp1 / 1000000L;
710
  i += sprintf(&array[i],"%02d",(int)tmp2);
710
                i += sprintf(&array[i],"%02d", (s16)tmp2);
711
  tmp2 = tmp1 % 1000000L;
711
                tmp2 = tmp1 % 1000000L;
712
  tmp2 /= 10; // eine Stelle zu viel
712
                tmp2 /= 10; // eine Stelle zu viel
713
  i += sprintf(&array[i],".%05d,",(int)tmp2);
713
                i += sprintf(&array[i],".%05d,", (s16)tmp2);
714
 
714
 
715
  if(GPSData.Position.Latitude >= 0) i += sprintf(&array[i],"N,");
715
                if(GPSData.Position.Latitude >= 0) i += sprintf(&array[i],"N,");
716
  else i += sprintf(&array[i],"S,");
716
                else i += sprintf(&array[i],"S,");
717
// +++++++++++++++++++++++++++++++++++++++++++
717
                // +++++++++++++++++++++++++++++++++++++++++++
718
 
718
 
719
  tmp1 = abs(GPSData.Position.Longitude)/10000000L;
719
                tmp1 = abs(GPSData.Position.Longitude)/10000000L;
720
  i += sprintf(&array[i],"%03d",(int)tmp1);
720
                i += sprintf(&array[i],"%03d", (s16)tmp1);
721
 
721
 
722
  tmp1 = abs(GPSData.Position.Longitude)%10000000L;
722
                tmp1 = abs(GPSData.Position.Longitude)%10000000L;
723
  tmp1 *= 6; // in Minuten
723
                tmp1 *= 6; // in Minuten
724
  tmp2 = tmp1 / 1000000L;
724
                tmp2 = tmp1 / 1000000L;
725
  i += sprintf(&array[i],"%02d",(int)tmp2);
725
                i += sprintf(&array[i],"%02d", (s16)tmp2);
726
  tmp2 = tmp1 % 1000000L;
726
                tmp2 = tmp1 % 1000000L;
727
  tmp2 /= 10; // eine Stelle zu viel
727
                tmp2 /= 10; // eine Stelle zu viel
728
  i += sprintf(&array[i],".%05d,",(int)tmp2);
728
                i += sprintf(&array[i],".%05d,", (s16)tmp2);
729
 
729
 
730
 
730
 
731
  if(GPSData.Position.Longitude >= 0) i += sprintf(&array[i],"E,");
731
                if(GPSData.Position.Longitude >= 0) i += sprintf(&array[i],"E,");
732
  else i += sprintf(&array[i],"W,");
732
                else i += sprintf(&array[i],"W,");
733
  i += sprintf(&array[i],"%d,",GPSData.SatFix);
733
                i += sprintf(&array[i],"%d,",GPSData.SatFix);
734
  i += sprintf(&array[i],"%d,",GPSData.NumOfSats);
734
                i += sprintf(&array[i],"%d,",GPSData.NumOfSats);
735
  i += sprintf(&array[i],"%d.%d,",GPSData.Position_Accuracy/100,abs(GPSData.Position_Accuracy%100));
735
                i += sprintf(&array[i],"%d.%d,",(s16)(GPSData.Position_Accuracy/100),abs(GPSData.Position_Accuracy%100));
736
//  i += sprintf(&array[i],"%d.%d,M,",GPSData.Position.Altitude/1000,abs(GPSData.Position.Altitude%1000)/100);
736
                //  i += sprintf(&array[i],"%d.%d,M,",GPSData.Position.Altitude/1000,abs(GPSData.Position.Altitude%1000)/100);
737
 tmp1 = NaviData.Altimeter / 2; // in dm
737
                tmp1 = NaviData.Altimeter / 2; // in dm
738
  i += sprintf(&array[i],"%d.%d,M,",tmp1 / 10,abs(tmp1 % 10));
738
                i += sprintf(&array[i],"%d.%d,M,",(s16)tmp1 / 10,abs((s16)tmp1 % 10));
739
  i += sprintf(&array[i],",,,*");
739
                i += sprintf(&array[i],",,,*");
740
 }
740
        }
741
 else
741
        else
742
  {
742
        {
743
   i += sprintf(&array[i], ",,,,%d,00,99.99,,,,,,*",GPSData.NumOfSats);
743
                i += sprintf(&array[i], ",,,,%d,00,99.99,,,,,,*",GPSData.NumOfSats);
744
  }
744
        }
745
 for(x=1; x<i-1; x++)
745
        for(x = 1; x < i-1; x++)
746
  {
746
        {
747
   crc ^= array[x];
747
                crc ^= array[x];
748
  }
748
        }
749
  i += sprintf(&array[i], "%02x%c%c",crc,0x0d,0x0a);
749
        i += sprintf(&array[i], "%02x%c%c",crc,0x0d,0x0a);
750
  AddSerialData(&UART1_tx_buffer,array,i);
750
        AddSerialData(&UART1_tx_buffer,array,i);
Line 751... Line 751...
751
 
751
 
752
// +++++++++++++++++++++++++++++++++++++++++++
752
        // +++++++++++++++++++++++++++++++++++++++++++
Line 753... Line 753...
753
}
753
}
754
 
754
 
Line 755... Line 755...
755
//$GPRMC,162614.123,A,5230.5900,N,01322.3900,E,10.0,90.0,131006,1.2,E,A*13
755
//$GPRMC,162614.123,A,5230.5900,N,01322.3900,E,10.0,90.0,131006,1.2,E,A*13
756
//$GPRMC,HHMMSS.sss,A,BBBB.BBBB,b,LLLLL.LLLL,l,GG.G,RR.R,DDMMYY,M.M,m,F*PP
756
//$GPRMC,HHMMSS.sss,A,BBBB.BBBB,b,LLLLL.LLLL,l,GG.G,RR.R,DDMMYY,M.M,m,F*PP
757
 
757
 
758
void CreateNmeaRMC(void)
758
void CreateNmeaRMC(void)
759
{
759
{
760
 unsigned char array[200], i = 0, crc = 0, x;
760
        u8 array[200], i = 0, crc = 0, x;
761
 int tmp_int;
761
        s16 tmp_int;
762
 long tmp1, tmp2;
762
        s32 tmp1, tmp2;
763
// +++++++++++++++++++++++++++++++++++++++++++
763
        // +++++++++++++++++++++++++++++++++++++++++++
764
 i += sprintf(array, "$GPRMC,");
764
        i += sprintf(array, "$GPRMC,");
765
// +++++++++++++++++++++++++++++++++++++++++++
765
        // +++++++++++++++++++++++++++++++++++++++++++
766
 if(SystemTime.Valid)
766
        if(SystemTime.Valid)
767
  {
767
        {
768
   i += sprintf(&array[i], "%02d%02d%02d.%03d,",SystemTime.Hour,SystemTime.Min,SystemTime.Sec,SystemTime.mSec);
768
                i += sprintf(&array[i], "%02d%02d%02d.%03d,", SystemTime.Hour, SystemTime.Min, SystemTime.Sec, SystemTime.mSec);
769
  }
769
        }
770
 else
770
        else
771
  {
771
        {
772
  i += sprintf(&array[i], ",");
772
                i += sprintf(&array[i], ",");
773
  }
773
        }
774
 if(GPSData.Flags & FLAG_GPSFIXOK)
774
        if(GPSData.Flags & FLAG_GPSFIXOK)
775
 {
775
        {
776
// +++++++++++++++++++++++++++++++++++++++++++
776
                // +++++++++++++++++++++++++++++++++++++++++++
777
  tmp1 = abs(GPSData.Position.Latitude)/10000000L;
777
                tmp1 = abs(GPSData.Position.Latitude)/10000000L;
778
  i += sprintf(&array[i],"A,%02d",(int)tmp1); // Status: A = Okay  V = Warnung
778
                i += sprintf(&array[i],"A,%02d", (s16)tmp1); // Status: A = Okay  V = Warnung
779
 
779
       
780
  tmp1 = abs(GPSData.Position.Latitude)%10000000L;
780
                tmp1 = abs(GPSData.Position.Latitude)%10000000L;
781
  tmp1 *= 6; // in Minuten
781
                tmp1 *= 6; // in Minuten
782
  tmp2 = tmp1 / 1000000L;
782
                tmp2 = tmp1 / 1000000L;
783
  i += sprintf(&array[i],"%02d",(int)tmp2);
783
                i += sprintf(&array[i],"%02d", (s16)tmp2);
784
  tmp2 = tmp1 % 1000000L;
784
                tmp2 = tmp1 % 1000000L;
785
  tmp2 /= 10; // eine Stelle zu viel
785
                tmp2 /= 10; // eine Stelle zu viel
786
  i += sprintf(&array[i],".%05d,",(int)tmp2);
786
                i += sprintf(&array[i],".%05d,", (s16)tmp2);
787
  if(GPSData.Position.Latitude >= 0) i += sprintf(&array[i],"N,");
787
                if(GPSData.Position.Latitude >= 0) i += sprintf(&array[i],"N,");
788
  else i += sprintf(&array[i],"S,");
788
                else i += sprintf(&array[i],"S,");
789
// +++++++++++++++++++++++++++++++++++++++++++
789
                // +++++++++++++++++++++++++++++++++++++++++++
790
  tmp1 = abs(GPSData.Position.Longitude)/10000000L;
790
                tmp1 = abs(GPSData.Position.Longitude)/10000000L;
791
  i += sprintf(&array[i],"%03d",(int)tmp1);
791
                i += sprintf(&array[i],"%03d", (s16)tmp1);
792
 
792
       
793
  tmp1 = abs(GPSData.Position.Longitude)%10000000L;
793
                tmp1 = abs(GPSData.Position.Longitude)%10000000L;
794
  tmp1 *= 6; // in Minuten
794
                tmp1 *= 6; // in Minuten
795
  tmp2 = tmp1 / 1000000L;
795
                tmp2 = tmp1 / 1000000L;
796
  i += sprintf(&array[i],"%02d",(int)tmp2);
796
                i += sprintf(&array[i],"%02d", (s16)tmp2);
797
  tmp2 = tmp1 % 1000000L;
797
                tmp2 = tmp1 % 1000000L;
798
  tmp2 /= 10; // eine Stelle zu viel
798
                tmp2 /= 10; // eine Stelle zu viel
799
  i += sprintf(&array[i],".%05d,",(int)tmp2);
799
                i += sprintf(&array[i],".%05d,", (s16)tmp2);
800
  if(GPSData.Position.Longitude >= 0) i += sprintf(&array[i],"E,");
800
                if(GPSData.Position.Longitude >= 0) i += sprintf(&array[i],"E,");
801
  else i += sprintf(&array[i],"W,");
801
                else i += sprintf(&array[i],"W,");
802
// +++++++++++++++++++++++++++++++++++++++++++
802
                // +++++++++++++++++++++++++++++++++++++++++++
803
  tmp_int = GPSData.Speed_Ground; // in cm/sek
803
                tmp_int = GPSData.Speed_Ground; // in cm/sek
804
  tmp_int *= 90;
804
                tmp_int *= 90;
805
  tmp_int /= 463;
805
                tmp_int /= 463;
806
  i += sprintf(&array[i],"%02d.%d,",tmp_int/10,tmp_int%10); // in Knoten
806
                i += sprintf(&array[i],"%02d.%d,",tmp_int/10,tmp_int%10); // in Knoten
807
// +++++++++++++++++++++++++++++++++++++++++++
807
                // +++++++++++++++++++++++++++++++++++++++++++
808
  i += sprintf(&array[i],"%03d.%d,",GyroCompassCorrected/10,GyroCompassCorrected%10);
808
                i += sprintf(&array[i],"%03d.%d,",GyroCompassCorrected/10,GyroCompassCorrected%10);
809
// +++++++++++++++++++++++++++++++++++++++++++
809
                // +++++++++++++++++++++++++++++++++++++++++++
810
 if(SystemTime.Valid)
810
                if(SystemTime.Valid)
811
  {
811
                {
812
   i += sprintf(&array[i], "%02d%02d%02d,",SystemTime.Day,SystemTime.Month,SystemTime.Year);
812
                        i += sprintf(&array[i], "%02d%02d%02d,",SystemTime.Day,SystemTime.Month,SystemTime.Year);
813
  }
813
                }
814
 else
814
                else
815
  {
815
                {
816
  i += sprintf(&array[i], ",");
816
                        i += sprintf(&array[i], ",");
817
  }
817
                }
818
// +++++++++++++++++++++++++++++++++++++++++++
818
                // +++++++++++++++++++++++++++++++++++++++++++
819
  i += sprintf(&array[i],"%d.%1d,", abs(GeoMagDec)/10,abs(GeoMagDec)%10);
819
                i += sprintf(&array[i],"%d.%1d,", abs(GeoMagDec)/10,abs(GeoMagDec)%10);
820
  if(GeoMagDec < 0) i += sprintf(&array[i], "W,"); else i += sprintf(&array[i], "E,");
820
                if(GeoMagDec < 0) i += sprintf(&array[i], "W,"); else i += sprintf(&array[i], "E,");
821
// +++++++++++++++++++++++++++++++++++++++++++
821
                // +++++++++++++++++++++++++++++++++++++++++++
822
  if(GPSData.Flags & FLAG_DIFFSOLN) i += sprintf(&array[i], "D,");
822
                if(GPSData.Flags & FLAG_DIFFSOLN) i += sprintf(&array[i], "D,");
823
  else i += sprintf(&array[i], "A,");
823
                else i += sprintf(&array[i], "A,");
824
 }
824
        }
825
 else // kein Satfix
825
        else // kein Satfix
826
  {
826
        {
827
   i += sprintf(&array[i], "V,,,,,,,,,,N*");
827
                i += sprintf(&array[i], "V,,,,,,,,,,N*");
828
  }
828
        }
829
// +++++++++++++++++++++++++++++++++++++++++++
829
        // +++++++++++++++++++++++++++++++++++++++++++
830
//  CRC
830
        //  CRC
831
// +++++++++++++++++++++++++++++++++++++++++++
831
        // +++++++++++++++++++++++++++++++++++++++++++
832
 for(x=1; x<i-1; x++)
832
        for(x=1; x<i-1; x++)
833
  {
833
        {
834
   crc ^= array[x];
834
                crc ^= array[x];
835
  }
835
        }
836
  i += sprintf(&array[i], "%02x%c%c",crc,0x0d,0x0a);
836
        i += sprintf(&array[i], "%02x%c%c",crc,0x0d,0x0a);
837
// +++++++++++++++++++++++++++++++++++++++++++
837
        // +++++++++++++++++++++++++++++++++++++++++++
Line 838... Line 838...
838
  AddSerialData(&UART1_tx_buffer,array,i);
838
        AddSerialData(&UART1_tx_buffer,array,i);
839
// +++++++++++++++++++++++++++++++++++++++++++
839
        // +++++++++++++++++++++++++++++++++++++++++++
840
/*
840
/*
841
 
841
 
842
 
842
 
843
 
843
 
844
                                GPSData.Flags =         (GPSData.Flags & 0xf0) | (UbxSol.Flags & 0x0f); // we take only the lower bits
844
                GPSData.Flags =         (GPSData.Flags & 0xf0) | (UbxSol.Flags & 0x0f); // we take only the lower bits
845
                                GPSData.NumOfSats =                     UbxSol.numSV;
845
                GPSData.NumOfSats =                     UbxSol.numSV;
846
                                GPSData.SatFix =                                UbxSol.GPSfix;
846
                GPSData.SatFix =                                UbxSol.GPSfix;
847
                                GPSData.Position_Accuracy =             UbxSol.PAcc;
847
                GPSData.Position_Accuracy =             UbxSol.PAcc;
848
                                GPSData.Speed_Accuracy =                UbxSol.SAcc;
848
                GPSData.Speed_Accuracy =                UbxSol.SAcc;
849
                                SetGPSTime(&SystemTime); // update system time
849
                SetGPSTime(&SystemTime); // update system time
850
                                // NAV POSLLH
850
                // NAV POSLLH
851
                                GPSData.Position.Status =               INVALID;
851
                GPSData.Position.Status =               INVALID;
852
                                GPSData.Position.Longitude =    UbxPosLlh.LON;
852
                GPSData.Position.Longitude =    UbxPosLlh.LON;
853
                                GPSData.Position.Latitude =     UbxPosLlh.LAT;
853
                GPSData.Position.Latitude =     UbxPosLlh.LAT;
854
                                GPSData.Position.Altitude =     UbxPosLlh.HMSL;
854
                GPSData.Position.Altitude =     UbxPosLlh.HMSL;
855
                                GPSData.Position.Status =               NEWDATA;
855
                GPSData.Position.Status =               NEWDATA;
856
                                // NAV VELNED
856
                // NAV VELNED
857
                                GPSData.Speed_East =                    UbxVelNed.VEL_E;
857
                GPSData.Speed_East =                    UbxVelNed.VEL_E;
858
                                GPSData.Speed_North =                   UbxVelNed.VEL_N;
858
                GPSData.Speed_North =                   UbxVelNed.VEL_N;
859
                                GPSData.Speed_Top       =                       -UbxVelNed.VEL_D;
859
                GPSData.Speed_Top       =                       -UbxVelNed.VEL_D;
860
                                GPSData.Speed_Ground =                  UbxVelNed.GSpeed;
860
                GPSData.Speed_Ground =                  UbxVelNed.GSpeed;
861
                                GPSData.Heading =                               UbxVelNed.Heading;
861
                GPSData.Heading =                               UbxVelNed.Heading;
862
        SystemTime.Year = 0;
862
                SystemTime.Year = 0;
863
        SystemTime.Month = 0;
863
                SystemTime.Month = 0;
Line 864... Line 864...
864
        SystemTime.Day = 0;
864
                SystemTime.Day = 0;
865
        SystemTime.Hour = 0;
865
                SystemTime.Hour = 0;
866
        SystemTime.Min = 0;
866
                SystemTime.Min = 0;
867
        SystemTime.Sec = 0;
867
                SystemTime.Sec = 0;
868
        SystemTime.mSec = 0;
868
                SystemTime.mSec = 0;
Line 869... Line 869...
869
        SystemTime.Valid = 0;
869
                SystemTime.Valid = 0;
870
       
870
       
871
                                FromFlightCtrl.GyroHeading / 10;//NaviData.HomePositionDeviation.Bearing / 2;
871
                FromFlightCtrl.GyroHeading / 10;//NaviData.HomePositionDeviation.Bearing / 2;
872
                                        if(GPSData.Position.Latitude < 0) ToFlightCtrl.Param.Byte[5]  = 1; // 1 = S
872
                        if(GPSData.Position.Latitude < 0) ToFlightCtrl.Param.Byte[5]  = 1; // 1 = S
873
                                        else ToFlightCtrl.Param.Byte[5]  = 0; // 1 = S
873
                        else ToFlightCtrl.Param.Byte[5]  = 0; // 1 = S
874
                                        i1 = abs(GPSData.Position.Latitude)/10000000L;
874
                        i1 = abs(GPSData.Position.Latitude)/10000000L;
875
                                        i2 = abs(GPSData.Position.Latitude)%10000000L;
875
                        i2 = abs(GPSData.Position.Latitude)%10000000L;
876
 
876
 
877
 
877
 
878
 
878
 
879
                                        if(!(NCFlags & NC_FLAG_GPS_OK)) {i1 = 0; i2 = 0;}
879
                        if(!(NCFlags & NC_FLAG_GPS_OK)) {i1 = 0; i2 = 0;}
880
                                        i1 *= 100;
880
                        i1 *= 100;
881
                                        i1 += i2 / 100000;
881
                        i1 += i2 / 100000;
882
                                        i2  = i2 % 100000;
882
                        i2  = i2 % 100000;
883
                                        i2 /= 10;
883
                        i2 /= 10;
884
                                        ToFlightCtrl.Param.Byte[6]  = i1 % 256;
884
                        ToFlightCtrl.Param.Byte[6]  = i1 % 256;
885
                                        ToFlightCtrl.Param.Byte[7]  = i1 / 256;
885
                        ToFlightCtrl.Param.Byte[7]  = i1 / 256;
886
                                        ToFlightCtrl.Param.Byte[8]  = i2 % 256;
886
                        ToFlightCtrl.Param.Byte[8]  = i2 % 256;
887
                                        ToFlightCtrl.Param.Byte[9]  = i2 / 256;
887
                        ToFlightCtrl.Param.Byte[9]  = i2 / 256;
Line 888... Line 888...
888
                                        break;
888
                        break;
889
                                case 1:
889
                case 1: