breakLIN_RacEI

Dependencies:   mbed mbed-rtos Watchdog MODSERIAL ConfigFile

Committer:
JavierGC
Date:
Mon Feb 22 17:12:27 2021 +0000
Revision:
0:939d1f478fb5
breakLIN_RacEI

Who changed what in which revision?

UserRevisionLine numberNew 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 }