// compile with gcc DisplayMatch.c -o DisplayMatch // start with ./DisplayMatch #include #define numberOfSamples 18 #define pioneerDataNumberOfBytes 87 #define displayDataNumberOfWords 14 #define convertMatrixSize displayDataNumberOfWords*14 // store target values for 14 * 14 bits (14 relevant bits of uint16_t of DisplayData) #define debug 0 typedef short unsigned int uint16_t; typedef unsigned char uint8_t; // this is just some displaydata gathered by DisplayClicker html page const uint16_t DisplayData[numberOfSamples][displayDataNumberOfWords] = { {0x2102,0x11e3,0x1926,0x3183,0x3122,0x11e3,0x3183,0x21c3,0x0000,0x0000,0x21c3,0x1926,0x3183,0x0002}, // (LANGUAGE :ENG) {0x2102,0x11e3,0x1926,0x3183,0x3122,0x11e3,0x3183,0x21c3,0x0000,0x0000,0x01e3,0x30e2,0x2103,0x0002}, // (LANGUAGE :PYC) {0x01c3,0x1136,0x0000,0x3085,0x0409,0x21c3,0x01e3,0x0000,0x0000,0x0000,0x1020,0x3333,0x3333,0x0002}, // (FM STEP :100) {0x01c3,0x1136,0x0000,0x3085,0x0409,0x21c3,0x01e3,0x0000,0x0000,0x0000,0x0000,0x30c3,0x3333,0x0002}, // (FM STEP :50) {0x3429,0x11e3,0x34a9,0x0000,0x11e3,0x1332,0x0409,0x0000,0x01e3,0x1b22,0x3123,0x1926,0x0000,0x0002}, // (DAB ANT PW:ON) {0x3429,0x11e3,0x34a9,0x0000,0x11e3,0x1332,0x0409,0x0000,0x01e3,0x1b22,0x3123,0x01c3,0x01c3,0x0002}, // (DAB ANT PW:OFF) {0x3085,0x01e3,0x21c3,0x11e3,0x0952,0x21c3,0x09e3,0x0000,0x1136,0x3123,0x3429,0x21c3,0x0000,0x0004}, // (SPEAKER MODE >) {0x3923,0x3122,0x2409,0x0409,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0414,0x21c3,0x3085,0x0002}, // (QUIT :YES) {0x0000,0x0000,0x1926,0x3123,0x0000,0x3085,0x2409,0x3183,0x1926,0x11e3,0x2102,0x0000,0x0000,0x0000}, // (NO SIGNAL) {0x01c3,0x1136,0x1020,0x0000,0x0000,0x0000,0x0000,0x31e3,0x1021,0x30c3,0x3333,0x0000,0x0000,0x0001}, // (FM1 87.50) {0x01c3,0x1136,0x1020,0x0000,0x0000,0x0000,0x1020,0x3333,0x3333,0x3333,0x3333,0x0000,0x0000,0x0001}, // (FM1 100.00) {0x11e3,0x3122,0x0a14,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000}, // (AUX) {0x0000,0x1926,0x3123,0x0000,0x3085,0x21c3,0x09e3,0x0312,0x2409,0x2103,0x21c3,0x0000,0x0000,0x0000}, // (NO SERVICE) {0x01c3,0x3122,0x1926,0x2103,0x0409,0x2409,0x3123,0x1926,0x0000,0x0000,0x0000,0x0000,0x0000,0x0004}, // (FUNCTION >) {0x11e3,0x3122,0x3429,0x2409,0x3123,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0004}, // (AUDIO >) {0x2409,0x2102,0x2102,0x3122,0x1136,0x2409,0x1926,0x11e3,0x0409,0x2409,0x3123,0x1926,0x0000,0x0004}, // (ILLUMINATION >) {0x3085,0x0414,0x3085,0x0409,0x21c3,0x1136,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0004}, // (SYSTEM >) {0x1136,0x2409,0x0a14,0x0409,0x09e3,0x11e3,0x0a14,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0004}}; // (MIXTRAX >) // this is the complete dataset of the real display sniffed via SPI for every sample from above const uint8_t PioneerData[numberOfSamples][pioneerDataNumberOfBytes] = { {0x00,0x00,0x00,0x00,0x00,0x05,0x63,0x08,0xd2,0x51,0xc8,0x27,0x51,0x54,0x10,0x88,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x49,0x47,0x20,0x99,0x25, 0x50,0x04,0x00,0x00,0x09,0x2a,0xd2,0x51,0xa8,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // (LANGUAGE :ENG) {0x00,0x00,0x00,0x00,0x00,0x05,0x63,0x08,0xd2,0x51,0xc8,0x27,0x51,0x54,0x10,0x88,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x46,0xb0,0x29,0x45, 0x50,0x04,0x00,0x00,0x09,0x2a,0xd2,0x51,0xa8,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // (LANGUAGE :PYC) {0x00,0x00,0x00,0x00,0x00,0x05,0x40,0xe0,0x52,0x42,0x00,0x01,0x30,0x4c,0x82,0xa8,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x39,0x66,0x72,0xcc,0x40, 0x00,0x04,0x00,0x00,0x00,0x00,0x14,0x55,0x24,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // (FM STEP :100) {0x00,0x00,0x00,0x00,0x00,0x05,0x40,0xe0,0x52,0x42,0x00,0x01,0x30,0x4c,0x82,0xa8,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x39,0x66,0x92,0x28,0x00, 0x00,0x04,0x00,0x00,0x00,0x00,0x14,0x55,0x24,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // (FM STEP :50) {0x00,0x00,0x00,0x00,0x00,0x04,0xea,0x2a,0x80,0x00,0xaf,0x81,0x51,0x56,0x3e,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x20,0x9c,0x65, 0x1c,0x87,0x25,0x15,0x40,0x00,0x01,0xc0,0xc8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // (DAB ANT PW:ON) {0x00,0x00,0x00,0x00,0x00,0x04,0xea,0x2a,0x80,0x00,0xaf,0x81,0x51,0x56,0x3e,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x54,0x82,0xac,0x65, 0x1c,0x87,0x25,0x15,0x40,0x00,0x01,0xc0,0xc8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // (DAB ANT PW:OFF) {0x00,0x00,0x00,0x00,0x00,0x05,0x54,0x0a,0xd4,0x55,0x24,0xaa,0x51,0x56,0x92,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x92,0xac,0x7c, 0x08,0xca,0x33,0x04,0xc0,0x00,0x34,0x55,0x24,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // (SPEAKER MODE >) {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xc0,0x07,0x81,0x18,0x47,0x32,0x88,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x49,0x08,0x92,0xa8,0x90, 0x20,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // (QUIT :YES) {0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x46,0x51,0xc8,0x26,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0x2e,0x03,0xe8,0xf0,0x7e,0xbb,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21, 0x1a,0x8a,0xb9,0x04,0xe9,0x28,0x83,0xc0,0xa4,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // (NO SIGNAL) {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x01,0x30,0x4c,0x83,0xa8,0x06,0xe6, 0x38,0x65,0x13,0xc4,0x58,0x53,0x60,0x7d,0x1e,0x0f,0xc5,0xc0,0xf8,0x3f,0x1f,0x80,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0xe5, 0x9a,0x48,0xb1,0x18,0x2b,0x2a,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // (FM1 87.50) {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x01,0x30,0x4c,0x83,0xa8,0x06,0xe6, 0x38,0x65,0x13,0xc4,0x58,0x53,0x60,0x7d,0x1e,0x0f,0xc5,0xc0,0xf8,0x3f,0x1f,0x80,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0xe5, 0x99,0xcb,0x33,0x9e,0x67,0x2c,0xc4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // (FM1 100.00) {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x15,0x18,0x46,0xa2,0xa8,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3e,0x8f,0x07,0xc3,0xf0,0x6c,0x9b,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // (AUX) {0x00,0x00,0x00,0x00,0x00,0x05,0x69,0x21,0x00,0x00,0x8c,0xa3,0x90,0x4c,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0xbb,0x04,0x3f,0x00,0x10,0x0f,0xa3,0xc0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x25, 0x50,0x4a,0x20,0xf0,0x04,0x0c,0xb4,0x55,0x24,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // (NO SERVICE) {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x02,0x51,0xc8,0x27,0x18,0x44,0x83,0xa8,0x00,0x00, 0x00,0x00,0x00,0x00,0x08,0x43,0xf0,0xf8,0x3f,0x58,0x83,0xf0,0xf8,0x3e,0x1f,0x80,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x2a,0x21,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x32,0x09,0xc6,0x51,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // (FUNCTION >) {0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x28,0x83,0xc0,0x8f,0x81,0x18,0x46,0xa3,0xa8,0x00,0x00, 0x00,0x00,0x00,0x00,0x08,0x43,0xf0,0xf8,0x3f,0x58,0x83,0xf0,0xf8,0x3e,0x1f,0x80,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x2a,0x21,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // (AUDIO > {0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x09,0xc6,0x11,0x04,0x22,0x08,0x44,0x1f,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x08,0x43,0xf0,0xf8,0x3f,0x58,0x83,0xf0,0xf8,0x3e,0x1f,0x80,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x2a,0x21,0x10,0x00,0x03,0x20,0x9c,0x65, 0x10,0x78,0x00,0x70,0x2a,0x2a,0xe4,0x13,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // (ILLUMINATION >) {0x00,0x00,0x00,0x00,0x00,0x04,0xc9,0x2a,0x81,0xc0,0xa4,0x84,0x24,0x0a,0x93,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x08,0x43,0xf0,0xf8,0x3f,0x58,0x83,0xf0,0xf8,0x3e,0x1f,0x80,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x2a,0x21,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // (SYSTEM >) {0x00,0x00,0x00,0x00,0x00,0x05,0x5a,0x2a,0x81,0xc0,0x50,0x14,0x0f,0x02,0x61,0x98,0x00,0x00, 0x00,0x00,0x00,0x00,0x08,0x43,0xf0,0xf8,0x3f,0x58,0x83,0xf0,0xf8,0x3e,0x1f,0x80,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x2a,0x21,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x0a,0xa8,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}; // (MIXTRAX >) // this function gets some displayDataPosition and loops trough all the samples. It compares if // required setting in sample matches any field in pioneerData trough all the samples void checkSamples(int displayDataPosition, uint16_t displayDataMask, uint16_t *convertMatrix, uint16_t convertValuePosition) { // for all displayData check pioneerData uint8_t pioneerDataMask = 0x80; int pioneerDataPosition = 0, samplePosition = 0; uint16_t convertValue = 0; while (samplePosition < numberOfSamples) { uint16_t DisplayDataSample = DisplayData[samplePosition][displayDataPosition] & displayDataMask; uint8_t PioneerDataSample = PioneerData[samplePosition][pioneerDataPosition] & pioneerDataMask; //printf("Start calculation for 0x%.4x 0x%.2x\n", DisplayDataSample, PioneerDataSample); if ( ( (DisplayDataSample != 0) && (PioneerDataSample != 0) ) || ( (DisplayDataSample == 0) && (PioneerDataSample == 0) ) ) { // matched, try next sample samplePosition++; if (debug) printf("*"); } else { // didn't matched, try next field of pioneerData samplePosition = 0; if (debug) printf("."); pioneerDataMask = pioneerDataMask >> 1; convertValue++; if (pioneerDataMask == 0) { pioneerDataMask = 0x80; pioneerDataPosition++; if (pioneerDataPosition >= pioneerDataNumberOfBytes) { if (debug) printf("?"); break; } if (debug) printf("+"); } } } if (pioneerDataPosition >= pioneerDataNumberOfBytes) { printf("##### Problem with match %d 0x%.4x\n", displayDataPosition, displayDataMask); convertMatrix[convertValuePosition] = 0xffff; } else { if (debug) printf("Found position %d %d %d for %d 0x%.4x\n", convertValuePosition, samplePosition, convertValue, displayDataPosition, displayDataMask); convertMatrix[convertValuePosition] = convertValue; } } main() { printf("****************************************************************\n"); printf("* DisplayMatch conversionMatrix generator v 0.1 *\n"); printf("* just compares tow arrays to find control-bits of a display *\n"); printf("* see source code for comparison data *\n"); printf("* GPL 2017 - R Ejury *\n"); printf("****************************************************************\n\n"); int displayDataPosition = 0; uint16_t displayDataMask; uint16_t convertValuePosition = 0; // Ergebnis-Matrix (für jedes Display-Bit die entsprechende Position in PioneerData uint16_t convertMatrix[convertMatrixSize]; uint8_t convertMatrixEmpty[convertMatrixSize]; int index = 0; while (index < convertMatrixSize) convertMatrixEmpty[index++] = 1; // loop trough all displayData while (displayDataPosition < displayDataNumberOfWords) { displayDataMask = 0x2000; // only check the lowest 14 bits while (displayDataMask != 0) { if (debug) printf("Start calculation for %d 0x%.4x\n", displayDataPosition, displayDataMask); if (convertMatrixEmpty[convertValuePosition]) checkSamples(displayDataPosition, displayDataMask, convertMatrix, convertValuePosition); displayDataMask = displayDataMask >> 1; convertValuePosition++; } displayDataPosition++; } convertValuePosition = 0; // dump output matrix for further use printf("\n\n// 14 values per line for every LED-Segment with 14 Bars\n"); printf("// 13 lines for all 13 Segments\n"); printf("// one extra line for dots and arrows\n"); printf("// D C L M N E G2 G1 B K J H F A\n"); printf("uint16_t convertMatrix[%d] = [\n ", convertMatrixSize); while (convertValuePosition < convertMatrixSize) { switch (convertMatrix[convertValuePosition]) { case 0xffff: printf(" ?? "); convertValuePosition++; break; case 0x0000: printf(" "); convertValuePosition++; break; default: printf("0x%.4x", convertMatrix[convertValuePosition++]); } if (convertValuePosition < convertMatrixSize) printf(","); if (convertValuePosition && convertValuePosition % 14 == 0) printf("\n "); } printf("];\n\n"); int referenceValue = 0; convertValuePosition = 0; referenceValue = convertMatrix[0]; printf("\n\n// And now the offsets to the values in first row\n"); printf("// there might be schema if all Segments are connected the same way\n"); printf("// (without extra line for dots and arrows)\n"); printf("// D C L M N E G2 G1 B K J H F A\n"); printf("int offsetMatrix[%d] = [\n ", convertMatrixSize); while (convertValuePosition < convertMatrixSize - 14) { if (convertValuePosition && convertValuePosition % 14 == 0) referenceValue = convertMatrix[convertValuePosition]; switch (convertMatrix[convertValuePosition]) { case 0xffff: printf(" ?? "); convertValuePosition++; break; case 0x0000: printf(" "); convertValuePosition++; break; default: printf("%6d", referenceValue - convertMatrix[convertValuePosition++]); } if (convertValuePosition < convertMatrixSize - 14) printf(","); if (convertValuePosition && convertValuePosition % 14 == 0) printf("\n "); } printf("];\n\n"); }