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:
- http://www.developertesting.com/archives/month200404/20040401-eXtremeFeedbackForSoftwareDevelopment.html
- http://www.artima.com/weblogs/viewpost.jsp?thread=67492
- http://schneide.wordpress.com/2007/03/04/extreme-feedback-device-das-code-flow-o-meter/
- http://weblogs.java.net/blog/nidaley/archive/2007/08/my_extreme_feed_1.html
- http://code.google.com/p/extreme-feedback-device/
- http://www.think-box.co.uk/blog/2006/12/ultimate-extreme-feedback-device.html
- http://www.pragmaticautomation.com/cgi-bin/pragauto.cgi/2004/12/17
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>";
}