[Windows Mobile Apps and Games] Mach2003:
GPS Mod Driver (From original post in Diamond thread Ending Here)

This Driver installs between your gps application and the GPS driver that reads the hardware gps.

- Lag is compensated, by guessing your position 'some number' of milliseconds in the future, current course and speed changes are included in the guess.

- Driver corrects for invalid data in the gps strings, Out of range DOP values, and Heading values of 'NaN' (Not A Number). Position, Speed, and course are reported, even though the distance traveled is less than 30 meters.

- Cell Tower location is used when GPS is unavailable

- Altitude is corrected from/to WGS84/ASL

- Hardware Compass Support

- Allows selction of many input sources, including MSApi (GetPosition api)

- Suports GPS applications on any COM port, as well as GPSApi (GetPosition api)

Hardware Compass Support information is in Post Number two

QueStub support is in post Number Six, Garmin can now use GPS Intermediate Driver, so no longer needs QueStub

Newest Version:

3.4.4

Add back in the detection of dead input port

3.4.5

Fix GpsApi when calling app is stupid

- Caller asks for V1 data with V2 dwSize (I return V1 as version with V2 size, and V2 data in the return

FixGpsApi GPSGetDeviceStatus

Change ReadNewData to detect, and call GPSGetDeviceStatus, and set the waiting handles (if there are any)

3.4.6

Remove trap on stuck GPS from msapi, only COM ports are detected (TP2)

Rename gpx and csv files to:	"ModDriver_{date}_{time}{In or Out}.{gpx or csv}"

3.5.0

Add GPX tracklog 'ending' to each log write, fseek back to overwrite.

Change time sync to CellInit, since clock is functioning when service loads.

- Detect when Cell service not loaded, and sync on GPS open port

3.5.1

Created a new device MsClock, provides current device time with millisecond resolution

Created and linked MachClock.dll (uses MsClock)

- Provides SystemTime and FileTime with 1 m/s resolution

- Uses device clock for base time

- Re-Sync time on device wake-up from sleep

Used MachClock to keep time in sync (all apps and drivers)

Fixed a bug in appending GPX tracks to existing logs

3.5.2

Move DeviceStatus maintenece to ModDriver

- Modify COM_Read, COM-Write to support transfer of data to caller (GPSApi.dll)

Remove Power up/down redundentcies from ModDriver and MachCell

Add Thread open count to MsClock

Fix Power up notify in MsClock

Fix Extra calls to UpdateDeviceStatus in ModDriver, when no-one is listening

Create Named event in GPSapi.dll to track mutiple instances of dll

3.5.3

Include AutoLog, RegUtil, and CardPath into MachClock.dll

- Should save some ram since the code will only load once (shared for all apps and drivers)

- On my device running GpsModSetup saves 20kb of ram

MachCell should have saved another 20kb too, but since it is a service I can't prove it

- Fix a COM port read issue when GSV is not sent regularaly (some BT recievers)

3.5.4 - 3.5.6

Fix EnableLogs Registry read error issue

Remove close COM port on PurgeCom (bug)

Fix time error

Fix GPX logging

- Could stop/delay output data

3.5.7

ModDriver could be sending data to the application way too often

MsClock driver was not being used by ModDriver

MsClock bit of tweeking, and was made faster too

could have stayed running 'awake' when nothing was using it.

GPX log files was still broken sometimes, another tweek there too.

reset the device clock to the GPS time (+500m/s)

added some logging to MsClock, but only for testing

3.5.8

Logging Owner Process Name in ModDriver and MsClock

Extra Delay removed reading some COM input devices

When input port times out, reader thread could stay active (or even duplicate)

MsClock, only reset device clock if it needs resetting (read current clock, and compare first)

Changed timing on EnableSmooth

- Used to return data at 600, 400+, 600...

- Now 500, 500+, 500, 500+,

Better handling when reader app crashes without closing the ports

- System sends me Ioctl_Psl_Notify

- I force close reader port, SetLastError( 6 )

- In GPSApi I react to GetLastError() == 6, by exiting the reader thread.

3.6.0

- Fixed a minor issue with sudden loss of BT com port

Version 3.10 and newer: Added Direct support for reading cell tower location.

See the change log and Cell Tower features starting on post 1346 here

External Card Storage

- If the card is removable, installing a device driver to it is just a BAD idea, don't do it!

- My attached shortcuts don't work, make your own or edit mine.

- Your card may not be avalable during early boot, so driver may not autoload.

- Driver will take londer to load, so phone will take longer to boot.

- ModSettings will take longer to load

- Uninstall is not as perfect, but still works fine, except it is possible that the dll on the card may not be removed if it is in use at the time.

- Did I say don't install to a card unless you have to?

- Install the driver cab, change your GPS application to the indicated port or to use Gps Intermediate Driver, instead of the original internal com port.

- Run GpsModSetup (found in start), you will see live gps data from the ModDriver on the main page. Tapping the screen will toggle to a sattelite view screen.

Menu/[Profile] (driving or Walking): to use a preset setup, Save will update driver to use new profile. If auto profile is enabled you will not be able to make this selection, but can still edit the profile's values.

Menu/System: to change the values used by ModDriver.

- Log File: Creates a debug log in \Mach2003 of the device.

- Extended: Adds more information to the logs.

- Track Log: Creates a GPX and CSV file to card\Mach2003 that can be viewed in Google Earth, or many other applications.

- Raw Data: Includes an extra GPX and CSV file for the raw input readings from the GPS source.

- Smooth: Allows Mod Driver to insert an extra GPS output at half the sleep time, so that some map displays are less jumpy.

GpsModDriver section

- Sleep Time: Amount of time that Mod Driver will wait for a new GPS reading. Default devices are 1000 ms.

- ComTimeOut: Passed on to the windows com driver when using a COM input port, amount of time readfile will wait for ANY data to arrive on the port.

- Keep Alive: Driver will keep reading raw data for this many milliseconds after the last reader port is closed. Allows for switching GPS applications without loosing fix.

Be very careful changing the following port, you may need a factory (HARD) reset if you change a port to one that is already in use!

- Com Port: The output port Mod Driver will use to send data to your GPS Application.

- Enable: Enable (or disable) All Mod Driver functions.

Internal GPS Device section

These settings are written to the internal GPS device registry, and MAY be used by the original driver

- Sleep Time: Time to Wait for data when no data is available ro read.

- Poll Rate: How often to check for new data from the internal driver.

- Input Buffer: Amount of phycical RAM to reserve for READING the internal GPS device.

- Output Buffer: Amount of RAM to reserve for communication to MS GPSID driver.

Be very careful changing the following port, you may need a factory (HARD) reset if you change a port to one that is already in use!

- Com Port: Com Port for GPSID data, same as using the 'External GPS' control panel 'software port' item.

- Enable: Enable (or disable) the internal GPS, same as "allow windows to manage device" under external GPS settings.

Menu/Extras: To configure additional settings.

Altitude Table section

- Altitude Fix, To enable driver to correct altitude to true (ASL)

- Prefer GPS, To use GPS altitude when avaiable instead of the table values

- Kill Feature Remove Table, Use to remove the altitude correction feature, and the table file from your card.

Auto Profile Selection

- Gsensor Angle, angle from vertical when to switch to/from walking profile.

- Enable portrait, To autoswitch profile when in portrait mode

- Enable landscape, To autoswitch profile when in landscape mode

Cell Tower Location

- Service is Running Now, Reports current service status, tap to update

- Enable Cell Service, ...

- Enable Service, Only with GPS, starts and stops cell service when Mod Driver is used/closed

- Enable Internet Cell Data, Allows Servicer to use data connection to resolve location of unknown cell towers

- Entries To Save, restricts the size of the cell tower database

- Default MCC, Can be set to YOUR Mobile Country Code for when your RIL does not have this vital information

- ReStart, Stop/Start Buttons.

- Export, To export known cell tower locations to a GPX file

- Update, Used to resolve all unknown cell tower locations, ignores Enable data Flag (use while connected through A/S)

- Kill Feature Remove Service, Use if you don't want cell tower location features.

Menu/Ports: To enable Mod Driver to use other input ports.

Port Scan Mode

- Scan On Power Only, default, allows scanning for a better input port only when the device is plugged in.

- Scan on Battery Too, allows port scan at all times, regardless if device is plugged in or not.

- Never Scan, disables the port scan feature.

- Scan Only Once, does an imediate scan, then sets itself to "never scan".

Input Port section

- Port (MSAPI, or Com Ports from 1 to 9)

- Enable, allows Mod Driver to read this port

- Fix, applies Mod Driver Lag, speed, and heading fixes to this port (some devices might not need these fixes)

- Order, Mod Driver tries to find GPS data on the Enabled ports in this order, 0 first, then 1, 2... (99) is auto entered for the "output" port, as it can not be used for input as well.

All screens have an 'Undo' and 'Save' button. Undo will revert all changes made to the screen, save will update the driver to use the new settings.

Profile Screens

- Name: Used for profile selection and display (alters the names on menu and selection screens)

- Set To Defaults button: Sets all profile fields to factory default values, as installed from the latest CAB.

To Insert Speed and Course section

- Distance Moved: Meters times 10 to update course and speed (30 = 3.0 meters)

- Zero Speed Time: Milliseconds to speed when distance above is not exceeded, your speed will "stick" until this time passes when not moving.

- Minimum Speed: Any speed below this value will be considered as "zero" to filter out erratic slow readings.

To Calcualte Lag Position section

- Speed Threshold: kph times 10 to update LagAdvance position (50 = 5.0 kph), readings with speeds below this value will not have lag applied.

- Lag Advance (ms): Number of milliseconds to project your position into the future to compensate for delay in GPS readings

Toggle Enable section

- Speed Fix: Allow the driver to correct speed

- Prefer GPS: If GPS raw data has a valid speed, use it instead of calcualting speed from position.

- Course Fix: Allow the driver to correct Course

- Prefer GPS: If GPS raw data had a valid course, use it instead of calculating course from position.

- Dop Fix: Allow the driver to correct bad dop values

- Compass: Allow hardware compass with this profile

Auto Input Selection

Mod Driver allows you to select more that one source port for reading GPS data. No matter what input port is used, your GPS application can read Mod Driver to get GPS data.

- You can enable Bluetooth GPS devices as well as MSAPI, and the internal COM port devices.

- 'Order' assigns the preferred port to use, 0 is the most prefered, 1 is next...

- When first started (any GPS application opens Mod Driver port), driver scans ports starting from 0, to find input data.

- If the scan mode is enabled, it tries lower order ports every 30 seconds or so, and switches 'up' to a better port if fixed data is there.

- If the current port looses connection, Driver will try any enabled port to get good data (regardless of scan mode).

- To install a BT device, pair it with your phone, and add an external com port to it.

Altitude Fix

The NMEA standard requires GPS altitude to contain Altitude above sea level (standard was made by boat people), and seperation from the WGS84 ellipsoid used in calculating the ASL. Sea level varies on the planet by up to +- 100 meters from the ellipsoid due to gravitational force changes. Using data from NGA (2008), a table was created (stored on CARD under \Mach2003, 64kb), and is used to determine the seperation value for the current GPS position. In testing, we found that the table value was more current (a more accurate value) then even the devices' driver was using. Prefer GPS will override the table value, and use what the device thinks is correct only if the GPS data actually has the seperation value. You CAN disable this feature and save a bit of card memory by deleting the Altitude*.RAW file. (if card memory can not be found, the file is retained in the devices \Windows folder).

There are also a couple of shortcuts attached here to auto-select a profile. You can copy them to start menu, or to app keys to assign to a hardware button. There is also a shortcut for running the "scan once" selection without "starting up" mod settings.

KillDriver.exe

Used to remove a stuck un-install of the driver instead of using SKTools.

Copy the un-zipped file to the device and run it. It will remove all the files, registry entries, plus the Mod Driver entry in the uninstall database.

It may leave behind some registry entries, and does leave behind the files under \Windows\App Install. You may delete these files manually after running the kill driver application.