AvcLan sniffer (Toyota media devices link protocol, using to communicate between headunit, amplifier, dsp, cd-changer etc)
Fork of rtos_basic by
main.cpp@7:164b5f80b483, 2014-10-14 (annotated)
- 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?
User | Revision | Line number | New 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 | } |