breakLIN_RacEI
Dependencies: mbed mbed-rtos Watchdog MODSERIAL ConfigFile
main.cpp@0:939d1f478fb5, 2021-02-22 (annotated)
- Committer:
- JavierGC
- Date:
- Mon Feb 22 17:12:27 2021 +0000
- Revision:
- 0:939d1f478fb5
breakLIN_RacEI
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
JavierGC | 0:939d1f478fb5 | 1 | #include "mbed.h" |
JavierGC | 0:939d1f478fb5 | 2 | #include "rtos.h" |
JavierGC | 0:939d1f478fb5 | 3 | #include "MODSERIAL.h" |
JavierGC | 0:939d1f478fb5 | 4 | #include "Watchdog.h" |
JavierGC | 0:939d1f478fb5 | 5 | #include "ConfigFile.h" |
JavierGC | 0:939d1f478fb5 | 6 | |
JavierGC | 0:939d1f478fb5 | 7 | /***** DEFINITIONS *****/ |
JavierGC | 0:939d1f478fb5 | 8 | #define TxBuffer_NumMess 16 |
JavierGC | 0:939d1f478fb5 | 9 | #define RxBuffer_NumMess 16 |
JavierGC | 0:939d1f478fb5 | 10 | #define MessSizePC 128 |
JavierGC | 0:939d1f478fb5 | 11 | #define MessSizeLIN 128 |
JavierGC | 0:939d1f478fb5 | 12 | #define TxBuffer TxBuffer_NumMess*MessSizePC |
JavierGC | 0:939d1f478fb5 | 13 | #define RxBuffer RxBuffer_NumMess*MessSizePC |
JavierGC | 0:939d1f478fb5 | 14 | #define PC_MaxMailElements 16 |
JavierGC | 0:939d1f478fb5 | 15 | #define LIN_MaxMailElements 16 |
JavierGC | 0:939d1f478fb5 | 16 | #define PCMessWait MessSizePC*10/9.6 //ms |
JavierGC | 0:939d1f478fb5 | 17 | #define LINMessWait 1//ms |
JavierGC | 0:939d1f478fb5 | 18 | |
JavierGC | 0:939d1f478fb5 | 19 | /***** STRUCTURES *****/ |
JavierGC | 0:939d1f478fb5 | 20 | |
JavierGC | 0:939d1f478fb5 | 21 | typedef struct { |
JavierGC | 0:939d1f478fb5 | 22 | char command; /* command to execute */ |
JavierGC | 0:939d1f478fb5 | 23 | char message[MessSizePC]; /* arguments */ |
JavierGC | 0:939d1f478fb5 | 24 | } PC_mail_t; |
JavierGC | 0:939d1f478fb5 | 25 | |
JavierGC | 0:939d1f478fb5 | 26 | typedef struct LINMessage_t // Lin Message Structure |
JavierGC | 0:939d1f478fb5 | 27 | { |
JavierGC | 0:939d1f478fb5 | 28 | char IDfield; |
JavierGC | 0:939d1f478fb5 | 29 | char Data[8]; // Maximum Number of Data |
JavierGC | 0:939d1f478fb5 | 30 | char Checksum; |
JavierGC | 0:939d1f478fb5 | 31 | } LINMessage; |
JavierGC | 0:939d1f478fb5 | 32 | |
JavierGC | 0:939d1f478fb5 | 33 | typedef struct { |
JavierGC | 0:939d1f478fb5 | 34 | char command; /* command to execute */ |
JavierGC | 0:939d1f478fb5 | 35 | LINMessage mess; |
JavierGC | 0:939d1f478fb5 | 36 | } LIN_mail_t; |
JavierGC | 0:939d1f478fb5 | 37 | |
JavierGC | 0:939d1f478fb5 | 38 | /***** FUNCTIONS *******/ |
JavierGC | 0:939d1f478fb5 | 39 | void read_Full_Message(char Port_); // Reading Buffer from LIN Line [LIN Line Depends on the Port] |
JavierGC | 0:939d1f478fb5 | 40 | void send_Full_Message(char ID_Field, char Data[8], char Checksum, char Port); // Sending a Full Message to the LIN Line |
JavierGC | 0:939d1f478fb5 | 41 | void send_Header_Message(char ID_Field,int Port); // Sending a Header Message to the LIN Line |
JavierGC | 0:939d1f478fb5 | 42 | void send_Break(int Port); // Sending a Break Command to the LIN Line |
JavierGC | 0:939d1f478fb5 | 43 | void LoadPCMail(char comm, char *mess); // Puts a mail in the stuck |
JavierGC | 0:939d1f478fb5 | 44 | void messageFromPC(MODSERIAL_IRQ_INFO *q); // Gets a Message from the PC and Calls the Load Mail [0] |
JavierGC | 0:939d1f478fb5 | 45 | int ComPC_Write(char *mess); // Send a Message Back to the PC |
JavierGC | 0:939d1f478fb5 | 46 | void TLogSTR(char *Tstr); // Get the Time signature |
JavierGC | 0:939d1f478fb5 | 47 | void GetConfig(void); // Read Configuration Data |
JavierGC | 0:939d1f478fb5 | 48 | void Initialize(void); // Initialize MBED after Reboot |
JavierGC | 0:939d1f478fb5 | 49 | void Read_Diagnostics(char *mess); // Return a Message with Diagnostics |
JavierGC | 0:939d1f478fb5 | 50 | void Flash_Messages(int Port); // Discards all messages in LIN Port |
JavierGC | 0:939d1f478fb5 | 51 | void Reset_UUT(void); // Reset The UUT |
JavierGC | 0:939d1f478fb5 | 52 | /**** Watchdog ****/ |
JavierGC | 0:939d1f478fb5 | 53 | Watchdog wd; |
JavierGC | 0:939d1f478fb5 | 54 | extern "C" void mbed_reset(); |
JavierGC | 0:939d1f478fb5 | 55 | /**** End of Watchdog ****/ |
JavierGC | 0:939d1f478fb5 | 56 | |
JavierGC | 0:939d1f478fb5 | 57 | /**** Serial Communication PC ****/ |
JavierGC | 0:939d1f478fb5 | 58 | DigitalOut ledPC(LED1); |
JavierGC | 0:939d1f478fb5 | 59 | DigitalOut Reboot_Pin(p29); |
JavierGC | 0:939d1f478fb5 | 60 | MODSERIAL pc(USBTX, USBRX, TxBuffer,RxBuffer); // The USB as pc |
JavierGC | 0:939d1f478fb5 | 61 | char InitialMessage[50]; // The initial Message when the MBED turns on |
JavierGC | 0:939d1f478fb5 | 62 | bool LOGPC; // Logging information from the PC |
JavierGC | 0:939d1f478fb5 | 63 | int PC_Baudrate=115200; // The Baudrate of the PC |
JavierGC | 0:939d1f478fb5 | 64 | double TxBufferWait; // The Time to Wait |
JavierGC | 0:939d1f478fb5 | 65 | char ChEnd; // The termination character of the PC Serial Communication |
JavierGC | 0:939d1f478fb5 | 66 | Mail<PC_mail_t, PC_MaxMailElements> PC_mail; // The PC_mail |
JavierGC | 0:939d1f478fb5 | 67 | int PCMailNum = 0; // Initialize to zero |
JavierGC | 0:939d1f478fb5 | 68 | time_t ctTime; |
JavierGC | 0:939d1f478fb5 | 69 | struct tm * timeinfo; |
JavierGC | 0:939d1f478fb5 | 70 | |
JavierGC | 0:939d1f478fb5 | 71 | int LIN_Wait_Echo = 0; |
JavierGC | 0:939d1f478fb5 | 72 | int LIN_Wait_Response = 0; |
JavierGC | 0:939d1f478fb5 | 73 | bool Wait_Echo_Response = false; |
JavierGC | 0:939d1f478fb5 | 74 | |
JavierGC | 0:939d1f478fb5 | 75 | /**** LIN 1 ****/ |
JavierGC | 0:939d1f478fb5 | 76 | DigitalOut ledUART1(LED2); |
JavierGC | 0:939d1f478fb5 | 77 | MODSERIAL LIN1(p13, p14, TxBuffer,RxBuffer); // The UART1 as LIN1 |
JavierGC | 0:939d1f478fb5 | 78 | int LIN1Baud = 19200; |
JavierGC | 0:939d1f478fb5 | 79 | |
JavierGC | 0:939d1f478fb5 | 80 | /**** LIN 2 ****/ |
JavierGC | 0:939d1f478fb5 | 81 | MODSERIAL LIN2(p28, p27, TxBuffer,RxBuffer); // The UART2 as LIN2 |
JavierGC | 0:939d1f478fb5 | 82 | DigitalOut ledUART2(LED3); |
JavierGC | 0:939d1f478fb5 | 83 | int LIN2Baud = 19200; |
JavierGC | 0:939d1f478fb5 | 84 | |
JavierGC | 0:939d1f478fb5 | 85 | void ComPC_thread_proc(void const *args) //proceso paralelo de gestión PC: tareas solicitadas y envío a PC |
JavierGC | 0:939d1f478fb5 | 86 | { |
JavierGC | 0:939d1f478fb5 | 87 | while(true) |
JavierGC | 0:939d1f478fb5 | 88 | { |
JavierGC | 0:939d1f478fb5 | 89 | osEvent evt = PC_mail.get(osWaitForever); |
JavierGC | 0:939d1f478fb5 | 90 | if (evt.status == osEventMail) |
JavierGC | 0:939d1f478fb5 | 91 | { |
JavierGC | 0:939d1f478fb5 | 92 | PC_mail_t *mail = (PC_mail_t*)evt.value.p; |
JavierGC | 0:939d1f478fb5 | 93 | char mess[MessSizePC]; |
JavierGC | 0:939d1f478fb5 | 94 | char Tstr[20]; |
JavierGC | 0:939d1f478fb5 | 95 | TLogSTR(Tstr); |
JavierGC | 0:939d1f478fb5 | 96 | switch (mail->command) |
JavierGC | 0:939d1f478fb5 | 97 | { |
JavierGC | 0:939d1f478fb5 | 98 | case 0: //request from PC |
JavierGC | 0:939d1f478fb5 | 99 | switch(mail->message[0]) |
JavierGC | 0:939d1f478fb5 | 100 | { |
JavierGC | 0:939d1f478fb5 | 101 | case 'R': // Reboot the Microcontroller/Updates the Firmware |
JavierGC | 0:939d1f478fb5 | 102 | if(strcmp(mail->message,"REBOOT")==0) {mbed_reset();/*wd.Configure(2.0);*/} |
JavierGC | 0:939d1f478fb5 | 103 | else { snprintf (mess,MessSizePC,"NAK(%s):%s\r\n",Tstr, mail->message); } |
JavierGC | 0:939d1f478fb5 | 104 | break; |
JavierGC | 0:939d1f478fb5 | 105 | case 'T': // Set the Current Time |
JavierGC | 0:939d1f478fb5 | 106 | float seconds; |
JavierGC | 0:939d1f478fb5 | 107 | sscanf(&mail->message[1],"%f",&seconds); |
JavierGC | 0:939d1f478fb5 | 108 | set_time((double)seconds); |
JavierGC | 0:939d1f478fb5 | 109 | time_t ctTime; |
JavierGC | 0:939d1f478fb5 | 110 | ctTime = time(NULL); |
JavierGC | 0:939d1f478fb5 | 111 | snprintf(mess,MessSizePC,"%s",ctime(&ctTime)); |
JavierGC | 0:939d1f478fb5 | 112 | LoadPCMail(1,mess); |
JavierGC | 0:939d1f478fb5 | 113 | break; |
JavierGC | 0:939d1f478fb5 | 114 | case 'L': // LIN Line |
JavierGC | 0:939d1f478fb5 | 115 | LINMessage LINMess; |
JavierGC | 0:939d1f478fb5 | 116 | unsigned int temp_ID; |
JavierGC | 0:939d1f478fb5 | 117 | unsigned int temp_Data[8]; |
JavierGC | 0:939d1f478fb5 | 118 | unsigned int temp_Checksum; |
JavierGC | 0:939d1f478fb5 | 119 | switch (mail->message[1]) |
JavierGC | 0:939d1f478fb5 | 120 | { |
JavierGC | 0:939d1f478fb5 | 121 | case '1': //LIN 1 |
JavierGC | 0:939d1f478fb5 | 122 | ledUART1 = true; |
JavierGC | 0:939d1f478fb5 | 123 | switch (mail->message[2]) |
JavierGC | 0:939d1f478fb5 | 124 | { |
JavierGC | 0:939d1f478fb5 | 125 | case 'W': //Write Full Message to LIN1 |
JavierGC | 0:939d1f478fb5 | 126 | sscanf(&mail->message[3],"%u;%u;%u;%u;%u;%u;%u;%u;%u;%u;",&temp_ID,&temp_Data[0],&temp_Data[1],&temp_Data[2],&temp_Data[3],&temp_Data[4],&temp_Data[5],&temp_Data[6],&temp_Data[7],&temp_Checksum); |
JavierGC | 0:939d1f478fb5 | 127 | LINMess.IDfield = temp_ID; |
JavierGC | 0:939d1f478fb5 | 128 | LINMess.Checksum = temp_Checksum; |
JavierGC | 0:939d1f478fb5 | 129 | for(int k=0; k<8; k++){ LINMess.Data[k] = temp_Data[k]; } |
JavierGC | 0:939d1f478fb5 | 130 | send_Full_Message(LINMess.IDfield, LINMess.Data, LINMess.Checksum, 1); // Maybe Disable interrupts here |
JavierGC | 0:939d1f478fb5 | 131 | if(Wait_Echo_Response) { wait_ms(LIN_Wait_Echo); read_Full_Message(1);} |
JavierGC | 0:939d1f478fb5 | 132 | ledUART1 = false; |
JavierGC | 0:939d1f478fb5 | 133 | break; |
JavierGC | 0:939d1f478fb5 | 134 | case 'H': //Write Remote Header to LIN1 |
JavierGC | 0:939d1f478fb5 | 135 | sscanf(&mail->message[3],"%u;",&temp_ID); |
JavierGC | 0:939d1f478fb5 | 136 | LINMess.IDfield = temp_ID; |
JavierGC | 0:939d1f478fb5 | 137 | send_Header_Message(LINMess.IDfield,1); |
JavierGC | 0:939d1f478fb5 | 138 | if(Wait_Echo_Response) { wait_ms(LIN_Wait_Echo); wait_ms(LIN_Wait_Response); read_Full_Message(1); } |
JavierGC | 0:939d1f478fb5 | 139 | ledUART1 = false; |
JavierGC | 0:939d1f478fb5 | 140 | break; |
JavierGC | 0:939d1f478fb5 | 141 | case 'R': //Read Data from LIN1 |
JavierGC | 0:939d1f478fb5 | 142 | read_Full_Message(1); |
JavierGC | 0:939d1f478fb5 | 143 | ledUART1 = false; |
JavierGC | 0:939d1f478fb5 | 144 | break; |
JavierGC | 0:939d1f478fb5 | 145 | case 'T': //Reset |
JavierGC | 0:939d1f478fb5 | 146 | Reset_UUT(); |
JavierGC | 0:939d1f478fb5 | 147 | ledUART1 = false; |
JavierGC | 0:939d1f478fb5 | 148 | LoadPCMail(99,"Reset_OK"); |
JavierGC | 0:939d1f478fb5 | 149 | break; |
JavierGC | 0:939d1f478fb5 | 150 | default: |
JavierGC | 0:939d1f478fb5 | 151 | ledUART1 = false; |
JavierGC | 0:939d1f478fb5 | 152 | break; |
JavierGC | 0:939d1f478fb5 | 153 | } |
JavierGC | 0:939d1f478fb5 | 154 | break; |
JavierGC | 0:939d1f478fb5 | 155 | case '2': //LIN 2 |
JavierGC | 0:939d1f478fb5 | 156 | ledUART2 = true; |
JavierGC | 0:939d1f478fb5 | 157 | switch (mail->message[2]) |
JavierGC | 0:939d1f478fb5 | 158 | { |
JavierGC | 0:939d1f478fb5 | 159 | |
JavierGC | 0:939d1f478fb5 | 160 | case 'W': //Write Full Message to LIN2 |
JavierGC | 0:939d1f478fb5 | 161 | sscanf(&mail->message[3],"%u;%u;%u;%u;%u;%u;%u;%u;%u;%u;",&temp_ID,&temp_Data[0],&temp_Data[1],&temp_Data[2],&temp_Data[3],&temp_Data[4],&temp_Data[5],&temp_Data[6],&temp_Data[7],&temp_Checksum); |
JavierGC | 0:939d1f478fb5 | 162 | LINMess.IDfield = temp_ID; |
JavierGC | 0:939d1f478fb5 | 163 | LINMess.Checksum = temp_Checksum; |
JavierGC | 0:939d1f478fb5 | 164 | for(int k=0; k<8; k++){ LINMess.Data[k] = temp_Data[k]; } |
JavierGC | 0:939d1f478fb5 | 165 | send_Full_Message(LINMess.IDfield, LINMess.Data, LINMess.Checksum, 2); // Maybe Disable interrupts here |
JavierGC | 0:939d1f478fb5 | 166 | if(Wait_Echo_Response) { wait_ms(LIN_Wait_Echo); read_Full_Message(2); } |
JavierGC | 0:939d1f478fb5 | 167 | ledUART2 = false; |
JavierGC | 0:939d1f478fb5 | 168 | break; |
JavierGC | 0:939d1f478fb5 | 169 | case 'H': //Write Remote Header to LIN2 |
JavierGC | 0:939d1f478fb5 | 170 | sscanf(&mail->message[3],"%u;",&temp_ID); |
JavierGC | 0:939d1f478fb5 | 171 | LINMess.IDfield = temp_ID; |
JavierGC | 0:939d1f478fb5 | 172 | send_Header_Message(LINMess.IDfield,2); |
JavierGC | 0:939d1f478fb5 | 173 | if(Wait_Echo_Response) { wait_ms(LIN_Wait_Echo); wait_ms(LIN_Wait_Response); read_Full_Message(2); } |
JavierGC | 0:939d1f478fb5 | 174 | ledUART2 = false; |
JavierGC | 0:939d1f478fb5 | 175 | break; |
JavierGC | 0:939d1f478fb5 | 176 | case 'R': //Read Data from LIN2 |
JavierGC | 0:939d1f478fb5 | 177 | read_Full_Message(2); |
JavierGC | 0:939d1f478fb5 | 178 | ledUART2 = false; |
JavierGC | 0:939d1f478fb5 | 179 | break; |
JavierGC | 0:939d1f478fb5 | 180 | default: |
JavierGC | 0:939d1f478fb5 | 181 | ledUART2 = false; |
JavierGC | 0:939d1f478fb5 | 182 | break; |
JavierGC | 0:939d1f478fb5 | 183 | } |
JavierGC | 0:939d1f478fb5 | 184 | break; |
JavierGC | 0:939d1f478fb5 | 185 | case 'F': //Flash the Buffer of all the LINs |
JavierGC | 0:939d1f478fb5 | 186 | { |
JavierGC | 0:939d1f478fb5 | 187 | ledUART1 = true; |
JavierGC | 0:939d1f478fb5 | 188 | ledUART2 = true; |
JavierGC | 0:939d1f478fb5 | 189 | Flash_Messages(1); |
JavierGC | 0:939d1f478fb5 | 190 | Flash_Messages(2); |
JavierGC | 0:939d1f478fb5 | 191 | ledUART1 = false; |
JavierGC | 0:939d1f478fb5 | 192 | ledUART2 = false; |
JavierGC | 0:939d1f478fb5 | 193 | LoadPCMail(50,"Flash_OK"); |
JavierGC | 0:939d1f478fb5 | 194 | break; |
JavierGC | 0:939d1f478fb5 | 195 | } |
JavierGC | 0:939d1f478fb5 | 196 | default: |
JavierGC | 0:939d1f478fb5 | 197 | break; |
JavierGC | 0:939d1f478fb5 | 198 | } |
JavierGC | 0:939d1f478fb5 | 199 | break; |
JavierGC | 0:939d1f478fb5 | 200 | } |
JavierGC | 0:939d1f478fb5 | 201 | case 1: //Send LOG to PC |
JavierGC | 0:939d1f478fb5 | 202 | if(LOGPC) { snprintf(mess,MessSizePC,"LOG(%s):%s\r\n",Tstr ,mail->message); } else { mess[0]=0; } |
JavierGC | 0:939d1f478fb5 | 203 | break; |
JavierGC | 0:939d1f478fb5 | 204 | case 50: //Send to PC a Message from LINs |
JavierGC | 0:939d1f478fb5 | 205 | snprintf(mess,MessSizePC,"LINs:%s\r\n",mail->message); |
JavierGC | 0:939d1f478fb5 | 206 | break; |
JavierGC | 0:939d1f478fb5 | 207 | case 51: //Send to PC a Message from LIN1 |
JavierGC | 0:939d1f478fb5 | 208 | snprintf(mess,MessSizePC,"LIN1:%s\r\n",mail->message); |
JavierGC | 0:939d1f478fb5 | 209 | break; |
JavierGC | 0:939d1f478fb5 | 210 | case 52: //Send to PC a Message from LIN2 |
JavierGC | 0:939d1f478fb5 | 211 | snprintf(mess,MessSizePC,"LIN2:%s\r\n",mail->message); |
JavierGC | 0:939d1f478fb5 | 212 | break; |
JavierGC | 0:939d1f478fb5 | 213 | case 99: //Information from the Micro |
JavierGC | 0:939d1f478fb5 | 214 | snprintf(mess,MessSizePC,"MBED:%s\r\n",mail->message); |
JavierGC | 0:939d1f478fb5 | 215 | break; |
JavierGC | 0:939d1f478fb5 | 216 | default: |
JavierGC | 0:939d1f478fb5 | 217 | break; |
JavierGC | 0:939d1f478fb5 | 218 | } |
JavierGC | 0:939d1f478fb5 | 219 | PC_mail.free(mail); |
JavierGC | 0:939d1f478fb5 | 220 | PCMailNum--; |
JavierGC | 0:939d1f478fb5 | 221 | if(PCMailNum==0){ledPC=false;} else {ledPC=true;} |
JavierGC | 0:939d1f478fb5 | 222 | ComPC_Write(mess); |
JavierGC | 0:939d1f478fb5 | 223 | } |
JavierGC | 0:939d1f478fb5 | 224 | } |
JavierGC | 0:939d1f478fb5 | 225 | } |
JavierGC | 0:939d1f478fb5 | 226 | |
JavierGC | 0:939d1f478fb5 | 227 | /**** End of Serial Communication PC ****/ |
JavierGC | 0:939d1f478fb5 | 228 | |
JavierGC | 0:939d1f478fb5 | 229 | int main() |
JavierGC | 0:939d1f478fb5 | 230 | { |
JavierGC | 0:939d1f478fb5 | 231 | Initialize(); |
JavierGC | 0:939d1f478fb5 | 232 | PCMailNum=0; |
JavierGC | 0:939d1f478fb5 | 233 | |
JavierGC | 0:939d1f478fb5 | 234 | Thread ComPC_thread (ComPC_thread_proc,NULL,osPriorityBelowNormal); // Start a ComPC Thread! |
JavierGC | 0:939d1f478fb5 | 235 | pc.attach(&messageFromPC, MODSERIAL::RxAutoDetect); // Attach an Interrupt to the TX Line |
JavierGC | 0:939d1f478fb5 | 236 | pc.autoDetectChar(ChEnd); // Autodetect the End Characted |
JavierGC | 0:939d1f478fb5 | 237 | |
JavierGC | 0:939d1f478fb5 | 238 | LoadPCMail(99,InitialMessage); |
JavierGC | 0:939d1f478fb5 | 239 | |
JavierGC | 0:939d1f478fb5 | 240 | // ************ WD ************* |
JavierGC | 0:939d1f478fb5 | 241 | wd.WatchdogCausedReset(); |
JavierGC | 0:939d1f478fb5 | 242 | wd.Configure(5.0); |
JavierGC | 0:939d1f478fb5 | 243 | // ************ WD_end ********* |
JavierGC | 0:939d1f478fb5 | 244 | |
JavierGC | 0:939d1f478fb5 | 245 | while(true) |
JavierGC | 0:939d1f478fb5 | 246 | { |
JavierGC | 0:939d1f478fb5 | 247 | wd.Service(); |
JavierGC | 0:939d1f478fb5 | 248 | Thread::wait(500); // what is this doing here? |
JavierGC | 0:939d1f478fb5 | 249 | } |
JavierGC | 0:939d1f478fb5 | 250 | } |
JavierGC | 0:939d1f478fb5 | 251 | |
JavierGC | 0:939d1f478fb5 | 252 | void GetConfig(void) |
JavierGC | 0:939d1f478fb5 | 253 | { |
JavierGC | 0:939d1f478fb5 | 254 | |
JavierGC | 0:939d1f478fb5 | 255 | #define CfgNumParam 9 |
JavierGC | 0:939d1f478fb5 | 256 | #define CfgSizeParam 50 |
JavierGC | 0:939d1f478fb5 | 257 | |
JavierGC | 0:939d1f478fb5 | 258 | pc.format(8,Serial::Even,1); // Configuration for the Format of the data for the PC |
JavierGC | 0:939d1f478fb5 | 259 | pc.baud(115200); // Configuration for the Baudrate of the communication to the PC [default] |
JavierGC | 0:939d1f478fb5 | 260 | ConfigFile cfg; |
JavierGC | 0:939d1f478fb5 | 261 | LocalFileSystem local("local"); |
JavierGC | 0:939d1f478fb5 | 262 | |
JavierGC | 0:939d1f478fb5 | 263 | int i; |
JavierGC | 0:939d1f478fb5 | 264 | char value[CfgNumParam][CfgSizeParam]; |
JavierGC | 0:939d1f478fb5 | 265 | char CfgK[CfgNumParam][CfgSizeParam]= {"InitialMessage","BaudRate","ChEnd","LOGPC","LIN1Baud","LIN2Baud","LINWaitResp_ms","LINWaitProd_ms","Wait_Response"}; |
JavierGC | 0:939d1f478fb5 | 266 | if (!cfg.read("/local/config.cfg")) { error("\r\nFailure to read a configuration file"); } |
JavierGC | 0:939d1f478fb5 | 267 | |
JavierGC | 0:939d1f478fb5 | 268 | char Tstr[10]; |
JavierGC | 0:939d1f478fb5 | 269 | for (i=0; i<CfgNumParam; i++) { |
JavierGC | 0:939d1f478fb5 | 270 | if (cfg.getValue(CfgK[i], &value[i][0], sizeof(value[i]))) { TLogSTR(Tstr); /*pc.printf("CFG_Param(%s): '%s'='%s'\r\n", Tstr,CfgK[i], value[i]);*/ } |
JavierGC | 0:939d1f478fb5 | 271 | else { error("Failure Reading '%s'\r\n", CfgK[i]); } |
JavierGC | 0:939d1f478fb5 | 272 | } |
JavierGC | 0:939d1f478fb5 | 273 | strcpy(InitialMessage,value[0]); |
JavierGC | 0:939d1f478fb5 | 274 | PC_Baudrate=atoi(value[1]); |
JavierGC | 0:939d1f478fb5 | 275 | ChEnd=(char)atoi(value[2]); |
JavierGC | 0:939d1f478fb5 | 276 | LOGPC=(bool)atoi(value[3]); |
JavierGC | 0:939d1f478fb5 | 277 | |
JavierGC | 0:939d1f478fb5 | 278 | LIN1Baud=atoi(value[4]); |
JavierGC | 0:939d1f478fb5 | 279 | LIN2Baud=atoi(value[5]); |
JavierGC | 0:939d1f478fb5 | 280 | |
JavierGC | 0:939d1f478fb5 | 281 | LIN_Wait_Echo = atoi(value[6]); |
JavierGC | 0:939d1f478fb5 | 282 | LIN_Wait_Response = atoi(value[7]); |
JavierGC | 0:939d1f478fb5 | 283 | |
JavierGC | 0:939d1f478fb5 | 284 | Wait_Echo_Response = (bool)atoi(value[8]); |
JavierGC | 0:939d1f478fb5 | 285 | |
JavierGC | 0:939d1f478fb5 | 286 | TxBufferWait= 10000*MessSizePC/PC_Baudrate; |
JavierGC | 0:939d1f478fb5 | 287 | while(!pc.txBufferEmpty()) { Thread::wait(100); }; |
JavierGC | 0:939d1f478fb5 | 288 | } |
JavierGC | 0:939d1f478fb5 | 289 | |
JavierGC | 0:939d1f478fb5 | 290 | void Initialize(void) |
JavierGC | 0:939d1f478fb5 | 291 | { |
JavierGC | 0:939d1f478fb5 | 292 | Reboot_Pin = false; |
JavierGC | 0:939d1f478fb5 | 293 | GetConfig(); |
JavierGC | 0:939d1f478fb5 | 294 | pc.baud(PC_Baudrate); pc.format(8,Serial::Even,1); // Configuration for PC |
JavierGC | 0:939d1f478fb5 | 295 | LIN1.baud(LIN1Baud); LIN1.format(8,Serial::None,1); // Configuration for LIN1 |
JavierGC | 0:939d1f478fb5 | 296 | LIN2.baud(LIN2Baud); LIN2.format(8,Serial::None,1); // Configuration for LIN2 |
JavierGC | 0:939d1f478fb5 | 297 | } |
JavierGC | 0:939d1f478fb5 | 298 | |
JavierGC | 0:939d1f478fb5 | 299 | void TLogSTR(char *Tstr) // Put to Tstr the Time information as a character |
JavierGC | 0:939d1f478fb5 | 300 | { |
JavierGC | 0:939d1f478fb5 | 301 | ctTime = time(NULL); |
JavierGC | 0:939d1f478fb5 | 302 | timeinfo = localtime ( &ctTime ); |
JavierGC | 0:939d1f478fb5 | 303 | timeinfo->tm_hour=(timeinfo->tm_hour+1)%24; |
JavierGC | 0:939d1f478fb5 | 304 | strftime (Tstr,MessSizePC,"%H:%M:%S",timeinfo); |
JavierGC | 0:939d1f478fb5 | 305 | } |
JavierGC | 0:939d1f478fb5 | 306 | |
JavierGC | 0:939d1f478fb5 | 307 | void LoadPCMail(char comm, char *mess) //Working in Parallel to Load a message to the stack |
JavierGC | 0:939d1f478fb5 | 308 | { |
JavierGC | 0:939d1f478fb5 | 309 | while(PCMailNum>=PC_MaxMailElements) { Thread::wait(PCMessWait); } // Wait if there are many other things in Queue |
JavierGC | 0:939d1f478fb5 | 310 | if(comm!=1 || LOGPC) { |
JavierGC | 0:939d1f478fb5 | 311 | PC_mail_t *mail = PC_mail.alloc(); |
JavierGC | 0:939d1f478fb5 | 312 | mail->command = comm; |
JavierGC | 0:939d1f478fb5 | 313 | snprintf(mail->message,MessSizePC,"%s",mess); |
JavierGC | 0:939d1f478fb5 | 314 | PC_mail.put(mail); |
JavierGC | 0:939d1f478fb5 | 315 | PCMailNum++; |
JavierGC | 0:939d1f478fb5 | 316 | } |
JavierGC | 0:939d1f478fb5 | 317 | } |
JavierGC | 0:939d1f478fb5 | 318 | |
JavierGC | 0:939d1f478fb5 | 319 | void messageFromPC(MODSERIAL_IRQ_INFO *q) //Received Message from PC and Put it in stack with a Value of 0 |
JavierGC | 0:939d1f478fb5 | 320 | { |
JavierGC | 0:939d1f478fb5 | 321 | ledPC=true; |
JavierGC | 0:939d1f478fb5 | 322 | MODSERIAL *sys = q->serial; |
JavierGC | 0:939d1f478fb5 | 323 | char temp[MessSizePC]; |
JavierGC | 0:939d1f478fb5 | 324 | |
JavierGC | 0:939d1f478fb5 | 325 | int i=sys->move(temp,MessSizePC,ChEnd); |
JavierGC | 0:939d1f478fb5 | 326 | if (temp[i-2]=='\r') { |
JavierGC | 0:939d1f478fb5 | 327 | i-=2; |
JavierGC | 0:939d1f478fb5 | 328 | } else { |
JavierGC | 0:939d1f478fb5 | 329 | i-=1; |
JavierGC | 0:939d1f478fb5 | 330 | } |
JavierGC | 0:939d1f478fb5 | 331 | temp[i]=0; |
JavierGC | 0:939d1f478fb5 | 332 | LoadPCMail(0,temp); |
JavierGC | 0:939d1f478fb5 | 333 | } |
JavierGC | 0:939d1f478fb5 | 334 | |
JavierGC | 0:939d1f478fb5 | 335 | int ComPC_Write(char *mess) // Send a Message Back to the PC |
JavierGC | 0:939d1f478fb5 | 336 | { |
JavierGC | 0:939d1f478fb5 | 337 | int i=strlen(mess); |
JavierGC | 0:939d1f478fb5 | 338 | if(i>0) { |
JavierGC | 0:939d1f478fb5 | 339 | while((TxBuffer-pc.txBufferGetCount())<i) { Thread::wait(TxBufferWait); } // Wait until the Buffer is ready |
JavierGC | 0:939d1f478fb5 | 340 | return pc.printf(mess); |
JavierGC | 0:939d1f478fb5 | 341 | } |
JavierGC | 0:939d1f478fb5 | 342 | return 0; // return code if i negative |
JavierGC | 0:939d1f478fb5 | 343 | } |
JavierGC | 0:939d1f478fb5 | 344 | void Convert_Character_to_Number_to_String(char* temp_string, char Character) |
JavierGC | 0:939d1f478fb5 | 345 | { |
JavierGC | 0:939d1f478fb5 | 346 | unsigned int Temp_Number = Character; |
JavierGC | 0:939d1f478fb5 | 347 | sprintf (temp_string,"%u",Temp_Number); |
JavierGC | 0:939d1f478fb5 | 348 | temp_string[3]=0; |
JavierGC | 0:939d1f478fb5 | 349 | } |
JavierGC | 0:939d1f478fb5 | 350 | void read_Full_Message(char Port_) // Maybe Disable Interrupts Here |
JavierGC | 0:939d1f478fb5 | 351 | { |
JavierGC | 0:939d1f478fb5 | 352 | char tmp[MessSizeLIN]; |
JavierGC | 0:939d1f478fb5 | 353 | char digit[4]; |
JavierGC | 0:939d1f478fb5 | 354 | char uniq_char; |
JavierGC | 0:939d1f478fb5 | 355 | int index = 0; |
JavierGC | 0:939d1f478fb5 | 356 | switch(Port_) // Read the Buffer from LIN Port AND Send a Message to the PC |
JavierGC | 0:939d1f478fb5 | 357 | { |
JavierGC | 0:939d1f478fb5 | 358 | case 1: // LIN1 |
JavierGC | 0:939d1f478fb5 | 359 | index = 0; |
JavierGC | 0:939d1f478fb5 | 360 | while(LIN1.readable()==1) |
JavierGC | 0:939d1f478fb5 | 361 | { |
JavierGC | 0:939d1f478fb5 | 362 | uniq_char = LIN1.getc(); |
JavierGC | 0:939d1f478fb5 | 363 | Convert_Character_to_Number_to_String(digit,uniq_char); |
JavierGC | 0:939d1f478fb5 | 364 | for(int j=0; j<strlen(digit);j++) { tmp[index++] = digit[j]; } |
JavierGC | 0:939d1f478fb5 | 365 | tmp[index++]=';'; |
JavierGC | 0:939d1f478fb5 | 366 | } |
JavierGC | 0:939d1f478fb5 | 367 | tmp[index]=0; |
JavierGC | 0:939d1f478fb5 | 368 | LoadPCMail(51,tmp); |
JavierGC | 0:939d1f478fb5 | 369 | break; |
JavierGC | 0:939d1f478fb5 | 370 | case 2: // LIN2 |
JavierGC | 0:939d1f478fb5 | 371 | index = 0; |
JavierGC | 0:939d1f478fb5 | 372 | while(LIN2.readable()==1) |
JavierGC | 0:939d1f478fb5 | 373 | { |
JavierGC | 0:939d1f478fb5 | 374 | uniq_char = LIN2.getc(); |
JavierGC | 0:939d1f478fb5 | 375 | Convert_Character_to_Number_to_String(digit,uniq_char); |
JavierGC | 0:939d1f478fb5 | 376 | for(int j=0; j<strlen(digit);j++) { tmp[index++] = digit[j]; } |
JavierGC | 0:939d1f478fb5 | 377 | tmp[index++]=';'; |
JavierGC | 0:939d1f478fb5 | 378 | } |
JavierGC | 0:939d1f478fb5 | 379 | tmp[index]=0; |
JavierGC | 0:939d1f478fb5 | 380 | LoadPCMail(52,tmp); |
JavierGC | 0:939d1f478fb5 | 381 | break; |
JavierGC | 0:939d1f478fb5 | 382 | default: |
JavierGC | 0:939d1f478fb5 | 383 | break; |
JavierGC | 0:939d1f478fb5 | 384 | } |
JavierGC | 0:939d1f478fb5 | 385 | |
JavierGC | 0:939d1f478fb5 | 386 | } |
JavierGC | 0:939d1f478fb5 | 387 | |
JavierGC | 0:939d1f478fb5 | 388 | |
JavierGC | 0:939d1f478fb5 | 389 | void send_Full_Message(char ID_Field_, char Data_[8], char Checksum_, char Port_) // Maybe Disable interrupts here |
JavierGC | 0:939d1f478fb5 | 390 | { |
JavierGC | 0:939d1f478fb5 | 391 | switch(Port_) |
JavierGC | 0:939d1f478fb5 | 392 | { |
JavierGC | 0:939d1f478fb5 | 393 | case 1: // LIN1 |
JavierGC | 0:939d1f478fb5 | 394 | send_Break(Port_); //send 15bit of Zero Break; |
JavierGC | 0:939d1f478fb5 | 395 | LIN1.putc(0x55); //send 0x55 Synchronisation Character |
JavierGC | 0:939d1f478fb5 | 396 | LIN1.putc(ID_Field_); //send ID field |
JavierGC | 0:939d1f478fb5 | 397 | for(int k=0;k<8;k++) {LIN1.putc(Data_[k]);} //send Data |
JavierGC | 0:939d1f478fb5 | 398 | LIN1.putc(Checksum_); //send Checksum |
JavierGC | 0:939d1f478fb5 | 399 | break; |
JavierGC | 0:939d1f478fb5 | 400 | case 2: // LIN2 |
JavierGC | 0:939d1f478fb5 | 401 | send_Break(Port_); //send 15bit of Zero Break; |
JavierGC | 0:939d1f478fb5 | 402 | LIN2.putc(0x55); //send 0x55 Synchronisation Character |
JavierGC | 0:939d1f478fb5 | 403 | LIN2.putc(ID_Field_); //send ID field |
JavierGC | 0:939d1f478fb5 | 404 | for(int k=0;k<8;k++) {LIN2.putc(Data_[k]);} //send Data |
JavierGC | 0:939d1f478fb5 | 405 | LIN2.putc(Checksum_); //send Checksum |
JavierGC | 0:939d1f478fb5 | 406 | break; |
JavierGC | 0:939d1f478fb5 | 407 | default: |
JavierGC | 0:939d1f478fb5 | 408 | break; |
JavierGC | 0:939d1f478fb5 | 409 | } |
JavierGC | 0:939d1f478fb5 | 410 | } |
JavierGC | 0:939d1f478fb5 | 411 | |
JavierGC | 0:939d1f478fb5 | 412 | void send_Header_Message(char ID_Field,int Port) // Maybe Disable interrupts here |
JavierGC | 0:939d1f478fb5 | 413 | { |
JavierGC | 0:939d1f478fb5 | 414 | switch(Port) |
JavierGC | 0:939d1f478fb5 | 415 | { |
JavierGC | 0:939d1f478fb5 | 416 | case 1: // LIN1 |
JavierGC | 0:939d1f478fb5 | 417 | send_Break(Port); //send 15bit of Zero Break; |
JavierGC | 0:939d1f478fb5 | 418 | LIN1.putc(0x55); //send 0x55 Synchronisation Character |
JavierGC | 0:939d1f478fb5 | 419 | LIN1.putc(ID_Field); //send ID field |
JavierGC | 0:939d1f478fb5 | 420 | break; |
JavierGC | 0:939d1f478fb5 | 421 | case 2: // LIN2 |
JavierGC | 0:939d1f478fb5 | 422 | send_Break(Port); //send 15bit of Zero Break; |
JavierGC | 0:939d1f478fb5 | 423 | LIN2.putc(0x55); //send 0x55 Synchronisation Character |
JavierGC | 0:939d1f478fb5 | 424 | LIN2.putc(ID_Field); //send ID field |
JavierGC | 0:939d1f478fb5 | 425 | break; |
JavierGC | 0:939d1f478fb5 | 426 | default: |
JavierGC | 0:939d1f478fb5 | 427 | break; |
JavierGC | 0:939d1f478fb5 | 428 | } |
JavierGC | 0:939d1f478fb5 | 429 | } |
JavierGC | 0:939d1f478fb5 | 430 | |
JavierGC | 0:939d1f478fb5 | 431 | void send_Break(int Port) |
JavierGC | 0:939d1f478fb5 | 432 | { |
JavierGC | 0:939d1f478fb5 | 433 | int time_BREAK = 0; |
JavierGC | 0:939d1f478fb5 | 434 | switch(Port) |
JavierGC | 0:939d1f478fb5 | 435 | { |
JavierGC | 0:939d1f478fb5 | 436 | case 1: // LIN1 |
JavierGC | 0:939d1f478fb5 | 437 | time_BREAK = 1000000/LIN1Baud; // time in us |
JavierGC | 0:939d1f478fb5 | 438 | LPC_UART1->LCR |= 0x40; |
JavierGC | 0:939d1f478fb5 | 439 | wait_us(time_BREAK*15); |
JavierGC | 0:939d1f478fb5 | 440 | LPC_UART1->LCR &= ~(0x40); |
JavierGC | 0:939d1f478fb5 | 441 | break; |
JavierGC | 0:939d1f478fb5 | 442 | case 2: // LIN2 |
JavierGC | 0:939d1f478fb5 | 443 | time_BREAK = 1000000/LIN2Baud; // time in us |
JavierGC | 0:939d1f478fb5 | 444 | LPC_UART2->LCR |= 0x40; |
JavierGC | 0:939d1f478fb5 | 445 | wait_us(time_BREAK*15); |
JavierGC | 0:939d1f478fb5 | 446 | LPC_UART2->LCR &= ~(0x40); |
JavierGC | 0:939d1f478fb5 | 447 | break; |
JavierGC | 0:939d1f478fb5 | 448 | default: |
JavierGC | 0:939d1f478fb5 | 449 | break; |
JavierGC | 0:939d1f478fb5 | 450 | } |
JavierGC | 0:939d1f478fb5 | 451 | } |
JavierGC | 0:939d1f478fb5 | 452 | void Flash_Messages(int Port_) // Flashes all the Messages from the Buffer on LINs |
JavierGC | 0:939d1f478fb5 | 453 | { |
JavierGC | 0:939d1f478fb5 | 454 | if(Port_==1) // Read the Buffer from LIN Port AND Send a Message to the PC |
JavierGC | 0:939d1f478fb5 | 455 | { |
JavierGC | 0:939d1f478fb5 | 456 | while(LIN1.readable()==1) { LIN1.getc();} |
JavierGC | 0:939d1f478fb5 | 457 | } |
JavierGC | 0:939d1f478fb5 | 458 | else if(Port_==2) |
JavierGC | 0:939d1f478fb5 | 459 | { |
JavierGC | 0:939d1f478fb5 | 460 | while(LIN2.readable()==1) { LIN2.getc();} |
JavierGC | 0:939d1f478fb5 | 461 | } |
JavierGC | 0:939d1f478fb5 | 462 | } |
JavierGC | 0:939d1f478fb5 | 463 | |
JavierGC | 0:939d1f478fb5 | 464 | void Reset_UUT(void) |
JavierGC | 0:939d1f478fb5 | 465 | { |
JavierGC | 0:939d1f478fb5 | 466 | Reboot_Pin = true; |
JavierGC | 0:939d1f478fb5 | 467 | wait_ms(200); |
JavierGC | 0:939d1f478fb5 | 468 | Reboot_Pin = false; |
JavierGC | 0:939d1f478fb5 | 469 | } |