eXtreme Feedback Device

At work, we are running a CruiseControl.NET continuous integration server. Even before it was up and running, I heard about eXtreme Feedback Devices (XFD), so I decided we need one, too.

Requirements:

  • We have multiple projects to build (-> multiple build status to display)
  • At least the colors red and green are mandatory
  • Custom messages would be nice to have some fun...
  • Must be cooler than lava lamps

I decided to use a three-color LED Scrolling sign, available in Germany at Conrad Electronic: McCrypt LED Lauflicht 3-farbig. It seems to be also available under different names (Pro-Lite, Velleman). Search the web for "<ID00><PA><L1>" to find devices using the same protocol. Three colors: Red, Green, Orange (Red+Green), cheap (120€), serial and USB connection.

Some protocol reverse engineering later, a small .NET 2 application was running. It connects via HTTP to the build server and queries the project status. It can display custom messages that are read from a file, which can be placed on the Intranet to build up a decent mobbing culture. Click here to download the C# source code (VS2005 project, but code works with Mono). You can freely use the code as a starting point for your LED-Scroller XFD. Grab the code from the Attachments section at the end of the page.

Links to some other XFDs:

Protocol description (not every feature was reverse engineered like custom characters, but everything necessary for XFDs works):

Example telegram:

<ID00><BE>05<E>

<ID00><L1><PA><FL><Ma><WC><FD><AC><CS>eXtreme Feedback11<E>

<ID00><BF>06<E>

Serial Parms: 9600 8N1

Frame:

<*DISPLAYID*><*COMMAND*>*ARGS**CHKSUM*<E>

*CHKSUM*: 2 Chars Hex XOR without <*DISPLAYID*> and <E>

*DISPLAYID*: ID + Number: ID00

Commands:

Begin TextLines: BE

End TextLines: BF

Text Line1: L1 Args: Textargs

Set Clock: SC Args: YY??MMDDHHMMSS

Brightness 100%: BA

Brightness 75%: BB

Brightness 50%: BC

Brightness 25%: BD

Link Pages: TA Args: 00010100009912302359*PAGELIST*

Run Page: RP + Page

Special case Text: Command BeginTextLines, Command TextLine, Command EndTextLines

Textargs:

<*PAGE*><*OPENEFFECT*><*MOVESPEED*><*DISPLAYTIME*><*CLOSINGEFFECT*>*TEXTBODY*

*PAGE*: P + PageId ([A-Z]): z.B. PA

*OPENEFFECT* (+: also *CLOSINGEFFECT*)

+Immediate: FA

+Xopen: FB

+CurtainUp: FC

+CurtainDn: FD

+ScrollL: FE

+ScrollR: FF

+Vopen: FG

+VClose: FH

+ScrollU: FI

+ScrollD: FJ

+Hold: FK

Snow: FL

Twinkle: FM

BlockMove: FN

Random: FP

DISPLAYTIME:

0,5: WA

1: WB

2: WC

...

25: WZ

MOVESPEED:

0: Mq

1: Ma

2: MQ

3: MA

*TEXTBODY*: Text with Text Modifiers

Text Modifiers:

Font4x7: <AC>

Font5x7: <AA>

Font6x7: <AB>

Red: <CA>

Green: <CD>

Orange: <CH>

IRed: <CL>

IGreen: <CM>

IOrange: <CN>

RoG: <CP>

GoR: <CQ>

RYG: <CR>

Rainbow: <CS>

Date: <KD>

Time: <KT>

Bell0.5: <BA>

Bell1: <BB>

Bell1.5: <BC>

Bell2: <BD>

Checksum (C# code):

public string CreateCommand(string commandBody)

{

string result = "<ID" + _deviceId + ">" + commandBody;

byte checksum = 0;

foreach(char c in commandBody)

{

checksum = (byte)(checksum ^ (byte)c);

}

result += checksum.ToString("X02");

return result + "<E>";

}