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.


  • 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><L1><PA><FL><Ma><WC><FD><AC><CS>eXtreme Feedback11<E>

Serial Parms: 9600 8N1


*CHKSUM*: 2 Chars Hex XOR without <*DISPLAYID*> and <E>
*DISPLAYID*: ID + Number: ID00

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


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

+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

0,5: WA
1: WB
2: WC
25: WZ

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>
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>";
Dirk Ziegelmeier,
Aug 18, 2009, 12:35 PM