https://p1ne.github.io/fdim-controller
FDIM has been mostly hacked by this repo.

Summary:
Heartbeat:
10hz
Indicates presence of ACM, FDIM goes inactive without this
0x 50c 01 02 00

Top line and heartbeat:
1hz
0x3e8
source enum
volume
clock length

Unknown init heartbeat:
1hz
0x3ef with a value for init and heartbeat

Clock:
20hz
0x3f2 filled with time info
Has empty clock special case

Init message:
0x 3f1 f5 90 

Lacking info on these:
0x324 - text message
0x336 - text message
0x337 - text message
0x726 - TPMS request
0x72e - TPMS response
0x3b5 - TPMS broadcast

This repo seems to hav a module that has 3 text rows, so it may be different.


Display is 20 cols 2 rows



This sends ford mariner after the system is running. You can repeatedly send it and the text stays up for about a second. So you probably need to repeat the buffer over and over to keep things displayed.

The sequence seems to be 336 324 337. 
337 contains the actual text payload.  don't know what the @'s (hex 0x40) are for.
The first 337 message, first payload byte, is the length of the message. The last frame needs to be padded with 0x00 to fill the frame.
This should be all we need to send messages to the display.

void initTextMessages()
{
  TEXT_COUNT = 0;

  text[TEXT_COUNT++].set( 1000,   0, 500, 0x336, 8, 0x03, 0x01, 0x0A, 0x01, 0xFE, 0x00, 0x00, 0x00 );
  text[TEXT_COUNT++].set( 1000,  50, 500, 0x324, 8, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00 );
  text[TEXT_COUNT++].set( 1000, 100, 500, 0x337, 8, 0x06, 0x20,  ' ',  '@',  ' ',  '@',  ' ', 0x00 );
  text[TEXT_COUNT++].set( 1000, 200, 500, 0x336, 8, 0x03, 0x01, 0x05, 0x03, 0x03, 0x00, 0x00, 0x00 );
  text[TEXT_COUNT++].set( 1000, 225, 500, 0x324, 8, 0x03, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00 );
  text[TEXT_COUNT++].set( 1000, 250, 500, 0x337, 8, 0x10, 0x2B,  ' ',  ' ',  ' ',  '@',  ' ',  ' ' );
  text[TEXT_COUNT++].set( 1000, 275, 500, 0x337, 8, 0x21,  ' ',  'M',  'e',  'r',  'c',  '@',  'u' );
  text[TEXT_COUNT++].set( 1000, 300, 500, 0x337, 8, 0x22,  'r',  'y',  ' ',  ' ',  ' ',  ' ',  ' ' );
  text[TEXT_COUNT++].set( 1000, 325, 500, 0x337, 8, 0x23,  ' ',  ' ',  ' ',  ' ',  ' ',  '@',  ' ' );
  text[TEXT_COUNT++].set( 1000, 350, 500, 0x337, 8, 0x24,  ' ',  ' ',  'M',  'a',  'r',  'i',  'n' );
  text[TEXT_COUNT++].set( 1000, 375, 500, 0x337, 8, 0x25,  'e',  'r',  ' ',  ' ',  ' ',  ' ',  ' ' );
  text[TEXT_COUNT++].set( 1000, 400, 500, 0x337, 8, 0x26,  ' ',  ' ', 0x00, 0x00, 0x00, 0x00, 0x00 );
}