Sophie Dexter
/
Just4Trionic
Just4Trionic - CAN and BDM FLASH programmer for Saab cars
gmlan.cpp@4:682d96ff6d79, 2013-09-11 (annotated)
- Committer:
- Just4pLeisure
- Date:
- Wed Sep 11 11:55:51 2013 +0000
- Revision:
- 4:682d96ff6d79
- Child:
- 5:1775b4b13232
This update adds T8 CAN DUMP and FLASH capability (recovery still to do)
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Just4pLeisure | 4:682d96ff6d79 | 1 | #include "gmlan.h" |
Just4pLeisure | 4:682d96ff6d79 | 2 | |
Just4pLeisure | 4:682d96ff6d79 | 3 | void GMLANTesterPresentAll() |
Just4pLeisure | 4:682d96ff6d79 | 4 | { |
Just4pLeisure | 4:682d96ff6d79 | 5 | char GMLANMsg[] = GMLANTesterPresentFunctional; |
Just4pLeisure | 4:682d96ff6d79 | 6 | can_send_timeout(GMLANALLNODES, GMLANMsg, 3, GMLANPTCT); |
Just4pLeisure | 4:682d96ff6d79 | 7 | ACTIVITYLEDON; |
Just4pLeisure | 4:682d96ff6d79 | 8 | } |
Just4pLeisure | 4:682d96ff6d79 | 9 | |
Just4pLeisure | 4:682d96ff6d79 | 10 | void GMLANTesterPresentT8() |
Just4pLeisure | 4:682d96ff6d79 | 11 | { |
Just4pLeisure | 4:682d96ff6d79 | 12 | char GMLANMsg[] = GMLANTesterPresentPhysical; |
Just4pLeisure | 4:682d96ff6d79 | 13 | can_send_timeout(T8RequestId, GMLANMsg, 8, GMLANPTCT); |
Just4pLeisure | 4:682d96ff6d79 | 14 | can_wait_timeout(T8ResponseId, GMLANMsg, 8, GMLANPTCT); |
Just4pLeisure | 4:682d96ff6d79 | 15 | ACTIVITYLEDON; |
Just4pLeisure | 4:682d96ff6d79 | 16 | } |
Just4pLeisure | 4:682d96ff6d79 | 17 | |
Just4pLeisure | 4:682d96ff6d79 | 18 | // All steps needed in preparation for using a bootloader ('Utility File' in GMLAN parlance) |
Just4pLeisure | 4:682d96ff6d79 | 19 | bool GMLANprogrammingSetupProcess() |
Just4pLeisure | 4:682d96ff6d79 | 20 | { |
Just4pLeisure | 4:682d96ff6d79 | 21 | printf("Starting Diagnostic session\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 22 | if (!GMLANinitiateDiagnostic(GMLANdisableAllDTCs)) { |
Just4pLeisure | 4:682d96ff6d79 | 23 | printf("Unable to start Diagnostic session\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 24 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 25 | } |
Just4pLeisure | 4:682d96ff6d79 | 26 | printf("Disabling Normal Communincation Messages\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 27 | if (!GMLANdisableNormalCommunication()) { |
Just4pLeisure | 4:682d96ff6d79 | 28 | printf("Unable to tell T8 to disable normal communication messages\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 29 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 30 | } |
Just4pLeisure | 4:682d96ff6d79 | 31 | printf("Report Programmed State\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 32 | if (!GMLANReportProgrammedState()) { |
Just4pLeisure | 4:682d96ff6d79 | 33 | printf("Unable to determine ECU programmed state\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 34 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 35 | } |
Just4pLeisure | 4:682d96ff6d79 | 36 | printf("Requesting program mode\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 37 | if (!GMLANProgrammingMode(GMLANRequestProgrammingNormal)) { |
Just4pLeisure | 4:682d96ff6d79 | 38 | printf("Unable to request programming mode\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 39 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 40 | } |
Just4pLeisure | 4:682d96ff6d79 | 41 | printf("Starting program session\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 42 | if (!GMLANProgrammingMode(GMLANEnableProgrammingMode)) { |
Just4pLeisure | 4:682d96ff6d79 | 43 | printf("Unable to start program session\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 44 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 45 | } |
Just4pLeisure | 4:682d96ff6d79 | 46 | return TRUE; |
Just4pLeisure | 4:682d96ff6d79 | 47 | } |
Just4pLeisure | 4:682d96ff6d79 | 48 | |
Just4pLeisure | 4:682d96ff6d79 | 49 | |
Just4pLeisure | 4:682d96ff6d79 | 50 | // All steps needed to transfer and start a bootloader ('Utility File' in GMLAN parlance) |
Just4pLeisure | 4:682d96ff6d79 | 51 | bool GMLANprogrammingUtilityFileProcess(char UtilityFile[]) |
Just4pLeisure | 4:682d96ff6d79 | 52 | { |
Just4pLeisure | 4:682d96ff6d79 | 53 | uint16_t i = 0, j = 0, k = 0; |
Just4pLeisure | 4:682d96ff6d79 | 54 | uint32_t StartAddress = 0x102400; |
Just4pLeisure | 4:682d96ff6d79 | 55 | uint16_t txpnt = 0; |
Just4pLeisure | 4:682d96ff6d79 | 56 | char iFrameNumber = 0x21; |
Just4pLeisure | 4:682d96ff6d79 | 57 | char GMLANMsg[8]; |
Just4pLeisure | 4:682d96ff6d79 | 58 | //char BootLoader[] = T8Bootloader; |
Just4pLeisure | 4:682d96ff6d79 | 59 | // |
Just4pLeisure | 4:682d96ff6d79 | 60 | printf("Waiting for Permission to send bootloader\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 61 | if (!GMLANRequestDownload(GMLANRequestDownloadModeNormal)) { |
Just4pLeisure | 4:682d96ff6d79 | 62 | printf("Unable to request Bootloader Upload\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 63 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 64 | } |
Just4pLeisure | 4:682d96ff6d79 | 65 | printf("Sending Bootloader\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 66 | printf(" 0.00 %% complete.\r"); |
Just4pLeisure | 4:682d96ff6d79 | 67 | // |
Just4pLeisure | 4:682d96ff6d79 | 68 | for (i=0; i<0x46; i++) { |
Just4pLeisure | 4:682d96ff6d79 | 69 | if (!GMLANDataTransferFirstFrame(0xF0, GMLANDOWNLOAD, StartAddress)) { |
Just4pLeisure | 4:682d96ff6d79 | 70 | printf("Unable to start Bootloader Upload\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 71 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 72 | } |
Just4pLeisure | 4:682d96ff6d79 | 73 | iFrameNumber = 0x21; |
Just4pLeisure | 4:682d96ff6d79 | 74 | for (j=0; j < 0x22; j++) { |
Just4pLeisure | 4:682d96ff6d79 | 75 | GMLANMsg[0] = iFrameNumber; |
Just4pLeisure | 4:682d96ff6d79 | 76 | for (k=1; k<8; k++) |
Just4pLeisure | 4:682d96ff6d79 | 77 | GMLANMsg[k] = UtilityFile[txpnt++]; |
Just4pLeisure | 4:682d96ff6d79 | 78 | #ifdef DEBUG |
Just4pLeisure | 4:682d96ff6d79 | 79 | for (k = 0; k < 8; k++ ) printf("0x%02X ", GMLANMsg[k] ); |
Just4pLeisure | 4:682d96ff6d79 | 80 | printf("\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 81 | #endif |
Just4pLeisure | 4:682d96ff6d79 | 82 | if (!can_send_timeout(T8RequestId, GMLANMsg, 8, GMLANPTCT)) { |
Just4pLeisure | 4:682d96ff6d79 | 83 | printf("Unable to send Bootloader\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 84 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 85 | } |
Just4pLeisure | 4:682d96ff6d79 | 86 | ++iFrameNumber &= 0x2F; |
Just4pLeisure | 4:682d96ff6d79 | 87 | wait_ms(1); |
Just4pLeisure | 4:682d96ff6d79 | 88 | // wait_us(500); |
Just4pLeisure | 4:682d96ff6d79 | 89 | } |
Just4pLeisure | 4:682d96ff6d79 | 90 | if (!can_wait_timeout(T8ResponseId, GMLANMsg, 8, GMLANPTCT)) { |
Just4pLeisure | 4:682d96ff6d79 | 91 | printf("I didn't receive a block acknowledge message\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 92 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 93 | } |
Just4pLeisure | 4:682d96ff6d79 | 94 | while (GMLANMsg[0] == 0x03 && GMLANMsg[1] == 0x7F && GMLANMsg[2] == 0x36 && GMLANMsg[3] == 0x78) { |
Just4pLeisure | 4:682d96ff6d79 | 95 | printf("I'm waiting for a BootLoader Block to upload\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 96 | if (!can_wait_timeout(T8ResponseId, GMLANMsg, 8, GMLANPTCTENHANCED)) { |
Just4pLeisure | 4:682d96ff6d79 | 97 | printf("I didn't receive a block acknowledge message after enhanced timeout\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 98 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 99 | } |
Just4pLeisure | 4:682d96ff6d79 | 100 | } |
Just4pLeisure | 4:682d96ff6d79 | 101 | #ifdef DEBUG |
Just4pLeisure | 4:682d96ff6d79 | 102 | for (k = 0; k < 8; k++ ) printf("0x%02X ", GMLANMsg[k] ); |
Just4pLeisure | 4:682d96ff6d79 | 103 | printf("\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 104 | #endif |
Just4pLeisure | 4:682d96ff6d79 | 105 | if ( GMLANMsg[0] == 0x03 && GMLANMsg[1] == 0x7F && GMLANMsg[2] == 0x36 ) { |
Just4pLeisure | 4:682d96ff6d79 | 106 | GMLANShowReturnCode(GMLANMsg[3]); |
Just4pLeisure | 4:682d96ff6d79 | 107 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 108 | } |
Just4pLeisure | 4:682d96ff6d79 | 109 | if (GMLANMsg[0] != 0x01 && GMLANMsg[1] != 0x76) { |
Just4pLeisure | 4:682d96ff6d79 | 110 | printf("EXITING due to an unexpected CAN message\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 111 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 112 | } |
Just4pLeisure | 4:682d96ff6d79 | 113 | GMLANTesterPresentT8(); |
Just4pLeisure | 4:682d96ff6d79 | 114 | ACTIVITYLEDON; |
Just4pLeisure | 4:682d96ff6d79 | 115 | StartAddress += 0xea; |
Just4pLeisure | 4:682d96ff6d79 | 116 | printf("%6.2f\r", 100*(float)txpnt/(float)(16384+(70*4)) ); |
Just4pLeisure | 4:682d96ff6d79 | 117 | } |
Just4pLeisure | 4:682d96ff6d79 | 118 | wait_ms(1); |
Just4pLeisure | 4:682d96ff6d79 | 119 | if (!GMLANDataTransferFirstFrame(0x0A, GMLANDOWNLOAD, StartAddress)) { |
Just4pLeisure | 4:682d96ff6d79 | 120 | printf("Unable to finish Bootloader Upload\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 121 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 122 | } |
Just4pLeisure | 4:682d96ff6d79 | 123 | iFrameNumber = 0x21; |
Just4pLeisure | 4:682d96ff6d79 | 124 | GMLANMsg[0] = iFrameNumber; |
Just4pLeisure | 4:682d96ff6d79 | 125 | for (k=0; k<7; k++) { |
Just4pLeisure | 4:682d96ff6d79 | 126 | GMLANMsg[k+1] = UtilityFile[txpnt++]; |
Just4pLeisure | 4:682d96ff6d79 | 127 | } |
Just4pLeisure | 4:682d96ff6d79 | 128 | if (!can_send_timeout(T8RequestId, GMLANMsg, 8, GMLANPTCT)) { |
Just4pLeisure | 4:682d96ff6d79 | 129 | printf("Unable to finish sending Bootloader\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 130 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 131 | } |
Just4pLeisure | 4:682d96ff6d79 | 132 | if (!can_wait_timeout(T8ResponseId, GMLANMsg, 8, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 133 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 134 | #ifdef DEBUG |
Just4pLeisure | 4:682d96ff6d79 | 135 | for (k = 0; k < 8; k++ ) printf("0x%02X ", GMLANMsg[k] ); |
Just4pLeisure | 4:682d96ff6d79 | 136 | printf("\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 137 | #endif |
Just4pLeisure | 4:682d96ff6d79 | 138 | printf("%6.2f\r\n", (float)100 ); |
Just4pLeisure | 4:682d96ff6d79 | 139 | printf("Starting the bootloader\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 140 | if (!GMLANDataTransfer(0x06, GMLANEXECUTE, 0x00102460)) { |
Just4pLeisure | 4:682d96ff6d79 | 141 | printf("Unable to start the Bootloader\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 142 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 143 | } |
Just4pLeisure | 4:682d96ff6d79 | 144 | wait_ms(500); |
Just4pLeisure | 4:682d96ff6d79 | 145 | return TRUE; |
Just4pLeisure | 4:682d96ff6d79 | 146 | } |
Just4pLeisure | 4:682d96ff6d79 | 147 | |
Just4pLeisure | 4:682d96ff6d79 | 148 | bool GMLANinitiateDiagnostic(char level) |
Just4pLeisure | 4:682d96ff6d79 | 149 | { |
Just4pLeisure | 4:682d96ff6d79 | 150 | char GMLANMsg[] = GMLANinitiateDiagnosticOperation; |
Just4pLeisure | 4:682d96ff6d79 | 151 | GMLANMsg[2] = level; |
Just4pLeisure | 4:682d96ff6d79 | 152 | if (!can_send_timeout(T8RequestId, GMLANMsg, 3, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 153 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 154 | if (!can_wait_timeout(T8ResponseId, GMLANMsg, 8, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 155 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 156 | while (GMLANMsg[0] == 0x03 && GMLANMsg[1] == 0x7F && GMLANMsg[2] == 0x10 && GMLANMsg[3] == 0x78) |
Just4pLeisure | 4:682d96ff6d79 | 157 | if (!can_wait_timeout(T8ResponseId, GMLANMsg, 8, GMLANPTCTENHANCED)) |
Just4pLeisure | 4:682d96ff6d79 | 158 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 159 | #ifdef DEBUG |
Just4pLeisure | 4:682d96ff6d79 | 160 | for (char k = 0; k < 8; k++ ) printf("0x%02X ", GMLANMsg[k] ); |
Just4pLeisure | 4:682d96ff6d79 | 161 | printf("\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 162 | #endif |
Just4pLeisure | 4:682d96ff6d79 | 163 | if ( GMLANMsg[0] == 0x03 && GMLANMsg[1] == 0x7F && GMLANMsg[2] == 0x10 ) |
Just4pLeisure | 4:682d96ff6d79 | 164 | GMLANShowReturnCode(GMLANMsg[3]); |
Just4pLeisure | 4:682d96ff6d79 | 165 | return (GMLANMsg[0] == 0x01 && GMLANMsg[1] == 0x50) ? TRUE : FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 166 | } |
Just4pLeisure | 4:682d96ff6d79 | 167 | |
Just4pLeisure | 4:682d96ff6d79 | 168 | |
Just4pLeisure | 4:682d96ff6d79 | 169 | bool GMLANdisableNormalCommunication() |
Just4pLeisure | 4:682d96ff6d79 | 170 | { |
Just4pLeisure | 4:682d96ff6d79 | 171 | char GMLANMsg[] = GMLANdisableCommunication; |
Just4pLeisure | 4:682d96ff6d79 | 172 | if (!can_send_timeout(T8RequestId, GMLANMsg, 2, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 173 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 174 | if (!can_wait_timeout(T8ResponseId, GMLANMsg, 8, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 175 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 176 | while (GMLANMsg[0] == 0x7F && GMLANMsg[2] == 0x78) |
Just4pLeisure | 4:682d96ff6d79 | 177 | if (!can_wait_timeout(T8ResponseId, GMLANMsg, 8, GMLANPTCTENHANCED)) |
Just4pLeisure | 4:682d96ff6d79 | 178 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 179 | #ifdef DEBUG |
Just4pLeisure | 4:682d96ff6d79 | 180 | for (char k = 0; k < 8; k++ ) printf("0x%02X ", GMLANMsg[k] ); |
Just4pLeisure | 4:682d96ff6d79 | 181 | printf("\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 182 | #endif |
Just4pLeisure | 4:682d96ff6d79 | 183 | if ( GMLANMsg[0] == 0x03 && GMLANMsg[1] == 0x7F && GMLANMsg[2] == 0x28 ) |
Just4pLeisure | 4:682d96ff6d79 | 184 | GMLANShowReturnCode(GMLANMsg[3]); |
Just4pLeisure | 4:682d96ff6d79 | 185 | return (GMLANMsg[0] == 0x01 && GMLANMsg[1] == 0x68) ? TRUE : FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 186 | } |
Just4pLeisure | 4:682d96ff6d79 | 187 | |
Just4pLeisure | 4:682d96ff6d79 | 188 | |
Just4pLeisure | 4:682d96ff6d79 | 189 | bool GMLANReportProgrammedState() |
Just4pLeisure | 4:682d96ff6d79 | 190 | { |
Just4pLeisure | 4:682d96ff6d79 | 191 | char GMLANMsg[] = GMLANReportProgrammed; |
Just4pLeisure | 4:682d96ff6d79 | 192 | if (!can_send_timeout(T8RequestId, GMLANMsg, 2, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 193 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 194 | if (!can_wait_timeout(T8ResponseId, GMLANMsg, 8, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 195 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 196 | while (GMLANMsg[0] == 0x7F && GMLANMsg[2] == 0x78) |
Just4pLeisure | 4:682d96ff6d79 | 197 | if (!can_wait_timeout(T8ResponseId, GMLANMsg, 8, GMLANPTCTENHANCED)) |
Just4pLeisure | 4:682d96ff6d79 | 198 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 199 | #ifdef DEBUG |
Just4pLeisure | 4:682d96ff6d79 | 200 | for (char k = 0; k < 8; k++ ) printf("0x%02X ", GMLANMsg[k] ); |
Just4pLeisure | 4:682d96ff6d79 | 201 | printf("\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 202 | #endif |
Just4pLeisure | 4:682d96ff6d79 | 203 | if ( GMLANMsg[0] == 0x03 && GMLANMsg[1] == 0x7F && GMLANMsg[2] == 0xA2 ) |
Just4pLeisure | 4:682d96ff6d79 | 204 | GMLANShowReturnCode(GMLANMsg[3]); |
Just4pLeisure | 4:682d96ff6d79 | 205 | return (GMLANMsg[0] == 0x02 && GMLANMsg[1] == 0xE2) ? TRUE : FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 206 | } |
Just4pLeisure | 4:682d96ff6d79 | 207 | |
Just4pLeisure | 4:682d96ff6d79 | 208 | |
Just4pLeisure | 4:682d96ff6d79 | 209 | bool GMLANProgrammingMode(char mode) |
Just4pLeisure | 4:682d96ff6d79 | 210 | { |
Just4pLeisure | 4:682d96ff6d79 | 211 | char GMLANMsg[] = GMLANProgramming; |
Just4pLeisure | 4:682d96ff6d79 | 212 | GMLANMsg[2] = mode; |
Just4pLeisure | 4:682d96ff6d79 | 213 | #ifdef DEBUG |
Just4pLeisure | 4:682d96ff6d79 | 214 | for (char k = 0; k < 8; k++ ) printf("0x%02X ", GMLANMsg[k] ); |
Just4pLeisure | 4:682d96ff6d79 | 215 | printf("\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 216 | #endif |
Just4pLeisure | 4:682d96ff6d79 | 217 | if (!can_send_timeout(T8RequestId, GMLANMsg, 3, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 218 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 219 | if (mode == GMLANEnableProgrammingMode) |
Just4pLeisure | 4:682d96ff6d79 | 220 | return TRUE; // No response expected when enabling program mode |
Just4pLeisure | 4:682d96ff6d79 | 221 | if (!can_wait_timeout(T8ResponseId, GMLANMsg, 8, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 222 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 223 | while (GMLANMsg[0] == 0x7F && GMLANMsg[2] == 0x78) |
Just4pLeisure | 4:682d96ff6d79 | 224 | if (!can_wait_timeout(T8ResponseId, GMLANMsg, 8, GMLANPTCTENHANCED)) |
Just4pLeisure | 4:682d96ff6d79 | 225 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 226 | #ifdef DEBUG |
Just4pLeisure | 4:682d96ff6d79 | 227 | for (char k = 0; k < 8; k++ ) printf("0x%02X ", GMLANMsg[k] ); |
Just4pLeisure | 4:682d96ff6d79 | 228 | printf("\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 229 | #endif |
Just4pLeisure | 4:682d96ff6d79 | 230 | if ( GMLANMsg[0] == 0x03 && GMLANMsg[1] == 0x7F && GMLANMsg[2] == 0xA5 ) |
Just4pLeisure | 4:682d96ff6d79 | 231 | GMLANShowReturnCode(GMLANMsg[3]); |
Just4pLeisure | 4:682d96ff6d79 | 232 | return (GMLANMsg[0] == 0x01 && GMLANMsg[1] == 0xE5) ? TRUE : FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 233 | } |
Just4pLeisure | 4:682d96ff6d79 | 234 | |
Just4pLeisure | 4:682d96ff6d79 | 235 | bool GMLANSecurityAccessRequest(char level, uint16_t& seed) |
Just4pLeisure | 4:682d96ff6d79 | 236 | { |
Just4pLeisure | 4:682d96ff6d79 | 237 | char GMLANMsg[] = GMLANSecurityAccessSeed; |
Just4pLeisure | 4:682d96ff6d79 | 238 | GMLANMsg[2] = level; |
Just4pLeisure | 4:682d96ff6d79 | 239 | #ifdef DEBUG |
Just4pLeisure | 4:682d96ff6d79 | 240 | for (char k = 0; k < 8; k++ ) printf("0x%02X ", GMLANMsg[k] ); |
Just4pLeisure | 4:682d96ff6d79 | 241 | printf("\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 242 | #endif |
Just4pLeisure | 4:682d96ff6d79 | 243 | if (!can_send_timeout(T8RequestId, GMLANMsg, 3, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 244 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 245 | if (!can_wait_timeout(T8ResponseId, GMLANMsg, 8, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 246 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 247 | while (GMLANMsg[0] == 0x7F && GMLANMsg[2] == 0x78) |
Just4pLeisure | 4:682d96ff6d79 | 248 | if (!can_wait_timeout(T8ResponseId, GMLANMsg, 8, GMLANPTCTENHANCED)) |
Just4pLeisure | 4:682d96ff6d79 | 249 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 250 | #ifdef DEBUG |
Just4pLeisure | 4:682d96ff6d79 | 251 | for (char k = 0; k < 8; k++ ) printf("0x%02X ", GMLANMsg[k] ); |
Just4pLeisure | 4:682d96ff6d79 | 252 | printf("\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 253 | #endif |
Just4pLeisure | 4:682d96ff6d79 | 254 | seed = GMLANMsg[3] << 8 | GMLANMsg[4]; |
Just4pLeisure | 4:682d96ff6d79 | 255 | if ( GMLANMsg[0] == 0x03 && GMLANMsg[1] == 0x7F && GMLANMsg[2] == 0x27 ) |
Just4pLeisure | 4:682d96ff6d79 | 256 | GMLANShowReturnCode(GMLANMsg[3]); |
Just4pLeisure | 4:682d96ff6d79 | 257 | return (GMLANMsg[0] == 0x04 && GMLANMsg[1] == 0x67 && GMLANMsg[2] == level) ? TRUE : FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 258 | } |
Just4pLeisure | 4:682d96ff6d79 | 259 | |
Just4pLeisure | 4:682d96ff6d79 | 260 | bool GMLANSecurityAccessSendKey(char level, uint16_t key) |
Just4pLeisure | 4:682d96ff6d79 | 261 | { |
Just4pLeisure | 4:682d96ff6d79 | 262 | char GMLANMsg[] = GMLANSecurityAccessKey; |
Just4pLeisure | 4:682d96ff6d79 | 263 | GMLANMsg[2] = level+1; |
Just4pLeisure | 4:682d96ff6d79 | 264 | GMLANMsg[3] = (key >> 8) & 0xFF; |
Just4pLeisure | 4:682d96ff6d79 | 265 | GMLANMsg[4] = key & 0xFF; |
Just4pLeisure | 4:682d96ff6d79 | 266 | #ifdef DEBUG |
Just4pLeisure | 4:682d96ff6d79 | 267 | for (char k = 0; k < 8; k++ ) printf("0x%02X ", GMLANMsg[k] ); |
Just4pLeisure | 4:682d96ff6d79 | 268 | printf("\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 269 | #endif |
Just4pLeisure | 4:682d96ff6d79 | 270 | if (!can_send_timeout(T8RequestId, GMLANMsg, 5, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 271 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 272 | if (!can_wait_timeout(T8ResponseId, GMLANMsg, 8, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 273 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 274 | while (GMLANMsg[0] == 0x7F && GMLANMsg[2] == 0x78) |
Just4pLeisure | 4:682d96ff6d79 | 275 | if (!can_wait_timeout(T8ResponseId, GMLANMsg, 8, GMLANPTCTENHANCED)) |
Just4pLeisure | 4:682d96ff6d79 | 276 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 277 | #ifdef DEBUG |
Just4pLeisure | 4:682d96ff6d79 | 278 | for (char k = 0; k < 8; k++ ) printf("0x%02X ", GMLANMsg[k] ); |
Just4pLeisure | 4:682d96ff6d79 | 279 | printf("\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 280 | #endif |
Just4pLeisure | 4:682d96ff6d79 | 281 | if ( GMLANMsg[0] == 0x03 && GMLANMsg[1] == 0x7F && GMLANMsg[2] == 0x27 ) |
Just4pLeisure | 4:682d96ff6d79 | 282 | GMLANShowReturnCode(GMLANMsg[3]); |
Just4pLeisure | 4:682d96ff6d79 | 283 | return (GMLANMsg[0] == 0x02 && GMLANMsg[1] == 0x67 && GMLANMsg[2] == level+1) ? TRUE : FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 284 | } |
Just4pLeisure | 4:682d96ff6d79 | 285 | |
Just4pLeisure | 4:682d96ff6d79 | 286 | bool GMLANRequestDownload(char dataFormatIdentifier) |
Just4pLeisure | 4:682d96ff6d79 | 287 | { |
Just4pLeisure | 4:682d96ff6d79 | 288 | char GMLANMsg[] = GMLANRequestDownloadMessage; |
Just4pLeisure | 4:682d96ff6d79 | 289 | GMLANMsg[2] = dataFormatIdentifier; |
Just4pLeisure | 4:682d96ff6d79 | 290 | #ifdef DEBUG |
Just4pLeisure | 4:682d96ff6d79 | 291 | for (char k = 0; k < 8; k++ ) printf("0x%02X ", GMLANMsg[k] ); |
Just4pLeisure | 4:682d96ff6d79 | 292 | printf("\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 293 | #endif |
Just4pLeisure | 4:682d96ff6d79 | 294 | if (!can_send_timeout(T8RequestId, GMLANMsg, 7, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 295 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 296 | if (!can_wait_timeout(T8ResponseId, GMLANMsg, 8, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 297 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 298 | // while (GMLANMsg[0] == 0x7F && GMLANMsg[2] == 0x78) |
Just4pLeisure | 4:682d96ff6d79 | 299 | while (GMLANMsg[0] == 0x03 && GMLANMsg[1] == 0x7F && GMLANMsg[2] == 0x34 && GMLANMsg[3] == 0x78) { |
Just4pLeisure | 4:682d96ff6d79 | 300 | printf("Erasing\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 301 | GMLANTesterPresentT8(); |
Just4pLeisure | 4:682d96ff6d79 | 302 | ACTIVITYLEDON; |
Just4pLeisure | 4:682d96ff6d79 | 303 | if (!can_wait_timeout(T8ResponseId, GMLANMsg, 8, GMLANPTCTENHANCED)) |
Just4pLeisure | 4:682d96ff6d79 | 304 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 305 | } |
Just4pLeisure | 4:682d96ff6d79 | 306 | #ifdef DEBUG |
Just4pLeisure | 4:682d96ff6d79 | 307 | for (char k = 0; k < 8; k++ ) printf("0x%02X ", GMLANMsg[k] ); |
Just4pLeisure | 4:682d96ff6d79 | 308 | printf("\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 309 | #endif |
Just4pLeisure | 4:682d96ff6d79 | 310 | if ( GMLANMsg[0] == 0x03 && GMLANMsg[1] == 0x7F && GMLANMsg[2] == 0x34 ) |
Just4pLeisure | 4:682d96ff6d79 | 311 | GMLANShowReturnCode(GMLANMsg[3]); |
Just4pLeisure | 4:682d96ff6d79 | 312 | return (GMLANMsg[0] == 0x01 && GMLANMsg[1] == 0x74) ? TRUE : FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 313 | } |
Just4pLeisure | 4:682d96ff6d79 | 314 | |
Just4pLeisure | 4:682d96ff6d79 | 315 | |
Just4pLeisure | 4:682d96ff6d79 | 316 | bool GMLANDataTransfer(char length, char function, uint32_t address) |
Just4pLeisure | 4:682d96ff6d79 | 317 | { |
Just4pLeisure | 4:682d96ff6d79 | 318 | char GMLANMsg[8]; |
Just4pLeisure | 4:682d96ff6d79 | 319 | GMLANMsg[0] = length; |
Just4pLeisure | 4:682d96ff6d79 | 320 | GMLANMsg[1] = 0x36; |
Just4pLeisure | 4:682d96ff6d79 | 321 | GMLANMsg[2] = function; |
Just4pLeisure | 4:682d96ff6d79 | 322 | GMLANMsg[3] = (char) (address >> 24); |
Just4pLeisure | 4:682d96ff6d79 | 323 | GMLANMsg[4] = (char) (address >> 16); |
Just4pLeisure | 4:682d96ff6d79 | 324 | GMLANMsg[5] = (char) (address >> 8); |
Just4pLeisure | 4:682d96ff6d79 | 325 | GMLANMsg[6] = (char) (address); |
Just4pLeisure | 4:682d96ff6d79 | 326 | GMLANMsg[7] = 0xaa; |
Just4pLeisure | 4:682d96ff6d79 | 327 | #ifdef DEBUG |
Just4pLeisure | 4:682d96ff6d79 | 328 | for (char k = 0; k < 8; k++ ) printf("0x%02X ", GMLANMsg[k] ); |
Just4pLeisure | 4:682d96ff6d79 | 329 | printf("\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 330 | #endif |
Just4pLeisure | 4:682d96ff6d79 | 331 | if (!can_send_timeout(T8RequestId, GMLANMsg, 8, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 332 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 333 | if (!can_wait_timeout(T8ResponseId, GMLANMsg, 8, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 334 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 335 | while (GMLANMsg[0] == 0x7F && GMLANMsg[2] == 0x78) |
Just4pLeisure | 4:682d96ff6d79 | 336 | if (!can_wait_timeout(T8ResponseId, GMLANMsg, 8, GMLANPTCTENHANCED)) |
Just4pLeisure | 4:682d96ff6d79 | 337 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 338 | #ifdef DEBUG |
Just4pLeisure | 4:682d96ff6d79 | 339 | for (char k = 0; k < 8; k++ ) printf("0x%02X ", GMLANMsg[k] ); |
Just4pLeisure | 4:682d96ff6d79 | 340 | printf("\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 341 | #endif |
Just4pLeisure | 4:682d96ff6d79 | 342 | if ( GMLANMsg[0] == 0x03 && GMLANMsg[1] == 0x7F && GMLANMsg[2] == 0x36 ) |
Just4pLeisure | 4:682d96ff6d79 | 343 | GMLANShowReturnCode(GMLANMsg[3]); |
Just4pLeisure | 4:682d96ff6d79 | 344 | return (GMLANMsg[0] == 0x01 && GMLANMsg[1] == 0x76) ? TRUE : FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 345 | } |
Just4pLeisure | 4:682d96ff6d79 | 346 | |
Just4pLeisure | 4:682d96ff6d79 | 347 | |
Just4pLeisure | 4:682d96ff6d79 | 348 | bool GMLANDataTransferFirstFrame(char length, char function, uint32_t address) |
Just4pLeisure | 4:682d96ff6d79 | 349 | { |
Just4pLeisure | 4:682d96ff6d79 | 350 | char GMLANMsg[8]; |
Just4pLeisure | 4:682d96ff6d79 | 351 | GMLANMsg[0] = 0x10; |
Just4pLeisure | 4:682d96ff6d79 | 352 | GMLANMsg[1] = length; |
Just4pLeisure | 4:682d96ff6d79 | 353 | GMLANMsg[2] = 0x36; |
Just4pLeisure | 4:682d96ff6d79 | 354 | GMLANMsg[3] = function; |
Just4pLeisure | 4:682d96ff6d79 | 355 | GMLANMsg[4] = (char) (address >> 24); |
Just4pLeisure | 4:682d96ff6d79 | 356 | GMLANMsg[5] = (char) (address >> 16); |
Just4pLeisure | 4:682d96ff6d79 | 357 | GMLANMsg[6] = (char) (address >> 8); |
Just4pLeisure | 4:682d96ff6d79 | 358 | GMLANMsg[7] = (char) (address); |
Just4pLeisure | 4:682d96ff6d79 | 359 | #ifdef DEBUG |
Just4pLeisure | 4:682d96ff6d79 | 360 | for (char k = 0; k < 8; k++ ) printf("0x%02X ", GMLANMsg[k] ); |
Just4pLeisure | 4:682d96ff6d79 | 361 | printf("\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 362 | #endif |
Just4pLeisure | 4:682d96ff6d79 | 363 | if (!can_send_timeout(T8RequestId, GMLANMsg, 8, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 364 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 365 | if (!can_wait_timeout(T8ResponseId, GMLANMsg, 8, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 366 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 367 | while (GMLANMsg[0] == 0x7F && GMLANMsg[2] == 0x78) |
Just4pLeisure | 4:682d96ff6d79 | 368 | if (!can_wait_timeout(T8ResponseId, GMLANMsg, 8, GMLANPTCTENHANCED)) |
Just4pLeisure | 4:682d96ff6d79 | 369 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 370 | #ifdef DEBUG |
Just4pLeisure | 4:682d96ff6d79 | 371 | for (char k = 0; k < 8; k++ ) printf("0x%02X ", GMLANMsg[k] ); |
Just4pLeisure | 4:682d96ff6d79 | 372 | printf("\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 373 | #endif |
Just4pLeisure | 4:682d96ff6d79 | 374 | if ( GMLANMsg[0] == 0x03 && GMLANMsg[1] == 0x7F && GMLANMsg[2] == 0x36 ) |
Just4pLeisure | 4:682d96ff6d79 | 375 | GMLANShowReturnCode(GMLANMsg[3]); |
Just4pLeisure | 4:682d96ff6d79 | 376 | return (GMLANMsg[0] == 0x30 && GMLANMsg[1] == 0x00 && GMLANMsg[2] == 0x00) ? TRUE : FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 377 | } |
Just4pLeisure | 4:682d96ff6d79 | 378 | |
Just4pLeisure | 4:682d96ff6d79 | 379 | |
Just4pLeisure | 4:682d96ff6d79 | 380 | bool GMLANDataTransferConsecutiveFrame(char framenumber, char data[7]) |
Just4pLeisure | 4:682d96ff6d79 | 381 | { |
Just4pLeisure | 4:682d96ff6d79 | 382 | char GMLANMsg[8]; |
Just4pLeisure | 4:682d96ff6d79 | 383 | GMLANMsg[0] = framenumber; |
Just4pLeisure | 4:682d96ff6d79 | 384 | for (char k = 0; k < 7; k++ ) |
Just4pLeisure | 4:682d96ff6d79 | 385 | GMLANMsg[k+1] = data[k]; |
Just4pLeisure | 4:682d96ff6d79 | 386 | #ifdef DEBUG |
Just4pLeisure | 4:682d96ff6d79 | 387 | for (char k = 0; k < 8; k++ ) printf("0x%02X ", GMLANMsg[k] ); |
Just4pLeisure | 4:682d96ff6d79 | 388 | printf("\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 389 | #endif |
Just4pLeisure | 4:682d96ff6d79 | 390 | return (can_send_timeout(T8RequestId, GMLANMsg, 8, GMLANPTCT)) ? TRUE : FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 391 | } |
Just4pLeisure | 4:682d96ff6d79 | 392 | |
Just4pLeisure | 4:682d96ff6d79 | 393 | bool GMLANReturnToNormalMode() |
Just4pLeisure | 4:682d96ff6d79 | 394 | { |
Just4pLeisure | 4:682d96ff6d79 | 395 | char GMLANMsg[] = GMLANRetrunToNormalModeMessage; |
Just4pLeisure | 4:682d96ff6d79 | 396 | if (!can_send_timeout(T8RequestId, GMLANMsg, 2, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 397 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 398 | if (!can_wait_timeout(T8ResponseId, GMLANMsg, 8, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 399 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 400 | while (GMLANMsg[0] == 0x7F && GMLANMsg[2] == 0x78) |
Just4pLeisure | 4:682d96ff6d79 | 401 | if (!can_wait_timeout(T8ResponseId, GMLANMsg, 8, GMLANPTCTENHANCED)) |
Just4pLeisure | 4:682d96ff6d79 | 402 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 403 | #ifdef DEBUG |
Just4pLeisure | 4:682d96ff6d79 | 404 | for (char k = 0; k < 8; k++ ) printf("0x%02X ", GMLANMsg[k] ); |
Just4pLeisure | 4:682d96ff6d79 | 405 | printf("\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 406 | #endif |
Just4pLeisure | 4:682d96ff6d79 | 407 | if ( GMLANMsg[0] == 0x03 && GMLANMsg[1] == 0x7F && GMLANMsg[2] == 0x28 ) |
Just4pLeisure | 4:682d96ff6d79 | 408 | GMLANShowReturnCode(GMLANMsg[3]); |
Just4pLeisure | 4:682d96ff6d79 | 409 | return (GMLANMsg[0] == 0x01 && GMLANMsg[1] == 0x60) ? TRUE : FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 410 | } |
Just4pLeisure | 4:682d96ff6d79 | 411 | |
Just4pLeisure | 4:682d96ff6d79 | 412 | |
Just4pLeisure | 4:682d96ff6d79 | 413 | void GMLANShowReturnCode(char returnCode) |
Just4pLeisure | 4:682d96ff6d79 | 414 | { |
Just4pLeisure | 4:682d96ff6d79 | 415 | switch (returnCode) { |
Just4pLeisure | 4:682d96ff6d79 | 416 | case 0x11 : |
Just4pLeisure | 4:682d96ff6d79 | 417 | printf("0x11 - ServiceNotSupported\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 418 | break; |
Just4pLeisure | 4:682d96ff6d79 | 419 | case 0x12 : |
Just4pLeisure | 4:682d96ff6d79 | 420 | printf("0x12 - SubFunctionNotSupported-InvalidFormat\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 421 | break; |
Just4pLeisure | 4:682d96ff6d79 | 422 | case 0x22 : |
Just4pLeisure | 4:682d96ff6d79 | 423 | printf("0x22 - ConditionsNotCorrectOrRequestSequenceError\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 424 | break; |
Just4pLeisure | 4:682d96ff6d79 | 425 | case 0x31 : |
Just4pLeisure | 4:682d96ff6d79 | 426 | printf("0x31 - RequestOutOfRange\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 427 | break; |
Just4pLeisure | 4:682d96ff6d79 | 428 | case 0x35 : |
Just4pLeisure | 4:682d96ff6d79 | 429 | printf("0x35 - InvalidKey\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 430 | break; |
Just4pLeisure | 4:682d96ff6d79 | 431 | case 0x36 : |
Just4pLeisure | 4:682d96ff6d79 | 432 | printf("0x36 - ExceededNumberOfAttempts, ECU is now locked!\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 433 | break; |
Just4pLeisure | 4:682d96ff6d79 | 434 | case 0x37 : |
Just4pLeisure | 4:682d96ff6d79 | 435 | printf("0x37 - RequiredTimeDelayNotExpired\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 436 | break; |
Just4pLeisure | 4:682d96ff6d79 | 437 | case 0x78 : |
Just4pLeisure | 4:682d96ff6d79 | 438 | printf("0x78 - RequestCorrectlyReceived-ResponsePending\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 439 | break; |
Just4pLeisure | 4:682d96ff6d79 | 440 | case 0x81 : |
Just4pLeisure | 4:682d96ff6d79 | 441 | printf("0x81 - SchedulerFull\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 442 | break; |
Just4pLeisure | 4:682d96ff6d79 | 443 | case 0x83 : |
Just4pLeisure | 4:682d96ff6d79 | 444 | printf("0x83 - VoltageOutOfRangeFault\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 445 | break; |
Just4pLeisure | 4:682d96ff6d79 | 446 | case 0x85 : |
Just4pLeisure | 4:682d96ff6d79 | 447 | printf("0x85 - GeneralProgrammingFailure\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 448 | break; |
Just4pLeisure | 4:682d96ff6d79 | 449 | case 0x99 : |
Just4pLeisure | 4:682d96ff6d79 | 450 | printf("0x99 - ReadyForDownload-DTCStored\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 451 | break; |
Just4pLeisure | 4:682d96ff6d79 | 452 | case 0xE3 : |
Just4pLeisure | 4:682d96ff6d79 | 453 | printf("0xE3 - DeviceControlLimitsExceeded\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 454 | break; |
Just4pLeisure | 4:682d96ff6d79 | 455 | default : |
Just4pLeisure | 4:682d96ff6d79 | 456 | printf("Unknown failure Return Code ?!?\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 457 | } |
Just4pLeisure | 4:682d96ff6d79 | 458 | } |