Welkom  

   

Mijn Menu  

   

What's Up  

za mei 18 @12:00AM
ZF Pinkstertrip 2024
   

Wedstrijd  

Geen evenementen
   
   
   
   
   
   
   
   
   
   
   
   
   
   
Welkom, Gasten
De mogelijkheden om zelf te knutselen/ontwikkelen met de nieuwste generatie mini-PC's is eindeloos. Omdat er diverse fraaie initiatieven lopen die best wat eigen plek behoeven, bundelen we onze kennis in deze categorie.

Onderwerp: Gezocht C-code voor het decoderen van AIS NMEA

Gezocht C-code voor het decoderen van AIS NMEA 21 juli 2018 06:11 #961650

  • 3Noreen
  • 3Noreen's Profielfoto
  • Offline
  • Gebruiker
  • Berichten: 13411
Mijn Oude Raymarine C-120 Plotter krijgt het steeds moeilijker met de grote hoeveelheid AIS targets. Met een Raspbarry of Arduino wil ik experimenteren met een software filter om het aantal targets te beperken tot een beperkte afstand van de eigen positie.
Daarvoor moet de software eerst de gecodeerde berichten omzetten in 6 bits waardes en vervolgens de data daaruit halen. Voordat ik veel tijd ga besteden zelf de code te proberen te schrijven zou het leuk zijn als ergens op het net al dergelijke code beschikbaar is. Heeft iemand een idee ?
You will have to take my last can of fossil fuel from my cold, dead hands ;-)
Alleen ingelogde leden kunnen reageren.

Gezocht C-code voor het decoderen van AIS NMEA 21 juli 2018 06:22 #961651

  • PieterV
  • PieterV's Profielfoto
  • Offline
  • Gebruiker
  • Berichten: 159
Die van dAISy staat online: github.com/astuder/dAISy?files=1

Had je die al bekeken?
Alleen ingelogde leden kunnen reageren.

Gezocht C-code voor het decoderen van AIS NMEA 21 juli 2018 07:23 #961662

  • H2O
  • H2O's Profielfoto
  • Offline
  • Gebruiker
  • Berichten: 1299
Leuk klusje!

Op deze pagina wordt de structuur van AIS / AIVDM / AIVDO berichten heel duidelijk uitgelegd. Er staan ook een paar links naar Open Source code in dit document.
http://catb.org/gpsd/AIVDM.html

Open Source Python script:
https://github.com/schwehr/noaadata/blob/master/contrib/ais.py

Ik vermoed dat je het met een standaard Arduino (Uno) niet gaat redden vanwege de beperkte hoeveelheid seriele poorten. Twee keer een Software Serial op 38k4 plus nog een pittig stukje processing en filtering tussendoor gaat hem niet worden.

Jeroen.
Laatst bewerkt: 21 juli 2018 07:32 door H2O.
Alleen ingelogde leden kunnen reageren.

Gezocht C-code voor het decoderen van AIS NMEA 21 juli 2018 07:43 #961665

  • rooiedirk
  • rooiedirk's Profielfoto
  • Offline
  • Gebruiker
  • Berichten: 6434
Je wil de !AIVDM nmea berichten filteren. kijk eens in de OpenCPN broncode, daar zit ook al een stukje code in om te bepalen welke targets belangrijk zijn en welke niet. (Op basis van CPA, TCPA, Range, SOG en scheeps grootte)

Je wilt je oude plotter houden? Of kan je ook aan zoiets denken? Openplotter in an Oldplotter!
Laatst bewerkt: 21 juli 2018 07:46 door rooiedirk.
Alleen ingelogde leden kunnen reageren.

Gezocht C-code voor het decoderen van AIS NMEA 21 juli 2018 07:52 #961666

nou vooruit, bij deze de decodering voor ais zoals ik die zelf ontworpen heb voor de multiview:
Het ware bitneuken.
Op de multiview kan je ook instellen wat het maximum ais bereik moet zijn.
/return distance between two points in thents of nmile
int calc_distance( double my_lat, double my_lon, double dest_lat, double dest_lon)
{

	dest_lat = dest_lat / 10000000;
	dest_lon = dest_lon / 10000000;


	double dlon = deg2rad(dest_lon-my_lon);
	double dlat = deg2rad(dest_lat-my_lat);
	my_lat      = deg2rad(my_lat);
	dest_lat    = deg2rad(dest_lat);

	double a,d;
	a = sin(dlat/2) * sin(dlat/2) + sin(dlon/2) * sin(dlon/2)*  cos(my_lat) * cos(dest_lat) ;
	d = 12745.6 * asin(sqrt(a));
	d/= 0.1853;
	return (int)d;
}

unsigned char decode_char(unsigned char c)
{
	unsigned char value = c - '0';
	if (value > 40)
		value -= 8;
	return value & 0x3f;
}


// !AIVDM,1,1,,B,177KQJ5000G?tO`K>RA1wUbN0TKH,0*5C
void decode_ais(int messptr)
{
	unsigned char comma=0,ctr,ctr1;

	unsigned long x;
	char buf[200];
	double lat,lon;
	for(ctr=0;ctr<100;ctr++)
		{
		if (AIS.rxbuf[messptr]== ',')
			comma++;
		messptr++;	
		if(comma == 5)	
			break;	
		}
	if(comma != 5)
		{
		usb_tx_mes(" NF ");	
		return; // not found	
		}			
	
	for(ctr=0;ctr<100;ctr++)
		{
		if (AIS.rxbuf[messptr] != ',')	
			buf[ctr]=decode_char(AIS.rxbuf[messptr++]);		
		else
		    break;	
		}
						 	
   
   if((buf[0] == 1)|(buf[0] == 2)|(buf[0] == 3))
   {
	AIS_Boats.ais_rx_mess_type=1;   
     
    x  =  buf[1]&0xF;
    x<<=6;
    x |= buf[2];
    x<<=6;
    x |= buf[3];
    x<<=6;
    x |= buf[4];
    x<<=6;
    x |= buf[5];
    x<<=2;
    x |= (buf[6]>>4) & 0x3;//first 2
    AIS_Boats.ais_rx_mmsi=x;
	   
    x= buf[6] & 0xF;//last 4   
	x = buf[7];  //first 6
    x<<= 2;
    x|= (buf[8]>>4) & 0x3;  //first 2
 	
	x = buf[8] &0xf ;//last 4
	x<<= 6;
	x|= buf[9]; 
    AIS_Boats.ais_rx_sog=x;
    
	x =  (buf[10]>>5) & 1; //6nd bit
    
    x = buf[10] & 0x1f;  //last bit  28
    x<<=6;
    x |= buf[11];
    x<<=6;
    x |= buf[12];
    x<<=6;
    x |= buf[13];
    x<<=5;
    x |= buf[14]>>1;//first 5
    lon=x;    
    lon/=0.06;
     AIS_Boats.ais_rx_lon=lon;
	x = buf[14] & 1 ; //  27
	x<<=6;
    x |= buf[15] ; //  27
    x<<=6;
    x |= buf[16];
    x<<=6;
    x |= buf[17];
    x<<=6;
    x |= buf[18];
    x<<=2;
    x |= buf[19]>>4;  //first 2
    lat=x;

    lat/=0.06;
    AIS_Boats.ais_rx_lat=lat;
  
	  
    x= buf[19]& 0xF ;  //cog 12 bits  last 4
    x<<=6;
    x |= buf[20];
	x<<=2;
	x |= buf[21]>>4;  //first 2

	AIS_Boats.ais_rx_cog=x;

	if(( AIS_Boats.mypos[0] != 0) && (lat<= 900000000))
		{
		
		AIS_Boats.ais_rx_distance = calc_distance( AIS_Boats.mypos[0], AIS_Boats.mypos[1], lat,lon);
		if (AIS_Boats.ais_rx_distance < mem.set_ais_max)
			{	
			add_ais_table_pos();
			}
		else	
		  remove_ais_table_pos();			
		}
	else 
	if(lat> 900000000)			
		remove_ais_table_pos();
		
   }
 else
 if(buf[0] ==5)
 {
	 AIS_Boats.ais_rx_mess_type=5;	
	 x  =  buf[1]&0xF;
	 x<<=6;
	 x |= buf[2];
	 x<<=6;
	 x |= buf[3];
	 x<<=6;
	 x |= buf[4];
	 x<<=6;
	 x |= buf[5];
	 x<<=2;
	 x |= (buf[6]>>4) & 0x3;//first 2
	 AIS_Boats.ais_rx_mmsi=x;
	 
	 ctr1=11;
	 for(ctr=0;ctr<7;ctr++)
	 {
		 x = buf[ctr1++]&3;
		 x<<=4;
		 x|= buf[ctr1]>>2;
		 
		 x = ais_string[x];
		 if (x== '@')
		 {
			 AIS_Boats.ais_rx_callsign[ctr]=0;
			 break;
		 }
		 AIS_Boats.ais_rx_callsign[ctr]=x;   //@ is eind

	 }
	 for(ctr=0;ctr<20;ctr++)
	 {
		 x = buf[ctr1++]&3;
		 x<<=4;
		 x|= buf[ctr1]>>2;
		 
		 x = ais_string[x];
		 if (x== '@')
		 x= 0x20;
		 AIS_Boats.ais_rx_name[ctr]=x;
		 
	 }
	 AIS_Boats.ais_rx_name[20]=0;
	 x = buf[ctr1++]&3; //last 2
	 x<<=6;
	 x|= buf[ctr1++];
	 AIS_Boats.ais_rx_ship_type=x;   //shiptype 8 bits
	 add_ais_table_name_callsign();
	}

  else
  if(buf[0] ==24)
	{
	 AIS_Boats.ais_rx_mess_type=24;	
	  x  =  buf[1]&0xF;
	  x<<=6;
	  x |= buf[2];
	  x<<=6;
	  x |= buf[3];
	  x<<=6;
	  x |= buf[4];
	  x<<=6;
	  x |= buf[5];
	  x<<=2;
	  x |= (buf[6]>>4) & 0x3;//first 2
	  AIS_Boats.ais_rx_mmsi=x;
	   
	  if (((buf[6]>>2)&3) == 0)  //partA
	  {		
		  ctr1=6;
		  for(ctr=0;ctr<20;ctr++)
		  {
			  x = buf[ctr1++]&3;
			  x<<=4;
			  x|= buf[ctr1]>>2;
			  
			  x = ais_string[x];
			  if (x== '@')
			  x= 0x20;
			  AIS_Boats.ais_rx_name[ctr]=x;			
		  }
		  AIS_Boats.ais_rx_name[20]=0;
		  x = buf[ctr1++]&3; //last 2
		  x<<=6;
		  x|= buf[ctr1++];
		  AIS_Boats.ais_rx_ship_type=x;   //shiptype 8 bits
		  add_ais_table_name();
	  }
	else
	   if (((buf[6]>>2)&3) == 1)  //partB  2 left after partnumber  50 bits overslaan voor call sign. -2 = 48 = 8 bytes
		   {
		   AIS_Boats.ais_rx_callsign[0]='-';
		   AIS_Boats.ais_rx_callsign[1]=0;
		   ctr1=15;
		   for(ctr=0;ctr<7;ctr++)
				{			  
				x = buf[ctr1++]&0x3F;
				x = ais_string[x];
				if (x== '@')
					{
					AIS_Boats.ais_rx_callsign[ctr]=0;
						 break;
					}
				AIS_Boats.ais_rx_callsign[ctr]=x;   //@ is eind

				}
			add_ais_table_callsign(); 
		 
		   }
	}
 
	
   else
    
   if(buf[0] == 18)
   {	     
	AIS_Boats.ais_rx_mess_type=18;   

	x  =  buf[1]&0xF;
	x<<=6;
	x |= buf[2];
	x<<=6;
	x |= buf[3];
	x<<=6;
	x |= buf[4];
	x<<=6;
	x |= buf[5];
	x<<=2;
	x |= (buf[6]>>4) & 0x3; //30 bits mmsi
	AIS_Boats.ais_rx_mmsi=x;
	
	x= buf[6];   //4
	x <<=4;
	x |= (buf[7] >>2) & 0xf;//4
	
	x = buf[7] &0x3;
	x<<= 6;
	x|= buf[8];
	x<<=2 ;
	x|= (buf[9]>>4) & 0x3;//first 2
    AIS_Boats.ais_rx_sog= x;
	  
 
	x = buf[9] & 7;  //last 3   28
	x<<=6;
	x |= buf[10];
	x<<=6;
	x |= buf[11];
	x<<=6;
	x |= buf[12];
	x<<=6;
	x |= buf[13]; 
	x<<=1;
	x |= ((buf[14]>>5) & 1) ;//first 1
	lon=x;	
	lon/=0.060;	 
	AIS_Boats.ais_rx_lon=lon;
    x = buf[14] & 0x1F;//last 5  27
	x<<=6;
	x |= buf[15];
	x<<=6;
	x |= buf[16];
	x<<=6;
	x |= buf[17];
	x<<=4;
	x |= buf[18]>>2;  //first 4
	lat=x;	
	lat/=0.06;
	AIS_Boats.ais_rx_lat=lat;

	x= buf[18] & 0x3;  //cog 12 bits
	x<<=6;
	x |= buf[19];
	x<<=4; 
	x |= (buf[20]>>2);  //first 4
	AIS_Boats.ais_rx_cog=x;
 
 	if(( AIS_Boats.mypos[0] != 0) && (lat<= 900000000))
 		{
		
	 	AIS_Boats.ais_rx_distance = calc_distance( AIS_Boats.mypos[0], AIS_Boats.mypos[1], lat,lon);
	 	if (AIS_Boats.ais_rx_distance < mem.set_ais_max)
	 		{		
		 	add_ais_table_pos();
	 		}
	 	else
			{
	 		remove_ais_table_pos();					
			}
 		}
 	else
		if(lat> 900000000)
			remove_ais_table_pos();


   }
	
}
Ontwerper van de RoosMux, en andere apparaatjes.
www.viax.nl

It's been said that a boat is a vessel continually looking for ways to sink itself..
Alleen ingelogde leden kunnen reageren.

Gezocht C-code voor het decoderen van AIS NMEA 21 juli 2018 08:40 #961674

  • 3Noreen
  • 3Noreen's Profielfoto
  • Offline
  • Gebruiker
  • Berichten: 13411
roozeboos schreef :
nou vooruit, bij deze de decodering voor ais zoals ik die zelf ontworpen heb voor de multiview:
Het ware bitneuken.
Op de multiview kan je ook instellen wat het maximum ais bereik moet zijn.

Thanks :)

Jij doet het duidelijk "the hard way" Kwam dit nog tegen. Door middel van een lookup table zou sneller kunnen zijn ?
You will have to take my last can of fossil fuel from my cold, dead hands ;-)
Alleen ingelogde leden kunnen reageren.

Gezocht C-code voor het decoderen van AIS NMEA 21 juli 2018 08:58 #961677

hmm, zo te zien wordt daar ook nog steeds geschoven met bitjes. Maar het zal vast sneller zijn als hij dat beweert. Ik kan dat niet zo snel analyseren.

Mijn controller draait nu op 75MHz, en is snel zat. En t wordt ook nog op het lcd weergegeven.
Dus is een raspberry zeker snel genoeg. Die arduino heeft een gewone atmega toch? Dat gaat t m zeker niet worden.

Meeste tijd in het ontwikkelen van deze software is het debuggen, en het precies op de juiste plek krijgen van de bitjes.
Het is op deze manier wel overzichtelijk. Maar even goed was het veel inlezen, programmeren, debuggen en vooral doorzetten.
Alles moet kloppen...
Ontwerper van de RoosMux, en andere apparaatjes.
www.viax.nl

It's been said that a boat is a vessel continually looking for ways to sink itself..
Alleen ingelogde leden kunnen reageren.

Gezocht C-code voor het decoderen van AIS NMEA 22 juli 2018 00:22 #961774

  • WaltB
  • WaltB's Profielfoto
  • Offline
  • Gebruiker
  • Berichten: 1699
Net stukje coding Roozeboos, maar daarmee ben je er natuurlijk nog niet.
Mee eens dat een arduino dat niet gaat trekken. Ik doe het wel met een Atmega @ 16Mhz (decoding en encoding VDM), maar het aantal AIS targets is in deze wateren beperkt.
Ik heb bovendien alles in assembler geprogrammeerd voor efficiency (tijd en ruimte), dus het bijna uitgestorven ambacht. Eigenlijk een eigen macro taaltje voor MCUs dat ik in de loop der jaren heb ontwikkeld. Voor mij is de lol vooral om dit sort dingen in zo weinig mogelijk memory te doen en zo snel mogelijk te maken. Nostalgie van de eerste orde voor iemand die in 1970 scientific programmas schreef in Fortran en Assembler op een IBM 1130 met 16K geheugen. Voor elke poep een overlay. De conversie van/naar 6-bit bytes is nog het kleinste problem. Alle numerieke data in VDM, inclusief MMSI is als grote integers encrypted, niet erg risc-vriendelijk.
The miracle is not to fly in the air, or to walk on the water, but to walk on the earth.
Laatst bewerkt: 22 juli 2018 00:36 door WaltB.
Alleen ingelogde leden kunnen reageren.

Gezocht C-code voor het decoderen van AIS NMEA 22 juli 2018 06:50 #961783

  • rooiedirk
  • rooiedirk's Profielfoto
  • Offline
  • Gebruiker
  • Berichten: 6434
Het omzetten is stap één, maar dan bepalen welke je doorlaat gaan is twee. Simpel alleen op afstand scheiden is niet erg efficient (wel simpel programeren). Maar bv iets van
if afstand < 0.3 mijl then
   door laten gaan
else if tcpa > 0 && cpa < 1 mijl
   door laten gaan
else
   weggooien
Zo 'verdwijnt' een target dat bij je wegvaart snel, terwijl een schip dat naar je toekomt wel gelijk in beeld komt. Dus Véél minder targets, maar de interressante blijven. Nadeeltje is wel dat je voor ieder target dat binnenkomt tcpa en cpa moet berekenen.
Laatst bewerkt: 22 juli 2018 06:51 door rooiedirk.
Alleen ingelogde leden kunnen reageren.

Gezocht C-code voor het decoderen van AIS NMEA 22 juli 2018 06:59 #961785

  • 3Noreen
  • 3Noreen's Profielfoto
  • Offline
  • Gebruiker
  • Berichten: 13411
rooiedirk schreef :
Het omzetten is stap één, maar dan bepalen welke je doorlaat gaan is twee. Simpel alleen op afstand scheiden is niet erg efficient (wel simpel programeren). Maar bv iets van
if afstand < 0.3 mijl then
   door laten gaan
else if tcpa > 0 && cpa < 1 mijl
   door laten gaan
else
   weggooien
Zo 'verdwijnt' een target dat bij je wegvaart snel, terwijl een schip dat naar je toekomt wel gelijk in beeld komt. Dus Véél minder targets, maar de interressante blijven. Nadeeltje is wel dat je voor ieder target dat binnenkomt tcpa en cpa moet berekenen.

Dat lijkt mij voor het kaartbeeld minder overzichtelijk. Ik wil wel alle schepen binnen zichtafstand van de horizon (±5mijl) ook, voor ze AIS hebben, wel op het scherm zien. Verder is mijn ervaring dat de cpa in praktijk kan flippen tussen wel of niet onder de marge zijn. Zo koers stabiel vaart mijn bootje niet.
You will have to take my last can of fossil fuel from my cold, dead hands ;-)
Laatst bewerkt: 22 juli 2018 06:59 door 3Noreen.
Alleen ingelogde leden kunnen reageren.

Gezocht C-code voor het decoderen van AIS NMEA 22 juli 2018 07:15 #961788

  • rooiedirk
  • rooiedirk's Profielfoto
  • Offline
  • Gebruiker
  • Berichten: 6434
Getalletjes kan je aanpassen natuurlijk, en als je een nmea bericht blokeert verdwijnt het nog niet direkt van je plotter scherm. En als verfijning zou je de cpa afstand kunnen varieren met de afstand.

Op zee zou ik persoonlijk dat vrachtschip dat op aanvarings koers ligt wél direkt willen zien, en niet pas op 5 mijl.
Voor OpenCPN heb ik het iets anders gedaan, daar gaan alle targets in een lijst, en ieder target krijgt 'punten' voor range, cpa, tcpa, grootte, en sog. En alleen de x targets met de hoogste score mogen door. In de praktijk werkt dat erg goed.
Alleen ingelogde leden kunnen reageren.

Gezocht C-code voor het decoderen van AIS NMEA 22 juli 2018 08:22 #961809

37south schreef :
Net stukje coding Roozeboos, maar daarmee ben je er natuurlijk nog niet.
Mee eens dat een arduino dat niet gaat trekken. Ik doe het wel met een Atmega @ 16Mhz (decoding en encoding VDM), maar het aantal AIS targets is in deze wateren beperkt.
Ik heb bovendien alles in assembler geprogrammeerd voor efficiency (tijd en ruimte), dus het bijna uitgestorven ambacht. Eigenlijk een eigen macro taaltje voor MCUs dat ik in de loop der jaren heb ontwikkeld. Voor mij is de lol vooral om dit sort dingen in zo weinig mogelijk memory te doen en zo snel mogelijk te maken. Nostalgie van de eerste orde voor iemand die in 1970 scientific programmas schreef in Fortran en Assembler op een IBM 1130 met 16K geheugen. Voor elke poep een overlay. De conversie van/naar 6-bit bytes is nog het kleinste problem. Alle numerieke data in VDM, inclusief MMSI is als grote integers encrypted, niet erg risc-vriendelijk.
Ik zei al dat een arduino het niet trekt. Ook niet in assembly. Overigens ben ik deze dagen ook bezig met assembler bezig, voor een vijftal processoren die in een fpga draaien. Dus zo uitgestorven is het helemaal niet hoor!
Ontwerper van de RoosMux, en andere apparaatjes.
www.viax.nl

It's been said that a boat is a vessel continually looking for ways to sink itself..
Alleen ingelogde leden kunnen reageren.

Gezocht C-code voor het decoderen van AIS NMEA 22 juli 2018 09:45 #961825

  • WaltB
  • WaltB's Profielfoto
  • Offline
  • Gebruiker
  • Berichten: 1699
3Noreen schreef :
rooiedirk schreef :
Het omzetten is stap één, maar dan bepalen welke je doorlaat gaan is twee. Simpel alleen op afstand scheiden is niet erg efficient (wel simpel programeren). Maar bv iets van
if afstand < 0.3 mijl then
   door laten gaan
else if tcpa > 0 && cpa < 1 mijl
   door laten gaan
else
   weggooien
Zo 'verdwijnt' een target dat bij je wegvaart snel, terwijl een schip dat naar je toekomt wel gelijk in beeld komt. Dus Véél minder targets, maar de interressante blijven. Nadeeltje is wel dat je voor ieder target dat binnenkomt tcpa en cpa moet berekenen.

Dat lijkt mij voor het kaartbeeld minder overzichtelijk. Ik wil wel alle schepen binnen zichtafstand van de horizon (±5mijl) ook, voor ze AIS hebben, wel op het scherm zien. Verder is mijn ervaring dat de cpa in praktijk kan flippen tussen wel of niet onder de marge zijn. Zo koers stabiel vaart mijn bootje niet.

Als afstand het enige criterium is, kun je de code sterk vereenvoudigen. Als je het geen probleem vind om targets buiten een vierkant uit te filteren i.p.v. buiten een cirkel, kun je processingtijd dramatisch inkorten en kan je eea waarschijnlijk wel met een risc processor realiseren.
Of gewoon met hoogte van antenne experimenteren, maar dat is misschien een beetje flauw om in dit verband te suggereren.
.
The miracle is not to fly in the air, or to walk on the water, but to walk on the earth.
Alleen ingelogde leden kunnen reageren.

Gezocht C-code voor het decoderen van AIS NMEA 29 juli 2018 16:36 #963971

  • 3Noreen
  • 3Noreen's Profielfoto
  • Offline
  • Gebruiker
  • Berichten: 13411
Dankzij de code van Roozeboos heb ik nu een filter in elkaar geklopt op mijn raspberry boordcomputer. Was wel even puzzelen daar de raspberry C compiler two's complement signed variabelen verwachte waar de door de ais doorgegeven positie west of zuid dus negatief is. Maar het doet het. De ais geeft 28 en 27 bit posities. Die konden niet zonder dat de Most significant bits gezet waren gekopieerd worden naar 32bit veriabelen in geval van negatieve waarden. Maar dat zijn de bitneuk details.
Nu filter ik voor mijn plotter alle targets er uit die niet varen en verder dan 2 zeemijl verwijderd zijn. Via wifi zijn wel alle targets beschikbaar op wat modernere schermpjes voor het geval dat. Maar mijn plotter loopt nu niet direct vast als ik de lijst met targets op het scherm oproep.
You will have to take my last can of fossil fuel from my cold, dead hands ;-)
Alleen ingelogde leden kunnen reageren.
Tijd voor maken pagina: 0.252 seconden
Gemaakt door Kunena
   
   
   
   
© Zeilersforum.nl