No announcement yet.

Latest Build - 2014-06-11

This topic is closed.
This is a sticky topic.
  • Filter
  • Time
  • Show
Clear All
new posts

  • Latest Build - 2014-06-11

    Here is the latest build of DriveLine.


    This program is developed in VB.Net 2013, and uses the .Net Framework 4.0.
    Attached Files
    Last edited by ClockWorK; 06-15-2014, 10:29 AM. Reason: New Build

  • #2
    Features and Non-Features

    What this program DOES do:
    Music playback (music files and audio CDs).
    Video playback (video files and DVDs).
    Display album art from the current media folder, and song art from current media if it's MP3 or M4A.
    Display media tag info from MP3, M4A, M4V, MP4, ASF, WMA, WMV, and OGG files.
    Audio visualizations.
    Display basic OBD info. Can clear codes.
    Display basic GPS info. Sync PC clock with GPS time. Draw a GPS trail.
    Display driving statistics from GPS or OBD (Avg speed, peak speed, time moving, time stopped, launch, etc).
    Display analog gauges.
    Display system CPU usage and front-end CPU usage.
    Display media lyrics (internet connection required).
    Display maps, traffic, directions (internet connection and GPS required).
    Connect to a bluetooth phone and manage incoming and outgoing calls.
    Supports application embedding.
    Supports dimming/un-dimming of the screen manually or at specified times.
    Searches for an internet connection and downloads weather information based on GPS location.
    Gracefully hibernates/suspends and resumes.
    Includes a simple web-browser interface with OSK.
    Log information such as GPS location, WiFi connectivity, speed, bearing, etc.
    Copy folders/files (import media).
    Automatically detect new versions on removable drives and offer to install the new version.
    Compensate for screens with a 16:9 physical size with a 4:3 display resolution, to prevent stretching between 800x600 and 800x480.
    Display the video from up to 5 web-cams.
    Works with Windows XP 32bit thru Windows 10 64bit.
    Skinnable, customizable, programmable.
    USB Radio Control (XM, HDRadio, SiLabs, DAB+).
    Source code provided.
    Supports JoyCon and HotKeys.
    Supports Phidgets, Tire Pressure (TPMS), and ParkingDistance (PDC) sensors.
    Intelligent voice-command system.
    Last edited by ClockWorK; 01-27-2016, 09:36 AM.


    • #3
      Development History

      Minor tweaks around DAB radio volume / muting.
      Added low-level IO code for ejecting drives. This supports any removable drive type instead of just optical drives, so it can do a "safely remove" of USB devices.
      If this code proves to be reliable, modMCI can be removed from the project.
      The EJECT interface will now list all removable drives instead of just optical drives, since they can now be ejected.
      The EJECT interface will now automatically update when a drive is added or removed.
      If a drive is exposed as a logical drive AND as an MTP device, the MTP device will no longer be listed in the browsing windows (or anywhere else).
      Drive letters in lists will now be followed by the drive label.
      Modified the playlist code to store the display-name of internet radio channels.

      The AI can now respond to the 'Eject' command followed by a drive letter. "Eject the D drive" or "Eject F"

      Fixed hotkey commands that needed to be updated for SiLabs radio.

      Added support for web-radio URLs, including playlist files and podcast XML files.
      Fixed missing support for .ASX, and .XSPF files.
      Added support for podcast .XML files.

      More minor fixes.
      Tilesparency is now applied after the entire skin is loaded. And also any time the skin-config changes, to accommodate tiles be moved or removed.
      The voice-recognition engine is no longer destroyed when the skin is unloaded. This fixes an issue that would cause the Voice-Command button/icon to be disabled after loading a new skin.

      Speech speed is now configurable.
      Added "Tilesparency" effect.
      Colorizer setting now applies to the Prev/Next arrows on the NavBar.

      Code Clean-Up.
      Skin Clean-Up.
      Fixed a stretching issue with WebMaps.

      Performance tweaks.

      Minor tweaks to the DrivingStats to better calculate distance. Need to test these changes.
      Files transferred from an MTP device to the PC will now have their Date/Time set to match the file on the MTP device.
      Fixed MTP code handling certain drive types (devices that

      Discovered that the code for Lyrics with DAB radio had overlooked some things. Fixed the Lyrics functionality for DAB and Silabs radios.
      Silabs radio support is pretty much complete. Call-Sign is a little sketchy, but it mostly works.

      Adding support for Silabs USB Radio. Added variables, status icon, configuration settings, commands, etc.

      Trying to modify MTP support to handle more devices...

      Added some error-checking around the online updater code.

      Cleaned up some of the skin-defined voice commands.
      Added "show" commands for all main windows. example: "show playlist"

      Added the ability to search for local businesses. They will be marked on the Maps screen with small markers numbered 1 through 9.
      Added hotkey Ctrl+L to trigger 'Start Listening' for voice commands.
      Lots of little fixes to the Speech/AI.

      A verbal request for directions can now specify any location that is stored in the "My Locations" list. Example: "Directions to Jason's house?" If there is a stored location named Jason, it will get directions.
      The "goodbye" statements now include some provisions for location.

      A verbal request for the weather can now include a specific day. Example: "What is the forecast for tuesday?" Also, "today", "tonight", and "tomorrow" work.

      Experimenting with "Always Listening" mode. The way it works right now, say "Hey" followed by the ComputerName. The music will stop and the PC will start listening for a command.

      Yesterday's code for transferring an array of MTP files causes an error. Reverted back to the old way, but optimized it a bit.
      Actually, dug a little deeper. Found the problem. People gotta dispose of COM objects when they're done.

      Added a function for copying an array of files from an MTP device to the local machine. This should be faster than connecting, copying one file, disconnecting, repeating.
      I should probably try to do the same thing for getting date modified. Ugh..
      Sort of cleaned up some MTP naming code a little.
      Worked on code to ensure playback muted before text-to-speech began speaking.

      Added a Microphone button to the OSK. If you have trained Windows Speech Recognition, this should work pretty well.

      More work with Voice and Speech, and other fun stuff.
      Added settings for Voice, and AI.

      Added file-size and date-modified functions to PortableDevices classes.

      Modified voice-recognition code to support "Always Listening" mode. This was actually removed a long time ago. The option is not available in the UI yet, and might never be.
      Fixed media not resuming after a Text-To-Speech action. The TTS service must be initialized from the UI thread.
      When TTS is speaking, the "WaveOut" volume is now raised to 100% and then restored when speaking is complete.

      Abandoned MTPsharp. Found some C# code that almost worked correctly, but had some flaws. So I converted the code to VB.Net and fixed the issues.
      I still need to add more error-handling, but this has been a serious coding accomplishment.

      Discovered that MTPsharp.DLL has a memory leak. Trying to minimize the impact of this until I find another solution (or rewrite MTPsharp in VB.Net).

      Added more MTP support. File/Folder import works. Adding files to the playlist works. Need to test the auto-updater.

      Added some MTP support, utilizing MTPsharp.DLL.
      MTP is the Media Transfer Protocol used by some phones/devices when connected to the PC via USB or Bluetooth.
      I wonder if any of this will apply to iPods..

      Grayed/Disabled images are now darker.

      Toying with a new skin, called Carpe Diem, inspired by Apple Car Play. This is a completely different style than the Default Skin.

      Fixed an error that would display a message box if the RSS feed server was unavailable.

      Fixed a bug with Skin_Config defaulting to the Default Skin config file.

      Added AppEvent SpeechRecognitionChanged to enable functionality to display the status of voice-recognition (Ready, Not Ready, Listening, etc.)
      Added variable %thisparent% to allow for cleaner code when raising events on a parent control. This will make copying skin objects easier.

      Fixed a bug in Voice-Command recognition code that would prevent voice commands from being recognized.

      Added WiFi status icon, and an event-driven network-status monitor.
      Cleaned up the Screen-Lock functionality a bit, by integrating some of the code into the app instead of trying to do it all through the skin. However, the pass-code is saved 'per-skin'.

      Added icon for triggering Voice-Recognition.
      Added variables for Voice-Recognition status.

      Fixed an issue with REPEAT not working when cross-fade is enabled.
      Lyrics now save to a 'My Lyrics' folder. The program will check that folder before searching online for lyrics. This is still experimental, and will probably be optional.

      Added 'Extended' weather forecast. Weather now displays a total of 5 days worth of weather, plus current conditions and sun/moon info.

      Added new MUTE/UNMUTE behavior at start of application.

      Added new MUTE/UNMUTE behavior to XM Radio and DAB Radio code.

      The MUTE/UNMUTE command will now be sent to the HD Radio device when the HD Radio source is muted/unmuted.
      This is to prevent 'audio leakage'. Sounds gross. :-P

      Added overlays to DashCam Snapshots, displaying speed, date, time, gps lat, gps lon.

      Cleaned up skin inconsistencies. Specifically, the WMP mute/pause button, the BlueTooth voice-dial button, RRAY's skin, etc.
      Fonts can now be included in the individual skin folders.

      Playing with different ways to reduce time of skin loading.

      Added code and settings for automatically checking online for updates, and automatically downloading updates.

      Rewrote a lot of the cross-fade code, to prevent the issue of the Visualization disappearing.
      Added code for an online updater that can resume partial downloads.

      Optimized some of the condition evaluation code. Fixed blank string comparison.
      Added lock-screen. This isn't the most secure solution. A keyboard could bypass this lock screen with the Window/Start key, ALT+Tab, etc.

      After importing files, the user will now be asked if they would like the imported files added to the current playlist. This is something I've wanted for a while.
      Added the Stocks window to the skin files for Screen # 2.

      Performing a long-hold on the OSK backspace button will now clear the OSK textbox.
      When click an external text box, the OSK will now auto-populate with the text from that box.
      When adding a location to the My Locations list, the Address will pre-populate with the current GPS coordinates.

      There is now a setting to control whether the mousewheel scrolls like normal, or if it should be interpretted by the Skin Events to adjust volume.
      Outside of DriveLine, the mouse wheel will function like normal.

      Planning a new object type called GRID that will automatically handle the layout of objects within it.
      Considering changing the RSS window to use a ListView instead of a TreeView, and to display images from the RSS feed.

      Modified image caching AGAIN. Skin image data (the original encoded image byte data) is now cached instead of the decoded image object, and these cached resources persist until a new skin is loaded.
      Caching the encoded image data (instead of the decoded image data) saves memory, which allows us to keep the data in memory. Keeping the data in memory allows for faster skin re-loads (theoretically).

      More tablet fixes. Mostly to support Ambient Light Sensors.

      More tablet fixes. Mostly to support Location Sensors that are not GPS based.

      Modified Google Maps code to draw the map such that it fills the entire container window.
      Fixed a bug in the WebMaps skin file which caused the Zoom-In button to not highlight when being pressed.
      Updated code to better handle Location Sensors.

      Added Image caching back in. Caching is only used when loading skin images. This way, repeated images (like the arrows) only need to be read from disk once.
      The image cache is emptied once the skin is done loading.

      Fixed battery bar not changing color from green to yellow to red as battery percentage drops.
      Fixed a bug in the skin-reloading function when the skin was reloading due to Display Settings changing.

      Modified camera code to be more compatible with tablet cameras.

      Added functionality to the Skin processing functions to allow for a Portrait_Layout to be defined. This xml block will be processed only when the current screen is in Portrait mode.
      While not the most efficient solution, this at least gets us on our way to a single skin being able to support both Portrait and Landscape layouts.

      Fixed a graphical skin error with the #1 button on the camera screen.
      Updated the battery code to also check the battery percentage once per minute.

      Fixed a skin issue that caused a transparency problem if an image object had no image assigned, but did have a border.
      Fixed brightness control on tablets. The trick is to manually disable Adaptive Brightness in the Control Panel Power Management settings.
      Fixed a rotation bug.

      Significantly reduced memory consumption during skin loading. It's always good to dispose of objects as soon as we are done with them.

      The current skin will automatically re-load when monitor/display settings change. This should sort of work for tablets being rotated.

      Added additional brightness functions, which should work for DVI/HDMI monitors that support backlight control. Still testing.

      Yesterday's new code didn't end up detecting the camera removal. :-\

      Added code to check for camera devices being plugged in or unplugged while DriveLine is running.
      Eventually I should do this for USB radios as well.

      Fixed a bug that would cause an Embedded App that was already running to be unembedded, executed a second time, and re-embedded.

      Fixed Embedded App Auto-Mute only working with the first shortcut.

      Fixed folders not always being sorted in folder-lists. This mostly happened on flash-based devices, such as browsing the SD card on a smartphone.

      Added commands:
      LIST_SELITEMPREV ListviewObject
      LIST_SELITEMNEXT ListviewObject

      Added commands:
      LIST_POPULATE ListviewObject idxToSelect strDelimiter strItems
      LIST_SELITEMBYTEXT ListviewObject txtToSelect
      LIST_SELITEMBYINDEX ListviewObject idxToSelect
      LIST_GETSELITEMTEXT ListviewObject txtOfSelItem
      LIST_GETSELITEMINDEX ListviewObject idxOfSelItem
      CUSTOMSETTING_SAVE xmlFileName settingName settingValue
      CUSTOMSETTING_LOAD xmlFileName settingName varSettingValue
      Note that the CUSTOMSETTING commands will not allow spaces in the xmlFileName (unless it is passed as a variable).

      Added an option to the settings for Embedded Apps to allow automatic muting when an app is run OR switched to.

      Fixed TAB character causing issues in Event Commands.
      Added skin command AddVolumeToCurrentSource. This allows a button or hotkey to increment (or decrement) the volume of the current audio source by a specified percentage.
      Added skin command ToggleCurrentSourceMute. This allows a button or hotkey to toggle the Mute setting for the current audio source instead of checking each source individually.
      Disabled double-click on WMP objects.

      The WMP object now responds to a long-hold the same way as a double-click. It toggles full-screen.

      Added an option to the Settings screen to allow a maximum refresh rate to be set for the OBD interface. Adaptive Timing is now only disabled when a max refresh rate is set.

      Fixed a bug in the variable-parser that could cause multi-variable strings to be parsed incorrectly.
      Increased tick-rate of UI timer for smoother media progress and Peak/VU Meters.

      Disabled ELM327 Adaptive Timing. Might make this a configurable setting if users complain about the change.

      Added some error-checking to the CPU usage code. This was prompted by the Performance Counter service becoming corrupted on my CarPC, and me spending 4 days trying to figure it out.

      Removed threading from the Logging service, just as a test.
      Added highlighting and cursor-checks to the buttons on the HD Radio screen.
      I think the only objects lacking the highlighting and cursor-checks now are the volume bars and mute buttons.

      Added highlighting and cursor-checks to the tab buttons in NowPlaying, Sensors, Vehicle, and Weather.
      Added highlighting and cursor-checks to the buttons on the XM and DAB screens.
      Emulators work again, as long as the ROM files are associated with the emulator EXE through Windows.
      Converted the BrowseROMs screen to use the folder/file list that is employed throughout the rest of the program.
      Skin cleanup.

      Fixed WMP video files pausing when toggling full-screen.

      Reverted the change from 07-11-2013.
      Modified the way mixer controls (lines really) are identified and modified under WinXP. This fixes radio volume controls that were not working in WinXP.

      Added new lyrics service

      Fixed issue with Windows XP speakers being set to zero volume when exiting DriveLine.

      The Audio-Input lists for radios will now only list input lines instead of all mixer lines.

      Performance tweaks.

      Added code for HD Radio RDS. That was easy.

      Added command AssignVarFromObject. It takes two parameters. The variable name, and the object name.
      Optimized text auto-size function.
      Running out of things to add or fix in this program.

      Added new "Fade-In" function to gradually raise the volume of the current media source from zero to the set level over a specified period of time when DriveLine starts or resumes. Default is 10 seconds.
      Just to be clear, this adjusts the SOURCE volume level, not the SPEAKERS level. Different solutions to the same problem. The source volume meter within DriveLine visibly climbs to its set level.
      The purpose of this is to prevent "volume-shock" when a user gets in the vehicle and the music turns on at an extremely loud level.
      Not yet sure how this will conflict with cross-fading. I think I've handled it, but will need a few days of testing to confirm.

      The screen mapping now defaults correctly when the settings have not been configured.
      Implemented new Flick code for lists. Lists now scroll as an item is being dragged. Speed sensitivity added. Still tweaking.

      Added the ability to map primary and secondary Forms to specific Monitors.
      Moved Skin UI Timer references under their appropriate Forms. This should help performance on single-screen systems by not creating unnecessary timers that only draw on the secondary screen.
      The SaveAs screen now functions more like a SaveAs dialog. Clicking on an existing file now populates the SaveAs filename.

      Performance tweaks. Changed UI EventPump Command-List to a StringBuilder. Good idea? Bad idea? No idea.
      The Dimmer now uses a single persistent hDC instead of obtaining and releasing an hDC for every dimmer command.

      Skin cleanup.

      Fixed a bug in the GetNextFavorite function that would generate an error when the playlist was empty.
      Gauge needles are now fatter.
      GPS Fix will now indicate 'GPS Not Found' if there is no GPS data. Otherwise, the Fix-Type will be listed.

      Calling RaiseObjectEvent on an object that is not a parent of the calling object now causes the ExitIfCursorOutside command to be ignored.

      Modified all calls to ExitIfCursorOutside to specify the control being checked.
      Added some skin code optimization. Removing blank lines and comments from the command queue.
      Encountering a strange error only in the Visual Studio Debugger on my Win8 machine. This may have started on 06-14. Or it may be because I enaled Windows Test Mode.

      Modified all buttons so only clicks where the mousedown and mouseup event occur within the object boundaries will register.
      Added code to selectively remove skin commands from the command queue, reducing CPU load and eliminating repeated processes.
      Modified the UI event-pump to separate processing calls into 'blocks', correcting a possible error when encountering EXIT commands.
      The NowPlaying tile is no longer a live tile. It still displays album art, but not using the sliding transition effect.

      Modified the object highlighting code to properly highlight objects with rounded rectangle borders.
      Modified all buttons to utilize highlighting.
      Added a special variable called %thiscontrol%.

      Gauge needles are now triangular and extend under the numeric labels.
      Gauge needle color can now be specified. Currently specified as Red.
      Gauges are now antialiased.

      TPMS and ParkingDistance connections will be checked upon receiving a DEVICEADDED event.
      Fixed XM icons not displaying. This was probably broken on 04-12-2013.

      Fixed a bug that could crash the program if two DashCam requests occurred simultaneously.

      Added error-handling to the CoreAudio initializer to prevent an error from occurring on Windows XP.
      Added skin code to hide the VU meters when CoreAudio functionality is not available.

      Fixed an issue that would cause the first item in the playlist to repeat if the playlist was set to only play favorites and there were no favorites marked in the current playlist.
      Modified the Config screen to only check for COMM ports that are available on the system, instead of testing COM1 through COM12. This should be faster, and allow COMM port numbers as high as necessary.
      New method for calculating fuel efficiency.
      The fuel efficiency value can now be reset by performaing a long-hold (or double-click) on the "Avg Efficiency" label or value.
      Modified GPS code to accommodate additional "talkers".

      Just a reminder. For a Serial port device to work (such as GPS or HD Radio), the port should be set to the correct baud rate in Device Manager as well as within DriveLine.
      Note: Some third-party audio driver software (VIA) may interfere with DriveLine when adjusting volume/mute on HD Radio, XM Radio, or DAB radio. Reported by dtmorgwsu.

      Combined the Phidgets window with TPMS and Parking Distance. Renamed the window "Sensors".

      Added support for Parking Distance Sensors.

      Made the path to skin images a variable stored in the Skin_SkinVars.XML file.
      Added some more Mixer functions.

      Fixed a bug with Mixer device names.
      Cleaned up new Location Devices code.

      Added support for Windows Location Devices (Win7+ built-in GPS support).

      Added anti-echo option for BlueTooth. This will need some testing.

      The DashCam can now be used to automatically adjust the dimmer. But I think I need a way to easily toggle the dashcam autodimmer.
      Added CoreAudio by Ray Molenkamp in order to access a PeakMeter for the speaker line level. This will be an experiment in echo-cancellation with BlueTooth. When speaker line level goes up, mic level will go down.

      Fixed G-Force calculation.
      Tested some code for 32Feet's InTheHand bluetooth wrapper, which supports many stacks.

      DashCam snapshot rate is now configurable.
      New icon for GPS info tile.

      Attempting to increase OBD refresh rate. Reduced sleep-time while waiting for responses. Decreased timer interval. Added a variable for monitoring refreshrate.
      What a shame that I only added the ability to measure the response rate after modifying the code to be faster, making it impossible to quantify any improvement.
      Weather alerts with no title will no longer be counted/displayed in the Alerts list. This usually happened when an alert was cancelled.

      Phidgets digital inputs and outputs can now be renamed through the Settings window.

      Converted modMixer to be x64 compatible.
      Realized that the keystonecomm.dll seems to be 32bit only. So modifying the rest of the program for x64 compatibility seems like a waste of time.
      Fixed the number of Weather Alerts displaying -1 under certain conditions.

      Converted all hWnds and hDCs to IntPtr for x64 compatibility.
      Need to go through modCOMM and modHID to clean up handles and old UDT code. Also, UDT code in modWinAPI. And maybe modBlueSoleil callbacks.

      Rewrote some of the Camera reconnect code.
      Added a line for Acceleration to the OBD info.

      Added some skin files for the upcoming FuelPrices plugin.

      DashCam image filenames now include the camera number.
      NowPlaying tile is now a live tile. The tile will display album artwork if available.
      Camera connection will now fallback to 320x240 if 640x480 fails.

      Fixed an issue in the Windows Update code that could generate an error when loading the Settings screen.
      When browsing for images (for the SlideShow), folders will always use the Folder icon, and images will use thumbnails.
      The browser screens for importing folders (source and destination) now use a folder-list layout instead of a tree. Similar to the other browser screens.
      Camera image will no longer stretch. Instead, it will center within it's container, and will scale to fill the container.
      Modified Camera code and skins to support up to 5 cameras.

      Added odometer display to the Vehicle window.
      The odometer can be set in the Settings window, under the Display options.
      Removed image caching. It provided no real performance enhancement, and would cause the SlideShow to generate an OutOfMemory error after displaying enough images to consume 2gigs of RAM.
      The Slideshow tile is now a live tile when the slideshow list is not empty.

      Moonphase now updates regardless of Weather/Internet/GPS connection. Only requires Date.
      Sun-Up and Sun-Down now update regardless of Weather/Internet connection. Only requires Location and Date.
      Camera reconnects from Hibernate correctly now.

      Changed the Camera icon on the Main screen.
      The Camera icon on the Main screen now enables/disables if the specified camera device is connected.
      Added an icon in the StatusBar area for Camera/Dashcam.
      The StatusBar icon for the Camera has 3 states: Grayed Camera (not connected), Not Grayed Camera (connected but dashcam disabled), and Recording (connected and dashcam running).
      Fixed a few remaining issues with custom fonts.
      Changed skins to specify the font to use for the gauges. Prior to this, it was defaulting to Arial.

      DashCam (saving images, not video) now works again. All it required was a DirectShow wrapper, a CS-to-VB converter, and a day of work.
      Going forward, this new code can be expanded to handle multiple cameras.

      Brand new Camera code using DirectShow.Net library.

      Fixed an issue with mixer settings.

      Updated the OBD window on Screen # 2 to match Screen # 1.
      Added a thin media progress bar just above the NavBar.
      Added a Voice-Recognition button to BlueTooth window. This is only for Phone commands. DriveLine does not interpret these.
      Fixed an issue that prevented folder-art from displaying in the AddMedia browser. I broke this in the last update.
      Fixed an issue that was preventing custom fonts from being utilized. Not sure how long this has been broken. Probably months.

      Added a 'Gauges' tab to the OBD window, displaying Compass, Boost, RPM, Speed, and CoolantTemp.
      Fixed some minor issues in the PaintGauge function.

      Very minor skin fixes.

      Added two new backgrounds.
      Added a bunch of new animated logos.

      New moon-phase images.

      Added severe weather alerts (for US only). This is done by County, and uses the Alerts.Weather.Gov RSS feed.
      Fixed the "Stocks" tile missing from Screen # 2. But I haven't added the actual Stocks window to screen # 2 yet.

      The Config window now supports one level of subfolders in the Logos Tree.
      The Config window now displays image thumbnails for the Logos List.

      Added more logging.

      Yahoo closed down their GeoLocation API. So the WOEID required by the Weather API is now obtained through the Yahoo Query API, querying City State ZIP.

      Minor skin fixes.
      Added the ability to only play songs in the current playlist that are marked as Favorites.

      New Experimental skin. Three home-screens with arrows for panning left/right.
      Modified TPMS code to allow 10 sensors. Skins not yet modified.

      Added a SkinConfig setting to allow moving the NavBar to the top of the screen (or leaving it at the bottom). It looks stupid at the top, but whatever.
      Added more code for BlueTooth auto-reconnect.

      Tweaks to the BlueTooth code.
      Changes to the AutoUpdater to preserve SkinConfig settings.

      Icon text color can now be controlled through the UI via Skin Config settings.
      Fixed a bug in the code that handles marking Favorites.

      Added the ability to hide icons though the UI via Skin Config settings.

      DriveLine can now download and install Windows Updates when running as an Administrator.
      This new functionality is available through the Settings window.

      OBD indicator will indicate NOT CONNECTED if more than 5 seconds go by without a Speed message response.
      Implemented Next-To-Play feature. Long-hold an item in the playlist, and it will be marked to be played next.
      The program now supports marking Favorites in the playlist.

      Gas Mileage is now stored differently. The whole array is saved now.
      Still messing with the calculation, but the above change should help with testing.
      Added Moon-Phase, SunRise, and SunSet to the Weather screen.
      Minor changes to the My Locations list.

      Transitions implemented for the icons on the Tools+Web screen.

      Fixed an issue that prevented the MODULO operator and INTEGER-DIVIDE operator from working.
      Implemented Skin Config options for rearranging icons on the Home screen and the Tools+Web screen.

      Added provisions for Skin Config settings.
      Fixed code for FreeGeoIP.

      Tweaks to the CrossFade timer to ensure the visualization is always visible.

      Pressing F7 will now re-load the current skin.

      Didn't do anything. Because I was out with a girl. :-P

      Added HotKey events to the DefaultSkins for the following keycodes (when CONTROL key is held down):

      Hotkey support added. Fully programmable, this should allow for interfacing with a keyboard or a JoyCon.
      Added HotKey events to the DefaultSkins for the following keycodes (when CONTROL key is held down): Home (36), MediaPrevTrack (176), MediaNextTrack (177), and SelectMedia (181).
      Home will display the main Home screen.
      MediaPrevTrack and MediaNextTrack function just like the Prev/Next arrows. When the current audio source is a Radio, the arrows function as SEEK buttons.
      SelectMedia will intelligently cycle through the different audio sources.

      Fixed a couple of inconsistencies across the different skins.
      Fixed a bug in the DefaultSkin that would raise an error about a zoom variable in the traffic zoom buttons.
      All skins now specify the default font as Droid Sans Fallback.

      Fixed a bug that would prevent the playlist from starting when launching a shortcut to a playlist.

      Sunrise/Sunset calculation via Date and GPS now works correctly.
      DriveLine will no longer rely on the Weather service to determine Sunrise/Sunset.
      Changed the way the Fuel Efficiency is calculated.

      Added button highlights to the Bluetooth Phone dial-pad.
      Increased rate of OBD querying.
      Fuel Efficiency calculation seems to be correct now.
      When performing an automatic update, the dimmer will no longer reset during the update.
      Fuel Efficiency will no longer be reset when DriveLine closes. It will be stored in the DrivingStats XML file.

      Changed the Auto-Update scanner to scan all drives instead of just removable drives.
      This should be better for users that download new versions directly to their CarPC instead of transferring the new version via removable media.
      OBD works again.
      Playlists should now load faster.
      Playlist files can now be linked just like Apps.

      Re-wrote all Blue-Soleil function declarations to use PInvoke with CallingConvention=CDecl.
      Re-wrote all Keystonecomm (DAB+ Monkeyboard) declarations to use PInvoke with CallingConvention=CDecl.
      Added a Config setting for TPMS pressure unit.
      External apps can now be added and removed via a long-hold on their icon within DriveLine.
      Highlights now disappear if a long-hold is triggered.
      Added some support for programmable HotKeys.

      External apps can now be added and removed in the Config window.
      Fixed TPMS battery percentage display.
      Added a Camaro logo. Cleaned up Logos folder. The only good animated logo was the Ani_Chevy.gif file.

      TPMS communication is working.
      Added TPMS display as a tab in the Vehicle window.

      Trying to get new changes to OBD to work the way I want them to.
      Highlights now disappear when the mouse/finger leaves, and re-appear if the mouse/finger returns with the cursor still being pressed.
      Fixed a potential bug in the Auto-Updater that could erase the Phidgets settings.

      Weather forecast tiles are now more like the other tiles (same coloring, same highlighting).
      Updated some of the Getting Started documentation and images.

      Changes to OBD querying of PIDs.
      Combined Vehicle and Driving Stats into a single tabbed interface.
      Tweaked fuel efficiency calculation.
      Added highlighting to all of the Tiled windows (Main, Apps, Media, Exit)

      Tabbed windows (Phidgets, Now Playing) now highlight the current tab with the skin text color (instead of gray).
      Better colored skins. More objects using the skin-defined colors instead of hard-coded colors.
      Prior to this change, only a few colored skins actually looked good. Now, they all look alright.
      The red skin is now more of an amber color. Might rename it to Amber. Or maybe it's too close to orange now. We shall see.

      Moved back to Visual Studio 2010, since VS 2012 won't even install on Windows XP.

      Skin fixes.
      Some tweaks to the way day/night is handled. Now more accurate. And the change from day to night (or night to day) triggers a WeatherChanged event.

      Moved to Visual Studio 2012. Had to use .Net Framework 4.0 (or higher).

      Fixed an issue with the changes to the Config to allow adding locations. Oops.
      Fixed a skin problem that caused the search to crash when performed on screen #2.

      Tweaks to the CrossFader.
      Fixed long-hold not working on pannable objects.

      Changes to the way Locations are managed. Instead of the marker letter "U" being reserved to represent "You", the letters "A" and "B" are now reserved. "A" will now be your current location on a map. As in, "from point A to B".
      Location Marker characters 0 through 9 are no longer supported. 26 location markers should be enough.
      Locations can now be managed through the config window. This is more intuitive than the interface in the skin.
      Along with yesterday's changes, this should make the program much easier to set up for the first time.

      Phidgets sensors can now be renamed through the Config window.
      Media paths can now be added and removed through the Config window. Mouse recommended.
      The webbrowser homepage URL can now be changed through the Config window.
      Added another source for weather icons.

      Added some code for highlighting objects when they are clicked. Had this idea a while ago, and it's similar to the PopUp keys. Works good.
      Cleaned up some of the input functions.
      The Weather tile is now a Live Tile when Transitions are enabled in the config. Looks pretty cool when it updates the location or the forecast info.
      Tweaks to the sliding transitions code. Transitions will now be enabled by default.
      Fixed a bug in the crossfader that would potentially crash the program at the end of a song after changing skins.
      Added an "Emergency ShutDown" service, which will prompt the user if there's no user input and the current GPS location doesn't change after a set amount of time. If the prompt isn't dismissed with 60 seconds, the PC hibernates (if available) or shuts down.

      Fixed a bug that could cause the automatic OSK to appear on the wrong screen.

      Directions will now clear when DriveLine suspends/hibernates if the distance from current location to destination is less than 1000ft.

      Automatic OSK should now work [better] with the second screen.
      Skin clean-up stuff.
      Writing a separate config tool. Boring, but probably a good idea.

      Directions will now clear when DriveLine resumes from suspend/hibernate if the distance from current location to destination is less than 1000ft.
      Directions to Home will now appear automatically, regardless of time of day, as long as no other driving directions are being requested.

      Thinking that the Contacts screen (and behind-the-scenes stuff) should be separated from Phone stuff.
      Also, the Locations screen (and behind-the-scenes stuff) should be separated from the Maps stuff.

      Changed the button layout in the Phonebook/Contacts window.

      DriveLine will now check the Settings folder for a file named Contacts.VCF and, if present, this file will be used to populate the PhoneBook entries screen.
      Performing a long-hold on a phone number in the phonebook will now populate the dialer with the selected phone number (but not actually dial it).

      Added functionality for the OSK to appear automatically when a textbox is clicked in an external application.
      This required a new Config entry called OSK Auto-Show, and a new AppEvent called AppEvent_ExternalEditClicked.
      More tweaks to the Panning code.

      Added the Experimental skin back in, with 3 pannable home-screens.
      Added some preliminary code for functionality similar to Google Now. DriveLine will automatically retrieve directions/traffic to Work or Home (depending on time of day).
      Some tweaks to the Panning code.
      The analog speedometer will now change scale when the speed-unit is Km/h.

      Minor tweak to OBD code to retrieve DTCs.
      Didn't like the reduced height of the NavBar. Restored height to 17% of screen-height.

      Decreased height of NavBar from 17% of screen-height to 15%.

      HideTaskBar now works on Windows 8.

      Testing geolocation via IP address. This would resolve current location, and weather forecast when no GPS is present.

      A long-hold on the dimmer icon will now dim the screen brightness AND black out everything except the NavBar at the bottom. Click the NavBar or the black area to remove the BlackOut.
      The above feature is for those times when even the dimmed screen isn't quite dim enough. Just an idea. Might remove later on.
      Minor skin fixes.
      Fixed an issue with long-holds not blocking the mouse-up event afterwards.

      Changed the log file to write Latitude and Longitude in Decimal format instead of Degrees-Minutes-Seconds.

      Changed the log file encoding to UTF-8. This fixes the GPS degrees symbol not displaying correctly in Excel. Probably going to change the Lat/Lon output to decimal values.

      New auto-dimmer code seems good so far.

      Added a setting for 'AppTitle' to the Apps settings. It will default to the EXE name if left blank.
      The 'External Apps' window now looks like the 'Tools + Web' window. 5x3 grid with tiles and titles. Non-existent apps will now sort to the bottom.
      The Zoom buttons in the Traffic window now send a mouse-wheel message to the browser object, instead of reloading the entire webpage. Clever stuff here.

      DriveLine will now detect the Windows "AutoPlay" prompt, suppress the window, and scan for updates. This should make SD cards trigger the scan.
      Trying to nail down an issue with the auto-dimmer when coming out of Hibernate. Very frustrating.

      The new file browser UI now uses 'clean' file arrays, where redundant info is removed from filenames. The old browser UI did this as well.

      Wrote a cross-fader. Not bad. The only down side is that it makes DriveLine use an additional 30-40 megs of RAM.

      Minor tweaks to the Dimmer, major changes to the Cam/DashCam service.
      Enhanced the new Browser windows by allowing folder art to come from MP3/MP4 tags, as well as image files.

      Started writing some code to make the DashCam work by recording video instead of a series of snapshots.
      If I ever switch to DirectX (or some other method) for video/image capture, maybe this will be reverted back to capturing images instead of video.

      Added some more code to compensate for touch-screen drivers being set to change a long-hold to a right-click.
      Added XM Radio icons. But some of them are huge, so I need to resize a bunch of them.

      Added some code to compensate for touch-screen drivers being set to change a long-hold to a right-click.

      Changed the 'click' sound so that the sound does not play on the first click if an object has a DOUBLECLICK event registered. This mainly applies to lists.
      Still changing all of the browser screens in the DefaultSkin to the new browser layout. Sure hope this is the right way to go.
      Fixed weather widget background not resetting to blue when forecast is unavailable.

      Changing all of the browser screens in the DefaultSkin to the new browser layout.

      Modified the UI of the "Browse For Audio Files" window. Removed folder-tree. Added icons. Huge change.
      Added total travel time to the Directions text.

      Added support for automatic font installation.
      Included Android ICS font "Roboto" as the new default font.
      If a font is specified, but that font is not installed on the system, DriveLine will check the DriveLine\Fonts folder for a matching font file. If found, the file will be temporarily installed.
      The 'click' sound that was added recently will now only be played if the object being clicked has any mouse events tied to it. So clicking on an empty area won't make the 'click' sound.

      Added support for some UI feedback. Basically a click-sound when a MouseDown event is registered.

      Weather will now check for existing local images before downloading weather images. This can save internet bandwidth (minimal), and also allow the user to choose their own custom weather icons.
      Re-added support for animated GIFs. They do not go through the "Anti-Stretch" code that other images do.
      Added automatic cropping of weather images, which allows for the icons to display as large as possible.
      Added support for multiple different weather icon sources.
      Put in a cheap hack to fix album art in ID3v2.3+ MP3 files.
      Experimenting with time-aware changes to the interface.
      If weather info is available, the weather widget will now become darkened after 6pm. The current day will indicate "Tonight" instead of "Today", and the Low temp will be displayed.
      Considered graying the Weather widget image at night. Nah.
      Added an animated GIF for the Weather widget background at night. Really just trying to add some eye-candy.

      Added Yahoo Weather RSS as a fallback for now.

      Fixed some Phidgets issues. Things I probably broke a few days ago.

      Fixed the FORMSHOWN event being fired whenever a form was restored, instead of just at the initial form load.

      Minor changes to Suspend/Resume code and Dimmer.

      Fixed weather not updating after failing to download an image.
      Might switch weather to use Yahoo RSS instead, or in conjunction with the current weather API implementation.
      Updated links in forecast screens. Probably better international support now.
      Fixes to Phidgets.

      Final corrections to DAB Radio toggling bands between FM and DAB (wasn't storing previous channel selection when switching bands).
      Tweaks to new weather code. Trying different icons, etc.
      Added pre-configured APPS and RSS settings back into the default DriveLine_Settings.XML. Didn't realize I had removed them. Without them present, it's difficult for users to figure out how to add them to the XML.
      Added variable for temperature unit. It's tied directly to the speedunit. MPH = Farenheit. Anything else gets Celsius.
      Found out that SD Card reader devices often do not raise a WM_DEVICECHANGED event when a card is added/removed from the device. Not really interested in a solution that has to poll the drives though, just to check for updates.
      Shortened Weather DayOfWeek back to 3 characters, like it was with the Google API.

      Fixed DAB/FM toggling.
      New weather API. Thanks to CdRsKuLL for Yahoo weather API info and source.

      More minor adjustments to the way audio sources are handled when they are being configured for the first time.
      Added some TPMS stuff behind the scenes.

      Worked out a few more DAB bugs. Thanks to Mickz for testing!
      I think everything in the DAB radio code works now. Anything more will be skin-related changes.
      Added some code to prevent a radio device from being initialized unless both the COMM port and Audio Line have been configured.
      This is officially version 4.6. Making my way to 5.0.

      Cleanup. Wash, rinse, repeat. Always repeat.

      Wrote a quicker function for reading MP3 encoding info. We don't really need to calculate the duration of the MP3. WMP does that for us.

      Fixed some more DAB stuff. Still don't know if tuning/rescanning is working.

      Fixed some skin issues when changing sources via the playlist.

      The DAB Radio volume/amp is dependent on calling the GetPlayStatus function. When this function is called, the DLL will amp the volume only when the status is "Playing" (zero). Otherwise, the volume will remain low.
      So, calling this function should be in the loop/timer/thread that is querying the device. This is a note for other developers working with the keystonecomm DLL.

      Finished adding the new DAB Radio changes into the Screen 2 skin files. I think.
      DAB Radio (actual DAB) might be tunable. FM tunes fine. Might need to know FM radio frequency ranges for other parts of the world.

      Modified Text-to-Speech code to handle muting of the current audio source (not just WMP) when speaking.
      Modified BlueSoleil code to handle muting of the current audio source (not just WMP) when a call is in progress.
      Modified QuickAudio code to handle muting of the current audio source (not just WMP) when playing a notifcation sound (ie PhoneRinging.mp3). This was trickier than the other two.
      Added basic support for DAB Radio. FM works.

      Skin changes. Transferring all of the recent changes over to the Screen 2 skin files. Changed skin files include: NavBar, Lyrics, NowPlaying, Tools+Web, MainForm, Events.
      Status icons in the NavBar now start out disabled.
      The Config interface now prevents the user from selecting the same audio input source for multiple radios. Similar to the way it prevents listing of unavailable COMM ports.

      Fixed XM Radio list not populating all items on initial connection. Still takes longer than I would like, but it works.
      Fixed a bug in the LogFile generation, and removed logging from a few events that can be triggered rapidly.
      Changed the way the Prev and Next buttons are handled, to allow graying of the buttons for each audio source.
      No, this isn't complicated at all..

      Added a condition for XM-PCR devices (as opposed to XM-Direct devices) to skip the InitXMDirect command (and not wait for a response).

      Prev and Next buttons on the NavBar now seek Up/Down on Radio sources.
      Possibly fixed an issue with the dimmer when coming out of suspend. Not sure when I broke this.

      XM events and commands implemented.
      XM lyrics works.
      Need to modify Text-To-Speech code to auto-mute radio sources while speaking, and restore accordingly.

      XM works.

      Modified Lyrics code and skin files to handle WMP/XMRadio/HDRadio sources.
      My idea from yesterday turned out to be a fail.

      Considering an option for DriveLine to terminate when Suspending, and re-launch when Resuming. This forces all devices (and handles) attached to that process to disconnect/reconnect.

      Added support for HDRadio multi-cast (HD1/HD2/HD3) to the code and the skin.
      Got HD3 working. In case anyone cares, the MultiCast value is NOT an integer. It's a BITFIELD. It just happens to work like an integer for HD1 and HD2. HD3 is represented with a 4 (00000100).

      Fixed inconsistencies when changing media sources. WMP volume was appearing blank. XM volume was resetting to zero upon mute.
      Modified some of the Lyrics code to handle RadioLyrics (XM and HD). Maybe should have used this method for all lyrics caching.
      Modified serial port code to allow setting RTS state. This fixed the HD Radio volume being quiet.

      Fixed Phidget sensor 1135 not working correctly.
      Removed MUTE from the WMP media source. Pause is all we need.

      Added code for HD Radio and XM Radio presets.
      Other changes to HD Radio initialization.

      Started to implement Mute control for Audio Input Lines (XM, HDRadio). Then I found out that some lines do not expose a Mute control. So now the Mute is a fake mute (volume to zero).
      Added saving/restoring of settings for HDRadio Volume, HD Radio Mute, XM Volume, XM Mute, and current media source (WMP, XMRADIO, HDRADIO).
      Starting to suspect that the Visteon/DirectedElectronics HD Radio unit does not support HD-3 multicast.

      Querying and setting volume of specific mixer components now works.
      Mixer component volumes are now read at startup, and the MixerChanged event fires at startup, or whenever there is a mixer change that effects DriveLine.
      Horrible ugly conditions in mixer code for Win5 (XP) vs Win6+ (Vista, 7).
      Right now, the code is only dealing with the Volume control, and not the Mute control (yet). Writing the mixer code hasn't been [very] fun.
      Also, unrelated to radios and mixers, I'm pretty sure it's BlueTooth that is sometimes causing the Resume-From-Suspend to take a long time.

      Added AppEvent for HDRadioChanged.
      Added Mixer callbacks.
      Mixer code can now monitor volume of mixers and components in all versions of windows.

      More HDRadio code.

      More HDRadio code.

      Fixed some events firing too often (such as WeatherChanged). Not sure how long this has been like this. So, decreased CPU usage.
      Added some listing of Audio Components for selection of Radio Audio Input. It's not perfect, but it will work for now.

      More logging.

      More HDRadio code.

      Added code for HD Radio (Visteon / Directed Electronics).

      When running an external app, the "working directory" will now be specified. I had left this off, either out of laziness or the assumption that the exe directory would be the default.
      This fixes execution of iGo.exe, and probably other apps that use the CurrentDirectory instead of their own EXE directory for paths.

      PopUp keys for the OSK are now 5-sided, to more accurately resemble the same functionality on an cellphone OSK.
      Fixed PopUp key missing for the slash (/) character.

      Determined that device disconnection (GPS, OBD) before suspend/hibernate is not completing, and I believe this is causing the system to hang for up to 30+ seconds after resuming.
      Added a call to CancelIO in the COMM_Disconnect procedure.

      Same as yesterday. Added some debug logging.

      Minor tweaks to un-block the UI thread while resuming from suspend/hibernate and re-connecting devices.

      Added some provisions for Radios. Specifically XM to start with.

      Further reduced load-time by caching images in memory during the skin loading process, so repeated image files don't need to be re-read from the hard-drive.

      Rewrote the code that handles resuming from Suspend / Hibernate. I was not satisfied with the time it took for DriveLine to become responsive (and re-enable the screen dimmer). Now I might be satisfied.
      If these changes work out okay, some of them may also be implemented in the code that runs when DriveLine is first executed.

      Reading up on DirectX.

      BlueTooth connection now takes place in a separate thread. Hopefully this eliminates the 5-10 seconds of "hang-time" when the app loads/resumes.

      Lots of changes to the Experimental Skin. Home-screen is now pannable, three-screens, like an Android Launcher.
      Rewrote most of the panning code so that it now makes sense.

      Added ShadingStyle parameter to IMAGE objects in the skin files. This can be used to apply different 3D/Shading/Reflection effects.
      Ignoring a call will no longer cause the playlist to get stuck in the paused state after each track.
      The fix to the Traffic window and bandwidth usage on 07-13-2012 was not working correctly. Now it is.

      Minor stuff.

      Fixed a bug that caused .M3U8 files in the My Playlists folder to show up twice in the file list.
      Fixed a bug that would crash the program if an MP3 file contained an invalid BitRate code.

      Slightly enlarged the height of the keys on the OSK without increasing the overall size of the OSK.

      Minor performance adjustments to prevent unnecessary processing.

      When the program connects to a BlueTooth phone, the connection will now be checked for an ongoing call. If a call is in progress, the playlist will be paused.
      Clicking the TimeRemaining text on the NowPlaying window will now toggle between "count-up" format and "count-down" format.

      BlueTooth should now properly indicate a disconnection when bluetooth is stopped on the remote device.

      Re-made the LYRDB icon, since their logo should be orange. One less blue icon.
      Lyrics text is now stripped of any HTML tags.
      Added variable %CurrPL_CurrMediaTimeRemaining%.

      Navigating away from the Traffic window will now close the connection to the traffic website. It was wasting bandwidth, and there was no reason to keep it open since we do a Refresh when we open the Traffic window.
      When the skin is loading, invisible forms will temporarily be loaded as transparent. This gets rid of the gray boxes briefly appearing when the app loads.
      When a device is removed, the program will check the status of the internet connection immediately.
      When a device is added, the program will now re-check any disconnected OBD or GPS connections.
      The program now keeps track of the most recently added drive letter and the most recently removed drive letter.
      Separated the "Import - Browse For Source" and "Import - Browse For Destination" windows into 2 separate skin files. It makes the browsing easier when there are multiple folders to be imported to different locations.
      Fixed a bug in the date display on secondary monitors.

      Added OGG encoding information (BitRate, SampleRate, VBR, etc).

      Moved Phidgets settings to a separate XML file.
      Phidgets names can now be specified in the new DriveLine_Phidgets.XML file.
      Added progress indicator to the File-Import screen.

      Changed how some of the Config window works. Mostly behind the scenes.

      The default settings no longer execute DevCon after resuming from suspend/hibernate.

      Added MP3 encoding information (BitRate, SampleRate, VBR, etc).
      Increased OSK height from 40% of screen-height to 50% of screen-height.
      Fixed deleting a stored location not working (hanging the program) when the selected item was not a root node in the My Locations tree.
      Changed how some of the low-level MP3-reading code works, to reduce file access.

      Re-designed the Now Playing window. Smaller visualization and slightly smaller album art. Added Artist, Album, Title, FileName.
      If a media file has no album art, the Album Art display will show the icon associated with that particular file type. Seems better than just a blank box.

      Added some support for .ASX and .XSPF playlist file formats.

      Made some changes to the code that reconnects devices after closing an App.

      Added a couple more SkinVars, to allow for easier customization.

      Shortcut files (.LNK files) can now be called via the Apps settings.

      After clearing the Check Engine codes, the state of the ClearEngineCodes button will now disable.
      Fixed the ENTER key on the OSK of screen # 2 not working with desktop apps.
      Fixed the RECONNECT button on the BlueTooth window of screen # 2 not working.
      Added inches display to phidgets with a default unit of centimeters.
      Pressing F8 anywhere in DriveLine will save a screenshot of the program window to the My Snapshots folder. This is mostly to help me take screenshots.
      The Default Skin is now the Metropolis skin. So, the colorized versions now apply to that. They look pretty cool.
      Removed the Wordy skin.
      Fixed OSK missing from Yellow skin.

      New icon for DriveLine.exe.
      Fixed PopUp Keys flashing the last key pressed when re-loading the OSK.
      Fixed PopUp Key ampersand not displaying correctly.

      Fixed one of the Phidgets values not displaying on screen # 2.
      Small tweaks to the OBD functions. The Check-Engine Light indicator was not always being updated.
      Added new Traffic windows, which still access Just a cleaner implementation now, maximizing screen real-estate.
      Modified some of the skin code to allow mixing of percentage values and absolute pixel values for X, Y, Width, and Height of skin objects. For example:

      Paths of Apps will now automatically be translated between "Program Files" and "Program Files (x86)".
      Fixed settings not saving when performing a PC shutdown or reboot.
      Moved settings for Current Media Idx and Current Media Pos to the Settings file, instead of the PlayList file. Could change the playlist file to M3U8 now if I felt like it.

      Fixed an issue with folder security, where trying to access folders with certain permission levels could raise an error.
      Added pop-ups to the OSK keys to help give some feedback to the user, so they know that the click registered. This was shockingly easy.
      Fixed the "/" and "?" keys not functioning correctly on the OSK.
      Fixed the BlueTooth DialPhone function sending an incorrect length for the number to dial, resulting in some phones dropping the last digit and failing to dial correctly.
      The listing of available COMM ports in the Config window will now populate faster because it no longer checks ports that are already assigned. So, if COMM2 is assigned to GPS, DriveLine won't even check COMM2 when listing available OBD ports.
      Closing an embedded app will now return the user to the Home screen, instead of leaving the user looking at an empty box where the app used to be.
      Fixed the list of Apps being reset. Due to a copy-paste error, the list was being reset when settings for Phidgets were present.

      Modified how the PlayQuickAudio function works so that it no longer blocks the UI thread. This should help with answering an incoming call while the audio alert is still playing.
      Fixed the "zero" on the dial pad not adding the zero to the Phone Number Text.

      Fixed randomization issue with playlist shuffle.
      The current playlist will now be saved to the DriveLine playlist file when suspending.
      Prior to this, the playlist was only saved when the app was actually closed. This could lead to playlist changes being lost if the PC did not suspend/resume correctly.
      The playlist will now only save to the DriveLine playlist file if changes have actually been made to the playlist.
      Considering implementing a local AddressBook file, and functionality to pull the AddressBook from the phone via ADB. This would only work for Android phones with USB debugging enabled.

      The program will now gracefully transfer audio back to the telephone if DriveLine is closed (or suspended) while an ongoing call is connected to the PC audio.
      Fixed Phidgets Farenheit temperature values not always displaying.

      Redesigned the BTphone window. Removed useless data. Added interface for dialing, accepting, and rejecting/hanging-up calls.
      Removed the separate "Incoming Call" window.
      Added support for sending DTMF codes during a call (for logging in to voice-mail, or navigating phone menu systems).
      When you place a call, the playlist is automatically paused until the call ends. If the music was playing before the call, the music will be resumed.
      Changed the "Your Phone Is Ringing" notification MP3. The old one was cute, but it was 8 seconds long. The new one is 4 seconds long.

      The program will now alert the user to an incoming call, and display a window to choose between answering or ignoring the call.
      If the user chooses to answer the call, the call is directed to the PC speakers and microphone, and the Playlist is paused until the call ends (or the user clicks Play).
      Clicking NEXT when Shuffle is enabled will now play a random song, instead of the next song in the playlist.

      Removed all of the old BlueTooth code that was utilizing the Serial Port Profile. Replaced with Blue Soleil code utilizing the Hands-Free Profile.

      Added configurable Settings for Backgrounds.
      Removed the Speak button from the Directions window. It was just a novelty.
      Added Traffic button to the Map/Location window. It links to, utilizing the current gps latitude and longitude.
      Added Traffic button to the Directions window. It links to, utilizing the current gps latitude and longitude as well as the destination address.

      Changing the Phidgets Settings now updates the displayed values immediately.
      New hi-res background image for the Metropolis skin. Not sure if it's too busy for a background. With the semi-transparent tiles, it's a bit much.

      There may be an issue with nested conditions and ELSE clauses.
      Added a battery percentage bar to the NavBar of the main screen. It is just to the right of the CPU usage percentage bar, and is only visible when the system battery is less than 100% charged.
      The battery percentage bar changes color (from green, to yellow, to red) as the battery is depleted.
      Moved all of the Phidgets code into a separate DLL. This way, the main source-code is still portable without requiring the Phidgets software be installed.
      The source code for the wrapper DLL is included.

      Added Driving Directions interface. Enter a destination (or choose one from your stored Locations), and the program will retrieve directions from your current GPS location to your destination.
      The Tools+Web interface on screen2 of the Metropolis skin now looks exactly like the interface on screen1. Consistency!
      Probably going to get rid of the original default skin, make Metropolis the default, and have colorized versions of the Metropolis skin.

      Added Phidgets interface, and variables.
      Cleaned up some of the expression evalutation code to better handle negative numbers.

      Added the ability to remove items from the "My Locations" list. Also cleaned up this part of the interface a little.
      Other minor fixes, adjustments.

      New images for ArrowUp, ArrowDown, ArrowLeft, ArrowRight, ArrowBack, Play, and Eject.

      Added some gradients to the progress bars and volume indicators. Pretty.
      Fixed an event that was firing too often, causing the program to take a long time to load when the playlist was long.

      Fixed command SetTextAutoFit not working when using a blank string to clear text. Also added a variable called %emptystring% which might make skin coding easier.
      When changing from one skin to another, the program will now fire a bunch of AppEvents (PlaylistChanged, WeatherChanged, etc.) to re-sync icons with current state.

      Buttons (Remove, Clear, etc) on the SlideShow screen and PlayList screen now become grayed when appropriate.
      The buttons above will no longer function if the list they correspond to is empty. It will no longer clear a list that's already empty, or save an empty list.
      The PlayPrev and PlayNext buttons will now become grayed when the playlist is empty, and the Status text will reflect this.
      The Speak button on the Lyrics screen and RSS screen will now become grayed when appropriate.
      The Arrow buttons on the RSS screen will now be grayed appropriately when there is no data.
      The RSS Feeds list will now display "No RSS Feeds Available" when appropriate, instead of just displaying an empty list.
      The Playlist list will now display "Playlist is Empty" when appropriate, instead of just displaying an empty list.
      The Lyrics text will now display "No Lyrics Available" when appropriate, instead of just displaying a blank text box.
      All of these changes are the result of a few new events, a more event-driven approach, and the addition of more conditional code in the Skins.
      DrivingStats now save upon Suspend/Hibernate, as well as when the app closes.

      Fixed an issue where clicking PlayNext, PlayPrev, or double-clicking an item in the playlist would start the next song, but not clear the PAUSED state if the playlist was paused.
      Fixing this was a good opportunity to make the playlist PAUSED state event-driven. Though not causing any problems, the SHUFFLE and REPEAT state could use similar code changes.
      New icon for Maps. Might as well use the Google Maps Icon, since it is all powered by Google anyway.

      Some fixes to the DashCam code. Soon I am going to scrap this and look into using DirectX.

      Numerous minor fixes.
      WebBrowser no longer complains about addresses with % in the URL.
      Image Graying and Colorizing no longer interferes with transparency on semi-transparent images.
      New icons for: Exit, Minimize, Sleep, Hibernate, ShutDown. Needed some color, and better quality.

      Added command ExitIfCursorOutside, which exits the EventCommands if the cursor position is outside the specified object (or, by default, the object generating the event).
      This change allows more accurate navigation, by making it easier for the user to negate an errant mouse-down (clicking the wrong thing).
      However, it needs to be used with caution when also using RaiseObjectEvent with MOUSEUP or MOUSEDOWN events.

      SetTextAutoFit now works with multi-line text. What a mess. Should have gotten this working on day one. Now text auto-fit is different for Labels/Textboxes/Images vs Trees/Lists (multi-line vs single-line objects).
      The interface for the Add Location window was missing from the Wordy skin. Not any more.
      Textboxes now maintain the Arrow cursor when using the program with a Mouse.

      New icon for Visualization/Now Playing. Basically, a nice Windows Media Player icon. More descriptive than some color-explosion/visualization icon.
      New icon for OBD/Vehicle. Not as descriptive as before, but it has better transparency, and it isn't blue or green.

      Added APPEVENT_DEVICESCHANGED, which is fired when a device (thumb drive, etc) is added or removed from the PC.
      Exposed new app variable: %Devices_NumEjectable%
      The 'EJECT' button will now become grayed if there are no ejectable drives.

      Fixed BTphoneRing event repeating on the same call.
      Fixed new DashCam code not reconnecting after suspend/resume.

      Rewrote some of the DashCam service, to try to prevent an error.

      Possibly fixed BTphone Ringing event not firing.

      Fixed BTphoneSvc not updating the IsCharging state.

      Added Refresh button to WebBrowser window. The space was available, and it's a good button to have in a web browser.

      Second update.
      The new code for loading webpages from the Forecast window is no longer missing.
      WebBrowser objects in the skin now automatically supress pop-ups.

      Finally, I think BlueTooth automatic reconnection works.
      Added command PlayQuickAudio which will interrupt the current media to play the specified file. This is useful for audio alerts (like Your Phone Is Ringing) because the SpeakText command is often too quiet.

      When viewing the Weather forecast, click on a day of the week to load the forecast webpage for that date and current location.
      Clicking the current "Now" weather will load the weather-map webpage for the current location.
      All of this only happens if an internet connection is detected and geolocation is available.
      Fixed playlist option REPEAT not working.

      Still messing with BTphoneSvc to get automatic reconnection to work.

      Small changes to BTphoneSvc to get automatic reconnection to work.

      Minor changes to the Lyrics code, to make sure blank lyrics are ignored correctly.

      Added 3 more buttons (Reset, Sleep, Hibernate) to the "Exit" window.
      Fixed some oversights regarding the OSK and Tiny form in the colored variations of the Default Skin.

      Added new event SHOWN. This event is fired after a call to SHOWOBJECT (or SHOWOBJECT_WITHTRANSITION).

      Restructured some events. Removed some unnecessary threads.
      Included some new logos.

      Added support for assignments in the traditional format. Example: %MYVAR% = %MYVAR% + 1

      Fixed BlueTooth Phone not being detected.

      Fixed an error when loading bad media artwork.
      Trying new ideas for the DrivingStats.

      Changed how the program keeps track of time. Prior to this, the TickCount of the process was used. But keeping track of this across re-starts and suspend/hibernates was becoming tricky for the DrivingStats.
      Now using NOW.TICKS, and keeping track of original start ticks as well as ticks spent sleeping. This will either work great, or break stuff.
      More accurate detection of internet-connection-type (wifi vs lan).

      Cleaned up some GPStrail code. Made the directional-pointer and starting-dot larger, and fixed a graphical error.
      Set a maximum of 10,000 points in the GPStrail. When this number is exceeded, half the points will be discarded.
      Lyrics of items in the playlist will now be cached (but not stored on disk at this point).
      Who knows... maybe add Lyrics to the DriveLine PlayList format. But nah...

      Fixed RSS updating too often.

      Weather and Maps will not try to update if there's no GPS fix.
      Maps icon will now remain grayed unless an internet connection is available AND a GPS-fix is obtained.
      Added support for ELSE in conditions. The code is a little messy, but it seems to work. See samples below.

      Driving Stats will now be saved/restored, and will only be cleared when the user clicks the CLEAR button.
      Added Odometer variable. Still playing around with this idea.
      Implemented DirectCast in place of CType in most places. This should have slightly better performance, and make the code more language-agnostic.

      Tried changing internet connectivity test method in an attempt to use less bandwidth, and be more efficient. Reverted back.

      Fixed some items (weather, current city) not refreshing/expiring when offline.
      Added support for modulo operator to expressions/conditions. Can use MOD or the symbol %.
      Added support for integer-divide operator to expressions/conditions. IntDiv = \.
      Fixed APPEVENT_POWERSTATECHANGED not being triggered. Because it didn't exist.

      Possibly fixed an issue with music not always resuming playback when coming out of hibernate/suspend.
      New icon! This one is the proper size, has transparency, and just looks better.

      Fixed apps not being closed gracefully when using the X button.
      WebMaps now expire after 15 seconds (if the position has changed).
      Removed the background image from the OSK, and added opacity to the OSK.
      Added current City and State to the home screen (just on the main screen, default skins). Sometimes, it's good to know where you are. It refreshes every 5 minutes.

      Fixed (again) WebMaps downloading when not being viewed, wasting bandwidth (and CPU).

      Added OSK support for embedded apps. In fact, the OSK works with everything.
      Added support for conditions (and nested-conditions), calculations, and variable-assignment in skin commands. Currently no support for >=, <=, ELSE, NOT.
      Operator Evaluation Order (modeled after some Assembler logic, and using a mix of VB notation and C notation).
      ( , )
      * , /, \, %
      + , -
      > , < , = , != , == , <>
      AND, &
      OR, |

      Condition Structure Examples:
      IF 9 * (6 - 4) = 18 {
      Do something

      IF %speed% < 10 {
      Do something

      IF %gpsisfixed% {
      Do something
      } ELSE {
      Do Some other thing

      IF %gpsisfixed% AND %speedknots% > 45 {
      Do something

      Moved the OSK from being a frame on the main form, to being a separate form.
      This opens up some options for a opacity on the OSK.
      Modified some code for running in debug mode and handling multiple forms on a single screen.

      Added 'Tiny' form, which is made visible when the main form is minimized. This provides access to the OSK, and to return to DriveLine.
      Useful for interacting with the desktop, or with apps that do not embed properly.
      Added a new setting for embedded apps, which indicates if the app should be left on the desktop instead of embedded.

      Spent two days working on an issue with scrolling lists/trees. Turns out, the issue was a setting in my TouchScreen driver.
      Cleaned up some debug code. Specifically, debugging when a GPS is connected.
      Enabled basic 'Flick' support for all lists and trees.
      So, in our quest for Android likeness, we have:
      FLICK is supported for lists/trees/text. Kinda sucks for text, due to cursor/highlight issues.
      PANNING is supported for images (containers) that are larger than their parent container.
      LONGHOLD is supported for any object through the MOUSEDOWN_LONG event.

      Testing new code for scrolling ListViews and TreeViews.

      Moved BTphone service COMM timer out of the UI thread.
      Moved GPS service COMM timer out of the UI thread.
      Moved OBD service COMM timer out of the UI thread.
      Hoping to move the dash-cam service timer as well. Maybe.
      Decreased the UI event pump interval from 2 seconds to 1/10 of a second. I think this is still a good trade-off. Not such a lazy timer after all.

      Added 'paged-panning', to allow dragging of over-sized panels, similar to the home-screen(s) in the android UI.
      Might add 'free-panning' in the future, similar to lists in the android UI.
      Added the ability to TILE (instead of STRETCH or SCALE) an image (for the purpose of tiling the background image across a panel used for panning).
      Changed the Default Skin (and all variations) to use the TILE method on the background images.
      TextBoxes are now read-only and the text cannot be highlighted.

      The FORMSHOWN event will now automatically trigger the APPEVENT_CURRPLAYLISTITEMCHANGED event.

      Changed out the weather icon again. As mentioned before, there are a lot of blue icons in this program.
      Added the little 'degrees' circle (°) to OBD and Weather where appropriate.
      Moved Weather display update into the WeatherChanged event.
      Moved BlueTooth display update into the BTphoneStatusChanged event.
      Removed two timers from the skin (one per screen), that were used for BlueToothPhone updates. Now using the APPEVENT_BTPHONESTATUSCHANGED event.

      Added images for Weather and RSS. Trying to come up with a nice way to separate them in the skin.
      Renamed event 'APPEVENT_ALERTSCHANGED' to 'APPEVENT_WEATHERCHANGED'. I think I did this in a way that won't break old skins. We'll see.
      Added new 'Weather' interface, which displays the current weather and short forecast with images. This also results in the removal of the 'Text-To-Speech' option for weather info.
      The Weather icon on the Media page now defaults to a half-sunshine and half-snowflake image. Might need to work on this.
      Removed the 'alerts' icon from the NavBar, since Traffic alerts don't exist anymore, and weather-alerts were just the forecast. Replaced with the BlueTooth indicator icon.
      New image for BlueTooth. There are a lot of blue icons in the StatusBar area.
      For the moment, there is no way to get to the RSS interface anymore. Also, the 'Alerts' interface was used to display the current geo-location.

      Completely re-worked the internet services (lyrics, weather, maps, rss, geo-location, online status). Not that there was anything wrong with them. But they were messy.
      Honestly, it's hard to believe that everything still works. But so far, it does.
      Removed the last remaining yahoo traffic API references.
      Some modules have been renamed. Some functions were renamed too.

      The 'Save Playlist' interface now saves playlist files as .M3U8 instead of .M3U, for unicode support.

      Voice commands can now be activated by performing a long-hold on the NavBar. The music will pause for a few seconds while listening for commands. Music will resume after a few seconds, or when a command is recognized.
      This isn't ideal, but it's slightly better than nothing.

      Replaced SystemInfo timer with a different kind of timer, for some reason.
      Removed two timers from the skin (one per screen), that were used for lyrics updates. Now using the APPEVENT_LYRICSCHANGED event, thanks to the UI event pump timer.
      Removed internal timer for handling system resume from suspend/hibernate. Now using the UI event pump timer.
      The file-import process will now display a messagebox to notify the user that the import is complete.
      The file-search process will now display a messagebox to notify the user that the search is complete.
      Other changes made to the file-search process, to make it more clear what the program is doing.
      Disabled internal timer for handling the AutoDimmer time-check. Moved the check into the SysInfo timer for now. Could also move into UI event pump timer.
      Not sure if Dimmer override was working 100%. I never encountered a problem, but I found some code that didn't seem right, and made some changes. If it ain't broke... break it!
      Wonder if I can do something with the Internet service timer.

      Added a 'lazy' internal timer for pumping events through the UI thread. Useful for msgboxes and non-instantaneous events.
      Removed internal timer used for checking/prompting for updates. Now uses a thread to check, and the UI event pump is used to prompt the user if an update is found.
      Removed internal timer used for processing voice-commands into to the UI thread. Now using the UI event pump timer.
      The UI event pump should allow more APPEVENTs to be handled cleanly, removing more timers, making better use of threading, etc.

      Fixed a bug in the FileName cleansing routines, where the AllNumeric check was being performed by storing the string into an integer, and back to string. Horrible code.
      Now, the function loops through the chars, checking the ASCII value, the way a good programmer would do it.

      Added some code for responding to WM_ messages. This was explored more than 2 years ago, but the rest of the program was not ready.
      Need to define more constants for Wparam.
      When this is fully implemented, a separate VB module will be provided that can find DriveLine, issue commands, and query values like speed, bearing, etc.
      This would be for anyone that wants to write a basic plugin (really, an embedded app that can interact with DriveLine via Win32API messages).

      If a screen is unplugged/removed while the program is running, and Windows moves a Form to a different screen, the form being moved will be made invisible.

      Testing dynamic volume control (speed affects volume). Personally, I think RPM vs volume would be useful too, but not sure if OBD refresh rate is good enough.

      Fixed DrivingStats not updating via GPS speed -- it was only using OBD for speed/time/distance tracking.

      Changed how maps are downloaded. Now, they only download when the WebMaps timer is running (when the map screen is visible). This was done to reduce internet data traffic.
      Considering adding some code to have the downloaded WebMap image expire after so many feet are traveled, to ensure that an old/stale image is not displayed.
      This would mean that the image would blank out if a new one cannot be downloaded.
      Another option would be to apply a time-stamp to the image, to reflect the age of the image.

      Moved BTphone queries to another thread.

      Had to back off on some of the agressive async bluetooth code.

      DashCam memory-leak is probably fixed. Evil evil DoEvents...

      Added orange color-schemed skin through hue-control.
      Added a skin variable for font-name, so now it's a lot easier to change the font across the entire skin.

      Fixed a memory leak in the Dimmer code.
      Added the ability for the DashCam to adjust the brightness of the screen (only when in 'undimmed' or 'day' mode). So, if you drive into a tunnel or it gets dark early, the dashcam may dim the screen.
      Currently, it adjusts the brightness every 5 seconds. Adjusting it every 1 second almost seemed distracting. Tough call, but not worth spending any more time on a weird feature that nobody will use.

      Changed the Camera code to use IntPtr variables instead of integers. Trying to track down a random crash in Camera code.

      Added skins: DefaultSkin_Cyan, DefaultSkin_Green, DefaultSkin_Magenta, DefaultSkin_Red, DefaultSkin_White, DefaultSkin_Yellow.
      Possibly fixed BlueTooth not reconnecting upon resuming from suspend/hibernate.
      Fixed an issue with some file extensions causing duplicate files to appear in some lists. Apparently, calling with an extension of "*.M3U" returns all m3u files and all m3u8 files.
      Fixed Logging function not handling variable-paths (like %appPath%) correctly. Oops.

      Implemented a single skin variable for all button border color settings (%skin_clrBtnBak%). So now the button border color can be changed in one place, and it effects the entire program.
      When more settings are specified in this manner, it should allow for easier skin editing, testing, etc.
      Added more logging to the app.
      Added more voice commands to the skin.
      Added the ability to force an image's colors to all be within a single color component (R, G, B, RG, RB, GB, RGB). This means the cyan colors (and others) can be easily overridden.
      This is kind of like dynamic hue control.

      Finally taking advantage of the skin-defined-variables capability. Need to do a lot more with it.

      Seeing occasional crashes on Win7... My first suspect is the VideoCapture code, since I am seeing the Camera Properties window appear on occasion.
      I know that the issue is not occuring in the main UI thread, since the program remains usable.
      Probably need to clean the code up to use IntPtr variables, and such..

      Mic and LineIn detection now work in Windows Vista and Windows7, and so does speech recognition (voice commands).

      Cleaned up some code that tracks the GPSfix state.
      So basically, if your GPS receiver is acting like a piece of garbage that cannot maintain a fix, the program will now handle that better.
      (Also, possibly time for me to replace my 3 year old GPS receiver...)
      Changed ampersand handling. No more replacing & with &&. Just disabled the UseMnemonic property on labels. I thought the ampersand applied to more than just labels and buttons, but I guess not.

      Fixed GPSfix value not refreshing after resume from suspend/hibernate.

      Changed the rounded-rect code back (again?) to the newer style. For some reason, neither one looks quite right to me.
      Applied new NavBar tweaks to screen #2 as well. Tested at 800x600, 800x480, and 1920x1080.

      Renamed event MOUSEUP_LONG to MOUSEDOWN_LONG for clarity. The old eventname will still work for backwards compatibility. For now.
      Cleaned up some other code relating to the long-hold. I think it was interfering with long scrolling operations.
      BlueTooth Reconnect should be a little quicker/smoother now.
      Tweaked the NavBar on the main screen, for larger track title text.
      In the Config interface, the BlueTooth Phone COMM port list will no longer contain the OBD COMM port or GPS COMM port.

      Locations can now be added through the UI, on the second page of the WebMaps screen. Enter the address (or pre-populated gps coordinates), the location name, and choose a marker character.
      The program will use Google GeoCoding (when internet is available) to determine any missing information.
      Next up: Directions to a stored location.
      Animated GIFs are animated again. Unfortunately, the widescreen compensation and image graying does not apply to GIF files now.

      Reverted the ButtonBorder code to a previous version, which I think draws the borders a little better.
      Finally updated that ugly eyeball icon to a more professional looking webcam icon.
      Fixed a bug in the new VoiceRecognition code, which was clearing the Locations list, due to some sloppy copy-and-paste.

      Upgraded my CarPC from a single-core VIA 2ghz with 1gig RAM running WinXP 32bit, to a dual-core AMD 3.1ghz with 4gig RAM running Win7 32bit.
      Not really a change to this program, but it effects one of my test environments so it's worth noting.

      If no microphone (or line-in) is detected when the program loads, the VoiceRecognition service will not be initialized.

      Updated and cleaned up a bunch of AudioMixer code.

      Fixed the volume setting not restoring properly when the program was restarted.

      The program now supports voice commands defined in the skin, as well as voice commands defined in the 'VoiceCommands.XML' file in the settings folder.
      Commands like 'Computer Toggle Dimmer' can be app-level, because they are skin-independent, and they raise events to keep the skin in sync.
      Commands like 'Computer Show Playlist' are skin-level, because they reference specific skin objects which could have any name.

      Voice-Commands work. They can be programmed through the skin files for now.

      The code that tracks the 'grayed' image states no longer uses the object .tag property. Probably gained nothing by changing this.
      Added some code for speech recognition. Not enough to make it work, but enough to make me want to buy a microphone.
      Skins now unload a little bit quicker.

      If a Tree is filled with root paths, and none of those paths exist, the program will use the array of drives on the PC as the array of root paths.

      Added some code for displaying folder art in lists, but have not decided how to implement it yet.
      Lyrics now clear if the current playlist is cleared.
      Debug-mode now uses a random bearing if no GPS is connected.

      Found and fixed a large bug in the skin files, which was using the wrong names for a couple of objects.
      The issue only presented itself when resuming the program with the media paused.
      Numerous minor fixes/updates to the Screen2 part of the default skin, as well as the "wordy" variation of the default skin.
      Reduced memory usage by roughly 25%.
      May have slightly reduced load-time.

      Prompts (MsgBoxes) now appear on the screen from which the event that triggered them occurred.
      Added missing button Screen2-ClearSlideshowList.

      Fixed issue with displaying of files and playlist items where ampersand characters were not being handled correctly.
      Added a 'Reconnect' button to the BlueTooth window. Can't decide on color/appearance, but it's functional.
      Added support for skin-defined variables. For example, the skin could define a variable named "%skinfontname%" with a value of "Arial Narrow", and then use %skinfontname% in all subsequent font specifications.
      The purpose of the above feature is to make it easier to test/change skin settings across the board (change a font or a color in just one place, instead of numerous replacements).
      Fixed some more BlueTooth code. Everything is working well, but not coded in the best way. Will probably re-write some time, and break it a bit.
      The LYRDB lyrics service is re-enabled.

      Fixed a small bug that was preventing the %iswifionline% value from populating correctly.
      Added support for reading .M3U8 playlist files. Need better support for reading and writing these files, but this works for the moment.
      Adjusted text-to-speech speed. Slowed it down just a little.
      More work on BlueTooth.

      Added URL textbox to WebBrowser interface. Click it and the OSK automatically comes up.
      The WebBrowser interface now supports the OSK for entering URLs, and for entering text into fields on web pages.
      OSK clearing and hiding is now more consistent.
      BlueTooth code is getting better. The function that checks for new SMS messages was interfering with the other queries.
      Phone manufacturer info (and address book) will now be queried any time the info is blank, instead of only when connecting to the phone for the first time.
      Might need to move phone queries to a different thread.
      Checking for new SMS messages works now.
      If a call is detected, the program will pause the music, anounce the call, and leave the music paused.
      If an SMS text is detected, the program will pause the music, anounce the text, and then unpause the music.
      However, at present, checking for new messages also marks the new unread message(s) as having been read.
      The above issue creates the potential for the user to not notice they received a new text, so SMS monitoring will probably be configurable.
      None of this BlueTooth work gets me any closer to using the PC has a headset.

      Added missing button Screen2-SaveDashCamImages.
      Added some checks to compensate for setups where screen index zero is not the primary screen.
      Smarter address lookup.
      Cleaned up tree code for PhoneBook and Locations.
      Locations data now saves when the program closes. Might change this, and other settings, to only save if something actually changed.
      Added some code for allowing the dash-cam to control the screen brightness, based on the brightness of the images the camera is capturing. Might never use this. We'll see.
      Added WebBrowser interface. Still not complete, but the scrolling finally works now.
      Re-designed the Media window in the default skins to accommodate 12 icons instead of 10. 4x3 instead of 5x2.
      Had to disable DebugException 'BindingError' due to some conflict between Win7x64 and MSHTML.DLL...
      Added object event WBDocCompleted. This should be a good event for triggering arrows to refresh, etc.
      Added numerous other functions, variables, and settings pertaining to the WebBrowser.

      Disabled LYRDB Lyrics API functions, until is back online.
      Disabled Yahoo Traffic API functions permanently. No point in wasting the bandwidth, since the service is dead.
      Added Locations list to the second page of the WebMaps code. This works, but there's more to add still.
      Locations defined in the Locations list are now marked on the map.
      BlueTooth, Win7x64, and my Droid2Global are all fighting against me. If anyone tries the BlueTooth options out, please let me know how that goes.
      Fixed a bug that would cause an error on the Visualization screen if no media was loaded. Ooops. Don't know when I did that.

      Modified the COMM_Open function to handle port numbers greater than 9. Also added a NULL char at the end of port name.
      Added some code to format the phone numbers displayed in the address book.

      The program now downloads the address-book from the BlueTooth phone, as well as manufacturer info, and monitors the phone status, including battery charge and ringer-state.
      Added a BlueTooth-Phone-Info frame, which displays the information listed above.
      Tweaked the long-hold code.
      NOTICE!! Yahoo has shut down their Traffic API. So, I need to find a new source for Traffic information.

      Settings for BlueTooth Phone comm port are now saved/stored in the Settings XML, and are accessible just like the GPS port settings and OBD port settings.
      Fixed a bug with REPEAT not working. This was most likely broken last week, and was never an issue in any released version of the program.
      Updated Google API calls to correctly indicate whether the program is using a GPS sensor for location, or a hard-coded/debug location.

      Added BlueTooth Phone events ConnectedChanged and Ring.

      Added event APPEVENT_TIMEMINUTECHANGED, and moved time updates from the UI timer into the new event.
      The above change facilitated the correction of a bug: AM/PM was not updating after the initial app-load, and I didn't want to put it in a timer.
      Renamed some functions, modules, etc.
      Added some more text-cleansing to the RSS text display, to get rid of HTML character-codes.

      Added some code for wrapping the Google GeoCoding API v3 (XML) to convert an Address-to-GPS coordinates.
      This will be used for directions, mapping, hard-coded locations, etc.
      Also updated the GPS-to-Address function to use Google GeoCoding API v3.

      Changed PlayCount from 999999999 to 1. When the playlist was part of WMP, the large number was useful to ensure the playlist would repeat indefinitely. Now, it's useless.
      Reverted the File-Import code to use the IO.File.Copy method instead of my attempt at a less IO-intensive byte-for-byte copy method.
      Flash objects no longer generate an error. Still tweaking though.

      RSS Channels/Feeds are now displayed on the Alerts window, and they are defined in the Settings.XML file. TTS works on the feeds as well as the alerts.
      NOTICE!! The database is offline until early April. While it is down, the lyrics service does not work. I will look for alternatives.
      Second skin almost ready (really, it's the default skin, but with captions under the main buttons to help explain things).

      In Debug mode, the %gpsisfixed% variable now returns TRUE, and the event APPEVENT_GPSFIXCHANGED is raised when the debug state is set.
      Wrote some code for RSS feeds. Probably not what I really need to be focusing on.

      Added some skin commands. Removed some too. Added some variables.
      If anyone was actually working on a skin, let me know and I'll point out what changed. I don't assume anyone is, otherwise I wouldn't break backwards compatibility.

      Reduced CPU usage. Timer events are more efficient. Now taking advantage of the sorted object array wherever possible. I don't think CPU usage could get much lower now.
      Changed long-hold to 2.5 seconds.
      Added some support for Flash objects, including SetVariable and the FSCommand event. Not tested at all yet.
      Exposed more variables: %currpl_curritemnum%, %currpl_itemcount%. So now, if you prefer, the stats can now indicate the current item number and position in the playlist.
      When opening the current playlist window from the main/home window, the currently-playing item will be auto-selected and scrolled to. This is controlled in the skin.

      Modified the Updater to prevent multiple message-boxes.
      Added the ability to permanently delete playlist files from drive. A long-hold of the 'Remove' (Minus) button on the Playlist screen will bring up a prompt to delete the file.
      Long-hold events now fire after the duration of the long hold has expired (3 seconds), even if the user is still holding.

      Fixed a silly bug in the Updater, which was ignoring files ending with '_Playlist.XML' to prevent overwriting the actual playlist (DriveLine_Playlist.XML).
      However, it needed to be more specific, since there is now a skin file named 'Skin_Frame_Playlist.XML', and that file needs to get updated. (Forehead-Smack!)
      Exposed variables for system power status (%power_isonbattery%, %power_ischarging%, and %power_batterypct%), as well as WiFi status (%iswifionline%).

      Having moved the CurrPlayList management out of skin-controlled WMP objects, events which used to require skin commands (ResetLyrics for example) are now handled inside the program.
      Skin clean-up. Re-wrote how the status icons work, including play, pause, shuffle, repeat.
      Re-Implemented filename cleansing in the Browse windows. Simple and clean code, unlike the first time. No more underscores, etc.

      Separated the playlist from WMP (for the second time since this project began).
      This is a major change that I should have gotten done before releasing a new version, but oh well..
      On the off-chance that someone was working on a skin, these changes will break it. Sorry. Better to do it now than later.

      Added a second skin. DefaultSkin_Wordy. The button styles are a little different, and some images have sub-text.

      Slight change to how the program checks files that are being added to the playlist.
      Added .FLAC to the default settings for Audio Extensions.

      Changed how the GrayedImage (ie DisabledImage) is handled. The object's BackgroundImage is no longer used. This may help performance, and provide more consistent transparency since no images will have a BackgroundImage.
      Added some more skin commands.
      Making changes to accomodate new playlist management (better performance), and perhaps to support different media engines instead of just WMP.

      Fixed: SlideShow no longer generates an error if a second monitor is not attached.

      The 'My SnapShots' path is now configurable through the Settings.XML, and %mysnapshotspath% is exposed.
      DashCam images now save into subfolders based on date.
      One issue with webcam -- SnowBlind. This has nothing to do with the program though. Higher quality cameras probably support brighter/darker scenes.

      First in-car dashcam test mostly successful. Camera video looks great when dashcam is disabled. Jerky with dashcam enabled (which is expected).
      Fixed: Camera/DashCam should now disconnect/reconnect when suspending/resuming.

      Added DashCam service. Enable/Disable through config.
      The DashCam service uses the clipboard (for now). So no other app is going to be able to use the clipboard while the DashCam service is enabled.
      Added Save button to Cam window. This will cause the camera to save an image to the DashCam image array, and then save the whole array to disk.

      New version released.

      SpeechCompleted is now handled through an event, instead of a timer.

      Added support for more than one ButtonBorder style (RoundRect). Added plain old boring Rect.
      WebCam now works with multiple displays (only one at a time). Still only supports a single Camera for now. (Bought a webcam.)

      Tree nodes in browser windows now collapse appropriately. Might remove this if it doesn't work properly.
      Standardized some object sizes across all frames.
      The import process now ensures that source folders exist before creating destination folders.
      Could create more separate timers (instead of a main UI timer) to reduce CPU usage.

      Importing of files is now handled in a background thread.
      Need to work on some kind of notification of completion. Or at least 'Files are Importing...' status/progress.
      Same with File Search.
      Re-worked the DrawRoundedRectangle function that handles RoundRect ButtonBorders. I still don't think they look right though. Probably due to fractional pixel measurements.

      100% done with skin for secondary monitor.
      The interface on the secondary monitor has all the functionality of the primary interface, minus OBD.
      Changes to the playlist are synchronized across the displays (through the skin).
      The default skin, when used with 2 monitors, currently creates 787 objects.

      90% done with skin for second monitor.

      80% done with skin for second monitor.
      Consolidated Skin files for BrowseImportSource and BrowseImportDestination.

      The ObjectArray used by the skinning system is now alpha-sorted, and searches are binary searches.
      This is probably a good idea, since the number of objects nearly doubled with the addition of the second monitor skin.
      Or, could use a type of bubble-sort and linear search, where most frequently used objects move toward the top of the array.

      Rewrote some of the gauge code, to better handle varying screen sizes. Tested on 1680x1050, 1920x1080, 800x600, and 800x480.
      75% done with skin for second monitor.

      Working on adding multiple-monitor support to the default skin.
      Toggling of FullScreenObjects now supports one full screen object per screen.
      Any object can can now have it's parent changed. So the video playback can be moved from one screen to another. In the default skin, double-click the empty video area to get the playback onto that screen.

      Separated some timers.

      Cleaned up some of the MsgBox code.

      File-Searches are now handled in a background thread.
      Lyrics search is now smarter. Returns fewer incorrect results.

      Re-wrote most of the Updater, which installs a new version from another drive.
      The new updater is a definite improvement, as the NEW version handles the actual updating process.
      Modified the 'speak' text for the alerts page, so that the program can now read all of the alerts aloud, instead of just one at a time.
      The buttons for Lyics and Pandora now dim and un-dim appropriately.

      Bug-fixes. Lyrics work better.
      Changed target framework from 4.0 to 3.0. Tried 2.0, but it would have broken the speech-synthesizer.

      Automatic downloading of lyrics now implemented. Added a Lyrics button on the Media page.
      Added a dimmer button. It's now accessible through the button, or through the settings.
      Added a 'Speak' button to the Lyrics window. So now the program can read the lyrics aloud. I don't know why. But it's hilarious.

      The 'My Playlists' folder is now only added to the BrowseAudio and BrowseVideo windows. Not to the BrowseROMs or BrowseImages windows.
      Naturally, this is controlled in the skin now.
      Larger buttons on the home screen, and they are now slightly more spaced out.
      Pause-state is now restored correctly after closing and restarting the app. Tested and confirmed that combinations of Pause/Play and Shuffle/Repeat work correctly.
      Added a Lyrics API, accessing the database, which was created by Flavio González Vázquez.

      Added a CPU percentage bar (like Task-Manager's tray icon) to the status-icon area.
      I *THINK* that the webcam code might work again now. I no longer have a webcam to test with, until I buy one. Eventually it needs to be expanded for multiple cameras.

      Added variables for SystemCPUpct and AppCPUpct.

      Added some code for Yahoo Stocks API, since I'm also writing a stock-trade management program.

      Added a couple more commands. Made the slidelist management more like the playlist.
      The transitions that I added yesterday are a little jerky in my car. Added config setting to enable/disable Transitions.

      Added some simple transitions. Sliding objects into view. Up, Down, Left, Right, and Random.
      Added a SLEEP command in the transition loop, to keep CPU usage down a bit. Lost a little fluidity, but it's still good I think.

      The state of the PAUSE button is now saved.

      WaveOut-Volume and WaveOut-Mute are now handled in settings and in the app just like the WMP-Volume and WMP-Mute.

      Shuffle, Repeat, Play, and Pause, are now all indicated in one location on the NavBar. Prior to this, it only indicated Shuffle On/Off.
      Added some images.
      Map Type is now a configurable option. Streets or Hybrid. Street maps are smaller, so they download faster and use less data.

      Added Repeat button to Playlist window.

      Condensed some commands to use variables.

      Repeat works.

      Added image Nav_Back.
      Added command ExitIfObjectIsTopmost. Probably for use with a BACK button, so the BACK button does nothing if the Home frame is on top.

      Added AppEvent_Resumed.

      Shuffle works again. It functions correctly, and saves correctly. Didn't realize it was broken.
      Added support for REPEAT. This repeats the current media item. REPEAT overrides SHUFFLE if both are set.
      Or maybe setting one should un-set the other..?
      Fixed some issues with restoring the mute setting.

      Added more commands.

      New method for calculating Fuel Efficiency.

      Minor fixes due to major changes.

      Changed the format of the settings file. Now it's XML. Removed all INI code.
      For the moment, settings only save to disk when the program is closed.
      The program just might be fully unicode-compatible now. Maybe.

      Added some commands. ExitIfImageIsEmpty and ExitIfImageIsGrayed. This can be used, for example, to make the OBD interface inaccessible if there is no OBDconnection.
      Cleaned up some of the embedded-apps settings and skin interface.

      Added a simple Pandora interface. Really just a webbrowser that loads It works if your login info is stored in IE.
      The volume control in the Pandora frame is the WaveOut volume, which effects the entire system in WinXP, and just the entire app in Win7.

      Traffic Alerts are now also displayed on the StaticMap as red Markers, with severity rating (1 through 5).
      Scratch that. Instead of using numbered markers, it will use smaller color-coded markers (severity 2-3 = yellow, severity 4-5 = red)
      Fixed event AlertsChanged not being fired when Alerts expired.
      The default skin now uses unit-insensitive parameters for all variable-text objects.
      Added average fuel-efficiency and instant fuel-efficiency. Need to test.

      The PaintGauge command now draws an Arc for the required gauge travel, instead of drawing a complete circle.
      The StaticMap now uses Streets+Satellite (aka Hybrid) for map-style. Street maps are around 20k. Hybrid maps are around 100k.
      Modified OSK to accomodate two-state keyboard (upper and lower).
      Moved the background images into the default skin folder with the rest of the images.
      Added command AddWMPvolume for use with VolUp and VolDown buttons.
      Double-clicking the WebMap will now toggle the image full-screen.

      Decreased load-time a bit by using transparency and loading one background image instead of loading and scaling the same background image onto multiple frames.
      This might have also reduced memory consumption. Or maybe it did nothing for me at all. Time will tell.
      Added image NAV_TALK.png.
      Added some Text-To-Speech code. Through the skin, any object's text can be Spoken. Added to the 'Alerts' frame for now.
      Text-To-Speech automatically pauses all WMP objects, and restores their playstate after speaking is complete.
      If the program is currently Speaking, calling SpeakObjectText will simply stop all speech (and resume the media as necessary).
      Added event FormClosing just to handle ALT-F4 closing the form/app.
      Weather-Alert descriptions are now cleaned up for better speaking. Replacing WB with Westbound, FWY with Freeway, etc.
      Added SpeakText command, which simply says a string of text out loud. A skin can now say 'Goodbye' when closing, for example.
      Enabled Option Strict in modMP3. Cleaned up some code. Looks like everything still works.

      The Speedometer Gauge works again. Now through a generic PaintGauge command that can be used with all sorts of environment variables.
      The PaintGauge command does NOT compensate for WideScreen Stretch.
      The PaintGauge command COULD be used on a control that has an image (of a speedometer, for example). However, making everything line up correctly would take some work.
      Added commands for SendTopObjectToBack and HideTopObject (to potentially be used in a BACK button).
      Saving DVDs in the CurrentPlaylist file works again now.

      Broke and fixed SavePlaylistAsM3U.
      The 'My Playlists' folder is now automatically added to a TreeView when calling FillTreeWithRootPaths. Might move this to a separate function. We'll see.

      Added some code for power/battery status. Neat. Too bad I'll never need it.

      The program is now more tolerant of white-space in XML values.
      XML node names are now case-insensitive.

      Added "Eject Drives" to the Config interface. So now there's two ways to eject drives.
      Added Eject buttons to the BrowseAudioCDs and BrowseVideoDVDs frames. So, there's a lot of ways to eject a drive now.
      Added background image to the OSK. Just to try it.
      OSK Text now clears upon clicking ESC on the OSK.
      The fileformat of the CurrentPlaylist is now XML, so it supports unicode.
      The fileformat of the CurrentSlidelist is now XML, so it supports unicode.
      Added some variable paths that can be used like environment variables in the skins.

      Double-clicking on the slideshow image will now toggle it full-screen.
      Identified and fixed a couple of transparency issues.
      MediaArt image is no longer forced to a transparent background after the first image is shown. The original backcolor is now preserved.
      Same as above for Slideshow image.
      Transparency and Translucency seem to work great.
      Check-Engine light works again now (on NavBar and OBDinfo). The OBD service now queries the engine codes once every 8 seconds.
      Clear-Codes works again now.
      Moved the volume controls to the Visualization frame.
      Added Play/Pause buttons to the Visualization frame.
      Added media Position / Duration display to the Visualization frame.
      Visualization window is now way better than ever.
      All of the images in the default skin use transparency now.
      Added an X button to the CurrentPlaylist frame, to clear the current playlist. Needed this for a long time.

      Came up with a way to control which OBD PIDs the program queries through the skin commands.
      The Vehicle page now always displays page 1 when opened, instead of staying on the page last viewed. This is to maintain control of which PIDs are being queried.
      Debug mode allows more testing of functions now.
      More of the user interface (status icons, speed) is event-driven, instead of polling.
      Removed all multi-column lists. Replaced with individual LABEL objects, which can auto-size the text individually. Awesome.
      SlideShow works again now. Better than ever.
      Moved some buttons around on the interface. It's easy now that it's skinned. The CurrentPlaylist button is now on the main screen.

      Fixed some places where sorting was missing from file-arrays and folder-arrays.
      Fixed arrows for TextAlerts not refreshing.
      The program loads slightly faster now, as the initial GetAlerts call is no longer part of the main thread.
      Added AppEvent_SpeedChanged. Much slicker than polling. Will probably add a few more events.

      The new Maps icon is enabled/disabled with the Internet Status icon now.
      Overriding the automatic dimmer works again now.
      Much more efficient SetObjectText function, parsing text for variables instead of performing 30+ unnecessary calculations and replacements.
      Using a long-click to add media items to an empty playlist now results in the playlist starting to play.
      Fixed SkinReload.

      Removing items from the playlist works again now.
      Fixed some TreeView issues by populating the corresponding ListView BEFORE expanding the TreeView node.
      TaskBar Icon displays correctly again now.

      GPStrail works again now.
      Removed unnecessary event GOTFOCUS. Yay!
      Modified Debug_MsgBox function to accomodate multiple forms/screens. The MsgBox (for the Update prompt) is now forced to display on the default desktop.

      Added a new event called MOUSEDOWN_LONG for long-holds (3 seconds or more). It's not a perfect solution, but it creates some new ideas.
      Now, doing a long-hold on a folder/playlist in the BrowseAudio tree will add that folder to the playlist.
      Added some new google maps code.
      Added the ability to define a SCREEN index for a form in the skin xml, or define an absolute position from which the corresponding screen will be calculated.

      Fixed Search-Results so treenode no longer clears upon collapsing the node.

      KeepOnTop works again now.
      Suspend/Resume works again now.
      Update-Detector works again now.

      More fixes. WMP events now work in x64. Had to switch to x86 compiling.
      Trees work properly again now.

      Cleaned up lots of minor interface glitches in the new DefaultSkin in preparation of a new release build.
      Still many weeks away though.

      Combined the GPS Driving Stats and OBD Driving Stats into just Driving Stats. No reason for both.
      Removed OBD page listing O2 sensor info for all cylinders.

      Added new interface for ejecting drives. Currently only supports optical drives (no ejecting or 'safely removing' USB drives yet).

      All objects (including the form) have been removed from the program. Everything is now created dynamically through XML.

      Removed some unused/unnecessary variables and functions.
      More skinning stuff.

      The Alerts window now places the WeatherAlerts and TrafficAlerts nodes under the location node. In the future, this will support multiple stored locations as well as the current GPS location.
      Added Prev and Next arrows to the Slideshow interface. Clicking on the left/right side of the image still works to go forward or backwards.
      Added support for controlling Border style through the Skin XML files (FRAMESTYLE can equal: False, True, or 3D).
      Borders seem to draw a bit differently between WindowsXP and Windows7.
      Closing an embedded app now returns the user to the APPS window to select a different app or return to the main window.

      ROMs interface now implemented and functional. Only one emu can be embedded at a time. I think this is fair.
      The front-end executes the emulator EXE, with the parameter set to the DOS-style filename of the ROM to load, and embeds it similar to the EmbeddedApps.
      Closing the embedded emulator (with the X button) unembeds the emulator and closes it, and then loads the 'BrowseROMs' window. The user can choose a new ROM, or cancel.
      'Search' functionality now works with ROMs, just like audio and video.
      Fixed UTF-16 support in modMP3.
      Removed all FileNum code from modMP3.
      Fixed a bug in filename-cleansing code.

      Added an 'X' button to the EmbeddedApps window, to close an embedded app.
      Added an 'X' button to the EMU window, to close an embedded emulator.
      Changed the 'ROMs' icon to be a 1-up mushroom for now, instead of a game controller, due to visibility.
      Added 'KeepOnTop' setting to the config, instead of just hard-coding this setting in the program.

      Changed the layout of the EmbeddedApps window to accommodate additional buttons.
      Same as above for the EMU window.
      The OSK is the final frame that does not conform to my first real attempt at a skinning implementation.
      Arrow images now no longer refresh during mouse-down, but do at mouse-up. This was done to reduce some code.

      Fixed Speedometer not updating with displayed speed in debug mode (was one drawing-cycle behind).
      The browser window no longer jumps to the currently playing media. Instead, it just jumps back to the last place you browsed to.

      The current playlist can now be a mix of audio and video files.
      Changed the interface to make the playlist creation and functionality more obvious.

      Split the different 'Browser' interfaces into separate objects.
      This is part of a larger plan to remove all of the objects from the form, and create them dynamically, and assign handlers to each.
      This should eventually help with the way I want to implement multiple-monitor support.

      Paths and filenames specified in the skin files support relative paths (..\ and .\) as well as environment-variables (%SystemPath%, %ProgramFiles%, etc).

      Implemented Position/Size-Scaling for all images. This should prevent image stretching.
      Button borders are now a fixed thickness.

      09-01-2010 thru 09-04-2010:
      Massive changes. The interface frames are now controlled by skin XML files, which control: object positions and sizes (absolute or percentage), images, background and foregrounds colors (By RGB, ARGB, or known-color-name), fonts, and text.
      The skinning system, while still new, is fairly flexible and recursive. 2000+ lines of code REMOVED.
      The Visualization now uses a fixed size for zooming artwork.
      The speedometer color is now specified in the skin xml as the object FORECOLOR.
      The program now auto-sizes the TrackName in the NavBar to fit the entire title. We'll see if this is a good idea or a bad idea.
      The Import frame no longer uses actual buttons. The entire program contains no real command-buttons. Just clickable images. For whatever reason.

      Changed the Config interface to use a tree structure for settings, instead of just a long list.
      Separated the Personalization Image from the Skin settings.

      Separated internet api code from modDriveline into modWebAPI_Google and modWebAPI_Yahoo.

      Reduced some file sizes.

      Added speedometer gauge to Main window. Click the personalization image to toggle between a semi-transparent guage-style speedometer and the personalization image. For now, the gauge uses the GPSspeed color.
      If a media file in the playlist cannot be played by WindowsMediaPlayer, the program will move on to the next media file in the playlist.
      OSK keys are now transparent. Skin settings now allow the OSK to have a background image.

      Added transparency to some of the DefaultSkin images where it was lacking.
      Fixed a bug in the button-borders, where changing the button border color from Transparent to non-transparent would corrupt some of the images. Solution: Reload the whole skin.
      Now, the program looks OK even with transparent button borders.
      Added skin settings and transparency to the Apps frame.

      Fixed modOGG that I broke yesterday.

      All images are now PNGs. All personalization images have transparency now.
      When changing skins, the program now resets the background images accordingly.
      The GTPskin now illustrates some basic skinning (using background images).

      Reduced code and INI structure for MusicExtensions and VideoExtensions.
      The area outside of a button border is now forced to transparent. Any transparent pixel inside of a button border is forced to the background color of the frame.
      The visualization window now supports full-screen visualization for audio and video, instead of just video. Just double-click to toggle.

      Code cleanup. Skin cleanup.
      Consolidated GPS_ClearStats and Vehicle_ClearStats into one image.
      Clearing the entire playlist now resets the Shuffle setting to False.
      The Prev and Next buttons on the NavBar now disable (gray) when no media is playing.
      The program no longer allows the saving of an empty playlist.

      Added new module - modM4A.
      The program can now read tags in .M4A, .M4V, and .MP4 files.
      The program can now display artwork from .M4A and .MP4 files.
      Added .M4A to the default audio extensions.
      Fixed auto-dimmer not always auto-dimming. Most likely broken in the previous update.

      In debug mode, the program now displays a random speed every second, unless an actual GPS or OBD device is connected.
      Fixed a bug in the updater, where it would not create new directories.

      Added transparency support to the Personalization image and the NavBar images.
      So now images will display with transparency over background images.
      New CheckEngine / ClearCodes icon to better accomodate transparency and replace language-specific icon (contained the word 'CHECK').

      Added new module - modOGG.
      The program can now read Tags in .OGG files.
      Added new module - modASF.
      The program can now read Tags in .WMA, .WMV, and .ASF files.
      Fixed a bug that prevented a new playlist from starting correctly.

      Fixed video playback not playing full screen.
      Fixed a browser-refresh error.

      Updated the screenshots and text for the GettingStarted HTML.
      Fixed SlideShow not loading new imagelist immediately (it was waiting one image cycle).

      New icons for SavePlaylist and WebBrowser OSK (not yet exposed) that match the other buttons.
      Added City,State,ZIP,Country to Weather/Traffic alerts.
      No more underline for OBD speed. Now separate colors for OBDspeed or GPSspeed. The underline looked like crap with the units overlayed.

      New default OBD icon.
      Added OBD icon to the NavBar. Now, the OBD icon will be displayed (enabled or disabled). If the OBD is connected and there are any engine-codes set, the icon will change to CheckEngine.
      It is possible for an engine-code to be set but not illuminate the vehicle's CheckEngine light on the dashboard. The CheckEngine icon will display if there are any engine-codes, regardless of the light on the dashboard.

      The paths for Logs and Playlists are now configurable in the DriveLine.INI file. This way, these paths can point to a secondary drive.
      The default for HideCursor is now False. The user can change it to True when they are ready.
      More Browser tweaks. Fixed a slow-down in displaying the Browser Window.

      In preparation for an integrated web browser, the program now includes an InternetExplorer object. PCs without IE installed may encounter an error.

      Changed the OSK to respond to MouseDown instead of MouseUp.
      Fixed (for now) a bug in the CurrPlaylist_PlayItem function that could cause a media item to not start playing when the program loaded.
      Added more images: Home and OSK.
      Reduced some code. Especially the SetCurrentFrame function.

      Added Search functionality. Searching for a string will create a 'Search Results' folder in the Browser Tree, and results (files and folders) will be listed there, just like a regular folder.
      The new Search functionality does not currently search within files / tags.
      Added new image: Search.

      Fixed a bug in the Browser when jumping to the CurrentMedia's folder.

      Added an image for Search/Find functionality.
      Cleaned up some auto-font-sizing code. Cleaner, more efficient.
      Removed Auto-Sizing label. Replaced with Graphics code to determine text size.
      Removed module modFonts.
      The progress bars can now display a gradient progress bar.

      Cleaned up the coloring code, so it now uses Color objects instead of integers.
      The color settings in the INI file can now specify opacity using the format A,R,G,B.
      Changed the Speed display in the NavBar to use an image instead of a label. The Speed Unit is now smaller than the Speed and Bearing, and is now semi-transparent.
      Changed the Time display in the NavBar to use an image instead of a label. The AM/PM is now smaller than the numeric Time, and is now semi-transparent.
      The user probably knows if it is AM or PM, and what unit their speed is being measured in (speed unit is an option in the config).
      For the moment, the program no longer indicates if the current speed is being read from GPS or OBD.

      Removed TrackTime and TrackNum in NavBar.
      Increased number of visible rows in Browser from 4 to 4.5, thanks to a slimmer NavBar
      Changed default color for Time and Speed to Green.
      Rewrote the code that checks the time for the Auto-Dimmer. No more storing Time as a String. Ugly shameful code removed.

      Added period to default OSK.
      Made the NavBar slimmer.
      Decreased number of rows in the NavBar from 3 to 2.
      Added status-icons for GPS-Fix, CheckEngine, InternetConnection, Alerts, Shuffle.
      Without the status icons, the user would need to go into many different sections of the interface to determine the status of these conditions.
      Added an image for InternetConnectivity, used for the status icons.

      GPS Bearing will not update unless speed is greather than 2 knots. This is to prevent the directional-arrow (compass) from pointing randomly when stopped.
      Changed some drawing code to remove the flicker from the VolumeBar and MediaProgressBar.
      The 'Save' button (ie the FloppyDisk button) now presents the user with an On-Screen-Keyboard and a prompt to save the current playlist into a special 'Playlists' folder as an M3U file.

      The GPStrail now draws the current position as a 'delta' style arrow, pointing in the direction of the current bearing.
      Now testing a different scrolling method for the PlayList ListView.
      Slightly smarter cleansing of filenames. TitleCasing will not be applied to names that contain periods (acronyms, F.O.D, B.Y.O.B, etc).

      The GPStrail now draws each segment in a different color, based on speed. 0-5 mph = MAGENTA, 5-20 mph = ORANGERED, 20-45 mph = YELLOW, 45-65 mph = LIME, 65-85 mph = WHITE, 85+ mph = CYAN.
      Another idea is to use different shades of the same color.

      Definitely fixed GPS trail adding bad Lat/Lon after resuming from Suspend/Hibernate. The issue involved receiving a GPS sentence that claimed to have a satelite fix, but accurate Lat/Lon had not been received yet.
      Cleaned up some Suspend/Resume code and WMP code.
      Event-Driven code is sometimes not straight-forward at all when an event in an object needs to trigger a method in that object (which could raise other events in the object), but the original event isn't done processing yet.

      Modified the GPS data-processing function, to ignore most GPS sentences for the moment. Since GPRMC is the only one that sends Position AND Fix in one sentence, we'll focus on that one.
      Upgraded to VB.Net 2010. .Net Framework 4.0

      Removed all 'On Error...' statements. Replaced with Try...Catch or just removed.
      Possibly fixed GPS trail adding bad Lat/Lon after resuming from Suspend/Hibernate.... NOPE. Still happens occasionally.

      Fixed a bug where title-casing was being applied (to all-lower-case folder names) AFTER trimming the text to fit in the Browser TreeView. This could cause the text to get wider and make a scrollbar appear.
      Reduced memory usage of some Font and TreeView functions.

      Fixed issue with Prev/Next buttons generating an error when no media is loaded.
      Cleaned up some File functions, to not use error-generation as a normal condition. In other words, make sure the file exists before trying to open it and trapping an error.

      More bug fixes.
      Finally got the Browser performing the way I want, and with the speed I want.

      Cleaned up some suspend/resume code.
      Changed some objects being passed ByRef to ByVal.
      Fixed an issue with creating a new playlist, where the new playlist did not start playing until the cursor moved.
      Fixed a display issue with folders containing only a single media file.
      Bug fixes. More clean-up.

      The program now extracts ID3 (v1 and v2) tag info from MP3 files.

      Added a second TreeView control to the Browser window, which is now used for the Settings window and Alerts window.
      This way, the TreeView for the folder browser doesn't neeed to be cleared/refreshed.

      Fixed a bug where the TreeView for the Browser was not clearing when displaying the Browse_Config and Browse_Alerts frames.

      Cleaned up some of the SlideShow code.

      Added removal of numeric columns to the functions that cleanse the file arrays.
      Added better support for single files to the functions that cleanse the file arrays.
      Much better filename cleansing all around.
      Fixing things that I've broken in the last week.
      Removed some global variables.
      Fixed a bug that was clearing the Browser treeview unnecessarily, slowing down the Browser window's load time considerably.

      Added 7 more personalization images.

      Fixed media resetting when resuming from suspend (broken recently due to playlist overhaul).

      Added 11 more personalization images.

      Changed album art code slightly to handle MP3 files with empty/invalid images.
      The internal playlist format now tracks the originating playlist of every item in the current playlist.
      Better handling of Audio CDs.
      Added 'Eject' image, but not using it yet.

      Fixed a bug with folders that contain just one media file, where the media file name being displayed was shortened to just one word every time.
      Fixed visualization size error with non-mp3 audio.
      Rewrote all of the playlist handling. Not using WMP to manage the playlist anymore. Huge change.
      The PlayList window now lists clean filenames instead of long filenames.

      Updated screenshots for the GettingStarted file.

      The Updater will now only update a file if the 'new' file is actually dated newer than the current file.
      Fixed a GPS bug, where the fix was probably expiring unnecessarily.
      Best version yet.

      Added MUTE option. Click on the speaker icon (below the volume bar) to mute/unmute the volume. Again, this is controlling WMP volume, not Windows Mixer volume.
      The settings INI file now includes the mute setting.
      Cleaned up shuffle code a little.
      The Updater will now update subfolders (if present), but will skip the DriveLine settings files (DriveLine.INI, DriveLine.PlayList, DriveLine.SlideList)
      This will reduce the need for most manual re-installs.
      Fixed some broken code involving album art.
      Corrected the GettingStarted file displaying the wrong image for OBD Page 3.
      The GPSinfo and OBDinfo frames now match the same layout as the Browser and PlayList frames, in terms of button size and positioning.

      The program will no longer check for data on a port if the port is set to DISABLED.
      GPS COMM Buffer is now a StringBuilder instead of a String, to reduce memory usage.

      Reverted the change to the Check-Engine-Light being Enabled/Disabled. It will only be visible when codes are present.
      Added 'Logging Enabled' option to toggle logging.
      Logging changed (for now) to only log events (StartUp, Suspend, OnlineChanged, NumOBDcodesChanged, NewVersionInstalled, etc).
      Reduced memory usage.
      Added Shuffle option to the Playlist window.
      The internal playlist fileformat now includes the SHUFFLE setting.
      Added volume control to the Playlist window. This controls the Media Player volume. Not the Windows Mixer volume controls.
      The settings INI file now includes the volume setting.
      FULL REINSTALL REQUIRED. (due to new volume icon and some skin clean-up)

      Added 'Run At StartUp' option to add or remove the program from the registry RUN key.

      Check-Engine-Light button now appears as Enabled/Disabled, instead of Visible/Invisible. It's location is now the same as the Stats-Refresh button.

      Fixed an issue with Time formatting displaying 12:00am incorrectly.

      The program now pre-populates the TreeView when the program loads.
      Folders marked as HIDDEN or SYSTEM will no longer be displayed in the Browser.
      Fixed the Import interface not displaying all root folders.
      Fixed Traffic Alerts not updating due to commented code.
      Rewrote some code that controls populating the Browser TreeView. Better functionality all around. Still complex though.

      Cleaned up the images for the Main_Exit button and Exit_Shutdown button.
      Tweaked the graying of the arrows for the ListView control.
      Fixed GPS not reconnecting after resuming from Hibernate/Suspend. Broke this a few days ago.
      Implemented a bunch of 'AndAlso' and 'OrElse' conditions to try to make the code more efficient.

      The button for clearing the Check-Engine-Light now works as expected.

      Cleaned up the code that handles the click event in the TreeView.
      Fixed some Check-Engine code that wasn't working, since I suddenly have a misfire.
      The program now correctly indicates the Check-Engine-Light status, and the number of codes.

      Closing an embedded app will now only re-connect the GPS or OBD if necessary (instead of every time an embedded app was closed).
      Cleaned up (slightly) the browser code that selects the current folder and file.
      Added *.PNG to the function that checks for album art.

      Fixed an issue with persistent embedded apps being re-loaded instead of just persisting.

      Removed CopyMemory calls from modWinAPI, modCOMM, and modMixer.

      Fixed a memory-leak in the SlideShow functions. GarbageCollection would have cleaned it up, but I'd rather not waste resources to begin with.

      New code to clean up file-lists, removing unnecessary columns, etc.
      Removed file modArrays.
      If a playlist includes files that do not exist, those non-existant files will not be shown or added to the current playlist.

      Buttons on the Browse window now match the same size as the rest of the interface.
      When an item is removed from the playlist, the item below it will be selected, instead of selecting nothing after removing an item.
      Images that can be grayed/disabled:
      MainVisualization, MainGPS, MainCamera, MainOBD
      PlayListArrows, PlayListRemove

      Cleaned up some of the WideScreen-Compensation code.

      Cleaned up new code for borders and grayed images.
      Cleaned up some images. New image for the SlideShow button.

      Removed the colored border from all of the default skin button images. The border is now drawn dynamically, and the color can now be controlled through the Config interface.
      I hope this doesn't prove to be a bad idea.
      Completely re-wrote some of the image loading procedures to accomodate graying of images when features are disabled.
      Buttons will now automatically gray themselves if disabled. For example, the UP arrow will disable if the user cannot scroll up any further.
      Image-Graying and actual disabling of functionality are completely disconnected from eachother.

      GPSroute variables renamed to GPStrail. Makes more sense since it doesn't know where you're going, but it knows where you've been.
      Added some code to prevent unnecessary redraw/flicker of GPStrail when current position hadn't changed.

      Fixed an issue involving killing the process of an embedded app.

      Added a few more Personalization images.

      Fixed small (invisible) bug in MP3 APIC code, which was reading one extra byte of image data.
      Replaced some API calls with non-API code. Removed CopyMemory functions from modMP3 and modDisplay.

      Replaced all hIcon code with managed .Net code using the Icon object.

      GPS-Fix now expires after 5 seconds of no GPS data. Seems like a good idea.

      Tweaks to the new GPS Route page.

      Fixed an issue where the button to clear OBD stats didn't do anything.
      The program now disappears from the screen sooner when clicking the Exit button.
      Added a third page to the GPS info, which draws a route as you drive. Fun programming experiment here. This kind of turns your vehicle into an etch-a-sketch.

      Fixed an issue where a new playlist would be started, but the wrong track number would display.
      Fixed an issue where adding a folder to an empty playlist failed to start playing.

      Fixed an issue where appending a playlist file to the current playlist would clear the current playlist before adding the new items.

      Adding an item to a blank playlist will now start it Playing.

      Added progress-bar to the Visualization screen (below the actual visualization/video). This can be clicked on to navigate the current media.
      Added skin settings for the Visualization screen. Not sure how I overlooked this.
      Changed the Visualization window to keep the NavBar at the bottom when playing video. The double-click on the video wasn't working properly.
      The Playlist window no longer displays file extensions.
      The Browser list no longer displays file extensions.
      The NavBar text no long displays file extensions.

      Added new option 'WideScreen'. This will stretch an image to compensate for a 16:9 display that has a 4:3 resolution.
      The WideScreen option only adjusts the Personalization Image, Album Art, and SlideShow Images (for now).
      Fixed an issue where the Internet Connection Status was not being displayed if there was no Playlist playing.
      Fixed an issue where the SlideShow File Browser would display the directory tree incorrectly when displaying the current image file.
      Updated the 'Getting Started' images and HTML file to reflect new images and new functionality.

      Added 'Disabled' option to GPS Comm Port and OBD Comm Port.

      Personalization images converted to JPG to save on space.

      Removed some unused functions and API calls.
      So far, I find the 'Flick' thing to be useless in a car. Just a novelty and a brief programming experiment.
      Set the Personalization image to scale and preserve aspsect ratio, instead of stretching.
      Changed the position/size of the Personalization image, just a little.
      New icons for the Exit window.
      Added a Minimize button to the Exit window. New image means skin changes, which means REINSTALL REQUIRED. But it's worth it.
      One of my goals is to use images with as few words on them as possible. I prefer images with obvious (or at least intuitive) functions.
      Minimize will unhide the Taskbar if it is hidden, and will re-hide it when the program window is restored.
      Added 60 'skins'. Really just pre-packaged personalization images for different vehicle brands. The only difference between them is the Personalization image.
      The program icon now appears in the taskbar. Can't recall why this was disabled.

      Changed how the Playlist window works. Instead of refreshing every time it is opened, it is now updated with each update to the current playlist.
      The Playlist window now automatically highlights the track that is currently being played.
      Fixed a bug that was causing blank Log files to be generated when logging was disabled.
      Cleaned up some mouse code. Now most 'buttons' respond to the MouseUp event, instead of MouseDown or Click.
      Added basic 'Flick' scrolling (like an iPhone) to the playlist window. Flick the list up or down.

      Under-the-hood tweaks.
      Removed all Visual Basic VB6 compatibility references. Now the lamest reference is Media Player.

      Added default values for every setting.
      Removed some skin settings involving FontSize. The default was auto-size. Now it's always auto-size. No more option.

      Replaced the CONFIG window interface with one that matches the BROWSE window. This was done to accommodate more settings, and also to skin the CONFIG window itself like the BROWSE window.
      Removed the ImageExtensions block from the Settings file. Image Extensions now hard-coded: JPG, JPEG, PNG, BMP, GIF, TIF, WMF, EMF
      The program now has an option to hide the cursor when the cursor is over the window of the program. No more moving the cursor to the corner (except right at startup).
      The program now has an option to hide the tasbar.
      Hiding the Cursor and hiding the TaskBar do not happen in DEBUG mode.
      Fixed a permissions issue with the TimeOfDay.

      Updated some of the Getting Started images.

      Added a basic Playlist editor. It allows the user to navigate/modify the current playlist.

      Fixed a bug in new DATETIME code for GPS, where 59.5 seconds was being rounded to 60 and generating an error. Sounds familiar.
      Enhanced logging a little bit.
      Choosing to play a folder (or song in a folder) will only add song files (instead of song files and playlist files) to the current playlist.
      Created OBDstats similar to GPSstats info. This is now page 2 of the OBD info.

      Rewrote all code dealing with date/time, to now use managed .Net DateTime objects.
      No more crazy SYSTEMTIME and LOCALTIME structures and API.
      No more storing/passing dates and times in strings either.

      Added logging. The log file is written in memory until the size reaches a specified threshold, at which time it is written to a file.
      If logging is enabled, a new log file is created every time the program is restarted or the program resumes from suspend.
      Logged fields: Date, Time, Latitude, Longitude, Speed, Bearing, Internet Connection status.

      Fixed some of the new INI code.

      The program used to clear the TreeView and ListView in the Browser window every time the Browser window was opened.
      Now, when opening the file browser, if the folder containing the currently playing media was browsed to previously, the program will just jump to it.
      If the media type is different, or the folder containing the media was not previously browsed, the TreeView and ListView will clear and repopulate.
      This should remove the possibility of lag when switching to the Browser window. There's better ways, but this works fairly well for now.
      The update scanner will now only scan removable drives, including optical drives, USB drives, memory cards.
      (contemplating new browser interface with single-folder view, and an 'up one folder' button (more like a CommonDialog than Explorer).
      (also contemplating a thin bar at the top, with date, time, an icon for alerts, an icon for internet connectivity, an icon for GPS fix).

      Added support for default values to the new INI functions.
      Added some code to maintain backwards compatibilty with the older skin images.

      Added support for a background image on each frame.
      Images can now be any standard image type (PNG, BMP, JPG, GIF, TIF, WMF, EMF). Image filenames are now specified in the skin.ini file.
      DriveLine default GTP skin changed to use .PNG images.
      Clean install recommended.

      Removed all legacy code involving INI files. Replaced with very basic INI read/write functions using managed File IO.
      Might switch to XML someday, for unicode support.

      Removed all legacy code involving GetTickCount API. Now using the .Net DateTime object.
      Removed all legacy code involving INET. Now using the .Net WebClient and WebRequest objects.
      Removed some DoEvents. Replaced with refreshing certain GUI objects in some instances, or Thread.Sleep in others.

      Removed all legacy code involving Processes (for embedding apps). Now using the .Net Process object.

      Removed all legacy code involving File/Drive/Directory processing and File IO. Now using .Net IO object.
      Changed some of the .BAT code in the Updater.

      Some new icons.
      The personalization image now defaults to Main_Personalization.GIF first, and then Main_Personalization.BMP if no .GIF is present. This is for animated GIF support.
      Added Fuel System Status to page 2 of OBD info.

      Added a third page of OBD info. This page lists O2 sensor information (voltage and trim) for each cylinder (if available).

      Scanning for updates is now handled by a separate thread.
      The 'reset' button for clearing engine codes is now only visible if there are actually trouble-codes stored.
      Double-clicking the 'reset' button for clearing engine codes will now prompt the user to confirm before clearing codes.
      The form now stays OnTop. I left this off for a long time for debugging.
      Re-wrote much of the code for finding the main HWND of a process, again.
      Removed a timer.

      Added 'media inserted' detection, which for now only triggers the program to scan for updates.
      Cleaned up some interface code. Still ugly code though. Trying to standardize font auto-sizing.
      There's got to be another way. Need a better plan.
      Experimenting with threading. The internet-refresh code is now handled by a separate thread. So far, so good.
      Fixed a minor issue with treeview nodes colapsing and not updating.

      Changed the Folder Import code to copy the file bytes manually, in order to free more processing and bandwidth during the copying.
      Otherwise, copying from a thumbdrive to a thumbdrive which contains the currently playing media was causing the media to skip/lag.
      Still need to test this to see if it actually helps. Also, considering moving this code into a different thread.

      Modified the GPS and OBD interfaces to both be 2-page interfaces with prev/next buttons and a 'reset' button.
      By having fewer values on the OBD screen, the refresh-rate is increased.

      Changed cursor-hiding code to move the cursor to the bottom-left instead of bottom-right.
      Changed code for calculating font dimensions from old VB6 code to managed .Net code.
      Changed some file-access code to managed .Net code
      Added .Net code for ejecting an optical drive.
      Added .Net code for downloading a file from the internet.
      Changed some functions to .Net code, but many will remain low-level for the sake of speed and control.

      Cleaned up SongArt code, MP3 file access in modMP3.
      Cleaned up function names and variable names in modDriveLine.

      Added support for displaying Song-Art/Album-Art from ID3v2 tags. The image is displayed in the Visualization window.
      If the MP3 contains multiple images, only the first is displayed (for now).
      Due to some inconsistencies in the way software stores the APIC frame in the .MP3 file, I had to tweak the way this frame is handled.
      In other words, there could be more to this later on, as I get to test more .MP3 files.

      Split DriveLine into 2 programs. They are 'DriveLine.Net' and 'DriveLine 3.0'. The difference is DriveLine.Net is 1 program. DriveLine 3.0 is plug-in based.
      All of the independent modules are shared between the two programs.
      The source code for both will be included for a while.

      Completely changed the GetTickCount code. This should prevent issues with some counters failing after 25 days without a reboot.
      Cleaned up modules, removed dependencies.
      The form is getting a little messy, with my attempts to implement a plugin interface..
      Possibly reduced the CPU usage when viewing the OBD interface.

      Fixed an issue with embedded apps, where the app icon would not be scaled if an external image was specified but did not exist.
      Fixed an issue with persistent embedded apps, where the front-end would think the embedded app had been unembedded.
      Modified the function for finding the main window handle of a process.
      Plug-Ins are coming...

      Moved code to VB.Net 2008.
      Fixed GPS Speed display (oops).
      Possibly fixed an issue displaying time (thanks to TheCustomizer).

      Added module modMP3 to the project.
      Removed OBD info fields Throttle Position and Check Engine. Check Engine will be replaced with a more thorough diagnostic interface. Throttle Pos was kind of useless.
      Added MAF Flow to OBD fields. It was already being monitored for MPG, so it might as well be displayed. For now anyway.
      Fixed speed display for GPS.

      Split modCarPC_Generic into separate modules for Arrays, COMM, Cursor, Display, Files, Fonts, GPS, Icons, INet, INI, Keyboard, Math, MCI, Mixer, OBD, Playlists, Processes, Registry, Strings, VideoCap, and WinAPI.
      This is in preparation for a more plugin-based interface.

      Changed Display_RestoreGammaRamp function to use 50% brightness to build gamma ramp, instead of using stored array. This is kind of a test.
      Considering a plug-in based interface, and splitting this program into roughly 8 separate components.
      Cleaned up OBD initialization. Function fails much sooner now if no OBD device available.

      Fixed an issue with the Config window, where the Dimmer status was not being updated (would display ON when OFF, or OFF when on).

      Fixed a small bug, where GPS window would show OBD speed if available.
      Updated the 'GettingStarted' documents and images.

      Cleaned up dimmer code.

      If OBD speed is being used, the Speed/Bearing will be underlined.

      The program will now prefer OBD-Speed (if available) over GPS-Speed if OBD data is less than 1 second old.
      Modified display text from "No GPS" to "No Speed" when neither GPS or OBD is present.

      Added support for embedding Apps which require the OBD port. Similar to the GPS.
      Added OBD support. Still testing.

      Fixed an issue with the dimmer not resetting when coming out of hibernate.
      Working on OBD.

      Fixed an issue with the conversion from GMT to local time, where the wrong time would be displayed if the input time seconds was between 59.5 and 59.9999. Obviously, a rounding error.

      Added seconds to the time display on the GPSinfo frame. It's normal for seconds to be skipped, which is probably why I chose to not display the seconds in the first place.
      Added support for version 3.0 of the NMEA sentence spec, and sentence $GPGLL.
      Removed all MSCOMM code. Replaced with Win32 FileAPI code to access COMM Port. So the MSCOMM COM Object is no longer required.
      Basically, there are 3 ways to access the COMM ports:
      1. Use the old MSCOMM object (a COM object). This is event-driven. I think I had issues getting this to work under Vista64.
      2. Use the Win32API and File functions. Setting this up to be event-driven is difficult, so it will be polling-based instead.
      3. Use the new System.IO.Ports.SerialPort class in Visual Studio 2005 and later. This is event-driven.
      Method # 3 is what I want to use, but the program will crash if a USB-Serial (most GPS and OBD) device is disconnected while running.
      So, method # 2 is what is now in place. The code for method # 3 is in place, but not used.

      Upgraded all code to VB.Net 2005. Option Explicit, Option Strict.
      Modified auto-updater to copy all files from source folder (EXE and DLLs).

      Removed the option for Horizontal Browser Split. Vertical is the way to go.
      Moved the RefreshInternet call into a separate timer.
      Corrected and clarified some code around the main timer and the interval.
      Added scrolling acceleration to the ListView (the bottom box of the Browser window).
      Reordered steps for setting current frame. Frames are now initialized before they are visible.

      Alerts now expire after 60 minutes.

      Fixed an error in the conversion from GMT date/time to local date/time.
      Fixed an error in the conversion of Longitude from DegsMinsSecs to Degs
      Added TimeStamps to Traffic Alerts.
      Alerts spanning multiple days now list the date-range.
      Alerts that expire today will list no date, only time-range.
      Added scrolling acceleration. The scroll-speed of the treeview doubles after 5 lines of scrolling.

      Decreased precision of Bearing. No more NNW, WNW, etc. Now just N, NW, W, SW, S, SE, E, NE.
      Modified the internet detection code. Now it queries a URL to confirm online status.
      Internet detection is refreshed every 30 seconds now (instead of every second).
      Tweaked the weather/traffic updates.

      Added Weather and Traffic alerts under the Media Browser.

      Fixed an issue with the SlideShow Browser, where clicking a folder in the Listview would cause an error if the folder contained no images.
      Added functionality to the visualization window. Clicking on album art will now iterate through all images in the current media directory.
      Added BMP and JPG code into generic CarPC module. Probably didn't need to at this point.

      Changed the album-art code to check for images containing the word "front" and if found, use that image first.

      Added 'Copy Folder' functionality under the Media Browser. Copy the folder and contents, or just the contents, to another folder.

      Modified the filename cleansing to also be able to remove repeated info from the end of filenames (album year, group names like h8me, whatever).

      Fixed an issue with the ShutDown procedure, which would crash the program instead of shutting down the PC.
      Tweaked the GPS Statistics code to compensate for hibernate/suspend.

      Changed the method of calculating average speeds.
      Changed the default unit within the program to KM. Using Knots was a pain for calculating averages.
      Fixed an issue with a date calculation function.
      Considering abandoning the GetTickCount function to avoid a potential overflow error after 49 days of not rebooting. Could be 25 days.

      Changed the GPS Info window to a 2-page interface. One with basic GPS data, and one with derived GPS statistics.
      GPS Stats Include: Avg Moving Speed, Avg Overall Speed, Time Moving, Time Stopped, Peak Speed, Trip Meter, and Launch.

      Modified the function that cleans up the filenames. Now, the underscore character is replaced with the space character.
      Also, the period character (except for the last one in the filename) is replaced with the space character.

      Fixed a minor issue with the ListView for the FileList, where a click in empty space (below the last item) was treated like a click on the selected item in the list.
      Adjusted the TreeView Text Truncation by a few pixels.
      Still considering removing the TreeView, and potentially trying to use a ListView in it's place.

      Fixed a type-o which would prevent the user from browsing for images for a slideshow.

      Code Clean-Up. Made a few functions faster.

      Fixed an issue where the visualization would remain full-screen after playing a video file, even if the next file was an audio file.
      Fixed the filename cleansing code to never remove all the characters from a file name.

      If two media paths overlap (ie C:\ and C:\Media) and the current media is located in both (ie C:\Media\MySong.MP3), the browser will now choose the longest media path that contains the media file as the root of the current media.
      This now works for playlists and images as well.
      Treeview Text Truncation now applies to playlists and root entries as well as subfolders.
      Fixed an error that would prevent media from being displayed in a root folder.

      Fixed minor issues with TreeView text truncation. This now seems to work perfectly.
      Fixed major issue where 2 media paths with the same root could not be specified. Paths now stored in TreeView Node.Tag instead of Node.Key.
      ListView still uses ListItem.Key for storing full path + filename.

      Modified the TreeView to check text width and ensure no item causes a Horizontal ScrollBar to appear.
      At present, this check is only performed for media files. Not for special entries, such as playlists.

      Fixed the code for the TreeView BackColor. Had to remove the tree-lines and the +button next to expandable nodes.
      Added functionality to remove repeated text from media file names (if text is in all visible filenames in directory).
      First it removes repeated text from the left. Then it breaks the filename into subfields, assuming a delimiter of "-" (hyphen), and checks for repeated values to remove.
      Then it does it all again, assuming a delimiter of " " (space char).

      Modified the Browser code so that the TreeView and ListView controls can now have their colors specified.
      The bright white treeview and listview were an eye-sore at night in the dark.

      Font sizes are now measured to one-tenth of a point, resulting in more accurate auto-sizing.
      All playlist files are now denoted with <LST: instead of separate identifiers for <M3U: and <PLS:.
      Cleaned up the code that links the treeview and listview in the Browser window.
      DVD Label is now displayed in the NavBar.

      Changed Browser window to use a ListView control instead of a ListBox.
      Modified Browser window so PlayList files will appear in the Treeview, and can be browsed just like a folder.
      Had to tweak the format of the .PlayList file, changed the delimiter to a pipe | character.

      Changed GPSinfo window to use a ListView control with 2 columns instead of a ListBox. The CommonControls library was already required for the TreeView in the Browser window.
      Changed GPSinfo window to display date and time on separate lines.
      Perfected BAT code for updater.

      TimeZone offset is now updated upon resuming from hibernate/suspend. Also, GPS last-sync-date is cleared upon resuming, to force a refresh.
      Modified the BAT code for the updater to specifically wait for the DriveLine ProcessID to terminate before trying to install the new version.

      Fixed an issue where the PC would resume from hibernation, but forget that the screen should be dimmed. The dimmer is now refreshed at time of resume. This appears to be a Windows issue.
      Finally made GPS reconnect after closing an embedded app that required the GPS and had to be force-terminated.
      Basically, after closing an embedded app, the program will attempt to reconnect to the GPS every 5 seconds for 30 seconds.
      Added UpdateScanner. This will search all drive letters (1 subfolder deep) for a new version when the program is executed, (or upon resuming from hibernation) and offer to install the new EXE.
      The purpose of the UpdateScanner is to be able to upgrade the program without a keyboard or mouse attached.

      Added clock-sync. Once per day or per reboot, the clock will sync with the GPS date/time.
      Clicking the GPSinfo list will now reset the last-synced date, forcing the program to re-sync date/time.
      Fixed minor issue with embedding programs, which would cause the current track to restart.

      Added support for playlist formats .M3U and .PLS. These are managed internally, and should NOT be specified in the INI file.

      Cleaned up the GettingStarted document. Coded HTML manually. Now using PNG images instead of JPG images. Smaller files, better quality.
      Changes to GPSinfo window.
      -Combined Latitude and Longitude onto one line.
      -If the GPS device is present but there is no Satelite-Fix, the GPS info will show blank values instead of default values, and OS time instead of GPS time.

      Modified the ONRESUME function to better handle resuming from hibernation. Media resumes as it should. GPS reconnects.
      Configuring the program ONRESUME settings to run DEVCON.EXE with the RESCAN parameter seems to work well for re-enabling USB devices on resume.

      Set the program to always remain ONTOP of other programs. Considering making this an option in the DriveLine.ini file.
      Adjusted GPS sensitivity for tripmeter.
      The program will now display GPS Date/Time as Local Date/Time, using the TimeZone setting in Windows.

      The "Getting Started" document is now provided as HTML, instead of a Word Doc. Smaller ZIP file, more compatibility.
      Adjusted the function that draws icons for the apps window. Now using the Image and ImageMask (DI_NORMAL instead of DI_IMAGE), the icons look better.
      Clicking the GPSinfo list will now reset the PeakSpeed and DistanceTraveled.
      Made it so more areas will hide the mouse if they are clicked (such as dead space, lists, etc).

      Fixed an issue where the peak speed would occasionally not get updated.
      Fixed an issue that would prevent the NavBar from hiding when playing DVD video.
      Fixed an issue that would prevent the program from resuming a playlist when the item in the playlist was a DVD video.
      Fixed an issue that would prevent the program from ejecting an optical disc.
      The program is now set up to gracefully handle ejecting the media that is currently playing.

      Added GPS-based tripmeter. Tried 2 different methods. By Lat/Lon, and by speed/time. Decided to go with speed/time method since it doesn't require trig.
      So far, I am very pleased with the accuracy of this.

      Finally made application embedding work reliably, with a new method for finding the main hWnd of a process.

      Clicking on the left half of the slideshow window will load the previous image.
      Clicking on the right half of the slideshow window will load the next image.
      Made it so more areas will hide the mouse if they are clicked (such as dead space, lists, etc).

      The slideshow image-list is now saved (and loaded on startup), just like the media playlist.

      Fixed an error in the image scaling routine, which would incorrectly re-calculate the aspect ratio of the image.
      Fixed an error that would crash the program if the Visualization window was loaded while no media was playing.

      Fixed an error that would display the wrong track number if the file chosen in the browser was not the first file in the folder.
      Fixed the way folders are handled in the treeview when they have no subfolders.
      Added new functionality - SlideShow. Modified interface to accomodate.
      New icons!

      When the browser window is loaded, the current track will be hilighted.

      Made the Up/Down arrows hide the mouse when clicked, just like the Prev/Next arrows.
      Added detection of suspend and resume. Upon resume, the program will execute a specified program. I don't know if this has a purpose or not -- I'm thinking devcon.

      Changed the way the program detects if an embedded program is idle.
      When a program is launched, it won't be embedded until CPU usage for that process drops below 4%.

      Changed the way the scrolling works on the Browser window. Now using SCROLL commands instead of ARROW commands, like I should have from the beginning.
      Changed the way the treeview handles clicks on the Browser window. More consistent now.
      Changed the layout of the NavBar to be 3 lines of text instead of 2, and locked the positions of text on the top line.

      Changed the format of the colors in the Skin.INI file to RGB format.
      Tweaked the embedding functions. Still not perfect.
      Changed the way album art is located. Now, the largest image in the folder (by filesize) is the one used.

      Embedded Programs nearly complete.
      Now supports:
      -Disable Playback while program is embedded (for running tuner programs, media players).
      -Disable GPS while program is embedded (for running mapping software).
      -Maximize program. This should almost always be set to TRUE.
      -CommandLine to include when running the program.
      -Commands to run after loading the program. An example for Streets & Trips: <SLEEP02><ALTDOWN>TGS<ALTUP><CTRLDOWN>A<CTRLUP><AL TDOWN>VNL<ALTUP><ALTDOWN>TGM<ALTUP>
      One problem at the moment. A program cannot be embedded if an instance of the program is already running.

      When a program is unembedded, a CLOSEWINDOW command is sent. If the window still exists after 5 seconds, the process is terminated.
      This works out well for programs that may prompt the user to save, or confirm something, such as Streets & Trips.

      Removed the Streets & Trips code. Replaced with a generic "Embedded Programs" interface. Up to 18 programs can be embedded.
      By default, the program icon is used, but a different image may be specified in the program INI file.
      Still working on all of this.

      Added album-art display in the Visualization window. Currently it checks for JPG and BMP images in the music folder.
      Tweaked the StatusText format. Removed Lat/Lon. Speed and bearing are now always displayed (if GPS is available).

      Fixed a bug that would cause an incorrect track number to be displayed when navigating past the end of a playlist.
      Enabled Hold-and-Scroll on the PREV and NEXT buttons, similar to the UP and DOWN arrows.
      Added an option to view the Browser window with a Vertical split, or with a Horizontal split.
      Changed the way the Browser window loads the current media path -- Now all folders get populated.

      Fixed a type-o, cleaned up the GettingStarted file. Made all of the source code available.

      Clicking the PREV button when you are more than 5 seconds into a song will now restart the same song (like how most disc players work).

      Unit of Speed is now an option. Choose MPH, KM/H, or Knots.
      Configuration window implemented.
      The program now keeps track of your peak speed.

      Added "Launch" stats to GPS info. In other words, it displays your acceleration info (0 to 60 in 5.9 seconds, for example)

      Separated code into two modules - one generic for CarPC programming, and one specific to this particular program.

      Added network detection. The status text now indicates if the CarPC is online or not.

      Made skin folder configurable. Separated program settings and skin settings.
      Fixed a bug which prevented the playlist from repeating.

      Scrapped the original program. Wrote a new interface. Much cleaner, better code (might even make source code available).
      New images, new layout.
      Visualization no longer loads automatically.
      No more support for NumPad input. Sorry. Could add it again later. Or programmable key commands.
      Numerous things fixed or added.
      Last edited by ClockWorK; 06-11-2014, 03:08 PM.