Page 4 of 8 FirstFirst ... 2 3 4 5 6 ... LastLast
Results 46 to 60 of 120

Thread: Navigatie systeem

  1. #46
    Complete code heb ik op dit moment niet. Ik zal in het weekend wel even kijken of ik iets kan vinden (wat bij mij werkt).
    Heb je nog iets gevonden ?
    Want wat ik ook probeer ik kom helaas geen stap verder...
    Last edited by MMSoft; 30-Oct-16 at 13:51.

  2. #47
    Nee, de satallites (SENSOR_DATA_TYPE_SATELLITES_USED_COUNT) krijg ik niet uitgelezen.

    Ik heb wel gemerkt dat, als je de SensorManager gebruikt om de LocationSensor uit te lezen, de Altitude NaN is als de GPS geen fix heeft. Ik weet niet of TLocationSensor ook Altitude heeft maar op die manier kun je wel zien of je een fix via de GPS hebt of via de GSM-torens/Wifi netwerken.

  3. #48
    Ik heb deze regel erbij gezet
    Code:
    Label6.Text := Format('%2.7f', [LocationSensor1.Sensor.Altitude]);
    En deze geeft waardes van ca. 33,xxxx .... 63,xxxx.
    In het begin begreep ik niets van deze waardes, maar later leek het er steeds meer op dat deze de hoogte aan geeft.
    Als ik een "berg op" rijdt wordt deze waarde namelijk hoger en "berg af" weer lager.
    Ik heb niet het idee dat ik met deze waarde kan bepalen of er wel/geen GPS ontvangst is.

  4. #49
    Ik neem aan dat als je geen gps-ontvangst hebt dat altitude NaN is. Want ik kan me geen sensor voorstellen die anders altitude terug geeft.

    Ik ben ben wel al wat verder om de echte aantal satellites te tellen (met nmea-listener) maar mijn test-projectje crasht elke keer.

    Het lijkt wel alsof je echt de enige bent die dit nodig heeft (en met Delphi doet)

  5. #50
    Ik neem aan dat als je geen gps-ontvangst hebt dat altitude NaN is. Want ik kan me geen sensor voorstellen die anders altitude terug geeft.
    In een tunnel bleef volgens mij de laatste waarde staan, maar heb dat helaas niet betrouwbaar kunnen zien (het was erg druk en had mijn aandacht op de weg nodig).

    Edit:
    Click image for larger version. 

Name:	Tunnel.jpg 
Views:	86 
Size:	60.0 KB 
ID:	7411

    Maar had nog wel even tijd op om de toets 'Screen (shot)' te drukken
    Hier ben ik in de Heinenoordtunnel, en de waarde is 36,4 (zie links onder).
    Last edited by MMSoft; 31-Oct-16 at 20:52.

  6. #51
    Ja, dat kan natuurlijk ook dat de laatste waarde blijft staan. Dan heb je echt de methode nodig om de satellieten weer te geven.

  7. #52
    Welke SDK gebruik je in XE8?

    In SDK 24 zijn wat dingen gewijzigd en JGPSStatus is deprecated.
    Ik denk dat dat ook de reden is waarom ik de satellieten niet binnen kan halen.

    Alternatief is JGnnsStatus (maar daar zie ik geen definities in Delphi voor) of NmeaListener (maar die geeft de data raw terug).

  8. #53
    Welke SDK gebruik je in XE8?
    SDK 24.0.2 32 Bits

  9. #54
    Quote Originally Posted by MMSoft View Post
    SDK 24.0.2 32 Bits
    Ok. Dan zul je waarschijnlijk nieuwe android header files moeten gebruiken (waar gnss_status in staat). In SDK 24 is nogal wat gewijzigd en ik zag dus dat gpsstatus deprecated was.

    Ik heb nieuwe headers gevonden op github van fmxexpress die zouden moeten werken maar ik ben nog aan het kijken hoe ik die in moet passen.

  10. #55
    Was je hier nog iets verder mee gekomen ?

  11. #56
    Ik krijg de android-n header files niet aan de gang in Delphi. Ik blijf een probleem met de interface hebben. Ik heb nog wel een andere methode gevonden en die ga ik straks even proberen.

    Anders zal ik even verder kijken naar de nmea-listener methode om de satellieten in een string te krijgen (want die werkte wel bij mij maar is wat lastiger).

    Hoor je vanmiddag meer over.

  12. #57
    Wel... Ik krijg de JGpsStatus.getSatellites (iterator) niet aan de gang. Het lijkt wel of deze functie gewoon niet meer gebruikt kan worden (ondanks dat ie er nog wel in zit voor compatibiliteit maar in SDK 24 depreacated is).

    De nieuwe methode voor SDK 24 via de JGnssStatus.getNumSatellites krijg ik ook niet aan de gang. De FMXExpress android-object-pascal-wrapper voor SDK 24 (android-n) zijn niet bepaald compatible met Delphi 10.1 Berlin. En in 10.1 en ouder zit die hele Gnns nog helemaal niet. Die krijg ik dus niet aan de praat. Dan zie je dus hoe belangrijk het zou zijn om je Delphi up-to-date te houden en dan zelfs nog heb je oude header-files.

    Blijven 2 methodes over. De eerste is alleen de tijd van de laatst geldende fix oproepen. Dit is vrij simpel en wanneer je laatste fix ouder dan bijvoorbeeld een minuut is kun je zeker zijn dat je de fix echt verloren hebt. De tweede methode is een NmeaListener die raw-regels teruggeeft over de GPS positie en satellieten.

    Hieronder een form-unit die beide methodes doet:
    Je ziet een dummy TLocationListener die eigenlijk niets doet maar volgens mij is die nodig om de GPS aan te slingeren en om gegevens daarvan terug te krijgen. Alleen een NmeaListener aan de FLocationManager hangen werkte bij mij niet.

    Daarna hangen we de NmeaListener aan de FLocationManager om de raw-regels van de GPS te krijgen.

    In de timer halen we een getLastKnownLocation van de FLocationManager op om alleen puur het tijdstip van de laatste fix op te halen. Als je dus helemaal niets met de satallieten wilt doen dan kun je de hele NmeaListener eruit slopen.

    Ik kreeg helaas bij de laatste keer testen alleen een GPRMC-message binnen. Je zou eigenlijk ook andere GPGSV-messages moeten krijgen waar de satellieten zelf in staan. Dat had ik met een ander test-programma wel voor elkaar maar hier lukte dat niet. Als je de satellieten zelf wilt hebben dan kan ik daar nog wel even naar kijken. Ik heb ook code om die GPGSV te parsen naar echte satelliet-data.

    Delphi Code:
    1. unit Unit5;
    2.  
    3. interface
    4.  
    5. uses
    6.   System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
    7.   FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
    8.   FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo;
    9.  
    10. type
    11.   TForm5 = class(TForm)
    12.     Panel1: TPanel;
    13.     Button1: TButton;
    14.     Memo1: TMemo;
    15.     Timer1: TTimer;
    16.     procedure Button1Click(Sender: TObject);
    17.     procedure Timer1Timer(Sender: TObject);
    18.   private
    19.     { Private declarations }
    20.   public
    21.     { Public declarations }
    22.   end;
    23.  
    24. var
    25.   Form5: TForm5;
    26.  
    27. implementation
    28.  
    29. {$R *.fmx}
    30.  
    31. uses
    32.   StrUtils,
    33.   Androidapi.JNI.JavaTypes,
    34.   Androidapi.JNIBridge,
    35.   Androidapi.Helpers,
    36.   Androidapi.JNI.GraphicsContentViewText,
    37.   FMX.Helpers.Android,
    38.   Androidapi.JNI.Os,
    39.   Androidapi.JNI.Location;
    40.  
    41. type
    42.   TLocationListener = class(TJavaLocal, JLocationListener)
    43.   public
    44.     procedure onLocationChanged(Location: JLocation); cdecl;
    45.     procedure onProviderDisabled(Provider: JString); cdecl;
    46.     procedure onProviderEnabled(Provider: JString); cdecl;
    47.     procedure onStatusChanged(Provider: JString; status: Integer; extras: JBundle); cdecl;
    48.   end;
    49.  
    50.   TNmeaListener = class(TJavaLocal, JGpsStatus_NmeaListener)
    51.   public
    52.     procedure onNmeaReceived(timestamp: Int64; nmea: JString); cdecl;
    53.   end;
    54.  
    55. var
    56.   FLocationManager: JLocationManager;
    57.   LocationListener: JLocationListener;
    58.   NmeaListener: JGpsStatus_NmeaListener;
    59.   SharedString: String = '';
    60.  
    61. procedure TForm5.Button1Click(Sender: TObject);
    62. var
    63.   LocationManagerService: JObject;
    64.   Location: JLocation;
    65. begin
    66.   Memo1.Lines.Clear;
    67.   LocationManagerService := SharedActivityContext.getSystemService(TJContext.JavaClass.LOCATION_SERVICE);
    68.   FLocationManager := TJLocationManager.Wrap((LocationManagerService as ILocalObject).GetObjectID);
    69.   LocationListener := TLocationListener.Create;
    70.   NmeaListener := TNmeaListener.Create;
    71.  
    72.   FLocationManager.requestLocationUpdates(TJLocationManager.JavaClass.GPS_PROVIDER, 1000, 1, LocationListener, TJLooper.JavaClass.getMainLooper);
    73.  
    74.   try
    75.  
    76.     CallInUIThreadAndWaitFinishing(
    77.       procedure
    78.       begin
    79.         FLocationManager.addNmeaListener(NmeaListener);
    80.       end);
    81.  
    82.   except
    83.     // message : "java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()"
    84.     on E: Exception do
    85.       Memo1.Lines.Add(E.Message);
    86.   end;
    87.  
    88.   Location := FLocationManager.getLastKnownLocation(TJLocationManager.JavaClass.GPS_PROVIDER);
    89.  
    90. end;
    91.  
    92. procedure TLocationListener.onLocationChanged(Location: JLocation); cdecl;
    93. begin
    94. end;
    95.  
    96. procedure TLocationListener.onProviderDisabled(Provider: JString); cdecl;
    97. begin
    98. end;
    99.  
    100. procedure TLocationListener.onProviderEnabled(Provider: JString); cdecl;
    101. begin
    102. end;
    103.  
    104. procedure TLocationListener.onStatusChanged(Provider: JString; status: Integer; extras: JBundle); cdecl;
    105. begin
    106. end;
    107.  
    108. procedure TNmeaListener.onNmeaReceived(timestamp: Int64; nmea: JString); cdecl;
    109. begin
    110.   SharedString := JStringToString(nmea);
    111. end;
    112.  
    113. procedure TForm5.Timer1Timer(Sender: TObject);
    114. var
    115.   Location: JLocation;
    116.   lastFixTimeMillis: Int64;
    117. begin
    118.   if SharedString <> '' then
    119.   begin
    120.     Memo1.Lines.Add(SharedString);
    121.     Memo1.GoToTextEnd;
    122.     SharedString := '';
    123.   end;
    124.  
    125.   if Assigned(FLocationManager) then
    126.   begin
    127.     Location := FLocationManager.getLastKnownLocation(TJLocationManager.JavaClass.GPS_PROVIDER);
    128.     lastFixTimeMillis := Location.getTime();
    129.     Memo1.Lines.Add('Last fix: ' + DateTimeToStr(lastFixTimeMillis / 86400000.0 + 25569.0));
    130.     Memo1.GoToTextEnd;
    131.   end;
    132.  
    133. end;
    134.  
    135. end.

    Click image for larger version. 

Name:	2016-11-06 20.33.34.jpg 
Views:	95 
Size:	107.4 KB 
ID:	7415

  13. #58
    Quote Originally Posted by rvk View Post
    Wel... Ik krijg de JGpsStatus.getSatellites (iterator) niet aan de gang.
    Eindelijk heb ik de JGpsStatus.getSatellites ook aan de gang gekregen (ondanks het feit dat die deprecated is en in toekomstige versies zal verwijnen).

    Ik weet niet of je dus ook echt de locatie van de satellieten nodig hebt (en welke in de fix gebruikt worden) of dat de lastFix-tijdstip voldoende is.

    Die lastFix tijdstip geeft natuurlijk wel aan dat als je de resolutie op 1000 ms zet (voor requestupdates) zoals in het voorbeeld, je elke 1000ms ook een nieuwe fix moet hebben. Mocht je dus een paar seconden geen fix krijgen dan weet je al dat er wat aan de hand is.

    Hier nogmaals de code met de JGpsStatus.getSatellites.
    (Ik heb gewerkt met globale variabele omdat ik niet wilde knoeien met GUIThreads e.d. Niet zo mooi maar het werkt wel)

    Die hele NmeaListener kun je er dan uit slopen want die is niet meer nodig als je via JGpsStatus bij de satellieten kunt.

    Delphi Code:
    1. unit Unit5;
    2.  
    3. interface
    4.  
    5. uses
    6.   System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
    7.   FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
    8.   FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo;
    9.  
    10. type
    11.   TForm5 = class(TForm)
    12.     Panel1: TPanel;
    13.     Button1: TButton;
    14.     Memo1: TMemo;
    15.     Timer1: TTimer;
    16.     procedure Button1Click(Sender: TObject);
    17.     procedure Timer1Timer(Sender: TObject);
    18.   private
    19.     { Private declarations }
    20.   public
    21.     { Public declarations }
    22.   end;
    23.  
    24. var
    25.   Form5: TForm5;
    26.  
    27. implementation
    28.  
    29. {$R *.fmx}
    30.  
    31.  
    32. uses
    33.   StrUtils,
    34.   Androidapi.JNI.JavaTypes,
    35.   Androidapi.JNIBridge,
    36.   Androidapi.Helpers,
    37.   Androidapi.JNI.GraphicsContentViewText,
    38.   FMX.Helpers.Android,
    39.   Androidapi.JNI.Os,
    40.   Androidapi.JNI.App,
    41.   Androidapi.JNI.Location;
    42.  
    43. type
    44.   TLocationListener = class(TJavaLocal, JLocationListener)
    45.   public
    46.     procedure onLocationChanged(Location: JLocation); cdecl;
    47.     procedure onProviderDisabled(Provider: JString); cdecl;
    48.     procedure onProviderEnabled(Provider: JString); cdecl;
    49.     procedure onStatusChanged(Provider: JString; status: Integer; extras: JBundle); cdecl;
    50.   end;
    51.  
    52.   TGpsListener = class(TJavaLocal, JGpsStatus_Listener)
    53.   public
    54.     procedure onGpsStatusChanged(event: Integer); cdecl;
    55.   end;
    56.  
    57.   TNmeaListener = class(TJavaLocal, JGpsStatus_NmeaListener)
    58.   public
    59.     procedure onNmeaReceived(timestamp: Int64; nmea: JString); cdecl;
    60.   end;
    61.  
    62. var
    63.   FLocationManager: JLocationManager;
    64.   LocationListener: JLocationListener;
    65.   NmeaListener: JGpsStatus_NmeaListener;
    66.   GpsListener: JGpsStatus_Listener;
    67.   SharedString: String = '';
    68.   cnt1, cnt2: Integer;
    69.  
    70. procedure TForm5.Button1Click(Sender: TObject);
    71. var
    72.   LocationManagerService: JObject;
    73.   Location: JLocation;
    74.   LPendingIntent: JPendingIntent;
    75. begin
    76.   Memo1.Lines.Clear;
    77.   LocationManagerService := SharedActivityContext.getSystemService(TJContext.JavaClass.LOCATION_SERVICE);
    78.   FLocationManager := TJLocationManager.Wrap((LocationManagerService as ILocalObject).GetObjectID);
    79.   LocationListener := TLocationListener.Create;
    80.   GpsListener := TGpsListener.Create;
    81.   NmeaListener := TNmeaListener.Create;
    82.  
    83.   // LPendingIntent := TJPendingIntent.JavaClass.init(SharedActivityContext.getPackageName(), StringToJString(Application.Name));
    84.   // FLocationManager.requestLocationUpdates(TJLocationManager.JavaClass.GPS_PROVIDER, 1000, 1, LPendingIntent);
    85.   FLocationManager.requestLocationUpdates(TJLocationManager.JavaClass.GPS_PROVIDER, 1000, 1, LocationListener, TJLooper.JavaClass.getMainLooper);
    86.  
    87.   try
    88.       CallInUIThreadAndWaitFinishing(
    89.       procedure
    90.       begin
    91.         FLocationManager.addGpsStatusListener(GpsListener);
    92.         FLocationManager.addNmeaListener(NmeaListener);
    93.       end);
    94.  
    95.   except
    96.     // message : "java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()"
    97.     on E: Exception do
    98.         Memo1.Lines.Add(E.Message);
    99.   end;
    100.  
    101.   Location := FLocationManager.getLastKnownLocation(TJLocationManager.JavaClass.GPS_PROVIDER);
    102.  
    103. end;
    104.  
    105. procedure TLocationListener.onLocationChanged(Location: JLocation); cdecl;
    106. begin
    107. end;
    108.  
    109. procedure TLocationListener.onProviderDisabled(Provider: JString); cdecl;
    110. begin
    111. end;
    112.  
    113. procedure TLocationListener.onProviderEnabled(Provider: JString); cdecl;
    114. begin
    115. end;
    116.  
    117. procedure TLocationListener.onStatusChanged(Provider: JString; status: Integer; extras: JBundle); cdecl;
    118. begin
    119. end;
    120.  
    121. procedure TGpsListener.onGpsStatusChanged(event: Integer); cdecl;
    122. var
    123.   _GpsStatus: JGpsStatus;
    124.   iter: JIterator;
    125.   sat: JGpsSatellite;
    126. begin
    127.   if event = 4 then
    128.   begin
    129.     _GpsStatus := FLocationManager.getGpsStatus(nil);
    130.     cnt1 := 0;
    131.     cnt2 := 0;
    132.     iter := _GpsStatus.getSatellites.iterator;
    133.     while iter.hasNext do
    134.     begin
    135.       inc(cnt1);
    136.       sat := TJGpsSatellite.Wrap((iter.next as ILocalObject).GetObjectID);
    137.       if (sat.usedInFix()) then Inc(cnt2);
    138.     end;
    139.   end;
    140.   // [url]http://stackoverflow.com/questions/9924747/how-many-satellite-are-used-in-my-every-time-gps-fix[/url]
    141. end;
    142.  
    143. procedure TNmeaListener.onNmeaReceived(timestamp: Int64; nmea: JString); cdecl;
    144. begin
    145.   SharedString := JStringToString(nmea);
    146. end;
    147.  
    148. procedure TForm5.Timer1Timer(Sender: TObject);
    149. var
    150.   Location: JLocation;
    151.   lastFixTimeMillis: Int64;
    152.   numsat: String;
    153.   LIntent: JIntent;
    154.   LExtras: JBundle;
    155.   I: Integer;
    156. begin
    157.   if SharedString <> '' then
    158.   begin
    159.     Memo1.Lines.Add(SharedString);
    160.     Memo1.GoToTextEnd;
    161.     SharedString := '';
    162.   end;
    163.   if Assigned(FLocationManager) then
    164.   begin
    165.     Location := FLocationManager.getLastKnownLocation(TJLocationManager.JavaClass.GPS_PROVIDER);
    166.     lastFixTimeMillis := Location.getTime();
    167.     numsat := '';
    168.     LExtras := Location.getExtras();
    169.     if LExtras <> nil then
    170.     begin
    171.       numsat := format(' %d sats', [LExtras.getInt(StringToJString('satellites'))]);
    172.     end;
    173.     numsat := numsat + format(' (%d of %d)', [cnt2, cnt1]);
    174.     Memo1.Lines.Add('Last fix: ' + DateTimeToStr(lastFixTimeMillis / 86400000.0 + 25569.0) + numsat);
    175.     Memo1.GoToTextEnd;
    176.   end;
    177.  
    178. end;
    179.  
    180. end.

    Click image for larger version. 

Name:	2016-11-07 14.33.52.jpg 
Views:	91 
Size:	102.1 KB 
ID:	7416

  14. #59
    Met al die code raak ik het spoor een beetje kwijt...

    Ik heb alleen (tja makkelijk gezegd) een bitje nodig dat hoog of laag wordt als er geen betrouwbaar GPS ontvangst is.
    En deze code mag voor mij zo klein (en eenvoudig) mogelijk zijn en moet later als ik ooit overstap op een nieuwere versie ook nog werken.
    Je heb inmiddels al van alles geprobeerd en getest (daarvoor dank), welke manier lijkt je daarvoor het beste ?


    Voor de route wordt een .itn bestand gebruikt, maar ik heb nu in de App ook een database(je) opgenomen waarin adressen staan waarvan ik "iets" wil onthouden.
    Er zijn adressen bij waar ik soms lange tijd niet kom. Als ik op zo'n adres kom (er wordt daarbij naar de postcode gekeken), dan krijg ik de straat met huis nummer, en de opmerking te zien (zie links boven het compas).
    Tevens moet ik nog wel eens op een andere plaats zijn dan bij de voordeur en heb ik nu ook de mogelijkheid om een GPS positie er in te zetten, en deze kan ik dan meteen als navigatie positie gebruiken door op de toets "GPS->NAV" te drukken (deze toets is alleen acties als er een GPS positie aanwezig is in de database).
    Dit heb ik vandaag getest, en dit werkt goed.

    Click image for larger version. 

Name:	Ver1.1.jpg 
Views:	93 
Size:	64.8 KB 
ID:	7417

    Wat zou het geweldig zijn als er ooit nog een wegenkaart erbij geplaatst kan worden....
    Last edited by MMSoft; 07-Nov-16 at 20:02.

  15. #60
    Ik zal, wanneer ik even tijd heb, kijken of ik dit in een wat simpelere library te zetten zodat het met een paar regels gebruikt kan worden.

    Wat betreft je plattegrond. Er zijn wel wat mogelijkheden maar de map-data gedetailleerd opslaan voor heel Nederland kan behoorlijk veel ruimte in beslag nemen. Tevens is het tekenen daarvan geen simpele opgave. Als je internet toegang hebt tijdens het rijden dan zou het makkelijker zijn om een google-map of openstreet-map binnen te halen.

    Je zou op diezelfde manier ook een versimpelde route(-planner) weer kunnen geven.

Page 4 of 8 FirstFirst ... 2 3 4 5 6 ... LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •