SCALA (System Convergence in Applications of Location Awareness)

One of the bigger projects which I am working on is the SCALA project.The acronym SCALA stands for System Convergence in Applications of Location Awareness.

This project is a cooperation between the research groups e-lab of Hogeschool Antwerp, DraMCo of KaHo Sint-Lieven and the Carinthia University of Applied Sciences involving my field of study Medical Information Technology.

Location based services, context awareness,… are important components for further development of the ambient assisted living and working surroundings. For this reason, information about the indoor position of the users is necessary. SCALA acts as a middleware layer between the application site and the positioning/sensor systems on the other site.

The convergence layer does not only make positioning technologies more accessible from applications’ side, but also allows selecting and/or combining several technologies, according to their presence, to get more and/or better positioning information. The middleware layer consists of a more or less losely coupled tiers which are interfaced via WCF (Windows Communication Foundation).

Our part in the project is to handle the information transfer between our SMEs (Small Medium Enterprise) and to implement the Stack-Interface from our indoor localization system within the SCALA localization engine system. We are using the CC2431/2430. This is a System-on-Chip (SoC) Solution for ZigBee/IEEE 802.15.4 Wireless Sensor Network development by  Chipcon which was bought up later by TI.

The chip includes a location detection hardware module that can be used in devices which acts as blind nodes (i.e. nodes with unknown location) to receive signals from nodes with known locations. Based on this location engine they are able to calculate their position. The CC2431 consists of a CC2420 RF transceiver and an industry-standard enhanced 8051 MCU with 128 KB flash memory and 8 KB RAM. The ZigBee Stack is also from TI and is called ZStack .


Tiny (Mother)Board for DIMM-PC®/520-IE Part I

A few years ago a fellow worker and I started to work on an education platform for students to familiarize themselves with embedded /low resource systems.

We decided to take a DIMM-PC®/520-IE with AMD® Elan™ SC520 (133MHz) CPU from Kontron.

The Core used for the AMD Elan is a 5×86 processor. This processor is an x86-compatible CPU which was introduced in 1995 by AMD for use in 486-class computer systems.

Due to the internally-set multiplier of 4, the core runs at 133 MHz. The combination of the relatively large 16 KB  write-back L1 cache and 133 MHz clock speed allows the 5×86 to perform >= an Intel Pentium 75 MHz processor in integer arithmetic performance.

 

 

 

The Elan CPU comes with following architecture.

 

 

 

 

 

 

 

 

And last but not least the full feature list of our DIMM-PC

CPU AMD® Elan™ SC520 133MHz
Cache 16 kByte Write-Back L1
Common Features JIDA Support, I²C Bus, Programmable / CS Output, Support for alphanumerical displays
Dimensions (H x W x D) 68 x 40 mm (2.7 x 1.6“)
Ethernet 10/100 MBit Ethernet
Flash Disk IDE compatible Flash Disk up to 32 MByte on board
Hard Disk IDE Hard Disk Interface on external device
Humidity Operation: 10% to 90%
Storage: 5% to 95%, (non condensing)
Interface Floppy Interface single drive
JRC / JIDA32 JRC remote control via COM
Keyboard Keyboard Controller integrated with chipset
Main Memory Up to 32 MByte DRAM on board
Operating System Preinstalled DR-DOS®, lol 🙂
Parallel Port 1 x LPT1, EPP support
Power Consumption 2 Watt @ 5V only
Power Supply 5V
Real Time Clock Integrated with chipset
Serial 2 x Serial TTL (16550 compatible)
Special Features EEPROM for CMOS Setup
USB Optional 1x USB 1.1 OHCI
Watchdog Watchdog

Our aim was to build an education system to show our students how PC systems are working and how easy it is to build a Linux OS from scratch for this kind of architecture. Secondly we want also to have a small development platform for third party projects.

With 32MB of DRAM and up to 32MB of IDE compatible hard drive and full featured I/O interfaces like serial port, LPT, IDE interface, Watchdog Timer, I²C Interface, General Purpose Chip Select and last but not least a beautiful Ethernet Interface suit all our needs for an easy to handle development platform.

QuadroCopter MedIT-Lab-WorkShop Part I

More than a year ago I joined the NG.UAVP (Next Generation Universal Aerial Video Platform) Project.  Amir and his NG-Gang are the brains of this cool Open-Source project. After fiddling around for about a year i decided to bring up some contents/themes to my field of study.

The idea here is to show our students how theory and practice can be combined and this is shown through the QuadroCopter example.  Since the major components of such a system would cover most of the key course elements I thought my fellow workers would take some of the ideas/themes into their courses. LOL, but the response was zero. No matter,  I already was changing to my new field of study (MedIT). Of course QuadroCopters doesn’t fit as perfect as they did to my former study field. But here I get more support. So I decided to start a workshop for students and some fellow workers with the aim to build a QuadroCopter from “scratch”. To make the whole stuff not to difficult we took the NG.UAVP project as base.

So here we are, some impression of our first workshop, students@work

 

Markus one of the students who are attending the workshop did a short fast motion video 🙂

[local /files/2010/05/Fim1Quadro.flv]

The Video has about 8Mb, so it could take some time to load.

MediaWiki Extension:Collection, no file after create pdf (or, fun with PHP upgrade)

Just played around with an extension for the MediaWiki wiki. Collection is the name of the devil :-). Installing was no problem but in the end when I requested the first .pdf I only got back a beautiful shiny white site. Of course some HTML tags were included, but no sign of the expected .pdf file. Hmm,… so I started my investigations.

The server OS is an Ubuntu Karmic with PHP 5.2.x and apache 2.2.x ……..

After an hour I found out that a bug/feature seems to prevent the wm-server to give back the generated lr =>pdf files. The NET suggest,… upgrade to PHP 5.3.  So if you have no clue, do what the NET suggests. But Ubuntu Karmic does not have PHP 5.3 as packages available. So, what to do…. I always wanted to do a dist-upgrade on an live system :-).

No sooner said than done! I fired up the upgrade.

 aptitude update
 aptitude install dpkg aptitude get
 aptitude install dpkg aptitude aptaptitude install dpkg aptitude apt
 aptitude safe-upgrade

…did do the trick. And you would not believe it, the MediaWiki extension started to work, and I got a new shiny Ubuntu Lucidy 10.04 LTS.

The story goes on.  The main webpage is powerd by a recent version of Typo3 and for some reason some Typo-Code is using functions which are marked as deprecated in PHP5.3.  A nice deprecated warning was now replacing our beautiful sites. Our webmaster won’t be amused :-).  No big deal you will think, just disable the corresponding error_reporting…

error_reporting = E_ALL & ~E_DEPRECATED

removing E_DEPRECATED did not solve my problem whether changing it in php.ini ,htaccess or in the startup code of Typo. So,… the site is down, and i have no clue what’s going on. Once more, I started up googling. After some time I found some posts concerning about Typo and that ii uses its own error handler, so changing the PHP-INI variables have no effect. lol, okay so where are this variables. As I am not an Typo expert I continued my googling session.

I don’t know why but but it took me “some” time to find this simple configuration flag where you can shut down the internal error handling  of  Typo.

$TYPO3_CONF_VARS[SYS]['displayErrors'] = 0;

Nice, now our Webmaster will be happy and me too 🙂

Trac, Watchlist plugin support for trac 0.12 microsecond feature

This is a patch for getting the WatchPlugin working with trac 0.12.

+++ ./plugin.py    Sat Apr 03 16:56:17 2010
@@ -26,6 +26,7 @@

 from  trac.env         import  IEnvironmentSetupParticipant
 from  trac.util        import  format_datetime, pretty_timedelta
+from trac.util.datefmt import  from_utimestamp, to_utimestamp
 from  trac.web.chrome  import  INavigationContributor
 from  trac.web.api     import  IRequestFilter, IRequestHandler, RequestDone
 from  trac.web.chrome  import  ITemplateProvider, add_ctxtnav, add_link, add_script, add_notice
@@ -38,6 +39,7 @@
 from  trac.wiki.model  import  WikiPage
 from  trac.ticket.model import Ticket

+
 __DB_VERSION__ = 3

 class WatchlistError(TracError):
@@ -347,9 +349,9 @@
 'name' : name,
 'author' : author,
 'version' : version,
-                        'datetime' : format_datetime( time ),
-                        'timedelta' : pretty_timedelta( time ),
-                        'timeline_link' : timeline_link( time ),
+                        'datetime' : from_utimestamp( time ),
+                        'timedelta' : pretty_timedelta( from_utimestamp(time) ),
+                        'timeline_link' : timeline_link( from_utimestamp(time) ),
 'comment' : comment,
 'notify'  : notify,
 })
@@ -426,9 +428,9 @@
 'author' : author,
 'commentnum': to_unicode(self.commentnum),
 'comment' : len(self.comment) <= 250 and self.comment or self.comment[:250] + '...',
-                        'datetime' : format_datetime( changetime ),
-                        'timedelta' : pretty_timedelta( changetime ),
-                        'timeline_link' : timeline_link( changetime ),
+                        'datetime' : from_utimestamp( changetime ),
+                        'timedelta' : pretty_timedelta( from_utimestamp( changetime ) ),
+                        'timeline_link' : timeline_link( from_utimestamp( changetime ) ),
 'changes' : changes,
 'summary' : summary,
 'notify'  : notify,

This patch applies to rev 7710, you can download the patch from trac-Hacks

Have fun 🙂

Open-VM-Tools (loop between service umountnfs and open-vm-tools)

After upgrading one of my servers i got “insserv: There is a loop between service umountnfs and open-vm-tools if stopped” .  A quick look in to the run script turns out that their is a dependency -> “# Required-Start:    $local_fs $remote_fs”.

Removing the$remote_fs” fixed the dependency loop for me:

The corresponding section in the “open-vm-tools” script looks like:

### BEGIN INIT INFO
# Provides:        open-vm-tools
# Required-Start:    $local_fs
# Required-Stop:    $local_fs
# X-Start-Before:    $network
# X-Stop-After:        $network
# Default-Start:    2 3 4 5
# Default-Stop:        0 1 6
# Description:        Runs the open-vm-tools services
# Short-Description:    Runs the open-vm-tools services
### END INIT INFO

I’m using a Debian testing Distribution with Open-VM-Tools (2010.03.20-243334-4)

Ninject, the first contact.

So what’s Ninject.  Ninject is a lightweight dependency injection framework for .NET applications. … and what is it good for (absolutely nothing?)? Ehm, not at all!

The simplest use case would be following scenario:

For example your design declares a singleton class. Normally you would code something like that:

 public sealed class TheManager
{
    static TheManager instance=null;
    static readonly object padlock = new object();

    TheManager()
    {
    }

    public static TheManager Instance
    {
        get
        {
            lock (padlock)
            {
                if (instance==null)
                {
                    instance = new TheManager();
                }
                return instance;
            }
        }
    }
}

Then you would get an instance of TheManager like that:

 TheManager myManager = TheManager.Instance()

Okay, now we will use Ninject for our singleton pattern.
If you use Ninject you need not to add code for locking down your class to achieve a singleton behavior. You only have to tell Ninject that the class type should be tied to some implementation, in our example to itself. Furthermore, you have to setup  the – what they call – Activation Behavior. In our Example it is,….  yes the InSingletonScope.

Ninject distinguishes between 4 (build-in) scopes:

Transient .InTransientScope() A new instance of the type will be created each time one is requested. (This is the default scope)
Singleton .InSingletonScope() Only a single instance of the type will be created, and the same instance will be returned for each subsequent request.
Thread .InThreadScope() One instance of the type will be created per thread.
Request .InRequestScope() One instance of the type will be created per web request, and will be destroyed when the request ends.

The first step would be to create a new NinjectModule which will hold the bindings.

public class MainModule : NinjectModule
{
 public override void Load()
 {
   Bind<TheManager>().ToSelf().InSingletonScope();
 }
}

Our TheManager class looks like that:

 public class TheManager
{
    public TheManager()
    {

    }
    public  DoManage()
    {
        System.Console.WriteLine("Resistance is futile");
    }
}

Now we can use our TheManager class as a singleton.

The simplest use would be if you ask the Ninject kernel for the TheManager class

 class Program
  {
    static void Main(string[] args)
    {
      IKernel kernel = new StandardKernel(new MainModule());
      TheManager myManager = kernel.Get<TheManager>();
    }
}

Whenever you call the Ninject kernel for the TheManager type implementation you will get a reference to the same instance.

But Ninjects magic can do a lot more cooler stuff for you.

Let’s suppose you have another class TheBoss which should use TheManager. And you want that if you instantiate the TheBoss it should automatically have a TheManager.

Then you could use the [Inject] Attribut. Whenever you use this Attribut Ninject will search his binding “tables” for an implementation which suits to the request context respectively to the bindings.

For example you can use the  Property Injection feature. Here we annotate the myManager property with [Inject] . So if we create an instance of  TheBoss we also get myManager automatically resolved.

 public class TheBoss
{
    [Inject]
    TheManager myManager { get; set;}

    public TheBoss()
    {
    }
}