FX-30, GPS and PIC32


#1

Hello,
In my project, I use the FX-30 as ethernet router to 3G to transmit measurement data from my PIC32MZ microcontroller from microchip to a server.
The FX-30 has a GPS module. I can correctly get it to work via the command (gnss get loc3d, …).

However, for my application on my PIC32MZ, I need to have GPS coordinates. Currently, I use a GPS module communicating in RX / TX with my PIC32MZ.

I would like to be able to use the FX-30’s GPS to transfer data to my PIC32MZ via ethernet link.

Do you have an idea of how to proceed?

Thank you very much for your future response


#2

how about ssh login to FX-30 via ethernet link?
After that you can enter AT command to get the GPS data.


#3

Hiya,

Don’t forget to enable the SSH port in the firewall on the ethernet link…

ciao, Dave


#4

If the SSH link is a bit too complex for the PIC32, you can also create a Legato application that would provide a simple UDP or TCP service, so that if you do a request to :3000 (random port number, can be 12345 if you want, doesn’t matter), the service would reply with a simple structure that contains the GPS coordinates.

You can also create a HTTP service that returns the GPS coordinates as a JSON structure, and parse the structure from the PIC32.

If you don’t mind the static coupling and you have a proper networking stack on the PIC32, the tcp service way might be simplest.


#5

Thank you for your answers.
However, my microcontroller is not equipped with an encryption library for SSH.

Alternatively, implement Modbus communication via ethernet by running a passive program on the FX-30.


#6

Hiya,

yeah, ssh might be a bit heavy for the PIC32.

As @CoRfr suggests. you’re probably best off building a Legato application that bridges the GNSS data to a simple protocol that the PIC32 can access over a simple socket. You’ll need to use the GNSS api to get the GNSS data, and have a look at this socket tutorial or even Beej’s Guide if you’re not familiar with linux network socket programming.

ciao, Dave


#7

Thank you for your answer. I will tackle this solution. I’ll let you know and I’ll try to leave some traces on the subject.


#8

Hi @valentin_pl,
did you try the suggested solution?
is it solved your issue?
best regards,


#9

Yes I found a solution.
I will use a TCPIP socket server.
The FX-30 will play the role of a server and when the PIC32 (client) sends him a request, he will answer with his Socket the GPS information.
For the moment I have not done the code yet, I put that aside.
There I just installed Developer Studio however I am block with the “Docker” … impossible to program my FX-30, …


#11

Small question @davidc, does the package for FX-30 has libraries to access the function “le_gnss_Start ()”, “le_gnss_GetLocation ()” because I can not find them? Unless there is a manipulation to be done? Thank you for helping me, I have many things to learn yet!
Regarding the TCP / IP socket server, I managed to implement it and communicate with the PIC32.


#12

Hiya @valentin_pl

Yep, all the le_gnxxXXX functions are supported on the FX30/WP8548.

You should be doing all this in legato to make sure that everything is set up and linked correctly.

To access the le_gnss functions, you need to do three things:

In your component Component.cdef file:

requires:
{
    api:
    {
        le_gnss.api
    }
}

in your application application.adef file:

bindings:
{
    application.component.le_gnss -> positioningService.le_gnss
}

and finally in each of your source files

#include "legato.h"
#include "interfaces.h"

Hope this helps.

ciao, Dave


#13

Thank you for your answer @davidc .
I understood that there was a story of .api however I did not manage to use them.
And precisely, I still have an error in the bindings, I quote my code of server.adef:

sandboxed : false

bindings {application.component.le_gnss -> positioningService.le_gnss }

executables:{ serversoc = (serverComponent) }

processes : { run { (serversoc} }

And during the build, I got the error: "server.adef: 5: 4: error: Executable ‘application’ not defined in application.

I can not find what is missing despite my readings on Legato’s docs.

Thanks :slight_smile:

Edit : In the bindings, it’s not "application.component … but serversoc.serverComponent…


#15

Every second, I call the function “gestion_gnss” so that it generates a new buffer for sending a GPS frame to the microcontroller who is the client.

However each time I call for example the function le_pos_GetTime, I always have the same values, it does not update.
I did not really understand how we manage the update days … Should we use an event handler?

Here is my code:


uint16_t gestion_gnss()
{
state_gnss=le_gnss_GetTtff(&ttff);
//LE_INFO(“TTFF: %d”,ttff);

if(state_gnss == LE_NOT_PERMITTED)  // LE_NOT_PERMITTED If the GNSS device is not enabled or not started.
{
	LE_INFO("Not enabled/start");
	le_gnss_Enable();
	if(le_gnss_Start()==LE_OK) state_gnss= LE_NOT_PERMITTED;
	else {
		memset(buffer_gnss,0,sizeof(buffer_gnss)); // RAZ chaine de caractère
		sprintf(buffer_gnss,"DONTSTART\n;");
		return false;
	}
}


if(state_gnss == LE_BUSY) // LE_BUSY The position is not fixed and TTFF can't be measured.
	{
	LE_INFO("BUSY");
	memset(buffer_gnss,0,sizeof(buffer_gnss)); // RAZ chaine de caractère
	sprintf(buffer_gnss,"GNSSBUSY;\n");
	return false;
	}


if(state_gnss == LE_OK)  // - LE_OK  Function succeeded.

	{	//LE_INFO("OK");
		state_gnss=0;
		le_pos_Get3DLocation(&latitude,&longitude,&hAccuracy,&altitude,&vAccuracy);
		le_pos_GetDate(&yearPtr,&monthPtr,&dayPtr);
		le_pos_GetTime(&hours,&minutes,&seconds,&milliseconds);

		memset(buffer_gnss,0,sizeof(buffer_gnss)); // RAZ chaine de caractère
		sprintf(buffer_gnss,"%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;\n",numTrame,latitude,longitude,hAccuracy,altitude,vAccuracy,yearPtr,monthPtr,dayPtr,hours,minutes,seconds,milliseconds);
		LE_INFO("New trame");
		LE_INFO("%s",buffer_gnss);
		numTrame++;
		return true;
	}

return false;

}