Using Plack for Hardware emulation

One of the first projects I did at work was to make a web/javascript based interface for a piece of hardware that we sell. The machine is very underpowered so pushing a lot of the complexity to the client makes sense. It was a great project and is one of the few that I haven’t had to make modifications to since I finished it nearly two years ago.

Well, it turns out we are making a new version of the hardware and I have to add a ton of options to the UI. That is pretty easy in general, but first I have to get the app up and running. There’s NO WAY I’m going to flash the firmware every time I need to make a change to the javascript. What do I do instead? Mock the hardware with Plack!

Here’s the code I’m using:

use Plack::App::File;
my $app = Plack::App::File->new(root => ".")->to_app;

use Plack::Builder;
builder {
   mount '/settings.htm' =>
      Plack::App::File->new(file => "../Web Source/settings.js");
   mount '/WebResources/resources/css/extall.css.gz' =>
      Plack::App::File->new(file => "../Web Source/extall.css");
   mount '/WebResources/resources/css/xthemeblack.css.gz' =>
      Plack::App::File->new(file => "../Web Source/xthemeblack.css");
   mount "/WebResources/$_.gz" =>
      Plack::App::File->new(file => "../Web Source/$_") for (
      'extall.js',
      'extprototypeadapter.js',
      'harmony_config.css',
      'harmony_config.js',
      'prototype.js',
   );
   mount '/' => $app;
};

The first and second line make a basic file server which serves up all the images and whatnot. The rest, the mount commands that is, rearrange things so that instead of using our pre-gzipped files it points to my source files. That way we can leave the html static but I don’t have to waste time copying stuff all over the place all the time.

Awesome!

Posted Tue, Aug 10, 2010

If you're interested in being notified when new posts are published, you can subscribe here; you'll get an email once a week at the most.