GPS Antenna on Windows Mobile: Internal or External?

- Do we really care?

- GPS Hardware Port settings

- Avoid end-user actions

- A possible programmatic solution

 

For whatever reason you may want to know if the GPS Antenna your Windows Mobile device is connected to is internal or external... but... are we sure we should care? If you’re using GPSID APIs, then you shouldn’t care if the GPS Antenna is external or internal: in both cases it must be set in the OS’ GPS control panel applet by the user (this is not the only option, see below). Programmatically speaking, once you’ll call GpsOpenDevice to create a connection to the GPSID, then it’s up to the Intermediate Driver to internally take care if the antenna is internal or external.

In contrast, if you’re NOT using GPSID APIs (as I did in my previous test application I talked about in my blog), then probably your only option is as many 3rd party software do, i.e. scanning all the COM ports. In any case, also by using this approach you won’t be able to discriminate if the COM port you’re opening is related to an internal or external GPS antenna (for example if it’s a COM Port associated to the “Serial Port” service exposed by a Bluetooth GPS Antenna).

So the question may become: why do you need to care if the antenna is internal or external? Well... for example you may think that if external then the user is required to explicitly set the "GPS Hardware Port" within the GPS control panel applet (Start\Settings-System\GPS), contrarily to the case where the antenna is internal, because the manufacturer very likely configured its properties when building the platform... I'm talking about the following:

GPSSettingsHardware

GPS Settings: Specify the hardware port to which your GPS device is connected. For more information, see the GPS device manufacturer's documentation.

And since, as I've already written, every developer must know the motto "KNOW THY USER, FOR HE IS NOT THEE" [cit. from David S. Platt, President of Rolling Thunder Computing] Smile, you may want to provide users with as few as possible steps.

Ok, consider that at the moment there's no Configuration Service Provider for GPSID, however all the properties are retrieved through the Registry! So, for example, the Hardware Port is set under the keys documented at GPS Intermediate Driver GPS Hardware Registry Settings. So, if you know how the user will set the "Serial Port Service" of the external GPS Antenna (Bluetooth, SD or any other hardware), then it's a matter of using the Registry functions, or Microsoft.Win32.Registry NETCF class or even the Registry Configuration Service Provider for example. If you can't know a priori how the user will set his external device, then even knowing if it's indeed an external device doesn't help...  probably the only option is at this point to instruct the user on how to set the external antenna's COM service and the associated Hardware Port within the GPSID control panel applet... This is basically what I saw in the manual of another great piece of software: Run.GPS ! (thanks Giorgio for this hint! ) -- see chapter 3 "GPS Support". I looked at SportsDo's user guide as well, and didn't find such info, probably purely because its GPS Data Interpreter engine is not based on Windows Mobile's GPSID (manual here).

 

In any case, to verify if the target device has an integrated GPS Antenna or not, accordingly to the documentation above you can check the GPS Intermediate Driver GPS Hardware Registry Settings, and analyze the keys under [HKEY_LOCAL_MACHINE\System\CurrentControlSet\GPS Intermediate Driver\Drivers] : I've found something interesting in this case...

  • example of some devices WITH integrated antenna (note key "CurrentDriver"):

     [HKEY_LOCAL_MACHINE\System\CurrentControlSet\GPS Intermediate Driver\Drivers]
    "SleepOnNoData"=dword:000003e8
    "RetryWaitOnError"=dword:00000003
    "OutputBufferSize"=dword:00001000
    "InputBufferSize"=dword:00001000
     "CurrentDriver"="GPSOneDevice" 
    
    [HKEY_LOCAL_MACHINE\System\CurrentControlSet\GPS Intermediate Driver\Drivers\GPSOneDevice]
    "Version"=dword:00000001
    "PollInterval"=dword:000001f4
    "DriverName"="TAI"
    "FriendlyName"="QualComm GpsOne Card, version 0.0"
    "InterfaceType"="POLL"
    
    [HKEY_LOCAL_MACHINE\System\CurrentControlSet\GPS Intermediate Driver\Drivers\GPSOneEmulate]
    "Filex"="\\windows\\GPSOneFileSimulation.txt"
    "FriendlyName"="QualComm GpsOne File, version 0.0"
    "InterfaceType"="File"
    
    [HKEY_LOCAL_MACHINE\System\CurrentControlSet\GPS Intermediate Driver\Drivers\GPSOnePort]
    "CommPort"="COM1:"
    "FriendlyName"="QualComm GpsOne Card, version 0.0"
    "InterfaceType"="COMM"
    
  • other example of devices WITH integrated antenna (note key "CurrentDriver"):

 [HKEY_LOCAL_MACHINE\System\CurrentControlSet\GPS Intermediate Driver\Drivers]
 "CurrentDriver"="Samsung GPS Hardware" 

[HKEY_LOCAL_MACHINE\System\CurrentControlSet\GPS Intermediate Driver\Drivers\Samsung GPS Hardware]
"CommPort"="COM9:"
"FriendlyName"="Samsung GPS Card, version 1.0"
"InputBufferSize"=dword:00001000
"InterfaceType"="COMM"
"OutputBufferSize"=dword:00001000
"RetryWaitOnError"=dword:00002710
"SleepOnNoData"=dword:00000064
  • devices WITHOUT integrated antenna:
 [HKEY_LOCAL_MACHINE\System\CurrentControlSet\GPS Intermediate Driver\Drivers] 
 "CurrentDriver"="Control Panel Configured Device" 

[HKEY_LOCAL_MACHINE\System\CurrentControlSet\GPS Intermediate Driver\Drivers\Control Panel Configured Device] 
"Baud"=dword:0000e100 
"CommPort"="COM7:" 
"InterfaceType"="COMM" 

I've tried with a few devices ( thanks Nicola, Carlo, Fernando and JP!! Tongue out) and in all of them the result is the same, i.e. when OEMs place a integrated antenna then they also "configure" its specific hardware through the [HKEY_LOCAL_MACHINE\System\CurrentControlSet\GPS Intermediate Driver\Drivers] key.

I noted a different set of keys on one device only, on which by the way the integrate GPS Antenna was working as expected... the CurrentDriver was NOT there! (see below) Looking at WM6 documentation, if it's not set the GPS Intermediate Driver uses plug and play GPS hardware. So? Does "plug&play GPS Hardware" have sense on a device with integrated GPS Antenna?? Thinking  Without the CurrentDriver registry entry, multiple registry entries would have to change to switch between different GPS devices... without that set, does the device.exe load the first "driver" listed under [HKEY_LOCAL_MACHINE\System\CurrentControlSet\GPS Intermediate Driver\Drivers] ? Very likely yes (I should confirm looking at source-code).

 [HKEY_LOCAL_MACHINE\System\CurrentControlSet\GPS Intermediate Driver\Drivers] 

[HKEY_LOCAL_MACHINE\System\CurrentControlSet\GPS Intermediate Driver\Drivers\GPSOneDevice] 
"Version"=dword:00000001 
"PollInterval"=dword:000001f4 
"DriverName"="TAI" 
"FriendlyName"="QualComm GpsOne Card, version 0.0" 
"InterfaceType"="POLL" 

[HKEY_LOCAL_MACHINE\System\CurrentControlSet\GPS Intermediate Driver\Drivers\GPSOneEmulate] 
"Filex"="\\windows\\GPSOneFileSimulation.txt" 
"FriendlyName"="QualComm GpsOne File, version 0.0" 
"InterfaceType"="File" 

[HKEY_LOCAL_MACHINE\System\CurrentControlSet\GPS Intermediate Driver\Drivers\GPSOnePort] 
"CommPort"="COM1:" 
"FriendlyName"="QualComm GpsOne Card, version 0.0" 
"InterfaceType"="COMM"

 

Even if we had such a confirmation, at this point the only thing that may discriminate if the GPS Antenna is internal or external SEEMS TO BE (I sure haven't tried on enough devices, so feel free to let me know!) *IF* [HKEY_LOCAL_MACHINE\System\CurrentControlSet\GPS Intermediate Driver\Drivers\Control Panel Configured Device] key *exists* .  I was initially thinking at checking the value of [HKEY_LOCAL_MACHINE\System\CurrentControlSet\GPS Intermediate Driver\Drivers]CurrentDriver, however as you noticed I found at least one device without it and yet with integrated antenna... To wrap up the discussion, a possible programmatic approach may be:

- MANAGED:

 static void Main(string[] args)
{
    RegistryKey rk = Registry.LocalMachine.OpenSubKey(
        @"System\CurrentControlSet\GPS Intermediate Driver\Drivers\Control Panel Configured Device");
    bool HasIntegratedGpsAntenna = (rk == null);
    if (rk != null)
        rk.Close();

    if (HasIntegratedGpsAntenna)
        MessageBox.Show("Integrated", "GPS Antenna");
    else
        MessageBox.Show("External", "GPS Antenna");
}

 

- NATIVE:

 int _tmain(int argc, _TCHAR* argv[])
{
    HKEY hKey = NULL;
    LONG rc = NULL;
    BOOL HasIntegratedGpsAntenna = FALSE;

    rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
        L"System\\CurrentControlSet\\GPS Intermediate Driver\\Drivers\\Control Panel Configured Device", 
        0, 0, &hKey);
    
    HasIntegratedGpsAntenna = (rc != ERROR_SUCCESS); 

    //or probably better, including other error-check:
    //HasIntegratedGpsAntenna = (rc == ERROR_FILE_NOT_FOUND); 

    if (hKey != NULL)
        rc = RegCloseKey(hKey);

    if (HasIntegratedGpsAntenna)
        MessageBox(NULL, L"Integrated", L"GPS Antenna", MB_OK);
    else
        MessageBox(NULL, L"External", L"GPS Antenna", MB_OK);

    return 0;
}

 

Cheers,

~raffaele