AvcLan sniffer (Toyota media devices link protocol, using to communicate between headunit, amplifier, dsp, cd-changer etc)

Dependencies:   mbed-rtos mbed

Fork of rtos_basic by mbed official

Committer:
nn1317
Date:
Tue Oct 14 06:43:12 2014 +0000
Revision:
7:164b5f80b483
Parent:
3:c92e21f305d8
Avc-Lan sniffer (Toyota media protocol between headunit, apmplifier and cd-changer)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
emilmont 1:491820ee784d 1 #include "mbed.h"
emilmont 1:491820ee784d 2 #include "rtos.h"
nn1317 7:164b5f80b483 3
nn1317 7:164b5f80b483 4 DigitalOut led1(P3_25); //leds are inversed!
nn1317 7:164b5f80b483 5 DigitalOut led2(P3_26); //leds are inversed!
nn1317 7:164b5f80b483 6 DigitalOut transmitter(P0_6);
nn1317 7:164b5f80b483 7 Timeout transmitterTimeOutControl;
nn1317 7:164b5f80b483 8
nn1317 7:164b5f80b483 9 DigitalIn receiverIn(P0_5);
nn1317 7:164b5f80b483 10 int previousReceiverState = 0;
nn1317 7:164b5f80b483 11 Timer receiverTimer;
nn1317 7:164b5f80b483 12
nn1317 7:164b5f80b483 13 #define RING_BUFFER_LENGTH 500
nn1317 7:164b5f80b483 14
nn1317 7:164b5f80b483 15 #define PREAMBULA_MINIMUM_LENGTH 150
nn1317 7:164b5f80b483 16 #define PREAMBULA_MAXIMUM_LENGTH 200
nn1317 7:164b5f80b483 17 #define BIT_0_MINIMUM_LENGTH 27
nn1317 7:164b5f80b483 18
nn1317 7:164b5f80b483 19 #define PACKET_LENGTH_IN_BITS 94
nn1317 7:164b5f80b483 20
nn1317 7:164b5f80b483 21 unsigned short ringBuffer[RING_BUFFER_LENGTH];
nn1317 7:164b5f80b483 22 int ringBufferWriteIndex=0, ringBufferReadIndex=0;
nn1317 7:164b5f80b483 23
nn1317 7:164b5f80b483 24 Serial pc(P0_2, P0_3);
nn1317 7:164b5f80b483 25
nn1317 7:164b5f80b483 26 void parseAvcPacket(int fromRingIndex, int toRingIndex)
nn1317 7:164b5f80b483 27 {
nn1317 7:164b5f80b483 28 int bitIndex = 0, blockStartLengthIndex = 0;
nn1317 7:164b5f80b483 29 unsigned short blockBits = 0x0000;
nn1317 7:164b5f80b483 30 for (int ringIndex = fromRingIndex; ringIndex != toRingIndex; )
nn1317 7:164b5f80b483 31 {
nn1317 7:164b5f80b483 32 int us_count = ringBuffer[ringBufferReadIndex];
nn1317 7:164b5f80b483 33
nn1317 7:164b5f80b483 34 if (us_count >= PREAMBULA_MAXIMUM_LENGTH)
nn1317 7:164b5f80b483 35 {
nn1317 7:164b5f80b483 36 pc.printf("\r\nWRONG %d us");
nn1317 7:164b5f80b483 37 break;
nn1317 7:164b5f80b483 38 }
nn1317 7:164b5f80b483 39 else if (us_count >= PREAMBULA_MINIMUM_LENGTH)
nn1317 7:164b5f80b483 40 pc.printf("\r\n");
nn1317 7:164b5f80b483 41 else
nn1317 7:164b5f80b483 42 {
nn1317 7:164b5f80b483 43 unsigned short bit = (us_count > BIT_0_MINIMUM_LENGTH) ? 0 : 1;
nn1317 7:164b5f80b483 44 blockBits |= (bit << blockStartLengthIndex);
nn1317 7:164b5f80b483 45
nn1317 7:164b5f80b483 46 int outInBlockLength = 8;//1, 4, 8, 12
nn1317 7:164b5f80b483 47 if ((bitIndex == 0) || (bitIndex == 13) || (bitIndex == 26) || (bitIndex == 27) || (bitIndex == 32) || (bitIndex == 33) ||
nn1317 7:164b5f80b483 48 (bitIndex == 42) || (bitIndex == 43) || (bitIndex == 52) || (bitIndex == 53) || (bitIndex == 62) || (bitIndex == 63) ||
nn1317 7:164b5f80b483 49 (bitIndex == 72) || (bitIndex == 73) || (bitIndex == 82) || (bitIndex == 83) || (bitIndex == 92) || (bitIndex == 93))
nn1317 7:164b5f80b483 50 outInBlockLength = 1;
nn1317 7:164b5f80b483 51 else if (((bitIndex < 13) && (bitIndex >= 1)) || ((bitIndex < 26) && (bitIndex >= 14)))
nn1317 7:164b5f80b483 52 outInBlockLength = 12;
nn1317 7:164b5f80b483 53 else if ((bitIndex < 32) && (bitIndex >= 28))
nn1317 7:164b5f80b483 54 outInBlockLength = 4;
nn1317 7:164b5f80b483 55
nn1317 7:164b5f80b483 56 if (blockStartLengthIndex >= outInBlockLength)
nn1317 7:164b5f80b483 57 {
nn1317 7:164b5f80b483 58 if (outInBlockLength == 1)
nn1317 7:164b5f80b483 59 pc.printf("%d ", blockBits);
nn1317 7:164b5f80b483 60 else if (outInBlockLength == 4)
nn1317 7:164b5f80b483 61 pc.printf("%X ", blockBits);
nn1317 7:164b5f80b483 62 else if (outInBlockLength == 8)
nn1317 7:164b5f80b483 63 pc.printf("%X ", blockBits);
nn1317 7:164b5f80b483 64 else if (outInBlockLength == 12)
nn1317 7:164b5f80b483 65 pc.printf("%X ", blockBits);
nn1317 7:164b5f80b483 66
nn1317 7:164b5f80b483 67 blockStartLengthIndex = 0;
nn1317 7:164b5f80b483 68 blockBits = 0x0000;
nn1317 7:164b5f80b483 69 }
nn1317 7:164b5f80b483 70
nn1317 7:164b5f80b483 71 bitIndex ++;
nn1317 7:164b5f80b483 72 blockStartLengthIndex ++;
nn1317 7:164b5f80b483 73 }
nn1317 7:164b5f80b483 74
nn1317 7:164b5f80b483 75 ringIndex = (ringIndex+1) % RING_BUFFER_LENGTH;
emilmont 1:491820ee784d 76 }
emilmont 1:491820ee784d 77 }
nn1317 7:164b5f80b483 78
nn1317 7:164b5f80b483 79 void serialCommunicationThreadFunction(void const *args)
nn1317 7:164b5f80b483 80 {
nn1317 7:164b5f80b483 81 pc.baud(115200);
nn1317 7:164b5f80b483 82 pc.printf("\r\nAVC-Lan sniffer is ON\r\n\r\n");
emilmont 1:491820ee784d 83
nn1317 7:164b5f80b483 84 led1 = 1;
nn1317 7:164b5f80b483 85
nn1317 7:164b5f80b483 86 while (true)
nn1317 7:164b5f80b483 87 {
nn1317 7:164b5f80b483 88 led1 = (ringBufferWriteIndex == ringBufferReadIndex);
nn1317 7:164b5f80b483 89
nn1317 7:164b5f80b483 90 int packetEndIndex = (ringBufferReadIndex+1) % RING_BUFFER_LENGTH;
nn1317 7:164b5f80b483 91 int packetBitLength = 0;
nn1317 7:164b5f80b483 92 for (; ringBufferWriteIndex != packetEndIndex; )
nn1317 7:164b5f80b483 93 if ((packetBitLength == PACKET_LENGTH_IN_BITS) || ((ringBuffer[packetEndIndex] >= PREAMBULA_MINIMUM_LENGTH) && (ringBuffer[packetEndIndex] < PREAMBULA_MAXIMUM_LENGTH)))
nn1317 7:164b5f80b483 94 {
nn1317 7:164b5f80b483 95 parseAvcPacket(ringBufferReadIndex, (packetBitLength == PACKET_LENGTH_IN_BITS) ? packetEndIndex : (packetEndIndex-1));
nn1317 7:164b5f80b483 96 break;
nn1317 7:164b5f80b483 97 }
nn1317 7:164b5f80b483 98 else
nn1317 7:164b5f80b483 99 {
nn1317 7:164b5f80b483 100 packetEndIndex = (packetEndIndex+1) % RING_BUFFER_LENGTH;
nn1317 7:164b5f80b483 101 packetBitLength ++;
nn1317 7:164b5f80b483 102 }
emilmont 1:491820ee784d 103 }
emilmont 1:491820ee784d 104 }
nn1317 7:164b5f80b483 105
nn1317 7:164b5f80b483 106 int main()
nn1317 7:164b5f80b483 107 {
nn1317 7:164b5f80b483 108 Thread serialCommunicationThread(serialCommunicationThreadFunction);
nn1317 7:164b5f80b483 109
nn1317 7:164b5f80b483 110 receiverIn.mode(PullUp);
nn1317 7:164b5f80b483 111
nn1317 7:164b5f80b483 112 receiverTimer.reset();
nn1317 7:164b5f80b483 113 led2 = 1;
nn1317 7:164b5f80b483 114
nn1317 7:164b5f80b483 115 while (true)
nn1317 7:164b5f80b483 116 {
nn1317 7:164b5f80b483 117 if (receiverIn != previousReceiverState)
nn1317 7:164b5f80b483 118 {
nn1317 7:164b5f80b483 119 led2 = 0;
nn1317 7:164b5f80b483 120 if (receiverIn)
nn1317 7:164b5f80b483 121 {
nn1317 7:164b5f80b483 122 receiverTimer.reset();
nn1317 7:164b5f80b483 123 receiverTimer.start();
nn1317 7:164b5f80b483 124 }
nn1317 7:164b5f80b483 125 else
nn1317 7:164b5f80b483 126 {
nn1317 7:164b5f80b483 127 receiverTimer.stop();
nn1317 7:164b5f80b483 128 int us_count = receiverTimer.read_us();
nn1317 7:164b5f80b483 129 ringBuffer[ringBufferWriteIndex] = us_count;
nn1317 7:164b5f80b483 130 ringBufferWriteIndex = (ringBufferWriteIndex+1) % RING_BUFFER_LENGTH;
nn1317 7:164b5f80b483 131 }
nn1317 7:164b5f80b483 132
nn1317 7:164b5f80b483 133 previousReceiverState = receiverIn;
nn1317 7:164b5f80b483 134 led2 = 1;
nn1317 7:164b5f80b483 135 }
nn1317 7:164b5f80b483 136 }
nn1317 7:164b5f80b483 137 }