Sunday, June 22, 2008

Yeah, we have made it through week three of my 30 Days of .NET challenge. So far, we have 22 applications for 22 days. Thanks for your support!

If you missed the week one recap here it is: 30 Days of .NET [Windows Mobile Applications] - Week One.

If you missed the week two recap here it is: 30 Days of .NET [Windows Mobile Applications] - Week Two.

What’s your favorite?

image image image image
Mobile SMS Remote SMS Logger Lunch-O-Matic Mobile Weather

We get around, don’t we? SMS, RSS, GPS, Camera API, and more!

image image image image
Mobile Speedometer Mobile Altimeter Mobile Sketcher What will be next?

Feedback:

Got an idea? Got some feedback? Share it? Thanks!


Sunday, June 22, 2008 18:31:00 (Eastern Standard Time, UTC-05:00)  #    Comments [1]  |  Trackback

I couldn’t resist creating another GPS related mobile application. One of the neat pieces of data you get from your GPS device is time. This is great. It is like having one of the clocks that can update itself over the air by reading data transmitted from various atomic clocks throughout the world. Many phones today have the ability to update their time by connecting to the OEM’s time servers, but not all. And there are still lots of Windows Mobile classic devices in the world that do not have cellular capabilities.

Vista has the ability to update its time by using a feature called Internet Time. Basically Vista connects to time.windows.com and reads a Network Time Protocol server.

 

image

GPS Clock

Our user interface is simple and direct. We are using a nice graphic to adds some visual zing to the application. At the top of the screen we show the user their current device time and their current GPS time.

This allows the user to tell at a glance if they need to update their device’s time using the Update menu option.

On the menu we have added some simple settings features: GPS Start, GPS Stop, About, and Exit.

This is one of those Web 2.0 ideas where an application does one thing but does it very well. Sometimes these are the best apps. In this case, our application provides a bride for GPS time data to become device time data.

Somtimes that’s all it takes to make a user happy.

UpdateData Method:

   1: void UpdateData(object sender, System.EventArgs args)
   2: {
   3:     if (gps.Opened)
   4:     {
   5:         if (position != null)
   6:         {
   7:             if (position.TimeValid)
   8:             {
   9:                 gpsTime = position.Time;
  10:  
  11:                 labelCurrentGpsDate.Text = gpsTime.ToLongDateString();
  12:                 labelCurrentGpsTime.Text = gpsTime.ToLongTimeString();
  13:             }
  14:         }
  15:     }
  16: }

 

UpdateTime Method:

   1: private struct SYSTEMTIME
   2: {
   3:     public short Year;
   4:     public short Month;
   5:     public short DayOfWeek;
   6:     public short Day;
   7:     public short Hour;
   8:     public short Minute;
   9:     public short Second;
  10:     public short Milliseconds;
  11: }
  12:  
  13: [DllImport("coredll.dll")]
  14: private static extern bool SetSystemTime(ref SYSTEMTIME time);
  15:  
  16: private void UpdateTime()
  17: {
  18:     DateTime idag = gpsTime.ToUniversalTime();
  19:  
  20:     SYSTEMTIME s = new SYSTEMTIME();
  21:     s.Year = (short) idag.Year;
  22:     s.Month = (short) idag.Month;
  23:     s.DayOfWeek = (short) idag.DayOfWeek;
  24:     s.Day = (short) idag.Day;
  25:     s.Hour = (short) idag.Hour;
  26:     s.Minute = (short) idag.Minute;
  27:     s.Second = (short) idag.Second;
  28:     s.Milliseconds = (short) idag.Millisecond;
  29:  
  30:     SetSystemTime(ref s);
  31: }

Possibilities:

How about changing the color of the date and time if they are more than five minutes off? Simple feature to add but really helps the user. And that’s what matters.

Download executable: gpsClock.cab

Download Source Code: gpsClock.zip

Feedback:

Want more? What else would you like to see? Time’s running out on submitting ideas. Be sure to get yours in soon!


Sunday, June 22, 2008 18:16:00 (Eastern Standard Time, UTC-05:00)  #    Comments [0]  |  Trackback

The main goal of 30 Days of .NET was to create a series of applications, any of which, a reader could take and use as a springboard to creating their first application. Well that, and to have some fun along the way and get more people excited about mobile development. A secondary goal of mine has been to show off various capabilities of mobile devices like GPS, Bluetooth, and multimedia features. One feature we haven’t covered so far is using a built-in camera.

Today we will mark that item off our list…

image

Mobile Sketcher

The goal is to create a basic drawing application, but add a mobile twist to it. On the menu, I have added a menu item for selecting a picture using the select picture dialog. The nice thing about the select picture dialog is it allows you to use your camera to take a picture and then select it as your picture.

In a way this application is a lot like the mobile signature capture application we did a while back, but there are some important differences: picture selection support, camera support, save file dialog support, and more. The business case for this application is something like the following: an insurance agent arrives on the scene of an automotive accident, she takes a picture using Mobile Sketcher and then adds notes and sketches to the picture for claims processing.

So users can select a picture from their device or take a picture and use it for their background. And then they can draw and edit the picture using Mobile Sketcher. At the bottom of the screen we allow user to select different colors for the pen’s ink: red, orange, yellow, green, blue, brown, white, and black. Well okay, white is really a light gray since white on white is hard to see.

SelectPicture Method:

   1: private void SelectPicture()
   2: {
   3:     SelectPictureDialog selectPictureDialog = new SelectPictureDialog();
   4:     DialogResult dialogResult = selectPictureDialog.ShowDialog();
   5:  
   6:     if (dialogResult != DialogResult.OK)
   7:         return;
   8:  
   9:     pictureBox.Image = new Bitmap(selectPictureDialog.FileName);
  10: }

Possibilities:

There is lots of room for improvement with this application. Just think of all the features most drawing programs have and there’s your list for improvements.

Download executable: mobileSketcher.cab

Download Source Code: mobileSketcher.zip

Feedback:

Want more? What else would you like to see? The managed API for using a Window Mobile camera is a great feature that is very powerful and very easy. Use it in your next mobile application or your first.


Sunday, June 22, 2008 01:17:00 (Eastern Standard Time, UTC-05:00)  #    Comments [0]  |  Trackback
Saturday, June 21, 2008

Yesterday, I had a really hard time between choosing to do a Mobile Speedometer or a Mobile Altimeter. But another day gives us another opportunity, and today we shall create the Mobile Altimeter.

image

Mobile Altimeter

This will make the third application in the 30 Days of .NET series that has had targeted GPS capabilities. We have created a compass, a speedometer, and now a altimeter. And there are still dozens of applications we could create with the GPS capabilities of Windows Mobile.

This time I decided to a little more with the UI. We have a background that symbolizes “altitude” which is appealing to end users. Plus it gives the program a lot of style and class. On the left side of the screen if you look carefully, you will notice we have an attitude ruler, which has a marker that rises one pixel for every foot higher the device travels up to 180 feet.

This simple feature really takes our application up to the next level. :D (Yeah, I know: I’m terrible.)

At the bottom of the screen we are allowing the user to read all the main stats off the GPS so the application is even more useful. We show altitude in a large bold font in the middle of the screen for impact.

The main event: UpdateData

   1: void UpdateData(object sender, System.EventArgs args)
   2: {
   3:     if (gps.Opened)
   4:     {
   5:         if (position != null)
   6:         {
   7:             if (position.SeaLevelAltitudeValid)
   8:             {
   9:                 labelAltitude.Text = position.SeaLevelAltitude.ToString("0.00ft");
  10:                 if (position.SeaLevelAltitude >= 0 && position.SeaLevelAltitude <= 180)
  11:                     pictureBoxArrow.Top = 173 - (int) position.SeaLevelAltitude;
  12:                 else
  13:                     pictureBoxArrow.Top = 173;
  14:             }
  15:         }
  16:     }
  17: }

Possibilities:

I think a more realistic UI would be a great improvement. And the ability to switch from miles to kilometers would be good too. If the odometer would track miles traveled that would be an awesome enhancement.

Download executable: mobileAltimeter.cab

Download Source Code: mobileAltimeter.zip

Feedback:

Want more? What else would you like to see? There’s been a lot of demand for GPS related applications. Does that help?


Saturday, June 21, 2008 02:07:00 (Eastern Standard Time, UTC-05:00)  #    Comments [2]  |  Trackback
Friday, June 20, 2008

After the last GPS related application, GPS Compass, I’ve been wanting to do another GPS focused application. This time I figured we’d get in the driver’s seat with our friend: SPEED.

Gentlemen, start your engines…

image

Mobile Speedometer

The application is built off of  Windows Mobile 6 SDK included a GPS Application in the samples folder, C:\Program Files\Windows Mobile 6 SDK\Samples\PocketPC\CS\GPS.

This uses the GPS Intermediate Driver. If you are writing a location aware application for Windows Mobile this is definitely the way to go. ;)

The main UI is located at the top of the screen. We have a simple speedometer graphic in the background to add some flair to the application. On top of this we overlay the current speed based off of information returned from the GPS device. We can also use Fake GPS to simulate a GPS device.

Below this we have a readout of various GPS statistics that are updated continuously.

One thing to note is Speed may be return in knots which you will likely want to convert to either miles or kilometers.

 

 

 

 

We just need to create a method something like UpdateData below.

   1: void UpdateData(object sender, System.EventArgs args)
   2: {
   3:     if (gps.Opened)
   4:     {
   5:         if (position != null)
   6:         {
   7:             if (position.SpeedValid)
   8:             {
   9:                 labelSpeed.Text = (position.Speed/1.15077945).ToString("0.00");
  10:             }
  11:          }
  12:      }
  13: }

Possibilities:

I think a more realistic UI would be a great improvement. And the ability to switch from miles to kilometers would be good too. If the odometer would track miles traveled that would be an awesome enhancement.

Download executable: mobileSpeedometer.cab

Download Source Code: mobileSpeedometer.zip

Feedback:

Want more? What else would you like to see?


Friday, June 20, 2008 00:53:00 (Eastern Standard Time, UTC-05:00)  #    Comments [2]  |  Trackback
Thursday, June 19, 2008

How'd we make it this far without a weather application? I must admit its hard to buy anything these days that doesn’t have a weather feature built in. But does everyone understand the basic of writing such an application? That’s what we will explore today.

 

image

Mobile Weather

UI is a little plain. I really think a weather application needs to have a top notch exciting UI, but we’ll keep it simple this time. We have an input section at the top that takes the user’s ZIP Code, and we have an output section at the bottom.

In the output section we have some basic factoids like current conditions and temperature. We also have a forecast for the next day showing date, description, with high and low temperature. And finally we have a graphic to add a little something to an otherwise drab application.

How did we mine this information. Basically I connected to a public weather RSS feed that takes zip code as an URL parameter, using an HttpWebRespone object. I then parsed out the data I need using regular expressions.

There are other ways of doing this type of thing, but I thought this would allow us to use a lot of neat Window Mobile technologies we haven’t explorer before.

Our friend the HttpWebResponse:

   1: private void RefreshData()
   2: {
   3:     string lcUrl = "http://weather.yahooapis.com/forecastrss?p=" + textBoxZipCode.Text.TrimEnd();
   4:  
   5:     // *** Establish the request 
   6:     HttpWebRequest loHttp = (HttpWebRequest)WebRequest.Create(lcUrl);
   7:  
   8:     // *** Set properties
   9:     loHttp.Timeout = 10000;     // 10 secs
  10:  
  11:     // *** Retrieve request info headers
  12:     HttpWebResponse loWebResponse = (HttpWebResponse)loHttp.GetResponse();
  13:  
  14:     Encoding enc = Encoding.GetEncoding(1252);  // Windows default Code Page
  15:  
  16:     StreamReader loResponseStream = new StreamReader(loWebResponse.GetResponseStream(), enc);
  17:  
  18:     string lcHtml = loResponseStream.ReadToEnd();
  19:  
  20:     RefreshScreen(lcHtml);
  21:  
  22:     loWebResponse.Close();
  23:     loResponseStream.Close();
  24: }

 

Last but not least the Regex object:

   1: string conditionsEx = @"<yweather:condition  text=""(?<desc>[^@]+)""  code=""(?<code>[^@]+)""  temp=""(?<temp>[^@]+)""  date=""(?<junk>[^@]+)"" ";
   2:  
   3: Regex regEx = new Regex(conditionsEx);
   4:  
   5: Match m = regEx.Match(input);
   6:  
   7: if(m.Success)
   8: {
   9:     desc = m.Groups["desc"].Value;
  10:     temp = m.Groups["temp"].Value;
  11: }

Possibilities:

The UI needs more polish, but it is useable. There is even more data in this RSS feed than I’m exposing so that is another way to expand on this project and make something awesome.

Download executable: mobileWeather.cab

Download Source Code: mobileWeather.zip

Feedback:

How could we make this application even better? Share your ideas with the community.


Thursday, June 19, 2008 01:59:00 (Eastern Standard Time, UTC-05:00)  #    Comments [0]  |  Trackback
Wednesday, June 18, 2008

Being a geek, I have a lot of geek friends. Being friends, we tend to eat lunch together. The only problem is sometimes we have a hard time deciding where to go to eat lunch. This invariably leads to the “Where do you wanna eat?”, “I dunno, where do you wanna eat go?”, “It doesn’t matter to me, you decide.” Well here is a simple solution to this daily dilemma:

 

image

Lunch-O-Matic

Our UI has just enough class to be exciting and interesting, yet simple enough not to cause us too much grief. Seek balance in all things. The concept: restaurant logos flash across the screen, eventually stopping on the chosen food establishment. The application is visual, which is appealing. The application is clear. The user can easily tell which restaurant is chosen by following the ginormous arrow. A light blue background give the app a little warm and the arrow adds character.

We have a folder called LunchLogos. Any png file found is the folder is added to an generic image list at the start of the program. When the user clicks Spin, the logos are randomly displayed on the screen for a random number of times before stopping on a chosen eatery.

If you don’t like a restaurant all you have to do is remove the logo from the folder. If you have a restaurant you like that isn’t in the list all you have to do is add the logo to the same folder, simple, simple.

Again for this application we used the RNGCryptoServiceProvider class to generate a statistically sound random number.

   1: private int GetRandomNumber(int minValue, int maxValue)
   2: {
   3:     // Use a 4-byte array to fill it with random bytes and convert it then
   4:     // to an integer value.
   5:     byte[] randomBytes = new byte[4];
   6:  
   7:     // Generate 4 random bytes.
   8:     RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
   9:     rng.GetBytes(randomBytes);