Sunday, February 19, 2012

Romo has landed in the Netherlands

Last week brought the Microsoft TechDays in The Hague. And as part of the Caesar Experts booth, lots of people here in the Netherlands finally saw a Romo smartphone robot in person!

Elsewhere on this blog you can see how I got to know Romo and how I am writing software support for him for Windows Phones. As we expected lots of Lumia phones would be available as winnable goodies at TechDays (and we were right...) I suggested we'd go for completely different: show off my work on WP7 Romo, get people in the Netherlands to actually see one in action and have two to raffle off to registered visitors of our booth. This was actually a great succes, as far as I'm concerned. I've received lots of questions and people really seemed to like the Romo concept.

Unfortunately, the new Februari revision Romos could not be here in time, so the two winners will receive their robots later, as soon as I receive them. I hope this should not be long. Also based on the information I now have, these new revision should have support for some extra frequencies to maybe add some better control to turning the robot and ways to turn the 5V auxiliary ports on the front of the robot off and on again. When I have received information on these frequencies, included them in the Windows Phone library and have the library tested on both my original #42 revision one Romo and a new revision one, I will make my library public so anyone could write WP7 apps that drive a Romo robot.

If you have any questions, please don't hestitate to ask.
And stay tuned for more Romo information!

Monday, February 13, 2012

Zaagmans...

For readers not from the Netherlands, let me just quickly introduce the concept of "Zaagmans". You could translate him as "Mr. Saw", and he's a fictional construct mentioned by the characters of a dreary office satire called "Debiteuren Crediteuren" in the comedy program Jiskefet on Dutch televison. Zaagmans of course comes along each wednesday at noon, to "saw the week in half".

In the second week of Januari Zaagmans came up at work (must have been wednesday the 11th) and I had the idea that it would be easy to either set an alarm for noon every wednesday with the sound of a saw or write a small silly app to do that for me and optionally show me a countdown. I kept things to myself and at home that evening I wrote just such an app. I wanted to dogfood it myself for a week, and after I knew for sure it worked on wednesday I published it. It turned up in the Marketplace on december the 22nd, just over three weeks ago.



I would never have believed what I started. Download numbers are trailing a couple of days, as you probably know, but in the first 2.5 weeks the app has been downloaded 123 times! And it is only published to a couple of markets: just NL originally, but as quite a number of Windows Phone users over here still have not switched from their "fake" US/UK/DE/BE Live ID they started using when NL support was still far away, I enlarged this a bit.


What I find astonishing is the fact that I have 9 reviews already, almost all of them five star except for one four star one. And this morning I noticed that Zaagmans is in the 3/48 position of the "New & Impressive" section in AppFlow! Wow, that's still just for the Dutch marketplace, but this little app really seems to be touching a nerve. It my own little Rubber Duck! ;-)

So far, there has been one update where you are now able to choose the sound you want to hear (first version made random choice of the original three sounds) and a second is current going through Marketplace submission right. After that at least one more version will be submitted that has Flurry statistics built in; I really want to see what people do with this app.

If you have ideas for it, please let me know.

Wednesday, January 18, 2012

Romotive publishes Romo audio protocol

On their blog, Romotive has made public which audio waves you need to generate on which audio channel to control a Romo first revision smartphone robot. So if you want something programmable with an audio port to control one, now you know how!

The article even briefly mentions my own work on a Romo control library for Windows Phone, which can change the amplitude of the soundwaves it sends out to control robot speed as well.

This library (and my first two apps) are slowly but surely nearing a state in which they can be made public for every WP7 developer to easily interact with Romo devices. The Romotive staff has already received preliminary XAP files to use on the Nokia Lumia 800 they have, and they told me they liked what they saw so far.

There should be more information about this soon, even though the next revision of Romo (which should be out in or shortly after this Februari) will include more frequencies as part of the interface.

Just be patient...

Friday, December 30, 2011

Romo robot control library for WP7

After seeing the Romo smartphone robot on Kickstarter some time ago, I was hooked. I wanted one. And I wanted to program for it myself, on my Windows Phone! So I pledged a certain amount of money for the limited edition one - gotta have the T-shirt too - and waited for the Kickstarter results...



And then it was a landslide (they raised $114796!), and around Christmas I received my robot. It happened to be limited edition number 42 and all, pleasing my inner nerd immensely. To get to work!

In fact, I had contacted the guys at Romotive to ask about the sounds needed to drive the robot. The evening before FedEx would deliver, I had a first draft of a library and an app with some simple buttons. When the Romo arrived, this code immediately drove the Romo robot flawlessly, without any changes needed. That certainly was cool.

Today after the last day at work, I met up with some of the WP7NL crew. This first demo received some great reactions and some good suggestions too. Turns out the Romo base reacts to volume as well as sound frequencies. So I reworked the library to allow you to use this to not only control forward/backward motion and left/right rotation but variable speed for both as well.

When the library is done and tested, which means having written and published at least one Romo WP7 app myself, I plan to publish it open source on Codeplex and make the binaries available (nice reason to get into NuGet) as soon as possible. And then, order yourself a Romo, and get programming robots!

Keep watching this space for more info!

Friday, November 25, 2011

Command & Conquer, Distimo style

Just a quick post, reacting to a comment by Tijmen after tweeting about the cool Command & Conquer style competitor map by Distimo.

Data for the following map (click on it for a larger version) is from the last month. It uses colors to show which of the WP7 apps I designated as competitors for my Klout Tile app (which should be all of the Klout apps out there right now..) have the highest ranking within the Social category in that country:


Interesting, huh? Especially since the other newcomer (from France, and currently only biggest there) shows the most information from the Klout API at the moment. Really should push out v1.1 of my Klout Tile app soon: it shows more data, should be more stable and cuts back on the "review begging" that was a bit excessive in v1.0 (with a daily recurring reminder). At least my app is still the only one with a Live Tile for your score.

My goal: get the whole world blue. ;-)

Update: Since posting this, another Klout app started showing your score on a live tile. So the "blue earth" goal doesn't seem like it'll be happening soon, as I am currently busy on other WP7 apps (one of which actually has a fixed deadline).

Tuesday, November 8, 2011

The perfect way to ask for a WP7 App Review...?

Today I got a mention on Twitter I really liked about the way I implemented "review begging" in my latest Windows Phone 7 app. I do it using the following code:

using System;
using Microsoft.Phone.Scheduler;

/* ...part of AboutPage.asmx.cs... */

public static void ResetReviewReminder(KloutSettings settings)
{
  const string name = "ReviewReminder";
  Action removeReminder = () => {
    if (ScheduledActionService.Find(name) != null)
      ScheduledActionService.Remove(name);
  };
#if DEBUG
  removeReminder();
  settings.UsedReviewButton = false;
#endif
  if (settings.UsedReviewButton)
  {
    removeReminder();
  }
  else
  {
    ScheduledAction reminder = ScheduledActionService.Find(name);
    if (reminder == null)
    {
      reminder = new Reminder(name)
      {
        Title = "How do you like me so far?",
        Content = "Would you mind using the about dialog " +
        "(tap here if Klout Tile is not running) " +
        "and writing a review?",
        NavigationUri = new Uri("/AboutPage.xaml", UriKind.Relative),
        RecurrenceType = RecurrenceInterval.Weekly,
        ExpirationTime = DateTime.Now.AddMonths(1),
      };
      if (System.Diagnostics.Debugger.IsAttached)
      {
        reminder.BeginTime = DateTime.Now.AddMinutes(5);
      }
      else
      {
        DateTime x = DateTime.Now.AddDays(7);
        reminder.BeginTime = new DateTime(x.Year, x.Month, x.Day, 12, 0, 0);
      }
      ScheduledActionService.Add(reminder);
    }
  }
}

What does this do?

That's an easy question to answer: if the application settings object (which is persisted in isolated storage) flags that the user has already used the review ApplicationBar button (in Klout Tile that's the star button in the About page), then any review reminder that is found is silently deleted. If however, the user has not used the review button in the About page yet and no existing reminder is found, it creates a new review reminder.

This reminder asks the user what she thinks about the app and also includes a NavigationUri that points to the About page. It is set to recur weekly for a maximum of about a month, starting three days from now. I think this is a reasonable "beg" period and frequency. (You can adjust as you see fit, of course.)

How do I use it?

Each time the Klout Tile app is started, I call AboutPage.ResetReviewReminder() once. This means that, if this is the first time the user starts the app, the user will be reminded three days later to please go add a review.

Apart from this I have the following code in my About page to handle the user clicking review button:

private void ReviewButton_Click(object sender, EventArgs e)
{
  var settings = KloutSettings.Load();
  settings.UsedReviewButton = true;
  settings.Save();
  ResetReviewReminder(settings);
  var review = new Microsoft.Phone.Tasks.MarketplaceReviewTask();
  review.Show();
}

This makes sure that when the user does click on the review button, any reminder that exists will be deleted and no more reminders will ever be (re)created in the future.

Some of the advantages

A lot of Windows Phone apps ask the user for a review. Some have buttons, which the user can easily choose/forget to (n)ever tap. Some wait a bit and ask the user for a review using a MessageBox with Ok/Cancel buttons, but this can be annoying for the user, as there is no "Not right now." option. Also, if the user installs your app, runs it onces and never uses it again, the code to show this message box will never get executed.

Using a system reminder like the code above does gives the following advantages:

  • We are able to show the user a review reminder, even if they only start the app once and never come back to it again. (Unless they uninstall it, of course.)
  • The review reminder is stored with other system reminders (like the ones from the Calendar), so they can be shown at any time, even if when the app is not running.
  • You do not need to use a background task to get this behavior, so even if the user disables your background task (which they can) the reminder will pop up.
  • If the reminder pops up at a time that is not convenient for the user, she can just snooze it, like any other reminder.
  • The user still has a way to just dismiss the reminder, but as it is a daily repeating one, it should pop up the next day (for a maximum of two weeks after first start).
  • When the reminder pops up while the app is not running, tapping the reminder opens the correct page inside the app directly to easily let the user initiate a review scenario. (For bonus points, the URI and About page could be changed so that when the user enters by tapping the reminder, the Microsoft.Phone.Tasks.MarketplaceReviewTask is executed directly, eliminating one further step!)
  • Finally, when the user uses the review button in the About page on their own, the reminder (whether already shown before or not) is silently deleted so the user is not bothered with our "review begging" ever again.

So I think using a Reminder to do you "review begging" might be the perfect solution. What do you think?